diff --git a/.circleci/Dockerfile b/.circleci/Dockerfile new file mode 100644 index 000000000..2da2e1f6c --- /dev/null +++ b/.circleci/Dockerfile @@ -0,0 +1,62 @@ +# Use the CircleCI base image +FROM cimg/base:edge-22.04 + +USER root + +# Install system dependencies or any other tools you need +RUN apt-get update && sudo apt-get install -y \ + libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf-compiler cmake + +# Install Go +ENV GO_VERSION 1.22.0 +RUN wget https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz -O go.tar.gz \ + && tar -C /usr/local -xzf go.tar.gz \ + && rm go.tar.gz + +# Set Go environment variables +ENV GOPATH /go +ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH + +# Install Node +RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - && apt-get install -y nodejs + + +USER circleci + +# Add /usr/local/bin to the PATH for the circleci user +RUN echo 'export PATH="/usr/local/bin:$PATH"' >> $HOME/.bashrc + +# Install Rust +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y +RUN echo 'export PATH="$HOME/.cargo/bin:$PATH"' >> /home/circleci/.bashrc +RUN ~/.cargo/bin/rustup target add wasm32-unknown-unknown + +# Install Deno +RUN curl -fsSL https://deno.land/install.sh | sh +RUN echo 'export DENO_INSTALL="/home/circleci/.deno"' >> /home/circleci/.bashrc +RUN echo 'export PATH="/home/circleci/.deno/bin:$PATH"' >> /home/circleci/.bashrc + +# Configure npm to use a directory in the circleci user's home for global packages +RUN mkdir ~/.npm-global \ + && npm config set prefix '~/.npm-global' \ + && echo 'export PATH="~/.npm-global/bin:$PATH"' >> /home/circleci/.bashrc + +# Install pnpm +RUN npm install -g pnpm + +# Add other setup commands you require + +USER root +# Clean up to reduce image size +RUN apt-get clean && rm -rf /var/lib/apt/lists/* + +# Switch back to the circleci user for any non-root actions +USER circleci + +# Set the PATH environment variable +ENV PATH="/home/circleci/.cargo/bin:/home/circleci/.deno/bin:/home/circleci/.npm-global/bin:$PATH" + +# We need killall for the CLI tests +USER root +RUN apt-get update && apt-get install psmisc +USER circleci diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 000000000..0aee855bb --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,178 @@ +version: 2.1 + +orbs: + node: circleci/node@5.2.0 + go: circleci/go@1.10.0 + rust: circleci/rust@1.6.1 + +jobs: + build-and-test: + docker: + - image: coasys/ad4m-ci-linux:latest@sha256:7008f587d355d1adeb58553f52f99e1812822b4d21dc78d69bc96040d5e57e82 + resource_class: xlarge + steps: + - checkout + - restore_cache: + keys: + - hc-0.3.0-beta-dev-27-v7 + - hc- + - rust-cache-{{ checksum "Cargo.lock" }} + - rust-cache- + - run: + name: Install HC + command: | + ls -la $HOME/.cargo/bin + if [ ! -f "$HOME/.cargo/bin/hc" ]; then + git clone https://github.com/holochain/holochain.git + cd holochain + git checkout holochain-0.3.0-beta-dev.27 + cd crates/hc + cargo build --release + pwd + ls -la + mkdir -p $HOME/.cargo/bin + cd ../../target/release + pwd + ls -lah + cp hc $HOME/.cargo/bin/hc + cd $HOME/.cargo/bin + pwd + ls -lah + ./hc --version + fi + echo 'export PATH="$HOME/.cargo/bin:$PATH"' >> $BASH_ENV + - save_cache: + key: hc-0.3.0-beta-dev-27-v7 + paths: + - /home/circleci/.cargo/bin + - restore_cache: + keys: + - rust-cache-{{ checksum "Cargo.lock" }}-v2 + - rust-cache- + - run: + name: Install dependencies + command: pnpm install --no-frozen-lockfile + - run: + name: Build dapp + command: pnpm build-dapp + - run: + name: Install core dependencies + command: cd ./core && pnpm install --no-frozen-lockfile + - run: + name: Build ADAM (without bootstrap languages) + command: pnpm run build-libs + - save_cache: + key: rust-cache-{{ checksum "Cargo.lock" }}-v2 + paths: + - ./target + - ~/.cargo/registry + - ~/.cargo/git + - persist_to_workspace: + no-output-timeout: 30m + root: . + paths: + - ./target/release/ad4m + - ./target/release/ad4m-executor + - run: + name: Remove pnpm patches + command: node removePnpm.js + - run: + name: Install dependencies + command: pnpm install --no-frozen-lockfile + - run: + name: Install core dependencies + command: cd ./core && pnpm install --no-frozen-lockfile + - run: + name: Root tests + command: pnpm test + + integration-tests-js: + docker: + - image: coasys/ad4m-ci-linux:latest@sha256:7008f587d355d1adeb58553f52f99e1812822b4d21dc78d69bc96040d5e57e82 + resource_class: xlarge + steps: + - checkout + - attach_workspace: + at: . + - restore_cache: + keys: + - hc-0.3.0-beta-dev-27-v7 + - hc- + - restore_cache: + keys: + - agent-language-rust-cache-{{ checksum "bootstrap-languages/agent-language/hc-dna/Cargo.lock" }} + - agent-language-rust-cache- + - restore_cache: + keys: + - direct-message-language-rust-cache-{{ checksum "bootstrap-languages/direct-message-language/hc-dna/Cargo.lock" }} + - direct-message-language-rust-cache- + - restore_cache: + keys: + - file-storage-rust-cache-{{ checksum "bootstrap-languages/file-storage/hc-dna/Cargo.lock" }} + - file-storage-rust-cache- + - restore_cache: + keys: + - p-diff-sync-rust-cache-{{ checksum "bootstrap-languages/p-diff-sync/hc-dna/Cargo.lock" }} + - p-diff-sync-rust-cache- + - restore_cache: + keys: + - p-diff-sync-socket-signaling-rust-cache-{{ checksum "bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/Cargo.lock" }} + - p-diff-sync-socket-signaling-rust-cache- + - run: + name: Install dependencies + command: pnpm install --no-frozen-lockfile + - run: + name: Install core dependencies + command: cd ./core && pnpm install --no-frozen-lockfile + - run: + name: Build bootstrap languages + command: pnpm run build-languages + - save_cache: + key: agent-language-rust-cache-{{ checksum "bootstrap-languages/agent-language/hc-dna/Cargo.lock" }} + paths: + - ./bootstrap-languages/agent-language/hc-dna/target + - save_cache: + key: direct-message-language-rust-cache-{{ checksum "bootstrap-languages/direct-message-language/hc-dna/Cargo.lock" }} + paths: + - ./bootstrap-languages/direct-message-language/hc-dna/target + - save_cache: + key: file-storage-rust-cache-{{ checksum "bootstrap-languages/file-storage/hc-dna/Cargo.lock" }} + paths: + - ./bootstrap-languages/file-storage-language/hc-dna/target + - save_cache: + key: p-diff-sync-rust-cache-{{ checksum "bootstrap-languages/p-diff-sync/hc-dna/Cargo.lock" }} + paths: + - ./bootstrap-languages/p-diff-sync/hc-dna/target + - save_cache: + key: p-diff-sync-socket-signaling-rust-cache-{{ checksum "bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/Cargo.lock" }} + paths: + - ./bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/target + - run: + name: Run integration tests + command: cd ./tests/js && pnpm run test-main + + integration-tests-cli: + docker: + - image: coasys/ad4m-ci-linux:latest@sha256:7008f587d355d1adeb58553f52f99e1812822b4d21dc78d69bc96040d5e57e82 + steps: + - checkout + - attach_workspace: + at: . + - run: + name: git submodule + command: git submodule update --init --recursive + - run: + name: Run binaries test script + command: ./tests/bats/bin/bats tests/binaries.bats + - run: + name: Run integration test script + command: ./tests/bats/bin/bats tests/integration.bats + +workflows: + version: 2 + build-and-test: + jobs: + - build-and-test + - integration-tests-js: + requires: + - build-and-test diff --git a/.github/workflows/agent-language-tests.yml b/.github/workflows/agent-language-tests.yml index 43e4af064..4ab1f5145 100644 --- a/.github/workflows/agent-language-tests.yml +++ b/.github/workflows/agent-language-tests.yml @@ -26,7 +26,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.73.0 + toolchain: 1.76.0 - name: Cache cargo id: cache-cargo diff --git a/.github/workflows/direct-message-language-tests.yml b/.github/workflows/direct-message-language-tests.yml index 7ddc88e12..ed5805ed7 100644 --- a/.github/workflows/direct-message-language-tests.yml +++ b/.github/workflows/direct-message-language-tests.yml @@ -26,7 +26,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.73.0 + toolchain: 1.76.0 - name: Cache cargo id: cache-cargo diff --git a/.github/workflows/file-storage-language-tests.yml b/.github/workflows/file-storage-language-tests.yml index 4bca3db9a..423eca77a 100644 --- a/.github/workflows/file-storage-language-tests.yml +++ b/.github/workflows/file-storage-language-tests.yml @@ -26,7 +26,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.73.0 + toolchain: 1.76.0 - name: Cache cargo id: cache-cargo @@ -75,7 +75,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.73.0 + toolchain: 1.76.0 - name: Cache cargo id: cache-cargo diff --git a/.github/workflows/integration_cli.yml b/.github/workflows/integration_cli.yml.disabled similarity index 90% rename from .github/workflows/integration_cli.yml rename to .github/workflows/integration_cli.yml.disabled index a6a190a79..60b41b313 100644 --- a/.github/workflows/integration_cli.yml +++ b/.github/workflows/integration_cli.yml.disabled @@ -1,11 +1,10 @@ name: Integration -on: - push: - branches: - - main - - dev - pull_request: +# on: +# push: +# branches: +# - main +# pull_request: jobs: test: @@ -26,7 +25,12 @@ jobs: uses: actions-rs/toolchain@v1 with: override: true - toolchain: 1.73.0 + toolchain: 1.76.0 + + - name: Use Python 3.11 + uses: actions/setup-python@v4 + with: + python-version: '3.11' - name: Install protobuf & cmake run: brew install protobuf cmake @@ -77,4 +81,3 @@ jobs: - name: Run integration test script run: ./tests/bats/bin/bats tests/integration.bats || cat ~/Library/Logs/DiagnosticReports/* - \ No newline at end of file diff --git a/.github/workflows/integration_js.yml b/.github/workflows/integration_js.yml.disabled similarity index 97% rename from .github/workflows/integration_js.yml rename to .github/workflows/integration_js.yml.disabled index 22d1f7fc0..8d5f60118 100644 --- a/.github/workflows/integration_js.yml +++ b/.github/workflows/integration_js.yml.disabled @@ -23,7 +23,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.73.0 + toolchain: 1.76.0 - name: Install GO uses: actions/setup-go@v4 @@ -71,6 +71,9 @@ jobs: - name: Install dependencies run: pnpm install --no-frozen-lockfile + - name: Install core dependencies + run: cd ./core && pnpm install --no-frozen-lockfile + - name: Build the workspace run: pnpm run build @@ -89,7 +92,7 @@ jobs: run: pnpm test - name: Run integration tests - run: cd ./tests/js && pnpm run test-main + run: cd ./tests/js && yarn run test-main # test-windows: # name: JS Ad4mClient <> AD4M Executor - Windows diff --git a/.github/workflows/p-diff-sync-tests.yml b/.github/workflows/p-diff-sync-tests.yml index 0c656edc2..af8b6b361 100644 --- a/.github/workflows/p-diff-sync-tests.yml +++ b/.github/workflows/p-diff-sync-tests.yml @@ -26,7 +26,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.73.0 + toolchain: 1.76.0 - name: Cache cargo id: cache-cargo uses: actions/cache@v3 @@ -55,7 +55,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.73.0 + toolchain: 1.76.0 - name: Cache cargo id: cache-cargo uses: actions/cache@v3 @@ -103,7 +103,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.73.0 + toolchain: 1.76.0 - name: Cache cargo id: cache-cargo @@ -152,7 +152,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.73.0 + toolchain: 1.76.0 - name: Cache cargo id: cache-cargo @@ -201,7 +201,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.73.0 + toolchain: 1.76.0 - name: Cache cargo id: cache-cargo @@ -251,7 +251,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.73.0 + toolchain: 1.76.0 - name: Cache cargo id: cache-cargo @@ -300,7 +300,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.73.0 + toolchain: 1.76.0 - name: Cache cargo id: cache-cargo @@ -349,7 +349,7 @@ jobs: # - uses: actions/checkout@v2 # - uses: actions-rs/toolchain@v1 # with: - # toolchain: 1.73.0 + # toolchain: 1.76.0 # - name: Cache cargo # id: cache-cargo diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 3f411fb29..f5da2ff5c 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -63,7 +63,7 @@ jobs: uses: actions-rs/toolchain@v1 with: override: true - toolchain: 1.73.0 + toolchain: 1.76.0 - run: rustup target add wasm32-unknown-unknown - name: Install GO @@ -92,7 +92,7 @@ jobs: - name: install dependencies (windows only) if: matrix.platform == 'windows-latest' - run: choco install protoc cmake curl cygwin gnuwin32-m4 msys2 make mingw + run: choco install strawberryperl protoc cmake curl cygwin gnuwin32-m4 msys2 make mingw - name: get version run: echo "PACKAGE_VERSION=$(node -p "require('./ui/package.json').version")" >> $GITHUB_ENV @@ -122,6 +122,9 @@ jobs: - name: pnpm Install run: pnpm install + - name: Install core dependencies + run: cd ./core && pnpm install + - name: Build AD4M-CLI & build Launcher binary (macos/linux-latest) if: matrix.platform != 'windows-latest' env: @@ -313,6 +316,9 @@ jobs: - name: Install deps run: pnpm install + - name: Install core dependencies + run: cd ./core && pnpm install + - name: Install Deno uses: denoland/setup-deno@v1 with: @@ -350,6 +356,30 @@ jobs: package: connect/package.json access: public + - name: Publish ad4m hook helpers + uses: JS-DevTools/npm-publish@v1 + with: + token: ${{ secrets.COASYS_NPM_TOKEN }} + package: ad4m-hooks/helpers/package.json + tag: ${{ env.NPM_TAG }} + access: public + + - name: Publish ad4m react hooks + uses: JS-DevTools/npm-publish@v1 + with: + token: ${{ secrets.COASYS_NPM_TOKEN }} + package: ad4m-hooks/react/package.json + tag: ${{ env.NPM_TAG }} + access: public + + - name: Publish ad4m vue hooks + uses: JS-DevTools/npm-publish@v1 + with: + token: ${{ secrets.COASYS_NPM_TOKEN }} + package: ad4m-hooks/vue/package.json + tag: ${{ env.NPM_TAG }} + access: public + - name: Publish executor uses: JS-DevTools/npm-publish@v1 with: @@ -365,47 +395,53 @@ jobs: access: public - #crates-publish: - # runs-on: GH-hosted-ubuntu - # steps: - # - uses: actions/checkout@v2 - # - uses: actions-rs/toolchain@v1 - # with: - # toolchain: 1.73.0 - # override: true - # - # - name: Install GO - # uses: actions/setup-go@v4 - # with: - # go-version: '1.20' - # - # - uses: pnpm/action-setup@v2 - # with: - # version: 8 - # - # - name: Install Linux Deps - # run: | - # sudo apt-get update - # sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf-compiler cmake - # - # - uses: actions/setup-node@v3 - # with: - # node-version: '16.x' - # - # - name: Cache cargo - # id: cache-cargo - # uses: actions/cache@v3 - # with: - # path: | - # ~/.cargo/bin/ - # ~/.cargo/registry/index/ - # ~/.cargo/registry/cache/ - # ~/.cargo/git/db/ - # key: ${{ runner.os }}-cargo - # restore-keys: ${{ runner.os }}-cargo - # - # - run: rustup target add wasm32-unknown-unknown - # - run: cd core && pnpm install && pnpm build && cd .. - # - run: cargo install cargo-workspaces || echo "cargo-workspaces already installed" - # - run: cargo login ${{ secrets.CARGO_REGISTRY_TOKEN }} - # - run: cargo workspaces publish --from-git + crates-publish: + runs-on: GH-hosted-ubuntu + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + toolchain: 1.76.0 + override: true + + - name: Install GO + uses: actions/setup-go@v4 + with: + go-version: '1.22' + + - uses: pnpm/action-setup@v2 + with: + version: 8 + + - name: Install Linux Deps + run: | + sudo apt-get update + sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf-compiler cmake + + - uses: actions/setup-node@v3 + with: + node-version: '18.x' + + - name: Cache cargo + id: cache-cargo + uses: actions/cache@v3 + with: + path: | + ~/.cargo/bin/ + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + key: ${{ runner.os }}-cargo + restore-keys: ${{ runner.os }}-cargo + + - name: Install Deno + uses: denoland/setup-deno@v1 + with: + deno-version: v1.32.4 + + - run: rustup target add wasm32-unknown-unknown + - run: pnpm install + - run: pnpm build-core-executor + - run: cargo install cargo-workspaces || echo "cargo-workspaces already installed" + - run: cargo login ${{ secrets.CARGO_REGISTRY_TOKEN }} + - run: cargo workspaces publish --from-git diff --git a/.github/workflows/publish_staging.yml b/.github/workflows/publish_staging.yml index 63152ae9f..350e3cba3 100644 --- a/.github/workflows/publish_staging.yml +++ b/.github/workflows/publish_staging.yml @@ -43,7 +43,7 @@ jobs: fail-fast: false matrix: platform: [GH-hosted-ubuntu, macos-latest, windows-latest] - node-version: [16.x] + node-version: [18.x] needs: - create-release @@ -57,7 +57,7 @@ jobs: uses: actions-rs/toolchain@v1 with: override: true - toolchain: 1.73.0 + toolchain: 1.76.0 - run: rustup target add wasm32-unknown-unknown - name: Install Deno @@ -81,7 +81,7 @@ jobs: - name: install dependencies (windows only) if: matrix.platform == 'windows-latest' - run: choco install protoc cmake curl cygwin gnuwin32-m4 msys2 make mingw + run: choco install strawberryperl protoc cmake curl cygwin gnuwin32-m4 msys2 make mingw - name: get version run: echo "PACKAGE_VERSION=$(node -p "require('./ui/package.json').version")" >> $GITHUB_ENV @@ -113,9 +113,20 @@ jobs: with: go-version: '1.20.6' + - name: Install/update node-gyp + run: npm install -g node-gyp + + - name: Use Python 3.11 + uses: actions/setup-python@v4 + with: + python-version: '3.11' + - name: pnpm Install run: pnpm install --no-cache + - name: Install core dependencies + run: cd ./core && pnpm install --no-cache + - name: Build AD4M-CLI & build Launcher binary (macos/linux-latest) if: matrix.platform != 'windows-latest' env: @@ -322,7 +333,7 @@ jobs: - name: Install GO uses: actions/setup-go@v4 with: - go-version: '1.20' + go-version: '1.22' - name: Install Linux Deps run: | @@ -332,6 +343,9 @@ jobs: - name: Install deps run: pnpm install + - name: Install core dependencies + run: cd ./core && pnpm install + - name: Install Deno uses: denoland/setup-deno@v1 with: @@ -368,6 +382,30 @@ jobs: package: connect/package.json tag: ${{ env.NPM_TAG }} access: public + + - name: Publish ad4m hook helpers + uses: JS-DevTools/npm-publish@v1 + with: + token: ${{ secrets.COASYS_NPM_TOKEN }} + package: ad4m-hooks/helpers/package.json + tag: ${{ env.NPM_TAG }} + access: public + + - name: Publish ad4m react hooks + uses: JS-DevTools/npm-publish@v1 + with: + token: ${{ secrets.COASYS_NPM_TOKEN }} + package: ad4m-hooks/react/package.json + tag: ${{ env.NPM_TAG }} + access: public + + - name: Publish ad4m vue hooks + uses: JS-DevTools/npm-publish@v1 + with: + token: ${{ secrets.COASYS_NPM_TOKEN }} + package: ad4m-hooks/vue/package.json + tag: ${{ env.NPM_TAG }} + access: public - name: Publish executor uses: JS-DevTools/npm-publish@v1 @@ -386,46 +424,53 @@ jobs: access: public - #crates-publish: - # runs-on: GH-hosted-ubuntu - # steps: - # - uses: actions/checkout@v2 - # - uses: actions-rs/toolchain@v1 - # with: - # toolchain: 1.73.0 - # override: true - # - # - name: Install GO - # uses: actions/setup-go@v4 - # with: - # go-version: '1.20' - # - # - uses: pnpm/action-setup@v2 - # with: - # version: 8 - # - # - name: Install Linux Deps - # run: | - # sudo apt-get update - # sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf-compiler cmake - # - # - uses: actions/setup-node@v3 - # with: - # node-version: '16.x' - # - # - name: Cache cargo - # id: cache-cargo - # uses: actions/cache@v3 - # with: - # path: | - # ~/.cargo/bin/ - # ~/.cargo/registry/index/ - # ~/.cargo/registry/cache/ - # ~/.cargo/git/db/ - # key: ${{ runner.os }}-cargo - # restore-keys: ${{ runner.os }}-cargo - # - run: rustup target add wasm32-unknown-unknown - # - run: cd core && pnpm install && pnpm build && cd .. - # - run: cargo install cargo-workspaces || echo "cargo-workspaces already installed" - # - run: cargo login ${{ secrets.CARGO_REGISTRY_TOKEN }} - # - run: cargo workspaces publish --from-git + crates-publish: + runs-on: GH-hosted-ubuntu + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + toolchain: 1.76.0 + override: true + + - name: Install GO + uses: actions/setup-go@v4 + with: + go-version: '1.22' + + - uses: pnpm/action-setup@v2 + with: + version: 8 + + - name: Install Linux Deps + run: | + sudo apt-get update + sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf-compiler cmake + + - uses: actions/setup-node@v3 + with: + node-version: '18.x' + + - name: Install Deno + uses: denoland/setup-deno@v1 + with: + deno-version: v1.32.4 + + - name: Cache cargo + id: cache-cargo + uses: actions/cache@v3 + with: + path: | + ~/.cargo/bin/ + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + key: ${{ runner.os }}-cargo + restore-keys: ${{ runner.os }}-cargo + - run: rustup target add wasm32-unknown-unknown + - run: pnpm install + - run: pnpm build-core-executor + - run: ls -al executor/lib + - run: cargo install cargo-workspaces || echo "cargo-workspaces already installed" + - run: cargo login ${{ secrets.CARGO_REGISTRY_TOKEN }} + - run: cargo workspaces publish --from-git diff --git a/.gitignore b/.gitignore index a36dcc081..4432ca9e3 100644 --- a/.gitignore +++ b/.gitignore @@ -55,3 +55,5 @@ tests/ad4m2 test-runner/.ad4m-test temp + +!removePnpm.js \ No newline at end of file diff --git a/CHANGELOG b/CHANGELOG index c37dd23e4..04e67631b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -6,14 +6,45 @@ This project _loosely_ adheres to [Semantic Versioning](https://semver.org/spec/ ## unreleased ### Added + - Add ability to get and add Holochain agent infos through launcher [PR#463](https://github.com/coasys/ad4m/pull/463) + - Added new packages that provide reusable hooks for `react` & `vue` to interact with ad4m `ad4m-react-hooks` & `ad4m-vue-hooks`. Also updated docs for the hooks [PR#450](https://github.com/coasys/ad4m/pull/450) + - Hard-wired Hosted ad4m client `AgentInfo` in the executor. [PR#453](https://github.com/coasys/ad4m/pull/453) + - Added ability to handle multiple agents in launcher. [PR#459](https://github.com/coasys/ad4m/pull/459) + - Added a way to show & add new `AgentInfo` in launcher. [PR#463](https://github.com/coasys/ad4m/pull/463) + - `ad4m-executor` binary prints capability request challange to stdout to enable app hand-shake [PR#471](https://github.com/coasys/ad4m/pull/471) ### Changed - + - Much improved ADAM Launcher setup flow [PR#440](https://github.com/coasys/ad4m/pull/440) and [PR#444](https://github.com/coasys/ad4m/pull/444): + - Added back window decorations to splashscreen to not stay in the users way + - Separate mandatory password input from optional profile fields and start agent generation early + - Show popup making the user aware of the system tray icon + - Fixed JScore service in rust crashing on windows +- Update Holochain to 0.3.0-beta-dev.35 [PR#443](https://github.com/coasys/ad4m/pull/443) +- Improve readability of logs [PR#443](https://github.com/coasys/ad4m/pull/443) +- Update Holochain to 0.3.0-beta-dev.37 [PR#449](https://github.com/coasys/ad4m/pull/449) +- Update cli to correctly show `AgentInfo` in base64 encoded format & add. Also removes the use of jscore for getting the `AgentInfo` [PR#451](https://github.com/coasys/ad4m/pull/451) +- Expression signing & verification migrated to Rust. [PR#452](https://github.com/coasys/ad4m/pull/452) +- SDNA imporvements [PR#457](https://github.com/coasys/ad4m/pull/457): + - Change SDNA Decorator names to PascalCase + - Add validation for decorators. + - Improved Docs for sdna & subject classes. + - Added typedoc for decorators. +- Split `ad4m` binary into two seperate binaries `ad4m` which is client & `ad4m-executor` to spawn your executor. [PR#464](https://github.com/coasys/ad4m/pull/464) +- Updated all cargo dependency to use crates.io package instead of github. [PR#465](https://github.com/coasys/ad4m/pull/465) + ### Deprecated ### Removed +- Removed holochain toggle from Login page in launcher. [PR#467](https://github.com/coasys/ad4m/pull/467) ### Fixed +- Fix ADAM proxy [PR#442](https://github.com/coasys/ad4m/pull/442) and [PR#446](https://github.com/coasys/ad4m/pull/446) +- Fixed `p-diff-sync` language to use correct function name `send_remote_signal` instead of `recv_send_remote_signal ` [PR#454](https://github.com/coasys/ad4m/pull/454) +- SDNA imporvements [PR#457](https://github.com/coasys/ad4m/pull/457): + - Fixed value returns as undefined if the property was boolean and set to false in `SubjectEntity. + - Fixed links in docs. +- Fixed flaky integration tests [PR#462](https://github.com/coasys/ad4m/pull/462) +- Fixed `p-diff-sync`'s Deno incompatibilities [PR#471](https://github.com/coasys/ad4m/pull/471) ## [0.8.0] - 12/12/2023 diff --git a/Cargo.lock b/Cargo.lock index 58d7c4d7e..478c888da 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,19 +14,20 @@ dependencies = [ [[package]] name = "ad4m" -version = "0.8.1" +version = "0.9.0" dependencies = [ "ad4m-client", + "ad4m-executor", "anyhow", "chrono", - "clap 4.4.11", + "clap 4.4.18", "colour", "ctrlc", "dirs 4.0.0", "futures", + "kitsune_p2p_types", "rand 0.8.5", "regex", - "rust-executor", "rustyline 10.1.1", "serde", "serde_json", @@ -38,12 +39,12 @@ dependencies = [ [[package]] name = "ad4m-client" -version = "0.8.1" +version = "0.9.0" dependencies = [ "anyhow", "async-tungstenite", "chrono", - "clap 4.4.11", + "clap 4.4.18", "dirs 4.0.0", "futures", "graphql-ws-client", @@ -60,11 +61,70 @@ dependencies = [ "urlencoding", ] +[[package]] +name = "ad4m-executor" +version = "0.9.0" +dependencies = [ + "ad4m-client", + "argon2", + "base64 0.21.7", + "chrono", + "cid", + "clap 4.4.18", + "coasys_juniper", + "coasys_juniper_graphql_transport_ws", + "coasys_juniper_subscriptions", + "coasys_juniper_warp", + "crypto_box", + "deno_core", + "deno_runtime", + "did-key", + "dirs 5.0.1", + "env_logger", + "fake", + "fs_extra", + "futures", + "hex", + "holochain", + "holochain_cli_bundle", + "holochain_cli_run_local_services", + "holochain_types", + "include_dir", + "itertools 0.10.5", + "jsonwebtoken", + "kitsune_p2p_types", + "lazy_static", + "log", + "maplit", + "multibase", + "multihash", + "once_cell", + "os_info", + "rand 0.8.5", + "regex", + "rocket", + "rusqlite", + "rust-embed", + "scryer-prolog", + "secp256k1", + "semver 1.0.21", + "serde", + "serde_json", + "sha2 0.10.8", + "tokio", + "tokio-stream", + "url 2.4.1", + "uuid 1.7.0", + "warp", + "zip", +] + [[package]] name = "ad4m-launcher" -version = "0.8.1" +version = "0.9.0" dependencies = [ "ad4m-client", + "ad4m-executor", "chrono", "colored", "directories 4.0.1", @@ -79,7 +139,6 @@ dependencies = [ "portpicker", "remove_dir_all", "reqwest", - "rust-executor", "serde", "serde_json", "sysinfo 0.29.11", @@ -127,7 +186,8 @@ dependencies = [ [[package]] name = "aead-gcm-stream" version = "0.1.0" -source = "git+https://github.com/coasys/aead-gcm-stream.git#b449abc60de4145efabc2fc08dd869de1a5e8f0d" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a09ecb526d53de2842cc876ee5c9b51161ee60399edeca4cf74892a01b48177" dependencies = [ "aead", "aes", @@ -183,19 +243,19 @@ version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" dependencies = [ - "getrandom 0.2.11", + "getrandom 0.2.12", "once_cell", "version_check", ] [[package]] name = "ahash" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" +checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" dependencies = [ "cfg-if 1.0.0", - "getrandom 0.2.11", + "getrandom 0.2.12", "once_cell", "version_check", "zerocopy", @@ -210,6 +270,26 @@ dependencies = [ "memchr", ] +[[package]] +name = "aitia" +version = "0.2.0-beta-dev.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "361de711e26de0bd918ceea7e5bdd2bb2ecac74dc8169cc4a848e993304d8890" +dependencies = [ + "anyhow", + "derive_more", + "holochain_trace", + "parking_lot 0.10.2", + "petgraph", + "regex", + "serde", + "serde_json", + "tracing", + "tracing-core", + "tracing-serde", + "tracing-subscriber 0.3.18", +] + [[package]] name = "aliasable" version = "0.1.3" @@ -263,9 +343,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.4" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" +checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" dependencies = [ "anstyle", "anstyle-parse", @@ -277,9 +357,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" +checksum = "2faccea4cc4ab4a667ce676a30e8ec13922a692c99bb8f5b11f1502c72e04220" [[package]] name = "anstyle-parse" @@ -292,9 +372,9 @@ dependencies = [ [[package]] name = "anstyle-query" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3a318f1f38d2418400f8209655bfd825785afd25aa30bb7ba6cc792e4596748" +checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" dependencies = [ "windows-sys 0.52.0", ] @@ -311,13 +391,25 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.75" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" dependencies = [ "backtrace", ] +[[package]] +name = "app_dirs2" +version = "2.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7e7b35733e3a8c1ccb90385088dd5b6eaa61325cb4d1ad56e683b5224ff352e" +dependencies = [ + "jni 0.21.1", + "ndk-context", + "winapi 0.3.9", + "xdg", +] + [[package]] name = "approx" version = "0.5.1" @@ -336,6 +428,26 @@ dependencies = [ "derive_arbitrary", ] +[[package]] +name = "arboard" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac57f2b058a76363e357c056e4f74f1945bf734d37b8b3ef49066c4787dde0fc" +dependencies = [ + "clipboard-win", + "core-graphics", + "image", + "log", + "objc", + "objc-foundation", + "objc_id", + "parking_lot 0.12.1", + "thiserror", + "winapi 0.3.9", + "wl-clipboard-rs", + "x11rb", +] + [[package]] name = "arc-swap" version = "1.6.0" @@ -344,9 +456,9 @@ checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" [[package]] name = "argon2" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ba4cac0a46bc1d2912652a751c47f2a9f3a7fe89bcae2275d418f5270402f9" +checksum = "3c3610892ee6e0cbce8ae2700349fcf8f98adb0dbfbee85aec3c9179d29cc072" dependencies = [ "base64ct", "blake2 0.10.6", @@ -400,8 +512,8 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", "synstructure", ] @@ -412,8 +524,8 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] @@ -424,10 +536,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c09c69dffe06d222d072c878c3afe86eee2179806f20503faec97250268b4c24" dependencies = [ "pmutil", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "swc_macros_common", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -436,7 +548,7 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" dependencies = [ - "quote 1.0.33", + "quote 1.0.35", "syn 1.0.109", ] @@ -458,7 +570,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ca33f4bc4ed1babef42cad36cc1f51fa88be00420404e5b1e80ab1b18f7678c" dependencies = [ "concurrent-queue", - "event-listener 4.0.0", + "event-listener 4.0.3", "event-listener-strategy", "futures-core", "pin-project-lite", @@ -466,9 +578,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc2d0cfb2a7388d34f590e76686704c494ed7aaceed62ee1ba35cbf363abc2a5" +checksum = "a116f46a969224200a0a97f29cfd4c50e7534e4b4826bd23ea2c3c533039c82c" dependencies = [ "brotli", "flate2", @@ -484,26 +596,26 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c" dependencies = [ - "async-lock 3.2.0", + "async-lock 3.3.0", "async-task", "concurrent-queue", "fastrand 2.0.1", - "futures-lite 2.1.0", + "futures-lite 2.2.0", "slab", ] [[package]] name = "async-global-executor" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4353121d5644cdf2beb5726ab752e79a8db1ebb52031770ec47db31d245526" +checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" dependencies = [ "async-channel 2.1.1", "async-executor", - "async-io 2.2.1", - "async-lock 3.2.0", + "async-io 2.3.1", + "async-lock 3.3.0", "blocking", - "futures-lite 2.1.0", + "futures-lite 2.2.0", "once_cell", ] @@ -529,18 +641,18 @@ dependencies = [ [[package]] name = "async-io" -version = "2.2.1" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6d3b15875ba253d1110c740755e246537483f152fa334f91abd7fe84c88b3ff" +checksum = "8f97ab0c5b00a7cdbe5a371b9a782ee7be1316095885c8a4ea1daf490eb0ef65" dependencies = [ - "async-lock 3.2.0", + "async-lock 3.3.0", "cfg-if 1.0.0", "concurrent-queue", "futures-io", - "futures-lite 2.1.0", + "futures-lite 2.2.0", "parking", - "polling 3.3.1", - "rustix 0.38.26", + "polling 3.3.2", + "rustix 0.38.30", "slab", "tracing", "windows-sys 0.52.0", @@ -557,11 +669,11 @@ dependencies = [ [[package]] name = "async-lock" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7125e42787d53db9dd54261812ef17e937c95a51e4d291373b670342fa44310c" +checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" dependencies = [ - "event-listener 4.0.0", + "event-listener 4.0.3", "event-listener-strategy", "pin-project-lite", ] @@ -585,7 +697,7 @@ dependencies = [ "cfg-if 1.0.0", "event-listener 3.1.0", "futures-lite 1.13.0", - "rustix 0.38.26", + "rustix 0.38.30", "windows-sys 0.48.0", ] @@ -595,8 +707,8 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7d78656ba01f1b93024b7c3a0467f1608e4be67d725749fdcd7d2c7678fd7a2" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] @@ -606,13 +718,13 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e47d90f65a225c4527103a8d747001fc56e375203592b25ad103e1ca13124c5" dependencies = [ - "async-io 2.2.1", + "async-io 2.3.1", "async-lock 2.8.0", "atomic-waker", "cfg-if 1.0.0", "futures-core", "futures-io", - "rustix 0.38.26", + "rustix 0.38.30", "signal-hook-registry", "slab", "windows-sys 0.48.0", @@ -673,8 +785,8 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25f9db3b38af870bf7e5cc649167533b493928e50744e2c30ae350230b414670" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] @@ -684,26 +796,26 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", ] [[package]] name = "async-task" -version = "4.5.0" +version = "4.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4eb2cdb97421e01129ccb49169d8279ed21e829929144f4a22a6e54ac549ca1" +checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" [[package]] name = "async-trait" -version = "0.1.74" +version = "0.1.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" +checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", ] [[package]] @@ -812,6 +924,18 @@ dependencies = [ "shrinkwraprs", ] +[[package]] +name = "backon" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c1a6197b2120bb2185a267f6515038558b019e92b832bb0320e96d66268dcf9" +dependencies = [ + "fastrand 1.9.0", + "futures-core", + "pin-project", + "tokio", +] + [[package]] name = "backtrace" version = "0.3.69" @@ -859,9 +983,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.5" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64-simd" @@ -927,6 +1051,12 @@ dependencies = [ "serde", ] +[[package]] +name = "bit_field" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" + [[package]] name = "bitflags" version = "1.3.2" @@ -935,9 +1065,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" [[package]] name = "bitvec" @@ -1079,23 +1209,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" dependencies = [ "async-channel 2.1.1", - "async-lock 3.2.0", + "async-lock 3.3.0", "async-task", "fastrand 2.0.1", "futures-io", - "futures-lite 2.1.0", + "futures-lite 2.2.0", "piper", "tracing", ] [[package]] name = "bloomfilter" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b92db7965d438b8b4b1c1d0aedd188440a1084593c9eb7f6657e3df7e906d934" +checksum = "b64d54e47a7f4fd723f082e8f11429f3df6ba8adaeca355a76556f9f0602bbcf" dependencies = [ "bit-vec", - "getrandom 0.2.11", + "getrandom 0.2.12", "siphasher 1.0.0", ] @@ -1145,16 +1275,16 @@ checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" [[package]] name = "bson" -version = "2.7.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58da0ae1e701ea752cc46c1bb9f39d5ecefc7395c3ecd526261a566d4f16e0c2" +checksum = "ce21468c1c9c154a85696bb25c20582511438edb6ad67f846ba1378ffdd80222" dependencies = [ - "ahash 0.8.6", + "ahash 0.8.7", "base64 0.13.1", "bitvec", "chrono", "hex", - "indexmap 1.9.3", + "indexmap 2.2.2", "js-sys", "once_cell", "rand 0.8.5", @@ -1162,17 +1292,17 @@ dependencies = [ "serde_bytes", "serde_json", "time", - "uuid 1.6.1", + "uuid 1.7.0", ] [[package]] name = "bstr" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "542f33a8835a0884b006a0c3df3dadd99c0c3f296ed26c2fdc8028e01ad6230c" +checksum = "c48f0051a4b4c5e0b6d365cd04af53aeaa209e3cc15ec2cdb69e73cc87fbd0dc" dependencies = [ "memchr", - "regex-automata 0.4.3", + "regex-automata 0.4.5", "serde", ] @@ -1205,16 +1335,16 @@ version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7ec4c6f261935ad534c0c22dbef2201b45918860eb1c574b972bd213a76af61" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] [[package]] name = "bytemuck" -version = "1.14.0" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" +checksum = "ed2490600f404f2b94c167e31d3ed1d5f3c225a0f3b80230053b3e0b7b962bd9" [[package]] name = "byteorder" @@ -1299,9 +1429,9 @@ dependencies = [ [[package]] name = "cargo-platform" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e34637b3140142bdf929fb439e8aa4ebad7651ebf7b1080b3930aa16ac1459ff" +checksum = "ceed8ef69d8518a5dda55c07425450b58a4e1946f4951eab6d7191ee86c2443d" dependencies = [ "serde", ] @@ -1314,7 +1444,7 @@ checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" dependencies = [ "camino", "cargo-platform", - "semver 1.0.20", + "semver 1.0.21", "serde", "serde_json", "thiserror", @@ -1363,7 +1493,7 @@ checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" dependencies = [ "byteorder", "fnv", - "uuid 1.6.1", + "uuid 1.7.0", ] [[package]] @@ -1372,16 +1502,16 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3431df59f28accaf4cb4eed4a9acc66bea3f3c3753aa6cdc2f024174ef232af7" dependencies = [ - "smallvec 1.11.2", + "smallvec 1.13.1", ] [[package]] name = "cfg-expr" -version = "0.15.5" +version = "0.15.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03915af431787e6ffdcc74c645077518c6b6e01f80b761e0fbbfa288536311b3" +checksum = "6100bc57b6209840798d95cb2775684849d332f7bd788db2a8c8caf7ef82a41a" dependencies = [ - "smallvec 1.11.2", + "smallvec 1.13.1", "target-lexicon", ] @@ -1433,9 +1563,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.31" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "9f13690e35a5e4ace198e7beea2895d29f3a9cc55015fcebe6336bd2010af9eb" dependencies = [ "android-tzdata", "iana-time-zone", @@ -1443,7 +1573,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.48.5", + "windows-targets 0.52.0", ] [[package]] @@ -1487,9 +1617,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.11" +version = "4.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfaff671f6b22ca62406885ece523383b9b64022e341e53e009a62ebc47a45f2" +checksum = "1e578d6ec4194633722ccf9544794b71b1385c3c027efe0c55db226fc880865c" dependencies = [ "clap_builder", "clap_derive", @@ -1497,9 +1627,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.11" +version = "4.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a216b506622bb1d316cd51328dce24e07bdff4a6128a47c7e7fad11878d5adbb" +checksum = "4df4df40ec50c46000231c914968278b1eb05098cf8f1b3a518a95030e71d1c7" dependencies = [ "anstream", "anstyle", @@ -1515,9 +1645,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" dependencies = [ "heck 0.4.1", - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", ] [[package]] @@ -1547,12 +1677,94 @@ dependencies = [ ] [[package]] -name = "cmake" -version = "0.1.50" +name = "coasys_juniper" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" +checksum = "ebdef69380c8094fe4a1a919025063c3c1c2f6a3437862168884dc48f4025afa" dependencies = [ - "cc", + "async-trait", + "bson", + "chrono", + "coasys_juniper_codegen", + "fnv", + "futures", + "futures-enum", + "graphql-parser", + "indexmap 2.2.2", + "serde", + "smartstring", + "static_assertions", + "url 2.4.1", + "uuid 1.7.0", + "void", +] + +[[package]] +name = "coasys_juniper_codegen" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a3454e5f4eca82f6945bdb6d534c2839e4a5063c91b724e0345a4096d1dfd1e" +dependencies = [ + "proc-macro-error", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 1.0.109", + "url 2.4.1", +] + +[[package]] +name = "coasys_juniper_graphql_transport_ws" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df045de50269b244276bff7d4aab0d621280f3ac498d586ee768f2a1d9b629fa" +dependencies = [ + "coasys_juniper", + "coasys_juniper_graphql_ws", + "coasys_juniper_subscriptions", + "serde", + "tokio", +] + +[[package]] +name = "coasys_juniper_graphql_ws" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e61e7f2348c5e6114b9950388027a9150878e2037ba5a5ad71f463f67de4ffbf" +dependencies = [ + "coasys_juniper", + "coasys_juniper_subscriptions", + "serde", + "tokio", +] + +[[package]] +name = "coasys_juniper_subscriptions" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "089ba96c1a2a30b6d96513682dc8ea5d738ed123a1d3686582583e74a695fb8e" +dependencies = [ + "coasys_juniper", + "futures", +] + +[[package]] +name = "coasys_juniper_warp" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c2a0040eb7a18b44152258c19fafe6585516a94aeab51aad267c5f3cbdc6c4f" +dependencies = [ + "anyhow", + "coasys_juniper", + "coasys_juniper_graphql_transport_ws", + "coasys_juniper_graphql_ws", + "futures", + "headers", + "log", + "serde", + "serde_json", + "thiserror", + "tokio", + "warp", ] [[package]] @@ -1599,11 +1811,10 @@ checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "colored" -version = "2.0.4" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2674ec482fbc38012cf31e6c42ba0177b431a0cb6f15fe40efa5aab1bda516f6" +checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8" dependencies = [ - "is-terminal", "lazy_static", "windows-sys 0.48.0", ] @@ -1649,6 +1860,16 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if 1.0.0", + "wasm-bindgen", +] + [[package]] name = "console_static_text" version = "0.8.1" @@ -1661,9 +1882,9 @@ dependencies = [ [[package]] name = "const-oid" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "constant_time_eq" @@ -1784,9 +2005,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] @@ -1817,7 +2038,7 @@ dependencies = [ "gimli 0.26.2", "log", "regalloc2", - "smallvec 1.11.2", + "smallvec 1.13.1", "target-lexicon", ] @@ -1847,7 +2068,7 @@ dependencies = [ "hashbrown 0.12.3", "indexmap 1.9.3", "log", - "smallvec 1.11.2", + "smallvec 1.13.1", ] [[package]] @@ -1864,7 +2085,7 @@ checksum = "0d70abacb8cfef3dc8ff7e8836e9c1d70f7967dfdac824a4cd5e30223415aca6" dependencies = [ "cranelift-codegen", "log", - "smallvec 1.11.2", + "smallvec 1.13.1", "target-lexicon", ] @@ -1902,56 +2123,46 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.8" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" dependencies = [ - "cfg-if 1.0.0", "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ - "cfg-if 1.0.0", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.15" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg 1.1.0", - "cfg-if 1.0.0", "crossbeam-utils", - "memoffset 0.9.0", - "scopeguard", ] [[package]] name = "crossbeam-queue" -version = "0.3.8" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" dependencies = [ - "cfg-if 1.0.0", "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.16" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if 1.0.0", -] +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" [[package]] name = "crossterm" @@ -1978,7 +2189,7 @@ dependencies = [ "bitflags 1.3.2", "crossterm_winapi 0.9.1", "libc", - "mio 0.8.9", + "mio 0.8.10", "parking_lot 0.12.1", "signal-hook", "signal-hook-mio", @@ -2005,13 +2216,14 @@ dependencies = [ [[package]] name = "crrl" -version = "0.2.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2db40892a506901e4e8281f00e42687df82d1d3448cb0289ae9183a60cb42ec1" +checksum = "b083214486dae00f49a2f21f32fc8bbc333d6048601bc89203a8ab92bfa691f0" dependencies = [ "blake2 0.10.6", "rand_core 0.6.4", "sha2 0.10.8", + "sha3 0.10.8", ] [[package]] @@ -2111,9 +2323,9 @@ dependencies = [ "itoa 0.4.8", "matches", "phf 0.8.0", - "proc-macro2 1.0.70", - "quote 1.0.33", - "smallvec 1.11.2", + "proc-macro2 1.0.78", + "quote 1.0.35", + "smallvec 1.13.1", "syn 1.0.109", ] @@ -2123,18 +2335,18 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ - "quote 1.0.33", - "syn 2.0.39", + "quote 1.0.35", + "syn 2.0.48", ] [[package]] name = "ctor" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37e366bff8cd32dd8754b0991fb66b279dc48f598c3a18914852a6673deef583" +checksum = "30d2b3721e861707777e3195b0158f950ae6dc4a27e4d02ff9f67e3eb3de199e" dependencies = [ - "quote 1.0.33", - "syn 2.0.39", + "quote 1.0.35", + "syn 2.0.48", ] [[package]] @@ -2148,25 +2360,12 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.4.1" +version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e95fbd621905b854affdc67943b043a0fbb6ed7385fd5a25650d19a8a6cfdf" +checksum = "b467862cc8610ca6fc9a1532d7777cee0804e678ab45410897b9396495994a0b" dependencies = [ "nix 0.27.1", - "windows-sys 0.48.0", -] - -[[package]] -name = "curve25519-dalek" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b85542f99a2dfa2a1b8e192662741c9859a846b296bef1c92ef9b58b5a216" -dependencies = [ - "byteorder", - "digest 0.8.1", - "rand_core 0.5.1", - "subtle 2.4.1", - "zeroize", + "windows-sys 0.52.0", ] [[package]] @@ -2204,9 +2403,9 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", ] [[package]] @@ -2241,12 +2440,12 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.3" +version = "0.20.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +checksum = "fc5d6b04b3fd0ba9926f945895de7d806260a2d7431ba82e7edaecb043c4c6b8" dependencies = [ - "darling_core 0.20.3", - "darling_macro 0.20.3", + "darling_core 0.20.5", + "darling_macro 0.20.5", ] [[package]] @@ -2257,8 +2456,8 @@ checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "strsim 0.9.3", "syn 1.0.109", ] @@ -2271,8 +2470,8 @@ checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "strsim 0.10.0", "syn 1.0.109", ] @@ -2285,24 +2484,24 @@ checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "strsim 0.10.0", "syn 1.0.109", ] [[package]] name = "darling_core" -version = "0.20.3" +version = "0.20.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +checksum = "04e48a959bcd5c761246f5d090ebc2fbf7b9cd527a492b07a67510c108f1e7e3" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "strsim 0.10.0", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -2312,7 +2511,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" dependencies = [ "darling_core 0.10.2", - "quote 1.0.33", + "quote 1.0.35", "syn 1.0.109", ] @@ -2323,7 +2522,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" dependencies = [ "darling_core 0.13.4", - "quote 1.0.33", + "quote 1.0.35", "syn 1.0.109", ] @@ -2334,21 +2533,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" dependencies = [ "darling_core 0.14.4", - "quote 1.0.33", + "quote 1.0.35", "syn 1.0.109", ] [[package]] name = "darling_macro" -version = "0.20.3" +version = "0.20.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +checksum = "1d1545d67a2149e1d93b7e5c7752dce5a7426eb5d1357ddcfd89336b94444f77" dependencies = [ - "darling_core 0.20.3", - "quote 1.0.33", - "syn 2.0.39", + "darling_core 0.20.5", + "quote 1.0.35", + "syn 2.0.48", ] +[[package]] +name = "dary_heap" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7762d17f1241643615821a8455a0b2c3e803784b058693d990b11f2dce25a0ca" + [[package]] name = "dashmap" version = "4.0.2" @@ -2374,69 +2579,80 @@ dependencies = [ [[package]] name = "dashu" -version = "0.3.1" -source = "git+https://github.com/coasys/dashu.git#52981db863981b25ff80b650902053fe0b86ee6a" -dependencies = [ +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b3e5ac1e23ff1995ef05b912e2b012a8784506987a2651552db2c73fb3d7e0" +dependencies = [ "dashu-base", "dashu-float", "dashu-int", "dashu-macros", "dashu-ratio", + "rustversion", ] [[package]] name = "dashu-base" -version = "0.3.1" -source = "git+https://github.com/coasys/dashu.git#52981db863981b25ff80b650902053fe0b86ee6a" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e183fc153511989674ede304b5592c74683393ca09cf20391898c28d6ba04264" [[package]] name = "dashu-float" -version = "0.3.2" -source = "git+https://github.com/coasys/dashu.git#52981db863981b25ff80b650902053fe0b86ee6a" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875d79e1a61e5ee8b7052581de9cad1293f117ce7934cc62dd86a432e0dc204e" dependencies = [ "dashu-base", "dashu-int", + "num-modular", "num-order", - "num-traits", + "rustversion", "static_assertions", ] [[package]] name = "dashu-int" -version = "0.3.1" -source = "git+https://github.com/coasys/dashu.git#52981db863981b25ff80b650902053fe0b86ee6a" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee99d08031ca34a4d044efbbb21dff9b8c54bb9d8c82a189187c0651ffdb9fbf" dependencies = [ "cfg-if 1.0.0", "dashu-base", - "num-modular 0.5.2", + "num-modular", "num-order", - "num-traits", + "rustversion", "static_assertions", ] [[package]] name = "dashu-macros" -version = "0.3.1" -source = "git+https://github.com/coasys/dashu.git#52981db863981b25ff80b650902053fe0b86ee6a" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93381c3ef6366766f6e9ed9cf09e4ef9dec69499baf04f0c60e70d653cf0ab10" dependencies = [ "dashu-base", "dashu-float", "dashu-int", "dashu-ratio", - "proc-macro2 1.0.70", - "quote 1.0.33", + "paste", + "proc-macro2 1.0.78", + "quote 1.0.35", + "rustversion", ] [[package]] name = "dashu-ratio" -version = "0.3.2" -source = "git+https://github.com/coasys/dashu.git#52981db863981b25ff80b650902053fe0b86ee6a" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e33b04dd7ce1ccf8a02a69d3419e354f2bbfdf4eb911a0b7465487248764c9" dependencies = [ "dashu-base", "dashu-float", "dashu-int", + "num-modular", "num-order", - "num-traits", + "rustversion", ] [[package]] @@ -2489,37 +2705,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" dependencies = [ "serde", - "uuid 1.6.1", -] - -[[package]] -name = "deno-proc-macro-rules" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c65c2ffdafc1564565200967edc4851c7b55422d3913466688907efd05ea26f" -dependencies = [ - "deno-proc-macro-rules-macros", - "proc-macro2 1.0.70", - "syn 2.0.39", -] - -[[package]] -name = "deno-proc-macro-rules-macros" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3047b312b7451e3190865713a4dd6e1f821aed614ada219766ebc3024a690435" -dependencies = [ - "once_cell", - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "uuid 1.7.0", ] [[package]] name = "deno_ast" -version = "0.29.5" +version = "0.31.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a8adb6aeb787db71d015d8e9f63f6e004eeb09c86babb4ded00878be18619b1" +checksum = "da7b09db895527a94de1305455338926cd2a7003231ba589b7b7b57e8da344f2" dependencies = [ "anyhow", "base64 0.13.1", @@ -2553,21 +2746,21 @@ dependencies = [ [[package]] name = "deno_broadcast_channel" -version = "0.114.0" +version = "0.118.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd3b2940ff536e31fd7ad5f73916a7bbb6467a5d109c4dcff8cf53e8a69cf92" +checksum = "6fa088b49b1837e74b64b5398cd26612033922a8dc16fa6234fff2095e01a8ef" dependencies = [ "async-trait", "deno_core", "tokio", - "uuid 1.6.1", + "uuid 1.7.0", ] [[package]] name = "deno_cache" -version = "0.52.0" +version = "0.56.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da197703a24d6e0eb9e8757505a9f8a68409007308ebd8f5170553f29b5e20fa" +checksum = "064b3be33f2d5076b21043434c2cd1f76e5273feb9cc3e2466480d23aeaedc06" dependencies = [ "async-trait", "deno_core", @@ -2579,81 +2772,93 @@ dependencies = [ [[package]] name = "deno_console" -version = "0.120.0" +version = "0.124.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9717cd47758a9ed7551e50eba37dae3e6237e4fdc63133578d5cb66758e1b342" +checksum = "be3e75cda1e4dc563ca7dd6a5c24c06043bef5f58351291f525aac0b7c9d6cf1" dependencies = [ "deno_core", ] [[package]] name = "deno_core" -version = "0.218.0" +version = "0.230.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525a5a8af1def85c6c3f0ead2300c18fce14868f94b66ee7f4fec466a4c7c938" +checksum = "8f040a1d56091d209851d011d4882cb2367fceeb64ec630106ca89fad258430a" dependencies = [ "anyhow", "bytes", "deno_ops", - "deno_unsync 0.3.0", + "deno_unsync 0.3.2", "futures", - "indexmap 2.1.0", "libc", "log", - "once_cell", "parking_lot 0.12.1", "pin-project", "serde", "serde_json", "serde_v8", - "smallvec 1.11.2", + "smallvec 1.13.1", "sourcemap 7.0.1", "tokio", "url 2.4.1", "v8", ] +[[package]] +name = "deno_cron" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "586a1b535ed493a3f024222a8a9142a33e5dcefcf7f57147bd72cf1475d6874b" +dependencies = [ + "anyhow", + "async-trait", + "chrono", + "deno_core", + "deno_unsync 0.1.1", + "saffron", + "tokio", +] + [[package]] name = "deno_crypto" -version = "0.134.0" +version = "0.138.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32dc0679f71cb9f60fe618bf8182e81f491548e298da9b3f4fffdcdd043d5174" +checksum = "9933d35b22a8aa16639a2ccf47aa61aab2e716227cf867f5f6e72c6e184252ec" dependencies = [ "aes", "aes-gcm", "aes-kw", - "base64 0.13.1", + "base64 0.21.7", "cbc", "const-oid", "ctr", - "curve25519-dalek 2.1.3", + "curve25519-dalek 4.1.1", "deno_core", "deno_web", - "elliptic-curve 0.12.3", + "elliptic-curve 0.13.8", "num-traits", "once_cell", - "p256 0.11.1", - "p384 0.11.2", + "p256 0.13.2", + "p384", "rand 0.8.5", - "ring 0.16.20", + "ring 0.17.7", "rsa", - "sec1 0.3.0", "serde", "serde_bytes", "sha1", "sha2 0.10.8", - "signature 1.6.4", - "spki 0.6.0", + "signature 2.2.0", + "spki 0.7.3", "tokio", - "uuid 1.6.1", + "uuid 1.7.0", "x25519-dalek 2.0.0", ] [[package]] name = "deno_fetch" -version = "0.144.0" +version = "0.148.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0781ec6f70fab23144078c79e4359860cd85bde2759d14fd477e7586176a9ec5" +checksum = "03da8572d0769db998ac4d9b99f039083756b7ecbee458dca709278292d3a740" dependencies = [ "bytes", "data-url", @@ -2669,15 +2874,15 @@ dependencies = [ [[package]] name = "deno_ffi" -version = "0.107.0" +version = "0.111.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0d352630b2f979b1a1f4a346ae75b2a3f92304f01deb9d8ac8dd0ad60b55c09" +checksum = "ac438f4d1ed2b7b15226be6a0db2c4245a4ca71c4832c67db99977287575db29" dependencies = [ "deno_core", - "dlopen", + "dlopen2", "dynasmrt", - "libffi 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libffi-sys 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libffi", + "libffi-sys", "serde", "serde-value", "serde_json", @@ -2687,9 +2892,9 @@ dependencies = [ [[package]] name = "deno_fs" -version = "0.30.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51fa26124bf30b134633eff27446a33edf6f9739576b95e006eaa7e6cd03e15d" +checksum = "645e906d166d106ef935b6ee9e4244866bdf0050aa53348b8e2f374d786adb13" dependencies = [ "async-trait", "deno_core", @@ -2707,13 +2912,13 @@ dependencies = [ [[package]] name = "deno_http" -version = "0.115.0" +version = "0.119.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e286bf5e627adfcd895cd89c417b82a7b628dfbd5eab04d5135e61ad1bb3663a" +checksum = "7b32575e8eaa3b2ed51ee1981714011e57fd337fe7e49c157688ffcd0ff94a5b" dependencies = [ "async-compression", "async-trait", - "base64 0.13.1", + "base64 0.21.7", "brotli", "bytes", "cache_control", @@ -2724,19 +2929,18 @@ dependencies = [ "fly-accept-encoding", "http 0.2.11", "httparse", - "hyper 0.14.27", + "hyper 0.14.28", "hyper 1.0.0-rc.4", "memmem", "mime", "once_cell", "percent-encoding 2.3.0", - "phf 0.10.1", + "phf 0.11.2", "pin-project", - "ring 0.16.20", + "ring 0.17.7", "scopeguard", "serde", - "slab", - "smallvec 1.11.2", + "smallvec 1.13.1", "thiserror", "tokio", "tokio-util", @@ -2744,9 +2948,9 @@ dependencies = [ [[package]] name = "deno_io" -version = "0.30.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9a3d355a1487498025662a959c705573964c0f1c55b4d1a8fc6546caea657d9" +checksum = "dbeb24c251ff0aa1adc60433510b7dafd39f4ab3527613b66149376e3f3b7c08" dependencies = [ "async-trait", "deno_core", @@ -2759,16 +2963,22 @@ dependencies = [ [[package]] name = "deno_kv" -version = "0.28.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "076db5bb2c528fea42de6255ff64854c0e2b23b9472401b079fe6efc7539278e" +checksum = "1b455d076f9a5f798fa68156943667befd008f96a37887728af9ba10a5d6c9e9" dependencies = [ "anyhow", "async-trait", - "base64 0.13.1", + "base64 0.21.7", "chrono", "deno_core", + "deno_fetch", + "deno_node", + "deno_tls", "deno_unsync 0.1.1", + "denokv_proto", + "denokv_remote", + "denokv_sqlite", "hex", "log", "num-bigint", @@ -2782,19 +2992,7 @@ dependencies = [ "termcolor", "tokio", "url 2.4.1", - "uuid 1.6.1", -] - -[[package]] -name = "deno_lockfile" -version = "0.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cd29f62e6dec60e585f579df3e9c2fc562aadf881319152974bc442a9042077" -dependencies = [ - "ring 0.17.7", - "serde", - "serde_json", - "thiserror", + "uuid 1.7.0", ] [[package]] @@ -2810,25 +3008,39 @@ dependencies = [ [[package]] name = "deno_napi" -version = "0.50.0" +version = "0.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2988e23b58718f1a100ceb48086803429c72b292b416a00a71ac49e35e7be555" +checksum = "6e70aaaabdbf511e2ce6c7a498d938a317fc1fb68694d4199323c6e1c2bea40e" dependencies = [ "deno_core", "libloading 0.7.4", ] +[[package]] +name = "deno_native_certs" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4785d0bdc13819b665b71e4fb7e119d859568471e4c245ec5610857e70c9345" +dependencies = [ + "dlopen2", + "dlopen2_derive", + "once_cell", + "rustls-native-certs", + "rustls-pemfile 1.0.4", +] + [[package]] name = "deno_net" -version = "0.112.0" +version = "0.116.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eab9b1f26d9595fc7ebc2d45ac96369262c7977ab4b5548ba8481527404763ec" +checksum = "55d2446ad319ec7bc9dec30f0c043c69ddb1c4fa5fa8982680810f4fd8ec087f" dependencies = [ "deno_core", "deno_tls", "enum-as-inner", "log", "pin-project", + "rustls-tokio-stream", "serde", "socket2 0.5.5", "tokio", @@ -2838,23 +3050,23 @@ dependencies = [ [[package]] name = "deno_node" -version = "0.57.0" +version = "0.61.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dc14133aff9f9cfc6f49ac94c0fe1d42621f18c7b6195f60de33325c2ce0f7e" +checksum = "fd79a3f3ec29b110a6e47304f158ecb091513954f3e54ae25a87e9025104bcef" dependencies = [ "aead-gcm-stream", "aes", "brotli", "bytes", "cbc", + "const-oid", "data-encoding", "deno_core", "deno_fetch", "deno_fs", "deno_media_type", "deno_net", - "deno_npm", - "deno_semver", + "deno_whoami", "digest 0.10.7", "dsa", "ecb", @@ -2862,10 +3074,11 @@ dependencies = [ "errno 0.2.8", "h2", "hex", - "hkdf 0.12.3", + "hkdf 0.12.4", "http 0.2.11", "idna 0.3.0", - "indexmap 2.1.0", + "indexmap 2.2.2", + "k256", "lazy-regex", "libc", "libz-sys", @@ -2878,72 +3091,48 @@ dependencies = [ "once_cell", "p224", "p256 0.13.2", - "p384 0.13.0", + "p384", "path-clean", "pbkdf2 0.12.2", "rand 0.8.5", "regex", "reqwest", - "ring 0.16.20", + "ring 0.17.7", "ripemd", "rsa", "scrypt", - "secp256k1", "serde", - "sha-1 0.10.0", + "sha-1", "sha2 0.10.8", - "signature 1.6.4", + "signature 2.2.0", "tokio", "typenum", "url 2.4.1", - "whoami", "winapi 0.3.9", "x25519-dalek 2.0.0", "x509-parser", ] -[[package]] -name = "deno_npm" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "210f62105862f1ff371e278c623c7ed73d62b0efece4d417c15663d37b730098" -dependencies = [ - "anyhow", - "async-trait", - "deno_lockfile", - "deno_semver", - "futures", - "log", - "monch", - "serde", - "thiserror", -] - [[package]] name = "deno_ops" -version = "0.94.0" +version = "0.106.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e77ea556bab98499a1a482fe02345c35251f8050e00aebd85a4e5eab34bc15a8" +checksum = "215363aeee70b8ae4dca3557c7b85f48f2c231e798b23913c1d3901785ace01e" dependencies = [ - "deno-proc-macro-rules", - "lazy-regex", - "once_cell", - "pmutil", - "proc-macro-crate", - "proc-macro2 1.0.70", - "quote 1.0.33", - "regex", + "proc-macro-rules", + "proc-macro2 1.0.78", + "quote 1.0.35", "strum 0.25.0", "strum_macros 0.25.3", - "syn 2.0.39", + "syn 2.0.48", "thiserror", ] [[package]] name = "deno_runtime" -version = "0.128.0" +version = "0.132.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef3e9bf6d964c27f60a81cabcb327017e74329f5d26857f2c2c980b2a7a05d47" +checksum = "1737bdaae83d16cb56cb82bd03ce4bc94a6865a34f7f4d8a0e1fd5155e41b24a" dependencies = [ "console_static_text", "deno_ast", @@ -2951,6 +3140,7 @@ dependencies = [ "deno_cache", "deno_console", "deno_core", + "deno_cron", "deno_crypto", "deno_fetch", "deno_ffi", @@ -2967,14 +3157,15 @@ dependencies = [ "deno_webidl", "deno_websocket", "deno_webstorage", - "dlopen", + "dlopen2", "encoding_rs", "fastwebsockets", "filetime", + "flate2", "fs3", "fwdansi", "http 0.2.11", - "hyper 0.14.27", + "hyper 0.14.28", "libc", "log", "netif", @@ -2983,41 +3174,28 @@ dependencies = [ "ntapi 0.4.1", "once_cell", "regex", - "ring 0.16.20", + "ring 0.17.7", "serde", "signal-hook-registry", "termcolor", "tokio", "tokio-metrics", - "uuid 1.6.1", + "uuid 1.7.0", "which", "winapi 0.3.9", "winres", ] -[[package]] -name = "deno_semver" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2d3f7f5a3b2ace62b8fdede8585f5fdbd4e7dba9cb33fcaf0db54887316feaa" -dependencies = [ - "monch", - "once_cell", - "serde", - "thiserror", - "url 2.4.1", -] - [[package]] name = "deno_tls" -version = "0.107.0" +version = "0.111.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c1439c26abd5a282ebdf16d974c0c6349d48f680f24563f07db7f6c1b5a03de" +checksum = "3d5f09c7ec139e96601cfead355dfdafb06d5dd17433482c9a496cd053406fb4" dependencies = [ "deno_core", + "deno_native_certs", "once_cell", - "rustls 0.21.9", - "rustls-native-certs", + "rustls 0.21.10", "rustls-pemfile 1.0.4", "rustls-webpki 0.101.7", "serde", @@ -3035,18 +3213,18 @@ dependencies = [ [[package]] name = "deno_unsync" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8a8f3722afd50e566ecfc783cc8a3a046bc4dd5eb45007431dfb2776aeb8993" +checksum = "30dff7e03584dbae188dae96a0f1876740054809b2ad0cf7c9fc5d361f20e739" dependencies = [ "tokio", ] [[package]] name = "deno_url" -version = "0.120.0" +version = "0.124.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47dcced032b60c40920e2c4586565838a52f53e423610196d0e42404d1cd4c10" +checksum = "67d748c3250f82ed4f0032591849c417d9c2c6318a9eaef0b915920113190dc0" dependencies = [ "deno_core", "serde", @@ -3055,9 +3233,9 @@ dependencies = [ [[package]] name = "deno_web" -version = "0.151.0" +version = "0.155.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "250af5b87fb58b4582fcbb851cce0da4e677f526438c2d96bf0b36caedfbd0ef" +checksum = "562bb45f520abba8bb5a754ae2a1dda04b0042918eed544b5741e352af937f6c" dependencies = [ "async-trait", "base64-simd", @@ -3068,43 +3246,44 @@ dependencies = [ "futures", "serde", "tokio", - "uuid 1.6.1", + "uuid 1.7.0", "windows-sys 0.48.0", ] [[package]] name = "deno_webidl" -version = "0.120.0" +version = "0.124.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51ead87def72804607526d4068f67ba74954d8f851732fa2290cb4279430f3c9" +checksum = "8853c2cb5d4d1c6bd323dd9bfe7c461e47becfe13fa8b4b698c89f0ac785e886" dependencies = [ "deno_core", ] [[package]] name = "deno_websocket" -version = "0.125.0" +version = "0.129.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4390e67affc872484f2894645c5003524cea6cfd0ada312aa9bf08d365775c1d" +checksum = "af4c2938c871dae89d7abff0fa68e24cf82f5be1bf29b2c39453c5d2492b17a1" dependencies = [ "bytes", "deno_core", "deno_net", "deno_tls", "fastwebsockets", + "h2", "http 0.2.11", - "hyper 0.14.27", + "hyper 0.14.28", "once_cell", + "rustls-tokio-stream", "serde", "tokio", - "tokio-rustls 0.24.1", ] [[package]] name = "deno_webstorage" -version = "0.115.0" +version = "0.119.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8487d8bb2aa022bd39003efb083eb13ca44856be55eee180db0c4b674ec2328" +checksum = "8c71020adbede95679963bd3127d5e2d88feb0fbd65ab5d9b86f3bf9f82f7b40" dependencies = [ "deno_core", "deno_web", @@ -3112,6 +3291,74 @@ dependencies = [ "serde", ] +[[package]] +name = "deno_whoami" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e75e4caa92b98a27f09c671d1399aee0f5970aa491b9a598523aac000a2192e3" +dependencies = [ + "libc", + "whoami", +] + +[[package]] +name = "denokv_proto" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8952fb8c38c1dcd796d49b00030afb74aa184160ae86817b72a32a994c8e16f0" +dependencies = [ + "anyhow", + "async-trait", + "chrono", + "num-bigint", + "prost", + "prost-build", + "serde", + "uuid 1.7.0", +] + +[[package]] +name = "denokv_remote" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edfc8447324d783b01e215bd5040ff9149c34d9715c7b7b5080dd648ebf1148a" +dependencies = [ + "anyhow", + "async-trait", + "bytes", + "chrono", + "denokv_proto", + "log", + "prost", + "rand 0.8.5", + "reqwest", + "serde", + "serde_json", + "tokio", + "url 2.4.1", + "uuid 1.7.0", +] + +[[package]] +name = "denokv_sqlite" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ec76b691ff069f14e56e3e053c2b2163540b27e4b60179f2b120064a7e4960d" +dependencies = [ + "anyhow", + "async-trait", + "chrono", + "denokv_proto", + "futures", + "log", + "num-bigint", + "rand 0.8.5", + "rusqlite", + "serde_json", + "tokio", + "uuid 1.7.0", +] + [[package]] name = "der" version = "0.6.1" @@ -3119,7 +3366,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" dependencies = [ "const-oid", - "pem-rfc7468 0.6.0", "zeroize", ] @@ -3130,7 +3376,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" dependencies = [ "const-oid", - "pem-rfc7468 0.7.0", + "pem-rfc7468", "zeroize", ] @@ -3154,8 +3400,19 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 1.0.109", +] + +[[package]] +name = "derive-new" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3418329ca0ad70234b9735dc4ceed10af4df60eff9c8e7b06cb5e520d92c3535" +dependencies = [ + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] @@ -3165,9 +3422,9 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", ] [[package]] @@ -3178,8 +3435,8 @@ checksum = "a2658621297f2cf68762a6f7dc0bb7e1ff2cfd6583daef8ee0fed6f7ec468ec0" dependencies = [ "darling 0.10.2", "derive_builder_core", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] @@ -3190,8 +3447,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2791ea3e372c8495c0bc2033991d76b512cd799d07491fbd6890124db9458bef" dependencies = [ "darling 0.10.2", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] @@ -3201,8 +3458,8 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcdbcee2d9941369faba772587a565f4f534e42cb8d17e5295871de730163b2b" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] @@ -3213,8 +3470,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" dependencies = [ "convert_case", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "rustc_version 0.4.0", "syn 1.0.109", ] @@ -3225,8 +3482,8 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "532b4c15dccee12c7044f1fcad956e98410860b22231e44a3b827464797ca7bf" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] @@ -3236,6 +3493,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c877555693c14d2f84191cfd3ad8582790fc52b5e2274b40b59cf5f5cea25c7" +[[package]] +name = "deunicode" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6e854126756c496b8c81dec88f9a706b15b875c5849d4097a3854476b9fdf94" + [[package]] name = "devise" version = "0.4.1" @@ -3253,7 +3516,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8cf4b8dd484ede80fd5c547592c46c3745a617c8af278e2b72bea86b2dfed6" dependencies = [ "devise_core", - "quote 1.0.33", + "quote 1.0.35", ] [[package]] @@ -3262,11 +3525,11 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35b50dba0afdca80b187392b24f2499a88c336d5a8493e4b4ccfb608708be56a" dependencies = [ - "bitflags 2.4.1", - "proc-macro2 1.0.70", + "bitflags 2.4.2", + "proc-macro2 1.0.78", "proc-macro2-diagnostics", - "quote 1.0.33", - "syn 2.0.39", + "quote 1.0.35", + "syn 2.0.48", ] [[package]] @@ -3282,7 +3545,7 @@ dependencies = [ "curve25519-dalek 3.2.0", "did_url", "ed25519-dalek", - "getrandom 0.2.11", + "getrandom 0.2.12", "hkdf 0.11.0", "json-patch 0.2.7", "libsecp256k1", @@ -3443,9 +3706,9 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", ] [[package]] @@ -3455,26 +3718,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc9f8914dcb99891bdfee82536bbff8d9aa612b0dbe83872afbc66902bdec0b9" [[package]] -name = "dlopen" -version = "0.1.8" +name = "dlopen2" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e80ad39f814a9abe68583cd50a2d45c8a67561c3361ab8da240587dda80937" +checksum = "6bc2c7ed06fd72a8513ded8d0d2f6fd2655a85d6885c48cae8625d80faf28c03" dependencies = [ - "dlopen_derive", - "lazy_static", + "dlopen2_derive", "libc", + "once_cell", "winapi 0.3.9", ] [[package]] -name = "dlopen_derive" -version = "0.1.4" +name = "dlopen2_derive" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f236d9e1b1fbd81cea0f9cbdc8dcc7e8ebcd80e6659cd7cb2ad5f6c05946c581" +checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54" dependencies = [ - "libc", - "quote 0.6.13", - "syn 0.15.44", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", ] [[package]] @@ -3493,11 +3756,17 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" +[[package]] +name = "downcast-rs" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" + [[package]] name = "dprint-swc-ext" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a0a2492465344a58a37ae119de59e81fe5a2885f2711c7b5048ef0dfa14ce42" +checksum = "7b2f24ce6b89a06ae3eb08d5d4f88c05d0aef1fa58e2eba8dd92c97b84210c25" dependencies = [ "bumpalo", "num-bigint", @@ -3511,9 +3780,9 @@ dependencies = [ [[package]] name = "dsa" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d88afbb2443ba68ef8593de497e830b2e276434e1408f85cd760b1107b44ead0" +checksum = "48bc224a9084ad760195584ce5abb3c2c34a225fa312a128ad245a6b412b7689" dependencies = [ "digest 0.10.7", "num-bigint-dig", @@ -3540,6 +3809,18 @@ dependencies = [ "dtoa", ] +[[package]] +name = "dummy" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e57e12b69e57fad516e01e2b3960f122696fdb13420e1a88ed8e210316f2876" +dependencies = [ + "darling 0.20.5", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", +] + [[package]] name = "dunce" version = "1.0.4" @@ -3562,8 +3843,8 @@ dependencies = [ "byteorder", "lazy_static", "proc-macro-error", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] @@ -3655,8 +3936,7 @@ dependencies = [ "ff 0.12.1", "generic-array 0.14.7", "group 0.12.1", - "hkdf 0.12.3", - "pem-rfc7468 0.6.0", + "hkdf 0.12.4", "pkcs8 0.9.0", "rand_core 0.6.4", "sec1 0.3.0", @@ -3676,8 +3956,8 @@ dependencies = [ "ff 0.13.0", "generic-array 0.14.7", "group 0.13.0", - "hkdf 0.12.3", - "pem-rfc7468 0.7.0", + "hkdf 0.12.4", + "pem-rfc7468", "pkcs8 0.10.2", "rand_core 0.6.4", "sec1 0.7.3", @@ -3687,13 +3967,14 @@ dependencies = [ [[package]] name = "embed-resource" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f54cc3e827ee1c3812239a9a41dede7b4d7d5d5464faa32d71bd7cba28ce2cb2" +checksum = "3bde55e389bea6a966bd467ad1ad7da0ae14546a5bc794d16d1e55e7fca44881" dependencies = [ "cc", + "memchr", "rustc_version 0.4.0", - "toml 0.8.8", + "toml 0.8.9", "vswhom", "winreg 0.51.0", ] @@ -3726,8 +4007,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9720bba047d567ffc8a3cba48bf19126600e249ab7f128e9233e6376976a116" dependencies = [ "heck 0.4.1", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] @@ -3746,8 +4027,8 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c134c37760b27a871ba422106eedbb8247da973a09e82558bf26d619c882b159" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] @@ -3766,17 +4047,17 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e08b6c6ab82d70f08844964ba10c7babb716de2ecaeab9be5717918a5177d3af" dependencies = [ - "darling 0.20.3", - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "darling 0.20.5", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", ] [[package]] name = "env_logger" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95b3f3e67048839cb0d0781f445682a35113da7121f7c949db0e2be96a4fbece" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" dependencies = [ "humantime", "is-terminal", @@ -3798,8 +4079,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22deed3a8124cff5fa835713fa105621e43bbdc46690c3a6b68328a012d350d4" dependencies = [ "proc-macro-error", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "rustversion", "syn 1.0.109", "synstructure", @@ -3812,8 +4093,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c34a887c8df3ed90498c1c437ce21f211c8e27672921a8ffa293cb8d6d4caa9e" dependencies = [ "proc-macro-error", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "rustversion", "syn 1.0.109", "synstructure", @@ -3879,9 +4160,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "4.0.0" +version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "770d968249b5d99410d61f5bf89057f3199a077a04d087092f58e7d10692baae" +checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" dependencies = [ "concurrent-queue", "parking", @@ -3894,10 +4175,21 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" dependencies = [ - "event-listener 4.0.0", + "event-listener 4.0.3", "pin-project-lite", ] +[[package]] +name = "fake" +version = "2.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c25829bde82205da46e1823b2259db6273379f626fc211f126f65654a2669be" +dependencies = [ + "deunicode", + "dummy", + "rand 0.8.5", +] + [[package]] name = "fallible-iterator" version = "0.2.0" @@ -3927,12 +4219,12 @@ checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "fastwebsockets" -version = "0.4.4" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e6185b6dc9dddc4db0dedd2e213047e93bcbf7a0fb092abc4c4e4f3195efdb4" +checksum = "17c35f166afb94b7f8e9449d0ad866daca111ba4053f3b1960bb480ca4382c63" dependencies = [ - "base64 0.21.5", - "hyper 0.14.27", + "base64 0.21.7", + "hyper 0.14.28", "pin-project", "rand 0.8.5", "sha1", @@ -3949,15 +4241,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef033ed5e9bad94e55838ca0ca906db0e043f517adda0c8b79c7a8c66c93c1b5" dependencies = [ "cfg-if 1.0.0", - "rustix 0.38.26", + "rustix 0.38.30", "windows-sys 0.48.0", ] [[package]] name = "fdeflate" -version = "0.3.1" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64d6dafc854908ff5da46ff3f8f473c6984119a2876a383a860246dd7841a868" +checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" dependencies = [ "simd-adler32", ] @@ -4001,14 +4293,14 @@ dependencies = [ [[package]] name = "figment" -version = "0.10.12" +version = "0.10.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "649f3e5d826594057e9a519626304d8da859ea8a0b18ce99500c586b8d45faee" +checksum = "2b6e5bc7bd59d60d0d45a6ccab6cf0f4ce28698fb4e81e750ddf229c9b824026" dependencies = [ "atomic 0.6.0", "pear", "serde", - "toml 0.8.8", + "toml 0.8.9", "uncased", "version_check", ] @@ -4033,8 +4325,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "fixt" -version = "0.3.0-beta-dev.0" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a05f34f3e013b62b7214ec62fca3d668e0e0b0836855280a036cd678e9750b20" dependencies = [ "holochain_serialized_bytes", "lazy_static", @@ -4054,7 +4347,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" dependencies = [ "crc32fast", - "libz-ng-sys", "miniz_oxide", ] @@ -4130,9 +4422,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03ec5dc38ee19078d84a692b1c41181ff9f94331c76cee66ff0208c770b5e54f" dependencies = [ "pmutil", - "proc-macro2 1.0.70", + "proc-macro2 1.0.78", "swc_macros_common", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -4195,9 +4487,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", @@ -4210,9 +4502,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", @@ -4220,9 +4512,9 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-enum" @@ -4231,15 +4523,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3422d14de7903a52e9dbc10ae05a7e14445ec61890100e098754e120b2bd7b1e" dependencies = [ "derive_utils", - "quote 1.0.33", + "quote 1.0.35", "syn 1.0.109", ] [[package]] name = "futures-executor" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" dependencies = [ "futures-core", "futures-task", @@ -4248,9 +4540,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-lite" @@ -4269,9 +4561,9 @@ dependencies = [ [[package]] name = "futures-lite" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aeee267a1883f7ebef3700f262d2d54de95dfaf38189015a74fdc4e0c7ad8143" +checksum = "445ba825b27408685aaecefd65178908c36c6e96aaf6d8599419d46e624192ba" dependencies = [ "fastrand 2.0.1", "futures-core", @@ -4282,26 +4574,26 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", ] [[package]] name = "futures-sink" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-timer" @@ -4311,9 +4603,9 @@ checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" [[package]] name = "futures-util" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-channel", "futures-core", @@ -4505,6 +4797,16 @@ dependencies = [ "libc", ] +[[package]] +name = "gethostname" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" +dependencies = [ + "libc", + "winapi 0.3.9", +] + [[package]] name = "getrandom" version = "0.1.16" @@ -4518,9 +4820,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -4555,16 +4857,6 @@ dependencies = [ "tracing-futures", ] -[[package]] -name = "ghost_actor" -version = "0.4.0-alpha.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52cb0746ab4cf003d75cdbaaae2cf95139ec9607ae46bd5c68721bda2ca0c824" -dependencies = [ - "futures", - "tracing", -] - [[package]] name = "gimli" version = "0.26.2" @@ -4614,22 +4906,22 @@ dependencies = [ [[package]] name = "git-version" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13ad01ffa8221f7fe8b936d6ffb2a3e7ad428885a04fad51866a5f33eafda57c" +checksum = "1ad568aa3db0fcbc81f2f116137f263d7304f512a1209b35b85150d3ef88ad19" dependencies = [ "git-version-macro", ] [[package]] name = "git-version-macro" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84488ccbdb24ad6f56dc1863b4a8154a7856cd3c6c7610401634fab3cb588dae" +checksum = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", ] [[package]] @@ -4648,7 +4940,7 @@ dependencies = [ "gobject-sys", "libc", "once_cell", - "smallvec 1.11.2", + "smallvec 1.13.1", "thiserror", ] @@ -4662,8 +4954,8 @@ dependencies = [ "heck 0.4.1", "proc-macro-crate", "proc-macro-error", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] @@ -4692,7 +4984,7 @@ dependencies = [ "aho-corasick", "bstr", "log", - "regex-automata 0.4.3", + "regex-automata 0.4.5", "regex-syntax 0.8.2", ] @@ -4733,7 +5025,7 @@ dependencies = [ "parking_lot 0.11.2", "quanta", "rand 0.8.5", - "smallvec 1.11.2", + "smallvec 1.13.1", ] [[package]] @@ -4769,7 +5061,7 @@ dependencies = [ "serde", "serde_json", "thiserror", - "uuid 1.6.1", + "uuid 1.7.0", ] [[package]] @@ -4793,8 +5085,8 @@ dependencies = [ "graphql-parser", "heck 0.4.1", "lazy_static", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "serde", "serde_json", "syn 1.0.109", @@ -4807,7 +5099,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d52fc9cde811f44b15ec0692b31e56a3067f6f431c5ace712f286e47c1dacc98" dependencies = [ "graphql_client_codegen", - "proc-macro2 1.0.70", + "proc-macro2 1.0.78", "syn 1.0.109", ] @@ -4883,16 +5175,16 @@ dependencies = [ "anyhow", "proc-macro-crate", "proc-macro-error", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] [[package]] name = "h2" -version = "0.3.22" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" +checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" dependencies = [ "bytes", "fnv", @@ -4900,7 +5192,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.11", - "indexmap 2.1.0", + "indexmap 2.2.2", "slab", "tokio", "tokio-util", @@ -4941,7 +5233,7 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.8.6", + "ahash 0.8.7", ] [[package]] @@ -4950,7 +5242,7 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" dependencies = [ - "ahash 0.8.6", + "ahash 0.8.7", "allocator-api2", ] @@ -4965,24 +5257,49 @@ dependencies = [ [[package]] name = "hc_seed_bundle" -version = "0.1.7" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded13e388a81713db6919cd750e6113acf2fe5afbaedf8aff79780ec4fc47425" +checksum = "6a160a11a63c03f180389bcbdb8f4823f84805bd07169160e4a0ede592512338" dependencies = [ "futures", "one_err", - "rmp-serde 1.1.2", + "rmp-serde", "rmpv", "serde", "serde_bytes", "sodoken", ] +[[package]] +name = "hc_sleuth" +version = "0.2.0-beta-dev.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ba995e5a3a4e3194b34d998f0e0843ed92629d432e0c9dd8a0be3a757fa6b3d" +dependencies = [ + "aitia", + "anyhow", + "derive_more", + "holochain_state_types", + "holochain_trace", + "holochain_types", + "kitsune_p2p", + "once_cell", + "parking_lot 0.10.2", + "petgraph", + "regex", + "serde", + "structopt", + "tracing", + "tracing-subscriber 0.3.18", +] + [[package]] name = "hdi" -version = "0.4.0-beta-dev.18" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.4.0-beta-dev.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31dfc1fec80d7d9292e04e26e94528b0a0cc9baf982d1fb18e3af3e7625cb90" dependencies = [ + "getrandom 0.2.12", "hdk_derive", "holo_hash", "holochain_integrity_types", @@ -4996,10 +5313,11 @@ dependencies = [ [[package]] name = "hdk" -version = "0.3.0-beta-dev.22" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99a6ccefa8f3aa8cd8a0f7ab40f3939610133bd32a14785d4d62440f92ab6a11" dependencies = [ - "getrandom 0.2.11", + "getrandom 0.2.12", "hdi", "hdk_derive", "holo_hash", @@ -5015,16 +5333,17 @@ dependencies = [ [[package]] name = "hdk_derive" -version = "0.3.0-beta-dev.17" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcfd466d96f2d19530b1419646b0a52c3bc833b0e7dacad4329cb90708db8665" dependencies = [ "darling 0.14.4", "heck 0.4.1", "holochain_integrity_types", "paste", "proc-macro-error", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] @@ -5034,7 +5353,7 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06683b93020a07e3dbcf5f8c0f6d40080d725bea7936fc01ad345c01b97dc270" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "bytes", "headers-core", "http 0.2.11", @@ -5091,9 +5410,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f" [[package]] name = "hex" @@ -5119,9 +5438,9 @@ dependencies = [ [[package]] name = "hkdf" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" dependencies = [ "hmac 0.12.1", ] @@ -5168,8 +5487,9 @@ dependencies = [ [[package]] name = "holo_hash" -version = "0.3.0-beta-dev.14" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "050e53c0258e6235145fe949b74cedd48c24f4d92e1e7b7e39581a9a2b6996e7" dependencies = [ "arbitrary", "base64 0.13.1", @@ -5193,9 +5513,11 @@ dependencies = [ [[package]] name = "holochain" -version = "0.3.0-beta-dev.27" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e17f5a4135fe8b3bde1a7c9077957a6d0b9a9bb3699593180154ebca7b6a032" dependencies = [ + "aitia", "anyhow", "arbitrary", "async-once-cell", @@ -5215,12 +5537,14 @@ dependencies = [ "fixt", "futures", "get_if_addrs", - "getrandom 0.2.11", - "ghost_actor 0.3.0-alpha.6", + "getrandom 0.2.12", + "ghost_actor", + "hc_sleuth", "hdk", "holo_hash", "holochain_cascade", "holochain_conductor_api", + "holochain_conductor_services", "holochain_keystore", "holochain_metrics", "holochain_nonce", @@ -5246,6 +5570,7 @@ dependencies = [ "kitsune_p2p_bootstrap", "kitsune_p2p_bootstrap_client", "kitsune_p2p_types", + "lair_keystore", "lazy_static", "matches", "mockall", @@ -5268,7 +5593,7 @@ dependencies = [ "serde", "serde_bytes", "serde_json", - "serde_yaml 0.9.27", + "serde_yaml 0.9.31", "shrinkwraprs", "sodoken", "structopt", @@ -5297,8 +5622,9 @@ dependencies = [ [[package]] name = "holochain_cascade" -version = "0.3.0-beta-dev.27" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd5458dc0c17d419adc76095465e72811d8ed95e1d8df55795d38b236204dd6f" dependencies = [ "async-trait", "derive_more", @@ -5306,7 +5632,7 @@ dependencies = [ "fallible-iterator", "fixt", "futures", - "ghost_actor 0.3.0-alpha.6", + "ghost_actor", "hdk", "hdk_derive", "holo_hash", @@ -5333,11 +5659,12 @@ dependencies = [ [[package]] name = "holochain_cli_bundle" -version = "0.3.0-beta-dev.25" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b757bd1282e5a5da3a399fb29536a99ece86b5c411c30427746499cc489a3e1" dependencies = [ "anyhow", - "clap 4.4.11", + "clap 4.4.18", "futures", "holochain_serialized_bytes", "holochain_types", @@ -5346,7 +5673,7 @@ dependencies = [ "mr_bundle", "serde", "serde_bytes", - "serde_yaml 0.9.27", + "serde_yaml 0.9.31", "thiserror", "tokio", "tracing", @@ -5355,10 +5682,11 @@ dependencies = [ [[package]] name = "holochain_cli_run_local_services" -version = "0.3.0-beta-dev.15" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b14a6d3fbda4aec1eeb9bb21d05cf6d5b614c4df19f79632cd7f11e2da7525" dependencies = [ - "clap 4.4.11", + "clap 4.4.18", "futures", "holochain_trace", "if-addrs 0.10.2", @@ -5370,8 +5698,9 @@ dependencies = [ [[package]] name = "holochain_conductor_api" -version = "0.3.0-beta-dev.27" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ac28f924e24cf9276b7b66140a76b1e9a01bb0cb81ef7b6a4820363c78cd436" dependencies = [ "derive_more", "directories 2.0.2", @@ -5385,17 +5714,37 @@ dependencies = [ "kitsune_p2p_types", "serde", "serde_derive", - "serde_yaml 0.9.27", + "serde_yaml 0.9.31", + "shrinkwraprs", "structopt", "thiserror", "tracing", "url2", ] +[[package]] +name = "holochain_conductor_services" +version = "0.2.0-beta-dev.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c13a9426f1d135582a3d909814557eafd868d5a3628d61d3f590a9e59424c37" +dependencies = [ + "anyhow", + "async-trait", + "derive_more", + "futures", + "holochain_keystore", + "holochain_types", + "mockall", + "must_future", + "serde", + "thiserror", +] + [[package]] name = "holochain_integrity_types" -version = "0.3.0-beta-dev.17" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a76306ea0c825e6bc8f040df4a3fe1ab82f187c108a91e81df957ae4f76efda" dependencies = [ "arbitrary", "derive_builder", @@ -5416,10 +5765,12 @@ dependencies = [ [[package]] name = "holochain_keystore" -version = "0.3.0-beta-dev.19" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db732e26f52b77e71f10bc6424b397a2891da75a7e956070be21772e996a183e" dependencies = [ "base64 0.13.1", + "derive_more", "futures", "holo_hash", "holochain_secure_primitive", @@ -5434,6 +5785,7 @@ dependencies = [ "parking_lot 0.11.2", "serde", "serde_bytes", + "shrinkwraprs", "sodoken", "thiserror", "tokio", @@ -5442,8 +5794,9 @@ dependencies = [ [[package]] name = "holochain_metrics" -version = "0.3.0-beta-dev.7" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37a65c793858a03b5272e3408bc216cfdd0a21129a3e05fe0bee43ec6d37f0ce" dependencies = [ "influxive", "opentelemetry_api", @@ -5454,24 +5807,28 @@ dependencies = [ [[package]] name = "holochain_nonce" -version = "0.3.0-beta-dev.22" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1fa99c5d38bb8fe463dd0284e2123ad14405f2a62146c4aaa809d5b24134711" dependencies = [ - "getrandom 0.2.11", + "getrandom 0.2.12", "holochain_secure_primitive", "kitsune_p2p_timestamp", ] [[package]] name = "holochain_p2p" -version = "0.3.0-beta-dev.26" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4824866996d6cbc277ce61adb7341de974b67132d98e0e093bac10e11974f77" dependencies = [ + "aitia", "async-trait", "derive_more", "fixt", "futures", - "ghost_actor 0.3.0-alpha.6", + "ghost_actor", + "hc_sleuth", "holo_hash", "holochain_keystore", "holochain_nonce", @@ -5494,8 +5851,9 @@ dependencies = [ [[package]] name = "holochain_secure_primitive" -version = "0.3.0-beta-dev.21" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcc25ba91f7898688245db538693d7b26504f91df24709111bb3b1d7506af01a" dependencies = [ "paste", "serde", @@ -5512,7 +5870,7 @@ dependencies = [ "holochain_serialized_bytes_derive", "proptest", "proptest-derive", - "rmp-serde 0.15.5", + "rmp-serde", "serde", "serde-transcode", "serde_bytes", @@ -5526,14 +5884,15 @@ version = "0.0.53" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec3e0cf02005cbf0f514476d40e02125b26df6d4922d7a2c48a84fc588539d71" dependencies = [ - "quote 1.0.33", + "quote 1.0.35", "syn 1.0.109", ] [[package]] name = "holochain_sqlite" -version = "0.3.0-beta-dev.24" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d5ff0f25f26914552c14a91744babbabcbc3d1d55c0cea51e63ae2075a95ca" dependencies = [ "anyhow", "async-trait", @@ -5541,7 +5900,7 @@ dependencies = [ "derive_more", "fallible-iterator", "futures", - "getrandom 0.2.11", + "getrandom 0.2.12", "holo_hash", "holochain_nonce", "holochain_serialized_bytes", @@ -5560,7 +5919,7 @@ dependencies = [ "pretty_assertions", "r2d2", "r2d2_sqlite_neonphog", - "rmp-serde 0.15.5", + "rmp-serde", "rusqlite", "scheduled-thread-pool", "serde", @@ -5576,9 +5935,11 @@ dependencies = [ [[package]] name = "holochain_state" -version = "0.3.0-beta-dev.26" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cf0fea28fc15c5aeaed396cf285bf122d77d5cf65a6307523595b3a1ac08da8" dependencies = [ + "aitia", "async-recursion", "base64 0.13.1", "byteorder", @@ -5590,6 +5951,7 @@ dependencies = [ "either", "fallible-iterator", "futures", + "hc_sleuth", "holo_hash", "holochain_keystore", "holochain_nonce", @@ -5618,8 +5980,9 @@ dependencies = [ [[package]] name = "holochain_state_types" -version = "0.3.0-beta-dev.24" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "025c62656b1ff2dea34f711d77f7410a885d53f7a197f2783765a4e626acc04e" dependencies = [ "holo_hash", "holochain_integrity_types", @@ -5628,8 +5991,9 @@ dependencies = [ [[package]] name = "holochain_test_wasm_common" -version = "0.3.0-beta-dev.22" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "838d7b0ece7b0aa1bf0efd3b4ee5646c158c2eba4b022074914ec6ce972d53f5" dependencies = [ "hdk", "serde", @@ -5637,8 +6001,9 @@ dependencies = [ [[package]] name = "holochain_trace" -version = "0.3.0-beta-dev.2" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b7a5fcca77738957ac4619743f0bd761468057bf3be49852153ee0d5d2bb708" dependencies = [ "chrono", "derive_more", @@ -5654,8 +6019,9 @@ dependencies = [ [[package]] name = "holochain_types" -version = "0.3.0-beta-dev.24" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40515fd0eef3af0aac447dc3881656a686c34c73ff25afbbcc9e8ab00993b145" dependencies = [ "anyhow", "arbitrary", @@ -5672,7 +6038,7 @@ dependencies = [ "fixt", "flate2", "futures", - "getrandom 0.2.11", + "getrandom 0.2.12", "holo_hash", "holochain_keystore", "holochain_nonce", @@ -5702,7 +6068,7 @@ dependencies = [ "serde_derive", "serde_json", "serde_with 1.14.0", - "serde_yaml 0.9.27", + "serde_yaml 0.9.31", "shrinkwraprs", "strum 0.18.0", "strum_macros 0.18.0", @@ -5710,21 +6076,20 @@ dependencies = [ "thiserror", "tokio", "tracing", - "wasmer", - "wasmer-middlewares", ] [[package]] name = "holochain_util" -version = "0.3.0-beta-dev.2" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14d6225aded80caf004c2214e38b39fb2459ee9a7a8fcd0d09146f49ae0771f0" dependencies = [ "backtrace", "cfg-if 0.1.10", "derive_more", "dunce", "futures", - "getrandom 0.2.11", + "getrandom 0.2.12", "num_cpus", "once_cell", "rpassword 7.3.1", @@ -5734,8 +6099,9 @@ dependencies = [ [[package]] name = "holochain_wasm_test_utils" -version = "0.3.0-beta-dev.25" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ada8f35eed0e0c83c0e021f8ade588d8d2fd7a47a2b51210d683234755b4807" dependencies = [ "holochain_types", "holochain_util", @@ -5747,9 +6113,9 @@ dependencies = [ [[package]] name = "holochain_wasmer_common" -version = "0.0.86" +version = "0.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d90da174e7db13ecce8279052d6e7394a101a0bcf63a990404419ee7d7d06d1" +checksum = "72007fd2a72d77e76ffa494e5847bf6e893e25e73fe1d1de902e1b8d5033a64e" dependencies = [ "holochain_serialized_bytes", "serde", @@ -5761,9 +6127,9 @@ dependencies = [ [[package]] name = "holochain_wasmer_guest" -version = "0.0.86" +version = "0.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa28c28213791d36359d083d892371bdddf71148412e411ffbc748d048bfaa22" +checksum = "8c429e84a19ee446f47541a6fed10e1a4376a8a8ba6d3dbff7d07e4a7bb4c85f" dependencies = [ "holochain_serialized_bytes", "holochain_wasmer_common", @@ -5775,15 +6141,15 @@ dependencies = [ [[package]] name = "holochain_wasmer_host" -version = "0.0.86" +version = "0.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20d8d17c6621725b32feab8499002fd9bd10e19ccd0b33e715b27ebe835c7fd8" +checksum = "4951f6e1ac6d294631b3d38b8584c84ff510057ac6adca04d1e244b30c2e0b6b" dependencies = [ "bimap", "bytes", + "hex", "holochain_serialized_bytes", "holochain_wasmer_common", - "once_cell", "parking_lot 0.12.1", "rand 0.8.5", "serde", @@ -5794,36 +6160,29 @@ dependencies = [ [[package]] name = "holochain_websocket" -version = "0.3.0-beta-dev.5" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0195ee3c2ba62d5d6b905b287edb618528f9b75274a463072459c9da784b2c2f" dependencies = [ "futures", - "ghost_actor 0.4.0-alpha.5", "holochain_serialized_bytes", - "must_future", - "nanoid 0.3.0", - "net2", "serde", "serde_bytes", - "stream-cancel", - "thiserror", "tokio", - "tokio-stream", - "tokio-tungstenite 0.13.0", + "tokio-tungstenite 0.21.0", "tracing", - "tracing-futures", - "tungstenite 0.12.0", - "url2", ] [[package]] name = "holochain_zome_types" -version = "0.3.0-beta-dev.18" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1d1b165dcf3d1ae412edf952b1ae4e57a5b5c4a97c11eb97b5fb4fdf06cc6a4" dependencies = [ "arbitrary", "contrafact", "derive_builder", + "derive_more", "fixt", "holo_hash", "holochain_integrity_types", @@ -5845,7 +6204,7 @@ dependencies = [ "rusqlite", "serde", "serde_bytes", - "serde_yaml 0.9.27", + "serde_yaml 0.9.31", "shrinkwraprs", "strum 0.18.0", "subtle 2.4.1", @@ -5856,11 +6215,11 @@ dependencies = [ [[package]] name = "home" -version = "0.5.5" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -5875,17 +6234,16 @@ dependencies = [ ] [[package]] -name = "html5ever" -version = "0.25.2" +name = "hstr" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5c13fb08e5d4dfc151ee5e88bae63f7773d61852f3bdc73c9f4b9e1bde03148" +checksum = "17fafeca18cf0927e23ea44d7a5189c10536279dfe9094e0dfa953053fbb5377" dependencies = [ - "log", - "mac", - "markup5ever 0.10.1", - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 1.0.109", + "new_debug_unreachable", + "once_cell", + "phf 0.11.2", + "rustc-hash", + "smallvec 1.13.1", ] [[package]] @@ -5896,9 +6254,9 @@ checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7" dependencies = [ "log", "mac", - "markup5ever 0.11.0", - "proc-macro2 1.0.70", - "quote 1.0.33", + "markup5ever", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] @@ -5910,52 +6268,39 @@ checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" dependencies = [ "bytes", "fnv", - "itoa 1.0.9", + "itoa 1.0.10", ] [[package]] name = "http" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" dependencies = [ "bytes", "fnv", - "itoa 1.0.9", + "itoa 1.0.10", ] [[package]] name = "http-body" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" -dependencies = [ - "bytes", - "http 0.2.11", - "pin-project-lite", -] - -[[package]] -name = "http-body" -version = "1.0.0-rc.2" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "951dfc2e32ac02d67c90c0d65bd27009a635dc9b381a2cc7d284ab01e3a0150d" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", "http 0.2.11", + "pin-project-lite", ] [[package]] -name = "http-body-util" -version = "0.1.0-rc.3" +name = "http-body" +version = "1.0.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08ef12f041acdd397010e5fb6433270c147d3b8b2d0a840cd7fff8e531dca5c8" +checksum = "951dfc2e32ac02d67c90c0d65bd27009a635dc9b381a2cc7d284ab01e3a0150d" dependencies = [ "bytes", - "futures-util", "http 0.2.11", - "http-body 1.0.0-rc.2", - "pin-project-lite", ] [[package]] @@ -5978,9 +6323,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "human-panic" -version = "1.2.2" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a79a67745be0cb8dd2771f03b24c2f25df98d5471fe7a595d668cfa2e6f843d" +checksum = "c4f016c89920bbb30951a8405ecacbb4540db5524313b9445736e7e1855cf370" dependencies = [ "anstream", "anstyle", @@ -5988,8 +6333,8 @@ dependencies = [ "os_info", "serde", "serde_derive", - "toml 0.8.8", - "uuid 1.6.1", + "toml 0.8.9", + "uuid 1.7.0", ] [[package]] @@ -6000,9 +6345,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.27" +version = "0.14.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" dependencies = [ "bytes", "futures-channel", @@ -6010,12 +6355,12 @@ dependencies = [ "futures-util", "h2", "http 0.2.11", - "http-body 0.4.5", + "http-body 0.4.6", "httparse", "httpdate", - "itoa 1.0.9", + "itoa 1.0.10", "pin-project-lite", - "socket2 0.4.10", + "socket2 0.5.5", "tokio", "tower-service", "tracing", @@ -6036,7 +6381,7 @@ dependencies = [ "http-body 1.0.0-rc.2", "httparse", "httpdate", - "itoa 1.0.9", + "itoa 1.0.10", "pin-project-lite", "tokio", "tracing", @@ -6051,8 +6396,8 @@ checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", "http 0.2.11", - "hyper 0.14.27", - "rustls 0.21.9", + "hyper 0.14.28", + "rustls 0.21.10", "tokio", "tokio-rustls 0.24.1", ] @@ -6064,34 +6409,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper 0.14.27", + "hyper 0.14.28", "native-tls", "tokio", "tokio-native-tls", ] -[[package]] -name = "hyper-util" -version = "0.1.1" -source = "git+https://github.com/coasys/hyper-util.git?rev=47313ff16d6c3d416566150c0d1afc963f903671#47313ff16d6c3d416566150c0d1afc963f903671" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http 1.0.0", - "http-body 1.0.0-rc.2", - "hyper 1.0.0-rc.4", - "pin-project-lite", - "tower", - "tower-service", - "tracing", -] - [[package]] name = "iana-time-zone" -version = "0.1.58" +version = "0.1.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" +checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -6206,15 +6534,15 @@ checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed" [[package]] name = "ignore" -version = "0.4.21" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "747ad1b4ae841a78e8aba0d63adbfbeaea26b517b63705d47856b73015d27060" +checksum = "b46810df39e66e925525d6e38ce1e7f6e1d208f72dc39757880fcb66e2c58af1" dependencies = [ "crossbeam-deque", "globset", "log", "memchr", - "regex-automata 0.4.3", + "regex-automata 0.4.5", "same-file", "walkdir", "winapi-util", @@ -6222,15 +6550,40 @@ dependencies = [ [[package]] name = "image" -version = "0.24.7" +version = "0.24.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f3dfdbdd72063086ff443e297b61695500514b1e41095b6fb9a5ab48a70a711" +checksum = "034bbe799d1909622a74d1193aa50147769440040ff36cb2baa947609b0a4e23" dependencies = [ "bytemuck", "byteorder", "color_quant", - "num-rational", "num-traits", + "png", + "tiff", +] + +[[package]] +name = "include_dir" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24b56e147e6187d61e9d0f039f10e070d0c0a887e24fe0bb9ca3f29bfde62cab" +dependencies = [ + "glob", + "include_dir_impl", + "proc-macro-hack", +] + +[[package]] +name = "include_dir_impl" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a0c890c85da4bab7bce4204c707396bbd3c6c8a681716a51c8814cfc2b682df" +dependencies = [ + "anyhow", + "proc-macro-hack", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 1.0.109", ] [[package]] @@ -6246,9 +6599,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.1.0" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "824b2ae422412366ba479e8111fd301f7b5faece8149317bb81925979a53f520" dependencies = [ "equivalent", "hashbrown 0.14.3", @@ -6270,15 +6623,15 @@ version = "0.11.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "321f0f839cd44a4686e9504b0a62b4d69a50b62072144c71c68f5873c167b8d9" dependencies = [ - "ahash 0.8.6", - "clap 4.4.11", + "ahash 0.8.7", + "clap 4.4.18", "crossbeam-channel", "crossbeam-utils", "dashmap 5.5.3", "env_logger", - "indexmap 2.1.0", + "indexmap 2.2.2", "is-terminal", - "itoa 1.0.9", + "itoa 1.0.10", "log", "num-format", "once_cell", @@ -6342,7 +6695,7 @@ version = "0.0.2-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "264581af3b49d108e76382e301d4228f89a3995e373363b877bb42b1312ebba3" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "digest 0.10.7", "dirs 5.0.1", "flate2", @@ -6426,15 +6779,6 @@ dependencies = [ "generic-array 0.14.7", ] -[[package]] -name = "input_buffer" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f97967975f448f1a7ddb12b0bc41069d09ed6a1c161a92687e057325db35d413" -dependencies = [ - "bytes", -] - [[package]] name = "instant" version = "0.1.12" @@ -6446,9 +6790,9 @@ dependencies = [ [[package]] name = "intervallum" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ccecd834666f695ecec3ff0d5fc32e32c91abea91a28fd0aceb4b35a82cee1" +checksum = "18bfda24d3930aa647f90044d5ef87d0c8120f13b86b2d60e8aade66e656e659" dependencies = [ "bit-set", "gcollections", @@ -6463,7 +6807,7 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ - "hermit-abi 0.3.3", + "hermit-abi 0.3.4", "libc", "windows-sys 0.48.0", ] @@ -6488,26 +6832,25 @@ checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "is-macro" -version = "0.3.1" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc74b7abae208af9314a406bd7dcc65091230b6e749c09e07a645885fecf34f9" +checksum = "59a85abdc13717906baccb5a1e435556ce0df215f242892f721dff62bf25288f" dependencies = [ "Inflector", - "pmutil", - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", ] [[package]] name = "is-terminal" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455" dependencies = [ - "hermit-abi 0.3.3", - "rustix 0.38.26", - "windows-sys 0.48.0", + "hermit-abi 0.3.4", + "rustix 0.38.30", + "windows-sys 0.52.0", ] [[package]] @@ -6549,9 +6892,9 @@ dependencies = [ [[package]] name = "itertools" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ "either", ] @@ -6564,9 +6907,9 @@ checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "javascriptcore-rs" @@ -6636,11 +6979,17 @@ dependencies = [ "libc", ] +[[package]] +name = "jpeg-decoder" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" + [[package]] name = "js-sys" -version = "0.3.66" +version = "0.3.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" +checksum = "9a1d36f1235bc969acba30b7f5990b864423a6068a10f7c90ae8f0112e3a59d1" dependencies = [ "wasm-bindgen", ] @@ -6674,7 +7023,7 @@ version = "8.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "pem", "ring 0.16.20", "serde", @@ -6683,113 +7032,43 @@ dependencies = [ ] [[package]] -name = "juniper" -version = "0.16.0-dev" -source = "git+https://github.com/graphql-rust/juniper?rev=57628de8649be071b04a3fedb45c47add7dc5192#57628de8649be071b04a3fedb45c47add7dc5192" -dependencies = [ - "async-trait", - "bson", - "chrono", - "fnv", - "futures", - "futures-enum", - "graphql-parser", - "indexmap 2.1.0", - "juniper_codegen", - "serde", - "smartstring", - "static_assertions", - "url 2.4.1", - "uuid 1.6.1", - "void", -] - -[[package]] -name = "juniper_codegen" -version = "0.16.0-dev" -source = "git+https://github.com/graphql-rust/juniper?rev=57628de8649be071b04a3fedb45c47add7dc5192#57628de8649be071b04a3fedb45c47add7dc5192" -dependencies = [ - "proc-macro-error", - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 1.0.109", - "url 2.4.1", -] - -[[package]] -name = "juniper_graphql_transport_ws" -version = "0.4.0-dev" -source = "git+https://github.com/graphql-rust/juniper?rev=57628de8649be071b04a3fedb45c47add7dc5192#57628de8649be071b04a3fedb45c47add7dc5192" -dependencies = [ - "juniper", - "juniper_graphql_ws", - "juniper_subscriptions", - "serde", - "tokio", -] - -[[package]] -name = "juniper_graphql_ws" -version = "0.4.0-dev" -source = "git+https://github.com/graphql-rust/juniper?rev=57628de8649be071b04a3fedb45c47add7dc5192#57628de8649be071b04a3fedb45c47add7dc5192" -dependencies = [ - "juniper", - "juniper_subscriptions", - "serde", - "tokio", -] - -[[package]] -name = "juniper_subscriptions" -version = "0.17.0-dev" -source = "git+https://github.com/graphql-rust/juniper?rev=57628de8649be071b04a3fedb45c47add7dc5192#57628de8649be071b04a3fedb45c47add7dc5192" -dependencies = [ - "futures", - "juniper", -] - -[[package]] -name = "juniper_warp" -version = "0.8.0-dev" -source = "git+https://github.com/graphql-rust/juniper?rev=57628de8649be071b04a3fedb45c47add7dc5192#57628de8649be071b04a3fedb45c47add7dc5192" +name = "k256" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" dependencies = [ - "anyhow", - "futures", - "headers", - "juniper", - "juniper_graphql_transport_ws", - "juniper_graphql_ws", - "log", - "serde", - "serde_json", - "thiserror", - "tokio", - "warp", + "cfg-if 1.0.0", + "ecdsa 0.16.9", + "elliptic-curve 0.13.8", + "once_cell", + "sha2 0.10.8", + "signature 2.2.0", ] [[package]] name = "keccak" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" dependencies = [ "cpufeatures", ] [[package]] name = "kitsune_p2p" -version = "0.3.0-beta-dev.23" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21ef9c61bf50f75121c2471267d553f7ef13a757b0e51c23a38251628d83baf4" dependencies = [ "arrayref", - "base64 0.21.5", + "base64 0.21.7", "blake2b_simd 0.5.11", "bloomfilter", "bytes", "derive_more", "fixt", "futures", - "ghost_actor 0.3.0-alpha.6", + "ghost_actor", "governor", "holochain_trace", "itertools 0.11.0", @@ -6824,8 +7103,9 @@ dependencies = [ [[package]] name = "kitsune_p2p_bin_data" -version = "0.3.0-beta-dev.10" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c89fb7f069f4a90794dff2669cc832a71c9fd93554e92b0f17de97d753283f4" dependencies = [ "arbitrary", "base64 0.13.1", @@ -6842,8 +7122,9 @@ dependencies = [ [[package]] name = "kitsune_p2p_block" -version = "0.3.0-beta-dev.11" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a32470626b779dd5e36e516d64f8bdde1eac1faec944654d2b85f200b0ac3cee" dependencies = [ "kitsune_p2p_bin_data", "kitsune_p2p_timestamp", @@ -6852,10 +7133,11 @@ dependencies = [ [[package]] name = "kitsune_p2p_bootstrap" -version = "0.2.0-beta-dev.14" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.2.0-beta-dev.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b9b206e371f9ff2e951bfdb4cf4228c1c1c6d54e46df4f3e733b3cb7950e500" dependencies = [ - "clap 4.4.11", + "clap 4.4.18", "futures", "kitsune_p2p_bin_data", "kitsune_p2p_types", @@ -6871,8 +7153,9 @@ dependencies = [ [[package]] name = "kitsune_p2p_bootstrap_client" -version = "0.3.0-beta-dev.20" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17816778c98f5156475fa6a994b3e9a68fadb4183654984148bfac7bc16ca4b" dependencies = [ "ed25519-dalek", "kitsune_p2p_bin_data", @@ -6888,8 +7171,9 @@ dependencies = [ [[package]] name = "kitsune_p2p_dht" -version = "0.3.0-beta-dev.10" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4b6c6664798fd5f34a9ee0cf4c7af16565891ad8f94a193c1468f4d5829f941" dependencies = [ "arbitrary", "colored", @@ -6912,8 +7196,9 @@ dependencies = [ [[package]] name = "kitsune_p2p_dht_arc" -version = "0.3.0-beta-dev.9" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaba5f7fcb2c0b7faa3f859a3de5c4b893fbf9cfea51530549d11e9738fbfac" dependencies = [ "arbitrary", "derive_more", @@ -6929,13 +7214,15 @@ dependencies = [ [[package]] name = "kitsune_p2p_fetch" -version = "0.3.0-beta-dev.16" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c42d7a2d5c9f2d27ac88809f8e040d8856fb3e989abbb2dae981f32111a124c4" dependencies = [ + "backon", "derive_more", + "indexmap 2.2.2", "kitsune_p2p_timestamp", "kitsune_p2p_types", - "linked-hash-map", "serde", "tokio", "tracing", @@ -6943,10 +7230,11 @@ dependencies = [ [[package]] name = "kitsune_p2p_mdns" -version = "0.3.0-beta-dev.1" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "432a37bef5d393debb90db429fce674603f761817652da8dae41033006047915" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "err-derive 0.3.1", "futures-util", "libmdns", @@ -6957,10 +7245,11 @@ dependencies = [ [[package]] name = "kitsune_p2p_proxy" -version = "0.3.0-beta-dev.14" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48a0106013d08267ea6e2398deae4c30733befd68704cbf37a401ef1f706df4f" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "derive_more", "futures", "holochain_trace", @@ -6974,8 +7263,9 @@ dependencies = [ [[package]] name = "kitsune_p2p_timestamp" -version = "0.3.0-beta-dev.5" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4d587124090ca8e4ab28f3dd3d65aa35fcc72403b7dad4fc790751efd04fbe3" dependencies = [ "arbitrary", "chrono", @@ -6989,8 +7279,9 @@ dependencies = [ [[package]] name = "kitsune_p2p_transport_quic" -version = "0.3.0-beta-dev.14" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16bd847614dd15575f66a6a841f1aa3b9eac1750dcc21d881e33deccbb2e6f95" dependencies = [ "blake2b_simd 1.0.2", "futures", @@ -7004,15 +7295,16 @@ dependencies = [ [[package]] name = "kitsune_p2p_types" -version = "0.3.0-beta-dev.14" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c16710587d583bc82597b99c14aded83c317b8697e0e6a2333ba14012ce3830" dependencies = [ "arbitrary", - "base64 0.21.5", + "base64 0.21.7", "derive_more", "fixt", "futures", - "ghost_actor 0.3.0-alpha.6", + "ghost_actor", "holochain_trace", "kitsune_p2p_bin_data", "kitsune_p2p_dht", @@ -7025,7 +7317,7 @@ dependencies = [ "paste", "proptest", "proptest-derive", - "rmp-serde 0.15.5", + "rmp-serde", "rustls 0.20.9", "serde", "serde_bytes", @@ -7033,7 +7325,6 @@ dependencies = [ "sysinfo 0.29.11", "thiserror", "tokio", - "ureq", "url 2.4.1", "url2", ] @@ -7058,18 +7349,6 @@ dependencies = [ "libc", ] -[[package]] -name = "kuchiki" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ea8e9c6e031377cff82ee3001dc8026cdf431ed4e2e6b51f98ab8c73484a358" -dependencies = [ - "cssparser", - "html5ever 0.25.2", - "matches", - "selectors", -] - [[package]] name = "kuchikiki" version = "0.8.2" @@ -7077,7 +7356,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f29e4755b7b995046f510a7520c42b2fed58b77bd94d5a87a8eb43d2fd126da8" dependencies = [ "cssparser", - "html5ever 0.26.0", + "html5ever", "indexmap 1.9.3", "matches", "selectors", @@ -7094,9 +7373,9 @@ dependencies = [ [[package]] name = "lair_keystore" -version = "0.3.0" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843c7dbcbc8d75eef0b30397a7eb0d04549aabeff4ea69ebd272aea991555746" +checksum = "7397cd6d05160fe7041f8c0e7de6672b3345bd68326cd2dc06dfb701669f8bf3" dependencies = [ "lair_keystore_api", "pretty_assertions", @@ -7110,9 +7389,9 @@ dependencies = [ [[package]] name = "lair_keystore_api" -version = "0.3.0" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5829f25d0eab6309ae4307aa645f123a64e568a41ec17c358dcbd65dec207e10" +checksum = "4e485174546b1a95bbf801ce241e1039d182ec99c8ab4a5c0b90af0c8d8c651b" dependencies = [ "base64 0.13.1", "dunce", @@ -7124,10 +7403,9 @@ dependencies = [ "rcgen", "serde", "serde_json", - "serde_yaml 0.9.27", + "serde_yaml 0.9.31", "time", "tokio", - "toml 0.5.11", "toml 0.7.8", "tracing", "url 2.4.1", @@ -7152,10 +7430,10 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44bcd58e6c97a7fcbaffcdc95728b393b8d98933bfadad49ed4097845b57ef0b" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "regex", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -7222,9 +7500,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.150" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libdbus-sys" @@ -7242,16 +7520,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce826c243048e3d5cec441799724de52e2d42f820468431fc3fceee2341871e2" dependencies = [ "libc", - "libffi-sys 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "libffi" -version = "3.2.0" -source = "git+https://github.com/coasys/libffi-rs.git?branch=window-space-no-link#ed07c20dfc2a239e6e89f978c3b67c85577f35d4" -dependencies = [ - "libc", - "libffi-sys 2.3.0 (git+https://github.com/coasys/libffi-rs.git?branch=window-space-no-link)", + "libffi-sys", ] [[package]] @@ -7263,31 +7532,27 @@ dependencies = [ "cc", ] -[[package]] -name = "libffi-sys" -version = "2.3.0" -source = "git+https://github.com/coasys/libffi-rs.git?branch=window-space-no-link#ed07c20dfc2a239e6e89f978c3b67c85577f35d4" -dependencies = [ - "cc", -] - [[package]] name = "libflate" -version = "1.4.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ff4ae71b685bbad2f2f391fe74f6b7659a34871c08b210fdc039e43bee07d18" +checksum = "9f7d5654ae1795afc7ff76f4365c2c8791b0feb18e8996a96adad8ffd7c3b2bf" dependencies = [ "adler32", + "core2", "crc32fast", + "dary_heap", "libflate_lz77", ] [[package]] name = "libflate_lz77" -version = "1.2.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a52d3a8bfc85f250440e4424db7d857e241a3aebbbe301f3eb606ab15c39acbf" +checksum = "be5f52fb8c451576ec6b79d3f4deb327398bc05bbdbd99021a6e77a4c855d524" dependencies = [ + "core2", + "hashbrown 0.13.2", "rle-decode-fast", ] @@ -7343,7 +7608,7 @@ version = "0.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "libc", "redox_syscall 0.4.1", ] @@ -7398,9 +7663,9 @@ dependencies = [ [[package]] name = "libsodium-sys-stable" -version = "1.19.28" +version = "1.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c380d5be44ec310e371ff404e923e39464ca21ebef0a1468f4bfbbc92af547f5" +checksum = "d1d164bc6f9139c5f95efb4f0be931b2bd5a9edf7e4e3c945d26b95ab8fa669b" dependencies = [ "cc", "libc", @@ -7420,28 +7685,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afc22eff61b133b115c6e8c74e818c628d6d5e7a502afea6f64dee076dd94326" dependencies = [ "cc", + "openssl-sys", "pkg-config", "vcpkg", ] -[[package]] -name = "libz-ng-sys" -version = "1.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dd9f43e75536a46ee0f92b758f6b63846e594e86638c61a9251338a65baea63" -dependencies = [ - "cmake", - "libc", -] - [[package]] name = "libz-sys" -version = "1.1.12" +version = "1.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97137b25e321a73eef1418d1d5d2eda4d77e12813f8e6dead84bc52c5870a7b" +checksum = "037731f5d3aaa87a5675e895b63ddff1a87624bc29f77004ea829809654e48f6" dependencies = [ "cc", - "libc", "pkg-config", "vcpkg", ] @@ -7469,9 +7724,9 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "linux-raw-sys" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "localtunnel-client" @@ -7623,20 +7878,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" -[[package]] -name = "markup5ever" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a24f40fb03852d1cdd84330cddcaf98e9ec08a7b7768e952fad3b4cf048ec8fd" -dependencies = [ - "log", - "phf 0.8.0", - "phf_codegen 0.8.0", - "string_cache", - "string_cache_codegen", - "tendril", -] - [[package]] name = "markup5ever" version = "0.11.0" @@ -7657,8 +7898,8 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9521dd6750f8e80ee6c53d65e2e4656d7de37064f3a7a5d2d11d05df93839c2" dependencies = [ - "html5ever 0.26.0", - "markup5ever 0.11.0", + "html5ever", + "markup5ever", "tendril", "xml5ever", ] @@ -7746,9 +7987,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.6.4" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "memmap2" @@ -7792,15 +8033,6 @@ dependencies = [ "autocfg 1.1.0", ] -[[package]] -name = "memoffset" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" -dependencies = [ - "autocfg 1.1.0", -] - [[package]] name = "memoffset" version = "0.9.0" @@ -7863,9 +8095,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.9" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" dependencies = [ "libc", "log", @@ -7904,38 +8136,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22ce75669015c4f47b289fd4d4f56e894e4c96003ffdf3ac51313126f94c6cbb" dependencies = [ "cfg-if 1.0.0", - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 1.0.109", -] - -[[package]] -name = "modular-bitfield" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a53d79ba8304ac1c4f9eb3b9d281f21f7be9d4626f72ce7df4ad8fbde4f38a74" -dependencies = [ - "modular-bitfield-impl", - "static_assertions", -] - -[[package]] -name = "modular-bitfield-impl" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a7d5f7076603ebc68de2dc6a650ec331a062a13abaa346975be747bbfa4b789" -dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] -[[package]] -name = "monch" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4519a88847ba2d5ead3dc53f1060ec6a571de93f325d9c5c4968147382b1cbc3" - [[package]] name = "more-asserts" version = "0.2.2" @@ -7944,8 +8149,9 @@ checksum = "7843ec2de400bcbc6a6328c958dc38e5359da6e93e72e37bc5246bf1ae776389" [[package]] name = "mr_bundle" -version = "0.3.0-beta-dev.2" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b57f5a7ac4af14c37915b66cb01ac7a981d6bbfedab3af9cce740f2718a028c9" dependencies = [ "arbitrary", "bytes", @@ -7957,11 +8163,11 @@ dependencies = [ "proptest", "proptest-derive", "reqwest", - "rmp-serde 0.15.5", + "rmp-serde", "serde", "serde_bytes", "serde_derive", - "serde_yaml 0.9.27", + "serde_yaml 0.9.31", "test-strategy", "thiserror", ] @@ -8022,8 +8228,8 @@ checksum = "1d6d4752e6230d8ef7adf7bd5d8c4b1f6561c1014c5ba9a37445ccefe18aa1db" dependencies = [ "proc-macro-crate", "proc-macro-error", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", "synstructure", ] @@ -8071,8 +8277,8 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01fcc0b8149b4632adc89ac3b7b31a12fb6099a0317a4eb2ebff574ef7de7218" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] @@ -8173,17 +8379,29 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77a5d83df9f36fe23f0c3648c6bbb8b0298bb5f1939c8f2704431371f4b84d43" dependencies = [ - "smallvec 1.11.2", + "smallvec 1.13.1", +] + +[[package]] +name = "nix" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c" +dependencies = [ + "bitflags 1.3.2", + "cc", + "cfg-if 1.0.0", + "libc", + "memoffset 0.6.5", ] [[package]] name = "nix" -version = "0.23.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c" +checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" dependencies = [ "bitflags 1.3.2", - "cc", "cfg-if 1.0.0", "libc", "memoffset 0.6.5", @@ -8221,7 +8439,7 @@ version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "cfg-if 1.0.0", "libc", ] @@ -8250,6 +8468,16 @@ dependencies = [ "memchr", ] +[[package]] +name = "nom" +version = "5.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08959a387a676302eebf4ddbcbc611da04285579f76f88ee0506c63b1a61dd4b" +dependencies = [ + "memchr", + "version_check", +] + [[package]] name = "nom" version = "7.1.3" @@ -8285,7 +8513,7 @@ dependencies = [ "inotify", "kqueue", "libc", - "mio 0.8.9", + "mio 0.8.10", "walkdir", "winapi 0.3.9", ] @@ -8370,7 +8598,7 @@ dependencies = [ "num-traits", "rand 0.8.5", "serde", - "smallvec 1.11.2", + "smallvec 1.13.1", "zeroize", ] @@ -8390,7 +8618,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3" dependencies = [ "arrayvec 0.7.4", - "itoa 1.0.9", + "itoa 1.0.10", ] [[package]] @@ -8414,11 +8642,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-modular" -version = "0.5.2" -source = "git+https://github.com/coasys/num-modular.git#1ae06248ec69390370def3a229b3bf4c209aa6c7" - [[package]] name = "num-modular" version = "0.6.1" @@ -8431,7 +8654,7 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "537b596b97c40fcf8056d153049eb22f481c17ebce72a513ec9286e4986d1bb6" dependencies = [ - "num-modular 0.6.1", + "num-modular", ] [[package]] @@ -8462,7 +8685,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.3", + "hermit-abi 0.3.4", "libc", ] @@ -8482,8 +8705,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" dependencies = [ "proc-macro-crate", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] @@ -8528,9 +8751,9 @@ dependencies = [ [[package]] name = "object" -version = "0.32.1" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ "memchr", ] @@ -8546,9 +8769,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "one_err" @@ -8628,11 +8851,11 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.61" +version = "0.10.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b8419dc8cc6d866deb801274bba2e6f8f6108c1bb7fcc10ee5ab864931dbb45" +checksum = "15c9d69dd87a29568d4d017cfe8ec518706046a05184e5aea92d0af890b803c8" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "cfg-if 1.0.0", "foreign-types", "libc", @@ -8647,9 +8870,9 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", ] [[package]] @@ -8658,14 +8881,24 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +[[package]] +name = "openssl-src" +version = "300.2.2+3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bbfad0063610ac26ee79f7484739e2b07555a75c42453b89263830b5c8103bc" +dependencies = [ + "cc", +] + [[package]] name = "openssl-sys" -version = "0.9.97" +version = "0.9.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3eaad34cdd97d81de97964fc7f29e2d104f483840d906ef56daa1912338460b" +checksum = "22e1bf214306098e4832460f797824c05d25aacdf896f64a985fb0fd992454ae" dependencies = [ "cc", "libc", + "openssl-src", "pkg-config", "vcpkg", ] @@ -8714,12 +8947,12 @@ dependencies = [ [[package]] name = "os_pipe" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ae859aa07428ca9a929b936690f8b12dc5f11dd8c6992a18ca93919f28bc177" +checksum = "57119c3b893986491ec9aa85056780d3a0f3cf4da7cc09dd3650dbd6c6738fb9" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -8740,8 +8973,8 @@ checksum = "5f7d21ccd03305a674437ee1248f3ab5d4b1db095cf1caf49f1713ddf61956b7" dependencies = [ "Inflector", "proc-macro-error", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] @@ -8798,17 +9031,6 @@ dependencies = [ "sha2 0.10.8", ] -[[package]] -name = "p384" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc8c5bf642dde52bb9e87c0ecd8ca5a76faac2eeed98dedb7c717997e1080aa" -dependencies = [ - "ecdsa 0.14.8", - "elliptic-curve 0.12.3", - "sha2 0.10.8", -] - [[package]] name = "p384" version = "0.13.0" @@ -8925,7 +9147,7 @@ dependencies = [ "cloudabi", "libc", "redox_syscall 0.1.57", - "smallvec 1.11.2", + "smallvec 1.13.1", "winapi 0.3.9", ] @@ -8939,7 +9161,7 @@ dependencies = [ "instant", "libc", "redox_syscall 0.2.16", - "smallvec 1.11.2", + "smallvec 1.13.1", "winapi 0.3.9", ] @@ -8952,7 +9174,7 @@ dependencies = [ "cfg-if 1.0.0", "libc", "redox_syscall 0.4.1", - "smallvec 1.11.2", + "smallvec 1.13.1", "windows-targets 0.48.5", ] @@ -9020,9 +9242,9 @@ dependencies = [ [[package]] name = "pear" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a386cd715229d399604b50d1361683fe687066f42d56f54be995bc6868f71c" +checksum = "4ccca0f6c17acc81df8e242ed473ec144cbf5c98037e69aa6d144780aad103c8" dependencies = [ "inlinable_string", "pear_codegen", @@ -9031,14 +9253,14 @@ dependencies = [ [[package]] name = "pear_codegen" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9f0f13dac8069c139e8300a6510e3f4143ecf5259c60b116a9b271b4ca0d54" +checksum = "2e22670e8eb757cff11d6c199ca7b987f352f0346e0be4dd23869ec72cb53c77" dependencies = [ - "proc-macro2 1.0.70", + "proc-macro2 1.0.78", "proc-macro2-diagnostics", - "quote 1.0.33", - "syn 2.0.39", + "quote 1.0.35", + "syn 2.0.48", ] [[package]] @@ -9050,15 +9272,6 @@ dependencies = [ "base64 0.13.1", ] -[[package]] -name = "pem-rfc7468" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d159833a9105500e0398934e205e0773f0b27529557134ecfc51c27646adac" -dependencies = [ - "base64ct", -] - [[package]] name = "pem-rfc7468" version = "0.7.0" @@ -9082,9 +9295,9 @@ checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pest" -version = "2.7.5" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae9cee2a55a544be8b89dc6848072af97a20f2422603c10865be2a42b580fff5" +checksum = "1f200d8d83c44a45b21764d1916299752ca035d15ecd46faca3e9a2a2bf6ad06" dependencies = [ "memchr", "thiserror", @@ -9098,7 +9311,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap 2.1.0", + "indexmap 2.2.2", "quickcheck", ] @@ -9130,9 +9343,7 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" dependencies = [ - "phf_macros 0.10.0", "phf_shared 0.10.0", - "proc-macro-hack", ] [[package]] @@ -9214,8 +9425,8 @@ dependencies = [ "phf_generator 0.8.0", "phf_shared 0.8.0", "proc-macro-hack", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] @@ -9228,22 +9439,8 @@ dependencies = [ "phf_generator 0.9.1", "phf_shared 0.9.0", "proc-macro-hack", - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 1.0.109", -] - -[[package]] -name = "phf_macros" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" -dependencies = [ - "phf_generator 0.10.0", - "phf_shared 0.10.0", - "proc-macro-hack", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] @@ -9255,9 +9452,9 @@ checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" dependencies = [ "phf_generator 0.11.2", "phf_shared 0.11.2", - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", ] [[package]] @@ -9298,22 +9495,22 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +checksum = "0302c4a0442c456bd56f841aee5c3bfd17967563f6fadc9ceb9f9c23cf3807e0" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", ] [[package]] @@ -9341,14 +9538,13 @@ dependencies = [ [[package]] name = "pkcs1" -version = "0.4.1" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff33bdbdfc54cc98a2eca766ebdec3e1b8fb7387523d5c9c9a2891da856f719" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" dependencies = [ - "der 0.6.1", - "pkcs8 0.9.0", - "spki 0.6.0", - "zeroize", + "der 0.7.8", + "pkcs8 0.10.2", + "spki 0.7.3", ] [[package]] @@ -9373,15 +9569,15 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.27" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" [[package]] name = "platforms" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14e6ab3f592e6fb464fc9712d8d6e6912de6473954635fd76a589d832cffcbb0" +checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c" [[package]] name = "plist" @@ -9389,7 +9585,7 @@ version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a4a0cfc5fb21a09dc6af4bf834cf10d4a32fccd9e2ea468c4b1751a097487aa" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "indexmap 1.9.3", "line-wrap", "quick-xml 0.30.0", @@ -9403,16 +9599,16 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52a40bc70c2c58040d2d8b167ba9a5ff59fc9dab7ad44771cfde3dcfde7a09c6" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", ] [[package]] name = "png" -version = "0.17.10" +version = "0.17.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64" +checksum = "1f6c3c3e617595665b8ea2ff95a86066be38fb121ff920a9c0eb282abcd1da5a" dependencies = [ "bitflags 1.3.2", "crc32fast", @@ -9439,14 +9635,14 @@ dependencies = [ [[package]] name = "polling" -version = "3.3.1" +version = "3.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf63fa624ab313c11656b4cda960bfc46c410187ad493c41f6ba2d8c1e991c9e" +checksum = "545c980a3880efd47b2e262f6a4bb6daad6555cf3367aa9c4e52895f69537a41" dependencies = [ "cfg-if 1.0.0", "concurrent-queue", "pin-project-lite", - "rustix 0.38.26", + "rustix 0.38.30", "tracing", "windows-sys 0.52.0", ] @@ -9554,7 +9750,7 @@ version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" dependencies = [ - "proc-macro2 1.0.70", + "proc-macro2 1.0.78", "syn 1.0.109", ] @@ -9584,8 +9780,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", "version_check", ] @@ -9596,8 +9792,8 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "version_check", ] @@ -9607,6 +9803,29 @@ version = "0.5.20+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" +[[package]] +name = "proc-macro-rules" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07c277e4e643ef00c1233393c673f655e3672cf7eb3ba08a00bdd0ea59139b5f" +dependencies = [ + "proc-macro-rules-macros", + "proc-macro2 1.0.78", + "syn 2.0.48", +] + +[[package]] +name = "proc-macro-rules-macros" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "207fffb0fe655d1d47f6af98cc2793405e85929bdbc420d685554ff07be27ac7" +dependencies = [ + "once_cell", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", +] + [[package]] name = "proc-macro2" version = "0.4.30" @@ -9618,9 +9837,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.70" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] @@ -9631,9 +9850,9 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", "version_check", "yansi 1.0.0-rc.1", ] @@ -9661,7 +9880,7 @@ checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.4.1", + "bitflags 2.4.2", "lazy_static", "num-traits", "rand 0.8.5", @@ -9724,8 +9943,8 @@ checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" dependencies = [ "anyhow", "itertools 0.10.5", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] @@ -9768,8 +9987,8 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] @@ -9881,11 +10100,11 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.33" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ - "proc-macro2 1.0.70", + "proc-macro2 1.0.78", ] [[package]] @@ -10051,7 +10270,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.11", + "getrandom 0.2.12", ] [[package]] @@ -10167,9 +10386,9 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] name = "rayon" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" dependencies = [ "either", "rayon-core", @@ -10177,9 +10396,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -10237,29 +10456,29 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" dependencies = [ - "getrandom 0.2.11", + "getrandom 0.2.12", "libredox", "thiserror", ] [[package]] name = "ref-cast" -version = "1.0.20" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acde58d073e9c79da00f2b5b84eed919c8326832648a5b109b3fce1bb1175280" +checksum = "c4846d4c50d1721b1a3bef8af76924eef20d5e723647333798c1b519b3a9473f" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.20" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7473c2cfcf90008193dd0e3e16599455cb601a9fce322b5bb55de799664925" +checksum = "5fddb4f8d99b0a2ebafc65a87a69a7b9875e4b1ae1f00db265d300ef7f28bccc" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", ] [[package]] @@ -10277,18 +10496,18 @@ dependencies = [ "fxhash", "log", "slice-group-by", - "smallvec 1.11.2", + "smallvec 1.13.1", ] [[package]] name = "regex" -version = "1.10.2" +version = "1.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.3", + "regex-automata 0.4.5", "regex-syntax 0.8.2", ] @@ -10303,9 +10522,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" dependencies = [ "aho-corasick", "memchr", @@ -10366,20 +10585,20 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.22" +version = "0.11.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" +checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251" dependencies = [ "async-compression", - "base64 0.21.5", + "base64 0.21.7", "bytes", "encoding_rs", "futures-core", "futures-util", "h2", "http 0.2.11", - "http-body 0.4.5", - "hyper 0.14.27", + "http-body 0.4.6", + "hyper 0.14.28", "hyper-rustls", "hyper-tls", "ipnet", @@ -10390,11 +10609,12 @@ dependencies = [ "once_cell", "percent-encoding 2.3.0", "pin-project-lite", - "rustls 0.21.9", + "rustls 0.21.10", "rustls-pemfile 1.0.4", "serde", "serde_json", "serde_urlencoded", + "sync_wrapper", "system-configuration", "tokio", "tokio-native-tls", @@ -10497,7 +10717,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" dependencies = [ "cc", - "getrandom 0.2.11", + "getrandom 0.2.12", "libc", "spin 0.9.8", "untrusted 0.9.0", @@ -10526,12 +10746,13 @@ dependencies = [ [[package]] name = "rkyv" -version = "0.7.42" +version = "0.7.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0200c8230b013893c0b2d6213d6ec64ed2b9be2e0e016682b7224ff82cff5c58" +checksum = "527a97cdfef66f65998b5f3b637c26f5a5ec09cc52a3f9932313ac645f4190f5" dependencies = [ "bitvec", "bytecheck", + "bytes", "hashbrown 0.12.3", "indexmap 1.9.3", "ptr_meta", @@ -10539,17 +10760,17 @@ dependencies = [ "rkyv_derive", "seahash", "tinyvec", - "uuid 1.6.1", + "uuid 1.7.0", ] [[package]] name = "rkyv_derive" -version = "0.7.42" +version = "0.7.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2e06b915b5c230a17d7a736d1e2e63ee753c256a8614ef3f5147b13a4f5541d" +checksum = "b5c462a1328c8e67e4d6dbad1eb0355dd43e8ab432c6e227a43657f16ade5033" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] @@ -10581,17 +10802,6 @@ dependencies = [ "serde", ] -[[package]] -name = "rmp-serde" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bffea85eea980d8a74453e5d02a8d93028f3c34725de143085a844ebe953258a" -dependencies = [ - "byteorder", - "rmp", - "serde", -] - [[package]] name = "rmpv" version = "1.0.0" @@ -10618,7 +10828,7 @@ dependencies = [ "either", "figment", "futures", - "indexmap 2.1.0", + "indexmap 2.2.2", "log", "memchr", "multer", @@ -10649,11 +10859,11 @@ checksum = "a2238066abf75f21be6cd7dc1a09d5414a671f4246e384e49fe3f8a4936bd04c" dependencies = [ "devise", "glob", - "indexmap 2.1.0", - "proc-macro2 1.0.70", - "quote 1.0.33", + "indexmap 2.2.2", + "proc-macro2 1.0.78", + "quote 1.0.35", "rocket_http", - "syn 2.0.39", + "syn 2.0.48", "unicode-xid 0.2.4", "version_check", ] @@ -10668,8 +10878,8 @@ dependencies = [ "either", "futures", "http 0.2.11", - "hyper 0.14.27", - "indexmap 2.1.0", + "hyper 0.14.28", + "indexmap 2.2.2", "log", "memchr", "pear", @@ -10677,7 +10887,7 @@ dependencies = [ "pin-project-lite", "ref-cast", "serde", - "smallvec 1.11.2", + "smallvec 1.13.1", "stable-pattern", "state 0.6.0", "time", @@ -10717,21 +10927,20 @@ dependencies = [ [[package]] name = "rsa" -version = "0.7.2" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "094052d5470cbcef561cb848a7209968c9f12dfa6d668f4bca048ac5de51099c" +checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" dependencies = [ - "byteorder", + "const-oid", "digest 0.10.7", "num-bigint-dig", "num-integer", - "num-iter", "num-traits", "pkcs1", - "pkcs8 0.9.0", + "pkcs8 0.10.2", "rand_core 0.6.4", - "signature 1.6.4", - "smallvec 1.11.2", + "signature 2.2.0", + "spki 0.7.3", "subtle 2.4.1", "zeroize", ] @@ -10752,19 +10961,19 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "549b9d036d571d42e6e85d1c1425e2ac83491075078ca9a15be021c56b1641f2" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "fallible-iterator", "fallible-streaming-iterator", "hashlink", "libsqlite3-sys", - "smallvec 1.11.2", + "smallvec 1.13.1", ] [[package]] name = "rust-embed" -version = "8.0.0" +version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e7d90385b59f0a6bf3d3b757f3ca4ece2048265d70db20a2016043d4509a40" +checksum = "a82c0bbc10308ed323529fd3c1dce8badda635aa319a5ff0e6466f33b8101e3f" dependencies = [ "rust-embed-impl", "rust-embed-utils", @@ -10773,79 +10982,27 @@ dependencies = [ [[package]] name = "rust-embed-impl" -version = "8.0.0" +version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3d8c6fd84090ae348e63a84336b112b5c3918b3bf0493a581f7bd8ee623c29" +checksum = "6227c01b1783cdfee1bcf844eb44594cd16ec71c35305bf1c9fb5aade2735e16" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "rust-embed-utils", - "syn 2.0.39", + "syn 2.0.48", "walkdir", ] [[package]] name = "rust-embed-utils" -version = "8.0.0" +version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "873feff8cb7bf86fdf0a71bb21c95159f4e4a37dd7a4bd1855a940909b583ada" +checksum = "8cb0a25bfbb2d4b4402179c2cf030387d9990857ce08a32592c6238db9fa8665" dependencies = [ "sha2 0.10.8", "walkdir", ] -[[package]] -name = "rust-executor" -version = "0.8.1" -dependencies = [ - "ad4m-client", - "argon2", - "base64 0.21.5", - "chrono", - "cid", - "clap 4.4.11", - "crypto_box", - "deno_core", - "deno_runtime", - "did-key", - "dirs 5.0.1", - "env_logger", - "fs_extra", - "futures", - "hex", - "holochain", - "holochain_cli_bundle", - "holochain_cli_run_local_services", - "holochain_types", - "jsonwebtoken", - "juniper", - "juniper_graphql_transport_ws", - "juniper_subscriptions", - "juniper_warp", - "kitsune_p2p_types", - "lazy_static", - "log", - "maplit", - "multibase", - "multihash", - "once_cell", - "os_info", - "rand 0.8.5", - "rocket", - "rust-embed", - "scryer-prolog", - "secp256k1", - "semver 1.0.20", - "serde", - "serde_json", - "tokio", - "tokio-stream", - "url 2.4.1", - "uuid 1.6.1", - "warp", - "zip", -] - [[package]] name = "rustc-demangle" version = "0.1.23" @@ -10873,7 +11030,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.20", + "semver 1.0.21", ] [[package]] @@ -10901,14 +11058,14 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.26" +version = "0.38.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9470c4bf8246c8daf25f9598dca807fb6510347b1e1cfa55749113850c79d88a" +checksum = "322394588aaf33c24007e8bb3238ee3e4c5c09c084ab32bc73890b99ff326bca" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "errno 0.3.8", "libc", - "linux-raw-sys 0.4.12", + "linux-raw-sys 0.4.13", "windows-sys 0.52.0", ] @@ -10926,9 +11083,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.9" +version = "0.21.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "629648aced5775d558af50b2b4c7b02983a04b312126d45eeead26e7caa498b9" +checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" dependencies = [ "log", "ring 0.17.7", @@ -10963,7 +11120,18 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", +] + +[[package]] +name = "rustls-tokio-stream" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897937c68ff975d028e8cc07bc887f2d5a9ec2bc952549f40db9a91dc557974c" +dependencies = [ + "futures", + "rustls 0.21.10", + "tokio", ] [[package]] @@ -11033,7 +11201,7 @@ version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "994eca4bca05c87e86e15d90fc7a91d1be64b4482b38cb2d27474568fe7c9db9" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "cfg-if 1.0.0", "clipboard-win", "fd-lock", @@ -11052,9 +11220,15 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" + +[[package]] +name = "ryu-js" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "4950d85bc52415f8432144c97c4791bd0c4f7954de32a7270ee9cccd3c22b12b" [[package]] name = "safe_arch" @@ -11071,6 +11245,16 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" +[[package]] +name = "saffron" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03fb9a628596fc7590eb7edbf7b0613287be78df107f5f97b118aad59fb2eea9" +dependencies = [ + "chrono", + "nom 5.1.3", +] + [[package]] name = "salsa20" version = "0.10.2" @@ -11091,11 +11275,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -11119,10 +11303,32 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "scryer-modular-bitfield" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1f26c70c56d2c94a02545d86384b91994532c2be928c974784b603c2b1f76ac" +dependencies = [ + "scryer-modular-bitfield-impl", + "static_assertions", +] + +[[package]] +name = "scryer-modular-bitfield-impl" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212164841808ccfccf1b0471d91f8cfe675eeb60dbb96e4ca7a1f37b22570a29" +dependencies = [ + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 1.0.109", +] + [[package]] name = "scryer-prolog" -version = "0.9.1" -source = "git+https://github.com/coasys/scryer-prolog?rev=d4cb72fa00fcff21b763507a1b3ce415a3e43556#d4cb72fa00fcff21b763507a1b3ce415a3e43556" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2ae0d3cc44e736916c19ba2297954d4ec711ab1ec8c6c6edfefac76fa4e4b5d" dependencies = [ "base64 0.12.3", "bit-set", @@ -11130,6 +11336,7 @@ dependencies = [ "blake2 0.8.1", "bytes", "chrono", + "console_error_panic_hook", "cpu-time", "crossterm 0.20.0", "crrl", @@ -11140,44 +11347,50 @@ dependencies = [ "divrem", "futures", "fxhash", + "getrandom 0.2.12", "git-version", "hostname", - "http-body-util", - "hyper 1.0.0-rc.4", - "hyper-util", "indexmap 1.9.3", + "js-sys", "lazy_static", "lexical", "libc", - "libffi 3.2.0 (git+https://github.com/coasys/libffi-rs.git?branch=window-space-no-link)", + "libffi", "libloading 0.7.4", - "modular-bitfield", "native-tls", + "num-order", "ordered-float", "phf 0.9.0", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "rand 0.8.5", "ref_thread_local", "regex", "reqwest", - "ring 0.16.20", + "ring 0.17.7", "ripemd160", "roxmltree", "rustyline 12.0.0", "ryu", + "scryer-modular-bitfield", "select", + "serde", + "serde-wasm-bindgen 0.5.0", + "serde_json", "sha3 0.8.2", - "smallvec 1.11.2", - "sodiumoxide", + "smallvec 1.13.1", "static_assertions", "strum 0.23.0", "strum_macros 0.23.1", - "syn 2.0.39", + "syn 2.0.48", "to-syn-value", "to-syn-value_derive", "tokio", "walkdir", + "warp", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", ] [[package]] @@ -11292,7 +11505,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f9da09dc3f4dfdb6374cbffff7a2cffcec316874d4429899eefdc97b3b94dcd" dependencies = [ "bit-set", - "html5ever 0.26.0", + "html5ever", "markup5ever_rcdom", ] @@ -11312,15 +11525,15 @@ dependencies = [ "phf_codegen 0.8.0", "precomputed-hash", "servo_arc", - "smallvec 1.11.2", + "smallvec 1.13.1", "thin-slice", ] [[package]] name = "self_cell" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e388332cd64eb80cd595a00941baf513caffae8dce9cfd0467fc9c66397dade6" +checksum = "58bf37232d3bb9a2c4e641ca2a11d83b5062066f88df7fed36c28772046d65ba" [[package]] name = "semver" @@ -11342,9 +11555,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" +checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" dependencies = [ "serde", ] @@ -11366,9 +11579,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.193" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" dependencies = [ "serde_derive", ] @@ -11403,54 +11616,65 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "serde-wasm-bindgen" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3b143e2833c57ab9ad3ea280d21fd34e285a42837aeb0ee301f4f41890fa00e" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + [[package]] name = "serde_bytes" -version = "0.11.12" +version = "0.11.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab33ec92f677585af6d88c65593ae2375adde54efdbf16d597f2cbc7a6d368ff" +checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734" dependencies = [ "serde", ] [[package]] name = "serde_derive" -version = "1.0.193" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", ] [[package]] name = "serde_json" -version = "1.0.108" +version = "1.0.113" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" dependencies = [ - "indexmap 2.1.0", - "itoa 1.0.9", + "indexmap 2.2.2", + "itoa 1.0.10", "ryu", "serde", ] [[package]] name = "serde_repr" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3081f5ffbb02284dda55132aa26daecedd7372a42417bbbab6f14ab7d6bb9145" +checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", ] [[package]] name = "serde_spanned" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12022b835073e5b11e90a14f86838ceb1c8fb0325b72416845c487ac0fa95e80" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" dependencies = [ "serde", ] @@ -11462,23 +11686,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 1.0.9", + "itoa 1.0.10", "ryu", "serde", ] [[package]] name = "serde_v8" -version = "0.127.0" +version = "0.139.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb569e75e34db7e307901dbed94a3cb5dfb2b601a90f9cb1f2ede5f779f274ca" +checksum = "340328b061f990810dc28a444078da33da191003a031555dcd30c69314f03840" dependencies = [ "bytes", "derive_more", "num-bigint", "serde", - "serde_bytes", - "smallvec 1.11.2", + "smallvec 1.13.1", "thiserror", "v8", ] @@ -11495,18 +11718,18 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.4.0" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64cd236ccc1b7a29e7e2739f27c0b2dd199804abc4290e32f59f3b68d6405c23" +checksum = "1b0ed1662c5a68664f45b76d18deb0e234aff37207086803165c961eb695e981" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.1.0", + "indexmap 2.2.2", "serde", "serde_json", - "serde_with_macros 3.4.0", + "serde_with_macros 3.6.0", "time", ] @@ -11517,21 +11740,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" dependencies = [ "darling 0.13.4", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] [[package]] name = "serde_with_macros" -version = "3.4.0" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93634eb5f75a2323b16de4748022ac4297f9e76b6dced2be287a099f41b5e788" +checksum = "568577ff0ef47b879f736cd66740e022f3672788cdf002a05a4e609ea5a6fb15" dependencies = [ - "darling 0.20.3", - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "darling 0.20.5", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", ] [[package]] @@ -11548,12 +11771,12 @@ dependencies = [ [[package]] name = "serde_yaml" -version = "0.9.27" +version = "0.9.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cc7a1570e38322cfe4154732e5110f887ea57e22b76f4bfd32b5bdd3368666c" +checksum = "adf8a49373e98a4c5f0ceb5d05aa7c648d75f63774981ed95b7c7443bbd50c6e" dependencies = [ - "indexmap 2.1.0", - "itoa 1.0.9", + "indexmap 2.2.2", + "itoa 1.0.10", "ryu", "serde", "unsafe-libyaml", @@ -11576,8 +11799,8 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] @@ -11591,19 +11814,6 @@ dependencies = [ "stable_deref_trait", ] -[[package]] -name = "sha-1" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.9.0", - "opaque-debug 0.3.0", -] - [[package]] name = "sha-1" version = "0.10.0" @@ -11684,9 +11894,9 @@ dependencies = [ [[package]] name = "shared-buffer" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cf61602ee61e2f83dd016b3e6387245291cf728ea071c378b35088125b4d995" +checksum = "f6c99835bad52957e7aa241d3975ed17c1e5f8c92026377d117a606f36b84b16" dependencies = [ "bytes", "memmap2 0.6.2", @@ -11710,8 +11920,8 @@ checksum = "e63e6744142336dfb606fe2b068afa2e1cca1ee6a5d8377277a92945d81fa331" dependencies = [ "bitflags 1.3.2", "itertools 0.8.2", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] @@ -11733,7 +11943,7 @@ checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af" dependencies = [ "libc", "mio 0.7.14", - "mio 0.8.9", + "mio 0.8.10", "signal-hook", ] @@ -11844,9 +12054,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.2" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "smartstring" @@ -11876,25 +12086,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "sodiumoxide" -version = "0.2.7" -source = "git+https://github.com/fayeed/sodiumoxide#0adef01f4e0d5a8dd76bfb5534309259aa8e8ee7" -dependencies = [ - "ed25519", - "libc", - "libsodium-sys-stable", - "serde", + "windows-sys 0.48.0", ] [[package]] name = "sodoken" -version = "0.0.9" +version = "0.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebd7d30290221181652f7a08112f5e7871e3deffde718dfa621025aa0e9c290" +checksum = "308b58141d2ddac517b5e606e6f94d72e7a64c1383c9439c4acc712267f2be52" dependencies = [ "libc", "libsodium-sys-stable", @@ -12017,7 +12216,7 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce81b7bd7c4493975347ef60d8c7e8b742d4694f4c49f93e0a12ea263938176c" dependencies = [ - "itertools 0.12.0", + "itertools 0.12.1", "nom 7.1.3", "unicode_categories", ] @@ -12099,17 +12298,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9091b6114800a5f2141aee1d1b9d6ca3592ac062dc5decb3764ec5895a47b4eb" -[[package]] -name = "stream-cancel" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0a9eb2715209fb8cc0d942fcdff45674bfc9f0090a0d897e85a22955ad159b" -dependencies = [ - "futures-core", - "pin-project", - "tokio", -] - [[package]] name = "string_cache" version = "0.8.7" @@ -12132,8 +12320,8 @@ checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" dependencies = [ "phf_generator 0.10.0", "phf_shared 0.10.0", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", ] [[package]] @@ -12143,10 +12331,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fa4d4f81d7c05b9161f8de839975d3326328b8ba2831164b465524cc2f55252" dependencies = [ "pmutil", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "swc_macros_common", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -12173,10 +12361,10 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ad9e09554f0456d67a69c1584c9798ba733a5b50349a6c0d0948710523922d" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "structmeta-derive", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -12185,9 +12373,9 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a60bcaff7397072dca0017d1db428e30d5002e00b6847703e2e42005c95fbe00" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", ] [[package]] @@ -12209,8 +12397,8 @@ checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0" dependencies = [ "heck 0.3.3", "proc-macro-error", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] @@ -12242,8 +12430,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87c85aa3f8ea653bfd3ddf25f7ee357ee4d204731f6aa9ad04002306f6e2774c" dependencies = [ "heck 0.3.3", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] @@ -12254,8 +12442,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5bb0dc7ee9c15cea6199cde9a127fa16a4c5819af85395457ad72d68edc85a38" dependencies = [ "heck 0.3.3", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "rustversion", "syn 1.0.109", ] @@ -12267,8 +12455,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" dependencies = [ "heck 0.4.1", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "rustversion", "syn 1.0.109", ] @@ -12280,10 +12468,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" dependencies = [ "heck 0.4.1", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "rustversion", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -12319,23 +12507,21 @@ dependencies = [ [[package]] name = "swc_atoms" -version = "0.5.9" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f54563d7dcba626d4acfe14ed12def7ecc28e004debe3ecd2c3ee07cc47e449" +checksum = "b8a9e1b6d97f27b6abe5571f8fe3bdbd2fa987299fc2126450c7cde6214896ef" dependencies = [ + "hstr", "once_cell", "rustc-hash", "serde", - "string_cache", - "string_cache_codegen", - "triomphe", ] [[package]] name = "swc_common" -version = "0.32.0" +version = "0.33.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cb7fcd56655c8ae7dcf2344f0be6cbff4d9c7cb401fe3ec8e56e1de8dfe582" +checksum = "5ccb656cd57c93614e4e8b33a60e75ca095383565c1a8d2bbe6a1103942831e0" dependencies = [ "ast_node", "better_scoped_tls", @@ -12349,7 +12535,6 @@ dependencies = [ "serde", "siphasher 0.3.11", "sourcemap 6.4.1", - "string_cache", "swc_atoms", "swc_eq_ignore_macros", "swc_visit", @@ -12377,21 +12562,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5b5aaca9a0082be4515f0fbbecc191bf5829cd25b5b9c0a2810f6a2bb0d6829" dependencies = [ "pmutil", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "swc_macros_common", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] name = "swc_ecma_ast" -version = "0.109.0" +version = "0.110.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bc2286cedd688a68f214faa1c19bb5cceab7c9c54d0cbe3273e4c1704e38f69" +checksum = "2c3d416121da2d56bcbd1b1623725a68890af4552fef0c6d1e4bfa92776ccd6a" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "is-macro", "num-bigint", + "phf 0.11.2", "scoped-tls", "serde", "string_enum", @@ -12402,9 +12588,9 @@ dependencies = [ [[package]] name = "swc_ecma_codegen" -version = "0.144.1" +version = "0.146.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e62ba2c0ed1f119fc1a76542d007f1b2c12854d54dea15f5491363227debe11" +checksum = "7b7b37ef40385cc2e294ece3d42048dcda6392838724dd5f02ff8da3fa105271" dependencies = [ "memchr", "num-bigint", @@ -12426,17 +12612,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcdff076dccca6cc6a0e0b2a2c8acfb066014382bc6df98ec99e755484814384" dependencies = [ "pmutil", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "swc_macros_common", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] name = "swc_ecma_loader" -version = "0.44.2" +version = "0.45.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7d7c322462657ae27ac090a2c89f7e456c94416284a2f5ecf66c43a6a3c19d1" +checksum = "31cf7549feec3698d0110a0a71ae547f31ae272dc92db3285ce126d6dcbdadf3" dependencies = [ "anyhow", "pathdiff", @@ -12447,15 +12633,17 @@ dependencies = [ [[package]] name = "swc_ecma_parser" -version = "0.139.0" +version = "0.141.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eab46cb863bc5cd61535464e07e5b74d5f792fa26a27b9f6fd4c8daca9903b7" +checksum = "9590deff1b29aafbff8901b9d38d00211393f6b17b5cab878562db89a8966d88" dependencies = [ "either", + "new_debug_unreachable", "num-bigint", "num-traits", + "phf 0.11.2", "serde", - "smallvec 1.11.2", + "smallvec 1.13.1", "smartstring", "stacker", "swc_atoms", @@ -12467,18 +12655,18 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_base" -version = "0.132.2" +version = "0.134.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01ffd4a8149052bfc1ec1832fcbe04f317846ce635a49ec438df33b06db27d26" +checksum = "d74ca42a400257d8563624122813c1849c3d87e7abe3b9b2ed7514c76f64ad2f" dependencies = [ "better_scoped_tls", - "bitflags 2.4.1", + "bitflags 2.4.2", "indexmap 1.9.3", "once_cell", - "phf 0.10.1", + "phf 0.11.2", "rustc-hash", "serde", - "smallvec 1.11.2", + "smallvec 1.13.1", "swc_atoms", "swc_common", "swc_ecma_ast", @@ -12490,9 +12678,9 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_classes" -version = "0.121.2" +version = "0.123.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4b7fee0e2c6f12456d2aefb2418f2f26529b995945d493e1dce35a5a22584fc" +checksum = "7e68880cf7d65b93e0446b3ee079f33d94e0eddac922f75b736a6ea7669517c0" dependencies = [ "swc_atoms", "swc_common", @@ -12509,22 +12697,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8188eab297da773836ef5cf2af03ee5cca7a563e1be4b146f8141452c28cc690" dependencies = [ "pmutil", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "swc_macros_common", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] name = "swc_ecma_transforms_proposal" -version = "0.166.3" +version = "0.168.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "122fd9a69f464694edefbf9c59106b3c15e5cc8cb8575a97836e4fb79018e98f" +checksum = "c17e1f409e026be953fabb327923ebc5fdc7c664bcac036b76107834798640ed" dependencies = [ "either", "rustc-hash", "serde", - "smallvec 1.11.2", + "smallvec 1.13.1", "swc_atoms", "swc_common", "swc_ecma_ast", @@ -12537,16 +12725,16 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_react" -version = "0.178.3" +version = "0.180.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "675b5c755b0448268830e85e59429095d3423c0ce4a850b209c6f0eeab069f63" +checksum = "9fa7f368a80f28eeaa0f529cff6fb5d7578ef10a60be25bfd2582cb3f8ff5c9e" dependencies = [ "base64 0.13.1", "dashmap 5.5.3", "indexmap 1.9.3", "once_cell", "serde", - "sha-1 0.10.0", + "sha-1", "string_enum", "swc_atoms", "swc_common", @@ -12561,10 +12749,11 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_typescript" -version = "0.182.3" +version = "0.185.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eba97b1ea71739fcf278aedad4677a3cacb52288a3f3566191b70d16a889de6" +checksum = "daa2950c85abb4d555e092503ad2fa4f6dec0ee36a719273fb7a7bb29ead9ab6" dependencies = [ + "ryu-js", "serde", "swc_atoms", "swc_common", @@ -12577,9 +12766,9 @@ dependencies = [ [[package]] name = "swc_ecma_utils" -version = "0.122.0" +version = "0.124.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11006a3398ffd4693c4d3b0a1b1a5030edbdc04228159f5301120a6178144708" +checksum = "e4a4a0baf6cfa490666a9fe23a17490273f843d19ebc1d6ec89d64c3f8ccdb80" dependencies = [ "indexmap 1.9.3", "num_cpus", @@ -12595,9 +12784,9 @@ dependencies = [ [[package]] name = "swc_ecma_visit" -version = "0.95.0" +version = "0.96.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f628ec196e76e67892441e14eef2e423a738543d32bffdabfeec20c29582117" +checksum = "ba962f0becf83bab12a17365dface5a4f636c9e1743d479e292b96910a753743" dependencies = [ "num-bigint", "swc_atoms", @@ -12614,9 +12803,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05a95d367e228d52484c53336991fdcf47b6b553ef835d9159db4ba40efb0ee8" dependencies = [ "pmutil", - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", ] [[package]] @@ -12626,9 +12815,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a273205ccb09b51fabe88c49f3b34c5a4631c4c00a16ae20e03111d6a42e832" dependencies = [ "pmutil", - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", ] [[package]] @@ -12649,10 +12838,10 @@ checksum = "0f322730fb82f3930a450ac24de8c98523af7d34ab8cb2f46bcb405839891a99" dependencies = [ "Inflector", "pmutil", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "swc_macros_common", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -12672,30 +12861,36 @@ version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "unicode-ident", ] [[package]] name = "syn" -version = "2.0.39" +version = "2.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + [[package]] name = "synstructure" version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", "unicode-xid 0.2.4", ] @@ -12804,18 +12999,18 @@ version = "6.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a2d580ff6a20c55dfb86be5f9c238f67835d0e81cbdea8bf5680e0897320331" dependencies = [ - "cfg-expr 0.15.5", + "cfg-expr 0.15.6", "heck 0.4.1", "pkg-config", - "toml 0.8.8", + "toml 0.8.9", "version-compare 0.1.1", ] [[package]] name = "tao" -version = "0.16.5" +version = "0.16.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75f5aefd6be4cd3ad3f047442242fd9f57cbfb3e565379f66b5e14749364fa4f" +checksum = "d22205b267a679ca1c590b9f178488d50981fc3e48a1b91641ae31593db875ce" dependencies = [ "bitflags 1.3.2", "cairo-rs", @@ -12854,7 +13049,7 @@ dependencies = [ "serde", "tao-macros", "unicode-segmentation", - "uuid 1.6.1", + "uuid 1.7.0", "windows 0.39.0", "windows-implement", "x11-dl", @@ -12866,8 +13061,8 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec114582505d158b669b136e6851f85840c109819d77c42bb7c0709f727d18c2" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] @@ -12890,9 +13085,9 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.12.12" +version = "0.12.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c39fd04924ca3a864207c66fc2cd7d22d7c016007f9ce846cbb9326331930a" +checksum = "69758bda2e78f098e4ccb393021a0963bb3442eac05f135c30f61b7370bbafae" [[package]] name = "task-motel" @@ -12908,15 +13103,16 @@ dependencies = [ [[package]] name = "tauri" -version = "1.5.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32d563b672acde8d0cc4c1b1f5b855976923f67e8d6fe1eba51df0211e197be2" +checksum = "f078117725e36d55d29fafcbb4b1e909073807ca328ae8deb8c0b3843aac0fed" dependencies = [ "anyhow", - "base64 0.21.5", + "base64 0.21.7", "bytes", "cocoa", "dirs-next", + "dunce", "embed_plist", "encoding_rs", "flate2", @@ -12927,7 +13123,9 @@ dependencies = [ "heck 0.4.1", "http 0.2.11", "ignore", + "indexmap 1.9.3", "minisign-verify", + "nix 0.26.2", "notify-rust", "objc", "once_cell", @@ -12940,7 +13138,7 @@ dependencies = [ "regex", "reqwest", "rfd", - "semver 1.0.20", + "semver 1.0.21", "serde", "serde_json", "serde_repr", @@ -12958,7 +13156,7 @@ dependencies = [ "time", "tokio", "url 2.4.1", - "uuid 1.6.1", + "uuid 1.7.0", "webkit2gtk", "webview2-com", "windows 0.39.0", @@ -12967,16 +13165,16 @@ dependencies = [ [[package]] name = "tauri-build" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defbfc551bd38ab997e5f8e458f87396d2559d05ce32095076ad6c30f7fc5f9c" +checksum = "e9914a4715e0b75d9f387a285c7e26b5bbfeb1249ad9f842675a82481565c532" dependencies = [ "anyhow", "cargo_toml", "dirs-next", "heck 0.4.1", "json-patch 1.2.0", - "semver 1.0.20", + "semver 1.0.21", "serde", "serde_json", "tauri-utils", @@ -12986,39 +13184,39 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b3475e55acec0b4a50fb96435f19631fb58cbcd31923e1a213de5c382536bbb" +checksum = "a1554c5857f65dbc377cefb6b97c8ac77b1cb2a90d30d3448114d5d6b48a77fc" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "brotli", "ico", "json-patch 1.2.0", "plist", "png", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "regex", - "semver 1.0.20", + "semver 1.0.21", "serde", "serde_json", "sha2 0.10.8", "tauri-utils", "thiserror", "time", - "uuid 1.6.1", + "uuid 1.7.0", "walkdir", ] [[package]] name = "tauri-macros" -version = "1.4.2" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acea6445eececebd72ed7720cfcca46eee3b5bad8eb408be8f7ef2e3f7411500" +checksum = "277abf361a3a6993ec16bcbb179de0d6518009b851090a01adfea12ac89fa875" dependencies = [ "heck 0.4.1", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", "tauri-codegen", "tauri-utils", @@ -13038,9 +13236,9 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "0.14.1" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07f8e9e53e00e9f41212c115749e87d5cd2a9eebccafca77a19722eeecd56d43" +checksum = "cf2d0652aa2891ff3e9caa2401405257ea29ab8372cce01f186a5825f1bd0e76" dependencies = [ "gtk", "http 0.2.11", @@ -13052,17 +13250,18 @@ dependencies = [ "tauri-utils", "thiserror", "url 2.4.1", - "uuid 1.6.1", + "uuid 1.7.0", "webview2-com", "windows 0.39.0", ] [[package]] name = "tauri-runtime-wry" -version = "0.14.2" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "803a01101bc611ba03e13329951a1bde44287a54234189b9024b78619c1bc206" +checksum = "067c56fc153b3caf406d7cd6de4486c80d1d66c0f414f39e94cb2f5543f6445f" dependencies = [ + "arboard", "cocoa", "gtk", "percent-encoding 2.3.0", @@ -13070,7 +13269,7 @@ dependencies = [ "raw-window-handle", "tauri-runtime", "tauri-utils", - "uuid 1.6.1", + "uuid 1.7.0", "webkit2gtk", "webview2-com", "windows 0.39.0", @@ -13079,28 +13278,28 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "1.5.1" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a52165bb340e6f6a75f1f5eeeab1bb49f861c12abe3a176067d53642b5454986" +checksum = "75ad0bbb31fccd1f4c56275d0a5c3abdf1f59999f72cb4ef8b79b4ed42082a21" dependencies = [ "brotli", "ctor", "dunce", "glob", "heck 0.4.1", - "html5ever 0.26.0", + "html5ever", "infer", "json-patch 1.2.0", "kuchikiki", "log", "memchr", "phf 0.11.2", - "proc-macro2 1.0.70", - "quote 1.0.33", - "semver 1.0.20", + "proc-macro2 1.0.78", + "quote 1.0.35", + "semver 1.0.21", "serde", "serde_json", - "serde_with 3.4.0", + "serde_with 3.6.0", "thiserror", "url 2.4.1", "walkdir", @@ -13129,15 +13328,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.8.1" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" +checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" dependencies = [ "cfg-if 1.0.0", "fastrand 2.0.1", "redox_syscall 0.4.1", - "rustix 0.38.26", - "windows-sys 0.48.0", + "rustix 0.38.30", + "windows-sys 0.52.0", ] [[package]] @@ -13153,9 +13352,9 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] @@ -13166,7 +13365,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7" dependencies = [ - "rustix 0.38.26", + "rustix 0.38.30", "windows-sys 0.48.0", ] @@ -13195,8 +13394,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "58071dc2471840e9f374eeb0f6e405a31bccb3cc5d59bb4598f02cafc274b5c4" dependencies = [ "cargo_metadata", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "serde", "strum_macros 0.24.3", ] @@ -13210,8 +13409,8 @@ dependencies = [ "darling 0.14.4", "if_chain", "lazy_static", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "subprocess", "syn 1.0.109", "test-fuzz-internal", @@ -13229,7 +13428,7 @@ dependencies = [ "hex", "num-traits", "serde", - "sha-1 0.10.0", + "sha-1", "test-fuzz-internal", ] @@ -13239,10 +13438,10 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8361c808554228ad09bfed70f5c823caf8a3450b6881cc3a38eb57e8c08c1d9" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "structmeta", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -13271,22 +13470,22 @@ checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" [[package]] name = "thiserror" -version = "1.0.50" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.50" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", ] [[package]] @@ -13320,13 +13519,24 @@ dependencies = [ "once_cell", ] +[[package]] +name = "tiff" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +dependencies = [ + "flate2", + "jpeg-decoder", + "weezl", +] + [[package]] name = "time" version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59e399c068f43a5d116fedaf73b203fa4f9c519f17e2b34f63221d3792f81446" dependencies = [ - "itoa 1.0.9", + "itoa 1.0.10", "serde", "time-core", "time-macros", @@ -13377,7 +13587,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfcc684f2ceaec3b4e8689657c9e0944b07bf5e34563e0bd758c4d42c05c82ed" dependencies = [ - "syn 2.0.39", + "syn 2.0.48", "to-syn-value_derive", ] @@ -13387,21 +13597,21 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3dfffda778de8443144ff3b042ddf14e8bc5445f0fd9fe937c3d252535dc9212" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", ] [[package]] name = "tokio" -version = "1.34.0" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" dependencies = [ "backtrace", "bytes", "libc", - "mio 0.8.9", + "mio 0.8.10", "num_cpus", "parking_lot 0.12.1", "pin-project-lite", @@ -13417,9 +13627,9 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", ] [[package]] @@ -13461,7 +13671,7 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.21.9", + "rustls 0.21.10", "tokio", ] @@ -13489,21 +13699,6 @@ dependencies = [ "tokio-util", ] -[[package]] -name = "tokio-tungstenite" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1a5f475f1b9d077ea1017ecbc60890fda8e54942d680ca0b1d2b47cfa2d861b" -dependencies = [ - "futures-util", - "log", - "native-tls", - "pin-project", - "tokio", - "tokio-native-tls", - "tungstenite 0.12.0", -] - [[package]] name = "tokio-tungstenite" version = "0.18.0" @@ -13522,14 +13717,14 @@ dependencies = [ [[package]] name = "tokio-tungstenite" -version = "0.20.1" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" +checksum = "c83b561d025642014097b66e6c1bb422783339e0909e4429cde4749d1990bc38" dependencies = [ "futures-util", "log", "tokio", - "tungstenite 0.20.1", + "tungstenite 0.21.0", ] [[package]] @@ -13569,14 +13764,14 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" +checksum = "c6a4b9e8023eb94392d3dca65d717c53abc5dad49c07cb65bb8fcd87115fa325" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.21.0", + "toml_edit 0.21.1", ] [[package]] @@ -13594,7 +13789,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.2", "serde", "serde_spanned", "toml_datetime", @@ -13603,11 +13798,11 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.21.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.2", "serde", "serde_spanned", "toml_datetime", @@ -13627,28 +13822,6 @@ dependencies = [ "walkdir", ] -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-layer" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" - [[package]] name = "tower-service" version = "0.3.2" @@ -13673,9 +13846,9 @@ version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", ] [[package]] @@ -13744,7 +13917,7 @@ dependencies = [ "serde", "serde_json", "sharded-slab", - "smallvec 1.11.2", + "smallvec 1.13.1", "thread_local", "tracing", "tracing-core", @@ -13765,7 +13938,7 @@ dependencies = [ "serde", "serde_json", "sharded-slab", - "smallvec 1.11.2", + "smallvec 1.13.1", "thread_local", "time", "tracing", @@ -13774,6 +13947,20 @@ dependencies = [ "tracing-serde", ] +[[package]] +name = "tree_magic_mini" +version = "3.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ee137597cdb361b55a4746983e4ac1b35ab6024396a419944ad473bb915265" +dependencies = [ + "fnv", + "home", + "memchr", + "nom 7.1.3", + "once_cell", + "petgraph", +] + [[package]] name = "treediff" version = "3.0.2" @@ -13798,16 +13985,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683ba5022fe6dbd7133cad150478ccf51bdb6d861515181e5fc6b4323d4fa424" -[[package]] -name = "triomphe" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859eb650cfee7434994602c3a68b25d77ad9e68c8a6cd491616ef86661382eb3" -dependencies = [ - "serde", - "stable_deref_trait", -] - [[package]] name = "trust-dns-proto" version = "0.22.0" @@ -13826,7 +14003,7 @@ dependencies = [ "lazy_static", "rand 0.8.5", "serde", - "smallvec 1.11.2", + "smallvec 1.13.1", "thiserror", "tinyvec", "tokio", @@ -13848,7 +14025,7 @@ dependencies = [ "parking_lot 0.12.1", "resolv-conf", "serde", - "smallvec 1.11.2", + "smallvec 1.13.1", "thiserror", "tokio", "tracing", @@ -13857,29 +14034,9 @@ dependencies = [ [[package]] name = "try-lock" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" - -[[package]] -name = "tungstenite" -version = "0.12.0" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ada8297e8d70872fa9a551d93250a9f407beb9f37ef86494eb20012a2ff7c24" -dependencies = [ - "base64 0.13.1", - "byteorder", - "bytes", - "http 0.2.11", - "httparse", - "input_buffer", - "log", - "native-tls", - "rand 0.8.5", - "sha-1 0.9.8", - "url 2.4.1", - "utf-8", -] +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "tungstenite" @@ -13904,14 +14061,14 @@ dependencies = [ [[package]] name = "tungstenite" -version = "0.20.1" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" +checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1" dependencies = [ "byteorder", "bytes", "data-encoding", - "http 0.2.11", + "http 1.1.0", "httparse", "log", "rand 0.8.5", @@ -13923,10 +14080,11 @@ dependencies = [ [[package]] name = "tx5" -version = "0.0.5-alpha" +version = "0.0.7-alpha" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19f91696fd3614f0fca86fa4f42e4639472eaa6adfb7f5d0bb0b630f824f6591" +checksum = "56118fa9f9d16d66caf78f23faac825192ec5893974cd48684b500270e58a2a6" dependencies = [ + "bit_field", "bytes", "futures", "influxive-otel-atomic-obs", @@ -13947,27 +14105,28 @@ dependencies = [ [[package]] name = "tx5-core" -version = "0.0.5-alpha" +version = "0.0.7-alpha" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83d75f1bd2a341413a006ca67060b117ad2a88c16510cdcb8a95ac7f71fb2d49" +checksum = "23f97a8029d045801651d2c00c1214226d8b3e1eda8d7da2a3f6e33e7f706565" dependencies = [ + "app_dirs2", "base64 0.13.1", - "dirs 5.0.1", "once_cell", "rand 0.8.5", "serde", "serde_json", "sha2 0.10.8", "tempfile", + "tokio", "tracing", "url 2.4.1", ] [[package]] name = "tx5-go-pion" -version = "0.0.5-alpha" +version = "0.0.7-alpha" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1ace6ad58b7f2376f2cb15223c7191dae485fe9be96176c69823252e509b0ad" +checksum = "8893cfafc7ecb78df0d0c3f5c0302dcc3a83e9a2f43c9496be850165d074d3dc" dependencies = [ "futures", "parking_lot 0.12.1", @@ -13979,9 +14138,9 @@ dependencies = [ [[package]] name = "tx5-go-pion-sys" -version = "0.0.5-alpha" +version = "0.0.7-alpha" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf5d2ffe9dfcb9c458bd761927120df70ae7f00bc96c5c7515912947ac48dec9" +checksum = "c7094b90be32dbc232f39168dd7a6b31ba236525c7374e1016b711ccaf93e509" dependencies = [ "Inflector", "base64 0.13.1", @@ -13998,9 +14157,9 @@ dependencies = [ [[package]] name = "tx5-go-pion-turn" -version = "0.0.5-alpha" +version = "0.0.7-alpha" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "252173d1e028b0e4909d596bb174bceffcb47bcc4abb6deb072470230fd0830c" +checksum = "a1c6e8200815e00a2ee46bba6bd5090e561d94e3245ceb2c5ec7aa89501e19ae" dependencies = [ "base64 0.13.1", "dirs 5.0.1", @@ -14016,9 +14175,9 @@ dependencies = [ [[package]] name = "tx5-signal" -version = "0.0.5-alpha" +version = "0.0.7-alpha" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14bdea8228e5a9760d2a40ea15ce91432358d97866ba070d05a5896a6dffa762" +checksum = "6a8f5f50fb29c21f11a183b744953dbaa5812b5ce6cbfccf513d971b00bf86e3" dependencies = [ "futures", "lair_keystore_api", @@ -14045,11 +14204,11 @@ dependencies = [ [[package]] name = "tx5-signal-srv" -version = "0.0.5-alpha" +version = "0.0.7-alpha" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4db58c14ceb436a89e6db4f1f602e6e44198ad60bc0efd0d22c4a0348ffd09a" +checksum = "283dcaaa1f389612615fed7d1844d459862d771e2c31c2d3137a34ab584519b5" dependencies = [ - "clap 4.4.11", + "clap 4.4.18", "dirs 5.0.1", "futures", "if-addrs 0.10.2", @@ -14108,9 +14267,9 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "uncased" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b9bc53168a4be7402ab86c3aad243a84dd7381d09be0eddc81280c1da95ca68" +checksum = "e1b88fcfe09e89d3866a5c11019378088af2d24c3fbd4f0543f96b479ec90697" dependencies = [ "serde", "version_check", @@ -14168,9 +14327,9 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.13" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-id" @@ -14253,9 +14412,9 @@ dependencies = [ [[package]] name = "unsafe-libyaml" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28467d3e1d3c6586d8f25fa243f544f5800fec42d97032474e17222c2b75cfa" +checksum = "ab4c90930b95a82d00dc9e9ac071b4991924390d46cbd0dfe566148667605e4b" [[package]] name = "unsigned-varint" @@ -14287,25 +14446,24 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2e7e85a0596447f0f2ac090e16bc4c516c6fe91771fb0c0ccf7fa3dae896b9c" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] [[package]] name = "ureq" -version = "2.6.2" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "338b31dd1314f68f3aabf3ed57ab922df95ffcd902476ca7ba3c4ce7b908c46d" +checksum = "f8cdd25c339e200129fe4de81451814e5228c9b771d57378817d6117cc2b3f97" dependencies = [ - "base64 0.13.1", - "flate2", + "base64 0.21.7", "log", "once_cell", - "rustls 0.20.9", + "rustls 0.21.10", + "rustls-webpki 0.101.7", "url 2.4.1", - "webpki", - "webpki-roots 0.22.6", + "webpki-roots 0.25.3", ] [[package]] @@ -14398,24 +14556,24 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" dependencies = [ - "getrandom 0.2.11", + "getrandom 0.2.12", ] [[package]] name = "uuid" -version = "1.6.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" +checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" dependencies = [ - "getrandom 0.2.11", + "getrandom 0.2.12", "serde", ] [[package]] name = "v8" -version = "0.78.0" +version = "0.81.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6c96f70e8fc6c009af99d4e8ac4f5e84655a0fc3ec6e58147933b9c99f8b43c" +checksum = "b75f5f378b9b54aff3b10da8170d26af4cfd217f644cf671badcd13af5db4beb" dependencies = [ "bitflags 1.3.2", "fslock", @@ -14431,9 +14589,9 @@ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "value-bag" -version = "1.4.2" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a72e1902dde2bd6441347de2b70b7f5d59bf157c6c62f0c44572607a1d55bbe" +checksum = "126e423afe2dd9ac52142e7e9d5ce4135d7e13776c529d27fd6bc49f19e3280b" [[package]] name = "vcpkg" @@ -14514,8 +14672,8 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d257817081c7dffcdbab24b9e62d2def62e2ff7d00b1c20062551e6cccc145ff" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", ] [[package]] @@ -14554,16 +14712,16 @@ dependencies = [ [[package]] name = "warp" -version = "0.3.6" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e92e22e03ff1230c03a1a8ee37d2f89cd489e2e541b7550d6afad96faed169" +checksum = "ba431ef570df1287f7f8b07e376491ad54f84d26ac473489427231e1718e1f69" dependencies = [ "bytes", "futures-channel", "futures-util", "headers", "http 0.2.11", - "hyper 0.14.27", + "hyper 0.14.28", "log", "mime", "mime_guess", @@ -14576,8 +14734,9 @@ dependencies = [ "serde_json", "serde_urlencoded", "tokio", + "tokio-rustls 0.23.4", "tokio-stream", - "tokio-tungstenite 0.20.1", + "tokio-tungstenite 0.18.0", "tokio-util", "tower-service", "tracing", @@ -14597,9 +14756,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.89" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" +checksum = "b1223296a201415c7fad14792dbefaace9bd52b62d33453ade1c5b5f07555406" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -14607,47 +14766,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.89" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" +checksum = "fcdc935b63408d58a32f8cc9738a0bffd8f05cc7c002086c6ef20b7312ad9dcd" dependencies = [ "bumpalo", "log", "once_cell", - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-downcast" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" -dependencies = [ - "js-sys", - "once_cell", - "wasm-bindgen", - "wasm-bindgen-downcast-macros", -] - -[[package]] -name = "wasm-bindgen-downcast-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" -dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 1.0.109", -] - [[package]] name = "wasm-bindgen-futures" -version = "0.4.39" +version = "0.4.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" +checksum = "bde2032aeb86bdfaecc8b261eef3cba735cc426c1f3a3416d1e0791be95fc461" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -14657,47 +14793,47 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.89" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" +checksum = "3e4c238561b2d428924c49815533a8b9121c664599558a5d9ec51f8a1740a999" dependencies = [ - "quote 1.0.33", + "quote 1.0.35", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.89" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" +checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.89" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" +checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b" [[package]] name = "wasm-encoder" -version = "0.38.1" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad2b51884de9c7f4fe2fd1043fccb8dcad4b1e29558146ee57a144d15779f3f" +checksum = "1ba64e81215916eaeb48fee292f29401d69235d62d8b8fd92a7b2844ec5ae5f7" dependencies = [ "leb128", ] [[package]] name = "wasm-streams" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4609d447824375f43e1ffbc051b50ad8f4b3ae8219680c94452ea05eb240ac7" +checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" dependencies = [ "futures-util", "js-sys", @@ -14708,9 +14844,9 @@ dependencies = [ [[package]] name = "wasmer" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" +checksum = "ce45cc009177ca345a6d041f9062305ad467d15e7d41494f5b81ab46d62d7a58" dependencies = [ "bytes", "cfg-if 1.0.0", @@ -14720,12 +14856,11 @@ dependencies = [ "more-asserts", "rustc-demangle", "serde", - "serde-wasm-bindgen", + "serde-wasm-bindgen 0.4.5", "shared-buffer", "target-lexicon", "thiserror", "wasm-bindgen", - "wasm-bindgen-downcast", "wasmer-compiler", "wasmer-compiler-cranelift", "wasmer-derive", @@ -14737,9 +14872,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" +checksum = "e044f6140c844602b920deb4526aea3cc9c0d7cf23f00730bb9b2034669f522a" dependencies = [ "backtrace", "bytes", @@ -14754,7 +14889,7 @@ dependencies = [ "rkyv", "self_cell", "shared-buffer", - "smallvec 1.11.2", + "smallvec 1.13.1", "thiserror", "wasmer-types", "wasmer-vm", @@ -14764,9 +14899,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" +checksum = "32ce02358eb44a149d791c1d6648fb7f8b2f99cd55e3c4eef0474653ec8cc889" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -14774,7 +14909,7 @@ dependencies = [ "gimli 0.26.2", "more-asserts", "rayon", - "smallvec 1.11.2", + "smallvec 1.13.1", "target-lexicon", "tracing", "wasmer-compiler", @@ -14783,21 +14918,21 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" +checksum = "c782d80401edb08e1eba206733f7859db6c997fc5a7f5fb44edc3ecd801468f6" dependencies = [ "proc-macro-error", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] [[package]] name = "wasmer-middlewares" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb4b87c0ea9f8636c81a8ab8f52bad01c8623c9fcbb3db5f367d5f157fada30" +checksum = "66d4f27f76b7b5325476c8851f34920ae562ef0de3c830fdbc4feafff6782187" dependencies = [ "wasmer", "wasmer-types", @@ -14806,9 +14941,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" +checksum = "fd09e80d4d74bb9fd0ce6c3c106b1ceba1a050f9948db9d9b78ae53c172d6157" dependencies = [ "bytecheck", "enum-iterator", @@ -14822,9 +14957,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" +checksum = "bdcd8a4fd36414a7b6a003dbfbd32393bce3e155d715dd877c05c1b7a41d224d" dependencies = [ "backtrace", "cc", @@ -14839,7 +14974,7 @@ dependencies = [ "lazy_static", "libc", "mach", - "memoffset 0.8.0", + "memoffset 0.9.0", "more-asserts", "region", "scopeguard", @@ -14860,9 +14995,9 @@ dependencies = [ [[package]] name = "wast" -version = "69.0.1" +version = "64.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ee37317321afde358e4d7593745942c48d6d17e0e6e943704de9bbee121e7a" +checksum = "a259b226fd6910225aa7baeba82f9d9933b6d00f2ce1b49b80fa4214328237cc" dependencies = [ "leb128", "memchr", @@ -14872,18 +15007,77 @@ dependencies = [ [[package]] name = "wat" -version = "1.0.82" +version = "1.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aeb338ee8dee4d4cd05e6426683f21c5087dc7cfc8903e839ccf48d43332da3c" +checksum = "53253d920ab413fca1c7dc2161d601c79b4fdf631d0ba51dd4343bf9b556c3f6" dependencies = [ "wast", ] +[[package]] +name = "wayland-client" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f3b068c05a039c9f755f881dc50f01732214f5685e379829759088967c46715" +dependencies = [ + "bitflags 1.3.2", + "downcast-rs", + "libc", + "nix 0.24.3", + "wayland-commons", + "wayland-scanner", + "wayland-sys", +] + +[[package]] +name = "wayland-commons" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8691f134d584a33a6606d9d717b95c4fa20065605f798a3f350d78dced02a902" +dependencies = [ + "nix 0.24.3", + "once_cell", + "smallvec 1.13.1", + "wayland-sys", +] + +[[package]] +name = "wayland-protocols" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b950621f9354b322ee817a23474e479b34be96c2e909c14f7bc0100e9a970bc6" +dependencies = [ + "bitflags 1.3.2", + "wayland-client", + "wayland-commons", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f4303d8fa22ab852f789e75a967f0a2cdc430a607751c0499bada3e451cbd53" +dependencies = [ + "proc-macro2 1.0.78", + "quote 1.0.35", + "xml-rs", +] + +[[package]] +name = "wayland-sys" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be12ce1a3c39ec7dba25594b97b42cb3195d54953ddb9d3d95a7c3902bc6e9d4" +dependencies = [ + "pkg-config", +] + [[package]] name = "web-sys" -version = "0.3.66" +version = "0.3.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" +checksum = "58cd2333b6e0be7a39605f0e255892fd7418a682d8da8fe042fe25128794d2ed" dependencies = [ "js-sys", "wasm-bindgen", @@ -14963,15 +15157,6 @@ dependencies = [ "untrusted 0.7.1", ] -[[package]] -name = "webpki-roots" -version = "0.22.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" -dependencies = [ - "webpki", -] - [[package]] name = "webpki-roots" version = "0.23.1" @@ -15005,8 +15190,8 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eaebe196c01691db62e9e4ca52c5ef1e4fd837dcae27dae3ada599b5a8fd05ac" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.78", + "quote 1.0.35", "syn 1.0.109", ] @@ -15025,6 +15210,12 @@ dependencies = [ "windows-metadata", ] +[[package]] +name = "weezl" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" + [[package]] name = "which" version = "4.4.2" @@ -15034,7 +15225,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.26", + "rustix 0.38.30", ] [[package]] @@ -15049,9 +15240,9 @@ dependencies = [ [[package]] name = "wide" -version = "0.7.13" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c68938b57b33da363195412cfc5fc37c9ed49aa9cfe2156fde64b8d2c9498242" +checksum = "89beec544f246e679fc25490e3f8e08003bc4bf612068f325120dad4cea02c1c" dependencies = [ "bytemuck", "safe_arch", @@ -15094,6 +15285,15 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "winapi-wsapoll" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c17110f57155602a80dca10be03852116403c9ff3cd25b079d666f2aa3df6e" +dependencies = [ + "winapi 0.3.9", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -15557,9 +15757,9 @@ checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "winnow" -version = "0.5.25" +version = "0.5.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e87b8dfbe3baffbe687eef2e164e32286eff31a5ee16463ce03d991643ec94" +checksum = "818ce546a11a9986bc24f93d0cdf38a8a1a400f1473ea8c82e59f6e0ffab9249" dependencies = [ "memchr", ] @@ -15593,11 +15793,29 @@ dependencies = [ "toml 0.5.11", ] +[[package]] +name = "wl-clipboard-rs" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "981a303dfbb75d659f6612d05a14b2e363c103d24f676a2d44a00d18507a1ad9" +dependencies = [ + "derive-new", + "libc", + "log", + "nix 0.24.3", + "os_pipe", + "tempfile", + "thiserror", + "tree_magic_mini", + "wayland-client", + "wayland-protocols", +] + [[package]] name = "wry" -version = "0.24.6" +version = "0.24.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a70547e8f9d85da0f5af609143f7bde3ac7457a6e1073104d9b73d6c5ac744" +checksum = "6ad85d0e067359e409fcb88903c3eac817c392e5d638258abfb3da5ad8ba6fc4" dependencies = [ "base64 0.13.1", "block", @@ -15609,9 +15827,9 @@ dependencies = [ "gio", "glib", "gtk", - "html5ever 0.25.2", + "html5ever", "http 0.2.11", - "kuchiki", + "kuchikiki", "libc", "log", "objc", @@ -15661,6 +15879,28 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "x11rb" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "592b4883219f345e712b3209c62654ebda0bb50887f330cbd018d0f654bfd507" +dependencies = [ + "gethostname", + "nix 0.24.3", + "winapi 0.3.9", + "winapi-wsapoll", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56b245751c0ac9db0e006dc812031482784e434630205a93c73cfefcaabeac67" +dependencies = [ + "nix 0.24.3", +] + [[package]] name = "x25519-dalek" version = "1.1.1" @@ -15703,13 +15943,27 @@ dependencies = [ [[package]] name = "xattr" -version = "1.0.1" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4686009f71ff3e5c4dbcf1a282d0a44db3f021ba69350cd42086b3e5f1c6985" +checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" dependencies = [ "libc", + "linux-raw-sys 0.4.13", + "rustix 0.38.30", ] +[[package]] +name = "xdg" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213b7324336b53d2414b2db8537e56544d981803139155afa84f76eeebb7a546" + +[[package]] +name = "xml-rs" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a" + [[package]] name = "xml5ever" version = "0.17.0" @@ -15718,7 +15972,7 @@ checksum = "4034e1d05af98b51ad7214527730626f019682d797ba38b51689212118d8e650" dependencies = [ "log", "mac", - "markup5ever 0.11.0", + "markup5ever", ] [[package]] @@ -15775,22 +16029,22 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.29" +version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d075cf85bbb114e933343e087b92f2146bac0d55b534cbb8188becf0039948e" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.29" +version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86cd5ca076997b97ef09d3ad65efe811fa68c9e874cb636ccb211223a813b0c2" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", ] [[package]] @@ -15808,9 +16062,9 @@ version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.48", ] [[package]] @@ -15861,8 +16115,3 @@ dependencies = [ "cc", "pkg-config", ] - -[[patch.unused]] -name = "serde" -version = "1.0.183" -source = "git+https://github.com/fayeed/serde.git?branch=ad4m-compatible#a81bd97dcd5254e28104146d45b62b8f91f0e192" diff --git a/Cargo.toml b/Cargo.toml index 4057afee2..72a2ae131 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] - +resolver = "2" members = [ "cli", "rust-client", @@ -9,7 +9,4 @@ members = [ [patch.crates-io] -sodiumoxide = { git = "https://github.com/fayeed/sodiumoxide" } -serde = { git = "https://github.com/fayeed/serde.git", branch = "ad4m-compatible" } -notify-rust = { version = "4.6.0", git = "https://github.com/coasys/notify-rust.git" } -aead-gcm-stream = { version = "0.1.0", git = "https://github.com/coasys/aead-gcm-stream.git" } \ No newline at end of file +notify-rust = { version = "4.6.0", git = "https://github.com/coasys/notify-rust.git" } \ No newline at end of file diff --git a/ad4m-hooks/.gitignore b/ad4m-hooks/.gitignore new file mode 100644 index 000000000..d97220f46 --- /dev/null +++ b/ad4m-hooks/.gitignore @@ -0,0 +1,25 @@ +node_modules +dist +package-lock.json + +**/.vitepress/cache + +# Log files +*.log + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? +*.turbo +dev-dist +.DS_Store + +cachedb +# Local Netlify folder +.netlify +!register.js \ No newline at end of file diff --git a/ad4m-hooks/helpers/package.json b/ad4m-hooks/helpers/package.json new file mode 100644 index 000000000..19eac5c98 --- /dev/null +++ b/ad4m-hooks/helpers/package.json @@ -0,0 +1,22 @@ +{ + "name": "@coasys/hooks-helpers", + "version": "0.9.0", + "description": "", + "main": "./src/index.ts", + "module": "./src/index.ts", + "private": false, + "type": "module", + "files": [ + "dist", + "src" + ], + "scripts": {}, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@coasys/ad4m": "*", + "@coasys/ad4m-connect": "*", + "uuid": "*" + } +} diff --git a/ad4m-hooks/helpers/src/cache.ts b/ad4m-hooks/helpers/src/cache.ts new file mode 100644 index 000000000..241cfa136 --- /dev/null +++ b/ad4m-hooks/helpers/src/cache.ts @@ -0,0 +1,70 @@ +import { PerspectiveProxy } from "@coasys/ad4m"; + +const cache: Map = new Map(); +const subscribers: Map = new Map(); + +export function getCache(key: string) { + const match: T | undefined = cache.get(key); + return match; +} + +export function setCache(key: string, value: T) { + cache.set(key, value); + getSubscribers(key).forEach((cb) => cb()); +} + +export function subscribe(key: string, callback: Function) { + getSubscribers(key).push(callback); +} + +export function unsubscribe(key: string, callback: Function) { + const subs = getSubscribers(key); + const index = subs.indexOf(callback); + if (index >= 0) { + subs.splice(index, 1); + } +} + +export function getSubscribers(key: string) { + if (!subscribers.has(key)) subscribers.set(key, []); + return subscribers.get(key)!; +} + +export function subscribeToPerspective( + perspective: PerspectiveProxy, + added: Function, + removed: Function +) { + const addedKey = `perspective-${perspective.uuid}-added`; + const removedKey = `perspective-${perspective.uuid}-removed`; + + if (!subscribers.has(addedKey)) { + console.log("subscribing!"); + perspective.addListener("link-added", (link) => { + subscribers.get(addedKey).forEach((cb) => cb(link)); + return null; + }); + } + + if (!subscribers.has(removedKey)) { + perspective.addListener("link-removed", (link) => { + subscribers.get(removedKey).forEach((cb) => cb(link)); + return null; + }); + } + + subscribe(addedKey, added); + subscribe(removedKey, removed); +} + +export function unsubscribeFromPerspective( + perspective: PerspectiveProxy, + added: Function, + removed: Function +) { + const addedKey = `perspective-${perspective.uuid}-added`; + const removedKey = `perspective-${perspective.uuid}-removed`; + + unsubscribe(addedKey, added); + unsubscribe(removedKey, removed); +} diff --git a/ad4m-hooks/helpers/src/factory/SubjectRepository.ts b/ad4m-hooks/helpers/src/factory/SubjectRepository.ts new file mode 100644 index 000000000..b432ca9e7 --- /dev/null +++ b/ad4m-hooks/helpers/src/factory/SubjectRepository.ts @@ -0,0 +1,257 @@ +import { + PerspectiveProxy, + Link, + Subject, + Literal, + LinkQuery, +} from "@coasys/ad4m"; +import { setProperties } from "./model"; +import { v4 as uuidv4 } from "uuid"; + +export const SELF = "ad4m://self"; + +export type ModelProps = { + perspective: PerspectiveProxy; + source?: string; +}; + +export class SubjectRepository { + source = SELF; + subject: SubjectClass | string; + perspective: PerspectiveProxy; + tempSubject: any | string; + + constructor(subject: { new (): SubjectClass } | string, props: ModelProps) { + this.perspective = props.perspective; + this.source = props.source || this.source; + this.subject = typeof subject === "string" ? subject : new subject(); + this.tempSubject = subject; + } + + get className(): string { + return typeof this.subject === "string" + ? this.subject + : this.subject.className; + } + + async ensureSubject() { + if (typeof this.tempSubject === "string") return; + await this.perspective.ensureSDNASubjectClass(this.tempSubject); + } + + async create( + data: SubjectClass, + id?: string, + source?: string + ): Promise { + await this.ensureSubject(); + const base = id || Literal.from(uuidv4()).toUrl(); + + let newInstance = await this.perspective.createSubject(this.subject, base); + + if (!newInstance) { + throw "Failed to create new instance of " + this.subject; + } + + // Connect new instance to source + await this.perspective.add( + new Link({ + source: source || this.source, + predicate: "ad4m://has_child", + target: base, + }) + ); + + Object.keys(data).forEach((key) => + data[key] === undefined || data[key] === null ? delete data[key] : {} + ); + + setProperties(newInstance, data); + + // @ts-ignore + return this.getSubjectData(newInstance); + } + + async update(id: string, data: QueryPartialEntity) { + await this.ensureSubject(); + + const instance = await this.get(id); + + if (!instance) { + throw "Failed to find instance of " + this.subject + " with id " + id; + } + + Object.keys(data).forEach((key) => + data[key] === undefined ? delete data[key] : {} + ); + + // @ts-ignore + setProperties(instance, data); + + return this.getSubjectData(instance); + } + + async remove(id: string) { + if (this.perspective) { + const linksTo = await this.perspective.get(new LinkQuery({ target: id })); + const linksFrom = await this.perspective.get( + new LinkQuery({ source: id }) + ); + this.perspective.removeLinks([...linksFrom, ...linksTo]); + } + } + + async get(id: string): Promise { + await this.ensureSubject(); + if (id) { + const subjectProxy = await this.perspective.getSubjectProxy( + id, + this.subject + ); + + // @ts-ignore + return subjectProxy || null; + } else { + const all = await this.getAll(); + return all[0] || null; + } + } + + async getData(id: string): Promise { + await this.ensureSubject(); + const entry = await this.get(id); + if (entry) { + // @ts-ignore + return await this.getSubjectData(entry); + } + + return null; + } + + private async getSubjectData(entry: any) { + let links = await this.perspective.get( + new LinkQuery({ source: entry.baseExpression }) + ); + + const getters = Object.entries(Object.getOwnPropertyDescriptors(entry)) + .filter(([key, descriptor]) => typeof descriptor.get === "function") + .map(([key]) => key); + + const promises = getters.map((getter) => entry[getter]); + return Promise.all(promises).then((values) => { + return getters.reduce((acc, getter, index) => { + let value = values[index]; + if (this.tempSubject.prototype?.__properties[getter]?.transform) { + value = + this.tempSubject.prototype.__properties[getter].transform(value); + } + + return { + ...acc, + id: entry.baseExpression, + timestamp: links[0].timestamp, + author: links[0].author, + [getter]: value, + }; + }, {}); + }); + } + + async getAll(source?: string, query?: QueryOptions): Promise { + await this.ensureSubject(); + + const tempSource = source || this.source; + + let res = []; + + if (query) { + try { + const queryResponse = ( + await this.perspective.infer( + `findall([Timestamp, Base], (subject_class("${this.className}", C), instance(C, Base), link("${tempSource}", Predicate, Base, Timestamp, Author)), AllData), length(AllData, DataLength), sort(AllData, SortedData).` + ) + )[0]; + + if (queryResponse.SortedData >= query.size) { + const isOutofBound = + query.size * query.page > queryResponse.DataLength; + + const newPageSize = isOutofBound + ? queryResponse.DataLength - query.size * (query.page - 1) + : query.size; + + const mainQuery = `findall([Timestamp, Base], (subject_class("${this.className}", C), instance(C, Base), link("${tempSource}", Predicate, Base, Timestamp, Author)), AllData), sort(AllData, SortedData), reverse(SortedData, ReverseSortedData), paginate(ReverseSortedData, ${query.page}, ${newPageSize}, PageData).`; + res = await this.perspective.infer(mainQuery); + + res = res[0].PageData.map((r) => ({ + Base: r[1], + Timestamp: r[0], + })); + } else { + res = await this.perspective.infer( + `subject_class("${this.className}", C), instance(C, Base), triple("${tempSource}", Predicate, Base).` + ); + } + } catch (e) { + console.log("Query failed", e); + } + } else { + res = await this.perspective.infer( + `subject_class("${this.className}", C), instance(C, Base), triple("${tempSource}", Predicate, Base).` + ); + } + + const results = + res && + res.filter( + (obj, index, self) => + index === self.findIndex((t) => t.Base === obj.Base) + ); + + if (!res) return []; + + const data = await Promise.all( + results.map(async (result) => { + let subject = new Subject( + this.perspective!, + result.Base, + this.className + ); + + await subject.init(); + + return subject; + }) + ); + + // @ts-ignore + return data; + } + + async getAllData( + source?: string, + query?: QueryOptions + ): Promise { + await this.ensureSubject(); + + const subjects = await this.getAll(source, query); + + const entries = await Promise.all( + subjects.map((e) => this.getSubjectData(e)) + ); + + // @ts-ignore + return entries; + } +} + +export type QueryPartialEntity = { + [P in keyof T]?: T[P] | (() => string); +}; + +export type QueryOptions = { + page: number; + size: number; + infinite: boolean; + uniqueKey: string; +}; diff --git a/ad4m-hooks/helpers/src/factory/index.ts b/ad4m-hooks/helpers/src/factory/index.ts new file mode 100644 index 000000000..3f58419a0 --- /dev/null +++ b/ad4m-hooks/helpers/src/factory/index.ts @@ -0,0 +1 @@ +export * from "./SubjectRepository"; diff --git a/ad4m-hooks/helpers/src/factory/model.ts b/ad4m-hooks/helpers/src/factory/model.ts new file mode 100644 index 000000000..2bae2833d --- /dev/null +++ b/ad4m-hooks/helpers/src/factory/model.ts @@ -0,0 +1,57 @@ +type Target = String; + +export type PropertyValueMap = { + [property: string]: Target | Target[]; +}; + +export function capitalize(str: string) { + return str.charAt(0).toUpperCase() + str.slice(1); +} + +// e.g. "name" -> "setName" +export function propertyNameToSetterName(property: string): string { + return `set${capitalize(property)}`; +} + +export function pluralToSingular(plural: string): string { + if (plural.endsWith("ies")) { + return plural.slice(0, -3) + "y"; + } else if (plural.endsWith("s")) { + return plural.slice(0, -1); + } else { + return plural; + } +} + +// e.g. "comments" -> "addComment" +export function collectionToAdderName(collection: string): string { + return `add${capitalize(collection)}`; +} + +export function collectionToSetterName(collection: string): string { + return `setCollection${capitalize(collection)}`; +} + +export function setProperties(subject: any, properties: PropertyValueMap) { + Object.keys(properties).forEach((key) => { + if (Array.isArray(properties[key])) { + // it's a collection + const adderName = collectionToAdderName(key); + const adderFunction = subject[adderName]; + if (adderFunction) { + adderFunction(properties[key]); + } else { + throw "No adder function found for collection: " + key; + } + } else { + // it's a property + const setterName = propertyNameToSetterName(key); + const setterFunction = subject[setterName]; + if (setterFunction) { + setterFunction(properties[key]); + } else { + throw "No setter function found for property: " + key; + } + } + }); +} diff --git a/ad4m-hooks/helpers/src/getProfile.ts b/ad4m-hooks/helpers/src/getProfile.ts new file mode 100644 index 000000000..c58a2f262 --- /dev/null +++ b/ad4m-hooks/helpers/src/getProfile.ts @@ -0,0 +1,26 @@ +import { Ad4mClient } from "@coasys/ad4m"; +// @ts-ignore +import { getAd4mClient } from "@coasys/ad4m-connect/utils"; +import { LinkExpression } from "@coasys/ad4m"; + +export interface Payload { + url: string; + perspectiveUuid: string; +} + +export async function getProfile(did: string, formatter?: (links: LinkExpression[]) => T): Promise { + const cleanedDid = did.replace("did://", ""); + const client: Ad4mClient = await getAd4mClient(); + + const agentPerspective = await client.agent.byDID(cleanedDid); + + if (agentPerspective) { + const links = agentPerspective!.perspective!.links; + + if (formatter) { + return formatter(links); + } + + return agentPerspective + } +} diff --git a/ad4m-hooks/helpers/src/index.ts b/ad4m-hooks/helpers/src/index.ts new file mode 100644 index 000000000..b832fa981 --- /dev/null +++ b/ad4m-hooks/helpers/src/index.ts @@ -0,0 +1,3 @@ +export * from './cache' +export * from './getProfile' +export * from './factory' \ No newline at end of file diff --git a/ad4m-hooks/react/package.json b/ad4m-hooks/react/package.json new file mode 100644 index 000000000..a8d521987 --- /dev/null +++ b/ad4m-hooks/react/package.json @@ -0,0 +1,28 @@ +{ + "name": "@coasys/ad4m-react-hooks", + "version": "0.9.0", + "description": "", + "main": "./src/index.ts", + "module": "./src/index.ts", + "type": "module", + "private": false, + "files": [ + "dist", + "src" + ], + "scripts": {}, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@coasys/ad4m": "*", + "@coasys/ad4m-connect": "*", + "@coasys/hooks-helpers": "*", + "@types/react": "^18.2.55", + "@types/react-dom": "^18.2.19" + }, + "peerDependencies": { + "preact": "*", + "react": "*" + } +} diff --git a/ad4m-hooks/react/src/index.ts b/ad4m-hooks/react/src/index.ts new file mode 100644 index 000000000..312134c23 --- /dev/null +++ b/ad4m-hooks/react/src/index.ts @@ -0,0 +1,19 @@ +import { useSubjects } from "./useSubjects"; +import { useSubject } from "./useSubject"; +import { useAgent } from "./useAgent"; +import { useMe } from "./useMe"; +import { useClient } from "./useClient"; +import { toCustomElement } from "./register.js"; +import { usePerspective } from "./usePerspective.js"; +import { usePerspectives } from "./usePerspectives.js"; + +export { + toCustomElement, + useSubjects, + useSubject, + useAgent, + useMe, + useClient, + usePerspective, + usePerspectives, +}; diff --git a/ad4m-hooks/react/src/register.js b/ad4m-hooks/react/src/register.js new file mode 100644 index 000000000..0f6a1022d --- /dev/null +++ b/ad4m-hooks/react/src/register.js @@ -0,0 +1,177 @@ +import { createElement as h, cloneElement, render, hydrate } from "preact"; + +export function toCustomElement(Component, propNames, options) { + function PreactElement() { + const inst = Reflect.construct(HTMLElement, [], PreactElement); + inst._vdomComponent = Component; + inst._root = + options && options.shadow ? inst.attachShadow({ mode: "open" }) : inst; + return inst; + } + PreactElement.prototype = Object.create(HTMLElement.prototype); + PreactElement.prototype.constructor = PreactElement; + PreactElement.prototype.connectedCallback = connectedCallback; + PreactElement.prototype.attributeChangedCallback = attributeChangedCallback; + PreactElement.prototype.disconnectedCallback = disconnectedCallback; + + propNames = + propNames || + Component.observedAttributes || + Object.keys(Component.propTypes || {}); + PreactElement.observedAttributes = propNames; + + // Keep DOM properties and Preact props in sync + propNames.forEach((name) => { + Object.defineProperty(PreactElement.prototype, name, { + get() { + return this._vdom.props[name]; + }, + set(v) { + if (this._vdom) { + if (!this._props) this._props = {}; + this._props[name] = v; + this.attributeChangedCallback(name, null, v); + } else { + if (!this._props) this._props = {}; + this._props[name] = v; + this.connectedCallback(); + } + + // Reflect property changes to attributes if the value is a primitive + const type = typeof v; + if ( + v == null || + type === "string" || + type === "boolean" || + type === "number" + ) { + this.setAttribute(name, v); + } + }, + }); + }); + + return PreactElement; +} + +export default function register(Component, tagName, propNames, options) { + const PreactElement = toCustomElement(Component, propNames, options); + + return customElements.define( + tagName || Component.tagName || Component.displayName || Component.name, + PreactElement + ); +} + +register.toCustomElement = toCustomElement; + +function ContextProvider(props) { + this.getChildContext = () => props.context; + // eslint-disable-next-line no-unused-vars + const { context, children, ...rest } = props; + return cloneElement(children, rest); +} + +function connectedCallback() { + // Obtain a reference to the previous context by pinging the nearest + // higher up node that was rendered with Preact. If one Preact component + // higher up receives our ping, it will set the `detail` property of + // our custom event. This works because events are dispatched + // synchronously. + const event = new CustomEvent("_preact", { + detail: {}, + bubbles: true, + cancelable: true, + }); + this.dispatchEvent(event); + const context = event.detail.context; + + this._vdom = h( + ContextProvider, + { ...this._props, context }, + toVdom(this, this._vdomComponent) + ); + (this.hasAttribute("hydrate") ? hydrate : render)(this._vdom, this._root); +} + +function toCamelCase(str) { + return str.replace(/-(\w)/g, (_, c) => (c ? c.toUpperCase() : "")); +} + +function attributeChangedCallback(name, oldValue, newValue) { + if (!this._vdom) return; + // Attributes use `null` as an empty value whereas `undefined` is more + // common in pure JS components, especially with default parameters. + // When calling `node.removeAttribute()` we'll receive `null` as the new + // value. See issue #50. + newValue = newValue == null ? undefined : newValue; + const props = {}; + props[name] = newValue; + props[toCamelCase(name)] = newValue; + this._vdom = cloneElement(this._vdom, props); + render(this._vdom, this._root); +} + +function disconnectedCallback() { + render((this._vdom = null), this._root); +} + +/** + * Pass an event listener to each `` that "forwards" the current + * context value to the rendered child. The child will trigger a custom + * event, where will add the context value to. Because events work + * synchronously, the child can immediately pull of the value right + * after having fired the event. + */ +function Slot(props, context) { + const ref = (r) => { + if (!r) { + this.ref.removeEventListener("_preact", this._listener); + } else { + this.ref = r; + if (!this._listener) { + this._listener = (event) => { + event.stopPropagation(); + event.detail.context = context; + }; + r.addEventListener("_preact", this._listener); + } + } + }; + return h("slot", { ...props, ref }); +} + +function toVdom(element, nodeName) { + if (element.nodeType === 3) return element.data; + if (element.nodeType !== 1) return null; + let children = [], + props = {}, + i = 0, + a = element.attributes, + cn = element.childNodes; + for (i = a.length; i--; ) { + if (a[i].name !== "slot") { + props[a[i].name] = a[i].value; + props[toCamelCase(a[i].name)] = a[i].value; + } + } + + for (i = cn.length; i--; ) { + const vnode = toVdom(cn[i], null); + // Move slots correctly + const name = cn[i].slot; + if (name) { + props[name] = h(Slot, { name }, vnode); + } else { + children[i] = vnode; + } + } + + // Only wrap the topmost node with a slot + const wrappedChildren = nodeName ? h(Slot, null, children) : children; + return h( + nodeName || element.nodeName.toLowerCase(), + { ...props, element }, + wrappedChildren + ); +} diff --git a/ad4m-hooks/react/src/useAgent.tsx b/ad4m-hooks/react/src/useAgent.tsx new file mode 100644 index 000000000..ebba4e42a --- /dev/null +++ b/ad4m-hooks/react/src/useAgent.tsx @@ -0,0 +1,61 @@ +import { useState, useCallback, useEffect } from "react"; +import { getCache, setCache, subscribe, unsubscribe, getProfile } from "@coasys/hooks-helpers"; +import { AgentClient, LinkExpression } from "@coasys/ad4m"; +import { Agent } from '@coasys/ad4m' + +type Props = { + client: AgentClient; + did: string | (() => string); + formatter: (links: LinkExpression[]) => T; +}; + +export function useAgent(props: Props) { + const forceUpdate = useForceUpdate(); + const [error, setError] = useState(undefined); + const [profile, setProfile] = useState(null); + const didRef = typeof props.did === "function" ? props.did() : props.did; + + // Create cache key for entry + const cacheKey = `agents/${didRef}`; + + // Mutate shared/cached data for all subscribers + const mutate = useCallback( + (agent: Agent | null) => setCache(cacheKey, agent), + [cacheKey] + ); + + // Fetch data from AD4M and save to cache + const getData = useCallback(() => { + if (didRef) { + if (props.formatter) { + getProfile(didRef).then(profile => setProfile(props.formatter(profile.perspective.links))) + } + + props.client + .byDID(didRef) + .then(async (agent) => { + setError(undefined); + mutate(agent); + }) + .catch((error) => setError(error.toString())); + } + }, [cacheKey]); + + // Trigger initial fetch + useEffect(getData, [getData]); + + // Subscribe to changes (re-render on data change) + useEffect(() => { + subscribe(cacheKey, forceUpdate); + return () => unsubscribe(cacheKey, forceUpdate); + }, [cacheKey, forceUpdate]); + + const agent = getCache(cacheKey); + + return { agent, profile, error, mutate, reload: getData }; +} + +function useForceUpdate() { + const [, setState] = useState([]); + return useCallback(() => setState([]), [setState]); +} diff --git a/ad4m-hooks/react/src/useClient.tsx b/ad4m-hooks/react/src/useClient.tsx new file mode 100644 index 000000000..a73e74e7b --- /dev/null +++ b/ad4m-hooks/react/src/useClient.tsx @@ -0,0 +1,53 @@ +import { useState, useCallback, useEffect } from "react"; +import { getCache, setCache, subscribe, unsubscribe } from "@coasys/hooks-helpers"; +// @ts-ignore +import { getAd4mClient } from "@coasys/ad4m-connect/utils"; +import { Ad4mClient } from "@coasys/ad4m"; + +export function useClient() { + const forceUpdate = useForceUpdate(); + const [error, setError] = useState(undefined); + + // Create cache key for entry + const cacheKey = `client`; + + // Mutate shared/cached data for all subscribers + const mutate = useCallback( + (client: Ad4mClient | undefined) => setCache(cacheKey, client), + [cacheKey] + ); + + // Fetch data from AD4M and save to cache + const getData = useCallback(() => { + console.log("🪝 useClient - running getAd4mClient"); + getAd4mClient() + .then((client) => { + setError(undefined); + mutate(client); + }) + .catch((error) => setError(error.toString())); + }, [mutate]); + + // Trigger initial fetch + useEffect(getData, [getData]); + + // Subscribe to changes (re-render on data change) + useEffect(() => { + subscribe(cacheKey, forceUpdate); + return () => unsubscribe(cacheKey, forceUpdate); + }, [cacheKey, forceUpdate]); + + const client = getCache(cacheKey); + + return { + client, + error, + mutate, + reload: getData, + }; +} + +function useForceUpdate() { + const [, setState] = useState([]); + return useCallback(() => setState([]), [setState]); +} diff --git a/ad4m-hooks/react/src/useEntries.tsx b/ad4m-hooks/react/src/useEntries.tsx new file mode 100644 index 000000000..96ce3b910 --- /dev/null +++ b/ad4m-hooks/react/src/useEntries.tsx @@ -0,0 +1,104 @@ +import { useState, useCallback, useEffect, useMemo } from "react"; +import { getCache, setCache, subscribe, unsubscribe } from "@coasys/hooks-helpers"; +import { Agent, AgentStatus, LinkExpression } from "@coasys/ad4m"; +import { AgentClient } from "@coasys/ad4m"; + +type MeData = { + agent?: Agent; + status?: AgentStatus; +}; + +type MyInfo = { + me?: Agent; + status?: AgentStatus; + profile: T | null; + error: string | undefined; + mutate: Function; + reload: Function; +}; + +export function useMe(agent: AgentClient | undefined, formatter: (links: LinkExpression[]) => T): MyInfo { + const forceUpdate = useForceUpdate(); + const [error, setError] = useState(undefined); + + // Create cache key for entry + const cacheKey = `agents/me`; + + // Mutate shared/cached data for all subscribers + const mutate = useCallback( + (data: MeData | null) => setCache(cacheKey, data), + [cacheKey] + ); + + // Fetch data from AD4M and save to cache + const getData = useCallback(() => { + if (!agent) { + return; + } + + const promises = Promise.all([agent.status(), agent.me()]); + + promises + .then(async ([status, agent]) => { + setError(undefined); + mutate({ agent, status }); + }) + .catch((error) => setError(error.toString())); + }, [agent, mutate]); + + // Trigger initial fetch + useEffect(getData, [getData]); + + // Subscribe to changes (re-render on data change) + useEffect(() => { + subscribe(cacheKey, forceUpdate); + return () => unsubscribe(cacheKey, forceUpdate); + }, [cacheKey, forceUpdate]); + + // Listen to remote changes + useEffect(() => { + const changed = (status: AgentStatus) => { + const newMeData = { agent: data?.agent, status }; + mutate(newMeData); + return null; + }; + + const updated = (agent: Agent) => { + const newMeData = { agent, status: data?.status }; + mutate(newMeData); + return null; + }; + + if (agent) { + agent.addAgentStatusChangedListener(changed); + agent.addUpdatedListener(updated); + + // TODO need a way to remove listeners + } + }, [agent]); + + const data = getCache(cacheKey); + let profile = null as T | null; + const perspective = data?.agent?.perspective; + + if (perspective) { + if (formatter) { + profile = formatter(perspective.links) + } + + } + + return { + status: data?.status, + me: data?.agent, + profile, + error, + mutate, + reload: getData, + }; +} + +function useForceUpdate() { + const [, setState] = useState([]); + return useCallback(() => setState([]), [setState]); +} diff --git a/ad4m-hooks/react/src/useMe.tsx b/ad4m-hooks/react/src/useMe.tsx new file mode 100644 index 000000000..96ce3b910 --- /dev/null +++ b/ad4m-hooks/react/src/useMe.tsx @@ -0,0 +1,104 @@ +import { useState, useCallback, useEffect, useMemo } from "react"; +import { getCache, setCache, subscribe, unsubscribe } from "@coasys/hooks-helpers"; +import { Agent, AgentStatus, LinkExpression } from "@coasys/ad4m"; +import { AgentClient } from "@coasys/ad4m"; + +type MeData = { + agent?: Agent; + status?: AgentStatus; +}; + +type MyInfo = { + me?: Agent; + status?: AgentStatus; + profile: T | null; + error: string | undefined; + mutate: Function; + reload: Function; +}; + +export function useMe(agent: AgentClient | undefined, formatter: (links: LinkExpression[]) => T): MyInfo { + const forceUpdate = useForceUpdate(); + const [error, setError] = useState(undefined); + + // Create cache key for entry + const cacheKey = `agents/me`; + + // Mutate shared/cached data for all subscribers + const mutate = useCallback( + (data: MeData | null) => setCache(cacheKey, data), + [cacheKey] + ); + + // Fetch data from AD4M and save to cache + const getData = useCallback(() => { + if (!agent) { + return; + } + + const promises = Promise.all([agent.status(), agent.me()]); + + promises + .then(async ([status, agent]) => { + setError(undefined); + mutate({ agent, status }); + }) + .catch((error) => setError(error.toString())); + }, [agent, mutate]); + + // Trigger initial fetch + useEffect(getData, [getData]); + + // Subscribe to changes (re-render on data change) + useEffect(() => { + subscribe(cacheKey, forceUpdate); + return () => unsubscribe(cacheKey, forceUpdate); + }, [cacheKey, forceUpdate]); + + // Listen to remote changes + useEffect(() => { + const changed = (status: AgentStatus) => { + const newMeData = { agent: data?.agent, status }; + mutate(newMeData); + return null; + }; + + const updated = (agent: Agent) => { + const newMeData = { agent, status: data?.status }; + mutate(newMeData); + return null; + }; + + if (agent) { + agent.addAgentStatusChangedListener(changed); + agent.addUpdatedListener(updated); + + // TODO need a way to remove listeners + } + }, [agent]); + + const data = getCache(cacheKey); + let profile = null as T | null; + const perspective = data?.agent?.perspective; + + if (perspective) { + if (formatter) { + profile = formatter(perspective.links) + } + + } + + return { + status: data?.status, + me: data?.agent, + profile, + error, + mutate, + reload: getData, + }; +} + +function useForceUpdate() { + const [, setState] = useState([]); + return useCallback(() => setState([]), [setState]); +} diff --git a/ad4m-hooks/react/src/usePerspective.tsx b/ad4m-hooks/react/src/usePerspective.tsx new file mode 100644 index 000000000..34dc5d4ef --- /dev/null +++ b/ad4m-hooks/react/src/usePerspective.tsx @@ -0,0 +1,29 @@ +import React, { useState, useEffect } from 'react'; +import { usePerspectives } from './usePerspectives'; +import { Ad4mClient, PerspectiveProxy } from '@coasys/ad4m'; + +export function usePerspective(client: Ad4mClient, uuid: string | Function) { + const [uuidState, setUuidState] = useState(typeof uuid === 'function' ? uuid() : uuid); + + const { perspectives } = usePerspectives(client); + + const [data, setData] = useState<{ perspective: PerspectiveProxy | null, synced: boolean }>({ + perspective: null, + synced: false, + }); + + useEffect(() => { + const pers = perspectives[uuidState]; + setData(prevData => ({ ...prevData, perspective: pers })); + }, [perspectives, uuidState]); + + useEffect(() => { + if (typeof uuid === 'function') { + setUuidState(uuid()); + } else { + setUuidState(uuid); + } + }, [uuid]); + + return { data }; +} \ No newline at end of file diff --git a/ad4m-hooks/react/src/usePerspectives.tsx b/ad4m-hooks/react/src/usePerspectives.tsx new file mode 100644 index 000000000..15e64e6a3 --- /dev/null +++ b/ad4m-hooks/react/src/usePerspectives.tsx @@ -0,0 +1,122 @@ +import { useState, useEffect, useRef } from "react"; +import { Ad4mClient } from "@coasys/ad4m"; + +type UUID = string; + +interface PerspectiveProxy { + uuid: UUID; + sharedUrl: string; + addListener(event: string, callback: Function): void; + removeListener(event: string, callback: Function): void; +} + +export function usePerspectives(client: Ad4mClient) { + const [perspectives, setPerspectives] = useState<{ [x: UUID]: PerspectiveProxy }>({}); + const [neighbourhoods, setNeighbourhoods] = useState<{ [x: UUID]: PerspectiveProxy }>({}); + const onAddedLinkCbs = useRef([]); + const onRemovedLinkCbs = useRef([]); + const hasFetched = useRef(false); + + useEffect(() => { + const fetchPerspectives = async () => { + if (hasFetched.current) return; + hasFetched.current = true; + + const allPerspectives = await client.perspective.all(); + const newPerspectives: { [x: UUID]: PerspectiveProxy } = {}; + + allPerspectives.forEach((p) => { + newPerspectives[p.uuid] = p; + addListeners(p); + }); + + setPerspectives(newPerspectives); + }; + + const addListeners = (p: PerspectiveProxy) => { + p.addListener("link-added", (link: any) => { + onAddedLinkCbs.current.forEach((cb) => { + cb(p, link); + }); + }); + + p.addListener("link-removed", (link: any) => { + onRemovedLinkCbs.current.forEach((cb) => { + cb(p, link); + }); + }); + }; + + const perspectiveUpdatedListener = async (handle: any) => { + const perspective = await client.perspective.byUUID(handle.uuid); + if (perspective) { + setPerspectives((prevPerspectives) => ({ + ...prevPerspectives, + [handle.uuid]: perspective, + })); + } + }; + + const perspectiveAddedListener = async (handle: any) => { + const perspective = await client.perspective.byUUID(handle.uuid); + if (perspective) { + setPerspectives((prevPerspectives) => ({ + ...prevPerspectives, + [handle.uuid]: perspective, + })); + addListeners(perspective); + } + }; + + const perspectiveRemovedListener = (uuid: UUID) => { + setPerspectives((prevPerspectives) => { + const newPerspectives = { ...prevPerspectives }; + delete newPerspectives[uuid]; + return newPerspectives; + }); + }; + + fetchPerspectives(); + + // @ts-ignore + client.perspective.addPerspectiveUpdatedListener(perspectiveUpdatedListener); + // @ts-ignore + client.perspective.addPerspectiveAddedListener(perspectiveAddedListener); + // @ts-ignore + client.perspective.addPerspectiveRemovedListener(perspectiveRemovedListener); + + return () => { + // @ts-ignore + client.perspective.removePerspectiveUpdatedListener(perspectiveUpdatedListener); + // @ts-ignore + client.perspective.removePerspectiveAddedListener(perspectiveAddedListener); + // @ts-ignore + client.perspective.removePerspectiveRemovedListener(perspectiveRemovedListener); + }; + }, []); + + useEffect(() => { + const newNeighbourhoods = Object.keys(perspectives).reduce((acc, key) => { + if (perspectives[key]?.sharedUrl) { + return { + ...acc, + [key]: perspectives[key], + }; + } else { + return acc; + } + }, {}); + + setNeighbourhoods(newNeighbourhoods); + }, [perspectives]); + + function onLinkAdded(cb: Function) { + onAddedLinkCbs.current.push(cb); + } + + function onLinkRemoved(cb: Function) { + onRemovedLinkCbs.current.push(cb); + } + + return { perspectives, neighbourhoods, onLinkAdded, onLinkRemoved }; +} diff --git a/ad4m-hooks/react/src/useSubject.tsx b/ad4m-hooks/react/src/useSubject.tsx new file mode 100644 index 000000000..8be510017 --- /dev/null +++ b/ad4m-hooks/react/src/useSubject.tsx @@ -0,0 +1,105 @@ +import { useState, useCallback, useEffect, useMemo } from "react"; +import { + getCache, + setCache, + subscribe, + subscribeToPerspective, + unsubscribe, + unsubscribeFromPerspective, +} from "@coasys/hooks-helpers"; +import { PerspectiveProxy, LinkExpression } from "@coasys/ad4m"; +import { SubjectRepository } from "@coasys/hooks-helpers"; + +type Props = { + id: string; + perspective: PerspectiveProxy; + subject: string | (new () => SubjectClass); +}; + +export function useSubject(props: Props) { + const forceUpdate = useForceUpdate(); + const [error, setError] = useState(undefined); + const { perspective, id, subject } = props; + + // Create subject + const Repo = useMemo(() => { + return new SubjectRepository(subject, { + perspective: perspective, + source: null, + }); + }, [perspective.uuid, subject]); + + // Create cache key for entry + // @ts-ignore + const cacheKey = `${perspective.uuid}/${subject.name}/${id}`; + + // Mutate shared/cached data for all subscribers + const mutate = useCallback( + (entry: SubjectClass | null) => setCache(cacheKey, entry), + [cacheKey] + ); + + // Fetch data from AD4M and save to cache + const getData = useCallback(() => { + if (id) { + Repo.getData(id) + .then(async (entry) => { + setError(undefined); + mutate(entry); + }) + .catch((error) => setError(error.toString())); + } + }, [cacheKey]); + + // Trigger initial fetch + useEffect(getData, [getData]); + + async function linkAdded(link: LinkExpression) { + const isUpdated = link.data.source === id; + + if (isUpdated) { + getData(); + } + + return null; + } + + async function linkRemoved(link: LinkExpression) { + if (link.data.source === id) { + getData(); + } + return null; + } + + // Listen to remote changes + useEffect(() => { + if (perspective.uuid) { + subscribeToPerspective(perspective, linkAdded, linkRemoved); + + return () => { + unsubscribeFromPerspective(perspective, linkAdded, linkRemoved); + }; + } + }, [perspective.uuid, id]); + + // Subscribe to changes (re-render on data change) + useEffect(() => { + subscribe(cacheKey, forceUpdate); + return () => unsubscribe(cacheKey, forceUpdate); + }, [cacheKey, forceUpdate]); + + type ExtendedSubjectClass = SubjectClass & { + id: string; + timestamp: number; + author: string; + }; + + const entry = getCache(cacheKey); + + return { entry, error, mutate, repo: Repo, reload: getData }; +} + +function useForceUpdate() { + const [, setState] = useState([]); + return useCallback(() => setState([]), [setState]); +} diff --git a/ad4m-hooks/react/src/useSubjects.tsx b/ad4m-hooks/react/src/useSubjects.tsx new file mode 100644 index 000000000..7e7c924a5 --- /dev/null +++ b/ad4m-hooks/react/src/useSubjects.tsx @@ -0,0 +1,208 @@ +import { useState, useCallback, useEffect, useMemo } from "react"; +import { + getCache, + setCache, + subscribe, + subscribeToPerspective, + unsubscribe, + unsubscribeFromPerspective, +} from "@coasys/hooks-helpers"; +import { PerspectiveProxy, LinkExpression } from "@coasys/ad4m"; +import { QueryOptions, SubjectRepository } from "@coasys/hooks-helpers"; + +type Props = { + source: string; + perspective: PerspectiveProxy; + subject: (new () => SubjectClass) | string; + query?: QueryOptions; +}; + +export function useSubjects(props: Props) { + const forceUpdate = useForceUpdate(); + const [query, setQuery] = useState(props.query); + const [isMore, setIsMore] = useState(false); + const [error, setError] = useState(undefined); + const [isLoading, setIsLoading] = useState(false); + const { perspective, source, subject } = props; + + // Create cache key for entry + const cacheKey = `${perspective.uuid}/${source || ""}/${ + typeof subject === "string" ? subject : subject.prototype.className + }/${query?.uniqueKey}`; + + // Create model + const Repo = useMemo(() => { + return new SubjectRepository(subject, { + perspective: perspective, + source, + }); + }, [cacheKey]); + + // Mutate shared/cached data for all subscribers + const mutate = useCallback( + (entries: SubjectClass[]) => setCache(cacheKey, entries), + [cacheKey] + ); + + // Fetch data from AD4M and save to cache + const getData = useCallback(() => { + if (source) { + setIsLoading(true); + console.debug(`fetching data from remote`, source, query, cacheKey); + Repo.getAllData(source, query) + .then((newEntries) => { + setError(undefined); + if (query?.infinite) { + setIsMore(newEntries.length >= query.size); + // @ts-ignore + const updated = mergeArrays(entries, newEntries); + mutate(updated); + } else { + mutate(newEntries); + } + }) + .catch((error) => { + setError(error.toString()); + }) + .finally(() => { + setIsLoading(false); + }); + } + }, [cacheKey, query?.page, query?.infinite, query?.size]); + + // Trigger initial fetch + useEffect(getData, [cacheKey, query?.page, query?.infinite, query?.size]); + + // Get single entry + async function fetchEntry(id) { + const entry = (await Repo.getData(id)) as SubjectClass; + const oldEntries = (getCache(cacheKey) as SubjectClass[]) || []; + // @ts-ignore + const isOldEntry = oldEntries?.some((i) => i.id === id); + + const newEntries = isOldEntry + ? oldEntries?.map((oldEntry) => { + // @ts-ignore + const isUpdatedEntry = id === oldEntry.id; + return isUpdatedEntry ? entry : oldEntry; + }) + : [...oldEntries, entry]; + + mutate(newEntries); + } + + async function linkAdded(link: LinkExpression) { + const allEntries = (getCache(cacheKey) || []) as SubjectClass[]; + const isNewEntry = link.data.source === source; + // @ts-ignore + const isUpdated = allEntries?.find((e) => e.id === link.data.source); + + const id = isNewEntry + ? link.data.target + : isUpdated + ? link.data.source + : false; + + if (id) { + const isInstance = await perspective.isSubjectInstance( + id, + typeof subject === "string" ? subject : new subject() + ); + + if (isInstance) { + fetchEntry(id); + } + } + + return null; + } + + async function linkRemoved(link: LinkExpression) { + const allEntries = (getCache(cacheKey) || []) as SubjectClass[]; + + // Check if an association/property was removed + const removedAssociation = allEntries.some( + // @ts-ignore + (e) => e.id === link.data.source + ); + + if (removedAssociation) { + getData(); + } + + // Remove entries if they are removed from source + if (link.data.source === source) { + // @ts-ignore + const newEntries = allEntries?.filter((e) => e.id !== link.data.target); + mutate(newEntries || []); + } + return null; + } + + // Listen to remote changes + useEffect(() => { + if (perspective.uuid) { + subscribeToPerspective(perspective, linkAdded, linkRemoved); + + return () => { + unsubscribeFromPerspective(perspective, linkAdded, linkRemoved); + }; + } + }, [perspective.uuid, cacheKey, query]); + + // Subscribe to changes (re-render on data change) + useEffect(() => { + subscribe(cacheKey, forceUpdate); + return () => unsubscribe(cacheKey, forceUpdate); + }, [cacheKey, forceUpdate, query]); + + type ExtendedSubjectClass = SubjectClass & { + id: string; + timestamp: number; + author: string; + }; + + const entries = (getCache(cacheKey) || []) as ExtendedSubjectClass[]; + + return { + entries: [...entries], + error, + mutate, + setQuery, + repo: Repo, + isLoading, + reload: getData, + isMore, + }; +} + +function useForceUpdate() { + const [, setState] = useState([]); + return useCallback(() => setState([]), [setState]); +} + +interface MyObject { + id: number; + [key: string]: any; +} + +function mergeArrays(arr1: MyObject[], arr2: MyObject[]): MyObject[] { + const map = new Map(); + + // Function to add objects from array to map + function addArrayToMap(arr: MyObject[]) { + for (const obj of arr) { + if (obj && obj.id != null) { + // Ensure object and id property exist + map.set(obj.id, obj); + } + } + } + + // Add objects from both arrays to map + addArrayToMap(arr1); + addArrayToMap(arr2); + + // Convert map values to an array and return it + return Array.from(map.values()); +} diff --git a/ad4m-hooks/vue/package.json b/ad4m-hooks/vue/package.json new file mode 100644 index 000000000..4494194c8 --- /dev/null +++ b/ad4m-hooks/vue/package.json @@ -0,0 +1,23 @@ +{ + "name": "@coasys/ad4m-vue-hooks", + "version": "0.9.0", + "description": "", + "main": "./src/index.ts", + "module": "./src/index.ts", + "type": "module", + "files": [ + "dist", + "src" + ], + "scripts": {}, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@coasys/ad4m": "*", + "@coasys/hooks-helpers": "*" + }, + "peerDependencies": { + "vue": "^3.2.47" + } +} diff --git a/ad4m-hooks/vue/src/index.ts b/ad4m-hooks/vue/src/index.ts new file mode 100644 index 000000000..ab090a981 --- /dev/null +++ b/ad4m-hooks/vue/src/index.ts @@ -0,0 +1,7 @@ +export * from './useAgent' +export * from './useClient'; +export * from './useMe' +export * from './usePerspective' +export * from './usePerspectives' +export * from './useSubject'; +export * from './useSubjects' \ No newline at end of file diff --git a/ad4m-hooks/vue/src/useAgent.ts b/ad4m-hooks/vue/src/useAgent.ts new file mode 100644 index 000000000..f5db9b4f0 --- /dev/null +++ b/ad4m-hooks/vue/src/useAgent.ts @@ -0,0 +1,32 @@ +import { computed, ref, shallowRef, watch } from "vue"; +import { Agent, LinkExpression } from "@coasys/ad4m"; +import { AgentClient } from "@coasys/ad4m"; + + + +export function useAgent(client: AgentClient, did: string | Function, formatter: (links: LinkExpression[]) => T) { + const agent = shallowRef(null); + const profile = shallowRef(null); + const didRef = typeof did === "function" ? (did as any) : ref(did); + + watch( + [client, didRef], + async ([c, d]) => { + if (d) { + agent.value = await client.byDID(d); + if (agent.value?.perspective) { + const perspective = agent.value.perspective; + + const prof = formatter(perspective.links); + + profile.value = { ...prof, did: d} as T; + } else { + profile.value = null; + } + } + }, + { immediate: true } + ); + + return { agent, profile }; +} diff --git a/ad4m-hooks/vue/src/useClient.ts b/ad4m-hooks/vue/src/useClient.ts new file mode 100644 index 000000000..b4201773c --- /dev/null +++ b/ad4m-hooks/vue/src/useClient.ts @@ -0,0 +1,48 @@ +import { ref, onMounted, watch } from 'vue'; +import { getCache, setCache } from '@coasys/hooks-helpers'; +// @ts-ignore +import { getAd4mClient } from '@coasys/ad4m-connect/utils'; + +export function useClient() { + const error = ref(null); + const client = ref(null); + + // Create cache key for entry + const cacheKey = 'client'; + + // Mutate shared/cached data for all subscribers + const mutate = (client) => { + setCache(cacheKey, client); + }; + + // Fetch data from AD4M and save to cache + const getData = async () => { + console.debug('🪝 useClient - running getAd4mClient'); + try { + const client = await getAd4mClient(); + error.value = null; + mutate(client); + } catch (error) { + error.value = error.toString(); + } + }; + + // Trigger initial fetch + onMounted(getData); + + // Subscribe to changes (re-render on data change) + watch( + () => getCache(cacheKey), + (newClient) => { + client.value = newClient; + }, + { immediate: true } + ); + + return { + client, + error, + mutate, + reload: getData, + }; +} \ No newline at end of file diff --git a/ad4m-hooks/vue/src/useMe.ts b/ad4m-hooks/vue/src/useMe.ts new file mode 100644 index 000000000..b5225d568 --- /dev/null +++ b/ad4m-hooks/vue/src/useMe.ts @@ -0,0 +1,44 @@ +import { computed, effect, ref, shallowRef, watch } from "vue"; +import { Agent, AgentStatus, LinkExpression } from "@coasys/ad4m"; +import { AgentClient } from "@coasys/ad4m"; + +const status = shallowRef({ isInitialized: false, isUnlocked: false }); +const agent = shallowRef(); +const isListening = shallowRef(false); +const profile = shallowRef(null); + +export function useMe(client: AgentClient, formatter: (links: LinkExpression[]) => T) { + effect(async () => { + if (isListening.value) return; + + status.value = await client.status(); + agent.value = await client.me(); + + isListening.value = true; + + client.addAgentStatusChangedListener(async (s: AgentStatus) => { + status.value = s; + }); + + client.addUpdatedListener(async (a: Agent) => { + agent.value = a; + }); + }, {}); + + watch( + () => agent.value, + (newAgent) => { + if (agent.value?.perspective) { + const perspective = newAgent.perspective; + + profile.value = formatter(perspective.links); + } else { + profile.value = null; + } + }, + { immediate: true } + ) + + + return { status, me: agent, profile }; +} diff --git a/ad4m-hooks/vue/src/usePerspective.ts b/ad4m-hooks/vue/src/usePerspective.ts new file mode 100644 index 000000000..5f46919bc --- /dev/null +++ b/ad4m-hooks/vue/src/usePerspective.ts @@ -0,0 +1,37 @@ +import { ref, watch, shallowRef } from "vue"; +import { usePerspectives } from "./usePerspectives"; +import { Ad4mClient, PerspectiveProxy } from "@coasys/ad4m"; + +export function usePerspective(client: Ad4mClient, uuid: string | Function) { + const uuidRef = typeof uuid === "function" ? ref(uuid()) : ref(uuid); + + const { perspectives } = usePerspectives(client); + + const data = shallowRef<{ + perspective: PerspectiveProxy | null; + synced: boolean; + }>({ + perspective: null, + synced: false, + }); + + watch( + [perspectives, uuidRef], + ([perspectives, id]) => { + const pers = perspectives[id]; + data.value = { ...data.value, perspective: pers }; + }, + { immediate: true } + ); + + watch( + // @ts-ignore + uuid, + (id) => { + uuidRef.value = id as string; + }, + { immediate: true } + ); + + return { data }; +} diff --git a/ad4m-hooks/vue/src/usePerspectives.ts b/ad4m-hooks/vue/src/usePerspectives.ts new file mode 100644 index 000000000..8e5813cd7 --- /dev/null +++ b/ad4m-hooks/vue/src/usePerspectives.ts @@ -0,0 +1,115 @@ +import { ref, effect, shallowRef, watch, triggerRef } from "vue"; +import { Ad4mClient, PerspectiveProxy } from "@coasys/ad4m"; + +type UUID = string; + +const perspectives = shallowRef<{ [x: UUID]: PerspectiveProxy }>({}); +const neighbourhoods = shallowRef<{ [x: UUID]: PerspectiveProxy }>({}); +const onAddedLinkCbs = ref([]); +const onRemovedLinkCbs = ref([]); +const hasFetched = ref(false); + +watch( + () => perspectives.value, + (newPers) => { + neighbourhoods.value = Object.keys(newPers).reduce((acc, key) => { + if (newPers[key]?.sharedUrl) { + return { + ...acc, + [key]: newPers[key], + }; + } else { + return acc; + } + }, {}); + }, + { immediate: true } +); + +function addListeners(p: PerspectiveProxy) { + p.addListener("link-added", (link) => { + onAddedLinkCbs.value.forEach((cb) => { + cb(p, link); + }); + return null; + }); + + p.removeListener("link-removed", (link) => { + onAddedLinkCbs.value.forEach((cb) => { + cb(p, link); + }); + return null; + }); +} + +export function usePerspectives(client: Ad4mClient) { + effect(async () => { + if (hasFetched.value) return; + // First component that uses this hook will set this to true, + // so the next components will not fetch and add listeners + hasFetched.value = true; + + // Get all perspectives + const allPerspectives = await client.perspective.all(); + + perspectives.value = allPerspectives.reduce((acc, p) => { + return { ...acc, [p.uuid]: p }; + }, {}); + + // Add each perspective to our state + allPerspectives.forEach((p) => { + addListeners(p); + }); + + // @ts-ignore + client.perspective.addPerspectiveUpdatedListener(async (handle) => { + const perspective = await client.perspective.byUUID(handle.uuid); + + if (perspective) { + perspectives.value = { + ...perspectives.value, + [handle.uuid]: perspective, + }; + } + return null; + }); + + // Add new incoming perspectives + // @ts-ignore + client.perspective.addPerspectiveAddedListener(async (handle) => { + const perspective = await client.perspective.byUUID(handle.uuid); + + if (perspective) { + perspectives.value = { + ...perspectives.value, + [handle.uuid]: perspective, + }; + addListeners(perspective); + } + }); + + // Remove new deleted perspectives + client.perspective.addPerspectiveRemovedListener((uuid) => { + perspectives.value = Object.keys(perspectives.value).reduce( + (acc, key) => { + const p = perspectives.value[key]; + return key === uuid ? acc : { ...acc, [key]: p }; + }, + {} + ); + return null; + }); + }, {}); + + function fetchPerspectives() {} + + function onLinkAdded(cb: Function) { + onAddedLinkCbs.value.push(cb); + } + + function onLinkRemoved(cb: Function) { + onRemovedLinkCbs.value.push(cb); + } + + return { perspectives, neighbourhoods, onLinkAdded, onLinkRemoved }; +} diff --git a/ad4m-hooks/vue/src/useSubject.ts b/ad4m-hooks/vue/src/useSubject.ts new file mode 100644 index 000000000..44eb527dc --- /dev/null +++ b/ad4m-hooks/vue/src/useSubject.ts @@ -0,0 +1,109 @@ +import { watch, ref, shallowRef, triggerRef } from "vue"; +import { SubjectRepository } from "@coasys/hooks-helpers"; +import { PerspectiveProxy, LinkExpression } from "@coasys/ad4m"; + +export function useSubject({ + perspective, + source, + id, + subject, +}: { + perspective: PerspectiveProxy | Function; + id?: string | Function; + source?: string | Function; + subject: SubjectClass; +}) { + const idRef = typeof id === "function" ? (id as any) : ref(id); + const sourceRef = + typeof source === "function" + ? (source as any) + : ref(source || "ad4m://self"); + const perspectiveRef = + typeof perspective === "function" ? (perspective as any) : perspective; + + let entry = ref | null>(null); + let repo = shallowRef | null>(null); + + watch( + [perspectiveRef, sourceRef, idRef], + async ([p, s, id]) => { + if (p?.uuid) { + // @ts-ignore + const r = new SubjectRepository(subject, { + perspective: p, + source: s, + }); + + const res = await r.getData(id); + repo.value = r; + triggerRef(repo); + + subscribe(p, s); + + if (res) { + // @ts-ignore + entry.value = res; + } + } + }, + { immediate: true } + ); + + async function fetchEntry(id: string) { + const res = await repo.value?.getData(id); + + if (!res) return; + + entry.value = res; + } + + async function subscribe(p: PerspectiveProxy, s: string) { + const added = async (link: LinkExpression) => { + const isNewEntry = link.data.source === s; + const isUpdated = entry.value?.id === link.data.source; + + const id = isUpdated + ? link.data.source + : isNewEntry + ? link.data.target + : false; + + if (id) { + // @ts-ignore + const isInstance = await p.isSubjectInstance(id, new subject()); + + if (isInstance) { + fetchEntry(id); + } + } + + return null; + }; + + const removed = async (link: LinkExpression) => { + // TODO: When a channel or something else attached to AD4M get removed + // the community also thinks it's getting remove as it also point to self + const removedEntry = link.data.source === s && s !== "ad4m://self"; + if (removedEntry) { + const isInstance = await p.isSubjectInstance( + link.data.source, + // @ts-ignore + new subject() + ); + if (isInstance) { + entry.value = null; + } + } + return null; + }; + + // @ts-ignore + p.addListener("link-added", added); + // @ts-ignore + p.addListener("link-removed", removed); + + return { added }; + } + + return { entry, repo }; +} diff --git a/ad4m-hooks/vue/src/useSubjects.ts b/ad4m-hooks/vue/src/useSubjects.ts new file mode 100644 index 000000000..bf49f929b --- /dev/null +++ b/ad4m-hooks/vue/src/useSubjects.ts @@ -0,0 +1,104 @@ +import { ref, shallowRef, triggerRef, watch } from "vue"; +import { SubjectRepository } from "@coasys/hooks-helpers"; +import { PerspectiveProxy, LinkExpression } from "@coasys/ad4m"; + +// @ts-ignore +export function useSubjects({ + perspective, + source, + subject, +}: { + perspective: PerspectiveProxy | Function; + source?: string | Function; + subject: SubjectClass; +}) { + const sourceRef = + typeof source === "function" + ? (source as any) + : ref(source || "ad4m://self"); + const perspectiveRef = + typeof perspective === "function" ? (perspective as any) : ref(perspective); + + let entries = ref<{ [x: string]: any }[]>([]); + let repo = shallowRef | null>(null); + + watch( + [perspectiveRef, sourceRef], + ([p, s]) => { + if (p?.uuid) { + // @ts-ignore + const rep = new SubjectRepository(subject, { + perspective: p, + source: s, + }); + + rep.getAllData(s).then((res) => { + entries.value = res; + }); + + repo.value = rep; + triggerRef(repo); + + subscribe(p, s); + } + }, + { immediate: true } + ); + + async function fetchEntry(id: string) { + const entry = await repo.value?.getData(id); + + if (!entry) return; + + const isUpdatedEntry = entries.value.find((e) => e.id === entry.id); + + if (isUpdatedEntry) { + entries.value = entries.value.map((e) => { + const isTheUpdatedOne = e.id === isUpdatedEntry.id; + return isTheUpdatedOne ? entry : e; + }); + } else { + entries.value.push(entry); + } + } + + async function subscribe(p: PerspectiveProxy, s: string) { + const added = async (link: LinkExpression) => { + const isNewEntry = link.data.source === s; + const isUpdated = entries.value.find((e) => e.id === link.data.source); + + const id = isNewEntry + ? link.data.target + : isUpdated + ? link.data.source + : false; + + if (id) { + // @ts-ignore + const isInstance = await p.isSubjectInstance(id, new subject()); + + if (isInstance) { + fetchEntry(id); + } + } + + return null; + }; + + const removed = (link: LinkExpression) => { + const removedEntry = link.data.source === s; + if (removedEntry) { + entries.value = entries.value.filter((e) => e.id !== link.data.target); + } + return null; + }; + + // @ts-ignore + p.addListener("link-added", added); + p.addListener("link-removed", removed); + + return { added }; + } + + return { entries, repo }; +} diff --git a/bootstrap-languages/agent-language/hc-dna/Cargo.lock b/bootstrap-languages/agent-language/hc-dna/Cargo.lock index 710d98f1e..e45667184 100644 --- a/bootstrap-languages/agent-language/hc-dna/Cargo.lock +++ b/bootstrap-languages/agent-language/hc-dna/Cargo.lock @@ -76,15 +76,6 @@ dependencies = [ "libc", ] -[[package]] -name = "approx" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" -dependencies = [ - "num-traits", -] - [[package]] name = "arrayref" version = "0.3.7" @@ -220,12 +211,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "bytemuck" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" - [[package]] name = "byteorder" version = "1.5.0" @@ -447,7 +432,7 @@ dependencies = [ "autocfg", "cfg-if 1.0.0", "crossbeam-utils", - "memoffset 0.9.0", + "memoffset", "scopeguard", ] @@ -847,9 +832,11 @@ checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" [[package]] name = "hdi" -version = "0.4.0-beta-dev.18" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.4.0-beta-dev.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31dfc1fec80d7d9292e04e26e94528b0a0cc9baf982d1fb18e3af3e7625cb90" dependencies = [ + "getrandom", "hdk_derive", "holo_hash", "holochain_integrity_types", @@ -863,8 +850,9 @@ dependencies = [ [[package]] name = "hdk" -version = "0.3.0-beta-dev.22" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99a6ccefa8f3aa8cd8a0f7ab40f3939610133bd32a14785d4d62440f92ab6a11" dependencies = [ "getrandom", "hdi", @@ -882,8 +870,9 @@ dependencies = [ [[package]] name = "hdk_derive" -version = "0.3.0-beta-dev.17" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcfd466d96f2d19530b1419646b0a52c3bc833b0e7dacad4329cb90708db8665" dependencies = [ "darling 0.14.4", "heck", @@ -915,8 +904,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "holo_hash" -version = "0.3.0-beta-dev.14" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "050e53c0258e6235145fe949b74cedd48c24f4d92e1e7b7e39581a9a2b6996e7" dependencies = [ "base64", "blake2b_simd", @@ -932,8 +922,9 @@ dependencies = [ [[package]] name = "holochain_integrity_types" -version = "0.3.0-beta-dev.17" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a76306ea0c825e6bc8f040df4a3fe1ab82f187c108a91e81df957ae4f76efda" dependencies = [ "holo_hash", "holochain_secure_primitive", @@ -949,8 +940,9 @@ dependencies = [ [[package]] name = "holochain_nonce" -version = "0.3.0-beta-dev.22" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1fa99c5d38bb8fe463dd0284e2123ad14405f2a62146c4aaa809d5b24134711" dependencies = [ "getrandom", "holochain_secure_primitive", @@ -959,8 +951,9 @@ dependencies = [ [[package]] name = "holochain_secure_primitive" -version = "0.3.0-beta-dev.21" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcc25ba91f7898688245db538693d7b26504f91df24709111bb3b1d7506af01a" dependencies = [ "paste", "serde", @@ -994,8 +987,9 @@ dependencies = [ [[package]] name = "holochain_util" -version = "0.3.0-beta-dev.2" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14d6225aded80caf004c2214e38b39fb2459ee9a7a8fcd0d09146f49ae0771f0" dependencies = [ "cfg-if 0.1.10", "derive_more", @@ -1008,9 +1002,9 @@ dependencies = [ [[package]] name = "holochain_wasmer_common" -version = "0.0.86" +version = "0.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d90da174e7db13ecce8279052d6e7394a101a0bcf63a990404419ee7d7d06d1" +checksum = "72007fd2a72d77e76ffa494e5847bf6e893e25e73fe1d1de902e1b8d5033a64e" dependencies = [ "holochain_serialized_bytes", "serde", @@ -1022,9 +1016,9 @@ dependencies = [ [[package]] name = "holochain_wasmer_guest" -version = "0.0.86" +version = "0.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa28c28213791d36359d083d892371bdddf71148412e411ffbc748d048bfaa22" +checksum = "8c429e84a19ee446f47541a6fed10e1a4376a8a8ba6d3dbff7d07e4a7bb4c85f" dependencies = [ "holochain_serialized_bytes", "holochain_wasmer_common", @@ -1036,9 +1030,11 @@ dependencies = [ [[package]] name = "holochain_zome_types" -version = "0.3.0-beta-dev.18" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1d1b165dcf3d1ae412edf952b1ae4e57a5b5c4a97c11eb97b5fb4fdf06cc6a4" dependencies = [ + "derive_more", "holo_hash", "holochain_integrity_types", "holochain_nonce", @@ -1047,7 +1043,6 @@ dependencies = [ "holochain_wasmer_common", "kitsune_p2p_bin_data", "kitsune_p2p_block", - "kitsune_p2p_dht", "kitsune_p2p_timestamp", "paste", "serde", @@ -1170,8 +1165,9 @@ dependencies = [ [[package]] name = "kitsune_p2p_bin_data" -version = "0.3.0-beta-dev.10" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c89fb7f069f4a90794dff2669cc832a71c9fd93554e92b0f17de97d753283f4" dependencies = [ "base64", "derive_more", @@ -1184,38 +1180,20 @@ dependencies = [ [[package]] name = "kitsune_p2p_block" -version = "0.3.0-beta-dev.11" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a32470626b779dd5e36e516d64f8bdde1eac1faec944654d2b85f200b0ac3cee" dependencies = [ "kitsune_p2p_bin_data", "kitsune_p2p_timestamp", "serde", ] -[[package]] -name = "kitsune_p2p_dht" -version = "0.3.0-beta-dev.10" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" -dependencies = [ - "derivative", - "derive_more", - "futures", - "kitsune_p2p_dht_arc", - "kitsune_p2p_timestamp", - "must_future", - "num-traits", - "once_cell", - "rand", - "serde", - "statrs", - "thiserror", - "tracing", -] - [[package]] name = "kitsune_p2p_dht_arc" -version = "0.3.0-beta-dev.9" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaba5f7fcb2c0b7faa3f859a3de5c4b893fbf9cfea51530549d11e9738fbfac" dependencies = [ "derive_more", "gcollections", @@ -1227,8 +1205,9 @@ dependencies = [ [[package]] name = "kitsune_p2p_timestamp" -version = "0.3.0-beta-dev.5" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4d587124090ca8e4ab28f3dd3d65aa35fcc72403b7dad4fc790751efd04fbe3" dependencies = [ "chrono", "serde", @@ -1252,12 +1231,6 @@ version = "0.2.150" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" -[[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - [[package]] name = "lock_api" version = "0.4.11" @@ -1283,16 +1256,6 @@ dependencies = [ "libc", ] -[[package]] -name = "matrixmultiply" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2" -dependencies = [ - "autocfg", - "rawpointer", -] - [[package]] name = "memchr" version = "2.6.4" @@ -1317,15 +1280,6 @@ dependencies = [ "libc", ] -[[package]] -name = "memoffset" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" -dependencies = [ - "autocfg", -] - [[package]] name = "memoffset" version = "0.9.0" @@ -1350,54 +1304,6 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7843ec2de400bcbc6a6328c958dc38e5359da6e93e72e37bc5246bf1ae776389" -[[package]] -name = "must_future" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a160ffed3c2f98d2906c67a9b6e4e1f09cca7e17e3f780286a349061459eeebe" -dependencies = [ - "futures", - "pin-utils", -] - -[[package]] -name = "nalgebra" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d506eb7e08d6329505faa8a3a00a5dcc6de9f76e0c77e4b75763ae3c770831ff" -dependencies = [ - "approx", - "matrixmultiply", - "nalgebra-macros", - "num-complex", - "num-rational", - "num-traits", - "rand", - "rand_distr", - "simba", - "typenum", -] - -[[package]] -name = "nalgebra-macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01fcc0b8149b4632adc89ac3b7b31a12fb6099a0317a4eb2ebff574ef7de7218" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "num-complex" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" -dependencies = [ - "num-traits", -] - [[package]] name = "num-integer" version = "0.1.45" @@ -1408,17 +1314,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-rational" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-traits" version = "0.2.17" @@ -1426,7 +1321,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", - "libm", ] [[package]] @@ -1512,12 +1406,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1586,52 +1474,6 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rand_distr" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" -dependencies = [ - "num-traits", - "rand", -] - -[[package]] -name = "rawpointer" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" - [[package]] name = "rayon" version = "1.8.0" @@ -1801,15 +1643,6 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" -[[package]] -name = "safe_arch" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f398075ce1e6a179b46f51bd88d0598b92b00d3551f1a2d4ac49e771b56ac354" -dependencies = [ - "bytemuck", -] - [[package]] name = "same-file" version = "1.0.6" @@ -1959,19 +1792,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "simba" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0b7840f121a46d63066ee7a99fc81dcabbc6105e437cae43528cea199b5a05f" -dependencies = [ - "approx", - "num-complex", - "num-traits", - "paste", - "wide", -] - [[package]] name = "simdutf8" version = "0.1.4" @@ -2005,19 +1825,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "statrs" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d08e5e1748192713cc281da8b16924fb46be7b0c2431854eadc785823e5696e" -dependencies = [ - "approx", - "lazy_static", - "nalgebra", - "num-traits", - "rand", -] - [[package]] name = "strsim" version = "0.10.0" @@ -2350,29 +2157,6 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-downcast" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" -dependencies = [ - "js-sys", - "once_cell", - "wasm-bindgen", - "wasm-bindgen-downcast-macros", -] - -[[package]] -name = "wasm-bindgen-downcast-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "wasm-bindgen-macro" version = "0.2.89" @@ -2404,18 +2188,18 @@ checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" [[package]] name = "wasm-encoder" -version = "0.38.1" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad2b51884de9c7f4fe2fd1043fccb8dcad4b1e29558146ee57a144d15779f3f" +checksum = "1ba64e81215916eaeb48fee292f29401d69235d62d8b8fd92a7b2844ec5ae5f7" dependencies = [ "leb128", ] [[package]] name = "wasmer" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" +checksum = "ce45cc009177ca345a6d041f9062305ad467d15e7d41494f5b81ab46d62d7a58" dependencies = [ "bytes", "cfg-if 1.0.0", @@ -2430,7 +2214,6 @@ dependencies = [ "target-lexicon", "thiserror", "wasm-bindgen", - "wasm-bindgen-downcast", "wasmer-compiler", "wasmer-compiler-cranelift", "wasmer-derive", @@ -2442,9 +2225,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" +checksum = "e044f6140c844602b920deb4526aea3cc9c0d7cf23f00730bb9b2034669f522a" dependencies = [ "backtrace", "bytes", @@ -2469,9 +2252,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" +checksum = "32ce02358eb44a149d791c1d6648fb7f8b2f99cd55e3c4eef0474653ec8cc889" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -2488,9 +2271,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" +checksum = "c782d80401edb08e1eba206733f7859db6c997fc5a7f5fb44edc3ecd801468f6" dependencies = [ "proc-macro-error", "proc-macro2", @@ -2500,9 +2283,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" +checksum = "fd09e80d4d74bb9fd0ce6c3c106b1ceba1a050f9948db9d9b78ae53c172d6157" dependencies = [ "bytecheck", "enum-iterator", @@ -2516,9 +2299,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" +checksum = "bdcd8a4fd36414a7b6a003dbfbd32393bce3e155d715dd877c05c1b7a41d224d" dependencies = [ "backtrace", "cc", @@ -2533,7 +2316,7 @@ dependencies = [ "lazy_static", "libc", "mach", - "memoffset 0.8.0", + "memoffset", "more-asserts", "region", "scopeguard", @@ -2554,9 +2337,9 @@ dependencies = [ [[package]] name = "wast" -version = "69.0.1" +version = "64.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ee37317321afde358e4d7593745942c48d6d17e0e6e943704de9bbee121e7a" +checksum = "a259b226fd6910225aa7baeba82f9d9933b6d00f2ce1b49b80fa4214328237cc" dependencies = [ "leb128", "memchr", @@ -2566,23 +2349,13 @@ dependencies = [ [[package]] name = "wat" -version = "1.0.82" +version = "1.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aeb338ee8dee4d4cd05e6426683f21c5087dc7cfc8903e839ccf48d43332da3c" +checksum = "53253d920ab413fca1c7dc2161d601c79b4fdf631d0ba51dd4343bf9b556c3f6" dependencies = [ "wast", ] -[[package]] -name = "wide" -version = "0.7.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c68938b57b33da363195412cfc5fc37c9ed49aa9cfe2156fde64b8d2c9498242" -dependencies = [ - "bytemuck", - "safe_arch", -] - [[package]] name = "winapi" version = "0.3.9" diff --git a/bootstrap-languages/agent-language/hc-dna/zomes/agent_store/Cargo.toml b/bootstrap-languages/agent-language/hc-dna/zomes/agent_store/Cargo.toml index 168d06d61..15d75de88 100644 --- a/bootstrap-languages/agent-language/hc-dna/zomes/agent_store/Cargo.toml +++ b/bootstrap-languages/agent-language/hc-dna/zomes/agent_store/Cargo.toml @@ -14,6 +14,6 @@ serde = "1" chrono = { version = "0.4.31", default-features = false, features = ["clock", "std", "oldtime", "serde"] } thiserror = "1.0.20" -hdk = { version = "0.3.0-beta-dev.22", git = "https://github.com/coasys/holochain.git", rev = "67ba54b961184ca9301698145f6256744356a879"} -holo_hash = { version = "0.3.0-beta-dev.14", git = "https://github.com/coasys/holochain.git", rev = "67ba54b961184ca9301698145f6256744356a879"} +hdk = { version = "0.3.0-beta-dev.33" } +holo_hash = { version = "0.3.0-beta-dev.22" } agent_store_integrity = { path = "../agent_store_integrity" } \ No newline at end of file diff --git a/bootstrap-languages/agent-language/hc-dna/zomes/agent_store/src/utils.rs b/bootstrap-languages/agent-language/hc-dna/zomes/agent_store/src/utils.rs index 02a756fc4..a28845f20 100644 --- a/bootstrap-languages/agent-language/hc-dna/zomes/agent_store/src/utils.rs +++ b/bootstrap-languages/agent-language/hc-dna/zomes/agent_store/src/utils.rs @@ -8,10 +8,11 @@ pub(crate) fn err(reason: &str) -> WasmError { pub(crate) fn get_latest_link(base: EntryHash, tag: Option) -> ExternResult> { let input = GetLinksInputBuilder::try_new( base, - LinkTypes::ProfileLink + LinkTypes::ProfileLink, ) .unwrap() .tag_prefix(tag.unwrap()) + .get_options(GetStrategy::Network) .build(); let profile_info = get_links(input)?; diff --git a/bootstrap-languages/agent-language/hc-dna/zomes/agent_store_integrity/Cargo.toml b/bootstrap-languages/agent-language/hc-dna/zomes/agent_store_integrity/Cargo.toml index f06168a8c..76d1f7ba6 100644 --- a/bootstrap-languages/agent-language/hc-dna/zomes/agent_store_integrity/Cargo.toml +++ b/bootstrap-languages/agent-language/hc-dna/zomes/agent_store_integrity/Cargo.toml @@ -13,5 +13,5 @@ derive_more = "0" serde = "1" chrono = { version = "0.4.31", default-features = false, features = ["clock", "std", "oldtime", "serde"] } -hdi = { version = "0.4.0-beta-dev.18", git = "https://github.com/coasys/holochain.git", rev = "67ba54b961184ca9301698145f6256744356a879" } -hdk = { version = "0.3.0-beta-dev.22", git = "https://github.com/coasys/holochain.git", rev = "67ba54b961184ca9301698145f6256744356a879"} \ No newline at end of file +hdi = { version = "0.4.0-beta-dev.29"} +hdk = { version = "0.3.0-beta-dev.33"} \ No newline at end of file diff --git a/bootstrap-languages/agent-language/hc-dna/zomes/agent_store_integrity/src/lib.rs b/bootstrap-languages/agent-language/hc-dna/zomes/agent_store_integrity/src/lib.rs index 7ca4a36d3..6e52b2d44 100644 --- a/bootstrap-languages/agent-language/hc-dna/zomes/agent_store_integrity/src/lib.rs +++ b/bootstrap-languages/agent-language/hc-dna/zomes/agent_store_integrity/src/lib.rs @@ -27,12 +27,12 @@ pub struct Perspective { pub links: Vec, } -#[hdk_entry_defs] +#[hdk_entry_types] #[unit_enum(UnitEntryTypes)] pub enum EntryTypes { - #[entry_def(visibility = "public")] + #[entry_type(visibility = "public")] Did(Did), - #[entry_def(visibility = "public")] + #[entry_type(visibility = "public")] AgentExpression(AgentExpression), } diff --git a/bootstrap-languages/agent-language/package.json b/bootstrap-languages/agent-language/package.json index d1b5b9f69..d218b9434 100644 --- a/bootstrap-languages/agent-language/package.json +++ b/bootstrap-languages/agent-language/package.json @@ -44,5 +44,5 @@ "md5": "^2.3.0", "postcss": "^8.2.1" }, - "version": "0.8.1" + "version": "0.9.0" } diff --git a/bootstrap-languages/direct-message-language/hc-dna/Cargo.lock b/bootstrap-languages/direct-message-language/hc-dna/Cargo.lock index 3aea370ae..ab5eb4c42 100644 --- a/bootstrap-languages/direct-message-language/hc-dna/Cargo.lock +++ b/bootstrap-languages/direct-message-language/hc-dna/Cargo.lock @@ -52,15 +52,6 @@ dependencies = [ "libc", ] -[[package]] -name = "approx" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" -dependencies = [ - "num-traits", -] - [[package]] name = "arrayref" version = "0.3.7" @@ -196,12 +187,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "bytemuck" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" - [[package]] name = "byteorder" version = "1.5.0" @@ -423,7 +408,7 @@ dependencies = [ "autocfg", "cfg-if 1.0.0", "crossbeam-utils", - "memoffset 0.9.0", + "memoffset", "scopeguard", ] @@ -848,9 +833,11 @@ checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" [[package]] name = "hdi" -version = "0.4.0-beta-dev.18" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.4.0-beta-dev.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31dfc1fec80d7d9292e04e26e94528b0a0cc9baf982d1fb18e3af3e7625cb90" dependencies = [ + "getrandom", "hdk_derive", "holo_hash", "holochain_integrity_types", @@ -864,8 +851,9 @@ dependencies = [ [[package]] name = "hdk" -version = "0.3.0-beta-dev.22" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99a6ccefa8f3aa8cd8a0f7ab40f3939610133bd32a14785d4d62440f92ab6a11" dependencies = [ "getrandom", "hdi", @@ -883,8 +871,9 @@ dependencies = [ [[package]] name = "hdk_derive" -version = "0.3.0-beta-dev.17" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcfd466d96f2d19530b1419646b0a52c3bc833b0e7dacad4329cb90708db8665" dependencies = [ "darling 0.14.4", "heck", @@ -916,8 +905,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "holo_hash" -version = "0.3.0-beta-dev.14" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "050e53c0258e6235145fe949b74cedd48c24f4d92e1e7b7e39581a9a2b6996e7" dependencies = [ "base64", "blake2b_simd", @@ -933,8 +923,9 @@ dependencies = [ [[package]] name = "holochain_integrity_types" -version = "0.3.0-beta-dev.17" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a76306ea0c825e6bc8f040df4a3fe1ab82f187c108a91e81df957ae4f76efda" dependencies = [ "holo_hash", "holochain_secure_primitive", @@ -950,8 +941,9 @@ dependencies = [ [[package]] name = "holochain_nonce" -version = "0.3.0-beta-dev.22" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1fa99c5d38bb8fe463dd0284e2123ad14405f2a62146c4aaa809d5b24134711" dependencies = [ "getrandom", "holochain_secure_primitive", @@ -960,8 +952,9 @@ dependencies = [ [[package]] name = "holochain_secure_primitive" -version = "0.3.0-beta-dev.21" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcc25ba91f7898688245db538693d7b26504f91df24709111bb3b1d7506af01a" dependencies = [ "paste", "serde", @@ -995,8 +988,9 @@ dependencies = [ [[package]] name = "holochain_util" -version = "0.3.0-beta-dev.2" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14d6225aded80caf004c2214e38b39fb2459ee9a7a8fcd0d09146f49ae0771f0" dependencies = [ "cfg-if 0.1.10", "derive_more", @@ -1009,9 +1003,9 @@ dependencies = [ [[package]] name = "holochain_wasmer_common" -version = "0.0.86" +version = "0.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d90da174e7db13ecce8279052d6e7394a101a0bcf63a990404419ee7d7d06d1" +checksum = "72007fd2a72d77e76ffa494e5847bf6e893e25e73fe1d1de902e1b8d5033a64e" dependencies = [ "holochain_serialized_bytes", "serde", @@ -1023,9 +1017,9 @@ dependencies = [ [[package]] name = "holochain_wasmer_guest" -version = "0.0.86" +version = "0.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa28c28213791d36359d083d892371bdddf71148412e411ffbc748d048bfaa22" +checksum = "8c429e84a19ee446f47541a6fed10e1a4376a8a8ba6d3dbff7d07e4a7bb4c85f" dependencies = [ "holochain_serialized_bytes", "holochain_wasmer_common", @@ -1037,9 +1031,11 @@ dependencies = [ [[package]] name = "holochain_zome_types" -version = "0.3.0-beta-dev.18" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1d1b165dcf3d1ae412edf952b1ae4e57a5b5c4a97c11eb97b5fb4fdf06cc6a4" dependencies = [ + "derive_more", "holo_hash", "holochain_integrity_types", "holochain_nonce", @@ -1048,7 +1044,6 @@ dependencies = [ "holochain_wasmer_common", "kitsune_p2p_bin_data", "kitsune_p2p_block", - "kitsune_p2p_dht", "kitsune_p2p_timestamp", "paste", "serde", @@ -1171,8 +1166,9 @@ dependencies = [ [[package]] name = "kitsune_p2p_bin_data" -version = "0.3.0-beta-dev.10" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c89fb7f069f4a90794dff2669cc832a71c9fd93554e92b0f17de97d753283f4" dependencies = [ "base64", "derive_more", @@ -1185,38 +1181,20 @@ dependencies = [ [[package]] name = "kitsune_p2p_block" -version = "0.3.0-beta-dev.11" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a32470626b779dd5e36e516d64f8bdde1eac1faec944654d2b85f200b0ac3cee" dependencies = [ "kitsune_p2p_bin_data", "kitsune_p2p_timestamp", "serde", ] -[[package]] -name = "kitsune_p2p_dht" -version = "0.3.0-beta-dev.10" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" -dependencies = [ - "derivative", - "derive_more", - "futures", - "kitsune_p2p_dht_arc", - "kitsune_p2p_timestamp", - "must_future", - "num-traits", - "once_cell", - "rand", - "serde", - "statrs", - "thiserror", - "tracing", -] - [[package]] name = "kitsune_p2p_dht_arc" -version = "0.3.0-beta-dev.9" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaba5f7fcb2c0b7faa3f859a3de5c4b893fbf9cfea51530549d11e9738fbfac" dependencies = [ "derive_more", "gcollections", @@ -1228,8 +1206,9 @@ dependencies = [ [[package]] name = "kitsune_p2p_timestamp" -version = "0.3.0-beta-dev.5" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4d587124090ca8e4ab28f3dd3d65aa35fcc72403b7dad4fc790751efd04fbe3" dependencies = [ "chrono", "serde", @@ -1253,12 +1232,6 @@ version = "0.2.150" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" -[[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - [[package]] name = "lock_api" version = "0.4.11" @@ -1284,16 +1257,6 @@ dependencies = [ "libc", ] -[[package]] -name = "matrixmultiply" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2" -dependencies = [ - "autocfg", - "rawpointer", -] - [[package]] name = "memchr" version = "2.6.4" @@ -1318,15 +1281,6 @@ dependencies = [ "libc", ] -[[package]] -name = "memoffset" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" -dependencies = [ - "autocfg", -] - [[package]] name = "memoffset" version = "0.9.0" @@ -1351,54 +1305,6 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7843ec2de400bcbc6a6328c958dc38e5359da6e93e72e37bc5246bf1ae776389" -[[package]] -name = "must_future" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a160ffed3c2f98d2906c67a9b6e4e1f09cca7e17e3f780286a349061459eeebe" -dependencies = [ - "futures", - "pin-utils", -] - -[[package]] -name = "nalgebra" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d506eb7e08d6329505faa8a3a00a5dcc6de9f76e0c77e4b75763ae3c770831ff" -dependencies = [ - "approx", - "matrixmultiply", - "nalgebra-macros", - "num-complex", - "num-rational", - "num-traits", - "rand", - "rand_distr", - "simba", - "typenum", -] - -[[package]] -name = "nalgebra-macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01fcc0b8149b4632adc89ac3b7b31a12fb6099a0317a4eb2ebff574ef7de7218" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "num-complex" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" -dependencies = [ - "num-traits", -] - [[package]] name = "num-integer" version = "0.1.45" @@ -1409,17 +1315,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-rational" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-traits" version = "0.2.17" @@ -1427,7 +1322,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", - "libm", ] [[package]] @@ -1513,12 +1407,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1587,52 +1475,6 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rand_distr" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" -dependencies = [ - "num-traits", - "rand", -] - -[[package]] -name = "rawpointer" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" - [[package]] name = "rayon" version = "1.8.0" @@ -1802,15 +1644,6 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" -[[package]] -name = "safe_arch" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f398075ce1e6a179b46f51bd88d0598b92b00d3551f1a2d4ac49e771b56ac354" -dependencies = [ - "bytemuck", -] - [[package]] name = "same-file" version = "1.0.6" @@ -1960,19 +1793,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "simba" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0b7840f121a46d63066ee7a99fc81dcabbc6105e437cae43528cea199b5a05f" -dependencies = [ - "approx", - "num-complex", - "num-traits", - "paste", - "wide", -] - [[package]] name = "simdutf8" version = "0.1.4" @@ -2006,19 +1826,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "statrs" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d08e5e1748192713cc281da8b16924fb46be7b0c2431854eadc785823e5696e" -dependencies = [ - "approx", - "lazy_static", - "nalgebra", - "num-traits", - "rand", -] - [[package]] name = "strsim" version = "0.10.0" @@ -2351,29 +2158,6 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-downcast" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" -dependencies = [ - "js-sys", - "once_cell", - "wasm-bindgen", - "wasm-bindgen-downcast-macros", -] - -[[package]] -name = "wasm-bindgen-downcast-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "wasm-bindgen-macro" version = "0.2.89" @@ -2405,18 +2189,18 @@ checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" [[package]] name = "wasm-encoder" -version = "0.38.1" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad2b51884de9c7f4fe2fd1043fccb8dcad4b1e29558146ee57a144d15779f3f" +checksum = "1ba64e81215916eaeb48fee292f29401d69235d62d8b8fd92a7b2844ec5ae5f7" dependencies = [ "leb128", ] [[package]] name = "wasmer" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" +checksum = "ce45cc009177ca345a6d041f9062305ad467d15e7d41494f5b81ab46d62d7a58" dependencies = [ "bytes", "cfg-if 1.0.0", @@ -2431,7 +2215,6 @@ dependencies = [ "target-lexicon", "thiserror", "wasm-bindgen", - "wasm-bindgen-downcast", "wasmer-compiler", "wasmer-compiler-cranelift", "wasmer-derive", @@ -2443,9 +2226,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" +checksum = "e044f6140c844602b920deb4526aea3cc9c0d7cf23f00730bb9b2034669f522a" dependencies = [ "backtrace", "bytes", @@ -2470,9 +2253,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" +checksum = "32ce02358eb44a149d791c1d6648fb7f8b2f99cd55e3c4eef0474653ec8cc889" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -2489,9 +2272,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" +checksum = "c782d80401edb08e1eba206733f7859db6c997fc5a7f5fb44edc3ecd801468f6" dependencies = [ "proc-macro-error", "proc-macro2", @@ -2501,9 +2284,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" +checksum = "fd09e80d4d74bb9fd0ce6c3c106b1ceba1a050f9948db9d9b78ae53c172d6157" dependencies = [ "bytecheck", "enum-iterator", @@ -2517,9 +2300,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" +checksum = "bdcd8a4fd36414a7b6a003dbfbd32393bce3e155d715dd877c05c1b7a41d224d" dependencies = [ "backtrace", "cc", @@ -2534,7 +2317,7 @@ dependencies = [ "lazy_static", "libc", "mach", - "memoffset 0.8.0", + "memoffset", "more-asserts", "region", "scopeguard", @@ -2555,9 +2338,9 @@ dependencies = [ [[package]] name = "wast" -version = "69.0.1" +version = "64.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ee37317321afde358e4d7593745942c48d6d17e0e6e943704de9bbee121e7a" +checksum = "a259b226fd6910225aa7baeba82f9d9933b6d00f2ce1b49b80fa4214328237cc" dependencies = [ "leb128", "memchr", @@ -2567,23 +2350,13 @@ dependencies = [ [[package]] name = "wat" -version = "1.0.82" +version = "1.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aeb338ee8dee4d4cd05e6426683f21c5087dc7cfc8903e839ccf48d43332da3c" +checksum = "53253d920ab413fca1c7dc2161d601c79b4fdf631d0ba51dd4343bf9b556c3f6" dependencies = [ "wast", ] -[[package]] -name = "wide" -version = "0.7.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c68938b57b33da363195412cfc5fc37c9ed49aa9cfe2156fde64b8d2c9498242" -dependencies = [ - "bytemuck", - "safe_arch", -] - [[package]] name = "winapi" version = "0.3.9" diff --git a/bootstrap-languages/direct-message-language/hc-dna/zomes/direct-message-integrity/Cargo.toml b/bootstrap-languages/direct-message-language/hc-dna/zomes/direct-message-integrity/Cargo.toml index e035cae2e..c2d6ebe78 100644 --- a/bootstrap-languages/direct-message-language/hc-dna/zomes/direct-message-integrity/Cargo.toml +++ b/bootstrap-languages/direct-message-language/hc-dna/zomes/direct-message-integrity/Cargo.toml @@ -13,5 +13,5 @@ derive_more = "0" serde = "1" chrono = { version = "0.4.31", default-features = false, features = ["clock", "std", "oldtime", "serde"] } -hdi = { version = "0.4.0-beta-dev.18", git = "https://github.com/coasys/holochain.git", rev = "67ba54b961184ca9301698145f6256744356a879" } -holo_hash = { version = "0.3.0-beta-dev.14", git = "https://github.com/coasys/holochain.git", rev = "67ba54b961184ca9301698145f6256744356a879"} \ No newline at end of file +hdi = { version = "0.4.0-beta-dev.29" } +holo_hash = { version = "0.3.0-beta-dev.22"} \ No newline at end of file diff --git a/bootstrap-languages/direct-message-language/hc-dna/zomes/direct-message-integrity/src/lib.rs b/bootstrap-languages/direct-message-language/hc-dna/zomes/direct-message-integrity/src/lib.rs index fb7be8136..e0dd1071d 100644 --- a/bootstrap-languages/direct-message-language/hc-dna/zomes/direct-message-integrity/src/lib.rs +++ b/bootstrap-languages/direct-message-language/hc-dna/zomes/direct-message-integrity/src/lib.rs @@ -58,16 +58,16 @@ impl Recipient { } } -#[hdk_entry_defs] +#[hdk_entry_types] #[unit_enum(UnitEntryTypes)] pub enum EntryTypes { - #[entry_def(visibility = "private")] + #[entry_type(visibility = "private")] StatusUpdate(StatusUpdate), - #[entry_def(visibility = "private")] + #[entry_type(visibility = "private")] StoredMessage(StoredMessage), - #[entry_def(visibility = "public")] + #[entry_type(visibility = "public")] PublicMessage(PublicMessage), - #[entry_def(visibility = "private")] + #[entry_type(visibility = "private")] Recipient(Recipient), } diff --git a/bootstrap-languages/direct-message-language/hc-dna/zomes/direct-message/Cargo.toml b/bootstrap-languages/direct-message-language/hc-dna/zomes/direct-message/Cargo.toml index 0f8cb417a..9b80c1b74 100644 --- a/bootstrap-languages/direct-message-language/hc-dna/zomes/direct-message/Cargo.toml +++ b/bootstrap-languages/direct-message-language/hc-dna/zomes/direct-message/Cargo.toml @@ -15,7 +15,7 @@ serde_json = "1" chrono = { version = "0.4.31", default-features = false, features = ["clock", "std", "oldtime", "serde"] } hex = "0.4.3" -hdk = { version = "0.3.0-beta-dev.22", git = "https://github.com/coasys/holochain.git", rev = "67ba54b961184ca9301698145f6256744356a879"} -holo_hash = { version = "0.3.0-beta-dev.14", git = "https://github.com/coasys/holochain.git", rev = "67ba54b961184ca9301698145f6256744356a879"} +hdk = { version = "0.3.0-beta-dev.33" } +holo_hash = { version = "0.3.0-beta-dev.22"} direct-message-integrity = { path = "../direct-message-integrity" } \ No newline at end of file diff --git a/bootstrap-languages/direct-message-language/hc-dna/zomes/direct-message/src/lib.rs b/bootstrap-languages/direct-message-language/hc-dna/zomes/direct-message/src/lib.rs index 7cd843a6b..4ed72b46a 100644 --- a/bootstrap-languages/direct-message-language/hc-dna/zomes/direct-message/src/lib.rs +++ b/bootstrap-languages/direct-message-language/hc-dna/zomes/direct-message/src/lib.rs @@ -179,7 +179,7 @@ fn inbox(did_filter: Option) -> ExternResult> #[hdk_extern] pub fn send_p2p(message: PerspectiveExpression) -> ExternResult<()> { //debug!("SENDING MESSAGE..."); - remote_signal( + send_remote_signal( SerializedBytes::try_from(message) .map_err(|err| wasm_error!(WasmErrorInner::Host(err.to_string())))?, vec![recipient()?.0], @@ -215,6 +215,7 @@ pub fn fetch_inbox(_: ()) -> ExternResult<()> { ) .unwrap() .tag_prefix(LinkTag::new("message")) + .get_options(GetStrategy::Network) .build(); for link in get_links(input)? { @@ -223,7 +224,7 @@ pub fn fetch_inbox(_: ()) -> ExternResult<()> { link.target .into_entry_hash() .expect("Could not get entry hash"), - GetOptions::latest(), + GetOptions::network(), )? { //debug!("fetch_inbox link got"); let header_address = message_entry.action_address().clone(); diff --git a/bootstrap-languages/direct-message-language/package.json b/bootstrap-languages/direct-message-language/package.json index 220e1be21..d084cd77c 100644 --- a/bootstrap-languages/direct-message-language/package.json +++ b/bootstrap-languages/direct-message-language/package.json @@ -35,5 +35,5 @@ "dependencies": { "@types/node": "^18.0.0" }, - "version": "0.8.1" + "version": "0.9.0" } diff --git a/bootstrap-languages/file-storage/hc-dna/Cargo.lock b/bootstrap-languages/file-storage/hc-dna/Cargo.lock index e9bfe70b3..33c760d1a 100644 --- a/bootstrap-languages/file-storage/hc-dna/Cargo.lock +++ b/bootstrap-languages/file-storage/hc-dna/Cargo.lock @@ -52,15 +52,6 @@ dependencies = [ "libc", ] -[[package]] -name = "approx" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" -dependencies = [ - "num-traits", -] - [[package]] name = "arrayref" version = "0.3.7" @@ -196,12 +187,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "bytemuck" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" - [[package]] name = "byteorder" version = "1.5.0" @@ -423,7 +408,7 @@ dependencies = [ "autocfg", "cfg-if 1.0.0", "crossbeam-utils", - "memoffset 0.9.0", + "memoffset", "scopeguard", ] @@ -838,9 +823,11 @@ checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" [[package]] name = "hdi" -version = "0.4.0-beta-dev.18" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.4.0-beta-dev.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31dfc1fec80d7d9292e04e26e94528b0a0cc9baf982d1fb18e3af3e7625cb90" dependencies = [ + "getrandom", "hdk_derive", "holo_hash", "holochain_integrity_types", @@ -854,8 +841,9 @@ dependencies = [ [[package]] name = "hdk" -version = "0.3.0-beta-dev.22" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99a6ccefa8f3aa8cd8a0f7ab40f3939610133bd32a14785d4d62440f92ab6a11" dependencies = [ "getrandom", "hdi", @@ -873,8 +861,9 @@ dependencies = [ [[package]] name = "hdk_derive" -version = "0.3.0-beta-dev.17" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcfd466d96f2d19530b1419646b0a52c3bc833b0e7dacad4329cb90708db8665" dependencies = [ "darling 0.14.4", "heck", @@ -906,8 +895,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "holo_hash" -version = "0.3.0-beta-dev.14" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "050e53c0258e6235145fe949b74cedd48c24f4d92e1e7b7e39581a9a2b6996e7" dependencies = [ "base64", "blake2b_simd", @@ -923,8 +913,9 @@ dependencies = [ [[package]] name = "holochain_integrity_types" -version = "0.3.0-beta-dev.17" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a76306ea0c825e6bc8f040df4a3fe1ab82f187c108a91e81df957ae4f76efda" dependencies = [ "holo_hash", "holochain_secure_primitive", @@ -940,8 +931,9 @@ dependencies = [ [[package]] name = "holochain_nonce" -version = "0.3.0-beta-dev.22" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1fa99c5d38bb8fe463dd0284e2123ad14405f2a62146c4aaa809d5b24134711" dependencies = [ "getrandom", "holochain_secure_primitive", @@ -950,8 +942,9 @@ dependencies = [ [[package]] name = "holochain_secure_primitive" -version = "0.3.0-beta-dev.21" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcc25ba91f7898688245db538693d7b26504f91df24709111bb3b1d7506af01a" dependencies = [ "paste", "serde", @@ -985,8 +978,9 @@ dependencies = [ [[package]] name = "holochain_util" -version = "0.3.0-beta-dev.2" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14d6225aded80caf004c2214e38b39fb2459ee9a7a8fcd0d09146f49ae0771f0" dependencies = [ "cfg-if 0.1.10", "derive_more", @@ -999,9 +993,9 @@ dependencies = [ [[package]] name = "holochain_wasmer_common" -version = "0.0.86" +version = "0.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d90da174e7db13ecce8279052d6e7394a101a0bcf63a990404419ee7d7d06d1" +checksum = "72007fd2a72d77e76ffa494e5847bf6e893e25e73fe1d1de902e1b8d5033a64e" dependencies = [ "holochain_serialized_bytes", "serde", @@ -1013,9 +1007,9 @@ dependencies = [ [[package]] name = "holochain_wasmer_guest" -version = "0.0.86" +version = "0.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa28c28213791d36359d083d892371bdddf71148412e411ffbc748d048bfaa22" +checksum = "8c429e84a19ee446f47541a6fed10e1a4376a8a8ba6d3dbff7d07e4a7bb4c85f" dependencies = [ "holochain_serialized_bytes", "holochain_wasmer_common", @@ -1027,9 +1021,11 @@ dependencies = [ [[package]] name = "holochain_zome_types" -version = "0.3.0-beta-dev.18" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1d1b165dcf3d1ae412edf952b1ae4e57a5b5c4a97c11eb97b5fb4fdf06cc6a4" dependencies = [ + "derive_more", "holo_hash", "holochain_integrity_types", "holochain_nonce", @@ -1038,7 +1034,6 @@ dependencies = [ "holochain_wasmer_common", "kitsune_p2p_bin_data", "kitsune_p2p_block", - "kitsune_p2p_dht", "kitsune_p2p_timestamp", "paste", "serde", @@ -1173,8 +1168,9 @@ dependencies = [ [[package]] name = "kitsune_p2p_bin_data" -version = "0.3.0-beta-dev.10" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c89fb7f069f4a90794dff2669cc832a71c9fd93554e92b0f17de97d753283f4" dependencies = [ "base64", "derive_more", @@ -1187,38 +1183,20 @@ dependencies = [ [[package]] name = "kitsune_p2p_block" -version = "0.3.0-beta-dev.11" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a32470626b779dd5e36e516d64f8bdde1eac1faec944654d2b85f200b0ac3cee" dependencies = [ "kitsune_p2p_bin_data", "kitsune_p2p_timestamp", "serde", ] -[[package]] -name = "kitsune_p2p_dht" -version = "0.3.0-beta-dev.10" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" -dependencies = [ - "derivative", - "derive_more", - "futures", - "kitsune_p2p_dht_arc", - "kitsune_p2p_timestamp", - "must_future", - "num-traits", - "once_cell", - "rand", - "serde", - "statrs", - "thiserror", - "tracing", -] - [[package]] name = "kitsune_p2p_dht_arc" -version = "0.3.0-beta-dev.9" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaba5f7fcb2c0b7faa3f859a3de5c4b893fbf9cfea51530549d11e9738fbfac" dependencies = [ "derive_more", "gcollections", @@ -1230,8 +1208,9 @@ dependencies = [ [[package]] name = "kitsune_p2p_timestamp" -version = "0.3.0-beta-dev.5" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4d587124090ca8e4ab28f3dd3d65aa35fcc72403b7dad4fc790751efd04fbe3" dependencies = [ "chrono", "serde", @@ -1255,12 +1234,6 @@ version = "0.2.150" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" -[[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - [[package]] name = "lock_api" version = "0.4.11" @@ -1286,16 +1259,6 @@ dependencies = [ "libc", ] -[[package]] -name = "matrixmultiply" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2" -dependencies = [ - "autocfg", - "rawpointer", -] - [[package]] name = "memchr" version = "2.6.4" @@ -1320,15 +1283,6 @@ dependencies = [ "libc", ] -[[package]] -name = "memoffset" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" -dependencies = [ - "autocfg", -] - [[package]] name = "memoffset" version = "0.9.0" @@ -1353,54 +1307,6 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7843ec2de400bcbc6a6328c958dc38e5359da6e93e72e37bc5246bf1ae776389" -[[package]] -name = "must_future" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a160ffed3c2f98d2906c67a9b6e4e1f09cca7e17e3f780286a349061459eeebe" -dependencies = [ - "futures", - "pin-utils", -] - -[[package]] -name = "nalgebra" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d506eb7e08d6329505faa8a3a00a5dcc6de9f76e0c77e4b75763ae3c770831ff" -dependencies = [ - "approx", - "matrixmultiply", - "nalgebra-macros", - "num-complex", - "num-rational", - "num-traits", - "rand", - "rand_distr", - "simba", - "typenum", -] - -[[package]] -name = "nalgebra-macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01fcc0b8149b4632adc89ac3b7b31a12fb6099a0317a4eb2ebff574ef7de7218" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "num-complex" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" -dependencies = [ - "num-traits", -] - [[package]] name = "num-integer" version = "0.1.45" @@ -1411,17 +1317,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-rational" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-traits" version = "0.2.17" @@ -1429,7 +1324,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", - "libm", ] [[package]] @@ -1515,12 +1409,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1589,52 +1477,6 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rand_distr" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" -dependencies = [ - "num-traits", - "rand", -] - -[[package]] -name = "rawpointer" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" - [[package]] name = "rayon" version = "1.8.0" @@ -1804,15 +1646,6 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" -[[package]] -name = "safe_arch" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f398075ce1e6a179b46f51bd88d0598b92b00d3551f1a2d4ac49e771b56ac354" -dependencies = [ - "bytemuck", -] - [[package]] name = "same-file" version = "1.0.6" @@ -1973,19 +1806,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "simba" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0b7840f121a46d63066ee7a99fc81dcabbc6105e437cae43528cea199b5a05f" -dependencies = [ - "approx", - "num-complex", - "num-traits", - "paste", - "wide", -] - [[package]] name = "simdutf8" version = "0.1.4" @@ -2019,19 +1839,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "statrs" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d08e5e1748192713cc281da8b16924fb46be7b0c2431854eadc785823e5696e" -dependencies = [ - "approx", - "lazy_static", - "nalgebra", - "num-traits", - "rand", -] - [[package]] name = "strsim" version = "0.10.0" @@ -2364,29 +2171,6 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-downcast" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" -dependencies = [ - "js-sys", - "once_cell", - "wasm-bindgen", - "wasm-bindgen-downcast-macros", -] - -[[package]] -name = "wasm-bindgen-downcast-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "wasm-bindgen-macro" version = "0.2.89" @@ -2418,18 +2202,18 @@ checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" [[package]] name = "wasm-encoder" -version = "0.38.1" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad2b51884de9c7f4fe2fd1043fccb8dcad4b1e29558146ee57a144d15779f3f" +checksum = "1ba64e81215916eaeb48fee292f29401d69235d62d8b8fd92a7b2844ec5ae5f7" dependencies = [ "leb128", ] [[package]] name = "wasmer" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" +checksum = "ce45cc009177ca345a6d041f9062305ad467d15e7d41494f5b81ab46d62d7a58" dependencies = [ "bytes", "cfg-if 1.0.0", @@ -2444,7 +2228,6 @@ dependencies = [ "target-lexicon", "thiserror", "wasm-bindgen", - "wasm-bindgen-downcast", "wasmer-compiler", "wasmer-compiler-cranelift", "wasmer-derive", @@ -2456,9 +2239,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" +checksum = "e044f6140c844602b920deb4526aea3cc9c0d7cf23f00730bb9b2034669f522a" dependencies = [ "backtrace", "bytes", @@ -2483,9 +2266,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" +checksum = "32ce02358eb44a149d791c1d6648fb7f8b2f99cd55e3c4eef0474653ec8cc889" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -2502,9 +2285,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" +checksum = "c782d80401edb08e1eba206733f7859db6c997fc5a7f5fb44edc3ecd801468f6" dependencies = [ "proc-macro-error", "proc-macro2", @@ -2514,9 +2297,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" +checksum = "fd09e80d4d74bb9fd0ce6c3c106b1ceba1a050f9948db9d9b78ae53c172d6157" dependencies = [ "bytecheck", "enum-iterator", @@ -2530,9 +2313,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" +checksum = "bdcd8a4fd36414a7b6a003dbfbd32393bce3e155d715dd877c05c1b7a41d224d" dependencies = [ "backtrace", "cc", @@ -2547,7 +2330,7 @@ dependencies = [ "lazy_static", "libc", "mach", - "memoffset 0.8.0", + "memoffset", "more-asserts", "region", "scopeguard", @@ -2568,9 +2351,9 @@ dependencies = [ [[package]] name = "wast" -version = "69.0.1" +version = "64.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ee37317321afde358e4d7593745942c48d6d17e0e6e943704de9bbee121e7a" +checksum = "a259b226fd6910225aa7baeba82f9d9933b6d00f2ce1b49b80fa4214328237cc" dependencies = [ "leb128", "memchr", @@ -2580,23 +2363,13 @@ dependencies = [ [[package]] name = "wat" -version = "1.0.82" +version = "1.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aeb338ee8dee4d4cd05e6426683f21c5087dc7cfc8903e839ccf48d43332da3c" +checksum = "53253d920ab413fca1c7dc2161d601c79b4fdf631d0ba51dd4343bf9b556c3f6" dependencies = [ "wast", ] -[[package]] -name = "wide" -version = "0.7.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c68938b57b33da363195412cfc5fc37c9ed49aa9cfe2156fde64b8d2c9498242" -dependencies = [ - "bytemuck", - "safe_arch", -] - [[package]] name = "winapi" version = "0.3.9" diff --git a/bootstrap-languages/file-storage/hc-dna/zomes/file_storage/Cargo.toml b/bootstrap-languages/file-storage/hc-dna/zomes/file_storage/Cargo.toml index e9f710879..5bde8d81d 100644 --- a/bootstrap-languages/file-storage/hc-dna/zomes/file_storage/Cargo.toml +++ b/bootstrap-languages/file-storage/hc-dna/zomes/file_storage/Cargo.toml @@ -17,5 +17,5 @@ chrono = { version = "0.4.31", default-features = false, features = ["clock", "s thiserror = "1.0.20" integrity = { path = "../integrity" } sha2 = "0.10.5" -hdk = { version = "0.3.0-beta-dev.22", git = "https://github.com/coasys/holochain.git", rev = "67ba54b961184ca9301698145f6256744356a879"} -holo_hash = { version = "0.3.0-beta-dev.14", git = "https://github.com/coasys/holochain.git", rev = "67ba54b961184ca9301698145f6256744356a879"} \ No newline at end of file +hdk = { version = "0.3.0-beta-dev.33" } +holo_hash = { version = "0.3.0-beta-dev.22"} \ No newline at end of file diff --git a/bootstrap-languages/file-storage/hc-dna/zomes/integrity/Cargo.toml b/bootstrap-languages/file-storage/hc-dna/zomes/integrity/Cargo.toml index f1baadfe2..e6691f48d 100644 --- a/bootstrap-languages/file-storage/hc-dna/zomes/integrity/Cargo.toml +++ b/bootstrap-languages/file-storage/hc-dna/zomes/integrity/Cargo.toml @@ -13,6 +13,6 @@ name = "integrity" derive_more = "0" serde = "1" chrono = { version = "0.4.31", default-features = false, features = ["clock", "std", "oldtime", "serde"] } -holo_hash = { version = "0.3.0-beta-dev.14", git = "https://github.com/coasys/holochain.git", rev = "67ba54b961184ca9301698145f6256744356a879"} -hdi = { version = "0.4.0-beta-dev.18", git = "https://github.com/coasys/holochain.git", rev = "67ba54b961184ca9301698145f6256744356a879" } -hdk = { version = "0.3.0-beta-dev.22", git = "https://github.com/coasys/holochain.git", rev = "67ba54b961184ca9301698145f6256744356a879"} +holo_hash = { version = "0.3.0-beta-dev.22"} +hdi = { version = "0.4.0-beta-dev.29" } +hdk = { version = "0.3.0-beta-dev.33" } diff --git a/bootstrap-languages/file-storage/hc-dna/zomes/integrity/src/lib.rs b/bootstrap-languages/file-storage/hc-dna/zomes/integrity/src/lib.rs index 19c42d131..c823923f3 100644 --- a/bootstrap-languages/file-storage/hc-dna/zomes/integrity/src/lib.rs +++ b/bootstrap-languages/file-storage/hc-dna/zomes/integrity/src/lib.rs @@ -27,12 +27,12 @@ pub struct FileExpression { pub data: FileMetadata, } -#[hdk_entry_defs] +#[hdk_entry_types] #[unit_enum(UnitEntryTypes)] pub enum EntryTypes { - #[entry_def(visibility = "public")] + #[entry_type(visibility = "public")] FileExpression(FileExpression), - #[entry_def(visibility = "public")] + #[entry_type(visibility = "public")] FileChunk(FileChunk), } diff --git a/bootstrap-languages/file-storage/putAdapter.ts b/bootstrap-languages/file-storage/putAdapter.ts index ec6c49d21..6adde0e1e 100644 --- a/bootstrap-languages/file-storage/putAdapter.ts +++ b/bootstrap-languages/file-storage/putAdapter.ts @@ -51,7 +51,20 @@ export class FileStoragePutAdapter implements PublicSharing { const expression: FileExpression = this.#agent.createSignedExpression(fileMetadata) //Remove the data_base64 from the expression, since this is already stored above delete expression.data.data_base64; - + expression.data.chunks_hashes = expression.data.chunks_hashes.map((chunk: { [key: string]: number }) => { + // Create an array of the correct size filled with zeros + const byteArray = new Uint8Array(Object.keys(chunk).length); + + // Iterate over the keys of the chunk object + for (const key in chunk) { + // Convert the key to an integer index and assign the value to the byteArray + const index = parseInt(key, 10); + byteArray[index] = chunk[key]; + } + + return byteArray; + }); + //Store the FileMetadataExpression let address = await storage.storeFileExpression(expression) if (!Buffer.isBuffer(address)) { diff --git a/bootstrap-languages/neighbourhood-language/package.json b/bootstrap-languages/neighbourhood-language/package.json index 5a3f29ccb..c03c388d2 100644 --- a/bootstrap-languages/neighbourhood-language/package.json +++ b/bootstrap-languages/neighbourhood-language/package.json @@ -8,5 +8,5 @@ }, "author": "joshuadparkin@gmail.com", "license": "ISC", - "version": "0.8.1" + "version": "0.9.0" } diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/Cargo.lock b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/Cargo.lock index 4b76c3cce..af9a603eb 100644 --- a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/Cargo.lock +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/Cargo.lock @@ -52,15 +52,6 @@ dependencies = [ "libc", ] -[[package]] -name = "approx" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" -dependencies = [ - "num-traits", -] - [[package]] name = "arrayref" version = "0.3.7" @@ -202,12 +193,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "bytemuck" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" - [[package]] name = "byteorder" version = "1.5.0" @@ -429,7 +414,7 @@ dependencies = [ "autocfg", "cfg-if 1.0.0", "crossbeam-utils", - "memoffset 0.9.0", + "memoffset", "scopeguard", ] @@ -891,9 +876,11 @@ checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" [[package]] name = "hdi" -version = "0.4.0-beta-dev.18" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.4.0-beta-dev.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31dfc1fec80d7d9292e04e26e94528b0a0cc9baf982d1fb18e3af3e7625cb90" dependencies = [ + "getrandom", "hdk_derive", "holo_hash", "holochain_integrity_types", @@ -907,8 +894,9 @@ dependencies = [ [[package]] name = "hdk" -version = "0.3.0-beta-dev.22" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99a6ccefa8f3aa8cd8a0f7ab40f3939610133bd32a14785d4d62440f92ab6a11" dependencies = [ "getrandom", "hdi", @@ -926,8 +914,9 @@ dependencies = [ [[package]] name = "hdk_derive" -version = "0.3.0-beta-dev.17" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcfd466d96f2d19530b1419646b0a52c3bc833b0e7dacad4329cb90708db8665" dependencies = [ "darling 0.14.4", "heck", @@ -959,8 +948,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "holo_hash" -version = "0.3.0-beta-dev.14" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "050e53c0258e6235145fe949b74cedd48c24f4d92e1e7b7e39581a9a2b6996e7" dependencies = [ "base64", "blake2b_simd", @@ -976,8 +966,9 @@ dependencies = [ [[package]] name = "holochain_integrity_types" -version = "0.3.0-beta-dev.17" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a76306ea0c825e6bc8f040df4a3fe1ab82f187c108a91e81df957ae4f76efda" dependencies = [ "holo_hash", "holochain_secure_primitive", @@ -993,8 +984,9 @@ dependencies = [ [[package]] name = "holochain_nonce" -version = "0.3.0-beta-dev.22" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1fa99c5d38bb8fe463dd0284e2123ad14405f2a62146c4aaa809d5b24134711" dependencies = [ "getrandom", "holochain_secure_primitive", @@ -1003,8 +995,9 @@ dependencies = [ [[package]] name = "holochain_secure_primitive" -version = "0.3.0-beta-dev.21" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcc25ba91f7898688245db538693d7b26504f91df24709111bb3b1d7506af01a" dependencies = [ "paste", "serde", @@ -1038,8 +1031,9 @@ dependencies = [ [[package]] name = "holochain_util" -version = "0.3.0-beta-dev.2" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14d6225aded80caf004c2214e38b39fb2459ee9a7a8fcd0d09146f49ae0771f0" dependencies = [ "cfg-if 0.1.10", "derive_more", @@ -1052,9 +1046,9 @@ dependencies = [ [[package]] name = "holochain_wasmer_common" -version = "0.0.86" +version = "0.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d90da174e7db13ecce8279052d6e7394a101a0bcf63a990404419ee7d7d06d1" +checksum = "72007fd2a72d77e76ffa494e5847bf6e893e25e73fe1d1de902e1b8d5033a64e" dependencies = [ "holochain_serialized_bytes", "serde", @@ -1066,9 +1060,9 @@ dependencies = [ [[package]] name = "holochain_wasmer_guest" -version = "0.0.86" +version = "0.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa28c28213791d36359d083d892371bdddf71148412e411ffbc748d048bfaa22" +checksum = "8c429e84a19ee446f47541a6fed10e1a4376a8a8ba6d3dbff7d07e4a7bb4c85f" dependencies = [ "holochain_serialized_bytes", "holochain_wasmer_common", @@ -1080,9 +1074,11 @@ dependencies = [ [[package]] name = "holochain_zome_types" -version = "0.3.0-beta-dev.18" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1d1b165dcf3d1ae412edf952b1ae4e57a5b5c4a97c11eb97b5fb4fdf06cc6a4" dependencies = [ + "derive_more", "holo_hash", "holochain_integrity_types", "holochain_nonce", @@ -1091,7 +1087,6 @@ dependencies = [ "holochain_wasmer_common", "kitsune_p2p_bin_data", "kitsune_p2p_block", - "kitsune_p2p_dht", "kitsune_p2p_timestamp", "paste", "serde", @@ -1245,8 +1240,9 @@ dependencies = [ [[package]] name = "kitsune_p2p_bin_data" -version = "0.3.0-beta-dev.10" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c89fb7f069f4a90794dff2669cc832a71c9fd93554e92b0f17de97d753283f4" dependencies = [ "base64", "derive_more", @@ -1259,38 +1255,20 @@ dependencies = [ [[package]] name = "kitsune_p2p_block" -version = "0.3.0-beta-dev.11" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a32470626b779dd5e36e516d64f8bdde1eac1faec944654d2b85f200b0ac3cee" dependencies = [ "kitsune_p2p_bin_data", "kitsune_p2p_timestamp", "serde", ] -[[package]] -name = "kitsune_p2p_dht" -version = "0.3.0-beta-dev.10" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" -dependencies = [ - "derivative", - "derive_more", - "futures", - "kitsune_p2p_dht_arc", - "kitsune_p2p_timestamp", - "must_future", - "num-traits", - "once_cell", - "rand", - "serde", - "statrs", - "thiserror", - "tracing", -] - [[package]] name = "kitsune_p2p_dht_arc" -version = "0.3.0-beta-dev.9" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaba5f7fcb2c0b7faa3f859a3de5c4b893fbf9cfea51530549d11e9738fbfac" dependencies = [ "derive_more", "gcollections", @@ -1302,8 +1280,9 @@ dependencies = [ [[package]] name = "kitsune_p2p_timestamp" -version = "0.3.0-beta-dev.5" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4d587124090ca8e4ab28f3dd3d65aa35fcc72403b7dad4fc790751efd04fbe3" dependencies = [ "chrono", "serde", @@ -1327,12 +1306,6 @@ version = "0.2.150" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" -[[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - [[package]] name = "linux-raw-sys" version = "0.4.12" @@ -1370,16 +1343,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" -[[package]] -name = "matrixmultiply" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2" -dependencies = [ - "autocfg", - "rawpointer", -] - [[package]] name = "memchr" version = "2.6.4" @@ -1404,15 +1367,6 @@ dependencies = [ "libc", ] -[[package]] -name = "memoffset" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" -dependencies = [ - "autocfg", -] - [[package]] name = "memoffset" version = "0.9.0" @@ -1437,54 +1391,6 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7843ec2de400bcbc6a6328c958dc38e5359da6e93e72e37bc5246bf1ae776389" -[[package]] -name = "must_future" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a160ffed3c2f98d2906c67a9b6e4e1f09cca7e17e3f780286a349061459eeebe" -dependencies = [ - "futures", - "pin-utils", -] - -[[package]] -name = "nalgebra" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d506eb7e08d6329505faa8a3a00a5dcc6de9f76e0c77e4b75763ae3c770831ff" -dependencies = [ - "approx", - "matrixmultiply", - "nalgebra-macros", - "num-complex", - "num-rational", - "num-traits", - "rand", - "rand_distr", - "simba", - "typenum", -] - -[[package]] -name = "nalgebra-macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01fcc0b8149b4632adc89ac3b7b31a12fb6099a0317a4eb2ebff574ef7de7218" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "num-complex" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" -dependencies = [ - "num-traits", -] - [[package]] name = "num-integer" version = "0.1.45" @@ -1495,17 +1401,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-rational" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-traits" version = "0.2.17" @@ -1513,7 +1408,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", - "libm", ] [[package]] @@ -1779,22 +1673,6 @@ dependencies = [ "getrandom", ] -[[package]] -name = "rand_distr" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" -dependencies = [ - "num-traits", - "rand", -] - -[[package]] -name = "rawpointer" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" - [[package]] name = "rayon" version = "1.8.0" @@ -1977,15 +1855,6 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" -[[package]] -name = "safe_arch" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f398075ce1e6a179b46f51bd88d0598b92b00d3551f1a2d4ac49e771b56ac354" -dependencies = [ - "bytemuck", -] - [[package]] name = "same-file" version = "1.0.6" @@ -2146,19 +2015,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "simba" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0b7840f121a46d63066ee7a99fc81dcabbc6105e437cae43528cea199b5a05f" -dependencies = [ - "approx", - "num-complex", - "num-traits", - "paste", - "wide", -] - [[package]] name = "simdutf8" version = "0.1.4" @@ -2192,19 +2048,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "statrs" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d08e5e1748192713cc281da8b16924fb46be7b0c2431854eadc785823e5696e" -dependencies = [ - "approx", - "lazy_static", - "nalgebra", - "num-traits", - "rand", -] - [[package]] name = "strsim" version = "0.10.0" @@ -2550,29 +2393,6 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-downcast" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" -dependencies = [ - "js-sys", - "once_cell", - "wasm-bindgen", - "wasm-bindgen-downcast-macros", -] - -[[package]] -name = "wasm-bindgen-downcast-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "wasm-bindgen-macro" version = "0.2.89" @@ -2604,18 +2424,18 @@ checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" [[package]] name = "wasm-encoder" -version = "0.38.1" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad2b51884de9c7f4fe2fd1043fccb8dcad4b1e29558146ee57a144d15779f3f" +checksum = "1ba64e81215916eaeb48fee292f29401d69235d62d8b8fd92a7b2844ec5ae5f7" dependencies = [ "leb128", ] [[package]] name = "wasmer" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" +checksum = "ce45cc009177ca345a6d041f9062305ad467d15e7d41494f5b81ab46d62d7a58" dependencies = [ "bytes", "cfg-if 1.0.0", @@ -2630,7 +2450,6 @@ dependencies = [ "target-lexicon", "thiserror", "wasm-bindgen", - "wasm-bindgen-downcast", "wasmer-compiler", "wasmer-compiler-cranelift", "wasmer-derive", @@ -2642,9 +2461,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" +checksum = "e044f6140c844602b920deb4526aea3cc9c0d7cf23f00730bb9b2034669f522a" dependencies = [ "backtrace", "bytes", @@ -2669,9 +2488,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" +checksum = "32ce02358eb44a149d791c1d6648fb7f8b2f99cd55e3c4eef0474653ec8cc889" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -2688,9 +2507,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" +checksum = "c782d80401edb08e1eba206733f7859db6c997fc5a7f5fb44edc3ecd801468f6" dependencies = [ "proc-macro-error", "proc-macro2", @@ -2700,9 +2519,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" +checksum = "fd09e80d4d74bb9fd0ce6c3c106b1ceba1a050f9948db9d9b78ae53c172d6157" dependencies = [ "bytecheck", "enum-iterator", @@ -2716,9 +2535,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" +checksum = "bdcd8a4fd36414a7b6a003dbfbd32393bce3e155d715dd877c05c1b7a41d224d" dependencies = [ "backtrace", "cc", @@ -2733,7 +2552,7 @@ dependencies = [ "lazy_static", "libc", "mach", - "memoffset 0.8.0", + "memoffset", "more-asserts", "region", "scopeguard", @@ -2754,9 +2573,9 @@ dependencies = [ [[package]] name = "wast" -version = "69.0.1" +version = "64.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ee37317321afde358e4d7593745942c48d6d17e0e6e943704de9bbee121e7a" +checksum = "a259b226fd6910225aa7baeba82f9d9933b6d00f2ce1b49b80fa4214328237cc" dependencies = [ "leb128", "memchr", @@ -2766,23 +2585,13 @@ dependencies = [ [[package]] name = "wat" -version = "1.0.82" +version = "1.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aeb338ee8dee4d4cd05e6426683f21c5087dc7cfc8903e839ccf48d43332da3c" +checksum = "53253d920ab413fca1c7dc2161d601c79b4fdf631d0ba51dd4343bf9b556c3f6" dependencies = [ "wast", ] -[[package]] -name = "wide" -version = "0.7.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c68938b57b33da363195412cfc5fc37c9ed49aa9cfe2156fde64b8d2c9498242" -dependencies = [ - "bytemuck", - "safe_arch", -] - [[package]] name = "winapi" version = "0.3.9" diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/Cargo.toml b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/Cargo.toml index 8fe776ca4..d0d28ca48 100644 --- a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/Cargo.toml +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/Cargo.toml @@ -21,8 +21,8 @@ dot-structures = "0.1.0" itertools = "0.10.3" perspective_diff_sync_integrity = { path = "../perspective_diff_sync_integrity" } sha2 = "0.10.5" -hdk = { version = "0.3.0-beta-dev.22", git = "https://github.com/coasys/holochain.git", rev = "67ba54b961184ca9301698145f6256744356a879"} -holo_hash = { version = "0.3.0-beta-dev.14", git = "https://github.com/coasys/holochain.git", rev = "67ba54b961184ca9301698145f6256744356a879"} +hdk = { version = "0.3.0-beta-dev.33" } +holo_hash = { version = "0.3.0-beta-dev.22"} [features] test = [] \ No newline at end of file diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/commit.rs b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/commit.rs index 6dd6f9392..e877d2611 100644 --- a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/commit.rs +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/commit.rs @@ -146,7 +146,7 @@ pub fn broadcast_current() -> SocialContext let recent_agents = get_active_agents()?; //debug!("Recent agents: {:#?}", recent_agents); - remote_signal(signal_data.get_sb()?, recent_agents.clone())?; + send_remote_signal(signal_data.get_sb()?, recent_agents.clone())?; }; Ok(current.map(|rev| rev.hash)) } diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/snapshots.rs b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/snapshots.rs index d8a053b98..ee5464349 100644 --- a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/snapshots.rs +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/snapshots.rs @@ -30,7 +30,7 @@ pub fn generate_snapshot( let mut all_removals = BTreeSet::new(); loop { - let diff = get(search_position.hash.clone(), GetOptions::latest())? + let diff = get(search_position.hash.clone(), GetOptions::network())? .ok_or(SocialContextError::InternalError( "generate_snapshot(): Could not find entry while populating search", ))? @@ -47,6 +47,7 @@ pub fn generate_snapshot( ) .unwrap() .tag_prefix(LinkTag::new("snapshot")) + .get_options(GetStrategy::Network) .build(); let mut snapshot_links = get_links(input)?; let after = get_now()?.time(); @@ -73,7 +74,7 @@ pub fn generate_snapshot( .target .into_entry_hash() .expect("Could not get entry_hash"), - GetOptions::latest(), + GetOptions::network(), )? .ok_or(SocialContextError::InternalError( "Could not find diff entry for given diff entry reference", @@ -146,7 +147,7 @@ fn handle_parents( //Check if entry is already in graph if !seen.contains(&search_position.hash) { seen.insert(search_position.hash.clone()); - let diff_entry = get(diff.diff.clone(), GetOptions::latest())? + let diff_entry = get(diff.diff.clone(), GetOptions::network())? .ok_or(SocialContextError::InternalError( "Could not find diff entry for given diff entry reference", ))? diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/workspace.rs b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/workspace.rs index 2a8c4ad0f..f5d8699dc 100644 --- a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/workspace.rs +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/workspace.rs @@ -660,6 +660,7 @@ impl Workspace { ) .unwrap() .tag_prefix(LinkTag::new("snapshot")) + .get_options(GetStrategy::Network) .build(); let mut snapshot_links = get_links(input)?; @@ -670,7 +671,7 @@ impl Workspace { .target .into_entry_hash() .expect("Could not get entry hash"), - GetOptions::latest(), + GetOptions::network(), )? .ok_or(SocialContextError::InternalError( "Workspace::get_snapshot: Could not find entry while populating search", @@ -796,7 +797,7 @@ impl Workspace { // base_found = true; // } // } else { - // let diff_entry = get(current.1.diff.clone(), GetOptions::latest())? + // let diff_entry = get(current.1.diff.clone(), GetOptions::network())? // .ok_or(SocialContextError::InternalError( // "Could not find diff entry for given diff entry reference", // ))? @@ -999,7 +1000,7 @@ mod tests { 12 -> 6 [ label = \"()\" ] 13 -> 12 [ label = \"()\" ] - + }", ) .unwrap(); @@ -1104,12 +1105,12 @@ mod tests { 4 [ label = "4" ] 5 [ label = "5" ] - 1 -> 0 - 2 -> 1 - 3 -> 2 - 4 -> 3 + 1 -> 0 + 2 -> 1 + 3 -> 2 + 4 -> 3 5 -> 4 - + 6 7 8 @@ -1122,7 +1123,7 @@ mod tests { 10 -> 9 8 -> 0 - + }"#, ) .unwrap(); @@ -1176,12 +1177,12 @@ mod tests { 4 [ label = "4" ] 5 [ label = "5" ] - 1 -> 0 - 2 -> 1 - 3 -> 2 - 4 -> 3 + 1 -> 0 + 2 -> 1 + 3 -> 2 + 4 -> 3 5 -> 4 - + 6 7 8 @@ -1244,11 +1245,11 @@ mod tests { 2 [ label = "2" ] 3 [ label = "3" ] - 1 -> 0 - 2 -> 0 - 3 -> 1 + 1 -> 0 + 2 -> 0 + 3 -> 1 3 -> 2 - + }"#, ) .unwrap(); diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/retriever/holochain.rs b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/retriever/holochain.rs index 83cef098d..f9185b7ee 100644 --- a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/retriever/holochain.rs +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/retriever/holochain.rs @@ -18,7 +18,7 @@ impl PerspectiveDiffRetreiver for HolochainRetreiver { where T: TryFrom, { - get(hash, GetOptions::latest())? + get(hash, GetOptions::network())? .ok_or(SocialContextError::InternalError( "HolochainRetreiver: Could not find entry", ))? @@ -33,7 +33,7 @@ impl PerspectiveDiffRetreiver for HolochainRetreiver { where T: TryFrom, { - let element = get(hash, GetOptions::latest())?; + let element = get(hash, GetOptions::network())?; let element = element.ok_or(SocialContextError::InternalError( "HolochainRetreiver: Could not find entry", ))?; @@ -105,6 +105,7 @@ impl PerspectiveDiffRetreiver for HolochainRetreiver { LinkTypes::Index ) .unwrap() + .get_options(GetStrategy::Network) .build(); let mut latest_revision_links = get_links(input)?; @@ -175,6 +176,7 @@ pub fn get_active_agents() -> SocialContextResult> { ) .unwrap() .tag_prefix(LinkTag::new("active_agent")) + .get_options(GetStrategy::Network) .build(); let recent_agents = get_links(input)?; diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/telepresence/signal.rs b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/telepresence/signal.rs index 3fa833b36..e7d616970 100644 --- a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/telepresence/signal.rs +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/telepresence/signal.rs @@ -12,7 +12,7 @@ pub fn send_signal(signal_data: SignalData) -> SocialContextResult remote_signal(signal_data.payload.clone().get_sb()?, vec![agent])?, + Some(agent) => send_remote_signal(signal_data.payload.clone().get_sb()?, vec![agent])?, None => { debug!("PerspectiveDiffSync.send_signal(): Could not send signal since we could not get the agents pub key from did"); } @@ -24,7 +24,7 @@ pub fn send_broadcast(data: PerspectiveExpression) -> SocialContextResult SocialContextResult<()> { debug!("PerspectiveDiffSync.create_did_pub_key_link({:?})", did); let agent_key = agent_info()?.agent_latest_pubkey; debug!("PerspectiveDiffSync.create_did_pub_key_link() agent_key: {:?}", agent_key); - let input = GetLinksInputBuilder::try_new(agent_key.clone(), LinkTypes::DidLink).unwrap().build(); + let input = GetLinksInputBuilder::try_new(agent_key.clone(), LinkTypes::DidLink).unwrap().get_options(GetStrategy::Network).build(); let did_links = get_links(input)?; debug!("PerspectiveDiffSync.create_did_pub_key_link() did_links: {:?}", did_links); if did_links.len() == 0 { @@ -94,6 +94,7 @@ pub fn get_my_did() -> SocialContextResult> { LinkTypes::DidLink ) .unwrap() + .get_options(GetStrategy::Network) .build(); let mut did_links = get_links(input)?; if did_links.len() > 0 { @@ -103,7 +104,7 @@ pub fn get_my_did() -> SocialContextResult> { .target .into_entry_hash() .expect("Could not get entry_hash"), - GetOptions::latest(), + GetOptions::network(), )? .ok_or(SocialContextError::InternalError( "Could not find did entry for given did entry reference", @@ -127,6 +128,7 @@ pub fn get_dids_agent_key(did: String) -> SocialContextResult SocialContextResult 0 { @@ -153,7 +156,7 @@ pub fn get_agents_did_key(agent: AgentPubKey) -> SocialContextResult>, } -#[hdk_entry_defs] +#[hdk_entry_types] #[unit_enum(UnitEntryTypes)] pub enum EntryTypes { - #[entry_def(visibility = "public")] + #[entry_type(visibility = "public")] PerspectiveDiff(PerspectiveDiff), - #[entry_def(visibility = "public")] + #[entry_type(visibility = "public")] Snapshot(Snapshot), - #[entry_def(visibility = "public")] + #[entry_type(visibility = "public")] HashReference(HashReference), - #[entry_def(visibility = "public")] + #[entry_type(visibility = "public")] PerspectiveDiffEntryReference(PerspectiveDiffEntryReference), - #[entry_def(visibility = "private")] + #[entry_type(visibility = "private")] LocalHashReference(LocalHashReference), - #[entry_def(visibility = "private")] + #[entry_type(visibility = "private")] LocalTimestampReference(LocalTimestampReference), - #[entry_def(visibility = "public")] + #[entry_type(visibility = "public")] Anchor(Anchor), - #[entry_def(visibility = "private")] + #[entry_type(visibility = "private")] PrivateOnlineStatus(PerspectiveExpression), } diff --git a/bootstrap-languages/p-diff-sync/hc-dna/Cargo.lock b/bootstrap-languages/p-diff-sync/hc-dna/Cargo.lock index 4b76c3cce..af9a603eb 100644 --- a/bootstrap-languages/p-diff-sync/hc-dna/Cargo.lock +++ b/bootstrap-languages/p-diff-sync/hc-dna/Cargo.lock @@ -52,15 +52,6 @@ dependencies = [ "libc", ] -[[package]] -name = "approx" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" -dependencies = [ - "num-traits", -] - [[package]] name = "arrayref" version = "0.3.7" @@ -202,12 +193,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "bytemuck" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" - [[package]] name = "byteorder" version = "1.5.0" @@ -429,7 +414,7 @@ dependencies = [ "autocfg", "cfg-if 1.0.0", "crossbeam-utils", - "memoffset 0.9.0", + "memoffset", "scopeguard", ] @@ -891,9 +876,11 @@ checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" [[package]] name = "hdi" -version = "0.4.0-beta-dev.18" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.4.0-beta-dev.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31dfc1fec80d7d9292e04e26e94528b0a0cc9baf982d1fb18e3af3e7625cb90" dependencies = [ + "getrandom", "hdk_derive", "holo_hash", "holochain_integrity_types", @@ -907,8 +894,9 @@ dependencies = [ [[package]] name = "hdk" -version = "0.3.0-beta-dev.22" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99a6ccefa8f3aa8cd8a0f7ab40f3939610133bd32a14785d4d62440f92ab6a11" dependencies = [ "getrandom", "hdi", @@ -926,8 +914,9 @@ dependencies = [ [[package]] name = "hdk_derive" -version = "0.3.0-beta-dev.17" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcfd466d96f2d19530b1419646b0a52c3bc833b0e7dacad4329cb90708db8665" dependencies = [ "darling 0.14.4", "heck", @@ -959,8 +948,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "holo_hash" -version = "0.3.0-beta-dev.14" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "050e53c0258e6235145fe949b74cedd48c24f4d92e1e7b7e39581a9a2b6996e7" dependencies = [ "base64", "blake2b_simd", @@ -976,8 +966,9 @@ dependencies = [ [[package]] name = "holochain_integrity_types" -version = "0.3.0-beta-dev.17" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a76306ea0c825e6bc8f040df4a3fe1ab82f187c108a91e81df957ae4f76efda" dependencies = [ "holo_hash", "holochain_secure_primitive", @@ -993,8 +984,9 @@ dependencies = [ [[package]] name = "holochain_nonce" -version = "0.3.0-beta-dev.22" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1fa99c5d38bb8fe463dd0284e2123ad14405f2a62146c4aaa809d5b24134711" dependencies = [ "getrandom", "holochain_secure_primitive", @@ -1003,8 +995,9 @@ dependencies = [ [[package]] name = "holochain_secure_primitive" -version = "0.3.0-beta-dev.21" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcc25ba91f7898688245db538693d7b26504f91df24709111bb3b1d7506af01a" dependencies = [ "paste", "serde", @@ -1038,8 +1031,9 @@ dependencies = [ [[package]] name = "holochain_util" -version = "0.3.0-beta-dev.2" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14d6225aded80caf004c2214e38b39fb2459ee9a7a8fcd0d09146f49ae0771f0" dependencies = [ "cfg-if 0.1.10", "derive_more", @@ -1052,9 +1046,9 @@ dependencies = [ [[package]] name = "holochain_wasmer_common" -version = "0.0.86" +version = "0.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d90da174e7db13ecce8279052d6e7394a101a0bcf63a990404419ee7d7d06d1" +checksum = "72007fd2a72d77e76ffa494e5847bf6e893e25e73fe1d1de902e1b8d5033a64e" dependencies = [ "holochain_serialized_bytes", "serde", @@ -1066,9 +1060,9 @@ dependencies = [ [[package]] name = "holochain_wasmer_guest" -version = "0.0.86" +version = "0.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa28c28213791d36359d083d892371bdddf71148412e411ffbc748d048bfaa22" +checksum = "8c429e84a19ee446f47541a6fed10e1a4376a8a8ba6d3dbff7d07e4a7bb4c85f" dependencies = [ "holochain_serialized_bytes", "holochain_wasmer_common", @@ -1080,9 +1074,11 @@ dependencies = [ [[package]] name = "holochain_zome_types" -version = "0.3.0-beta-dev.18" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1d1b165dcf3d1ae412edf952b1ae4e57a5b5c4a97c11eb97b5fb4fdf06cc6a4" dependencies = [ + "derive_more", "holo_hash", "holochain_integrity_types", "holochain_nonce", @@ -1091,7 +1087,6 @@ dependencies = [ "holochain_wasmer_common", "kitsune_p2p_bin_data", "kitsune_p2p_block", - "kitsune_p2p_dht", "kitsune_p2p_timestamp", "paste", "serde", @@ -1245,8 +1240,9 @@ dependencies = [ [[package]] name = "kitsune_p2p_bin_data" -version = "0.3.0-beta-dev.10" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c89fb7f069f4a90794dff2669cc832a71c9fd93554e92b0f17de97d753283f4" dependencies = [ "base64", "derive_more", @@ -1259,38 +1255,20 @@ dependencies = [ [[package]] name = "kitsune_p2p_block" -version = "0.3.0-beta-dev.11" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a32470626b779dd5e36e516d64f8bdde1eac1faec944654d2b85f200b0ac3cee" dependencies = [ "kitsune_p2p_bin_data", "kitsune_p2p_timestamp", "serde", ] -[[package]] -name = "kitsune_p2p_dht" -version = "0.3.0-beta-dev.10" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" -dependencies = [ - "derivative", - "derive_more", - "futures", - "kitsune_p2p_dht_arc", - "kitsune_p2p_timestamp", - "must_future", - "num-traits", - "once_cell", - "rand", - "serde", - "statrs", - "thiserror", - "tracing", -] - [[package]] name = "kitsune_p2p_dht_arc" -version = "0.3.0-beta-dev.9" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaba5f7fcb2c0b7faa3f859a3de5c4b893fbf9cfea51530549d11e9738fbfac" dependencies = [ "derive_more", "gcollections", @@ -1302,8 +1280,9 @@ dependencies = [ [[package]] name = "kitsune_p2p_timestamp" -version = "0.3.0-beta-dev.5" -source = "git+https://github.com/coasys/holochain.git?rev=67ba54b961184ca9301698145f6256744356a879#67ba54b961184ca9301698145f6256744356a879" +version = "0.3.0-beta-dev.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4d587124090ca8e4ab28f3dd3d65aa35fcc72403b7dad4fc790751efd04fbe3" dependencies = [ "chrono", "serde", @@ -1327,12 +1306,6 @@ version = "0.2.150" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" -[[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - [[package]] name = "linux-raw-sys" version = "0.4.12" @@ -1370,16 +1343,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" -[[package]] -name = "matrixmultiply" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2" -dependencies = [ - "autocfg", - "rawpointer", -] - [[package]] name = "memchr" version = "2.6.4" @@ -1404,15 +1367,6 @@ dependencies = [ "libc", ] -[[package]] -name = "memoffset" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" -dependencies = [ - "autocfg", -] - [[package]] name = "memoffset" version = "0.9.0" @@ -1437,54 +1391,6 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7843ec2de400bcbc6a6328c958dc38e5359da6e93e72e37bc5246bf1ae776389" -[[package]] -name = "must_future" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a160ffed3c2f98d2906c67a9b6e4e1f09cca7e17e3f780286a349061459eeebe" -dependencies = [ - "futures", - "pin-utils", -] - -[[package]] -name = "nalgebra" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d506eb7e08d6329505faa8a3a00a5dcc6de9f76e0c77e4b75763ae3c770831ff" -dependencies = [ - "approx", - "matrixmultiply", - "nalgebra-macros", - "num-complex", - "num-rational", - "num-traits", - "rand", - "rand_distr", - "simba", - "typenum", -] - -[[package]] -name = "nalgebra-macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01fcc0b8149b4632adc89ac3b7b31a12fb6099a0317a4eb2ebff574ef7de7218" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "num-complex" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" -dependencies = [ - "num-traits", -] - [[package]] name = "num-integer" version = "0.1.45" @@ -1495,17 +1401,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-rational" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-traits" version = "0.2.17" @@ -1513,7 +1408,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", - "libm", ] [[package]] @@ -1779,22 +1673,6 @@ dependencies = [ "getrandom", ] -[[package]] -name = "rand_distr" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" -dependencies = [ - "num-traits", - "rand", -] - -[[package]] -name = "rawpointer" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" - [[package]] name = "rayon" version = "1.8.0" @@ -1977,15 +1855,6 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" -[[package]] -name = "safe_arch" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f398075ce1e6a179b46f51bd88d0598b92b00d3551f1a2d4ac49e771b56ac354" -dependencies = [ - "bytemuck", -] - [[package]] name = "same-file" version = "1.0.6" @@ -2146,19 +2015,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "simba" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0b7840f121a46d63066ee7a99fc81dcabbc6105e437cae43528cea199b5a05f" -dependencies = [ - "approx", - "num-complex", - "num-traits", - "paste", - "wide", -] - [[package]] name = "simdutf8" version = "0.1.4" @@ -2192,19 +2048,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "statrs" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d08e5e1748192713cc281da8b16924fb46be7b0c2431854eadc785823e5696e" -dependencies = [ - "approx", - "lazy_static", - "nalgebra", - "num-traits", - "rand", -] - [[package]] name = "strsim" version = "0.10.0" @@ -2550,29 +2393,6 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-downcast" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" -dependencies = [ - "js-sys", - "once_cell", - "wasm-bindgen", - "wasm-bindgen-downcast-macros", -] - -[[package]] -name = "wasm-bindgen-downcast-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "wasm-bindgen-macro" version = "0.2.89" @@ -2604,18 +2424,18 @@ checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" [[package]] name = "wasm-encoder" -version = "0.38.1" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad2b51884de9c7f4fe2fd1043fccb8dcad4b1e29558146ee57a144d15779f3f" +checksum = "1ba64e81215916eaeb48fee292f29401d69235d62d8b8fd92a7b2844ec5ae5f7" dependencies = [ "leb128", ] [[package]] name = "wasmer" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e626f958755a90a6552b9528f59b58a62ae288e6c17fcf40e99495bc33c60f0" +checksum = "ce45cc009177ca345a6d041f9062305ad467d15e7d41494f5b81ab46d62d7a58" dependencies = [ "bytes", "cfg-if 1.0.0", @@ -2630,7 +2450,6 @@ dependencies = [ "target-lexicon", "thiserror", "wasm-bindgen", - "wasm-bindgen-downcast", "wasmer-compiler", "wasmer-compiler-cranelift", "wasmer-derive", @@ -2642,9 +2461,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848e1922694cf97f4df680a0534c9d72c836378b5eb2313c1708fe1a75b40044" +checksum = "e044f6140c844602b920deb4526aea3cc9c0d7cf23f00730bb9b2034669f522a" dependencies = [ "backtrace", "bytes", @@ -2669,9 +2488,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d96bce6fad15a954edcfc2749b59e47ea7de524b6ef3df392035636491a40b4" +checksum = "32ce02358eb44a149d791c1d6648fb7f8b2f99cd55e3c4eef0474653ec8cc889" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -2688,9 +2507,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f08f80d166a9279671b7af7a09409c28ede2e0b4e3acabbf0e3cb22c8038ba7" +checksum = "c782d80401edb08e1eba206733f7859db6c997fc5a7f5fb44edc3ecd801468f6" dependencies = [ "proc-macro-error", "proc-macro2", @@ -2700,9 +2519,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae2c892882f0b416783fb4310e5697f5c30587f6f9555f9d4f2be85ab39d5d3d" +checksum = "fd09e80d4d74bb9fd0ce6c3c106b1ceba1a050f9948db9d9b78ae53c172d6157" dependencies = [ "bytecheck", "enum-iterator", @@ -2716,9 +2535,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "4.2.2" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c0a9a57b627fb39e5a491058d4365f099bc9b140031c000fded24a3306d9480" +checksum = "bdcd8a4fd36414a7b6a003dbfbd32393bce3e155d715dd877c05c1b7a41d224d" dependencies = [ "backtrace", "cc", @@ -2733,7 +2552,7 @@ dependencies = [ "lazy_static", "libc", "mach", - "memoffset 0.8.0", + "memoffset", "more-asserts", "region", "scopeguard", @@ -2754,9 +2573,9 @@ dependencies = [ [[package]] name = "wast" -version = "69.0.1" +version = "64.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ee37317321afde358e4d7593745942c48d6d17e0e6e943704de9bbee121e7a" +checksum = "a259b226fd6910225aa7baeba82f9d9933b6d00f2ce1b49b80fa4214328237cc" dependencies = [ "leb128", "memchr", @@ -2766,23 +2585,13 @@ dependencies = [ [[package]] name = "wat" -version = "1.0.82" +version = "1.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aeb338ee8dee4d4cd05e6426683f21c5087dc7cfc8903e839ccf48d43332da3c" +checksum = "53253d920ab413fca1c7dc2161d601c79b4fdf631d0ba51dd4343bf9b556c3f6" dependencies = [ "wast", ] -[[package]] -name = "wide" -version = "0.7.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c68938b57b33da363195412cfc5fc37c9ed49aa9cfe2156fde64b8d2c9498242" -dependencies = [ - "bytemuck", - "safe_arch", -] - [[package]] name = "winapi" version = "0.3.9" diff --git a/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/Cargo.toml b/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/Cargo.toml index 8fe776ca4..d0d28ca48 100644 --- a/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/Cargo.toml +++ b/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/Cargo.toml @@ -21,8 +21,8 @@ dot-structures = "0.1.0" itertools = "0.10.3" perspective_diff_sync_integrity = { path = "../perspective_diff_sync_integrity" } sha2 = "0.10.5" -hdk = { version = "0.3.0-beta-dev.22", git = "https://github.com/coasys/holochain.git", rev = "67ba54b961184ca9301698145f6256744356a879"} -holo_hash = { version = "0.3.0-beta-dev.14", git = "https://github.com/coasys/holochain.git", rev = "67ba54b961184ca9301698145f6256744356a879"} +hdk = { version = "0.3.0-beta-dev.33" } +holo_hash = { version = "0.3.0-beta-dev.22"} [features] test = [] \ No newline at end of file diff --git a/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/lib.rs b/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/lib.rs index 7e03bab91..02caea79f 100644 --- a/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/lib.rs +++ b/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/lib.rs @@ -46,8 +46,11 @@ fn init(_: ()) -> ExternResult { #[hdk_extern] pub fn commit(diff: PerspectiveDiff) -> ExternResult { - link_adapter::commit::commit::(diff) - .map_err(|error| utils::err(&format!("{}", error))) + info!("commit"); + let commit_result = link_adapter::commit::commit::(diff) + .map_err(|error| utils::err(&format!("{}", error))); + info!("commit_result: {:?}", commit_result); + commit_result } #[hdk_extern] @@ -59,14 +62,20 @@ pub fn current_revision(_: ()) -> ExternResult> { #[hdk_extern] pub fn sync(_: ()) -> ExternResult> { - link_adapter::commit::broadcast_current::() - .map_err(|error| utils::err(&format!("{}", error))) + info!("sync"); + let broadcast_result = link_adapter::commit::broadcast_current::() + .map_err(|error| utils::err(&format!("{}", error))); + info!("broadcast_result: {:?}", broadcast_result); + broadcast_result } #[hdk_extern] pub fn pull(args: PullArguments) -> ExternResult { - link_adapter::pull::pull::(true, args.hash, args.is_scribe) - .map_err(|error| utils::err(&format!("{}", error))) + info!("pull"); + let pull_result = link_adapter::pull::pull::(true, args.hash, args.is_scribe) + .map_err(|error| utils::err(&format!("{}", error))); + info!("pull_result: {:?}", pull_result); + pull_result } #[hdk_extern] @@ -95,6 +104,7 @@ fn recv_remote_signal(signal: SerializedBytes) -> ExternResult<()> { //Check if its a normal diff expression signal match HashBroadcast::try_from(signal.clone()) { Ok(broadcast) => { + info!("recv_remote_signal broadcast: {:?}", broadcast); link_adapter::pull::handle_broadcast::(broadcast) .map_err(|err| utils::err(&format!("{}", err)))?; } @@ -167,8 +177,10 @@ pub fn get_active_agents(_: ()) -> ExternResult> { #[hdk_extern] pub fn get_others(_: ()) -> ExternResult> { + info!("get_others"); let res = telepresence::status::get_others().map_err(|error| utils::err(&format!("{}", error)))?; + info!("get_others res: {:?}", res); Ok(res) } diff --git a/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/link_adapter/commit.rs b/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/link_adapter/commit.rs index e9897391c..57f073769 100644 --- a/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/link_adapter/commit.rs +++ b/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/link_adapter/commit.rs @@ -146,7 +146,7 @@ pub fn broadcast_current() -> SocialContext let recent_agents = get_active_agents()?; //debug!("Recent agents: {:#?}", recent_agents); - remote_signal(signal_data.get_sb()?, recent_agents.clone())?; + send_remote_signal(signal_data.get_sb()?, recent_agents.clone())?; }; Ok(current.map(|rev| rev.hash)) } diff --git a/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/link_adapter/snapshots.rs b/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/link_adapter/snapshots.rs index d8a053b98..ee5464349 100644 --- a/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/link_adapter/snapshots.rs +++ b/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/link_adapter/snapshots.rs @@ -30,7 +30,7 @@ pub fn generate_snapshot( let mut all_removals = BTreeSet::new(); loop { - let diff = get(search_position.hash.clone(), GetOptions::latest())? + let diff = get(search_position.hash.clone(), GetOptions::network())? .ok_or(SocialContextError::InternalError( "generate_snapshot(): Could not find entry while populating search", ))? @@ -47,6 +47,7 @@ pub fn generate_snapshot( ) .unwrap() .tag_prefix(LinkTag::new("snapshot")) + .get_options(GetStrategy::Network) .build(); let mut snapshot_links = get_links(input)?; let after = get_now()?.time(); @@ -73,7 +74,7 @@ pub fn generate_snapshot( .target .into_entry_hash() .expect("Could not get entry_hash"), - GetOptions::latest(), + GetOptions::network(), )? .ok_or(SocialContextError::InternalError( "Could not find diff entry for given diff entry reference", @@ -146,7 +147,7 @@ fn handle_parents( //Check if entry is already in graph if !seen.contains(&search_position.hash) { seen.insert(search_position.hash.clone()); - let diff_entry = get(diff.diff.clone(), GetOptions::latest())? + let diff_entry = get(diff.diff.clone(), GetOptions::network())? .ok_or(SocialContextError::InternalError( "Could not find diff entry for given diff entry reference", ))? diff --git a/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/link_adapter/workspace.rs b/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/link_adapter/workspace.rs index 2a8c4ad0f..f5d8699dc 100644 --- a/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/link_adapter/workspace.rs +++ b/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/link_adapter/workspace.rs @@ -660,6 +660,7 @@ impl Workspace { ) .unwrap() .tag_prefix(LinkTag::new("snapshot")) + .get_options(GetStrategy::Network) .build(); let mut snapshot_links = get_links(input)?; @@ -670,7 +671,7 @@ impl Workspace { .target .into_entry_hash() .expect("Could not get entry hash"), - GetOptions::latest(), + GetOptions::network(), )? .ok_or(SocialContextError::InternalError( "Workspace::get_snapshot: Could not find entry while populating search", @@ -796,7 +797,7 @@ impl Workspace { // base_found = true; // } // } else { - // let diff_entry = get(current.1.diff.clone(), GetOptions::latest())? + // let diff_entry = get(current.1.diff.clone(), GetOptions::network())? // .ok_or(SocialContextError::InternalError( // "Could not find diff entry for given diff entry reference", // ))? @@ -999,7 +1000,7 @@ mod tests { 12 -> 6 [ label = \"()\" ] 13 -> 12 [ label = \"()\" ] - + }", ) .unwrap(); @@ -1104,12 +1105,12 @@ mod tests { 4 [ label = "4" ] 5 [ label = "5" ] - 1 -> 0 - 2 -> 1 - 3 -> 2 - 4 -> 3 + 1 -> 0 + 2 -> 1 + 3 -> 2 + 4 -> 3 5 -> 4 - + 6 7 8 @@ -1122,7 +1123,7 @@ mod tests { 10 -> 9 8 -> 0 - + }"#, ) .unwrap(); @@ -1176,12 +1177,12 @@ mod tests { 4 [ label = "4" ] 5 [ label = "5" ] - 1 -> 0 - 2 -> 1 - 3 -> 2 - 4 -> 3 + 1 -> 0 + 2 -> 1 + 3 -> 2 + 4 -> 3 5 -> 4 - + 6 7 8 @@ -1244,11 +1245,11 @@ mod tests { 2 [ label = "2" ] 3 [ label = "3" ] - 1 -> 0 - 2 -> 0 - 3 -> 1 + 1 -> 0 + 2 -> 0 + 3 -> 1 3 -> 2 - + }"#, ) .unwrap(); diff --git a/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/retriever/holochain.rs b/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/retriever/holochain.rs index 83cef098d..4f8b67065 100644 --- a/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/retriever/holochain.rs +++ b/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/retriever/holochain.rs @@ -18,7 +18,7 @@ impl PerspectiveDiffRetreiver for HolochainRetreiver { where T: TryFrom, { - get(hash, GetOptions::latest())? + get(hash, GetOptions::network())? .ok_or(SocialContextError::InternalError( "HolochainRetreiver: Could not find entry", ))? @@ -33,7 +33,7 @@ impl PerspectiveDiffRetreiver for HolochainRetreiver { where T: TryFrom, { - let element = get(hash, GetOptions::latest())?; + let element = get(hash, GetOptions::network())?; let element = element.ok_or(SocialContextError::InternalError( "HolochainRetreiver: Could not find entry", ))?; @@ -105,6 +105,7 @@ impl PerspectiveDiffRetreiver for HolochainRetreiver { LinkTypes::Index ) .unwrap() + .get_options(GetStrategy::Network) .build(); let mut latest_revision_links = get_links(input)?; @@ -175,6 +176,7 @@ pub fn get_active_agents() -> SocialContextResult> { ) .unwrap() .tag_prefix(LinkTag::new("active_agent")) + .get_options(GetStrategy::Network) .build(); let recent_agents = get_links(input)?; @@ -186,6 +188,8 @@ pub fn get_active_agents() -> SocialContextResult> { }) .collect(); + debug!("get_active_agents(): recent_agents: {:?}", recent_agents); + //Dedup the agents let mut recent_agents = dedup(&recent_agents); //Remove ourself from the agents diff --git a/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/telepresence/signal.rs b/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/telepresence/signal.rs index 3fa833b36..e7d616970 100644 --- a/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/telepresence/signal.rs +++ b/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/telepresence/signal.rs @@ -12,7 +12,7 @@ pub fn send_signal(signal_data: SignalData) -> SocialContextResult remote_signal(signal_data.payload.clone().get_sb()?, vec![agent])?, + Some(agent) => send_remote_signal(signal_data.payload.clone().get_sb()?, vec![agent])?, None => { debug!("PerspectiveDiffSync.send_signal(): Could not send signal since we could not get the agents pub key from did"); } @@ -24,7 +24,7 @@ pub fn send_broadcast(data: PerspectiveExpression) -> SocialContextResult SocialContextResult<()> { debug!("PerspectiveDiffSync.create_did_pub_key_link({:?})", did); let agent_key = agent_info()?.agent_latest_pubkey; debug!("PerspectiveDiffSync.create_did_pub_key_link() agent_key: {:?}", agent_key); - let input = GetLinksInputBuilder::try_new(agent_key.clone(), LinkTypes::DidLink).unwrap().build(); + let input = GetLinksInputBuilder::try_new(agent_key.clone(), LinkTypes::DidLink).unwrap().get_options(GetStrategy::Network).build(); let did_links = get_links(input)?; debug!("PerspectiveDiffSync.create_did_pub_key_link() did_links: {:?}", did_links); if did_links.len() == 0 { @@ -94,6 +94,7 @@ pub fn get_my_did() -> SocialContextResult> { LinkTypes::DidLink ) .unwrap() + .get_options(GetStrategy::Network) .build(); let mut did_links = get_links(input)?; if did_links.len() > 0 { @@ -103,7 +104,7 @@ pub fn get_my_did() -> SocialContextResult> { .target .into_entry_hash() .expect("Could not get entry_hash"), - GetOptions::latest(), + GetOptions::network(), )? .ok_or(SocialContextError::InternalError( "Could not find did entry for given did entry reference", @@ -127,6 +128,7 @@ pub fn get_dids_agent_key(did: String) -> SocialContextResult SocialContextResult 0 { @@ -153,7 +156,7 @@ pub fn get_agents_did_key(agent: AgentPubKey) -> SocialContextResult>, } -#[hdk_entry_defs] +#[hdk_entry_types] #[unit_enum(UnitEntryTypes)] pub enum EntryTypes { - #[entry_def(visibility = "public")] + #[entry_type(visibility = "public")] PerspectiveDiff(PerspectiveDiff), - #[entry_def(visibility = "public")] + #[entry_type(visibility = "public")] Snapshot(Snapshot), - #[entry_def(visibility = "public")] + #[entry_type(visibility = "public")] HashReference(HashReference), - #[entry_def(visibility = "public")] + #[entry_type(visibility = "public")] PerspectiveDiffEntryReference(PerspectiveDiffEntryReference), - #[entry_def(visibility = "private")] + #[entry_type(visibility = "private")] LocalHashReference(LocalHashReference), - #[entry_def(visibility = "private")] + #[entry_type(visibility = "private")] LocalTimestampReference(LocalTimestampReference), - #[entry_def(visibility = "public")] + #[entry_type(visibility = "public")] Anchor(Anchor), - #[entry_def(visibility = "private")] + #[entry_type(visibility = "private")] PrivateOnlineStatus(PerspectiveExpression), } diff --git a/bootstrap-languages/p-diff-sync/linksAdapter.ts b/bootstrap-languages/p-diff-sync/linksAdapter.ts index 62e09db15..f0792d401 100644 --- a/bootstrap-languages/p-diff-sync/linksAdapter.ts +++ b/bootstrap-languages/p-diff-sync/linksAdapter.ts @@ -3,10 +3,11 @@ import { LinkSyncAdapter, PerspectiveDiffObserver, HolochainLanguageDelegate, La import type { SyncStateChangeObserver } from "https://esm.sh/@perspect3vism/ad4m@0.5.0"; import { Mutex, withTimeout } from "https://esm.sh/async-mutex@0.4.0"; import { DNA_NICK, ZOME_NAME } from "./build/dna.js"; +import { encodeBase64 } from "https://deno.land/std@0.220.1/encoding/base64.ts"; class PeerInfo { //@ts-ignore - currentRevision: Buffer; + currentRevision: Uint8Array; //@ts-ignore lastSeen: Date; }; @@ -19,7 +20,7 @@ export class LinkAdapter implements LinkSyncAdapter { generalMutex: Mutex = withTimeout(new Mutex(), 10000, new Error('PerspectiveDiffSync: generalMutex timeout')); me: DID gossipLogCount: number = 0; - myCurrentRevision: Buffer | null = null; + myCurrentRevision: Uint8Array | null = null; constructor(context: LanguageContext) { //@ts-ignore @@ -37,12 +38,15 @@ export class LinkAdapter implements LinkSyncAdapter { async others(): Promise { //@ts-ignore - return await this.hcDna.call(DNA_NICK, ZOME_NAME, "get_others", null); + let others = await this.hcDna.call(DNA_NICK, ZOME_NAME, "get_others", null); + console.log("PerspectiveDiffSync.others(); others", others); + return others as DID[]; } async currentRevision(): Promise { //@ts-ignore let res = await this.hcDna.call(DNA_NICK, ZOME_NAME, "current_revision", null); + console.log("PerspectiveDiffSync.currentRevision(); res", res); return res as string; } @@ -53,7 +57,7 @@ export class LinkAdapter implements LinkSyncAdapter { try { //@ts-ignore let current_revision = await this.hcDna.call(DNA_NICK, ZOME_NAME, "sync", null); - if (current_revision && Buffer.isBuffer(current_revision)) { + if (current_revision && current_revision instanceof Uint8Array) { this.myCurrentRevision = current_revision; } } catch (e) { @@ -86,13 +90,13 @@ export class LinkAdapter implements LinkSyncAdapter { peers.push(this.me); // Lexically sort the peers - peers.sort(); + peers = peers.sort(); // If we are the first peer, we are the scribe - let is_scribe = peers[0] == this.me; + let is_scribe = (peers[0] == this.me); // Get a deduped set of all peer's current revisions - let revisions = new Set(); + let revisions = new Set(); for(const peerInfo of this.peers.values()) { if (peerInfo.currentRevision) revisions.add(peerInfo.currentRevision); } @@ -103,15 +107,15 @@ export class LinkAdapter implements LinkSyncAdapter { //Get a copied array of revisions that are different than mine let differentRevisions; - function generateRevisionStates(myCurrentRevision: Buffer) { + function generateRevisionStates(myCurrentRevision: Uint8Array) { sameRevisions = revisions.size == 0 ? [] : Array.from(revisions).filter( (revision) => { - return myCurrentRevision && revision.equals(myCurrentRevision); + return myCurrentRevision && (encodeBase64(revision) == encodeBase64(myCurrentRevision)); }); if (myCurrentRevision) { sameRevisions.push(myCurrentRevision); }; differentRevisions = revisions.size == 0 ? [] : Array.from(revisions).filter( (revision) => { - return myCurrentRevision && !revision.equals(myCurrentRevision); + return myCurrentRevision && !(encodeBase64(revision) == encodeBase64(myCurrentRevision)); }); } @@ -133,11 +137,13 @@ export class LinkAdapter implements LinkSyncAdapter { for (const hash of Array.from(revisions)) { if(!hash) continue - if (this.myCurrentRevision && hash.equals(this.myCurrentRevision)) continue + if (this.myCurrentRevision && (encodeBase64(hash) == encodeBase64(this.myCurrentRevision))) continue; + let pullResult = await this.hcDna.call(DNA_NICK, ZOME_NAME, "pull", { hash, is_scribe }); + if (pullResult) { if (pullResult.current_revision && Buffer.isBuffer(pullResult.current_revision)) { let myRevision = pullResult.current_revision; @@ -153,6 +159,7 @@ export class LinkAdapter implements LinkSyncAdapter { //Only show the gossip log every 10th iteration if (this.gossipLogCount == 10) { + let others = await this.others(); console.log(` ====== GOSSIP @@ -160,14 +167,16 @@ export class LinkAdapter implements LinkSyncAdapter { me: ${this.me} is scribe: ${is_scribe} -- + others: ${others.join(', ')} + -- ${Array.from(this.peers.entries()).map( ([peer, peerInfo]) => { //@ts-ignore - return `${peer}: ${peerInfo.currentRevision.toString('base64')} ${peerInfo.lastSeen.toISOString()}\n` + return `${peer}: ${encodeBase64(peerInfo.currentRevision)} ${peerInfo.lastSeen.toISOString()}\n` })} -- revisions: ${Array.from(revisions).map( (hash) => { //@ts-ignore - return hash.toString('base64') + return encodeBase64(hash) })} `); this.gossipLogCount = 0; diff --git a/bootstrap-languages/p-diff-sync/package.json b/bootstrap-languages/p-diff-sync/package.json index 60544ec71..8301a1016 100644 --- a/bootstrap-languages/p-diff-sync/package.json +++ b/bootstrap-languages/p-diff-sync/package.json @@ -38,5 +38,5 @@ "devDependencies": { "run-script-os": "^1.1.6" }, - "version": "0.8.1" + "version": "0.9.0" } diff --git a/bootstrap-languages/perspective-language/package.json b/bootstrap-languages/perspective-language/package.json index ab3e54679..23c58e8c0 100644 --- a/bootstrap-languages/perspective-language/package.json +++ b/bootstrap-languages/perspective-language/package.json @@ -30,5 +30,5 @@ "typescript": "^4.5.5", "uint8arrays": "^3.0.0" }, - "version": "0.8.1" + "version": "0.9.0" } diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 9c0f33db0..004f39add 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -1,23 +1,31 @@ [package] name = "ad4m" -version = "0.8.1" +version = "0.9.0" edition = "2021" -authors = ["Nicolas Luck "] -description = "A command-line interface to AD4M (i.e. the AD4M executor) - https://ad4m.dev" -keywords = ["ad4m", "perspect3vism", "cli"] +authors = ["Nicolas Luck "] +description = "Executables for running, developing and debugging an ADAM node/agent" +keywords = ["ad4m", "coasys", "cli", "holochain"] license = "CAL-1.0" homepage = "https://ad4m.dev" -repository = "https://github.com/perspect3vism/ad4m" +repository = "https://github.com/coasys/ad4m" documentation = "https://docs.ad4m.dev" readme = "README.md" +[[bin]] +name = "ad4m" +path = "src/ad4m.rs" + +[[bin]] +name = "ad4m-executor" +path = "src/ad4m_executor.rs" + [dependencies] -ad4m-client = { path = "../rust-client"} -rust-executor = { path = "../rust-executor" } +ad4m-client = { path = "../rust-client", version="0.9.0"} +ad4m-executor = { path = "../rust-executor", version="0.9.0" } anyhow = "1.0.65" clap = { version = "4.0.8", features = ["derive"] } futures = "0.3" @@ -34,3 +42,6 @@ serde = { version = "1.0", features = ["derive"] } colour = "0.7.0" syntect = "5.0" ctrlc = "3.4.0" + +#holochain_kitsune_p2p = "0.3.0-beta-dev.37" +kitsune_p2p_types = { version = "0.3.0-beta-dev.22" } diff --git a/cli/README.md b/cli/README.md index 36489215f..85a8d4f48 100644 --- a/cli/README.md +++ b/cli/README.md @@ -1,59 +1,111 @@ -# AD4M command-line interface +# AD4M Executables ![](screenshots/banner.png) -This is a cmd-tool (`ad4m`) that uses the Rust implementation of the AD4M GraphQL interface wrapper (https://crates.io/crates/ad4m-client). -As such, it's a command-line based generic UI intended for development and scripting use and remote-controlling -of AD4M and all it's features. +This package contains command line tools for the Agent-Centric Distributed Application Meta-ontology (ADAM, aka AD4M), a framework for building interoperable, decentralized applications. It provides developers with the tools to control and script the functionalities of AD4M, leveraging the power of the Rust implementation of the AD4M GraphQL interface wrapper. -## Build +The purpose of these CLIs is development, scripting, and remote control of AD4M features, +as well as programatic setup and running of ADAM agents. + +## Installation + +Install AD4M using Cargo, Rust's package manager: +``` +cargo install ad4m +``` + +This command installs two binaries: +- `ad4m`: The client for interacting with the executor. +- `ad4m-executor`: The executor that runs the AD4M agent. + +## Getting Started + +Initialize the AD4M executor with: ``` -cargo build +ad4m-executor init ``` -## Start & Run AD4M Agent +This will create a new agent/config directory in ~/.ad4m. +Run the executor (i.e. the ADAM agent/node) using: ``` -ad4m init +ad4m-executor run ``` +## Interacting with AD4M + +Use the `ad4m` client to interact with the executor. Here are some common commands: + +### Generate and unlock agent +A fresh install will first need a new agent to be created, which requires a password +which is used to encrypt the agent's keys: + +``` +ad4m agent generate +``` + +This command will prompt for a new password. +Future runs of the executor require the wallet to be unlocked with + ``` -ad4m run +ad4m agent unlock ``` +providing the same password. -## Usage Show all perspectives: ``` ad4m perspectives ``` +### Query Perspectives ![](screenshots/perspectives.png) -Query links of a perspective: +Query links of a perspective by its UUID: ``` -ad4m perspectives query-links 359a0a8f-fecc-43a3-9c18-27ee1e41efe2 +ad4m perspectives query-links ``` ![](screenshots/query-links.png) -Watch changes of a perspective: +Watch changes of a perspective in real-time: ``` -ad4m perspectives watch 359a0a8f-fecc-43a3-9c18-27ee1e41efe2 +ad4m perspectives watch ``` + +### Creating neighbourhoods ![](screenshots/watch.png) -Clone and publish a language +Clone and publish a language from a template: ``` -ad4m languages apply-template-and-publish QmeBD9n9Z5yZsegxArToww5zmwtPpojXN6zXJsi7WwMUa8 +ad4m languages apply-template-and-publish ``` -Publish Perspective as Neighbourhood +Publish a perspective as a Neighbourhood: ``` -ad4m neighbourhoods create da0333e9-275d-4b57-8851-0d1678d75a1c QmNrp4iKy1TAHqwQb2SZtApA2EYHK4UhRfgvV1mfJKEJSP +ad4m neighbourhoods create ``` -See help for all the other commands: +For a full list of commands and their explanations, use: ``` -ad4m +ad4m --help ``` + +## Contributing + +Contributions to AD4M are welcome! Please read our contributing guidelines and submit pull requests to our repository. + +## License + +AD4M is licensed under the [CAL-1.0](LICENSE). + +## Screenshots + +![](screenshots/banner.png) + +![](screenshots/query-links.png) +![](screenshots/watch.png) + +## More Information + +For more information on AD4M and ADAM, visit our [official website](https://ad4m.dev) or check out the [core documentation](https://docs.ad4m.dev). diff --git a/cli/mainnet_seed.json b/cli/mainnet_seed.json index 8d131009e..90cba2320 100644 --- a/cli/mainnet_seed.json +++ b/cli/mainnet_seed.json @@ -4,12 +4,12 @@ "did:key:z6MkvPpWxwXAnLtMcoc9sX7GEoJ96oNnQ3VcQJRLspNJfpE7" ], "knownLinkLanguages": [ - "QmzSYwdg8JYEkFbcaV1XizduGxGyPt4dPjeJ4DdzAKajSqdckBj", - "QmzSYwdox6uFm5D93VyDTqs7aGjQr5UHzhpRi7yPbAEhwCXFiju", + "QmzSYwdj7LmLiY7p5vEzBPuQpW3CmAB41vEJe9hkVB9w6ndhcE5", + "QmzSYwdnyTVrzufV8HfUfFRwDSiZZjRoBimrm95qjh6KCG9Z6YW", "QmzSYwdnHrRH8MmuPWKKrDvFoVyW5CophNpT1ipQUCcenPVTQnd" ], - "directMessageLanguage": "QmzSYwdhTvszHze6xSojgaDmm9iPGr78iSbvVnQ1SgXo7t62PA9", - "agentLanguage": "QmzSYwdZDdgxiyE8crozqbxoBP52h6ocMdDq2S2mg4ScjzVLWKQ", + "directMessageLanguage": "QmzSYwdbXD5LGiAHJAJknFgfigD2rb6ZYRUC8o8LRR9peP3pFGc", + "agentLanguage": "QmzSYwdoGSndfmEVKuP4Tsof64bSdiqYWgV9wypbvmgSELYoKet", "perspectiveLanguage": "QmzSYwddxFCzVD63LgR8MTBaUEcwf9jhB3XjLbYBp2q8V1MqVtS", "neighbourhoodLanguage": "QmzSYwdo2a6E4XghRHrN5eCReyYRDeRE8VnRbvqgoWZsr9B4pxV", "languageLanguageBundle": "// https://deno.land/x/url_join@1.0.0/mod.ts\nvar urlJoin = function(...args) {\n let input;\n if (typeof args[0] === \"object\") {\n input = args[0];\n } else {\n input = [].slice.call(args);\n }\n return normalize(input);\n};\nvar normalize = (strArray) => {\n const resultArray = [];\n if (strArray.length === 0) {\n return \"\";\n }\n if (typeof strArray[0] !== \"string\") {\n throw new TypeError(\"Url must be a string. Received \" + strArray[0]);\n }\n if (strArray[0].match(/^[^/:]+:\\/*$/) && strArray.length > 1) {\n const first = strArray.shift();\n strArray[0] = first + strArray[0];\n }\n if (strArray[0].match(/^file:\\/\\/\\//)) {\n strArray[0] = strArray[0].replace(/^([^/:]+):\\/*/, \"$1:///\");\n } else {\n strArray[0] = strArray[0].replace(/^([^/:]+):\\/*/, \"$1://\");\n }\n for (let i = 0; i < strArray.length; i++) {\n let component = strArray[i];\n if (typeof component !== \"string\") {\n throw new TypeError(\"Url must be a string. Received \" + component);\n }\n if (component === \"\") {\n continue;\n }\n if (i > 0) {\n component = component.replace(/^[\\/]+/, \"\");\n }\n if (i < strArray.length - 1) {\n component = component.replace(/[\\/]+$/, \"\");\n } else {\n component = component.replace(/[\\/]+$/, \"/\");\n }\n resultArray.push(component);\n }\n let str = resultArray.join(\"/\");\n str = str.replace(/\\/(\\?|&|#[^!])/g, \"$1\");\n let parts = str.split(\"?\");\n str = parts.shift() + (parts.length > 0 ? \"?\" : \"\") + parts.join(\"&\");\n return str;\n};\n\n// https://deno.land/x/axiod@0.26.2/helpers.ts\nvar methods = [\n \"get\",\n \"post\",\n \"put\",\n \"delete\",\n \"options\",\n \"head\",\n \"connect\",\n \"trace\",\n \"patch\"\n];\nvar addInterceptor = () => {\n const interceptor = {\n list: [],\n use: function(fulfilled, rejected) {\n const id = this.list.length;\n this.list.push({\n fulfilled,\n rejected\n });\n return id;\n },\n eject: function(index) {\n if (this.list[index]) {\n this.list[index] = null;\n }\n }\n };\n return interceptor;\n};\n\n// https://deno.land/x/axiod@0.26.2/mod.ts\nfunction axiod(url, config) {\n if (typeof url === \"string\") {\n return axiod.request(Object.assign({}, axiod.defaults, { url }, config));\n }\n return axiod.request(Object.assign({}, axiod.defaults, url));\n}\naxiod.defaults = {\n url: \"/\",\n method: \"get\",\n timeout: 0,\n withCredentials: false,\n validateStatus: (status) => {\n return status >= 200 && status < 300;\n }\n};\naxiod.create = (config) => {\n const instance = axiod.bind({});\n instance.defaults = Object.assign({}, axiod.defaults, config);\n instance._request = request;\n instance.request = (options) => {\n return instance._request(Object.assign({}, instance.defaults, options));\n };\n instance.get = (url, config2) => {\n return instance.request(\n Object.assign({}, { url }, config2, { method: \"get\" })\n );\n };\n instance.post = (url, data, config2) => {\n return instance.request(\n Object.assign({}, { url }, config2, { method: \"post\", data })\n );\n };\n instance.put = (url, data, config2) => {\n return instance.request(\n Object.assign({}, { url }, config2, { method: \"put\", data })\n );\n };\n instance.delete = (url, data, config2) => {\n return instance.request(\n Object.assign({}, { url }, config2, { method: \"delete\", data })\n );\n };\n instance.options = (url, data, config2) => {\n return instance.request(\n Object.assign({}, { url }, config2, { method: \"options\", data })\n );\n };\n instance.head = (url, data, config2) => {\n return instance.request(\n Object.assign({}, { url }, config2, { method: \"head\", data })\n );\n };\n instance.connect = (url, data, config2) => {\n return instance.request(\n Object.assign({}, { url }, config2, { method: \"connect\", data })\n );\n };\n instance.trace = (url, data, config2) => {\n return instance.request(\n Object.assign({}, { url }, config2, { method: \"trace\", data })\n );\n };\n instance.patch = (url, data, config2) => {\n return instance.request(\n Object.assign({}, { url }, config2, { method: \"patch\", data })\n );\n };\n instance.interceptors = {\n request: addInterceptor(),\n response: addInterceptor()\n };\n instance.interceptors.request.list = [];\n instance.interceptors.response.list = [];\n return instance;\n};\nasync function request(config) {\n if (this.interceptors.request.list.length > 0) {\n for (const interceptor of this.interceptors.request.list) {\n if (interceptor) {\n const { fulfilled } = interceptor;\n if (fulfilled && config) {\n config = await fulfilled(config);\n }\n }\n }\n }\n let {\n url = \"/\",\n baseURL,\n method,\n headers,\n params = {},\n data,\n timeout,\n withCredentials,\n auth,\n validateStatus,\n paramsSerializer,\n transformRequest,\n transformResponse,\n redirect,\n responseType = \"json\"\n } = config;\n if (baseURL) {\n url = urlJoin(baseURL, url);\n }\n if (method) {\n if (methods.indexOf(method.toLowerCase().trim()) === -1) {\n throw new Error(`Method ${method} is not supported`);\n } else {\n method = method.toLowerCase().trim();\n }\n } else {\n method = \"get\";\n }\n let _params = \"\";\n if (params) {\n if (paramsSerializer) {\n _params = paramsSerializer(params);\n } else {\n _params = Object.keys(params).map((key) => {\n return encodeURIComponent(key) + \"=\" + encodeURIComponent(params[key]);\n }).join(\"&\");\n }\n }\n if (withCredentials) {\n if (auth?.username && auth?.password) {\n if (!headers) {\n headers = {};\n }\n headers[\"Authorization\"] = \"Basic \" + btoa(unescape(encodeURIComponent(`${auth.username}:${auth.password}`)));\n }\n }\n const fetchRequestObject = {};\n if (method !== \"get\") {\n fetchRequestObject.method = method.toUpperCase();\n }\n if (_params) {\n url = urlJoin(url, `?${_params}`);\n }\n if (data && method !== \"get\") {\n if (transformRequest && Array.isArray(transformRequest) && transformRequest.length > 0) {\n for (var i = 0; i < (transformRequest || []).length; i++) {\n if (transformRequest && transformRequest[i]) {\n data = transformRequest[i](data, headers);\n }\n }\n }\n if (typeof data === \"string\" || data instanceof FormData || data instanceof URLSearchParams) {\n fetchRequestObject.body = data;\n } else {\n try {\n fetchRequestObject.body = JSON.stringify(data);\n if (!headers) {\n headers = {};\n }\n headers[\"Accept\"] = \"application/json\";\n headers[\"Content-Type\"] = \"application/json\";\n } catch (ex) {\n }\n }\n }\n if (headers) {\n const _headers = new Headers();\n Object.keys(headers).forEach((header) => {\n if (headers && headers[header]) {\n _headers.set(header, headers[header]);\n }\n });\n fetchRequestObject.headers = _headers;\n }\n const controller = new AbortController();\n fetchRequestObject.signal = controller.signal;\n let timeoutCounter = 0;\n if ((timeout || 0) > 0) {\n timeoutCounter = setTimeout(() => {\n timeoutCounter = 0;\n controller.abort();\n }, timeout);\n }\n if (redirect) {\n fetchRequestObject.redirect = redirect;\n }\n return fetch(url, fetchRequestObject).then(async (x) => {\n if (timeoutCounter) {\n clearTimeout(timeoutCounter);\n }\n const _status = x.status;\n const _statusText = x.statusText;\n let _data = null;\n try {\n const response2 = x.clone();\n if (responseType === \"json\") {\n _data = await response2.json();\n } else if (responseType === \"text\") {\n _data = await response2.text();\n } else if (responseType === \"arraybuffer\") {\n _data = await response2.arrayBuffer();\n } else if (responseType === \"blob\") {\n _data = await response2.blob();\n } else if (responseType === \"stream\") {\n _data = (await response2.blob()).stream();\n } else {\n _data = await response2.text();\n }\n } catch (ex) {\n _data = await x.clone().text();\n }\n if (transformResponse) {\n if (transformResponse && Array.isArray(transformResponse) && transformResponse.length > 0) {\n for (var i2 = 0; i2 < (transformResponse || []).length; i2++) {\n if (transformResponse && transformResponse[i2]) {\n _data = transformResponse[i2](_data);\n }\n }\n }\n }\n const _headers = x.headers;\n const _config = {\n url,\n baseURL,\n method,\n headers,\n params,\n data,\n timeout,\n withCredentials,\n auth,\n paramsSerializer,\n redirect,\n responseType\n };\n let isValidStatus = true;\n if (validateStatus) {\n isValidStatus = validateStatus(_status);\n } else {\n isValidStatus = _status >= 200 && _status <= 303;\n }\n let response = null;\n let error = null;\n if (isValidStatus) {\n response = {\n status: _status,\n statusText: _statusText,\n data: _data,\n headers: _headers,\n config: _config\n };\n } else {\n error = {\n response: {\n status: _status,\n statusText: _statusText,\n data: _data,\n headers: _headers\n },\n config: _config\n };\n }\n if (this.interceptors.response.list.length > 0) {\n for (const interceptor of this.interceptors.response.list) {\n if (interceptor) {\n const { fulfilled, rejected } = interceptor;\n if (fulfilled && response) {\n response = await fulfilled(response);\n }\n if (rejected && error) {\n error = await rejected(error);\n }\n }\n }\n }\n if (error) {\n return Promise.reject(error);\n }\n return Promise.resolve(response);\n });\n}\naxiod._request = request;\naxiod.request = request;\naxiod.get = (url, config) => {\n return axiod.request(\n Object.assign({}, { url }, config, { method: \"get\" })\n );\n};\naxiod.post = (url, data, config) => {\n return axiod.request(\n Object.assign({}, { url }, config, { method: \"post\", data })\n );\n};\naxiod.put = (url, data, config) => {\n return axiod.request(\n Object.assign({}, { url }, config, { method: \"put\", data })\n );\n};\naxiod.delete = (url, data, config) => {\n return axiod.request(\n Object.assign({}, { url }, config, { method: \"delete\", data })\n );\n};\naxiod.options = (url, data, config) => {\n return axiod.request(\n Object.assign({}, { url }, config, { method: \"options\", data })\n );\n};\naxiod.head = (url, data, config) => {\n return axiod.request(\n Object.assign({}, { url }, config, { method: \"head\", data })\n );\n};\naxiod.connect = (url, data, config) => {\n return axiod.request(\n Object.assign({}, { url }, config, { method: \"connect\", data })\n );\n};\naxiod.trace = (url, data, config) => {\n return axiod.request(\n Object.assign({}, { url }, config, { method: \"trace\", data })\n );\n};\naxiod.patch = (url, data, config) => {\n return axiod.request(\n Object.assign({}, { url }, config, { method: \"patch\", data })\n );\n};\naxiod.interceptors = {\n request: addInterceptor(),\n response: addInterceptor()\n};\nvar mod_default = axiod;\n\n// languageAdapter.ts\nvar LangAdapter = class {\n constructor(context) {\n }\n async getLanguageSource(address) {\n if (address.substring(0, 2) != \"Qm\") {\n console.error(\"LanguageLanguage.getLanguageSource(): The address is not a valid hash\");\n return \"\";\n }\n const cid = address.toString();\n let presignedUrl;\n try {\n const getPresignedUrl = await mod_default.get(PROXY_URL + `?key=${cid}`);\n presignedUrl = getPresignedUrl.data.url;\n } catch (e) {\n console.error(\"Get language source failed at getting presigned url\", address);\n throw e;\n }\n let languageSource;\n try {\n const getLanguageSource = await mod_default.get(presignedUrl);\n languageSource = getLanguageSource.data;\n } catch (e) {\n console.error(\"Get language source failed at getting language source\", address);\n throw e;\n }\n return languageSource;\n }\n};\n\n// putAdapter.ts\nvar CloudflarePutAdapter = class {\n #agent;\n constructor(context) {\n this.#agent = context.agent;\n }\n async createPublic(language) {\n const hash = UTILS.hash(language.bundle.toString());\n if (hash != language.meta.address)\n throw new Error(`Language Persistence: Can't store language. Address stated in meta differs from actual file\nWanted: ${language.meta.address}\nGot: ${hash}`);\n const agent = this.#agent;\n const expression = agent.createSignedExpression(language.meta);\n const key = `meta-${hash}`;\n const metaPostData = {\n key,\n // Content of the new object.\n value: JSON.stringify(expression)\n };\n try {\n const metaPostResult = await mod_default.post(PROXY_URL, metaPostData);\n if (metaPostResult.status != 200) {\n console.error(\"Upload language meta data gets error: \", metaPostResult);\n }\n const languageBundleBucketParams = {\n key: hash,\n // Content of the new object.\n value: language.bundle.toString()\n };\n const bundlePostResult = await mod_default.post(PROXY_URL, languageBundleBucketParams);\n if (bundlePostResult.status != 200) {\n console.error(\"Upload language bundle data gets error: \", metaPostResult);\n }\n return hash;\n } catch (e) {\n if (e.response.status == 400 && e.response.data.includes(\"Key already exists\")) {\n console.log(\"[Cloudflare-based Language Language]: Tried to replace existing language. Ignoring...\");\n return hash;\n }\n console.error(\"[Cloudflare-based Language Language]: Error storing Language: \", e.response.data);\n throw e;\n }\n }\n};\n\n// adapter.ts\nvar Adapter = class {\n constructor(context) {\n this.putAdapter = new CloudflarePutAdapter(context);\n }\n async get(address) {\n if (address.substring(0, 2) != \"Qm\") {\n console.error(\"LanguageLanguage.get(): The address is not a valid hash\");\n return null;\n }\n const metaDataKey = `meta-${address}`;\n let presignedUrl;\n try {\n const getPresignedUrl = await mod_default.get(PROXY_URL + `?key=${metaDataKey}`);\n presignedUrl = getPresignedUrl.data.url;\n } catch (e) {\n console.error(\"Get meta information failed at getting presigned url\", address);\n return null;\n }\n let metaObject;\n try {\n const getMetaObject = await mod_default.get(presignedUrl);\n metaObject = getMetaObject.data;\n } catch (e) {\n console.error(\"Get meta information failed at getting meta information\", presignedUrl);\n return null;\n }\n return metaObject;\n }\n};\n\n// index.ts\nvar name = \"languages\";\nvar PROXY_URL = \"https://bootstrap-store-gateway.perspect3vism.workers.dev\";\nfunction interactions(expression) {\n return [];\n}\nasync function create(context) {\n const expressionAdapter = new Adapter(context);\n const languageAdapter = new LangAdapter(context);\n return {\n name,\n expressionAdapter,\n languageAdapter,\n interactions\n };\n}\nexport {\n PROXY_URL,\n create as default,\n name\n};\n" diff --git a/cli/seed_proto.json b/cli/seed_proto.json index 771d3011b..8240e162c 100644 --- a/cli/seed_proto.json +++ b/cli/seed_proto.json @@ -5,25 +5,25 @@ "meta": { "name": "perspectiveDiffSync", "description": "Holochain based Perspective link sharing language", - "sourceCodeLink": "https://github.com/perspect3vism/perspective-diff-sync", + "sourceCodeLink": "https://github.com/coasys/ad4m/tree/dev/bootstrap-languages/p-diff-sync", "possibleTemplateParams": ["uid", "name", "description"] }, "resource": "../bootstrap-languages/p-diff-sync/build/bundle.js" }, { "meta": { - "name": "perspectiveDiffSync", - "description": "Holochain based Perspective link sharing language, with revision signals sent with socket.io", - "sourceCodeLink": "https://github.com/perspect3vism/perspective-diff-sync", + "name": "perspectiveDiffSync-socket", + "description": "Holochain based Perspective link sharing language, with revision signals sent with socket.io through a centralized server", + "sourceCodeLink": "https://github.com/coasys/ad4m/tree/dev/bootstrap-languages/p-diff-sync-socket-signaling", "possibleTemplateParams": ["uid", "name", "description"] }, "resource": "../bootstrap-languages/p-diff-sync-socket-signaling/build/bundle.js" }, { "meta": { - "name": "perspectiveDiffSync", + "name": "CloudLinks", "description": "Centralized link language", - "sourceCodeLink": "https://github.com/perspect3vism/perspective-diff-sync", + "sourceCodeLink": "https://github.com/coasys/ad4m/tree/dev/bootstrap-languages/p-diff-sync-socket-signaling", "possibleTemplateParams": ["uid", "name", "description"] }, "resource": "../bootstrap-languages/centralized-p-diff-sync/build/bundle.js" @@ -32,8 +32,8 @@ "agentLanguage": { "meta": { "name": "agentLanguage", - "description": "Holochain based expression language for storing ad4m agent expressions", - "sourceCodeLink": "https://github.com/perspect3vism/agent-language", + "description": "Centralized based expression language for storing ad4m agent expressions, using Cloudflare KV store", + "sourceCodeLink": "https://github.com/coasys/ad4m/tree/dev/bootstrap-languages/centralized-agent-language", "possibleTemplateParams": ["uid", "name", "description"] }, "resource": "../bootstrap-languages/centralized-agent-language/build/bundle.js" @@ -42,7 +42,7 @@ "meta": { "name": "directMessageLanguage", "description": "Holochain based language for direct messages on ad4m", - "sourceCodeLink": "https://github.com/perspect3vism/direct-message-language", + "sourceCodeLink": "https://github.com/coasys/ad4m/tree/dev/bootstrap-languages/direct-message-language", "possibleTemplateParams": ["recipient_did", "recipient_hc_agent_pubkey"] }, "resource": "../bootstrap-languages/direct-message-language/build/bundle.js" @@ -51,7 +51,7 @@ "meta": { "name": "neighbourhoodLanguage", "description": "Language for storing neighbourhood expressions that leverages StorJ", - "sourceCodeLink": "https://github.com/fluxsocial/neighbourhood-language", + "sourceCodeLink": "https://github.com/coasys/ad4m/tree/dev/bootstrap-languages/neighbourhood-language", "possibleTemplateParams": ["uid", "name", "description"] }, "resource": "../bootstrap-languages/neighbourhood-language/build/bundle.js" @@ -60,7 +60,7 @@ "meta": { "name": "perspectiveLanguage", "description": "Holochain based language for storing perspective expressions", - "sourceCodeLink": "https://github.com/perspect3vism/perspective-language", + "sourceCodeLink": "https://github.com/coasys/ad4m/tree/dev/bootstrap-languages/perspective-language", "possibleTemplateParams": ["uid", "name", "description"] }, "resource": "../bootstrap-languages/perspective-language/build/bundle.js" @@ -70,7 +70,7 @@ "meta": { "name": "fileStorageLanguage", "description": "Holochain based language for storing files", - "sourceCodeLink": "https://github.com/perspect3vism/file-storage-language", + "sourceCodeLink": "https://github.com/coasys/ad4m/tree/dev/bootstrap-languages/file-storage", "possibleTemplateParams": ["uid", "name", "description"] }, "resource": "../bootstrap-languages/file-storage/build/bundle.js" @@ -79,7 +79,7 @@ "meta": { "name": "centralizedFileStorageLanguage", "description": "Cloudflare based language for storing files", - "sourceCodeLink": "https://github.com/coasys/ad4m", + "sourceCodeLink": "https://github.com/coasys/ad4m/tree/dev/bootstrap-languages/centralized-file-storage", "possibleTemplateParams": ["uid", "name", "description"] }, "resource": "../bootstrap-languages/centralized-file-storage/build/bundle.js" @@ -88,7 +88,7 @@ "meta": { "name": "easLanguage", "description": "EAS fetching language", - "sourceCodeLink": "https://github.com/perspect3vism/file-storage-language", + "sourceCodeLink": "https://github.com/coasys/ad4m/tree/dev/bootstrap-languages/eass", "possibleTemplateParams": [] }, "resource": "../bootstrap-languages/eas/build/bundle.js" diff --git a/cli/src/ad4m.rs b/cli/src/ad4m.rs new file mode 100644 index 000000000..335c5db9d --- /dev/null +++ b/cli/src/ad4m.rs @@ -0,0 +1,172 @@ +#![allow(dead_code)] +extern crate ad4m_client; +extern crate anyhow; +extern crate chrono; +extern crate clap; +extern crate dirs; +extern crate rand; +extern crate regex; +extern crate rustyline; +extern crate tokio; +extern crate kitsune_p2p_types; + +mod formatting; +mod startup; +mod util; + +mod agent; +mod bootstrap_publish; +mod dev; +mod expression; +mod languages; +mod neighbourhoods; +mod perspectives; +mod repl; +mod runtime; + +use crate::{ + agent::*, expression::*, languages::*, neighbourhoods::*, perspectives::*, runtime::*, +}; +use ad4m_client::*; +use anyhow::{Context, Result}; +use clap::{Parser, Subcommand}; +use startup::executor_data_path; + +/// AD4M command line interface. +/// https://ad4m.dev +/// .xXKkd:' +/// .oNOccx00x;. +/// ;KK; .ck0Oxdolc;.. +/// lWk:oOK0OxdoxOOO0KOd;. +/// dWkdkl,. .o0x;'cxK0l. +/// .,ldxxxxxxoc. .cdxxxxxxxxxxxdoc,. 'oxo' ;dx; .;dxxxo:. .;odxxx: .dWk' .dNx. 'o0O: +/// .xNWNKKKKKXWWK: 'OWWX0000000000KNWWKo. ,0WNd. dWWd. .oWMNXNWKc. :0WWXNMMk. :dxX0, .,cllOXo:oooxkd, +/// .xWWk,......lXMK; ;XMK:. . . ....':kNWK; ,0MNo. oWWd. .oWMk':0MNo. cXMXc'dWMx. ,0KlxNd. .;dO00kd;cK0c:loxkOko:. +/// cNM0' oNMk. ;XM0' .lXM0' ;0MNo. oWWd. .oWMx. ,0MNl :KMX: lWMx. .dWx.'kkcd0Kxc'. .kK: .;dkO0d, +/// ,KMX: .kWWo. ;XM0' .kMNc ;KMNo. oWWd. .oWWd. ;KMXl :KMXc lWMx. .ONc ;kX0o. .xXc 'kk::kKx, +/// .kWWo. ,KMX: ;XM0' .OMNc ;KMNo. oWWd. .oWMd. ;KMXc ;KMXc lWMx. .ONc.cKKddx:. .OK; ,00, .c00c +/// lNMO. lNMO' ;XM0' .dNMO. :KMMKocccccccccl0WM0l;. .oWMx. :KMXc ;0MNl lWMx. .dNxlKO,.,x0Ol' :Kk. cXk'.:d0x; +/// ;KMK; .xWWd. ;XMXc..........';o0WWO, ;0WWWWWWWWWWWWWWWMMMMW0, .oWWd. :XMXl,c0MNl. lWMx. ,0Xxc' 'lk0ko:;lx:. ,OKookko,. +/// .kMNo ,0MXc .kWMWNNNNNXNNNNNWWXk:. .,;;;;;;;;;;;;;,:OMWO:' .oWMd. :0WWWWWKc. lWMx. ;0Kc. .':okOOOkkxdcck0l,:,. +/// .co:. ,ll, .;lllloolllllllc;. 'll' 'll, .;cll;. 'll, ,dOKx, ;xd:,,;cox0k; +/// .d0lck0kc,. ,xKk;..':dOkc. +/// .dNo..,lddllk0Oxddxkkxl,. +/// lXk;';cdO0ko,':lc:,. +/// 'x0Okkdl:'. +/// .,'.. +/// This is a full featured AD4M client. +/// Provides all means of interacting with the AD4M executor / agent. +/// See help of commands for more information. +#[derive(Parser, Debug)] +#[command(author, version, verbatim_doc_comment)] +struct ClapApp { + #[command(subcommand)] + domain: Domain, + + /// Don't request/use capability token - provide empty string + #[arg(short, long, action)] + no_capability: bool, + + /// Override default executor URL look-up and provide custom URL + #[arg(short, long)] + executor_url: Option, + + /// Provide admin credential to gain all capabilities + #[arg(short, long)] + admin_credential: Option, +} + +#[derive(Debug, Subcommand)] +enum Domain { + /// Functions related to local agent / user + Agent { + #[command(subcommand)] + command: AgentFunctions, + }, + + /// See, create, and manage Languages + Languages { + #[command(subcommand)] + command: Option, + }, + + /// Add, remove and access Perspectives / add and remove links + Perspectives { + #[command(subcommand)] + command: Option, + }, + /// Publish perspectives as Neighbourhoods and join Neighbourhoods + Neighbourhoods { + #[command(subcommand)] + command: NeighbourhoodFunctions, + }, + /// Access various states of the local AD4M executor + Runtime { + #[command(subcommand)] + command: RuntimeFunctions, + }, + /// Create and get language expressions + Expression { + #[command(subcommand)] + command: ExpressionFunctions, + }, + /// Print the executor log + Log +} + +async fn get_ad4m_client(args: &ClapApp) -> Result { + let executor_url = if let Some(custom_url) = args.executor_url.clone() { + custom_url + } else { + crate::startup::get_executor_url()? + }; + + let cap_token = if let Some(admin_credential) = &args.admin_credential { + admin_credential.clone() + } else if args.no_capability { + "".to_string() + } else { + match &args.domain { + Domain::Log => "".to_string(), + Domain::Agent { command } => match command { + AgentFunctions::Lock + | AgentFunctions::Unlock { .. } + | AgentFunctions::Generate { .. } => "".to_string(), + _ => startup::get_cap_token(executor_url.clone()).await?, + }, + _ => startup::get_cap_token(executor_url.clone()).await?, + } + }; + + let ad4m_client = Ad4mClient::new(executor_url, cap_token); + + Ok(ad4m_client) +} + +#[tokio::main(flavor = "multi_thread")] +async fn main() -> Result<()> { + let args = ClapApp::parse(); + + let ad4m_client = get_ad4m_client(&args).await?; + + match args.domain { + Domain::Agent { command } => agent::run(ad4m_client, command).await?, + Domain::Languages { command } => languages::run(ad4m_client, command).await?, + Domain::Perspectives { command } => perspectives::run(ad4m_client, command).await?, + Domain::Neighbourhoods { command } => neighbourhoods::run(ad4m_client, command).await?, + Domain::Runtime { command } => runtime::run(ad4m_client, command).await?, + Domain::Expression { command } => expression::run(ad4m_client, command).await?, + Domain::Log => { + let file = executor_data_path().join("ad4m.log"); + let log = std::fs::read_to_string(file.clone()).with_context(|| { + format!( + "Could not read log file `{}`!\nIs AD4M executor running?", + file.display() + ) + })?; + println!("{}", log); + } + } + + Ok(()) +} diff --git a/cli/src/ad4m_executor.rs b/cli/src/ad4m_executor.rs new file mode 100644 index 000000000..60124fa18 --- /dev/null +++ b/cli/src/ad4m_executor.rs @@ -0,0 +1,210 @@ +#![allow(dead_code)] +extern crate ad4m_client; +extern crate anyhow; +extern crate chrono; +extern crate clap; +extern crate dirs; +extern crate rand; +extern crate regex; +extern crate rustyline; +extern crate tokio; +extern crate kitsune_p2p_types; + +mod formatting; +mod startup; +mod util; + +mod agent; +mod bootstrap_publish; +mod dev; +mod expression; +mod languages; +mod neighbourhoods; +mod perspectives; +mod repl; +mod runtime; + +use ad4m_client::*; +use anyhow::Result; +use clap::{Parser, Subcommand}; +use dev::DevFunctions; +use rust_executor::Ad4mConfig; + +/// AD4M command line interface. +/// https://ad4m.dev +/// .xXKkd:' +/// .oNOccx00x;. +/// ;KK; .ck0Oxdolc;.. +/// lWk:oOK0OxdoxOOO0KOd;. +/// dWkdkl,. .o0x;'cxK0l. +/// .,ldxxxxxxoc. .cdxxxxxxxxxxxdoc,. 'oxo' ;dx; .;dxxxo:. .;odxxx: .dWk' .dNx. 'o0O: +/// .xNWNKKKKKXWWK: 'OWWX0000000000KNWWKo. ,0WNd. dWWd. .oWMNXNWKc. :0WWXNMMk. :dxX0, .,cllOXo:oooxkd, +/// .xWWk,......lXMK; ;XMK:. . . ....':kNWK; ,0MNo. oWWd. .oWMk':0MNo. cXMXc'dWMx. ,0KlxNd. .;dO00kd;cK0c:loxkOko:. +/// cNM0' oNMk. ;XM0' .lXM0' ;0MNo. oWWd. .oWMx. ,0MNl :KMX: lWMx. .dWx.'kkcd0Kxc'. .kK: .;dkO0d, +/// ,KMX: .kWWo. ;XM0' .kMNc ;KMNo. oWWd. .oWWd. ;KMXl :KMXc lWMx. .ONc ;kX0o. .xXc 'kk::kKx, +/// .kWWo. ,KMX: ;XM0' .OMNc ;KMNo. oWWd. .oWMd. ;KMXc ;KMXc lWMx. .ONc.cKKddx:. .OK; ,00, .c00c +/// lNMO. lNMO' ;XM0' .dNMO. :KMMKocccccccccl0WM0l;. .oWMx. :KMXc ;0MNl lWMx. .dNxlKO,.,x0Ol' :Kk. cXk'.:d0x; +/// ;KMK; .xWWd. ;XMXc..........';o0WWO, ;0WWWWWWWWWWWWWWWMMMMW0, .oWWd. :XMXl,c0MNl. lWMx. ,0Xxc' 'lk0ko:;lx:. ,OKookko,. +/// .kMNo ,0MXc .kWMWNNNNNXNNNNNWWXk:. .,;;;;;;;;;;;;;,:OMWO:' .oWMd. :0WWWWWKc. lWMx. ;0Kc. .':okOOOkkxdcck0l,:,. +/// .co:. ,ll, .;lllloolllllllc;. 'll' 'll, .;cll;. 'll, ,dOKx, ;xd:,,;cox0k; +/// .d0lck0kc,. ,xKk;..':dOkc. +/// .dNo..,lddllk0Oxddxkkxl,. +/// lXk;';cdO0ko,':lc:,. +/// 'x0Okkdl:'. +/// .,'.. +/// This is a full featured AD4M client. +/// Provides all means of interacting with the AD4M executor / agent. +/// See help of commands for more information. +#[derive(Parser, Debug)] +#[command(author, version, verbatim_doc_comment)] +struct ClapApp { + #[command(subcommand)] + domain: Domain, + + /// Don't request/use capability token - provide empty string + #[arg(short, long, action)] + no_capability: bool, + + /// Override default executor URL look-up and provide custom URL + #[arg(short, long)] + executor_url: Option, + + /// Provide admin credential to gain all capabilities + #[arg(short, long)] + admin_credential: Option, +} + +#[derive(Debug, Subcommand)] +enum Domain { + /// Print the executor log + Log, + Dev { + #[command(subcommand)] + command: DevFunctions, + }, + Init { + #[arg(short, long, action)] + data_path: Option, + #[arg(short, long, action)] + network_bootstrap_seed: Option, + }, + Run { + #[arg(short, long, action)] + app_data_path: Option, + #[arg(short, long, action)] + network_bootstrap_seed: Option, + #[arg(short, long, action)] + language_language_only: Option, + #[arg(long, action)] + run_dapp_server: Option, + #[arg(short, long, action)] + gql_port: Option, + #[arg(long, action)] + hc_admin_port: Option, + #[arg(long, action)] + hc_app_port: Option, + #[arg(long, action)] + hc_use_bootstrap: Option, + #[arg(long, action)] + hc_use_local_proxy: Option, + #[arg(long, action)] + hc_use_mdns: Option, + #[arg(long, action)] + hc_use_proxy: Option, + #[arg(long, action)] + hc_proxy_url: Option, + #[arg(long, action)] + hc_bootstrap_url: Option, + #[arg(short, long, action)] + connect_holochain: Option, + #[arg(long, action)] + admin_credential: Option + }, + RunLocalHcServices {} +} + +#[tokio::main(flavor = "multi_thread")] +async fn main() -> Result<()> { + let args = ClapApp::parse(); + + if let Domain::Dev { command } = args.domain { + dev::run(command).await?; + return Ok(()); + }; + + if let Domain::Init { + data_path, + network_bootstrap_seed, + } = args.domain + { + match rust_executor::init::init(data_path, network_bootstrap_seed) { + Ok(()) => println!("Successfully initialized AD4M executor!"), + Err(e) => { + println!("Failed to initialize AD4M executor: {}", e); + std::process::exit(1); + } + }; + return Ok(()); + }; + + if let Domain::Run { + app_data_path, + network_bootstrap_seed, + language_language_only, + run_dapp_server, + gql_port, + hc_admin_port, + hc_app_port, + hc_use_bootstrap, + hc_use_local_proxy, + hc_use_mdns, + hc_use_proxy, + hc_proxy_url, + hc_bootstrap_url, + connect_holochain, + admin_credential + } = args.domain + { + let _ = tokio::spawn(async move { + rust_executor::run(Ad4mConfig { + app_data_path, + network_bootstrap_seed, + language_language_only, + run_dapp_server, + gql_port, + hc_admin_port, + hc_app_port, + hc_use_bootstrap, + hc_use_local_proxy, + hc_use_mdns, + hc_use_proxy, + hc_proxy_url, + hc_bootstrap_url, + connect_holochain, + admin_credential, + auto_permit_cap_requests: Some(true) + }).await; + }).await; + + let _ = ctrlc::set_handler(move || { + println!("Received CTRL-C! Exiting..."); + exit(0); + }); + + use tokio::time::sleep; + use std::time::Duration; + use std::process::exit; + use ctrlc; + + loop { + sleep(Duration::from_secs(2)).await; + } + }; + + if let Domain::RunLocalHcServices {} = args.domain { + rust_executor::run_local_hc_services().await?; + return Ok(()); + } + + Ok(()) +} diff --git a/cli/src/dev.rs b/cli/src/dev.rs index b5eacda6c..acd81e2a8 100644 --- a/cli/src/dev.rs +++ b/cli/src/dev.rs @@ -48,8 +48,11 @@ pub async fn run(command: DevFunctions) -> Result<()> { admin_credential: Some(String::from("*")), hc_proxy_url: None, hc_bootstrap_url: None, + auto_permit_cap_requests: Some(true), }) - .await; + .await + .join() + .expect("Error awaiting executor main thread"); }); let test_res = tokio::task::spawn(async move { @@ -176,8 +179,11 @@ pub async fn run(command: DevFunctions) -> Result<()> { admin_credential: None, hc_proxy_url: None, hc_bootstrap_url: None, + auto_permit_cap_requests: Some(true), }) - .await; + .await + .join() + .expect("Error awaiting executor main thread"); }); //Spawn in a new thread so we can continue reading logs in loop below, whilst publishing is happening diff --git a/cli/src/main.rs b/cli/src/main.rs index 3f18a9480..034300022 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -7,6 +7,7 @@ extern crate rand; extern crate regex; extern crate rustyline; extern crate tokio; +extern crate kitsune_p2p_types; mod formatting; mod startup; @@ -69,6 +70,10 @@ struct ClapApp { /// Override default executor URL look-up and provide custom URL #[arg(short, long)] executor_url: Option, + + /// Provide admin credential to gain all capabilities + #[arg(short, long)] + admin_credential: Option, } #[derive(Debug, Subcommand)] @@ -159,7 +164,9 @@ async fn get_ad4m_client(args: &ClapApp) -> Result { crate::startup::get_executor_url()? }; - let cap_token = if args.no_capability { + let cap_token = if let Some(admin_credential) = &args.admin_credential { + admin_credential.clone() + } else if args.no_capability { "".to_string() } else { match &args.domain { @@ -222,7 +229,7 @@ async fn main() -> Result<()> { } = args.domain { let _ = tokio::spawn(async move { - rust_executor::run_with_tokio(Ad4mConfig { + rust_executor::run(Ad4mConfig { app_data_path, network_bootstrap_seed, language_language_only, diff --git a/cli/src/runtime.rs b/cli/src/runtime.rs index f4c47109f..b5ab3f0cc 100644 --- a/cli/src/runtime.rs +++ b/cli/src/runtime.rs @@ -2,7 +2,7 @@ use crate::formatting::{print_message_perspective, print_sent_message_perspectiv use ad4m_client::Ad4mClient; use anyhow::Result; use clap::Subcommand; - +use kitsune_p2p_types::{agent_info::AgentInfoSigned, dependencies::lair_keystore_api::dependencies::base64}; use crate::util::string_2_perspective_snapshot; #[derive(Debug, Subcommand)] @@ -32,7 +32,7 @@ pub enum RuntimeFunctions { Friends, HcAgentInfos, HcAddAgentInfos { - infos: String, + infos_file: Option, }, VerifySignature { did: String, @@ -118,11 +118,46 @@ pub async fn run(ad4m_client: Ad4mClient, command: RuntimeFunctions) -> Result<( } RuntimeFunctions::HcAgentInfos => { let infos = ad4m_client.runtime.hc_agent_infos().await?; - println!("{}", infos); + println!("\x1b[36mAll AgentInfos encoded:\n \x1b[32m{}\n\n", infos); + + let encoded_agent_infos: Vec = serde_json::from_str(&infos)?; + let agent_infos: Vec<(AgentInfoSigned, String)> = encoded_agent_infos + .into_iter() + .map(|encoded_info| { + let info_bytes = base64::decode(encoded_info.clone()) + .expect("Failed to decode base64 AgentInfoSigned"); + ( + AgentInfoSigned::decode(&info_bytes) + .expect("Failed to decode AgentInfoSigned"), + encoded_info, + ) + + }) + .collect(); + + println!("\x1b[36mSeparate AgentInfos:\n"); + for agent_info in &agent_infos { + println!("\x1b[36mAgent: \x1b[37m{:?}", agent_info.0.agent); + println!("\x1b[36mURL List: \x1b[94m{:?}", agent_info.0.url_list); + println!("\x1b[36mEncoded:\n\x1b[32m[{:?}]\n\n", agent_info.1); + } } - RuntimeFunctions::HcAddAgentInfos { infos } => { - ad4m_client.runtime.hc_add_agent_infos(infos).await?; - println!("Holochain agent infos added!"); + RuntimeFunctions::HcAddAgentInfos { infos_file } => { + if let Some(infos_file) = infos_file { + let infos = std::fs::read_to_string(infos_file)?; + ad4m_client.runtime.hc_add_agent_infos(infos).await?; + println!("Holochain agent infos added!"); + } else { + let mut rl = rustyline::Editor::<()>::new()?; + let readline = rl.readline("Please enter the encoded agent infos string: "); + match readline { + Ok(line) => { + ad4m_client.runtime.hc_add_agent_infos(line).await?; + println!("Holochain agent infos added!"); + }, + Err(_) => println!("Failed to read line"), + } + } } RuntimeFunctions::VerifySignature { did, diff --git a/connect/package.json b/connect/package.json index 74ee79bdd..c5e27a4ce 100644 --- a/connect/package.json +++ b/connect/package.json @@ -66,5 +66,5 @@ "esbuild-plugin-replace": "^1.4.0", "lit": "^2.3.1" }, - "version": "0.8.1" + "version": "0.9.0" } diff --git a/connect/src/components/Start.ts b/connect/src/components/Start.ts index d480083f8..80625d5b4 100644 --- a/connect/src/components/Start.ts +++ b/connect/src/components/Start.ts @@ -46,17 +46,22 @@ export default function Start({ ` : html`
connect()}> - Connect to AD4M + Connect to ADAM

- Please connect to AD4M once you have downloaded and setup your - AD4M agent + Please connect to ADAM once you have downloaded and setup your + ADAM agent

`} +

+ Please make sure you have the ADAM Launcher running on your computer and there are no browser restrictions ("Shields") blocking your connection to ADAM on localhost. + (Safari users: please use a different browser for now. Safari is very strict about this and we are working on a solution.) +

+
Learn more about AD4MLearn more about ADAM
diff --git a/connect/src/utils.ts b/connect/src/utils.ts index 907fa30b2..21696235f 100644 --- a/connect/src/utils.ts +++ b/connect/src/utils.ts @@ -10,9 +10,13 @@ function Timeout() { return controller; } -export async function connectWebSocket(url, timeout = 5000) { +export async function connectWebSocket(url, timeout = 10000) { return Promise.race([ new Promise((resolve, reject) => { + if (!url.includes("localhost")) { + resolve(new WebSocket(url)); + } + const websocket = new WebSocket(url); websocket.onopen = () => { diff --git a/connect/src/web.ts b/connect/src/web.ts index 938d8ad56..6ddfc0a5e 100644 --- a/connect/src/web.ts +++ b/connect/src/web.ts @@ -451,7 +451,7 @@ export class Ad4mConnectElement extends LitElement { // TODO: localstorage doesnt work here @property({ type: String }) - token = getForVersion("ad4murl") || ""; + token = getForVersion("ad4mToken") || ""; // TODO: localstorage doesnt work here @property({ type: String, reflect: true }) @@ -648,7 +648,10 @@ export class Ad4mConnectElement extends LitElement { if (this.uiState === "qr") { return ScanQRCode({ changeState: this.changeUIState, - onSuccess: (url) => this._client.connect(url), + onSuccess: (url) => { + this.changeUrl(url); + this._client.connect(url) + }, uiState: this.uiState, }); } diff --git a/core/README.md b/core/README.md index 8613437cf..f6241daf8 100644 --- a/core/README.md +++ b/core/README.md @@ -14,8 +14,8 @@ on the user's machine. The easiest way to get that is to use ad4m-cli: ```sh -npm install -g @coasys/ad4m-cli -ad4m executor run & +cargo install ad4m +ad4m-executor run ``` Then use `Ad4mClient` to connect to and work with the running ad4m-executor like this: diff --git a/core/package.json b/core/package.json index af29044cd..82422f26d 100644 --- a/core/package.json +++ b/core/package.json @@ -42,10 +42,10 @@ "type-graphql": "1.1.1" }, "devDependencies": { + "@apollo/server": "^4.9.4", "@rollup/plugin-alias": "^3.1.5", "@rollup/plugin-commonjs": "^20.0.0", "@rollup/plugin-node-resolve": "^13.0.4", - "@apollo/server": "^4.9.4", "concat-md": "^0.5.0", "cross-fetch": "^3.1.4", "graphql-ws": "5.12.0", @@ -55,7 +55,15 @@ "rollup": "^2.56.3", "ts-jest": "^26.5.6", "typescript": "^4.6.2", - "ws": "8.13.0" + "ws": "8.13.0", + "@types/node": "*", + "@types/yargs": "*" }, - "version": "0.8.1" + "patchedDependencies": {}, + "version": "0.9.0", + "pnpm": { + "patchedDependencies": { + "graphql@15.7.2": "patches/graphql@15.7.2.patch" + } + } } diff --git a/core/patches/graphql@15.7.2.patch b/core/patches/graphql@15.7.2.patch new file mode 100644 index 000000000..6348316b3 --- /dev/null +++ b/core/patches/graphql@15.7.2.patch @@ -0,0 +1,39 @@ +diff --git a/jsutils/instanceOf.js b/jsutils/instanceOf.js +index 709809415e672ef9fc2d8be060129fd832844ce9..99ba91717b9cc12c55e2d2854903f3e45b1f3e96 100644 +--- a/jsutils/instanceOf.js ++++ b/jsutils/instanceOf.js +@@ -13,7 +13,7 @@ function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "functi + + // See: https://expressjs.com/en/advanced/best-practice-performance.html#set-node_env-to-production + // See: https://webpack.js.org/guides/production/ +-var _default = process.env.NODE_ENV === 'production' ? // istanbul ignore next (See: 'https://github.com/graphql/graphql-js/issues/2317') ++var _default = true ? // istanbul ignore next (See: 'https://github.com/graphql/graphql-js/issues/2317') + // eslint-disable-next-line no-shadow + function instanceOf(value, constructor) { + return value instanceof constructor; +diff --git a/jsutils/instanceOf.js.flow b/jsutils/instanceOf.js.flow +index 58faa02c8b490cb5caeccfb6b7ffc1faf3277554..8d476bfa2d0e772d5d0e6f74eb39824df89c455d 100644 +--- a/jsutils/instanceOf.js.flow ++++ b/jsutils/instanceOf.js.flow +@@ -12,7 +12,7 @@ declare function instanceOf( + + // See: https://expressjs.com/en/advanced/best-practice-performance.html#set-node_env-to-production + // See: https://webpack.js.org/guides/production/ +-export default process.env.NODE_ENV === 'production' ++export default true + ? // istanbul ignore next (See: 'https://github.com/graphql/graphql-js/issues/2317') + // eslint-disable-next-line no-shadow + function instanceOf(value: mixed, constructor: mixed): boolean { +diff --git a/jsutils/instanceOf.mjs b/jsutils/instanceOf.mjs +index ff46fcaf4c187eed1523fc923d5b67697ff2d793..5a1f7a2ad87cb0dad8a7b47a9a09b49286022b88 100644 +--- a/jsutils/instanceOf.mjs ++++ b/jsutils/instanceOf.mjs +@@ -8,7 +8,7 @@ import inspect from "./inspect.mjs"; + + // See: https://expressjs.com/en/advanced/best-practice-performance.html#set-node_env-to-production + // See: https://webpack.js.org/guides/production/ +-export default process.env.NODE_ENV === 'production' ? // istanbul ignore next (See: 'https://github.com/graphql/graphql-js/issues/2317') ++export default true ? // istanbul ignore next (See: 'https://github.com/graphql/graphql-js/issues/2317') + // eslint-disable-next-line no-shadow + function instanceOf(value, constructor) { + return value instanceof constructor; diff --git a/core/pnpm-lock.yaml b/core/pnpm-lock.yaml new file mode 100644 index 000000000..6f15f6424 --- /dev/null +++ b/core/pnpm-lock.yaml @@ -0,0 +1,6507 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +patchedDependencies: + graphql@15.7.2: + hash: g4ubilmxli6fuk7eusupjbkdjm + path: patches/graphql@15.7.2.patch + +importers: + + .: + dependencies: + '@apollo/client': + specifier: 3.7.10 + version: 3.7.10(graphql-ws@5.12.0)(graphql@15.7.2) + '@holochain/client': + specifier: 0.16.0 + version: 0.16.0 + '@types/jest': + specifier: ^26.0.14 + version: 26.0.24 + class-validator: + specifier: ^0.13.1 + version: 0.13.2 + express: + specifier: 4.18.2 + version: 4.18.2 + graphql: + specifier: 15.7.2 + version: 15.7.2(patch_hash=g4ubilmxli6fuk7eusupjbkdjm) + reflect-metadata: + specifier: ^0.1.13 + version: 0.1.14 + type-graphql: + specifier: 1.1.1 + version: 1.1.1(class-validator@0.13.2)(graphql@15.7.2) + devDependencies: + '@apollo/server': + specifier: ^4.9.4 + version: 4.10.0(graphql@15.7.2) + '@rollup/plugin-alias': + specifier: ^3.1.5 + version: 3.1.9(rollup@2.79.1) + '@rollup/plugin-commonjs': + specifier: ^20.0.0 + version: 20.0.0(rollup@2.79.1) + '@rollup/plugin-node-resolve': + specifier: ^13.0.4 + version: 13.3.0(rollup@2.79.1) + '@types/node': + specifier: '*' + version: 20.11.7 + '@types/yargs': + specifier: '*' + version: 15.0.19 + concat-md: + specifier: ^0.5.0 + version: 0.5.1 + cross-fetch: + specifier: ^3.1.4 + version: 3.1.8 + graphql-ws: + specifier: 5.12.0 + version: 5.12.0(graphql@15.7.2) + honkit: + specifier: ^4.0.0 + version: 4.0.8 + jest: + specifier: ^26.6.0 + version: 26.6.3 + patch-package: + specifier: ^8.0.0 + version: 8.0.0 + rollup: + specifier: ^2.56.3 + version: 2.79.1 + ts-jest: + specifier: ^26.5.6 + version: 26.5.6(jest@26.6.3)(typescript@4.9.5) + typescript: + specifier: ^4.6.2 + version: 4.9.5 + ws: + specifier: 8.13.0 + version: 8.13.0 + +packages: + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.22 + dev: true + + /@apollo/cache-control-types@1.0.3(graphql@15.7.2): + resolution: {integrity: sha512-F17/vCp7QVwom9eG7ToauIKdAxpSoadsJnqIfyryLFSkLSOEqu+eC5Z3N8OXcUVStuOMcNHlyraRsA6rRICu4g==} + peerDependencies: + graphql: 14.x || 15.x || 16.x + dependencies: + graphql: 15.7.2(patch_hash=g4ubilmxli6fuk7eusupjbkdjm) + dev: true + + /@apollo/client@3.7.10(graphql-ws@5.12.0)(graphql@15.7.2): + resolution: {integrity: sha512-/k1MfrqPKYiPNdHcOzdxg9cEx96vhAGxAcSorzfBvV29XtFQcYW2cPNQOTjK/fpSMtqVo8UNmu5vwQAWD1gfCg==} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 + graphql-ws: ^5.5.5 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + subscriptions-transport-ws: ^0.9.0 || ^0.11.0 + peerDependenciesMeta: + graphql-ws: + optional: true + react: + optional: true + react-dom: + optional: true + subscriptions-transport-ws: + optional: true + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@15.7.2) + '@wry/context': 0.7.4 + '@wry/equality': 0.5.7 + '@wry/trie': 0.3.2 + graphql: 15.7.2(patch_hash=g4ubilmxli6fuk7eusupjbkdjm) + graphql-tag: 2.12.6(graphql@15.7.2) + graphql-ws: 5.12.0(graphql@15.7.2) + hoist-non-react-statics: 3.3.2 + optimism: 0.16.2 + prop-types: 15.8.1 + response-iterator: 0.2.6 + symbol-observable: 4.0.0 + ts-invariant: 0.10.3 + tslib: 2.6.2 + zen-observable-ts: 1.2.5 + dev: false + + /@apollo/protobufjs@1.2.7: + resolution: {integrity: sha512-Lahx5zntHPZia35myYDBRuF58tlwPskwHc5CWBZC/4bMKB6siTBWwtMrkqXcsNwQiFSzSx5hKdRPUmemrEp3Gg==} + hasBin: true + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/long': 4.0.2 + long: 4.0.0 + dev: true + + /@apollo/server-gateway-interface@1.1.1(graphql@15.7.2): + resolution: {integrity: sha512-pGwCl/po6+rxRmDMFgozKQo2pbsSwE91TpsDBAOgf74CRDPXHHtM88wbwjab0wMMZh95QfR45GGyDIdhY24bkQ==} + peerDependencies: + graphql: 14.x || 15.x || 16.x + dependencies: + '@apollo/usage-reporting-protobuf': 4.1.1 + '@apollo/utils.fetcher': 2.0.1 + '@apollo/utils.keyvaluecache': 2.1.1 + '@apollo/utils.logger': 2.0.1 + graphql: 15.7.2(patch_hash=g4ubilmxli6fuk7eusupjbkdjm) + dev: true + + /@apollo/server@4.10.0(graphql@15.7.2): + resolution: {integrity: sha512-pLx//lZ/pvUfWL9G8Np8+y3ujc0pYc8U7dwD6ztt9FAw8NmCPzPaDzlXLBAjGU6WnkqVBOnz8b3dOwRNjLYSUA==} + engines: {node: '>=14.16.0'} + peerDependencies: + graphql: ^16.6.0 + dependencies: + '@apollo/cache-control-types': 1.0.3(graphql@15.7.2) + '@apollo/server-gateway-interface': 1.1.1(graphql@15.7.2) + '@apollo/usage-reporting-protobuf': 4.1.1 + '@apollo/utils.createhash': 2.0.1 + '@apollo/utils.fetcher': 2.0.1 + '@apollo/utils.isnodelike': 2.0.1 + '@apollo/utils.keyvaluecache': 2.1.1 + '@apollo/utils.logger': 2.0.1 + '@apollo/utils.usagereporting': 2.1.0(graphql@15.7.2) + '@apollo/utils.withrequired': 2.0.1 + '@graphql-tools/schema': 9.0.19(graphql@15.7.2) + '@josephg/resolvable': 1.0.1 + '@types/express': 4.17.21 + '@types/express-serve-static-core': 4.17.42 + '@types/node-fetch': 2.6.11 + async-retry: 1.3.3 + cors: 2.8.5 + express: 4.18.2 + graphql: 15.7.2(patch_hash=g4ubilmxli6fuk7eusupjbkdjm) + loglevel: 1.9.1 + lru-cache: 7.18.3 + negotiator: 0.6.3 + node-abort-controller: 3.1.1 + node-fetch: 2.7.0 + uuid: 9.0.1 + whatwg-mimetype: 3.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@apollo/usage-reporting-protobuf@4.1.1: + resolution: {integrity: sha512-u40dIUePHaSKVshcedO7Wp+mPiZsaU6xjv9J+VyxpoU/zL6Jle+9zWeG98tr/+SZ0nZ4OXhrbb8SNr0rAPpIDA==} + dependencies: + '@apollo/protobufjs': 1.2.7 + dev: true + + /@apollo/utils.createhash@2.0.1: + resolution: {integrity: sha512-fQO4/ZOP8LcXWvMNhKiee+2KuKyqIcfHrICA+M4lj/h/Lh1H10ICcUtk6N/chnEo5HXu0yejg64wshdaiFitJg==} + engines: {node: '>=14'} + dependencies: + '@apollo/utils.isnodelike': 2.0.1 + sha.js: 2.4.11 + dev: true + + /@apollo/utils.dropunuseddefinitions@2.0.1(graphql@15.7.2): + resolution: {integrity: sha512-EsPIBqsSt2BwDsv8Wu76LK5R1KtsVkNoO4b0M5aK0hx+dGg9xJXuqlr7Fo34Dl+y83jmzn+UvEW+t1/GP2melA==} + engines: {node: '>=14'} + peerDependencies: + graphql: 14.x || 15.x || 16.x + dependencies: + graphql: 15.7.2(patch_hash=g4ubilmxli6fuk7eusupjbkdjm) + dev: true + + /@apollo/utils.fetcher@2.0.1: + resolution: {integrity: sha512-jvvon885hEyWXd4H6zpWeN3tl88QcWnHp5gWF5OPF34uhvoR+DFqcNxs9vrRaBBSY3qda3Qe0bdud7tz2zGx1A==} + engines: {node: '>=14'} + dev: true + + /@apollo/utils.isnodelike@2.0.1: + resolution: {integrity: sha512-w41XyepR+jBEuVpoRM715N2ZD0xMD413UiJx8w5xnAZD2ZkSJnMJBoIzauK83kJpSgNuR6ywbV29jG9NmxjK0Q==} + engines: {node: '>=14'} + dev: true + + /@apollo/utils.keyvaluecache@2.1.1: + resolution: {integrity: sha512-qVo5PvUUMD8oB9oYvq4ViCjYAMWnZ5zZwEjNF37L2m1u528x5mueMlU+Cr1UinupCgdB78g+egA1G98rbJ03Vw==} + engines: {node: '>=14'} + dependencies: + '@apollo/utils.logger': 2.0.1 + lru-cache: 7.18.3 + dev: true + + /@apollo/utils.logger@2.0.1: + resolution: {integrity: sha512-YuplwLHaHf1oviidB7MxnCXAdHp3IqYV8n0momZ3JfLniae92eYqMIx+j5qJFX6WKJPs6q7bczmV4lXIsTu5Pg==} + engines: {node: '>=14'} + dev: true + + /@apollo/utils.printwithreducedwhitespace@2.0.1(graphql@15.7.2): + resolution: {integrity: sha512-9M4LUXV/fQBh8vZWlLvb/HyyhjJ77/I5ZKu+NBWV/BmYGyRmoEP9EVAy7LCVoY3t8BDcyCAGfxJaLFCSuQkPUg==} + engines: {node: '>=14'} + peerDependencies: + graphql: 14.x || 15.x || 16.x + dependencies: + graphql: 15.7.2(patch_hash=g4ubilmxli6fuk7eusupjbkdjm) + dev: true + + /@apollo/utils.removealiases@2.0.1(graphql@15.7.2): + resolution: {integrity: sha512-0joRc2HBO4u594Op1nev+mUF6yRnxoUH64xw8x3bX7n8QBDYdeYgY4tF0vJReTy+zdn2xv6fMsquATSgC722FA==} + engines: {node: '>=14'} + peerDependencies: + graphql: 14.x || 15.x || 16.x + dependencies: + graphql: 15.7.2(patch_hash=g4ubilmxli6fuk7eusupjbkdjm) + dev: true + + /@apollo/utils.sortast@2.0.1(graphql@15.7.2): + resolution: {integrity: sha512-eciIavsWpJ09za1pn37wpsCGrQNXUhM0TktnZmHwO+Zy9O4fu/WdB4+5BvVhFiZYOXvfjzJUcc+hsIV8RUOtMw==} + engines: {node: '>=14'} + peerDependencies: + graphql: 14.x || 15.x || 16.x + dependencies: + graphql: 15.7.2(patch_hash=g4ubilmxli6fuk7eusupjbkdjm) + lodash.sortby: 4.7.0 + dev: true + + /@apollo/utils.stripsensitiveliterals@2.0.1(graphql@15.7.2): + resolution: {integrity: sha512-QJs7HtzXS/JIPMKWimFnUMK7VjkGQTzqD9bKD1h3iuPAqLsxd0mUNVbkYOPTsDhUKgcvUOfOqOJWYohAKMvcSA==} + engines: {node: '>=14'} + peerDependencies: + graphql: 14.x || 15.x || 16.x + dependencies: + graphql: 15.7.2(patch_hash=g4ubilmxli6fuk7eusupjbkdjm) + dev: true + + /@apollo/utils.usagereporting@2.1.0(graphql@15.7.2): + resolution: {integrity: sha512-LPSlBrn+S17oBy5eWkrRSGb98sWmnEzo3DPTZgp8IQc8sJe0prDgDuppGq4NeQlpoqEHz0hQeYHAOA0Z3aQsxQ==} + engines: {node: '>=14'} + peerDependencies: + graphql: 14.x || 15.x || 16.x + dependencies: + '@apollo/usage-reporting-protobuf': 4.1.1 + '@apollo/utils.dropunuseddefinitions': 2.0.1(graphql@15.7.2) + '@apollo/utils.printwithreducedwhitespace': 2.0.1(graphql@15.7.2) + '@apollo/utils.removealiases': 2.0.1(graphql@15.7.2) + '@apollo/utils.sortast': 2.0.1(graphql@15.7.2) + '@apollo/utils.stripsensitiveliterals': 2.0.1(graphql@15.7.2) + graphql: 15.7.2(patch_hash=g4ubilmxli6fuk7eusupjbkdjm) + dev: true + + /@apollo/utils.withrequired@2.0.1: + resolution: {integrity: sha512-YBDiuAX9i1lLc6GeTy1m7DGLFn/gMnvXqlalOIMjM7DeOgIacEjjfwPqb0M1CQ2v11HhR15d1NmxJoRCfrNqcA==} + engines: {node: '>=14'} + dev: true + + /@asciidoctor/cli@3.5.0(@asciidoctor/core@2.2.6): + resolution: {integrity: sha512-/VMHXcZBnZ9vgWfmqk9Hu0x0gMjPLup0YGq/xA8qCQuk11kUIZNMVQwgSsIUzOEwJqIUD7CgncJdtfwv1Ndxuw==} + engines: {node: '>=8.11', npm: '>=5.0.0'} + hasBin: true + peerDependencies: + '@asciidoctor/core': ^2.0.0-rc.1 + dependencies: + '@asciidoctor/core': 2.2.6 + yargs: 16.2.0 + dev: true + + /@asciidoctor/core@2.2.6: + resolution: {integrity: sha512-TmB2K5UfpDpSbCNBBntXzKHcAk2EA3/P68jmWvmJvglVUdkO9V6kTAuXVe12+h6C4GK0ndwuCrHHtEVcL5t6pQ==} + engines: {node: '>=8.11', npm: '>=5.0.0', yarn: '>=1.1.0'} + dependencies: + asciidoctor-opal-runtime: 0.3.3 + unxhr: 1.0.1 + dev: true + + /@babel/code-frame@7.23.5: + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.23.4 + chalk: 2.4.2 + dev: true + + /@babel/compat-data@7.23.5: + resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core@7.23.9: + resolution: {integrity: sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) + '@babel/helpers': 7.23.9 + '@babel/parser': 7.23.9 + '@babel/template': 7.23.9 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.23.6: + resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.9 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.22 + jsesc: 2.5.2 + dev: true + + /@babel/helper-compilation-targets@7.23.6: + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.22.2 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.23.9 + '@babel/types': 7.23.9 + dev: true + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.9 + dev: true + + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.9 + dev: true + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.9): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.9 + dev: true + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.9 + dev: true + + /@babel/helper-string-parser@7.23.4: + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-option@7.23.5: + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers@7.23.9: + resolution: {integrity: sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.23.9 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight@7.23.4: + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@babel/parser@7.23.9: + resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.9 + dev: true + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.9): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.9): + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.9): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.9): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.9): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.9): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.9): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.9): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.9): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.9): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.9): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.9): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/template@7.23.9: + resolution: {integrity: sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 + dev: true + + /@babel/traverse@7.23.9: + resolution: {integrity: sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.23.9: + resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: true + + /@bcoe/v8-coverage@0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: true + + /@cnakazawa/watch@1.0.4: + resolution: {integrity: sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==} + engines: {node: '>=0.1.95'} + hasBin: true + dependencies: + exec-sh: 0.3.6 + minimist: 1.2.8 + dev: true + + /@graphql-tools/merge@8.4.2(graphql@15.7.2): + resolution: {integrity: sha512-XbrHAaj8yDuINph+sAfuq3QCZ/tKblrTLOpirK0+CAgNlZUCHs0Fa+xtMUURgwCVThLle1AF7svJCxFizygLsw==} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/utils': 9.2.1(graphql@15.7.2) + graphql: 15.7.2(patch_hash=g4ubilmxli6fuk7eusupjbkdjm) + tslib: 2.6.2 + dev: true + + /@graphql-tools/schema@9.0.19(graphql@15.7.2): + resolution: {integrity: sha512-oBRPoNBtCkk0zbUsyP4GaIzCt8C0aCI4ycIRUL67KK5pOHljKLBBtGT+Jr6hkzA74C8Gco8bpZPe7aWFjiaK2w==} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/merge': 8.4.2(graphql@15.7.2) + '@graphql-tools/utils': 9.2.1(graphql@15.7.2) + graphql: 15.7.2(patch_hash=g4ubilmxli6fuk7eusupjbkdjm) + tslib: 2.6.2 + value-or-promise: 1.0.12 + dev: true + + /@graphql-tools/utils@9.2.1(graphql@15.7.2): + resolution: {integrity: sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A==} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@15.7.2) + graphql: 15.7.2(patch_hash=g4ubilmxli6fuk7eusupjbkdjm) + tslib: 2.6.2 + dev: true + + /@graphql-typed-document-node/core@3.2.0(graphql@15.7.2): + resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + graphql: 15.7.2(patch_hash=g4ubilmxli6fuk7eusupjbkdjm) + + /@holochain/client@0.16.0: + resolution: {integrity: sha512-GJEl6F3OSlDX71H+rtyUXpEuor7O9MhvNIi+Tq6obrysu71JsbXfR1rtmSBiNb9fttHOZLW60EzY/Lj3I9dv8g==} + engines: {node: '>=16.0.0 || >=18.0.0'} + dependencies: + '@holochain/serialization': 0.1.0-beta-rc.3 + '@msgpack/msgpack': 2.8.0 + '@noble/ed25519': 2.0.0 + '@tauri-apps/api': 1.5.3 + emittery: 1.0.1 + isomorphic-ws: 5.0.0(ws@8.13.0) + js-base64: 3.7.6 + libsodium-wrappers: 0.7.13 + lodash-es: 4.17.21 + ws: 8.13.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@holochain/serialization@0.1.0-beta-rc.3: + resolution: {integrity: sha512-DJx4V2KXHVLciyOGjOYKTM/JLBpBEZ3RsPIRCgf7qmwhQdxXvhi2p+oFFRD51yUT5uC1/MzIVeJCl/R60PwFbw==} + dev: false + + /@honkit/asciidoc@4.0.8: + resolution: {integrity: sha512-wyVBKfX9yM5P8nm81ew1cdTR0hKWFB9hRTvwGXBVS+ipD+WFTQWxVw3qNQapMKRiiVq/L3QA6bpkIDul3EJ43w==} + dependencies: + '@honkit/html': 4.0.8 + asciidoctor: 2.2.6 + lodash: 4.17.21 + dev: true + + /@honkit/honkit-plugin-highlight@4.0.8: + resolution: {integrity: sha512-fu1QFxS/m0X9uIK8vrn9TGN2HLJ8AjK03L4/yZo+ioYG55ALgTE3tNz7CrGPGjUn+uluLMmrvcJQDpPUmTMYdQ==} + engines: {gitbook: '>=2.4.0'} + dependencies: + highlight.js: 10.7.3 + dev: true + + /@honkit/honkit-plugin-theme-default@4.0.8: + resolution: {integrity: sha512-1CaoaAZZYWOJGnBsdi63ulKqxNcHXAQZPq1QqUsxE3Ml+YJZnyf/0uq8wuUdxJ/TzG4iyaXA2jT92xHlCkXJ1w==} + engines: {gitbook: '>=3.0.0'} + dev: true + + /@honkit/html@4.0.8: + resolution: {integrity: sha512-tpMpYrPKT3RqZC8i00oGHuY+BR+6S3stEONEpMQM9xz1Zj266TXZ5GRXkX4n2cb5DA6OmeR5asYxd7gTXNPjqw==} + dependencies: + cheerio: 1.0.0-rc.12 + lodash: 4.17.21 + q: 1.5.1 + dev: true + + /@honkit/markdown-legacy@4.0.8: + resolution: {integrity: sha512-DqLDDzFbyLuBVYDfrhl4b67LdcbmMzRR+U/DwvXOCc8PqNx6nQoLHnAOpLQN/UP4/P6e7mWaJN9iSjfzg4Q0MQ==} + dependencies: + '@honkit/html': 4.0.8 + kramed: 0.5.6 + lodash: 4.17.21 + dev: true + + /@istanbuljs/load-nyc-config@1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + dev: true + + /@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@jest/console@26.6.2: + resolution: {integrity: sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/types': 26.6.2 + '@types/node': 20.11.7 + chalk: 4.1.2 + jest-message-util: 26.6.2 + jest-util: 26.6.2 + slash: 3.0.0 + dev: true + + /@jest/core@26.6.3: + resolution: {integrity: sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/console': 26.6.2 + '@jest/reporters': 26.6.2 + '@jest/test-result': 26.6.2 + '@jest/transform': 26.6.2 + '@jest/types': 26.6.2 + '@types/node': 20.11.7 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 26.6.2 + jest-config: 26.6.3 + jest-haste-map: 26.6.2 + jest-message-util: 26.6.2 + jest-regex-util: 26.0.0 + jest-resolve: 26.6.2 + jest-resolve-dependencies: 26.6.3 + jest-runner: 26.6.3 + jest-runtime: 26.6.3 + jest-snapshot: 26.6.2 + jest-util: 26.6.2 + jest-validate: 26.6.2 + jest-watcher: 26.6.2 + micromatch: 4.0.5 + p-each-series: 2.2.0 + rimraf: 3.0.2 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /@jest/environment@26.6.2: + resolution: {integrity: sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/fake-timers': 26.6.2 + '@jest/types': 26.6.2 + '@types/node': 20.11.7 + jest-mock: 26.6.2 + dev: true + + /@jest/fake-timers@26.6.2: + resolution: {integrity: sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/types': 26.6.2 + '@sinonjs/fake-timers': 6.0.1 + '@types/node': 20.11.7 + jest-message-util: 26.6.2 + jest-mock: 26.6.2 + jest-util: 26.6.2 + dev: true + + /@jest/globals@26.6.2: + resolution: {integrity: sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/environment': 26.6.2 + '@jest/types': 26.6.2 + expect: 26.6.2 + dev: true + + /@jest/reporters@26.6.2: + resolution: {integrity: sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==} + engines: {node: '>= 10.14.2'} + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 26.6.2 + '@jest/test-result': 26.6.2 + '@jest/transform': 26.6.2 + '@jest/types': 26.6.2 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 4.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.6 + jest-haste-map: 26.6.2 + jest-resolve: 26.6.2 + jest-util: 26.6.2 + jest-worker: 26.6.2 + slash: 3.0.0 + source-map: 0.6.1 + string-length: 4.0.2 + terminal-link: 2.1.1 + v8-to-istanbul: 7.1.2 + optionalDependencies: + node-notifier: 8.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/source-map@26.6.2: + resolution: {integrity: sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==} + engines: {node: '>= 10.14.2'} + dependencies: + callsites: 3.1.0 + graceful-fs: 4.2.11 + source-map: 0.6.1 + dev: true + + /@jest/test-result@26.6.2: + resolution: {integrity: sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/console': 26.6.2 + '@jest/types': 26.6.2 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + dev: true + + /@jest/test-sequencer@26.6.3: + resolution: {integrity: sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/test-result': 26.6.2 + graceful-fs: 4.2.11 + jest-haste-map: 26.6.2 + jest-runner: 26.6.3 + jest-runtime: 26.6.3 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /@jest/transform@26.6.2: + resolution: {integrity: sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==} + engines: {node: '>= 10.14.2'} + dependencies: + '@babel/core': 7.23.9 + '@jest/types': 26.6.2 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 1.9.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 26.6.2 + jest-regex-util: 26.0.0 + jest-util: 26.6.2 + micromatch: 4.0.5 + pirates: 4.0.6 + slash: 3.0.0 + source-map: 0.6.1 + write-file-atomic: 3.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/types@26.6.2: + resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} + engines: {node: '>= 10.14.2'} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.11.7 + '@types/yargs': 15.0.19 + chalk: 4.1.2 + + /@josephg/resolvable@1.0.1: + resolution: {integrity: sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg==} + dev: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.22 + dev: true + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@jridgewell/trace-mapping@0.3.22: + resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@msgpack/msgpack@2.8.0: + resolution: {integrity: sha512-h9u4u/jiIRKbq25PM+zymTyW6bhTzELvOoUd+AvYriWOAKpLGnIamaET3pnHYoI5iYphAHBI4ayx0MehR+VVPQ==} + engines: {node: '>= 10'} + dev: false + + /@noble/ed25519@2.0.0: + resolution: {integrity: sha512-/extjhkwFupyopDrt80OMWKdLgP429qLZj+z6sYJz90rF2Iz0gjZh2ArMKPImUl13Kx+0EXI2hN9T/KJV0/Zng==} + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.16.0 + dev: true + + /@protobufjs/aspromise@1.1.2: + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + dev: true + + /@protobufjs/base64@1.1.2: + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + dev: true + + /@protobufjs/codegen@2.0.4: + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + dev: true + + /@protobufjs/eventemitter@1.1.0: + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + dev: true + + /@protobufjs/fetch@1.1.0: + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + dev: true + + /@protobufjs/float@1.0.2: + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + dev: true + + /@protobufjs/inquire@1.1.0: + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + dev: true + + /@protobufjs/path@1.1.2: + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + dev: true + + /@protobufjs/pool@1.1.0: + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + dev: true + + /@protobufjs/utf8@1.1.0: + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + dev: true + + /@rollup/plugin-alias@3.1.9(rollup@2.79.1): + resolution: {integrity: sha512-QI5fsEvm9bDzt32k39wpOwZhVzRcL5ydcffUHMyLVaVaLeC70I8TJZ17F1z1eMoLu4E/UOcH9BWVkKpIKdrfiw==} + engines: {node: '>=8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + rollup: 2.79.1 + slash: 3.0.0 + dev: true + + /@rollup/plugin-commonjs@20.0.0(rollup@2.79.1): + resolution: {integrity: sha512-5K0g5W2Ol8hAcTHqcTBHiA7M58tfmYi1o9KxeJuuRNpGaTa5iLjcyemBitCBcKXaHamOBBEH2dGom6v6Unmqjg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^2.38.3 + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) + commondir: 1.0.1 + estree-walker: 2.0.2 + glob: 7.2.3 + is-reference: 1.2.1 + magic-string: 0.25.9 + resolve: 1.22.8 + rollup: 2.79.1 + dev: true + + /@rollup/plugin-node-resolve@13.3.0(rollup@2.79.1): + resolution: {integrity: sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==} + engines: {node: '>= 10.0.0'} + peerDependencies: + rollup: ^2.42.0 + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) + '@types/resolve': 1.17.1 + deepmerge: 4.3.1 + is-builtin-module: 3.2.1 + is-module: 1.0.0 + resolve: 1.22.8 + rollup: 2.79.1 + dev: true + + /@rollup/pluginutils@3.1.0(rollup@2.79.1): + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@types/estree': 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.3.1 + rollup: 2.79.1 + dev: true + + /@sinonjs/commons@1.8.6: + resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/fake-timers@6.0.1: + resolution: {integrity: sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==} + dependencies: + '@sinonjs/commons': 1.8.6 + dev: true + + /@tauri-apps/api@1.5.3: + resolution: {integrity: sha512-zxnDjHHKjOsrIzZm6nO5Xapb/BxqUq1tc7cGkFXsFkGTsSWgCPH1D8mm0XS9weJY2OaR73I3k3S+b7eSzJDfqA==} + engines: {node: '>= 14.6.0', npm: '>= 6.6.0', yarn: '>= 1.19.1'} + dev: false + + /@textlint/ast-node-types@12.6.1: + resolution: {integrity: sha512-uzlJ+ZsCAyJm+lBi7j0UeBbj+Oy6w/VWoGJ3iHRHE5eZ8Z4iK66mq+PG/spupmbllLtz77OJbY89BYqgFyjXmA==} + dev: true + + /@textlint/markdown-to-ast@12.6.1: + resolution: {integrity: sha512-T0HO+VrU9VbLRiEx/kH4+gwGMHNMIGkp0Pok+p0I33saOOLyhfGvwOKQgvt2qkxzQEV2L5MtGB8EnW4r5d3CqQ==} + dependencies: + '@textlint/ast-node-types': 12.6.1 + debug: 4.3.4 + mdast-util-gfm-autolink-literal: 0.1.3 + remark-footnotes: 3.0.0 + remark-frontmatter: 3.0.0 + remark-gfm: 1.0.0 + remark-parse: 9.0.0 + traverse: 0.6.8 + unified: 9.2.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@tootallnate/once@1.1.2: + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + dev: true + + /@types/babel__core@7.20.5: + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + dependencies: + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.5 + dev: true + + /@types/babel__generator@7.6.8: + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + dependencies: + '@babel/types': 7.23.9 + dev: true + + /@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + dependencies: + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 + dev: true + + /@types/babel__traverse@7.20.5: + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + dependencies: + '@babel/types': 7.23.9 + dev: true + + /@types/body-parser@1.19.5: + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + dependencies: + '@types/connect': 3.4.38 + '@types/node': 20.11.7 + dev: true + + /@types/connect@3.4.38: + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + dependencies: + '@types/node': 20.11.7 + dev: true + + /@types/estree@0.0.39: + resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + dev: true + + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: true + + /@types/express-serve-static-core@4.17.42: + resolution: {integrity: sha512-ckM3jm2bf/MfB3+spLPWYPUH573plBFwpOhqQ2WottxYV85j1HQFlxmnTq57X1yHY9awZPig06hL/cLMgNWHIQ==} + dependencies: + '@types/node': 20.11.7 + '@types/qs': 6.9.11 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + dev: true + + /@types/express@4.17.21: + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.17.42 + '@types/qs': 6.9.11 + '@types/serve-static': 1.15.5 + dev: true + + /@types/glob@7.2.0: + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 20.11.7 + dev: false + + /@types/graceful-fs@4.1.9: + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + dependencies: + '@types/node': 20.11.7 + dev: true + + /@types/http-errors@2.0.4: + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + dev: true + + /@types/istanbul-lib-coverage@2.0.6: + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + /@types/istanbul-lib-report@3.0.3: + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + /@types/istanbul-reports@3.0.4: + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + dependencies: + '@types/istanbul-lib-report': 3.0.3 + + /@types/jest@26.0.24: + resolution: {integrity: sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==} + dependencies: + jest-diff: 26.6.2 + pretty-format: 26.6.2 + dev: false + + /@types/long@4.0.2: + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + dev: true + + /@types/mdast@3.0.15: + resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + dependencies: + '@types/unist': 2.0.10 + dev: true + + /@types/mime@1.3.5: + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + dev: true + + /@types/mime@3.0.4: + resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} + dev: true + + /@types/minimatch@5.1.2: + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + dev: false + + /@types/minimist@1.2.5: + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + dev: true + + /@types/node-fetch@2.6.11: + resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} + dependencies: + '@types/node': 20.11.7 + form-data: 4.0.0 + dev: true + + /@types/node@20.11.7: + resolution: {integrity: sha512-GPmeN1C3XAyV5uybAf4cMLWT9fDWcmQhZVtMFu7OR32WjrqGG+Wnk2V1d0bmtUyE/Zy1QJ9BxyiTih9z8Oks8A==} + dependencies: + undici-types: 5.26.5 + + /@types/normalize-package-data@2.4.4: + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + dev: true + + /@types/prettier@2.7.3: + resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + dev: true + + /@types/qs@6.9.11: + resolution: {integrity: sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==} + dev: true + + /@types/range-parser@1.2.7: + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + dev: true + + /@types/resolve@1.17.1: + resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} + dependencies: + '@types/node': 20.11.7 + dev: true + + /@types/semver@7.5.6: + resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} + dev: false + + /@types/send@0.17.4: + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + dependencies: + '@types/mime': 1.3.5 + '@types/node': 20.11.7 + dev: true + + /@types/serve-static@1.15.5: + resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} + dependencies: + '@types/http-errors': 2.0.4 + '@types/mime': 3.0.4 + '@types/node': 20.11.7 + dev: true + + /@types/stack-utils@2.0.3: + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + dev: true + + /@types/unist@2.0.10: + resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + dev: true + + /@types/yargs-parser@21.0.3: + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + /@types/yargs@15.0.19: + resolution: {integrity: sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==} + dependencies: + '@types/yargs-parser': 21.0.3 + + /@wry/context@0.7.4: + resolution: {integrity: sha512-jmT7Sb4ZQWI5iyu3lobQxICu2nC/vbUhP0vIdd6tHC9PTfenmRmuIFqktc6GH9cgi+ZHnsLWPvfSvc4DrYmKiQ==} + engines: {node: '>=8'} + dependencies: + tslib: 2.6.2 + dev: false + + /@wry/equality@0.5.7: + resolution: {integrity: sha512-BRFORjsTuQv5gxcXsuDXx6oGRhuVsEGwZy6LOzRRfgu+eSfxbhUQ9L9YtSEIuIjY/o7g3iWFjrc5eSY1GXP2Dw==} + engines: {node: '>=8'} + dependencies: + tslib: 2.6.2 + dev: false + + /@wry/trie@0.3.2: + resolution: {integrity: sha512-yRTyhWSls2OY/pYLfwff867r8ekooZ4UI+/gxot5Wj8EFwSf2rG+n+Mo/6LoLQm1TKA4GRj2+LCpbfS937dClQ==} + engines: {node: '>=8'} + dependencies: + tslib: 2.6.2 + dev: false + + /@yarnpkg/lockfile@1.1.0: + resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} + dev: true + + /a-sync-waterfall@1.0.1: + resolution: {integrity: sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==} + dev: true + + /abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead + dev: true + + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + /acorn-globals@6.0.0: + resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} + dependencies: + acorn: 7.4.1 + acorn-walk: 7.2.0 + dev: true + + /acorn-walk@7.2.0: + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /anchor-markdown-header@0.6.0: + resolution: {integrity: sha512-v7HJMtE1X7wTpNFseRhxsY/pivP4uAJbidVhPT+yhz4i/vV1+qx371IXuV9V7bN6KjFtheLJxqaSm0Y/8neJTA==} + dependencies: + emoji-regex: 10.1.0 + dev: true + + /ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + dev: true + + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /anymatch@2.0.0: + resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} + dependencies: + micromatch: 3.1.10 + normalize-path: 2.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: true + + /arr-diff@4.0.0: + resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} + engines: {node: '>=0.10.0'} + dev: true + + /arr-flatten@1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} + dev: true + + /arr-union@3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} + engines: {node: '>=0.10.0'} + dev: true + + /array-difference@0.0.1: + resolution: {integrity: sha512-LMXXDKmRSsO+d7N73LyTBWlT+GiLfNUCWeeWmZivzJ1NxSPOobS+w8bIAAfGEV35oVBsk9u9cXii8dDceU5NPw==} + dev: true + + /array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /array-unique@0.3.2: + resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} + engines: {node: '>=0.10.0'} + dev: true + + /arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + dev: true + + /asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + dev: true + + /asciidoctor-opal-runtime@0.3.3: + resolution: {integrity: sha512-/CEVNiOia8E5BMO9FLooo+Kv18K4+4JBFRJp8vUy/N5dMRAg+fRNV4HA+o6aoSC79jVU/aT5XvUpxSxSsTS8FQ==} + engines: {node: '>=8.11'} + dependencies: + glob: 7.1.3 + unxhr: 1.0.1 + dev: true + + /asciidoctor@2.2.6: + resolution: {integrity: sha512-EXG3+F2pO21B+COfQmV/WgEgGiy7nG/mJiS/o5DXpaT2q82FRZWPVkbMZrpDvpu4pjXe5c754RbZR9Vz0L0Vtw==} + engines: {node: '>=8.11', npm: '>=5.0.0', yarn: '>=1.1.0'} + hasBin: true + dependencies: + '@asciidoctor/cli': 3.5.0(@asciidoctor/core@2.2.6) + '@asciidoctor/core': 2.2.6 + dev: true + + /assign-symbols@1.0.0: + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} + engines: {node: '>=0.10.0'} + dev: true + + /async-retry@1.3.3: + resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} + dependencies: + retry: 0.13.1 + dev: true + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: true + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: true + + /atob@2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + dev: true + + /babel-jest@26.6.3(@babel/core@7.23.9): + resolution: {integrity: sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==} + engines: {node: '>= 10.14.2'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.9 + '@jest/transform': 26.6.2 + '@jest/types': 26.6.2 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 26.6.2(@babel/core@7.23.9) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + dependencies: + '@babel/helper-plugin-utils': 7.22.5 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-jest-hoist@26.6.2: + resolution: {integrity: sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==} + engines: {node: '>= 10.14.2'} + dependencies: + '@babel/template': 7.23.9 + '@babel/types': 7.23.9 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.5 + dev: true + + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.9): + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.9 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.9) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.9) + dev: true + + /babel-preset-jest@26.6.2(@babel/core@7.23.9): + resolution: {integrity: sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==} + engines: {node: '>= 10.14.2'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.9 + babel-plugin-jest-hoist: 26.6.2 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.9) + dev: true + + /bail@1.0.5: + resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /base@0.11.2: + resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} + engines: {node: '>=0.10.0'} + dependencies: + cache-base: 1.0.1 + class-utils: 0.3.6 + component-emitter: 1.3.1 + define-property: 1.0.0 + isobject: 3.0.1 + mixin-deep: 1.3.2 + pascalcase: 0.1.1 + dev: true + + /bash-color@0.0.4: + resolution: {integrity: sha512-ZNB4525U7BxT6v9C8LEtywyCgB4Pjnm7/bh+ru/Z9Ecxvg3fDjaJ6z305z9a61orQdbB1zqYHh5JbUqx4s4K0g==} + dev: true + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /body-parser@1.20.1: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + /body@5.1.0: + resolution: {integrity: sha512-chUsBxGRtuElD6fmw1gHLpvnKdVLK302peeFa9ZqAEk8TyzZ3fygLyUEDDPTJvL9+Bor0dIwn6ePOsRM2y0zQQ==} + dependencies: + continuable-cache: 0.3.1 + error: 7.0.2 + raw-body: 1.1.7 + safe-json-parse: 1.0.1 + dev: true + + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /braces@2.3.2: + resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} + engines: {node: '>=0.10.0'} + dependencies: + arr-flatten: 1.1.0 + array-unique: 0.3.2 + extend-shallow: 2.0.1 + fill-range: 4.0.0 + isobject: 3.0.1 + repeat-element: 1.1.4 + snapdragon: 0.8.2 + snapdragon-node: 2.1.1 + split-string: 3.1.0 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /browser-process-hrtime@1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + dev: true + + /browserslist@4.22.2: + resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001580 + electron-to-chromium: 1.4.647 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.22.2) + dev: true + + /bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + dependencies: + fast-json-stable-stringify: 2.1.0 + dev: true + + /bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + dependencies: + node-int64: 0.4.0 + dev: true + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + dev: true + + /bytes@1.0.0: + resolution: {integrity: sha512-/x68VkHLeTl3/Ll8IvxdwzhrT+IyKc52e/oyHhA2RwqPqswSnjVbSddfPRwAsJtbilMAPSRWwAlpxdYsSWOTKQ==} + dev: true + + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + /cache-base@1.0.1: + resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} + engines: {node: '>=0.10.0'} + dependencies: + collection-visit: 1.0.0 + component-emitter: 1.3.1 + get-value: 2.0.6 + has-value: 1.0.0 + isobject: 3.0.1 + set-value: 2.0.1 + to-object-path: 0.3.0 + union-value: 1.0.1 + unset-value: 1.0.0 + dev: true + + /call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + dependencies: + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + set-function-length: 1.2.0 + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + dev: true + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true + + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: true + + /caniuse-lite@1.0.30001580: + resolution: {integrity: sha512-mtj5ur2FFPZcCEpXFy8ADXbDACuNFXg6mxVDqp7tqooX6l3zwm+d8EPoeOSIFRDvHs8qu7/SLFOGniULkcH2iA==} + dev: true + + /capture-exit@2.0.0: + resolution: {integrity: sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==} + engines: {node: 6.* || 8.* || >= 10.*} + dependencies: + rsvp: 4.8.5 + dev: true + + /ccount@1.1.0: + resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==} + dev: true + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + dev: true + + /character-entities-legacy@1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + dev: true + + /character-entities@1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + dev: true + + /character-reference-invalid@1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + dev: true + + /cheerio-select@1.6.0: + resolution: {integrity: sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==} + dependencies: + css-select: 4.3.0 + css-what: 6.1.0 + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + dev: true + + /cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + dependencies: + boolbase: 1.0.0 + css-select: 5.1.0 + css-what: 6.1.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + dev: true + + /cheerio@1.0.0-rc.10: + resolution: {integrity: sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==} + engines: {node: '>= 6'} + dependencies: + cheerio-select: 1.6.0 + dom-serializer: 1.4.1 + domhandler: 4.3.1 + htmlparser2: 6.1.0 + parse5: 6.0.1 + parse5-htmlparser2-tree-adapter: 6.0.1 + tslib: 2.6.2 + dev: true + + /cheerio@1.0.0-rc.12: + resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} + engines: {node: '>= 6'} + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.1.0 + htmlparser2: 8.0.2 + parse5: 7.1.2 + parse5-htmlparser2-tree-adapter: 7.0.0 + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + dev: true + + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + dev: true + + /cjs-module-lexer@0.6.0: + resolution: {integrity: sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==} + dev: true + + /class-utils@0.3.6: + resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + define-property: 0.2.5 + isobject: 3.0.1 + static-extend: 0.1.2 + dev: true + + /class-validator@0.13.2: + resolution: {integrity: sha512-yBUcQy07FPlGzUjoLuUfIOXzgynnQPPruyK1Ge2B74k9ROwnle1E+NxLWnUv5OLU8hA/qL5leAE9XnXq3byaBw==} + dependencies: + libphonenumber-js: 1.10.54 + validator: 13.11.0 + dev: false + + /cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: true + + /cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: true + + /collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + dev: true + + /collection-visit@1.0.0: + resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} + engines: {node: '>=0.10.0'} + dependencies: + map-visit: 1.0.0 + object-visit: 1.0.1 + dev: true + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: true + + /commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + dev: true + + /commander@6.2.1: + resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} + engines: {node: '>= 6'} + dev: true + + /commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + dev: true + + /component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /concat-md@0.5.1: + resolution: {integrity: sha512-iZr6yxlwPQ5IZup2mvqgm+JI0jnu5yGkND2ra5DinBtcevDQPQiAGpf4RXOnor1UpKBUydqegDLfPY8b+FfI+Q==} + engines: {node: '>=10.8.0'} + hasBin: true + dependencies: + doctoc: 2.2.1 + front-matter: 4.0.2 + globby: 11.1.0 + lodash.startcase: 4.4.0 + meow: 9.0.0 + transform-markdown-links: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + /continuable-cache@0.3.1: + resolution: {integrity: sha512-TF30kpKhTH8AGCG3dut0rdd/19B7Z+qCnrMoBLpyQu/2drZdNrrpcjPEoJeSVsQM+8KmWG5O56oPDjSSUsuTyA==} + dev: true + + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + + /cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + + /copy-descriptor@0.1.1: + resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} + engines: {node: '>=0.10.0'} + dev: true + + /cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + dev: true + + /cp@0.2.0: + resolution: {integrity: sha512-4ftCvShHjIZG/zzomHyunNpBof3sOFTTmU6s6q9DdqAL/ANqrKV3pr6Z6kVfBI4hjn59DFLImrBqn7GuuMqSZA==} + dev: true + + /cpr@3.0.1: + resolution: {integrity: sha512-Xch4PXQ/KC8lJ+KfJ9JI6eG/nmppLrPPWg5Q+vh65Qr9EjuJEubxh/H/Le1TmCZ7+Xv7iJuNRqapyOFZB+wsxA==} + hasBin: true + dependencies: + graceful-fs: 4.2.11 + minimist: 1.2.8 + mkdirp: 0.5.6 + rimraf: 2.7.1 + dev: true + + /crc@3.8.0: + resolution: {integrity: sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==} + dependencies: + buffer: 5.7.1 + dev: true + + /cross-fetch@3.1.8: + resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: true + + /cross-spawn@6.0.5: + resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + engines: {node: '>=4.8'} + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.2 + shebang-command: 1.2.0 + which: 1.3.1 + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + dev: true + + /css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + dev: true + + /css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + dev: true + + /cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + dev: true + + /cssom@0.4.4: + resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} + dev: true + + /cssstyle@2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} + engines: {node: '>=8'} + dependencies: + cssom: 0.3.8 + dev: true + + /data-urls@2.0.0: + resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} + engines: {node: '>=10'} + dependencies: + abab: 2.0.6 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 + dev: true + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + dev: true + + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + dev: true + + /decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + dev: true + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: true + + /define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + + /define-property@0.2.5: + resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 0.1.7 + dev: true + + /define-property@1.0.0: + resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.3 + dev: true + + /define-property@2.0.2: + resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.3 + isobject: 3.0.1 + dev: true + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: true + + /depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + dev: true + + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + /destroy@1.0.4: + resolution: {integrity: sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==} + dev: true + + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + /detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + dev: true + + /diff-sequences@26.6.2: + resolution: {integrity: sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==} + engines: {node: '>= 10.14.2'} + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /direction@0.1.5: + resolution: {integrity: sha512-HceXsAluGbXKCz2qCVbXFUH4Vn4eNMWxY5gzydMFMnS1zKSwvDASqLwcrYLIFDpwuZ63FUAqjDLEP1eicHt8DQ==} + hasBin: true + dev: true + + /doctoc@2.2.1: + resolution: {integrity: sha512-qNJ1gsuo7hH40vlXTVVrADm6pdg30bns/Mo7Nv1SxuXSM1bwF9b4xQ40a6EFT/L1cI+Yylbyi8MPI4G4y7XJzQ==} + hasBin: true + dependencies: + '@textlint/markdown-to-ast': 12.6.1 + anchor-markdown-header: 0.6.0 + htmlparser2: 7.2.0 + minimist: 1.2.8 + underscore: 1.13.6 + update-section: 0.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /dom-serializer@0.1.1: + resolution: {integrity: sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==} + dependencies: + domelementtype: 1.3.1 + entities: 1.1.2 + dev: true + + /dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + dev: true + + /dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + dev: true + + /domelementtype@1.3.1: + resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} + dev: true + + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: true + + /domexception@2.0.1: + resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} + engines: {node: '>=8'} + deprecated: Use your platform's native DOMException instead + dependencies: + webidl-conversions: 5.0.0 + dev: true + + /domhandler@3.3.0: + resolution: {integrity: sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + dev: true + + /domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: true + + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + /electron-to-chromium@1.4.647: + resolution: {integrity: sha512-Z/fTNGwc45WrYQhPaEcz5tAJuZZ8G7S/DBnhS6Kgp4BxnS40Z/HqlJ0hHg3Z79IGVzuVartIlTcjw/cQbPLgOw==} + dev: true + + /emittery@0.7.2: + resolution: {integrity: sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==} + engines: {node: '>=10'} + dev: true + + /emittery@1.0.1: + resolution: {integrity: sha512-2ID6FdrMD9KDLldGesP6317G78K7km/kMcwItRtVFva7I/cSEOIaLpewaUb+YLXVwdAp3Ctfxh/V5zIl1sj7dQ==} + engines: {node: '>=14.16'} + dev: false + + /emoji-regex@10.1.0: + resolution: {integrity: sha512-xAEnNCT3w2Tg6MA7ly6QqYJvEoY1tm9iIjJ3yMKK9JPlWuRHAMoe5iETwQnx3M9TVbFMfsrBgWKR+IsmswwNjg==} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + + /entities@1.1.2: + resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==} + dev: true + + /entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + dev: true + + /entities@3.0.1: + resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} + engines: {node: '>=0.12'} + dev: true + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: true + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /error@7.0.2: + resolution: {integrity: sha512-UtVv4l5MhijsYUxPJo4390gzfZvAnTHreNnDjnTZaKIiZ/SemXxAhBkYSKtWa5RtBXbLP8tMgn/n0RUa/H7jXw==} + dependencies: + string-template: 0.2.1 + xtend: 4.0.2 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-goat@3.0.0: + resolution: {integrity: sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw==} + engines: {node: '>=10'} + dev: true + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: true + + /escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + dev: true + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /estree-walker@1.0.1: + resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + dev: true + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: true + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + /exec-sh@0.3.6: + resolution: {integrity: sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==} + dev: true + + /execa@1.0.0: + resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} + engines: {node: '>=6'} + dependencies: + cross-spawn: 6.0.5 + get-stream: 4.1.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.7 + strip-eof: 1.0.0 + dev: true + + /execa@4.1.0: + resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + dev: true + + /expand-brackets@2.1.4: + resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} + engines: {node: '>=0.10.0'} + dependencies: + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + posix-character-classes: 0.1.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /expect@26.6.2: + resolution: {integrity: sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/types': 26.6.2 + ansi-styles: 4.3.0 + jest-get-type: 26.3.0 + jest-matcher-utils: 26.6.2 + jest-message-util: 26.6.2 + jest-regex-util: 26.0.0 + dev: true + + /express@4.18.2: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + /extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + dev: true + + /extend-shallow@3.0.2: + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} + engines: {node: '>=0.10.0'} + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + dev: true + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: true + + /extglob@2.0.4: + resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} + engines: {node: '>=0.10.0'} + dependencies: + array-unique: 0.3.2 + define-property: 1.0.0 + expand-brackets: 2.1.4 + extend-shallow: 2.0.1 + fragment-cache: 0.2.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fastq@1.16.0: + resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} + dependencies: + reusify: 1.0.4 + dev: true + + /fault@1.0.4: + resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} + dependencies: + format: 0.2.2 + dev: true + + /faye-websocket@0.10.0: + resolution: {integrity: sha512-Xhj93RXbMSq8urNCUq4p9l0P6hnySJ/7YNRhYNug0bLOuii7pKO7xQFb5mx9xZXWCar88pLPb805PvUkwrLZpQ==} + engines: {node: '>=0.4.0'} + dependencies: + websocket-driver: 0.7.4 + dev: true + + /fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + dependencies: + bser: 2.1.1 + dev: true + + /fill-range@4.0.0: + resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-number: 3.0.0 + repeat-string: 1.6.1 + to-regex-range: 2.1.1 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /find-yarn-workspace-root@2.0.0: + resolution: {integrity: sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==} + dependencies: + micromatch: 4.0.5 + dev: true + + /flat-cache@2.0.1: + resolution: {integrity: sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==} + engines: {node: '>=4'} + dependencies: + flatted: 2.0.2 + rimraf: 2.6.3 + write: 1.0.3 + dev: true + + /flatted@2.0.2: + resolution: {integrity: sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==} + dev: true + + /for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + dev: true + + /form-data@3.0.1: + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + dev: true + + /forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + /fragment-cache@0.2.1: + resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} + engines: {node: '>=0.10.0'} + dependencies: + map-cache: 0.2.2 + dev: true + + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + /front-matter@2.3.0: + resolution: {integrity: sha512-+gOIDsGWHVAiWSDfg3vpiHwkOrwO4XNS3YQH5DMmneLEPWzdCAnbSQCtxReF4yPK1nszLvAmLeR2SprnDQDnyQ==} + dependencies: + js-yaml: 3.14.1 + dev: true + + /front-matter@4.0.2: + resolution: {integrity: sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==} + dependencies: + js-yaml: 3.14.1 + dev: true + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + dependencies: + function-bind: 1.1.2 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + + /get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + dev: true + + /get-stream@4.1.0: + resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} + engines: {node: '>=6'} + dependencies: + pump: 3.0.0 + dev: true + + /get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + dev: true + + /get-value@2.0.6: + resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} + engines: {node: '>=0.10.0'} + dev: true + + /gitbook-plugin-fontsettings@2.0.0: + resolution: {integrity: sha512-bZpz/Jev7lL1d3VNp41KHZD67UYqyqdOwbsJE6YEW93R2mGiLfZLpUs86d2nrY61BedhlNck1xF52FNT6sWeig==} + engines: {gitbook: '>=2.4.0'} + dev: true + + /gitbook-plugin-livereload@0.0.1: + resolution: {integrity: sha512-+5xinicId2ZcbP6jBTFfQBnjz8nhoBgcOuQfKTEM6Yg9fBsmo2mxY6ubrx1b5ozuIMyfDLkSihx97A7+X+EtQQ==} + dev: true + + /gitbook-plugin-lunr@1.2.0: + resolution: {integrity: sha512-QBfFLMZmoyOfLzc5aZrlRCkmzb9YcSjzdnyJFiRI/nX+Nd6kK1XyN4DLGnNSMHkRcJchcpWiQ6XGqSqo7e+d+g==} + engines: {gitbook: '>=3.0.0-pre.0'} + dependencies: + gitbook-plugin-search: 2.2.1 + html-entities: 1.2.0 + lunr: 0.5.12 + dev: true + + /gitbook-plugin-search@2.2.1: + resolution: {integrity: sha512-oP9jhaKFUVPo756G9ywuuI43YdkZClSjfpFzNKe/a/Rcn3oVsrAM/PjdQ+dt65KfZVo3iW1LY4WdiZnNqzRP8g==} + engines: {gitbook: '>=3.0.0-pre.0'} + dev: true + + /github-slugid@1.0.1: + resolution: {integrity: sha512-L5uVRzSM8jyWTgHUtaHwmymZW8S234JrIaOGotPK+0emNz9XsO6qqgw1KiI5YfP1SyBjG0ApNYU0vpb01teM9Q==} + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.1.3: + resolution: {integrity: sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.0 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.2 + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /graphql-query-complexity@0.7.2(graphql@15.7.2): + resolution: {integrity: sha512-+VgmrfxGEjHI3zuojWOR8bsz7Ycz/BZjNjxnlUieTz5DsB92WoIrYCSZdWG7UWZ3rfcA1Gb2Nf+wB80GsaZWuQ==} + peerDependencies: + graphql: ^0.13.0 || ^14.0.0 || ^15.0.0 + dependencies: + graphql: 15.7.2(patch_hash=g4ubilmxli6fuk7eusupjbkdjm) + lodash.get: 4.4.2 + dev: false + + /graphql-subscriptions@1.2.1(graphql@15.7.2): + resolution: {integrity: sha512-95yD/tKi24q8xYa7Q9rhQN16AYj5wPbrb8tmHGM3WRc9EBmWrG/0kkMl+tQG8wcEuE9ibR4zyOM31p5Sdr2v4g==} + peerDependencies: + graphql: ^0.10.5 || ^0.11.3 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 + dependencies: + graphql: 15.7.2(patch_hash=g4ubilmxli6fuk7eusupjbkdjm) + iterall: 1.3.0 + dev: false + + /graphql-tag@2.12.6(graphql@15.7.2): + resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} + engines: {node: '>=10'} + peerDependencies: + graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + dependencies: + graphql: 15.7.2(patch_hash=g4ubilmxli6fuk7eusupjbkdjm) + tslib: 2.6.2 + dev: false + + /graphql-ws@5.12.0(graphql@15.7.2): + resolution: {integrity: sha512-PA3ImUp8utrpEjoxBMhvxsjkStvFEdU0E1gEBREt8HZIWkxOUymwJBhFnBL7t/iHhUq1GVPeZevPinkZFENxTw==} + engines: {node: '>=10'} + peerDependencies: + graphql: '>=0.11 <=16' + dependencies: + graphql: 15.7.2(patch_hash=g4ubilmxli6fuk7eusupjbkdjm) + + /graphql@15.7.2(patch_hash=g4ubilmxli6fuk7eusupjbkdjm): + resolution: {integrity: sha512-AnnKk7hFQFmU/2I9YSQf3xw44ctnSFCfp3zE0N6W174gqe9fWG/2rKaKxROK7CcI3XtERpjEKFqts8o319Kf7A==} + engines: {node: '>= 10.x'} + patched: true + + /growly@1.3.0: + resolution: {integrity: sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==} + requiresBuild: true + dev: true + optional: true + + /hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + dependencies: + get-intrinsic: 1.2.2 + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + /has-value@0.3.1: + resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 0.1.4 + isobject: 2.1.0 + dev: true + + /has-value@1.0.0: + resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 1.0.0 + isobject: 3.0.1 + dev: true + + /has-values@0.1.4: + resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} + engines: {node: '>=0.10.0'} + dev: true + + /has-values@1.0.0: + resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + kind-of: 4.0.0 + dev: true + + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + + /highlight.js@10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + dev: true + + /hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + dependencies: + react-is: 16.13.1 + dev: false + + /honkit@4.0.8: + resolution: {integrity: sha512-CCD6+HTOvgta4VO1HsWUq/Qp+C7PPnwUH5O1xQx0hLjKh5zeBkeu1r1AOa+Ez1QltoAHrdK2RPxkQ5hsnQnDrQ==} + hasBin: true + dependencies: + '@honkit/asciidoc': 4.0.8 + '@honkit/honkit-plugin-highlight': 4.0.8 + '@honkit/honkit-plugin-theme-default': 4.0.8 + '@honkit/markdown-legacy': 4.0.8 + bash-color: 0.0.4 + cheerio: 1.0.0-rc.12 + chokidar: 3.5.3 + commander: 5.1.0 + cp: 0.2.0 + cpr: 3.0.1 + crc: 3.8.0 + destroy: 1.2.0 + direction: 0.1.5 + dom-serializer: 0.1.1 + error: 7.0.2 + escape-html: 1.0.3 + escape-string-regexp: 4.0.0 + extend: 3.0.2 + flat-cache: 2.0.1 + front-matter: 2.3.0 + gitbook-plugin-fontsettings: 2.0.0 + gitbook-plugin-livereload: 0.0.1 + gitbook-plugin-lunr: 1.2.0 + gitbook-plugin-search: 2.2.1 + github-slugid: 1.0.1 + i18n-t: 1.0.1 + ignore: 5.3.0 + immutable: 3.8.2 + is: 3.3.0 + js-yaml: 3.14.1 + json-schema-defaults: 0.1.1 + jsonschema: 1.1.0 + juice: 8.1.0 + lru_map: 0.4.1 + memoize-one: 5.2.1 + mkdirp: 1.0.4 + moment: 2.30.1 + nunjucks: 3.2.4(chokidar@3.5.3) + nunjucks-do: 1.0.0 + object-path: 0.11.8 + omit-keys: 0.1.0 + open: 7.4.2 + q: 1.5.1 + resolve: 1.22.8 + semver: 7.5.4 + send: 0.17.2 + tiny-lr: 1.1.1 + tmp: 0.0.28 + try-resolve: 1.0.1 + urijs: 1.19.11 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: true + + /html-encoding-sniffer@2.0.1: + resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} + engines: {node: '>=10'} + dependencies: + whatwg-encoding: 1.0.5 + dev: true + + /html-entities@1.2.0: + resolution: {integrity: sha512-0md7tlUUyb0BEQGsZzbqty1CgV6RESOoxdivt94AScqhBhYsPCCQCOaGvur/RospMjYpPJ7iFe3zw4Bu4SVA8g==} + engines: {'0': node >= 0.4.0} + dev: true + + /html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + + /htmlparser2@5.0.1: + resolution: {integrity: sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ==} + dependencies: + domelementtype: 2.3.0 + domhandler: 3.3.0 + domutils: 2.8.0 + entities: 2.2.0 + dev: true + + /htmlparser2@6.1.0: + resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 2.2.0 + dev: true + + /htmlparser2@7.2.0: + resolution: {integrity: sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 3.0.1 + dev: true + + /htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + dev: true + + /http-errors@1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 1.5.0 + toidentifier: 1.0.1 + dev: true + + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + /http-parser-js@0.5.8: + resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} + dev: true + + /http-proxy-agent@4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /human-signals@1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} + engines: {node: '>=8.12.0'} + dev: true + + /i18n-t@1.0.1: + resolution: {integrity: sha512-2NmZwpsnRTzpZfIP6Rcic16m5QBNVaIwVyU182+iatd6RNbWmGi74LTA/R/oDa58RZ87bHChLgWpmulEAoEruQ==} + dependencies: + lodash: 4.17.21 + dev: true + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + + /ignore@5.3.0: + resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + engines: {node: '>= 4'} + dev: true + + /immutable@3.8.2: + resolution: {integrity: sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==} + engines: {node: '>=0.10.0'} + dev: true + + /import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + /is-accessor-descriptor@1.0.1: + resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} + engines: {node: '>= 0.10'} + dependencies: + hasown: 2.0.0 + dev: true + + /is-alphabetical@1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + dev: true + + /is-alphanumerical@1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + dependencies: + is-alphabetical: 1.0.4 + is-decimal: 1.0.4 + dev: true + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + dev: true + + /is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + dev: true + + /is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + dependencies: + builtin-modules: 3.3.0 + dev: true + + /is-ci@2.0.0: + resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} + hasBin: true + dependencies: + ci-info: 2.0.0 + dev: true + + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.0 + dev: true + + /is-data-descriptor@1.0.1: + resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.0 + dev: true + + /is-decimal@1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + dev: true + + /is-descriptor@0.1.7: + resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==} + engines: {node: '>= 0.4'} + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + dev: true + + /is-descriptor@1.0.3: + resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==} + engines: {node: '>= 0.4'} + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + dev: true + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: true + + /is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + dev: true + + /is-extendable@1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + dependencies: + is-plain-object: 2.0.4 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-hexadecimal@1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + dev: true + + /is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + dev: true + + /is-number@3.0.0: + resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + dev: true + + /is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + dev: true + + /is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + dependencies: + '@types/estree': 1.0.5 + dev: true + + /is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: true + + /is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + dev: true + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: true + + /is@3.3.0: + resolution: {integrity: sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==} + dev: true + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /isobject@0.2.0: + resolution: {integrity: sha512-VaWq6XYAsbvM0wf4dyBO7WH9D7GosB7ZZlqrawI9BBiTMINBeCyqSKBa35m870MY3O4aM31pYyZi9DfGrYMJrQ==} + engines: {node: '>=0.10.0'} + dev: true + + /isobject@2.1.0: + resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} + engines: {node: '>=0.10.0'} + dependencies: + isarray: 1.0.0 + dev: true + + /isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + dev: true + + /isomorphic-ws@5.0.0(ws@8.13.0): + resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} + peerDependencies: + ws: '*' + dependencies: + ws: 8.13.0 + dev: false + + /istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-instrument@4.0.3: + resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.23.9 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.23.9 + '@babel/parser': 7.23.9 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + dev: true + + /istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + dependencies: + debug: 4.3.4 + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-reports@3.1.6: + resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + dev: true + + /iterall@1.3.0: + resolution: {integrity: sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==} + dev: false + + /jest-changed-files@26.6.2: + resolution: {integrity: sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/types': 26.6.2 + execa: 4.1.0 + throat: 5.0.0 + dev: true + + /jest-cli@26.6.3: + resolution: {integrity: sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==} + engines: {node: '>= 10.14.2'} + hasBin: true + dependencies: + '@jest/core': 26.6.3 + '@jest/test-result': 26.6.2 + '@jest/types': 26.6.2 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + import-local: 3.1.0 + is-ci: 2.0.0 + jest-config: 26.6.3 + jest-util: 26.6.2 + jest-validate: 26.6.2 + prompts: 2.4.2 + yargs: 15.4.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /jest-config@26.6.3: + resolution: {integrity: sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==} + engines: {node: '>= 10.14.2'} + peerDependencies: + ts-node: '>=9.0.0' + peerDependenciesMeta: + ts-node: + optional: true + dependencies: + '@babel/core': 7.23.9 + '@jest/test-sequencer': 26.6.3 + '@jest/types': 26.6.2 + babel-jest: 26.6.3(@babel/core@7.23.9) + chalk: 4.1.2 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-environment-jsdom: 26.6.2 + jest-environment-node: 26.6.2 + jest-get-type: 26.3.0 + jest-jasmine2: 26.6.3 + jest-regex-util: 26.0.0 + jest-resolve: 26.6.2 + jest-util: 26.6.2 + jest-validate: 26.6.2 + micromatch: 4.0.5 + pretty-format: 26.6.2 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-diff@26.6.2: + resolution: {integrity: sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==} + engines: {node: '>= 10.14.2'} + dependencies: + chalk: 4.1.2 + diff-sequences: 26.6.2 + jest-get-type: 26.3.0 + pretty-format: 26.6.2 + + /jest-docblock@26.0.0: + resolution: {integrity: sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==} + engines: {node: '>= 10.14.2'} + dependencies: + detect-newline: 3.1.0 + dev: true + + /jest-each@26.6.2: + resolution: {integrity: sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/types': 26.6.2 + chalk: 4.1.2 + jest-get-type: 26.3.0 + jest-util: 26.6.2 + pretty-format: 26.6.2 + dev: true + + /jest-environment-jsdom@26.6.2: + resolution: {integrity: sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/environment': 26.6.2 + '@jest/fake-timers': 26.6.2 + '@jest/types': 26.6.2 + '@types/node': 20.11.7 + jest-mock: 26.6.2 + jest-util: 26.6.2 + jsdom: 16.7.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-environment-node@26.6.2: + resolution: {integrity: sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/environment': 26.6.2 + '@jest/fake-timers': 26.6.2 + '@jest/types': 26.6.2 + '@types/node': 20.11.7 + jest-mock: 26.6.2 + jest-util: 26.6.2 + dev: true + + /jest-get-type@26.3.0: + resolution: {integrity: sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==} + engines: {node: '>= 10.14.2'} + + /jest-haste-map@26.6.2: + resolution: {integrity: sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/types': 26.6.2 + '@types/graceful-fs': 4.1.9 + '@types/node': 20.11.7 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 26.0.0 + jest-serializer: 26.6.2 + jest-util: 26.6.2 + jest-worker: 26.6.2 + micromatch: 4.0.5 + sane: 4.1.0 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-jasmine2@26.6.3: + resolution: {integrity: sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==} + engines: {node: '>= 10.14.2'} + dependencies: + '@babel/traverse': 7.23.9 + '@jest/environment': 26.6.2 + '@jest/source-map': 26.6.2 + '@jest/test-result': 26.6.2 + '@jest/types': 26.6.2 + '@types/node': 20.11.7 + chalk: 4.1.2 + co: 4.6.0 + expect: 26.6.2 + is-generator-fn: 2.1.0 + jest-each: 26.6.2 + jest-matcher-utils: 26.6.2 + jest-message-util: 26.6.2 + jest-runtime: 26.6.3 + jest-snapshot: 26.6.2 + jest-util: 26.6.2 + pretty-format: 26.6.2 + throat: 5.0.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /jest-leak-detector@26.6.2: + resolution: {integrity: sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==} + engines: {node: '>= 10.14.2'} + dependencies: + jest-get-type: 26.3.0 + pretty-format: 26.6.2 + dev: true + + /jest-matcher-utils@26.6.2: + resolution: {integrity: sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==} + engines: {node: '>= 10.14.2'} + dependencies: + chalk: 4.1.2 + jest-diff: 26.6.2 + jest-get-type: 26.3.0 + pretty-format: 26.6.2 + dev: true + + /jest-message-util@26.6.2: + resolution: {integrity: sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==} + engines: {node: '>= 10.14.2'} + dependencies: + '@babel/code-frame': 7.23.5 + '@jest/types': 26.6.2 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + pretty-format: 26.6.2 + slash: 3.0.0 + stack-utils: 2.0.6 + dev: true + + /jest-mock@26.6.2: + resolution: {integrity: sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/types': 26.6.2 + '@types/node': 20.11.7 + dev: true + + /jest-pnp-resolver@1.2.3(jest-resolve@26.6.2): + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 26.6.2 + dev: true + + /jest-regex-util@26.0.0: + resolution: {integrity: sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==} + engines: {node: '>= 10.14.2'} + dev: true + + /jest-resolve-dependencies@26.6.3: + resolution: {integrity: sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/types': 26.6.2 + jest-regex-util: 26.0.0 + jest-snapshot: 26.6.2 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-resolve@26.6.2: + resolution: {integrity: sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/types': 26.6.2 + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-pnp-resolver: 1.2.3(jest-resolve@26.6.2) + jest-util: 26.6.2 + read-pkg-up: 7.0.1 + resolve: 1.22.8 + slash: 3.0.0 + dev: true + + /jest-runner@26.6.3: + resolution: {integrity: sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/console': 26.6.2 + '@jest/environment': 26.6.2 + '@jest/test-result': 26.6.2 + '@jest/types': 26.6.2 + '@types/node': 20.11.7 + chalk: 4.1.2 + emittery: 0.7.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 26.6.3 + jest-docblock: 26.0.0 + jest-haste-map: 26.6.2 + jest-leak-detector: 26.6.2 + jest-message-util: 26.6.2 + jest-resolve: 26.6.2 + jest-runtime: 26.6.3 + jest-util: 26.6.2 + jest-worker: 26.6.2 + source-map-support: 0.5.21 + throat: 5.0.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /jest-runtime@26.6.3: + resolution: {integrity: sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==} + engines: {node: '>= 10.14.2'} + hasBin: true + dependencies: + '@jest/console': 26.6.2 + '@jest/environment': 26.6.2 + '@jest/fake-timers': 26.6.2 + '@jest/globals': 26.6.2 + '@jest/source-map': 26.6.2 + '@jest/test-result': 26.6.2 + '@jest/transform': 26.6.2 + '@jest/types': 26.6.2 + '@types/yargs': 15.0.19 + chalk: 4.1.2 + cjs-module-lexer: 0.6.0 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-config: 26.6.3 + jest-haste-map: 26.6.2 + jest-message-util: 26.6.2 + jest-mock: 26.6.2 + jest-regex-util: 26.0.0 + jest-resolve: 26.6.2 + jest-snapshot: 26.6.2 + jest-util: 26.6.2 + jest-validate: 26.6.2 + slash: 3.0.0 + strip-bom: 4.0.0 + yargs: 15.4.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /jest-serializer@26.6.2: + resolution: {integrity: sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==} + engines: {node: '>= 10.14.2'} + dependencies: + '@types/node': 20.11.7 + graceful-fs: 4.2.11 + dev: true + + /jest-snapshot@26.6.2: + resolution: {integrity: sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==} + engines: {node: '>= 10.14.2'} + dependencies: + '@babel/types': 7.23.9 + '@jest/types': 26.6.2 + '@types/babel__traverse': 7.20.5 + '@types/prettier': 2.7.3 + chalk: 4.1.2 + expect: 26.6.2 + graceful-fs: 4.2.11 + jest-diff: 26.6.2 + jest-get-type: 26.3.0 + jest-haste-map: 26.6.2 + jest-matcher-utils: 26.6.2 + jest-message-util: 26.6.2 + jest-resolve: 26.6.2 + natural-compare: 1.4.0 + pretty-format: 26.6.2 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-util@26.6.2: + resolution: {integrity: sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/types': 26.6.2 + '@types/node': 20.11.7 + chalk: 4.1.2 + graceful-fs: 4.2.11 + is-ci: 2.0.0 + micromatch: 4.0.5 + dev: true + + /jest-validate@26.6.2: + resolution: {integrity: sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/types': 26.6.2 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 26.3.0 + leven: 3.1.0 + pretty-format: 26.6.2 + dev: true + + /jest-watcher@26.6.2: + resolution: {integrity: sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/test-result': 26.6.2 + '@jest/types': 26.6.2 + '@types/node': 20.11.7 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + jest-util: 26.6.2 + string-length: 4.0.2 + dev: true + + /jest-worker@26.6.2: + resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 20.11.7 + merge-stream: 2.0.0 + supports-color: 7.2.0 + dev: true + + /jest@26.6.3: + resolution: {integrity: sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==} + engines: {node: '>= 10.14.2'} + hasBin: true + dependencies: + '@jest/core': 26.6.3 + import-local: 3.1.0 + jest-cli: 26.6.3 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /js-base64@3.7.6: + resolution: {integrity: sha512-NPrWuHFxFUknr1KqJRDgUQPexQF0uIJWjeT+2KjEePhitQxQEx5EJBG1lVn5/hc8aLycTpXrDOgPQ6Zq+EDiTA==} + dev: false + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + + /jsdom@16.7.0: + resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} + engines: {node: '>=10'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + abab: 2.0.6 + acorn: 8.11.3 + acorn-globals: 6.0.0 + cssom: 0.4.4 + cssstyle: 2.3.0 + data-urls: 2.0.0 + decimal.js: 10.4.3 + domexception: 2.0.1 + escodegen: 2.1.0 + form-data: 3.0.1 + html-encoding-sniffer: 2.0.1 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.7 + parse5: 6.0.1 + saxes: 5.0.1 + symbol-tree: 3.2.4 + tough-cookie: 4.1.3 + w3c-hr-time: 1.0.2 + w3c-xmlserializer: 2.0.0 + webidl-conversions: 6.1.0 + whatwg-encoding: 1.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 + ws: 7.5.9 + xml-name-validator: 3.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + + /json-schema-defaults@0.1.1: + resolution: {integrity: sha512-6Q5YS7pSDCXUbtS9uAFE+uUgvE45dBHCMyhqe6liJmL+oIa4zbACSS6nr6Lh+73mN+MnWBCExtN3C14S7Jrm7w==} + dev: true + + /json-stable-stringify@1.1.1: + resolution: {integrity: sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + isarray: 2.0.5 + jsonify: 0.0.1 + object-keys: 1.1.1 + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /jsonify@0.0.1: + resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} + dev: true + + /jsonschema@1.1.0: + resolution: {integrity: sha512-nQhT+ioA1XM8CpxJYlBfcUj6HF3f3f2KbLgV3tcxOt85RKpk2b0Do/C5BnCCCfdAarAjWRSFlln0Uanl4tBCHA==} + dev: true + + /juice@8.1.0: + resolution: {integrity: sha512-FLzurJrx5Iv1e7CfBSZH68dC04EEvXvvVvPYB7Vx1WAuhCp1ZPIMtqxc+WTWxVkpTIC2Ach/GAv0rQbtGf6YMA==} + engines: {node: '>=10.0.0'} + hasBin: true + dependencies: + cheerio: 1.0.0-rc.10 + commander: 6.2.1 + mensch: 0.3.4 + slick: 1.12.2 + web-resource-inliner: 6.0.1 + transitivePeerDependencies: + - encoding + dev: true + + /kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + dev: true + + /kind-of@4.0.0: + resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + dev: true + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + + /klaw-sync@6.0.0: + resolution: {integrity: sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==} + dependencies: + graceful-fs: 4.2.11 + dev: true + + /kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: true + + /kramed@0.5.6: + resolution: {integrity: sha512-V4qwQAp8HPQPU6Ph9Q4bc+P+nKQWEGlWYLRDkK7n+CPaMi8/VRm9/R710tRmag4whLsnKR91CO9Ras/Rnff9bw==} + hasBin: true + dev: true + + /leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + dev: true + + /libphonenumber-js@1.10.54: + resolution: {integrity: sha512-P+38dUgJsmh0gzoRDoM4F5jLbyfztkU6PY6eSK6S5HwTi/LPvnwXqVCQZlAy1FxZ5c48q25QhxGQ0pq+WQcSlQ==} + dev: false + + /libsodium-wrappers@0.7.13: + resolution: {integrity: sha512-kasvDsEi/r1fMzKouIDv7B8I6vNmknXwGiYodErGuESoFTohGSKZplFtVxZqHaoQ217AynyIFgnOVRitpHs0Qw==} + dependencies: + libsodium: 0.7.13 + dev: false + + /libsodium@0.7.13: + resolution: {integrity: sha512-mK8ju0fnrKXXfleL53vtp9xiPq5hKM0zbDQtcxQIsSmxNgSxqCj6R7Hl9PkrNe2j29T4yoDaF7DJLK9/i5iWUw==} + dev: false + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /livereload-js@2.4.0: + resolution: {integrity: sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==} + dev: true + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: true + + /lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + dev: false + + /lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + dev: false + + /lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + dev: true + + /lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /loglevel@1.9.1: + resolution: {integrity: sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==} + engines: {node: '>= 0.6.0'} + dev: true + + /long@4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + dev: true + + /longest-streak@2.0.4: + resolution: {integrity: sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==} + dev: true + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + dev: true + + /lru_map@0.4.1: + resolution: {integrity: sha512-I+lBvqMMFfqaV8CJCISjI3wbjmwVu/VyOoU7+qtu9d7ioW5klMgsTTiUOUp+DJvfTTzKXoPbyC6YfgkNcyPSOg==} + dev: true + + /lunr@0.5.12: + resolution: {integrity: sha512-/EtfOyuNP7BLVKhDvLyKJkFvCup2vwcIwQXCuasZEFk7XUJ4/blztVuefeLapUb1I5uMGsosN9A8J9Mu9A6yBg==} + dev: true + + /magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: true + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + dependencies: + tmpl: 1.0.5 + dev: true + + /map-cache@0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + dev: true + + /map-visit@1.0.0: + resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} + engines: {node: '>=0.10.0'} + dependencies: + object-visit: 1.0.1 + dev: true + + /markdown-table@2.0.0: + resolution: {integrity: sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==} + dependencies: + repeat-string: 1.6.1 + dev: true + + /mdast-util-find-and-replace@1.1.1: + resolution: {integrity: sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA==} + dependencies: + escape-string-regexp: 4.0.0 + unist-util-is: 4.1.0 + unist-util-visit-parents: 3.1.1 + dev: true + + /mdast-util-footnote@0.1.7: + resolution: {integrity: sha512-QxNdO8qSxqbO2e3m09KwDKfWiLgqyCurdWTQ198NpbZ2hxntdc+VKS4fDJCmNWbAroUdYnSthu+XbZ8ovh8C3w==} + dependencies: + mdast-util-to-markdown: 0.6.5 + micromark: 2.11.4 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-from-markdown@0.8.5: + resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} + dependencies: + '@types/mdast': 3.0.15 + mdast-util-to-string: 2.0.0 + micromark: 2.11.4 + parse-entities: 2.0.0 + unist-util-stringify-position: 2.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-frontmatter@0.2.0: + resolution: {integrity: sha512-FHKL4w4S5fdt1KjJCwB0178WJ0evnyyQr5kXTM3wrOVpytD0hrkvd+AOOjU9Td8onOejCkmZ+HQRT3CZ3coHHQ==} + dependencies: + micromark-extension-frontmatter: 0.2.2 + dev: true + + /mdast-util-gfm-autolink-literal@0.1.3: + resolution: {integrity: sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A==} + dependencies: + ccount: 1.1.0 + mdast-util-find-and-replace: 1.1.1 + micromark: 2.11.4 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-gfm-strikethrough@0.2.3: + resolution: {integrity: sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA==} + dependencies: + mdast-util-to-markdown: 0.6.5 + dev: true + + /mdast-util-gfm-table@0.1.6: + resolution: {integrity: sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ==} + dependencies: + markdown-table: 2.0.0 + mdast-util-to-markdown: 0.6.5 + dev: true + + /mdast-util-gfm-task-list-item@0.1.6: + resolution: {integrity: sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A==} + dependencies: + mdast-util-to-markdown: 0.6.5 + dev: true + + /mdast-util-gfm@0.1.2: + resolution: {integrity: sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ==} + dependencies: + mdast-util-gfm-autolink-literal: 0.1.3 + mdast-util-gfm-strikethrough: 0.2.3 + mdast-util-gfm-table: 0.1.6 + mdast-util-gfm-task-list-item: 0.1.6 + mdast-util-to-markdown: 0.6.5 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-to-markdown@0.6.5: + resolution: {integrity: sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==} + dependencies: + '@types/unist': 2.0.10 + longest-streak: 2.0.4 + mdast-util-to-string: 2.0.0 + parse-entities: 2.0.0 + repeat-string: 1.6.1 + zwitch: 1.0.5 + dev: true + + /mdast-util-to-string@2.0.0: + resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} + dev: true + + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + /memoize-one@5.2.1: + resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} + dev: true + + /mensch@0.3.4: + resolution: {integrity: sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g==} + dev: true + + /meow@9.0.0: + resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} + engines: {node: '>=10'} + dependencies: + '@types/minimist': 1.2.5 + camelcase-keys: 6.2.2 + decamelize: 1.2.0 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: true + + /merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + /micromark-extension-footnote@0.3.2: + resolution: {integrity: sha512-gr/BeIxbIWQoUm02cIfK7mdMZ/fbroRpLsck4kvFtjbzP4yi+OPVbnukTc/zy0i7spC2xYE/dbX1Sur8BEDJsQ==} + dependencies: + micromark: 2.11.4 + transitivePeerDependencies: + - supports-color + dev: true + + /micromark-extension-frontmatter@0.2.2: + resolution: {integrity: sha512-q6nPLFCMTLtfsctAuS0Xh4vaolxSFUWUWR6PZSrXXiRy+SANGllpcqdXFv2z07l0Xz/6Hl40hK0ffNCJPH2n1A==} + dependencies: + fault: 1.0.4 + dev: true + + /micromark-extension-gfm-autolink-literal@0.5.7: + resolution: {integrity: sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw==} + dependencies: + micromark: 2.11.4 + transitivePeerDependencies: + - supports-color + dev: true + + /micromark-extension-gfm-strikethrough@0.6.5: + resolution: {integrity: sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw==} + dependencies: + micromark: 2.11.4 + transitivePeerDependencies: + - supports-color + dev: true + + /micromark-extension-gfm-table@0.4.3: + resolution: {integrity: sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA==} + dependencies: + micromark: 2.11.4 + transitivePeerDependencies: + - supports-color + dev: true + + /micromark-extension-gfm-tagfilter@0.3.0: + resolution: {integrity: sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q==} + dev: true + + /micromark-extension-gfm-task-list-item@0.3.3: + resolution: {integrity: sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ==} + dependencies: + micromark: 2.11.4 + transitivePeerDependencies: + - supports-color + dev: true + + /micromark-extension-gfm@0.3.3: + resolution: {integrity: sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A==} + dependencies: + micromark: 2.11.4 + micromark-extension-gfm-autolink-literal: 0.5.7 + micromark-extension-gfm-strikethrough: 0.6.5 + micromark-extension-gfm-table: 0.4.3 + micromark-extension-gfm-tagfilter: 0.3.0 + micromark-extension-gfm-task-list-item: 0.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /micromark@2.11.4: + resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} + dependencies: + debug: 4.3.4 + parse-entities: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /micromatch@3.1.10: + resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + braces: 2.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + extglob: 2.0.4 + fragment-cache: 0.2.1 + kind-of: 6.0.3 + nanomatch: 1.2.13 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + /mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + dev: true + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + + /minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /mixin-deep@1.3.2: + resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} + engines: {node: '>=0.10.0'} + dependencies: + for-in: 1.0.2 + is-extendable: 1.0.1 + dev: true + + /mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} + dev: true + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + /nanomatch@1.2.13: + resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + fragment-cache: 0.2.1 + is-windows: 1.0.2 + kind-of: 6.0.3 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + /nice-try@1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + dev: true + + /node-abort-controller@3.1.1: + resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + dev: true + + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + dev: true + + /node-notifier@8.0.2: + resolution: {integrity: sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==} + requiresBuild: true + dependencies: + growly: 1.3.0 + is-wsl: 2.2.0 + semver: 7.5.4 + shellwords: 0.1.1 + uuid: 8.3.2 + which: 2.0.2 + dev: true + optional: true + + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + dev: true + + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.8 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.13.1 + semver: 7.5.4 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path@2.1.1: + resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} + engines: {node: '>=0.10.0'} + dependencies: + remove-trailing-separator: 1.1.0 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /npm-run-path@2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} + dependencies: + path-key: 2.0.1 + dev: true + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: true + + /nunjucks-do@1.0.0: + resolution: {integrity: sha512-GQwENqZdcSbni0iYfEiNi3hs634JBSQdxnbnd9CetGkMYPnpjG1Jn5DT/qgAaC/STwMc7C4MSIJvLSNertclSg==} + dev: true + + /nunjucks@3.2.4(chokidar@3.5.3): + resolution: {integrity: sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==} + engines: {node: '>= 6.9.0'} + hasBin: true + peerDependencies: + chokidar: ^3.3.0 + peerDependenciesMeta: + chokidar: + optional: true + dependencies: + a-sync-waterfall: 1.0.1 + asap: 2.0.6 + chokidar: 3.5.3 + commander: 5.1.0 + dev: true + + /nwsapi@2.2.7: + resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + /object-copy@0.1.0: + resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} + engines: {node: '>=0.10.0'} + dependencies: + copy-descriptor: 0.1.1 + define-property: 0.2.5 + kind-of: 3.2.2 + dev: true + + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object-path@0.11.8: + resolution: {integrity: sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==} + engines: {node: '>= 10.12.0'} + dev: true + + /object-visit@1.0.1: + resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /object.pick@1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /omit-keys@0.1.0: + resolution: {integrity: sha512-JfTw3lVL54592o0Vb1frMN6DpS/wT8Uz/IWg1e0w2ZkjF4yyPYHGJAtdcBcUbp/RMf/LbdMzIz6QZ6ycaRCFUA==} + engines: {node: '>=0.10.0'} + dependencies: + array-difference: 0.0.1 + isobject: 0.2.0 + dev: true + + /on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: true + + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /open@7.4.2: + resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: true + + /optimism@0.16.2: + resolution: {integrity: sha512-zWNbgWj+3vLEjZNIh/okkY2EUfX+vB9TJopzIZwT1xxaMqC5hRLLraePod4c5n4He08xuXNH+zhKFFCu390wiQ==} + dependencies: + '@wry/context': 0.7.4 + '@wry/trie': 0.3.2 + dev: false + + /os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + dev: true + + /p-each-series@2.2.0: + resolution: {integrity: sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==} + engines: {node: '>=8'} + dev: true + + /p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + dev: true + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /parse-entities@2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + dependencies: + character-entities: 1.2.4 + character-entities-legacy: 1.1.4 + character-reference-invalid: 1.1.4 + is-alphanumerical: 1.0.4 + is-decimal: 1.0.4 + is-hexadecimal: 1.0.4 + dev: true + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.23.5 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /parse5-htmlparser2-tree-adapter@6.0.1: + resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} + dependencies: + parse5: 6.0.1 + dev: true + + /parse5-htmlparser2-tree-adapter@7.0.0: + resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} + dependencies: + domhandler: 5.0.3 + parse5: 7.1.2 + dev: true + + /parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + dev: true + + /parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + dependencies: + entities: 4.5.0 + dev: true + + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + /pascalcase@0.1.1: + resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} + engines: {node: '>=0.10.0'} + dev: true + + /patch-package@8.0.0: + resolution: {integrity: sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA==} + engines: {node: '>=14', npm: '>5'} + hasBin: true + dependencies: + '@yarnpkg/lockfile': 1.1.0 + chalk: 4.1.2 + ci-info: 3.9.0 + cross-spawn: 7.0.3 + find-yarn-workspace-root: 2.0.0 + fs-extra: 9.1.0 + json-stable-stringify: 1.1.1 + klaw-sync: 6.0.0 + minimist: 1.2.8 + open: 7.4.2 + rimraf: 2.7.1 + semver: 7.5.4 + slash: 2.0.0 + tmp: 0.0.33 + yaml: 2.3.4 + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: true + + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: true + + /posix-character-classes@0.1.1: + resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} + engines: {node: '>=0.10.0'} + dev: true + + /pretty-format@26.6.2: + resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==} + engines: {node: '>= 10'} + dependencies: + '@jest/types': 26.6.2 + ansi-regex: 5.0.1 + ansi-styles: 4.3.0 + react-is: 17.0.2 + + /prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: true + + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + dev: false + + /proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + /psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + dev: true + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: true + + /q@1.5.1: + resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} + engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + dev: true + + /qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + + /qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: true + + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + dev: true + + /range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + /raw-body@1.1.7: + resolution: {integrity: sha512-WmJJU2e9Y6M5UzTOkHaM7xJGAPQD8PNzx3bAd2+uhZAim6wDk6dAZxPVYLF67XhbR4hmKGh33Lpmh4XWrCH5Mg==} + engines: {node: '>= 0.8.0'} + dependencies: + bytes: 1.0.0 + string_decoder: 0.10.31 + dev: true + + /raw-body@2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + dev: false + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + /read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: true + + /reflect-metadata@0.1.14: + resolution: {integrity: sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==} + dev: false + + /regex-not@1.0.2: + resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + safe-regex: 1.1.0 + dev: true + + /remark-footnotes@3.0.0: + resolution: {integrity: sha512-ZssAvH9FjGYlJ/PBVKdSmfyPc3Cz4rTWgZLI4iE/SX8Nt5l3o3oEjv3wwG5VD7xOjktzdwp5coac+kJV9l4jgg==} + dependencies: + mdast-util-footnote: 0.1.7 + micromark-extension-footnote: 0.3.2 + transitivePeerDependencies: + - supports-color + dev: true + + /remark-frontmatter@3.0.0: + resolution: {integrity: sha512-mSuDd3svCHs+2PyO29h7iijIZx4plX0fheacJcAoYAASfgzgVIcXGYSq9GFyYocFLftQs8IOmmkgtOovs6d4oA==} + dependencies: + mdast-util-frontmatter: 0.2.0 + micromark-extension-frontmatter: 0.2.2 + dev: true + + /remark-gfm@1.0.0: + resolution: {integrity: sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA==} + dependencies: + mdast-util-gfm: 0.1.2 + micromark-extension-gfm: 0.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /remark-parse@9.0.0: + resolution: {integrity: sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==} + dependencies: + mdast-util-from-markdown: 0.8.5 + transitivePeerDependencies: + - supports-color + dev: true + + /remove-trailing-separator@1.1.0: + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + dev: true + + /repeat-element@1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} + engines: {node: '>=0.10.0'} + dev: true + + /repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + dev: true + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: true + + /resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + dev: true + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve-url@0.2.1: + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} + deprecated: https://github.com/lydell/resolve-url#deprecated + dev: true + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /response-iterator@0.2.6: + resolution: {integrity: sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw==} + engines: {node: '>=0.8'} + dev: false + + /ret@0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + dev: true + + /retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf@2.6.3: + resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup@2.79.1: + resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /rsvp@4.8.5: + resolution: {integrity: sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==} + engines: {node: 6.* || >= 7.*} + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safe-json-parse@1.0.1: + resolution: {integrity: sha512-o0JmTu17WGUaUOHa1l0FPGXKBfijbxK6qoHzlkihsDXxzBHvJcA7zgviKR92Xs841rX9pK16unfphLq0/KqX7A==} + dev: true + + /safe-regex@1.1.0: + resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} + dependencies: + ret: 0.1.15 + dev: true + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + /sane@4.1.0: + resolution: {integrity: sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==} + engines: {node: 6.* || 8.* || >= 10.*} + deprecated: some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added + hasBin: true + dependencies: + '@cnakazawa/watch': 1.0.4 + anymatch: 2.0.0 + capture-exit: 2.0.0 + exec-sh: 0.3.6 + execa: 1.0.0 + fb-watchman: 2.0.2 + micromatch: 3.1.10 + minimist: 1.2.8 + walker: 1.0.8 + transitivePeerDependencies: + - supports-color + dev: true + + /saxes@5.0.1: + resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} + engines: {node: '>=10'} + dependencies: + xmlchars: 2.2.0 + dev: true + + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + dev: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /send@0.17.2: + resolution: {integrity: sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 1.1.2 + destroy: 1.0.4 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 1.8.1 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.3.0 + range-parser: 1.2.1 + statuses: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: true + + /send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + /serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: true + + /set-function-length@1.2.0: + resolution: {integrity: sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + + /set-value@2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-extendable: 0.1.1 + is-plain-object: 2.0.4 + split-string: 3.1.0 + dev: true + + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + /sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + dependencies: + shebang-regex: 1.0.0 + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /shellwords@0.1.1: + resolution: {integrity: sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==} + requiresBuild: true + dev: true + optional: true + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + object-inspect: 1.13.1 + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: true + + /slash@2.0.0: + resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} + engines: {node: '>=6'} + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slick@1.12.2: + resolution: {integrity: sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==} + dev: true + + /snapdragon-node@2.1.1: + resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 1.0.0 + isobject: 3.0.1 + snapdragon-util: 3.0.1 + dev: true + + /snapdragon-util@3.0.1: + resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /snapdragon@0.8.2: + resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} + engines: {node: '>=0.10.0'} + dependencies: + base: 0.11.2 + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + map-cache: 0.2.2 + source-map: 0.5.7 + source-map-resolve: 0.5.3 + use: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /source-map-resolve@0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.2 + resolve-url: 0.2.1 + source-map-url: 0.4.1 + urix: 0.1.0 + dev: true + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map-url@0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} + deprecated: See https://github.com/lydell/source-map-url#deprecated + dev: true + + /source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: true + + /sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + dev: true + + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.16 + dev: true + + /spdx-exceptions@2.4.0: + resolution: {integrity: sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw==} + dev: true + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.4.0 + spdx-license-ids: 3.0.16 + dev: true + + /spdx-license-ids@3.0.16: + resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} + dev: true + + /split-string@3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + dev: true + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: true + + /stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: true + + /static-extend@0.1.2: + resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 0.2.5 + object-copy: 0.1.0 + dev: true + + /statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + dev: true + + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + /string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + dev: true + + /string-template@0.2.1: + resolution: {integrity: sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw==} + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + dev: true + + /strip-eof@1.0.0: + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} + engines: {node: '>=0.10.0'} + dev: true + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + + /supports-hyperlinks@2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /symbol-observable@4.0.0: + resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} + engines: {node: '>=0.10'} + dev: false + + /symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + dev: true + + /terminal-link@2.1.1: + resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} + engines: {node: '>=8'} + dependencies: + ansi-escapes: 4.3.2 + supports-hyperlinks: 2.3.0 + dev: true + + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /throat@5.0.0: + resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} + dev: true + + /tiny-lr@1.1.1: + resolution: {integrity: sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==} + dependencies: + body: 5.1.0 + debug: 3.2.7 + faye-websocket: 0.10.0 + livereload-js: 2.4.0 + object-assign: 4.1.1 + qs: 6.11.2 + transitivePeerDependencies: + - supports-color + dev: true + + /tmp@0.0.28: + resolution: {integrity: sha512-c2mmfiBmND6SOVxzogm1oda0OJ1HZVIk/5n26N59dDTh80MUeavpiCls4PGAdkX1PFkKokLpcf7prSjCeXLsJg==} + engines: {node: '>=0.4.0'} + dependencies: + os-tmpdir: 1.0.2 + dev: true + + /tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + dev: true + + /tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + dev: true + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: true + + /to-object-path@0.3.0: + resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /to-regex-range@2.1.1: + resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + repeat-string: 1.6.1 + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /to-regex@3.0.2: + resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 2.0.2 + extend-shallow: 3.0.2 + regex-not: 1.0.2 + safe-regex: 1.1.0 + dev: true + + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + /tough-cookie@4.1.3: + resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} + engines: {node: '>=6'} + dependencies: + psl: 1.9.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 + dev: true + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + + /tr46@2.1.0: + resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} + engines: {node: '>=8'} + dependencies: + punycode: 2.3.1 + dev: true + + /transform-markdown-links@2.1.0: + resolution: {integrity: sha512-7HWQwQ9US+tJSMMzi1aP+KA3QwfjDs8sB4H5GBMRHFNBMQVdgoF6VfIFy2nJR/UHRTkYoGFwWh2pe+QIwSvfOA==} + engines: {node: '>=4'} + dev: true + + /traverse@0.6.8: + resolution: {integrity: sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==} + engines: {node: '>= 0.4'} + dev: true + + /trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + dev: true + + /trough@1.0.5: + resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} + dev: true + + /try-resolve@1.0.1: + resolution: {integrity: sha512-yHeaPjCBzVaXwWl5IMUapTaTC2rn/eBYg2fsG2L+CvJd+ttFbk0ylDnpTO3wVhosmE1tQEvcebbBeKLCwScQSQ==} + dev: true + + /ts-invariant@0.10.3: + resolution: {integrity: sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==} + engines: {node: '>=8'} + dependencies: + tslib: 2.6.2 + dev: false + + /ts-jest@26.5.6(jest@26.6.3)(typescript@4.9.5): + resolution: {integrity: sha512-rua+rCP8DxpA8b4DQD/6X2HQS8Zy/xzViVYfEs2OQu68tkCuKLV0Md8pmX55+W24uRIyAsf/BajRfxOs+R2MKA==} + engines: {node: '>= 10'} + hasBin: true + peerDependencies: + jest: '>=26 <27' + typescript: '>=3.8 <5.0' + dependencies: + bs-logger: 0.2.6 + buffer-from: 1.1.2 + fast-json-stable-stringify: 2.1.0 + jest: 26.6.3 + jest-util: 26.6.2 + json5: 2.2.3 + lodash: 4.17.21 + make-error: 1.3.6 + mkdirp: 1.0.4 + semver: 7.5.4 + typescript: 4.9.5 + yargs-parser: 20.2.9 + dev: true + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + + /type-graphql@1.1.1(class-validator@0.13.2)(graphql@15.7.2): + resolution: {integrity: sha512-iOOWVn0ehCYMukmnXStbkRwFE9dcjt7/oDcBS1JyQZo9CbhlIll4lHHps54HMEk4A4c8bUPd+DjK8w1/ZrxB4A==} + engines: {node: '>= 10.3'} + requiresBuild: true + peerDependencies: + class-validator: '>=0.12.0' + graphql: ^15.3.0 + dependencies: + '@types/glob': 7.2.0 + '@types/node': 20.11.7 + '@types/semver': 7.5.6 + class-validator: 0.13.2 + glob: 7.2.3 + graphql: 15.7.2(patch_hash=g4ubilmxli6fuk7eusupjbkdjm) + graphql-query-complexity: 0.7.2(graphql@15.7.2) + graphql-subscriptions: 1.2.1(graphql@15.7.2) + semver: 7.5.4 + tslib: 2.6.2 + dev: false + + /type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + /typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + dev: true + + /typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /underscore@1.13.6: + resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} + dev: true + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + /unified@9.2.2: + resolution: {integrity: sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==} + dependencies: + '@types/unist': 2.0.10 + bail: 1.0.5 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 2.1.0 + trough: 1.0.5 + vfile: 4.2.1 + dev: true + + /union-value@1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + set-value: 2.0.1 + dev: true + + /unist-util-is@4.1.0: + resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} + dev: true + + /unist-util-stringify-position@2.0.3: + resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} + dependencies: + '@types/unist': 2.0.10 + dev: true + + /unist-util-visit-parents@3.1.1: + resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} + dependencies: + '@types/unist': 2.0.10 + unist-util-is: 4.1.0 + dev: true + + /universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + dev: true + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: true + + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + /unset-value@1.0.0: + resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} + engines: {node: '>=0.10.0'} + dependencies: + has-value: 0.3.1 + isobject: 3.0.1 + dev: true + + /unxhr@1.0.1: + resolution: {integrity: sha512-MAhukhVHyaLGDjyDYhy8gVjWJyhTECCdNsLwlMoGFoNJ3o79fpQhtQuzmAE4IxCMDwraF4cW8ZjpAV0m9CRQbg==} + engines: {node: '>=8.11'} + dev: true + + /update-browserslist-db@1.0.13(browserslist@4.22.2): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.2 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /update-section@0.3.3: + resolution: {integrity: sha512-BpRZMZpgXLuTiKeiu7kK0nIPwGdyrqrs6EDSaXtjD/aQ2T+qVo9a5hRC3HN3iJjCMxNT/VxoLGQ7E/OzE5ucnw==} + dev: true + + /urijs@1.19.11: + resolution: {integrity: sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==} + dev: true + + /urix@0.1.0: + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} + deprecated: Please see https://github.com/lydell/urix#deprecated + dev: true + + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: true + + /use@3.1.1: + resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} + engines: {node: '>=0.10.0'} + dev: true + + /utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + requiresBuild: true + dev: true + optional: true + + /uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + dev: true + + /v8-to-istanbul@7.1.2: + resolution: {integrity: sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==} + engines: {node: '>=10.10.0'} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 1.9.0 + source-map: 0.7.4 + dev: true + + /valid-data-url@3.0.1: + resolution: {integrity: sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA==} + engines: {node: '>=10'} + dev: true + + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /validator@13.11.0: + resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} + engines: {node: '>= 0.10'} + dev: false + + /value-or-promise@1.0.12: + resolution: {integrity: sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q==} + engines: {node: '>=12'} + dev: true + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + /vfile-message@2.0.4: + resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} + dependencies: + '@types/unist': 2.0.10 + unist-util-stringify-position: 2.0.3 + dev: true + + /vfile@4.2.1: + resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} + dependencies: + '@types/unist': 2.0.10 + is-buffer: 2.0.5 + unist-util-stringify-position: 2.0.3 + vfile-message: 2.0.4 + dev: true + + /w3c-hr-time@1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. + dependencies: + browser-process-hrtime: 1.0.0 + dev: true + + /w3c-xmlserializer@2.0.0: + resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} + engines: {node: '>=10'} + dependencies: + xml-name-validator: 3.0.0 + dev: true + + /walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + dependencies: + makeerror: 1.0.12 + dev: true + + /web-resource-inliner@6.0.1: + resolution: {integrity: sha512-kfqDxt5dTB1JhqsCUQVFDj0rmY+4HLwGQIsLPbyrsN9y9WV/1oFDSx3BQ4GfCv9X+jVeQ7rouTqwK53rA/7t8A==} + engines: {node: '>=10.0.0'} + dependencies: + ansi-colors: 4.1.3 + escape-goat: 3.0.0 + htmlparser2: 5.0.1 + mime: 2.6.0 + node-fetch: 2.7.0 + valid-data-url: 3.0.1 + transitivePeerDependencies: + - encoding + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + + /webidl-conversions@5.0.0: + resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} + engines: {node: '>=8'} + dev: true + + /webidl-conversions@6.1.0: + resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} + engines: {node: '>=10.4'} + dev: true + + /websocket-driver@0.7.4: + resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + engines: {node: '>=0.8.0'} + dependencies: + http-parser-js: 0.5.8 + safe-buffer: 5.2.1 + websocket-extensions: 0.1.4 + dev: true + + /websocket-extensions@0.1.4: + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} + dev: true + + /whatwg-encoding@1.0.5: + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + dependencies: + iconv-lite: 0.4.24 + dev: true + + /whatwg-mimetype@2.3.0: + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + dev: true + + /whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + dev: true + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true + + /whatwg-url@8.7.0: + resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} + engines: {node: '>=10'} + dependencies: + lodash: 4.17.21 + tr46: 2.1.0 + webidl-conversions: 6.1.0 + dev: true + + /which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + dev: true + + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + dev: true + + /write@1.0.3: + resolution: {integrity: sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==} + engines: {node: '>=4'} + dependencies: + mkdirp: 0.5.6 + dev: true + + /ws@7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + 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 + dev: true + + /ws@8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + 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 + + /xml-name-validator@3.0.0: + resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + dev: true + + /xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + dev: true + + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: true + + /y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + dev: true + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + dev: true + + /yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + dev: true + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: true + + /yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + dev: true + + /yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + dev: true + + /zen-observable-ts@1.2.5: + resolution: {integrity: sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg==} + dependencies: + zen-observable: 0.8.15 + dev: false + + /zen-observable@0.8.15: + resolution: {integrity: sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==} + dev: false + + /zwitch@1.0.5: + resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} + dev: true diff --git a/core/pnpm-workspace.yaml b/core/pnpm-workspace.yaml new file mode 100644 index 000000000..7c34dd2bc --- /dev/null +++ b/core/pnpm-workspace.yaml @@ -0,0 +1,19 @@ +packages: + # all packages in direct subdirs of packages/ + - 'core' +# - 'docs' +# - 'executor' +# - 'ui' +# - 'connect' +# - 'bootstrap-languages/*' +# - 'tests/js' +# - 'rust-executor' +# - 'cli' +# - 'dapp' +# # exclude packages that are inside test directories +# - '!**/test/**' +# hoist: false +# public-hoist-pattern: '!core' +# overrides: +# core: +# hoist: false \ No newline at end of file diff --git a/core/src/Exception.ts b/core/src/Exception.ts index 97b1cd26b..b8842720a 100644 --- a/core/src/Exception.ts +++ b/core/src/Exception.ts @@ -1,6 +1,6 @@ export enum ExceptionType { - LanguageIsNotLoaded, - ExpressionIsNotVerified, - AgentIsUntrusted, - CapabilityRequested, + LanguageIsNotLoaded = "LANGUAGE_IS_NOT_LOADED", + ExpressionIsNotVerified = "EXPRESSION_IS_NOT_VERIFIED", + AgentIsUntrusted = "AGENT_IS_UNTRUSTED", + CapabilityRequested = "CAPABILITY_REQUESTED", } diff --git a/core/src/perspectives/PerspectiveHandle.ts b/core/src/perspectives/PerspectiveHandle.ts index 7abcde68b..7831f5956 100644 --- a/core/src/perspectives/PerspectiveHandle.ts +++ b/core/src/perspectives/PerspectiveHandle.ts @@ -2,13 +2,13 @@ import { Field, ObjectType } from "type-graphql"; import { NeighbourhoodExpression } from "../neighbourhood/Neighbourhood"; export enum PerspectiveState { - Private = "Private", - NeighbourhoodJoinInitiated = "NeighbourhoodJoinInitiated", - LinkLanguageFailedToInstall = "LinkLanguageFailedToInstall", - LinkLanguageInstalledButNotSynced = "LinkLanguageInstalledButNotSynced", - Synced = "Synced", + Private = "PRIVATE", + NeighboudhoodCreationInitiated = "NEIGHBOURHOOD_CREATION_INITIATED", + NeighbourhoodJoinInitiated = "NEIGHBOURHOOD_JOIN_INITIATED", + LinkLanguageFailedToInstall = "LINK_LANGUAGE_FAILED_TO_INSTALL", + LinkLanguageInstalledButNotSynced = "LINK_LANGUAGE_INSTALLED_BUT_NOT_SYNCED", + Synced = "SYNCED", } - // This type is used in the GraphQL interface to reference a mutable // prespective that is implemented locally by the Ad4m runtime. // The UUID is used in mutations to identify the perspective that gets mutated. diff --git a/core/src/perspectives/PerspectiveProxy.ts b/core/src/perspectives/PerspectiveProxy.ts index db69d56df..c1f580382 100644 --- a/core/src/perspectives/PerspectiveProxy.ts +++ b/core/src/perspectives/PerspectiveProxy.ts @@ -447,6 +447,11 @@ export class PerspectiveProxy { return instances } + /** Returns all subject proxies of the given subject class. + * @param subjectClass Either a string with the name of the subject class, or an object + * with the properties of the subject class. In the latter case, all subject classes + * that match the given properties will be used. + */ async getAllSubjectProxies(subjectClass: T): Promise { let classes = [] if(typeof subjectClass === "string") { diff --git a/core/src/runtime/RuntimeResolver.ts b/core/src/runtime/RuntimeResolver.ts index fb8891cb4..ac90c3a61 100644 --- a/core/src/runtime/RuntimeResolver.ts +++ b/core/src/runtime/RuntimeResolver.ts @@ -1,4 +1,4 @@ -import { Arg, Mutation, Resolver, Query, Subscription, ObjectType, Field } from "type-graphql"; +import { Arg, Mutation, Resolver, Query, Subscription, ObjectType, Field, Int } from "type-graphql"; import { Perspective, PerspectiveExpression, PerspectiveInput } from "../perspectives/Perspective"; import { ExpressionProof } from "../expression/Expression"; import { LinkExpression } from "../links/Links"; @@ -48,7 +48,7 @@ export class ExceptionInfo { title: string; @Field() message: string; - @Field() + @Field(type => Int) type: ExceptionType; @Field({ nullable: true }) addon?: string; diff --git a/core/src/subject/SDNADecorators.ts b/core/src/subject/SDNADecorators.ts index 8777aedab..278543f2e 100644 --- a/core/src/subject/SDNADecorators.ts +++ b/core/src/subject/SDNADecorators.ts @@ -22,16 +22,42 @@ export function hasLink(predicate: string): string { return `triple(this, "${predicate}", _)` } -interface InstanceQueryParams { - where?: object; - condition?: string; +export interface InstanceQueryParams { +/** + * An object representing the WHERE clause of the query. + */ +where?: object; + +/** + * A string representing the condition clause of the query. + */ +condition?: string; } -export function instanceQuery(options?: InstanceQueryParams) { +/** + * Decorator for querying instances of a subject class. + * + * @category Decorators + * + * @description + * NOTE: Only works on methods that return a promise and will throw an error if not used on a method that returns a promise. + * This will allow you to query for instances of a subject class with custom clauses within the instance clauses. + * + * @example + * // Usage with where clause + * InstanceQuery({ where: { name: "John" }}) // this will return all the properties of the subject class with the name "John" + * + * @example + * // Usage with condition clause + * InstanceQuery({ condition: "triple(Instance, 'age', Age), Age > 18" }) // this will return all the properties of the subject class with the age greater than 18 + * + * @param {Object} [options] - Query options. + */ +export function InstanceQuery(options?: InstanceQueryParams) { return function (target: T, key: keyof T, descriptor: PropertyDescriptor) { const originalMethod = descriptor.value; if(typeof originalMethod !== "function") { - throw new Error("instanceQuery decorator can only be applied to methods"); + throw new Error("InstanceQuery decorator can only be applied to methods"); } descriptor.value = async function(perspective: PerspectiveProxy): Promise { @@ -70,18 +96,79 @@ export function instanceQuery(options?: InstanceQueryParams) { } -interface PropertyOptions { +export interface PropertyOptions { + /** + * The predicate of the property. All properties must have this option. + */ through?: string; - initial?: string, - required?: boolean, - writable?: boolean, + + /** + * The initial value of the property. Required if the property is marked as required. + */ + initial?: string; + + /** + * Indicates whether the property is required. If true, an initial value must be provided. + */ + required?: boolean; + + /** + * Indicates whether the property is writable. If true, a setter will be available in the prolog engine. + */ + writable?: boolean; + + /** + * The language used to store the property. Can be the default `Literal` Language or a custom language address. + */ resolveLanguage?: string; + + /** + * Custom getter to get the value of the property in the prolog engine. If not provided, the default getter will be used. + */ getter?: string; + + /** + * Custom setter to set the value of the property in the prolog engine. Only available if the property is writable. + */ setter?: string; - local?: boolean + + /** + * Indicates whether the property is stored locally in the perspective and not in the network. Useful for properties that are not meant to be shared with the network. + */ + local?: boolean; } -export function subjectProperty(opts: PropertyOptions) { + +/** + * Decorator for defining properties of a subject class. + * + * @category Decorators + * + * @description + * This will allow you to define properties with different conditions and how they would be defined in proflog engine. + * + * - All properties must have a `through` option which is the predicate of the property. + * -e If the property is required, it must have an `initial` option which is the initial value of the property. + * - If the property is writable, it will have a setter in prolog engine. A custom setter can be defined with the `setter` option. + * - If resolveLanguage is defined, you can use the default `Literal` Language or use your custom language address that can be used to store the property. + * - If a custom getter is defined, it will be used to get the value of the property in prolog engine. If not, the default getter will be used. + * - If local is defined, the property will be stored locally in the perspective and not in the network. This is useful for properties that are not meant to be shared with the network + * + * @example + * // Usage + * SubjectProperty({ through: "ad4m://name", initial: "John", required: true }) // this will define a property with the name "ad4m://name" and the initial value "John" + * + * @param {PropertyOptions} [opts] - Property options. + */ +export function SubjectProperty(opts: PropertyOptions) { return function (target: T, key: keyof T) { + if (opts.required && !opts.initial) { + throw new Error("SubjectProperty requires an 'initial' option if 'required' is true"); + } + + if (!opts.through && !opts.getter) { + throw new Error("SubjectProperty requires either 'through' or 'getter' option") + } + target["__properties"] = target["__properties"] || {}; target["__properties"][key] = target["__properties"][key] || {}; target["__properties"][key] = { ...target["__properties"][key], ...opts } @@ -95,12 +182,51 @@ export function subjectProperty(opts: PropertyOptions) { }; } -interface FlagOptions { +export interface FlagOptions { + /** + * The predicate of the property. All properties must have this option. + */ through: string; + + /** + * The value of the property. + */ value: string; } -export function subjectFlag(opts: FlagOptions) { + +/** + * Decorator for defining flags of a subject class + * + * @category Decorators + * + * @description + * The idea behind flag decorator is to define a property that is required and has an initial value. + * This will allow you to define a strict instance query. This behaviour can also be achieved with the `SubjectProperty` decorator but the `SubjectFlag` decorator is a shorthand for that. + * + * NOTE: Use of Flag is discouraged and should be used only when necessary. + * + * - All properties must have a `through` & `initial` option which is the predicate of the property. + * + * @example + * // Usage + * SubjectFlag({ through: "ad4m://name", value: "John" }) // this will define a flag with the name "ad4m://name" and the initial value "John" + * + * @param {FlagOptions} [opts] Flag options. + */ +export function SubjectFlag(opts: FlagOptions) { return function (target: T, key: keyof T) { + if (!opts.through && !opts.value) { + throw new Error("SubjectFlag requires a 'through' and 'value' option") + } + + if (!opts.through) { + throw new Error("SubjectFlag requires a 'through' option") + } + + if (!opts.value) { + throw new Error("SubjectFlag requires a 'value' option") + } + target["__properties"] = target["__properties"] || {}; target["__properties"][key] = target["__properties"][key] || {}; target["__properties"][key] = { @@ -122,13 +248,45 @@ interface WhereOptions { isInstance?: any condition?: string } -interface CollectionOptions { - through: string, - where?: WhereOptions, - local?: boolean + +export interface CollectionOptions { + /** + * The predicate of the property. All properties must have this option. + */ + through: string; + + /** + * An object representing the WHERE clause of the query. + */ + where?: WhereOptions; + + /** + * Indicates whether the property is stored locally in the perspective and not in the network. Useful for properties that are not meant to be shared with the network. + */ + local?: boolean; } -export function subjectCollection(opts: CollectionOptions) { +/** + * Decorator for defining collections of a subject class. + * + * @category Decorators + * + * @description + * This will allow you to define collections with different conditions and how they would be defined in proflog engine. + * + * NOTE: The property needs to be an array for it to picked up during the initialization phase. + * + * - All collections must have a `through` option which is the predicate of the collection. + * - If the collection has a `where` option, it can be used to define a custom condition for the collection. + * - If the collection has a `local` option, the collection will be stored locally in the perspective and not in the network. This is useful for collections that are not meant to be shared with the network. + * + * @example + * // Usage + * SubjectCollection({ through: "ad4m://friends" }) // this will define a collection with the name "ad4m://friends" + * + * @param opts Collection options. + */ +export function SubjectCollection(opts: CollectionOptions) { return function (target: T, key: keyof T) { target["__collections"] = target["__collections"] || {}; target["__collections"][key] = opts; @@ -152,10 +310,29 @@ export function makeRandomPrologAtom(length: number): string { return result; } - interface SDNAClassOptions { +export interface SDNAClassOptions { + /** + * The name of the entity. + */ name: string; } +/** + * Decorator for defining an SDNA class. + * + * @category Decorators + * + * @description + * This will create a new SDNA class with the given name and add custom methods to generate the SDNA for the class, for this to work the class need to have the properties defined using the decorators like `SubjectProperty`. + * + * Note: This decorator is required for the class to be picked up during the initialization phase. + * + * @example + * // Usage + * SDNAClass({ name: "Person" }) // this will create a new SDNA class with the name "Person" + * + * @param opts SDNA class options. + */ export function SDNAClass(opts: SDNAClassOptions) { return function (target: any) { target.prototype.className = opts.name; diff --git a/core/src/subject/Subject.ts b/core/src/subject/Subject.ts index f4cdb2497..abeed8ed0 100644 --- a/core/src/subject/Subject.ts +++ b/core/src/subject/Subject.ts @@ -1,32 +1,50 @@ import { PerspectiveProxy } from "../perspectives/PerspectiveProxy"; import { collectionSetterToName, collectionToAdderName, collectionToRemoverName, collectionToSetterName, propertyNameToSetterName } from "./util"; +/** + * Represents a subject in the perspective. + * A subject is an entity that has properties and collections. + */ export class Subject { #baseExpression: string; #subjectClass: string; #perspective: PerspectiveProxy + /** + * Constructs a new subject. + * @param perspective - The perspective that the subject belongs to. + * @param baseExpression - The base expression of the subject. + * @param subjectClass - The class of the subject. + */ constructor(perspective: PerspectiveProxy, baseExpression: string, subjectClass: string) { this.#baseExpression = baseExpression this.#subjectClass = subjectClass this.#perspective = perspective } + /** + * Gets the base expression of the subject. + */ get baseExpression() { return this.#baseExpression } + /** + * Initializes the subject by validating it and defining its properties and collections dynamically. + * + * NOTE: This method should be called before using the subject. All the properties and collections of the subject defined are not type-checked. + */ async init() { + // Check if the subject is a valid instance of the subject class let isInstance = await this.#perspective.isSubjectInstance(this.#baseExpression, this.#subjectClass) if(!isInstance) { throw `Not a valid subject instance of ${this.#subjectClass} for ${this.#baseExpression}` } + // Define properties and collections dynamically let results = await this.#perspective.infer(`subject_class("${this.#subjectClass}", C), property(C, Property)`) let properties = results.map(result => result.Property) - //console.log("Subject properties: " + properties) - for(let p of properties) { const resolveExpressionURI = await this.#perspective.infer(`subject_class("${this.#subjectClass}", C), property_resolve(C, "${p}")`) Object.defineProperty(this, p, { @@ -37,11 +55,15 @@ export class Subject { let expressionURI = results[0].Value if(resolveExpressionURI) { try { - const expression = await this.#perspective.getExpression(expressionURI) - try { - return JSON.parse(expression.data) - } catch(e) { - return expression.data + if (expressionURI) { + const expression = await this.#perspective.getExpression(expressionURI) + try { + return JSON.parse(expression.data) + } catch(e) { + return expression.data + } + } else { + return expressionURI } } catch (err) { return expressionURI @@ -58,10 +80,9 @@ export class Subject { }) } - + // Define setters const setters = await this.#perspective.infer(`subject_class("${this.#subjectClass}", C), property_setter(C, Property, Setter)`) - - //console.log("Subject setters: " + setters.map(setter => setter.Property)) + for(let setter of (setters ? setters : [])) { if(setter) { const property = setter.Property @@ -80,6 +101,7 @@ export class Subject { } } + // Define collections let results2 = await this.#perspective.infer(`subject_class("${this.#subjectClass}", C), collection(C, Collection)`) if(!results2) results2 = [] let collections = results2.map(result => result.Collection) @@ -99,6 +121,7 @@ export class Subject { }) } + // Define collection adders let adders = await this.#perspective.infer(`subject_class("${this.#subjectClass}", C), collection_adder(C, Collection, Adder)`) if(!adders) adders = [] @@ -116,6 +139,7 @@ export class Subject { } } + // Define collection removers let removers = await this.#perspective.infer(`subject_class("${this.#subjectClass}", C), collection_remover(C, Collection, Remover)`) if(!removers) removers = [] @@ -133,6 +157,7 @@ export class Subject { } } + // Define collection setters let collectionSetters = await this.#perspective.infer(`subject_class("${this.#subjectClass}", C), collection_setter(C, Collection, Setter)`) if(!collectionSetters) collectionSetters = [] diff --git a/core/src/subject/SubjectEntity.ts b/core/src/subject/SubjectEntity.ts index 09e9953ea..b65d15eae 100644 --- a/core/src/subject/SubjectEntity.ts +++ b/core/src/subject/SubjectEntity.ts @@ -9,6 +9,10 @@ export type QueryPartialEntity = { }; +/** + * Class representing a subject entity. + * Can extend this class to create a new subject entity to add methods interact with SDNA and much better experience then using the bare bone methods. + */ export class SubjectEntity { #baseExpression: string; #subjectClass: string; @@ -17,12 +21,22 @@ export class SubjectEntity { author: string; timestamp: string; + + /** + * Constructs a new subject. + * @param perspective - The perspective that the subject belongs to. + * @param baseExpression - The base expression of the subject. + * @param soruce - The source of the subject, the expression this instance is linked too. + */ constructor(perspective: PerspectiveProxy, baseExpression?: string, source?: string) { this.#baseExpression = baseExpression ? baseExpression : Literal.from(makeRandomPrologAtom(24)).toUrl(); this.#perspective = perspective; this.#source = source || "ad4m://self"; } + /** + * Gets the base expression of the subject. + */ get baseExpression() { return this.#baseExpression } @@ -155,6 +169,17 @@ export class SubjectEntity { } } + /** + * Save the subject entity. + * This method will create a new subject with the base expression and add a new link from the source to the base expression with the predicate "ad4m://has_child". + * + * If a property has an action, it will perform the action (Only for collections). + * If a property is an array and is not empty, it will set the collection. + * If a property is not undefined, not null, and not an empty string, it will set the property. + * + * + * @throws Will throw an error if the subject entity cannot be converted to a subject class, or if the subject cannot be created, or if the link cannot be added, or if the subject entity cannot be updated. + */ async save() { this.#subjectClass = await this.#perspective.stringOrTemplateObjectToSubjectClass(this) @@ -171,13 +196,24 @@ export class SubjectEntity { await this.update() } + /** + * Update the subject entity. + * + * It will iterate over the properties of the subject entity. + * + * If a property has an action, it will perform the action (Only for collections). + * If a property is an array and is not empty, it will set the collection. + * If a property is not undefined, not null, and not an empty string, it will set the property. + * + * @throws Will throw an error if the subject entity cannot be converted to a subject class, or if a property cannot be set, or if a collection cannot be set, or if the data of the subject entity cannot be gotten. + */ async update() { this.#subjectClass = await this.#perspective.stringOrTemplateObjectToSubjectClass(this) const entries = Object.entries(this); for (const [key, value] of entries) { - if (value) { + if (value !== undefined && value !== null) { if (value?.action) { switch (value.action) { case 'setter': @@ -194,7 +230,7 @@ export class SubjectEntity { } } else if (Array.isArray(value) && value.length > 0) { await this.setCollectionSetter(key, value) - } else { + } else if (value !== undefined && value !== null && value !== "") { await this.setProperty(key, value); } } @@ -203,17 +239,41 @@ export class SubjectEntity { await this.getData(); } + /** + * Get the subject entity with all the properties & collection populated. + * + * @returns The subject entity. + * + * @throws Will throw an error if the subject entity cannot be converted to a subject class, or if the data of the subject entity cannot be gotten. + */ async get() { this.#subjectClass = await this.#perspective.stringOrTemplateObjectToSubjectClass(this) return await this.getData() } + + /** + * Delete the subject entity. + * This method will remove the subject from the perspective. + * + * @throws Will throw an error if the subject entity cannot be removed. + */ async delete() { await this.#perspective.removeSubject(this, this.#baseExpression); } - // TODO: implement simple quering like limit, skip etc. + /** + * Get all the subject entities of the subject class. + * + * NOTE: this is a static method and should be called on the class itself. + * + * @param perspective - The perspective that the subject belongs to. + * + * @returns The subject entities. + * + * @throws Will throw an error if the subject entity cannot be converted to a subject class, or if the subject proxies cannot be gotten. + */ static async all(perspective: PerspectiveProxy) { let subjectClass = await perspective.stringOrTemplateObjectToSubjectClass(this) const proxies = await perspective.getAllSubjectProxies(subjectClass) @@ -233,6 +293,18 @@ export class SubjectEntity { return [] } + /** + * Query the subject entities of the subject class. + * + * NOTE: this is a static method and should be called on the class itself. + * + * @param perspective - The perspective that the subject belongs to. + * @param query - The query of the subject entities. + * + * @returns The subject entities. + * + * @throws Will throw an error if the subject entity cannot be converted to a subject class, or if the query cannot be inferred, or if the data of the subject entities cannot be gotten. + */ static async query(perspective: PerspectiveProxy, query?: SubjectEntityQueryParam) { const source = query?.source || "ad4m://self"; let subjectClass = await perspective.stringOrTemplateObjectToSubjectClass(this) @@ -286,7 +358,12 @@ export type SubjectArray = T[] | { } export type SubjectEntityQueryParam = { + // The source of the query. source?: string; + + // The size of the query. size?: number; + + // The page of the query. page?: number; } \ No newline at end of file diff --git a/dapp/package.json b/dapp/package.json index 67c4b266c..7d4e89a85 100644 --- a/dapp/package.json +++ b/dapp/package.json @@ -23,7 +23,7 @@ }, "scripts": { "dev": "vite", - "build": "tsc && vite build && cp -r ./dist ../rust-executor/dapp", + "build": "tsc && vite build", "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", "preview": "vite preview" }, diff --git a/docs/package.json b/docs/package.json index 7fb0a2a2a..a5ae82266 100644 --- a/docs/package.json +++ b/docs/package.json @@ -22,5 +22,5 @@ "typedoc-plugin-markdown": "^3.15.2", "typescript": "^4.9.3" }, - "version": "0.8.1" + "version": "0.9.0" } diff --git a/docs/pages/agents.mdx b/docs/pages/agents.mdx index 6d1c6af13..dc70e21b7 100644 --- a/docs/pages/agents.mdx +++ b/docs/pages/agents.mdx @@ -19,7 +19,7 @@ To retrieve your own Decentralized Identifier (DID) you can call `me()` on the A const { did, perspective } = await ad4m.agent.me(); ``` -Each Agent also has their own [Perspective](/essentials/perspectives) that can +Each Agent also has their own [Perspective](/perspectives) that can contain public information about the Agent. [Agent class definition](/jsdoc/classes/Agent) diff --git a/docs/pages/cli.mdx b/docs/pages/cli.mdx new file mode 100644 index 000000000..fa212f869 --- /dev/null +++ b/docs/pages/cli.mdx @@ -0,0 +1,95 @@ +# AD4M CLI + +This is a cmd-tool (`ad4m`) that uses the Rust implementation of the AD4M GraphQL interface wrapper (https://crates.io/crates/ad4m-client). +As such, it's a command-line based generic UI intended for development and scripting use and remote-controlling +of AD4M and all it's features. + +# Install + +`cargo install ad4m` + +This command will install two binaries +- `ad4m` - one for using the client to interact with execuror +- `ad4m-executor` - one for running the executor + +## Usage with executor + +### `init` + +This will initialize the ad4m directory & add the default bootstrap seed (run `ad4m-executor help` for more details). + +Example: + +``` +ad4m-executor init +``` + +### Run + +This command will spawn the executor (run `ad4m-executor help` for more details). + +``` +ad4m-executor run +``` + +### Run Local HC Services + +This command will run local holochain services like bootstrap service & signaling service for holochain (run `ad4m-executor help` for more details). + +``` +ad4m-executor run-local-hc-services +``` + +## Usage with client + +### Agent +Functions related to local agent can use to generate a new agent, get the current agent etc. + +``` +ad4m-executor agent +``` + +### Languages +See, create, and manage Languages. + +``` +ad4m-executor languages +``` + +### Perspectives +Can be used to add, remove and access Perspectives, links, SDNA & classes. + +``` +ad4m-executor perspectives +``` + +### Neighbourhoods +Publish perspectives as Neighbourhoods and join Neighbourhoods. + +``` +ad4m-executor neighbourhoods +``` + +### Runtime +Access various states of the local AD4M executor. + +``` +ad4m-executor runtime +``` + +### Expression +Create and get language expressions. + +``` +ad4m-executor expression +``` + +### Log +Print the executor log. + +``` +ad4m-executor log +``` + +For more details on each command, run ad4m-executor \ help. + diff --git a/docs/pages/expressions.mdx b/docs/pages/expressions.mdx index dee4682da..0d116f484 100644 --- a/docs/pages/expressions.mdx +++ b/docs/pages/expressions.mdx @@ -76,4 +76,4 @@ any agent with the URL of the Expression will be able to resolve it. In the next chapter we will learn how to organize these expression in something called [Perspectives](/concepts/#perspectives). These are essentially local graph databases that in -turn can be turned into [Neighbourhoods](/essentials/neighbourhoods) (Shared social spaces). +turn can be turned into [Neighbourhoods](/neighbourhoods) (Shared social spaces). diff --git a/docs/pages/hooks.mdx b/docs/pages/hooks.mdx new file mode 100644 index 000000000..2191137f5 --- /dev/null +++ b/docs/pages/hooks.mdx @@ -0,0 +1,380 @@ +# Hooks + +The following are a set of React hooks designed to easily work with ADAM principles like Perspectives, Expressions and Subject Classes within React applications: + +## useAgent + +The `useAgent` hook is allows designed to manage state related to fetching and caching data about ADAM agents, i.e. users, based on their DID. + +### Props + +The `useAgent` hook accepts the following props: + +- `client`: An instance of `AgentClient` which represents a client to interact with the AD4M network. +- `did`: A string or a function that returns a string representing the decentralized identifier (DID) of the agent. +- `formatter(links: LinkExpression[])`: A function that takes a links and formatted data structure. + +### Return Values + +The `useAgent` hook returns an object with the following properties: + +- `agent`: The cached `Agent` object fetched from the AD4M network. +- `profile`: The profile data formatted using the provided formatter function. +- `error`: Any error encountered during data fetching. +- `mutate`: A function to mutate the shared/cached data for all subscribers. +- `reload`: A function to trigger a re-fetch of data from the AD4M network. + +### Example Usage + +```javascript +import { useAgent } from '@coasys/ad4m/hooks/react'; + +const MyComponent = () => { + const client = new AgentClient(); + const did = "some-did"; + const formatter = (links) => ({ id: links[0].data.target, name: links[1].data.target }); + + const { agent, profile, error, mutate, reload } = useAgent({ client, did, formatter }); + + useEffect(() => { + console.log("Agent:", agent); + console.log("Profile:", profile); + console.log("Error:", error); + }, [agent, profile, error]); + + return ( +
+ {/* Render your component using the fetched data */} +
+ ); +}; +``` + +## useClient + +The `useClient` hook is a hook provides access to the underlying `Ad4mClient. + +### Props +This hook does not accept any props. + +### Return Value +The `useClient` hook returns an object with the following properties: +- `client`: The cached `Ad4mClient` object fetched from the AD4M network. +- `error`: Any error encountered during data fetching. +- `mutate`: A function to mutate the shared/cached data for all subscribers. +- `reload`: A function to trigger a re-fetch of the AD4M client data. + +### Example Usage +```javascript +import { useEffect } from "react"; +import { useClient } from '@coasys/ad4m/hooks/react'; + +const MyComponent = () => { + const { client, error, reload } = useClient(); + + useEffect(() => { + if (error) { + console.error("Error fetching AD4M client:", error); + } + }, [error]); + + return ( +
+

My AD4M Application

+

Client: {client ? "Connected" : "Disconnected"}

+ +
+ ); +}; + +export default MyComponent; +``` + +## useMe + +The `useMe` hook is a custom React hook designed to manage state related to fetching and caching user data, including agent information and profile data. + +### Props +- `agent`: An instance of `AgentClient` representing the user's agent in the AD4M network. +- `formatter(links: LinkExpression[])`: A function that takes a links and formatted data structure. + +### Return Value +The `useMe` hook returns an object with the following properties: +- `me`: The user's agent object. +- `status`: The status of the user's agent. +- `profile`: The user's profile data formatted using the provided formatter function. +- `error`: Any error encountered during data fetching. +- `mutate`: A function to mutate the shared/cached data for all subscribers. +- `reload`: A function to trigger a re-fetch of the user's data. + +### Example Usage +```javascript +import { useEffect } from "react"; +import { useMe } from from '@coasys/ad4m/hooks/react'; + +const MyComponent = () => { + const { me, status, profile, error, reload } = useMe(agentClient, formatProfile); + + useEffect(() => { + if (error) { + console.error("Error fetching user data:", error); + } + }, [error]); + + return ( +
+

User Profile

+ {me && ( +
+

Name: {me.name}

+

Email: {me.email}

+

Status: {status}

+
+ )} + {profile && ( +
+ {/* Render profile data here */} +
+ )} + +
+ ); +}; + +export default MyComponent; +``` + +## usePerspective + +The `usePerspective` hook is a hook that allows to fetching and caching a specific perspective from the AD4M. + +### Props +- `client`: An instance of `Ad4mClient` representing the client to interact with the AD4M network. +- `uuid`: A string or a function that returns a string representing the UUID of the perspective. + +### Return Value +The `usePerspective` hook returns an object with the following properties: +- `data`: An object containing the fetched perspective and its synchronization status. + +### Example Usage +```javascript +import React, { useState, useEffect } from 'react'; +import { usePerspectives } from './usePerspectives'; +import { Ad4mClient, PerspectiveProxy } from '../../index'; +import { usePerspective } from from '@coasys/ad4m/hooks/react'; + +const MyComponent = () => { + const client = new Ad4mClient(); // Initialize your Ad4m client + const perspectiveUuid = "some-uuid"; // Provide the UUID of the perspective you want to fetch + + const { data } = usePerspective(client, perspectiveUuid); + + useEffect(() => { + if (data.perspective) { + console.log("Fetched perspective:", data.perspective); + console.log("Synced:", data.synced); + } + }, [data]); + + return ( +
+ {/* Render your component using the fetched perspective data */} +
+ ); +}; + +export default MyComponent; +``` + +## usePerspectives + +The `usePerspectives` hook is a hook that allows to fetching and caching all the perspectives from the AD4M. + +### Props +- `client`: An instance of `Ad4mClient` representing the client to interact with the AD4M network. + +### Return Value +The `usePerspectives` hook returns an object with the following properties: +- `perspectives`: An object containing all fetched perspectives, indexed by their UUIDs. +- `neighbourhoods`: An object containing only the fetched perspectives that have a shared URL, indexed by their UUIDs. +- `onLinkAdded`: A function to register a callback to be called when a link is added to any perspective. +- `onLinkRemoved`: A function to register a callback to be called when a link is removed from any perspective. + +### Example Usage +```javascript +import React, { useEffect } from "react"; +import { Ad4mClient } from "../../index"; +import { usePerspectives } from from '@coasys/ad4m/hooks/react'; + +const MyComponent = () => { + const client = new Ad4mClient(); // Initialize your Ad4m client + const { perspectives, neighbourhoods, onLinkAdded, onLinkRemoved } = usePerspectives(client); + + useEffect(() => { + // Example of registering a callback for link added event + const linkAddedCallback = (perspective, link) => { + console.log("Link added to perspective:", perspective.uuid); + console.log("Link details:", link); + }; + onLinkAdded(linkAddedCallback); + + // Example of registering a callback for link removed event + const linkRemovedCallback = (perspective, link) => { + console.log("Link removed from perspective:", perspective.uuid); + console.log("Link details:", link); + }; + onLinkRemoved(linkRemovedCallback); + + return () => { + // Clean up by removing the registered callbacks + onLinkAdded(linkAddedCallback); + onLinkRemoved(linkRemovedCallback); + }; + }, [onLinkAdded, onLinkRemoved]); + + return ( +
+

Perspectives

+

All Perspectives

+
    + {Object.values(perspectives).map((perspective) => ( +
  • {perspective.uuid}
  • + ))} +
+

Neighbourhoods

+
    + {Object.values(neighbourhoods).map((neighbourhood) => ( +
  • {neighbourhood.uuid}
  • + ))} +
+
+ ); +}; + +export default MyComponent; +``` + +## useSubject + +The `useSubject` hook is a hook that allows you to interact with a single subject instance and listen to any changes on that instance. + +### Props +- `id`: A string representing the unique identifier of the subject. +- `perspective`: An instance of `PerspectiveProxy` representing the perspective containing the subject. +- `subject`: A string or a class representing the type of subject. + +### Return Value +The `useSubject` hook returns an object with the following properties: +- `entry`: The fetched subject data. +- `error`: Any error encountered during data fetching. +- `mutate`: A function to mutate the shared/cached data for all subscribers. +- `repo`: An instance of `SubjectRepository` for interacting with the subject data. +- `reload`: A function to trigger a re-fetch of the subject data. + +### Example Usage +```javascript +import { useState, useEffect } from "react"; +import { PerspectiveProxy, LinkExpression } from "../../index"; +import { useSubject } from from '@coasys/ad4m/hooks/react'; // SDNA class + +const MyComponent = () => { + const perspective = new PerspectiveProxy(); // Initialize your perspective + const subjectId = "some-unique-id"; // Provide the ID of the subject you want to fetch + const subjectType = "SomeSubject"; // Provide the type of the subject + const { entry, error, reload } = useSubject({ + id: subjectId, + perspective: perspective, + subject: subjectType, // SDNA Class + }); + + useEffect(() => { + if (error) { + console.error("Error fetching subject data:", error); + } + }, [error]); + + return ( +
+

Subject Data

+ {entry && ( +
+

ID: {entry.id}

+

Timestamp: {entry.timestamp}

+

Author: {entry.author}

+ {/* Render additional subject data here */} +
+ )} + +
+ ); +}; + +export default MyComponent; +``` + +## useSubjects + +The `useSubjects` hook that allows to listen to all the subject instances of a subject class. + +### Props +- `source`: A string representing the source of the subjects. +- `perspective`: An instance of `PerspectiveProxy` representing the perspective containing the subjects. +- `subject`: A class or a string representing the type of the subjects. +- `query` (optional): An object representing query options for fetching subjects. + +### Return Value +The `useSubjects` hook returns an object with the following properties: +- `entries`: An array of fetched subject data. +- `error`: Any error encountered during data fetching. +- `mutate`: A function to mutate the shared/cached data for all subscribers. +- `setQuery`: A function to update the query options for fetching subjects. +- `repo`: An instance of `SubjectRepository` for interacting with the subject data. +- `isLoading`: A boolean indicating whether data is currently being fetched. +- `reload`: A function to trigger a re-fetch of the subject data. +- `isMore`: A boolean indicating whether there are more subjects available to fetch based on query options. + +### Example Usage +```javascript +import { useState, useEffect } from "react"; +import { PerspectiveProxy, LinkExpression } from "../../index"; +import { useSubjects } from from '@coasys/ad4m/hooks/react'; + +const MyComponent = () => { + const perspective = new PerspectiveProxy(); // Initialize your perspective + const source = "some-source"; // Provide the source of the subjects + + const { entries, error, isLoading, reload, isMore, setQuery } = useSubjects({ + source: source, + perspective: perspective, + subject: subjectType, // SDNA Class + query: { page: 1, size: 10, infinite: false, uniqueKey: "uniqueKey" } + }); + + useEffect(() => { + if (error) { + console.error("Error fetching subjects data:", error); + } + }, [error]); + + return ( +
+

Subjects Data

+ {isLoading ? ( +

Loading...

+ ) : ( +
    + {entries.map(entry => ( +
  • + {/* Render subject data here */} +
  • + ))} +
+ )} + + {isMore && } +
+ ); +}; + +export default MyComponent; +``` diff --git a/docs/pages/index.mdx b/docs/pages/index.mdx index fa889af3c..dfc96b03c 100644 --- a/docs/pages/index.mdx +++ b/docs/pages/index.mdx @@ -45,16 +45,16 @@ ADAM defines a minimal set of assumptions of what is needed to create **any** ty | Definition | Description | | ---------------------------------------- | ------------------------------------------------------------------ | -| [Agents](/essentials/agents) | The agents (users) in the network. | -| [Languages](/essentials/languages) | The different ways agents can express ideas. | -| [Perspectives](/essentials/perspectives) | The collection of these expressions organized in a meaningful way. | +| [Agents](/agents) | The agents (users) in the network. | +| [Languages](/languages) | The different ways agents can express ideas. | +| [Perspectives](/perspectives) | The collection of these expressions organized in a meaningful way. | Through a combination of these basic principles, two important concepts are constructed: | Definition | Description | | ----------------------------------------- | ----------------------------------------------- | -| [Neighbourhoods](/essentials/agents) | Shared Perspectives. | -| [Social Organisms](/essentials/languages) | A Neighbourhood acting like a collective Agent. | +| [Neighbourhoods](/agents) | Shared Perspectives. | +| [Social Organisms](/languages) | A Neighbourhood acting like a collective Agent. | Here is a visualization of how these concepts interact with each other: diff --git a/docs/pages/languages.mdx b/docs/pages/languages.mdx index b238b07ba..43847cf9d 100644 --- a/docs/pages/languages.mdx +++ b/docs/pages/languages.mdx @@ -3,6 +3,39 @@ Languages are essentially Node.js modules that encapsulate how to retrieve and create content. You can think of them as **small edge functions** that are executed on the Agents device and that can communicate with different backends and technologies. +## Why Deno Compatibility? + +Deno compatibility is required because Languages get executed inside a sandbox that the ADAM executor spawns, and since it needs access to internals of ADAM, this needs to be an integrated JavaScript interpreter that is intertwined with the ADAM implementation. We've decided to build this Language engine on Deno of its several advantages: + +- **Security**: Deno is secure by default. No file, network, or environment access (unless explicitly enabled). +- **TypeScript Support**: Deno supports TypeScript out of the box. +- **Standard Modules**: Deno provides a set of reviewed (audited) standard modules that are guaranteed to work with Deno. + +## How to Make Your Language Deno Compatible? + +To make your Language Deno compatible, you need to follow these steps: + +1. **Use ES Modules**: Deno uses ES Modules (ESM) instead of CommonJS, which is used by Node.js. So, you need to use `import` and `export` instead of `require()` and `module.exports`. + +2. **Use Node Specifiers**: Unlike Node.js, Deno requires the full file name including its extension when importing modules. For example, use `import { serve } from "./server.ts";` instead of `import { serve } from "./server";`. + +3. **No `node_modules`**: Deno doesn't use the `node_modules` directory or `package.json`. Instead, it imports modules from URLs or file paths. + +4. **Use Built-in Functions and Standard Modules**: Deno has several built-in functions and does not rely on a `package.json`. So, you need to use Deno's built-in functions and standard modules instead of npm packages. You can find more about Deno's standard modules [here](https://deno.land/std). + +Remember, making your Language Deno compatible means it can run in more environments and take advantage of the benefits that Deno provides. + +# Language Templates + +To help you get started with creating your own languages, we have provided some templates that you can use as a starting point. These templates are Deno compatible and provide a basic structure for your language. + +- [Expression Language without DNA template](https://github.com/coasys/ad4m-language-template-js) +- [Expression Language with DNA template](https://github.com/coasys/ad4m-expression-language-with-dna) +- [Link Language without DNA template](https://github.com/coasys/ad4m-link-template-js) +- [Link Language with DNA template](https://github.com/coasys/ad4m-link-template-language-dna) + +You can clone these repositories and modify them to create your own language. Remember to follow the guidelines for making your language Deno compatible. + ## Creating a Language There are several types of Languages, but let's start with the most common one – an Expression Language. diff --git a/docs/pages/perspectives.mdx b/docs/pages/perspectives.mdx index 5b8804216..1d6bfd9ed 100644 --- a/docs/pages/perspectives.mdx +++ b/docs/pages/perspectives.mdx @@ -3,7 +3,7 @@ import { Callout } from "nextra-theme-docs"; # Perspectives A Perspective is essentially a **local graph database** that -contain the associations between [Expressions](/essentials/expressions). +contain the associations between [Expressions](/expressions). While Expressions contain "objective data", Perspectives can associate meaning between Expressions by linking them together. diff --git a/docs/pages/quick-start/react_backup b/docs/pages/quick-start/react_backup index be0a7deb5..6c368af58 100644 --- a/docs/pages/quick-start/react_backup +++ b/docs/pages/quick-start/react_backup @@ -123,26 +123,26 @@ Let's say we want to create a list of tasks to be completed. First, we need a task model. We can use the [SDNA](/social-dna/) helpers to create this: ```jsx filename="models/Task.ts" -import { SDNAClass, subjectProperty, subjectFlag } from "@coasys/ad4m"; +import { SDNAClass, SubjectProperty, SubjectFlag } from "@coasys/ad4m"; @SDNAClass({ name: "Task", }) export default class Task { - @subjectFlag({ + @SubjectFlag({ through: "flux://entry_type", value: "flux://has_task", }) type: string; - @subjectProperty({ + @SubjectProperty({ through: "rdf://title", writable: true, resolveLanguage: "literal", }) title: string; - @subjectProperty({ + @SubjectProperty({ through: "rdf://status", writable: true, resolveLanguage: "literal", diff --git a/docs/pages/social-dna.mdx b/docs/pages/social-dna.mdx index 7c05d743c..ba9d8a039 100644 --- a/docs/pages/social-dna.mdx +++ b/docs/pages/social-dna.mdx @@ -17,6 +17,12 @@ based on the structure of the graph data. Using [Prolog](https://en.wikipedia.or turing complete logical programming language, any kind of alorithm can be run based on the state of the graph. + + Don't worry if you are unfamiliar with [Prolog](https://en.wikipedia.org/wiki/Prolog). You will normally either + use AI to write it for you, or you will use some of our abstraction layers to + avoid writing Prolog code yourself. (Think of ORMs vs raw SQL, Ad4m comes with its own implementation [Subject Classes](/subject-classes) ). + +
Quick Intro to Prolog @@ -85,12 +91,6 @@ for (let i = 0; i < 10; i++) { Great! Now we have one post with 10 likes in our Perspective. Now let's define what `top_comments` mean to use in this Perspective: - - Don't worry if this looks very unfamiliar for now. You will normally either - use AI to write it for you, or you will use some of our abstraction layers to - avoid writing Prolog code yourself. (Think of ORMs vs raw SQL). - - ```prolog filename="top_posts.pl" top_posts(Post) :- triple(Source, "sioc://has_post", Post), diff --git a/docs/pages/subject-classes.mdx b/docs/pages/subject-classes.mdx index eda4aa491..25a7cf0a4 100644 --- a/docs/pages/subject-classes.mdx +++ b/docs/pages/subject-classes.mdx @@ -15,7 +15,7 @@ Consider the following example for Todo definition: name: "Todo", }) export default class Todo { - @subjectProperty({ + @SubjectProperty({ through: "rdf://title", writable: true, required: true, @@ -24,7 +24,7 @@ Consider the following example for Todo definition: }) title: string; - @subjectProperty({ + @SubjectProperty({ through: "rdf://done", writable: true, required: true, @@ -40,7 +40,7 @@ Consider the following example for Todo definition: ```prolog subject_class("Todo", c). constructor(c, '[ - {action: "addLink", source: "this", predicate: "rdf://title", target: "literal://string:''"}, + {action: "addLink", source: "this", predicate: "rdf://title", target: "literal://string:''"}, {action: "addLink", source: "this", predicate: "rdf://state", target: "literal://boolean:true"} ]'). instance(c, Base) :- triple(Base, "rdf://state", *), triple(Base, "rdf://title", *). @@ -82,7 +82,8 @@ Every class must be Decorated using the decorator inorder for it to have the cor Properties: Name: Name of the Subject class (When the js class goes through a minfiner it can change the class name so needed this) -subjectProperty + +### SubjectProperty All the properties on the subject class that are not collections should use this decorator to define the property. Atleast one property should be an instance property for the class to function meaning it should define through, initial & required. Properties: @@ -95,39 +96,45 @@ Properties: - getter: Overrides the default getter, a prolog query. - setter: Overrides the default setter, a prolog query. -## subjectFlag +### SubjectFlag -This decorator simplifies the creation of an instance property. Unlike subjectProperty this is not writable mean once define can't be changed so if you are planning to add an instance property that can be overridden use subjectProperty. +This decorator simplifies the creation of an instance property. Unlike SubjectProperty this is not writable mean once define can't be changed so if you are planning to add an instance property that can be overridden use SubjectProperty. through: Indicates the predicate for the property value: Initial value for the property -subjectCollection -This decorator can be used to define collections/ arrays and comes with some additional functions unlike subjectProperty. With this decorator you can set, push & remove items from the collections. + +### SubjectCollection +This decorator can be used to define collections/ arrays and comes with some additional functions unlike SubjectProperty. With this decorator you can set, push & remove items from the collections. through: Indicates the predicate for the property where: isInstance: You can pass in the subject class directly instead of using a prolog query. condition: prolog query to add a condition -Vanilla JS way + +### Vanilla JS way The above implementation can be writen below as js class using the decorator. ```js @SDNAClass({ name: "Todo" }) class Todo { - @subjectProperty({ + @SubjectFlag({ through: "todo://state", initial: "todo://ready", - writable: true, - required: true, }) state: string = ""; - @subjectProperty({ + @SubjectProperty({ through: "todo://has_title", writable: true, resolveLanguage: "literal", }) title: string = ""; + + @SubjectCollections({ + through: "flux://entry_type", + where: { condition: `triple(Target, "flux://has_reaction", "flux://thumbsup")` } + }) + likedMessages: string = ""; } ``` @@ -197,7 +204,7 @@ All you need is to extend the above class with SubjectEntity. ```js @SDNAClass({ name: "Todo" }) class Todo extends SubjectEntity { - @subjectProperty({ + @SubjectProperty({ through: "todo://state", initial: "todo://ready", writable: true, @@ -205,7 +212,7 @@ class Todo extends SubjectEntity { }) state: string = ""; - @subjectProperty({ + @SubjectProperty({ through: "todo://has_title", writable: true, resolveLanguage: "literal", @@ -257,7 +264,20 @@ Get all subject proxies for this class: ```js // This will get all the instances of the subject class -await Todo.all(); +await Todo.all(perspective); +``` + +Query subject proxies for this class: + +```js +/** This will get all the instances of the subject class + * + * SubjectEntityQueryParam: + * - `size: number`: The number of items/ subject proxies to return per page. + * - `page: number`: Page number starts from 1. + * - `source: string`: The baseExpression that all the instances are linked to, defaults to `ad4m://self` + */ +await Todo.query(perspective, { page: 1, size: 10 }); ``` Update properties/ collections: diff --git a/executor/esbuild.ts b/executor/esbuild.ts index 7848ed982..364a81bd0 100644 --- a/executor/esbuild.ts +++ b/executor/esbuild.ts @@ -7,7 +7,6 @@ function denoAlias(nodeModule) { name: `${nodeModule}-alias`, setup(build) { build.onResolve({ filter: new RegExp(`^node:${nodeModule}$`) }, (args) => { - console.log('meow 1111', args) return { path: nodeModule, namespace: 'imports' }; }); }, diff --git a/executor/package.json b/executor/package.json index 4691772a1..a2adcfff8 100644 --- a/executor/package.json +++ b/executor/package.json @@ -15,13 +15,12 @@ "type": "module", "types": "lib/main.d.ts", "scripts": { - "build": "deno run --allow-all esbuild.ts && deno run --allow-all replaceBufferImport.ts", + "build": "deno run --allow-all esbuild.ts", "bundle": "deno run --allow-all esbuild.ts", - "test": "pnpm run test-perspective && pnpm test-db && pnpm run test-auth-unit", + "test-js-executor": "pnpm run test-perspective && pnpm test-db", "test-perspective": "ts-mocha -p tsconfig.json --exit src/core/Perspective.test.ts", "test-db": "ts-mocha -p tsconfig.json --exit src/core/db.test.ts", - "test-prolog": "ts-mocha -p tsconfig.json --exit src/core/PrologInstance.test.ts", - "test-auth-unit": "ts-mocha -p tsconfig.json --exit src/core/agent/Auth.test.ts" + "test-prolog": "ts-mocha -p tsconfig.json --exit src/core/PrologInstance.test.ts" }, "repository": { "type": "git", @@ -79,5 +78,5 @@ "tmp": "^0.2.1", "uuid": "*" }, - "version": "0.8.1" + "version": "0.9.0" } diff --git a/executor/src/agent_extension.d.ts b/executor/src/agent_extension.d.ts new file mode 100644 index 000000000..5682ee136 --- /dev/null +++ b/executor/src/agent_extension.d.ts @@ -0,0 +1,56 @@ +export interface VerificationMethod { + id: string; + type: string; + controller: string; + publicKeyBase58?: string; + publicKeyMultibase?: string; + publicKeyJwk?: any; // Adjusted to 'any' since the specific structure is not provided + // Add other fields from the did_key::VerificationMethod if they exist +} + +export interface DidDocument { + "@context": string | string[]; + id: string; + alsoKnownAs?: string[]; + controller?: string | string[]; + verificationMethod: VerificationMethod[]; + authentication?: (string | VerificationMethod)[]; + assertionMethod?: (string | VerificationMethod)[]; + keyAgreement?: (string | VerificationMethod)[]; + capabilityInvocation?: (string | VerificationMethod)[]; + capabilityDelegation?: (string | VerificationMethod)[]; + service?: ServiceEndpoint[]; + // Add other fields from the did_key::Document if they exist +} + +export interface ServiceEndpoint { + id: string; + type: string; + serviceEndpoint: string; + // Add other fields from the did_key::ServiceEndpoint if they exist +} + +export interface Expression { + author: string; + timestamp: string; + data: any; + proof: ExpressionProof; +} + +export interface ExpressionProof { + signature: string; + key: string; +} + +declare global { + interface RustAgent { + didDocument: () => DidDocument; + signingKeyId: () => string; + did: () => string; + createSignedExpression: (data: any) => Expression; + sign: (payload: Uint8Array) => Uint8Array; + signStringHex: (payload: string) => string; + } + + const AGENT: RustAgent; +} \ No newline at end of file diff --git a/executor/src/core/Ad4mCore.ts b/executor/src/core/Ad4mCore.ts index f5d42c6ad..212979ca2 100644 --- a/executor/src/core/Ad4mCore.ts +++ b/executor/src/core/Ad4mCore.ts @@ -6,11 +6,9 @@ import * as Db from './db' import type { Ad4mDb } from './db' import HolochainService, { HolochainConfiguration } from './storage-services/Holochain/HolochainService'; import AgentService from './agent/AgentService' -import PerspectivesController from './PerspectivesController' import LanguageController from './LanguageController' import * as DIDs from './agent/DIDs' import type { DIDResolver } from './agent/DIDs' -import Signatures from './agent/Signatures' import * as PubSubDefinitions from './graphQL-interface/SubscriptionDefinitions' import EntanglementProofController from './EntanglementProof' import fs from 'node:fs' @@ -58,9 +56,7 @@ export default class Ad4mCore { #db: Ad4mDb #didResolver: DIDResolver - #signatures: Signatures - #perspectivesController?: PerspectivesController #languageController?: LanguageController #entanglementProofController?: EntanglementProofController @@ -80,7 +76,6 @@ export default class Ad4mCore { this.#agentService.load() this.#db = Db.init(this.#config.dataPath) this.#didResolver = DIDs.init(this.#config.dataPath) - this.#signatures = new Signatures() const that = this this.#resolveLanguagesReady = () => {} this.#languagesReady = new Promise(resolve => { @@ -119,10 +114,7 @@ export default class Ad4mCore { } } - get holochainService(): HolochainService { - if (!this.#holochain) { - throw Error("No holochain service") - } + get holochainService(): HolochainService | undefined { return this.#holochain } @@ -134,20 +126,6 @@ export default class Ad4mCore { return this.#runtimeService } - get signatureService(): Signatures { - if (!this.#signatures) { - throw Error("No signature service") - } - return this.#signatures - } - - get perspectivesController(): PerspectivesController { - if (!this.#perspectivesController) { - throw Error("No perspectiveController") - } - return this.#perspectivesController - } - get languageController(): LanguageController { if (!this.#languageController) { throw Error("No languageController") @@ -162,19 +140,8 @@ export default class Ad4mCore { return this.#entanglementProofController } - get database(): Ad4mDb { - return this.#db - } - async exit() { console.log("Exiting gracefully...") - console.log("Stopping Prolog engines") - for(let ph of this.perspectivesController.allPerspectiveHandles()) { - const perspective = this.perspectivesController.perspective(ph.uuid) - perspective.clearPolling() - } - console.log("Stopping IPFS") - //await this.#IPFS?.stop({timeout: 15}); console.log("Stopping Holochain conductor") await this.#holochain?.stop(); console.log("Done.") @@ -233,17 +200,9 @@ export default class Ad4mCore { agent: this.#agentService, runtime: this.#runtimeService, //IPFS: this.#IPFS, - signatures: this.#signatures, ad4mSignal: this.languageSignal, config: this.#config, - }, { holochainService: this.#holochain!, runtimeService: this.#runtimeService, signatures: this.#signatures, db: this.#db } ) - - this.#perspectivesController = new PerspectivesController(this.#config.rootConfigPath, { - db: this.#db, - agentService: this.agentService, - languageController: this.#languageController, - config: this.#config - }) + }, { holochainService: this.#holochain!, runtimeService: this.#runtimeService, db: this.#db } ) this.entanglementProofController } @@ -253,55 +212,6 @@ export default class Ad4mCore { this.#resolveLanguagesReady() } - async neighbourhoodPublishFromPerspective(uuid: string, linkLanguage: string, meta: Perspective): Promise { - // We only work on the PerspectiveID object. - // On PerspectiveController.update() below, the instance will get updated as well, but we don't need the - // instance object here - const perspectiveID = this.#perspectivesController!.perspective(uuid).plain() - - const neighbourhood = new Neighbourhood(linkLanguage, meta); - let language = await this.#languageController!.installLanguage(linkLanguage, null) - if (!language!.linksAdapter) { - throw Error("Language used is not a link language"); - } - - // Create neighbourhood - const neighbourhoodAddress = await (this.languageController.getNeighbourhoodLanguage().expressionAdapter!.putAdapter as PublicSharing).createPublic(neighbourhood) - const neighbourhoodUrl = `${Config.neighbourhoodLanguageAlias}://${neighbourhoodAddress}` - - let neighbourHoodExp: NeighbourhoodExpression = await this.languageController.getPerspective(neighbourhoodAddress); - - //Add shared perspective to original perpspective and then update controller - perspectiveID.sharedUrl = neighbourhoodUrl - perspectiveID.neighbourhood = neighbourHoodExp; - perspectiveID.state = PerspectiveState.Synced; - await this.#perspectivesController!.replace(perspectiveID, neighbourHoodExp, false, PerspectiveState.Synced) - return neighbourhoodUrl - } - - async installNeighbourhood(url: Address): Promise { - const perspectives = this.#perspectivesController!.allPerspectiveHandles(); - if (perspectives.some(p => p.sharedUrl === url)) { - throw Error(`Neighbourhood with URL ${url} already installed`); - } - - let neighbourHoodExp = await this.languageController.getPerspective(parseExprUrl(url).expression); - if (neighbourHoodExp == null) { - throw Error(`Could not find neighbourhood with URL ${url}`); - }; - console.log("Core.installNeighbourhood(): Got neighbourhood", JSON.stringify(neighbourHoodExp)); - let neighbourhood: NeighbourhoodExpression = neighbourHoodExp; - let state = PerspectiveState.NeighbourhoodJoinInitiated; - try { - await this.languageController.languageByRef({address: neighbourhood.data.linkLanguage} as LanguageRef) - state = PerspectiveState.LinkLanguageInstalledButNotSynced; - } catch (e) { - state = PerspectiveState.LinkLanguageFailedToInstall; - } - console.log("Core.installNeighbourhood(): Creating perspective", url, neighbourhood, state); - return await this.#perspectivesController!.add("", url, neighbourhood, true, state); - } - async languageApplyTemplateAndPublish(sourceLanguageHash: string, templateData: object): Promise { if (!this.#languageController) { throw Error("LanguageController not been init'd. Please init before calling language altering functions.") diff --git a/executor/src/core/Config.ts b/executor/src/core/Config.ts index 34eeecc8f..e0817d7b3 100644 --- a/executor/src/core/Config.ts +++ b/executor/src/core/Config.ts @@ -2,7 +2,7 @@ import * as path from 'node:path'; import * as fs from 'node:fs'; import { Address, Expression } from '@coasys/ad4m'; -export let ad4mExecutorVersion = "0.8.1"; +export let ad4mExecutorVersion = "0.9.0"; export let agentLanguageAlias = "did"; export let languageLanguageAlias = "lang"; export let neighbourhoodLanguageAlias = "neighbourhood"; diff --git a/executor/src/core/LanguageController.ts b/executor/src/core/LanguageController.ts index e9f606b7d..e245770a3 100644 --- a/executor/src/core/LanguageController.ts +++ b/executor/src/core/LanguageController.ts @@ -1,6 +1,6 @@ -import { - Address, Expression, Language, LanguageContext, LinkSyncAdapter, InteractionCall, InteractionMeta, - PublicSharing, ReadOnlyLanguage, LanguageMetaInternal, LanguageMetaInput, PerspectiveExpression, +import { + Address, Expression, Language, LanguageContext, LinkSyncAdapter, InteractionCall, InteractionMeta, + PublicSharing, ReadOnlyLanguage, LanguageMetaInternal, LanguageMetaInput, PerspectiveExpression, parseExprUrl, Literal, TelepresenceAdapter, PerspectiveState } from '@coasys/ad4m'; import { ExpressionRef, LanguageRef, LanguageExpression, LanguageLanguageInput, ExceptionType, PerspectiveDiff } from '@coasys/ad4m'; @@ -14,10 +14,9 @@ import * as PubSubDefinitions from './graphQL-interface/SubscriptionDefinitions' import yaml from "js-yaml"; import { v4 as uuidv4 } from 'uuid'; import RuntimeService from './RuntimeService'; -import Signatures from './agent/Signatures'; import { Ad4mDb } from './db'; import stringify from 'json-stable-stringify' -import { getPubSub } from './utils'; +import { getPubSub, tagExpressionSignatureStatus } from './utils'; function cloneWithoutCircularReferences(obj: any, seen: WeakSet = new WeakSet()): any { if (typeof obj === 'object' && obj !== null) { @@ -25,17 +24,17 @@ function cloneWithoutCircularReferences(obj: any, seen: WeakSet = new WeakS return; } seen.add(obj); - + const clonedObj: any = Array.isArray(obj) ? [] : {}; for (const key in obj) { if (obj.hasOwnProperty(key)) { clonedObj[key] = cloneWithoutCircularReferences(obj[key], seen); } } - + return clonedObj; } - + return obj; } @@ -46,7 +45,6 @@ type SyncStateChangeObserver = (state: PerspectiveState, lang: LanguageRef)=>voi interface Services { holochainService: HolochainService, runtimeService: RuntimeService, - signatures: Signatures, db: Ad4mDb } @@ -87,7 +85,6 @@ export default class LanguageController { #syncStateChangeObservers: SyncStateChangeObserver[]; #holochainService: HolochainService #runtimeService: RuntimeService; - #signatures: Signatures; #db: Ad4mDb; #config: Config.MainConfig; #pubSub: PubSub; @@ -101,7 +98,6 @@ export default class LanguageController { this.#context = context this.#holochainService = services.holochainService this.#runtimeService = services.runtimeService - this.#signatures = services.signatures this.#db = services.db this.#languages = new Map() this.#languages.set("literal", { @@ -203,18 +199,21 @@ export default class LanguageController { } callLinkObservers(diff: PerspectiveDiff, ref: LanguageRef) { + LANGUAGE_CONTROLLER.perspectiveDiffReceived(diff, ref.address) this.#linkObservers.forEach(o => { o(diff, ref) }) } callSyncStateChangeObservers(syncState: PerspectiveState, ref: LanguageRef) { + LANGUAGE_CONTROLLER.syncStateChanged(syncState, ref.address) this.#syncStateChangeObservers.forEach(o => { o(syncState, ref) }) } callTelepresenceSignalObservers(signal: PerspectiveExpression, ref: LanguageRef) { + LANGUAGE_CONTROLLER.telepresenceSignalReceived(signal, ref.address) this.#telepresenceSignalObservers.forEach(o => { o(signal, ref) }) @@ -225,7 +224,8 @@ export default class LanguageController { hash: string, }> { if(!path.isAbsolute(sourceFilePath)) - sourceFilePath = path.join(process.env.PWD!, sourceFilePath) + // @ts-ignore + sourceFilePath = path.join(Deno.cwd()!, sourceFilePath) const bundleBytes = fs.readFileSync(sourceFilePath) if (bundleBytes.length === 0) { @@ -272,6 +272,7 @@ export default class LanguageController { if(language.linksAdapter) { language.linksAdapter.addCallback((diff: PerspectiveDiff) => { + console.log("LINKS CALLBACK", diff) this.callLinkObservers(diff, {address: hash, name: language.name} as LanguageRef); }) @@ -386,7 +387,7 @@ export default class LanguageController { const language = this.#languages.get(address) if (language) return language - if(!languageMeta) { + if(!languageMeta) { //Check that the metafile already exists with language with this address to avoid refetch const metaFile = path.join(path.join(this.#config.languagesPath, address), "meta.json"); @@ -411,7 +412,7 @@ export default class LanguageController { languageMeta = {data: {}}; } } - + console.log("LanguageController.installLanguage: INSTALLING LANGUAGE:", languageMeta.data) let bundlePath = path.join(path.join(this.#config.languagesPath, address), "bundle.js"); @@ -452,7 +453,15 @@ export default class LanguageController { const {languagePath, sourcePath} = await this.saveLanguageBundle(source, languageMeta, hash); console.log(new Date(), "LanguageController.installLanguage: installed language"); try { - return (await this.loadLanguage(sourcePath)).language + const {language} = await this.loadLanguage(sourcePath); + + let newLang = { + ...language, + linksAdapter: cloneWithoutCircularReferences(language).linksAdapter, + telepresenceAdapter: cloneWithoutCircularReferences(language).telepresenceAdapter + }; + + return newLang } catch(e) { console.error("LanguageController.installLanguage: ERROR LOADING NEWLY INSTALLED LANGUAGE") console.error("LanguageController.installLanguage: ======================================") @@ -466,7 +475,7 @@ export default class LanguageController { async languageRemove(hash: String): Promise { //Teardown any intervals the language has running const language = this.#languages.get(hash as string); - if (language?.teardown) { + if (language?.teardown) { language.teardown(); } @@ -526,13 +535,8 @@ export default class LanguageController { if (languageHash == languageMetaData.address) { //TODO: in here we are getting the source again even though we have already done that before, implement installLocalLanguage()? const lang = await this.installLanguage(address, languageMeta) - - let newLang = { - ...lang, - linksAdapter: cloneWithoutCircularReferences(lang).linksAdapter - }; // @ts-ignore - return newLang + return lang } else { throw new Error("Calculated languageHash did not match address found in meta information") } @@ -579,12 +583,8 @@ export default class LanguageController { if (sourceLanguageTemplated.meta.address === languageHash) { //TODO: in here we are getting the source again even though we have already done that before, implement installLocalLanguage()? const lang = await this.installLanguage(address, languageMeta) - let newLang = { - ...lang, - linksAdapter: cloneWithoutCircularReferences(lang).linksAdapter - }; // @ts-ignore - return newLang! + return lang! } else { throw new Error(`Templating of original source language did not result in the same language hash of un-trusted language trying to be installed... aborting language install. Expected hash: ${languageHash}. But got: ${sourceLanguageTemplated.meta.address}`) } @@ -1005,7 +1005,7 @@ export default class LanguageController { address = await putAdapter.addressOf(content); } } catch (e) { - throw new Error(`Incompatible putAdapter in Languge ${JSON.stringify(lang)}\nError was: ${e}`) + throw new Error(`Incompatible putAdapter in Languge ${JSON.stringify(lang)}\nError was: ${JSON.stringify(e)}`) } // This makes sure that Expression references used in Links (i.e. in Perspectives) use the aliased Language schemas. @@ -1063,7 +1063,7 @@ export default class LanguageController { if (!lang.expressionAdapter) { throw Error("Language does not have an expresionAdapter!") }; - + const langIsImmutable = await this.isImmutableExpression(ref); if (langIsImmutable) { console.log("Calling cache for expression..."); @@ -1094,39 +1094,7 @@ export default class LanguageController { async tagExpressionSignatureStatus(expression: Expression) { if(expression) { - try{ - if(!await this.#signatures.verify(expression)) { - let expressionString = JSON.stringify(expression); - let endingLog = expressionString.length > 50 ? "... \x1b[0m" : "\x1b[0m"; - console.error(new Date().toISOString(),"tagExpressionSignatureStatus - BROKEN SIGNATURE FOR EXPRESSION: (object):", expressionString.substring(0, 50), endingLog) - expression.proof.invalid = true - expression.proof.valid = false - } else { - expression.proof.valid = true - expression.proof.invalid = false - } - } catch(e) { - let expressionFormatted; - if (typeof expression === "string") { - expressionFormatted = expression.substring(0, 50); - } else if (typeof expression === "object") { - let expressionString = JSON.stringify(expression); - expressionFormatted = expressionString.substring(0, 50) - } else { - expressionFormatted = expression; - } - let errMsg = `Error trying to verify signature for expression: ${expressionFormatted}` - console.error(errMsg) - console.error(e) - await this.#pubSub.publish( - PubSubDefinitions.EXCEPTION_OCCURRED_TOPIC, - { - title: "Failed to get expression", - message: errMsg, - type: ExceptionType.ExpressionIsNotVerified, - } as ExceptionInfo - ); - } + tagExpressionSignatureStatus(expression) } } diff --git a/executor/src/core/Perspective.test.ts b/executor/src/core/Perspective.test.ts deleted file mode 100644 index f2c75c285..000000000 --- a/executor/src/core/Perspective.test.ts +++ /dev/null @@ -1,287 +0,0 @@ -import { v4 as uuidv4 } from 'uuid'; -import { Neighbourhood, LinkQuery, PerspectiveHandle, PerspectiveState, NeighbourhoodExpression } from '@coasys/ad4m' -import { Perspective as Ad4mPerspective, LinkExpression } from '@coasys/ad4m' -import path from "path"; -import { fileURLToPath } from 'url'; -import { expect } from "chai"; -import * as sinon from "sinon"; - -import Perspective from './Perspective' -import type PerspectiveContext from './PerspectiveContext' -import { Ad4mDb } from './db' -import { createLink } from '../testutils/links' -import { createMockExpression } from '../testutils/expression' -import { MainConfig } from './Config' - -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); - -const did = 'did:local-test-agent' -const agentService = { - did, - createSignedExpression: sinon.fake(createMockExpression.bind(null, did)), - agent: { did } -} - -const sharingLanguage = "sharing-language-address"; - -function LinksAdapter() { - //@ts-ignore - this.pull = sinon.fake(args=>{return []}) - //@ts-ignore - this.commit = sinon.fake(args=>{return "string"}) - //@ts-ignore - this.render = sinon.fake(args=>{return {links: []}}) -} - -//@ts-ignore -let linksAdapter = new LinksAdapter() - -const languageController = { - getLinksAdapter: sinon.fake(langRef => { - if(langRef.address === sharingLanguage) - return linksAdapter - else - return null - }), - languageByRef: sinon.fake(ref => ref) -} - - -describe('Perspective', () => { - let perspective: Perspective | undefined - let allLinks: LinkExpression[] | undefined - - beforeEach(() => { - const TEST_DIR = `${__dirname}/../tst-tmp` - const appDataPath = path.join(TEST_DIR, 'agents', 'alice') - const db = new Ad4mDb(); - perspective = new Perspective( - { - uuid: uuidv4(), - name: "Test Perspective", - sharedUrl: undefined, - state: PerspectiveState.Private - } as PerspectiveHandle, - //@ts-ignore - { - agentService, - db, - languageController, - config: new MainConfig(appDataPath) - } as PerspectiveContext) - allLinks = [] - }) - - afterEach(() => { - perspective?.clearPolling(); - }) - - it('wraps links in expressions on addLink', async () => { - const link = createLink() - const expression = await perspective!.addLink(link) - expect(expression.author).to.be.equal(agentService.agent.did) - expect(expression.data).to.be.equal(link) - expect(agentService.createSignedExpression.calledOnce).to.be.true; - expect(agentService.createSignedExpression.getCall(0).args[0]).to.deep.equal(link) - }) - - describe('after adding 5 links', () => { - beforeEach(async () => { - for(let i=0; i<5; i++) { - const link = createLink() - if(i%2 === 0) { - link.source = 'ad4m://self' - } - //@ts-ignore - allLinks!.push(await perspective!.addLink(link)) - - } - }) - - it('has asked agent service for 6 signatures', () => { - expect(agentService.createSignedExpression.callCount).to.be.equal(6) - }) - - it('can get all links', async () => { - const result = await perspective!.getLinks({} as LinkQuery) - - expect(result.length).to.be.equal(5) - expect(result).to.have.deep.members(allLinks!); - }) - - it('can get links by source', async () => { - const result = await perspective!.getLinks({source: 'ad4m://self'} as LinkQuery) - expect(result.length).to.be.equal(3) - }) - - // it('Prolog queries return 5 triples', async () => { - // const result = await perspective!.prologQuery("triple(X,Y,Z).") - // expect(result.length).to.be.equal(5) - // }) - - // it('Prolog gets correctly updated when removing links', async () => { - // const link = allLinks![0] - // console.log("LINK TO REMOVE", link) - // await perspective!.removeLink(link) - // const result = await perspective!.prologQuery("triple(X,Y,Z)"); - // expect(result.length).to.be.equal(4) - // }) - }) - - // describe('Prolog Engine', () => { - // it('answers correctly in a run with multiple link additions/removals', async () => { - // let result - // let linkResult - // let l1 = await perspective!.addLink({source: 'ad4m://self', target: 'ad4m://test1'}) - - // result = await perspective!.prologQuery("triple(Source,Pred,Target)") - // expect(result.length).to.be.equal(1) - // expect(result[0].Source).to.be.equal('ad4m://self') - // expect(result[0].Target).to.be.equal('ad4m://test1') - - // linkResult = await perspective!.prologQuery("link(Source,Pred,Target,Timestamp,Author)") - // expect(linkResult.length).to.be.equal(1) - // expect(linkResult[0].Source).to.be.equal('ad4m://self') - // expect(linkResult[0].Target).to.be.equal('ad4m://test1') - // expect(linkResult[0].Author).to.be.equal("did:local-test-agent") - // expect(linkResult[0].Timestamp).not.to.be.NaN; - - // let l2 = await perspective!.addLink({source: 'ad4m://self', target: 'ad4m://test2'}) - // result = await perspective!.prologQuery("triple(Source,Pred,Target)") - // expect(result.length).to.be.equal(2) - // linkResult = await perspective!.prologQuery("link(Source,Pred,Target,Timestamp,Author)") - // expect(linkResult.length).to.be.equal(2) - - // let targetSet = new Set() - // targetSet.add(result[0].Target) - // targetSet.add(result[1].Target) - - // expect(result[1].Source).to.be.equal('ad4m://self') - // expect(targetSet.has('ad4m://test1')).to.be.true; - // expect(targetSet.has('ad4m://test2')).to.be.true; - - // //...TBC - // }) - // }) - - describe('with link sharing language', () => { - beforeEach(() => { - perspective!.neighbourhood = { - data: { - linkLanguage: sharingLanguage, - perspective: new Ad4mPerspective([]), - meta: new Ad4mPerspective(), - }, - author: agentService.agent.did, - timestamp: Date.now(), - proof: { - signature: '', - key: '', - valid: true - } - } as NeighbourhoodExpression; - - //@ts-ignore - linksAdapter = new LinksAdapter() - }) - - it('calls commit on link language on addLink() with link expression once', async () => { - const link = createLink() - const linkExpression = await perspective!.addLink(link) - - expect(linksAdapter.commit.calledOnce).to.be.true; - expect(linksAdapter.commit.getCall(0).args[0]).to.be.eql({ - additions: [linkExpression], - removals: [] - }) - - expect(linksAdapter.pull.callCount).to.be.equal(0) - expect(linksAdapter.render.callCount).to.be.equal(0) - }) - - it('calls commit on link language on updateLink() with link expression once', async () => { - const link1 = createLink() - const link2 = createLink() - - const link1Expression = await perspective!.addLink(link1) - const link2Expression = perspective!.ensureLinkExpression(link2) - //@ts-ignore - await perspective!.updateLink(link1Expression, link2Expression) - - expect(linksAdapter.commit.calledTwice).to.be.true; - expect(linksAdapter.commit.getCall(0).args[0]).to.be.eql({ - additions: [link1Expression], - removals: [] - }) - expect(linksAdapter.commit.getCall(1).args[0]).to.be.eql({ - additions: [link2Expression], - removals: [link1Expression] - }) - - expect(linksAdapter.pull.callCount).to.be.equal(0) - }) - - it('calls commit on link language on removeLink() with link expression once', async () => { - const link = createLink() - - const linkExpression = await perspective!.addLink(link) - await perspective!.removeLink(linkExpression) - - expect(linksAdapter.commit.calledTwice).to.be.true; - expect(linksAdapter.commit.getCall(0).args[0]).to.be.eql({ - additions: [linkExpression], - removals: [] - }) - expect(linksAdapter.commit.getCall(1).args[0]).to.be.eql({ - additions: [], - removals: [linkExpression] - }) - - expect(linksAdapter.pull.callCount).to.be.equal(0) - }) - - describe('syncWithSharingAdpater', () => { - it('commits all missing links from local DB to linksAdapter', async () => { - perspective!.neighbourhood = undefined - - const link = createLink() - const linkExpression = await perspective!.addLink(link) - - perspective!.neighbourhood = { - data: { - linkLanguage: sharingLanguage, - perspective: new Ad4mPerspective([]), - meta: new Ad4mPerspective(), - }, - author: agentService.agent.did, - timestamp: Date.now(), - proof: { - signature: '', - key: '', - valid: true - } - } as NeighbourhoodExpression - - await perspective!.syncWithSharingAdapter() - - expect(linksAdapter.commit.calledOnce).to.be.true; - expect(linksAdapter.commit.getCall(0).args[0]).to.be.eql({ - additions: [linkExpression], - removals: [] - }) - expect(linksAdapter.render.calledOnce).to.be.true; - }) - }) - - }) - -}) - - - - - - - - diff --git a/executor/src/core/Perspective.ts b/executor/src/core/Perspective.ts deleted file mode 100644 index 4dee91620..000000000 --- a/executor/src/core/Perspective.ts +++ /dev/null @@ -1,999 +0,0 @@ -import { Agent, Expression, LinkExpression, LinkExpressionInput, LinkInput, LanguageRef, PerspectiveHandle, Literal, PerspectiveDiff, parseExprUrl, Perspective as Ad4mPerspective, LinkStatus, LinkMutations, LinkExpressionMutations, Language, LinkSyncAdapter, TelepresenceAdapter, OnlineAgent, NeighbourhoodExpression } from "@coasys/ad4m" -import { Link, LinkQuery, PerspectiveState } from "@coasys/ad4m"; -import type AgentService from "./agent/AgentService"; -import type LanguageController from "./LanguageController"; -import * as PubSubDefinitions from './graphQL-interface/SubscriptionDefinitions' -import type PerspectiveContext from "./PerspectiveContext" -import PrologInstance from "./PrologInstance"; -import { MainConfig } from "./Config"; -import { Mutex } from 'async-mutex' -import { DID } from "@coasys/ad4m/lib/src/DID"; -import { Ad4mDb } from "./db"; -import { getPubSub } from "./utils"; - -const maxRetries = 10; -const backoffStep = 200; - -export default class Perspective { - name?: string; - uuid?: string; - author?: Agent; - timestamp?: string; - neighbourhood?: NeighbourhoodExpression; - sharedUrl?: string; - createdFromJoin: boolean; - isFastPolling: boolean; - state: PerspectiveState = PerspectiveState.Private; - retries: number = 0; - - #db: Ad4mDb; - #agent: AgentService; - #languageController?: LanguageController - #updateControllersHandleSyncStatus?: (uuid: string, status: PerspectiveState) => void - #config?: MainConfig; - #pubSub: PubSub; - - #prologEngine: PrologInstance|null - #prologNeedsRebuild: boolean - #pollingInterval: any; - #pendingDiffPollingInterval: any - #prologMutex: Mutex - #isTeardown: boolean = false; - #sdnaChangeMutex: Mutex; - - constructor(id: PerspectiveHandle, context: PerspectiveContext, neighbourhood?: NeighbourhoodExpression, createdFromJoin?: boolean, state?: PerspectiveState) { - this.updateFromId(id) - this.createdFromJoin = false; - this.isFastPolling = false; - this.state = state || PerspectiveState.Private; - - if (neighbourhood) { - this.neighbourhood = neighbourhood - if (createdFromJoin) { - this.createdFromJoin = createdFromJoin; - }; - }; - - this.#db = context.db - this.#agent = context.agentService! - this.#languageController = context.languageController! - this.#config = context.config; - this.#updateControllersHandleSyncStatus = context.updateControllersHandleSyncStatus; - this.#pubSub = getPubSub(); - - this.#prologEngine = null - this.#prologNeedsRebuild = true - - process.on("SIGINT", () => { - clearInterval(this.#pollingInterval); - clearInterval(this.#pendingDiffPollingInterval); - }); - - if (this.neighbourhood) { - // setup polling loop for Perspectives with a linkLanguage - this.#pollingInterval = this.setupSyncSignals(3000); - - // Handle join differently so we wait before publishing diffs until we have seen - // a first foreign revision. Otherwise we will never use snaphshots and make the - // diff graph complex. - if(this.createdFromJoin) { - try { - this.getCurrentRevision().then(revision => { - // if revision is null, then we are not connected to the network yet - // Set the state to LinkLanguageInstalledButNotSynced so we will keep - // link additions as pending until we are synced - if(!revision) { - this.#pendingDiffPollingInterval = this.setupPendingDiffsPublishing(5000); - } - }) - } catch (e) { - console.error(`Perspective.constructor(): NH [${this.sharedUrl}] (${this.name}): Got error when trying to get current revision: ${e}`); - } - } - } - - this.#prologMutex = new Mutex() - this.#sdnaChangeMutex = new Mutex() - } - - async updatePerspectiveState(state: PerspectiveState) { - if (this.state !== state) { - if (this.#updateControllersHandleSyncStatus) { - this.#updateControllersHandleSyncStatus(this.uuid!, state); - }; - this.state = state; - await this.#pubSub.publish(PubSubDefinitions.PERSPECTIVE_SYNC_STATE_CHANGE, {state, uuid: this.uuid}) - await this.#pubSub.publish(PubSubDefinitions.PERSPECTIVE_UPDATED_TOPIC, this.plain()); - } - } - - async setupFullRenderSync(intervalMs: number) { - return setInterval(async () => { - if(this.state === PerspectiveState.Synced) { - try { - await this.syncWithSharingAdapter(); - } catch(e) { - console.error(`Perspective.setupFullRenderSync(): NH [${this.sharedUrl}] (${this.name}): Got error when trying to do full render sync with sharing adapter: ${e}`); - } - } else { - console.log(`Perspective.setupFullRenderSync(): NH [${this.sharedUrl}] (${this.name}): Omitting full render sync since perspective is not synced yet`); - } - }, intervalMs); - } - - async setupSyncSignals(intervalMs: number) { - return setInterval(async () => { - console.log("Calling sync"); - if (this.#isTeardown) return; - try { - await this.callLinksAdapter("sync"); - } catch(e) { - console.error(`Perspective.setupSyncSingals(): NH [${this.sharedUrl}] (${this.name}): Got error when sending sync signals: ${e}`); - } - }, intervalMs); - } - - async setupPendingDiffsPublishing(intervalMs: number) { - let pendingGotPublished = false; - - let pendingDiffsInterval = setInterval(async () => { - console.log("calling pending diff"); - if (this.#isTeardown) return; - if(this.state == PerspectiveState.LinkLanguageFailedToInstall) { - try { - await this.getLinksAdapter() - } catch(e) { - console.error(`Perspective.setupPendingDiffsPublishing(): NH [${this.sharedUrl}] (${this.name}): Got error when trying to install link language: ${e}`); - } - } - - try { - // If LinkLanguage is connected/synced (otherwise currentRevision would be null)... - if (await this.getCurrentRevision()) { - //TODO; once we have more data information coming from the link language, correctly determine when to mark perspective as synced - await this.updatePerspectiveState(PerspectiveState.Synced); - //Let's check if we have unpublished diffs: - const mutations = await this.#db.getPendingDiffs(this.uuid!); - if (mutations.additions.length > 0 || mutations.removals.length > 0) { - // ...publish them... - await this.callLinksAdapter('commit', mutations); - // ...and clear the temporary storage - await this.#db.clearPendingDiffs(this.uuid!); - pendingGotPublished = true; - } - } - } catch (e) { - console.warn(`Perspective.setupPendingDiffsPublishing(): NH [${this.sharedUrl}] (${this.name}): Got error when trying to repulish pending diffs. Error: ${e}`, e); - } - - if(pendingGotPublished) { - clearInterval(pendingDiffsInterval); - } - }, intervalMs); - return pendingDiffsInterval; - } - - - plain(): PerspectiveHandle { - const { name, uuid, author, timestamp, sharedUrl, neighbourhood, state } = this - return JSON.parse(JSON.stringify({ - name, uuid, author, timestamp, sharedUrl, neighbourhood, state - })) - } - - updateFromId(id: PerspectiveHandle) { - this.name = id.name - this.uuid = id.uuid - if(id.state) this.state = id.state - if(id.sharedUrl) this.sharedUrl = id.sharedUrl - if(id.neighbourhood) this.neighbourhood = id.neighbourhood - } - - linkToExpression(link: Link): Expression { - return this.#agent.createSignedExpression(link) - } - - ensureLinkExpression(maybeLink: any): Expression { - if(maybeLink.author && maybeLink.timestamp && maybeLink.data) { - return maybeLink as LinkExpression - } - - if(maybeLink.target) { - return this.linkToExpression(maybeLink) - } - - throw new Error(`NH [${this.sharedUrl}] (${this.name}): Object is neither Link nor Expression: ${JSON.stringify(maybeLink)}`) - } - - private async getLinksAdapter(): Promise { - if(!this.neighbourhood || !this.neighbourhood.data.linkLanguage) { - //console.warn("Perspective.callLinksAdapter: Did not find neighbourhood or linkLanguage for neighbourhood on perspective, returning empty array") - return undefined; - } - const address = this.neighbourhood!.data.linkLanguage; - - try { - if (this.state === PerspectiveState.LinkLanguageFailedToInstall) { - if (this.retries === maxRetries) { - throw new Error("Perspective.getLinksAdapter: Skipping fetching of linkLanguage since we have tried and failed before..."); - } - console.log("Perspective.getLinksAdapter: Waiting backingoff before trying to fetch linkLanguage again...") - await sleep(this.retries * backoffStep); - } - const linksAdapter = await this.#languageController!.getLinksAdapter({address} as LanguageRef); - if(linksAdapter) { - return linksAdapter; - } else { - console.error(`NH [${this.sharedUrl}] (${this.name}) LinksSharingLanguage`, address, "set in perspective '"+this.name+"' not installed!") - return undefined; - } - } catch (e) { - await this.updatePerspectiveState(PerspectiveState.LinkLanguageFailedToInstall); - this.retries++; - throw e; - } - } - - private renderLinksAdapter(): Promise { - if(!this.neighbourhood || !this.neighbourhood.data.linkLanguage) { - //console.warn("Perspective.callLinksAdapter: Did not find neighbourhood or linkLanguage for neighbourhood on perspective, returning empty array") - return Promise.resolve(new Ad4mPerspective([])) - } - return new Promise(async (resolve, reject) => { - try { - const linksAdapter = await this.getLinksAdapter(); - if(linksAdapter) { - const timeout = setTimeout(() => reject(Error(`NH [${this.sharedUrl}; (render)] (${this.name}): LinkLanguage took to long to respond, timeout at 20000ms`)), 20000) - //console.debug(`Calling linksAdapter.${functionName}(${JSON.stringify(args)})`) - const result = await linksAdapter.render(); - clearTimeout(timeout) - //console.debug("Got result:", result) - resolve(result) - } else { - // TODO: request install - resolve(new Ad4mPerspective([])) - } - } catch(e) { - console.error(`NH [${this.sharedUrl}] (${this.name}): Error while trying to call links adapter render: ${e}`) - resolve(new Ad4mPerspective([])) - } - }) - } - - //@ts-ignore - private callLinksAdapter(functionName: string, ...args): Promise { - if(!this.neighbourhood || !this.neighbourhood.data.linkLanguage) { - console.warn("Perspective.callLinksAdapter: Did not find neighbourhood or linkLanguage for neighbourhood on perspective, returning empty array") - return Promise.resolve({ - additions: [], - removals: [] - }) - } - - return new Promise(async (resolve, reject) => { - try { - const linksAdapter = await this.getLinksAdapter(); - if(linksAdapter) { - const timeout = setTimeout(() => reject(Error(`NH [${this.sharedUrl}; (${functionName})] (${this.name}): LinkLanguage took to long to respond, timeout at 20000ms`)), 20000) - //console.debug(`NH [${this.sharedUrl}] (${this.name}): Calling linksAdapter.${functionName}(${JSON.stringify(args).substring(0, 50)})`) - //@ts-ignore - const result = await linksAdapter[functionName](...args) - //console.debug("Got result:", result) - clearInterval(timeout); - resolve(result) - } else { - // TODO: request install - resolve({ - additions: [], - removals: [] - }) - } - } catch(e) { - console.error(`NH [${this.sharedUrl}; (${functionName})] (${this.name}): Error while trying to call links adapter general:`, e) - resolve({ - additions: [], - removals: [] - } as PerspectiveDiff) - } - }) - } - - private getCurrentRevision(): Promise { - if(!this.neighbourhood || !this.neighbourhood.data.linkLanguage) { - return Promise.resolve(null) - } - - return new Promise(async (resolve, reject) => { - try { - const linksAdapter = await this.getLinksAdapter(); - if(linksAdapter) { - const timeout = setTimeout(() => reject(Error(`NH [${this.sharedUrl} (currentRevision)] (${this.name}): LinkLanguage took to long to respond, timeout at 20000ms`)), 20000); - let currentRevisionString = await linksAdapter.currentRevision(); - clearInterval(timeout); - - if(!currentRevisionString) { - resolve(null) - return - } - - if(typeof(currentRevisionString) != 'string') { - //@ts-ignore - currentRevisionString = currentRevisionString.toString() - } - - currentRevisionString = currentRevisionString.trim() - if(currentRevisionString.length == 0) { - resolve(null) - } else { - resolve(currentRevisionString) - } - - } else { - // TODO: request install - resolve(null) - } - } catch(e) { - console.error(`NH [${this.sharedUrl}] (${this.name}): Error while trying to call links adapter current revision: ${e}`) - resolve(null) - } - }) - } - - private async commit(diff: PerspectiveDiff): Promise { - if(!this.neighbourhood || !this.neighbourhood.data.linkLanguage) { - return null; - } - - let canCommit = false; - if (!this.createdFromJoin){ - //If current agent created neighbourhood, then we should always be allowed to commit - canCommit = true; - } else { - //We did not create the neighbourhood, so we should check if we already have some data sync'd before making a commit - if (await this.getCurrentRevision()) { - canCommit = true; - } - } - - if (canCommit) { - //Call the links adapter to commit the diff - const returnedDiff = await this.callLinksAdapter('commit', diff); - return returnedDiff; - } else { - return null; - } - } - - async syncWithSharingAdapter() { - const localLinks = await this.#db.getAllLinks(this.uuid!); - const remoteLinks = await this.renderLinksAdapter() - const includes = (link: LinkExpression, list: LinkExpression[]) => { - return undefined !== list.find(e => - JSON.stringify(e.author) === JSON.stringify(link.author) && - e.timestamp === link.timestamp && - e.data.source === link.data.source && - e.data.target === link.data.target && - e.data.predicate === link.data.predicate - ) - } - let linksToCommit = []; - for(const l of localLinks) { - if(!includes(l, remoteLinks.links)) { - linksToCommit.push(l); - } - } - if (linksToCommit.length > 0) { - await this.callLinksAdapter("commit", {additions: linksToCommit, removals: []}) - } - - await this.#db.addManyLinks(this.uuid!, remoteLinks.links); - } - - async othersInNeighbourhood(): Promise { - const linksAdapter = await this.getLinksAdapter(); - if(!linksAdapter) { throw new Error("No links adapter when trying to get others in Neighbourhood") } - const others = await linksAdapter.others() || [] - // Filter out nulls - return others.filter(o => o) - } - - async getTelepresenceAdapter(): Promise { - if(!this.getLinksAdapter()) { - return null; - } - const address = this.neighbourhood!.data.linkLanguage; - const telepresenceAdapter = await this.#languageController!.getTelepresenceAdapter({address} as LanguageRef); - return telepresenceAdapter - } - - async getOnlineAgents(): Promise { - const telepresenceAdapter = await this.getTelepresenceAdapter() - if(!telepresenceAdapter) { throw new Error(`Neighbourhood ${this.sharedUrl} has no Telepresence Adapter.`) } - const onlineAgents = await telepresenceAdapter!.getOnlineAgents() || [] - for (const onlineAgent of onlineAgents) { - if (onlineAgent.status) { - await this.#languageController?.tagPerspectiveExpressionSignatureStatus(onlineAgent.status); - } - } - // Filter out nulls - return onlineAgents.filter(o => o) - } - - async addLink(link: LinkInput | LinkExpressionInput, status: LinkStatus = 'shared'): Promise { - const linkExpression = this.ensureLinkExpression(link); - - if (status === 'shared') { - const diff = { - additions: [linkExpression], - removals: [] - } as PerspectiveDiff - const addLink = await this.commit(diff); - - if (!addLink) { - this.#db.addPendingDiff(this.uuid!, diff); - } - } - - await this.#db.addLink(this.uuid!, linkExpression, status); - - this.#prologNeedsRebuild = true; - let perspectivePlain = this.plain(); - - linkExpression.status = status; - - await this.#pubSub.publish(PubSubDefinitions.LINK_ADDED_TOPIC, { - perspective: perspectivePlain, - link: linkExpression - }) - this.#prologNeedsRebuild = true - - - return linkExpression - } - - async addLinks(links: (LinkInput | LinkExpressionInput)[], status: LinkStatus = 'shared'): Promise { - const linkExpressions = links.map(l => this.ensureLinkExpression(l)); - const diff = { - additions: linkExpressions, - removals: [] - } as PerspectiveDiff - const addLinks = await this.commit(diff); - - if (!addLinks) { - await this.#db.addPendingDiff(this.uuid!, diff); - } - - await this.#db.addManyLinks(this.uuid!, linkExpressions, status); - this.#prologNeedsRebuild = true; - let perspectivePlain = this.plain(); - for (const link of linkExpressions) { - await this.#pubSub.publish(PubSubDefinitions.LINK_ADDED_TOPIC, { - perspective: perspectivePlain, - link: link - }) - }; - this.#prologNeedsRebuild = true - - // @ts-ignore - return linkExpressions.map(l => ({...l, status})) - } - - async removeLinks(links: LinkInput[]): Promise { - const linkExpressions = links.map(l => this.ensureLinkExpression(l)); - const diff = { - additions: [], - removals: linkExpressions - } as PerspectiveDiff - const removeLinks = await this.commit(diff); - - if (!removeLinks) { - await this.#db.addPendingDiff(this.uuid!, diff); - } - - await Promise.all(linkExpressions.map(async l => await this.#db.removeLink(this.uuid!, l))) - this.#prologNeedsRebuild = true; - for (const link of linkExpressions) { - await this.#pubSub.publish(PubSubDefinitions.LINK_REMOVED_TOPIC, { - perspective: this.plain(), - link: link - }) - }; - this.#prologNeedsRebuild = true - - return linkExpressions - } - - async linkMutations(mutations: LinkMutations, status?: LinkStatus): Promise { - const diff = { - additions: mutations.additions.map(l => this.ensureLinkExpression(l)), - removals: mutations.removals.map(l => this.ensureLinkExpression(l)) - }; - const mutation = await this.commit(diff); - - if (!mutation) { - await this.#db.addPendingDiff(this.uuid!, diff); - }; - - await this.#db.addManyLinks(this.uuid!, diff.additions, status); - await Promise.all(diff.removals.map(async l => await this.#db.removeLink(this.uuid!, l))); - this.#prologNeedsRebuild = true; - for (const link of diff.additions) { - await this.#pubSub.publish(PubSubDefinitions.LINK_ADDED_TOPIC, { - perspective: this.plain(), - link: link - }); - }; - for (const link of diff.removals) { - await this.#pubSub.publish(PubSubDefinitions.LINK_REMOVED_TOPIC, { - perspective: this.plain(), - link: link - }); - }; - this.#prologNeedsRebuild = true - - return diff; - } - - async updateLink(oldLink: LinkExpressionInput, newLink: LinkInput) { - const link = await this.#db.getLink(this.uuid!, oldLink); - if (!link) { - const allLinks = await this.#db.getAllLinks(this.uuid!); - throw new Error(`NH [${this.sharedUrl}] (${this.name}) Link not found in perspective "${this.plain()}": ${JSON.stringify(oldLink)}`) - } - - const newLinkExpression = this.ensureLinkExpression(newLink) - - await this.#db.updateLink(this.uuid!, link, newLinkExpression); - - const diff = { - additions: [newLinkExpression], - removals: [oldLink] - } as PerspectiveDiff - const mutation = await this.commit(diff); - - if (!mutation) { - await this.#db.addPendingDiff(this.uuid!, diff); - } - - const perspective = this.plain(); - this.#prologNeedsRebuild = true; - await this.#pubSub.publish(PubSubDefinitions.LINK_UPDATED_TOPIC, { - perspective, - oldLink, - newLink: newLinkExpression - }); - - if (link.status) { - newLinkExpression.status = link.status - } - - return newLinkExpression - } - - async removeLink(linkExpression: LinkExpressionInput) { - await this.#db.removeLink(this.uuid!, linkExpression); - - const diff = { - additions: [], - removals: [linkExpression] - } as PerspectiveDiff - const mutation = await this.commit(diff); - - if (!mutation) { - await this.#db.addPendingDiff(this.uuid!, diff); - } - - this.#prologNeedsRebuild = true; - await this.#pubSub.publish(PubSubDefinitions.LINK_REMOVED_TOPIC, { - perspective: this.plain(), - link: linkExpression - }) - } - - async populateLocalLinks(additions: LinkExpression[], removals: LinkExpression[]) { - if (additions) { - await this.#db.addManyLinks(this.uuid!, additions); - } - - if (removals) { - await Promise.all(removals.map(async (link) => { - await this.#db.removeLink(this.uuid!, link); - })) - } - this.#prologNeedsRebuild = true; - } - - private async getLinksLocal(query: LinkQuery): Promise { - if(!query || !query.source && !query.predicate && !query.target) { - return await this.#db.getAllLinks(this.uuid!); - } - - const reverse = query.fromDate! >= query.untilDate!; - - function fromDateFilter(link: LinkExpression) { - if (reverse) { - return new Date(link.timestamp) <= new Date(query.fromDate!) - } else { - return new Date(link.timestamp) >= new Date(query.fromDate!) - } - } - - function untilDateFilter(link: LinkExpression) { - if (reverse) { - return new Date(link.timestamp) >= new Date(query.untilDate!) - } else { - return new Date(link.timestamp) <= new Date(query.untilDate!) - } - } - - function limitFilter(results: LinkExpression[]) { - if (query.limit) { - const startLimit = reverse ? results.length - query.limit : 0; - const endLimit = reverse ? (results.length - query.limit) + query.limit : query.limit; - return results.slice(startLimit, endLimit) - } - - return results; - } - - if(query.source) { - let result = await this.#db.getLinksBySource(this.uuid!, query.source); - // @ts-ignore - if(query.target) { - result = result.filter(l => l.data.target === query.target) - } - // @ts-ignore - if(query.predicate) { - result = result.filter(l => l.data.predicate === query.predicate) - } - //@ts-ignore - if (query.fromDate) { - result = result.filter(fromDateFilter) - } - // @ts-ignore - if (query.untilDate) { - result = result.filter(untilDateFilter) - } - result = limitFilter(result); - return result - } - - if(query.target) { - let result = await this.#db.getLinksByTarget(this.uuid!, query.target); - // @ts-ignore - if(query.predicate) result = result.filter(l => l.data.predicate === query.predicate) - //@ts-ignore - if (query.fromDate) result = result.filter(fromDateFilter) - //@ts-ignore - if (query.untilDate) result = result.filter(untilDateFilter) - result = limitFilter(result); - return result - } - - let result = (await this.#db.getAllLinks(this.uuid!)).filter(link => link.data.predicate === query.predicate) - if (query.limit) result = result.slice(0, query.limit) - return result - } - - async getLinks(query: LinkQuery): Promise { - // console.debug("getLinks local...") - const links = await this.getLinksLocal(query) - - const reverse = query.fromDate! >= query.untilDate!; - - let values = Object.values(links).sort((a, b) => { - return new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime(); - }); - - if (query.limit) { - const startLimit = reverse ? values.length - query.limit : 0; - const endLimit = reverse ? (values.length - query.limit) + query.limit : query.limit; - values = values.slice(startLimit, endLimit) - } - - return values; - } - - /** Adds the given Social DNA code to the perspective's SDNA code */ - async addSdna(name: string, sdnaCode: string, type: "subject_class" | "flow" | "custom") { - let added = false - await this.#sdnaChangeMutex.runExclusive(async () => { - let predicate = "ad4m://has_custom_sdna"; - - if (type === 'subject_class') predicate = "ad4m://has_subject_class" - else if (type === 'flow') predicate = "ad4m://has_flow" - - const literalName = Literal.from(name).toUrl(); - - const links = await this.getLinks(new LinkQuery({ - source: "ad4m://self", - predicate, - target: literalName - })) - - const sdnaLinks: any[] = [] - - try { - Literal.fromUrl(sdnaCode) - } catch(e) { - sdnaCode = Literal.from(sdnaCode).toUrl() - } - - if (links.length === 0) { - sdnaLinks.push(new Link({ - source: "ad4m://self", - predicate, - target: literalName - })); - - sdnaLinks.push(new Link({ - source: literalName, - predicate: "ad4m://sdna", - target: sdnaCode - })) - - await this.addLinks(sdnaLinks); - added = true - } - }) - return added - } - - tripleFact(l: LinkExpression): string { - return `triple("${l.data.source}", "${l.data.predicate}", "${l.data.target}").` - } - - linkFact(l: LinkExpression): string { - return `link("${l.data.source}", "${l.data.predicate}", "${l.data.target}", ${new Date(l.timestamp).getTime()}, "${l.author}").` - } - - async nodeFacts(allLinks: LinkExpression[]): Promise { - //------------------- - // languageAddress/2 - // languageName/2 - // expressionAddress/2 - //------------------- - let langAddrs = [] - let langNames = [] - let exprAddrs = [] - - let nodes = new Set() - for(let link of allLinks) { - if(link.data.source) nodes.add(link.data.source) - if(link.data.predicate) nodes.add(link.data.predicate) - if(link.data.target) nodes.add(link.data.target) - } - - langAddrs.push(":- discontiguous(languageAddress/2).") - langNames.push(":- discontiguous(languageName/2).") - exprAddrs.push(":- discontiguous(expressionAddress/2).") - - for(let node of nodes) { - //node.replace('\n', '\n\c') - try { - let ref = parseExprUrl(node) - let lang - if(!ref.language.name) - lang = await this.#languageController?.languageByRef(ref.language) - else - lang = ref.language - - langAddrs.push(`languageAddress("${node}", "${ref.language.address}").`) - langNames.push(`languageName("${node}", "${lang!.name}").`) - exprAddrs.push(`expressionAddress("${node}", "${ref.expression}").`) - } catch(e) { - //@ts-ignore - if (!e.message.includes("Language not found by reference")) { - console.debug("While creating expressionLanguageFacts:", e) - } - } - } - - return [...langAddrs, ...langNames, ...exprAddrs] - } - - async addLinkToProlog(link: LinkExpression) { - this.#prologNeedsRebuild = true - return - - // Leaving this dead code here to potentially get reactivated in the future. - // This doesn't work because consult/1 is more intelligent than I had expected, - // it first removes all old facts&rules to any predicate that it finds again when - // consulting. So we can just use consult/1 below in `prologQuery` to update the - // state with no problem. - // This is fine for now, but if our Prolog program becomes very large because of a - // large perspective, we might not want to always recreate the whole program file - // and instead use a different Prolog command to load our changes. Then we might - // want to surgically only alter the affected links like attempted here... - // - // - //if(this.isSDNALink(link)) { - // this.#prologNeedsRebuild = true - //} else { - // let lines = [this.tripleFact(link), ...await this.nodeFacts([link])] - // await this.#prologEngine?.consult(lines.join('\n')) - //} - } - - async removeLinkFromProlog(link: LinkExpression) { - this.#prologNeedsRebuild = true - return - - // See above. - // - //if(this.isSDNALink(link)) { - // this.#prologNeedsRebuild = true - //} else { - // const fact = this.tripleFact(link) - // const factWithoutDot = fact.substring(0, fact.length-1) - // await this.#prologEngine?.consult(`retract(${factWithoutDot}).`) - //} - } - - isSDNALink(link: LinkExpression): boolean { - return link.source == 'ad4m://self' && ['ad4m://has_subject_class', 'ad4m://has_flow', "ad4m://has_custom_sdna"].includes(link.predicate) - } - - async initEngineFacts(): Promise { - let lines: string[] = [] - - const allLinks = await this.getLinks(new LinkQuery({})) - //------------------- - // triple/3 - // link/5 - //------------------- - lines.push(":- discontiguous(triple/3).") - lines.push(":- discontiguous(link/5).") - - const linksWithoutSDNA = allLinks.filter(l => !this.isSDNALink(l.data)) - - for (const link of linksWithoutSDNA) { - lines.push(this.tripleFact(link)); - } - for (const link of linksWithoutSDNA) { - lines.push(this.linkFact(link)); - }; - - //------------------- - // reachable/2 - //------------------- - lines.push(":- discontiguous(reachable/2).") - lines.push("reachable(A,B) :- triple(A,_,B).") - lines.push("reachable(A,B) :- triple(A,_,X), reachable(X,B).") - - //------------------- - // hiddenExpression/1 - //------------------- - lines.push(":- discontiguous(hiddenExpression/1).") - - - - lines = [...lines, ...await this.nodeFacts(linksWithoutSDNA)] - - //------------------- - // Social DNA zomes - //------------------- - - lines.push(":- discontiguous(register_sdna_flow/2).") - lines.push(":- discontiguous(flowable/2).") - lines.push(":- discontiguous(flow_state/3).") - lines.push(":- discontiguous(start_action/2).") - lines.push(":- discontiguous(action/4).") - - lines.push(":- discontiguous(subject_class/2).") - lines.push(":- discontiguous(constructor/2).") - lines.push(":- discontiguous(destructor/2).") - lines.push(":- discontiguous(instance/2).") - - lines.push(":- discontiguous(property/2).") - lines.push(":- discontiguous(property_getter/4).") - lines.push(":- discontiguous(property_setter/3).") - lines.push(":- discontiguous(property_resolve/2).") - lines.push(":- discontiguous(property_resolve_language/3).") - lines.push(":- discontiguous(property_named_option/4).") - - lines.push(":- discontiguous(collection/2).") - lines.push(":- discontiguous(collection_getter/4).") - lines.push(":- discontiguous(collection_setter/3).") - lines.push(":- discontiguous(collection_remover/3).") - lines.push(":- discontiguous(collection_adder/3).") - - lines.push(":- discontiguous(p3_class_icon/2).") - lines.push(":- discontiguous(p3_class_color/2).") - lines.push(":- discontiguous(p3_instance_color/3).") - - lines.push(":- use_module(library(lists))."); - - let seenSubjectClasses = new Map() - const authorAgents = [this.#agent.agent?.did, this.neighbourhood?.data.author]; - for(let linkExpression of allLinks) { - let link = linkExpression.data - if (linkExpression.proof.valid && authorAgents.includes(link.author)) { - if (this.isSDNALink(link)) { - const name = Literal.fromUrl(link.target).get(); - - seenSubjectClasses.set(name, { - type: link.predicate, - ...seenSubjectClasses.get(name) - }); - } - - if (link.predicate === "ad4m://sdna") { - const name = Literal.fromUrl(link.source).get(); - let code = Literal.fromUrl(link.target).get() - - const subjectClass = seenSubjectClasses.get(name); - - if (subjectClass && subjectClass?.code) { - if ((new Date(linkExpression?.timestamp).getTime() > new Date(subjectClass?.timestamp).getTime())) { - seenSubjectClasses.set(name, { - code, - timestamp: linkExpression.timestamp, - ...seenSubjectClasses.get(name) - }) - } - } else { - seenSubjectClasses.set(name, { - code, - timestamp: linkExpression.timestamp, - ...seenSubjectClasses.get(name) - }) - } - } - } - } - - seenSubjectClasses.forEach(({ code, type }, key) => { - let sdna = code; - try { - sdna = Literal.fromUrl(code).get(); - } catch (e) {} - lines = lines.concat(sdna.split('\n')) - }) - - return lines - } - - async spawnPrologEngine(): Promise { - let error - const prolog = new PrologInstance(this) - await prolog.start(); - - try { - const facts = await this.initEngineFacts() - await prolog.consult(facts) - } catch(e) { - error = e - } - - if(error) throw error - this.#prologEngine = prolog - } - - async prologQuery(query: string): Promise { - await this.#prologMutex.runExclusive(async () => { - if(!this.#prologEngine) { - await this.spawnPrologEngine() - this.#prologNeedsRebuild = false - } - if(this.#prologNeedsRebuild) { - //console.log("Perspective.prologQuery: Making prolog query but first rebuilding facts"); - this.#prologNeedsRebuild = false - const facts = await this.initEngineFacts() - await this.#prologEngine!.consult(facts) - } - }) - - return await this.#prologEngine!.query(query) - } - - clearPolling() { - this.#isTeardown = true; - clearInterval(this.#pollingInterval); - clearInterval(this.#pendingDiffPollingInterval); - } -} - -function sleep(ms: number) { - return new Promise(resolve => setTimeout(resolve, ms)); -} \ No newline at end of file diff --git a/executor/src/core/PerspectiveContext.ts b/executor/src/core/PerspectiveContext.ts deleted file mode 100644 index f18784d15..000000000 --- a/executor/src/core/PerspectiveContext.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { PerspectiveState } from "@coasys/ad4m" -import type AgentService from "./agent/AgentService" -import { MainConfig } from "./Config" -import type LanguageController from "./LanguageController" - -export default class PerspectiveContext { - db: any - agentService?: AgentService - languageController?: LanguageController - config?: MainConfig - updateControllersHandleSyncStatus?: (uuid: string, status: PerspectiveState) => void -} \ No newline at end of file diff --git a/executor/src/core/PerspectivesController.ts b/executor/src/core/PerspectivesController.ts deleted file mode 100644 index 19cdc3b08..000000000 --- a/executor/src/core/PerspectivesController.ts +++ /dev/null @@ -1,228 +0,0 @@ -import path from 'node:path' -import fs from 'node:fs' -import { v4 as uuidv4 } from 'uuid'; -import * as PubSubDefinitions from './graphQL-interface/SubscriptionDefinitions' -import type PerspectiveContext from './PerspectiveContext' -import { Perspective as Ad4mPerspective, Neighbourhood, LinkQuery, PerspectiveHandle, LanguageRef, PerspectiveDiff, PerspectiveState, PerspectiveExpression, NeighbourhoodExpression } from '@coasys/ad4m' -import Perspective from './Perspective' -import { getPubSub, sleep } from './utils'; - -export default class PerspectivesController { - #perspectiveHandles: Map - #perspectiveInstances: Map - #rootConfigPath - #context - #pubSub: PubSub - - constructor(rootConfigPath: string, context: PerspectiveContext) { - this.#context = context - this.#context.updateControllersHandleSyncStatus = this.updateHandleSyncStatus.bind(this); - this.#rootConfigPath = rootConfigPath - this.#pubSub = getPubSub(); - - this.#perspectiveHandles = new Map() - this.#perspectiveInstances = new Map() - - const FILENAME = 'perspectives.json' - const FILEPATH = path.join(rootConfigPath, FILENAME) - - if(fs.existsSync(FILEPATH)) { - const fileObject = JSON.parse(fs.readFileSync(FILEPATH).toString()) - - Object.keys(fileObject).map(k => { - let perspectiveHandle = fileObject[k].perspectiveHandle; - let createdFromJoin = fileObject[k].createdFromJoin; - console.log(`PerspectivesController: Found existing perspective:`); - console.dir(perspectiveHandle, {depth: null}); - this.#perspectiveInstances.set(k, new Perspective(perspectiveHandle, this.#context, perspectiveHandle.neighbourhood, createdFromJoin, perspectiveHandle.state)) - this.#perspectiveHandles.set(k, perspectiveHandle) - }) - } - - this.#context.languageController!.addLinkObserver(async (diff: PerspectiveDiff, lang: LanguageRef) => { - let perspective = Array.from(this.#perspectiveInstances.values()).find((perspective: Perspective) => perspective.neighbourhood?.data?.linkLanguage === lang.address); - if (perspective) { - await perspective.populateLocalLinks(diff.additions, diff.removals); - - try { - let perspectivePlain = perspective.plain(); - for (const link of diff.additions) { - await this.#pubSub.publish(PubSubDefinitions.LINK_ADDED_TOPIC, { - perspective: perspectivePlain, - link: link - }) - } - - for (const linkRemoved of diff.removals) { - await this.#pubSub.publish(PubSubDefinitions.LINK_REMOVED_TOPIC, { - perspective: perspectivePlain, - link: linkRemoved - }) - } - } catch (e) { - console.error("PerspectiveController: error publishing link additions/removals", e); - } - } else { - console.warn(`Could not find perspective for added link with lang: ${lang}`) - } - }) - - this.#context.languageController!.addTelepresenceSignalObserver(async (signal: PerspectiveExpression, lang: LanguageRef) => { - let perspective = Array.from(this.#perspectiveInstances.values()).find((perspective: Perspective) => perspective.neighbourhood?.data?.linkLanguage === lang.address); - if (perspective) { - await this.#pubSub.publish(PubSubDefinitions.NEIGHBOURHOOD_SIGNAL_RECEIVED_TOPIC, { - signal: signal, - perspective: perspective.plain() - }) - } else { - console.warn(`Could not find perspective telepresence signal with lang: ${lang}`) - } - }) - - this.#context.languageController!.addSyncStateChangeObserver(async (state: PerspectiveState, lang: LanguageRef) => { - console.log("PerspectiveController: sync state change"); - console.dir(state, {depth: null}); - let perspective = Array.from(this.#perspectiveInstances.values()).find((perspective: Perspective) => perspective.neighbourhood?.data?.linkLanguage === lang.address); - let perspectiveHandle = Array.from(this.#perspectiveHandles.values()).find((p) => p.uuid === perspective?.uuid); - if (perspective) { - if (perspectiveHandle!.state !== state) { - perspectiveHandle!.state = state; - this.#perspectiveHandles.set(perspectiveHandle!.uuid, perspectiveHandle!); - }; - await perspective.updatePerspectiveState(state); - } else { - console.warn(`Could not find perspective sync state change signal with lang: ${lang}`) - } - }) - } - - private save() { - const FILENAME = 'perspectives.json' - const FILEPATH = path.join(this.#rootConfigPath, FILENAME) - const obj = {} - this.#perspectiveHandles.forEach((perspectiveHandle, uuid) => { - const perspective = this.#perspectiveInstances.get(uuid); - //@ts-ignore - obj[uuid] = {perspectiveHandle: perspectiveHandle, createdFromJoin: perspective?.createdFromJoin} - }) - fs.writeFileSync(FILEPATH, JSON.stringify(obj)) - } - - perspectiveID(uuid: string): PerspectiveHandle|undefined { - const pID = this.#perspectiveHandles.get(uuid) - // console.log("pID:", pID) - return pID - } - - allPerspectiveHandles(): PerspectiveHandle[] { - const alluuids = Array.from(this.#perspectiveHandles.values()) - // console.log("ALL perspectiveHandles:"); - // console.dir(alluuids); - return alluuids - } - - perspective(uuid: string): Perspective { - const foundInstance = this.#perspectiveInstances.get(uuid) - if(foundInstance) { - return foundInstance - } else { - throw Error(`Perspective not found: ${uuid}`) - } - } - - async perspectiveSnapshot(uuid: string): Promise { - let perspective = this.#perspectiveInstances.get(uuid) - if (!perspective) { - throw Error(`Perspective not found: ${uuid}`) - } - return new Ad4mPerspective(await perspective.getLinks({} as LinkQuery)); - } - - async add(name: string, sharedUrl?: string, neighbourhood?: NeighbourhoodExpression, createdFromJoin?: boolean, state?: PerspectiveState): Promise { - let perspective = { - uuid: uuidv4(), - name, - state: state || PerspectiveState.Private, - sharedUrl: sharedUrl, - neighbourhood: neighbourhood - } as PerspectiveHandle; - this.#perspectiveHandles.set(perspective.uuid, perspective) - this.#perspectiveInstances.set(perspective.uuid, new Perspective(perspective, this.#context, neighbourhood, createdFromJoin, state)) - this.save() - await this.#pubSub.publish(PubSubDefinitions.PERSPECTIVE_ADDED_TOPIC, perspective) - return perspective - } - - async replace(perspectiveHandle: PerspectiveHandle, neighbourhood: NeighbourhoodExpression, createdFromJoin: boolean, state: PerspectiveState) { - await this.#pubSub.publish(PubSubDefinitions.PERSPECTIVE_UPDATED_TOPIC, perspectiveHandle); - - this.#perspectiveHandles.set(perspectiveHandle.uuid, perspectiveHandle); - - let existingPerspective = this.#perspectiveInstances.get(perspectiveHandle.uuid); - if (existingPerspective) { - existingPerspective.clearPolling(); - this.#perspectiveInstances.delete(perspectiveHandle.uuid); - existingPerspective = undefined; - } - this.#perspectiveInstances.set(perspectiveHandle.uuid, new Perspective(perspectiveHandle, this.#context, neighbourhood, createdFromJoin, state)); - this.save() - } - - async remove(uuid: string) { - try { - let perspective = this.#perspectiveInstances.get(uuid); - if (perspective) { - perspective.clearPolling(); - if (perspective.neighbourhood) { - await this.#context.languageController?.languageRemove(perspective.neighbourhood.data.linkLanguage); - } - perspective = undefined; - this.#perspectiveHandles.delete(uuid) - this.#perspectiveInstances.delete(uuid) - this.save() - await this.#pubSub.publish(PubSubDefinitions.PERSPECTIVE_REMOVED_TOPIC, uuid) - return true - } else { - return false - } - } catch (e) { - console.error("Error removing perspective:", e); - throw new Error(`Error removing perspective: ${e}`); - } - } - - async update(uuid: string, name: string) { - let perspective = this.perspective(uuid); - perspective.name = name; - - let perspectiveHandle = new PerspectiveHandle(uuid, name, perspective.state); - perspectiveHandle.sharedUrl = perspective.sharedUrl; - perspectiveHandle.neighbourhood = perspective.neighbourhood; - this.#perspectiveHandles.set(uuid, perspectiveHandle); - this.save() - - const instance = this.#perspectiveInstances.get(uuid) - if(instance) { - instance.updateFromId(perspective as PerspectiveHandle) - } - - await this.#pubSub.publish(PubSubDefinitions.PERSPECTIVE_UPDATED_TOPIC, { - uuid: perspective.uuid, - name: perspective.name, - state: perspective.state, - sharedUrl: perspective.sharedUrl, - neighbourhood: perspective.neighbourhood - }); - - return perspective - } - - updateHandleSyncStatus(uuid: string, status: PerspectiveState) { - let perspective = this.#perspectiveHandles.get(uuid); - if (!perspective) { - console.error("PerspectiveController.updateHandleSyncStatus(): could not find perspectiveHandle for uuid:", uuid); - } - perspective!.state = status; - this.#perspectiveHandles.set(uuid, perspective!); - } -} diff --git a/executor/src/core/PrologInstance.test.ts b/executor/src/core/PrologInstance.test.ts deleted file mode 100644 index c2eeb67df..000000000 --- a/executor/src/core/PrologInstance.test.ts +++ /dev/null @@ -1,55 +0,0 @@ -import path from "path" -import PrologInstance from "./PrologInstance" -import { expect } from "chai"; -import { fileURLToPath } from "url"; - -const linksProgram = ` -linkFact(1,2). -linkFact(2,3). -link(A,B):-linkFact(A,B). -link(A,B):- - linkFact(A,X), - link(X,B).` - -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); - -const config = { - resourcePath: path.join(__dirname, '../tst-tmp') -} - -describe('PrologInstance', () => { - it('smoke test', async () => { - // @ts-ignore - const instance = new PrologInstance(config) - }) - - it('runs Prolog', async () => { - // @ts-ignore - const instance = new PrologInstance(config) - - await instance.consult(linksProgram) - - expect(await instance.query('link(1,2).')).to.be.true; - expect(await instance.query('link(1,3).')).to.be.true; - expect(await instance.query('link(1,4).')).to.be.false; - }) - - it('can destructure query results', async () => { - // @ts-ignore - const instance = new PrologInstance(config) - await instance.consult(linksProgram) - - expect(await instance.query('link(1,X).')).to.be.deep.equal([ - {'X': 2}, - {'X': 3} - ]) - - expect(await instance.query('link(Y,3).')).to.be.deep.equal([ - {'Y': 2}, - {'Y': 1} - ]) - expect(await instance.query('link(Y,4).')).to.be.deep.equal(false) - }) - -}) \ No newline at end of file diff --git a/executor/src/core/PrologInstance.ts b/executor/src/core/PrologInstance.ts deleted file mode 100644 index f0d255f36..000000000 --- a/executor/src/core/PrologInstance.ts +++ /dev/null @@ -1,69 +0,0 @@ -import Perspective from "./Perspective"; -import crypto from 'node:crypto'; - - -export default class PrologInstance { - //@ts-ignore - prologService = PROLOG_SERVICE; - name: string; - - constructor(perspective: Perspective) { - this.name = perspective.uuid || crypto.randomUUID() - } - - async start() { - //console.log("Starting prolog instance", this.name) - return await this.prologService.spawnEngine(this.name) - } - - async query(input: string) { - //console.log("Querying prolog instance", this.name, input) - let result = await this.prologService.runQuery(this.name, input) - //console.log("Got Prolog result", result) - return result - - //TODO; add parsing of the result - - // const query = await this.#engine.createQuery(input); - // let allMatches = [] - // try { - // let ret = null; - // while (ret = await query.next()) { - // allMatches.push(ret) - // } - // } finally { - // await query.close() - // } - - // if(JSON.stringify(allMatches) === JSON.stringify([{}])) - // return true - // if(JSON.stringify(allMatches) === JSON.stringify([])) - // return false - - // return allMatches - } - - async call(query: string) { - //console.log("Calling prolog instance", this.name, query) - return await this.prologService.runQuery(this.name, query) - - //TODO; add parsing of the result - - // return await this.#engine.call(query) - }; - - async consult(program_lines: string[]) { - //console.log("PrologInstance.consult", this.name, program, moduleName) - return await this.prologService.loadModuleString(this.name, "main.pl", program_lines) - // const tmpobj = tmp.fileSync() - // //@ts-ignore - // fs.writeFileSync(tmpobj.name, program); - // const result = await this.call(`consult('${tmpobj.name}').`) - // tmpobj.removeCallback() - // return result - } - - async remove() { - return await this.prologService.removeEngine(this.name) - } -} \ No newline at end of file diff --git a/executor/src/core/agent/AgentService.ts b/executor/src/core/agent/AgentService.ts index a49c5d59b..b3e7571c0 100644 --- a/executor/src/core/agent/AgentService.ts +++ b/executor/src/core/agent/AgentService.ts @@ -1,31 +1,15 @@ import * as path from "node:path"; import * as fs from "node:fs"; -import { Key } from "../../wallet_extension"; import { Language, Expression, PublicSharing, ReadOnlyLanguage, - ExceptionType, } from "@coasys/ad4m"; -import { Agent, ExpressionProof, AgentSignature, EntanglementProof } from "@coasys/ad4m"; -import Signatures from "./Signatures"; +import { Agent, ExpressionProof, AgentSignature } from "@coasys/ad4m"; import * as PubSubDefinitions from "../graphQL-interface/SubscriptionDefinitions"; import { resolver } from "@transmute/did-key.js"; -import { v4 as uuidv4 } from "uuid"; -import { ExceptionInfo } from "@coasys/ad4m/lib/src/runtime/RuntimeResolver"; -import { - ALL_CAPABILITY, - AuthInfo, - AuthInfoExtended, - DefaultTokenValidPeriod, - genRequestKey, - genRandomDigits, - AGENT_AUTH_CAPABILITY, - Capability, -} from "./Auth"; -import * as secp from "@noble/secp256k1"; -import { getPubSub } from "../utils"; +import { getPubSub, tagExpressionSignatureStatus } from "../utils"; export default class AgentService { @@ -33,16 +17,11 @@ export default class AgentService { #didDocument?: string; #signingKeyId?: string; #file: string; - #appsFile: string; - #apps: AuthInfoExtended[]; - #requestingAuthInfo?: AuthInfoExtended; #fileProfile: string; #agent?: Agent; #agentLanguage?: Language; #pubSub: PubSub; - #requests: Map; - #tokenValidPeriod: number; - #adminCredential: string; + #readyPromise: Promise; #readyPromiseResolve?: (value: void | PromiseLike) => void; @@ -50,26 +29,10 @@ export default class AgentService { constructor(rootConfigPath: string, adminCredential?: string) { this.#file = path.join(rootConfigPath, "agent.json"); this.#fileProfile = path.join(rootConfigPath, "agentProfile.json"); - this.#appsFile = path.join(rootConfigPath, "apps.json"); - try { - this.#apps = JSON.parse(fs.readFileSync(this.#appsFile).toString()); - } catch (e) { - this.#apps = []; - } this.#pubSub = getPubSub(); this.#readyPromise = new Promise((resolve) => { this.#readyPromiseResolve = resolve; }); - this.#requests = new Map(); - this.#tokenValidPeriod = DefaultTokenValidPeriod; - if (adminCredential) { - this.#adminCredential = adminCredential; - } else { - console.warn( - "adminCredential is not set or empty, empty token will possess admin capabililities." - ); - this.#adminCredential = ""; - } } get did() { @@ -77,7 +40,19 @@ export default class AgentService { } get agent() { - return this.#agent; + return this.getTaggedAgentCopy(); + } + + getTaggedAgentCopy(): Agent { + const agent = this.#agent; + if (!agent) throw new Error("No agent"); + const copy = JSON.parse(JSON.stringify(agent)); + if(copy.perspective) { + for(let link of copy.perspective.links) { + tagExpressionSignatureStatus(link) + } + } + return copy; } get ready(): Promise { @@ -105,42 +80,18 @@ export default class AgentService { createSignedExpression(data: any): Expression { this.signingChecks() - - const timestamp = new Date().toISOString(); - const payloadBytes = Signatures.buildMessage(data, timestamp); - - const signature = WALLET.sign(payloadBytes); - const sigBuffer = Buffer.from(signature); - const sigHex = sigBuffer.toString("hex"); - - let proof = new ExpressionProof(sigHex.toString(), this.#signingKeyId!); - proof.valid = true; - proof.invalid = false; - - const signedExpresssion = { - author: this.#did, - timestamp, - data, - proof, - } as Expression; - - return signedExpresssion; + return AGENT.createSignedExpression(data); } signString(data: string): string { this.signingChecks() - - const payloadBytes = Signatures.buildMessageRaw(data) - const signature = WALLET.sign(payloadBytes); - const sigBuffer = Buffer.from(signature); - const sigHex = sigBuffer.toString("hex"); - return sigHex + return AGENT.signStringHex(data); } async updateAgent(a: Agent) { this.#agent = a; await this.storeAgentProfile(); - await this.#pubSub.publish(PubSubDefinitions.AGENT_UPDATED, a); + await this.#pubSub.publish(PubSubDefinitions.AGENT_UPDATED, this.getTaggedAgentCopy()); } setAgentLanguage(lang: Language) { @@ -204,10 +155,6 @@ export default class AgentService { } } - private getSigningKey(): Key { - return WALLET.getMainKey(); - } - async createNewKeys() { WALLET.createMainKey() const didDocument = WALLET.getMainKeyDocument() @@ -288,121 +235,6 @@ export default class AgentService { didDocument: this.#didDocument, }; } - - async getCapabilities(token: string) { - if (token == this.#adminCredential) { - return [ALL_CAPABILITY]; - } - - if (token === "") { - return [AGENT_AUTH_CAPABILITY]; - } - - const payload = await JWT.verifyJwt(token); - - //@ts-ignore - return payload.capabilities.capabilities; - } - - isAdminCredential(token: string) { - return token == this.#adminCredential; - } - - async requestCapability(authInfo: AuthInfo) { - let requestId = uuidv4(); - let authExtended = { - requestId, - auth: authInfo, - } as AuthInfoExtended; - - await this.#pubSub.publish(PubSubDefinitions.EXCEPTION_OCCURRED_TOPIC, { - title: "Request to authenticate application", - message: `${authInfo.appName} is waiting for authentication, go to ad4m launcher for more information.`, - type: ExceptionType.CapabilityRequested, - addon: JSON.stringify(authExtended), - } as ExceptionInfo); - - return requestId; - } - - // TODO, we may want to change the capability request workflow. - // https://github.com/perspect3vism/ad4m-executor/issues/73 - permitCapability(authExt: string, capabilities: Capability[]) { - console.log("AgentService.permitCapability(): admin user capabilities: ", capabilities); - console.log("AgentService.permitCapability(): auth info: ", authExt); - - let { requestId, auth }: AuthInfoExtended = JSON.parse(authExt); - let rand = genRandomDigits(); - this.#requests.set(genRequestKey(requestId, rand), auth); - - this.#requestingAuthInfo = JSON.parse(authExt); - - return rand; - } - - async generateJwt(requestId: string, rand: string) { - const authKey = genRequestKey(requestId, rand); - const auth = this.#requests.get(authKey); - - if (!auth) { - throw new Error("Can't find permitted request"); - } - - const jwt = await JWT.generateJwt(this.did || "", `${auth.appName}:${this.did || ""}`, this.#tokenValidPeriod, auth); - - this.#requests.delete(authKey); - - if (requestId === this.#requestingAuthInfo?.requestId) { - const apps = [...this.#apps, { ...this.#requestingAuthInfo, token: jwt }]; - this.#apps = apps; - fs.writeFileSync(this.#appsFile, JSON.stringify(apps)); - - await this.#pubSub.publish(PubSubDefinitions.APPS_CHANGED, null); - } - - return jwt; - } - - getApps(): AuthInfoExtended[] { - return this.#apps; - } - - async removeApp(requestId: string) { - try { - this.#apps = this.#apps.filter((app: any) => app.requestId !== requestId); - - fs.writeFileSync(this.#appsFile, JSON.stringify(this.#apps)); - - await this.#pubSub.publish(PubSubDefinitions.APPS_CHANGED, null); - } catch (e) { - console.error("Error while removing app", e); - } - } - - async revokeAppToken(requestId: string) { - try { - this.#apps = this.#apps.map((app: any) => - app.requestId === requestId ? { ...app, revoked: true } : app - ); - - fs.writeFileSync(this.#appsFile, JSON.stringify(this.#apps)); - - await this.#pubSub.publish(PubSubDefinitions.APPS_CHANGED, null); - } catch (e) { - console.error("Error while revoking token", e); - } - } - - async signMessage(msg: string) { - this.signingChecks() - - const payloadBytes = Signatures.buildMessageRaw(msg) - const signature = WALLET.sign(payloadBytes); - const sigBuffer = Buffer.from(signature); - const sigHex = sigBuffer.toString("hex"); - - return new AgentSignature(sigHex, WALLET.getMainKey().publicKey); - } } export function init( diff --git a/executor/src/core/agent/Auth.test.ts b/executor/src/core/agent/Auth.test.ts deleted file mode 100644 index 6adfa1ffa..000000000 --- a/executor/src/core/agent/Auth.test.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { expect } from "chai"; - -import { checkCapability, genRequestKey, genRandomDigits } from "./Auth" -import * as Auth from "./Auth" - -describe('capability constant', () => { - it('ALL_CAPABILITY is expected', () => { - expect(Auth.ALL_CAPABILITY.with.domain).to.be.eql("*") - expect(Auth.ALL_CAPABILITY.with.pointers).to.be.eql(["*"]) - expect(Auth.ALL_CAPABILITY.can).to.be.eql(["*"]) - }) - - it('AGENT_AUTH_CAPABILITY is expected', () => { - expect(Auth.AGENT_AUTH_CAPABILITY.with.domain).to.be.eql("agent") - expect(Auth.AGENT_AUTH_CAPABILITY.with.pointers).to.be.eql(["*"]) - expect(Auth.AGENT_AUTH_CAPABILITY.can).to.be.eql(["AUTHENTICATE"]) - }) - - it('AGENT_READ_CAPABILITY is expected', () => { - expect(Auth.AGENT_READ_CAPABILITY.with.domain).to.be.eql("agent") - expect(Auth.AGENT_READ_CAPABILITY.with.pointers).to.be.eql(["*"]) - expect(Auth.AGENT_READ_CAPABILITY.can).to.be.eql(["READ"]) - }) - - it('AGENT_CREATE_CAPABILITY is expected', () => { - expect(Auth.AGENT_CREATE_CAPABILITY.with.domain).to.be.eql("agent") - expect(Auth.AGENT_CREATE_CAPABILITY.with.pointers).to.be.eql(["*"]) - expect(Auth.AGENT_CREATE_CAPABILITY.can).to.be.eql(["CREATE"]) - }) -}) - -describe('perspectiveQueryCapability', () => { - it('query capability is expected', () => { - const capability = Auth.perspectiveQueryCapability(["123", "456"]) - expect(capability.with.domain).to.be.eql("perspective") - expect(capability.with.pointers).to.be.eql(["123", "456"]) - expect(capability.can).to.be.eql(["READ"]) - }) -}) - -describe('checkCapability', () => { - it('agent with ALL_CAPABILITY can permit an auth request', () => { - const call = () => { - checkCapability([Auth.ALL_CAPABILITY], Auth.AGENT_PERMIT_CAPABILITY) - } - expect(call).not.throw(); - }) - - it('agent with ALL_CAPABILITY can request agent status', () => { - const call = () => { - checkCapability([Auth.ALL_CAPABILITY], Auth.AGENT_READ_CAPABILITY) - } - expect(call).not.throw(); - }) - - it('agent with ALL_CAPABILITY can mutate the agent', () => { - const call = () => { - checkCapability([Auth.ALL_CAPABILITY], Auth.AGENT_CREATE_CAPABILITY) - } - expect(call).not.throw(); - }) - - it('agent with AGENT_AUTH_CAPABILITY can not request the agent status', () => { - const call = () => { - checkCapability([Auth.AGENT_AUTH_CAPABILITY], Auth.AGENT_READ_CAPABILITY) - } - expect(call).to.Throw("Capability is not matched"); - }) - - it('agent with AGENT_AUTH_CAPABILITY can not mutate the agent', () => { - const call = () => { - checkCapability([Auth.AGENT_AUTH_CAPABILITY], Auth.AGENT_CREATE_CAPABILITY) - } - expect(call).to.throw(); - }) - - it('agent with AGENT_AUTH_CAPABILITY can request an auth', () => { - const call = () => { - checkCapability([Auth.AGENT_AUTH_CAPABILITY], Auth.AGENT_AUTH_CAPABILITY) - } - expect(call).not.throw(); - }) - - it('agent with AGENT_READ_CAPABILITY can request the agent status', () => { - const call = () => { - checkCapability([Auth.AGENT_READ_CAPABILITY], Auth.AGENT_READ_CAPABILITY) - } - expect(call).not.throw(); - }) - - it('agent with perspectiveQueryCapability can query a perspective', () => { - const call = () => { - checkCapability([Auth.perspectiveQueryCapability(["*"])], Auth.perspectiveQueryCapability(["123"])) - } - expect(call).not.throw(); - }) -}) - -describe('genRandomDigits', () => { - it('should return a 6-digit string', () => { - let rand = genRandomDigits() - expect(rand).to.match(/^[0-9]{6}$/) - }) -}) - -describe('genRequestKey', () => { - it('should join the requestId and rand', () => { - let key = genRequestKey("my-request-id", "123456") - expect(key).to.be.equal("my-request-id-123456") - }) -}) diff --git a/executor/src/core/agent/Auth.ts b/executor/src/core/agent/Auth.ts deleted file mode 100644 index 5bf284095..000000000 --- a/executor/src/core/agent/Auth.ts +++ /dev/null @@ -1,449 +0,0 @@ -import lodash from "lodash"; - -export type Capabilities = Capability[]; -export interface Capability { - with: Resource; - can: string[]; -} - -interface Resource { - domain: string; - pointers: string[]; -} - -const WILD_CARD = "*"; - -// capabilities operations -const READ = "READ"; -const CREATE = "CREATE"; -const UPDATE = "UPDATE"; -const DELETE = "DELETE"; -const SUBSCRIBE = "SUBSCRIBE"; - -// capabilities domains -const AGENT = "agent"; -const EXPRESSION = "expression"; -const LANGUAGE = "language"; -const PERSPECTIVE = "perspective"; -const NEIGHBOURHOOD = "neighbourhood"; -const RUNTIME = "runtime"; -const RUNTIME_TRUSTED_AGENTS = "runtime.trusted_agents"; -const RUNTIME_KNOWN_LINK_LANGUAGES = "runtime.known_link_languages"; -const RUNTIME_FRIENDS = "runtime.friends"; -const RUNTIME_MESSAGES = "runtime.messages"; - -// admin capabilities -export const ALL_CAPABILITY: Capability = { - with: { - domain: WILD_CARD, - pointers: [WILD_CARD], - }, - can: [WILD_CARD], -}; - -// agent related capabilities -export const AGENT_AUTH_CAPABILITY: Capability = { - with: { - domain: AGENT, - pointers: [WILD_CARD], - }, - can: ["AUTHENTICATE"], -}; -export const AGENT_READ_CAPABILITY: Capability = { - with: { - domain: AGENT, - pointers: [WILD_CARD], - }, - can: [READ], -}; -export const AGENT_CREATE_CAPABILITY: Capability = { - with: { - domain: AGENT, - pointers: [WILD_CARD], - }, - can: [CREATE], -}; -export const AGENT_UPDATE_CAPABILITY: Capability = { - with: { - domain: AGENT, - pointers: [WILD_CARD], - }, - can: [UPDATE], -}; -export const AGENT_LOCK_CAPABILITY: Capability = { - with: { - domain: AGENT, - pointers: [WILD_CARD], - }, - can: ["LOCK"], -}; -export const AGENT_UNLOCK_CAPABILITY: Capability = { - with: { - domain: AGENT, - pointers: [WILD_CARD], - }, - can: ["UNLOCK"], -}; -export const AGENT_PERMIT_CAPABILITY: Capability = { - with: { - domain: AGENT, - pointers: [WILD_CARD], - }, - can: ["PERMIT"], -}; -export const AGENT_SUBSCRIBE_CAPABILITY: Capability = { - with: { - domain: AGENT, - pointers: [WILD_CARD], - }, - can: [SUBSCRIBE], -}; -export const AGENT_SIGN_CAPABILITY: Capability = { - with: { - domain: AGENT, - pointers: [WILD_CARD], - }, - can: ["SIGN"], -}; - -// expression related capabilites -export const EXPRESSION_READ_CAPABILITY: Capability = { - with: { - domain: EXPRESSION, - pointers: [WILD_CARD], - }, - can: [READ], -}; - -export const EXPRESSION_CREATE_CAPABILITY: Capability = { - with: { - domain: EXPRESSION, - pointers: [WILD_CARD], - }, - can: [CREATE], -}; - -export const EXPRESSION_UPDATE_CAPABILITY: Capability = { - with: { - domain: EXPRESSION, - pointers: [WILD_CARD], - }, - can: [UPDATE], -}; - -// language related capabilities -export const LANGUAGE_READ_CAPABILITY: Capability = { - with: { - domain: LANGUAGE, - pointers: [WILD_CARD], - }, - can: [READ], -}; -export const LANGUAGE_CREATE_CAPABILITY: Capability = { - with: { - domain: LANGUAGE, - pointers: [WILD_CARD], - }, - can: [CREATE], -}; -export const LANGUAGE_UPDATE_CAPABILITY: Capability = { - with: { - domain: LANGUAGE, - pointers: [WILD_CARD], - }, - can: [UPDATE], -}; -export const LANGUAGE_DELETE_CAPABILITY: Capability = { - with: { - domain: LANGUAGE, - pointers: [WILD_CARD], - }, - can: [DELETE], -}; - -// perspective related capabilities -export const perspectiveQueryCapability = (pointers: string[]) => { - return { - with: { - domain: PERSPECTIVE, - pointers: pointers, - }, - can: [READ], - } as Capability; -}; -export const PERSPECTIVE_CREATE_CAPABILITY: Capability = { - with: { - domain: PERSPECTIVE, - pointers: [WILD_CARD], - }, - can: [CREATE], -}; -export const perspectiveUpdateCapability = (pointers: string[]) => { - return { - with: { - domain: PERSPECTIVE, - pointers: pointers, - }, - can: [UPDATE], - } as Capability; -}; -export const perspectiveDeleteCapability = (pointers: string[]) => { - return { - with: { - domain: PERSPECTIVE, - pointers: pointers, - }, - can: [DELETE], - } as Capability; -}; -export const PERSPECTIVE_SUBSCRIBE_CAPABILITY: Capability = { - with: { - domain: PERSPECTIVE, - pointers: [WILD_CARD], - }, - can: [SUBSCRIBE], -}; - -// neighbourhood related capabilities -export const NEIGHBOURHOOD_CREATE_CAPABILITY: Capability = { - with: { - domain: NEIGHBOURHOOD, - pointers: [WILD_CARD], - }, - can: [CREATE], -}; -export const NEIGHBOURHOOD_READ_CAPABILITY: Capability = { - with: { - domain: NEIGHBOURHOOD, - pointers: [WILD_CARD], - }, - can: [READ], -}; - -export const NEIGHBOURHOOD_UPDATE_CAPABILITY: Capability = { - with: { - domain: NEIGHBOURHOOD, - pointers: [WILD_CARD], - }, - can: [UPDATE], -}; - -// runtime related capabilities -export const RUNTIME_TRUSTED_AGENTS_READ_CAPABILITY: Capability = { - with: { - domain: RUNTIME_TRUSTED_AGENTS, - pointers: [WILD_CARD], - }, - can: [READ], -}; -export const RUNTIME_TRUSTED_AGENTS_CREATE_CAPABILITY: Capability = { - with: { - domain: RUNTIME_TRUSTED_AGENTS, - pointers: [WILD_CARD], - }, - can: [CREATE], -}; -export const RUNTIME_TRUSTED_AGENTS_DELETE_CAPABILITY: Capability = { - with: { - domain: RUNTIME_TRUSTED_AGENTS, - pointers: [WILD_CARD], - }, - can: [DELETE], -}; - -export const RUNTIME_KNOWN_LINK_LANGUAGES_READ_CAPABILITY: Capability = { - with: { - domain: RUNTIME_KNOWN_LINK_LANGUAGES, - pointers: [WILD_CARD], - }, - can: [READ], -}; -export const RUNTIME_KNOWN_LINK_LANGUAGES_CREATE_CAPABILITY: Capability = { - with: { - domain: RUNTIME_KNOWN_LINK_LANGUAGES, - pointers: [WILD_CARD], - }, - can: [CREATE], -}; -export const RUNTIME_KNOWN_LINK_LANGUAGES_DELETE_CAPABILITY: Capability = { - with: { - domain: RUNTIME_KNOWN_LINK_LANGUAGES, - pointers: [WILD_CARD], - }, - can: [DELETE], -}; - -export const RUNTIME_FRIENDS_READ_CAPABILITY: Capability = { - with: { - domain: RUNTIME_FRIENDS, - pointers: [WILD_CARD], - }, - can: [READ], -}; -export const RUNTIME_FRIENDS_CREATE_CAPABILITY: Capability = { - with: { - domain: RUNTIME_FRIENDS, - pointers: [WILD_CARD], - }, - can: [CREATE], -}; -export const RUNTIME_FRIENDS_DELETE_CAPABILITY: Capability = { - with: { - domain: RUNTIME_FRIENDS, - pointers: [WILD_CARD], - }, - can: [DELETE], -}; - -export const RUNTIME_FRIEND_STATUS_READ_CAPABILITY: Capability = { - with: { - domain: "runtime.friend_status", - pointers: [WILD_CARD], - }, - can: [READ], -}; -export const RUNTIME_MY_STATUS_UPDATE_CAPABILITY: Capability = { - with: { - domain: "runtime.my_status", - pointers: [WILD_CARD], - }, - can: [UPDATE], -}; -export const RUNTIME_HC_AGENT_INFO_READ_CAPABILITY: Capability = { - with: { - domain: "runtime.hc_agent_info", - pointers: [WILD_CARD], - }, - can: [READ], -}; -export const RUNTIME_HC_AGENT_INFO_CREATE_CAPABILITY: Capability = { - with: { - domain: "runtime.hc_agent_info", - pointers: [WILD_CARD], - }, - can: [CREATE], -}; -export const RUNTIME_MESSAGES_READ_CAPABILITY: Capability = { - with: { - domain: RUNTIME_MESSAGES, - pointers: [WILD_CARD], - }, - can: [READ], -}; -export const RUNTIME_MESSAGES_CREATE_CAPABILITY: Capability = { - with: { - domain: RUNTIME_MESSAGES, - pointers: [WILD_CARD], - }, - can: [CREATE], -}; -export const RUNTIME_MESSAGES_SUBSCRIBE_CAPABILITY: Capability = { - with: { - domain: RUNTIME_MESSAGES, - pointers: [WILD_CARD], - }, - can: [SUBSCRIBE], -}; -export const RUNTIME_QUIT_CAPABILITY: Capability = { - with: { - domain: RUNTIME, - pointers: [WILD_CARD], - }, - can: ["QUIT"], -}; -export const RUNTIME_EXCEPTION_SUBSCRIBE_CAPABILITY: Capability = { - with: { - domain: "runtime.exception", - pointers: [WILD_CARD], - }, - can: [SUBSCRIBE], -}; - -export const checkTokenAuthorized = ( - apps: any[] = [], - token: string, - isAd4minCredential: boolean -) => { - if (!isAd4minCredential) { - if (apps.length > 0) { - if (token) { - const filteredApps = apps.filter((app) => app.token === token); - - if (filteredApps.length === 0) { - throw Error(`Unauthorized access`); - } else { - const noRevoked = filteredApps.filter((app) => !app.revoked); - if (noRevoked.length === 0) { - throw Error(`Unauthorized access`); - } - } - } - } - } -}; - -export const checkCapability = ( - capabilities: Capabilities, - expected: Capability -) => { - const customCapMatch = (cap: Capability, expected: Capability) => { - if ( - cap.with.domain !== WILD_CARD && - cap.with.domain !== expected.with.domain - ) { - return false; - } - - if ( - !lodash.isEqual(cap.with.pointers, [WILD_CARD]) && - lodash.difference(expected.with.pointers, cap.with.pointers).length > 0 - ) { - return false; - } - - if ( - !lodash.isEqual(cap.can, [WILD_CARD]) && - lodash.difference(expected.can, cap.can).length > 0 - ) { - return false; - } - - return true; - }; - - if ( - !lodash.find(capabilities, (cap) => - lodash.isEqualWith(cap, expected, customCapMatch) - ) - ) { - throw Error( - `Capability is not matched, you have capabilities: ${JSON.stringify( - capabilities - )}, expected: ${JSON.stringify(expected)}` - ); - } -}; - -export const DefaultTokenValidPeriod = 180 * 24 * 60 * 60; // 180 days in seconds - -export interface AuthInfoExtended { - requestId: string; - auth: AuthInfo; -} - -export interface AuthInfo { - appName: string; - appDesc: string; - appDomain: string; - appUrl?: string; - appIconPath?: string; - capabilities?: Capability[]; -} - -export const genRandomDigits = () => { - return Math.floor(100000 + Math.random() * 900000).toString(); -}; - -export const genRequestKey = (requestId: string, rand: string) => { - return `${requestId}-${rand}`; -}; diff --git a/executor/src/core/agent/Signatures.ts b/executor/src/core/agent/Signatures.ts deleted file mode 100644 index 414578ab1..000000000 --- a/executor/src/core/agent/Signatures.ts +++ /dev/null @@ -1,34 +0,0 @@ -import type { Expression } from "@coasys/ad4m" -import sha256 from 'sha256' -import stringify from 'json-stable-stringify' -export default class Signatures { - constructor() {} - - async verifyStringSignedByDid(did: string, didSigningKeyId: string, data: string, signedData: string): Promise { - const sigBytes = Uint8Array.from(Buffer.from(signedData, "hex")) - const message = Signatures.buildMessageRaw(data) - return WALLET.verify(did, message, sigBytes) - } - - async verify(expr: Expression): Promise { - const sigBytes = Uint8Array.from(Buffer.from(expr.proof.signature, "hex")) - const message = Signatures.buildMessage(expr.data, expr.timestamp) - return WALLET.verify(expr.author, message, sigBytes) - } - - static buildMessage(data: any, timestamp: string): Uint8Array { - const payload = { data, timestamp } - const payloadString = stringify(payload) - const payloadBuffer = Buffer.from(payloadString) - const payloadBytes = Uint8Array.from(sha256(Buffer.from(payloadBuffer), { asBytes: true })) - return payloadBytes - } - - static buildMessageRaw(data: any): Uint8Array { - const payload = { data } - const payloadString = stringify(payload) - const payloadBuffer = Buffer.from(payloadString) - const payloadBytes = Uint8Array.from(sha256(Buffer.from(payloadBuffer), { asBytes: true })) - return payloadBytes - } -} diff --git a/executor/src/core/db.ts b/executor/src/core/db.ts index e55aa0173..c2f26bb66 100644 --- a/executor/src/core/db.ts +++ b/executor/src/core/db.ts @@ -106,7 +106,6 @@ export class Ad4mDb { await this.#linkDb.deleteOne({ perspective: perspectiveUuid, - linkExpression: link, source: link.data.source, predicate: link.data.predicate, target: link.data.target, diff --git a/executor/src/core/graphQL-interface/GraphQL.ts b/executor/src/core/graphQL-interface/GraphQL.ts index 1b32a258a..75c13ab98 100644 --- a/executor/src/core/graphQL-interface/GraphQL.ts +++ b/executor/src/core/graphQL-interface/GraphQL.ts @@ -3,52 +3,20 @@ import { exprRef2String, parseExprUrl, LanguageMeta } from '@coasys/ad4m' import type Ad4mCore from '../Ad4mCore' import * as PubSubDefinitions from './SubscriptionDefinitions' import { ad4mExecutorVersion } from '../Config'; -import * as Auth from '../agent/Auth' -import { checkCapability, checkTokenAuthorized } from '../agent/Auth' import { OuterConfig } from '../../main'; -import Perspective from '../Perspective'; -import { Capability } from '../agent/Auth' -import { Capabilities } from '../agent/Auth' -import { getPubSub } from '../utils'; - -function checkLinkLanguageInstalled(perspective: Perspective) { - if(perspective.state != PerspectiveState.Synced && perspective.state != PerspectiveState.LinkLanguageInstalledButNotSynced) { - throw new Error(`Perspective ${perspective.uuid}/${perspective.name} does not have a LinkLanguage installed. State is: ${perspective.state}`) - } -} +import { getPubSub, tagExpressionSignatureStatus } from '../utils'; + export function createResolvers(core: Ad4mCore, config: OuterConfig) { - function signPerspectiveDeep(input: PerspectiveUnsignedInput): PerspectiveExpression { - let out = new PerspectiveExpression() - out.links = input.links.map(l => core.agentService.createSignedExpression(l)) - return core.agentService.createSignedExpression(out) - } return { Query: { - getCapabilities: async (token: string) => { - if (token === undefined) { - token = "" - }; - const capabilities = await core.agentService.getCapabilities(token); - if(!capabilities) throw new Error("User capability is empty.") - - const isAd4minCredential = core.agentService.isAdminCredential(token) - checkTokenAuthorized(core.agentService.getApps(), token, isAd4minCredential) - - return { capabilities, token }; - }, - checkCapability: async (suppliedCapabilities: Capabilities, expectedCapabilities: Capability) => { - await checkCapability(suppliedCapabilities, expectedCapabilities); - }, //@ts-ignore agent: (context) => { - checkCapability(context.capabilities, Auth.AGENT_READ_CAPABILITY) return core.agentService.agent }, //@ts-ignore agentByDID: async (args, context) => { - checkCapability(context.capabilities, Auth.AGENT_READ_CAPABILITY) const { did } = args; if (did != core.agentService.did) { const agentLanguage = core.languageController.getAgentLanguage().expressionAdapter; @@ -57,6 +25,10 @@ export function createResolvers(core: Ad4mCore, config: OuterConfig) { } const expr = await agentLanguage.get(did); if (expr != null) { + tagExpressionSignatureStatus(expr); + for(const link of expr.data.perspective.links) { + tagExpressionSignatureStatus(link) + } return expr.data; } else { return null @@ -67,7 +39,6 @@ export function createResolvers(core: Ad4mCore, config: OuterConfig) { }, //@ts-ignore agentStatus: (context) => { - checkCapability(context.capabilities, Auth.AGENT_READ_CAPABILITY) return core.agentService.dump() }, //@ts-ignore @@ -75,14 +46,7 @@ export function createResolvers(core: Ad4mCore, config: OuterConfig) { return !core.agentService.isUnlocked }, //@ts-ignore - agentGetApps: async (context) => { - checkCapability(context.capabilities, Auth.AGENT_AUTH_CAPABILITY) - let apps = await core.agentService.getApps() - return apps; - }, - //@ts-ignore expression: async (args, context) => { - checkCapability(context.capabilities, Auth.EXPRESSION_READ_CAPABILITY) const url = args.url.toString(); const ref = parseExprUrl(url) const expression = await core.languageController.getExpression(ref); @@ -101,13 +65,13 @@ export function createResolvers(core: Ad4mCore, config: OuterConfig) { lang = { address: "literal", name: "literal" } } else { try { - lang = await core.languageController.languageForExpression(expression.ref) as any + lang = await core.languageController.languageForExpression(expression.ref) as any } catch(e) { console.error("While trying to get language for expression", expression, ":", e) lang = {} } } - + lang.address = expression.ref.language.address expression.language = lang } @@ -115,7 +79,6 @@ export function createResolvers(core: Ad4mCore, config: OuterConfig) { }, //@ts-ignore expressionMany: async (args, context) => { - checkCapability(context.capabilities, Auth.EXPRESSION_READ_CAPABILITY) const { urls } = args; const expressionPromises = []; for (const url of urls) { @@ -140,12 +103,12 @@ export function createResolvers(core: Ad4mCore, config: OuterConfig) { } try { - lang = await core.languageController.languageForExpression(expression.ref) as any + lang = await core.languageController.languageForExpression(expression.ref) as any } catch(e) { console.error("While trying to get language for expression", expression, ":", e) lang = {} } - + lang.address = expression.ref.language.address expression.language = lang } @@ -154,21 +117,18 @@ export function createResolvers(core: Ad4mCore, config: OuterConfig) { }, //@ts-ignore expressionRaw: async (args, context) => { - checkCapability(context.capabilities, Auth.EXPRESSION_READ_CAPABILITY) const ref = parseExprUrl(args.url.toString()) const expression = await core.languageController.getExpression(ref) as any return JSON.stringify(expression) }, //@ts-ignore expressionInteractions: async (args, context) => { - checkCapability(context.capabilities, Auth.EXPRESSION_READ_CAPABILITY) const { url } = args const result = await core.languageController.expressionInteractions(url) return result }, //@ts-ignore language: async (args, context) => { - checkCapability(context.capabilities, Auth.LANGUAGE_READ_CAPABILITY) const { address } = args const lang = await core.languageController.languageByRef({address, name: ""} as LanguageRef) as any lang.address = address @@ -231,7 +191,6 @@ export function createResolvers(core: Ad4mCore, config: OuterConfig) { }, //@ts-ignore languageMeta: async (args, context) => { - checkCapability(context.capabilities, Auth.LANGUAGE_READ_CAPABILITY) const { address } = args const languageExpression = await core.languageController.getLanguageExpression(address) if(!languageExpression) @@ -253,7 +212,6 @@ export function createResolvers(core: Ad4mCore, config: OuterConfig) { //@ts-ignore languageSource: async (args, context) => { - checkCapability(context.capabilities, Auth.LANGUAGE_READ_CAPABILITY) const { address } = args const languageSource = await core.languageController.getLanguageSource(address) if(!languageSource) @@ -264,119 +222,36 @@ export function createResolvers(core: Ad4mCore, config: OuterConfig) { //@ts-ignore languages: (args, context) => { - checkCapability(context.capabilities, Auth.LANGUAGE_READ_CAPABILITY) let filter if(args.filter && args.filter !== '') filter = args.filter return core.languageController.filteredLanguageRefs(filter) }, - - //@ts-ignore - neighbourhoodOtherAgents: async (args, context) => { - checkCapability(context.capabilities, Auth.NEIGHBOURHOOD_UPDATE_CAPABILITY) - const { perspectiveUUID } = args - const perspective = core.perspectivesController.perspective(perspectiveUUID) - if(!perspective) { throw new Error(`Perspective not found: ${perspectiveUUID}`) } - checkLinkLanguageInstalled(perspective) - return await perspective.othersInNeighbourhood() - }, - - //@ts-ignore - neighbourhoodHasTelepresenceAdapter: async (args, context) => { - checkCapability(context.capabilities, Auth.NEIGHBOURHOOD_READ_CAPABILITY) - const { perspectiveUUID } = args - const perspective = core.perspectivesController.perspective(perspectiveUUID) - if(!perspective) { throw new Error(`Perspective not found: ${perspectiveUUID}`) } - checkLinkLanguageInstalled(perspective) - const telepresenceAdapter = await perspective.getTelepresenceAdapter() - return telepresenceAdapter != undefined - }, - - //@ts-ignore - neighbourhoodOnlineAgents: async (args, context) => { - checkCapability(context.capabilities, Auth.NEIGHBOURHOOD_READ_CAPABILITY) - const { perspectiveUUID } = args - const perspective = core.perspectivesController.perspective(perspectiveUUID) - if(!perspective) { throw new Error(`Perspective not found: ${perspectiveUUID}`) } - checkLinkLanguageInstalled(perspective) - const telepresenceAdapter = await perspective.getTelepresenceAdapter() - if(!telepresenceAdapter) { throw new Error(`Neighbourhood ${perspective.sharedUrl} has no Telepresence Adapter.`) } - return await perspective!.getOnlineAgents(); - }, - - //@ts-ignore - perspective: (args, context) => { - const id = args.uuid - checkCapability(context.capabilities, Auth.perspectiveQueryCapability([id])) - let perspective = core.perspectivesController.perspectiveID(id); - if (perspective == undefined) { - return null; - } else { - return perspective - } - }, - //@ts-ignore - perspectiveQueryLinks: async (args, context) => { - const { uuid, query } = args - checkCapability(context.capabilities, Auth.perspectiveQueryCapability([uuid])) - const perspective = core.perspectivesController.perspective(uuid) - //console.log("querying on", perspective, query, uuid); - return await perspective.getLinks(query) - }, - //@ts-ignore - perspectiveQueryProlog: async (args, context) => { - const { uuid, query } = args - checkCapability(context.capabilities, Auth.perspectiveQueryCapability([uuid])) - const perspective = core.perspectivesController.perspective(uuid) - return JSON.stringify(await perspective.prologQuery(query)) - }, - //@ts-ignore - perspectiveSnapshot: async (args, context) => { - const id = args.uuid - checkCapability(context.capabilities, Auth.perspectiveQueryCapability([id])) - return await core.perspectivesController.perspectiveSnapshot(id) - }, - //@ts-ignore - perspectives: (context) => { - checkCapability(context.capabilities, Auth.perspectiveQueryCapability(["*"])) - return core.perspectivesController.allPerspectiveHandles() - }, //@ts-ignore agentGetEntanglementProofs: () => { return core.entanglementProofController.getEntanglementProofs(); }, //@ts-ignore getTrustedAgents: (context) => { - checkCapability(context.capabilities, Auth.RUNTIME_TRUSTED_AGENTS_READ_CAPABILITY) return core.runtimeService.getTrustedAgents(); }, //@ts-ignore runtimeKnownLinkLanguageTemplates: (context) => { - checkCapability(context.capabilities, Auth.RUNTIME_KNOWN_LINK_LANGUAGES_READ_CAPABILITY) return core.runtimeService.knowLinkLanguageTemplates(); }, //@ts-ignore runtimeFriends: (context) => { - checkCapability(context.capabilities, Auth.RUNTIME_FRIENDS_READ_CAPABILITY) return core.runtimeService.friends(); }, //@ts-ignore runtimeHcAgentInfos: async (context) => { - checkCapability(context.capabilities, Auth.RUNTIME_HC_AGENT_INFO_READ_CAPABILITY) return JSON.stringify(await core.holochainRequestAgentInfos()); }, - //@ts-ignore - runtimeVerifyStringSignedByDid: async (args, context) => { - const { did, didSigningKeyId, data, signedData } = args; - return await core.signatureService.verifyStringSignedByDid(did, didSigningKeyId, data, signedData) - }, - //@ts-ignore runtimeFriendStatus: async (args, context) => { - checkCapability(context.capabilities, Auth.RUNTIME_FRIEND_STATUS_READ_CAPABILITY) const { did } = args if(!core.runtimeService.friends().includes(did)) throw `${did} is not a friend` const dmLang = await core.friendsDirectMessageLanguage(did) @@ -388,14 +263,12 @@ export function createResolvers(core: Ad4mCore, config: OuterConfig) { //@ts-ignore runtimeMessageInbox: async (args, context) => { - checkCapability(context.capabilities, Auth.RUNTIME_MESSAGES_READ_CAPABILITY) const { filter } = args const dmLang = await core.myDirectMessageLanguage() return await dmLang.directMessageAdapter!.inbox(filter) }, //@ts-ignore runtimeMessageOutbox: (args, context) => { - checkCapability(context.capabilities, Auth.RUNTIME_MESSAGES_READ_CAPABILITY) const { filter } = args return core.runtimeService.getMessagesOutbox(filter) }, @@ -421,7 +294,7 @@ export function createResolvers(core: Ad4mCore, config: OuterConfig) { agentDeleteEntanglementProofs: (args, context) => { const { proofs } = args; core.entanglementProofController.deleteEntanglementProofs(proofs); - return core.entanglementProofController.getEntanglementProofs(); + return core.entanglementProofController.getEntanglementProofs(); }, //@ts-ignore agentEntanglementProofPreFlight: (args, context) => { @@ -429,51 +302,31 @@ export function createResolvers(core: Ad4mCore, config: OuterConfig) { return core.entanglementProofController.signDeviceKey(deviceKey, deviceKeyType); }, //@ts-ignore - agentRemoveApp: async (args, context) => { - checkCapability(context.capabilities, Auth.AGENT_AUTH_CAPABILITY) - const { requestId } = args; - await core.agentService.removeApp(requestId) - return await core.agentService.getApps(); - - }, - //@ts-ignore - agentRevokeToken: async (args, context) => { - checkCapability(context.capabilities, Auth.AGENT_AUTH_CAPABILITY) - const { requestId } = args; - await core.agentService.revokeAppToken(requestId) - return await core.agentService.getApps(); - }, - //@ts-ignore addTrustedAgents: (args, context) => { - checkCapability(context.capabilities, Auth.RUNTIME_TRUSTED_AGENTS_CREATE_CAPABILITY) const { agents } = args; core.runtimeService.addTrustedAgents(agents); return core.runtimeService.getTrustedAgents(); }, //@ts-ignore deleteTrustedAgents: (args, context) => { - checkCapability(context.capabilities, Auth.RUNTIME_TRUSTED_AGENTS_DELETE_CAPABILITY) const { agents } = args; core.runtimeService.deleteTrustedAgents(agents); return core.runtimeService.getTrustedAgents(); }, //@ts-ignore runtimeAddKnownLinkLanguageTemplates: (args, context) => { - checkCapability(context.capabilities, Auth.RUNTIME_KNOWN_LINK_LANGUAGES_CREATE_CAPABILITY) const { addresses } = args; core.runtimeService.addKnowLinkLanguageTemplates(addresses); return core.runtimeService.knowLinkLanguageTemplates(); }, //@ts-ignore runtimeRemoveKnownLinkLanguageTemplates: (args, context) => { - checkCapability(context.capabilities, Auth.RUNTIME_KNOWN_LINK_LANGUAGES_DELETE_CAPABILITY) const { addresses } = args; core.runtimeService.removeKnownLinkLanguageTemplates(addresses); return core.runtimeService.knowLinkLanguageTemplates(); }, //@ts-ignore runtimeAddFriends: async (args, context) => { - checkCapability(context.capabilities, Auth.RUNTIME_FRIENDS_CREATE_CAPABILITY) const { dids } = args; core.runtimeService.addFriends(dids); //@ts-ignore @@ -482,14 +335,12 @@ export function createResolvers(core: Ad4mCore, config: OuterConfig) { }, //@ts-ignore runtimeRemoveFriends: (args, context) => { - checkCapability(context.capabilities, Auth.RUNTIME_FRIENDS_DELETE_CAPABILITY) const { dids } = args; core.runtimeService.removeFriends(dids); return core.runtimeService.friends(); }, //@ts-ignore agentGenerate: async (args, context) => { - checkCapability(context.capabilities, Auth.AGENT_CREATE_CAPABILITY) await core.agentService.createNewKeys() await core.agentService.save(args.passphrase) const {hcPortAdmin, connectHolochain, hcPortApp, hcUseLocalProxy, hcUseMdns, hcUseProxy, hcUseBootstrap, hcProxyUrl, hcBootstrapUrl} = config; @@ -518,14 +369,11 @@ export function createResolvers(core: Ad4mCore, config: OuterConfig) { }, //@ts-ignore agentLock: async (args, context) => { - checkCapability(context.capabilities, Auth.AGENT_LOCK_CAPABILITY) await core.agentService.lock(args.passphrase) return core.agentService.dump() }, //@ts-ignore agentUnlock: async (args, context) => { - - checkCapability(context.capabilities, Auth.AGENT_UNLOCK_CAPABILITY) try { await core.agentService.unlock(args.passphrase) } catch(e) { @@ -533,26 +381,23 @@ export function createResolvers(core: Ad4mCore, config: OuterConfig) { } if(core.agentService.isUnlocked()) { - try { - core.perspectivesController; - await core.waitForAgent(); - core.initControllers() - await core.initLanguages(); - } catch (e) { + if(!core.holochainService) { + console.log("Holochain service not initialized. Initializing...") // @ts-ignore const {hcPortAdmin, connectHolochain, hcPortApp, hcUseLocalProxy, hcUseMdns, hcUseProxy, hcUseBootstrap, hcProxyUrl, hcBootstrapUrl} = config; - if (args.holochain === "true") { - await core.initHolochain({ hcPortAdmin, hcPortApp, hcUseLocalProxy, hcUseMdns, hcUseProxy, hcUseBootstrap, passphrase: args.passphrase, hcProxyUrl, hcBootstrapUrl }); - } - await core.waitForAgent(); - core.initControllers() - await core.initLanguages() - - console.log("\x1b[32m", "AD4M init complete", "\x1b[0m"); + await core.initHolochain({ hcPortAdmin, hcPortApp, hcUseLocalProxy, hcUseMdns, hcUseProxy, hcUseBootstrap, passphrase: args.passphrase, hcProxyUrl, hcBootstrapUrl }); + } else { + console.log("Holo service already initialized") } + + await core.waitForAgent(); + core.initControllers() + await core.initLanguages() + + console.log("\x1b[32m", "AD4M init complete", "\x1b[0m"); try { - await core.agentService.ensureAgentExpression(); + await core.agentService.ensureAgentExpression(); } catch (e) { console.log("Error ensuring public agent expression: ", e) } @@ -568,7 +413,6 @@ export function createResolvers(core: Ad4mCore, config: OuterConfig) { }, //@ts-ignore agentUpdateDirectMessageLanguage: async (args, context) => { - checkCapability(context.capabilities, Auth.AGENT_UPDATE_CAPABILITY) const { directMessageLanguage } = args; let currentAgent = core.agentService.agent; if (!currentAgent) { @@ -576,11 +420,10 @@ export function createResolvers(core: Ad4mCore, config: OuterConfig) { } currentAgent.directMessageLanguage = directMessageLanguage; await core.agentService.updateAgent(currentAgent); - return currentAgent; + return core.agentService.agent; }, //@ts-ignore agentUpdatePublicPerspective: async (args, context) => { - checkCapability(context.capabilities, Auth.AGENT_UPDATE_CAPABILITY) const {perspective} = args; let currentAgent = core.agentService.agent; if (!currentAgent) { @@ -592,44 +435,16 @@ export function createResolvers(core: Ad4mCore, config: OuterConfig) { links: perspective.links.map((l: any) => { const link = {...l}; delete link.status - + return link }) }; await core.agentService.updateAgent(currentAgent); - return currentAgent; - }, - //@ts-ignore - agentRequestCapability: async (args, context) => { - checkCapability(context.capabilities, Auth.AGENT_AUTH_CAPABILITY) - const { authInfo } = args; - let token = await core.agentService.requestCapability(authInfo); - return token; - }, - //@ts-ignore - agentPermitCapability: (args, context) => { - checkCapability(context.capabilities, Auth.AGENT_PERMIT_CAPABILITY) - const { auth } = args; - return core.agentService.permitCapability(auth, context.capabilities); - }, - //@ts-ignore - agentGenerateJwt: async (args, context) => { - checkCapability(context.capabilities, Auth.AGENT_AUTH_CAPABILITY) - const { requestId, rand } = args; - let jwt = await core.agentService.generateJwt(requestId, rand) - return jwt; - }, - //@ts-ignore - agentSignMessage: async (args, context) => { - checkCapability(context.capabilities, Auth.AGENT_SIGN_CAPABILITY) - const { message } = args; - let sig = await core.agentService.signMessage(message) - return sig + return core.agentService.agent; }, //@ts-ignore expressionCreate: async (args, context) => { - checkCapability(context.capabilities, Auth.EXPRESSION_CREATE_CAPABILITY) const { languageAddress, content } = args //@ts-ignore @@ -643,7 +458,6 @@ export function createResolvers(core: Ad4mCore, config: OuterConfig) { }, //@ts-ignore expressionInteract: async (args, context) => { - checkCapability(context.capabilities, Auth.EXPRESSION_UPDATE_CAPABILITY) let { url, interactionCall } = args interactionCall = new InteractionCall(interactionCall.name, JSON.parse(interactionCall.parametersStringified)) const result = await core.languageController.expressionInteract(url, interactionCall) @@ -651,14 +465,12 @@ export function createResolvers(core: Ad4mCore, config: OuterConfig) { }, //@ts-ignore languageApplyTemplateAndPublish: async (args, context) => { - checkCapability(context.capabilities, Auth.LANGUAGE_CREATE_CAPABILITY) console.log("JS args", args); const { sourceLanguageHash, templateData } = args; return await core.languageApplyTemplateAndPublish(sourceLanguageHash, JSON.parse(templateData)); }, //@ts-ignore languagePublish: async (args, context) => { - checkCapability(context.capabilities, Auth.LANGUAGE_CREATE_CAPABILITY) const { languagePath, languageMeta } = args; const expression = await core.languagePublish(languagePath, languageMeta); const internal = expression.data @@ -676,7 +488,6 @@ export function createResolvers(core: Ad4mCore, config: OuterConfig) { }, //@ts-ignore languageRemove: async (args, context) => { - checkCapability(context.capabilities, Auth.LANGUAGE_DELETE_CAPABILITY) const { address } = args try { await core.languageController.languageRemove(address) @@ -688,207 +499,11 @@ export function createResolvers(core: Ad4mCore, config: OuterConfig) { }, //@ts-ignore languageWriteSettings: async (args, context) => { - checkCapability(context.capabilities, Auth.LANGUAGE_UPDATE_CAPABILITY) const { languageAddress, settings } = args await core.languageController.putSettings(languageAddress, JSON.parse(settings)) return true }, //@ts-ignore - neighbourhoodJoinFromUrl: async (args, context) => { - checkCapability(context.capabilities, Auth.NEIGHBOURHOOD_READ_CAPABILITY) - const { url } = args; - try{ - return await core.installNeighbourhood(url); - } catch(e) { - console.error(`Error while trying to join neighbourhood '${url}':`, e) - throw e - } - - }, - //@ts-ignore - neighbourhoodPublishFromPerspective: async (args, context) => { - checkCapability(context.capabilities, Auth.NEIGHBOURHOOD_CREATE_CAPABILITY) - const { linkLanguage, meta, perspectiveUUID } = args - const perspective = core.perspectivesController.perspective(perspectiveUUID) - if(perspective.neighbourhood && perspective.sharedUrl) - throw new Error(`Perspective ${perspective.name} (${perspective.uuid}) is already shared`); - - try{ - return await core.neighbourhoodPublishFromPerspective(perspectiveUUID, linkLanguage, meta) - } catch(e) { - console.error(`Error while trying to publish:`, e) - throw e - } - }, - - //@ts-ignore - neighbourhoodSetOnlineStatus: async (args, context) => { - checkCapability(context.capabilities, Auth.NEIGHBOURHOOD_UPDATE_CAPABILITY) - const { perspectiveUUID, status } = args - const perspective = core.perspectivesController.perspective(perspectiveUUID) - if(!perspective) { throw new Error(`Perspective not found: ${perspectiveUUID}`) } - checkLinkLanguageInstalled(perspective) - const telepresenceAdapter = await perspective.getTelepresenceAdapter() - if(!telepresenceAdapter) { throw new Error(`Neighbourhood ${perspective.sharedUrl} has no Telepresence Adapter.`) } - const statusExpression = core.agentService.createSignedExpression(status) - await telepresenceAdapter!.setOnlineStatus(statusExpression) - return true - }, - - //@ts-ignore - neighbourhoodSetOnlineStatusU: async (args, context) => { - checkCapability(context.capabilities, Auth.NEIGHBOURHOOD_UPDATE_CAPABILITY) - const { perspectiveUUID, status } = args - const perspective = core.perspectivesController.perspective(perspectiveUUID) - if(!perspective) { throw new Error(`Perspective not found: ${perspectiveUUID}`) } - checkLinkLanguageInstalled(perspective) - const telepresenceAdapter = await perspective.getTelepresenceAdapter() - if(!telepresenceAdapter) { throw new Error(`Neighbourhood ${perspective.sharedUrl} has no Telepresence Adapter.`) } - const statusExpression = signPerspectiveDeep(status) - await telepresenceAdapter!.setOnlineStatus(statusExpression) - return true - }, - - //@ts-ignore - neighbourhoodSendSignal: async (args, context) => { - checkCapability(context.capabilities, Auth.NEIGHBOURHOOD_UPDATE_CAPABILITY) - const { perspectiveUUID, remoteAgentDid, payload } = args - const perspective = core.perspectivesController.perspective(perspectiveUUID) - if(!perspective) { throw new Error(`Perspective not found: ${perspectiveUUID}`) } - checkLinkLanguageInstalled(perspective) - const telepresenceAdapter = await perspective.getTelepresenceAdapter() - if(!telepresenceAdapter) { throw new Error(`Neighbourhood ${perspective.sharedUrl} has no Telepresence Adapter.`) } - const payloadExpression = core.agentService.createSignedExpression(payload) - await telepresenceAdapter!.sendSignal(remoteAgentDid, payloadExpression) - return true - }, - - //@ts-ignore - neighbourhoodSendSignalU: async (args, context) => { - checkCapability(context.capabilities, Auth.NEIGHBOURHOOD_UPDATE_CAPABILITY) - const { perspectiveUUID, remoteAgentDid, payload } = args - const perspective = core.perspectivesController.perspective(perspectiveUUID) - if(!perspective) { throw new Error(`Perspective not found: ${perspectiveUUID}`) } - checkLinkLanguageInstalled(perspective) - const telepresenceAdapter = await perspective.getTelepresenceAdapter() - if(!telepresenceAdapter) { throw new Error(`Neighbourhood ${perspective.sharedUrl} has no Telepresence Adapter.`) } - const payloadExpression = signPerspectiveDeep(payload) - await telepresenceAdapter!.sendSignal(remoteAgentDid, payloadExpression) - return true - }, - - //@ts-ignore - neighbourhoodSendBroadcast: async (args, context) => { - checkCapability(context.capabilities, Auth.NEIGHBOURHOOD_UPDATE_CAPABILITY) - const { perspectiveUUID, payload } = args - const perspective = core.perspectivesController.perspective(perspectiveUUID) - if(!perspective) { throw new Error(`Perspective not found: ${perspectiveUUID}`) } - checkLinkLanguageInstalled(perspective) - const telepresenceAdapter = await perspective.getTelepresenceAdapter() - if(!telepresenceAdapter) { throw new Error(`Neighbourhood ${perspective.sharedUrl} has no Telepresence Adapter.`) } - const payloadExpression = core.agentService.createSignedExpression(payload) - await telepresenceAdapter!.sendBroadcast(payloadExpression) - return true - }, - - //@ts-ignore - neighbourhoodSendBroadcastU: async (args, context) => { - checkCapability(context.capabilities, Auth.NEIGHBOURHOOD_UPDATE_CAPABILITY) - const { perspectiveUUID, payload } = args - const perspective = core.perspectivesController.perspective(perspectiveUUID) - if(!perspective) { throw new Error(`Perspective not found: ${perspectiveUUID}`) } - checkLinkLanguageInstalled(perspective) - const telepresenceAdapter = await perspective.getTelepresenceAdapter() - if(!telepresenceAdapter) { throw new Error(`Neighbourhood ${perspective.sharedUrl} has no Telepresence Adapter.`) } - const payloadExpression = signPerspectiveDeep(payload) - await telepresenceAdapter!.sendBroadcast(payloadExpression) - return true - }, - - //@ts-ignore - perspectiveAdd: async (args, context) => { - checkCapability(context.capabilities, Auth.PERSPECTIVE_CREATE_CAPABILITY) - const { name } = args; - return await core.perspectivesController.add(name) - }, - //@ts-ignore - perspectiveAddLink: async (args, context) => { - let { uuid, link, status } = args - if (status == null) { - status = 'shared' - }; - checkCapability(context.capabilities, Auth.perspectiveUpdateCapability([uuid])) - const perspective = core.perspectivesController.perspective(uuid) - return await perspective.addLink(link, status) - }, - //@ts-ignore - perspectiveAddLinks: async (args, context, info) => { - const { uuid, links, status } = args - checkCapability(context.capabilities, Auth.perspectiveUpdateCapability([uuid])) - const perspective = core.perspectivesController.perspective(uuid) - return await perspective.addLinks(links, status) - }, - //@ts-ignore - perspectiveAddLinkExpression: async (args, context) => { - let { uuid, link, status } = args - if (status == null) { - status = 'shared' - }; - checkCapability(context.capabilities, Auth.perspectiveUpdateCapability([uuid])) - const perspective = core.perspectivesController.perspective(uuid) - return await perspective.addLink(link, status) - }, - //@ts-ignore - perspectiveRemove: async (args, context) => { - const { uuid } = args - checkCapability(context.capabilities, Auth.perspectiveDeleteCapability([uuid])) - let removeStatus = await core.perspectivesController.remove(uuid) - return removeStatus - }, - //@ts-ignore - perspectiveRemoveLink: async (args, context) => { - // console.log("GQL| removeLink:", args) - const { uuid, link } = args - checkCapability(context.capabilities, Auth.perspectiveUpdateCapability([uuid])) - const perspective = core.perspectivesController.perspective(uuid) - await perspective.removeLink(link) - return true - }, - //@ts-ignore - perspectiveRemoveLinks: async (args, context) => { - const { uuid, links } = args - checkCapability(context.capabilities, Auth.perspectiveUpdateCapability([uuid])) - const perspective = core.perspectivesController.perspective(uuid) - return await perspective.removeLinks(links) - }, - //@ts-ignore - perspectiveLinkMutations: async (args, context, info) => { - const { uuid, mutations, status } = args - checkCapability(context.capabilities, Auth.perspectiveUpdateCapability([uuid])) - const perspective = core.perspectivesController.perspective(uuid) - return await perspective.linkMutations(mutations, status) - }, - //@ts-ignore - perspectiveUpdate: async (args, context) => { - const { uuid, name } = args - checkCapability(context.capabilities, Auth.perspectiveUpdateCapability([uuid])) - return await core.perspectivesController.update(uuid, name); - }, - //@ts-ignore - perspectiveUpdateLink: async (args, context) => { - const { uuid, oldLink, newLink } = args - checkCapability(context.capabilities, Auth.perspectiveUpdateCapability([uuid])) - const perspective = core.perspectivesController.perspective(uuid) - return await perspective.updateLink(oldLink, newLink) - }, - //@ts-ignore - perspectiveAddSdna: async (args, context) => { - const { uuid, name, sdnaCode, sdnaType } = args - checkCapability(context.capabilities, Auth.perspectiveUpdateCapability([uuid])) - const perspective = core.perspectivesController.perspective(uuid) - return await perspective.addSdna(name, sdnaCode, sdnaType) - }, - //@ts-ignore runtimeOpenLink: (args) => { const { url } = args console.log("openLinkExtern:", url) @@ -897,13 +512,11 @@ export function createResolvers(core: Ad4mCore, config: OuterConfig) { }, //@ts-ignore runtimeQuit: (context) => { - checkCapability(context.capabilities, Auth.RUNTIME_QUIT_CAPABILITY) process.exit(0) return true }, //@ts-ignore runtimeHcAddAgentInfos: async (args, context) => { - checkCapability(context.capabilities, Auth.RUNTIME_HC_AGENT_INFO_CREATE_CAPABILITY) const { agentInfos } = args //@ts-ignore const parsed = JSON.parse(agentInfos).map(info => { @@ -923,7 +536,6 @@ export function createResolvers(core: Ad4mCore, config: OuterConfig) { //@ts-ignore runtimeSetStatus: async (args, context) => { - checkCapability(context.capabilities, Auth.RUNTIME_MY_STATUS_UPDATE_CAPABILITY) const { status } = args const dmLang = await core.myDirectMessageLanguage() await dmLang.directMessageAdapter!.setStatus(status) @@ -932,7 +544,6 @@ export function createResolvers(core: Ad4mCore, config: OuterConfig) { //@ts-ignore runtimeFriendSendMessage: async (args, context) => { - checkCapability(context.capabilities, Auth.RUNTIME_MESSAGES_CREATE_CAPABILITY) const { did, message } = args if(!core.runtimeService.friends().includes(did)) throw `${did} is not a friend` const dmLang = await core.friendsDirectMessageLanguage(did) diff --git a/executor/src/core/storage-services/Holochain/HolochainService.ts b/executor/src/core/storage-services/Holochain/HolochainService.ts index bb20cc9c8..65ff3c6dc 100644 --- a/executor/src/core/storage-services/Holochain/HolochainService.ts +++ b/executor/src/core/storage-services/Holochain/HolochainService.ts @@ -263,7 +263,7 @@ export default class HolochainService { //4. Call the zome function try { if (fnName != "sync" && fnName != "current_revision") { - console.debug("\x1b[34m", new Date().toISOString(), "HolochainService calling zome function:", dnaNick, zomeName, fnName, payload, "\nFor language with address", lang, "\x1b[0m"); + console.debug("\x1b[34m", new Date().toISOString(), "HolochainService calling zome function:", dnaNick, zomeName, fnName, JSON.stringify(payload), "\nFor language with address", lang, "\x1b[0m"); } let result = await HOLOCHAIN_SERVICE.callZomeFunction(installed_app_id, dnaNick, zomeName, fnName, encode(payload)); diff --git a/executor/src/core/utils.ts b/executor/src/core/utils.ts index 73fcfa122..f6a984e89 100644 --- a/executor/src/core/utils.ts +++ b/executor/src/core/utils.ts @@ -1,3 +1,7 @@ +import { ExceptionType, Expression } from "@coasys/ad4m"; +import * as PubSubDefinitions from './graphQL-interface/SubscriptionDefinitions' +import { ExceptionInfo } from '@coasys/ad4m/lib/src/runtime/RuntimeResolver'; + export function sleep(ms: number) { return new Promise(resolve => setTimeout(resolve, ms)); } @@ -13,4 +17,36 @@ export function getPubSub(): PubSub { } } } +} + +export async function tagExpressionSignatureStatus(expression: Expression) { + if(!expression) throw "tagExpressionSignatureStatus - expression is undefined" + + let verified + + try { + if(typeof expression == "string") expression = JSON.parse(expression) + verified = SIGNATURE.verify(expression) + } catch(e) { + verified = false + } + + if(verified) { + expression.proof.valid = true + expression.proof.invalid = false + } else { + expression.proof.invalid = true + expression.proof.valid = false + + let expressionString = JSON.stringify(expression); + let endingLog = expressionString.length > 50 ? "... \x1b[0m" : "\x1b[0m"; + console.error(new Date().toISOString(),"tagExpressionSignatureStatus - BROKEN SIGNATURE FOR EXPRESSION: (object):", expressionString.substring(0, 50), endingLog) + } +} + +export function removeSignatureTags(e: Expression) { + if(e.proof) { + delete e.proof.valid + delete e.proof.invalid + } } \ No newline at end of file diff --git a/executor/src/jwt_extension.d.ts b/executor/src/jwt_extension.d.ts deleted file mode 100644 index 3ff7b83e1..000000000 --- a/executor/src/jwt_extension.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -declare global { - interface Jwt { - async publish: (topic: String, data: any) => void; - async generateJwt: (issuer, audience, expiration_time, capabililities) => string; - async verifyJwt: (token: String) => {iss: String, aud: String, exp: number, iat: number, capabilities: any} - } - - const JWT: Jwt; -} - -export {}; \ No newline at end of file diff --git a/executor/src/languages_extension.d.ts b/executor/src/languages_extension.d.ts new file mode 100644 index 000000000..60bc4eb26 --- /dev/null +++ b/executor/src/languages_extension.d.ts @@ -0,0 +1,46 @@ +export interface LinkExpression { + author: string; + timestamp: string; + data: Triple; + proof: ExpressionProof; +} + +export interface Triple { + source?: string; + target?: string; + predicate?: string; +} + +export interface ExpressionProof { + key: string; + signature: string; +} + +export interface PerspectiveDiff { + additions: LinkExpression[]; + removals: LinkExpression[]; +} + +export interface PerspectiveExpression { + author: string; + timestamp: string; + data: Perspective; + proof: ExpressionProof; +} + +export interface Perspective { + links: LinkExpression[]; +} + +// PerspectiveState is an enum in Rust, which can be represented as a union type in TypeScript +export type PerspectiveState = 'PRIVATE' | 'NEIGHBOURHOOD_JOIN_INITIATED' | 'LINK_LANGUAGE_FAILED_TO_INSTALL' | 'LINK_LANGUAGE_INSTALLED_BUT_NOT_SYNCED' | 'SYNCED'; + +declare global { + interface RustLanguages { + perspectiveDiffReceived: (diff: PerspectiveDiff, languageAddress: string) => void; + syncStateChanged: (state: PerspectiveState, languageAddress: string) => void; + telepresenceSignalReceived: (signal: PerspectiveExpression, languageAddress: string) => void; + } + + const LANGUAGES: RustLanguages; +} \ No newline at end of file diff --git a/executor/src/signature_extension.d.ts b/executor/src/signature_extension.d.ts new file mode 100644 index 000000000..13632a9b1 --- /dev/null +++ b/executor/src/signature_extension.d.ts @@ -0,0 +1,20 @@ +export interface Expression { + author: string; + timestamp: string; + data: any; + proof: ExpressionProof; +} + +export interface ExpressionProof { + signature: string; + key: string; +} + +declare global { + interface RustSignature { + verifyStringSignedByDid: (did: string, data: string, signedData: string) => boolean; + verify: (expr: Expression) => boolean; + } + + const SIGNATURE: RustSignature; +} \ No newline at end of file diff --git a/executor/src/wallet_extension.d.ts b/executor/src/wallet_extension.d.ts index f62148516..94c73bd42 100644 --- a/executor/src/wallet_extension.d.ts +++ b/executor/src/wallet_extension.d.ts @@ -70,7 +70,6 @@ declare global { export: () => String; load: (data: String) => void; sign: (payload: Uint8Array) => Uint8Array; - verify: (did: String, message: Uint8Array, signature: Uint8Array) => boolean; } const WALLET: RustWallet; diff --git a/package.json b/package.json index 0df7e95da..8942465e1 100644 --- a/package.json +++ b/package.json @@ -11,13 +11,17 @@ "tests/js", "rust-executor", "cli", - "dapp" + "dapp", + "ad4m-hooks/react", + "ad4m-hooks/vue", + "ad4m-hooks/helpers" ], "private": true, "scripts": { "build": "turbo run build-languages --concurrency=1 && turbo run build-libs", "build-no-cache": "turbo run build-languages --concurrency=1 --force && turbo run build-libs --force", "build-libs": "turbo run build-libs", + "build-core-executor": "turbo run build-core-executor", "dev": "turbo run dev --parallel", "serve": "turbo run serve", "lint": "turbo run lint", @@ -56,6 +60,9 @@ "engines": { "node": ">=16.0.0" }, + "nohoist": [ + "core" + ], "packageManager": "pnpm@8.10.5", "pnpm": { "patchedDependencies": { @@ -65,11 +72,8 @@ "borc@2.1.2": "patches/borc@2.1.2.patch", "brorand@1.1.0": "patches/brorand@1.1.0.patch", "graphql@15.7.2": "patches/graphql@15.7.2.patch", - "inherits@2.0.4": "patches/inherits@2.0.4.patch", "iso-url@0.4.7": "patches/iso-url@0.4.7.patch", "sha256@0.2.0": "patches/sha256@0.2.0.patch", - "node-gyp-build@4.7.0": "patches/node-gyp-build@4.7.0.patch", - "@peculiar/webcrypto@1.4.3": "patches/@peculiar__webcrypto@1.4.3.patch", "@stablelib/random@1.0.2": "patches/@stablelib__random@1.0.2.patch", "@transmute/did-key-bls12381@0.2.1-unstable.42": "patches/@transmute__did-key-bls12381@0.2.1-unstable.42.patch", "@transmute/did-key-cipher@0.2.1-unstable.42": "patches/@transmute__did-key-cipher@0.2.1-unstable.42.patch", @@ -81,8 +85,13 @@ "@transmute/did-key.js@0.2.1-unstable.42": "patches/@transmute__did-key.js@0.2.1-unstable.42.patch", "@transmute/ld-key-pair@0.6.1-unstable.37": "patches/@transmute__ld-key-pair@0.6.1-unstable.37.patch", "@transmute/web-crypto-key-pair@0.6.1-unstable.37": "patches/@transmute__web-crypto-key-pair@0.6.1-unstable.37.patch", - "tweetnacl@1.0.3": "patches/tweetnacl@1.0.3.patch" + "tweetnacl@1.0.3": "patches/tweetnacl@1.0.3.patch", + "@mattrglobal/node-bbs-signatures@0.11.0": "patches/@mattrglobal__node-bbs-signatures@0.11.0.patch", + "node-gyp-build@4.8.0": "patches/node-gyp-build@4.8.0.patch", + "@peculiar/webcrypto@1.4.5": "patches/@peculiar__webcrypto@1.4.5.patch", + "safe-buffer@5.2.1": "patches/safe-buffer@5.2.1.patch", + "safer-buffer@2.1.2": "patches/safer-buffer@2.1.2.patch" } }, - "version": "0.8.1" + "version": "0.9.0" } diff --git a/patches/@mattrglobal__node-bbs-signatures@0.11.0.patch b/patches/@mattrglobal__node-bbs-signatures@0.11.0.patch new file mode 100644 index 000000000..ba6d1dc11 --- /dev/null +++ b/patches/@mattrglobal__node-bbs-signatures@0.11.0.patch @@ -0,0 +1,42 @@ +diff --git a/CHANGELOG.md b/CHANGELOG.md +deleted file mode 100644 +index 559b8418cf48dc9281b539bcc6b74969b80964f3..0000000000000000000000000000000000000000 +diff --git a/lib/bbsSignature.js b/lib/bbsSignature.js +index 165b67d5bcf10ab920e61f9234ea883b4f7b6fda..5e8712b55b3e67f2db1b5a9af55324b2ee45e29d 100644 +--- a/lib/bbsSignature.js ++++ b/lib/bbsSignature.js +@@ -54,7 +54,7 @@ var bls12381toBbs_1 = require("./bls12381toBbs"); + * @ignore + */ + // eslint-disable-next-line @typescript-eslint/no-var-requires +-var path = require("path"); ++import path from "node:path" + // eslint-disable-next-line @typescript-eslint/no-var-requires + var bbs = require(path.resolve(path.join(__dirname, "../native/index.node"))); + /** +diff --git a/lib/bls12381.js b/lib/bls12381.js +index d216914596a056173ad393a1aaebf65076ac8a4f..c8bf836873e6a6a6592b4266544f417067927727 100644 +--- a/lib/bls12381.js ++++ b/lib/bls12381.js +@@ -53,7 +53,7 @@ exports.generateBlindedBls12381G2KeyPair = exports.generateBls12381G2KeyPair = e + * @ignore + */ + // eslint-disable-next-line @typescript-eslint/no-var-requires +-var path = require("path"); ++import path from "node:path" + // eslint-disable-next-line @typescript-eslint/no-var-requires + var bbs = require(path.resolve(path.join(__dirname, "../native/index.node"))); + /** +diff --git a/lib/bls12381toBbs.js b/lib/bls12381toBbs.js +index 9293a30e10871aa1292e8f38f49bb43ac5b3a6e7..48ac33d7d70ab7926325ed1203163dd9beea2e5a 100644 +--- a/lib/bls12381toBbs.js ++++ b/lib/bls12381toBbs.js +@@ -53,7 +53,7 @@ exports.bls12381toBbs = void 0; + * @ignore + */ + // eslint-disable-next-line @typescript-eslint/no-var-requires +-var path = require("path"); ++import path from "node:path" + // eslint-disable-next-line @typescript-eslint/no-var-requires + var bbs = require(path.resolve(path.join(__dirname, "../native/index.node"))); + /** diff --git a/patches/@peculiar__webcrypto@1.4.5.patch b/patches/@peculiar__webcrypto@1.4.5.patch new file mode 100644 index 000000000..9e43e21d2 --- /dev/null +++ b/patches/@peculiar__webcrypto@1.4.5.patch @@ -0,0 +1,17 @@ +diff --git a/build/webcrypto.js b/build/webcrypto.js +index dba6ca12d8b00276533c94b13c9387f33ab2715b..142a5e9d211a9368bbefeb588c5e926c72728423 100644 +--- a/build/webcrypto.js ++++ b/build/webcrypto.js +@@ -5,9 +5,9 @@ + 'use strict'; + + var core = require('webcrypto-core'); +-var buffer = require('buffer'); +-var crypto = require('crypto'); +-var process = require('process'); ++import crypto from 'node:crypto'; ++import process from 'node:process'; ++import buffer from 'node:buffer'; + var tslib = require('tslib'); + var jsonSchema = require('@peculiar/json-schema'); + var pvtsutils = require('pvtsutils'); diff --git a/patches/inherits@2.0.4.patch b/patches/inherits@2.0.4.patch deleted file mode 100644 index 1c988ee31..000000000 --- a/patches/inherits@2.0.4.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff --git a/inherits.js b/inherits.js -index f71f2d93294a67ad5d9300aae07973e259f26068..c973372c5ffebb244d24b9f773d14d76774438bf 100644 ---- a/inherits.js -+++ b/inherits.js -@@ -1,5 +1,5 @@ - try { -- var util = require('util'); -+ var util = require('node:util'); - /* istanbul ignore next */ - if (typeof util.inherits !== 'function') throw ''; - module.exports = util.inherits; diff --git a/patches/node-gyp-build@4.7.0.patch b/patches/node-gyp-build@4.7.0.patch index 1af065294..d0efb27b5 100644 --- a/patches/node-gyp-build@4.7.0.patch +++ b/patches/node-gyp-build@4.7.0.patch @@ -1,14 +1,14 @@ diff --git a/node-gyp-build.js b/node-gyp-build.js -index 61b398efcbf3d504a8a2f8ecfdf1c21481cc3243..73b5fead993f1f55475f9da69447bec011d79d3c 100644 +index 61b398efcbf3d504a8a2f8ecfdf1c21481cc3243..602cce41bb105890126bb3384bc64a4fce3805b6 100644 --- a/node-gyp-build.js +++ b/node-gyp-build.js @@ -1,6 +1,6 @@ -var fs = require('fs') -var path = require('path') -var os = require('os') -+var fs = require('node:fs') -+var path = require('node:path') -+var os = require('node:os') ++import fs from 'node:fs' ++import path from 'node:path' ++import os from 'node:os' // Workaround to fix webpack's build warnings: 'the request of a dependency is an expression' var runtimeRequire = typeof __webpack_require__ === 'function' ? __non_webpack_require__ : require // eslint-disable-line diff --git a/patches/node-gyp-build@4.8.0.patch b/patches/node-gyp-build@4.8.0.patch new file mode 100644 index 000000000..4fea3485e --- /dev/null +++ b/patches/node-gyp-build@4.8.0.patch @@ -0,0 +1,15 @@ +diff --git a/node-gyp-build.js b/node-gyp-build.js +index 76b96e107474cdd79394262b65ac286db36353e8..152e090ba03b36dbbe4d6b2ffe91a34664d23cfd 100644 +--- a/node-gyp-build.js ++++ b/node-gyp-build.js +@@ -1,7 +1,6 @@ +-var fs = require('fs') +-var path = require('path') +-var os = require('os') +- ++import fs from 'node:fs' ++import path from 'node:path' ++import os from 'node:os' + // Workaround to fix webpack's build warnings: 'the request of a dependency is an expression' + var runtimeRequire = typeof __webpack_require__ === 'function' ? __non_webpack_require__ : require // eslint-disable-line + diff --git a/patches/safe-buffer@5.2.1.patch b/patches/safe-buffer@5.2.1.patch new file mode 100644 index 000000000..bebebe6c3 --- /dev/null +++ b/patches/safe-buffer@5.2.1.patch @@ -0,0 +1,12 @@ +diff --git a/index.js b/index.js +index f8d3ec98852f449b44b7d89fc82bae737c69f3fc..57363e84b27073499c987e7a01f05c8a0034c4f2 100644 +--- a/index.js ++++ b/index.js +@@ -1,6 +1,6 @@ + /*! safe-buffer. MIT License. Feross Aboukhadijeh */ + /* eslint-disable node/no-deprecated-api */ +-var buffer = require('buffer') ++import buffer from 'node:buffer' + var Buffer = buffer.Buffer + + // alternative to using Object.keys for old browsers diff --git a/patches/safer-buffer@2.1.2.patch b/patches/safer-buffer@2.1.2.patch new file mode 100644 index 000000000..d21583af2 --- /dev/null +++ b/patches/safer-buffer@2.1.2.patch @@ -0,0 +1,13 @@ +diff --git a/safer.js b/safer.js +index 37c7e1aa6cbd4effd94ee28bd7b0655756b80cea..c2a303b058b0029f74b467cb59c8aa7ac79bf58f 100644 +--- a/safer.js ++++ b/safer.js +@@ -2,7 +2,7 @@ + + 'use strict' + +-var buffer = require('buffer') ++import buffer from 'node:buffer' + var Buffer = buffer.Buffer + + var safer = {} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 61dd24050..bb0301a0d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,9 +8,12 @@ patchedDependencies: '@mattrglobal/bbs-signatures@0.5.0': hash: i6f4fdawxlwk2ulgcpjpsixrei path: patches/@mattrglobal__bbs-signatures@0.5.0.patch - '@peculiar/webcrypto@1.4.3': - hash: bbuork7btorjpwgh5cqtzopbca - path: patches/@peculiar__webcrypto@1.4.3.patch + '@mattrglobal/node-bbs-signatures@0.11.0': + hash: du3euicl4oreiseb3vykbrzjji + path: patches/@mattrglobal__node-bbs-signatures@0.11.0.patch + '@peculiar/webcrypto@1.4.5': + hash: saeohqf4hlpnnys7brc6umjxqq + path: patches/@peculiar__webcrypto@1.4.5.patch '@stablelib/random@1.0.2': hash: h7p5ew3cy6mtkpd6srifcp63w4 path: patches/@stablelib__random@1.0.2.patch @@ -59,15 +62,18 @@ patchedDependencies: graphql@15.7.2: hash: nr4gprddtjag7fz5nm4wirqs4q path: patches/graphql@15.7.2.patch - inherits@2.0.4: - hash: lyosn3d6q23lonbrmrh72z5hl4 - path: patches/inherits@2.0.4.patch iso-url@0.4.7: hash: 436asxcee6selccg7sdh7lg6f4 path: patches/iso-url@0.4.7.patch - node-gyp-build@4.7.0: - hash: 2d5zv4cuxtybogr2ggxm6rv25y - path: patches/node-gyp-build@4.7.0.patch + node-gyp-build@4.8.0: + hash: tidq6bjknpovdjep75bj5ccgke + path: patches/node-gyp-build@4.8.0.patch + safe-buffer@5.2.1: + hash: qcepvj3ww73f2shgrehxggbrbq + path: patches/safe-buffer@5.2.1.patch + safer-buffer@2.1.2: + hash: sdxbjiwrw3yiqjkfb6uxghzoza + path: patches/safer-buffer@2.1.2.patch sha256@0.2.0: hash: jjvpbxfwv27brspghlwzrzih2u path: patches/sha256@0.2.0.patch @@ -81,22 +87,70 @@ importers: devDependencies: '@changesets/cli': specifier: ^2.25.2 - version: 2.26.2 + version: 2.27.1 eslint-config-custom: specifier: '*' - version: 0.0.0(eslint@8.54.0)(typescript@4.9.5) + version: 0.0.0(eslint@8.57.0)(typescript@4.9.5) patch-package: specifier: ^6.5.0 version: 6.5.1 prettier: specifier: latest - version: 3.1.0 + version: 3.2.4 readline-sync: specifier: 1.4.10 version: 1.4.10 turbo: specifier: latest - version: 1.10.16 + version: 1.11.3 + + ad4m-hooks/helpers: + dependencies: + '@coasys/ad4m': + specifier: '*' + version: link:../../core + '@coasys/ad4m-connect': + specifier: '*' + version: link:../../connect + uuid: + specifier: '*' + version: 9.0.1 + + ad4m-hooks/react: + dependencies: + '@coasys/ad4m': + specifier: '*' + version: link:../../core + '@coasys/ad4m-connect': + specifier: '*' + version: link:../../connect + '@coasys/hooks-helpers': + specifier: '*' + version: 0.9.0(esbuild@0.15.18)(react@18.2.0) + '@types/react': + specifier: ^18.2.55 + version: 18.2.55 + '@types/react-dom': + specifier: ^18.2.19 + version: 18.2.19 + preact: + specifier: '*' + version: 10.19.3 + react: + specifier: '*' + version: 18.2.0 + + ad4m-hooks/vue: + dependencies: + '@coasys/ad4m': + specifier: '*' + version: link:../../core + '@coasys/hooks-helpers': + specifier: '*' + version: 0.9.0(esbuild@0.15.18)(react@18.2.0) + vue: + specifier: ^3.2.47 + version: 3.4.19(typescript@4.9.5) bootstrap-languages/agent-language: dependencies: @@ -108,7 +162,7 @@ importers: version: 2.3.0 postcss: specifier: ^8.2.1 - version: 8.4.31 + version: 8.4.33 devDependencies: '@coasys/ad4m': specifier: '*' @@ -127,7 +181,7 @@ importers: version: 8.4.0(rollup@2.79.1) '@rollup/plugin-typescript': specifier: ^11.1.0 - version: 11.1.5(rollup@2.79.1)(tslib@2.6.2)(typescript@4.9.5) + version: 11.1.6(rollup@2.79.1)(tslib@2.6.2)(typescript@4.9.5) '@tsconfig/svelte': specifier: ^1.0.0 version: 1.0.13 @@ -139,7 +193,7 @@ importers: version: 2.79.1 rollup-plugin-postcss: specifier: ^4.0.0 - version: 4.0.2(postcss@8.4.31) + version: 4.0.2(postcss@8.4.33) rollup-plugin-string: specifier: ^3.0.0 version: 3.0.0 @@ -157,10 +211,10 @@ importers: version: 3.59.2 svelte-check: specifier: ^1.0.0 - version: 1.6.0(postcss@8.4.31)(svelte@3.59.2) + version: 1.6.0(postcss@8.4.33)(svelte@3.59.2) svelte-preprocess: specifier: ^4.0.0 - version: 4.10.7(postcss@8.4.31)(svelte@3.59.2)(typescript@4.9.5) + version: 4.10.7(postcss@8.4.33)(svelte@3.59.2)(typescript@4.9.5) tslib: specifier: ^2.0.0 version: 2.6.2 @@ -181,7 +235,7 @@ importers: version: 2.3.0 postcss: specifier: ^8.2.1 - version: 8.4.31 + version: 8.4.33 devDependencies: '@coasys/ad4m': specifier: '*' @@ -200,7 +254,7 @@ importers: version: 8.4.0(rollup@2.79.1) '@rollup/plugin-typescript': specifier: ^11.1.0 - version: 11.1.5(rollup@2.79.1)(tslib@2.6.2)(typescript@4.9.5) + version: 11.1.6(rollup@2.79.1)(tslib@2.6.2)(typescript@4.9.5) '@tsconfig/svelte': specifier: ^1.0.0 version: 1.0.13 @@ -212,7 +266,7 @@ importers: version: 2.79.1 rollup-plugin-postcss: specifier: ^4.0.0 - version: 4.0.2(postcss@8.4.31) + version: 4.0.2(postcss@8.4.33) rollup-plugin-string: specifier: ^3.0.0 version: 3.0.0 @@ -230,10 +284,10 @@ importers: version: 3.59.2 svelte-check: specifier: ^1.0.0 - version: 1.6.0(postcss@8.4.31)(svelte@3.59.2) + version: 1.6.0(postcss@8.4.33)(svelte@3.59.2) svelte-preprocess: specifier: ^4.0.0 - version: 4.10.7(postcss@8.4.31)(svelte@3.59.2)(typescript@4.9.5) + version: 4.10.7(postcss@8.4.33)(svelte@3.59.2)(typescript@4.9.5) tslib: specifier: ^2.0.0 version: 2.6.2 @@ -295,10 +349,10 @@ importers: version: 3.59.2 svelte-check: specifier: ^1.0.0 - version: 1.6.0(postcss@8.4.31)(svelte@3.59.2) + version: 1.6.0(postcss@8.4.33)(svelte@3.59.2) svelte-preprocess: specifier: ^4.0.0 - version: 4.10.7(postcss@8.4.31)(svelte@3.59.2)(typescript@4.9.5) + version: 4.10.7(postcss@8.4.33)(svelte@3.59.2)(typescript@4.9.5) tslib: specifier: ^2.0.0 version: 2.6.2 @@ -429,10 +483,10 @@ importers: version: 3.59.2 svelte-check: specifier: ^1.0.0 - version: 1.6.0(postcss@8.4.31)(svelte@3.59.2) + version: 1.6.0(postcss@8.4.33)(svelte@3.59.2) svelte-preprocess: specifier: ^4.0.0 - version: 4.10.7(postcss@8.4.31)(svelte@3.59.2)(typescript@4.9.5) + version: 4.10.7(postcss@8.4.33)(svelte@3.59.2)(typescript@4.9.5) tslib: specifier: ^2.0.0 version: 2.6.2 @@ -496,10 +550,10 @@ importers: version: 3.59.2 svelte-check: specifier: ^1.0.0 - version: 1.6.0(postcss@8.4.31)(svelte@3.59.2) + version: 1.6.0(postcss@8.4.33)(svelte@3.59.2) svelte-preprocess: specifier: ^4.0.0 - version: 4.10.7(postcss@8.4.31)(svelte@3.59.2)(typescript@4.9.5) + version: 4.10.7(postcss@8.4.33)(svelte@3.59.2)(typescript@4.9.5) tslib: specifier: ^2.0.0 version: 2.6.2 @@ -560,10 +614,10 @@ importers: version: 3.59.2 svelte-check: specifier: ^1.0.0 - version: 1.6.0(postcss@8.4.31)(svelte@3.59.2) + version: 1.6.0(postcss@8.4.33)(svelte@3.59.2) svelte-preprocess: specifier: ^4.0.0 - version: 4.10.7(postcss@8.4.31)(svelte@3.59.2)(typescript@4.9.5) + version: 4.10.7(postcss@8.4.33)(svelte@3.59.2)(typescript@4.9.5) tslib: specifier: ^2.0.0 version: 2.6.2 @@ -615,10 +669,10 @@ importers: version: 3.59.2 svelte-check: specifier: ^1.0.0 - version: 1.6.0(postcss@8.4.31)(svelte@3.59.2) + version: 1.6.0(postcss@8.4.33)(svelte@3.59.2) svelte-preprocess: specifier: ^4.0.0 - version: 4.10.7(postcss@8.4.31)(svelte@3.59.2)(typescript@4.9.5) + version: 4.10.7(postcss@8.4.33)(svelte@3.59.2)(typescript@4.9.5) tslib: specifier: ^2.0.0 version: 2.6.2 @@ -667,7 +721,7 @@ importers: version: link:../core '@types/node': specifier: ^16.11.11 - version: 16.18.64 + version: 16.18.76 esbuild: specifier: ^0.15.5 version: 0.15.18 @@ -688,7 +742,7 @@ importers: version: 4.9.5 vite: specifier: ^4.1.1 - version: 4.5.0(@types/node@16.18.64) + version: 4.5.2(@types/node@16.18.76) core: dependencies: @@ -712,14 +766,14 @@ importers: version: 15.7.2(patch_hash=nr4gprddtjag7fz5nm4wirqs4q) reflect-metadata: specifier: ^0.1.13 - version: 0.1.13 + version: 0.1.14 type-graphql: specifier: 1.1.1 version: 1.1.1(class-validator@0.13.2)(graphql@15.7.2) devDependencies: '@apollo/server': specifier: ^4.9.4 - version: 4.9.5(graphql@15.7.2) + version: 4.10.0(graphql@15.7.2) '@rollup/plugin-alias': specifier: ^3.1.5 version: 3.1.9(rollup@2.79.1) @@ -729,6 +783,12 @@ importers: '@rollup/plugin-node-resolve': specifier: ^13.0.4 version: 13.3.0(rollup@2.79.1) + '@types/node': + specifier: '*' + version: 16.18.76 + '@types/yargs': + specifier: '*' + version: 17.0.32 concat-md: specifier: ^0.5.0 version: 0.5.1 @@ -770,16 +830,16 @@ importers: version: link:../connect '@types/node': specifier: ^16.7.13 - version: 16.18.64 + version: 16.18.76 '@types/react': specifier: ^18.0.0 - version: 18.2.38 + version: 18.2.48 '@types/react-dom': specifier: ^18.0.0 - version: 18.2.17 + version: 18.2.18 '@wagmi/core': specifier: ^1.4.7 - version: 1.4.7(@types/react@18.2.38)(react@18.2.0)(typescript@5.3.2)(viem@1.19.7) + version: 1.4.13(@types/react@18.2.48)(react@18.2.0)(typescript@5.3.3)(viem@1.21.4) react: specifier: ^18.2.0 version: 18.2.0 @@ -788,23 +848,23 @@ importers: version: 18.2.0(react@18.2.0) typescript: specifier: ^5.2.2 - version: 5.3.2 + version: 5.3.3 viem: specifier: ^1.19.5 - version: 1.19.7(typescript@5.3.2) + version: 1.21.4(typescript@5.3.3) wagmi: specifier: ^1.4.7 - version: 1.4.7(@types/react@18.2.38)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2)(viem@1.19.7) + version: 1.4.13(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3)(viem@1.21.4) web-vitals: specifier: ^2.1.0 version: 2.1.4 devDependencies: '@vitejs/plugin-react': specifier: ^4.2.0 - version: 4.2.0(vite@5.0.2) + version: 4.2.1(vite@5.0.12) vite: specifier: ^5.0.0 - version: 5.0.2(@types/node@16.18.64) + version: 5.0.12(@types/node@16.18.76) docs: dependencies: @@ -874,7 +934,7 @@ importers: version: 4.1.0 json-stable-stringify: specifier: ^1.0.1 - version: 1.1.0 + version: 1.1.1 linkedom: specifier: ^0.14.26 version: 0.14.26 @@ -914,13 +974,13 @@ importers: version: 0.2.2 '@types/sinon': specifier: '*' - version: 17.0.2 + version: 17.0.3 '@types/uuid': specifier: ^8.3.1 version: 8.3.4 chai: specifier: '*' - version: 4.3.10 + version: 5.0.3 faker: specifier: ^5.1.0 version: 5.5.3 @@ -954,13 +1014,13 @@ importers: devDependencies: '@apollo/client': specifier: 3.7.10 - version: 3.7.10(graphql-ws@5.14.2)(graphql@15.7.2)(react@17.0.2) + version: 3.7.10(graphql-ws@5.14.3)(graphql@15.7.2)(react@17.0.2) '@coasys/ad4m': specifier: link:../../core version: link:../../core '@peculiar/webcrypto': specifier: ^1.1.7 - version: 1.4.3(patch_hash=bbuork7btorjpwgh5cqtzopbca) + version: 1.4.5(patch_hash=saeohqf4hlpnnys7brc6umjxqq) '@types/chai': specifier: '*' version: 4.3.11 @@ -993,10 +1053,10 @@ importers: version: 14.18.63 '@types/node-fetch': specifier: ^2.5.11 - version: 2.6.9 + version: 2.6.11 '@types/sinon': specifier: '*' - version: 17.0.2 + version: 17.0.3 '@types/uuid': specifier: ^8.3.0 version: 8.3.4 @@ -1005,10 +1065,10 @@ importers: version: 7.4.7 chai: specifier: '*' - version: 4.3.10 + version: 5.0.3 chai-as-promised: specifier: '*' - version: 7.1.1(chai@4.3.10) + version: 7.1.1(chai@5.0.3) faker: specifier: ^5.1.0 version: 5.5.3 @@ -1017,10 +1077,10 @@ importers: version: 11.2.0 graphql-ws: specifier: ^5.14.2 - version: 5.14.2(graphql@15.7.2) + version: 5.14.3(graphql@15.7.2) json-stable-stringify: specifier: ^1.1.0 - version: 1.1.0 + version: 1.1.1 kill-process-by-name: specifier: ^1.0.5 version: 1.0.5 @@ -1071,10 +1131,10 @@ importers: version: 0.5.5 '@preact/preset-vite': specifier: ^2.4.0 - version: 2.7.0(@babel/core@7.23.3)(preact@10.19.2)(vite@4.5.0) + version: 2.8.1(@babel/core@7.24.3)(preact@10.19.3)(vite@4.5.2) '@tauri-apps/api': - specifier: ^1.4.0 - version: 1.5.1 + specifier: ^1.5.3 + version: 1.5.3 apollo-boost: specifier: ^0.4.9 version: 0.4.9(graphql@15.7.2) @@ -1089,10 +1149,10 @@ importers: version: 3.3.7 preact: specifier: ^10.11.3 - version: 10.19.2 + version: 10.19.3 preact-compat: specifier: ^3.19.0 - version: 3.19.0(preact@10.19.2) + version: 3.19.0(preact@10.19.3) react: specifier: ^18.2.0 version: 18.2.0 @@ -1104,10 +1164,10 @@ importers: version: 2.0.12(react@18.2.0) react-router-dom: specifier: ^6.3.0 - version: 6.20.0(react-dom@18.2.0)(react@18.2.0) + version: 6.21.3(react-dom@18.2.0)(react@18.2.0) react-scripts: specifier: ^5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.23.3)(@babel/plugin-transform-react-jsx@7.23.4)(eslint@8.54.0)(react@18.2.0)(typescript@4.9.5) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.1)(@babel/plugin-transform-react-jsx@7.23.4)(eslint@8.57.0)(react@18.2.0)(typescript@4.9.5) typescript: specifier: ^4.6.2 version: 4.9.5 @@ -1117,10 +1177,10 @@ importers: devDependencies: '@prefresh/vite': specifier: ^2.2.9 - version: 2.4.4(preact@10.19.2)(vite@4.5.0) + version: 2.4.5(preact@10.19.3)(vite@4.5.2) '@tauri-apps/cli': - specifier: 1.4.0 - version: 1.4.0 + specifier: 1.5.11 + version: 1.5.11 '@testing-library/jest-dom': specifier: ^5.16.2 version: 5.17.0 @@ -1129,7 +1189,7 @@ importers: version: 12.1.5(react-dom@18.2.0)(react@18.2.0) '@testing-library/user-event': specifier: ^13.5.0 - version: 13.5.0(@testing-library/dom@9.3.3) + version: 13.5.0(@testing-library/dom@9.3.4) '@types/jest': specifier: ^27.4.1 version: 27.5.2 @@ -1138,10 +1198,10 @@ importers: version: 18.11.10 '@types/react': specifier: ^17.0.40 - version: 17.0.71 + version: 17.0.75 '@types/react-dom': specifier: ^18.0.9 - version: 18.2.17 + version: 18.2.18 '@vitejs/plugin-react-refresh': specifier: ^1.3.6 version: 1.3.6 @@ -1159,7 +1219,7 @@ importers: version: 1.1.6 vite: specifier: ^4.0.1 - version: 4.5.0(@types/node@18.11.10) + version: 4.5.2(@types/node@18.11.10) packages: @@ -1167,8 +1227,8 @@ packages: resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} - /@adobe/css-tools@4.3.1: - resolution: {integrity: sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg==} + /@adobe/css-tools@4.3.3: + resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} dev: true /@adraffy/ens-normalize@1.10.0: @@ -1184,7 +1244,14 @@ packages: engines: {node: '>=6.0.0'} dependencies: '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/trace-mapping': 0.3.22 + + /@ampproject/remapping@2.3.0: + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 /@apideck/better-ajv-errors@0.3.6(ajv@8.12.0): resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} @@ -1241,7 +1308,7 @@ packages: tslib: 2.6.2 zen-observable-ts: 1.2.5 - /@apollo/client@3.7.10(graphql-ws@5.14.2)(graphql@15.7.2)(react@17.0.2): + /@apollo/client@3.7.10(graphql-ws@5.14.3)(graphql@15.7.2)(react@17.0.2): resolution: {integrity: sha512-/k1MfrqPKYiPNdHcOzdxg9cEx96vhAGxAcSorzfBvV29XtFQcYW2cPNQOTjK/fpSMtqVo8UNmu5vwQAWD1gfCg==} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 @@ -1265,7 +1332,7 @@ packages: '@wry/trie': 0.3.2 graphql: 15.7.2(patch_hash=nr4gprddtjag7fz5nm4wirqs4q) graphql-tag: 2.12.6(graphql@15.7.2) - graphql-ws: 5.14.2(graphql@15.7.2) + graphql-ws: 5.14.3(graphql@15.7.2) hoist-non-react-statics: 3.3.2 optimism: 0.16.2 prop-types: 15.8.1 @@ -1308,8 +1375,8 @@ packages: graphql: 15.7.2(patch_hash=nr4gprddtjag7fz5nm4wirqs4q) dev: true - /@apollo/server@4.9.5(graphql@15.7.2): - resolution: {integrity: sha512-eDBfArYbZaTm1AGa82M1aL7lOscVhnZsH85+OWmHMIR98qntzEjNpWpQPYDTru63Qxs4kHcY29NUx/kMGZfGEA==} + /@apollo/server@4.10.0(graphql@15.7.2): + resolution: {integrity: sha512-pLx//lZ/pvUfWL9G8Np8+y3ujc0pYc8U7dwD6ztt9FAw8NmCPzPaDzlXLBAjGU6WnkqVBOnz8b3dOwRNjLYSUA==} engines: {node: '>=14.16.0'} peerDependencies: graphql: ^16.6.0 @@ -1327,14 +1394,13 @@ packages: '@graphql-tools/schema': 9.0.19(graphql@15.7.2) '@josephg/resolvable': 1.0.1 '@types/express': 4.17.21 - '@types/express-serve-static-core': 4.17.41 - '@types/node-fetch': 2.6.9 + '@types/express-serve-static-core': 4.17.42 + '@types/node-fetch': 2.6.11 async-retry: 1.3.3 - body-parser: 1.20.2 cors: 2.8.5 express: 4.18.2 graphql: 15.7.2(patch_hash=nr4gprddtjag7fz5nm4wirqs4q) - loglevel: 1.8.1 + loglevel: 1.9.1 lru-cache: 7.18.3 negotiator: 0.6.3 node-abort-controller: 3.1.1 @@ -1468,31 +1534,38 @@ packages: unxhr: 1.0.1 dev: true - /@babel/code-frame@7.23.4: - resolution: {integrity: sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==} + /@babel/code-frame@7.23.5: + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.23.4 chalk: 2.4.2 - /@babel/compat-data@7.23.3: - resolution: {integrity: sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==} + /@babel/code-frame@7.24.2: + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.24.2 + picocolors: 1.0.0 + + /@babel/compat-data@7.23.5: + resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} engines: {node: '>=6.9.0'} - /@babel/core@7.23.3: - resolution: {integrity: sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==} + /@babel/core@7.23.9: + resolution: {integrity: sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.23.4 - '@babel/generator': 7.23.4 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.3) - '@babel/helpers': 7.23.4 - '@babel/parser': 7.23.4 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.4 - '@babel/types': 7.23.4 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) + '@babel/helpers': 7.23.9 + '@babel/parser': 7.23.9 + '@babel/template': 7.23.9 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 convert-source-map: 2.0.0 debug: 4.3.4(supports-color@8.1.1) gensync: 1.0.0-beta.2 @@ -1501,85 +1574,116 @@ packages: transitivePeerDependencies: - supports-color - /@babel/eslint-parser@7.23.3(@babel/core@7.23.3)(eslint@8.54.0): - resolution: {integrity: sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw==} + /@babel/core@7.24.3: + resolution: {integrity: sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.1 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) + '@babel/helpers': 7.24.1 + '@babel/parser': 7.24.1 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + convert-source-map: 2.0.0 + debug: 4.3.4(supports-color@8.1.1) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /@babel/eslint-parser@7.23.9(@babel/core@7.23.9)(eslint@8.57.0): + resolution: {integrity: sha512-xPndlO7qxiJbn0ATvfXQBjCS7qApc9xmKHArgI/FTEFxXas5dnjC/VqM37lfZun9dclRYcn+YQAr6uDFy0bB2g==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: '@babel/core': ^7.11.0 eslint: ^7.5.0 || ^8.0.0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 8.54.0 + eslint: 8.57.0 eslint-visitor-keys: 2.1.0 semver: 6.3.1 - /@babel/generator@7.23.4: - resolution: {integrity: sha512-esuS49Cga3HcThFNebGhlgsrVLkvhqvYDTzgjfFFlHJcIfLe5jFmRRfCQ1KuBfc4Jrtn3ndLgKWAKjBE+IraYQ==} + /@babel/generator@7.23.6: + resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.9 '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/trace-mapping': 0.3.22 + jsesc: 2.5.2 + + /@babel/generator@7.24.1: + resolution: {integrity: sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 /@babel/helper-annotate-as-pure@7.22.5: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.9 /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.9 - /@babel/helper-compilation-targets@7.22.15: - resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + /@babel/helper-compilation-targets@7.23.6: + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.23.3 - '@babel/helper-validator-option': 7.22.15 - browserslist: 4.22.1 + '@babel/compat-data': 7.23.5 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.22.2 lru-cache: 5.1.1 semver: 6.3.1 - /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.23.3): - resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} + /@babel/helper-create-class-features-plugin@7.23.9(@babel/core@7.23.9): + resolution: {integrity: sha512-B2L9neXTIyPQoXDm+NtovPvG6VOLWnaXu3BIeVDWwdKFgG30oNa6CqVGiJPDWQwIAK49t9gnQI9c6K6RzabiKw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.3) + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.9) '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 semver: 6.3.1 - /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.3): + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.9): resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 regexpu-core: 5.3.2 semver: 6.3.1 - /@babel/helper-define-polyfill-provider@0.4.3(@babel/core@7.23.3): - resolution: {integrity: sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==} + /@babel/helper-define-polyfill-provider@0.5.0(@babel/core@7.23.9): + resolution: {integrity: sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.23.3 - '@babel/helper-compilation-targets': 7.22.15 + '@babel/core': 7.23.9 + '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 debug: 4.3.4(supports-color@8.1.1) lodash.debounce: 4.0.8 @@ -1595,34 +1699,47 @@ packages: resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.4 + '@babel/template': 7.23.9 + '@babel/types': 7.23.9 /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.9 /@babel/helper-member-expression-to-functions@7.23.0: resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.9 /@babel/helper-module-imports@7.22.15: resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.9 + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.9): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 - /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.3): + /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.3): resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.24.3 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-module-imports': 7.22.15 '@babel/helper-simple-access': 7.22.5 @@ -1633,30 +1750,34 @@ packages: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.9 /@babel/helper-plugin-utils@7.22.5: resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} engines: {node: '>=6.9.0'} - /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.3): + /@babel/helper-plugin-utils@7.24.0: + resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} + engines: {node: '>=6.9.0'} + + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.9): resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-wrap-function': 7.22.20 - /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.3): + /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.9): resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 @@ -1665,30 +1786,34 @@ packages: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.9 /@babel/helper-skip-transparent-expression-wrappers@7.22.5: resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.9 /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.9 /@babel/helper-string-parser@7.23.4: resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} engines: {node: '>=6.9.0'} + /@babel/helper-string-parser@7.24.1: + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + engines: {node: '>=6.9.0'} + /@babel/helper-validator-identifier@7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-option@7.22.15: - resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} + /@babel/helper-validator-option@7.23.5: + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} engines: {node: '>=6.9.0'} /@babel/helper-wrap-function@7.22.20: @@ -1696,16 +1821,26 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/helper-function-name': 7.23.0 - '@babel/template': 7.22.15 - '@babel/types': 7.23.4 + '@babel/template': 7.23.9 + '@babel/types': 7.23.9 + + /@babel/helpers@7.23.9: + resolution: {integrity: sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.23.9 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 + transitivePeerDependencies: + - supports-color - /@babel/helpers@7.23.4: - resolution: {integrity: sha512-HfcMizYz10cr3h29VqyfGL6ZWIjTwWfvYBMsBVGwpcbhNGe3wQ1ZXZRPzZoAHhd9OqHadHqjQ89iVKINXnbzuw==} + /@babel/helpers@7.24.1: + resolution: {integrity: sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.4 - '@babel/types': 7.23.4 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 transitivePeerDependencies: - supports-color @@ -1717,1089 +1852,1184 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 - /@babel/parser@7.23.4: - resolution: {integrity: sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==} + /@babel/highlight@7.24.2: + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + + /@babel/parser@7.23.9: + resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.9 - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.23.3): + /@babel/parser@7.24.1: + resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.24.0 + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.23.3): + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.3) + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.9) - /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.3(@babel/core@7.23.3): - resolution: {integrity: sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==} + /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.7(@babel/core@7.23.9): + resolution: {integrity: sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.23.3): + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.3) + '@babel/core': 7.23.9 + '@babel/helper-create-class-features-plugin': 7.23.9(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-proposal-decorators@7.23.3(@babel/core@7.23.3): - resolution: {integrity: sha512-u8SwzOcP0DYSsa++nHd/9exlHb0NAlHCb890qtZZbSwPX2bFv8LBEztxwN7Xg/dS8oAFFidhrI9PBcLBJSkGRQ==} + /@babel/plugin-proposal-decorators@7.23.9(@babel/core@7.23.9): + resolution: {integrity: sha512-hJhBCb0+NnTWybvWq2WpbCYDOcflSbx0t+BYP65e5R9GVnukiDTi+on5bFkk4p7QGuv190H6KfNiV9Knf/3cZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.3) + '@babel/core': 7.23.9 + '@babel/helper-create-class-features-plugin': 7.23.9(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.3) - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/plugin-syntax-decorators': 7.23.3(@babel/core@7.23.3) + '@babel/plugin-syntax-decorators': 7.23.3(@babel/core@7.23.9) - /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.23.3): + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) - /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.23.3): + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.3) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.9) - /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.23.3): + /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.23.9): resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) - /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.23.3): + /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.3) + '@babel/core': 7.23.9 + '@babel/helper-create-class-features-plugin': 7.23.9(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.3): + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.9): resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 - /@babel/plugin-proposal-private-property-in-object@7.21.11(@babel/core@7.23.3): + /@babel/plugin-proposal-private-property-in-object@7.21.11(@babel/core@7.23.9): resolution: {integrity: sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.3) + '@babel/helper-create-class-features-plugin': 7.23.9(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.3) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.9) - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.3): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.9): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.3): + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.3): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.9): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.3): + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.9): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-decorators@7.23.3(@babel/core@7.23.3): + /@babel/plugin-syntax-decorators@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.3): + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.3): + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-flow@7.23.3(@babel/core@7.23.3): + /@babel/plugin-syntax-flow@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.23.3): + /@babel/plugin-syntax-flow@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-sxi2kLTI5DeW5vDtMUsk4mTPwvlUDbjOnoWayhynCwrw4QXRld4QEYwqzY8JmQXaJUtgUuCIurtSRH5sn4c7mA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + + /@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.23.3): + /@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.3): + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.9): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.3): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.9): + resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.3): + /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.24.3): resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.3): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.9): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.3): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.3): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.9): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.3): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.3): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.3): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.3): + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.9): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.3): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.9): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.3): + /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.3): + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.3 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.3) + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-async-generator-functions@7.23.4(@babel/core@7.23.3): - resolution: {integrity: sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==} + /@babel/plugin-transform-async-generator-functions@7.23.9(@babel/core@7.23.9): + resolution: {integrity: sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.3) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.3) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.9) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9) - /@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.3) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.9) - /@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.23.3): + /@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.3) + '@babel/core': 7.23.9 + '@babel/helper-create-class-features-plugin': 7.23.9(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.23.3): + /@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: - '@babel/core': 7.23.3 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.3) + '@babel/core': 7.23.9 + '@babel/helper-create-class-features-plugin': 7.23.9(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.3) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.9) - /@babel/plugin-transform-classes@7.23.3(@babel/core@7.23.3): - resolution: {integrity: sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w==} + /@babel/plugin-transform-classes@7.23.8(@babel/core@7.23.9): + resolution: {integrity: sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.3) + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.9) '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 - /@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.22.15 + '@babel/template': 7.23.9 - /@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.3) + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.23.3): + /@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.9) - /@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.23.3): + /@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.9) - /@babel/plugin-transform-flow-strip-types@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-flow-strip-types@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.23.3) + '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.23.9) - /@babel/plugin-transform-for-of@7.23.3(@babel/core@7.23.3): - resolution: {integrity: sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==} + /@babel/plugin-transform-for-of@7.23.6(@babel/core@7.23.9): + resolution: {integrity: sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - /@babel/plugin-transform-function-name@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-function-name@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 - '@babel/helper-compilation-targets': 7.22.15 + '@babel/core': 7.23.9 + '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.23.3): + /@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.9) - /@babel/plugin-transform-literals@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-literals@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.23.3): + /@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.3) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.9) - /@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.3) + '@babel/core': 7.23.9 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.3) + '@babel/core': 7.23.9 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-simple-access': 7.22.5 - /@babel/plugin-transform-modules-systemjs@7.23.3(@babel/core@7.23.3): - resolution: {integrity: sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==} + /@babel/plugin-transform-modules-systemjs@7.23.9(@babel/core@7.23.9): + resolution: {integrity: sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.3) + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-identifier': 7.22.20 - /@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.3) + '@babel/core': 7.23.9 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.3): + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.9): resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.3 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.3) + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-new-target@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-new-target@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.23.3): + /@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) - /@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.23.3): + /@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.3) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.9) - /@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.23.3): + /@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.23.3 - '@babel/core': 7.23.3 - '@babel/helper-compilation-targets': 7.22.15 + '@babel/compat-data': 7.23.5 + '@babel/core': 7.23.9 + '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.3) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.3) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.9) - /@babel/plugin-transform-object-super@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-object-super@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.3) + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.9) - /@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.23.3): + /@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.9) - /@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.23.3): + /@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) - /@babel/plugin-transform-parameters@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-parameters@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.3) + '@babel/core': 7.23.9 + '@babel/helper-create-class-features-plugin': 7.23.9(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.23.3): + /@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.3) + '@babel/helper-create-class-features-plugin': 7.23.9(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.3) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.9) - /@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-react-constant-elements@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-react-constant-elements@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-zP0QKq/p6O42OL94udMgSfKXyse4RyJ0JqbQ34zDAONWjyrEsghYEyTSK5FIpmXmCpB55SHokL1cRRKHv8L2Qw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-react-display-name@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-react-display-name@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.3): + /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.9): resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.3) + '@babel/core': 7.23.9 + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.9) - /@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.24.3): + resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.3) + dev: false + + /@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.23.3): + /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.3) - '@babel/types': 7.23.4 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.9) + '@babel/types': 7.23.9 - /@babel/plugin-transform-react-pure-annotations@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.3): + resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.24.3) + '@babel/types': 7.23.9 + + /@babel/plugin-transform-react-pure-annotations@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 regenerator-transform: 0.15.2 - /@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-runtime@7.23.4(@babel/core@7.23.3): - resolution: {integrity: sha512-ITwqpb6V4btwUG0YJR82o2QvmWrLgDnx/p2A3CTPYGaRgULkDiC0DRA2C4jlRB9uXGUEfaSS/IGHfVW+ohzYDw==} + /@babel/plugin-transform-runtime@7.23.9(@babel/core@7.23.9): + resolution: {integrity: sha512-A7clW3a0aSjm3ONU9o2HAILSegJCYlEZmOhmBRReVtIpY/Z/p7yIZ+wR41Z+UipwdGuqwtID/V/dOdZXjwi9gQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.23.3) - babel-plugin-polyfill-corejs3: 0.8.6(@babel/core@7.23.3) - babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.23.3) + babel-plugin-polyfill-corejs2: 0.4.8(@babel/core@7.23.9) + babel-plugin-polyfill-corejs3: 0.9.0(@babel/core@7.23.9) + babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.23.9) semver: 6.3.1 transitivePeerDependencies: - supports-color - /@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-spread@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-spread@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - /@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-typescript@7.23.4(@babel/core@7.23.3): - resolution: {integrity: sha512-39hCCOl+YUAyMOu6B9SmUTiHUU0t/CxJNUmY3qRdJujbqi+lrQcL11ysYUsAvFWPBdhihrv1z0oRG84Yr3dODQ==} + /@babel/plugin-transform-typescript@7.23.6(@babel/core@7.23.9): + resolution: {integrity: sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.3) + '@babel/helper-create-class-features-plugin': 7.23.9(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.3) + '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.9) - /@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.3) + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.3) + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.3 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.3) + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - /@babel/preset-env@7.23.3(@babel/core@7.23.3): - resolution: {integrity: sha512-ovzGc2uuyNfNAs/jyjIGxS8arOHS5FENZaNn4rtE7UdKMMkqHCvboHfcuhWLZNX5cB44QfcGNWjaevxMzzMf+Q==} + /@babel/preset-env@7.23.9(@babel/core@7.23.9): + resolution: {integrity: sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.23.3 - '@babel/core': 7.23.3 - '@babel/helper-compilation-targets': 7.22.15 + '@babel/compat-data': 7.23.5 + '@babel/core': 7.23.9 + '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.3) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.3) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.3) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.3) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.3) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.3) - '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-syntax-import-attributes': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.3) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.3) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.3) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.3) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.3) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.3) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.3) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.3) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.3) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.3) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.3) - '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-async-generator-functions': 7.23.4(@babel/core@7.23.3) - '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.23.3) - '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-class-static-block': 7.23.4(@babel/core@7.23.3) - '@babel/plugin-transform-classes': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-dotall-regex': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-duplicate-keys': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-dynamic-import': 7.23.4(@babel/core@7.23.3) - '@babel/plugin-transform-exponentiation-operator': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-export-namespace-from': 7.23.4(@babel/core@7.23.3) - '@babel/plugin-transform-for-of': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-json-strings': 7.23.4(@babel/core@7.23.3) - '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-logical-assignment-operators': 7.23.4(@babel/core@7.23.3) - '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-modules-amd': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-modules-systemjs': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-modules-umd': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.3) - '@babel/plugin-transform-new-target': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-nullish-coalescing-operator': 7.23.4(@babel/core@7.23.3) - '@babel/plugin-transform-numeric-separator': 7.23.4(@babel/core@7.23.3) - '@babel/plugin-transform-object-rest-spread': 7.23.4(@babel/core@7.23.3) - '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-optional-catch-binding': 7.23.4(@babel/core@7.23.3) - '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.3) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.23.3) - '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-regenerator': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-reserved-words': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-typeof-symbol': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-unicode-escapes': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-unicode-property-regex': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-unicode-sets-regex': 7.23.3(@babel/core@7.23.3) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.3) - babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.23.3) - babel-plugin-polyfill-corejs3: 0.8.6(@babel/core@7.23.3) - babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.23.3) - core-js-compat: 3.33.3 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.23.7(@babel/core@7.23.9) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.9) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.9) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.9) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-syntax-import-attributes': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.9) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.9) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-async-generator-functions': 7.23.9(@babel/core@7.23.9) + '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-class-static-block': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-classes': 7.23.8(@babel/core@7.23.9) + '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-dotall-regex': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-duplicate-keys': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-dynamic-import': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-exponentiation-operator': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-export-namespace-from': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-for-of': 7.23.6(@babel/core@7.23.9) + '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-json-strings': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-logical-assignment-operators': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-modules-amd': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-modules-systemjs': 7.23.9(@babel/core@7.23.9) + '@babel/plugin-transform-modules-umd': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-new-target': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-nullish-coalescing-operator': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-numeric-separator': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-object-rest-spread': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-optional-catch-binding': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-regenerator': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-reserved-words': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-typeof-symbol': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-unicode-escapes': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-unicode-property-regex': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-unicode-sets-regex': 7.23.3(@babel/core@7.23.9) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.9) + babel-plugin-polyfill-corejs2: 0.4.8(@babel/core@7.23.9) + babel-plugin-polyfill-corejs3: 0.9.0(@babel/core@7.23.9) + babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.23.9) + core-js-compat: 3.35.1 semver: 6.3.1 transitivePeerDependencies: - supports-color - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.3): + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.9): resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/types': 7.23.4 + '@babel/types': 7.23.9 esutils: 2.0.3 - /@babel/preset-react@7.23.3(@babel/core@7.23.3): + /@babel/preset-react@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.3) - '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.23.3) - '@babel/plugin-transform-react-pure-annotations': 7.23.3(@babel/core@7.23.3) + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-react-pure-annotations': 7.23.3(@babel/core@7.23.9) - /@babel/preset-typescript@7.23.3(@babel/core@7.23.3): + /@babel/preset-typescript@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-typescript': 7.23.4(@babel/core@7.23.3) + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.23.9) /@babel/regjsgen@0.8.0: resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - /@babel/runtime@7.23.4: - resolution: {integrity: sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg==} + /@babel/runtime@7.23.9: + resolution: {integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + + /@babel/runtime@7.24.1: + resolution: {integrity: sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + dev: true + + /@babel/template@7.23.9: + resolution: {integrity: sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==} engines: {node: '>=6.9.0'} dependencies: - regenerator-runtime: 0.14.0 + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 - /@babel/template@7.22.15: - resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + /@babel/template@7.24.0: + resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.23.4 - '@babel/parser': 7.23.4 - '@babel/types': 7.23.4 + '@babel/code-frame': 7.24.2 + '@babel/parser': 7.24.1 + '@babel/types': 7.24.0 - /@babel/traverse@7.23.4: - resolution: {integrity: sha512-IYM8wSUwunWTB6tFC2dkKZhxbIjHoWemdK+3f8/wq8aKhbUscxD5MX72ubd90fxvFknaLPeGw5ycU84V1obHJg==} + /@babel/traverse@7.23.9: + resolution: {integrity: sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.23.4 - '@babel/generator': 7.23.4 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.4 - '@babel/types': 7.23.4 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 debug: 4.3.4(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color - /@babel/types@7.23.4: - resolution: {integrity: sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==} + /@babel/traverse@7.24.1: + resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.1 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.24.1 + '@babel/types': 7.24.0 + debug: 4.3.4(supports-color@8.1.1) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + /@babel/types@7.23.9: + resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.23.4 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 + /@babel/types@7.24.0: + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.24.1 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -2807,14 +3037,14 @@ packages: resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} dev: false - /@changesets/apply-release-plan@6.1.4: - resolution: {integrity: sha512-FMpKF1fRlJyCZVYHr3CbinpZZ+6MwvOtWUuO8uo+svcATEoc1zRDcj23pAurJ2TZ/uVz1wFHH6K3NlACy0PLew==} + /@changesets/apply-release-plan@7.0.0: + resolution: {integrity: sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ==} dependencies: - '@babel/runtime': 7.23.4 - '@changesets/config': 2.3.1 - '@changesets/get-version-range-type': 0.3.2 - '@changesets/git': 2.0.0 - '@changesets/types': 5.2.1 + '@babel/runtime': 7.23.9 + '@changesets/config': 3.0.0 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.0 + '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 detect-indent: 6.1.0 fs-extra: 7.0.1 @@ -2825,51 +3055,50 @@ packages: semver: 7.5.4 dev: true - /@changesets/assemble-release-plan@5.2.4: - resolution: {integrity: sha512-xJkWX+1/CUaOUWTguXEbCDTyWJFECEhmdtbkjhn5GVBGxdP/JwaHBIU9sW3FR6gD07UwZ7ovpiPclQZs+j+mvg==} + /@changesets/assemble-release-plan@6.0.0: + resolution: {integrity: sha512-4QG7NuisAjisbW4hkLCmGW2lRYdPrKzro+fCtZaILX+3zdUELSvYjpL4GTv0E4aM9Mef3PuIQp89VmHJ4y2bfw==} dependencies: - '@babel/runtime': 7.23.4 - '@changesets/errors': 0.1.4 - '@changesets/get-dependents-graph': 1.3.6 - '@changesets/types': 5.2.1 + '@babel/runtime': 7.23.9 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.0.0 + '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 semver: 7.5.4 dev: true - /@changesets/changelog-git@0.1.14: - resolution: {integrity: sha512-+vRfnKtXVWsDDxGctOfzJsPhaCdXRYoe+KyWYoq5X/GqoISREiat0l3L8B0a453B2B4dfHGcZaGyowHbp9BSaA==} + /@changesets/changelog-git@0.2.0: + resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} dependencies: - '@changesets/types': 5.2.1 + '@changesets/types': 6.0.0 dev: true - /@changesets/cli@2.26.2: - resolution: {integrity: sha512-dnWrJTmRR8bCHikJHl9b9HW3gXACCehz4OasrXpMp7sx97ECuBGGNjJhjPhdZNCvMy9mn4BWdplI323IbqsRig==} + /@changesets/cli@2.27.1: + resolution: {integrity: sha512-iJ91xlvRnnrJnELTp4eJJEOPjgpF3NOh4qeQehM6Ugiz9gJPRZ2t+TsXun6E3AMN4hScZKjqVXl0TX+C7AB3ZQ==} hasBin: true dependencies: - '@babel/runtime': 7.23.4 - '@changesets/apply-release-plan': 6.1.4 - '@changesets/assemble-release-plan': 5.2.4 - '@changesets/changelog-git': 0.1.14 - '@changesets/config': 2.3.1 - '@changesets/errors': 0.1.4 - '@changesets/get-dependents-graph': 1.3.6 - '@changesets/get-release-plan': 3.0.17 - '@changesets/git': 2.0.0 - '@changesets/logger': 0.0.5 - '@changesets/pre': 1.0.14 - '@changesets/read': 0.5.9 - '@changesets/types': 5.2.1 - '@changesets/write': 0.2.3 + '@babel/runtime': 7.23.9 + '@changesets/apply-release-plan': 7.0.0 + '@changesets/assemble-release-plan': 6.0.0 + '@changesets/changelog-git': 0.2.0 + '@changesets/config': 3.0.0 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.0.0 + '@changesets/get-release-plan': 4.0.0 + '@changesets/git': 3.0.0 + '@changesets/logger': 0.1.0 + '@changesets/pre': 2.0.0 + '@changesets/read': 0.6.0 + '@changesets/types': 6.0.0 + '@changesets/write': 0.3.0 '@manypkg/get-packages': 1.1.3 - '@types/is-ci': 3.0.4 '@types/semver': 7.5.6 ansi-colors: 4.1.3 chalk: 2.4.2 + ci-info: 3.9.0 enquirer: 2.4.1 external-editor: 3.1.0 fs-extra: 7.0.1 human-id: 1.0.2 - is-ci: 3.0.1 meow: 6.1.1 outdent: 0.5.0 p-limit: 2.3.0 @@ -2881,93 +3110,93 @@ packages: tty-table: 4.2.3 dev: true - /@changesets/config@2.3.1: - resolution: {integrity: sha512-PQXaJl82CfIXddUOppj4zWu+987GCw2M+eQcOepxN5s+kvnsZOwjEJO3DH9eVy+OP6Pg/KFEWdsECFEYTtbg6w==} + /@changesets/config@3.0.0: + resolution: {integrity: sha512-o/rwLNnAo/+j9Yvw9mkBQOZySDYyOr/q+wptRLcAVGlU6djOeP9v1nlalbL9MFsobuBVQbZCTp+dIzdq+CLQUA==} dependencies: - '@changesets/errors': 0.1.4 - '@changesets/get-dependents-graph': 1.3.6 - '@changesets/logger': 0.0.5 - '@changesets/types': 5.2.1 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.0.0 + '@changesets/logger': 0.1.0 + '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 micromatch: 4.0.5 dev: true - /@changesets/errors@0.1.4: - resolution: {integrity: sha512-HAcqPF7snsUJ/QzkWoKfRfXushHTu+K5KZLJWPb34s4eCZShIf8BFO3fwq6KU8+G7L5KdtN2BzQAXOSXEyiY9Q==} + /@changesets/errors@0.2.0: + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} dependencies: extendable-error: 0.1.7 dev: true - /@changesets/get-dependents-graph@1.3.6: - resolution: {integrity: sha512-Q/sLgBANmkvUm09GgRsAvEtY3p1/5OCzgBE5vX3vgb5CvW0j7CEljocx5oPXeQSNph6FXulJlXV3Re/v3K3P3Q==} + /@changesets/get-dependents-graph@2.0.0: + resolution: {integrity: sha512-cafUXponivK4vBgZ3yLu944mTvam06XEn2IZGjjKc0antpenkYANXiiE6GExV/yKdsCnE8dXVZ25yGqLYZmScA==} dependencies: - '@changesets/types': 5.2.1 + '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 chalk: 2.4.2 fs-extra: 7.0.1 semver: 7.5.4 dev: true - /@changesets/get-release-plan@3.0.17: - resolution: {integrity: sha512-6IwKTubNEgoOZwDontYc2x2cWXfr6IKxP3IhKeK+WjyD6y3M4Gl/jdQvBw+m/5zWILSOCAaGLu2ZF6Q+WiPniw==} + /@changesets/get-release-plan@4.0.0: + resolution: {integrity: sha512-9L9xCUeD/Tb6L/oKmpm8nyzsOzhdNBBbt/ZNcjynbHC07WW4E1eX8NMGC5g5SbM5z/V+MOrYsJ4lRW41GCbg3w==} dependencies: - '@babel/runtime': 7.23.4 - '@changesets/assemble-release-plan': 5.2.4 - '@changesets/config': 2.3.1 - '@changesets/pre': 1.0.14 - '@changesets/read': 0.5.9 - '@changesets/types': 5.2.1 + '@babel/runtime': 7.23.9 + '@changesets/assemble-release-plan': 6.0.0 + '@changesets/config': 3.0.0 + '@changesets/pre': 2.0.0 + '@changesets/read': 0.6.0 + '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 dev: true - /@changesets/get-version-range-type@0.3.2: - resolution: {integrity: sha512-SVqwYs5pULYjYT4op21F2pVbcrca4qA/bAA3FmFXKMN7Y+HcO8sbZUTx3TAy2VXulP2FACd1aC7f2nTuqSPbqg==} + /@changesets/get-version-range-type@0.4.0: + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} dev: true - /@changesets/git@2.0.0: - resolution: {integrity: sha512-enUVEWbiqUTxqSnmesyJGWfzd51PY4H7mH9yUw0hPVpZBJ6tQZFMU3F3mT/t9OJ/GjyiM4770i+sehAn6ymx6A==} + /@changesets/git@3.0.0: + resolution: {integrity: sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==} dependencies: - '@babel/runtime': 7.23.4 - '@changesets/errors': 0.1.4 - '@changesets/types': 5.2.1 + '@babel/runtime': 7.23.9 + '@changesets/errors': 0.2.0 + '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 is-subdir: 1.2.0 micromatch: 4.0.5 spawndamnit: 2.0.0 dev: true - /@changesets/logger@0.0.5: - resolution: {integrity: sha512-gJyZHomu8nASHpaANzc6bkQMO9gU/ib20lqew1rVx753FOxffnCrJlGIeQVxNWCqM+o6OOleCo/ivL8UAO5iFw==} + /@changesets/logger@0.1.0: + resolution: {integrity: sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==} dependencies: chalk: 2.4.2 dev: true - /@changesets/parse@0.3.16: - resolution: {integrity: sha512-127JKNd167ayAuBjUggZBkmDS5fIKsthnr9jr6bdnuUljroiERW7FBTDNnNVyJ4l69PzR57pk6mXQdtJyBCJKg==} + /@changesets/parse@0.4.0: + resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} dependencies: - '@changesets/types': 5.2.1 + '@changesets/types': 6.0.0 js-yaml: 3.14.1 dev: true - /@changesets/pre@1.0.14: - resolution: {integrity: sha512-dTsHmxQWEQekHYHbg+M1mDVYFvegDh9j/kySNuDKdylwfMEevTeDouR7IfHNyVodxZXu17sXoJuf2D0vi55FHQ==} + /@changesets/pre@2.0.0: + resolution: {integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==} dependencies: - '@babel/runtime': 7.23.4 - '@changesets/errors': 0.1.4 - '@changesets/types': 5.2.1 + '@babel/runtime': 7.23.9 + '@changesets/errors': 0.2.0 + '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 dev: true - /@changesets/read@0.5.9: - resolution: {integrity: sha512-T8BJ6JS6j1gfO1HFq50kU3qawYxa4NTbI/ASNVVCBTsKquy2HYwM9r7ZnzkiMe8IEObAJtUVGSrePCOxAK2haQ==} + /@changesets/read@0.6.0: + resolution: {integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==} dependencies: - '@babel/runtime': 7.23.4 - '@changesets/git': 2.0.0 - '@changesets/logger': 0.0.5 - '@changesets/parse': 0.3.16 - '@changesets/types': 5.2.1 + '@babel/runtime': 7.23.9 + '@changesets/git': 3.0.0 + '@changesets/logger': 0.1.0 + '@changesets/parse': 0.4.0 + '@changesets/types': 6.0.0 chalk: 2.4.2 fs-extra: 7.0.1 p-filter: 2.1.0 @@ -2977,15 +3206,15 @@ packages: resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} dev: true - /@changesets/types@5.2.1: - resolution: {integrity: sha512-myLfHbVOqaq9UtUKqR/nZA/OY7xFjQMdfgfqeZIBK4d0hA6pgxArvdv8M+6NUzzBsjWLOtvApv8YHr4qM+Kpfg==} + /@changesets/types@6.0.0: + resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} dev: true - /@changesets/write@0.2.3: - resolution: {integrity: sha512-Dbamr7AIMvslKnNYsLFafaVORx4H0pvCA2MHqgtNCySMe1blImEyAEOzDmcgKAkgz4+uwoLz7demIrX+JBr/Xw==} + /@changesets/write@0.3.0: + resolution: {integrity: sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw==} dependencies: - '@babel/runtime': 7.23.4 - '@changesets/types': 5.2.1 + '@babel/runtime': 7.23.9 + '@changesets/types': 6.0.0 fs-extra: 7.0.1 human-id: 1.0.2 prettier: 2.8.8 @@ -3000,12 +3229,65 @@ packages: minimist: 1.2.8 dev: true + /@coasys/ad4m-connect@0.8.1(esbuild@0.15.18): + resolution: {integrity: sha512-pbyeescsVOVAnXjn2Uh4BV0oWbuiseHT0HvGmDISdaJztaFv1MNglka2oOFf9xYmwz7PBExYNprnE5g75YVyNQ==} + dependencies: + '@undecaf/barcode-detector-polyfill': 0.9.20 + '@undecaf/zbar-wasm': 0.9.16 + auto-bind: 5.0.1 + electron: 20.3.12 + esbuild-plugin-copy: 2.1.1(esbuild@0.15.18) + esbuild-plugin-replace: 1.4.0 + lit: 2.8.0 + transitivePeerDependencies: + - esbuild + - supports-color + dev: false + + /@coasys/ad4m@0.8.1(react@18.2.0): + resolution: {integrity: sha512-2or0Ykc+F+geDumBABYD/us5Iu9Se2xVRdVcj4h0l7etd9Zx3u5m/Q32YHywJz61DbPQV8Q+zTkYiqF54y9GrA==} + dependencies: + '@apollo/client': 3.7.10(graphql-ws@5.12.0)(graphql@15.7.2)(react-dom@18.2.0)(react@18.2.0) + '@holochain/client': 0.16.0 + '@types/jest': 26.0.24 + class-validator: 0.13.2 + express: 4.18.2 + graphql: 15.7.2(patch_hash=nr4gprddtjag7fz5nm4wirqs4q) + reflect-metadata: 0.1.14 + type-graphql: 1.1.1(class-validator@0.13.2)(graphql@15.7.2) + transitivePeerDependencies: + - bufferutil + - graphql-ws + - react + - react-dom + - subscriptions-transport-ws + - supports-color + - utf-8-validate + dev: false + + /@coasys/hooks-helpers@0.9.0(esbuild@0.15.18)(react@18.2.0): + resolution: {integrity: sha512-21Wrg/LwosKpcSpz/Xq85eTONGHIMF1sJBihdxR3d3De91dz4uZZ1Twy4irLYjetwXMh4J1OS8Z5fNDWcwSigg==} + dependencies: + '@coasys/ad4m': 0.8.1(react@18.2.0) + '@coasys/ad4m-connect': 0.8.1(esbuild@0.15.18) + uuid: 9.0.1 + transitivePeerDependencies: + - bufferutil + - esbuild + - graphql-ws + - react + - react-dom + - subscriptions-transport-ws + - supports-color + - utf-8-validate + dev: false + /@coinbase/wallet-sdk@3.7.2: resolution: {integrity: sha512-lIGvXMsgpsQWci/XOMQIJ2nIZ8JUy/L+bvC0wkRaYarr0YylwpXrJ2gRM3hCXPS477pkyO7N/kSiAoRgEXUdJQ==} engines: {node: '>= 10.0.0'} dependencies: '@metamask/safe-event-emitter': 2.0.0 - '@solana/web3.js': 1.87.6 + '@solana/web3.js': 1.89.1 bind-decorator: 1.0.11 bn.js: 5.2.1 buffer: 6.0.3 @@ -3015,7 +3297,7 @@ packages: eth-rpc-errors: 4.0.2 json-rpc-engine: 6.1.0 keccak: 3.0.4 - preact: 10.19.2 + preact: 10.19.3 qs: 6.11.2 rxjs: 6.6.7 sha.js: 2.4.11 @@ -3035,146 +3317,146 @@ packages: '@jridgewell/trace-mapping': 0.3.9 dev: true - /@csstools/normalize.css@12.0.0: - resolution: {integrity: sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==} + /@csstools/normalize.css@12.1.1: + resolution: {integrity: sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==} - /@csstools/postcss-cascade-layers@1.1.1(postcss@8.4.31): + /@csstools/postcss-cascade-layers@1.1.1(postcss@8.4.33): resolution: {integrity: sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.0.13) - postcss: 8.4.31 - postcss-selector-parser: 6.0.13 + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.0.15) + postcss: 8.4.33 + postcss-selector-parser: 6.0.15 - /@csstools/postcss-color-function@1.1.1(postcss@8.4.31): + /@csstools/postcss-color-function@1.1.1(postcss@8.4.33): resolution: {integrity: sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.31) - postcss: 8.4.31 + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.33) + postcss: 8.4.33 postcss-value-parser: 4.2.0 - /@csstools/postcss-font-format-keywords@1.0.1(postcss@8.4.31): + /@csstools/postcss-font-format-keywords@1.0.1(postcss@8.4.33): resolution: {integrity: sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 - /@csstools/postcss-hwb-function@1.0.2(postcss@8.4.31): + /@csstools/postcss-hwb-function@1.0.2(postcss@8.4.33): resolution: {integrity: sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 - /@csstools/postcss-ic-unit@1.0.1(postcss@8.4.31): + /@csstools/postcss-ic-unit@1.0.1(postcss@8.4.33): resolution: {integrity: sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.31) - postcss: 8.4.31 + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.33) + postcss: 8.4.33 postcss-value-parser: 4.2.0 - /@csstools/postcss-is-pseudo-class@2.0.7(postcss@8.4.31): + /@csstools/postcss-is-pseudo-class@2.0.7(postcss@8.4.33): resolution: {integrity: sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.0.13) - postcss: 8.4.31 - postcss-selector-parser: 6.0.13 + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.0.15) + postcss: 8.4.33 + postcss-selector-parser: 6.0.15 - /@csstools/postcss-nested-calc@1.0.0(postcss@8.4.31): + /@csstools/postcss-nested-calc@1.0.0(postcss@8.4.33): resolution: {integrity: sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 - /@csstools/postcss-normalize-display-values@1.0.1(postcss@8.4.31): + /@csstools/postcss-normalize-display-values@1.0.1(postcss@8.4.33): resolution: {integrity: sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 - /@csstools/postcss-oklab-function@1.1.1(postcss@8.4.31): + /@csstools/postcss-oklab-function@1.1.1(postcss@8.4.33): resolution: {integrity: sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.31) - postcss: 8.4.31 + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.33) + postcss: 8.4.33 postcss-value-parser: 4.2.0 - /@csstools/postcss-progressive-custom-properties@1.3.0(postcss@8.4.31): + /@csstools/postcss-progressive-custom-properties@1.3.0(postcss@8.4.33): resolution: {integrity: sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.3 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 - /@csstools/postcss-stepped-value-functions@1.0.1(postcss@8.4.31): + /@csstools/postcss-stepped-value-functions@1.0.1(postcss@8.4.33): resolution: {integrity: sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 - /@csstools/postcss-text-decoration-shorthand@1.0.0(postcss@8.4.31): + /@csstools/postcss-text-decoration-shorthand@1.0.0(postcss@8.4.33): resolution: {integrity: sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 - /@csstools/postcss-trigonometric-functions@1.0.2(postcss@8.4.31): + /@csstools/postcss-trigonometric-functions@1.0.2(postcss@8.4.33): resolution: {integrity: sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==} engines: {node: ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 - /@csstools/postcss-unset-value@1.0.2(postcss@8.4.31): + /@csstools/postcss-unset-value@1.0.2(postcss@8.4.33): resolution: {integrity: sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 - /@csstools/selector-specificity@2.2.0(postcss-selector-parser@6.0.13): + /@csstools/selector-specificity@2.2.0(postcss-selector-parser@6.0.15): resolution: {integrity: sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss-selector-parser: ^6.0.10 dependencies: - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.15 /@electron/get@1.14.1: resolution: {integrity: sha512-BrZYyL/6m0ZXz/lDxy/nlVhQz+WF+iPS6qXolEU8atw7h6v1aYkjwJZ63m+bJMBTxDE66X+r2tPS4a/8C82sZw==} @@ -3194,6 +3476,15 @@ packages: - supports-color dev: false + /@esbuild/aix-ppc64@0.19.12: + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-arm64@0.18.20: resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} @@ -3202,8 +3493,8 @@ packages: requiresBuild: true optional: true - /@esbuild/android-arm64@0.19.7: - resolution: {integrity: sha512-YEDcw5IT7hW3sFKZBkCAQaOCJQLONVcD4bOyTXMZz5fr66pTHnAet46XAtbXAkJRfIn2YVhdC6R9g4xa27jQ1w==} + /@esbuild/android-arm64@0.19.12: + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -3227,8 +3518,8 @@ packages: requiresBuild: true optional: true - /@esbuild/android-arm@0.19.7: - resolution: {integrity: sha512-YGSPnndkcLo4PmVl2tKatEn+0mlVMr3yEpOOT0BeMria87PhvoJb5dg5f5Ft9fbCVgtAz4pWMzZVgSEGpDAlww==} + /@esbuild/android-arm@0.19.12: + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -3244,8 +3535,8 @@ packages: requiresBuild: true optional: true - /@esbuild/android-x64@0.19.7: - resolution: {integrity: sha512-jhINx8DEjz68cChFvM72YzrqfwJuFbfvSxZAk4bebpngGfNNRm+zRl4rtT9oAX6N9b6gBcFaJHFew5Blf6CvUw==} + /@esbuild/android-x64@0.19.12: + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -3261,8 +3552,8 @@ packages: requiresBuild: true optional: true - /@esbuild/darwin-arm64@0.19.7: - resolution: {integrity: sha512-dr81gbmWN//3ZnBIm6YNCl4p3pjnabg1/ZVOgz2fJoUO1a3mq9WQ/1iuEluMs7mCL+Zwv7AY5e3g1hjXqQZ9Iw==} + /@esbuild/darwin-arm64@0.19.12: + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -3278,8 +3569,8 @@ packages: requiresBuild: true optional: true - /@esbuild/darwin-x64@0.19.7: - resolution: {integrity: sha512-Lc0q5HouGlzQEwLkgEKnWcSazqr9l9OdV2HhVasWJzLKeOt0PLhHaUHuzb8s/UIya38DJDoUm74GToZ6Wc7NGQ==} + /@esbuild/darwin-x64@0.19.12: + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -3295,8 +3586,8 @@ packages: requiresBuild: true optional: true - /@esbuild/freebsd-arm64@0.19.7: - resolution: {integrity: sha512-+y2YsUr0CxDFF7GWiegWjGtTUF6gac2zFasfFkRJPkMAuMy9O7+2EH550VlqVdpEEchWMynkdhC9ZjtnMiHImQ==} + /@esbuild/freebsd-arm64@0.19.12: + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -3312,8 +3603,8 @@ packages: requiresBuild: true optional: true - /@esbuild/freebsd-x64@0.19.7: - resolution: {integrity: sha512-CdXOxIbIzPJmJhrpmJTLx+o35NoiKBIgOvmvT+jeSadYiWJn0vFKsl+0bSG/5lwjNHoIDEyMYc/GAPR9jxusTA==} + /@esbuild/freebsd-x64@0.19.12: + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -3329,8 +3620,8 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-arm64@0.19.7: - resolution: {integrity: sha512-inHqdOVCkUhHNvuQPT1oCB7cWz9qQ/Cz46xmVe0b7UXcuIJU3166aqSunsqkgSGMtUCWOZw3+KMwI6otINuC9g==} + /@esbuild/linux-arm64@0.19.12: + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -3346,8 +3637,8 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-arm@0.19.7: - resolution: {integrity: sha512-Y+SCmWxsJOdQtjcBxoacn/pGW9HDZpwsoof0ttL+2vGcHokFlfqV666JpfLCSP2xLxFpF1lj7T3Ox3sr95YXww==} + /@esbuild/linux-arm@0.19.12: + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -3363,8 +3654,8 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-ia32@0.19.7: - resolution: {integrity: sha512-2BbiL7nLS5ZO96bxTQkdO0euGZIUQEUXMTrqLxKUmk/Y5pmrWU84f+CMJpM8+EHaBPfFSPnomEaQiG/+Gmh61g==} + /@esbuild/linux-ia32@0.19.12: + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -3388,8 +3679,8 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-loong64@0.19.7: - resolution: {integrity: sha512-BVFQla72KXv3yyTFCQXF7MORvpTo4uTA8FVFgmwVrqbB/4DsBFWilUm1i2Oq6zN36DOZKSVUTb16jbjedhfSHw==} + /@esbuild/linux-loong64@0.19.12: + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -3405,8 +3696,8 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-mips64el@0.19.7: - resolution: {integrity: sha512-DzAYckIaK+pS31Q/rGpvUKu7M+5/t+jI+cdleDgUwbU7KdG2eC3SUbZHlo6Q4P1CfVKZ1lUERRFP8+q0ob9i2w==} + /@esbuild/linux-mips64el@0.19.12: + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -3422,8 +3713,8 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-ppc64@0.19.7: - resolution: {integrity: sha512-JQ1p0SmUteNdUaaiRtyS59GkkfTW0Edo+e0O2sihnY4FoZLz5glpWUQEKMSzMhA430ctkylkS7+vn8ziuhUugQ==} + /@esbuild/linux-ppc64@0.19.12: + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -3439,8 +3730,8 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-riscv64@0.19.7: - resolution: {integrity: sha512-xGwVJ7eGhkprY/nB7L7MXysHduqjpzUl40+XoYDGC4UPLbnG+gsyS1wQPJ9lFPcxYAaDXbdRXd1ACs9AE9lxuw==} + /@esbuild/linux-riscv64@0.19.12: + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -3456,8 +3747,8 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-s390x@0.19.7: - resolution: {integrity: sha512-U8Rhki5PVU0L0nvk+E8FjkV8r4Lh4hVEb9duR6Zl21eIEYEwXz8RScj4LZWA2i3V70V4UHVgiqMpszXvG0Yqhg==} + /@esbuild/linux-s390x@0.19.12: + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -3473,8 +3764,8 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-x64@0.19.7: - resolution: {integrity: sha512-ZYZopyLhm4mcoZXjFt25itRlocKlcazDVkB4AhioiL9hOWhDldU9n38g62fhOI4Pth6vp+Mrd5rFKxD0/S+7aQ==} + /@esbuild/linux-x64@0.19.12: + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -3490,8 +3781,8 @@ packages: requiresBuild: true optional: true - /@esbuild/netbsd-x64@0.19.7: - resolution: {integrity: sha512-/yfjlsYmT1O3cum3J6cmGG16Fd5tqKMcg5D+sBYLaOQExheAJhqr8xOAEIuLo8JYkevmjM5zFD9rVs3VBcsjtQ==} + /@esbuild/netbsd-x64@0.19.12: + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -3507,8 +3798,8 @@ packages: requiresBuild: true optional: true - /@esbuild/openbsd-x64@0.19.7: - resolution: {integrity: sha512-MYDFyV0EW1cTP46IgUJ38OnEY5TaXxjoDmwiTXPjezahQgZd+j3T55Ht8/Q9YXBM0+T9HJygrSRGV5QNF/YVDQ==} + /@esbuild/openbsd-x64@0.19.12: + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -3524,8 +3815,8 @@ packages: requiresBuild: true optional: true - /@esbuild/sunos-x64@0.19.7: - resolution: {integrity: sha512-JcPvgzf2NN/y6X3UUSqP6jSS06V0DZAV/8q0PjsZyGSXsIGcG110XsdmuWiHM+pno7/mJF6fjH5/vhUz/vA9fw==} + /@esbuild/sunos-x64@0.19.12: + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -3541,8 +3832,8 @@ packages: requiresBuild: true optional: true - /@esbuild/win32-arm64@0.19.7: - resolution: {integrity: sha512-ZA0KSYti5w5toax5FpmfcAgu3ZNJxYSRm0AW/Dao5up0YV1hDVof1NvwLomjEN+3/GMtaWDI+CIyJOMTRSTdMw==} + /@esbuild/win32-arm64@0.19.12: + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -3558,8 +3849,8 @@ packages: requiresBuild: true optional: true - /@esbuild/win32-ia32@0.19.7: - resolution: {integrity: sha512-CTOnijBKc5Jpk6/W9hQMMvJnsSYRYgveN6O75DTACCY18RA2nqka8dTZR+x/JqXCRiKk84+5+bRKXUSbbwsS0A==} + /@esbuild/win32-ia32@0.19.12: + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -3575,8 +3866,8 @@ packages: requiresBuild: true optional: true - /@esbuild/win32-x64@0.19.7: - resolution: {integrity: sha512-gRaP2sk6hc98N734luX4VpF318l3w+ofrtTu9j5L8EQXF+FzQKV6alCOHMVoJJHvVK/mGbwBXfOL1HETQu9IGQ==} + /@esbuild/win32-x64@0.19.12: + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -3584,28 +3875,28 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.54.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.54.0 + eslint: 8.57.0 eslint-visitor-keys: 3.4.3 /@eslint-community/regexpp@4.10.0: resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - /@eslint/eslintrc@2.1.3: - resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==} + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4(supports-color@8.1.1) espree: 9.6.1 - globals: 13.23.0 - ignore: 5.3.0 + globals: 13.24.0 + ignore: 5.3.1 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -3613,8 +3904,8 @@ packages: transitivePeerDependencies: - supports-color - /@eslint/js@8.54.0: - resolution: {integrity: sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==} + /@eslint/js@8.57.0: + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} /@graphql-tools/merge@8.4.2(graphql@15.7.2): @@ -3656,13 +3947,14 @@ packages: dependencies: graphql: 15.7.2(patch_hash=nr4gprddtjag7fz5nm4wirqs4q) - /@headlessui/react@1.7.17(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-4am+tzvkqDSSgiwrsEpGWqgGo9dz8qU5M3znCkC4PgkpY4HcCZzEDEvozltGGGHIKl9jbXbZPSH5TWn4sWJdow==} + /@headlessui/react@1.7.18(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-4i5DOrzwN4qSgNsL4Si61VMkUcWbcSKueUV7sFhpHzQcSShdlHENE5+QBntMSRvHt8NyoFO2AGG8si9lq+w4zQ==} engines: {node: '>=10'} peerDependencies: react: ^16 || ^17 || ^18 react-dom: ^16 || ^17 || ^18 dependencies: + '@tanstack/react-virtual': 3.0.2(react-dom@18.2.0)(react@18.2.0) client-only: 0.0.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -3675,10 +3967,10 @@ packages: '@holochain/serialization': 0.1.0-beta-rc.3 '@msgpack/msgpack': 2.8.0 '@noble/ed25519': 2.0.0 - '@tauri-apps/api': 1.5.1 + '@tauri-apps/api': 1.5.3 emittery: 1.0.1 isomorphic-ws: 5.0.0(ws@8.13.0) - js-base64: 3.7.5 + js-base64: 3.7.6 libsodium-wrappers: 0.7.13 lodash-es: 4.17.21 ws: 8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -3727,11 +4019,11 @@ packages: lodash: 4.17.21 dev: true - /@humanwhocodes/config-array@0.11.13: - resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} + /@humanwhocodes/config-array@0.11.14: + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} dependencies: - '@humanwhocodes/object-schema': 2.0.1 + '@humanwhocodes/object-schema': 2.0.2 debug: 4.3.4(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: @@ -3741,13 +4033,24 @@ packages: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - /@humanwhocodes/object-schema@2.0.1: - resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + /@humanwhocodes/object-schema@2.0.2: + resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} /@ioredis/commands@1.2.0: resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} dev: false + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + /@istanbuljs/load-nyc-config@1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -3767,7 +4070,7 @@ packages: engines: {node: '>= 10.14.2'} dependencies: '@jest/types': 26.6.2 - '@types/node': 16.18.64 + '@types/node': 16.18.76 chalk: 4.1.2 jest-message-util: 26.6.2 jest-util: 26.6.2 @@ -3779,7 +4082,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 16.18.64 + '@types/node': 16.18.76 chalk: 4.1.2 jest-message-util: 27.5.1 jest-util: 27.5.1 @@ -3790,7 +4093,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@jest/types': 28.1.3 - '@types/node': 16.18.64 + '@types/node': 16.18.76 chalk: 4.1.2 jest-message-util: 28.1.3 jest-util: 28.1.3 @@ -3805,7 +4108,7 @@ packages: '@jest/test-result': 26.6.2 '@jest/transform': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 16.18.64 + '@types/node': 16.18.76 ansi-escapes: 4.3.2 chalk: 4.1.2 exit: 0.1.2 @@ -3850,7 +4153,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 16.18.64 + '@types/node': 16.18.76 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.8.1 @@ -3886,7 +4189,7 @@ packages: dependencies: '@jest/fake-timers': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 16.18.64 + '@types/node': 16.18.76 jest-mock: 26.6.2 dev: true @@ -3896,7 +4199,7 @@ packages: dependencies: '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 16.18.64 + '@types/node': 16.18.76 jest-mock: 27.5.1 /@jest/expect-utils@29.7.0: @@ -3912,7 +4215,7 @@ packages: dependencies: '@jest/types': 26.6.2 '@sinonjs/fake-timers': 6.0.1 - '@types/node': 16.18.64 + '@types/node': 16.18.76 jest-message-util: 26.6.2 jest-mock: 26.6.2 jest-util: 26.6.2 @@ -3924,7 +4227,7 @@ packages: dependencies: '@jest/types': 27.5.1 '@sinonjs/fake-timers': 8.1.0 - '@types/node': 16.18.64 + '@types/node': 16.18.76 jest-message-util: 27.5.1 jest-mock: 27.5.1 jest-util: 27.5.1 @@ -3994,7 +4297,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 16.18.64 + '@types/node': 16.18.76 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -4107,7 +4410,7 @@ packages: resolution: {integrity: sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==} engines: {node: '>= 10.14.2'} dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@jest/types': 26.6.2 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 @@ -4130,7 +4433,7 @@ packages: resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@jest/types': 27.5.1 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 @@ -4154,7 +4457,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 16.18.64 + '@types/node': 16.18.76 '@types/yargs': 15.0.19 chalk: 4.1.2 @@ -4164,7 +4467,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 16.18.64 + '@types/node': 16.18.76 '@types/yargs': 16.0.9 chalk: 4.1.2 @@ -4175,7 +4478,7 @@ packages: '@jest/schemas': 28.1.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 16.18.64 + '@types/node': 16.18.76 '@types/yargs': 17.0.32 chalk: 4.1.2 @@ -4186,7 +4489,7 @@ packages: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 16.18.64 + '@types/node': 16.18.76 '@types/yargs': 17.0.32 chalk: 4.1.2 dev: true @@ -4201,31 +4504,53 @@ packages: dependencies: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/trace-mapping': 0.3.22 + + /@jridgewell/gen-mapping@0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 /@jridgewell/resolve-uri@3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + /@jridgewell/set-array@1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + /@jridgewell/source-map@0.3.5: resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} dependencies: '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/trace-mapping': 0.3.22 /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - /@jridgewell/trace-mapping@0.3.20: - resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + /@jridgewell/trace-mapping@0.3.22: + resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: @@ -4242,10 +4567,6 @@ packages: lit: 2.8.0 dev: false - /@ledgerhq/connect-kit-loader@1.1.2: - resolution: {integrity: sha512-mscwGroSJQrCTjtNGBu+18FQbZYA4+q6Tyx6K7CXHl6AwgZKbWfZYdgP2F+fyZcRUdGRsMX8QtvU61VcGGtO1A==} - dev: false - /@leichtgewicht/ip-codec@2.0.4: resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} @@ -4260,7 +4581,7 @@ packages: /@manypkg/find-root@1.1.0: resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.9 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 @@ -4269,7 +4590,7 @@ packages: /@manypkg/get-packages@1.1.3: resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.9 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 @@ -4280,7 +4601,7 @@ packages: /@mattrglobal/bbs-signatures@0.5.0(patch_hash=i6f4fdawxlwk2ulgcpjpsixrei): resolution: {integrity: sha512-4te4TpacAmeCM8aa/kHkU0i1IJwsO1x/Tez6/YLUWg6rK6bfGA1NNO7IBc12u9ETkoTsiU32UmsiYWXcw9QwKQ==} optionalDependencies: - '@mattrglobal/node-bbs-signatures': 0.11.0 + '@mattrglobal/node-bbs-signatures': 0.11.0(patch_hash=du3euicl4oreiseb3vykbrzjji) transitivePeerDependencies: - supports-color dev: false @@ -4296,7 +4617,7 @@ packages: - supports-color dev: false - /@mattrglobal/node-bbs-signatures@0.11.0: + /@mattrglobal/node-bbs-signatures@0.11.0(patch_hash=du3euicl4oreiseb3vykbrzjji): resolution: {integrity: sha512-V0wcY0ZewrPOiMOrL3wam0oYL1SLbF2ihgAM6JQvLrAKw1MckYiJ8T4vL+nOBs2hf1PA1TZI+USe5mqMWuVKTw==} engines: {node: '>=10', yarn: 1.x} requiresBuild: true @@ -4307,6 +4628,7 @@ packages: - supports-color dev: false optional: true + patched: true /@mdx-js/mdx@2.3.0: resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} @@ -4338,7 +4660,7 @@ packages: react: '>=16' dependencies: '@types/mdx': 2.0.10 - '@types/react': 18.2.38 + '@types/react': 18.2.48 react: 18.2.0 dev: false @@ -4358,64 +4680,65 @@ packages: - supports-color dev: false - /@motionone/animation@10.16.3: - resolution: {integrity: sha512-QUGWpLbMFLhyqKlngjZhjtxM8IqiJQjLK0DF+XOF6od9nhSvlaeEpOY/UMCRVcZn/9Tr2rZO22EkuCIjYdI74g==} + /@motionone/animation@10.17.0: + resolution: {integrity: sha512-ANfIN9+iq1kGgsZxs+Nz96uiNcPLGTXwfNo2Xz/fcJXniPYpaz/Uyrfa+7I5BPLxCP82sh7quVDudf1GABqHbg==} dependencies: - '@motionone/easing': 10.16.3 - '@motionone/types': 10.16.3 - '@motionone/utils': 10.16.3 + '@motionone/easing': 10.17.0 + '@motionone/types': 10.17.0 + '@motionone/utils': 10.17.0 tslib: 2.6.2 dev: false - /@motionone/dom@10.16.4: - resolution: {integrity: sha512-HPHlVo/030qpRj9R8fgY50KTN4Ko30moWRTA3L3imrsRBmob93cTYmodln49HYFbQm01lFF7X523OkKY0DX6UA==} + /@motionone/dom@10.17.0: + resolution: {integrity: sha512-cMm33swRlCX/qOPHWGbIlCl0K9Uwi6X5RiL8Ma6OrlJ/TP7Q+Np5GE4xcZkFptysFjMTi4zcZzpnNQGQ5D6M0Q==} dependencies: - '@motionone/animation': 10.16.3 - '@motionone/generators': 10.16.4 - '@motionone/types': 10.16.3 - '@motionone/utils': 10.16.3 + '@motionone/animation': 10.17.0 + '@motionone/generators': 10.17.0 + '@motionone/types': 10.17.0 + '@motionone/utils': 10.17.0 hey-listen: 1.0.8 tslib: 2.6.2 dev: false - /@motionone/easing@10.16.3: - resolution: {integrity: sha512-HWTMZbTmZojzwEuKT/xCdvoMPXjYSyQvuVM6jmM0yoGU6BWzsmYMeB4bn38UFf618fJCNtP9XeC/zxtKWfbr0w==} + /@motionone/easing@10.17.0: + resolution: {integrity: sha512-Bxe2wSuLu/qxqW4rBFS5m9tMLOw+QBh8v5A7Z5k4Ul4sTj5jAOfZG5R0bn5ywmk+Fs92Ij1feZ5pmC4TeXA8Tg==} dependencies: - '@motionone/utils': 10.16.3 + '@motionone/utils': 10.17.0 tslib: 2.6.2 dev: false - /@motionone/generators@10.16.4: - resolution: {integrity: sha512-geFZ3w0Rm0ZXXpctWsSf3REGywmLLujEjxPYpBR0j+ymYwof0xbV6S5kGqqsDKgyWKVWpUInqQYvQfL6fRbXeg==} + /@motionone/generators@10.17.0: + resolution: {integrity: sha512-T6Uo5bDHrZWhIfxG/2Aut7qyWQyJIWehk6OB4qNvr/jwA/SRmixwbd7SOrxZi1z5rH3LIeFFBKK1xHnSbGPZSQ==} dependencies: - '@motionone/types': 10.16.3 - '@motionone/utils': 10.16.3 + '@motionone/types': 10.17.0 + '@motionone/utils': 10.17.0 tslib: 2.6.2 dev: false /@motionone/svelte@10.16.4: resolution: {integrity: sha512-zRVqk20lD1xqe+yEDZhMYgftsuHc25+9JSo+r0a0OWUJFocjSV9D/+UGhX4xgJsuwB9acPzXLr20w40VnY2PQA==} dependencies: - '@motionone/dom': 10.16.4 + '@motionone/dom': 10.17.0 tslib: 2.6.2 dev: false - /@motionone/types@10.16.3: - resolution: {integrity: sha512-W4jkEGFifDq73DlaZs3HUfamV2t1wM35zN/zX7Q79LfZ2sc6C0R1baUHZmqc/K5F3vSw3PavgQ6HyHLd/MXcWg==} + /@motionone/types@10.17.0: + resolution: {integrity: sha512-EgeeqOZVdRUTEHq95Z3t8Rsirc7chN5xFAPMYFobx8TPubkEfRSm5xihmMUkbaR2ErKJTUw3347QDPTHIW12IA==} dev: false - /@motionone/utils@10.16.3: - resolution: {integrity: sha512-WNWDksJIxQkaI9p9Z9z0+K27xdqISGNFy1SsWVGaiedTHq0iaT6iZujby8fT/ZnZxj1EOaxJtSfUPCFNU5CRoA==} + /@motionone/utils@10.17.0: + resolution: {integrity: sha512-bGwrki4896apMWIj9yp5rAS2m0xyhxblg6gTB/leWDPt+pb410W8lYWsxyurX+DH+gO1zsQsfx2su/c1/LtTpg==} dependencies: - '@motionone/types': 10.16.3 + '@motionone/types': 10.17.0 hey-listen: 1.0.8 tslib: 2.6.2 dev: false /@motionone/vue@10.16.4: resolution: {integrity: sha512-z10PF9JV6SbjFq+/rYabM+8CVlMokgl8RFGvieSGNTmrkQanfHn+15XBrhG3BgUfvmTeSeyShfOHpG0i9zEdcg==} + deprecated: Motion One for Vue is deprecated. Use Oku Motion instead https://oku-ui.com/motion dependencies: - '@motionone/dom': 10.16.4 + '@motionone/dom': 10.17.0 tslib: 2.6.2 dev: false @@ -4429,8 +4752,8 @@ packages: engines: {node: '>= 14'} dev: false - /@napi-rs/simple-git-android-arm-eabi@0.1.9: - resolution: {integrity: sha512-9D4JnfePMpgL4pg9aMUX7/TIWEUQ+Tgx8n3Pf8TNCMGjUbImJyYsDSLJzbcv9wH7srgn4GRjSizXFJHAPjzEug==} + /@napi-rs/simple-git-android-arm-eabi@0.1.11: + resolution: {integrity: sha512-wt4Wu9MxvKzEqT4iwodFs7Nrc31K73gR5hM7VnlO6iLELmUQZ5JVJkYoFWgzLQWtzIC48W2+zFMbBgY6+F2rZg==} engines: {node: '>= 10'} cpu: [arm] os: [android] @@ -4438,8 +4761,8 @@ packages: dev: false optional: true - /@napi-rs/simple-git-android-arm64@0.1.9: - resolution: {integrity: sha512-Krilsw0gPrrASZzudNEl9pdLuNbhoTK0j7pUbfB8FRifpPdFB/zouwuEm0aSnsDXN4ftGrmGG82kuiR/2MeoPg==} + /@napi-rs/simple-git-android-arm64@0.1.11: + resolution: {integrity: sha512-5/Aj6N44CxwhV3TZWRZ4vGqFj4wb2/a2gwvUZJo9Dwik9Spls7As8LaLe7pOptiGPH0GRP3H5kTT7I6twHNgqw==} engines: {node: '>= 10'} cpu: [arm64] os: [android] @@ -4447,8 +4770,8 @@ packages: dev: false optional: true - /@napi-rs/simple-git-darwin-arm64@0.1.9: - resolution: {integrity: sha512-H/F09nDgYjv4gcFrZBgdTKkZEepqt0KLYcCJuUADuxkKupmjLdecMhypXLk13AzvLW4UQI7NlLTLDXUFLyr2BA==} + /@napi-rs/simple-git-darwin-arm64@0.1.11: + resolution: {integrity: sha512-vdVsJUNcRsGVu0hBmLZdxxgwIbJA/Ias8NKWze8MZkZ3VyBwhg0uAzFgESEL3/USAgeCCHjF3uwVki8E+iPq1w==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -4456,8 +4779,8 @@ packages: dev: false optional: true - /@napi-rs/simple-git-darwin-x64@0.1.9: - resolution: {integrity: sha512-jBR2xS9nVPqmHv0TWz874W0m/d453MGrMeLjB+boK5IPPLhg3AWIZj0aN9jy2Je1BGVAa0w3INIQJtBBeB6kFA==} + /@napi-rs/simple-git-darwin-x64@0.1.11: + resolution: {integrity: sha512-ufVuZxyJ3LpApk3V101X9qYNX91fnQ4isulz9lWjg90U7Xz0Cav4J3yyFZy6B/cJpYxuiy49R8wV1xDtTeGThA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -4465,8 +4788,8 @@ packages: dev: false optional: true - /@napi-rs/simple-git-linux-arm-gnueabihf@0.1.9: - resolution: {integrity: sha512-3n0+VpO4YfZxndZ0sCvsHIvsazd+JmbSjrlTRBCnJeAU1/sfos3skNZtKGZksZhjvd+3o+/GFM8L7Xnv01yggA==} + /@napi-rs/simple-git-linux-arm-gnueabihf@0.1.11: + resolution: {integrity: sha512-rFafW0Qc/j5we2ghUecB7mFzGcNDtJ5lTiB4I7kffNeL8pEi6Yi7kST8hylswcCowia65d45xsyeNp1mFlFwcg==} engines: {node: '>= 10'} cpu: [arm] os: [linux] @@ -4474,8 +4797,8 @@ packages: dev: false optional: true - /@napi-rs/simple-git-linux-arm64-gnu@0.1.9: - resolution: {integrity: sha512-lIzf0KHU2SKC12vMrWwCtysG2Sdt31VHRPMUiz9lD9t3xwVn8qhFSTn5yDkTeG3rgX6o0p5EKalfQN5BXsJq2w==} + /@napi-rs/simple-git-linux-arm64-gnu@0.1.11: + resolution: {integrity: sha512-HZ4yaqpj/FQ3V9qNQrTGhtXb7pLAARXeRJrwoaGfz3eZ069y2bHReFcNR//5bsVhZ18JaS9EV47F8WjDxtpI5g==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -4483,8 +4806,8 @@ packages: dev: false optional: true - /@napi-rs/simple-git-linux-arm64-musl@0.1.9: - resolution: {integrity: sha512-KQozUoNXrxrB8k741ncWXSiMbjl1AGBGfZV21PANzUM8wH4Yem2bg3kfglYS/QIx3udspsT35I9abu49n7D1/w==} + /@napi-rs/simple-git-linux-arm64-musl@0.1.11: + resolution: {integrity: sha512-b39lJiC3n2+Y6Exjx6qwHoBF++D3k2hN4mZZkvQCFSdLXJ2xtalCatSRWW3pt+mHOHMOgbGektL5v5BYq52hxw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -4492,8 +4815,8 @@ packages: dev: false optional: true - /@napi-rs/simple-git-linux-x64-gnu@0.1.9: - resolution: {integrity: sha512-O/Niui5mnHPcK3iYC3ui8wgERtJWsQ3Y74W/09t0bL/3dgzGMl4oQt0qTj9dWCsnoGsIEYHPzwCBp/2vqYp/pw==} + /@napi-rs/simple-git-linux-x64-gnu@0.1.11: + resolution: {integrity: sha512-9EPFvY7PZg+oqWi6Jft5WgSsQtvy9Ey1g4NG+LG8y1RbvaNKthxKbR5zgx196pnFVdcLtsuIdOv/OaQlbcTXkw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -4501,8 +4824,8 @@ packages: dev: false optional: true - /@napi-rs/simple-git-linux-x64-musl@0.1.9: - resolution: {integrity: sha512-L9n+e8Wn3hKr3RsIdY8GaB+ry4xZ4BaGwyKExgoB8nDGQuRUY9oP6p0WA4hWfJvJnU1H6hvo36a5UFPReyBO7A==} + /@napi-rs/simple-git-linux-x64-musl@0.1.11: + resolution: {integrity: sha512-doIt1lPYIGL3UthlEQjdM9s1Wv0v8bz8LVAgbzJMS+UpVZzArwLWkanAJCy1HjgMTUMiE3AVJqACKIF3EfW/TQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -4510,8 +4833,8 @@ packages: dev: false optional: true - /@napi-rs/simple-git-win32-arm64-msvc@0.1.9: - resolution: {integrity: sha512-Z6Ja/SZK+lMvRWaxj7wjnvSbAsGrH006sqZo8P8nxKUdZfkVvoCaAWr1r0cfkk2Z3aijLLtD+vKeXGlUPH6gGQ==} + /@napi-rs/simple-git-win32-arm64-msvc@0.1.11: + resolution: {integrity: sha512-TK3Uvj3Q72ebxfxDT/eLFt8sxCNHo20QMvqJ5BHt4zP1Y9Fl1DXSPRUKLBIhJd0nPcI45ZOMRiZyoT8joxAC9g==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -4519,8 +4842,8 @@ packages: dev: false optional: true - /@napi-rs/simple-git-win32-x64-msvc@0.1.9: - resolution: {integrity: sha512-VAZj1UvC+R2MjKOD3I/Y7dmQlHWAYy4omhReQJRpbCf+oGCBi9CWiIduGqeYEq723nLIKdxP7XjaO0wl1NnUww==} + /@napi-rs/simple-git-win32-x64-msvc@0.1.11: + resolution: {integrity: sha512-XOgP6kFDXGmB2KCXFQEsCq70n/Do2h7W9o7qZu8APAD+Sc8JGKz4hKG7PKY2ot924v9nIoKSYbHnupnhXSoXkg==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -4528,21 +4851,21 @@ packages: dev: false optional: true - /@napi-rs/simple-git@0.1.9: - resolution: {integrity: sha512-qKzDS0+VjMvVyU28px+C6zlD1HKy83NIdYzfMQWa/g/V1iG/Ic8uwrS2ihHfm7mp7X0PPrmINLiTTi6ieUIKfw==} + /@napi-rs/simple-git@0.1.11: + resolution: {integrity: sha512-z14cPCBrtDKKVJ3q4GS5gmXEithGUAt+U8sICgA9i3UFdxJKD4H5rCnO7BVC3htdE9g6OR2w2IcHAL56AjpFbg==} engines: {node: '>= 10'} optionalDependencies: - '@napi-rs/simple-git-android-arm-eabi': 0.1.9 - '@napi-rs/simple-git-android-arm64': 0.1.9 - '@napi-rs/simple-git-darwin-arm64': 0.1.9 - '@napi-rs/simple-git-darwin-x64': 0.1.9 - '@napi-rs/simple-git-linux-arm-gnueabihf': 0.1.9 - '@napi-rs/simple-git-linux-arm64-gnu': 0.1.9 - '@napi-rs/simple-git-linux-arm64-musl': 0.1.9 - '@napi-rs/simple-git-linux-x64-gnu': 0.1.9 - '@napi-rs/simple-git-linux-x64-musl': 0.1.9 - '@napi-rs/simple-git-win32-arm64-msvc': 0.1.9 - '@napi-rs/simple-git-win32-x64-msvc': 0.1.9 + '@napi-rs/simple-git-android-arm-eabi': 0.1.11 + '@napi-rs/simple-git-android-arm64': 0.1.11 + '@napi-rs/simple-git-darwin-arm64': 0.1.11 + '@napi-rs/simple-git-darwin-x64': 0.1.11 + '@napi-rs/simple-git-linux-arm-gnueabihf': 0.1.11 + '@napi-rs/simple-git-linux-arm64-gnu': 0.1.11 + '@napi-rs/simple-git-linux-arm64-musl': 0.1.11 + '@napi-rs/simple-git-linux-x64-gnu': 0.1.11 + '@napi-rs/simple-git-linux-x64-musl': 0.1.11 + '@napi-rs/simple-git-win32-arm64-msvc': 0.1.11 + '@napi-rs/simple-git-win32-x64-msvc': 0.1.11 dev: false /@next/env@13.5.6: @@ -4647,6 +4970,12 @@ packages: '@noble/hashes': 1.3.2 dev: false + /@noble/curves@1.3.0: + resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==} + dependencies: + '@noble/hashes': 1.3.3 + dev: false + /@noble/ed25519@2.0.0: resolution: {integrity: sha512-/extjhkwFupyopDrt80OMWKdLgP429qLZj+z6sYJz90rF2Iz0gjZh2ArMKPImUl13Kx+0EXI2hN9T/KJV0/Zng==} dev: false @@ -4656,6 +4985,11 @@ packages: engines: {node: '>= 16'} dev: false + /@noble/hashes@1.3.3: + resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} + engines: {node: '>= 16'} + dev: false + /@noble/secp256k1@1.7.1: resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} dev: false @@ -4676,10 +5010,10 @@ packages: engines: {node: '>= 8'} dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 + fastq: 1.16.0 - /@parcel/watcher-android-arm64@2.3.0: - resolution: {integrity: sha512-f4o9eA3dgk0XRT3XhB0UWpWpLnKgrh1IwNJKJ7UJek7eTYccQ8LR7XUWFKqw6aEq5KUNlCcGvSzKqSX/vtWVVA==} + /@parcel/watcher-android-arm64@2.4.0: + resolution: {integrity: sha512-+fPtO/GsbYX1LJnCYCaDVT3EOBjvSFdQN9Mrzh9zWAOOfvidPWyScTrHIZHHfJBvlHzNA0Gy0U3NXFA/M7PHUA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [android] @@ -4687,8 +5021,8 @@ packages: dev: false optional: true - /@parcel/watcher-darwin-arm64@2.3.0: - resolution: {integrity: sha512-mKY+oijI4ahBMc/GygVGvEdOq0L4DxhYgwQqYAz/7yPzuGi79oXrZG52WdpGA1wLBPrYb0T8uBaGFo7I6rvSKw==} + /@parcel/watcher-darwin-arm64@2.4.0: + resolution: {integrity: sha512-T/At5pansFuQ8VJLRx0C6C87cgfqIYhW2N/kBfLCUvDhCah0EnLLwaD/6MW3ux+rpgkpQAnMELOCTKlbwncwiA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [darwin] @@ -4696,8 +5030,8 @@ packages: dev: false optional: true - /@parcel/watcher-darwin-x64@2.3.0: - resolution: {integrity: sha512-20oBj8LcEOnLE3mgpy6zuOq8AplPu9NcSSSfyVKgfOhNAc4eF4ob3ldj0xWjGGbOF7Dcy1Tvm6ytvgdjlfUeow==} + /@parcel/watcher-darwin-x64@2.4.0: + resolution: {integrity: sha512-vZMv9jl+szz5YLsSqEGCMSllBl1gU1snfbRL5ysJU03MEa6gkVy9OMcvXV1j4g0++jHEcvzhs3Z3LpeEbVmY6Q==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [darwin] @@ -4705,8 +5039,8 @@ packages: dev: false optional: true - /@parcel/watcher-freebsd-x64@2.3.0: - resolution: {integrity: sha512-7LftKlaHunueAEiojhCn+Ef2CTXWsLgTl4hq0pkhkTBFI3ssj2bJXmH2L67mKpiAD5dz66JYk4zS66qzdnIOgw==} + /@parcel/watcher-freebsd-x64@2.4.0: + resolution: {integrity: sha512-dHTRMIplPDT1M0+BkXjtMN+qLtqq24sLDUhmU+UxxLP2TEY2k8GIoqIJiVrGWGomdWsy5IO27aDV1vWyQ6gfHA==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [freebsd] @@ -4714,8 +5048,8 @@ packages: dev: false optional: true - /@parcel/watcher-linux-arm-glibc@2.3.0: - resolution: {integrity: sha512-1apPw5cD2xBv1XIHPUlq0cO6iAaEUQ3BcY0ysSyD9Kuyw4MoWm1DV+W9mneWI+1g6OeP6dhikiFE6BlU+AToTQ==} + /@parcel/watcher-linux-arm-glibc@2.4.0: + resolution: {integrity: sha512-9NQXD+qk46RwATNC3/UB7HWurscY18CnAPMTFcI9Y8CTbtm63/eex1SNt+BHFinEQuLBjaZwR2Lp+n7pmEJPpQ==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] @@ -4723,8 +5057,8 @@ packages: dev: false optional: true - /@parcel/watcher-linux-arm64-glibc@2.3.0: - resolution: {integrity: sha512-mQ0gBSQEiq1k/MMkgcSB0Ic47UORZBmWoAWlMrTW6nbAGoLZP+h7AtUM7H3oDu34TBFFvjy4JCGP43JlylkTQA==} + /@parcel/watcher-linux-arm64-glibc@2.4.0: + resolution: {integrity: sha512-QuJTAQdsd7PFW9jNGaV9Pw+ZMWV9wKThEzzlY3Lhnnwy7iW23qtQFPql8iEaSFMCVI5StNNmONUopk+MFKpiKg==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] @@ -4732,8 +5066,8 @@ packages: dev: false optional: true - /@parcel/watcher-linux-arm64-musl@2.3.0: - resolution: {integrity: sha512-LXZAExpepJew0Gp8ZkJ+xDZaTQjLHv48h0p0Vw2VMFQ8A+RKrAvpFuPVCVwKJCr5SE+zvaG+Etg56qXvTDIedw==} + /@parcel/watcher-linux-arm64-musl@2.4.0: + resolution: {integrity: sha512-oyN+uA9xcTDo/45bwsd6TFHa7Lc7hKujyMlvwrCLvSckvWogndCEoVYFNfZ6JJ2KNL/6fFiGPcbjp8jJmEh5Ng==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] @@ -4741,8 +5075,8 @@ packages: dev: false optional: true - /@parcel/watcher-linux-x64-glibc@2.3.0: - resolution: {integrity: sha512-P7Wo91lKSeSgMTtG7CnBS6WrA5otr1K7shhSjKHNePVmfBHDoAOHYRXgUmhiNfbcGk0uMCHVcdbfxtuiZCHVow==} + /@parcel/watcher-linux-x64-glibc@2.4.0: + resolution: {integrity: sha512-KphV8awJmxU3q52JQvJot0QMu07CIyEjV+2Tb2ZtbucEgqyRcxOBDMsqp1JNq5nuDXtcCC0uHQICeiEz38dPBQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] @@ -4750,8 +5084,8 @@ packages: dev: false optional: true - /@parcel/watcher-linux-x64-musl@2.3.0: - resolution: {integrity: sha512-+kiRE1JIq8QdxzwoYY+wzBs9YbJ34guBweTK8nlzLKimn5EQ2b2FSC+tAOpq302BuIMjyuUGvBiUhEcLIGMQ5g==} + /@parcel/watcher-linux-x64-musl@2.4.0: + resolution: {integrity: sha512-7jzcOonpXNWcSijPpKD5IbC6xC7yTibjJw9jviVzZostYLGxbz8LDJLUnLzLzhASPlPGgpeKLtFUMjAAzM+gSA==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] @@ -4770,8 +5104,8 @@ packages: bundledDependencies: - napi-wasm - /@parcel/watcher-win32-arm64@2.3.0: - resolution: {integrity: sha512-35gXCnaz1AqIXpG42evcoP2+sNL62gZTMZne3IackM+6QlfMcJLy3DrjuL6Iks7Czpd3j4xRBzez3ADCj1l7Aw==} + /@parcel/watcher-win32-arm64@2.4.0: + resolution: {integrity: sha512-NOej2lqlq8bQNYhUMnOD0nwvNql8ToQF+1Zhi9ULZoG+XTtJ9hNnCFfyICxoZLXor4bBPTOnzs/aVVoefYnjIg==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [win32] @@ -4779,8 +5113,8 @@ packages: dev: false optional: true - /@parcel/watcher-win32-ia32@2.3.0: - resolution: {integrity: sha512-FJS/IBQHhRpZ6PiCjFt1UAcPr0YmCLHRbTc00IBTrelEjlmmgIVLeOx4MSXzx2HFEy5Jo5YdhGpxCuqCyDJ5ow==} + /@parcel/watcher-win32-ia32@2.4.0: + resolution: {integrity: sha512-IO/nM+K2YD/iwjWAfHFMBPz4Zqn6qBDqZxY4j2n9s+4+OuTSRM/y/irksnuqcspom5DjkSeF9d0YbO+qpys+JA==} engines: {node: '>= 10.0.0'} cpu: [ia32] os: [win32] @@ -4788,8 +5122,8 @@ packages: dev: false optional: true - /@parcel/watcher-win32-x64@2.3.0: - resolution: {integrity: sha512-dLx+0XRdMnVI62kU3wbXvbIRhLck4aE28bIGKbRGS7BJNt54IIj9+c/Dkqb+7DJEbHUZAX1bwaoM8PqVlHJmCA==} + /@parcel/watcher-win32-x64@2.4.0: + resolution: {integrity: sha512-pAUyUVjfFjWaf/pShmJpJmNxZhbMvJASUpdes9jL6bTEJ+gDxPRSpXTIemNyNsb9AtbiGXs9XduP1reThmd+dA==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [win32] @@ -4797,27 +5131,27 @@ packages: dev: false optional: true - /@parcel/watcher@2.3.0: - resolution: {integrity: sha512-pW7QaFiL11O0BphO+bq3MgqeX/INAk9jgBldVDYjlQPO4VddoZnF22TcF9onMhnLVHuNqBJeRf+Fj7eezi/+rQ==} + /@parcel/watcher@2.4.0: + resolution: {integrity: sha512-XJLGVL0DEclX5pcWa2N9SX1jCGTDd8l972biNooLFtjneuGqodupPQh6XseXIBBeVIMaaJ7bTcs3qGvXwsp4vg==} engines: {node: '>= 10.0.0'} dependencies: detect-libc: 1.0.3 is-glob: 4.0.3 micromatch: 4.0.5 - node-addon-api: 7.0.0 + node-addon-api: 7.1.0 optionalDependencies: - '@parcel/watcher-android-arm64': 2.3.0 - '@parcel/watcher-darwin-arm64': 2.3.0 - '@parcel/watcher-darwin-x64': 2.3.0 - '@parcel/watcher-freebsd-x64': 2.3.0 - '@parcel/watcher-linux-arm-glibc': 2.3.0 - '@parcel/watcher-linux-arm64-glibc': 2.3.0 - '@parcel/watcher-linux-arm64-musl': 2.3.0 - '@parcel/watcher-linux-x64-glibc': 2.3.0 - '@parcel/watcher-linux-x64-musl': 2.3.0 - '@parcel/watcher-win32-arm64': 2.3.0 - '@parcel/watcher-win32-ia32': 2.3.0 - '@parcel/watcher-win32-x64': 2.3.0 + '@parcel/watcher-android-arm64': 2.4.0 + '@parcel/watcher-darwin-arm64': 2.4.0 + '@parcel/watcher-darwin-x64': 2.4.0 + '@parcel/watcher-freebsd-x64': 2.4.0 + '@parcel/watcher-linux-arm-glibc': 2.4.0 + '@parcel/watcher-linux-arm64-glibc': 2.4.0 + '@parcel/watcher-linux-arm64-musl': 2.4.0 + '@parcel/watcher-linux-x64-glibc': 2.4.0 + '@parcel/watcher-linux-x64-musl': 2.4.0 + '@parcel/watcher-win32-arm64': 2.4.0 + '@parcel/watcher-win32-ia32': 2.4.0 + '@parcel/watcher-win32-x64': 2.4.0 dev: false /@peculiar/asn1-schema@2.3.8: @@ -4833,21 +5167,27 @@ packages: dependencies: tslib: 2.6.2 - /@peculiar/webcrypto@1.4.3(patch_hash=bbuork7btorjpwgh5cqtzopbca): - resolution: {integrity: sha512-VtaY4spKTdN5LjJ04im/d/joXuvLbQdgy5Z4DXF4MFZhQ+MTrejbNMkfZBp1Bs3O5+bFqnJgyGdPuZQflvIa5A==} + /@peculiar/webcrypto@1.4.5(patch_hash=saeohqf4hlpnnys7brc6umjxqq): + resolution: {integrity: sha512-oDk93QCDGdxFRM8382Zdminzs44dg3M2+E5Np+JWkpqLDyJC9DviMh8F8mEJkYuUcUOGA5jHO5AJJ10MFWdbZw==} engines: {node: '>=10.12.0'} dependencies: '@peculiar/asn1-schema': 2.3.8 '@peculiar/json-schema': 1.1.12 pvtsutils: 1.3.5 tslib: 2.6.2 - webcrypto-core: 1.7.7 + webcrypto-core: 1.7.8 patched: true /@perspect3vism/rollup-plugin-dna@0.0.2: resolution: {integrity: sha512-+18Prdkzv1dcEzyWIp/DersXHcfpU6rDxDPdXGtfzB/ritepc7ehYSN60E94uNNzuOy7QaK4p2YL3DPPkgsb8g==} - /@pmmmwh/react-refresh-webpack-plugin@0.5.11(react-refresh@0.11.0)(webpack-dev-server@4.15.1)(webpack@5.89.0): + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + optional: true + + /@pmmmwh/react-refresh-webpack-plugin@0.5.11(react-refresh@0.11.0)(webpack-dev-server@4.15.1)(webpack@5.90.0): resolution: {integrity: sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ==} engines: {node: '>= 10.13'} peerDependencies: @@ -4875,7 +5215,7 @@ packages: dependencies: ansi-html-community: 0.0.8 common-path-prefix: 3.0.0 - core-js-pure: 3.33.3 + core-js-pure: 3.35.1 error-stack-parser: 2.1.4 find-up: 5.0.0 html-entities: 2.4.0 @@ -4883,29 +5223,31 @@ packages: react-refresh: 0.11.0 schema-utils: 3.3.0 source-map: 0.7.4 - webpack: 5.89.0 - webpack-dev-server: 4.15.1(webpack@5.89.0) + webpack: 5.90.0 + webpack-dev-server: 4.15.1(webpack@5.90.0) /@popperjs/core@2.11.8: resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} dev: false - /@preact/preset-vite@2.7.0(@babel/core@7.23.3)(preact@10.19.2)(vite@4.5.0): - resolution: {integrity: sha512-m5N0FVtxbCCDxNk55NGhsRpKJChYcupcuQHzMJc/Bll07IKZKn8amwYciyKFS9haU6AgzDAJ/ewvApr6Qg1DHw==} + /@preact/preset-vite@2.8.1(@babel/core@7.24.3)(preact@10.19.3)(vite@4.5.2): + resolution: {integrity: sha512-a9KV4opdj17X2gOFuGup0aE+sXYABX/tJi/QDptOrleX4FlnoZgDWvz45tHOdVfrZX+3uvVsIYPHxRsTerkDNA==} peerDependencies: '@babel/core': 7.x vite: 2.x || 3.x || 4.x || 5.x dependencies: - '@babel/core': 7.23.3 - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.3) - '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.23.3) - '@prefresh/vite': 2.4.4(preact@10.19.2)(vite@4.5.0) + '@babel/core': 7.24.3 + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.3) + '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.24.3) + '@prefresh/vite': 2.4.5(preact@10.19.3)(vite@4.5.2) '@rollup/pluginutils': 4.2.1 - babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.23.3) + babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.24.3) debug: 4.3.4(supports-color@8.1.1) kolorist: 1.8.0 + magic-string: 0.30.5 + node-html-parser: 6.1.12 resolve: 1.22.8 - vite: 4.5.0(@types/node@18.11.10) + vite: 4.5.2(@types/node@18.11.10) transitivePeerDependencies: - preact - supports-color @@ -4914,29 +5256,29 @@ packages: /@prefresh/babel-plugin@0.5.1: resolution: {integrity: sha512-uG3jGEAysxWoyG3XkYfjYHgaySFrSsaEb4GagLzYaxlydbuREtaX+FTxuIidp241RaLl85XoHg9Ej6E4+V1pcg==} - /@prefresh/core@1.5.2(preact@10.19.2): + /@prefresh/core@1.5.2(preact@10.19.3): resolution: {integrity: sha512-A/08vkaM1FogrCII5PZKCrygxSsc11obExBScm3JF1CryK2uDS3ZXeni7FeKCx1nYdUkj4UcJxzPzc1WliMzZA==} peerDependencies: preact: ^10.0.0 dependencies: - preact: 10.19.2 + preact: 10.19.3 /@prefresh/utils@1.2.0: resolution: {integrity: sha512-KtC/fZw+oqtwOLUFM9UtiitB0JsVX0zLKNyRTA332sqREqSALIIQQxdUCS1P3xR/jT1e2e8/5rwH6gdcMLEmsQ==} - /@prefresh/vite@2.4.4(preact@10.19.2)(vite@4.5.0): - resolution: {integrity: sha512-7jcz3j5pXufOWTjl31n0Lc3BcU8oGoacoaWx/Ur1QJ+fd4Xu0G7g/ER1xV02x7DCiVoFi7xtSgaophOXoJvpmA==} + /@prefresh/vite@2.4.5(preact@10.19.3)(vite@4.5.2): + resolution: {integrity: sha512-iForDVJ2M8gQYnm5pHumvTEJjGGc7YNYC0GVKnHFL+GvFfKHfH9Rpq67nUAzNbjuLEpqEOUuQVQajMazWu2ZNQ==} peerDependencies: preact: ^10.4.0 vite: '>=2.0.0' dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@prefresh/babel-plugin': 0.5.1 - '@prefresh/core': 1.5.2(preact@10.19.2) + '@prefresh/core': 1.5.2(preact@10.19.3) '@prefresh/utils': 1.2.0 '@rollup/pluginutils': 4.2.1 - preact: 10.19.2 - vite: 4.5.0(@types/node@18.11.10) + preact: 10.19.3 + vite: 4.5.2(@types/node@18.11.10) transitivePeerDependencies: - supports-color @@ -4983,8 +5325,8 @@ packages: resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} dev: true - /@remix-run/router@1.13.0: - resolution: {integrity: sha512-5dMOnVnefRsl4uRnAdoWjtVTdh8e6aZqgM4puy9nmEADH72ck+uXwzpJLEKE9Q6F8ZljNewLgmTfkxUrBdv4WA==} + /@remix-run/router@1.14.2: + resolution: {integrity: sha512-ACXpdMM9hmKZww21yEqWwiLws/UPLhNKvimN8RrYSqPSvB3ov7sLvAcfvaxePeLvccTQKGdkDIhLYApZVDFuKg==} engines: {node: '>=14.0.0'} dev: false @@ -4998,7 +5340,7 @@ packages: slash: 3.0.0 dev: true - /@rollup/plugin-babel@5.3.1(@babel/core@7.23.3)(rollup@2.79.1): + /@rollup/plugin-babel@5.3.1(@babel/core@7.23.9)(rollup@2.79.1): resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} engines: {node: '>= 10.0.0'} peerDependencies: @@ -5009,7 +5351,7 @@ packages: '@types/babel__core': optional: true dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@babel/helper-module-imports': 7.22.15 '@rollup/pluginutils': 3.1.0(rollup@2.79.1) rollup: 2.79.1 @@ -5122,8 +5464,8 @@ packages: magic-string: 0.25.9 rollup: 2.79.1 - /@rollup/plugin-typescript@11.1.5(rollup@2.79.1)(tslib@2.6.2)(typescript@4.9.5): - resolution: {integrity: sha512-rnMHrGBB0IUEv69Q8/JGRD/n4/n6b3nfpufUu26axhUcboUzv/twfZU8fIBbTOphRAe0v8EyxzeDpKXqGHfyDA==} + /@rollup/plugin-typescript@11.1.6(rollup@2.79.1)(tslib@2.6.2)(typescript@4.9.5): + resolution: {integrity: sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^2.14.0||^3.0.0||^4.0.0 @@ -5135,7 +5477,7 @@ packages: tslib: optional: true dependencies: - '@rollup/pluginutils': 5.0.5(rollup@2.79.1) + '@rollup/pluginutils': 5.1.0(rollup@2.79.1) resolve: 1.22.8 rollup: 2.79.1 tslib: 2.6.2 @@ -5174,8 +5516,8 @@ packages: estree-walker: 2.0.2 picomatch: 2.3.1 - /@rollup/pluginutils@5.0.5(rollup@2.79.1): - resolution: {integrity: sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==} + /@rollup/pluginutils@5.1.0(rollup@2.79.1): + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -5189,109 +5531,117 @@ packages: rollup: 2.79.1 dev: true - /@rollup/rollup-android-arm-eabi@4.5.1: - resolution: {integrity: sha512-YaN43wTyEBaMqLDYeze+gQ4ZrW5RbTEGtT5o1GVDkhpdNcsLTnLRcLccvwy3E9wiDKWg9RIhuoy3JQKDRBfaZA==} + /@rollup/rollup-android-arm-eabi@4.9.6: + resolution: {integrity: sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==} cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-android-arm64@4.5.1: - resolution: {integrity: sha512-n1bX+LCGlQVuPlCofO0zOKe1b2XkFozAVRoczT+yxWZPGnkEAKTTYVOGZz8N4sKuBnKMxDbfhUsB1uwYdup/sw==} + /@rollup/rollup-android-arm64@4.9.6: + resolution: {integrity: sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==} cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-arm64@4.5.1: - resolution: {integrity: sha512-QqJBumdvfBqBBmyGHlKxje+iowZwrHna7pokj/Go3dV1PJekSKfmjKrjKQ/e6ESTGhkfPNLq3VXdYLAc+UtAQw==} + /@rollup/rollup-darwin-arm64@4.9.6: + resolution: {integrity: sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-x64@4.5.1: - resolution: {integrity: sha512-RrkDNkR/P5AEQSPkxQPmd2ri8WTjSl0RYmuFOiEABkEY/FSg0a4riihWQGKDJ4LnV9gigWZlTMx2DtFGzUrYQw==} + /@rollup/rollup-darwin-x64@4.9.6: + resolution: {integrity: sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.5.1: - resolution: {integrity: sha512-ZFPxvUZmE+fkB/8D9y/SWl/XaDzNSaxd1TJUSE27XAKlRpQ2VNce/86bGd9mEUgL3qrvjJ9XTGwoX0BrJkYK/A==} + /@rollup/rollup-linux-arm-gnueabihf@4.9.6: + resolution: {integrity: sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==} cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.5.1: - resolution: {integrity: sha512-FEuAjzVIld5WVhu+M2OewLmjmbXWd3q7Zcx+Rwy4QObQCqfblriDMMS7p7+pwgjZoo9BLkP3wa9uglQXzsB9ww==} + /@rollup/rollup-linux-arm64-gnu@4.9.6: + resolution: {integrity: sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-musl@4.5.1: - resolution: {integrity: sha512-f5Gs8WQixqGRtI0Iq/cMqvFYmgFzMinuJO24KRfnv7Ohi/HQclwrBCYkzQu1XfLEEt3DZyvveq9HWo4bLJf1Lw==} + /@rollup/rollup-linux-arm64-musl@4.9.6: + resolution: {integrity: sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-gnu@4.5.1: - resolution: {integrity: sha512-CWPkPGrFfN2vj3mw+S7A/4ZaU3rTV7AkXUr08W9lNP+UzOvKLVf34tWCqrKrfwQ0NTk5GFqUr2XGpeR2p6R4gw==} + /@rollup/rollup-linux-riscv64-gnu@4.9.6: + resolution: {integrity: sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.9.6: + resolution: {integrity: sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-musl@4.5.1: - resolution: {integrity: sha512-ZRETMFA0uVukUC9u31Ed1nx++29073goCxZtmZARwk5aF/ltuENaeTtRVsSQzFlzdd4J6L3qUm+EW8cbGt0CKQ==} + /@rollup/rollup-linux-x64-musl@4.9.6: + resolution: {integrity: sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.5.1: - resolution: {integrity: sha512-ihqfNJNb2XtoZMSCPeoo0cYMgU04ksyFIoOw5S0JUVbOhafLot+KD82vpKXOurE2+9o/awrqIxku9MRR9hozHQ==} + /@rollup/rollup-win32-arm64-msvc@4.9.6: + resolution: {integrity: sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.5.1: - resolution: {integrity: sha512-zK9MRpC8946lQ9ypFn4gLpdwr5a01aQ/odiIJeL9EbgZDMgbZjjT/XzTqJvDfTmnE1kHdbG20sAeNlpc91/wbg==} + /@rollup/rollup-win32-ia32-msvc@4.9.6: + resolution: {integrity: sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==} cpu: [ia32] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-x64-msvc@4.5.1: - resolution: {integrity: sha512-5I3Nz4Sb9TYOtkRwlH0ow+BhMH2vnh38tZ4J4mggE48M/YyJyp/0sPSxhw1UeS1+oBgQ8q7maFtSeKpeRJu41Q==} + /@rollup/rollup-win32-x64-msvc@4.9.6: + resolution: {integrity: sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==} cpu: [x64] os: [win32] requiresBuild: true dev: true optional: true - /@rushstack/eslint-patch@1.6.0: - resolution: {integrity: sha512-2/U3GXA6YiPYQDLGwtGlnNgKYBSwCFIHf8Y9LUY5VATHdtbLlU0Y1R3QoBnT0aB4qv/BEiVVsj7LJXoQCgJ2vA==} + /@rushstack/eslint-patch@1.7.2: + resolution: {integrity: sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==} - /@safe-global/safe-apps-provider@0.17.1(typescript@5.3.2): - resolution: {integrity: sha512-lYfRqrbbK1aKU1/UGkYWc/X7PgySYcumXKc5FB2uuwAs2Ghj8uETuW5BrwPqyjBknRxutFbTv+gth/JzjxAhdQ==} + /@safe-global/safe-apps-provider@0.18.2(typescript@5.3.3): + resolution: {integrity: sha512-yHHAcppwE7aIUWEeZiYAClQzZCdP5l0Kbd0CBlhKAsTcqZnx4Gh3G3G3frY5LlWcGzp9qmQ5jv+J1GBpaZLDgw==} dependencies: - '@safe-global/safe-apps-sdk': 8.0.0(typescript@5.3.2) + '@safe-global/safe-apps-sdk': 9.0.0(typescript@5.3.3) events: 3.3.0 transitivePeerDependencies: - bufferutil @@ -5300,11 +5650,11 @@ packages: - zod dev: false - /@safe-global/safe-apps-sdk@8.0.0(typescript@5.3.2): - resolution: {integrity: sha512-gYw0ki/EAuV1oSyMxpqandHjnthZjYYy+YWpTAzf8BqfXM3ItcZLpjxfg+3+mXW8HIO+3jw6T9iiqEXsqHaMMw==} + /@safe-global/safe-apps-sdk@8.1.0(typescript@5.3.3): + resolution: {integrity: sha512-XJbEPuaVc7b9n23MqlF6c+ToYIS3f7P2Sel8f3cSBQ9WORE4xrSuvhMpK9fDSFqJ7by/brc+rmJR/5HViRr0/w==} dependencies: - '@safe-global/safe-gateway-typescript-sdk': 3.13.2 - viem: 1.19.7(typescript@5.3.2) + '@safe-global/safe-gateway-typescript-sdk': 3.14.0 + viem: 1.21.4(typescript@5.3.3) transitivePeerDependencies: - bufferutil - typescript @@ -5312,11 +5662,11 @@ packages: - zod dev: false - /@safe-global/safe-apps-sdk@8.1.0(typescript@5.3.2): - resolution: {integrity: sha512-XJbEPuaVc7b9n23MqlF6c+ToYIS3f7P2Sel8f3cSBQ9WORE4xrSuvhMpK9fDSFqJ7by/brc+rmJR/5HViRr0/w==} + /@safe-global/safe-apps-sdk@9.0.0(typescript@5.3.3): + resolution: {integrity: sha512-fEqmQBU3JqTjORSl3XYrcaxdxkUqeeM39qsQjqCzzTHioN8DEfg3JCLq6EBoXzcKTVOYi8SPzLV7KJccdDw+4w==} dependencies: - '@safe-global/safe-gateway-typescript-sdk': 3.13.2 - viem: 1.19.7(typescript@5.3.2) + '@safe-global/safe-gateway-typescript-sdk': 3.14.0 + viem: 1.21.4(typescript@5.3.3) transitivePeerDependencies: - bufferutil - typescript @@ -5324,8 +5674,8 @@ packages: - zod dev: false - /@safe-global/safe-gateway-typescript-sdk@3.13.2: - resolution: {integrity: sha512-kGlJecJHBzGrGTq/yhLANh56t+Zur6Ubpt+/w03ARX1poDb4TM8vKU3iV8tuYpk359PPWp+Qvjnqb9oW2YQcYw==} + /@safe-global/safe-gateway-typescript-sdk@3.14.0: + resolution: {integrity: sha512-/dqU66RvHw50n+7x3nwnJedq8V6iLQyoWitNdjx5cFTBmae+rpP+LvHq+LqZfXJVkB1qNytMdjFjdyES0t79gQ==} engines: {node: '>=16'} dev: false @@ -5347,8 +5697,8 @@ packages: - zenObservable dev: true - /@scure/base@1.1.3: - resolution: {integrity: sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==} + /@scure/base@1.1.5: + resolution: {integrity: sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==} dev: false /@scure/bip32@1.3.2: @@ -5356,14 +5706,14 @@ packages: dependencies: '@noble/curves': 1.2.0 '@noble/hashes': 1.3.2 - '@scure/base': 1.1.3 + '@scure/base': 1.1.5 dev: false /@scure/bip39@1.2.1: resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} dependencies: '@noble/hashes': 1.3.2 - '@scure/base': 1.1.3 + '@scure/base': 1.1.5 dev: false /@sinclair/typebox@0.24.51: @@ -5398,22 +5748,16 @@ packages: type-detect: 4.0.8 dev: true - /@sinonjs/commons@3.0.0: - resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} + /@sinonjs/commons@3.0.1: + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} dependencies: type-detect: 4.0.8 dev: true - /@sinonjs/fake-timers@10.3.0: - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - dependencies: - '@sinonjs/commons': 3.0.0 - dev: true - /@sinonjs/fake-timers@11.2.2: resolution: {integrity: sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==} dependencies: - '@sinonjs/commons': 3.0.0 + '@sinonjs/commons': 3.0.1 dev: true /@sinonjs/fake-timers@6.0.1: @@ -5446,12 +5790,12 @@ packages: buffer: 6.0.3 dev: false - /@solana/web3.js@1.87.6: - resolution: {integrity: sha512-LkqsEBgTZztFiccZZXnawWa8qNCATEqE97/d0vIwjTclmVlc8pBpD1DmjfVHtZ1HS5fZorFlVhXfpwnCNDZfyg==} + /@solana/web3.js@1.89.1: + resolution: {integrity: sha512-t9TTLtPQxtQB3SAf/5E8xPXfVDsC6WGOsgKY02l2cbe0HLymT7ynE8Hu48Lk5qynHCquj6nhISfEHcjMkYpu/A==} dependencies: - '@babel/runtime': 7.23.4 - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 + '@babel/runtime': 7.23.9 + '@noble/curves': 1.3.0 + '@noble/hashes': 1.3.3 '@solana/buffer-layout': 4.0.1 agentkeepalive: 4.5.0 bigint-buffer: 1.1.5 @@ -5462,7 +5806,7 @@ packages: fast-stable-stringify: 1.0.0 jayson: 4.1.0 node-fetch: 2.7.0 - rpc-websockets: 7.8.0 + rpc-websockets: 7.9.0 superstruct: 0.14.2 transitivePeerDependencies: - bufferutil @@ -5694,13 +6038,13 @@ packages: resolution: {integrity: sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==} engines: {node: '>=10'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.9 /@svgr/plugin-jsx@5.5.0: resolution: {integrity: sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@svgr/babel-preset': 5.5.0 '@svgr/hast-util-to-babel-ast': 5.5.0 svg-parser: 2.0.4 @@ -5719,10 +6063,10 @@ packages: resolution: {integrity: sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.23.3 - '@babel/plugin-transform-react-constant-elements': 7.23.3(@babel/core@7.23.3) - '@babel/preset-env': 7.23.3(@babel/core@7.23.3) - '@babel/preset-react': 7.23.3(@babel/core@7.23.3) + '@babel/core': 7.23.9 + '@babel/plugin-transform-react-constant-elements': 7.23.3(@babel/core@7.23.9) + '@babel/preset-env': 7.23.9(@babel/core@7.23.9) + '@babel/preset-react': 7.23.3(@babel/core@7.23.9) '@svgr/core': 5.5.0 '@svgr/plugin-jsx': 5.5.0 '@svgr/plugin-svgo': 5.5.0 @@ -5792,13 +6136,28 @@ packages: use-sync-external-store: 1.2.0(react@18.2.0) dev: false - /@tauri-apps/api@1.5.1: - resolution: {integrity: sha512-6unsZDOdlXTmauU3NhWhn+Cx0rODV+rvNvTdvolE5Kls5ybA6cqndQENDt1+FS0tF7ozCP66jwWoH6a5h90BrA==} + /@tanstack/react-virtual@3.0.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-9XbRLPKgnhMwwmuQMnJMv+5a9sitGNCSEtf/AZXzmJdesYk7XsjYHaEDny+IrJzvPNwZliIIDwCRiaUqR3zzCA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@tanstack/virtual-core': 3.0.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@tanstack/virtual-core@3.0.0: + resolution: {integrity: sha512-SYXOBTjJb05rXa2vl55TTwO40A6wKu0R5i1qQwhJYNDIqaIGF7D0HsLw+pJAyi2OvntlEIVusx3xtbbgSUi6zg==} + dev: false + + /@tauri-apps/api@1.5.3: + resolution: {integrity: sha512-zxnDjHHKjOsrIzZm6nO5Xapb/BxqUq1tc7cGkFXsFkGTsSWgCPH1D8mm0XS9weJY2OaR73I3k3S+b7eSzJDfqA==} engines: {node: '>= 14.6.0', npm: '>= 6.6.0', yarn: '>= 1.19.1'} dev: false - /@tauri-apps/cli-darwin-arm64@1.4.0: - resolution: {integrity: sha512-nA/ml0SfUt6/CYLVbHmT500Y+ijqsuv5+s9EBnVXYSLVg9kbPUZJJHluEYK+xKuOj6xzyuT/+rZFMRapmJD3jQ==} + /@tauri-apps/cli-darwin-arm64@1.5.11: + resolution: {integrity: sha512-2NLSglDb5VfvTbMtmOKWyD+oaL/e8Z/ZZGovHtUFyUSFRabdXc6cZOlcD1BhFvYkHqm+TqGaz5qtPR5UbqDs8A==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -5806,8 +6165,8 @@ packages: dev: true optional: true - /@tauri-apps/cli-darwin-x64@1.4.0: - resolution: {integrity: sha512-ov/F6Zr+dg9B0PtRu65stFo2G0ow2TUlneqYYrkj+vA3n+moWDHfVty0raDjMLQbQt3rv3uayFMXGPMgble9OA==} + /@tauri-apps/cli-darwin-x64@1.5.11: + resolution: {integrity: sha512-/RQllHiJRH2fJOCudtZlaUIjofkHzP3zZgxi71ZUm7Fy80smU5TDfwpwOvB0wSVh0g/ciDjMArCSTo0MRvL+ag==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -5815,8 +6174,8 @@ packages: dev: true optional: true - /@tauri-apps/cli-linux-arm-gnueabihf@1.4.0: - resolution: {integrity: sha512-zwjbiMncycXDV7doovymyKD7sCg53ouAmfgpUqEBOTY3vgBi9TwijyPhJOqoG5vUVWhouNBC08akGmE4dja15g==} + /@tauri-apps/cli-linux-arm-gnueabihf@1.5.11: + resolution: {integrity: sha512-IlBuBPKmMm+a5LLUEK6a21UGr9ZYd6zKuKLq6IGM4tVweQa8Sf2kP2Nqs74dMGIUrLmMs0vuqdURpykQg+z4NQ==} engines: {node: '>= 10'} cpu: [arm] os: [linux] @@ -5824,8 +6183,8 @@ packages: dev: true optional: true - /@tauri-apps/cli-linux-arm64-gnu@1.4.0: - resolution: {integrity: sha512-5MCBcziqXC72mMXnkZU68mutXIR6zavDxopArE2gQtK841IlE06bIgtLi0kUUhlFJk2nhPRgiDgdLbrPlyt7fw==} + /@tauri-apps/cli-linux-arm64-gnu@1.5.11: + resolution: {integrity: sha512-w+k1bNHCU/GbmXshtAhyTwqosThUDmCEFLU4Zkin1vl2fuAtQry2RN7thfcJFepblUGL/J7yh3Q/0+BCjtspKQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -5833,8 +6192,8 @@ packages: dev: true optional: true - /@tauri-apps/cli-linux-arm64-musl@1.4.0: - resolution: {integrity: sha512-7J3pRB6n6uNYgIfCeKt2Oz8J7oSaz2s8GGFRRH2HPxuTHrBNCinzVYm68UhVpJrL3bnGkU0ziVZLsW/iaOGfUg==} + /@tauri-apps/cli-linux-arm64-musl@1.5.11: + resolution: {integrity: sha512-PN6/dl+OfYQ/qrAy4HRAfksJ2AyWQYn2IA/2Wwpaa7SDRz2+hzwTQkvajuvy0sQ5L2WCG7ymFYRYMbpC6Hk9Pg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -5842,8 +6201,8 @@ packages: dev: true optional: true - /@tauri-apps/cli-linux-x64-gnu@1.4.0: - resolution: {integrity: sha512-Zh5gfAJxOv5AVWxcwuueaQ2vIAhlg0d6nZui6nMyfIJ8dbf3aZQ5ZzP38sYow5h/fbvgL+3GSQxZRBIa3c2E1w==} + /@tauri-apps/cli-linux-x64-gnu@1.5.11: + resolution: {integrity: sha512-MTVXLi89Nj7Apcvjezw92m7ZqIDKT5SFKZtVPCg6RoLUBTzko/BQoXYIRWmdoz2pgkHDUHgO2OMJ8oKzzddXbw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -5851,8 +6210,8 @@ packages: dev: true optional: true - /@tauri-apps/cli-linux-x64-musl@1.4.0: - resolution: {integrity: sha512-OLAYoICU3FaYiTdBsI+lQTKnDHeMmFMXIApN0M+xGiOkoIOQcV9CConMPjgmJQ867+NHRNgUGlvBEAh9CiJodQ==} + /@tauri-apps/cli-linux-x64-musl@1.5.11: + resolution: {integrity: sha512-kwzAjqFpz7rvTs7WGZLy/a5nS5t15QKr3E9FG95MNF0exTl3d29YoAUAe1Mn0mOSrTJ9Z+vYYAcI/QdcsGBP+w==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -5860,8 +6219,8 @@ packages: dev: true optional: true - /@tauri-apps/cli-win32-arm64-msvc@1.4.0: - resolution: {integrity: sha512-gZ05GENFbI6CB5MlOUsLlU0kZ9UtHn9riYtSXKT6MYs8HSPRffPHaHSL0WxsJweWh9nR5Hgh/TUU8uW3sYCzCg==} + /@tauri-apps/cli-win32-arm64-msvc@1.5.11: + resolution: {integrity: sha512-L+5NZ/rHrSUrMxjj6YpFYCXp6wHnq8c8SfDTBOX8dO8x+5283/vftb4vvuGIsLS4UwUFXFnLt3XQr44n84E67Q==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -5869,8 +6228,8 @@ packages: dev: true optional: true - /@tauri-apps/cli-win32-ia32-msvc@1.4.0: - resolution: {integrity: sha512-JsetT/lTx/Zq98eo8T5CiRyF1nKeX04RO8JlJrI3ZOYsZpp/A5RJvMd/szQ17iOzwiHdge+tx7k2jHysR6oBlQ==} + /@tauri-apps/cli-win32-ia32-msvc@1.5.11: + resolution: {integrity: sha512-oVlD9IVewrY0lZzTdb71kNXkjdgMqFq+ohb67YsJb4Rf7o8A9DTlFds1XLCe3joqLMm4M+gvBKD7YnGIdxQ9vA==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] @@ -5878,8 +6237,8 @@ packages: dev: true optional: true - /@tauri-apps/cli-win32-x64-msvc@1.4.0: - resolution: {integrity: sha512-z8Olcnwp5aYhzqUAarFjqF+oELCjuYWnB2HAJHlfsYNfDCAORY5kct3Fklz8PSsubC3U2EugWn8n42DwnThurg==} + /@tauri-apps/cli-win32-x64-msvc@1.5.11: + resolution: {integrity: sha512-1CexcqUFCis5ypUIMOKllxUBrna09McbftWENgvVXMfA+SP+yPDPAVb8fIvUcdTIwR/yHJwcIucmTB4anww4vg==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -5887,29 +6246,29 @@ packages: dev: true optional: true - /@tauri-apps/cli@1.4.0: - resolution: {integrity: sha512-VXYr2i2iVFl98etQSQsqLzXgX96bnWiNZd1YADgatqwy/qecbd6Kl5ZAPB5R4ynsgE8A1gU7Fbzh7dCEQYFfmA==} + /@tauri-apps/cli@1.5.11: + resolution: {integrity: sha512-B475D7phZrq5sZ3kDABH4g2mEoUIHtnIO+r4ZGAAfsjMbZCwXxR/jlMGTEL+VO3YzjpF7gQe38IzB4vLBbVppw==} engines: {node: '>= 10'} hasBin: true optionalDependencies: - '@tauri-apps/cli-darwin-arm64': 1.4.0 - '@tauri-apps/cli-darwin-x64': 1.4.0 - '@tauri-apps/cli-linux-arm-gnueabihf': 1.4.0 - '@tauri-apps/cli-linux-arm64-gnu': 1.4.0 - '@tauri-apps/cli-linux-arm64-musl': 1.4.0 - '@tauri-apps/cli-linux-x64-gnu': 1.4.0 - '@tauri-apps/cli-linux-x64-musl': 1.4.0 - '@tauri-apps/cli-win32-arm64-msvc': 1.4.0 - '@tauri-apps/cli-win32-ia32-msvc': 1.4.0 - '@tauri-apps/cli-win32-x64-msvc': 1.4.0 + '@tauri-apps/cli-darwin-arm64': 1.5.11 + '@tauri-apps/cli-darwin-x64': 1.5.11 + '@tauri-apps/cli-linux-arm-gnueabihf': 1.5.11 + '@tauri-apps/cli-linux-arm64-gnu': 1.5.11 + '@tauri-apps/cli-linux-arm64-musl': 1.5.11 + '@tauri-apps/cli-linux-x64-gnu': 1.5.11 + '@tauri-apps/cli-linux-x64-musl': 1.5.11 + '@tauri-apps/cli-win32-arm64-msvc': 1.5.11 + '@tauri-apps/cli-win32-ia32-msvc': 1.5.11 + '@tauri-apps/cli-win32-x64-msvc': 1.5.11 dev: true /@testing-library/dom@8.20.1: resolution: {integrity: sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==} engines: {node: '>=12'} dependencies: - '@babel/code-frame': 7.23.4 - '@babel/runtime': 7.23.4 + '@babel/code-frame': 7.23.5 + '@babel/runtime': 7.23.9 '@types/aria-query': 5.0.4 aria-query: 5.1.3 chalk: 4.1.2 @@ -5918,12 +6277,12 @@ packages: pretty-format: 27.5.1 dev: true - /@testing-library/dom@9.3.3: - resolution: {integrity: sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==} + /@testing-library/dom@9.3.4: + resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} engines: {node: '>=14'} dependencies: - '@babel/code-frame': 7.23.4 - '@babel/runtime': 7.23.4 + '@babel/code-frame': 7.24.2 + '@babel/runtime': 7.24.1 '@types/aria-query': 5.0.4 aria-query: 5.1.3 chalk: 4.1.2 @@ -5936,8 +6295,8 @@ packages: resolution: {integrity: sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==} engines: {node: '>=8', npm: '>=6', yarn: '>=1'} dependencies: - '@adobe/css-tools': 4.3.1 - '@babel/runtime': 7.23.4 + '@adobe/css-tools': 4.3.3 + '@babel/runtime': 7.23.9 '@types/testing-library__jest-dom': 5.14.9 aria-query: 5.3.0 chalk: 3.0.0 @@ -5954,21 +6313,21 @@ packages: react: <18.0.0 react-dom: <18.0.0 dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.9 '@testing-library/dom': 8.20.1 '@types/react-dom': 17.0.25 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@testing-library/user-event@13.5.0(@testing-library/dom@9.3.3): + /@testing-library/user-event@13.5.0(@testing-library/dom@9.3.4): resolution: {integrity: sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==} engines: {node: '>=10', npm: '>=6'} peerDependencies: '@testing-library/dom': '>=7.21.4' dependencies: - '@babel/runtime': 7.23.4 - '@testing-library/dom': 9.3.3 + '@babel/runtime': 7.23.9 + '@testing-library/dom': 9.3.4 dev: true /@textlint/ast-node-types@12.6.1: @@ -5985,7 +6344,7 @@ packages: remark-frontmatter: 3.0.0 remark-gfm: 1.0.0 remark-parse: 9.0.0 - traverse: 0.6.7 + traverse: 0.6.8 unified: 9.2.2 transitivePeerDependencies: - supports-color @@ -5996,7 +6355,7 @@ packages: peerDependencies: react: ^18.2.0 dependencies: - mermaid: 10.6.1 + mermaid: 10.7.0 react: 18.2.0 unist-util-visit: 5.0.0 transitivePeerDependencies: @@ -6031,11 +6390,11 @@ packages: resolution: {integrity: sha512-drD/G7R2yQkK6PnGkmLOlOieL3ybtiEXsubaebaBayoRsWqBRX/IJ0ufGwjRgohTvvlSoKWd4Ustyyhi9kK+Mw==} engines: {node: '>=10'} dependencies: - '@peculiar/webcrypto': 1.4.3(patch_hash=bbuork7btorjpwgh5cqtzopbca) + '@peculiar/webcrypto': 1.4.5(patch_hash=saeohqf4hlpnnys7brc6umjxqq) '@stablelib/aes-kw': 1.0.1 '@stablelib/xchacha20poly1305': 1.0.1 '@transmute/did-key-common': 0.2.1-unstable.42(patch_hash=nveg2vh57sqhe26mlbokowgyfy) - web-streams-polyfill: 3.2.1 + web-streams-polyfill: 3.3.2 dev: false patched: true @@ -6123,7 +6482,7 @@ packages: resolution: {integrity: sha512-BVN5ECm3t5ldJiyixsdoXaptr14p2PxOOGWvyBm5eqWlVy/kiWQiVh43wZgEbHtjOkacTfw+BaVAtYkyGn2tpw==} engines: {node: '>=10'} dependencies: - '@peculiar/webcrypto': 1.4.3(patch_hash=bbuork7btorjpwgh5cqtzopbca) + '@peculiar/webcrypto': 1.4.5(patch_hash=saeohqf4hlpnnys7brc6umjxqq) '@transmute/ld-key-pair': 0.6.1-unstable.37(patch_hash=zpnwlkycjaix7vdztq22j7pg4e) big-integer: 1.6.52 dev: false @@ -6173,45 +6532,45 @@ packages: /@types/babel__core@7.20.5: resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} dependencies: - '@babel/parser': 7.23.4 - '@babel/types': 7.23.4 - '@types/babel__generator': 7.6.7 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 + '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.4 + '@types/babel__traverse': 7.20.5 - /@types/babel__generator@7.6.7: - resolution: {integrity: sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==} + /@types/babel__generator@7.6.8: + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.9 /@types/babel__template@7.4.4: resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: - '@babel/parser': 7.23.4 - '@babel/types': 7.23.4 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 - /@types/babel__traverse@7.20.4: - resolution: {integrity: sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==} + /@types/babel__traverse@7.20.5: + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.9 /@types/body-parser@1.19.5: resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} dependencies: '@types/connect': 3.4.38 - '@types/node': 16.18.64 + '@types/node': 16.18.76 /@types/bonjour@3.5.13: resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} dependencies: - '@types/node': 16.18.64 + '@types/node': 16.18.76 /@types/cacheable-request@6.0.3: resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 16.18.64 + '@types/node': 16.18.76 '@types/responselike': 1.0.3 dev: true @@ -6228,13 +6587,13 @@ packages: /@types/connect-history-api-fallback@1.5.4: resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} dependencies: - '@types/express-serve-static-core': 4.17.41 - '@types/node': 16.18.64 + '@types/express-serve-static-core': 4.17.42 + '@types/node': 16.18.76 /@types/connect@3.4.38: resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} dependencies: - '@types/node': 16.18.64 + '@types/node': 16.18.76 /@types/d3-scale-chromatic@3.0.3: resolution: {integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==} @@ -6259,11 +6618,11 @@ packages: /@types/eslint-scope@3.7.7: resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} dependencies: - '@types/eslint': 8.44.7 + '@types/eslint': 8.56.2 '@types/estree': 1.0.5 - /@types/eslint@8.44.7: - resolution: {integrity: sha512-f5ORu2hcBbKei97U73mf+l9t4zTGl74IqZ0GQk4oVea/VS8tQZYkUveSYojk+frraAVYId0V2WC9O4PTNru2FQ==} + /@types/eslint@8.56.2: + resolution: {integrity: sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==} dependencies: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 @@ -6287,11 +6646,11 @@ packages: expect: 29.7.0 dev: true - /@types/express-serve-static-core@4.17.41: - resolution: {integrity: sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==} + /@types/express-serve-static-core@4.17.42: + resolution: {integrity: sha512-ckM3jm2bf/MfB3+spLPWYPUH573plBFwpOhqQ2WottxYV85j1HQFlxmnTq57X1yHY9awZPig06hL/cLMgNWHIQ==} dependencies: - '@types/node': 16.18.64 - '@types/qs': 6.9.10 + '@types/node': 16.18.76 + '@types/qs': 6.9.11 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -6299,8 +6658,8 @@ packages: resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} dependencies: '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.17.41 - '@types/qs': 6.9.10 + '@types/express-serve-static-core': 4.17.42 + '@types/qs': 6.9.11 '@types/serve-static': 1.15.5 /@types/faker@5.5.9: @@ -6310,23 +6669,23 @@ packages: /@types/fs-extra@9.0.13: resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} dependencies: - '@types/node': 16.18.64 + '@types/node': 16.18.76 dev: true /@types/glob@7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 16.18.64 + '@types/node': 16.18.76 dev: false /@types/graceful-fs@4.1.9: resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} dependencies: - '@types/node': 16.18.64 + '@types/node': 16.18.76 - /@types/hast@2.3.8: - resolution: {integrity: sha512-aMIqAlFd2wTIDZuvLbhUT+TGvMxrNC8ECUIVtH6xxy0sQLs3iu6NO8Kp/VT5je7i5ufnebXzdV1dNDMnvaH6IQ==} + /@types/hast@2.3.9: + resolution: {integrity: sha512-pTHyNlaMD/oKJmS+ZZUyFUcsZeBZpC0lmGquw98CqRVNgAdJZJeD7GoeLiT6Xbx5rU9VCjSt0RwEvDgzh4obFw==} dependencies: '@types/unist': 2.0.10 dev: false @@ -6350,13 +6709,7 @@ packages: /@types/http-proxy@1.17.14: resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==} dependencies: - '@types/node': 16.18.64 - - /@types/is-ci@3.0.4: - resolution: {integrity: sha512-AkCYCmwlXeuH89DagDCzvCAyltI2v9lh3U3DqSg/GrBYoReAaWwxfXCqMx9UV5MajLZ4ZFwZzV4cABGIxk2XRw==} - dependencies: - ci-info: 3.9.0 - dev: true + '@types/node': 16.18.76 /@types/istanbul-lib-coverage@2.0.6: resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} @@ -6404,7 +6757,7 @@ packages: /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 16.18.64 + '@types/node': 16.18.76 /@types/lodash@4.14.202: resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} @@ -6456,17 +6809,17 @@ packages: resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} dev: false - /@types/node-fetch@2.6.9: - resolution: {integrity: sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA==} + /@types/node-fetch@2.6.11: + resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} dependencies: - '@types/node': 16.18.64 + '@types/node': 16.18.76 form-data: 4.0.0 dev: true - /@types/node-forge@1.3.10: - resolution: {integrity: sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==} + /@types/node-forge@1.3.11: + resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} dependencies: - '@types/node': 16.18.64 + '@types/node': 16.18.76 /@types/node@12.20.55: resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} @@ -6475,8 +6828,8 @@ packages: resolution: {integrity: sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==} dev: true - /@types/node@16.18.64: - resolution: {integrity: sha512-TiY2gIDob8+QOPIcVpS0ZY+H1DVTfplBW6UgL2b4gOYbigIlKVIh6Lcv+7YDUciUTqhVLG91PrZBXW10IoBhtw==} + /@types/node@16.18.76: + resolution: {integrity: sha512-/GsO2uv1Z6R42lBr59dtem56gVF/yHKQaScggwU+gLU6DXE25sDmOar4c4IfWb3h+X/7OYZznPOFk7oGF3jQSA==} /@types/node@18.11.10: resolution: {integrity: sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==} @@ -6500,8 +6853,8 @@ packages: /@types/q@1.5.8: resolution: {integrity: sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==} - /@types/qs@6.9.10: - resolution: {integrity: sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==} + /@types/qs@6.9.11: + resolution: {integrity: sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==} /@types/range-parser@1.2.7: resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} @@ -6509,38 +6862,52 @@ packages: /@types/react-dom@17.0.25: resolution: {integrity: sha512-urx7A7UxkZQmThYA4So0NelOVjx3V4rNFVJwp0WZlbIK5eM4rNJDiN3R/E9ix0MBh6kAEojk/9YL+Te6D9zHNA==} dependencies: - '@types/react': 17.0.71 + '@types/react': 17.0.75 dev: true - /@types/react-dom@18.2.17: - resolution: {integrity: sha512-rvrT/M7Df5eykWFxn6MYt5Pem/Dbyc1N8Y0S9Mrkw2WFCRiqUgw9P7ul2NpwsXCSM1DVdENzdG9J5SreqfAIWg==} + /@types/react-dom@18.2.18: + resolution: {integrity: sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==} + dependencies: + '@types/react': 18.2.48 + + /@types/react-dom@18.2.19: + resolution: {integrity: sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==} dependencies: - '@types/react': 18.2.38 + '@types/react': 18.2.55 + dev: false - /@types/react@17.0.71: - resolution: {integrity: sha512-lfqOu9mp16nmaGRrS8deS2Taqhd5Ih0o92Te5Ws6I1py4ytHBcXLqh0YIqVsViqwVI5f+haiFM6hju814BzcmA==} + /@types/react@17.0.75: + resolution: {integrity: sha512-MSA+NzEzXnQKrqpO63CYqNstFjsESgvJAdAyyJ1n6ZQq/GLgf6nOfIKwk+Twuz0L1N6xPe+qz5xRCJrbhMaLsw==} dependencies: '@types/prop-types': 15.7.11 '@types/scheduler': 0.16.8 - csstype: 3.1.2 + csstype: 3.1.3 dev: true - /@types/react@18.2.38: - resolution: {integrity: sha512-cBBXHzuPtQK6wNthuVMV6IjHAFkdl/FOPFIlkd81/Cd1+IqkHu/A+w4g43kaQQoYHik/ruaQBDL72HyCy1vuMw==} + /@types/react@18.2.48: + resolution: {integrity: sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==} dependencies: '@types/prop-types': 15.7.11 '@types/scheduler': 0.16.8 - csstype: 3.1.2 + csstype: 3.1.3 + + /@types/react@18.2.55: + resolution: {integrity: sha512-Y2Tz5P4yz23brwm2d7jNon39qoAtMMmalOQv6+fEFt1mT+FcM3D841wDpoUvFXhaYenuROCy3FZYqdTjM7qVyA==} + dependencies: + '@types/prop-types': 15.7.11 + '@types/scheduler': 0.16.8 + csstype: 3.1.3 + dev: false /@types/resolve@1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: - '@types/node': 16.18.64 + '@types/node': 16.18.76 /@types/responselike@1.0.3: resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} dependencies: - '@types/node': 16.18.64 + '@types/node': 16.18.76 /@types/retry@0.12.0: resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} @@ -6549,7 +6916,7 @@ packages: resolution: {integrity: sha512-jn7qwGFmJHwUSphV8zZneO3GmtlgLsmhs/LQyVvQbIIa+fzGMUiHI4HXJZL3FT8MJmgXWbLGiVVY7ElvHq6vDA==} deprecated: This is a stub types definition. sass provides its own type definitions, so you do not need this installed. dependencies: - sass: 1.69.5 + sass: 1.70.0 /@types/scheduler@0.16.8: resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} @@ -6557,7 +6924,7 @@ packages: /@types/secp256k1@4.0.6: resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} dependencies: - '@types/node': 16.18.64 + '@types/node': 16.18.76 dev: true /@types/semver@7.5.6: @@ -6567,7 +6934,7 @@ packages: resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} dependencies: '@types/mime': 1.3.5 - '@types/node': 16.18.64 + '@types/node': 16.18.76 /@types/serve-index@1.9.4: resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} @@ -6579,16 +6946,16 @@ packages: dependencies: '@types/http-errors': 2.0.4 '@types/mime': 3.0.4 - '@types/node': 16.18.64 + '@types/node': 16.18.76 /@types/sha256@0.2.2: resolution: {integrity: sha512-uKMaDzyzfcDYGEwTgLh+hmgDMxXWyIVodY8T+qt7A+NYvikW0lmGLMGbQ7BipCB8dzXHa55C9g+Ii/3Lgt1KmA==} dependencies: - '@types/node': 16.18.64 + '@types/node': 16.18.76 dev: true - /@types/sinon@17.0.2: - resolution: {integrity: sha512-Zt6heIGsdqERkxctIpvN5Pv3edgBrhoeb3yHyxffd4InN0AX2SVNKSrhdDZKGQICVOxWP/q4DyhpfPNMSrpIiA==} + /@types/sinon@17.0.3: + resolution: {integrity: sha512-j3uovdn8ewky9kRBG19bOwaZbexJu/XjtkHyjvUgt4xfPFz18dcORIMqnYh66Fx3Powhcr85NT5+er3+oViapw==} dependencies: '@types/sinonjs__fake-timers': 8.1.5 dev: true @@ -6600,7 +6967,7 @@ packages: /@types/sockjs@0.3.36: resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} dependencies: - '@types/node': 16.18.64 + '@types/node': 16.18.76 /@types/stack-utils@2.0.3: resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} @@ -6632,12 +6999,12 @@ packages: /@types/ws@7.4.7: resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} dependencies: - '@types/node': 16.18.64 + '@types/node': 16.18.76 /@types/ws@8.5.10: resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} dependencies: - '@types/node': 16.18.64 + '@types/node': 16.18.76 /@types/yargs-parser@21.0.3: resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -6661,7 +7028,7 @@ packages: resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} requiresBuild: true dependencies: - '@types/node': 16.18.64 + '@types/node': 16.18.76 dev: false optional: true @@ -6669,7 +7036,7 @@ packages: resolution: {integrity: sha512-LKzNTjj+2j09wAo/vvVjzgw5qckJJzhdGgWHW7j69QIGdq/KnZrMAMIHQiWGl3Ccflh5/CudBAntTPYdprPltA==} dev: false - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.54.0)(typescript@4.9.5): + /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@4.9.5): resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -6681,12 +7048,12 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 5.62.0(eslint@8.54.0)(typescript@4.9.5) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@4.9.5) '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.54.0)(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.54.0)(typescript@4.9.5) + '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@4.9.5) debug: 4.3.4(supports-color@8.1.1) - eslint: 8.54.0 + eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.0 natural-compare-lite: 1.4.0 @@ -6696,19 +7063,19 @@ packages: transitivePeerDependencies: - supports-color - /@typescript-eslint/experimental-utils@5.62.0(eslint@8.54.0)(typescript@4.9.5): + /@typescript-eslint/experimental-utils@5.62.0(eslint@8.57.0)(typescript@4.9.5): resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.54.0)(typescript@4.9.5) - eslint: 8.54.0 + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@4.9.5) + eslint: 8.57.0 transitivePeerDependencies: - supports-color - typescript - /@typescript-eslint/parser@5.62.0(eslint@8.54.0)(typescript@4.9.5): + /@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@4.9.5): resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -6722,7 +7089,7 @@ packages: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) debug: 4.3.4(supports-color@8.1.1) - eslint: 8.54.0 + eslint: 8.57.0 typescript: 4.9.5 transitivePeerDependencies: - supports-color @@ -6734,7 +7101,7 @@ packages: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - /@typescript-eslint/type-utils@5.62.0(eslint@8.54.0)(typescript@4.9.5): + /@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@4.9.5): resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -6745,9 +7112,9 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.54.0)(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@4.9.5) debug: 4.3.4(supports-color@8.1.1) - eslint: 8.54.0 + eslint: 8.57.0 tsutils: 3.21.0(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: @@ -6777,19 +7144,19 @@ packages: transitivePeerDependencies: - supports-color - /@typescript-eslint/utils@5.62.0(eslint@8.54.0)(typescript@4.9.5): + /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@4.9.5): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.6 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - eslint: 8.54.0 + eslint: 8.57.0 eslint-scope: 5.1.1 semver: 7.5.4 transitivePeerDependencies: @@ -6823,33 +7190,106 @@ packages: engines: {node: '>=12.0.0'} deprecated: This package has been deprecated in favor of @vitejs/plugin-react dependencies: - '@babel/core': 7.23.3 - '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.23.3) + '@babel/core': 7.23.9 + '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.23.9) '@rollup/pluginutils': 4.2.1 react-refresh: 0.10.0 transitivePeerDependencies: - supports-color dev: true - /@vitejs/plugin-react@4.2.0(vite@5.0.2): - resolution: {integrity: sha512-+MHTH/e6H12kRp5HUkzOGqPMksezRMmW+TNzlh/QXfI8rRf6l2Z2yH/v12no1UvTwhZgEDMuQ7g7rrfMseU6FQ==} + /@vitejs/plugin-react@4.2.1(vite@5.0.12): + resolution: {integrity: sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 dependencies: - '@babel/core': 7.23.3 - '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.23.3) + '@babel/core': 7.23.9 + '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.23.9) '@types/babel__core': 7.20.5 react-refresh: 0.14.0 - vite: 5.0.2(@types/node@16.18.64) + vite: 5.0.12(@types/node@16.18.76) transitivePeerDependencies: - supports-color dev: true - /@wagmi/connectors@3.1.5(@types/react@18.2.38)(react@18.2.0)(typescript@5.3.2)(viem@1.19.7): - resolution: {integrity: sha512-aE4rWZbivqWa9HqjiLDPtwROH2b1Az+lBVMeZ3o/aFxGNGNEkdrSAMOUG15/UFy3VnN6HqGOtTobOBZ10JhfNQ==} + /@vue/compiler-core@3.4.19: + resolution: {integrity: sha512-gj81785z0JNzRcU0Mq98E56e4ltO1yf8k5PQ+tV/7YHnbZkrM0fyFyuttnN8ngJZjbpofWE/m4qjKBiLl8Ju4w==} + dependencies: + '@babel/parser': 7.23.9 + '@vue/shared': 3.4.19 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.0.2 + dev: false + + /@vue/compiler-dom@3.4.19: + resolution: {integrity: sha512-vm6+cogWrshjqEHTzIDCp72DKtea8Ry/QVpQRYoyTIg9k7QZDX6D8+HGURjtmatfgM8xgCFtJJaOlCaRYRK3QA==} + dependencies: + '@vue/compiler-core': 3.4.19 + '@vue/shared': 3.4.19 + dev: false + + /@vue/compiler-sfc@3.4.19: + resolution: {integrity: sha512-LQ3U4SN0DlvV0xhr1lUsgLCYlwQfUfetyPxkKYu7dkfvx7g3ojrGAkw0AERLOKYXuAGnqFsEuytkdcComei3Yg==} + dependencies: + '@babel/parser': 7.23.9 + '@vue/compiler-core': 3.4.19 + '@vue/compiler-dom': 3.4.19 + '@vue/compiler-ssr': 3.4.19 + '@vue/shared': 3.4.19 + estree-walker: 2.0.2 + magic-string: 0.30.7 + postcss: 8.4.33 + source-map-js: 1.0.2 + dev: false + + /@vue/compiler-ssr@3.4.19: + resolution: {integrity: sha512-P0PLKC4+u4OMJ8sinba/5Z/iDT84uMRRlrWzadgLA69opCpI1gG4N55qDSC+dedwq2fJtzmGald05LWR5TFfLw==} + dependencies: + '@vue/compiler-dom': 3.4.19 + '@vue/shared': 3.4.19 + dev: false + + /@vue/reactivity@3.4.19: + resolution: {integrity: sha512-+VcwrQvLZgEclGZRHx4O2XhyEEcKaBi50WbxdVItEezUf4fqRh838Ix6amWTdX0CNb/b6t3Gkz3eOebfcSt+UA==} + dependencies: + '@vue/shared': 3.4.19 + dev: false + + /@vue/runtime-core@3.4.19: + resolution: {integrity: sha512-/Z3tFwOrerJB/oyutmJGoYbuoadphDcJAd5jOuJE86THNZji9pYjZroQ2NFsZkTxOq0GJbb+s2kxTYToDiyZzw==} + dependencies: + '@vue/reactivity': 3.4.19 + '@vue/shared': 3.4.19 + dev: false + + /@vue/runtime-dom@3.4.19: + resolution: {integrity: sha512-IyZzIDqfNCF0OyZOauL+F4yzjMPN2rPd8nhqPP2N1lBn3kYqJpPHHru+83Rkvo2lHz5mW+rEeIMEF9qY3PB94g==} + dependencies: + '@vue/runtime-core': 3.4.19 + '@vue/shared': 3.4.19 + csstype: 3.1.3 + dev: false + + /@vue/server-renderer@3.4.19(vue@3.4.19): + resolution: {integrity: sha512-eAj2p0c429RZyyhtMRnttjcSToch+kTWxFPHlzGMkR28ZbF1PDlTcmGmlDxccBuqNd9iOQ7xPRPAGgPVj+YpQw==} + peerDependencies: + vue: 3.4.19 + dependencies: + '@vue/compiler-ssr': 3.4.19 + '@vue/shared': 3.4.19 + vue: 3.4.19(typescript@4.9.5) + dev: false + + /@vue/shared@3.4.19: + resolution: {integrity: sha512-/KliRRHMF6LoiThEy+4c1Z4KB/gbPrGjWwJR+crg2otgrf/egKzRaCPvJ51S5oetgsgXLfc4Rm5ZgrKHZrtMSw==} + dev: false + + /@wagmi/connectors@3.1.11(@types/react@18.2.48)(react@18.2.0)(typescript@5.3.3)(viem@1.21.4): + resolution: {integrity: sha512-wzxp9f9PtSUFjDUP/QDjc1t7HON4D8wrVKsw35ejdO8hToDpx1gU9lwH/47Zo/1zExGezQc392sjoHSszYd7OA==} peerDependencies: typescript: '>=5.0.4' viem: '>=0.3.35' @@ -6858,17 +7298,16 @@ packages: optional: true dependencies: '@coinbase/wallet-sdk': 3.7.2 - '@ledgerhq/connect-kit-loader': 1.1.2 - '@safe-global/safe-apps-provider': 0.17.1(typescript@5.3.2) - '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.3.2) - '@walletconnect/ethereum-provider': 2.10.2(@walletconnect/modal@2.6.2) + '@safe-global/safe-apps-provider': 0.18.2(typescript@5.3.3) + '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.3.3) + '@walletconnect/ethereum-provider': 2.11.0(@types/react@18.2.48)(react@18.2.0) '@walletconnect/legacy-provider': 2.0.0 - '@walletconnect/modal': 2.6.2(@types/react@18.2.38)(react@18.2.0) - '@walletconnect/utils': 2.10.2 - abitype: 0.8.7(typescript@5.3.2) + '@walletconnect/modal': 2.6.2(@types/react@18.2.48)(react@18.2.0) + '@walletconnect/utils': 2.11.0 + abitype: 0.8.7(typescript@5.3.3) eventemitter3: 4.0.7 - typescript: 5.3.2 - viem: 1.19.7(typescript@5.3.2) + typescript: 5.3.3 + viem: 1.21.4(typescript@5.3.3) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -6891,8 +7330,8 @@ packages: - zod dev: false - /@wagmi/core@1.4.7(@types/react@18.2.38)(react@18.2.0)(typescript@5.3.2)(viem@1.19.7): - resolution: {integrity: sha512-PiOIGni8ArQoPmuDylHX38zMt2nPnTYRIluIqiduKyGCM61X/tf10a0rafUMOOphDPudZu1TacNDhCSeoh/LEA==} + /@wagmi/core@1.4.13(@types/react@18.2.48)(react@18.2.0)(typescript@5.3.3)(viem@1.21.4): + resolution: {integrity: sha512-ytMCvXbBOgfDu9Qw67279wq/jNEe7EZLjLyekX7ROnvHRADqFr3lwZI6ih41UmtRZAmXAx8Ghyuqy154EjB5mQ==} peerDependencies: typescript: '>=5.0.4' viem: '>=0.3.35' @@ -6900,12 +7339,12 @@ packages: typescript: optional: true dependencies: - '@wagmi/connectors': 3.1.5(@types/react@18.2.38)(react@18.2.0)(typescript@5.3.2)(viem@1.19.7) - abitype: 0.8.7(typescript@5.3.2) + '@wagmi/connectors': 3.1.11(@types/react@18.2.48)(react@18.2.0)(typescript@5.3.3)(viem@1.21.4) + abitype: 0.8.7(typescript@5.3.3) eventemitter3: 4.0.7 - typescript: 5.3.2 - viem: 1.19.7(typescript@5.3.2) - zustand: 4.4.6(@types/react@18.2.38)(react@18.2.0) + typescript: 5.3.3 + viem: 1.21.4(typescript@5.3.3) + zustand: 4.5.0(@types/react@18.2.48)(react@18.2.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -6929,23 +7368,24 @@ packages: - zod dev: false - /@walletconnect/core@2.10.2: - resolution: {integrity: sha512-JQz/xp3SLEpTeRQctdck2ugSBVEpMxoSE+lFi2voJkZop1hv6P+uqr6E4PzjFluAjeAnKlT1xvra0aFWjPWVcw==} + /@walletconnect/core@2.11.0: + resolution: {integrity: sha512-2Tjp5BCevI7dbmqo/OrCjX4tqgMqwJNQLlQAlphqPfvwlF9+tIu6pGcVbSN3U9zyXzWIZCeleqEaWUeSeET4Ew==} dependencies: '@walletconnect/heartbeat': 1.2.1 '@walletconnect/jsonrpc-provider': 1.0.13 '@walletconnect/jsonrpc-types': 1.0.3 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/jsonrpc-ws-connection': 1.0.13 + '@walletconnect/jsonrpc-ws-connection': 1.0.14 '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.0.1 '@walletconnect/relay-api': 1.0.9 '@walletconnect/relay-auth': 1.0.4 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.10.2 - '@walletconnect/utils': 2.10.2 + '@walletconnect/types': 2.11.0 + '@walletconnect/utils': 2.11.0 events: 3.3.0 + isomorphic-unfetch: 3.1.0 lodash.isequal: 4.5.0 uint8arrays: 3.1.1 transitivePeerDependencies: @@ -6962,6 +7402,7 @@ packages: - '@upstash/redis' - '@vercel/kv' - bufferutil + - encoding - supports-color - utf-8-validate dev: false @@ -6991,23 +7432,18 @@ packages: tslib: 1.14.1 dev: false - /@walletconnect/ethereum-provider@2.10.2(@walletconnect/modal@2.6.2): - resolution: {integrity: sha512-QMYFZ6+rVq2CJLdIPdKK0j1Qm66UA27oQU5V2SrL8EVwl7wFfm0Bq7fnL+qAWeDpn612dNeNErpk/ROa1zWlWg==} - peerDependencies: - '@walletconnect/modal': '>=2' - peerDependenciesMeta: - '@walletconnect/modal': - optional: true + /@walletconnect/ethereum-provider@2.11.0(@types/react@18.2.48)(react@18.2.0): + resolution: {integrity: sha512-YrTeHVjuSuhlUw7SQ6xBJXDuJ6iAC+RwINm9nVhoKYJSHAy3EVSJZOofMKrnecL0iRMtD29nj57mxAInIBRuZA==} dependencies: '@walletconnect/jsonrpc-http-connection': 1.0.7 '@walletconnect/jsonrpc-provider': 1.0.13 '@walletconnect/jsonrpc-types': 1.0.3 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/modal': 2.6.2(@types/react@18.2.38)(react@18.2.0) - '@walletconnect/sign-client': 2.10.2 - '@walletconnect/types': 2.10.2 - '@walletconnect/universal-provider': 2.10.2 - '@walletconnect/utils': 2.10.2 + '@walletconnect/modal': 2.6.2(@types/react@18.2.48)(react@18.2.0) + '@walletconnect/sign-client': 2.11.0 + '@walletconnect/types': 2.11.0 + '@walletconnect/universal-provider': 2.11.0 + '@walletconnect/utils': 2.11.0 events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -7020,10 +7456,12 @@ packages: - '@netlify/blobs' - '@planetscale/database' - '@react-native-async-storage/async-storage' + - '@types/react' - '@upstash/redis' - '@vercel/kv' - bufferutil - encoding + - react - supports-color - utf-8-validate dev: false @@ -7077,13 +7515,12 @@ packages: tslib: 1.14.1 dev: false - /@walletconnect/jsonrpc-ws-connection@1.0.13: - resolution: {integrity: sha512-mfOM7uFH4lGtQxG+XklYuFBj6dwVvseTt5/ahOkkmpcAEgz2umuzu7fTR+h5EmjQBdrmYyEBOWADbeaFNxdySg==} + /@walletconnect/jsonrpc-ws-connection@1.0.14: + resolution: {integrity: sha512-Jsl6fC55AYcbkNVkwNM6Jo+ufsuCQRqViOQ8ZBPH9pRREHH9welbBiszuTLqEJiQcO/6XfFDl6bzCJIkrEi8XA==} dependencies: '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/safe-json': 1.0.2 events: 3.3.0 - tslib: 1.14.1 ws: 7.5.9 transitivePeerDependencies: - bufferutil @@ -7137,7 +7574,7 @@ packages: '@walletconnect/legacy-types': 2.0.0 '@walletconnect/legacy-utils': 2.0.0 copy-to-clipboard: 3.3.3 - preact: 10.19.2 + preact: 10.19.3 qrcode: 1.5.3 dev: false @@ -7180,19 +7617,19 @@ packages: tslib: 1.14.1 dev: false - /@walletconnect/modal-core@2.6.2(@types/react@18.2.38)(react@18.2.0): + /@walletconnect/modal-core@2.6.2(@types/react@18.2.48)(react@18.2.0): resolution: {integrity: sha512-cv8ibvdOJQv2B+nyxP9IIFdxvQznMz8OOr/oR/AaUZym4hjXNL/l1a2UlSQBXrVjo3xxbouMxLb3kBsHoYP2CA==} dependencies: - valtio: 1.11.2(@types/react@18.2.38)(react@18.2.0) + valtio: 1.11.2(@types/react@18.2.48)(react@18.2.0) transitivePeerDependencies: - '@types/react' - react dev: false - /@walletconnect/modal-ui@2.6.2(@types/react@18.2.38)(react@18.2.0): + /@walletconnect/modal-ui@2.6.2(@types/react@18.2.48)(react@18.2.0): resolution: {integrity: sha512-rbdstM1HPGvr7jprQkyPggX7rP4XiCG85ZA+zWBEX0dVQg8PpAgRUqpeub4xQKDgY7pY/xLRXSiCVdWGqvG2HA==} dependencies: - '@walletconnect/modal-core': 2.6.2(@types/react@18.2.38)(react@18.2.0) + '@walletconnect/modal-core': 2.6.2(@types/react@18.2.48)(react@18.2.0) lit: 2.8.0 motion: 10.16.2 qrcode: 1.5.3 @@ -7201,11 +7638,11 @@ packages: - react dev: false - /@walletconnect/modal@2.6.2(@types/react@18.2.38)(react@18.2.0): + /@walletconnect/modal@2.6.2(@types/react@18.2.48)(react@18.2.0): resolution: {integrity: sha512-eFopgKi8AjKf/0U4SemvcYw9zlLpx9njVN8sf6DAkowC2Md0gPU/UNEbH1Wwj407pEKnEds98pKWib1NN1ACoA==} dependencies: - '@walletconnect/modal-core': 2.6.2(@types/react@18.2.38)(react@18.2.0) - '@walletconnect/modal-ui': 2.6.2(@types/react@18.2.38)(react@18.2.0) + '@walletconnect/modal-core': 2.6.2(@types/react@18.2.48)(react@18.2.0) + '@walletconnect/modal-ui': 2.6.2(@types/react@18.2.48)(react@18.2.0) transitivePeerDependencies: - '@types/react' - react @@ -7244,17 +7681,17 @@ packages: tslib: 1.14.1 dev: false - /@walletconnect/sign-client@2.10.2: - resolution: {integrity: sha512-vviSLV3f92I0bReX+OLr1HmbH0uIzYEQQFd1MzIfDk9PkfFT/LLAHhUnDaIAMkIdippqDcJia+5QEtT4JihL3Q==} + /@walletconnect/sign-client@2.11.0: + resolution: {integrity: sha512-H2ukscibBS+6WrzQWh+WyVBqO5z4F5et12JcwobdwgHnJSlqIoZxqnUYYWNCI5rUR5UKsKWaUyto4AE9N5dw4Q==} dependencies: - '@walletconnect/core': 2.10.2 + '@walletconnect/core': 2.11.0 '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.1 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.0.1 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.10.2 - '@walletconnect/utils': 2.10.2 + '@walletconnect/types': 2.11.0 + '@walletconnect/utils': 2.11.0 events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -7270,6 +7707,7 @@ packages: - '@upstash/redis' - '@vercel/kv' - bufferutil + - encoding - supports-color - utf-8-validate dev: false @@ -7280,8 +7718,8 @@ packages: tslib: 1.14.1 dev: false - /@walletconnect/types@2.10.2: - resolution: {integrity: sha512-luNV+07Wdla4STi9AejseCQY31tzWKQ5a7C3zZZaRK/di+rFaAAb7YW04OP4klE7tw/mJRGPTlekZElmHxO8kQ==} + /@walletconnect/types@2.11.0: + resolution: {integrity: sha512-AB5b1lrEbCGHxqS2vqfCkIoODieH+ZAUp9rA1O2ftrhnqDJiJK983Df87JhYhECsQUBHHfALphA8ydER0q+9sw==} dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.1 @@ -7305,17 +7743,17 @@ packages: - supports-color dev: false - /@walletconnect/universal-provider@2.10.2: - resolution: {integrity: sha512-wFgI0LbQ3D56sgaUMsgOHCM5m8WLxiC71BGuCKQfApgsbNMVKugYVy2zWHyUyi8sqTQHI+uSaVpDev4UHq9LEw==} + /@walletconnect/universal-provider@2.11.0: + resolution: {integrity: sha512-zgJv8jDvIMP4Qse/D9oIRXGdfoNqonsrjPZanQ/CHNe7oXGOBiQND2IIeX+tS0H7uNA0TPvctljCLiIN9nw4eA==} dependencies: '@walletconnect/jsonrpc-http-connection': 1.0.7 '@walletconnect/jsonrpc-provider': 1.0.13 '@walletconnect/jsonrpc-types': 1.0.3 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.0.1 - '@walletconnect/sign-client': 2.10.2 - '@walletconnect/types': 2.10.2 - '@walletconnect/utils': 2.10.2 + '@walletconnect/sign-client': 2.11.0 + '@walletconnect/types': 2.11.0 + '@walletconnect/utils': 2.11.0 events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -7336,8 +7774,8 @@ packages: - utf-8-validate dev: false - /@walletconnect/utils@2.10.2: - resolution: {integrity: sha512-syxXRpc2yhSknMu3IfiBGobxOY7fLfLTJuw+ppKaeO6WUdZpIit3wfuGOcc0Ms3ZPFCrGfyGOoZsCvgdXtptRg==} + /@walletconnect/utils@2.11.0: + resolution: {integrity: sha512-hxkHPlTlDQILHfIKXlmzgNJau/YcSBC3XHUSuZuKZbNEw3duFT6h6pm3HT/1+j1a22IG05WDsNBuTCRkwss+BQ==} dependencies: '@stablelib/chacha20poly1305': 1.0.1 '@stablelib/hkdf': 1.0.1 @@ -7347,7 +7785,7 @@ packages: '@walletconnect/relay-api': 1.0.9 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.10.2 + '@walletconnect/types': 2.11.0 '@walletconnect/window-getters': 1.0.1 '@walletconnect/window-metadata': 1.0.1 detect-browser: 5.3.0 @@ -7476,7 +7914,7 @@ packages: /@wry/context@0.4.4: resolution: {integrity: sha512-LrKVLove/zw6h2Md/KZyWxIkFM6AoyKp71OqpH9Hiip1csjPVoD3tPxlbQUNxEnHENks3UGgNpSBCAfq9KWuag==} dependencies: - '@types/node': 16.18.64 + '@types/node': 16.18.76 tslib: 1.14.1 dev: false @@ -7527,6 +7965,7 @@ packages: /abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead /abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} @@ -7534,7 +7973,7 @@ packages: dev: false optional: true - /abitype@0.8.7(typescript@5.3.2): + /abitype@0.8.7(typescript@5.3.3): resolution: {integrity: sha512-wQ7hV8Yg/yKmGyFpqrNZufCxbszDe5es4AZGYPBitocfSqXtjrTG9JMWFcc4N30ukl2ve48aBTwt7NJxVQdU3w==} peerDependencies: typescript: '>=5.0.4' @@ -7543,10 +7982,10 @@ packages: zod: optional: true dependencies: - typescript: 5.3.2 + typescript: 5.3.3 dev: false - /abitype@0.9.8(typescript@5.3.2): + /abitype@0.9.8(typescript@5.3.3): resolution: {integrity: sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==} peerDependencies: typescript: '>=5.0.4' @@ -7557,7 +7996,7 @@ packages: zod: optional: true dependencies: - typescript: 5.3.2 + typescript: 5.3.3 dev: false /accepts@1.3.8: @@ -7573,19 +8012,19 @@ packages: acorn: 7.4.1 acorn-walk: 7.2.0 - /acorn-import-assertions@1.9.0(acorn@8.11.2): + /acorn-import-assertions@1.9.0(acorn@8.11.3): resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} peerDependencies: acorn: ^8 dependencies: - acorn: 8.11.2 + acorn: 8.11.3 - /acorn-jsx@5.3.2(acorn@8.11.2): + /acorn-jsx@5.3.2(acorn@8.11.3): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.11.2 + acorn: 8.11.3 /acorn-node@1.8.2: resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==} @@ -7599,8 +8038,8 @@ packages: resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} engines: {node: '>=0.4.0'} - /acorn-walk@8.3.0: - resolution: {integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==} + /acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} engines: {node: '>=0.4.0'} dev: true @@ -7609,8 +8048,8 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - /acorn@8.11.2: - resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} engines: {node: '>=0.4.0'} hasBin: true @@ -7623,7 +8062,7 @@ packages: engines: {node: '>=8.9'} dependencies: loader-utils: 2.0.4 - regex-parser: 2.2.11 + regex-parser: 2.3.0 /aes-js@3.1.2: resolution: {integrity: sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==} @@ -7790,6 +8229,10 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + /any-observable@0.3.0(rxjs@6.6.7): resolution: {integrity: sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==} engines: {node: '>=6'} @@ -8053,9 +8496,6 @@ packages: /array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - /array-flatten@2.1.2: - resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==} - /array-includes@3.1.7: resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} engines: {node: '>= 0.4'} @@ -8163,14 +8603,14 @@ packages: resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} dependencies: bn.js: 4.12.0(patch_hash=mdjtmbbjulugflauukpfkw6p4q) - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) + inherits: 2.0.4 minimalistic-assert: 1.0.1 - safer-buffer: 2.1.2 + safer-buffer: 2.1.2(patch_hash=sdxbjiwrw3yiqjkfb6uxghzoza) /asn1@0.2.6: resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} dependencies: - safer-buffer: 2.1.2 + safer-buffer: 2.1.2(patch_hash=sdxbjiwrw3yiqjkfb6uxghzoza) dev: true /asn1js@3.0.5: @@ -8189,12 +8629,13 @@ packages: /assert@1.5.1: resolution: {integrity: sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==} dependencies: - object.assign: 4.1.4 + object.assign: 4.1.5 util: 0.10.4 dev: true - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + /assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} dev: true /assign-symbols@1.0.0: @@ -8264,19 +8705,19 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: false - /autoprefixer@10.4.16(postcss@8.4.31): - resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} + /autoprefixer@10.4.17(postcss@8.4.33): + resolution: {integrity: sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.22.1 - caniuse-lite: 1.0.30001564 + browserslist: 4.22.2 + caniuse-lite: 1.0.30001580 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 /available-typed-arrays@1.0.5: @@ -8300,18 +8741,18 @@ packages: dependencies: dequal: 2.0.3 - /babel-jest@26.6.3(@babel/core@7.23.3): + /babel-jest@26.6.3(@babel/core@7.23.9): resolution: {integrity: sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==} engines: {node: '>= 10.14.2'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@jest/transform': 26.6.2 '@jest/types': 26.6.2 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 26.6.2(@babel/core@7.23.3) + babel-preset-jest: 26.6.2(@babel/core@7.23.9) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -8319,37 +8760,37 @@ packages: - supports-color dev: true - /babel-jest@27.5.1(@babel/core@7.23.3): + /babel-jest@27.5.1(@babel/core@7.23.9): resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 27.5.1(@babel/core@7.23.3) + babel-preset-jest: 27.5.1(@babel/core@7.23.9) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 transitivePeerDependencies: - supports-color - /babel-loader@8.3.0(@babel/core@7.23.3)(webpack@5.89.0): + /babel-loader@8.3.0(@babel/core@7.23.9)(webpack@5.90.0): resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} engines: {node: '>= 8.9'} peerDependencies: '@babel/core': ^7.0.0 webpack: '>=2' dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 find-cache-dir: 3.3.2 loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.89.0 + webpack: 5.90.0 /babel-plugin-istanbul@6.1.1: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} @@ -8367,138 +8808,138 @@ packages: resolution: {integrity: sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==} engines: {node: '>= 10.14.2'} dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.4 + '@babel/template': 7.23.9 + '@babel/types': 7.23.9 '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.4 + '@types/babel__traverse': 7.20.5 dev: true /babel-plugin-jest-hoist@27.5.1: resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.4 + '@babel/template': 7.23.9 + '@babel/types': 7.23.9 '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.4 + '@types/babel__traverse': 7.20.5 /babel-plugin-macros@3.1.0: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.9 cosmiconfig: 7.1.0 resolve: 1.22.8 - /babel-plugin-named-asset-import@0.3.8(@babel/core@7.23.3): + /babel-plugin-named-asset-import@0.3.8(@babel/core@7.23.9): resolution: {integrity: sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==} peerDependencies: '@babel/core': ^7.1.0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 - /babel-plugin-polyfill-corejs2@0.4.6(@babel/core@7.23.3): - resolution: {integrity: sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==} + /babel-plugin-polyfill-corejs2@0.4.8(@babel/core@7.23.9): + resolution: {integrity: sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/compat-data': 7.23.3 - '@babel/core': 7.23.3 - '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.3) + '@babel/compat-data': 7.23.5 + '@babel/core': 7.23.9 + '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.23.9) semver: 6.3.1 transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-corejs3@0.8.6(@babel/core@7.23.3): - resolution: {integrity: sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==} + /babel-plugin-polyfill-corejs3@0.9.0(@babel/core@7.23.9): + resolution: {integrity: sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.23.3 - '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.3) - core-js-compat: 3.33.3 + '@babel/core': 7.23.9 + '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.23.9) + core-js-compat: 3.35.1 transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-regenerator@0.5.3(@babel/core@7.23.3): - resolution: {integrity: sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==} + /babel-plugin-polyfill-regenerator@0.5.5(@babel/core@7.23.9): + resolution: {integrity: sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.23.3 - '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.3) + '@babel/core': 7.23.9 + '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.23.9) transitivePeerDependencies: - supports-color - /babel-plugin-transform-hook-names@1.0.2(@babel/core@7.23.3): + /babel-plugin-transform-hook-names@1.0.2(@babel/core@7.24.3): resolution: {integrity: sha512-5gafyjyyBTTdX/tQQ0hRgu4AhNHG/hqWi0ZZmg2xvs2FgRkJXzDNKBZCyoYqgFkovfDrgM8OoKg8karoUvWeCw==} peerDependencies: '@babel/core': ^7.12.10 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.24.3 dev: false /babel-plugin-transform-react-remove-prop-types@0.4.24: resolution: {integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==} - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.3): + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.9): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.3 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.3) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.3) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.3) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.3) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.3) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.3) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.3) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.3) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.3) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.3) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.3) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.3) - - /babel-preset-jest@26.6.2(@babel/core@7.23.3): + '@babel/core': 7.23.9 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.9) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.9) + + /babel-preset-jest@26.6.2(@babel/core@7.23.9): resolution: {integrity: sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==} engines: {node: '>= 10.14.2'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 babel-plugin-jest-hoist: 26.6.2 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.3) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.9) dev: true - /babel-preset-jest@27.5.1(@babel/core@7.23.3): + /babel-preset-jest@27.5.1(@babel/core@7.23.9): resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 babel-plugin-jest-hoist: 27.5.1 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.3) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.9) /babel-preset-react-app@10.0.1: resolution: {integrity: sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==} dependencies: - '@babel/core': 7.23.3 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.3) - '@babel/plugin-proposal-decorators': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.23.3) - '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.23.3) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.23.3) - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.23.3) - '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.23.3) - '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-runtime': 7.23.4(@babel/core@7.23.3) - '@babel/preset-env': 7.23.3(@babel/core@7.23.3) - '@babel/preset-react': 7.23.3(@babel/core@7.23.3) - '@babel/preset-typescript': 7.23.3(@babel/core@7.23.3) - '@babel/runtime': 7.23.4 + '@babel/core': 7.23.9 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-proposal-decorators': 7.23.9(@babel/core@7.23.9) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.23.9) + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.23.9) + '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-runtime': 7.23.9(@babel/core@7.23.9) + '@babel/preset-env': 7.23.9(@babel/core@7.23.9) + '@babel/preset-react': 7.23.3(@babel/core@7.23.9) + '@babel/preset-typescript': 7.23.3(@babel/core@7.23.9) + '@babel/runtime': 7.23.9 babel-plugin-macros: 3.1.0 babel-plugin-transform-react-remove-prop-types: 0.4.24 transitivePeerDependencies: @@ -8518,7 +8959,7 @@ packages: /base-x@3.0.9: resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} dependencies: - safe-buffer: 5.2.1 + safe-buffer: 5.2.1(patch_hash=qcepvj3ww73f2shgrehxggbrbq) dev: false /base64-js@1.5.1: @@ -8645,26 +9086,6 @@ packages: transitivePeerDependencies: - supports-color - /body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.2 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: true - /body@5.1.0: resolution: {integrity: sha512-chUsBxGRtuElD6fmw1gHLpvnKdVLK302peeFa9ZqAEk8TyzZ3fygLyUEDDPTJvL9+Bor0dIwn6ePOsRM2y0zQQ==} dependencies: @@ -8674,11 +9095,9 @@ packages: safe-json-parse: 1.0.1 dev: true - /bonjour-service@1.1.1: - resolution: {integrity: sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==} + /bonjour-service@1.2.1: + resolution: {integrity: sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==} dependencies: - array-flatten: 2.1.2 - dns-equal: 1.0.0 fast-deep-equal: 3.1.3 multicast-dns: 7.2.5 @@ -8779,7 +9198,7 @@ packages: JSONStream: 1.3.5 combine-source-map: 0.8.0 defined: 1.0.1 - safe-buffer: 5.2.1 + safe-buffer: 5.2.1(patch_hash=qcepvj3ww73f2shgrehxggbrbq) through2: 2.0.5 umd: 3.0.3 dev: true @@ -8804,8 +9223,8 @@ packages: cipher-base: 1.0.4 create-hash: 1.2.0 evp_bytestokey: 1.0.3 - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) - safe-buffer: 5.2.1 + inherits: 2.0.4 + safe-buffer: 5.2.1(patch_hash=qcepvj3ww73f2shgrehxggbrbq) dev: true /browserify-cipher@1.0.1: @@ -8821,8 +9240,8 @@ packages: dependencies: cipher-base: 1.0.4 des.js: 1.1.0 - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) - safe-buffer: 5.2.1 + inherits: 2.0.4 + safe-buffer: 5.2.1(patch_hash=qcepvj3ww73f2shgrehxggbrbq) dev: true /browserify-rsa@4.1.0: @@ -8841,10 +9260,10 @@ packages: create-hash: 1.2.0 create-hmac: 1.1.7 elliptic: 6.5.4 - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) + inherits: 2.0.4 parse-asn1: 5.1.6 readable-stream: 3.6.2 - safe-buffer: 5.2.1 + safe-buffer: 5.2.1(patch_hash=qcepvj3ww73f2shgrehxggbrbq) dev: true /browserify-zlib@0.2.0: @@ -8878,7 +9297,7 @@ packages: has: 1.0.4 htmlescape: 1.1.1 https-browserify: 1.0.0 - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) + inherits: 2.0.4 insert-module-globals: 7.2.1 labeled-stream-splicer: 2.0.2 mkdirp-classic: 0.5.3 @@ -8908,15 +9327,15 @@ packages: xtend: 4.0.2 dev: true - /browserslist@4.22.1: - resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} + /browserslist@4.22.2: + resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001564 - electron-to-chromium: 1.4.592 - node-releases: 2.0.13 - update-browserslist-db: 1.0.13(browserslist@4.22.1) + caniuse-lite: 1.0.30001580 + electron-to-chromium: 1.4.647 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.22.2) /bs-logger@0.2.6: resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} @@ -8981,7 +9400,7 @@ packages: engines: {node: '>=6.14.2'} requiresBuild: true dependencies: - node-gyp-build: 4.7.0(patch_hash=2d5zv4cuxtybogr2ggxm6rv25y) + node-gyp-build: 4.8.0(patch_hash=tidq6bjknpovdjep75bj5ccgke) /builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} @@ -9070,7 +9489,7 @@ packages: dependencies: function-bind: 1.1.2 get-intrinsic: 1.2.2 - set-function-length: 1.1.1 + set-function-length: 1.2.0 /caller-callsite@2.0.0: resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} @@ -9122,13 +9541,13 @@ packages: /caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: - browserslist: 4.22.1 - caniuse-lite: 1.0.30001564 + browserslist: 4.22.2 + caniuse-lite: 1.0.30001580 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - /caniuse-lite@1.0.30001564: - resolution: {integrity: sha512-DqAOf+rhof+6GVx1y+xzbFPeOumfQnhYzVnZD6LAXijR77yPtm9mfOcqOnT3mpnJiZVT+kwLAFnRlZcIz+c6bg==} + /caniuse-lite@1.0.30001580: + resolution: {integrity: sha512-mtj5ur2FFPZcCEpXFy8ADXbDACuNFXg6mxVDqp7tqooX6l3zwm+d8EPoeOSIFRDvHs8qu7/SLFOGniULkcH2iA==} /canonicalize@1.0.8: resolution: {integrity: sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A==} @@ -9137,7 +9556,7 @@ packages: /canvas-renderer@2.2.1: resolution: {integrity: sha512-RrBgVL5qCEDIXpJ6NrzyRNoTnXxYarqm/cS/W6ERhUJts5UQtt/XPEosGN3rqUkZ4fjBArlnCbsISJ+KCFnIAg==} dependencies: - '@types/node': 16.18.64 + '@types/node': 16.18.76 dev: false /capture-exit@2.0.0: @@ -9171,26 +9590,24 @@ packages: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} dev: false - /chai-as-promised@7.1.1(chai@4.3.10): + /chai-as-promised@7.1.1(chai@5.0.3): resolution: {integrity: sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==} peerDependencies: chai: '>= 2.1.2 < 5' dependencies: - chai: 4.3.10 + chai: 5.0.3 check-error: 1.0.3 dev: true - /chai@4.3.10: - resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} - engines: {node: '>=4'} + /chai@5.0.3: + resolution: {integrity: sha512-wKGCtYv2kVY5WEjKqQ3fSIZWtTFveZCtzinhTZbx3/trVkxefiwovhpU9kRVCwxvKKCEjTWXPdM1/T7zPoDgow==} + engines: {node: '>=12'} dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 + assertion-error: 2.0.1 + check-error: 2.0.0 + deep-eql: 5.0.1 + loupe: 3.1.0 + pathval: 2.0.0 dev: true /chainsaw@0.1.0: @@ -9308,6 +9725,11 @@ packages: get-func-name: 2.0.2 dev: true + /check-error@2.0.0: + resolution: {integrity: sha512-tjLAOBHKVxtPoHe/SA7kNOMvhCRdCJ3vETdeY0RuAc9popf+hyaSV6ZEg9hr4cpWF7jmo/JSWEnLDrnijS9Tog==} + engines: {node: '>= 16'} + dev: true + /check-types@11.2.3: resolution: {integrity: sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==} @@ -9393,8 +9815,8 @@ packages: /cipher-base@1.0.4: resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} dependencies: - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) - safe-buffer: 5.2.1 + inherits: 2.0.4 + safe-buffer: 5.2.1(patch_hash=qcepvj3ww73f2shgrehxggbrbq) dev: true /citty@0.1.5: @@ -9423,12 +9845,12 @@ packages: /class-validator@0.13.2: resolution: {integrity: sha512-yBUcQy07FPlGzUjoLuUfIOXzgynnQPPruyK1Ge2B74k9ROwnle1E+NxLWnUv5OLU8hA/qL5leAE9XnXq3byaBw==} dependencies: - libphonenumber-js: 1.10.50 + libphonenumber-js: 1.10.54 validator: 13.11.0 dev: false - /clean-css@5.3.2: - resolution: {integrity: sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==} + /clean-css@5.3.3: + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} engines: {node: '>= 10.0'} dependencies: source-map: 0.6.1 @@ -9484,13 +9906,13 @@ packages: execa: 0.8.0 dev: false - /clipboardy@3.0.0: - resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + /clipboardy@4.0.0: + resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} + engines: {node: '>=18'} dependencies: - arch: 2.2.0 - execa: 5.1.1 - is-wsl: 2.2.0 + execa: 8.0.1 + is-wsl: 3.1.0 + is64bit: 2.0.0 dev: false /cliui@6.0.0: @@ -9531,8 +9953,8 @@ packages: engines: {node: '>=6'} dev: false - /clsx@2.0.0: - resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} + /clsx@2.1.0: + resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} engines: {node: '>=6'} dev: false @@ -9740,7 +10162,7 @@ packages: engines: {'0': node >= 0.8} dependencies: buffer-from: 1.1.2 - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) + inherits: 2.0.4 readable-stream: 2.3.8 typedarray: 0.0.6 dev: true @@ -9805,7 +10227,7 @@ packages: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} dependencies: - safe-buffer: 5.2.1 + safe-buffer: 5.2.1(patch_hash=qcepvj3ww73f2shgrehxggbrbq) /content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} @@ -9855,17 +10277,17 @@ packages: toggle-selection: 1.0.6 dev: false - /core-js-compat@3.33.3: - resolution: {integrity: sha512-cNzGqFsh3Ot+529GIXacjTJ7kegdt5fPXxCBVS1G0iaZpuo/tBz399ymceLJveQhFFZ8qThHiP3fzuoQjKN2ow==} + /core-js-compat@3.35.1: + resolution: {integrity: sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==} dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 - /core-js-pure@3.33.3: - resolution: {integrity: sha512-taJ00IDOP+XYQEA2dAe4ESkmHt1fL8wzYDo3mRWQey8uO9UojlBFMneA65kMyxfYP7106c6LzWaq7/haDT6BCQ==} + /core-js-pure@3.35.1: + resolution: {integrity: sha512-zcIdi/CL3MWbBJYo5YCeVAAx+Sy9yJE9I3/u9LkFABwbeaPhTMRWraM8mYFp9jW5Z50hOy7FVzCc8dCrpZqtIQ==} requiresBuild: true - /core-js@3.33.3: - resolution: {integrity: sha512-lo0kOocUlLKmm6kv/FswQL8zbkH7mVsLJ/FULClOhv8WRVmKLVcs6XPNQAzstfeJTCHMyButEwG+z1kHxHoDZw==} + /core-js@3.35.1: + resolution: {integrity: sha512-IgdsbxNyMskrTFxa9lWHyMwAJU5gXOPP+1yO+K59d50VLVAIDAbs7gIv705KzALModfK3ZrSZTPNpC0PQgIZuw==} requiresBuild: true /core-util-is@1.0.2: @@ -9955,7 +10377,7 @@ packages: resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} dependencies: cipher-base: 1.0.4 - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) + inherits: 2.0.4 md5.js: 1.3.5 ripemd160: 2.0.2 sha.js: 2.4.11 @@ -9966,9 +10388,9 @@ packages: dependencies: cipher-base: 1.0.4 create-hash: 1.2.0 - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) + inherits: 2.0.4 ripemd160: 2.0.2 - safe-buffer: 5.2.1 + safe-buffer: 5.2.1(patch_hash=qcepvj3ww73f2shgrehxggbrbq) sha.js: 2.4.11 dev: true @@ -10022,7 +10444,7 @@ packages: create-hash: 1.2.0 create-hmac: 1.1.7 diffie-hellman: 5.0.3 - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) + inherits: 2.0.4 pbkdf2: 3.1.2 public-encrypt: 4.0.3 randombytes: 2.1.0 @@ -10033,15 +10455,15 @@ packages: resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} engines: {node: '>=8'} - /css-blank-pseudo@3.0.3(postcss@8.4.31): + /css-blank-pseudo@3.0.3(postcss@8.4.33): resolution: {integrity: sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==} engines: {node: ^12 || ^14 || >=16} hasBin: true peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 - postcss-selector-parser: 6.0.13 + postcss: 8.4.33 + postcss-selector-parser: 6.0.15 /css-color-names@0.0.4: resolution: {integrity: sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==} @@ -10053,41 +10475,41 @@ packages: postcss: 7.0.39 timsort: 0.3.0 - /css-declaration-sorter@6.4.1(postcss@8.4.31): + /css-declaration-sorter@6.4.1(postcss@8.4.33): resolution: {integrity: sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==} engines: {node: ^10 || ^12 || >=14} peerDependencies: postcss: ^8.0.9 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 - /css-has-pseudo@3.0.4(postcss@8.4.31): + /css-has-pseudo@3.0.4(postcss@8.4.33): resolution: {integrity: sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==} engines: {node: ^12 || ^14 || >=16} hasBin: true peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 - postcss-selector-parser: 6.0.13 + postcss: 8.4.33 + postcss-selector-parser: 6.0.15 - /css-loader@6.8.1(webpack@5.89.0): - resolution: {integrity: sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==} + /css-loader@6.9.1(webpack@5.90.0): + resolution: {integrity: sha512-OzABOh0+26JKFdMzlK6PY1u5Zx8+Ck7CVRlcGNZoY9qwJjdfu2VWFuprTIpPW+Av5TZTVViYWcFQaEEQURLknQ==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.31) - postcss: 8.4.31 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.31) - postcss-modules-local-by-default: 4.0.3(postcss@8.4.31) - postcss-modules-scope: 3.0.0(postcss@8.4.31) - postcss-modules-values: 4.0.0(postcss@8.4.31) + icss-utils: 5.1.0(postcss@8.4.33) + postcss: 8.4.33 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.33) + postcss-modules-local-by-default: 4.0.4(postcss@8.4.33) + postcss-modules-scope: 3.1.1(postcss@8.4.33) + postcss-modules-values: 4.0.0(postcss@8.4.33) postcss-value-parser: 4.2.0 semver: 7.5.4 - webpack: 5.89.0 + webpack: 5.90.0 - /css-minimizer-webpack-plugin@3.4.1(webpack@5.89.0): + /css-minimizer-webpack-plugin@3.4.1(webpack@5.90.0): resolution: {integrity: sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -10106,13 +10528,13 @@ packages: esbuild: optional: true dependencies: - cssnano: 5.1.15(postcss@8.4.31) + cssnano: 5.1.15(postcss@8.4.33) jest-worker: 27.5.1 - postcss: 8.4.31 + postcss: 8.4.33 schema-utils: 4.2.0 - serialize-javascript: 6.0.1 + serialize-javascript: 6.0.2 source-map: 0.6.1 - webpack: 5.89.0 + webpack: 5.90.0 /css-modules-loader-core@1.1.0: resolution: {integrity: sha512-XWOBwgy5nwBn76aA+6ybUGL/3JBnCtBX9Ay9/OWIpzKYWlVHMazvJ+WtHumfi+xxdPF440cWK7JCYtt8xDifew==} @@ -10124,14 +10546,14 @@ packages: postcss-modules-scope: 1.1.0 postcss-modules-values: 1.3.0 - /css-prefers-color-scheme@6.0.3(postcss@8.4.31): + /css-prefers-color-scheme@6.0.3(postcss@8.4.33): resolution: {integrity: sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==} engines: {node: ^12 || ^14 || >=16} hasBin: true peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 /css-select-base-adapter@0.1.1: resolution: {integrity: sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==} @@ -10194,8 +10616,8 @@ packages: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} dev: true - /cssdb@7.9.0: - resolution: {integrity: sha512-WPMT9seTQq6fPAa1yN4zjgZZeoTriSN2LqW9C+otjar12DQIWA4LuSfFrvFJiKp4oD0xIk1vumDLw8K9ur4NBw==} + /cssdb@7.10.0: + resolution: {integrity: sha512-yGZ5tmA57gWh/uvdQBHs45wwFY0IBh3ypABk5sEubPBPSzXzkNgsWReqx7gdx6uhC+QoFBe+V8JwBB9/hQ6cIA==} /cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} @@ -10237,42 +10659,42 @@ packages: postcss-svgo: 4.0.3 postcss-unique-selectors: 4.0.1 - /cssnano-preset-default@5.2.14(postcss@8.4.31): + /cssnano-preset-default@5.2.14(postcss@8.4.33): resolution: {integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - css-declaration-sorter: 6.4.1(postcss@8.4.31) - cssnano-utils: 3.1.0(postcss@8.4.31) - postcss: 8.4.31 - postcss-calc: 8.2.4(postcss@8.4.31) - postcss-colormin: 5.3.1(postcss@8.4.31) - postcss-convert-values: 5.1.3(postcss@8.4.31) - postcss-discard-comments: 5.1.2(postcss@8.4.31) - postcss-discard-duplicates: 5.1.0(postcss@8.4.31) - postcss-discard-empty: 5.1.1(postcss@8.4.31) - postcss-discard-overridden: 5.1.0(postcss@8.4.31) - postcss-merge-longhand: 5.1.7(postcss@8.4.31) - postcss-merge-rules: 5.1.4(postcss@8.4.31) - postcss-minify-font-values: 5.1.0(postcss@8.4.31) - postcss-minify-gradients: 5.1.1(postcss@8.4.31) - postcss-minify-params: 5.1.4(postcss@8.4.31) - postcss-minify-selectors: 5.2.1(postcss@8.4.31) - postcss-normalize-charset: 5.1.0(postcss@8.4.31) - postcss-normalize-display-values: 5.1.0(postcss@8.4.31) - postcss-normalize-positions: 5.1.1(postcss@8.4.31) - postcss-normalize-repeat-style: 5.1.1(postcss@8.4.31) - postcss-normalize-string: 5.1.0(postcss@8.4.31) - postcss-normalize-timing-functions: 5.1.0(postcss@8.4.31) - postcss-normalize-unicode: 5.1.1(postcss@8.4.31) - postcss-normalize-url: 5.1.0(postcss@8.4.31) - postcss-normalize-whitespace: 5.1.1(postcss@8.4.31) - postcss-ordered-values: 5.1.3(postcss@8.4.31) - postcss-reduce-initial: 5.1.2(postcss@8.4.31) - postcss-reduce-transforms: 5.1.0(postcss@8.4.31) - postcss-svgo: 5.1.0(postcss@8.4.31) - postcss-unique-selectors: 5.1.1(postcss@8.4.31) + css-declaration-sorter: 6.4.1(postcss@8.4.33) + cssnano-utils: 3.1.0(postcss@8.4.33) + postcss: 8.4.33 + postcss-calc: 8.2.4(postcss@8.4.33) + postcss-colormin: 5.3.1(postcss@8.4.33) + postcss-convert-values: 5.1.3(postcss@8.4.33) + postcss-discard-comments: 5.1.2(postcss@8.4.33) + postcss-discard-duplicates: 5.1.0(postcss@8.4.33) + postcss-discard-empty: 5.1.1(postcss@8.4.33) + postcss-discard-overridden: 5.1.0(postcss@8.4.33) + postcss-merge-longhand: 5.1.7(postcss@8.4.33) + postcss-merge-rules: 5.1.4(postcss@8.4.33) + postcss-minify-font-values: 5.1.0(postcss@8.4.33) + postcss-minify-gradients: 5.1.1(postcss@8.4.33) + postcss-minify-params: 5.1.4(postcss@8.4.33) + postcss-minify-selectors: 5.2.1(postcss@8.4.33) + postcss-normalize-charset: 5.1.0(postcss@8.4.33) + postcss-normalize-display-values: 5.1.0(postcss@8.4.33) + postcss-normalize-positions: 5.1.1(postcss@8.4.33) + postcss-normalize-repeat-style: 5.1.1(postcss@8.4.33) + postcss-normalize-string: 5.1.0(postcss@8.4.33) + postcss-normalize-timing-functions: 5.1.0(postcss@8.4.33) + postcss-normalize-unicode: 5.1.1(postcss@8.4.33) + postcss-normalize-url: 5.1.0(postcss@8.4.33) + postcss-normalize-whitespace: 5.1.1(postcss@8.4.33) + postcss-ordered-values: 5.1.3(postcss@8.4.33) + postcss-reduce-initial: 5.1.2(postcss@8.4.33) + postcss-reduce-transforms: 5.1.0(postcss@8.4.33) + postcss-svgo: 5.1.0(postcss@8.4.33) + postcss-unique-selectors: 5.1.1(postcss@8.4.33) /cssnano-util-get-arguments@4.0.0: resolution: {integrity: sha512-6RIcwmV3/cBMG8Aj5gucQRsJb4vv4I4rn6YjPbVWd5+Pn/fuG+YseGvXGk00XLkoZkaj31QOD7vMUpNPC4FIuw==} @@ -10292,13 +10714,13 @@ packages: resolution: {integrity: sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==} engines: {node: '>=6.9.0'} - /cssnano-utils@3.1.0(postcss@8.4.31): + /cssnano-utils@3.1.0(postcss@8.4.33): resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 /cssnano@4.1.11: resolution: {integrity: sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==} @@ -10309,15 +10731,15 @@ packages: is-resolvable: 1.1.0 postcss: 7.0.39 - /cssnano@5.1.15(postcss@8.4.31): + /cssnano@5.1.15(postcss@8.4.33): resolution: {integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-preset-default: 5.2.14(postcss@8.4.31) + cssnano-preset-default: 5.2.14(postcss@8.4.33) lilconfig: 2.1.0 - postcss: 8.4.31 + postcss: 8.4.33 yaml: 1.10.2 /csso@4.2.0: @@ -10342,8 +10764,8 @@ packages: dependencies: cssom: 0.3.8 - /csstype@3.1.2: - resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} /csv-generate@3.4.3: resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} @@ -10373,26 +10795,26 @@ packages: lodash.flow: 3.5.0 dev: true - /cytoscape-cose-bilkent@4.1.0(cytoscape@3.27.0): + /cytoscape-cose-bilkent@4.1.0(cytoscape@3.28.1): resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} peerDependencies: cytoscape: ^3.2.0 dependencies: cose-base: 1.0.3 - cytoscape: 3.27.0 + cytoscape: 3.28.1 dev: false - /cytoscape-fcose@2.2.0(cytoscape@3.27.0): + /cytoscape-fcose@2.2.0(cytoscape@3.28.1): resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} peerDependencies: cytoscape: ^3.2.0 dependencies: cose-base: 2.2.0 - cytoscape: 3.27.0 + cytoscape: 3.28.1 dev: false - /cytoscape@3.27.0: - resolution: {integrity: sha512-pPZJilfX9BxESwujODz5pydeGi+FBrXq1rcaB1mfhFXXFJ9GjE6CNndAk+8jPzoXGD+16LtSS4xlYEIUiW4Abg==} + /cytoscape@3.28.1: + resolution: {integrity: sha512-xyItz4O/4zp9/239wCcH8ZcFuuZooEeF8KHRmzjDfGdXsj3OG9MFSMA0pJE0uX3uCN/ygof6hHf4L7lst+JaDg==} engines: {node: '>=0.10'} dependencies: heap: 0.2.7 @@ -10451,7 +10873,7 @@ packages: resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} engines: {node: '>=12'} dependencies: - delaunator: 5.0.0 + delaunator: 5.0.1 dev: false /d3-dispatch@3.0.1: @@ -10790,11 +11212,9 @@ packages: /dedent@0.7.0: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + /deep-eql@5.0.1: + resolution: {integrity: sha512-nwQCf6ne2gez3o1MxWifqkciwt0zhl0LO1/UwVu4uMBuPmflWM4oQ70XMqHqnBJA+nhzncaqL9HVL6KkHJ28lw==} engines: {node: '>=6'} - dependencies: - type-detect: 4.0.8 dev: true /deep-equal@2.2.3: @@ -10813,7 +11233,7 @@ packages: isarray: 2.0.5 object-is: 1.1.5 object-keys: 1.1.1 - object.assign: 4.1.4 + object.assign: 4.1.5 regexp.prototype.flags: 1.5.1 side-channel: 1.0.4 which-boxed-primitive: 1.0.2 @@ -10901,8 +11321,8 @@ packages: resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} dev: true - /defu@6.1.3: - resolution: {integrity: sha512-Vy2wmG3NTkmHNg/kzpuvHhkqeIx3ODWqasgCRbKtbXEN0G+HpEEv9BtJLp7ZG1CZloFaC41Ah3ZFbq7aqCqMeQ==} + /defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} dev: false /del@6.1.1: @@ -10919,8 +11339,8 @@ packages: slash: 3.0.0 dev: true - /delaunator@5.0.0: - resolution: {integrity: sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==} + /delaunator@5.0.1: + resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} dependencies: robust-predicates: 3.0.2 dev: false @@ -10974,7 +11394,7 @@ packages: /des.js@1.1.0: resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} dependencies: - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) + inherits: 2.0.4 minimalistic-assert: 1.0.1 dev: true @@ -11098,9 +11518,6 @@ packages: /dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - /dns-equal@1.0.0: - resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==} - /dns-packet@5.6.1: resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} engines: {node: '>=6'} @@ -11183,6 +11600,7 @@ packages: /domexception@2.0.1: resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} engines: {node: '>=8'} + deprecated: Use your platform's native DOMException instead dependencies: webidl-conversions: 5.0.0 @@ -11205,8 +11623,8 @@ packages: dependencies: domelementtype: 2.3.0 - /dompurify@3.0.6: - resolution: {integrity: sha512-ilkD8YEnnGh1zJ240uJsW7AzE+2qpbOUYjacomn3AvJ6J4JhKGSZ2nh4wUIXPZrEPppaCLx5jFe8T89Rk8tQ7w==} + /dompurify@3.0.8: + resolution: {integrity: sha512-b7uwreMYL2eZhrSCRC4ahLTeZcPZxSmYfmcQGXGkXiZSNW1X85v+SDM5KsWcpivIiUBH47Ji7NtyUdpLeF5JZQ==} dev: false /domutils@1.7.0: @@ -11271,16 +11689,19 @@ packages: resolution: {integrity: sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==} dependencies: end-of-stream: 1.4.4 - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) + inherits: 2.0.4 readable-stream: 3.6.2 - stream-shift: 1.0.1 + stream-shift: 1.0.3 dev: false + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + /ecc-jsbn@0.1.2: resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} dependencies: jsbn: 0.1.1 - safer-buffer: 2.1.2 + safer-buffer: 2.1.2(patch_hash=sdxbjiwrw3yiqjkfb6uxghzoza) dev: true /ee-first@1.1.1: @@ -11293,8 +11714,8 @@ packages: dependencies: jake: 10.8.7 - /electron-to-chromium@1.4.592: - resolution: {integrity: sha512-D3NOkROIlF+d5ixnz7pAf3Lu/AuWpd6AYgI9O67GQXMXTcCP1gJQRotOq35eQy5Sb4hez33XH1YdTtILA7Udww==} + /electron-to-chromium@1.4.647: + resolution: {integrity: sha512-Z/fTNGwc45WrYQhPaEcz5tAJuZZ8G7S/DBnhS6Kgp4BxnS40Z/HqlJ0hHg3Z79IGVzuVartIlTcjw/cQbPLgOw==} /electron@20.3.12: resolution: {integrity: sha512-CuCZKhwdSXaUNIoEuPVZ25YH18zmox3wEM8Acwcy9tlpD8Jiuq3ji3RZ98eVWJalrpqbdE9LtTD/sLC86GIkLg==} @@ -11303,7 +11724,7 @@ packages: requiresBuild: true dependencies: '@electron/get': 1.14.1 - '@types/node': 16.18.64 + '@types/node': 16.18.76 extract-zip: 2.0.1 transitivePeerDependencies: - supports-color @@ -11314,8 +11735,8 @@ packages: engines: {node: '>=0.10.0'} dev: true - /elkjs@0.8.2: - resolution: {integrity: sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==} + /elkjs@0.9.1: + resolution: {integrity: sha512-JWKDyqAdltuUcyxaECtYG6H4sqysXSLeoXuGUBfRNESMTkj+w+qdb0jya8Z/WI0jVd03WQtCGhS6FOFtlhD5FQ==} dev: false /elliptic@6.5.4: @@ -11325,7 +11746,7 @@ packages: brorand: 1.1.0(patch_hash=coni6w7ml52xq7hk7pjg56sj54) hash.js: 1.1.7 hmac-drbg: 1.0.1 - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) + inherits: 2.0.4 minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 @@ -11462,10 +11883,10 @@ packages: is-weakref: 1.0.2 object-inspect: 1.13.1 object-keys: 1.1.1 - object.assign: 4.1.4 + object.assign: 4.1.5 regexp.prototype.flags: 1.5.1 - safe-array-concat: 1.0.1 - safe-regex-test: 1.0.0 + safe-array-concat: 1.1.0 + safe-regex-test: 1.0.2 string.prototype.trim: 1.2.8 string.prototype.trimend: 1.0.7 string.prototype.trimstart: 1.0.7 @@ -11509,7 +11930,7 @@ packages: has-symbols: 1.0.3 internal-slot: 1.0.6 iterator.prototype: 1.1.2 - safe-array-concat: 1.0.1 + safe-array-concat: 1.1.0 /es-module-lexer@1.4.1: resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} @@ -11812,34 +12233,35 @@ packages: '@esbuild/win32-ia32': 0.18.20 '@esbuild/win32-x64': 0.18.20 - /esbuild@0.19.7: - resolution: {integrity: sha512-6brbTZVqxhqgbpqBR5MzErImcpA0SQdoKOkcWK/U30HtQxnokIpG3TX2r0IJqbFUzqLjhU/zC1S5ndgakObVCQ==} + /esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': 0.19.7 - '@esbuild/android-arm64': 0.19.7 - '@esbuild/android-x64': 0.19.7 - '@esbuild/darwin-arm64': 0.19.7 - '@esbuild/darwin-x64': 0.19.7 - '@esbuild/freebsd-arm64': 0.19.7 - '@esbuild/freebsd-x64': 0.19.7 - '@esbuild/linux-arm': 0.19.7 - '@esbuild/linux-arm64': 0.19.7 - '@esbuild/linux-ia32': 0.19.7 - '@esbuild/linux-loong64': 0.19.7 - '@esbuild/linux-mips64el': 0.19.7 - '@esbuild/linux-ppc64': 0.19.7 - '@esbuild/linux-riscv64': 0.19.7 - '@esbuild/linux-s390x': 0.19.7 - '@esbuild/linux-x64': 0.19.7 - '@esbuild/netbsd-x64': 0.19.7 - '@esbuild/openbsd-x64': 0.19.7 - '@esbuild/sunos-x64': 0.19.7 - '@esbuild/win32-arm64': 0.19.7 - '@esbuild/win32-ia32': 0.19.7 - '@esbuild/win32-x64': 0.19.7 + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 dev: true /escalade@3.1.1: @@ -11899,12 +12321,12 @@ packages: optionalDependencies: source-map: 0.6.1 - /eslint-config-custom@0.0.0(eslint@8.54.0)(typescript@4.9.5): + /eslint-config-custom@0.0.0(eslint@8.57.0)(typescript@4.9.5): resolution: {integrity: sha512-kwCw78yisbgKdJBJ5qooPmpBYDphDfM2oxSROmtfOwBXBwXuRiSV3suO01W3mVLEFpmQZxMWd/qajKpJhkKSug==} dependencies: - eslint-config-next: 12.3.4(eslint@8.54.0)(typescript@4.9.5) - eslint-config-prettier: 8.10.0(eslint@8.54.0) - eslint-plugin-react: 7.28.0(eslint@8.54.0) + eslint-config-next: 12.3.4(eslint@8.57.0)(typescript@4.9.5) + eslint-config-prettier: 8.10.0(eslint@8.57.0) + eslint-plugin-react: 7.28.0(eslint@8.57.0) transitivePeerDependencies: - eslint - eslint-import-resolver-webpack @@ -11912,7 +12334,7 @@ packages: - typescript dev: true - /eslint-config-next@12.3.4(eslint@8.54.0)(typescript@4.9.5): + /eslint-config-next@12.3.4(eslint@8.57.0)(typescript@4.9.5): resolution: {integrity: sha512-WuT3gvgi7Bwz00AOmKGhOeqnyA5P29Cdyr0iVjLyfDbk+FANQKcOjFUTZIdyYfe5Tq1x4TGcmoe4CwctGvFjHQ==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 @@ -11922,31 +12344,31 @@ packages: optional: true dependencies: '@next/eslint-plugin-next': 12.3.4 - '@rushstack/eslint-patch': 1.6.0 - '@typescript-eslint/parser': 5.62.0(eslint@8.54.0)(typescript@4.9.5) - eslint: 8.54.0 + '@rushstack/eslint-patch': 1.7.2 + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@4.9.5) + eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 2.7.1(eslint-plugin-import@2.29.0)(eslint@8.54.0) - eslint-plugin-import: 2.29.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.54.0) - eslint-plugin-jsx-a11y: 6.8.0(eslint@8.54.0) - eslint-plugin-react: 7.33.2(eslint@8.54.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.54.0) + eslint-import-resolver-typescript: 2.7.1(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.57.0) + eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) + eslint-plugin-react: 7.33.2(eslint@8.57.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) typescript: 4.9.5 transitivePeerDependencies: - eslint-import-resolver-webpack - supports-color dev: true - /eslint-config-prettier@8.10.0(eslint@8.54.0): + /eslint-config-prettier@8.10.0(eslint@8.57.0): resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.54.0 + eslint: 8.57.0 dev: true - /eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.23.3)(@babel/plugin-transform-react-jsx@7.23.4)(eslint@8.54.0)(jest@27.5.1)(typescript@4.9.5): + /eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.1)(@babel/plugin-transform-react-jsx@7.23.4)(eslint@8.57.0)(jest@27.5.1)(typescript@4.9.5): resolution: {integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -11956,21 +12378,21 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.23.3 - '@babel/eslint-parser': 7.23.3(@babel/core@7.23.3)(eslint@8.54.0) - '@rushstack/eslint-patch': 1.6.0 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.54.0)(typescript@4.9.5) - '@typescript-eslint/parser': 5.62.0(eslint@8.54.0)(typescript@4.9.5) + '@babel/core': 7.23.9 + '@babel/eslint-parser': 7.23.9(@babel/core@7.23.9)(eslint@8.57.0) + '@rushstack/eslint-patch': 1.7.2 + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@4.9.5) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@4.9.5) babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 - eslint: 8.54.0 - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.23.3)(@babel/plugin-transform-react-jsx@7.23.4)(eslint@8.54.0) - eslint-plugin-import: 2.29.0(@typescript-eslint/parser@5.62.0)(eslint@8.54.0) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.54.0)(jest@27.5.1)(typescript@4.9.5) - eslint-plugin-jsx-a11y: 6.8.0(eslint@8.54.0) - eslint-plugin-react: 7.33.2(eslint@8.54.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.54.0) - eslint-plugin-testing-library: 5.11.1(eslint@8.54.0)(typescript@4.9.5) + eslint: 8.57.0 + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.1)(@babel/plugin-transform-react-jsx@7.23.4)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0)(eslint@8.57.0) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.57.0)(jest@27.5.1)(typescript@4.9.5) + eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) + eslint-plugin-react: 7.33.2(eslint@8.57.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) + eslint-plugin-testing-library: 5.11.1(eslint@8.57.0)(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - '@babel/plugin-syntax-flow' @@ -11989,7 +12411,7 @@ packages: transitivePeerDependencies: - supports-color - /eslint-import-resolver-typescript@2.7.1(eslint-plugin-import@2.29.0)(eslint@8.54.0): + /eslint-import-resolver-typescript@2.7.1(eslint-plugin-import@2.29.1)(eslint@8.57.0): resolution: {integrity: sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==} engines: {node: '>=4'} peerDependencies: @@ -11997,16 +12419,16 @@ packages: eslint-plugin-import: '*' dependencies: debug: 4.3.4(supports-color@8.1.1) - eslint: 8.54.0 - eslint-plugin-import: 2.29.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.54.0) + eslint: 8.57.0 + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.57.0) glob: 7.2.3 is-glob: 4.0.3 resolve: 1.22.8 - tsconfig-paths: 3.14.2 + tsconfig-paths: 3.15.0 transitivePeerDependencies: - supports-color - /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@2.7.1)(eslint@8.54.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@2.7.1)(eslint@8.57.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -12027,15 +12449,15 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.54.0)(typescript@4.9.5) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@4.9.5) debug: 3.2.7 - eslint: 8.54.0 + eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 2.7.1(eslint-plugin-import@2.29.0)(eslint@8.54.0) + eslint-import-resolver-typescript: 2.7.1(eslint-plugin-import@2.29.1)(eslint@8.57.0) transitivePeerDependencies: - supports-color - /eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.23.3)(@babel/plugin-transform-react-jsx@7.23.4)(eslint@8.54.0): + /eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.1)(@babel/plugin-transform-react-jsx@7.23.4)(eslint@8.57.0): resolution: {integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -12043,14 +12465,14 @@ packages: '@babel/plugin-transform-react-jsx': ^7.14.9 eslint: ^8.1.0 dependencies: - '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.3) - eslint: 8.54.0 + '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.3) + eslint: 8.57.0 lodash: 4.17.21 string-natural-compare: 3.0.1 - /eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.54.0): - resolution: {integrity: sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==} + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.57.0): + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -12059,16 +12481,16 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.54.0)(typescript@4.9.5) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@4.9.5) array-includes: 3.1.7 array.prototype.findlastindex: 1.2.3 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.54.0 + eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@2.7.1)(eslint@8.54.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@2.7.1)(eslint@8.57.0) hasown: 2.0.0 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -12077,14 +12499,14 @@ packages: object.groupby: 1.0.1 object.values: 1.1.7 semver: 6.3.1 - tsconfig-paths: 3.14.2 + tsconfig-paths: 3.15.0 transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - /eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.0)(eslint@8.54.0): - resolution: {integrity: sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==} + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0)(eslint@8.57.0): + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -12093,16 +12515,16 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.54.0)(typescript@4.9.5) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@4.9.5) array-includes: 3.1.7 array.prototype.findlastindex: 1.2.3 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.54.0 + eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@2.7.1)(eslint@8.54.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@2.7.1)(eslint@8.57.0) hasown: 2.0.0 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -12111,13 +12533,13 @@ packages: object.groupby: 1.0.1 object.values: 1.1.7 semver: 6.3.1 - tsconfig-paths: 3.14.2 + tsconfig-paths: 3.15.0 transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - /eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.54.0)(jest@27.5.1)(typescript@4.9.5): + /eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.57.0)(jest@27.5.1)(typescript@4.9.5): resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} peerDependencies: @@ -12130,21 +12552,21 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.54.0)(typescript@4.9.5) - '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.54.0)(typescript@4.9.5) - eslint: 8.54.0 + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@4.9.5) + '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.0)(typescript@4.9.5) + eslint: 8.57.0 jest: 27.5.1 transitivePeerDependencies: - supports-color - typescript - /eslint-plugin-jsx-a11y@6.8.0(eslint@8.54.0): + /eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0): resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} engines: {node: '>=4.0'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.9 aria-query: 5.3.0 array-includes: 3.1.7 array.prototype.flatmap: 1.3.2 @@ -12154,7 +12576,7 @@ packages: damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 es-iterator-helpers: 1.0.15 - eslint: 8.54.0 + eslint: 8.57.0 hasown: 2.0.0 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -12162,15 +12584,15 @@ packages: object.entries: 1.1.7 object.fromentries: 2.0.7 - /eslint-plugin-react-hooks@4.6.0(eslint@8.54.0): + /eslint-plugin-react-hooks@4.6.0(eslint@8.57.0): resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: - eslint: 8.54.0 + eslint: 8.57.0 - /eslint-plugin-react@7.28.0(eslint@8.54.0): + /eslint-plugin-react@7.28.0(eslint@8.57.0): resolution: {integrity: sha512-IOlFIRHzWfEQQKcAD4iyYDndHwTQiCMcJVJjxempf203jnNLUnW34AXLrV33+nEXoifJE2ZEGmcjKPL8957eSw==} engines: {node: '>=4'} peerDependencies: @@ -12179,7 +12601,7 @@ packages: array-includes: 3.1.7 array.prototype.flatmap: 1.3.2 doctrine: 2.1.0 - eslint: 8.54.0 + eslint: 8.57.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 @@ -12193,7 +12615,7 @@ packages: string.prototype.matchall: 4.0.10 dev: true - /eslint-plugin-react@7.33.2(eslint@8.54.0): + /eslint-plugin-react@7.33.2(eslint@8.57.0): resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} engines: {node: '>=4'} peerDependencies: @@ -12204,7 +12626,7 @@ packages: array.prototype.tosorted: 1.1.2 doctrine: 2.1.0 es-iterator-helpers: 1.0.15 - eslint: 8.54.0 + eslint: 8.57.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 @@ -12217,14 +12639,14 @@ packages: semver: 6.3.1 string.prototype.matchall: 4.0.10 - /eslint-plugin-testing-library@5.11.1(eslint@8.54.0)(typescript@4.9.5): + /eslint-plugin-testing-library@5.11.1(eslint@8.57.0)(typescript@4.9.5): resolution: {integrity: sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} peerDependencies: eslint: ^7.5.0 || ^8.0.0 dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.54.0)(typescript@4.9.5) - eslint: 8.54.0 + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@4.9.5) + eslint: 8.57.0 transitivePeerDependencies: - supports-color - typescript @@ -12251,31 +12673,31 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - /eslint-webpack-plugin@3.2.0(eslint@8.54.0)(webpack@5.89.0): + /eslint-webpack-plugin@3.2.0(eslint@8.57.0)(webpack@5.90.0): resolution: {integrity: sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==} engines: {node: '>= 12.13.0'} peerDependencies: eslint: ^7.0.0 || ^8.0.0 webpack: ^5.0.0 dependencies: - '@types/eslint': 8.44.7 - eslint: 8.54.0 + '@types/eslint': 8.56.2 + eslint: 8.57.0 jest-worker: 28.1.3 micromatch: 4.0.5 normalize-path: 3.0.0 schema-utils: 4.2.0 - webpack: 5.89.0 + webpack: 5.90.0 - /eslint@8.54.0: - resolution: {integrity: sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==} + /eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 2.1.3 - '@eslint/js': 8.54.0 - '@humanwhocodes/config-array': 0.11.13 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 '@ungap/structured-clone': 1.2.0 @@ -12294,9 +12716,9 @@ packages: file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.23.0 + globals: 13.24.0 graphemer: 1.4.0 - ignore: 5.3.0 + ignore: 5.3.1 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -12316,8 +12738,8 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.11.2 - acorn-jsx: 5.3.2(acorn@8.11.2) + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) eslint-visitor-keys: 3.4.3 /esprima@1.2.2: @@ -12460,7 +12882,7 @@ packages: resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} dependencies: md5.js: 1.3.5 - safe-buffer: 5.2.1 + safe-buffer: 5.2.1(patch_hash=qcepvj3ww73f2shgrehxggbrbq) dev: true /exec-sh@0.3.6: @@ -12522,6 +12944,21 @@ packages: signal-exit: 3.0.7 strip-final-newline: 2.0.0 + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.2.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + dev: false + /exit@0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} @@ -12600,7 +13037,7 @@ packages: proxy-addr: 2.0.7 qs: 6.11.0 range-parser: 1.2.1 - safe-buffer: 5.2.1 + safe-buffer: 5.2.1(patch_hash=qcepvj3ww73f2shgrehxggbrbq) send: 0.18.0 serve-static: 1.15.0 setprototypeof: 1.2.0 @@ -12729,8 +13166,8 @@ packages: /fastparse@1.1.2: resolution: {integrity: sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==} - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + /fastq@1.16.0: + resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} dependencies: reusify: 1.0.4 @@ -12769,7 +13206,7 @@ packages: engines: {node: ^12.20 || >= 14.13} dependencies: node-domexception: 1.0.0 - web-streams-polyfill: 3.2.1 + web-streams-polyfill: 3.3.2 dev: true /figures@1.7.0: @@ -12799,7 +13236,7 @@ packages: dependencies: flat-cache: 3.2.0 - /file-loader@6.2.0(webpack@5.89.0): + /file-loader@6.2.0(webpack@5.90.0): resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -12807,7 +13244,7 @@ packages: dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.89.0 + webpack: 5.90.0 /file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} @@ -12921,7 +13358,7 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flatted: 3.2.9 + flatted: 3.3.1 keyv: 4.5.4 rimraf: 3.0.2 @@ -12934,19 +13371,19 @@ packages: resolution: {integrity: sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==} dev: true - /flatted@3.2.9: - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + /flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - /flexsearch@0.7.31: - resolution: {integrity: sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA==} + /flexsearch@0.7.43: + resolution: {integrity: sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg==} dev: false /focus-visible@5.2.0: resolution: {integrity: sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==} dev: false - /follow-redirects@1.15.3: - resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} + /follow-redirects@1.15.5: + resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -12964,11 +13401,18 @@ packages: engines: {node: '>=0.10.0'} dev: true + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + /forever-agent@0.6.1: resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} dev: true - /fork-ts-checker-webpack-plugin@6.5.3(eslint@8.54.0)(typescript@4.9.5)(webpack@5.89.0): + /fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.0)(typescript@4.9.5)(webpack@5.90.0): resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} engines: {node: '>=10', yarn: '>=1.0.0'} peerDependencies: @@ -12982,13 +13426,13 @@ packages: vue-template-compiler: optional: true dependencies: - '@babel/code-frame': 7.23.4 + '@babel/code-frame': 7.23.5 '@types/json-schema': 7.0.15 chalk: 4.1.2 chokidar: 3.5.3 cosmiconfig: 6.0.0 deepmerge: 4.3.1 - eslint: 8.54.0 + eslint: 8.57.0 fs-extra: 9.1.0 glob: 7.2.3 memfs: 3.5.3 @@ -12997,7 +13441,7 @@ packages: semver: 7.5.4 tapable: 1.1.3 typescript: 4.9.5 - webpack: 5.89.0 + webpack: 5.90.0 /form-data@2.3.3: resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} @@ -13136,7 +13580,7 @@ packages: engines: {node: '>=0.6'} dependencies: graceful-fs: 4.2.11 - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) + inherits: 2.0.4 mkdirp: 0.5.6 rimraf: 2.7.1 dev: true @@ -13213,8 +13657,8 @@ packages: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} - /get-port-please@3.1.1: - resolution: {integrity: sha512-3UBAyM3u4ZBVYDsxOQfJDxEa6XTbpBDrOjp4mf7ExFRt5BKs/QywQQiJsh2B+hxcZLSapWqCRvElUe8DnKcFHA==} + /get-port-please@3.1.2: + resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==} dev: false /get-port@5.1.1(patch_hash=qyyizwcnoypqxlftc4xbpqbjxq): @@ -13244,6 +13688,11 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: false + /get-symbol-description@1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} @@ -13333,33 +13782,34 @@ packages: /glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 7.0.4 + path-scurry: 1.10.1 + /glob@7.1.3: resolution: {integrity: sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==} dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) + inherits: 2.0.4 minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 dev: true - /glob@7.1.6: - resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - /glob@7.1.7: resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) + inherits: 2.0.4 minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 @@ -13370,7 +13820,7 @@ packages: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) + inherits: 2.0.4 minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 @@ -13381,7 +13831,7 @@ packages: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) + inherits: 2.0.4 minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 @@ -13444,8 +13894,8 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - /globals@13.23.0: - resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 @@ -13558,8 +14008,8 @@ packages: dependencies: graphql: 15.7.2(patch_hash=nr4gprddtjag7fz5nm4wirqs4q) - /graphql-ws@5.14.2(graphql@15.7.2): - resolution: {integrity: sha512-LycmCwhZ+Op2GlHz4BZDsUYHKRiiUz+3r9wbhBATMETNlORQJAaFlAgTFoeRh6xQoQegwYwIylVD1Qns9/DA3w==} + /graphql-ws@5.14.3(graphql@15.7.2): + resolution: {integrity: sha512-F/i2xNIVbaEF2xWggID0X/UZQa2V8kqKDPO8hwmu53bVOcTL7uNkxnexeEgSCVxYBQUTUNEI8+e4LO1FOhKPKQ==} engines: {node: '>=10'} peerDependencies: graphql: '>=0.11 <=16' @@ -13594,17 +14044,18 @@ packages: dependencies: duplexer: 0.1.2 - /h3@1.9.0: - resolution: {integrity: sha512-+F3ZqrNV/CFXXfZ2lXBINHi+rM4Xw3CDC5z2CDK3NMPocjonKipGLLDSkrqY9DOrioZNPTIdDMWfQKm//3X2DA==} + /h3@1.10.1: + resolution: {integrity: sha512-UBAUp47hmm4BB5/njB4LrEa9gpuvZj4/Qf/ynSMzO6Ku2RXaouxEfiG2E2IFnv6fxbhAkzjasDxmo6DFdEeXRg==} dependencies: cookie-es: 1.0.0 - defu: 6.1.3 + defu: 6.1.4 destr: 2.0.2 iron-webcrypto: 1.0.0 + ohash: 1.1.3 radix3: 1.1.0 ufo: 1.3.2 uncrypto: 0.1.3 - unenv: 1.8.0 + unenv: 1.9.0 dev: false /handle-thing@2.0.1: @@ -13739,9 +14190,9 @@ packages: resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} engines: {node: '>=4'} dependencies: - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) + inherits: 2.0.4 readable-stream: 3.6.2 - safe-buffer: 5.2.1 + safe-buffer: 5.2.1(patch_hash=qcepvj3ww73f2shgrehxggbrbq) dev: true /hash-obj@4.0.0: @@ -13756,7 +14207,7 @@ packages: /hash.js@1.1.7: resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} dependencies: - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) + inherits: 2.0.4 minimalistic-assert: 1.0.1 /hasown@2.0.0: @@ -13800,7 +14251,7 @@ packages: '@types/unist': 3.0.2 devlop: 1.1.0 hastscript: 8.0.0 - property-information: 6.4.0 + property-information: 6.4.1 vfile: 6.0.1 vfile-location: 5.0.2 web-namespaces: 2.0.1 @@ -13818,8 +14269,8 @@ packages: '@types/hast': 3.0.3 dev: false - /hast-util-raw@9.0.1: - resolution: {integrity: sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==} + /hast-util-raw@9.0.2: + resolution: {integrity: sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==} dependencies: '@types/hast': 3.0.3 '@types/unist': 3.0.2 @@ -13827,7 +14278,7 @@ packages: hast-util-from-parse5: 8.0.1 hast-util-to-parse5: 8.0.0 html-void-elements: 3.0.0 - mdast-util-to-hast: 13.0.2 + mdast-util-to-hast: 13.1.0 parse5: 7.1.2 unist-util-position: 5.0.0 unist-util-visit: 5.0.0 @@ -13841,7 +14292,7 @@ packages: dependencies: '@types/estree': 1.0.5 '@types/estree-jsx': 1.0.3 - '@types/hast': 2.3.8 + '@types/hast': 2.3.9 '@types/unist': 2.0.10 comma-separated-tokens: 2.0.3 estree-util-attach-comments: 2.1.1 @@ -13849,7 +14300,7 @@ packages: hast-util-whitespace: 2.0.1 mdast-util-mdx-expression: 1.3.2 mdast-util-mdxjs-esm: 1.3.1 - property-information: 6.4.0 + property-information: 6.4.1 space-separated-tokens: 2.0.2 style-to-object: 0.4.4 unist-util-position: 4.0.4 @@ -13864,7 +14315,7 @@ packages: '@types/hast': 3.0.3 comma-separated-tokens: 2.0.3 devlop: 1.1.0 - property-information: 6.4.0 + property-information: 6.4.1 space-separated-tokens: 2.0.2 web-namespaces: 2.0.1 zwitch: 2.0.4 @@ -13889,7 +14340,7 @@ packages: '@types/hast': 3.0.3 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 - property-information: 6.4.0 + property-information: 6.4.1 space-separated-tokens: 2.0.2 dev: false @@ -13964,7 +14415,7 @@ packages: lru_map: 0.4.1 memoize-one: 5.2.1 mkdirp: 1.0.4 - moment: 2.29.4 + moment: 2.30.1 nunjucks: 3.2.4(chokidar@3.5.3) nunjucks-do: 1.0.0 object-path: 0.11.8 @@ -14008,7 +14459,7 @@ packages: /hpack.js@2.1.6: resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} dependencies: - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) + inherits: 2.0.4 obuf: 1.1.2 readable-stream: 2.3.8 wbuf: 1.7.3 @@ -14046,29 +14497,35 @@ packages: hasBin: true dependencies: camel-case: 4.1.2 - clean-css: 5.3.2 + clean-css: 5.3.3 commander: 8.3.0 he: 1.2.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.24.0 + terser: 5.27.0 /html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} dev: false - /html-webpack-plugin@5.5.3(webpack@5.89.0): - resolution: {integrity: sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==} + /html-webpack-plugin@5.6.0(webpack@5.90.0): + resolution: {integrity: sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==} engines: {node: '>=10.13.0'} peerDependencies: + '@rspack/core': 0.x || 1.x webpack: ^5.20.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.89.0 + webpack: 5.90.0 /htmlescape@1.1.1: resolution: {integrity: sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg==} @@ -14129,7 +14586,7 @@ packages: engines: {node: '>= 0.6'} dependencies: depd: 1.1.2 - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) + inherits: 2.0.4 setprototypeof: 1.2.0 statuses: 1.5.0 toidentifier: 1.0.1 @@ -14140,7 +14597,7 @@ packages: engines: {node: '>= 0.8'} dependencies: depd: 2.0.0 - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) + inherits: 2.0.4 setprototypeof: 1.2.0 statuses: 2.0.1 toidentifier: 1.0.1 @@ -14181,7 +14638,7 @@ packages: engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.3 + follow-redirects: 1.15.5 requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -14226,6 +14683,11 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + dev: false + /humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} dependencies: @@ -14242,24 +14704,24 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} dependencies: - safer-buffer: 2.1.2 + safer-buffer: 2.1.2(patch_hash=sdxbjiwrw3yiqjkfb6uxghzoza) /iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} dependencies: - safer-buffer: 2.1.2 + safer-buffer: 2.1.2(patch_hash=sdxbjiwrw3yiqjkfb6uxghzoza) /icss-replace-symbols@1.1.0: resolution: {integrity: sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==} - /icss-utils@5.1.0(postcss@8.4.31): + /icss-utils@5.1.0(postcss@8.4.33): resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 /idb-keyval@6.2.1: resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} @@ -14286,6 +14748,10 @@ packages: resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} engines: {node: '>= 4'} + /ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + /immer@9.0.21: resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} @@ -14300,8 +14766,8 @@ packages: engines: {node: '>=0.10.0'} dev: true - /immutable@4.3.4: - resolution: {integrity: sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==} + /immutable@4.3.5: + resolution: {integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==} /import-cwd@2.1.0: resolution: {integrity: sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==} @@ -14380,9 +14846,8 @@ packages: /inherits@2.0.3: resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} - /inherits@2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4): + /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - patched: true /ini@1.3.7: resolution: {integrity: sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==} @@ -14425,7 +14890,7 @@ packages: requiresBuild: true dependencies: ansi-escapes: 3.2.0 - chalk: 2.4.2 + chalk: 2.1.0 cli-cursor: 2.1.0 cli-width: 2.2.1 external-editor: 2.2.0 @@ -14653,13 +15118,6 @@ packages: ci-info: 2.0.0 dev: true - /is-ci@3.0.1: - resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} - hasBin: true - dependencies: - ci-info: 3.9.0 - dev: true - /is-color-stop@1.1.0: resolution: {integrity: sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA==} dependencies: @@ -14721,6 +15179,12 @@ packages: engines: {node: '>=8'} hasBin: true + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dev: false + /is-extendable@0.1.1: resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} engines: {node: '>=0.10.0'} @@ -14779,6 +15243,14 @@ packages: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} dev: false + /is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + dependencies: + is-docker: 3.0.0 + dev: false + /is-installed-globally@0.3.2: resolution: {integrity: sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==} engines: {node: '>=8'} @@ -14952,6 +15424,11 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + /is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} @@ -15015,18 +15492,28 @@ packages: dependencies: is-docker: 2.2.1 + /is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + dependencies: + is-inside-container: 1.0.0 + dev: false + /is-yarn-global@0.3.0: resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==} dev: true + /is64bit@2.0.0: + resolution: {integrity: sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==} + engines: {node: '>=18'} + dependencies: + system-architecture: 0.1.0 + dev: false + /is@3.3.0: resolution: {integrity: sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==} dev: true - /isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - dev: true - /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} @@ -15059,6 +15546,15 @@ packages: engines: {node: '>=0.10.0'} dev: true + /isomorphic-unfetch@3.1.0: + resolution: {integrity: sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==} + dependencies: + node-fetch: 2.7.0 + unfetch: 4.2.0 + transitivePeerDependencies: + - encoding + dev: false + /isomorphic-ws@4.0.1(ws@7.5.9): resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} peerDependencies: @@ -15100,7 +15596,7 @@ packages: resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -15112,8 +15608,8 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.23.3 - '@babel/parser': 7.23.4 + '@babel/core': 7.23.9 + '@babel/parser': 7.23.9 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -15158,6 +15654,14 @@ packages: reflect.getprototypeof: 1.0.4 set-function-name: 2.0.1 + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + /jake@10.8.7: resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} engines: {node: '>=10'} @@ -15222,7 +15726,7 @@ packages: '@jest/environment': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 16.18.64 + '@types/node': 16.18.76 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -15305,10 +15809,10 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@jest/test-sequencer': 26.6.3 '@jest/types': 26.6.2 - babel-jest: 26.6.3(@babel/core@7.23.3) + babel-jest: 26.6.3(@babel/core@7.23.9) chalk: 4.1.2 deepmerge: 4.3.1 glob: 7.2.3 @@ -15339,10 +15843,10 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.9 '@jest/test-sequencer': 27.5.1 '@jest/types': 27.5.1 - babel-jest: 27.5.1(@babel/core@7.23.3) + babel-jest: 27.5.1(@babel/core@7.23.9) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -15438,7 +15942,7 @@ packages: '@jest/environment': 26.6.2 '@jest/fake-timers': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 16.18.64 + '@types/node': 16.18.76 jest-mock: 26.6.2 jest-util: 26.6.2 jsdom: 16.7.0 @@ -15456,7 +15960,7 @@ packages: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 16.18.64 + '@types/node': 16.18.76 jest-mock: 27.5.1 jest-util: 27.5.1 jsdom: 16.7.0 @@ -15473,7 +15977,7 @@ packages: '@jest/environment': 26.6.2 '@jest/fake-timers': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 16.18.64 + '@types/node': 16.18.76 jest-mock: 26.6.2 jest-util: 26.6.2 dev: true @@ -15485,7 +15989,7 @@ packages: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 16.18.64 + '@types/node': 16.18.76 jest-mock: 27.5.1 jest-util: 27.5.1 @@ -15508,7 +16012,7 @@ packages: dependencies: '@jest/types': 26.6.2 '@types/graceful-fs': 4.1.9 - '@types/node': 16.18.64 + '@types/node': 16.18.76 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -15531,7 +16035,7 @@ packages: dependencies: '@jest/types': 27.5.1 '@types/graceful-fs': 4.1.9 - '@types/node': 16.18.64 + '@types/node': 16.18.76 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -15548,12 +16052,12 @@ packages: resolution: {integrity: sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==} engines: {node: '>= 10.14.2'} dependencies: - '@babel/traverse': 7.23.4 + '@babel/traverse': 7.23.9 '@jest/environment': 26.6.2 '@jest/source-map': 26.6.2 '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 16.18.64 + '@types/node': 16.18.76 chalk: 4.1.2 co: 4.6.0 expect: 26.6.2 @@ -15582,7 +16086,7 @@ packages: '@jest/source-map': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 16.18.64 + '@types/node': 16.18.76 chalk: 4.1.2 co: 4.6.0 expect: 27.5.1 @@ -15646,7 +16150,7 @@ packages: resolution: {integrity: sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==} engines: {node: '>= 10.14.2'} dependencies: - '@babel/code-frame': 7.23.4 + '@babel/code-frame': 7.23.5 '@jest/types': 26.6.2 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -15661,7 +16165,7 @@ packages: resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/code-frame': 7.23.4 + '@babel/code-frame': 7.23.5 '@jest/types': 27.5.1 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -15675,7 +16179,7 @@ packages: resolution: {integrity: sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: - '@babel/code-frame': 7.23.4 + '@babel/code-frame': 7.23.5 '@jest/types': 28.1.3 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -15689,7 +16193,7 @@ packages: resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/code-frame': 7.23.4 + '@babel/code-frame': 7.23.5 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -15705,7 +16209,7 @@ packages: engines: {node: '>= 10.14.2'} dependencies: '@jest/types': 26.6.2 - '@types/node': 16.18.64 + '@types/node': 16.18.76 dev: true /jest-mock@27.5.1: @@ -15713,7 +16217,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 16.18.64 + '@types/node': 16.18.76 /jest-pnp-resolver@1.2.3(jest-resolve@26.6.2): resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} @@ -15809,7 +16313,7 @@ packages: '@jest/environment': 26.6.2 '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 16.18.64 + '@types/node': 16.18.76 chalk: 4.1.2 emittery: 0.7.2 exit: 0.1.2 @@ -15842,7 +16346,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 16.18.64 + '@types/node': 16.18.76 chalk: 4.1.2 emittery: 0.8.1 graceful-fs: 4.2.11 @@ -15937,7 +16441,7 @@ packages: resolution: {integrity: sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==} engines: {node: '>= 10.14.2'} dependencies: - '@types/node': 16.18.64 + '@types/node': 16.18.76 graceful-fs: 4.2.11 dev: true @@ -15945,16 +16449,16 @@ packages: resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@types/node': 16.18.64 + '@types/node': 16.18.76 graceful-fs: 4.2.11 /jest-snapshot@26.6.2: resolution: {integrity: sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==} engines: {node: '>= 10.14.2'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.9 '@jest/types': 26.6.2 - '@types/babel__traverse': 7.20.4 + '@types/babel__traverse': 7.20.5 '@types/prettier': 2.7.3 chalk: 4.1.2 expect: 26.6.2 @@ -15976,16 +16480,16 @@ packages: resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/core': 7.23.3 - '@babel/generator': 7.23.4 - '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.3) - '@babel/traverse': 7.23.4 - '@babel/types': 7.23.4 + '@babel/core': 7.23.9 + '@babel/generator': 7.23.6 + '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.9) + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/babel__traverse': 7.20.4 + '@types/babel__traverse': 7.20.5 '@types/prettier': 2.7.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.3) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.9) chalk: 4.1.2 expect: 27.5.1 graceful-fs: 4.2.11 @@ -16006,7 +16510,7 @@ packages: engines: {node: '>= 10.14.2'} dependencies: '@jest/types': 26.6.2 - '@types/node': 16.18.64 + '@types/node': 16.18.76 chalk: 4.1.2 graceful-fs: 4.2.11 is-ci: 2.0.0 @@ -16018,7 +16522,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 16.18.64 + '@types/node': 16.18.76 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -16029,7 +16533,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@jest/types': 28.1.3 - '@types/node': 16.18.64 + '@types/node': 16.18.76 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -16040,7 +16544,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 16.18.64 + '@types/node': 16.18.76 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -16091,7 +16595,7 @@ packages: dependencies: '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 16.18.64 + '@types/node': 16.18.76 ansi-escapes: 4.3.2 chalk: 4.1.2 jest-util: 26.6.2 @@ -16104,7 +16608,7 @@ packages: dependencies: '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 16.18.64 + '@types/node': 16.18.76 ansi-escapes: 4.3.2 chalk: 4.1.2 jest-util: 27.5.1 @@ -16116,7 +16620,7 @@ packages: dependencies: '@jest/test-result': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 16.18.64 + '@types/node': 16.18.76 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.10.2 @@ -16127,7 +16631,7 @@ packages: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 16.18.64 + '@types/node': 16.18.76 merge-stream: 2.0.0 supports-color: 7.2.0 @@ -16135,7 +16639,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 16.18.64 + '@types/node': 16.18.76 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -16143,7 +16647,7 @@ packages: resolution: {integrity: sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: - '@types/node': 16.18.64 + '@types/node': 16.18.76 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -16187,8 +16691,8 @@ packages: resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} hasBin: true - /js-base64@3.7.5: - resolution: {integrity: sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==} + /js-base64@3.7.6: + resolution: {integrity: sha512-NPrWuHFxFUknr1KqJRDgUQPexQF0uIJWjeT+2KjEePhitQxQEx5EJBG1lVn5/hc8aLycTpXrDOgPQ6Zq+EDiTA==} dev: false /js-tokens@4.0.0: @@ -16226,7 +16730,7 @@ packages: optional: true dependencies: abab: 2.0.6 - acorn: 8.11.2 + acorn: 8.11.3 acorn-globals: 6.0.0 cssom: 0.4.4 cssstyle: 2.3.0 @@ -16306,8 +16810,8 @@ packages: /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - /json-stable-stringify@1.1.0: - resolution: {integrity: sha512-zfA+5SuwYN2VWqN1/5HZaDzQKLJHaBVMZIIM+wuYjdptkaQsqzDdqjqf+lZZJUuJq1aanHiY8LhH8LmH+qBYJA==} + /json-stable-stringify@1.1.1: + resolution: {integrity: sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 @@ -16335,8 +16839,8 @@ packages: engines: {node: '>=6'} hasBin: true - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + /jsonc-parser@3.2.1: + resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -16388,7 +16892,7 @@ packages: dependencies: array-includes: 3.1.7 array.prototype.flat: 1.3.2 - object.assign: 4.1.4 + object.assign: 4.1.5 object.values: 1.1.7 /juice@8.1.0: @@ -16405,8 +16909,8 @@ packages: - encoding dev: true - /just-extend@4.2.1: - resolution: {integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==} + /just-extend@6.2.0: + resolution: {integrity: sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==} dev: true /katex@0.16.9: @@ -16422,7 +16926,7 @@ packages: requiresBuild: true dependencies: node-addon-api: 2.0.2 - node-gyp-build: 4.7.0(patch_hash=2d5zv4cuxtybogr2ggxm6rv25y) + node-gyp-build: 4.8.0(patch_hash=tidq6bjknpovdjep75bj5ccgke) readable-stream: 3.6.2 dev: false @@ -16496,7 +17000,7 @@ packages: /labeled-stream-splicer@2.0.2: resolution: {integrity: sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==} dependencies: - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) + inherits: 2.0.4 stream-splicer: 2.0.1 dev: true @@ -16548,8 +17052,8 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 - /libphonenumber-js@1.10.50: - resolution: {integrity: sha512-AOYOJslxKQ49mpwvpkSFcagoMtxeH1UpUHm+05pmPkenPpFbt6ofdeEvQ+ZylmQiJS99ocRWeEeEp7quVlFyVA==} + /libphonenumber-js@1.10.54: + resolution: {integrity: sha512-P+38dUgJsmh0gzoRDoM4F5jLbyfztkU6PY6eSK6S5HwTi/LPvnwXqVCQZlAy1FxZ5c48q25QhxGQ0pq+WQcSlQ==} dev: false /libsodium-wrappers@0.7.13: @@ -16587,26 +17091,26 @@ packages: resolution: {integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==} dev: true - /listhen@1.5.5: - resolution: {integrity: sha512-LXe8Xlyh3gnxdv4tSjTjscD1vpr/2PRpzq8YIaMJgyKzRG8wdISlWVWnGThJfHnlJ6hmLt2wq1yeeix0TEbuoA==} + /listhen@1.5.6: + resolution: {integrity: sha512-gTpEJhT5L85L0bFgmu+Boqu5rP4DwDtEb4Exq5gdQUxWRwx4jbzdInZkmyLONo5EwIcQB0k7ZpWlpCDPdL77EQ==} hasBin: true dependencies: - '@parcel/watcher': 2.3.0 + '@parcel/watcher': 2.4.0 '@parcel/watcher-wasm': 2.3.0 citty: 0.1.5 - clipboardy: 3.0.0 + clipboardy: 4.0.0 consola: 3.2.3 - defu: 6.1.3 - get-port-please: 3.1.1 - h3: 1.9.0 + defu: 6.1.4 + get-port-please: 3.1.2 + h3: 1.10.1 http-shutdown: 1.2.2 jiti: 1.21.0 - mlly: 1.4.2 + mlly: 1.5.0 node-forge: 1.3.1 - pathe: 1.1.1 - std-env: 3.5.0 + pathe: 1.1.2 + std-env: 3.7.0 ufo: 1.3.2 - untun: 0.1.2 + untun: 0.1.3 uqr: 0.1.2 dev: false @@ -16841,8 +17345,8 @@ packages: wrap-ansi: 3.0.1 dev: true - /loglevel@1.8.1: - resolution: {integrity: sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==} + /loglevel@1.9.1: + resolution: {integrity: sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==} engines: {node: '>= 0.6.0'} dev: true @@ -16864,8 +17368,8 @@ packages: dependencies: js-tokens: 4.0.0 - /loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + /loupe@3.1.0: + resolution: {integrity: sha512-qKl+FrLXUhFuHUoDJG7f8P8gEMHq9NFS0c6ghXG1J0rldmZFQZoNVv/vyirE9qwCIhWZDsvEFd1sbFu3GvRQFg==} dependencies: get-func-name: 2.0.2 dev: true @@ -16883,10 +17387,9 @@ packages: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} engines: {node: '>=8'} - /lru-cache@10.1.0: - resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} + /lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} engines: {node: 14 || >=16.14} - dev: false /lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} @@ -16932,6 +17435,20 @@ packages: dependencies: sourcemap-codec: 1.4.8 + /magic-string@0.30.5: + resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + + /magic-string@0.30.7: + resolution: {integrity: sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + /make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} @@ -17003,11 +17520,11 @@ packages: hasBin: true dev: true - /match-sorter@6.3.1: - resolution: {integrity: sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==} + /match-sorter@6.3.3: + resolution: {integrity: sha512-sgiXxrRijEe0SzHKGX4HouCpfHRPnqteH42UdMEW7BlWy990ZkzcvonJGv4Uu9WE7Y1f8Yocm91+4qFPCbmNww==} dependencies: - '@babel/runtime': 7.23.4 - remove-accents: 0.4.2 + '@babel/runtime': 7.23.9 + remove-accents: 0.5.0 dev: false /matcher@3.0.0: @@ -17023,8 +17540,8 @@ packages: resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} dependencies: hash-base: 3.1.0 - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) - safe-buffer: 5.2.1 + inherits: 2.0.4 + safe-buffer: 5.2.1(patch_hash=qcepvj3ww73f2shgrehxggbrbq) dev: true /md5@2.3.0: @@ -17215,7 +17732,7 @@ packages: resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} dependencies: '@types/estree-jsx': 1.0.3 - '@types/hast': 2.3.8 + '@types/hast': 2.3.9 '@types/mdast': 3.0.15 mdast-util-from-markdown: 1.3.1 mdast-util-to-markdown: 1.5.0 @@ -17227,7 +17744,7 @@ packages: resolution: {integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==} dependencies: '@types/estree-jsx': 1.0.3 - '@types/hast': 2.3.8 + '@types/hast': 2.3.9 '@types/mdast': 3.0.15 '@types/unist': 2.0.10 ccount: 2.0.1 @@ -17258,7 +17775,7 @@ packages: resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} dependencies: '@types/estree-jsx': 1.0.3 - '@types/hast': 2.3.8 + '@types/hast': 2.3.9 '@types/mdast': 3.0.15 mdast-util-from-markdown: 1.3.1 mdast-util-to-markdown: 1.5.0 @@ -17276,7 +17793,7 @@ packages: /mdast-util-to-hast@12.3.0: resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} dependencies: - '@types/hast': 2.3.8 + '@types/hast': 2.3.9 '@types/mdast': 3.0.15 mdast-util-definitions: 5.1.2 micromark-util-sanitize-uri: 1.2.0 @@ -17286,8 +17803,8 @@ packages: unist-util-visit: 4.1.2 dev: false - /mdast-util-to-hast@13.0.2: - resolution: {integrity: sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==} + /mdast-util-to-hast@13.1.0: + resolution: {integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==} dependencies: '@types/hast': 3.0.3 '@types/mdast': 4.0.3 @@ -17297,6 +17814,7 @@ packages: trim-lines: 3.0.1 unist-util-position: 5.0.0 unist-util-visit: 5.0.0 + vfile: 6.0.1 dev: false /mdast-util-to-markdown@0.6.5: @@ -17424,29 +17942,29 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - /mermaid@10.6.1: - resolution: {integrity: sha512-Hky0/RpOw/1il9X8AvzOEChfJtVvmXm+y7JML5C//ePYMy0/9jCEmW1E1g86x9oDfW9+iVEdTV/i+M6KWRNs4A==} + /mermaid@10.7.0: + resolution: {integrity: sha512-PsvGupPCkN1vemAAjScyw4pw34p4/0dZkSrqvAB26hUvJulOWGIwt35FZWmT9wPIi4r0QLa5X0PB4YLIGn0/YQ==} dependencies: '@braintree/sanitize-url': 6.0.4 '@types/d3-scale': 4.0.8 '@types/d3-scale-chromatic': 3.0.3 - cytoscape: 3.27.0 - cytoscape-cose-bilkent: 4.1.0(cytoscape@3.27.0) - cytoscape-fcose: 2.2.0(cytoscape@3.27.0) + cytoscape: 3.28.1 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.28.1) + cytoscape-fcose: 2.2.0(cytoscape@3.28.1) d3: 7.8.5 d3-sankey: 0.12.3 dagre-d3-es: 7.0.10 dayjs: 1.11.10 - dompurify: 3.0.6 - elkjs: 0.8.2 + dompurify: 3.0.8 + elkjs: 0.9.1 khroma: 2.1.0 lodash-es: 4.17.21 mdast-util-from-markdown: 1.3.1 non-layered-tidy-tree-layout: 2.0.2 - stylis: 4.3.0 + stylis: 4.3.1 ts-dedent: 2.2.0 uuid: 9.0.1 - web-worker: 1.2.0 + web-worker: 1.3.0 transitivePeerDependencies: - supports-color dev: false @@ -17674,8 +18192,8 @@ packages: /micromark-extension-mdxjs@1.0.1: resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==} dependencies: - acorn: 8.11.2 - acorn-jsx: 5.3.2(acorn@8.11.2) + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) micromark-extension-mdx-expression: 1.0.8 micromark-extension-mdx-jsx: 1.0.5 micromark-extension-mdx-md: 1.0.1 @@ -17976,6 +18494,11 @@ packages: engines: {node: '>=8'} dev: true + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: false + /mimic-response@1.0.1: resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} engines: {node: '>=4'} @@ -17989,14 +18512,14 @@ packages: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} - /mini-css-extract-plugin@2.7.6(webpack@5.89.0): - resolution: {integrity: sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==} + /mini-css-extract-plugin@2.7.7(webpack@5.90.0): + resolution: {integrity: sha512-+0n11YGyRavUR3IlaOzJ0/4Il1avMvJ1VJfhWfCn24ITQXhRr1gghbhhrda6tgtNcpZaWKdSuwKq20Jb7fnlyw==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 dependencies: schema-utils: 4.2.0 - webpack: 5.89.0 + webpack: 5.90.0 /minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} @@ -18027,7 +18550,6 @@ packages: engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 - dev: true /minimist-options@4.1.0: resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} @@ -18045,11 +18567,15 @@ packages: resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==} requiresBuild: true dependencies: - safe-buffer: 5.2.1 + safe-buffer: 5.2.1(patch_hash=qcepvj3ww73f2shgrehxggbrbq) yallist: 3.1.1 dev: false optional: true + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + /minizlib@1.3.3: resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} requiresBuild: true @@ -18087,11 +18613,11 @@ packages: hasBin: true dev: true - /mlly@1.4.2: - resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} + /mlly@1.5.0: + resolution: {integrity: sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==} dependencies: - acorn: 8.11.2 - pathe: 1.1.1 + acorn: 8.11.3 + pathe: 1.1.2 pkg-types: 1.0.3 ufo: 1.3.2 dev: false @@ -18136,7 +18662,7 @@ packages: defined: 1.0.1 detective: 5.2.1 duplexer2: 0.1.4 - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) + inherits: 2.0.4 parents: 1.0.1 readable-stream: 2.3.8 resolve: 1.22.8 @@ -18146,18 +18672,18 @@ packages: xtend: 4.0.2 dev: true - /moment@2.29.4: - resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} + /moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} dev: true /motion@10.16.2: resolution: {integrity: sha512-p+PurYqfUdcJZvtnmAqu5fJgV2kR0uLFQuBKtLeFVTrYEVllI99tiOTSefVNYuip9ELTEkepIIDftNdze76NAQ==} dependencies: - '@motionone/animation': 10.16.3 - '@motionone/dom': 10.16.4 + '@motionone/animation': 10.17.0 + '@motionone/dom': 10.17.0 '@motionone/svelte': 10.16.4 - '@motionone/types': 10.16.3 - '@motionone/utils': 10.16.3 + '@motionone/types': 10.17.0 + '@motionone/utils': 10.17.0 '@motionone/vue': 10.16.4 dev: false @@ -18350,7 +18876,7 @@ packages: '@next/env': 13.5.6 '@swc/helpers': 0.5.2 busboy: 1.6.0 - caniuse-lite: 1.0.30001564 + caniuse-lite: 1.0.30001580 postcss: 8.4.31 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -18379,15 +18905,15 @@ packages: react: '>=16.13.1' react-dom: '>=16.13.1' dependencies: - '@headlessui/react': 1.7.17(react-dom@18.2.0)(react@18.2.0) + '@headlessui/react': 1.7.18(react-dom@18.2.0)(react@18.2.0) '@popperjs/core': 2.11.8 - clsx: 2.0.0 + clsx: 2.1.0 escape-string-regexp: 5.0.0 - flexsearch: 0.7.31 + flexsearch: 0.7.43 focus-visible: 5.2.0 git-url-parse: 13.1.1 intersection-observer: 0.12.2 - match-sorter: 6.3.1 + match-sorter: 6.3.3 next: 13.5.6(react-dom@18.2.0)(react@18.2.0) next-seo: 6.4.0(next@13.5.6)(react-dom@18.2.0)(react@18.2.0) next-themes: 0.2.1(next@13.5.6)(react-dom@18.2.0)(react@18.2.0) @@ -18406,13 +18932,13 @@ packages: react: '>=16.13.1' react-dom: '>=16.13.1' dependencies: - '@headlessui/react': 1.7.17(react-dom@18.2.0)(react@18.2.0) + '@headlessui/react': 1.7.18(react-dom@18.2.0)(react@18.2.0) '@mdx-js/mdx': 2.3.0 '@mdx-js/react': 2.3.0(react@18.2.0) - '@napi-rs/simple-git': 0.1.9 + '@napi-rs/simple-git': 0.1.11 '@theguild/remark-mermaid': 0.0.5(react@18.2.0) '@theguild/remark-npm2yarn': 0.2.1 - clsx: 2.0.0 + clsx: 2.1.0 github-slugger: 2.0.0 graceful-fs: 4.2.11 gray-matter: 4.0.3 @@ -18424,12 +18950,12 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) rehype-katex: 7.0.0 - rehype-pretty-code: 0.9.11(shiki@0.14.5) + rehype-pretty-code: 0.9.11(shiki@0.14.7) rehype-raw: 7.0.0 remark-gfm: 3.0.1 remark-math: 5.1.1 remark-reading-time: 2.0.1 - shiki: 0.14.5 + shiki: 0.14.7 slash: 3.0.0 title: 3.5.3 unist-util-remove: 4.0.0 @@ -18443,14 +18969,14 @@ packages: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} dev: true - /nise@5.1.5: - resolution: {integrity: sha512-VJuPIfUFaXNRzETTQEEItTOP8Y171ijr+JLq42wHes3DiryR8vT+1TXQW/Rx8JNUhyYYWyIvjXTU6dOhJcs9Nw==} + /nise@5.1.7: + resolution: {integrity: sha512-wWtNUhkT7k58uvWTB/Gy26eA/EJKtPZFVAhEilN5UYVmmGRYOURbejRUyKm0Uu9XVEW7K5nBOZfR8VMB4QR2RQ==} dependencies: - '@sinonjs/commons': 2.0.0 - '@sinonjs/fake-timers': 10.3.0 + '@sinonjs/commons': 3.0.1 + '@sinonjs/fake-timers': 11.2.2 '@sinonjs/text-encoding': 0.7.2 - just-extend: 4.2.1 - path-to-regexp: 1.8.0 + just-extend: 6.2.0 + path-to-regexp: 6.2.1 dev: true /no-case@3.0.4: @@ -18467,8 +18993,9 @@ packages: resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} dev: false - /node-addon-api@7.0.0: - resolution: {integrity: sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==} + /node-addon-api@7.1.0: + resolution: {integrity: sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==} + engines: {node: ^16 || ^18 || >= 20} dev: false /node-domexception@1.0.0: @@ -18476,8 +19003,8 @@ packages: engines: {node: '>=10.5.0'} dev: true - /node-fetch-native@1.4.1: - resolution: {integrity: sha512-NsXBU0UgBxo2rQLOeWNZqS3fvflWePMECr8CoSWoSTqCqGbVVsvl9vZu1HfQicYN0g5piV9Gh8RTEvo/uP752w==} + /node-fetch-native@1.6.1: + resolution: {integrity: sha512-bW9T/uJDPAJB2YNYEpWzE54U5O3MQidXsOyTfnbKYtTtFexRvGzb1waphBN4ZwP6EcIvYYEOwW0b72BpAqydTw==} dev: false /node-fetch@2.7.0: @@ -18504,11 +19031,18 @@ packages: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} - /node-gyp-build@4.7.0(patch_hash=2d5zv4cuxtybogr2ggxm6rv25y): - resolution: {integrity: sha512-PbZERfeFdrHQOOXiAKOY0VPbykZy90ndPKk0d+CFDegTKmWp1VgOTz2xACVbr1BjCWxrQp68CXtvNsveFhqDJg==} + /node-gyp-build@4.8.0(patch_hash=tidq6bjknpovdjep75bj5ccgke): + resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==} hasBin: true patched: true + /node-html-parser@6.1.12: + resolution: {integrity: sha512-/bT/Ncmv+fbMGX96XG9g05vFt43m/+SYKIs9oAemQVYyVcZmDAI2Xq/SbNcpOA35eF0Zk2av3Ksf+Xk8Vt8abA==} + dependencies: + css-select: 5.1.0 + he: 1.2.0 + dev: false + /node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} @@ -18546,8 +19080,8 @@ packages: dev: false optional: true - /node-releases@2.0.13: - resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} /node-wget-js@1.0.1: resolution: {integrity: sha512-SXzjefvZvJc5kn9kqsZhs0es8aQ1o9pnnIpzA6CPeHb7CaIfl+7OkO1n8uqyVawMzzUfhEXxW6vbqUsWEgSaFw==} @@ -18747,6 +19281,13 @@ packages: dependencies: path-key: 3.1.1 + /npm-run-path@5.2.0: + resolution: {integrity: sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: false + /npm-to-yarn@2.1.0: resolution: {integrity: sha512-2C1IgJLdJngq1bSER7K7CGFszRr9s2rijEwvENPEgI0eK9xlD3tNwDc0UJnRj7FIT2aydWm72jB88uVswAhXHA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -18848,8 +19389,8 @@ packages: isobject: 3.0.1 dev: true - /object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + /object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 @@ -18881,7 +19422,7 @@ packages: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 - safe-array-concat: 1.0.1 + safe-array-concat: 1.1.0 /object.groupby@1.0.1: resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} @@ -18919,10 +19460,14 @@ packages: resolution: {integrity: sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==} dependencies: destr: 2.0.2 - node-fetch-native: 1.4.1 + node-fetch-native: 1.6.1 ufo: 1.3.2 dev: false + /ohash@1.1.3: + resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} + dev: false + /omit-keys@0.1.0: resolution: {integrity: sha512-JfTw3lVL54592o0Vb1frMN6DpS/wT8Uz/IWg1e0w2ZkjF4yyPYHGJAtdcBcUbp/RMf/LbdMzIz6QZ6ycaRCFUA==} engines: {node: '>=0.10.0'} @@ -18969,6 +19514,13 @@ packages: dependencies: mimic-fn: 2.1.0 + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: false + /open@7.4.2: resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} engines: {node: '>=8'} @@ -19244,7 +19796,7 @@ packages: browserify-aes: 1.2.0 evp_bytestokey: 1.0.3 pbkdf2: 3.1.2 - safe-buffer: 5.2.1 + safe-buffer: 5.2.1(patch_hash=qcepvj3ww73f2shgrehxggbrbq) dev: true /parse-entities@2.0.0: @@ -19282,7 +19834,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.23.4 + '@babel/code-frame': 7.23.5 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -19371,7 +19923,7 @@ packages: cross-spawn: 7.0.3 find-yarn-workspace-root: 2.0.0 fs-extra: 9.1.0 - json-stable-stringify: 1.1.0 + json-stable-stringify: 1.1.1 klaw-sync: 6.0.0 minimist: 1.2.8 open: 7.4.2 @@ -19406,6 +19958,11 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: false + /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -19414,13 +19971,18 @@ packages: engines: {node: '>= 0.8.0'} dev: true + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.2.0 + minipass: 7.0.4 + /path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} - /path-to-regexp@1.8.0: - resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} - dependencies: - isarray: 0.0.1 + /path-to-regexp@6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} dev: true /path-type@3.0.0: @@ -19434,12 +19996,13 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - /pathe@1.1.1: - resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} + /pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} dev: false - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + /pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} dev: true /pbkdf2@3.1.2: @@ -19449,7 +20012,7 @@ packages: create-hash: 1.2.0 create-hmac: 1.1.7 ripemd160: 2.0.2 - safe-buffer: 5.2.1 + safe-buffer: 5.2.1(patch_hash=qcepvj3ww73f2shgrehxggbrbq) sha.js: 2.4.11 dev: true @@ -19549,9 +20112,9 @@ packages: /pkg-types@1.0.3: resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} dependencies: - jsonc-parser: 3.2.0 - mlly: 1.4.2 - pathe: 1.1.1 + jsonc-parser: 3.2.1 + mlly: 1.5.0 + pathe: 1.1.2 dev: false /pkg-up@3.1.0: @@ -19570,97 +20133,97 @@ packages: engines: {node: '>=0.10.0'} dev: true - /postcss-attribute-case-insensitive@5.0.2(postcss@8.4.31): + /postcss-attribute-case-insensitive@5.0.2(postcss@8.4.33): resolution: {integrity: sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.31 - postcss-selector-parser: 6.0.13 + postcss: 8.4.33 + postcss-selector-parser: 6.0.15 - /postcss-browser-comments@4.0.0(browserslist@4.22.1)(postcss@8.4.31): + /postcss-browser-comments@4.0.0(browserslist@4.22.2)(postcss@8.4.33): resolution: {integrity: sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==} engines: {node: '>=8'} peerDependencies: browserslist: '>=4' postcss: '>=8' dependencies: - browserslist: 4.22.1 - postcss: 8.4.31 + browserslist: 4.22.2 + postcss: 8.4.33 /postcss-calc@7.0.5: resolution: {integrity: sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==} dependencies: postcss: 7.0.39 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.15 postcss-value-parser: 4.2.0 - /postcss-calc@8.2.4(postcss@8.4.31): + /postcss-calc@8.2.4(postcss@8.4.33): resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} peerDependencies: postcss: ^8.2.2 dependencies: - postcss: 8.4.31 - postcss-selector-parser: 6.0.13 + postcss: 8.4.33 + postcss-selector-parser: 6.0.15 postcss-value-parser: 4.2.0 - /postcss-clamp@4.1.0(postcss@8.4.31): + /postcss-clamp@4.1.0(postcss@8.4.33): resolution: {integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==} engines: {node: '>=7.6.0'} peerDependencies: postcss: ^8.4.6 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 - /postcss-color-functional-notation@4.2.4(postcss@8.4.31): + /postcss-color-functional-notation@4.2.4(postcss@8.4.33): resolution: {integrity: sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 - /postcss-color-hex-alpha@8.0.4(postcss@8.4.31): + /postcss-color-hex-alpha@8.0.4(postcss@8.4.33): resolution: {integrity: sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 - /postcss-color-rebeccapurple@7.1.1(postcss@8.4.31): + /postcss-color-rebeccapurple@7.1.1(postcss@8.4.33): resolution: {integrity: sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 /postcss-colormin@4.0.3: resolution: {integrity: sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 color: 3.2.1 has: 1.0.4 postcss: 7.0.39 postcss-value-parser: 3.3.1 - /postcss-colormin@5.3.1(postcss@8.4.31): + /postcss-colormin@5.3.1(postcss@8.4.33): resolution: {integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 caniuse-api: 3.0.0 colord: 2.9.3 - postcss: 8.4.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 /postcss-convert-values@4.0.1: @@ -19670,51 +20233,51 @@ packages: postcss: 7.0.39 postcss-value-parser: 3.3.1 - /postcss-convert-values@5.1.3(postcss@8.4.31): + /postcss-convert-values@5.1.3(postcss@8.4.33): resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 - postcss: 8.4.31 + browserslist: 4.22.2 + postcss: 8.4.33 postcss-value-parser: 4.2.0 - /postcss-custom-media@8.0.2(postcss@8.4.31): + /postcss-custom-media@8.0.2(postcss@8.4.33): resolution: {integrity: sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.3 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 - /postcss-custom-properties@12.1.11(postcss@8.4.31): + /postcss-custom-properties@12.1.11(postcss@8.4.33): resolution: {integrity: sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 - /postcss-custom-selectors@6.0.3(postcss@8.4.31): + /postcss-custom-selectors@6.0.3(postcss@8.4.33): resolution: {integrity: sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.3 dependencies: - postcss: 8.4.31 - postcss-selector-parser: 6.0.13 + postcss: 8.4.33 + postcss-selector-parser: 6.0.15 - /postcss-dir-pseudo-class@6.0.5(postcss@8.4.31): + /postcss-dir-pseudo-class@6.0.5(postcss@8.4.33): resolution: {integrity: sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.31 - postcss-selector-parser: 6.0.13 + postcss: 8.4.33 + postcss-selector-parser: 6.0.15 /postcss-discard-comments@4.0.2: resolution: {integrity: sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==} @@ -19722,13 +20285,13 @@ packages: dependencies: postcss: 7.0.39 - /postcss-discard-comments@5.1.2(postcss@8.4.31): + /postcss-discard-comments@5.1.2(postcss@8.4.33): resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 /postcss-discard-duplicates@4.0.2: resolution: {integrity: sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==} @@ -19736,13 +20299,13 @@ packages: dependencies: postcss: 7.0.39 - /postcss-discard-duplicates@5.1.0(postcss@8.4.31): + /postcss-discard-duplicates@5.1.0(postcss@8.4.33): resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 /postcss-discard-empty@4.0.1: resolution: {integrity: sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==} @@ -19750,13 +20313,13 @@ packages: dependencies: postcss: 7.0.39 - /postcss-discard-empty@5.1.1(postcss@8.4.31): + /postcss-discard-empty@5.1.1(postcss@8.4.33): resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 /postcss-discard-overridden@4.0.1: resolution: {integrity: sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==} @@ -19764,117 +20327,117 @@ packages: dependencies: postcss: 7.0.39 - /postcss-discard-overridden@5.1.0(postcss@8.4.31): + /postcss-discard-overridden@5.1.0(postcss@8.4.33): resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 - /postcss-double-position-gradients@3.1.2(postcss@8.4.31): + /postcss-double-position-gradients@3.1.2(postcss@8.4.33): resolution: {integrity: sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.31) - postcss: 8.4.31 + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.33) + postcss: 8.4.33 postcss-value-parser: 4.2.0 - /postcss-env-function@4.0.6(postcss@8.4.31): + /postcss-env-function@4.0.6(postcss@8.4.33): resolution: {integrity: sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 - /postcss-flexbugs-fixes@5.0.2(postcss@8.4.31): + /postcss-flexbugs-fixes@5.0.2(postcss@8.4.33): resolution: {integrity: sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==} peerDependencies: postcss: ^8.1.4 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 - /postcss-focus-visible@6.0.4(postcss@8.4.31): + /postcss-focus-visible@6.0.4(postcss@8.4.33): resolution: {integrity: sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 - postcss-selector-parser: 6.0.13 + postcss: 8.4.33 + postcss-selector-parser: 6.0.15 - /postcss-focus-within@5.0.4(postcss@8.4.31): + /postcss-focus-within@5.0.4(postcss@8.4.33): resolution: {integrity: sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 - postcss-selector-parser: 6.0.13 + postcss: 8.4.33 + postcss-selector-parser: 6.0.15 - /postcss-font-variant@5.0.0(postcss@8.4.31): + /postcss-font-variant@5.0.0(postcss@8.4.33): resolution: {integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 - /postcss-gap-properties@3.0.5(postcss@8.4.31): + /postcss-gap-properties@3.0.5(postcss@8.4.33): resolution: {integrity: sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 - /postcss-image-set-function@4.0.7(postcss@8.4.31): + /postcss-image-set-function@4.0.7(postcss@8.4.33): resolution: {integrity: sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 - /postcss-import@15.1.0(postcss@8.4.31): + /postcss-import@15.1.0(postcss@8.4.33): resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - /postcss-initial@4.0.1(postcss@8.4.31): + /postcss-initial@4.0.1(postcss@8.4.33): resolution: {integrity: sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==} peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 - /postcss-js@4.0.1(postcss@8.4.31): + /postcss-js@4.0.1(postcss@8.4.33): resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} peerDependencies: postcss: ^8.4.21 dependencies: camelcase-css: 2.0.1 - postcss: 8.4.31 + postcss: 8.4.33 - /postcss-lab-function@4.2.1(postcss@8.4.31): + /postcss-lab-function@4.2.1(postcss@8.4.33): resolution: {integrity: sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.31) - postcss: 8.4.31 + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.33) + postcss: 8.4.33 postcss-value-parser: 4.2.0 /postcss-load-config@2.1.2: @@ -19884,7 +20447,7 @@ packages: cosmiconfig: 5.2.1 import-cwd: 2.1.0 - /postcss-load-config@3.1.4(postcss@8.4.31): + /postcss-load-config@3.1.4(postcss@8.4.33): resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} engines: {node: '>= 10'} peerDependencies: @@ -19897,11 +20460,11 @@ packages: optional: true dependencies: lilconfig: 2.1.0 - postcss: 8.4.31 + postcss: 8.4.33 yaml: 1.10.2 dev: true - /postcss-load-config@4.0.2(postcss@8.4.31): + /postcss-load-config@4.0.2(postcss@8.4.33): resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} engines: {node: '>= 14'} peerDependencies: @@ -19914,10 +20477,10 @@ packages: optional: true dependencies: lilconfig: 3.0.0 - postcss: 8.4.31 + postcss: 8.4.33 yaml: 2.3.4 - /postcss-loader@6.2.1(postcss@8.4.31)(webpack@5.89.0): + /postcss-loader@6.2.1(postcss@8.4.33)(webpack@5.90.0): resolution: {integrity: sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -19926,25 +20489,25 @@ packages: dependencies: cosmiconfig: 7.1.0 klona: 2.0.6 - postcss: 8.4.31 + postcss: 8.4.33 semver: 7.5.4 - webpack: 5.89.0 + webpack: 5.90.0 - /postcss-logical@5.0.4(postcss@8.4.31): + /postcss-logical@5.0.4(postcss@8.4.33): resolution: {integrity: sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 - /postcss-media-minmax@5.0.0(postcss@8.4.31): + /postcss-media-minmax@5.0.0(postcss@8.4.33): resolution: {integrity: sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==} engines: {node: '>=10.0.0'} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 /postcss-merge-longhand@4.0.11: resolution: {integrity: sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==} @@ -19955,38 +20518,38 @@ packages: postcss-value-parser: 3.3.1 stylehacks: 4.0.3 - /postcss-merge-longhand@5.1.7(postcss@8.4.31): + /postcss-merge-longhand@5.1.7(postcss@8.4.33): resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 - stylehacks: 5.1.1(postcss@8.4.31) + stylehacks: 5.1.1(postcss@8.4.33) /postcss-merge-rules@4.0.3: resolution: {integrity: sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 caniuse-api: 3.0.0 cssnano-util-same-parent: 4.0.1 postcss: 7.0.39 postcss-selector-parser: 3.1.2 vendors: 1.0.4 - /postcss-merge-rules@5.1.4(postcss@8.4.31): + /postcss-merge-rules@5.1.4(postcss@8.4.33): resolution: {integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 caniuse-api: 3.0.0 - cssnano-utils: 3.1.0(postcss@8.4.31) - postcss: 8.4.31 - postcss-selector-parser: 6.0.13 + cssnano-utils: 3.1.0(postcss@8.4.33) + postcss: 8.4.33 + postcss-selector-parser: 6.0.15 /postcss-minify-font-values@4.0.2: resolution: {integrity: sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==} @@ -19995,13 +20558,13 @@ packages: postcss: 7.0.39 postcss-value-parser: 3.3.1 - /postcss-minify-font-values@5.1.0(postcss@8.4.31): + /postcss-minify-font-values@5.1.0(postcss@8.4.33): resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 /postcss-minify-gradients@4.0.2: @@ -20013,15 +20576,15 @@ packages: postcss: 7.0.39 postcss-value-parser: 3.3.1 - /postcss-minify-gradients@5.1.1(postcss@8.4.31): + /postcss-minify-gradients@5.1.1(postcss@8.4.33): resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: colord: 2.9.3 - cssnano-utils: 3.1.0(postcss@8.4.31) - postcss: 8.4.31 + cssnano-utils: 3.1.0(postcss@8.4.33) + postcss: 8.4.33 postcss-value-parser: 4.2.0 /postcss-minify-params@4.0.2: @@ -20029,21 +20592,21 @@ packages: engines: {node: '>=6.9.0'} dependencies: alphanum-sort: 1.0.2 - browserslist: 4.22.1 + browserslist: 4.22.2 cssnano-util-get-arguments: 4.0.0 postcss: 7.0.39 postcss-value-parser: 3.3.1 uniqs: 2.0.0 - /postcss-minify-params@5.1.4(postcss@8.4.31): + /postcss-minify-params@5.1.4(postcss@8.4.33): resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 - cssnano-utils: 3.1.0(postcss@8.4.31) - postcss: 8.4.31 + browserslist: 4.22.2 + cssnano-utils: 3.1.0(postcss@8.4.33) + postcss: 8.4.33 postcss-value-parser: 4.2.0 /postcss-minify-selectors@4.0.2: @@ -20055,27 +20618,27 @@ packages: postcss: 7.0.39 postcss-selector-parser: 3.1.2 - /postcss-minify-selectors@5.2.1(postcss@8.4.31): + /postcss-minify-selectors@5.2.1(postcss@8.4.33): resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 - postcss-selector-parser: 6.0.13 + postcss: 8.4.33 + postcss-selector-parser: 6.0.15 /postcss-modules-extract-imports@1.1.0: resolution: {integrity: sha512-zF9+UIEvtpeqMGxhpeT9XaIevQSrBBCz9fi7SwfkmjVacsSj8DY5eFVgn+wY8I9vvdDDwK5xC8Myq4UkoLFIkA==} dependencies: postcss: 6.0.1 - /postcss-modules-extract-imports@3.0.0(postcss@8.4.31): + /postcss-modules-extract-imports@3.0.0(postcss@8.4.33): resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 /postcss-modules-local-by-default@1.2.0: resolution: {integrity: sha512-X4cquUPIaAd86raVrBwO8fwRfkIdbwFu7CTfEOjiZQHVQwlHRSkTgH5NLDmMm5+1hQO8u6dZ+TOOJDbay1hYpA==} @@ -20083,15 +20646,15 @@ packages: css-selector-tokenizer: 0.7.3 postcss: 6.0.1 - /postcss-modules-local-by-default@4.0.3(postcss@8.4.31): - resolution: {integrity: sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==} + /postcss-modules-local-by-default@4.0.4(postcss@8.4.33): + resolution: {integrity: sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.31) - postcss: 8.4.31 - postcss-selector-parser: 6.0.13 + icss-utils: 5.1.0(postcss@8.4.33) + postcss: 8.4.33 + postcss-selector-parser: 6.0.15 postcss-value-parser: 4.2.0 /postcss-modules-scope@1.1.0: @@ -20100,14 +20663,14 @@ packages: css-selector-tokenizer: 0.7.3 postcss: 6.0.1 - /postcss-modules-scope@3.0.0(postcss@8.4.31): - resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} + /postcss-modules-scope@3.1.1(postcss@8.4.33): + resolution: {integrity: sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.31 - postcss-selector-parser: 6.0.13 + postcss: 8.4.33 + postcss-selector-parser: 6.0.15 /postcss-modules-values@1.3.0: resolution: {integrity: sha512-i7IFaR9hlQ6/0UgFuqM6YWaCfA1Ej8WMg8A5DggnH1UGKJvTV/ugqq/KaULixzzOi3T/tF6ClBXcHGCzdd5unA==} @@ -20115,14 +20678,14 @@ packages: icss-replace-symbols: 1.1.0 postcss: 6.0.1 - /postcss-modules-values@4.0.0(postcss@8.4.31): + /postcss-modules-values@4.0.0(postcss@8.4.33): resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.31) - postcss: 8.4.31 + icss-utils: 5.1.0(postcss@8.4.33) + postcss: 8.4.33 /postcss-modules@2.0.0: resolution: {integrity: sha512-eqp+Bva+U2cwQO7dECJ8/V+X+uH1HduNeITB0CPPFAu6d/8LKQ32/j+p9rQ2YL1QytVcrNU0X+fBqgGmQIA1Rw==} @@ -20133,7 +20696,7 @@ packages: postcss: 7.0.39 string-hash: 1.1.3 - /postcss-modules@4.3.1(postcss@8.4.31): + /postcss-modules@4.3.1(postcss@8.4.33): resolution: {integrity: sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==} peerDependencies: postcss: ^8.0.0 @@ -20141,32 +20704,32 @@ packages: generic-names: 4.0.0 icss-replace-symbols: 1.1.0 lodash.camelcase: 4.3.0 - postcss: 8.4.31 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.31) - postcss-modules-local-by-default: 4.0.3(postcss@8.4.31) - postcss-modules-scope: 3.0.0(postcss@8.4.31) - postcss-modules-values: 4.0.0(postcss@8.4.31) + postcss: 8.4.33 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.33) + postcss-modules-local-by-default: 4.0.4(postcss@8.4.33) + postcss-modules-scope: 3.1.1(postcss@8.4.33) + postcss-modules-values: 4.0.0(postcss@8.4.33) string-hash: 1.1.3 dev: true - /postcss-nested@6.0.1(postcss@8.4.31): + /postcss-nested@6.0.1(postcss@8.4.33): resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 dependencies: - postcss: 8.4.31 - postcss-selector-parser: 6.0.13 + postcss: 8.4.33 + postcss-selector-parser: 6.0.15 - /postcss-nesting@10.2.0(postcss@8.4.31): + /postcss-nesting@10.2.0(postcss@8.4.33): resolution: {integrity: sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.0.13) - postcss: 8.4.31 - postcss-selector-parser: 6.0.13 + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.0.15) + postcss: 8.4.33 + postcss-selector-parser: 6.0.15 /postcss-normalize-charset@4.0.1: resolution: {integrity: sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==} @@ -20174,13 +20737,13 @@ packages: dependencies: postcss: 7.0.39 - /postcss-normalize-charset@5.1.0(postcss@8.4.31): + /postcss-normalize-charset@5.1.0(postcss@8.4.33): resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 /postcss-normalize-display-values@4.0.2: resolution: {integrity: sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==} @@ -20190,13 +20753,13 @@ packages: postcss: 7.0.39 postcss-value-parser: 3.3.1 - /postcss-normalize-display-values@5.1.0(postcss@8.4.31): + /postcss-normalize-display-values@5.1.0(postcss@8.4.33): resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 /postcss-normalize-positions@4.0.2: @@ -20208,13 +20771,13 @@ packages: postcss: 7.0.39 postcss-value-parser: 3.3.1 - /postcss-normalize-positions@5.1.1(postcss@8.4.31): + /postcss-normalize-positions@5.1.1(postcss@8.4.33): resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 /postcss-normalize-repeat-style@4.0.2: @@ -20226,13 +20789,13 @@ packages: postcss: 7.0.39 postcss-value-parser: 3.3.1 - /postcss-normalize-repeat-style@5.1.1(postcss@8.4.31): + /postcss-normalize-repeat-style@5.1.1(postcss@8.4.33): resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 /postcss-normalize-string@4.0.2: @@ -20243,13 +20806,13 @@ packages: postcss: 7.0.39 postcss-value-parser: 3.3.1 - /postcss-normalize-string@5.1.0(postcss@8.4.31): + /postcss-normalize-string@5.1.0(postcss@8.4.33): resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 /postcss-normalize-timing-functions@4.0.2: @@ -20260,31 +20823,31 @@ packages: postcss: 7.0.39 postcss-value-parser: 3.3.1 - /postcss-normalize-timing-functions@5.1.0(postcss@8.4.31): + /postcss-normalize-timing-functions@5.1.0(postcss@8.4.33): resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 /postcss-normalize-unicode@4.0.1: resolution: {integrity: sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 postcss: 7.0.39 postcss-value-parser: 3.3.1 - /postcss-normalize-unicode@5.1.1(postcss@8.4.31): + /postcss-normalize-unicode@5.1.1(postcss@8.4.33): resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 - postcss: 8.4.31 + browserslist: 4.22.2 + postcss: 8.4.33 postcss-value-parser: 4.2.0 /postcss-normalize-url@4.0.1: @@ -20296,14 +20859,14 @@ packages: postcss: 7.0.39 postcss-value-parser: 3.3.1 - /postcss-normalize-url@5.1.0(postcss@8.4.31): + /postcss-normalize-url@5.1.0(postcss@8.4.33): resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: normalize-url: 6.1.0 - postcss: 8.4.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 /postcss-normalize-whitespace@4.0.2: @@ -20313,35 +20876,35 @@ packages: postcss: 7.0.39 postcss-value-parser: 3.3.1 - /postcss-normalize-whitespace@5.1.1(postcss@8.4.31): + /postcss-normalize-whitespace@5.1.1(postcss@8.4.33): resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 - /postcss-normalize@10.0.1(browserslist@4.22.1)(postcss@8.4.31): + /postcss-normalize@10.0.1(browserslist@4.22.2)(postcss@8.4.33): resolution: {integrity: sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==} engines: {node: '>= 12'} peerDependencies: browserslist: '>= 4' postcss: '>= 8' dependencies: - '@csstools/normalize.css': 12.0.0 - browserslist: 4.22.1 - postcss: 8.4.31 - postcss-browser-comments: 4.0.0(browserslist@4.22.1)(postcss@8.4.31) + '@csstools/normalize.css': 12.1.1 + browserslist: 4.22.2 + postcss: 8.4.33 + postcss-browser-comments: 4.0.0(browserslist@4.22.2)(postcss@8.4.33) sanitize.css: 13.0.0 - /postcss-opacity-percentage@1.1.3(postcss@8.4.31): + /postcss-opacity-percentage@1.1.3(postcss@8.4.33): resolution: {integrity: sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 /postcss-ordered-values@4.1.2: resolution: {integrity: sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==} @@ -20351,125 +20914,125 @@ packages: postcss: 7.0.39 postcss-value-parser: 3.3.1 - /postcss-ordered-values@5.1.3(postcss@8.4.31): + /postcss-ordered-values@5.1.3(postcss@8.4.33): resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-utils: 3.1.0(postcss@8.4.31) - postcss: 8.4.31 + cssnano-utils: 3.1.0(postcss@8.4.33) + postcss: 8.4.33 postcss-value-parser: 4.2.0 - /postcss-overflow-shorthand@3.0.4(postcss@8.4.31): + /postcss-overflow-shorthand@3.0.4(postcss@8.4.33): resolution: {integrity: sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 - /postcss-page-break@3.0.4(postcss@8.4.31): + /postcss-page-break@3.0.4(postcss@8.4.33): resolution: {integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==} peerDependencies: postcss: ^8 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 - /postcss-place@7.0.5(postcss@8.4.31): + /postcss-place@7.0.5(postcss@8.4.33): resolution: {integrity: sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 - /postcss-preset-env@7.8.3(postcss@8.4.31): + /postcss-preset-env@7.8.3(postcss@8.4.33): resolution: {integrity: sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - '@csstools/postcss-cascade-layers': 1.1.1(postcss@8.4.31) - '@csstools/postcss-color-function': 1.1.1(postcss@8.4.31) - '@csstools/postcss-font-format-keywords': 1.0.1(postcss@8.4.31) - '@csstools/postcss-hwb-function': 1.0.2(postcss@8.4.31) - '@csstools/postcss-ic-unit': 1.0.1(postcss@8.4.31) - '@csstools/postcss-is-pseudo-class': 2.0.7(postcss@8.4.31) - '@csstools/postcss-nested-calc': 1.0.0(postcss@8.4.31) - '@csstools/postcss-normalize-display-values': 1.0.1(postcss@8.4.31) - '@csstools/postcss-oklab-function': 1.1.1(postcss@8.4.31) - '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.31) - '@csstools/postcss-stepped-value-functions': 1.0.1(postcss@8.4.31) - '@csstools/postcss-text-decoration-shorthand': 1.0.0(postcss@8.4.31) - '@csstools/postcss-trigonometric-functions': 1.0.2(postcss@8.4.31) - '@csstools/postcss-unset-value': 1.0.2(postcss@8.4.31) - autoprefixer: 10.4.16(postcss@8.4.31) - browserslist: 4.22.1 - css-blank-pseudo: 3.0.3(postcss@8.4.31) - css-has-pseudo: 3.0.4(postcss@8.4.31) - css-prefers-color-scheme: 6.0.3(postcss@8.4.31) - cssdb: 7.9.0 - postcss: 8.4.31 - postcss-attribute-case-insensitive: 5.0.2(postcss@8.4.31) - postcss-clamp: 4.1.0(postcss@8.4.31) - postcss-color-functional-notation: 4.2.4(postcss@8.4.31) - postcss-color-hex-alpha: 8.0.4(postcss@8.4.31) - postcss-color-rebeccapurple: 7.1.1(postcss@8.4.31) - postcss-custom-media: 8.0.2(postcss@8.4.31) - postcss-custom-properties: 12.1.11(postcss@8.4.31) - postcss-custom-selectors: 6.0.3(postcss@8.4.31) - postcss-dir-pseudo-class: 6.0.5(postcss@8.4.31) - postcss-double-position-gradients: 3.1.2(postcss@8.4.31) - postcss-env-function: 4.0.6(postcss@8.4.31) - postcss-focus-visible: 6.0.4(postcss@8.4.31) - postcss-focus-within: 5.0.4(postcss@8.4.31) - postcss-font-variant: 5.0.0(postcss@8.4.31) - postcss-gap-properties: 3.0.5(postcss@8.4.31) - postcss-image-set-function: 4.0.7(postcss@8.4.31) - postcss-initial: 4.0.1(postcss@8.4.31) - postcss-lab-function: 4.2.1(postcss@8.4.31) - postcss-logical: 5.0.4(postcss@8.4.31) - postcss-media-minmax: 5.0.0(postcss@8.4.31) - postcss-nesting: 10.2.0(postcss@8.4.31) - postcss-opacity-percentage: 1.1.3(postcss@8.4.31) - postcss-overflow-shorthand: 3.0.4(postcss@8.4.31) - postcss-page-break: 3.0.4(postcss@8.4.31) - postcss-place: 7.0.5(postcss@8.4.31) - postcss-pseudo-class-any-link: 7.1.6(postcss@8.4.31) - postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.31) - postcss-selector-not: 6.0.1(postcss@8.4.31) + '@csstools/postcss-cascade-layers': 1.1.1(postcss@8.4.33) + '@csstools/postcss-color-function': 1.1.1(postcss@8.4.33) + '@csstools/postcss-font-format-keywords': 1.0.1(postcss@8.4.33) + '@csstools/postcss-hwb-function': 1.0.2(postcss@8.4.33) + '@csstools/postcss-ic-unit': 1.0.1(postcss@8.4.33) + '@csstools/postcss-is-pseudo-class': 2.0.7(postcss@8.4.33) + '@csstools/postcss-nested-calc': 1.0.0(postcss@8.4.33) + '@csstools/postcss-normalize-display-values': 1.0.1(postcss@8.4.33) + '@csstools/postcss-oklab-function': 1.1.1(postcss@8.4.33) + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.33) + '@csstools/postcss-stepped-value-functions': 1.0.1(postcss@8.4.33) + '@csstools/postcss-text-decoration-shorthand': 1.0.0(postcss@8.4.33) + '@csstools/postcss-trigonometric-functions': 1.0.2(postcss@8.4.33) + '@csstools/postcss-unset-value': 1.0.2(postcss@8.4.33) + autoprefixer: 10.4.17(postcss@8.4.33) + browserslist: 4.22.2 + css-blank-pseudo: 3.0.3(postcss@8.4.33) + css-has-pseudo: 3.0.4(postcss@8.4.33) + css-prefers-color-scheme: 6.0.3(postcss@8.4.33) + cssdb: 7.10.0 + postcss: 8.4.33 + postcss-attribute-case-insensitive: 5.0.2(postcss@8.4.33) + postcss-clamp: 4.1.0(postcss@8.4.33) + postcss-color-functional-notation: 4.2.4(postcss@8.4.33) + postcss-color-hex-alpha: 8.0.4(postcss@8.4.33) + postcss-color-rebeccapurple: 7.1.1(postcss@8.4.33) + postcss-custom-media: 8.0.2(postcss@8.4.33) + postcss-custom-properties: 12.1.11(postcss@8.4.33) + postcss-custom-selectors: 6.0.3(postcss@8.4.33) + postcss-dir-pseudo-class: 6.0.5(postcss@8.4.33) + postcss-double-position-gradients: 3.1.2(postcss@8.4.33) + postcss-env-function: 4.0.6(postcss@8.4.33) + postcss-focus-visible: 6.0.4(postcss@8.4.33) + postcss-focus-within: 5.0.4(postcss@8.4.33) + postcss-font-variant: 5.0.0(postcss@8.4.33) + postcss-gap-properties: 3.0.5(postcss@8.4.33) + postcss-image-set-function: 4.0.7(postcss@8.4.33) + postcss-initial: 4.0.1(postcss@8.4.33) + postcss-lab-function: 4.2.1(postcss@8.4.33) + postcss-logical: 5.0.4(postcss@8.4.33) + postcss-media-minmax: 5.0.0(postcss@8.4.33) + postcss-nesting: 10.2.0(postcss@8.4.33) + postcss-opacity-percentage: 1.1.3(postcss@8.4.33) + postcss-overflow-shorthand: 3.0.4(postcss@8.4.33) + postcss-page-break: 3.0.4(postcss@8.4.33) + postcss-place: 7.0.5(postcss@8.4.33) + postcss-pseudo-class-any-link: 7.1.6(postcss@8.4.33) + postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.33) + postcss-selector-not: 6.0.1(postcss@8.4.33) postcss-value-parser: 4.2.0 - /postcss-pseudo-class-any-link@7.1.6(postcss@8.4.31): + /postcss-pseudo-class-any-link@7.1.6(postcss@8.4.33): resolution: {integrity: sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.31 - postcss-selector-parser: 6.0.13 + postcss: 8.4.33 + postcss-selector-parser: 6.0.15 /postcss-reduce-initial@4.0.3: resolution: {integrity: sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 caniuse-api: 3.0.0 has: 1.0.4 postcss: 7.0.39 - /postcss-reduce-initial@5.1.2(postcss@8.4.31): + /postcss-reduce-initial@5.1.2(postcss@8.4.33): resolution: {integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 caniuse-api: 3.0.0 - postcss: 8.4.31 + postcss: 8.4.33 /postcss-reduce-transforms@4.0.2: resolution: {integrity: sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==} @@ -20480,30 +21043,30 @@ packages: postcss: 7.0.39 postcss-value-parser: 3.3.1 - /postcss-reduce-transforms@5.1.0(postcss@8.4.31): + /postcss-reduce-transforms@5.1.0(postcss@8.4.33): resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 - /postcss-replace-overflow-wrap@4.0.0(postcss@8.4.31): + /postcss-replace-overflow-wrap@4.0.0(postcss@8.4.33): resolution: {integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==} peerDependencies: postcss: ^8.0.3 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 - /postcss-selector-not@6.0.1(postcss@8.4.31): + /postcss-selector-not@6.0.1(postcss@8.4.33): resolution: {integrity: sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.31 - postcss-selector-parser: 6.0.13 + postcss: 8.4.33 + postcss-selector-parser: 6.0.15 /postcss-selector-parser@3.1.2: resolution: {integrity: sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==} @@ -20513,8 +21076,8 @@ packages: indexes-of: 1.0.1 uniq: 1.0.1 - /postcss-selector-parser@6.0.13: - resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} + /postcss-selector-parser@6.0.15: + resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} engines: {node: '>=4'} dependencies: cssesc: 3.0.0 @@ -20528,13 +21091,13 @@ packages: postcss-value-parser: 3.3.1 svgo: 1.3.2 - /postcss-svgo@5.1.0(postcss@8.4.31): + /postcss-svgo@5.1.0(postcss@8.4.33): resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.33 postcss-value-parser: 4.2.0 svgo: 2.8.0 @@ -20546,14 +21109,14 @@ packages: postcss: 7.0.39 uniqs: 2.0.0 - /postcss-unique-selectors@5.1.1(postcss@8.4.31): + /postcss-unique-selectors@5.1.1(postcss@8.4.33): resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 - postcss-selector-parser: 6.0.13 + postcss: 8.4.33 + postcss-selector-parser: 6.0.15 /postcss-value-parser@3.3.1: resolution: {integrity: sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==} @@ -20583,48 +21146,57 @@ packages: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.0.2 + dev: false + + /postcss@8.4.33: + resolution: {integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 - /preact-compat@3.19.0(preact@10.19.2): + /preact-compat@3.19.0(preact@10.19.3): resolution: {integrity: sha512-f83A4hIhH8Uzhb9GbIcGk8SM19ffWlwP9mDaYwQdRnMdekZwcCA7eIAbeV4EMQaV9C0Yuy8iKgBAtyTKPZQt/Q==} peerDependencies: preact: <10 dependencies: immutability-helper: 2.9.1 - preact: 10.19.2 - preact-context: 1.1.4(preact@10.19.2) - preact-render-to-string: 3.8.2(preact@10.19.2) - preact-transition-group: 1.1.1(preact@10.19.2) + preact: 10.19.3 + preact-context: 1.1.4(preact@10.19.3) + preact-render-to-string: 3.8.2(preact@10.19.3) + preact-transition-group: 1.1.1(preact@10.19.3) prop-types: 15.8.1 standalone-react-addons-pure-render-mixin: 0.1.1 dev: false - /preact-context@1.1.4(preact@10.19.2): + /preact-context@1.1.4(preact@10.19.3): resolution: {integrity: sha512-gcCjPJ65R0MiW9hDu8W/3WAmyTElIvwLyEO6oLQiM6/TbLKLxCpBCWV8GJjx52TTEyUr60HLDcmoCXZlslelzQ==} peerDependencies: preact: ^8.2.7 dependencies: - preact: 10.19.2 + preact: 10.19.3 dev: false - /preact-render-to-string@3.8.2(preact@10.19.2): + /preact-render-to-string@3.8.2(preact@10.19.3): resolution: {integrity: sha512-przuZPajiurStGgxMoJP0EJeC4xj5CgHv+M7GfF3YxAdhGgEWAkhOSE0xympAFN20uMayntBZpttIZqqLl77fw==} peerDependencies: preact: '*' dependencies: - preact: 10.19.2 + preact: 10.19.3 pretty-format: 3.8.0 dev: false - /preact-transition-group@1.1.1(preact@10.19.2): + /preact-transition-group@1.1.1(preact@10.19.3): resolution: {integrity: sha512-v89XLodCvylf5lMrhI+LqIhDsAjWfiDKV4keAU+L5yDtxmqn8uvjZXn+haKMEG0x0PZz81own19SuNJD5NlOFQ==} peerDependencies: preact: '*' dependencies: - preact: 10.19.2 + preact: 10.19.3 dev: false - /preact@10.19.2: - resolution: {integrity: sha512-UA9DX/OJwv6YwP9Vn7Ti/vF80XL+YA5H2l7BpCtUr3ya8LWHFzpiO5R+N7dN16ujpIxhekRFuOOF82bXX7K/lg==} + /preact@10.19.3: + resolution: {integrity: sha512-nHHTeFVBTHRGxJXKkKu5hT8C/YWBkPso4/Gad6xuj5dbptt9iF9NZr9pHbPhBrnT2klheu7mHTxTZ/LjwJiEiQ==} /preferred-pm@3.1.2: resolution: {integrity: sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q==} @@ -20654,8 +21226,8 @@ packages: hasBin: true dev: true - /prettier@3.1.0: - resolution: {integrity: sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==} + /prettier@3.2.4: + resolution: {integrity: sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==} engines: {node: '>=14'} hasBin: true dev: true @@ -20749,8 +21321,8 @@ packages: object-assign: 4.1.1 react-is: 16.13.1 - /property-information@6.4.0: - resolution: {integrity: sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==} + /property-information@6.4.1: + resolution: {integrity: sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==} dev: false /proto-list@1.2.4: @@ -20788,7 +21360,7 @@ packages: create-hash: 1.2.0 parse-asn1: 5.1.6 randombytes: 2.1.0 - safe-buffer: 5.2.1 + safe-buffer: 5.2.1(patch_hash=qcepvj3ww73f2shgrehxggbrbq) dev: true /pump@3.0.0: @@ -20917,13 +21489,13 @@ packages: /randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: - safe-buffer: 5.2.1 + safe-buffer: 5.2.1(patch_hash=qcepvj3ww73f2shgrehxggbrbq) /randomfill@1.0.4: resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} dependencies: randombytes: 2.1.0 - safe-buffer: 5.2.1 + safe-buffer: 5.2.1(patch_hash=qcepvj3ww73f2shgrehxggbrbq) dev: true /range-parser@1.2.1: @@ -20947,16 +21519,6 @@ packages: iconv-lite: 0.4.24 unpipe: 1.0.0 - /raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - dev: true - /rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -20970,12 +21532,12 @@ packages: resolution: {integrity: sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==} engines: {node: '>=14'} dependencies: - core-js: 3.33.3 + core-js: 3.35.1 object-assign: 4.1.1 promise: 8.3.0 raf: 3.4.1 regenerator-runtime: 0.13.11 - whatwg-fetch: 3.6.19 + whatwg-fetch: 3.6.20 /react-app-rewired@2.2.1(react-scripts@5.0.1): resolution: {integrity: sha512-uFQWTErXeLDrMzOJHKp0h8P1z0LV9HzPGsJ6adOtGlA/B9WfT6Shh4j2tLTTGlXOfiVx6w6iWpp7SOC5pvk+gA==} @@ -20983,11 +21545,11 @@ packages: peerDependencies: react-scripts: '>=2.1.3' dependencies: - react-scripts: 5.0.1(@babel/plugin-syntax-flow@7.23.3)(@babel/plugin-transform-react-jsx@7.23.4)(eslint@8.54.0)(react@18.2.0)(typescript@4.9.5) + react-scripts: 5.0.1(@babel/plugin-syntax-flow@7.24.1)(@babel/plugin-transform-react-jsx@7.23.4)(eslint@8.57.0)(react@18.2.0)(typescript@4.9.5) semver: 5.7.2 dev: true - /react-dev-utils@12.0.1(eslint@8.54.0)(typescript@4.9.5)(webpack@5.89.0): + /react-dev-utils@12.0.1(eslint@8.57.0)(typescript@4.9.5)(webpack@5.90.0): resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} engines: {node: '>=14'} peerDependencies: @@ -20997,16 +21559,16 @@ packages: typescript: optional: true dependencies: - '@babel/code-frame': 7.23.4 + '@babel/code-frame': 7.23.5 address: 1.2.2 - browserslist: 4.22.1 + browserslist: 4.22.2 chalk: 4.1.2 cross-spawn: 7.0.3 detect-port-alt: 1.1.6 escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.54.0)(typescript@4.9.5)(webpack@5.89.0) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.0)(typescript@4.9.5)(webpack@5.90.0) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -21022,7 +21584,7 @@ packages: strip-ansi: 6.0.1 text-table: 0.2.0 typescript: 4.9.5 - webpack: 5.89.0 + webpack: 5.90.0 transitivePeerDependencies: - eslint - supports-color @@ -21081,30 +21643,30 @@ packages: engines: {node: '>=0.10.0'} dev: true - /react-router-dom@6.20.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-CbcKjEyiSVpA6UtCHOIYLUYn/UJfwzp55va4yEfpk7JBN3GPqWfHrdLkAvNCcpXr8QoihcDMuk0dzWZxtlB/mQ==} + /react-router-dom@6.21.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-kNzubk7n4YHSrErzjLK72j0B5i969GsuCGazRl3G6j1zqZBLjuSlYBdVdkDOgzGdPIffUOc9nmgiadTEVoq91g==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' react-dom: '>=16.8' dependencies: - '@remix-run/router': 1.13.0 + '@remix-run/router': 1.14.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-router: 6.20.0(react@18.2.0) + react-router: 6.21.3(react@18.2.0) dev: false - /react-router@6.20.0(react@18.2.0): - resolution: {integrity: sha512-pVvzsSsgUxxtuNfTHC4IxjATs10UaAtvLGVSA1tbUE4GDaOSU1Esu2xF5nWLz7KPiMuW8BJWuPFdlGYJ7/rW0w==} + /react-router@6.21.3(react@18.2.0): + resolution: {integrity: sha512-a0H638ZXULv1OdkmiK6s6itNhoy33ywxmUFT/xtSoVyf9VnC7n7+VT4LjVzdIHSaF5TIh9ylUgxMXksHTgGrKg==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' dependencies: - '@remix-run/router': 1.13.0 + '@remix-run/router': 1.14.2 react: 18.2.0 dev: false - /react-scripts@5.0.1(@babel/plugin-syntax-flow@7.23.3)(@babel/plugin-transform-react-jsx@7.23.4)(eslint@8.54.0)(react@18.2.0)(typescript@4.9.5): + /react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.1)(@babel/plugin-transform-react-jsx@7.23.4)(eslint@8.57.0)(react@18.2.0)(typescript@4.9.5): resolution: {integrity: sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==} engines: {node: '>=14.0.0'} hasBin: true @@ -21116,61 +21678,62 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.23.3 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.11(react-refresh@0.11.0)(webpack-dev-server@4.15.1)(webpack@5.89.0) + '@babel/core': 7.23.9 + '@pmmmwh/react-refresh-webpack-plugin': 0.5.11(react-refresh@0.11.0)(webpack-dev-server@4.15.1)(webpack@5.90.0) '@svgr/webpack': 5.5.0 - babel-jest: 27.5.1(@babel/core@7.23.3) - babel-loader: 8.3.0(@babel/core@7.23.3)(webpack@5.89.0) - babel-plugin-named-asset-import: 0.3.8(@babel/core@7.23.3) + babel-jest: 27.5.1(@babel/core@7.23.9) + babel-loader: 8.3.0(@babel/core@7.23.9)(webpack@5.90.0) + babel-plugin-named-asset-import: 0.3.8(@babel/core@7.23.9) babel-preset-react-app: 10.0.1 bfj: 7.1.0 - browserslist: 4.22.1 + browserslist: 4.22.2 camelcase: 6.3.0 case-sensitive-paths-webpack-plugin: 2.4.0 - css-loader: 6.8.1(webpack@5.89.0) - css-minimizer-webpack-plugin: 3.4.1(webpack@5.89.0) + css-loader: 6.9.1(webpack@5.90.0) + css-minimizer-webpack-plugin: 3.4.1(webpack@5.90.0) dotenv: 10.0.0 dotenv-expand: 5.1.0 - eslint: 8.54.0 - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.23.3)(@babel/plugin-transform-react-jsx@7.23.4)(eslint@8.54.0)(jest@27.5.1)(typescript@4.9.5) - eslint-webpack-plugin: 3.2.0(eslint@8.54.0)(webpack@5.89.0) - file-loader: 6.2.0(webpack@5.89.0) + eslint: 8.57.0 + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.1)(@babel/plugin-transform-react-jsx@7.23.4)(eslint@8.57.0)(jest@27.5.1)(typescript@4.9.5) + eslint-webpack-plugin: 3.2.0(eslint@8.57.0)(webpack@5.90.0) + file-loader: 6.2.0(webpack@5.90.0) fs-extra: 10.1.0 - html-webpack-plugin: 5.5.3(webpack@5.89.0) + html-webpack-plugin: 5.6.0(webpack@5.90.0) identity-obj-proxy: 3.0.0 jest: 27.5.1 jest-resolve: 27.5.1 jest-watch-typeahead: 1.1.0(jest@27.5.1) - mini-css-extract-plugin: 2.7.6(webpack@5.89.0) - postcss: 8.4.31 - postcss-flexbugs-fixes: 5.0.2(postcss@8.4.31) - postcss-loader: 6.2.1(postcss@8.4.31)(webpack@5.89.0) - postcss-normalize: 10.0.1(browserslist@4.22.1)(postcss@8.4.31) - postcss-preset-env: 7.8.3(postcss@8.4.31) + mini-css-extract-plugin: 2.7.7(webpack@5.90.0) + postcss: 8.4.33 + postcss-flexbugs-fixes: 5.0.2(postcss@8.4.33) + postcss-loader: 6.2.1(postcss@8.4.33)(webpack@5.90.0) + postcss-normalize: 10.0.1(browserslist@4.22.2)(postcss@8.4.33) + postcss-preset-env: 7.8.3(postcss@8.4.33) prompts: 2.4.2 react: 18.2.0 react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@8.54.0)(typescript@4.9.5)(webpack@5.89.0) + react-dev-utils: 12.0.1(eslint@8.57.0)(typescript@4.9.5)(webpack@5.90.0) react-refresh: 0.11.0 resolve: 1.22.8 resolve-url-loader: 4.0.0 - sass-loader: 12.6.0(webpack@5.89.0) + sass-loader: 12.6.0(webpack@5.90.0) semver: 7.5.4 - source-map-loader: 3.0.2(webpack@5.89.0) - style-loader: 3.3.3(webpack@5.89.0) - tailwindcss: 3.3.5 - terser-webpack-plugin: 5.3.9(webpack@5.89.0) + source-map-loader: 3.0.2(webpack@5.90.0) + style-loader: 3.3.4(webpack@5.90.0) + tailwindcss: 3.4.1 + terser-webpack-plugin: 5.3.10(webpack@5.90.0) typescript: 4.9.5 - webpack: 5.89.0 - webpack-dev-server: 4.15.1(webpack@5.89.0) - webpack-manifest-plugin: 4.1.1(webpack@5.89.0) - workbox-webpack-plugin: 6.6.0(webpack@5.89.0) + webpack: 5.90.0 + webpack-dev-server: 4.15.1(webpack@5.90.0) + webpack-manifest-plugin: 4.1.1(webpack@5.90.0) + workbox-webpack-plugin: 6.6.0(webpack@5.90.0) optionalDependencies: fsevents: 2.3.3 transitivePeerDependencies: - '@babel/plugin-syntax-flow' - '@babel/plugin-transform-react-jsx' - '@parcel/css' + - '@rspack/core' - '@swc/core' - '@types/babel__core' - '@types/webpack' @@ -21267,7 +21830,7 @@ packages: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} dependencies: core-util-is: 1.0.3 - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) + inherits: 2.0.4 isarray: 1.0.0 process-nextick-args: 2.0.1 safe-buffer: 5.1.2 @@ -21278,7 +21841,7 @@ packages: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} dependencies: - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) + inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 @@ -21335,8 +21898,8 @@ packages: dev: false optional: true - /reflect-metadata@0.1.13: - resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} + /reflect-metadata@0.1.14: + resolution: {integrity: sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==} dev: false /reflect.getprototypeof@1.0.4: @@ -21362,13 +21925,13 @@ packages: /regenerator-runtime@0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - /regenerator-runtime@0.14.0: - resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} /regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.9 /regex-not@1.0.2: resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} @@ -21378,8 +21941,8 @@ packages: safe-regex: 1.1.0 dev: true - /regex-parser@2.2.11: - resolution: {integrity: sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==} + /regex-parser@2.3.0: + resolution: {integrity: sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==} /regexp.prototype.flags@1.5.1: resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} @@ -21432,23 +21995,23 @@ packages: vfile: 6.0.1 dev: false - /rehype-pretty-code@0.9.11(shiki@0.14.5): + /rehype-pretty-code@0.9.11(shiki@0.14.7): resolution: {integrity: sha512-Eq90eCYXQJISktfRZ8PPtwc5SUyH6fJcxS8XOMnHPUQZBtC6RYo67gGlley9X2nR8vlniPj0/7oCDEYHKQa/oA==} engines: {node: '>=16'} peerDependencies: shiki: '*' dependencies: - '@types/hast': 2.3.8 + '@types/hast': 2.3.9 hash-obj: 4.0.0 parse-numeric-range: 1.3.0 - shiki: 0.14.5 + shiki: 0.14.7 dev: false /rehype-raw@7.0.0: resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} dependencies: '@types/hast': 3.0.3 - hast-util-raw: 9.0.1 + hast-util-raw: 9.0.2 vfile: 6.0.1 dev: false @@ -21540,14 +22103,14 @@ packages: /remark-rehype@10.1.0: resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} dependencies: - '@types/hast': 2.3.8 + '@types/hast': 2.3.9 '@types/mdast': 3.0.15 mdast-util-to-hast: 12.3.0 unified: 10.1.2 dev: false - /remove-accents@0.4.2: - resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==} + /remove-accents@0.5.0: + resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==} dev: false /remove-trailing-separator@1.1.0: @@ -21594,7 +22157,7 @@ packages: oauth-sign: 0.9.0 performance-now: 2.1.0 qs: 6.5.3 - safe-buffer: 5.2.1 + safe-buffer: 5.2.1(patch_hash=qcepvj3ww73f2shgrehxggbrbq) tough-cookie: 2.5.0 tunnel-agent: 0.6.0 uuid: 3.4.0 @@ -21754,7 +22317,7 @@ packages: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} dependencies: hash-base: 3.1.0 - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) + inherits: 2.0.4 dev: true /roarr@2.15.4: @@ -21794,7 +22357,7 @@ packages: safe-identifier: 0.4.2 style-inject: 0.3.0 - /rollup-plugin-postcss@4.0.2(postcss@8.4.31): + /rollup-plugin-postcss@4.0.2(postcss@8.4.33): resolution: {integrity: sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w==} engines: {node: '>=10'} peerDependencies: @@ -21802,13 +22365,13 @@ packages: dependencies: chalk: 4.1.2 concat-with-sourcemaps: 1.1.0 - cssnano: 5.1.15(postcss@8.4.31) + cssnano: 5.1.15(postcss@8.4.33) import-cwd: 3.0.0 p-queue: 6.6.2 pify: 5.0.0 - postcss: 8.4.31 - postcss-load-config: 3.1.4(postcss@8.4.31) - postcss-modules: 4.3.1(postcss@8.4.31) + postcss: 8.4.33 + postcss-load-config: 3.1.4(postcss@8.4.33) + postcss-modules: 4.3.1(postcss@8.4.33) promise.series: 0.2.0 resolve: 1.22.8 rollup-pluginutils: 2.8.2 @@ -21841,11 +22404,11 @@ packages: peerDependencies: rollup: ^2.0.0 dependencies: - '@babel/code-frame': 7.23.4 + '@babel/code-frame': 7.23.5 jest-worker: 26.6.2 rollup: 2.79.1 serialize-javascript: 4.0.0 - terser: 5.24.0 + terser: 5.27.0 /rollup-pluginutils@2.8.2: resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} @@ -21866,30 +22429,33 @@ packages: optionalDependencies: fsevents: 2.3.3 - /rollup@4.5.1: - resolution: {integrity: sha512-0EQribZoPKpb5z1NW/QYm3XSR//Xr8BeEXU49Lc/mQmpmVVG5jPUVrpc2iptup/0WMrY9mzas0fxH+TjYvG2CA==} + /rollup@4.9.6: + resolution: {integrity: sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + dependencies: + '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.5.1 - '@rollup/rollup-android-arm64': 4.5.1 - '@rollup/rollup-darwin-arm64': 4.5.1 - '@rollup/rollup-darwin-x64': 4.5.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.5.1 - '@rollup/rollup-linux-arm64-gnu': 4.5.1 - '@rollup/rollup-linux-arm64-musl': 4.5.1 - '@rollup/rollup-linux-x64-gnu': 4.5.1 - '@rollup/rollup-linux-x64-musl': 4.5.1 - '@rollup/rollup-win32-arm64-msvc': 4.5.1 - '@rollup/rollup-win32-ia32-msvc': 4.5.1 - '@rollup/rollup-win32-x64-msvc': 4.5.1 + '@rollup/rollup-android-arm-eabi': 4.9.6 + '@rollup/rollup-android-arm64': 4.9.6 + '@rollup/rollup-darwin-arm64': 4.9.6 + '@rollup/rollup-darwin-x64': 4.9.6 + '@rollup/rollup-linux-arm-gnueabihf': 4.9.6 + '@rollup/rollup-linux-arm64-gnu': 4.9.6 + '@rollup/rollup-linux-arm64-musl': 4.9.6 + '@rollup/rollup-linux-riscv64-gnu': 4.9.6 + '@rollup/rollup-linux-x64-gnu': 4.9.6 + '@rollup/rollup-linux-x64-musl': 4.9.6 + '@rollup/rollup-win32-arm64-msvc': 4.9.6 + '@rollup/rollup-win32-ia32-msvc': 4.9.6 + '@rollup/rollup-win32-x64-msvc': 4.9.6 fsevents: 2.3.3 dev: true - /rpc-websockets@7.8.0: - resolution: {integrity: sha512-AStkq6KDvSAmA4WiwlK1pDvj/33BWmExTATUokC0v+NhWekXSTNzXS5OGXeYwq501/pj6lBZMofg/h4dx4/tCg==} + /rpc-websockets@7.9.0: + resolution: {integrity: sha512-DwKewQz1IUA5wfLvgM8wDpPRcr+nWSxuFxx5CbrI2z/MyyZ4nXLM86TvIA+cI1ZAdqC8JIBR1mZR55dzaLU+Hw==} dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.9 eventemitter3: 4.0.7 uuid: 8.3.2 ws: 8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -21953,8 +22519,8 @@ packages: dependencies: mri: 1.2.0 - /safe-array-concat@1.0.1: - resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} + /safe-array-concat@1.1.0: + resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==} engines: {node: '>=0.4'} dependencies: call-bind: 1.0.5 @@ -21965,8 +22531,9 @@ packages: /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - /safe-buffer@5.2.1: + /safe-buffer@5.2.1(patch_hash=qcepvj3ww73f2shgrehxggbrbq): resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + patched: true /safe-identifier@0.4.2: resolution: {integrity: sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==} @@ -21975,8 +22542,9 @@ packages: resolution: {integrity: sha512-o0JmTu17WGUaUOHa1l0FPGXKBfijbxK6qoHzlkihsDXxzBHvJcA7zgviKR92Xs841rX9pK16unfphLq0/KqX7A==} dev: true - /safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + /safe-regex-test@1.0.2: + resolution: {integrity: sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 get-intrinsic: 1.2.2 @@ -21993,8 +22561,9 @@ packages: engines: {node: '>=10'} dev: false - /safer-buffer@2.1.2: + /safer-buffer@2.1.2(patch_hash=sdxbjiwrw3yiqjkfb6uxghzoza): resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + patched: true /sander@0.5.1: resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} @@ -22026,7 +22595,7 @@ packages: /sanitize.css@13.0.0: resolution: {integrity: sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==} - /sass-loader@12.6.0(webpack@5.89.0): + /sass-loader@12.6.0(webpack@5.90.0): resolution: {integrity: sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -22047,15 +22616,15 @@ packages: dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.89.0 + webpack: 5.90.0 - /sass@1.69.5: - resolution: {integrity: sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==} + /sass@1.70.0: + resolution: {integrity: sha512-uUxNQ3zAHeAx5nRFskBnrWzDUJrrvpCPD5FNAoRvTi0WwremlheES3tg+56PaVtCs5QDRX5CBLxxKMDJMEa1WQ==} engines: {node: '>=14.0.0'} hasBin: true dependencies: chokidar: 3.5.3 - immutable: 4.3.4 + immutable: 4.3.5 source-map-js: 1.0.2 /sax@1.2.4: @@ -22129,7 +22698,7 @@ packages: dependencies: elliptic: 6.5.4 node-addon-api: 2.0.2 - node-gyp-build: 4.7.0(patch_hash=2d5zv4cuxtybogr2ggxm6rv25y) + node-gyp-build: 4.8.0(patch_hash=tidq6bjknpovdjep75bj5ccgke) dev: false /section-matter@1.0.0: @@ -22147,7 +22716,7 @@ packages: resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} engines: {node: '>=10'} dependencies: - '@types/node-forge': 1.3.10 + '@types/node-forge': 1.3.11 node-forge: 1.3.1 /semver-compare@1.0.0: @@ -22239,8 +22808,8 @@ packages: randombytes: 2.1.0 dev: true - /serialize-javascript@6.0.1: - resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + /serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} dependencies: randombytes: 2.1.0 @@ -22272,11 +22841,12 @@ packages: /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - /set-function-length@1.1.1: - resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + /set-function-length@1.2.0: + resolution: {integrity: sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==} engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.1 + function-bind: 1.1.2 get-intrinsic: 1.2.2 gopd: 1.0.1 has-property-descriptors: 1.0.1 @@ -22313,8 +22883,8 @@ packages: resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} hasBin: true dependencies: - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) - safe-buffer: 5.2.1 + inherits: 2.0.4 + safe-buffer: 5.2.1(patch_hash=qcepvj3ww73f2shgrehxggbrbq) /sha256@0.2.0(patch_hash=jjvpbxfwv27brspghlwzrzih2u): resolution: {integrity: sha512-kTWMJUaez5iiT9CcMv8jSq6kMhw3ST0uRdcIWl3D77s6AsLXNXRp3heeqqfu5+Dyfu4hwpQnMzhqHh8iNQxw0w==} @@ -22359,11 +22929,11 @@ packages: dev: true optional: true - /shiki@0.14.5: - resolution: {integrity: sha512-1gCAYOcmCFONmErGTrS1fjzJLA7MGZmKzrBNX7apqSwhyITJg2O102uFzXUeBxNnEkDA9vHIKLyeKq0V083vIw==} + /shiki@0.14.7: + resolution: {integrity: sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==} dependencies: ansi-sequence-parser: 1.1.1 - jsonc-parser: 3.2.0 + jsonc-parser: 3.2.1 vscode-oniguruma: 1.7.0 vscode-textmate: 8.0.0 @@ -22377,6 +22947,10 @@ packages: /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + /simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} dev: true @@ -22389,11 +22963,11 @@ packages: /sinon@17.0.1: resolution: {integrity: sha512-wmwE19Lie0MLT+ZYNpDymasPHUKTaZHUH/pKEubRXIzySv9Atnlw+BUMGCzWgV7b7wO+Hw6f1TEOr0IUnmU8/g==} dependencies: - '@sinonjs/commons': 3.0.0 + '@sinonjs/commons': 3.0.1 '@sinonjs/fake-timers': 11.2.2 '@sinonjs/samsam': 8.0.0 diff: 5.1.0 - nise: 5.1.5 + nise: 5.1.7 supports-color: 7.2.0 dev: true @@ -22503,7 +23077,7 @@ packages: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} - /source-map-loader@3.0.2(webpack@5.89.0): + /source-map-loader@3.0.2(webpack@5.90.0): resolution: {integrity: sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -22512,7 +23086,7 @@ packages: abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 1.0.2 - webpack: 5.89.0 + webpack: 5.90.0 /source-map-resolve@0.5.3: resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} @@ -22575,13 +23149,13 @@ packages: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.16 - /spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + /spdx-exceptions@2.4.0: + resolution: {integrity: sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw==} /spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: - spdx-exceptions: 2.3.0 + spdx-exceptions: 2.4.0 spdx-license-ids: 3.0.16 /spdx-license-ids@3.0.16: @@ -22655,7 +23229,7 @@ packages: ecc-jsbn: 0.1.2 getpass: 0.1.7 jsbn: 0.1.1 - safer-buffer: 2.1.2 + safer-buffer: 2.1.2(patch_hash=sdxbjiwrw3yiqjkfb6uxghzoza) tweetnacl: 0.14.5 dev: true @@ -22701,8 +23275,8 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - /std-env@3.5.0: - resolution: {integrity: sha512-JGUEaALvL0Mf6JCfYnJOTcobY+Nc7sG/TemDRBqCA0wEr4DER7zDchaaixTlmOxAjG1uRJmX82EQcxwTQTkqVA==} + /std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} dev: false /stop-iteration-iterator@1.0.0: @@ -22715,7 +23289,7 @@ packages: /stream-browserify@3.0.0: resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} dependencies: - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) + inherits: 2.0.4 readable-stream: 3.6.2 /stream-combiner2@1.1.1: @@ -22729,19 +23303,19 @@ packages: resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==} dependencies: builtin-status-codes: 3.0.0 - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) + inherits: 2.0.4 readable-stream: 3.6.2 xtend: 4.0.2 dev: true - /stream-shift@1.0.1: - resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} + /stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} dev: false /stream-splicer@2.0.1: resolution: {integrity: sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==} dependencies: - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) + inherits: 2.0.4 readable-stream: 2.3.8 dev: true @@ -22808,6 +23382,14 @@ packages: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + /string.prototype.matchall@4.0.10: resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} dependencies: @@ -22864,7 +23446,7 @@ packages: /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: - safe-buffer: 5.2.1 + safe-buffer: 5.2.1(patch_hash=qcepvj3ww73f2shgrehxggbrbq) /stringify-entities@4.0.3: resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} @@ -22937,6 +23519,11 @@ packages: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: false + /strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -22954,13 +23541,13 @@ packages: /style-inject@0.3.0: resolution: {integrity: sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==} - /style-loader@3.3.3(webpack@5.89.0): - resolution: {integrity: sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==} + /style-loader@3.3.4(webpack@5.90.0): + resolution: {integrity: sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 dependencies: - webpack: 5.89.0 + webpack: 5.90.0 /style-to-object@0.4.4: resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} @@ -22989,22 +23576,22 @@ packages: resolution: {integrity: sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 postcss: 7.0.39 postcss-selector-parser: 3.1.2 - /stylehacks@5.1.1(postcss@8.4.31): + /stylehacks@5.1.1(postcss@8.4.33): resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 - postcss: 8.4.31 - postcss-selector-parser: 6.0.13 + browserslist: 4.22.2 + postcss: 8.4.33 + postcss-selector-parser: 6.0.15 - /stylis@4.3.0: - resolution: {integrity: sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==} + /stylis@4.3.1: + resolution: {integrity: sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==} dev: false /subarg@1.0.0: @@ -23013,14 +23600,14 @@ packages: minimist: 1.2.8 dev: true - /sucrase@3.34.0: - resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} - engines: {node: '>=8'} + /sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} hasBin: true dependencies: '@jridgewell/gen-mapping': 0.3.3 commander: 4.1.1 - glob: 7.1.6 + glob: 10.3.10 lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.6 @@ -23090,7 +23677,7 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /svelte-check@1.6.0(postcss@8.4.31)(svelte@3.59.2): + /svelte-check@1.6.0(postcss@8.4.33)(svelte@3.59.2): resolution: {integrity: sha512-nQTlbFJWhwoeLY5rkhgbjzGQSwk5F1pRdEXait0EFaQSrE/iJF+PIjrQlk0BjL/ogk9HaR9ZI0DQSYrl7jl3IQ==} hasBin: true peerDependencies: @@ -23104,7 +23691,7 @@ packages: sade: 1.8.1 source-map: 0.7.4 svelte: 3.59.2 - svelte-preprocess: 4.10.7(postcss@8.4.31)(svelte@3.59.2)(typescript@4.9.5) + svelte-preprocess: 4.10.7(postcss@8.4.33)(svelte@3.59.2)(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - '@babel/core' @@ -23118,7 +23705,7 @@ packages: - stylus - sugarss - /svelte-preprocess@4.10.7(postcss@8.4.31)(svelte@3.59.2)(typescript@4.9.5): + /svelte-preprocess@4.10.7(postcss@8.4.33)(svelte@3.59.2)(typescript@4.9.5): resolution: {integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==} engines: {node: '>= 9.11.2'} requiresBuild: true @@ -23163,7 +23750,7 @@ packages: '@types/sass': 1.45.0 detect-indent: 6.1.0 magic-string: 0.25.9 - postcss: 8.4.31 + postcss: 8.4.33 sorcery: 0.10.0 strip-indent: 3.0.0 svelte: 3.59.2 @@ -23231,6 +23818,11 @@ packages: acorn-node: 1.8.2 dev: true + /system-architecture@0.1.0: + resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} + engines: {node: '>=18'} + dev: false + /table-layout@0.4.5: resolution: {integrity: sha512-zTvf0mcggrGeTe/2jJ6ECkJHAQPIYEwDoqsiqBjI24mvRmQbInK5jq33fyypaCBxX08hMkfmdOqj6haT33EqWw==} engines: {node: '>=4.0.0'} @@ -23244,8 +23836,8 @@ packages: dev: false optional: true - /tailwindcss@3.3.5: - resolution: {integrity: sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==} + /tailwindcss@3.4.1: + resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==} engines: {node: '>=14.0.0'} hasBin: true dependencies: @@ -23263,14 +23855,14 @@ packages: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.0.0 - postcss: 8.4.31 - postcss-import: 15.1.0(postcss@8.4.31) - postcss-js: 4.0.1(postcss@8.4.31) - postcss-load-config: 4.0.2(postcss@8.4.31) - postcss-nested: 6.0.1(postcss@8.4.31) - postcss-selector-parser: 6.0.13 + postcss: 8.4.33 + postcss-import: 15.1.0(postcss@8.4.33) + postcss-js: 4.0.1(postcss@8.4.33) + postcss-load-config: 4.0.2(postcss@8.4.33) + postcss-nested: 6.0.1(postcss@8.4.33) + postcss-selector-parser: 6.0.15 resolve: 1.22.8 - sucrase: 3.34.0 + sucrase: 3.35.0 transitivePeerDependencies: - ts-node @@ -23292,7 +23884,7 @@ packages: minipass: 2.9.0 minizlib: 1.3.3 mkdirp: 0.5.6 - safe-buffer: 5.2.1 + safe-buffer: 5.2.1(patch_hash=qcepvj3ww73f2shgrehxggbrbq) yallist: 3.1.1 dev: false optional: true @@ -23322,8 +23914,8 @@ packages: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - /terser-webpack-plugin@5.3.9(webpack@5.89.0): - resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} + /terser-webpack-plugin@5.3.10(webpack@5.90.0): + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -23338,20 +23930,20 @@ packages: uglify-js: optional: true dependencies: - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/trace-mapping': 0.3.22 jest-worker: 27.5.1 schema-utils: 3.3.0 - serialize-javascript: 6.0.1 - terser: 5.24.0 - webpack: 5.89.0 + serialize-javascript: 6.0.2 + terser: 5.27.0 + webpack: 5.90.0 - /terser@5.24.0: - resolution: {integrity: sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==} + /terser@5.27.0: + resolution: {integrity: sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==} engines: {node: '>=10'} hasBin: true dependencies: '@jridgewell/source-map': 0.3.5 - acorn: 8.11.2 + acorn: 8.11.3 commander: 2.20.3 source-map-support: 0.5.21 @@ -23576,8 +24168,9 @@ packages: resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==} dev: true - /traverse@0.6.7: - resolution: {integrity: sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==} + /traverse@0.6.8: + resolution: {integrity: sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==} + engines: {node: '>= 0.4'} dev: true /trim-lines@3.0.1: @@ -23656,7 +24249,7 @@ packages: mocha: 10.2.0 ts-node: 7.0.1 optionalDependencies: - tsconfig-paths: 3.14.2 + tsconfig-paths: 3.15.0 dev: true /ts-node@10.9.1(@types/node@14.18.63)(typescript@4.9.5): @@ -23679,8 +24272,8 @@ packages: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 14.18.63 - acorn: 8.11.2 - acorn-walk: 8.3.0 + acorn: 8.11.3 + acorn-walk: 8.3.2 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 @@ -23710,8 +24303,8 @@ packages: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 18.11.10 - acorn: 8.11.2 - acorn-walk: 8.3.0 + acorn: 8.11.3 + acorn-walk: 8.3.2 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 @@ -23744,8 +24337,8 @@ packages: dev: false optional: true - /tsconfig-paths@3.14.2: - resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} + /tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} dependencies: '@types/json5': 0.0.29 json5: 1.0.2 @@ -23788,7 +24381,7 @@ packages: /tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} dependencies: - safe-buffer: 5.2.1 + safe-buffer: 5.2.1(patch_hash=qcepvj3ww73f2shgrehxggbrbq) dev: true /tunnel@0.0.6: @@ -23798,64 +24391,64 @@ packages: dev: false optional: true - /turbo-darwin-64@1.10.16: - resolution: {integrity: sha512-+Jk91FNcp9e9NCLYlvDDlp2HwEDp14F9N42IoW3dmHI5ZkGSXzalbhVcrx3DOox3QfiNUHxzWg4d7CnVNCuuMg==} + /turbo-darwin-64@1.11.3: + resolution: {integrity: sha512-IsOOg2bVbIt3o/X8Ew9fbQp5t1hTHN3fGNQYrPQwMR2W1kIAC6RfbVD4A9OeibPGyEPUpwOH79hZ9ydFH5kifw==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /turbo-darwin-arm64@1.10.16: - resolution: {integrity: sha512-jqGpFZipIivkRp/i+jnL8npX0VssE6IAVNKtu573LXtssZdV/S+fRGYA16tI46xJGxSAivrZ/IcgZrV6Jk80bw==} + /turbo-darwin-arm64@1.11.3: + resolution: {integrity: sha512-FsJL7k0SaPbJzI/KCnrf/fi3PgCDCjTliMc/kEFkuWVA6Httc3Q4lxyLIIinz69q6JTx8wzh6yznUMzJRI3+dg==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /turbo-linux-64@1.10.16: - resolution: {integrity: sha512-PpqEZHwLoizQ6sTUvmImcRmACyRk9EWLXGlqceogPZsJ1jTRK3sfcF9fC2W56zkSIzuLEP07k5kl+ZxJd8JMcg==} + /turbo-linux-64@1.11.3: + resolution: {integrity: sha512-SvW7pvTVRGsqtSkII5w+wriZXvxqkluw5FO/MNAdFw0qmoov+PZ237+37/NgArqE3zVn1GX9P6nUx9VO+xcQAg==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /turbo-linux-arm64@1.10.16: - resolution: {integrity: sha512-TMjFYz8to1QE0fKVXCIvG/4giyfnmqcQIwjdNfJvKjBxn22PpbjeuFuQ5kNXshUTRaTJihFbuuCcb5OYFNx4uw==} + /turbo-linux-arm64@1.11.3: + resolution: {integrity: sha512-YhUfBi1deB3m+3M55X458J6B7RsIS7UtM3P1z13cUIhF+pOt65BgnaSnkHLwETidmhRh8Dl3GelaQGrB3RdCDw==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /turbo-windows-64@1.10.16: - resolution: {integrity: sha512-+jsf68krs0N66FfC4/zZvioUap/Tq3sPFumnMV+EBo8jFdqs4yehd6+MxIwYTjSQLIcpH8KoNMB0gQYhJRLZzw==} + /turbo-windows-64@1.11.3: + resolution: {integrity: sha512-s+vEnuM2TiZuAUUUpmBHDr6vnNbJgj+5JYfnYmVklYs16kXh+EppafYQOAkcRIMAh7GjV3pLq5/uGqc7seZeHA==} cpu: [x64] os: [win32] requiresBuild: true dev: true optional: true - /turbo-windows-arm64@1.10.16: - resolution: {integrity: sha512-sKm3hcMM1bl0B3PLG4ifidicOGfoJmOEacM5JtgBkYM48ncMHjkHfFY7HrJHZHUnXM4l05RQTpLFoOl/uIo2HQ==} + /turbo-windows-arm64@1.11.3: + resolution: {integrity: sha512-ZR5z5Zpc7cASwfdRAV5yNScCZBsgGSbcwiA/u3farCacbPiXsfoWUkz28iyrx21/TRW0bi6dbsB2v17swa8bjw==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /turbo@1.10.16: - resolution: {integrity: sha512-2CEaK4FIuSZiP83iFa9GqMTQhroW2QryckVqUydmg4tx78baftTOS0O+oDAhvo9r9Nit4xUEtC1RAHoqs6ZEtg==} + /turbo@1.11.3: + resolution: {integrity: sha512-RCJOUFcFMQNIGKSjC9YmA5yVP1qtDiBA0Lv9VIgrXraI5Da1liVvl3VJPsoDNIR9eFMyA/aagx1iyj6UWem5hA==} hasBin: true optionalDependencies: - turbo-darwin-64: 1.10.16 - turbo-darwin-arm64: 1.10.16 - turbo-linux-64: 1.10.16 - turbo-linux-arm64: 1.10.16 - turbo-windows-64: 1.10.16 - turbo-windows-arm64: 1.10.16 + turbo-darwin-64: 1.11.3 + turbo-darwin-arm64: 1.11.3 + turbo-linux-64: 1.11.3 + turbo-linux-arm64: 1.11.3 + turbo-windows-64: 1.11.3 + turbo-windows-arm64: 1.11.3 dev: true /tweetnacl@0.14.5: @@ -23938,7 +24531,7 @@ packages: graphql: ^15.3.0 dependencies: '@types/glob': 7.2.0 - '@types/node': 16.18.64 + '@types/node': 16.18.76 '@types/semver': 7.5.6 class-validator: 0.13.2 glob: 7.2.3 @@ -24018,7 +24611,7 @@ packages: lunr: 2.3.9 marked: 4.3.0 minimatch: 9.0.3 - shiki: 0.14.5 + shiki: 0.14.7 typescript: 4.9.5 dev: true @@ -24027,8 +24620,8 @@ packages: engines: {node: '>=4.2.0'} hasBin: true - /typescript@5.3.2: - resolution: {integrity: sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==} + /typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} engines: {node: '>=14.17'} hasBin: true dev: false @@ -24094,14 +24687,18 @@ packages: resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} dev: true - /unenv@1.8.0: - resolution: {integrity: sha512-uIGbdCWZfhRRmyKj1UioCepQ0jpq638j/Cf0xFTn4zD1nGJ2lSdzYHLzfdXN791oo/0juUiSWW1fBklXMTsuqg==} + /unenv@1.9.0: + resolution: {integrity: sha512-QKnFNznRxmbOF1hDgzpqrlIf6NC5sbZ2OJ+5Wl3OX8uM+LUJXbj4TXvLJCtwbPTmbMHCLIz6JLKNinNsMShK9g==} dependencies: consola: 3.2.3 - defu: 6.1.3 + defu: 6.1.4 mime: 3.0.0 - node-fetch-native: 1.4.1 - pathe: 1.1.1 + node-fetch-native: 1.6.1 + pathe: 1.1.2 + dev: false + + /unfetch@4.2.0: + resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} dev: false /unicode-canonical-property-names-ecmascript@2.0.0: @@ -24377,26 +24974,26 @@ packages: anymatch: 3.1.3 chokidar: 3.5.3 destr: 2.0.2 - h3: 1.9.0 + h3: 1.10.1 idb-keyval: 6.2.1 ioredis: 5.3.2 - listhen: 1.5.5 - lru-cache: 10.1.0 + listhen: 1.5.6 + lru-cache: 10.2.0 mri: 1.2.0 - node-fetch-native: 1.4.1 + node-fetch-native: 1.6.1 ofetch: 1.3.3 ufo: 1.3.2 transitivePeerDependencies: - supports-color dev: false - /untun@0.1.2: - resolution: {integrity: sha512-wLAMWvxfqyTiBODA1lg3IXHQtjggYLeTK7RnSfqtOXixWJ3bAa2kK/HHmOOg19upteqO3muLvN6O/icbyQY33Q==} + /untun@0.1.3: + resolution: {integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==} hasBin: true dependencies: citty: 0.1.5 consola: 3.2.3 - pathe: 1.1.1 + pathe: 1.1.2 dev: false /unxhr@1.0.1: @@ -24423,13 +25020,13 @@ packages: resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} engines: {node: '>=4'} - /update-browserslist-db@1.0.13(browserslist@4.22.1): + /update-browserslist-db@1.0.13(browserslist@4.22.2): resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 escalade: 3.1.1 picocolors: 1.0.0 @@ -24512,7 +25109,7 @@ packages: engines: {node: '>=6.14.2'} requiresBuild: true dependencies: - node-gyp-build: 4.7.0(patch_hash=2d5zv4cuxtybogr2ggxm6rv25y) + node-gyp-build: 4.8.0(patch_hash=tidq6bjknpovdjep75bj5ccgke) /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -24534,7 +25131,7 @@ packages: /util@0.12.5: resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} dependencies: - inherits: 2.0.4(patch_hash=lyosn3d6q23lonbrmrh72z5hl4) + inherits: 2.0.4 is-arguments: 1.1.1 is-generator-function: 1.0.10 is-typed-array: 1.1.12 @@ -24619,7 +25216,7 @@ packages: engines: {node: '>= 0.10'} dev: false - /valtio@1.11.2(@types/react@18.2.38)(react@18.2.0): + /valtio@1.11.2(@types/react@18.2.48)(react@18.2.0): resolution: {integrity: sha512-1XfIxnUXzyswPAPXo1P3Pdx2mq/pIqZICkWN60Hby0d9Iqb+MEIpqgYVlbflvHdrp2YR/q3jyKWRPJJ100yxaw==} engines: {node: '>=12.20.0'} peerDependencies: @@ -24631,7 +25228,7 @@ packages: react: optional: true dependencies: - '@types/react': 18.2.38 + '@types/react': 18.2.48 proxy-compare: 2.5.1 react: 18.2.0 use-sync-external-store: 1.2.0(react@18.2.0) @@ -24720,8 +25317,8 @@ packages: vfile-message: 4.0.2 dev: false - /viem@1.19.7(typescript@5.3.2): - resolution: {integrity: sha512-NFCqU73CTHML9K7G3K8hnDJ9VjHJbH822Z6U2jUGNr0g5486EHMW0gtwnk6ivFP+ru5UewmUKwEvO0p5m0rvnA==} + /viem@1.21.4(typescript@5.3.3): + resolution: {integrity: sha512-BNVYdSaUjeS2zKQgPs+49e5JKocfo60Ib2yiXOWBT6LuVxY1I/6fFX3waEtpXvL1Xn4qu+BVitVtMh9lyThyhQ==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -24733,9 +25330,9 @@ packages: '@noble/hashes': 1.3.2 '@scure/bip32': 1.3.2 '@scure/bip39': 1.2.1 - abitype: 0.9.8(typescript@5.3.2) + abitype: 0.9.8(typescript@5.3.3) isows: 1.0.3(ws@8.13.0) - typescript: 5.3.2 + typescript: 5.3.3 ws: 8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil @@ -24743,8 +25340,8 @@ packages: - zod dev: false - /vite@4.5.0(@types/node@16.18.64): - resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} + /vite@4.5.2(@types/node@16.18.76): + resolution: {integrity: sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: @@ -24771,16 +25368,16 @@ packages: terser: optional: true dependencies: - '@types/node': 16.18.64 + '@types/node': 16.18.76 esbuild: 0.18.20 - postcss: 8.4.31 + postcss: 8.4.33 rollup: 3.29.4 optionalDependencies: fsevents: 2.3.3 dev: true - /vite@4.5.0(@types/node@18.11.10): - resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} + /vite@4.5.2(@types/node@18.11.10): + resolution: {integrity: sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: @@ -24809,13 +25406,13 @@ packages: dependencies: '@types/node': 18.11.10 esbuild: 0.18.20 - postcss: 8.4.31 + postcss: 8.4.33 rollup: 3.29.4 optionalDependencies: fsevents: 2.3.3 - /vite@5.0.2(@types/node@16.18.64): - resolution: {integrity: sha512-6CCq1CAJCNM1ya2ZZA7+jS2KgnhbzvxakmlIjN24cF/PXhRMzpM/z8QgsVJA/Dm5fWUWnVEsmtBoMhmerPxT0g==} + /vite@5.0.12(@types/node@16.18.76): + resolution: {integrity: sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -24842,10 +25439,10 @@ packages: terser: optional: true dependencies: - '@types/node': 16.18.64 - esbuild: 0.19.7 - postcss: 8.4.31 - rollup: 4.5.1 + '@types/node': 16.18.76 + esbuild: 0.19.12 + postcss: 8.4.33 + rollup: 4.9.6 optionalDependencies: fsevents: 2.3.3 dev: true @@ -24860,6 +25457,22 @@ packages: /vscode-textmate@8.0.0: resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} + /vue@3.4.19(typescript@4.9.5): + resolution: {integrity: sha512-W/7Fc9KUkajFU8dBeDluM4sRGc/aa4YJnOYck8dkjgZoXtVsn3OeTGni66FV1l3+nvPA7VBFYtPioaGKUmEADw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@vue/compiler-dom': 3.4.19 + '@vue/compiler-sfc': 3.4.19 + '@vue/runtime-dom': 3.4.19 + '@vue/server-renderer': 3.4.19(vue@3.4.19) + '@vue/shared': 3.4.19 + typescript: 4.9.5 + dev: false + /w3c-hr-time@1.0.2: resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} deprecated: Use your platform's native performance.now() and performance.timeOrigin. @@ -24872,8 +25485,8 @@ packages: dependencies: xml-name-validator: 3.0.0 - /wagmi@1.4.7(@types/react@18.2.38)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2)(viem@1.19.7): - resolution: {integrity: sha512-/k8gA9S6RnwU6Qroxs630jAFvRIx+DSKpCP1owgAEGWc7D2bAJHljwRSCRTGENz48HyJ4V3R7KYV1yImxPvM3A==} + /wagmi@1.4.13(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3)(viem@1.21.4): + resolution: {integrity: sha512-AScVYFjqNt1wMgL99Bob7MLdhoTZ3XKiOZL5HVBdy4W1sh7QodA3gQ8IsmTuUrQ7oQaTxjiXEhwg7sWNrPBvJA==} peerDependencies: react: '>=17.0.0' typescript: '>=5.0.4' @@ -24885,12 +25498,12 @@ packages: '@tanstack/query-sync-storage-persister': 4.36.1 '@tanstack/react-query': 4.36.1(react-dom@18.2.0)(react@18.2.0) '@tanstack/react-query-persist-client': 4.36.1(@tanstack/react-query@4.36.1) - '@wagmi/core': 1.4.7(@types/react@18.2.38)(react@18.2.0)(typescript@5.3.2)(viem@1.19.7) - abitype: 0.8.7(typescript@5.3.2) + '@wagmi/core': 1.4.13(@types/react@18.2.48)(react@18.2.0)(typescript@5.3.3)(viem@1.21.4) + abitype: 0.8.7(typescript@5.3.3) react: 18.2.0 - typescript: 5.3.2 + typescript: 5.3.3 use-sync-external-store: 1.2.0(react@18.2.0) - viem: 1.19.7(typescript@5.3.2) + viem: 1.21.4(typescript@5.3.3) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -24956,20 +25569,20 @@ packages: - encoding dev: true - /web-streams-polyfill@3.2.1: - resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} + /web-streams-polyfill@3.3.2: + resolution: {integrity: sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==} engines: {node: '>= 8'} /web-vitals@2.1.4: resolution: {integrity: sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==} dev: false - /web-worker@1.2.0: - resolution: {integrity: sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==} + /web-worker@1.3.0: + resolution: {integrity: sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==} dev: false - /webcrypto-core@1.7.7: - resolution: {integrity: sha512-7FjigXNsBfopEj+5DV2nhNpfic2vumtjjgPmeDKk45z+MJwXKKfhPB7118Pfzrmh4jqOMST6Ch37iPAHoImg5g==} + /webcrypto-core@1.7.8: + resolution: {integrity: sha512-eBR98r9nQXTqXt/yDRtInszPMjTaSAMJAFDg2AHsgrnczawT1asx9YNBX6k5p+MekbPF4+s/UJJrr88zsTqkSg==} dependencies: '@peculiar/asn1-schema': 2.3.8 '@peculiar/json-schema': 1.1.12 @@ -24991,7 +25604,7 @@ packages: resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} engines: {node: '>=10.4'} - /webpack-dev-middleware@5.3.3(webpack@5.89.0): + /webpack-dev-middleware@5.3.3(webpack@5.90.0): resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -25002,9 +25615,9 @@ packages: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.2.0 - webpack: 5.89.0 + webpack: 5.90.0 - /webpack-dev-server@4.15.1(webpack@5.89.0): + /webpack-dev-server@4.15.1(webpack@5.90.0): resolution: {integrity: sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==} engines: {node: '>= 12.13.0'} hasBin: true @@ -25025,7 +25638,7 @@ packages: '@types/sockjs': 0.3.36 '@types/ws': 8.5.10 ansi-html-community: 0.0.8 - bonjour-service: 1.1.1 + bonjour-service: 1.2.1 chokidar: 3.5.3 colorette: 2.0.20 compression: 1.7.4 @@ -25045,8 +25658,8 @@ packages: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.89.0 - webpack-dev-middleware: 5.3.3(webpack@5.89.0) + webpack: 5.90.0 + webpack-dev-middleware: 5.3.3(webpack@5.90.0) ws: 8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil @@ -25054,14 +25667,14 @@ packages: - supports-color - utf-8-validate - /webpack-manifest-plugin@4.1.1(webpack@5.89.0): + /webpack-manifest-plugin@4.1.1(webpack@5.90.0): resolution: {integrity: sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==} engines: {node: '>=12.22.0'} peerDependencies: webpack: ^4.44.2 || ^5.47.0 dependencies: tapable: 2.2.1 - webpack: 5.89.0 + webpack: 5.90.0 webpack-sources: 2.3.1 /webpack-sources@1.4.3: @@ -25081,8 +25694,8 @@ packages: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - /webpack@5.89.0: - resolution: {integrity: sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==} + /webpack@5.90.0: + resolution: {integrity: sha512-bdmyXRCXeeNIePv6R6tGPyy20aUobw4Zy8r0LUS2EWO+U+Ke/gYDgsCh7bl5rB6jPpr4r0SZa6dPxBxLooDT3w==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -25096,9 +25709,9 @@ packages: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/wasm-edit': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 - acorn: 8.11.2 - acorn-import-assertions: 1.9.0(acorn@8.11.2) - browserslist: 4.22.1 + acorn: 8.11.3 + acorn-import-assertions: 1.9.0(acorn@8.11.3) + browserslist: 4.22.2 chrome-trace-event: 1.0.3 enhanced-resolve: 5.15.0 es-module-lexer: 1.4.1 @@ -25112,7 +25725,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(webpack@5.89.0) + terser-webpack-plugin: 5.3.10(webpack@5.90.0) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -25125,7 +25738,7 @@ packages: engines: {node: '>=0.8.0'} dependencies: http-parser-js: 0.5.8 - safe-buffer: 5.2.1 + safe-buffer: 5.2.1(patch_hash=qcepvj3ww73f2shgrehxggbrbq) websocket-extensions: 0.1.4 /websocket-extensions@0.1.4: @@ -25137,8 +25750,8 @@ packages: dependencies: iconv-lite: 0.4.24 - /whatwg-fetch@3.6.19: - resolution: {integrity: sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==} + /whatwg-fetch@3.6.20: + resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} /whatwg-mimetype@2.3.0: resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} @@ -25285,10 +25898,10 @@ packages: engines: {node: '>=10.0.0'} dependencies: '@apideck/better-ajv-errors': 0.3.6(ajv@8.12.0) - '@babel/core': 7.23.3 - '@babel/preset-env': 7.23.3(@babel/core@7.23.3) - '@babel/runtime': 7.23.4 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.23.3)(rollup@2.79.1) + '@babel/core': 7.23.9 + '@babel/preset-env': 7.23.9(@babel/core@7.23.9) + '@babel/runtime': 7.23.9 + '@rollup/plugin-babel': 5.3.1(@babel/core@7.23.9)(rollup@2.79.1) '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1) '@rollup/plugin-replace': 2.4.2(rollup@2.79.1) '@surma/rollup-plugin-off-main-thread': 2.2.3 @@ -25394,7 +26007,7 @@ packages: /workbox-sw@6.6.0: resolution: {integrity: sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==} - /workbox-webpack-plugin@6.6.0(webpack@5.89.0): + /workbox-webpack-plugin@6.6.0(webpack@5.90.0): resolution: {integrity: sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==} engines: {node: '>=10.0.0'} peerDependencies: @@ -25403,7 +26016,7 @@ packages: fast-json-stable-stringify: 2.1.0 pretty-bytes: 5.6.0 upath: 1.2.0 - webpack: 5.89.0 + webpack: 5.90.0 webpack-sources: 1.4.3 workbox-build: 6.6.0 transitivePeerDependencies: @@ -25444,6 +26057,14 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -25645,12 +26266,12 @@ packages: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} dev: false - /zustand@4.4.6(@types/react@18.2.38)(react@18.2.0): - resolution: {integrity: sha512-Rb16eW55gqL4W2XZpJh0fnrATxYEG3Apl2gfHTyDSE965x/zxslTikpNch0JgNjJA9zK6gEFW8Fl6d1rTZaqgg==} + /zustand@4.5.0(@types/react@18.2.48)(react@18.2.0): + resolution: {integrity: sha512-zlVFqS5TQ21nwijjhJlx4f9iGrXSL0o/+Dpy4txAP22miJ8Ti6c1Ol1RLNN98BMib83lmDH/2KmLwaNXpjrO1A==} engines: {node: '>=12.7.0'} peerDependencies: '@types/react': '>=16.8' - immer: '>=9.0' + immer: '>=9.0.6' react: '>=16.8' peerDependenciesMeta: '@types/react': @@ -25660,7 +26281,7 @@ packages: react: optional: true dependencies: - '@types/react': 18.2.38 + '@types/react': 18.2.48 react: 18.2.0 use-sync-external-store: 1.2.0(react@18.2.0) dev: false @@ -25682,10 +26303,10 @@ packages: dependencies: '@holochain/serialization': 0.1.0-beta-rc.3 '@msgpack/msgpack': 2.8.0 - '@tauri-apps/api': 1.5.1 + '@tauri-apps/api': 1.5.3 emittery: 1.0.1 isomorphic-ws: 5.0.0(ws@8.13.0) - js-base64: 3.7.5 + js-base64: 3.7.6 lodash-es: 4.17.21 tweetnacl: 1.0.3(patch_hash=neqghjkbymv6pdxg4mf33vfzg4) transitivePeerDependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 1c8760cc1..569b0c713 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -10,10 +10,13 @@ packages: - 'rust-executor' - 'cli' - 'dapp' + - 'ad4m-hooks/react' + - 'ad4m-hooks/vue' + - 'ad4m-hooks/helpers' # exclude packages that are inside test directories - '!**/test/**' hoist: false - +public-hoist-pattern: '!core' overrides: core: hoist: false \ No newline at end of file diff --git a/removePnpm.js b/removePnpm.js new file mode 100644 index 000000000..012391abd --- /dev/null +++ b/removePnpm.js @@ -0,0 +1,31 @@ +const fs = require('fs'); + +// Read the package.json file +fs.readFile('package.json', 'utf8', (err, data) => { + if (err) { + console.error('Error reading package.json:', err); + return; + } + + // Parse the JSON data + let packageJson; + try { + packageJson = JSON.parse(data); + } catch (error) { + console.error('Error parsing package.json:', error); + return; + } + + // Remove pnpm-related configurations + delete packageJson.pnpm; + delete packageJson.pnpmOverrides; + + // Write the modified JSON back to package.json file + fs.writeFile('package.json', JSON.stringify(packageJson, null, 2), 'utf8', (err) => { + if (err) { + console.error('Error writing package.json:', err); + return; + } + console.log('package.json updated successfully!'); + }); +}); diff --git a/rust-client/Cargo.toml b/rust-client/Cargo.toml index 665499cc6..ea5f4827f 100644 --- a/rust-client/Cargo.toml +++ b/rust-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ad4m-client" -version = "0.8.1" +version = "0.9.0" edition = "2021" authors = ["Nicolas Luck "] description = "Client library wrapping AD4M's GraphQL interface" @@ -16,7 +16,7 @@ anyhow = "1.0.65" clap = { version = "4.0.8", features = ["derive"] } graphql_client = "0.12.0" serde = "1.0.147" -reqwest = { version = "0.11.17", features = ["blocking", "json", "native-tls"] } +reqwest = { version = "0.11.20", features = ["blocking", "json", "native-tls"] } futures = "0.3" tokio = { version = "1.25.0", features = ["full"] } rustyline = "10" diff --git a/rust-client/src/literal.rs b/rust-client/src/literal.rs index 4501259df..62ba06b0e 100644 --- a/rust-client/src/literal.rs +++ b/rust-client/src/literal.rs @@ -7,6 +7,16 @@ pub enum LiteralValue { Json(serde_json::Value), } +impl ToString for LiteralValue { + fn to_string(&self) -> String { + match self { + LiteralValue::String(string) => string.clone(), + LiteralValue::Number(number) => number.to_string(), + LiteralValue::Json(json) => json.to_string(), + } + } +} + pub struct Literal { value: Option, url: Option, diff --git a/rust-client/src/perspective_proxy.rs b/rust-client/src/perspective_proxy.rs index f2e2055a4..529a59816 100644 --- a/rust-client/src/perspective_proxy.rs +++ b/rust-client/src/perspective_proxy.rs @@ -281,7 +281,7 @@ impl PerspectiveProxy { pub async fn get_subject(&self, class: &String, base: &String) -> Result { if self.is_subject_instance(class, base).await? { - Ok(SubjectProxy::new(self.clone(), class.clone(), base.clone())) + Ok(SubjectProxy::new(self, class.clone(), base.clone())) } else { Err(anyhow!( "Expression {} is not a subject instance of class: {}", diff --git a/rust-client/src/types.rs b/rust-client/src/types.rs index 5e51f7b5f..918dac4dc 100644 --- a/rust-client/src/types.rs +++ b/rust-client/src/types.rs @@ -450,3 +450,15 @@ impl From for Agent { } } } + +pub struct Neighbourhood { + pub link_language: String, + pub meta: Perspective, +} + +pub struct NeighbourhoodExpression { + pub author: String, + pub data: Neighbourhood, + pub proof: ExpressionProof, + pub timestamp: String, +} \ No newline at end of file diff --git a/rust-executor/.gitignore b/rust-executor/.gitignore index 16fbedc51..e6ea29a4c 100644 --- a/rust-executor/.gitignore +++ b/rust-executor/.gitignore @@ -6,5 +6,4 @@ schema.gql !src/js_core/pubsub_extension.js !src/js_core/jwt_extension.js !src/prolog_service/prolog_service_extension.js -!src/holochain_service/holochain_service_extension.js -dapp \ No newline at end of file +!src/holochain_service/holochain_service_extension.js \ No newline at end of file diff --git a/rust-executor/Cargo.toml b/rust-executor/Cargo.toml index f7f3caaf8..8de219a85 100644 --- a/rust-executor/Cargo.toml +++ b/rust-executor/Cargo.toml @@ -1,9 +1,9 @@ [package] -name = "rust-executor" -version = "0.8.1" +name = "ad4m-executor" +version = "0.9.0" edition = "2021" -authors = ["Nicolas Luck "] -description = "A command-line interface to AD4M (i.e. the AD4M executor) - https://ad4m.dev" +authors = ["Nicolas Luck "] +description = "Runtime implementation of AD4M as library - https://ad4m.dev" keywords = ["ad4m", "perspect3vism", "cli"] license = "CAL-1.0" homepage = "https://ad4m.dev" @@ -11,6 +11,14 @@ repository = "https://github.com/perspect3vism/ad4m" documentation = "https://docs.ad4m.dev" readme = "README.md" +include = [ + "src/**/*", + "dapp/dist", # Symlink to the dapp directory + "executor/lib/bundle.js", # Symlink to the executor directory + "build.rs", + "Cargo.toml" +] + [lib] name = "rust_executor" path = "src/lib.rs" @@ -22,9 +30,9 @@ path = "src/main.rs" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -deno_core = "0.218.0" -deno_runtime = "0.128.0" -tokio = { version = "1", features = ["full"] } +deno_core = "0.230.0" +deno_runtime = "0.132.0" +tokio = { version = "1.25.0", features = ["full"] } url = "2.3.1" futures = "0.3.28" tokio-stream = { version = "0.1.12", features = ["sync"] } @@ -56,28 +64,33 @@ rust-embed="8.0.0" dirs = "5.0.1" rocket = "0.5.0" -juniper = { git = "https://github.com/graphql-rust/juniper", features = ["chrono"], rev = "57628de8649be071b04a3fedb45c47add7dc5192" } -juniper_subscriptions = { git = "https://github.com/graphql-rust/juniper", rev = "57628de8649be071b04a3fedb45c47add7dc5192" } -juniper_graphql_transport_ws = { git = "https://github.com/graphql-rust/juniper", rev = "57628de8649be071b04a3fedb45c47add7dc5192" } -juniper_warp = { git = "https://github.com/graphql-rust/juniper", features = ["subscriptions"], rev = "57628de8649be071b04a3fedb45c47add7dc5192" } +coasys_juniper = { version="0.16.0", features = ["chrono"] } +coasys_juniper_subscriptions = { version="0.17.0" } +coasys_juniper_graphql_transport_ws = { version="0.4.0" } +coasys_juniper_warp = { version="0.8.0", features = ["subscriptions"] } warp = "0.3.4" jsonwebtoken = "8.3.0" -# holochain = { version = "0.2.2", features = ["test_utils", "default"] } -# holochain_cli_bundle = { version = "0.2.2" } -# holochain_types = { version = "0.2.2" } -# holochain_cli_run_local_services = { version = "0.2.2" } - -holochain = { version = "0.3.0-beta-dev.27", git = "https://github.com/coasys/holochain.git", rev = "67ba54b961184ca9301698145f6256744356a879", features = ["test_utils", "default"] } -holochain_cli_bundle = { version = "0.3.0-beta-dev.25", git = "https://github.com/coasys/holochain.git", rev = "67ba54b961184ca9301698145f6256744356a879" } -holochain_types = { version = "0.3.0-beta-dev.24", git = "https://github.com/coasys/holochain.git", rev = "67ba54b961184ca9301698145f6256744356a879" } -holochain_cli_run_local_services = { version = "0.3.0-beta-dev.15", git = "https://github.com/coasys/holochain.git", rev = "67ba54b961184ca9301698145f6256744356a879" } -kitsune_p2p_types = { version = "0.3.0-beta-dev.14", git = "https://github.com/coasys/holochain.git", rev = "67ba54b961184ca9301698145f6256744356a879" } +holochain = { version = "0.3.0-beta-dev.39", features = ["test_utils", "default"] } +holochain_cli_bundle = { version = "0.3.0-beta-dev.36" } +holochain_types = { version = "0.3.0-beta-dev.35" } +holochain_cli_run_local_services = { version = "0.3.0-beta-dev.23" } +kitsune_p2p_types = { version = "0.3.0-beta-dev.22" } -scryer-prolog = { version = "0.9.1", git = "https://github.com/coasys/scryer-prolog", rev = "d4cb72fa00fcff21b763507a1b3ce415a3e43556", features = ["multi_thread"] } +scryer-prolog = { version = "0.9.4" } # scryer-prolog = { path = "../../scryer-prolog", features = ["multi_thread"] } -ad4m-client = { path = "../rust-client" } +ad4m-client = { path = "../rust-client", version="0.9.0" } + +rusqlite = { version = "0.29.0", features = ["bundled"] } +fake = { version = "2.9.2", features = ["derive"] } +sha2 = "0.10.8" +regex = "1.5.4" + +include_dir = "0.6.0" + [dev-dependencies] maplit = "1.0.2" +lazy_static = "1.4.0" +itertools = "0.10.1" diff --git a/rust-executor/README.md b/rust-executor/README.md index 302500802..b256f7260 100644 --- a/rust-executor/README.md +++ b/rust-executor/README.md @@ -2,4 +2,10 @@ This Rust crate; provides a lib with exposed functions for 'init' & 'run' of an AD4M Agent and also exposes a bin which will by default `run` an AD4M Agent. -Running an AD4M Agent entails the creation of a warp based GraphQL server, conforming to the ADAM Layer spec. Spawning of a Deno runtime that runs the core [`executor`](https://github.com/coasys/ad4m/tree/rust-refactor/executor), this happens inside [`js_core`](https://github.com/coasys/ad4m/blob/rust-refactor/rust-executor/src/js_core/mod.rs). `js_core` also handles the requests from the JS to call into Rust functions. Currently exposed Rust functions allow communication with `Scryer-Prolog`, `Holochain` & `JwtService`. \ No newline at end of file +This AD4M implementation includes: + - a [Holochain](https://github.com/holochain/holochain) conductor/agent, [included as a library](https://github.com/coasys/ad4m/blob/dev/rust-executor/src/holochain_service/mod.rs) dependency into this crate + - key storage for the users agent keys, build around DID + - a warp based GraphQL server, conforming to the ADAM Layer spec + - a [Deno](https://github.com/denoland/deno) runtime that runs the [AD4M Languages](https://github.com/coasys/ad4m/blob/dev/core/src/language/Language.ts) as well as some JS based remainders of the legacy executor implementation the core [`executor`](https://github.com/coasys/ad4m/tree/dev/executor), this happens inside [`js_core`](https://github.com/coasys/ad4m/blob/dev/rust-executor/src/js_core/mod.rs) + - [Scryer Prolog](https://github.com/mthom/scryer-prolog/) for Social DNA queries of Perspectives (https://github.com/coasys/ad4m/blob/dev/rust-executor/src/prolog_service/mod.rs) + - SQLite database for storing Perspective data diff --git a/rust-executor/build.rs b/rust-executor/build.rs deleted file mode 100644 index ef168d04b..000000000 --- a/rust-executor/build.rs +++ /dev/null @@ -1,26 +0,0 @@ -use std::fs; -use std::path::Path; - -fn copy_dir_recursive(source: &Path, target: &Path) -> std::io::Result<()> { - if source.is_dir() { - fs::create_dir_all(target)?; - for entry in fs::read_dir(source)? { - let entry = entry?; - let entry_target = target.join(entry.file_name()); - copy_dir_recursive(&entry.path(), &entry_target)?; - } - } else { - fs::copy(source, target)?; - } - Ok(()) -} - -fn main() { - let source_dir = "../dapp/public"; - - let target_dir = concat!(env!("CARGO_MANIFEST_DIR"), "/dapp"); - - if let Err(err) = copy_dir_recursive(Path::new(source_dir), Path::new(target_dir)) { - eprintln!("Error copying directory: {}", err); - } -} \ No newline at end of file diff --git a/rust-executor/dapp b/rust-executor/dapp new file mode 120000 index 000000000..5010a65d9 --- /dev/null +++ b/rust-executor/dapp @@ -0,0 +1 @@ +../dapp \ No newline at end of file diff --git a/rust-executor/executor b/rust-executor/executor new file mode 120000 index 000000000..5ba960b7b --- /dev/null +++ b/rust-executor/executor @@ -0,0 +1 @@ +../executor \ No newline at end of file diff --git a/rust-executor/package.json b/rust-executor/package.json index 4950bf472..0cf318d87 100644 --- a/rust-executor/package.json +++ b/rust-executor/package.json @@ -7,7 +7,7 @@ "types": "", "scripts": { "build": "cargo build --release", - "test": "cargo test --release" + "test": "cargo test --release -- --test-threads=1" }, "repository": { "type": "git", @@ -31,5 +31,5 @@ "@coasys/ad4m-executor": "link:../core" }, "dependencies": {}, - "version": "0.8.1" + "version": "0.9.0" } diff --git a/rust-executor/src/agent/capabilities/apps_map.rs b/rust-executor/src/agent/capabilities/apps_map.rs new file mode 100644 index 000000000..091440fe0 --- /dev/null +++ b/rust-executor/src/agent/capabilities/apps_map.rs @@ -0,0 +1,114 @@ +use super::types::AuthInfoExtended; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; +use std::fs::{self, File}; +use std::io::{self, Read}; +use std::path::Path; +use std::sync::Mutex; + +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct App { + auth_info_extended: AuthInfoExtended, + revoked: bool, + token: String, +} + +impl App { + pub fn new(auth_info_extended: AuthInfoExtended, revoked: bool, token: String) -> Self { + App { + auth_info_extended, + revoked, + token, + } + } +} + +use std::env; + +lazy_static! { + static ref DATA_FILE_PATH: Mutex = + Mutex::new(env::var("APPS_DATA_FILE").unwrap_or_else(|_| "apps_data.json".to_string())); +} + +fn get_data_file_path() -> String { + DATA_FILE_PATH.lock().unwrap().clone() +} + +pub fn set_data_file_path(file_path: String) { + let mut data_file_path = DATA_FILE_PATH.lock().unwrap(); + *data_file_path = file_path; +} + +fn persist_apps_to_file(apps: &HashMap) -> io::Result<()> { + let file_path = get_data_file_path(); + let serialized_apps = serde_json::to_string(apps)?; + fs::write(file_path, serialized_apps)?; + Ok(()) +} + +fn load_apps_from_file() -> io::Result> { + let file_path = get_data_file_path(); + let mut file = File::open(&file_path)?; + let mut contents = String::new(); + file.read_to_string(&mut contents)?; + let apps: HashMap = serde_json::from_str(&contents)?; + Ok(apps) +} + +lazy_static! { + static ref APPS: Mutex> = { + let apps = if Path::new(&get_data_file_path()).exists() { + load_apps_from_file().unwrap_or_else(|_| HashMap::new()) + } else { + HashMap::new() + }; + Mutex::new(apps) + }; +} + +pub fn insert_app( + request_key: String, + auth_info_extended: AuthInfoExtended, + token: String, +) -> Result<(), String> { + let mut apps = APPS.lock().map_err(|e| e.to_string())?; + apps.insert(request_key, App::new(auth_info_extended, false, token)); + persist_apps_to_file(&apps).map_err(|e| e.to_string())?; + Ok(()) +} + +pub fn revoke_app(request_key: &str) -> Result<(), String> { + let mut apps = APPS.lock().map_err(|e| e.to_string())?; + if let Some(app) = apps.get_mut(request_key) { + app.revoked = true; + persist_apps_to_file(&apps).map_err(|e| e.to_string())?; + } + Ok(()) +} + +pub fn remove_app(request_key: &str) -> Result<(), String> { + let mut apps = APPS.lock().map_err(|e| e.to_string())?; + if apps.remove(request_key).is_some() { + persist_apps_to_file(&apps).map_err(|e| e.to_string())?; + Ok(()) + } else { + Err(format!("App with request_key '{}' not found.", request_key)) + } +} + +pub fn get_app(request_key: &str) -> Result, String> { + let apps = APPS.lock().map_err(|e| e.to_string())?; + Ok(apps.get(request_key).cloned()) +} + +pub fn get_apps() -> Vec { + let apps = APPS.lock().unwrap(); + apps.iter() + .map(|(request_id, app)| crate::graphql::graphql_types::Apps { + auth: app.auth_info_extended.auth.clone(), + request_id: request_id.clone(), + revoked: Some(app.revoked), + token: app.token.clone(), + }) + .collect() +} diff --git a/rust-executor/src/agent/capabilities/defs.rs b/rust-executor/src/agent/capabilities/defs.rs new file mode 100644 index 000000000..d22978ec3 --- /dev/null +++ b/rust-executor/src/agent/capabilities/defs.rs @@ -0,0 +1,371 @@ +use super::types::{Capability, Resource}; +pub const WILD_CARD: &str = "*"; + +// capabilities operations +pub const READ: &str = "READ"; +pub const CREATE: &str = "CREATE"; +pub const UPDATE: &str = "UPDATE"; +pub const DELETE: &str = "DELETE"; +pub const SUBSCRIBE: &str = "SUBSCRIBE"; + +// capabilities domains +pub const AGENT: &str = "agent"; +pub const EXPRESSION: &str = "expression"; +pub const LANGUAGE: &str = "language"; +pub const PERSPECTIVE: &str = "perspective"; +pub const NEIGHBOURHOOD: &str = "neighbourhood"; +pub const RUNTIME: &str = "runtime"; +pub const RUNTIME_TRUSTED_AGENTS: &str = "runtime.trusted_agents"; +pub const RUNTIME_KNOWN_LINK_LANGUAGES: &str = "runtime.known_link_languages"; +pub const RUNTIME_FRIENDS: &str = "runtime.friends"; +pub const RUNTIME_MESSAGES: &str = "runtime.messages"; + +// admin capabilities +lazy_static! { + pub static ref ALL_CAPABILITY: Capability = Capability { + with: Resource { + domain: WILD_CARD.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![WILD_CARD.to_string()], + }; + // agent related capabilities + pub static ref AGENT_AUTH_CAPABILITY: Capability = Capability { + with: Resource { + domain: AGENT.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec!["AUTHENTICATE".to_string()], + }; + pub static ref AGENT_READ_CAPABILITY: Capability = Capability { + with: Resource { + domain: AGENT.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![READ.to_string()], + }; + pub static ref AGENT_CREATE_CAPABILITY: Capability = Capability { + with: Resource { + domain: AGENT.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![CREATE.to_string()], + }; + pub static ref AGENT_UPDATE_CAPABILITY: Capability = Capability { + with: Resource { + domain: AGENT.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![UPDATE.to_string()], + }; + pub static ref AGENT_LOCK_CAPABILITY: Capability = Capability { + with: Resource { + domain: AGENT.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec!["LOCK".to_string()], + }; + pub static ref AGENT_UNLOCK_CAPABILITY: Capability = Capability { + with: Resource { + domain: AGENT.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec!["UNLOCK".to_string()], + }; + pub static ref AGENT_PERMIT_CAPABILITY: Capability = Capability { + with: Resource { + domain: AGENT.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec!["PERMIT".to_string()], + }; + pub static ref AGENT_SUBSCRIBE_CAPABILITY: Capability = Capability { + with: Resource { + domain: AGENT.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![SUBSCRIBE.to_string()], + }; + pub static ref AGENT_SIGN_CAPABILITY: Capability = Capability { + with: Resource { + domain: AGENT.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec!["SIGN".to_string()], + }; + + // expression related capabilities + pub static ref EXPRESSION_READ_CAPABILITY: Capability = Capability { + with: Resource { + domain: EXPRESSION.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![READ.to_string()], + }; + pub static ref EXPRESSION_CREATE_CAPABILITY: Capability = Capability { + with: Resource { + domain: EXPRESSION.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![CREATE.to_string()], + }; + pub static ref EXPRESSION_UPDATE_CAPABILITY: Capability = Capability { + with: Resource { + domain: EXPRESSION.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![UPDATE.to_string()], + }; + + // language related capabilities + pub static ref LANGUAGE_READ_CAPABILITY: Capability = Capability { + with: Resource { + domain: LANGUAGE.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![READ.to_string()], + }; + pub static ref LANGUAGE_CREATE_CAPABILITY: Capability = Capability { + with: Resource { + domain: LANGUAGE.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![CREATE.to_string()], + }; + pub static ref LANGUAGE_UPDATE_CAPABILITY: Capability = Capability { + with: Resource { + domain: LANGUAGE.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![UPDATE.to_string()], + }; + pub static ref LANGUAGE_DELETE_CAPABILITY: Capability = Capability { + with: Resource { + domain: LANGUAGE.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![DELETE.to_string()], + }; + + // perspective related capabilities + pub static ref PERSPECTIVE_CREATE_CAPABILITY: Capability = Capability { + with: Resource { + domain: PERSPECTIVE.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![CREATE.to_string()], + }; +} + +#[allow(dead_code)] +pub fn perspective_query_capability(pointers: Vec) -> Capability { + Capability { + with: Resource { + domain: PERSPECTIVE.to_string(), + pointers, + }, + can: vec![READ.to_string()], + } +} + +#[allow(dead_code)] +pub fn perspective_update_capability(pointers: Vec) -> Capability { + Capability { + with: Resource { + domain: PERSPECTIVE.to_string(), + pointers, + }, + can: vec![UPDATE.to_string()], + } +} + +#[allow(dead_code)] +pub fn perspective_delete_capability(pointers: Vec) -> Capability { + Capability { + with: Resource { + domain: PERSPECTIVE.to_string(), + pointers, + }, + can: vec![DELETE.to_string()], + } +} + +lazy_static! { + pub static ref PERSPECTIVE_SUBSCRIBE_CAPABILITY: Capability = Capability { + with: Resource { + domain: PERSPECTIVE.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![SUBSCRIBE.to_string()], + }; + + // neighbourhood related capabilities + pub static ref NEIGHBOURHOOD_CREATE_CAPABILITY: Capability = Capability { + with: Resource { + domain: NEIGHBOURHOOD.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![CREATE.to_string()], + }; + + pub static ref NEIGHBOURHOOD_READ_CAPABILITY: Capability = Capability { + with: Resource { + domain: NEIGHBOURHOOD.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![READ.to_string()], + }; + + pub static ref NEIGHBOURHOOD_UPDATE_CAPABILITY: Capability = Capability { + with: Resource { + domain: NEIGHBOURHOOD.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![UPDATE.to_string()], + }; + + // runtime related capabilities + pub static ref RUNTIME_TRUSTED_AGENTS_READ_CAPABILITY: Capability = Capability { + with: Resource { + domain: RUNTIME_TRUSTED_AGENTS.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![READ.to_string()], + }; + + pub static ref RUNTIME_TRUSTED_AGENTS_CREATE_CAPABILITY: Capability = Capability { + with: Resource { + domain: RUNTIME_TRUSTED_AGENTS.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![CREATE.to_string()], + }; + + pub static ref RUNTIME_TRUSTED_AGENTS_DELETE_CAPABILITY: Capability = Capability { + with: Resource { + domain: RUNTIME_TRUSTED_AGENTS.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![DELETE.to_string()], + }; + + pub static ref RUNTIME_KNOWN_LINK_LANGUAGES_READ_CAPABILITY: Capability = Capability { + with: Resource { + domain: RUNTIME_KNOWN_LINK_LANGUAGES.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![READ.to_string()], + }; + + pub static ref RUNTIME_KNOWN_LINK_LANGUAGES_CREATE_CAPABILITY: Capability = Capability { + with: Resource { + domain: RUNTIME_KNOWN_LINK_LANGUAGES.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![CREATE.to_string()], + }; + + pub static ref RUNTIME_KNOWN_LINK_LANGUAGES_DELETE_CAPABILITY: Capability = Capability { + with: Resource { + domain: RUNTIME_KNOWN_LINK_LANGUAGES.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![DELETE.to_string()], + }; + + pub static ref RUNTIME_FRIENDS_READ_CAPABILITY: Capability = Capability { + with: Resource { + domain: RUNTIME_FRIENDS.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![READ.to_string()], + }; + + pub static ref RUNTIME_FRIENDS_CREATE_CAPABILITY: Capability = Capability { + with: Resource { + domain: RUNTIME_FRIENDS.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![CREATE.to_string()], + }; + + pub static ref RUNTIME_FRIENDS_DELETE_CAPABILITY: Capability = Capability { + with: Resource { + domain: RUNTIME_FRIENDS.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![DELETE.to_string()], + }; + + pub static ref RUNTIME_FRIEND_STATUS_READ_CAPABILITY: Capability = Capability { + with: Resource { + domain: "runtime.friend_status".to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![READ.to_string()], + }; + + pub static ref RUNTIME_MY_STATUS_UPDATE_CAPABILITY: Capability = Capability { + with: Resource { + domain: "runtime.my_status".to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![UPDATE.to_string()], + }; + + pub static ref RUNTIME_HC_AGENT_INFO_READ_CAPABILITY: Capability = Capability { + with: Resource { + domain: "runtime.hc_agent_info".to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![READ.to_string()], + }; + + pub static ref RUNTIME_HC_AGENT_INFO_CREATE_CAPABILITY: Capability = Capability { + with: Resource { + domain: "runtime.hc_agent_info".to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![CREATE.to_string()], + }; + + pub static ref RUNTIME_MESSAGES_READ_CAPABILITY: Capability = Capability { + with: Resource { + domain: RUNTIME_MESSAGES.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![READ.to_string()], + }; + + pub static ref RUNTIME_MESSAGES_CREATE_CAPABILITY: Capability = Capability { + with: Resource { + domain: RUNTIME_MESSAGES.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![CREATE.to_string()], + }; + + pub static ref RUNTIME_MESSAGES_SUBSCRIBE_CAPABILITY: Capability = Capability { + with: Resource { + domain: RUNTIME_MESSAGES.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![SUBSCRIBE.to_string()], + }; + + pub static ref RUNTIME_QUIT_CAPABILITY: Capability = Capability { + with: Resource { + domain: RUNTIME.to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec!["QUIT".to_string()], + }; + + pub static ref RUNTIME_EXCEPTION_SUBSCRIBE_CAPABILITY: Capability = Capability { + with: Resource { + domain: "runtime.exception".to_string(), + pointers: vec![WILD_CARD.to_string()], + }, + can: vec![SUBSCRIBE.to_string()], + }; +} diff --git a/rust-executor/src/agent/capabilities/mod.rs b/rust-executor/src/agent/capabilities/mod.rs new file mode 100644 index 000000000..2295b3089 --- /dev/null +++ b/rust-executor/src/agent/capabilities/mod.rs @@ -0,0 +1,300 @@ +pub mod apps_map; +pub mod defs; +pub mod requests_map; +pub mod token; +pub mod types; + +pub use defs::*; +use requests_map::{get_request, insert_request, remove_request}; +pub use token::*; +pub use types::*; + +use crate::graphql::graphql_types::*; +use crate::pubsub::{get_global_pubsub, APPS_CHANGED, EXCEPTION_OCCURRED_TOPIC}; + +pub const DEFAULT_TOKEN_VALID_PERIOD: u64 = 180 * 24 * 60 * 60; // 180 days in seconds + +pub fn check_capability( + capabilities: &Result, String>, + expected: &Capability, +) -> Result<(), String> { + let capabilities = capabilities.clone()?; + let custom_cap_match = |cap: &Capability, expected: &Capability| -> bool { + if cap.with.domain != WILD_CARD && cap.with.domain != expected.with.domain { + return false; + } + + if !cap.with.pointers.contains(&WILD_CARD.to_string()) + && expected + .with + .pointers + .iter() + .any(|p| !cap.with.pointers.contains(p)) + { + return false; + } + + if !cap.can.contains(&WILD_CARD.to_string()) + && expected.can.iter().any(|c| !cap.can.contains(c)) + { + return false; + } + + true + }; + + if !capabilities + .iter() + .any(|cap| custom_cap_match(cap, expected)) + { + return Err(format!( + "Capability is not matched, you have capabilities: {:?}, expected: {:?}", + capabilities, expected + )); + } + + Ok(()) +} + +pub fn check_token_revoked( + token: &String, +) -> Result<(), String> { + if let Some(app) = apps_map::get_apps().iter().find(|app| app.token == *token) { + if app.revoked.unwrap_or(false) { + return Err("Unauthorized access".to_string()); + } + }; + + Ok(()) +} + +pub fn capabilities_from_token( + token: String, + admin_credential: Option, +) -> Result, String> { + match admin_credential { + Some(admin_credential) => { + if token == admin_credential { + return Ok(vec![ALL_CAPABILITY.clone()]); + } + } + None => { + if token.is_empty() { + return Ok(vec![ALL_CAPABILITY.clone()]); + } + } + } + + if token == "" { + return Ok(vec![AGENT_AUTH_CAPABILITY.clone()]); + } + + check_token_revoked(&token)?; + + let claims = decode_jwt(token).map_err(|e| e.to_string())?; + + if claims.capabilities.capabilities.is_none() { + Ok(vec![AGENT_AUTH_CAPABILITY.clone()]) + } else { + Ok(claims.capabilities.capabilities.unwrap()) + } +} + +pub async fn request_capability(auth_info: AuthInfo) -> String { + let request_id = uuid::Uuid::new_v4().to_string(); + let app_name = auth_info.app_name.clone(); + + let auth_extended = AuthInfoExtended { + request_id: request_id.clone(), + auth: auth_info, + }; + + let exception_info = ExceptionInfo { + title: "Request to authenticate application".to_string(), + message: format!( + "{} is waiting for authentication, open the ADAM Launcher for more information.", + app_name + ), + r#type: ExceptionType::CapabilityRequested, + addon: Some(serde_json::to_string(&auth_extended).unwrap()), + }; + + get_global_pubsub() + .await + .publish( + &EXCEPTION_OCCURRED_TOPIC, + &serde_json::to_string(&exception_info).unwrap(), + ) + .await; + + request_id +} + +pub fn permit_capability(auth_info_extended: AuthInfoExtended) -> Result { + let rand = gen_random_digits(); + let request_key = gen_request_key(&auth_info_extended.request_id, &rand); + insert_request(request_key.clone(), auth_info_extended.auth.clone())?; + Ok(rand) +} + +pub async fn generate_capability_token(request_id: String, rand: String) -> Result { + let auth_key = gen_request_key(&request_id, &rand); + + let auth = get_request(&auth_key)?.ok_or("Can't find permitted request")?; + + let cap_token = token::generate_jwt( + auth.app_name.clone(), + DEFAULT_TOKEN_VALID_PERIOD, + auth.clone(), + ) + .map_err(|e| e.to_string())?; + + remove_request(&auth_key)?; + + apps_map::insert_app( + request_id.clone(), + AuthInfoExtended { + request_id: request_id.clone(), + auth, + }, + cap_token.clone(), + )?; + + get_global_pubsub() + .await + .publish(&APPS_CHANGED, &String::from("")) + .await; + + Ok(cap_token) +} + +pub fn gen_random_digits() -> String { + use rand::Rng; + let mut rng = rand::thread_rng(); + rng.gen_range(100000..1000000).to_string() +} + +pub fn gen_request_key(request_id: &str, rand: &str) -> String { + format!("{}-{}", request_id, rand) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn all_capability_is_expected() { + let all_capability = &ALL_CAPABILITY; + assert_eq!(all_capability.with.domain, "*"); + assert_eq!(all_capability.with.pointers, vec!["*"]); + assert_eq!(all_capability.can, vec!["*"]); + } + + #[test] + fn agent_auth_capability_is_expected() { + let agent_auth_capability = &AGENT_AUTH_CAPABILITY; + assert_eq!(agent_auth_capability.with.domain, "agent"); + assert_eq!(agent_auth_capability.with.pointers, vec!["*"]); + assert_eq!(agent_auth_capability.can, vec!["AUTHENTICATE"]); + } + + #[test] + fn agent_read_capability_is_expected() { + let agent_read_capability = &AGENT_READ_CAPABILITY; + assert_eq!(agent_read_capability.with.domain, "agent"); + assert_eq!(agent_read_capability.with.pointers, vec!["*"]); + assert_eq!(agent_read_capability.can, vec!["READ"]); + } + + #[test] + fn agent_create_capability_is_expected() { + let agent_create_capability = &AGENT_CREATE_CAPABILITY; + assert_eq!(agent_create_capability.with.domain, "agent"); + assert_eq!(agent_create_capability.with.pointers, vec!["*"]); + assert_eq!(agent_create_capability.can, vec!["CREATE"]); + } + + #[test] + fn query_capability_is_expected() { + let capability = perspective_query_capability(vec!["123".to_string(), "456".to_string()]); + assert_eq!(capability.with.domain, "perspective"); + assert_eq!(capability.with.pointers, vec!["123", "456"]); + assert_eq!(capability.can, vec!["READ"]); + } + + #[test] + fn agent_with_all_capability_can_permit_an_auth_request() { + assert!( + check_capability(&Ok(vec![ALL_CAPABILITY.clone()]), &AGENT_PERMIT_CAPABILITY).is_ok() + ); + } + + #[test] + fn agent_with_all_capability_can_request_agent_status() { + assert!( + check_capability(&Ok(vec![ALL_CAPABILITY.clone()]), &AGENT_READ_CAPABILITY).is_ok() + ); + } + + #[test] + fn agent_with_all_capability_can_mutate_the_agent() { + assert!( + check_capability(&Ok(vec![ALL_CAPABILITY.clone()]), &AGENT_CREATE_CAPABILITY).is_ok() + ); + } + + #[test] + fn agent_with_agent_auth_capability_cannot_request_the_agent_status() { + assert!(check_capability( + &Ok(vec![AGENT_AUTH_CAPABILITY.clone()]), + &AGENT_READ_CAPABILITY + ) + .is_err()); + } + + #[test] + fn agent_with_agent_auth_capability_cannot_mutate_the_agent() { + assert!(check_capability( + &Ok(vec![AGENT_AUTH_CAPABILITY.clone()]), + &AGENT_CREATE_CAPABILITY + ) + .is_err()); + } + + #[test] + fn agent_with_agent_auth_capability_can_request_an_auth() { + assert!(check_capability( + &Ok(vec![AGENT_AUTH_CAPABILITY.clone()]), + &AGENT_AUTH_CAPABILITY + ) + .is_ok()); + } + + #[test] + fn agent_with_agent_read_capability_can_request_the_agent_status() { + assert!(check_capability( + &Ok(vec![AGENT_READ_CAPABILITY.clone()]), + &AGENT_READ_CAPABILITY + ) + .is_ok()); + } + + #[test] + fn agent_with_perspective_query_capability_can_query_a_perspective() { + let query_capability = perspective_query_capability(vec!["*".to_string()]); + let expected_capability = perspective_query_capability(vec!["123".to_string()]); + assert!(check_capability(&Ok(vec![query_capability]), &expected_capability).is_ok()); + } + + #[test] + fn gen_random_digits_returns_a_6_digit_string() { + let rand = gen_random_digits(); + assert!(rand.len() == 6 && rand.chars().all(|c| c.is_digit(10))); + } + + #[test] + fn gen_request_key_joins_the_request_id_and_rand() { + let key = gen_request_key("my-request-id", "123456"); + assert_eq!(key, "my-request-id-123456"); + } +} diff --git a/rust-executor/src/agent/capabilities/requests_map.rs b/rust-executor/src/agent/capabilities/requests_map.rs new file mode 100644 index 000000000..e56dfdfdb --- /dev/null +++ b/rust-executor/src/agent/capabilities/requests_map.rs @@ -0,0 +1,24 @@ +use super::types::AuthInfo; +use std::collections::HashMap; +use std::sync::Mutex; + +lazy_static! { + static ref REQUESTS: Mutex> = Mutex::new(HashMap::new()); +} + +pub fn insert_request(request_key: String, auth_info: AuthInfo) -> Result<(), String> { + let mut requests = REQUESTS.lock().map_err(|e| e.to_string())?; + requests.insert(request_key, auth_info); + Ok(()) +} + +pub fn get_request(request_key: &str) -> Result, String> { + let requests = REQUESTS.lock().map_err(|e| e.to_string())?; + Ok(requests.get(request_key).cloned()) +} + +pub fn remove_request(request_key: &str) -> Result<(), String> { + let mut requests = REQUESTS.lock().map_err(|e| e.to_string())?; + requests.remove(request_key); + Ok(()) +} diff --git a/rust-executor/src/agent/capabilities/token.rs b/rust-executor/src/agent/capabilities/token.rs new file mode 100644 index 000000000..144179e0e --- /dev/null +++ b/rust-executor/src/agent/capabilities/token.rs @@ -0,0 +1,54 @@ +use super::types::*; +use crate::wallet::Wallet; +use deno_core::{anyhow::anyhow, error::AnyError}; +use jsonwebtoken::{encode, Algorithm, DecodingKey, EncodingKey, Header}; + +pub fn generate_jwt( + audience: String, + expiration_time: u64, + capabilities: AuthInfo, +) -> Result { + // Get the private key + let wallet = Wallet::instance(); + let wallet_lock = wallet.lock().expect("wallet lock"); + let wallet_ref = wallet_lock.as_ref().expect("wallet instance"); + let name = "main".to_string(); + + let secret_key = wallet_ref + .get_secret_key(&name) + .ok_or(anyhow!("main key not found. call createMainKey() first"))?; + + let did_document = wallet_ref + .get_did_document(&name) + .ok_or(anyhow!("main did not found. call createMainKey() first"))?; + + let payload = Claims::new(did_document.id, audience, expiration_time, capabilities); + + let token = encode( + &Header::default(), + &payload, + &EncodingKey::from_secret(secret_key.as_slice()), + )?; + + Ok(token) +} + +pub fn decode_jwt(token: String) -> Result { + //Get the private key + let wallet = Wallet::instance(); + let wallet_lock = wallet.lock().expect("wallet lock"); + let wallet_ref = wallet_lock.as_ref().expect("wallet instance"); + let name = "main".to_string(); + + let secret_key = wallet_ref + .get_secret_key(&name) + .ok_or(anyhow!("main key not found. call createMainKey() first"))?; + + let result = jsonwebtoken::decode::( + &token, + &DecodingKey::from_secret(secret_key.as_slice()), + &jsonwebtoken::Validation::new(Algorithm::HS256), + )?; + + Ok(result.claims) +} diff --git a/rust-executor/src/agent/capabilities/types.rs b/rust-executor/src/agent/capabilities/types.rs new file mode 100644 index 000000000..b9250f638 --- /dev/null +++ b/rust-executor/src/agent/capabilities/types.rs @@ -0,0 +1,104 @@ +use coasys_juniper::GraphQLObject; +use serde::{Deserialize, Serialize}; +use std::time::{SystemTime, UNIX_EPOCH}; + +#[derive(Debug, Serialize, Deserialize, Clone)] +#[serde(rename_all = "camelCase")] +pub struct AuthInfoExtended { + pub request_id: String, + pub auth: AuthInfo, +} + +#[derive(GraphQLObject, Default, Debug, Deserialize, Serialize, Clone)] +#[serde(rename_all = "camelCase")] +pub struct AuthInfo { + pub app_name: String, + pub app_desc: String, + pub app_domain: Option, + pub app_url: Option, + pub app_icon_path: Option, + pub capabilities: Option>, +} + +impl From for AuthInfo { + fn from(input: crate::graphql::graphql_types::AuthInfoInput) -> Self { + Self { + app_name: input.app_name, + app_desc: input.app_desc, + app_domain: Some(input.app_domain), + app_url: input.app_url, + app_icon_path: input.app_icon_path, + capabilities: input + .capabilities + .map(|vec| vec.into_iter().map(|c| c.into()).collect()), + } + } +} + +#[derive(GraphQLObject, Default, Debug, Serialize, Deserialize, Clone)] +#[serde(rename_all = "camelCase")] +pub struct Capability { + pub with: Resource, + pub can: Vec, +} + +impl From for Capability { + fn from(input: crate::graphql::graphql_types::CapabilityInput) -> Self { + Self { + with: input.with.into(), + can: input.can, + } + } +} + +#[derive(GraphQLObject, Default, Debug, Serialize, Deserialize, Clone)] +#[serde(rename_all = "camelCase")] +pub struct Resource { + pub domain: String, + pub pointers: Vec, +} + +impl From for Resource { + fn from(input: crate::graphql::graphql_types::ResourceInput) -> Self { + Self { + domain: input.domain, + pointers: input.pointers, + } + } +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct Claims { + iss: String, + aud: String, + exp: u64, + iat: u64, + nonce: String, + pub capabilities: AuthInfo, +} + +impl Claims { + pub fn new( + issuer: String, + audience: String, + expiration_time: u64, + capabilities: AuthInfo, + ) -> Self { + let now = SystemTime::now(); + let unix_timestamp = now + .duration_since(UNIX_EPOCH) + .expect("Time went backwards") + .as_secs(); + + let nonce = uuid::Uuid::new_v4().to_string(); + + Claims { + iss: issuer, + aud: audience, + exp: unix_timestamp + expiration_time, + iat: unix_timestamp, + nonce, + capabilities, + } + } +} diff --git a/rust-executor/src/agent/mod.rs b/rust-executor/src/agent/mod.rs new file mode 100644 index 000000000..e954d02e7 --- /dev/null +++ b/rust-executor/src/agent/mod.rs @@ -0,0 +1,187 @@ + +use deno_core::error::AnyError; +use deno_core::anyhow::anyhow; +use serde::Serialize; + +use crate::types::{Expression, ExpressionProof}; +use crate::wallet::Wallet; + +pub mod capabilities; +pub mod signatures; + +pub fn did_document() -> did_key::Document { + let wallet_instance = Wallet::instance(); + let wallet = wallet_instance.lock().expect("wallet lock"); + let wallet_ref = wallet.as_ref().expect("wallet instance"); + let name = "main".to_string(); + wallet_ref + .get_did_document(&name) + .ok_or(anyhow!("main key not found. call createMainKey() first")) + .unwrap() +} + +pub fn signing_key_id() -> String { + did_document().verification_method[0].id.clone() +} + +pub fn did() -> String { + did_document().id.clone() +} + +pub fn create_signed_expression(data: T) -> Result, AnyError> { + let timestamp = chrono::Utc::now(); + let signature = hex::encode(sign(&signatures::hash_data_and_timestamp(&data, ×tamp))?); + + Ok(Expression { + author: did(), + timestamp: timestamp.to_rfc3339_opts(chrono::SecondsFormat::Millis, true), + data, + proof: ExpressionProof { + signature, + key: signing_key_id(), + }, + }) +} + + +pub fn sign(payload: &[u8]) -> Result, AnyError> { + let wallet_instance = Wallet::instance(); + let wallet = wallet_instance.lock().expect("wallet lock"); + let wallet_ref = wallet.as_ref().expect("wallet instance"); + let name = "main".to_string(); + let signature = wallet_ref + .sign(&name, payload) + .ok_or(anyhow!("main key not found. call createMainKey() first"))?; + Ok(signature) +} + +pub fn sign_string_hex(data: String) -> Result { + let payload_bytes = signatures::hash_message(&data); + let signature = sign(&payload_bytes)?; + let sig_hex = hex::encode(signature); + Ok(sig_hex) +} + +pub struct AgentSignature { + pub signature: String, + pub public_key: String, +} + +impl AgentSignature { + pub fn from_message(message: String) -> Result { + let signature = sign_string_hex(message)?; + Ok(AgentSignature { + signature, + public_key: signing_key_id(), + }) + } +} + +impl Into for AgentSignature { + fn into(self) -> crate::graphql::graphql_types::AgentSignature { + crate::graphql::graphql_types::AgentSignature { + signature: self.signature, + public_key: self.public_key, + } + } +} + + +#[cfg(test)] +mod tests { + use std::collections::BTreeMap; + + use serde_json::json; + + use super::*; + use crate::agent::signatures::verify_string_signed_by_did; + use itertools::Itertools; + use crate::test_utils::setup_wallet; + + + #[test] + fn test_sign_and_verify_string_hex_roundtrip() { + setup_wallet(); + let test_message = "Hello, World!".to_string(); + let signature = sign_string_hex(test_message.clone()).expect("Failed to sign message"); + let did = did(); + + assert!( + verify_string_signed_by_did(&did, &test_message, &signature).expect("Verification failed"), + "Signature verification for sign_string_hex failed" + ); + } + + #[test] + fn test_create_signed_expression() { + setup_wallet(); + let signed_expression = create_signed_expression(json!({"test": "data"})).expect("Failed to create signed expression"); + assert!( + signatures::verify(&signed_expression).expect("Verification failed"), + "Signature verification for create_signed_expression failed" + ); + + let mut broken = signed_expression.clone(); + broken.proof.signature = "broken".to_string(); + + assert!(signatures::verify(&broken).is_err(), "Broken signature verification should fail"); + + let mut changed = signed_expression.clone(); + changed.data = json!({"changed": "data"}); + + assert!( + !signatures::verify(&changed).expect("Verification failed"), + "Signature invalidation for create_signed_expression failed" + ); + } + + + #[test] + fn test_agent_signature_roundtrip() { + setup_wallet(); + let test_message = "Agent signature test".to_string(); + let agent_signature = AgentSignature::from_message(test_message.clone()).expect("Failed to create agent signature"); + let did = did(); + + assert!( + verify_string_signed_by_did(&did, &test_message, &agent_signature.signature).expect("Verification failed"), + "Signature verification for AgentSignature failed" + ); + } + + //#[test] + fn _test_create_signed_expression_and_verify_with_changed_sorting() { + setup_wallet(); + let json_value = json!({"key2": "value1", "key1": "value2"}); + let signed_expression = create_signed_expression(json_value).expect("Failed to create signed expression"); + + // Simulate changing the sorting of the JSON in the signed expression + let mut data_map = BTreeMap::new(); + let sorted_keys = signed_expression.data.as_object().unwrap().keys().sorted(); + for key in sorted_keys { + data_map.insert(key.clone(), signed_expression.data[key].clone()); + } + let sorted_json = json!(data_map); + let mut sorted_expression = signed_expression.clone(); + sorted_expression.data = sorted_json; + + // Verify the expression with changed sorting + assert!( + signatures::verify(&sorted_expression).expect("Verification failed"), + "Signature verification for create_signed_expression with changed sorting should succeed" + ); + } + + #[test] + fn test_create_signed_expression_with_data_string() { + setup_wallet(); + let json_value = serde_json::Value::String(r#"{"key2": "value1", "key1": "value2"}"#.to_string()); + let signed_expression = create_signed_expression(json_value).expect("Failed to create signed expression"); + // Verify the expression with changed sorting + assert!( + signatures::verify(&signed_expression).expect("Verification failed"), + "Signature verification for create_signed_expression with string data should succeed" + ); + } +} + diff --git a/rust-executor/src/agent/signatures.rs b/rust-executor/src/agent/signatures.rs new file mode 100644 index 000000000..a4c6254e8 --- /dev/null +++ b/rust-executor/src/agent/signatures.rs @@ -0,0 +1,65 @@ + +use std::str::FromStr; +use chrono::{DateTime, Utc}; +use chrono::SecondsFormat; +use deno_core::anyhow::anyhow; +use deno_core::error::AnyError; +use serde::Serialize; +use sha2::{Sha256, Digest}; +use crate::types::Expression; +use did_key::{CoreSign, PatchedKeyPair}; +use log::error; + + +pub fn verify_string_signed_by_did(did: &str, data: &str, signed_data: &str) -> Result { + let sig_bytes = hex::decode(signed_data)?; + let message = hash_message(&data.to_string()); + Ok(inner_verify(did, &message, &sig_bytes)) +} + +pub fn verify(expr: &Expression) -> Result { + let sig_bytes = hex::decode(&expr.proof.signature)?; + let timestamp = DateTime::::from_str(&expr.timestamp) + .map_err(|e| anyhow!("Failed to parse timestamp when trying to verify signature: {}", e))?; + let message = hash_data_and_timestamp(&expr.data, ×tamp); + let result = inner_verify(&expr.author, &message, &sig_bytes); + Ok(result) +} + + +pub(super) fn hash_data_and_timestamp(data: &T, timestamp: &DateTime) -> Vec { + let mut hasher = Sha256::new(); + + // Serialize and hash the data directly. + let serialized_data = serde_json::to_vec(data).expect("Failed to serialize data"); + hasher.update(&serialized_data); + + // Serialize and hash the timestamp. + let timestamp_str = timestamp.to_rfc3339_opts(SecondsFormat::Millis, true); + hasher.update(timestamp_str.as_bytes()); + + // Finalize the hash and return the result. + hasher.finalize().as_slice().try_into().expect("Hash should be 32 bytes") +} + +pub(super) fn hash_message(message: &String) -> Vec { + let mut hasher = Sha256::new(); + hasher.update(message.as_bytes()); + hasher.finalize().as_slice().try_into().expect("Hash should be 32 bytes") +} + + +fn inner_verify(did: &str, message: &[u8], signature: &[u8]) -> bool { + if let Ok(key_pair) = PatchedKeyPair::try_from(did) { + match key_pair.verify(message, signature) { + Ok(_) => true, + Err(_) => { + //debug!("Signature verification failed: {:?}", e); + false + } + } + } else { + error!("Failed to parse DID as key method: {}", did); + false + } +} \ No newline at end of file diff --git a/rust-executor/src/config.rs b/rust-executor/src/config.rs index 59283e693..daf100c13 100644 --- a/rust-executor/src/config.rs +++ b/rust-executor/src/config.rs @@ -21,7 +21,8 @@ pub struct Ad4mConfig { pub hc_proxy_url: Option, pub hc_bootstrap_url: Option, pub connect_holochain: Option, - pub admin_credential: Option + pub admin_credential: Option, + pub auto_permit_cap_requests: Option, } impl Ad4mConfig { @@ -57,10 +58,10 @@ impl Ad4mConfig { self.connect_holochain = Some(false); } if self.hc_proxy_url.is_none() { - self.hc_proxy_url = Some("ws://207.148.16.17:42697".to_string()); + self.hc_proxy_url = Some("wss://signal.holo.host".to_string()); } if self.hc_bootstrap_url.is_none() { - self.hc_bootstrap_url = Some("http://207.148.16.17:38245".to_string()); + self.hc_bootstrap_url = Some("https://bootstrap.holo.host/".to_string()); } if self.hc_use_bootstrap.is_none() { self.hc_use_bootstrap = Some(true); @@ -95,7 +96,8 @@ impl Default for Ad4mConfig { hc_proxy_url: None, hc_bootstrap_url: None, connect_holochain: None, - admin_credential: None + admin_credential: None, + auto_permit_cap_requests: None, }; config.prepare(); config diff --git a/rust-executor/src/dapp_server.rs b/rust-executor/src/dapp_server.rs index b034f2789..7837f0229 100644 --- a/rust-executor/src/dapp_server.rs +++ b/rust-executor/src/dapp_server.rs @@ -1,18 +1,27 @@ use std::net::Ipv4Addr; +use std::path::Path; -use rocket::fs::{FileServer, relative}; +use rocket::fs::FileServer; use rocket::Config; +use include_dir::{include_dir, Dir}; -pub(crate) async fn serve_dapp(port: u16) -> Result<(), Box> { +const DAPP: Dir = include_dir!("dapp/dist"); + +pub(crate) async fn serve_dapp(port: u16, app_dir: String) -> Result<(), Box> { let config = Config { port, address: Ipv4Addr::new(127, 0, 0, 1).into(), ..Config::debug_default() }; + let dir = Path::new(&app_dir).join("dapp"); + if !dir.exists() { + DAPP.extract(dir.clone())?; + } + rocket::build() .configure(&config) - .mount("/", FileServer::from(relative!("dapp"))) + .mount("/", FileServer::from(dir.to_str().expect("Failed to convert path to string"))) .launch() .await?; diff --git a/rust-executor/src/db.rs b/rust-executor/src/db.rs new file mode 100644 index 000000000..6310f6ba7 --- /dev/null +++ b/rust-executor/src/db.rs @@ -0,0 +1,665 @@ +use deno_core::anyhow::anyhow; +use deno_core::error::AnyError; +use rusqlite::{params, Connection, OptionalExtension}; +use serde::{Deserialize, Serialize}; +use serde_json::Value as JsonValue; +use crate::types::{Expression, ExpressionProof, Link, LinkExpression, PerspectiveDiff}; +use crate::graphql::graphql_types::{LinkStatus, PerspectiveHandle}; + +#[derive(Serialize, Deserialize)] +struct LinkSchema { + perspective: String, + link_expression: JsonValue, + source: String, + predicate: String, + target: String, + author: String, + timestamp: String, + status: String, +} + +#[derive(Serialize, Deserialize)] +struct ExpressionSchema { + url: String, + data: JsonValue, +} + +pub type Ad4mDbResult = Result; + + +use std::sync::{Arc, Mutex}; + +lazy_static! { + static ref AD4M_DB_INSTANCE: Arc>> = Arc::new(Mutex::new(None)); +} + +pub struct Ad4mDb { + conn: Connection, +} + +impl Ad4mDb { + pub fn init_global_instance(db_path: &str) -> Ad4mDbResult<()> { + let mut db_instance = AD4M_DB_INSTANCE.lock().unwrap(); + *db_instance = Some(Ad4mDb::new(db_path)?); + Ok(()) + } + + pub fn global_instance() -> Arc>> { + AD4M_DB_INSTANCE.clone() + } + + fn new(db_path: &str) -> Ad4mDbResult { + let conn = Connection::open(db_path)?; + + // Create tables if they don't exist + + conn.execute( + "CREATE TABLE IF NOT EXISTS perspective_handle ( + uuid TEXT PRIMARY KEY, + name TEXT, + neighbourhood TEXT, + shared_url TEXT, + state TEXT NOT NULL + )", + [], + )?; + + conn.execute( + "CREATE TABLE IF NOT EXISTS link ( + id INTEGER PRIMARY KEY, + perspective TEXT NOT NULL, + source TEXT NOT NULL, + predicate TEXT NOT NULL, + target TEXT NOT NULL, + author TEXT NOT NULL, + timestamp TEXT NOT NULL, + signature TEXT NOT NULL, + key TEXT NOT NULL, + status TEXT NOT NULL + )", + [], + )?; + + conn.execute( + "CREATE TABLE IF NOT EXISTS expression ( + id INTEGER PRIMARY KEY, + url TEXT NOT NULL UNIQUE, + data TEXT NOT NULL + )", + [], + )?; + + conn.execute( + "CREATE TABLE IF NOT EXISTS perspective_diff ( + id INTEGER PRIMARY KEY, + perspective TEXT NOT NULL, + additions TEXT NOT NULL, + removals TEXT NOT NULL, + is_pending BOOLEAN NOT NULL + )", + [], + )?; + + Ok(Self { conn }) + } + + pub fn add_perspective(&self, perspective: &PerspectiveHandle) -> Ad4mDbResult<()> { + self.conn.execute( + "INSERT INTO perspective_handle (name, uuid, neighbourhood, shared_url, state) + VALUES (?1, ?2, ?3, ?4, ?5)", + params![ + perspective.name, + perspective.uuid, + perspective.neighbourhood.as_ref().map(|n| serde_json::to_string(n).ok()).flatten(), + perspective.shared_url, + serde_json::to_string(&perspective.state)?, + ], + )?; + Ok(()) + } + + pub fn get_perspective(&self, uuid: &str) -> Ad4mDbResult> { + let mut stmt = self.conn.prepare( + "SELECT name, uuid, neighbourhood, shared_url, state FROM perspective_handle WHERE uuid = ?1", + )?; + + let found_perspective = stmt + .query_map([uuid], |row| { + Ok(PerspectiveHandle { + name: row.get(0)?, + uuid: row.get(1)?, + neighbourhood: row.get::>(3)?.map(|n| serde_json::from_str(&n).ok()).flatten(), + shared_url: row.get(4)?, + state: serde_json::from_str(row.get::(5)?.as_str()).expect("Could not deserialize perspective state from DB"), + }) + })? + .map(|p| p.ok()) + .next() + .ok_or(anyhow!("No perspective found with given uuid"))? + .clone(); + + Ok(found_perspective) + } + + pub fn get_all_perspectives(&self) -> Ad4mDbResult> { + let mut stmt = self.conn.prepare( + "SELECT name, uuid, neighbourhood, shared_url, state FROM perspective_handle", + )?; + let perspective_iter = stmt.query_map([], |row| { + Ok(PerspectiveHandle { + name: row.get(0)?, + uuid: row.get(1)?, + neighbourhood: row.get::>(2)?.map(|n| serde_json::from_str(&n).ok()).flatten(), + shared_url: row.get(3)?, + state: serde_json::from_str(row.get::(4)?.as_str()).expect("Could not deserialize perspective state from DB"), + }) + })?; + + let mut perspectives = Vec::new(); + for perspective in perspective_iter { + perspectives.push(perspective?); + } + + Ok(perspectives) + } + + pub fn update_perspective(&self, perspective: &PerspectiveHandle) -> Ad4mDbResult<()> { + self.conn.execute( + "UPDATE perspective_handle SET name = ?1, neighbourhood = ?2, shared_url = ?3, state = ?4 WHERE uuid = ?5", + params![ + perspective.name, + perspective.neighbourhood.as_ref().map(|n| serde_json::to_string(n).ok()).flatten(), + perspective.shared_url, + serde_json::to_string(&perspective.state)?, + perspective.uuid, + ], + )?; + Ok(()) + } + + pub fn remove_perspective(&self, uuid: &str) -> Ad4mDbResult<()> { + self.conn.execute( + "DELETE FROM perspective_handle WHERE uuid = ?1", + [uuid], + )?; + Ok(()) + } + + pub fn add_link(&self, perspective_uuid: &str, link: &LinkExpression, status: &LinkStatus) -> Ad4mDbResult<()> { + self.conn.execute( + "INSERT INTO link (perspective, source, predicate, target, author, timestamp, signature, key, status) + VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9)", + params![ + perspective_uuid, + link.data.source, + link.data.predicate.as_ref().unwrap_or(&"".to_string()), + link.data.target, + link.author, + link.timestamp, + link.proof.signature, + link.proof.key, + serde_json::to_string(status)?, + ], + )?; + Ok(()) + } + + pub fn add_many_links(&self, perspective_uuid: &str, links: Vec, status: &LinkStatus) -> Ad4mDbResult<()> { + for link in links.iter() { + self.conn.execute( + "INSERT INTO link (perspective, source, predicate, target, author, timestamp, signature, key, status) + VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9)", + params![ + perspective_uuid, + link.data.source, + link.data.predicate.as_ref().unwrap_or(&"".to_string()), + link.data.target, + link.author, + link.timestamp, + link.proof.signature, + link.proof.key, + serde_json::to_string(&status)?, + ], + )?; + } + Ok(()) + } + + pub fn update_link(&self, perspective_uuid: &str, old_link: &LinkExpression, new_link: &LinkExpression) -> Ad4mDbResult<()> { + self.conn.execute( + "UPDATE link SET source = ?1, predicate = ?2, target = ?3, author = ?4, timestamp = ?5, signature = ?6, key = ?7 + WHERE perspective = ?8 AND source = ?9 AND predicate = ?10 AND target = ?11 AND author = ?12 AND timestamp = ?13", + params![ + new_link.data.source, + new_link.data.predicate.as_ref().unwrap_or(&"".to_string()), + new_link.data.target, + new_link.author, + new_link.timestamp, + new_link.proof.signature, + new_link.proof.key, + perspective_uuid, + old_link.data.source, + old_link.data.predicate.as_ref().unwrap_or(&"".to_string()), + old_link.data.target, + old_link.author, + old_link.timestamp, + ], + )?; + Ok(()) + } + + pub fn remove_link(&self, perspective_uuid: &str, link: &LinkExpression) -> Ad4mDbResult<()> { + self.conn.execute( + "DELETE FROM link WHERE perspective = ?1 AND source = ?2 AND predicate = ?3 AND target = ?4 AND author = ?5 AND timestamp = ?6", + params![ + perspective_uuid, + link.data.source, + link.data.predicate.as_ref().unwrap_or(&"".to_string()), + link.data.target, + link.author, + link.timestamp, + ], + )?; + Ok(()) + } + + pub fn get_link(&self, perspective_uuid: &str, link: &LinkExpression) -> Ad4mDbResult> { + let mut stmt = self.conn.prepare( + "SELECT perspective, source, predicate, target, author, timestamp, signature, key, status FROM link WHERE perspective = ?1 AND source = ?2 AND predicate = ?3 AND target = ?4 AND author = ?5 AND timestamp = ?6", + )?; + let link_expression: Option<(LinkExpression, LinkStatus)> = stmt.query_row( + params![perspective_uuid, link.data.source, link.data.predicate.as_ref().unwrap_or(&"".to_string()), link.data.target, link.author, link.timestamp], + |row| { + let status: LinkStatus = serde_json::from_str(&row.get::<_, String>(8)?) + .map_err(|e| rusqlite::Error::FromSqlConversionFailure( + 8, + rusqlite::types::Type::Text, + Box::new(e) + ))?; + + let link = LinkExpression { + data: Link { + source: row.get(1)?, + predicate: row.get(2).map(|p: Option| { + match p.as_ref().map(|p| p.as_str()){ + Some("") => None, + _ => p + } + })?, + target: row.get(3)?, + }, + proof: ExpressionProof { + signature: row.get(6)?, + key: row.get(7)?, + }, + author: row.get(4)?, + timestamp: row.get(5)?, + status: Some(status.clone()) + }; + + Ok((link, status)) + } + ).optional()?; + Ok(link_expression) + } + + pub fn get_all_links(&self, perspective_uuid: &str) -> Ad4mDbResult> { + let mut stmt = self.conn.prepare( + "SELECT perspective, source, predicate, target, author, timestamp, signature, key, status FROM link WHERE perspective = ?1", + )?; + let link_iter = stmt.query_map( + params![perspective_uuid], + |row| { + let status: LinkStatus = serde_json::from_str(&row.get::<_, String>(8)?) + .map_err(|e| rusqlite::Error::FromSqlConversionFailure( + 8, + rusqlite::types::Type::Text, + Box::new(e) + ))?; + let link_expression = LinkExpression { + data: Link { + source: row.get(1)?, + predicate: row.get(2)?, + target: row.get(3)?, + }, + proof: ExpressionProof { + signature: row.get(6)?, + key: row.get(7)?, + }, + author: row.get(4)?, + timestamp: row.get(5)?, + status: Some(status.clone()) + }; + Ok((link_expression, status)) + } + )?; + let links: Result, _> = link_iter.collect(); + Ok(links?) + } + + pub fn get_links_by_source(&self, perspective_uuid: &str, source: &str) -> Ad4mDbResult> { + let mut stmt = self.conn.prepare( + "SELECT perspective, source, predicate, target, author, timestamp, signature, key, status FROM link WHERE perspective = ?1 AND source = ?2", + )?; + let link_iter = stmt.query_map( + params![perspective_uuid, source], + |row| { + let status: LinkStatus = serde_json::from_str(&row.get::<_, String>(8)?) + .map_err(|e| rusqlite::Error::FromSqlConversionFailure( + 8, + rusqlite::types::Type::Text, + Box::new(e) + ))?; + let link_expression = LinkExpression { + data: Link { + source: row.get(1)?, + predicate: row.get(2)?, + target: row.get(3)?, + }, + proof: ExpressionProof { + signature: row.get(6)?, + key: row.get(7)?, + }, + author: row.get(4)?, + timestamp: row.get(5)?, + status: Some(status.clone()) + }; + Ok((link_expression, status)) + } + )?; + let links: Result, _> = link_iter.collect(); + Ok(links?) + } + + pub fn get_links_by_target(&self, perspective_uuid: &str, target: &str) -> Ad4mDbResult> { + let mut stmt = self.conn.prepare( + "SELECT perspective, source, predicate, target, author, timestamp, signature, key, status FROM link WHERE perspective = ?1 AND target = ?2", + )?; + let link_iter = stmt.query_map( + params![perspective_uuid, target], + |row| { + let status: LinkStatus = serde_json::from_str(&row.get::<_, String>(8)?) + .map_err(|e| rusqlite::Error::FromSqlConversionFailure( + 8, + rusqlite::types::Type::Text, + Box::new(e) + ))?; + let link_expression = LinkExpression { + data: Link { + source: row.get(1)?, + predicate: row.get(2)?, + target: row.get(3)?, + }, + proof: ExpressionProof { + signature: row.get(6)?, + key: row.get(7)?, + }, + author: row.get(4)?, + timestamp: row.get(5)?, + status: Some(status.clone()) + }; + Ok((link_expression, status)) + } + )?; + let links: Result, _> = link_iter.collect(); + Ok(links?) + } + + pub fn add_pending_diff(&self, perspective_uuid: &str, diff: &PerspectiveDiff) -> Ad4mDbResult<()> { + self.conn.execute( + "INSERT INTO perspective_diff (perspective, additions, removals, is_pending) + VALUES (?1, ?2, ?3, ?4)", + params![ + perspective_uuid, + serde_json::to_string(&diff.additions)?, + serde_json::to_string(&diff.removals)?, + true, + ], + )?; + Ok(()) + } + + pub fn get_pending_diffs(&self, perspective_uuid: &str) -> Ad4mDbResult { + let mut stmt = self.conn.prepare( + "SELECT additions, removals FROM perspective_diff WHERE perspective = ?1 AND is_pending = ?2", + )?; + let diffs_iter = stmt.query_map( + params![perspective_uuid, true], + |row| { + let additions: Vec = serde_json::from_str(&row.get::<_, String>(0).unwrap()).unwrap(); + let removals: Vec = serde_json::from_str(&row.get::<_, String>(1).unwrap()).unwrap(); + Ok(PerspectiveDiff { additions, removals }) + }, + )?; + let mut diffs = Vec::new(); + for diff in diffs_iter { + diffs.push(diff?); + } + // Assuming we want to concatenate all additions and removals from different diffs + let mut all_additions = Vec::new(); + let mut all_removals = Vec::new(); + for diff in diffs { + all_additions.extend(diff.additions); + all_removals.extend(diff.removals); + } + Ok(PerspectiveDiff { + additions: all_additions, + removals: all_removals, + }) + } + + pub fn clear_pending_diffs(&self, perspective_uuid: &str) -> Ad4mDbResult<()> { + self.conn.execute( + "DELETE FROM perspective_diff WHERE perspective = ?1 AND is_pending = ?2", + params![perspective_uuid, true], + )?; + Ok(()) + } + + // Expression Methods + + pub fn add_expression(&self, url: &str, expression: &Expression) -> Ad4mDbResult<()> { + self.conn.execute( + "INSERT INTO expression (url, data) + VALUES (?1, ?2)", + params![ + url, + serde_json::to_string(expression)?, + ], + )?; + Ok(()) + } + + pub fn get_expression(&self, url: &str) -> Ad4mDbResult>> { + let mut stmt = self.conn.prepare( + "SELECT data FROM expression WHERE url = ?1", + )?; + let expression: Option = stmt.query_row( + params![url], + |row| row.get(0), + ).optional()?; + Ok(expression.map(|e| serde_json::from_str(&e).unwrap())) + } + + pub fn with_global_instance(func: F) -> R + where + F: FnOnce(&Ad4mDb) -> R, + { + let global_instance_arc = Ad4mDb::global_instance(); + let lock_result = global_instance_arc.lock(); + let ad4m_db_lock = lock_result.expect("Couldn't get lock on Ad4mDb"); + let ad4m_db_ref = ad4m_db_lock.as_ref().expect("Ad4mDb not initialized"); + func(ad4m_db_ref) + } +} + + + +#[cfg(test)] +mod tests { + use super::*; + use crate::db::Ad4mDb; + use uuid::Uuid; + use fake::{Fake, Faker}; + use chrono::Utc; + use crate::types::{LinkExpression, Link, ExpressionProof}; + + fn construct_dummy_link_expression(status: LinkStatus) -> LinkExpression { + LinkExpression { + data: Link { + source: Faker.fake::(), + target: Faker.fake::(), + predicate: Some(Faker.fake::()), + }, + proof: ExpressionProof { + signature: "signature".to_string(), + key: "key".to_string(), + }, + author: "did:test:key".to_string(), + timestamp: Utc::now().to_rfc3339(), + status: Some(status), + } + } + + #[test] + fn can_store_and_retrieve_links() { + let db = Ad4mDb::new(":memory:").unwrap(); + let p_uuid = Uuid::new_v4().to_string(); + let link = construct_dummy_link_expression(LinkStatus::Shared); + db.add_link(&p_uuid, &link, &LinkStatus::Shared).unwrap(); + + let result: Option<(LinkExpression, LinkStatus)> = db.get_link(&p_uuid, &link).unwrap(); + assert!(result.is_some()); + assert_eq!(result.unwrap(), (link, LinkStatus::Shared)); + } + + #[test] + fn can_store_and_get_link_with_missing_predicate() { + let db = Ad4mDb::new(":memory:").unwrap(); + let p_uuid = Uuid::new_v4().to_string(); + let mut link = construct_dummy_link_expression(LinkStatus::Shared); + link.data.predicate = None; + db.add_link(&p_uuid, &link, &LinkStatus::Shared).unwrap(); + + let result = db.get_link(&p_uuid, &link).unwrap(); + assert_eq!(result, Some((link, LinkStatus::Shared))); + } + + #[test] + fn can_call_get_link_multiple_times() { + let db = Ad4mDb::new(":memory:").unwrap(); + let p_uuid = Uuid::new_v4().to_string(); + let link = construct_dummy_link_expression(LinkStatus::Local); + db.add_link(&p_uuid, &link, &LinkStatus::Local).unwrap(); + + for _ in 0..3 { + let result = db.get_link(&p_uuid, &link).unwrap(); + assert_eq!(result, Some((link.clone(), LinkStatus::Local))); + } + } + + #[test] + fn can_get_all_links() { + let db = Ad4mDb::new(":memory:").unwrap(); + let p_uuid = Uuid::new_v4().to_string(); + let link1 = construct_dummy_link_expression(LinkStatus::Shared); + db.add_link(&p_uuid, &link1, &LinkStatus::Shared).unwrap(); + let link2 = construct_dummy_link_expression(LinkStatus::Local); + db.add_link(&p_uuid, &link2, &LinkStatus::Local).unwrap(); + + let all_links = db.get_all_links(&p_uuid).unwrap(); + assert_eq!(all_links, vec![(link1, LinkStatus::Shared), (link2, LinkStatus::Local)]); + } + + #[test] + fn can_call_get_all_links_multiple_times() { + let db = Ad4mDb::new(":memory:").unwrap(); + let p_uuid = Uuid::new_v4().to_string(); + let link1 = construct_dummy_link_expression(LinkStatus::Shared); + db.add_link(&p_uuid, &link1, &LinkStatus::Shared).unwrap(); + + for _ in 0..3 { + let all_links = db.get_all_links(&p_uuid).unwrap(); + assert_eq!(all_links, vec![(link1.clone(), LinkStatus::Shared)]); + } + } + + #[test] + fn can_get_links_by_source() { + let db = Ad4mDb::new(":memory:").unwrap(); + let p_uuid = Uuid::new_v4().to_string(); + let link1 = construct_dummy_link_expression(LinkStatus::Shared); + db.add_link(&p_uuid, &link1, &LinkStatus::Shared).unwrap(); + let link2 = construct_dummy_link_expression(LinkStatus::Shared); + db.add_link(&p_uuid, &link2, &LinkStatus::Shared).unwrap(); + + let result = db.get_links_by_source(&p_uuid, &link1.data.source).unwrap(); + assert_eq!(result, vec![(link1, LinkStatus::Shared)]); + } + + #[test] + fn can_get_links_by_target() { + let db = Ad4mDb::new(":memory:").unwrap(); + let p_uuid = Uuid::new_v4().to_string(); + let link1 = construct_dummy_link_expression(LinkStatus::Shared); + db.add_link(&p_uuid, &link1, &LinkStatus::Shared).unwrap(); + let link2 = construct_dummy_link_expression(LinkStatus::Shared); + db.add_link(&p_uuid, &link2, &LinkStatus::Shared).unwrap(); + + let result = db.get_links_by_target(&p_uuid, &link1.data.target).unwrap(); + assert_eq!(result, vec![(link1, LinkStatus::Shared)]); + } + + #[test] + fn can_update_link() { + let db = Ad4mDb::new(":memory:").unwrap(); + let p_uuid = Uuid::new_v4().to_string(); + let link1 = construct_dummy_link_expression(LinkStatus::Shared); + db.add_link(&p_uuid, &link1, &LinkStatus::Shared).unwrap(); + let link2 = construct_dummy_link_expression(LinkStatus::Shared); + db.update_link(&p_uuid, &link1, &link2).unwrap(); + + assert!(db.get_link(&p_uuid, &link1).unwrap().is_none()); + let result = db.get_link(&p_uuid, &link2).unwrap(); + assert_eq!(result, Some((link2, LinkStatus::Shared))); + } + + #[test] + fn can_remove_link() { + let db = Ad4mDb::new(":memory:").unwrap(); + let p_uuid = Uuid::new_v4().to_string(); + let link1 = construct_dummy_link_expression(LinkStatus::Shared); + db.add_link(&p_uuid, &link1, &LinkStatus::Shared).unwrap(); + + let result = db.get_link(&p_uuid, &link1).unwrap(); + assert_eq!(result, Some((link1.clone(), LinkStatus::Shared))); + db.remove_link(&p_uuid, &link1).unwrap(); + assert!(db.get_link(&p_uuid, &link1).unwrap().is_none()); + } + + #[test] + fn can_get_and_remove_pending_diffs() { + let db = Ad4mDb::new(":memory:").unwrap(); + let p_uuid = Uuid::new_v4().to_string(); + let addition = construct_dummy_link_expression(LinkStatus::Shared); + let removal = construct_dummy_link_expression(LinkStatus::Shared); + db.add_pending_diff(&p_uuid, &PerspectiveDiff { + additions: vec![addition.clone()], + removals: vec![removal.clone()], + }).unwrap(); + + let get = db.get_pending_diffs(&p_uuid).unwrap(); + assert_eq!(get.additions.len(), 1); + assert_eq!(get.removals.len(), 1); + assert_eq!(get, PerspectiveDiff { + additions: vec![addition], + removals: vec![removal], + }); + + db.clear_pending_diffs(&p_uuid).unwrap(); + let get2 = db.get_pending_diffs(&p_uuid).unwrap(); + assert_eq!(get2.additions.len(), 0); + } +} + + diff --git a/rust-executor/src/globals.rs b/rust-executor/src/globals.rs index 343c515a5..cf77a123f 100644 --- a/rust-executor/src/globals.rs +++ b/rust-executor/src/globals.rs @@ -2,7 +2,7 @@ use lazy_static::lazy_static; lazy_static! { /// The current version of AD4M - pub static ref AD4M_VERSION: String = String::from("0.8.1"); + pub static ref AD4M_VERSION: String = String::from("0.9.0"); } /// Struct representing oldest supported version and indicator if state should be cleared if update is required diff --git a/rust-executor/src/graphql/graphql_types.rs b/rust-executor/src/graphql/graphql_types.rs index bc94ded93..3b95c5b66 100644 --- a/rust-executor/src/graphql/graphql_types.rs +++ b/rust-executor/src/graphql/graphql_types.rs @@ -1,14 +1,19 @@ -use juniper::{ +use crate::agent::capabilities::{AuthInfo, Capability}; +use crate::agent::signatures::verify; +use crate::js_core::JsCoreHandle; +use crate::types::{DecoratedExpressionProof, DecoratedLinkExpression, Expression, ExpressionProof, Link}; +use coasys_juniper::{ FieldError, FieldResult, GraphQLEnum, GraphQLInputObject, GraphQLObject, GraphQLScalar, }; +use deno_core::anyhow::anyhow; +use deno_core::error::AnyError; use serde::{de::DeserializeOwned, Deserialize, Serialize}; -use crate::js_core::JsCoreHandle; - #[derive(Clone)] pub struct RequestContext { - pub capability: String, + pub capabilities: Result, String>, pub js_handle: JsCoreHandle, + pub auto_permit_cap_requests: bool, } #[derive(GraphQLObject, Default, Debug, Deserialize, Serialize, Clone)] @@ -46,16 +51,6 @@ pub struct Apps { pub token: String, } -#[derive(GraphQLObject, Default, Debug, Deserialize, Serialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct AuthInfo { - pub app_desc: String, - pub app_icon_path: Option, - pub app_name: String, - pub app_url: String, - pub capabilities: Vec, -} - #[derive(GraphQLInputObject, Default, Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct AuthInfoInput { @@ -73,13 +68,6 @@ pub struct AuthInfoInput { pub capabilities: Option>, } -#[derive(GraphQLObject, Default, Debug, Serialize, Deserialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct Capability { - pub can: Vec, - pub with: Resource, -} - #[derive(GraphQLInputObject, Default, Debug, Deserialize, Serialize, Clone)] #[serde(rename_all = "camelCase")] pub struct CapabilityInput { @@ -93,6 +81,18 @@ pub struct CapabilityInput { // The javascript `Date` as string. pub struct represents date and time as the ISO Date string. pub struct DateTime(chrono::DateTime); +impl Into> for DateTime { + fn into(self) -> chrono::DateTime { + self.0 + } +} + +impl From> for DateTime { + fn from(date: chrono::DateTime) -> Self { + DateTime(date) + } +} + #[derive(GraphQLObject, Default, Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct EntanglementProof { @@ -133,16 +133,16 @@ pub struct ExceptionInfo { pub addon: Option, pub message: String, pub title: String, - pub r#type: f64, + pub r#type: ExceptionType, } -#[derive(GraphQLObject, Default, Debug, Deserialize, Serialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct ExpressionProof { - pub invalid: Option, - pub key: Option, - pub signature: Option, - pub valid: Option, +#[derive(GraphQLEnum, Default, Debug, Clone, Copy, Serialize, Deserialize)] +pub enum ExceptionType { + LanguageIsNotLoaded = 0, + ExpressionIsNotVerified = 1, + AgentIsUntrusted = 2, + #[default] + CapabilityRequested = 3, } #[derive(GraphQLInputObject, Default, Debug, Deserialize, Serialize, Clone)] @@ -161,7 +161,7 @@ pub struct ExpressionRendered { pub data: String, pub icon: Icon, pub language: LanguageRef, - pub proof: ExpressionProof, + pub proof: DecoratedExpressionProof, pub timestamp: String, } @@ -234,16 +234,14 @@ pub struct LanguageRef { pub name: String, } -#[derive(GraphQLObject, Default, Debug, Deserialize, Serialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct Link { - pub predicate: Option, - pub source: String, - pub target: String, +#[derive(Debug, Deserialize, Serialize, Clone)] +pub struct Language { + pub name: String, } -#[derive(GraphQLEnum, Debug, Deserialize, Serialize, Clone)] +#[derive(GraphQLEnum, Debug, Default, Deserialize, Serialize, Clone, PartialEq)] pub enum LinkStatus { + #[default] #[serde(rename = "shared")] Shared, #[serde(rename = "local")] @@ -260,16 +258,6 @@ impl std::fmt::Display for LinkStatus { } } -#[derive(GraphQLObject, Default, Debug, Deserialize, Serialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct LinkExpression { - pub author: String, - pub data: Link, - pub proof: ExpressionProof, - pub timestamp: String, - pub status: Option, -} - #[derive(GraphQLInputObject, Default, Debug, Deserialize, Serialize, Clone)] #[serde(rename_all = "camelCase")] pub struct LinkExpressionInput { @@ -280,18 +268,12 @@ pub struct LinkExpressionInput { pub status: Option, } -#[derive(GraphQLObject, Default, Debug, Deserialize, Serialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct LinkExpressionMutations { - pub additions: Vec, - pub removals: Vec, -} #[derive(GraphQLObject, Default, Debug, Deserialize, Serialize, Clone)] #[serde(rename_all = "camelCase")] pub struct LinkExpressionUpdated { - pub new_link: LinkExpression, - pub old_link: LinkExpression, + pub new_link: DecoratedLinkExpression, + pub old_link: DecoratedLinkExpression, } #[derive(GraphQLInputObject, Default, Debug, Deserialize, Serialize, Clone)] @@ -302,24 +284,32 @@ pub struct LinkInput { pub target: String, } -#[derive(GraphQLInputObject, Default, Debug, Deserialize, Serialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct LinkMutations { - pub additions: Vec, - pub removals: Vec, -} - #[derive(GraphQLInputObject, Default, Debug, Deserialize, Serialize, Clone)] #[serde(rename_all = "camelCase")] pub struct LinkQuery { pub from_date: Option, - pub limit: Option, + pub limit: Option, pub predicate: Option, pub source: Option, pub target: Option, pub until_date: Option, } +#[derive(GraphQLInputObject, Default, Debug, Deserialize, Serialize, Clone)] +#[serde(rename_all = "camelCase")] +pub struct LinkMutations { + pub additions: Vec, + pub removals: Vec, +} + +#[derive(GraphQLObject, Default, Debug, Deserialize, Serialize, Clone)] +#[serde(rename_all = "camelCase")] +pub struct DecoratedPerspectiveDiff { + pub additions: Vec, + pub removals: Vec, +} + + #[derive(GraphQLObject, Default, Debug, Deserialize, Serialize, Clone)] #[serde(rename_all = "camelCase")] pub struct Neighbourhood { @@ -329,10 +319,10 @@ pub struct Neighbourhood { #[derive(GraphQLObject, Default, Debug, Deserialize, Serialize, Clone)] #[serde(rename_all = "camelCase")] -pub struct NeighbourhoodExpression { +pub struct DecoratedNeighbourhoodExpression { pub author: String, pub data: Neighbourhood, - pub proof: ExpressionProof, + pub proof: DecoratedExpressionProof, pub timestamp: String, } @@ -346,26 +336,149 @@ pub struct OnlineAgent { #[derive(GraphQLObject, Default, Debug, Deserialize, Serialize, Clone)] #[serde(rename_all = "camelCase")] pub struct Perspective { - pub links: Vec, + pub links: Vec, } +impl Perspective { + pub fn verify_link_signatures(&mut self) { + for link in &mut self.links { + link.verify_signature(); + } + } +} + +impl From for Perspective { + fn from(input: PerspectiveInput) -> Self { + let links = input.links + .into_iter() + .map(|link: LinkExpressionInput| DecoratedLinkExpression::try_from(link)) + .filter_map(Result::ok) + .collect(); + Perspective { links } + } +} + +impl TryFrom for DecoratedLinkExpression { + type Error = AnyError; + fn try_from(input: LinkExpressionInput) -> Result { + let data = Link { + predicate: input.data.predicate, + source: input.data.source, + target: input.data.target, + }; + Ok(DecoratedLinkExpression { + author: input.author, + timestamp: input.timestamp, + data: data, + proof: DecoratedExpressionProof { + key: input.proof.key.ok_or(anyhow!("Key is required"))?, + signature: input.proof.signature.ok_or(anyhow!("Key is required"))?, + valid: input.proof.valid, + invalid: input.proof.invalid, + }, + status: input.status, + }) + } +} + + #[derive(GraphQLObject, Default, Debug, Deserialize, Serialize, Clone)] #[serde(rename_all = "camelCase")] pub struct PerspectiveExpression { pub author: String, pub data: Perspective, - pub proof: ExpressionProof, + pub proof: DecoratedExpressionProof, pub timestamp: String, } +impl From> for PerspectiveExpression { + fn from(expr: Expression) -> Self { + PerspectiveExpression { + author: expr.author, + data: expr.data, + proof: DecoratedExpressionProof { + key: expr.proof.key, + signature: expr.proof.signature, + valid: None, + invalid: None, + }, + timestamp: expr.timestamp, + } + } +} + +impl PerspectiveExpression { + pub fn verify_signatures(&mut self) { + self.data.verify_link_signatures(); + + let perspective_expression = Expression:: { + author: self.author.clone(), + data: self.data.clone(), + proof: ExpressionProof { + key: self.proof.key.clone(), + signature: self.proof.signature.clone(), + }, + timestamp: self.timestamp.clone(), + }; + + let valid = match verify(&perspective_expression) { + Ok(valid) => valid, + Err(_) => false, + }; + + self.proof.valid = Some(valid); + self.proof.invalid = Some(!valid); + } +} + +#[derive(GraphQLEnum, Serialize, Deserialize, Debug, Default, Clone, PartialEq)] +pub enum PerspectiveState { + #[default] + Private, + NeighbourhoodCreationInitiated, + NeighbourhoodJoinInitiated, + LinkLanguageFailedToInstall, + LinkLanguageInstalledButNotSynced, + Synced, +} + #[derive(GraphQLObject, Default, Debug, Deserialize, Serialize, Clone)] #[serde(rename_all = "camelCase")] pub struct PerspectiveHandle { + pub uuid: String, pub name: Option, - pub neighbourhood: Option, + pub neighbourhood: Option, pub shared_url: Option, - pub state: String, - pub uuid: String, + pub state: PerspectiveState, +} + + +impl PerspectiveHandle { + pub fn new( + uuid: String, + name: Option, + neighbourhood: Option, + shared_url: Option, + state: PerspectiveState, + ) -> Self { + PerspectiveHandle { + name, + uuid, + neighbourhood, + shared_url, + state, + } + } + + pub fn new_from_name(name: String) -> Self { + PerspectiveHandle { + uuid: uuid::Uuid::new_v4().to_string(), + name: Some(name), + neighbourhood: None, + shared_url: None, + state: PerspectiveState::Private, + } + } } #[derive(GraphQLInputObject, Default, Debug, Deserialize, Serialize, Clone)] @@ -418,22 +531,22 @@ pub struct NeighbourhoodSignalFilter { #[derive(Default, Debug, Deserialize, Serialize)] pub struct PerspectiveLinkFilter { pub perspective: PerspectiveHandle, - pub link: LinkExpression, + pub link: DecoratedLinkExpression, } #[derive(Default, Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct PerspectiveLinkUpdatedFilter { - pub new_link: LinkExpression, - pub old_link: LinkExpression, + pub new_link: DecoratedLinkExpression, + pub old_link: DecoratedLinkExpression, pub perspective: PerspectiveHandle, } #[derive(GraphQLObject, Default, Debug, Deserialize, Serialize, Clone)] #[serde(rename_all = "camelCase")] pub struct LinkUpdated { - pub new_link: LinkExpression, - pub old_link: LinkExpression, + pub new_link: DecoratedLinkExpression, + pub old_link: DecoratedLinkExpression, } #[derive(Default, Debug, Deserialize, Serialize)] @@ -506,7 +619,7 @@ impl GetFilter for NeighbourhoodSignalFilter { // Implement the trait for the `PerspectiveLinkFilter` struct impl GetValue for PerspectiveLinkFilter { - type Value = LinkExpression; + type Value = DecoratedLinkExpression; fn get_value(&self) -> Self::Value { self.link.clone() diff --git a/rust-executor/src/graphql/mod.rs b/rust-executor/src/graphql/mod.rs index 7611a7335..e39737c5f 100644 --- a/rust-executor/src/graphql/mod.rs +++ b/rust-executor/src/graphql/mod.rs @@ -2,7 +2,6 @@ pub mod graphql_types; mod mutation_resolvers; mod query_resolvers; mod subscription_resolvers; -mod utils; use graphql_types::RequestContext; use mutation_resolvers::*; @@ -10,6 +9,8 @@ use query_resolvers::*; use subscription_resolvers::*; use crate::js_core::JsCoreHandle; +use crate::Ad4mConfig; +use crate::agent::capabilities::capabilities_from_token; use std::collections::HashMap; use std::sync::Arc; @@ -17,13 +18,13 @@ use std::{convert::Infallible, io::Write}; use deno_core::error::AnyError; use futures::FutureExt as _; -use juniper::{InputValue, RootNode}; -use juniper_graphql_transport_ws::ConnectionConfig; -use juniper_warp::{playground_filter, subscriptions::serve_graphql_transport_ws}; +use coasys_juniper::{InputValue, RootNode}; +use coasys_juniper_graphql_transport_ws::ConnectionConfig; +use coasys_juniper_warp::{playground_filter, subscriptions::serve_graphql_transport_ws}; use warp::{http::Response, Filter}; use std::path::Path; -impl juniper::Context for RequestContext {} +impl coasys_juniper::Context for RequestContext {} type Schema = RootNode<'static, Query, Mutation, Subscription>; @@ -31,8 +32,11 @@ fn schema() -> Schema { Schema::new(Query, Mutation, Subscription) } -pub async fn start_server(js_core_handle: JsCoreHandle, port: u16, app_data_path: String) -> Result<(), AnyError> { +pub async fn start_server(js_core_handle: JsCoreHandle, config: Ad4mConfig) -> Result<(), AnyError> { + let port = config.gql_port.expect("Did not get gql port"); + let app_data_path = config.app_data_path.expect("Did not get app data path"); let log = warp::log("warp::server"); + let admin_credential = config.admin_credential.clone(); let mut file = std::fs::File::create( Path::new(&app_data_path).join("schema.gql") @@ -57,27 +61,32 @@ pub async fn start_server(js_core_handle: JsCoreHandle, port: u16, app_data_path .and(warp::header::("authorization")) .or(default_auth) .unify() - .map(move |header| { + .map(move |auth_header| { //println!("Request body: {}", std::str::from_utf8(body_data::bytes()).expect("error converting bytes to &str")); + let capabilities = capabilities_from_token(auth_header, admin_credential.clone()); RequestContext { - capability: header, + capabilities, js_handle: js_core_handle_cloned1.clone(), + auto_permit_cap_requests: config.auto_permit_cap_requests.clone().unwrap_or(false), } }); - let qm_graphql_filter = juniper_warp::make_graphql_filter(qm_schema, qm_state.boxed()); + let qm_graphql_filter = coasys_juniper_warp::make_graphql_filter(qm_schema, qm_state.boxed()); let root_node = Arc::new(schema()); + let admin_credential_arc = Arc::new(config.admin_credential.clone()); let routes = (warp::path("graphql") .and(warp::ws()) .map(move |ws: warp::ws::Ws| { let root_node = root_node.clone(); let js_core_handle = js_core_handle.clone(); + let admin_credential_arc = admin_credential_arc.clone(); + let auto_permit_cap_requests = config.auto_permit_cap_requests.clone().unwrap_or(false); ws.on_upgrade(move |websocket| async move { serve_graphql_transport_ws( websocket, root_node, - |val: HashMap| async move { + move |val: HashMap| async move { let mut auth_header = String::from(""); if let Some(headers) = val.get("headers") { @@ -90,9 +99,12 @@ pub async fn start_server(js_core_handle: JsCoreHandle, port: u16, app_data_path } }; + let capabilities = capabilities_from_token(auth_header, admin_credential_arc.as_ref().clone()); + let context = RequestContext { - capability: auth_header, + capabilities, js_handle: js_core_handle.clone(), + auto_permit_cap_requests: auto_permit_cap_requests }; Ok(ConnectionConfig::new(context)) as Result, Infallible> diff --git a/rust-executor/src/graphql/mutation_resolvers.rs b/rust-executor/src/graphql/mutation_resolvers.rs index e19f710ba..0777fa80d 100644 --- a/rust-executor/src/graphql/mutation_resolvers.rs +++ b/rust-executor/src/graphql/mutation_resolvers.rs @@ -1,13 +1,29 @@ -#![allow(non_snake_case)] -use juniper::{graphql_object, graphql_value, FieldResult}; -use log::debug; +use crate::{agent::create_signed_expression, neighbourhoods::{self, install_neighbourhood}, perspectives::{add_perspective, get_perspective, perspective_instance::{PerspectiveInstance, SdnaType}, remove_perspective, update_perspective}, types::{DecoratedLinkExpression, Link, LinkExpression}}; +use coasys_juniper::{graphql_object, graphql_value, FieldResult, FieldError}; use super::graphql_types::*; -use super::utils::get_capabilies; -use super::RequestContext; -use ad4m_client::literal::Literal; +use crate::{agent::{self, capabilities::*}, holochain_service::{agent_infos_from_str, get_holochain_service}}; pub struct Mutation; +fn get_perspective_with_uuid_field_error(uuid: &String) -> FieldResult { + get_perspective(uuid).ok_or_else(|| FieldError::new( + "Perspective not found", + graphql_value!({ "uuid": uuid.clone() }), + )) +} + +fn link_status_from_input(status: Option) -> Result { + match status.as_ref().map(|s| s.as_str()) { + Some("shared") => Ok(LinkStatus::Shared), + Some("local") => Ok(LinkStatus::Local), + None => Ok(LinkStatus::Shared), + _ => Err(FieldError::new( + "Invalid status, must be either 'shared' or 'local'", + graphql_value!({ "invalid_status": status }), + )), + } +} + #[graphql_object(context = RequestContext)] impl Mutation { async fn add_trusted_agents( @@ -15,14 +31,16 @@ impl Mutation { context: &RequestContext, agents: Vec, ) -> FieldResult> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability( + &context.capabilities, + &RUNTIME_TRUSTED_AGENTS_CREATE_CAPABILITY, + )?; let mut js = context.js_handle.clone(); let script = format!( r#"JSON.stringify( - await core.callResolver("Mutation", "addTrustedAgents", {{ agents: {:?} }}, {{ capabilities: {} }}) + await core.callResolver("Mutation", "addTrustedAgents", {{ agents: {:?} }}) )"#, - agents, capabilities + agents ); let result = js.execute(script).await?; let result: JsResultType> = serde_json::from_str(&result)?; @@ -34,15 +52,13 @@ impl Mutation { context: &RequestContext, proofs: Vec, ) -> FieldResult> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + //TODO: capability missing for this function let mut js = context.js_handle.clone(); let script = format!( r#"JSON.stringify( - await core.callResolver("Mutation", "agentAddEntanglementProofs", {{ proofs: {} }}, {{ capabilities: {} }}) + await core.callResolver("Mutation", "agentAddEntanglementProofs", {{ proofs: {} }}) )"#, serde_json::to_string(&proofs).unwrap(), - capabilities ); let result = js.execute(script).await?; let result: JsResultType> = serde_json::from_str(&result)?; @@ -54,15 +70,13 @@ impl Mutation { context: &RequestContext, proofs: Vec, ) -> FieldResult> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + //TODO: capability missing for this function let mut js = context.js_handle.clone(); let script = format!( r#"JSON.stringify( - await core.callResolver("Mutation", "agentDeleteEntanglementProofs", {{ proofs: {} }}, {{ capabilities: {} }}) + await core.callResolver("Mutation", "agentDeleteEntanglementProofs", {{ proofs: {} }}) )"#, serde_json::to_string(&proofs).unwrap(), - capabilities ); let result = js.execute(script).await?; let result: JsResultType> = serde_json::from_str(&result)?; @@ -75,14 +89,13 @@ impl Mutation { device_key: String, device_key_type: String, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + //TODO: capability missing for this function let mut js = context.js_handle.clone(); let script = format!( r#"JSON.stringify( - await core.callResolver("Mutation", "agentEntanglementProofPreFlight", {{ deviceKey: "{}", deviceKeyType: "{}" }}, {{ capabilities: {} }}) + await core.callResolver("Mutation", "agentEntanglementProofPreFlight", {{ deviceKey: "{}", deviceKeyType: "{}" }}) )"#, - device_key, device_key_type, capabilities + device_key, device_key_type ); let result = js.execute(script).await?; let result: JsResultType = serde_json::from_str(&result)?; @@ -94,99 +107,45 @@ impl Mutation { context: &RequestContext, passphrase: String, ) -> FieldResult { - debug!("Agent generate raw cap: {}", context.capability.clone()); - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability(&context.capabilities, &AGENT_CREATE_CAPABILITY)?; let mut js = context.js_handle.clone(); let script = format!( r#"JSON.stringify( - await core.callResolver("Mutation", "agentGenerate", {{ passphrase: "{}" }}, {{ capabilities: {} }}) + await core.callResolver("Mutation", "agentGenerate", {{ passphrase: "{}" }}) )"#, - passphrase, capabilities + passphrase ); let result = js.execute(script).await?; let result: JsResultType = serde_json::from_str(&result)?; result.get_graphql_result() } - async fn agent_generate_jwt( - &self, - context: &RequestContext, - rand: String, - request_id: String, - ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let script = format!( - r#"JSON.stringify( - await core.callResolver("Mutation", "agentGenerateJwt", {{ rand: "{}", requestId: "{}" }}, {{ capabilities: {} }}) - )"#, - rand, request_id, capabilities - ); - debug!("agent_generate_jwt script: {}", script); - let result = js.execute(script).await?; - debug!("agent_generate_jwt result: {}", result); - let result: JsResultType = serde_json::from_str(&result)?; - result.get_graphql_result() - } - async fn agent_lock( &self, context: &RequestContext, passphrase: String, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability(&context.capabilities, &AGENT_LOCK_CAPABILITY)?; let mut js = context.js_handle.clone(); let script = format!( r#"JSON.stringify( - await core.callResolver("Mutation", "agentLock", {{ passphrase: "{}" }}, {{ capabilities: {} }}) + await core.callResolver("Mutation", "agentLock", {{ passphrase: "{}" }}) )"#, - passphrase, capabilities + passphrase ); let result = js.execute(script).await?; let result: JsResultType = serde_json::from_str(&result)?; result.get_graphql_result() } - //NOTE: all the functions from here on out have not been tested by calling the cli <-> rust graphql server - async fn agent_permit_capability( - &self, - context: &RequestContext, - auth: String, - ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let script = format!( - r#"JSON.stringify( - await core.callResolver("Mutation", "agentPermitCapability", {{ auth: JSON.stringify({}) }}, {{ capabilities: {} }}) - )"#, - auth, capabilities - ); - let result = js.execute(script).await?; - let result: JsResultType = serde_json::from_str(&result)?; - result.get_graphql_result() - } - async fn agent_remove_app( &self, context: &RequestContext, request_id: String, ) -> FieldResult> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let script = format!( - r#"JSON.stringify( - await core.callResolver("Mutation", "agentRemoveApp", {{ requestId: "{}" }}, {{ capabilities: {} }}) - )"#, - request_id, capabilities - ); - let result = js.execute(script).await?; - let result: JsResultType> = serde_json::from_str(&result)?; - result.get_graphql_result() + check_capability(&context.capabilities, &AGENT_UPDATE_CAPABILITY)?; + apps_map::remove_app(&request_id)?; + Ok(apps_map::get_apps()) } async fn agent_request_capability( @@ -194,19 +153,45 @@ impl Mutation { context: &RequestContext, auth_info: AuthInfoInput, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let auth_info_json = serde_json::to_string(&auth_info)?; - let script = format!( - r#"JSON.stringify( - await core.callResolver("Mutation", "agentRequestCapability", {{ authInfo: {} }}, {{ capabilities: {} }}) - )"#, - auth_info_json, capabilities - ); - let result = js.execute(script).await?; - let result: JsResultType = serde_json::from_str(&result)?; - result.get_graphql_result() + check_capability(&context.capabilities, &AGENT_AUTH_CAPABILITY)?; + let auth_info: AuthInfo = auth_info.into(); + let request_id = agent::capabilities::request_capability(auth_info.clone()).await; + if true == context.auto_permit_cap_requests { + println!("======================================"); + println!("Got capability request: \n{:?}", auth_info); + let random_number_challenge = agent::capabilities::permit_capability(AuthInfoExtended { + request_id: request_id.clone(), + auth: auth_info + })?; + println!("--------------------------------------"); + println!("Random number challenge: {}", random_number_challenge); + println!("======================================"); + } + + Ok(request_id) + } + + //NOTE: all the functions from here on out have not been tested by calling the cli <-> rust graphql server + async fn agent_permit_capability( + &self, + context: &RequestContext, + auth: String, + ) -> FieldResult { + check_capability(&context.capabilities, &AGENT_PERMIT_CAPABILITY)?; + let auth: AuthInfoExtended = serde_json::from_str(&auth)?; + let random_number_challenge = agent::capabilities::permit_capability(auth)?; + Ok(random_number_challenge) + } + + async fn agent_generate_jwt( + &self, + context: &RequestContext, + rand: String, + request_id: String, + ) -> FieldResult { + check_capability(&context.capabilities, &AGENT_AUTH_CAPABILITY)?; + let cap_token = agent::capabilities::generate_capability_token(request_id, rand).await?; + Ok(cap_token) } async fn agent_revoke_token( @@ -214,18 +199,9 @@ impl Mutation { context: &RequestContext, request_id: String, ) -> FieldResult> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let script = format!( - r#"JSON.stringify( - await core.callResolver("Mutation", "agentRevokeToken", {{ requestId: "{}" }}, {{ capabilities: {} }}) - )"#, - request_id, capabilities - ); - let result = js.execute(script).await?; - let result: JsResultType> = serde_json::from_str(&result)?; - result.get_graphql_result() + check_capability(&context.capabilities, &AGENT_UPDATE_CAPABILITY)?; + apps_map::revoke_app(&request_id)?; + Ok(apps_map::get_apps()) } async fn agent_sign_message( @@ -233,34 +209,23 @@ impl Mutation { context: &RequestContext, message: String, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let script = format!( - r#"JSON.stringify( - await core.callResolver("Mutation", "agentSignMessage", {{ message: "{}" }}, {{ capabilities: {} }}) - )"#, - message, capabilities - ); - let result = js.execute(script).await?; - let result: JsResultType = serde_json::from_str(&result)?; - result.get_graphql_result() + check_capability(&context.capabilities, &AGENT_SIGN_CAPABILITY)?; + Ok(agent::AgentSignature::from_message(message)?.into()) } async fn agent_unlock( &self, context: &RequestContext, passphrase: String, - holochain: bool + holochain: bool, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability(&context.capabilities, &AGENT_SIGN_CAPABILITY)?; let mut js = context.js_handle.clone(); let script = format!( r#"JSON.stringify( - await core.callResolver("Mutation", "agentUnlock", {{ passphrase: "{}", holochain: "{}" }}, {{ capabilities: {} }}) + await core.callResolver("Mutation", "agentUnlock", {{ passphrase: "{}", holochain: "{}" }}) )"#, - passphrase, holochain, capabilities + passphrase, holochain ); let result = js.execute(script).await?; let result: JsResultType = serde_json::from_str(&result)?; @@ -272,14 +237,13 @@ impl Mutation { context: &RequestContext, direct_message_language: String, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability(&context.capabilities, &AGENT_UPDATE_CAPABILITY)?; let mut js = context.js_handle.clone(); let script = format!( r#"JSON.stringify( - await core.callResolver("Mutation", "agentUpdateDirectMessageLanguage", {{ directMessageLanguage: "{}" }}, {{ capabilities: {} }}) + await core.callResolver("Mutation", "agentUpdateDirectMessageLanguage", {{ directMessageLanguage: "{}" }}) )"#, - direct_message_language, capabilities + direct_message_language ); let result = js.execute(script).await?; let result: JsResultType = serde_json::from_str(&result)?; @@ -291,15 +255,14 @@ impl Mutation { context: &RequestContext, perspective: PerspectiveInput, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability(&context.capabilities, &AGENT_UPDATE_CAPABILITY)?; let mut js = context.js_handle.clone(); let perspective_json = serde_json::to_string(&perspective)?; let script = format!( r#"JSON.stringify( - await core.callResolver("Mutation", "agentUpdatePublicPerspective", {{ perspective: {} }}, {{ capabilities: {} }}) + await core.callResolver("Mutation", "agentUpdatePublicPerspective", {{ perspective: {} }}) )"#, - perspective_json, capabilities + perspective_json ); let result = js.execute(script).await?; let result: JsResultType = serde_json::from_str(&result)?; @@ -311,15 +274,17 @@ impl Mutation { context: &RequestContext, agents: Vec, ) -> FieldResult> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability( + &context.capabilities, + &RUNTIME_TRUSTED_AGENTS_DELETE_CAPABILITY, + )?; let mut js = context.js_handle.clone(); let agents_json = serde_json::to_string(&agents)?; let script = format!( r#"JSON.stringify( - await core.callResolver("Mutation", "deleteTrustedAgents", {{ agents: {} }}, {{ capabilities: {} }}) + await core.callResolver("Mutation", "deleteTrustedAgents", {{ agents: {} }}) )"#, - agents_json, capabilities + agents_json ); let result = js.execute(script).await?; let result: JsResultType> = serde_json::from_str(&result)?; @@ -332,14 +297,13 @@ impl Mutation { content: String, language_address: String, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability(&context.capabilities, &EXPRESSION_CREATE_CAPABILITY)?; let mut js = context.js_handle.clone(); let script = format!( r#"JSON.stringify( - await core.callResolver("Mutation", "expressionCreate", {{ content: {}, languageAddress: "{}" }}, {{ capabilities: {} }}) + await core.callResolver("Mutation", "expressionCreate", {{ content: {}, languageAddress: "{}" }}) )"#, - content, language_address, capabilities + content, language_address ); let result = js.execute(script).await?; let result: JsResultType = serde_json::from_str(&result)?; @@ -352,8 +316,7 @@ impl Mutation { interaction_call: InteractionCall, url: String, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability(&context.capabilities, &EXPRESSION_UPDATE_CAPABILITY)?; let mut js = context.js_handle.clone(); let interaction_call_json = serde_json::to_string(&interaction_call)?; let script = format!( @@ -362,9 +325,8 @@ impl Mutation { "Mutation", "expressionInteract", {{ interactionCall: {}, url: "{}" }}, - {{ capabilities: {} }} ))"#, - interaction_call_json, url, capabilities + interaction_call_json, url ); let result = js.execute(script).await?; let result: JsResultType = serde_json::from_str(&result)?; @@ -377,8 +339,7 @@ impl Mutation { source_language_hash: String, template_data: String, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability(&context.capabilities, &LANGUAGE_CREATE_CAPABILITY)?; let mut js = context.js_handle.clone(); let script = format!( r#"JSON.stringify( @@ -386,9 +347,8 @@ impl Mutation { "Mutation", "languageApplyTemplateAndPublish", {{ sourceLanguageHash: "{}", templateData: JSON.stringify({}) }}, - {{ capabilities: {} }} ))"#, - source_language_hash, template_data, capabilities + source_language_hash, template_data ); let result = js.execute(script).await?; let result: JsResultType = serde_json::from_str(&result)?; @@ -401,8 +361,7 @@ impl Mutation { language_meta: LanguageMetaInput, language_path: String, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability(&context.capabilities, &LANGUAGE_CREATE_CAPABILITY)?; let mut js = context.js_handle.clone(); let language_meta_json = serde_json::to_string(&language_meta)?; let script = format!( @@ -411,9 +370,8 @@ impl Mutation { "Mutation", "languagePublish", {{ languageMeta: {}, languagePath: "{}" }}, - {{ capabilities: {} }} ))"#, - language_meta_json, language_path, capabilities + language_meta_json, language_path ); let result = js.execute(script).await?; let result: JsResultType = serde_json::from_str(&result)?; @@ -425,8 +383,7 @@ impl Mutation { context: &RequestContext, address: String, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability(&context.capabilities, &LANGUAGE_DELETE_CAPABILITY)?; let mut js = context.js_handle.clone(); let script = format!( r#"JSON.stringify( @@ -434,9 +391,8 @@ impl Mutation { "Mutation", "languageRemove", {{ address: "{}" }}, - {{ capabilities: {} }} ))"#, - address, capabilities + address ); let result = js.execute(script).await?; let result: JsResultType = serde_json::from_str(&result)?; @@ -449,8 +405,7 @@ impl Mutation { language_address: String, settings: String, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability(&context.capabilities, &LANGUAGE_UPDATE_CAPABILITY)?; let mut js = context.js_handle.clone(); let script = format!( r#"JSON.stringify( @@ -458,9 +413,8 @@ impl Mutation { "Mutation", "languageWriteSettings", {{ languageAddress: "{}", settings: "{}" }}, - {{ capabilities: {} }} ))"#, - language_address, settings, capabilities + language_address, settings ); let result = js.execute(script).await?; let result: JsResultType = serde_json::from_str(&result)?; @@ -472,22 +426,8 @@ impl Mutation { context: &RequestContext, url: String, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let script = format!( - r#"JSON.stringify( - await core.callResolver( - "Mutation", - "neighbourhoodJoinFromUrl", - {{ url: "{}" }}, - {{ capabilities: {} }} - ))"#, - url, capabilities - ); - let result = js.execute(script).await?; - let result: JsResultType = serde_json::from_str(&result)?; - result.get_graphql_result() + check_capability(&context.capabilities, &NEIGHBOURHOOD_READ_CAPABILITY)?; + Ok(install_neighbourhood(url).await?) } async fn neighbourhood_publish_from_perspective( @@ -495,177 +435,160 @@ impl Mutation { context: &RequestContext, link_language: String, meta: PerspectiveInput, + #[allow(non_snake_case)] perspectiveUUID: String, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let meta_json = serde_json::to_string(&meta)?; - let script = format!( - r#"JSON.stringify( - await core.callResolver( - "Mutation", - "neighbourhoodPublishFromPerspective", - {{ linkLanguage: "{}", meta: {}, perspectiveUUID: "{}" }}, - {{ capabilities: {} }} - ))"#, - link_language, meta_json, perspectiveUUID, capabilities - ); - let result = js.execute(script).await?; - let result: JsResultType = serde_json::from_str(&result)?; - result.get_graphql_result() + check_capability(&context.capabilities, &NEIGHBOURHOOD_CREATE_CAPABILITY)?; + let url = neighbourhoods::neighbourhood_publish_from_perspective( + &perspectiveUUID, + link_language, + meta.into() + ).await?; + + Ok(url) } async fn neighbourhood_send_broadcast( &self, context: &RequestContext, payload: PerspectiveInput, + #[allow(non_snake_case)] perspectiveUUID: String, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let payload_json = serde_json::to_string(&payload)?; - let script = format!( - r#"JSON.stringify( - await core.callResolver( - "Mutation", - "neighbourhoodSendBroadcast", - {{ payload: {}, perspectiveUUID: "{}" }}, - {{ capabilities: {} }} - ))"#, - payload_json, perspectiveUUID, capabilities - ); - let result = js.execute(script).await?; - let result: JsResultType = serde_json::from_str(&result)?; - result.get_graphql_result() + let uuid = perspectiveUUID; + check_capability(&context.capabilities, &NEIGHBOURHOOD_UPDATE_CAPABILITY)?; + let perspective = Perspective::from(payload); + let perspective = create_signed_expression(perspective)?; + get_perspective(&uuid) + .ok_or(FieldError::from(format!("No perspective found with uuid {}", uuid)))? + .send_broadcast(perspective.into()) + .await + .map_err(|e| FieldError::from(e.to_string()))?; + Ok(true) } async fn neighbourhood_send_broadcast_u( &self, context: &RequestContext, payload: PerspectiveUnsignedInput, + #[allow(non_snake_case)] perspectiveUUID: String, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let payload_json = serde_json::to_string(&payload)?; - let script = format!( - r#"JSON.stringify( - await core.callResolver( - "Mutation", - "neighbourhoodSendBroadcastU", - {{ payload: {}, perspectiveUUID: "{}" }}, - {{ capabilities: {} }} - ))"#, - payload_json, perspectiveUUID, capabilities - ); - let result = js.execute(script).await?; - let result: JsResultType = serde_json::from_str(&result)?; - result.get_graphql_result() + let uuid = perspectiveUUID; + check_capability(&context.capabilities, &NEIGHBOURHOOD_UPDATE_CAPABILITY)?; + let perspective = Perspective { + links: payload.links + .into_iter() + .map(|l| Link::from(l)) + .map(|l| create_signed_expression(l)) + .filter_map(Result::ok) + .map(|l| LinkExpression::from(l)) + .map(|l| DecoratedLinkExpression::from((l, LinkStatus::Shared))) + .collect::>() + }; + let perspective = create_signed_expression(perspective)?; + get_perspective(&uuid) + .ok_or(FieldError::from(format!("No perspective found with uuid {}", uuid)))? + .send_broadcast(perspective.into()) + .await + .map_err(|e| FieldError::from(e.to_string()))?; + Ok(true) } async fn neighbourhood_send_signal( &self, context: &RequestContext, payload: PerspectiveInput, + #[allow(non_snake_case)] perspectiveUUID: String, remote_agent_did: String, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let payload_json = serde_json::to_string(&payload)?; - let script = format!( - r#"JSON.stringify( - await core.callResolver( - "Mutation", - "neighbourhoodSendSignal", - {{ payload: {}, perspectiveUUID: "{}", remoteAgentDid: "{}" }}, - {{ capabilities: {} }} - ))"#, - payload_json, perspectiveUUID, remote_agent_did, capabilities - ); - let result = js.execute(script).await?; - let result: JsResultType = serde_json::from_str(&result)?; - result.get_graphql_result() + let uuid = perspectiveUUID; + check_capability(&context.capabilities, &NEIGHBOURHOOD_UPDATE_CAPABILITY)?; + let perspective = Perspective::from(payload); + let perspective = create_signed_expression(perspective)?; + get_perspective(&uuid) + .ok_or(FieldError::from(format!("No perspective found with uuid {}", uuid)))? + .send_signal(remote_agent_did, perspective.into()) + .await + .map_err(|e| FieldError::from(e.to_string()))?; + Ok(true) } async fn neighbourhood_send_signal_u( &self, context: &RequestContext, payload: PerspectiveUnsignedInput, + #[allow(non_snake_case)] perspectiveUUID: String, remote_agent_did: String, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let payload_json = serde_json::to_string(&payload)?; - let script = format!( - r#"JSON.stringify( - await core.callResolver( - "Mutation", - "neighbourhoodSendSignalU", - {{ payload: {}, perspectiveUUID: "{}", remoteAgentDID: "{}" }}, - {{ capabilities: {} }} - ))"#, - payload_json, perspectiveUUID, remote_agent_did, capabilities - ); - let result = js.execute(script).await?; - let result: JsResultType = serde_json::from_str(&result)?; - result.get_graphql_result() + let uuid = perspectiveUUID; + check_capability(&context.capabilities, &NEIGHBOURHOOD_UPDATE_CAPABILITY)?; + let perspective = Perspective { + links: payload.links + .into_iter() + .map(|l| Link::from(l)) + .map(|l| create_signed_expression(l)) + .filter_map(Result::ok) + .map(|l| LinkExpression::from(l)) + .map(|l| DecoratedLinkExpression::from((l, LinkStatus::Shared))) + .collect::>() + }; + let perspective = create_signed_expression(perspective)?; + get_perspective(&uuid) + .ok_or(FieldError::from(format!("No perspective found with uuid {}", uuid)))? + .send_signal(remote_agent_did, perspective.into()) + .await + .map_err(|e| FieldError::from(e.to_string()))?; + Ok(true) } async fn neighbourhood_set_online_status( &self, context: &RequestContext, + #[allow(non_snake_case)] perspectiveUUID: String, status: PerspectiveInput, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let status_json = serde_json::to_string(&status)?; - let script = format!( - r#"JSON.stringify( - await core.callResolver( - "Mutation", - "neighbourhoodSetOnlineStatus", - {{ perspectiveUUID: "{}", status: {} }}, - {{ capabilities: {} }} - ))"#, - perspectiveUUID, status_json, capabilities - ); - let result = js.execute(script).await?; - let result: JsResultType = serde_json::from_str(&result)?; - result.get_graphql_result() + let uuid = perspectiveUUID; + check_capability(&context.capabilities, &NEIGHBOURHOOD_UPDATE_CAPABILITY)?; + let perspective = Perspective::from(status); + let perspective = create_signed_expression(perspective)?; + get_perspective(&uuid) + .ok_or(FieldError::from(format!("No perspective found with uuid {}", uuid)))? + .set_online_status(perspective.into()) + .await + .map_err(|e| FieldError::from(e.to_string()))?; + Ok(true) } async fn neighbourhood_set_online_status_u( &self, context: &RequestContext, + #[allow(non_snake_case)] perspectiveUUID: String, status: PerspectiveUnsignedInput, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let status_json = serde_json::to_string(&status)?; - let script = format!( - r#"JSON.stringify( - await core.callResolver( - "Mutation", - "neighbourhoodSetOnlineStatusU", - {{ perspectiveUUID: "{}", status: {} }}, - {{ capabilities: {} }} - ))"#, - perspectiveUUID, status_json, capabilities - ); - let result = js.execute(script).await?; - let result: JsResultType = serde_json::from_str(&result)?; - result.get_graphql_result() + let uuid = perspectiveUUID; + check_capability(&context.capabilities, &NEIGHBOURHOOD_UPDATE_CAPABILITY)?; + let perspective = Perspective { + links: status.links + .into_iter() + .map(|l| Link::from(l).normalize()) + .map(|l| create_signed_expression(l)) + .filter_map(Result::ok) + .map(|l| LinkExpression::from(l)) + .map(|l| DecoratedLinkExpression::from((l, LinkStatus::Shared))) + .collect::>() + }; + let perspective = create_signed_expression(perspective)?; + get_perspective(&uuid) + .ok_or(FieldError::from(format!("No perspective found with uuid {}", uuid)))? + .set_online_status(perspective.into()) + .await + .map_err(|e| FieldError::from(e.to_string()))?; + Ok(true) } async fn perspective_add( @@ -673,22 +596,10 @@ impl Mutation { context: &RequestContext, name: String, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let script = format!( - r#"JSON.stringify( - await core.callResolver( - "Mutation", - "perspectiveAdd", - {{ name: "{}" }}, - {{ capabilities: {} }} - ))"#, - name, capabilities - ); - let result = js.execute(script).await?; - let result: JsResultType = serde_json::from_str(&result)?; - result.get_graphql_result() + check_capability(&context.capabilities, &PERSPECTIVE_CREATE_CAPABILITY)?; + let handle = PerspectiveHandle::new_from_name(name.clone()); + add_perspective(handle.clone(), None).await?; + Ok(handle) } async fn perspective_add_link( @@ -697,37 +608,14 @@ impl Mutation { link: LinkInput, uuid: String, status: Option, - ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); + ) -> FieldResult { + check_capability( + &context.capabilities, + &perspective_update_capability(vec![uuid.clone()]), + )?; - let link_json = serde_json::to_string(&link)?; - let status = match status { - Some(status) => { - if status != String::from("shared") && status != String::from("local") { - return Err(juniper::FieldError::new( - "Invalid status, must be either 'shared' or 'local'", - graphql_value!({ "invalid_status": status }), - )); - } - format!(r#""{}""#, status) - } - None => String::from("null"), - }; - let script = format!( - r#"JSON.stringify( - await core.callResolver( - "Mutation", - "perspectiveAddLink", - {{ link: {}, uuid: "{}", status: {} }}, - {{ capabilities: {} }} - ))"#, - link_json, uuid, status, capabilities - ); - let result = js.execute(script).await?; - let result: JsResultType = serde_json::from_str(&result)?; - result.get_graphql_result() + let mut perspective = get_perspective_with_uuid_field_error(&uuid)?; + Ok(perspective.add_link(link.into(), link_status_from_input(status)?).await?) } async fn perspective_add_link_expression( @@ -736,36 +624,14 @@ impl Mutation { link: LinkExpressionInput, uuid: String, status: Option, - ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let link_json = serde_json::to_string(&link)?; - let status = match status { - Some(status) => { - if status != String::from("shared") && status != String::from("local") { - return Err(juniper::FieldError::new( - "Invalid status, must be either 'shared' or 'local'", - graphql_value!({ "invalid_status": status }), - )); - } - format!(r#""{}""#, status) - } - None => String::from("null"), - }; - let script = format!( - r#"JSON.stringify( - await core.callResolver( - "Mutation", - "perspectiveAddLinkExpression", - {{ link: {}, uuid: "{}", status: {} }}, - {{ capabilities: {} }} - ))"#, - link_json, uuid, status, capabilities - ); - let result = js.execute(script).await?; - let result: JsResultType = serde_json::from_str(&result)?; - result.get_graphql_result() + ) -> FieldResult { + check_capability( + &context.capabilities, + &perspective_update_capability(vec![uuid.clone()]), + )?; + let mut perspective = get_perspective_with_uuid_field_error(&uuid)?; + let link = crate::types::LinkExpression::try_from(link)?; + Ok(perspective.add_link_expression(link, link_status_from_input(status)?).await?) } async fn perspective_add_links( @@ -774,36 +640,19 @@ impl Mutation { links: Vec, uuid: String, status: Option, - ) -> FieldResult> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let links_json = serde_json::to_string(&links)?; - let status = match status { - Some(status) => { - if status != String::from("shared") && status != String::from("local") { - return Err(juniper::FieldError::new( - "Invalid status, must be either 'shared' or 'local'", - graphql_value!({ "invalid_status": status }), - )); - } - format!(r#""{}""#, status) - } - None => String::from("null"), - }; - let script = format!( - r#"JSON.stringify( - await core.callResolver( - "Mutation", - "perspectiveAddLinks", - {{ links: {}, uuid: "{}", status: {} }}, - {{ capabilities: {} }} - ))"#, - links_json, uuid, status, capabilities - ); - let result = js.execute(script).await?; - let result: JsResultType> = serde_json::from_str(&result)?; - result.get_graphql_result() + ) -> FieldResult> { + check_capability( + &context.capabilities, + &perspective_update_capability(vec![uuid.clone()]), + )?; + let mut perspective = get_perspective_with_uuid_field_error(&uuid)?; + Ok(perspective.add_links( + links + .into_iter() + .map(|l| l.into()) + .collect(), + link_status_from_input(status)? + ).await?) } async fn perspective_link_mutations( @@ -812,36 +661,13 @@ impl Mutation { mutations: LinkMutations, uuid: String, status: Option, - ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let mutations_json = serde_json::to_string(&mutations)?; - let status = match status { - Some(status) => { - if status != String::from("shared") && status != String::from("local") { - return Err(juniper::FieldError::new( - "Invalid status, must be either 'shared' or 'local'", - graphql_value!({ "invalid_status": status }), - )); - } - format!(r#""{}""#, status) - } - None => String::from("shared"), - }; - let script = format!( - r#"JSON.stringify( - await core.callResolver( - "Mutation", - "perspectiveLinkMutations", - {{ mutations: {}, uuid: "{}", status: {} }}, - {{ capabilities: {} }} - ))"#, - mutations_json, uuid, status, capabilities - ); - let result = js.execute(script).await?; - let result: JsResultType = serde_json::from_str(&result)?; - result.get_graphql_result() + ) -> FieldResult { + check_capability( + &context.capabilities, + &perspective_update_capability(vec![uuid.clone()]), + )?; + let mut perspective = get_perspective_with_uuid_field_error(&uuid)?; + Ok(perspective.link_mutations(mutations, link_status_from_input(status)?).await?) } async fn perspective_publish_snapshot( @@ -849,22 +675,11 @@ impl Mutation { context: &RequestContext, uuid: String, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let script = format!( - r#"JSON.stringify( - await core.callResolver( - "Mutation", - "perspectivePublishSnapshot", - {{ uuid: "{}" }}, - {{ capabilities: {} }} - ))"#, - uuid, capabilities - ); - let result = js.execute(script).await?; - let result: JsResultType = serde_json::from_str(&result)?; - result.get_graphql_result() + check_capability( + &context.capabilities, + &perspective_update_capability(vec![uuid.clone()]), + )?; + unimplemented!() } async fn perspective_remove( @@ -872,22 +687,11 @@ impl Mutation { context: &RequestContext, uuid: String, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let script = format!( - r#"JSON.stringify( - await core.callResolver( - "Mutation", - "perspectiveRemove", - {{ uuid: "{}" }}, - {{ capabilities: {} }} - ))"#, - uuid, capabilities - ); - let result = js.execute(script).await?; - let result: JsResultType = serde_json::from_str(&result)?; - result.get_graphql_result() + check_capability( + &context.capabilities, + &perspective_delete_capability(vec![uuid.clone()]), + )?; + Ok(remove_perspective(&uuid).await.is_some()) } async fn perspective_remove_link( @@ -896,23 +700,14 @@ impl Mutation { link: LinkExpressionInput, uuid: String, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let link_json = serde_json::to_string(&link)?; - let script = format!( - r#"JSON.stringify( - await core.callResolver( - "Mutation", - "perspectiveRemoveLink", - {{ link: {}, uuid: "{}" }}, - {{ capabilities: {} }} - ))"#, - link_json, uuid, capabilities - ); - let result = js.execute(script).await?; - let result: JsResultType = serde_json::from_str(&result)?; - result.get_graphql_result() + check_capability( + &context.capabilities, + &perspective_update_capability(vec![uuid.clone()]), + )?; + let mut perspective = get_perspective_with_uuid_field_error(&uuid)?; + let link = crate::types::LinkExpression::try_from(link)?; + perspective.remove_link(link.into()).await?; + Ok(true) } async fn perspective_remove_links( @@ -920,24 +715,19 @@ impl Mutation { context: &RequestContext, links: Vec, uuid: String, - ) -> FieldResult> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let links_json = serde_json::to_string(&links)?; - let script = format!( - r#"JSON.stringify( - await core.callResolver( - "Mutation", - "perspectiveRemoveLinks", - {{ links: {}, uuid: "{}" }}, - {{ capabilities: {} }} - ))"#, - links_json, uuid, capabilities - ); - let result = js.execute(script).await?; - let result: JsResultType> = serde_json::from_str(&result)?; - result.get_graphql_result() + ) -> FieldResult> { + check_capability( + &context.capabilities, + &perspective_update_capability(vec![uuid.clone()]), + )?; + let mut perspective = get_perspective_with_uuid_field_error(&uuid)?; + let mut removed_links = Vec::new(); + for link in links.into_iter() { + let link = crate::types::LinkExpression::try_from(link)?; + removed_links.push(perspective.remove_link(link.into()).await?); + } + + Ok(removed_links) } async fn perspective_update( @@ -946,22 +736,15 @@ impl Mutation { name: String, uuid: String, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let script = format!( - r#"JSON.stringify( - await core.callResolver( - "Mutation", - "perspectiveUpdate", - {{ name: "{}", uuid: "{}" }}, - {{ capabilities: {} }} - ))"#, - name, uuid, capabilities - ); - let result = js.execute(script).await?; - let result: JsResultType = serde_json::from_str(&result)?; - result.get_graphql_result() + check_capability( + &context.capabilities, + &perspective_update_capability(vec![uuid.clone()]), + )?; + let perspective = get_perspective_with_uuid_field_error(&uuid)?; + let mut handle = perspective.persisted.lock().await.clone(); + handle.name = Some(name); + update_perspective(&handle).await?; + Ok(handle) } async fn perspective_update_link( @@ -970,25 +753,13 @@ impl Mutation { new_link: LinkInput, old_link: LinkExpressionInput, uuid: String, - ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let new_link_json = serde_json::to_string(&new_link)?; - let old_link_json = serde_json::to_string(&old_link)?; - let script = format!( - r#"JSON.stringify( - await core.callResolver( - "Mutation", - "perspectiveUpdateLink", - {{ newLink: {}, oldLink: {}, uuid: "{}" }}, - {{ capabilities: {} }} - ))"#, - new_link_json, old_link_json, uuid, capabilities - ); - let result = js.execute(script).await?; - let result: JsResultType = serde_json::from_str(&result)?; - result.get_graphql_result() + ) -> FieldResult { + check_capability( + &context.capabilities, + &perspective_update_capability(vec![uuid.clone()]), + )?; + let mut perspective = get_perspective_with_uuid_field_error(&uuid)?; + Ok(perspective.update_link(LinkExpression::from_input_without_proof(old_link), new_link.into()).await?) } async fn perspective_add_sdna( @@ -999,24 +770,18 @@ impl Mutation { sdna_code: String, sdna_type: String, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let sdna_literal = Literal::from_string(sdna_code).to_url()?; - let script = format!( - r#"JSON.stringify( - await core.callResolver( - "Mutation", - "perspectiveAddSdna", - {{ uuid: "{}", name: "{}", sdnaCode: "{}", sdnaType: "{}" }}, - {{ capabilities: {} }} - ) - )"#, - uuid, name, sdna_literal, sdna_type, capabilities - ); - let result = js.execute(script).await?; - let result: JsResultType = serde_json::from_str(&result)?; - result.get_graphql_result() + check_capability( + &context.capabilities, + &perspective_update_capability(vec![uuid.clone()]), + )?; + let mut perspective = get_perspective_with_uuid_field_error(&uuid)?; + let sdna_type = SdnaType::from_string(&sdna_type) + .map_err(|e| FieldError::new( + e, + graphql_value!({ "invalid_sdna_type": sdna_type }) + ))?; + perspective.add_sdna(name, sdna_code, sdna_type).await?; + Ok(true) } async fn runtime_add_friends( @@ -1024,8 +789,7 @@ impl Mutation { context: &RequestContext, dids: Vec, ) -> FieldResult> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability(&context.capabilities, &RUNTIME_FRIENDS_CREATE_CAPABILITY)?; let mut js = context.js_handle.clone(); let dids_json = serde_json::to_string(&dids)?; let script = format!( @@ -1034,9 +798,8 @@ impl Mutation { "Mutation", "runtimeAddFriends", {{ dids: {} }}, - {{ capabilities: {} }} ))"#, - dids_json, capabilities + dids_json, ); let result = js.execute(script).await?; let result: JsResultType> = serde_json::from_str(&result)?; @@ -1048,8 +811,10 @@ impl Mutation { context: &RequestContext, addresses: Vec, ) -> FieldResult> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability( + &context.capabilities, + &RUNTIME_KNOWN_LINK_LANGUAGES_CREATE_CAPABILITY, + )?; let mut js = context.js_handle.clone(); let addresses_json = serde_json::to_string(&addresses)?; let script = format!( @@ -1058,9 +823,8 @@ impl Mutation { "Mutation", "runtimeAddKnownLinkLanguageTemplates", {{ addresses: {} }}, - {{ capabilities: {} }} ))"#, - addresses_json, capabilities + addresses_json, ); let result = js.execute(script).await?; let result: JsResultType> = serde_json::from_str(&result)?; @@ -1073,8 +837,7 @@ impl Mutation { did: String, message: PerspectiveInput, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability(&context.capabilities, &RUNTIME_MESSAGES_CREATE_CAPABILITY)?; let mut js = context.js_handle.clone(); let message_json = serde_json::to_string(&message)?; let script = format!( @@ -1083,9 +846,8 @@ impl Mutation { "Mutation", "runtimeFriendSendMessage", {{ did: "{}", message: {} }}, - {{ capabilities: {} }} ))"#, - did, message_json, capabilities + did, message_json, ); let result = js.execute(script).await?; let result: JsResultType = serde_json::from_str(&result)?; @@ -1097,27 +859,27 @@ impl Mutation { context: &RequestContext, agent_infos: String, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let script = format!( - r#"JSON.stringify( - await core.callResolver( - "Mutation", - "runtimeHcAddAgentInfos", - {{ agentInfos: JSON.stringify({}) }}, - {{ capabilities: {} }} - ))"#, - agent_infos, capabilities - ); - let result = js.execute(script).await?; - let result: JsResultType = serde_json::from_str(&result)?; - result.get_graphql_result() + check_capability( + &context.capabilities, + &RUNTIME_HC_AGENT_INFO_CREATE_CAPABILITY, + )?; + + let agent_infos = agent_infos_from_str(agent_infos.as_str())?; + log::info!("Adding HC agent infos: {:?}", agent_infos); + + get_holochain_service() + .await + .add_agent_infos(agent_infos) + .await + .map_err(|e| { + log::error!("Failed to add agent infos: {:?}", e); + e + })?; + + Ok(true) } async fn runtime_open_link(&self, context: &RequestContext, url: String) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; let mut js = context.js_handle.clone(); let script = format!( r#"JSON.stringify( @@ -1125,9 +887,8 @@ impl Mutation { "Mutation", "runtimeOpenLink", {{ url: "{}" }}, - {{ capabilities: {} }} ))"#, - url, capabilities + url, ); let result = js.execute(script).await?; let result: JsResultType = serde_json::from_str(&result)?; @@ -1135,17 +896,14 @@ impl Mutation { } async fn runtime_quit(&self, context: &RequestContext) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability(&context.capabilities, &RUNTIME_QUIT_CAPABILITY)?; let mut js = context.js_handle.clone(); let script = format!( r#"JSON.stringify( await core.callResolver( "Mutation", "runtimeQuit", - {{ capabilities: {} }} ))"#, - capabilities ); let result = js.execute(script).await?; let result: JsResultType = serde_json::from_str(&result)?; @@ -1157,8 +915,7 @@ impl Mutation { context: &RequestContext, dids: Vec, ) -> FieldResult> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability(&context.capabilities, &RUNTIME_FRIENDS_DELETE_CAPABILITY)?; let mut js = context.js_handle.clone(); let dids_json = serde_json::to_string(&dids)?; let script = format!( @@ -1167,9 +924,8 @@ impl Mutation { "Mutation", "runtimeRemoveFriends", {{ dids: {} }}, - {{ capabilities: {} }} ))"#, - dids_json, capabilities + dids_json, ); let result = js.execute(script).await?; let result: JsResultType> = serde_json::from_str(&result)?; @@ -1181,8 +937,10 @@ impl Mutation { context: &RequestContext, addresses: Vec, ) -> FieldResult> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability( + &context.capabilities, + &RUNTIME_KNOWN_LINK_LANGUAGES_DELETE_CAPABILITY, + )?; let mut js = context.js_handle.clone(); let addresses_json = serde_json::to_string(&addresses)?; let script = format!( @@ -1191,9 +949,8 @@ impl Mutation { "Mutation", "runtimeRemoveKnownLinkLanguageTemplates", {{ addresses: {} }}, - {{ capabilities: {} }} ))"#, - addresses_json, capabilities + addresses_json, ); let result = js.execute(script).await?; let result: JsResultType> = serde_json::from_str(&result)?; @@ -1205,8 +962,7 @@ impl Mutation { context: &RequestContext, status: PerspectiveInput, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability(&context.capabilities, &RUNTIME_MY_STATUS_UPDATE_CAPABILITY)?; let mut js = context.js_handle.clone(); let status_json = serde_json::to_string(&status)?; let script = format!( @@ -1215,9 +971,8 @@ impl Mutation { "Mutation", "runtimeSetStatus", {{ status: {} }}, - {{ capabilities: {} }} ))"#, - status_json, capabilities + status_json, ); let result = js.execute(script).await?; let result: JsResultType = serde_json::from_str(&result)?; diff --git a/rust-executor/src/graphql/query_resolvers.rs b/rust-executor/src/graphql/query_resolvers.rs index 955ad981d..9b60561b5 100644 --- a/rust-executor/src/graphql/query_resolvers.rs +++ b/rust-executor/src/graphql/query_resolvers.rs @@ -1,22 +1,22 @@ #![allow(non_snake_case)] -use juniper::{graphql_object, FieldResult}; +use coasys_juniper::{graphql_object, FieldError, FieldResult}; + + +use crate::{holochain_service::get_holochain_service, perspectives::{all_perspectives, get_perspective}, types::{DecoratedLinkExpression }}; use super::graphql_types::*; -use super::utils::get_capabilies; -use super::RequestContext; +use crate::agent::{capabilities::*, signatures}; pub struct Query; #[graphql_object(context = RequestContext)] impl Query { async fn agent(&self, context: &RequestContext) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability(&context.capabilities, &AGENT_READ_CAPABILITY)?; let mut js = context.js_handle.clone(); let result = js .execute(format!( - r#"JSON.stringify(await core.callResolver("Query", "agent", null, {{ capabilities: {} }}))"#, - capabilities + r#"JSON.stringify(await core.callResolver("Query", "agent", null))"#, )) .await?; let result: JsResultType = serde_json::from_str(&result)?; @@ -29,19 +29,17 @@ impl Query { context: &RequestContext, did: String, ) -> FieldResult> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability(&context.capabilities, &AGENT_READ_CAPABILITY)?; let mut js = context.js_handle.clone(); let result = js .execute( format!( r#"JSON.stringify( - await core.callResolver("Query", "agentByDID", - {{ did: "{}" }}, - {{ capabilities: {} }} + await core.callResolver("Query", "agentByDID", + {{ did: "{}" }}, ) )"#, - did, capabilities + did, ) .into(), ) @@ -51,25 +49,14 @@ impl Query { } async fn agent_get_apps(&self, context: &RequestContext) -> FieldResult> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let result = js - .execute(format!( - r#"JSON.stringify(await core.callResolver("Query", "agentGetApps", {{ capabilities: {} }}))"#, - capabilities - )) - .await?; - let result: JsResultType> = serde_json::from_str(&result)?; - result.get_graphql_result() + check_capability(&context.capabilities, &AGENT_READ_CAPABILITY)?; + Ok(apps_map::get_apps()) } async fn agent_get_entanglement_proofs( &self, context: &RequestContext, ) -> FieldResult> { - let _capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; let mut js = context.js_handle.clone(); let result = js .execute(format!( @@ -81,8 +68,6 @@ impl Query { } async fn agent_is_locked(&self, context: &RequestContext) -> FieldResult { - let _capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; let mut js = context.js_handle.clone(); let result = js .execute(format!( @@ -94,13 +79,11 @@ impl Query { } async fn agent_status(&self, context: &RequestContext) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability(&context.capabilities, &AGENT_READ_CAPABILITY)?; let mut js = context.js_handle.clone(); let result = js .execute(format!( - r#"JSON.stringify(await core.callResolver("Query", "agentStatus", {{ capabilities: {} }}))"#, - capabilities + r#"JSON.stringify(await core.callResolver("Query", "agentStatus"))"#, )) .await?; let result: JsResultType = serde_json::from_str(&result)?; @@ -112,14 +95,12 @@ impl Query { context: &RequestContext, url: String, ) -> FieldResult> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability(&context.capabilities, &EXPRESSION_READ_CAPABILITY)?; let mut js = context.js_handle.clone(); let result = js .execute(format!( - r#"JSON.stringify(await core.callResolver("Query", "expression", {{ url: "{}" }}, {{ capabilities: {} }}))"#, - url, - capabilities + r#"JSON.stringify(await core.callResolver("Query", "expression", {{ url: "{}" }}))"#, + url )) .await?; let result: JsResultType> = serde_json::from_str(&result)?; @@ -131,14 +112,12 @@ impl Query { context: &RequestContext, url: String, ) -> FieldResult> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability(&context.capabilities, &EXPRESSION_READ_CAPABILITY)?; let mut js = context.js_handle.clone(); let result = js .execute(format!( - r#"JSON.stringify(await core.callResolver("Query", "expressionInteractions", {{ url: "{}" }}, {{ capabilities: {} }}))"#, + r#"JSON.stringify(await core.callResolver("Query", "expressionInteractions", {{ url: "{}" }}))"#, url, - capabilities )) .await?; let result: JsResultType> = serde_json::from_str(&result)?; @@ -155,14 +134,12 @@ impl Query { .map(|url| format!("\"{}\"", url)) .collect::>() .join(","); - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability(&context.capabilities, &EXPRESSION_READ_CAPABILITY)?; let mut js = context.js_handle.clone(); let result = js .execute(format!( - r#"JSON.stringify(await core.callResolver("Query", "expressionMany", {{ urls: [{}] }}, {{ capabilities: {} }}))"#, + r#"JSON.stringify(await core.callResolver("Query", "expressionMany", {{ urls: [{}] }}))"#, urls_string, - capabilities )) .await?; let result: JsResultType>> = serde_json::from_str(&result)?; @@ -174,14 +151,12 @@ impl Query { context: &RequestContext, url: String, ) -> FieldResult> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability(&context.capabilities, &EXPRESSION_READ_CAPABILITY)?; let mut js = context.js_handle.clone(); let result = js .execute(format!( - r#"JSON.stringify(await core.callResolver("Query", "expressionRaw", {{ url: "{}" }}, {{ capabilities: {} }}))"#, + r#"JSON.stringify(await core.callResolver("Query", "expressionRaw", {{ url: "{}" }}))"#, url, - capabilities )) .await?; let result: JsResultType> = serde_json::from_str(&result)?; @@ -189,13 +164,14 @@ impl Query { } async fn get_trusted_agents(&self, context: &RequestContext) -> FieldResult> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability( + &context.capabilities, + &RUNTIME_TRUSTED_AGENTS_READ_CAPABILITY, + )?; let mut js = context.js_handle.clone(); let result = js .execute(format!( - r#"JSON.stringify(await core.callResolver("Query", "getTrustedAgents", {{ capabilities: {} }}))"#, - capabilities + r#"JSON.stringify(await core.callResolver("Query", "getTrustedAgents"))"#, )) .await?; let result: JsResultType> = serde_json::from_str(&result)?; @@ -207,14 +183,12 @@ impl Query { context: &RequestContext, address: String, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability(&context.capabilities, &LANGUAGE_READ_CAPABILITY)?; let mut js = context.js_handle.clone(); let result = js .execute(format!( - r#"JSON.stringify(await core.callResolver("Query", "language", {{ address: "{}" }}, {{ capabilities: {} }}))"#, + r#"JSON.stringify(await core.callResolver("Query", "language", {{ address: "{}" }}))"#, address, - capabilities )) .await?; let result: JsResultType = serde_json::from_str(&result)?; @@ -226,14 +200,12 @@ impl Query { context: &RequestContext, address: String, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability(&context.capabilities, &LANGUAGE_READ_CAPABILITY)?; let mut js = context.js_handle.clone(); let result = js .execute(format!( - r#"JSON.stringify(await core.callResolver("Query", "languageMeta", {{ address: "{}" }}, {{ capabilities: {} }}))"#, + r#"JSON.stringify(await core.callResolver("Query", "languageMeta", {{ address: "{}" }}))"#, address, - capabilities )) .await?; let result: JsResultType = serde_json::from_str(&result)?; @@ -245,14 +217,12 @@ impl Query { context: &RequestContext, address: String, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability(&context.capabilities, &LANGUAGE_READ_CAPABILITY)?; let mut js = context.js_handle.clone(); let result = js .execute(format!( - r#"JSON.stringify(await core.callResolver("Query", "languageSource", {{ address: "{}" }}, {{ capabilities: {} }}))"#, + r#"JSON.stringify(await core.callResolver("Query", "languageSource", {{ address: "{}" }}))"#, address, - capabilities )) .await?; let result: JsResultType = serde_json::from_str(&result)?; @@ -264,15 +234,13 @@ impl Query { context: &RequestContext, filter: Option, ) -> FieldResult> { - let filter_string = filter.map_or("null".to_string(), |f| format!("\"{}\"", f)); - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + let filter_string = filter.map_or("null".to_string(), |f| format!("{}", f)); + check_capability(&context.capabilities, &LANGUAGE_READ_CAPABILITY)?; let mut js = context.js_handle.clone(); let result = js .execute(format!( - r#"JSON.stringify(await core.callResolver("Query", "languages", {{ filter: "{}" }}, {{ capabilities: {} }}))"#, + r#"JSON.stringify(await core.callResolver("Query", "languages", {{ filter: "{}" }}))"#, filter_string, - capabilities )) .await?; let result: JsResultType> = serde_json::from_str(&result)?; @@ -282,46 +250,45 @@ impl Query { async fn neighbourhood_has_telepresence_adapter( &self, context: &RequestContext, + #[allow(non_snake_case)] perspectiveUUID: String, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let result = js - .execute(format!(r#"JSON.stringify(await core.callResolver("Query", "neighbourhoodHasTelepresenceAdapter", {{ perspectiveUUID: "{}" }}, {{ capabilities: {} }}))"#, perspectiveUUID, capabilities)) - .await?; - let result: JsResultType = serde_json::from_str(&result)?; - result.get_graphql_result() + let uuid = perspectiveUUID; + check_capability(&context.capabilities, &NEIGHBOURHOOD_READ_CAPABILITY)?; + Ok(get_perspective(&uuid) + .ok_or(FieldError::from(format!("No perspective found with uuid {}", uuid)))? + .has_telepresence_adapter() + .await) } async fn neighbourhood_online_agents( &self, context: &RequestContext, + #[allow(non_snake_case)] perspectiveUUID: String, ) -> FieldResult> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let result = js - .execute(format!(r#"JSON.stringify(await core.callResolver("Query", "neighbourhoodOnlineAgents", {{ perspectiveUUID: "{}" }}, {{ capabilities: {} }}))"#, perspectiveUUID, capabilities)) - .await?; - let result: JsResultType> = serde_json::from_str(&result)?; - result.get_graphql_result() + let uuid = perspectiveUUID; + check_capability(&context.capabilities, &NEIGHBOURHOOD_READ_CAPABILITY)?; + get_perspective(&uuid) + .ok_or(FieldError::from(format!("No perspective found with uuid {}", uuid)))? + .online_agents() + .await + .map_err(|e| FieldError::from(e.to_string())) } async fn neighbourhood_other_agents( &self, context: &RequestContext, + #[allow(non_snake_case)] perspectiveUUID: String, ) -> FieldResult> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let result = js - .execute(format!(r#"JSON.stringify(await core.callResolver("Query", "neighbourhoodOtherAgents", {{ perspectiveUUID: "{}" }}, {{ capabilities: {} }}))"#, perspectiveUUID, capabilities)) - .await?; - let result: JsResultType> = serde_json::from_str(&result)?; - result.get_graphql_result() + let uuid = perspectiveUUID; + check_capability(&context.capabilities, &NEIGHBOURHOOD_READ_CAPABILITY)?; + get_perspective(&uuid) + .ok_or(FieldError::from(format!("No perspective found with uuid {}", uuid)))? + .others() + .await + .map_err(|e| FieldError::from(e.to_string())) } async fn perspective( @@ -329,18 +296,16 @@ impl Query { context: &RequestContext, uuid: String, ) -> FieldResult> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let result = js - .execute(format!( - r#"JSON.stringify(await core.callResolver("Query", "perspective", {{ uuid: "{}" }}, {{ capabilities: {} }}))"#, - uuid, - capabilities - )) - .await?; - let result: JsResultType> = serde_json::from_str(&result)?; - result.get_graphql_result() + check_capability( + &context.capabilities, + &perspective_query_capability(vec![uuid.clone()]), + )?; + + if let Some(p) = get_perspective(&uuid) { + Ok(Some(p.persisted.lock().await.clone())) + } else { + Ok(None) + } } async fn perspective_query_links( @@ -348,18 +313,16 @@ impl Query { context: &RequestContext, query: LinkQuery, uuid: String, - ) -> FieldResult> { - let query_string = serde_json::to_string(&query)?; - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let script = format!( - r#"JSON.stringify(await core.callResolver("Query", "perspectiveQueryLinks", {{ query: {}, uuid: "{}" }}, {{ capabilities: {} }}))"#, - query_string, uuid, capabilities - ); - let result = js.execute(script).await?; - let result: JsResultType> = serde_json::from_str(&result)?; - result.get_graphql_result() + ) -> FieldResult> { + check_capability( + &context.capabilities, + &perspective_query_capability(vec![uuid.clone()]), + )?; + + Ok(get_perspective(&uuid) + .ok_or(FieldError::from(format!("No perspective found with uuid {}", uuid)))? + .get_links(&query) + .await?) } async fn perspective_query_prolog( @@ -368,16 +331,15 @@ impl Query { query: String, uuid: String, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let script = format!( - r#"JSON.stringify(await core.callResolver("Query", "perspectiveQueryProlog", {{ query: '{}', uuid: "{}" }}, {{ capabilities: {} }}))"#, - query, uuid, capabilities - ); - let result = js.execute(script).await?; - let result: JsResultType = serde_json::from_str(&result)?; - result.get_graphql_result() + check_capability( + &context.capabilities, + &perspective_query_capability(vec![uuid.clone()]), + )?; + + Ok(get_perspective(&uuid) + .ok_or(FieldError::from(format!("No perspective found with uuid {}", uuid)))? + .prolog_query(query) + .await?) } async fn perspective_snapshot( @@ -385,32 +347,33 @@ impl Query { context: &RequestContext, uuid: String, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let result = js - .execute(format!( - r#"JSON.stringify(await core.callResolver("Query", "perspectiveSnapshot", {{ uuid: "{}" }}, {{ capabilities: {} }}))"#, - uuid, - capabilities - )) + check_capability( + &context.capabilities, + &perspective_query_capability(vec![uuid.clone()]), + )?; + + let all_links = get_perspective(&uuid) + .ok_or(FieldError::from(format!("No perspective found with uuid {}", uuid)))? + .get_links(&LinkQuery::default()) .await?; - let result: JsResultType = serde_json::from_str(&result)?; - result.get_graphql_result() + + Ok(Perspective { + links: all_links, + }) } async fn perspectives(&self, context: &RequestContext) -> FieldResult> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let result = js - .execute(format!( - r#"JSON.stringify(await core.callResolver("Query", "perspectives", {{ capabilities: {} }}))"#, - capabilities - )) - .await?; - let result: JsResultType> = serde_json::from_str(&result)?; - result.get_graphql_result() + check_capability( + &context.capabilities, + &perspective_query_capability(vec!["*".into()]), + )?; + + let mut result = Vec::new(); + for p in all_perspectives().iter() { + let handle = p.persisted.lock().await.clone(); + result.push(handle); + } + Ok(result) } async fn runtime_friend_status( @@ -418,14 +381,15 @@ impl Query { context: &RequestContext, did: String, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability( + &context.capabilities, + &RUNTIME_FRIEND_STATUS_READ_CAPABILITY, + )?; let mut js = context.js_handle.clone(); let result = js .execute(format!( - r#"JSON.stringify(await core.callResolver("Query", "runtimeFriendStatus", {{ did: "{}" }}, {{ capabilities: {} }}))"#, - did, - capabilities + r#"JSON.stringify(await core.callResolver("Query", "runtimeFriendStatus", {{ did: "{}" }}))"#, + did )) .await?; let result: JsResultType = serde_json::from_str(&result)?; @@ -433,13 +397,11 @@ impl Query { } async fn runtime_friends(&self, context: &RequestContext) -> FieldResult> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability(&context.capabilities, &RUNTIME_FRIENDS_READ_CAPABILITY)?; let mut js = context.js_handle.clone(); let result = js .execute(format!( - r#"JSON.stringify(await core.callResolver("Query", "runtimeFriends", {{ capabilities: {} }}))"#, - capabilities + r#"JSON.stringify(await core.callResolver("Query", "runtimeFriends"))"#, )) .await?; let result: JsResultType> = serde_json::from_str(&result)?; @@ -447,19 +409,23 @@ impl Query { } async fn runtime_hc_agent_infos(&self, context: &RequestContext) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let result = js - .execute(format!(r#"JSON.stringify(await core.callResolver("Query", "runtimeHcAgentInfos", {{ capabilities: {} }}))"#, capabilities)) - .await?; - let result: JsResultType = serde_json::from_str(&result)?; - result.get_graphql_result() + check_capability( + &context.capabilities, + &RUNTIME_HC_AGENT_INFO_READ_CAPABILITY, + )?; + + let interface = get_holochain_service().await; + let infos = interface.agent_infos().await?; + + let encoded_infos: Vec = infos + .iter() + .map(|info| base64::encode(info.encode().expect("Failed to encode AgentInfoSigned"))) + .collect(); + + Ok(serde_json::to_string(&encoded_infos)?) } async fn runtime_info(&self, context: &RequestContext) -> FieldResult { - let _capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; let mut js = context.js_handle.clone(); let result = js .execute(format!( @@ -474,11 +440,13 @@ impl Query { &self, context: &RequestContext, ) -> FieldResult> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability( + &context.capabilities, + &RUNTIME_KNOWN_LINK_LANGUAGES_READ_CAPABILITY, + )?; let mut js = context.js_handle.clone(); let result = js - .execute(format!(r#"JSON.stringify(await core.callResolver("Query", "runtimeKnownLinkLanguageTemplates", {{ capabilities: {} }}))"#, capabilities)) + .execute(format!(r#"JSON.stringify(await core.callResolver("Query", "runtimeKnownLinkLanguageTemplates"))"#)) .await?; let result: JsResultType> = serde_json::from_str(&result)?; result.get_graphql_result() @@ -489,14 +457,13 @@ impl Query { context: &RequestContext, filter: Option, ) -> FieldResult> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability(&context.capabilities, &RUNTIME_MESSAGES_READ_CAPABILITY)?; let filter_str = filter .map(|val| format!(r#"{{ filter: "{}" }}"#, val)) .unwrap_or_else(|| String::from("{ filter: null }")); let script = format!( - r#"JSON.stringify(await core.callResolver("Query", "runtimeMessageInbox", {}, {{ capabilities: {} }}))"#, - filter_str, capabilities + r#"JSON.stringify(await core.callResolver("Query", "runtimeMessageInbox", {}))"#, + filter_str, ); let mut js = context.js_handle.clone(); let result = js.execute(script).await?; @@ -509,14 +476,13 @@ impl Query { context: &RequestContext, filter: Option, ) -> FieldResult> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; + check_capability(&context.capabilities, &RUNTIME_MESSAGES_READ_CAPABILITY)?; let filter_str = filter .map(|val| format!(r#"{{ filter: "{}" }}"#, val)) .unwrap_or_else(|| String::from("{ filter: null }")); let script = format!( - r#"JSON.stringify(await core.callResolver("Query", "runtimeMessageOutbox", {}, {{ capabilities: {} }}))"#, - filter_str, capabilities + r#"JSON.stringify(await core.callResolver("Query", "runtimeMessageOutbox", {}))"#, + filter_str, ); let mut js = context.js_handle.clone(); let result = js.execute(script).await?; @@ -529,24 +495,12 @@ impl Query { context: &RequestContext, data: String, did: String, - did_signing_key_id: String, + _did_signing_key_id: String, signed_data: String, ) -> FieldResult { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await?; - let mut js = context.js_handle.clone(); - let result = js - .execute(format!( - r#"JSON.stringify( - await core.callResolver("Query", "runtimeVerifyStringSignedByDid", - {{ data: "{}", did: "{}", didSigningKeyId: "{}", signedData: "{}" }}, - {{ capabilities: {} }} - ) - )"#, - data, did, did_signing_key_id, signed_data, capabilities - )) - .await?; - let result: JsResultType = serde_json::from_str(&result)?; - result.get_graphql_result() + check_capability(&context.capabilities, &AGENT_READ_CAPABILITY)?; + signatures::verify_string_signed_by_did(&did, &data, &signed_data) + .map_err(|e| e.to_string()) + .map_err(|e| coasys_juniper::FieldError::new(e, coasys_juniper::Value::Null)) } } diff --git a/rust-executor/src/graphql/subscription_resolvers.rs b/rust-executor/src/graphql/subscription_resolvers.rs index 7a5459a3f..2e10adb4f 100644 --- a/rust-executor/src/graphql/subscription_resolvers.rs +++ b/rust-executor/src/graphql/subscription_resolvers.rs @@ -1,119 +1,81 @@ #![allow(non_snake_case)] use futures::stream; use futures::stream::Stream; -use juniper::FieldResult; +use coasys_juniper::FieldResult; use std::pin::Pin; -use crate::pubsub::{ +use crate::{pubsub::{ get_global_pubsub, subscribe_and_process, AGENT_STATUS_CHANGED_TOPIC, AGENT_UPDATED_TOPIC, APPS_CHANGED, EXCEPTION_OCCURRED_TOPIC, NEIGHBOURHOOD_SIGNAL_TOPIC, PERSPECTIVE_ADDED_TOPIC, PERSPECTIVE_LINK_ADDED_TOPIC, PERSPECTIVE_LINK_REMOVED_TOPIC, PERSPECTIVE_LINK_UPDATED_TOPIC, PERSPECTIVE_REMOVED_TOPIC, PERSPECTIVE_SYNC_STATE_CHANGE_TOPIC, PERSPECTIVE_UPDATED_TOPIC, RUNTIME_MESSAGED_RECEIVED_TOPIC, -}; +}, types::DecoratedLinkExpression}; use super::graphql_types::*; -use super::utils::{ - check_capabilities, get_capabilies, AGENT_SUBSCRIBE_CAPABILITY, - PERSPECTIVE_SUBSCRIBE_CAPABILITY, RUNTIME_EXCEPTION_SUBSCRIBE_CAPABILITY, - RUNTIME_MESSAGES_SUBSCRIBE_CAPABILITY, -}; -use super::RequestContext; +use crate::agent::capabilities::*; pub struct Subscription; -#[juniper::graphql_subscription(context = RequestContext)] +#[coasys_juniper::graphql_subscription(context = RequestContext)] impl Subscription { async fn agent_status_changed( &self, context: &RequestContext, ) -> Pin> + Send>> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await; - if capabilities.is_err() { - return Box::pin(stream::once( - async move { Err(capabilities.err().unwrap()) }, - )); + match check_capability(&context.capabilities, &AGENT_SUBSCRIBE_CAPABILITY) { + Err(e) => return Box::pin(stream::once(async move { Err(e.into()) })), + Ok(_) => { + let pubsub = get_global_pubsub().await; + let topic = &AGENT_STATUS_CHANGED_TOPIC; + subscribe_and_process::(pubsub, topic.to_string(), None).await + } } - let pubsub = get_global_pubsub().await; - let topic = &AGENT_STATUS_CHANGED_TOPIC; - - subscribe_and_process::(pubsub, topic.to_string(), None).await } async fn agent_apps_changed( &self, context: &RequestContext, ) -> Pin>> + Send>> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await; - if capabilities.is_err() { - return Box::pin(stream::once( - async move { Err(capabilities.err().unwrap()) }, - )); + match check_capability(&context.capabilities, &AGENT_SUBSCRIBE_CAPABILITY) { + Err(e) => return Box::pin(stream::once(async move { Err(e.into()) })), + Ok(_) => { + let pubsub = get_global_pubsub().await; + let topic = &APPS_CHANGED; + subscribe_and_process::>(pubsub, topic.to_string(), None).await + } } - let pubsub = get_global_pubsub().await; - let topic = &APPS_CHANGED; - - subscribe_and_process::>(pubsub, topic.to_string(), None).await } async fn agent_updated( &self, context: &RequestContext, ) -> Pin> + Send>> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await; - if capabilities.is_err() { - return Box::pin(stream::once( - async move { Err(capabilities.err().unwrap()) }, - )); - } - - let cap_check = check_capabilities( - context.js_handle.clone(), - capabilities.unwrap(), - serde_json::to_value(AGENT_SUBSCRIBE_CAPABILITY.clone()).unwrap(), - ) - .await; - - if cap_check.is_err() { - return Box::pin(stream::once(async move { Err(cap_check.err().unwrap()) })); + match check_capability(&context.capabilities, &AGENT_SUBSCRIBE_CAPABILITY) { + Err(e) => return Box::pin(stream::once(async move { Err(e.into()) })), + Ok(_) => { + let pubsub = get_global_pubsub().await; + let topic = &AGENT_UPDATED_TOPIC; + subscribe_and_process::(pubsub, topic.to_string(), None).await + } } - - let pubsub = get_global_pubsub().await; - let topic = &AGENT_UPDATED_TOPIC; - - subscribe_and_process::(pubsub, topic.to_string(), None).await } async fn exception_occurred( &self, context: &RequestContext, ) -> Pin> + Send>> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await; - if capabilities.is_err() { - return Box::pin(stream::once( - async move { Err(capabilities.err().unwrap()) }, - )); - } - - let cap_check = check_capabilities( - context.js_handle.clone(), - capabilities.unwrap(), - serde_json::to_value(RUNTIME_EXCEPTION_SUBSCRIBE_CAPABILITY.clone()).unwrap(), - ) - .await; - - if cap_check.is_err() { - return Box::pin(stream::once(async move { Err(cap_check.err().unwrap()) })); + match check_capability( + &context.capabilities, + &RUNTIME_EXCEPTION_SUBSCRIBE_CAPABILITY, + ) { + Err(e) => return Box::pin(stream::once(async move { Err(e.into()) })), + Ok(_) => { + let pubsub = get_global_pubsub().await; + let topic = &EXCEPTION_OCCURRED_TOPIC; + subscribe_and_process::(pubsub, topic.to_string(), None).await + } } - - let pubsub = get_global_pubsub().await; - let topic = &EXCEPTION_OCCURRED_TOPIC; - - subscribe_and_process::(pubsub, topic.to_string(), None).await } async fn neighbourhood_signal( @@ -121,123 +83,73 @@ impl Subscription { context: &RequestContext, perspectiveUUID: String, ) -> Pin> + Send>> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await; - if capabilities.is_err() { - return Box::pin(stream::once( - async move { Err(capabilities.err().unwrap()) }, - )); + match check_capability(&context.capabilities, &NEIGHBOURHOOD_READ_CAPABILITY) { + Err(e) => return Box::pin(stream::once(async move { Err(e.into()) })), + Ok(_) => { + let pubsub = get_global_pubsub().await; + let topic = &NEIGHBOURHOOD_SIGNAL_TOPIC; + subscribe_and_process::( + pubsub, + topic.to_string(), + Some(perspectiveUUID), + ) + .await + } } - - let cap_check = check_capabilities( - context.js_handle.clone(), - capabilities.unwrap(), - serde_json::to_value(RUNTIME_MESSAGES_SUBSCRIBE_CAPABILITY.clone()).unwrap(), - ) - .await; - - if cap_check.is_err() { - return Box::pin(stream::once(async move { Err(cap_check.err().unwrap()) })); - }; - - let pubsub = get_global_pubsub().await; - let topic = &NEIGHBOURHOOD_SIGNAL_TOPIC; - - subscribe_and_process::( - pubsub, - topic.to_string(), - Some(perspectiveUUID), - ) - .await } async fn perspective_added( &self, context: &RequestContext, ) -> Pin> + Send>> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await; - if capabilities.is_err() { - return Box::pin(stream::once( - async move { Err(capabilities.err().unwrap()) }, - )); + match check_capability(&context.capabilities, &PERSPECTIVE_SUBSCRIBE_CAPABILITY) { + Err(e) => return Box::pin(stream::once(async move { Err(e.into()) })), + Ok(_) => { + let pubsub = get_global_pubsub().await; + let topic = &PERSPECTIVE_ADDED_TOPIC; + subscribe_and_process::(pubsub, topic.to_string(), None).await + } } - - let cap_check = check_capabilities( - context.js_handle.clone(), - capabilities.unwrap(), - serde_json::to_value(PERSPECTIVE_SUBSCRIBE_CAPABILITY.clone()).unwrap(), - ) - .await; - - if cap_check.is_err() { - return Box::pin(stream::once(async move { Err(cap_check.err().unwrap()) })); - }; - - let pubsub = get_global_pubsub().await; - let topic = &PERSPECTIVE_ADDED_TOPIC; - - subscribe_and_process::(pubsub, topic.to_string(), None).await } async fn perspective_link_added( &self, context: &RequestContext, uuid: String, - ) -> Pin> + Send>> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await; - if capabilities.is_err() { - return Box::pin(stream::once( - async move { Err(capabilities.err().unwrap()) }, - )); + ) -> Pin> + Send>> { + match check_capability(&context.capabilities, &PERSPECTIVE_SUBSCRIBE_CAPABILITY) { + Err(e) => return Box::pin(stream::once(async move { Err(e.into()) })), + Ok(_) => { + let pubsub = get_global_pubsub().await; + let topic = &PERSPECTIVE_LINK_ADDED_TOPIC; + subscribe_and_process::( + pubsub, + topic.to_string(), + Some(uuid), + ) + .await + } } - - let cap_check = check_capabilities( - context.js_handle.clone(), - capabilities.unwrap(), - serde_json::to_value(PERSPECTIVE_SUBSCRIBE_CAPABILITY.clone()).unwrap(), - ) - .await; - - if cap_check.is_err() { - return Box::pin(stream::once(async move { Err(cap_check.err().unwrap()) })); - }; - - let pubsub = get_global_pubsub().await; - let topic = &PERSPECTIVE_LINK_ADDED_TOPIC; - - subscribe_and_process::(pubsub, topic.to_string(), Some(uuid)).await } async fn perspective_link_removed( &self, context: &RequestContext, uuid: String, - ) -> Pin> + Send>> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await; - if capabilities.is_err() { - return Box::pin(stream::once( - async move { Err(capabilities.err().unwrap()) }, - )); + ) -> Pin> + Send>> { + match check_capability(&context.capabilities, &PERSPECTIVE_SUBSCRIBE_CAPABILITY) { + Err(e) => return Box::pin(stream::once(async move { Err(e.into()) })), + Ok(_) => { + let pubsub = get_global_pubsub().await; + let topic = &PERSPECTIVE_LINK_REMOVED_TOPIC; + subscribe_and_process::( + pubsub, + topic.to_string(), + Some(uuid), + ) + .await + } } - - let cap_check = check_capabilities( - context.js_handle.clone(), - capabilities.unwrap(), - serde_json::to_value(PERSPECTIVE_SUBSCRIBE_CAPABILITY.clone()).unwrap(), - ) - .await; - - if cap_check.is_err() { - return Box::pin(stream::once(async move { Err(cap_check.err().unwrap()) })); - }; - - let pubsub = get_global_pubsub().await; - let topic = &PERSPECTIVE_LINK_REMOVED_TOPIC; - - subscribe_and_process::(pubsub, topic.to_string(), Some(uuid)).await } async fn perspective_link_updated( @@ -245,47 +157,33 @@ impl Subscription { context: &RequestContext, uuid: String, ) -> Pin> + Send>> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await; - if capabilities.is_err() { - return Box::pin(stream::once( - async move { Err(capabilities.err().unwrap()) }, - )); + match check_capability(&context.capabilities, &PERSPECTIVE_SUBSCRIBE_CAPABILITY) { + Err(e) => return Box::pin(stream::once(async move { Err(e.into()) })), + Ok(_) => { + let pubsub = get_global_pubsub().await; + let topic = &PERSPECTIVE_LINK_UPDATED_TOPIC; + subscribe_and_process::( + pubsub, + topic.to_string(), + Some(uuid), + ) + .await + } } - let pubsub = get_global_pubsub().await; - let topic = &PERSPECTIVE_LINK_UPDATED_TOPIC; - - subscribe_and_process::(pubsub, topic.to_string(), Some(uuid)) - .await } async fn perspective_removed( &self, context: &RequestContext, ) -> Pin> + Send>> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await; - if capabilities.is_err() { - return Box::pin(stream::once( - async move { Err(capabilities.err().unwrap()) }, - )); + match check_capability(&context.capabilities, &PERSPECTIVE_SUBSCRIBE_CAPABILITY) { + Err(e) => return Box::pin(stream::once(async move { Err(e.into()) })), + Ok(_) => { + let pubsub = get_global_pubsub().await; + let topic = &PERSPECTIVE_REMOVED_TOPIC; + subscribe_and_process::(pubsub, topic.to_string(), None).await + } } - - let cap_check = check_capabilities( - context.js_handle.clone(), - capabilities.unwrap(), - serde_json::to_value(PERSPECTIVE_SUBSCRIBE_CAPABILITY.clone()).unwrap(), - ) - .await; - - if cap_check.is_err() { - return Box::pin(stream::once(async move { Err(cap_check.err().unwrap()) })); - }; - - let pubsub = get_global_pubsub().await; - let topic = &PERSPECTIVE_REMOVED_TOPIC; - - subscribe_and_process::(pubsub, topic.to_string(), None).await } async fn perspective_sync_state_change( @@ -293,86 +191,47 @@ impl Subscription { context: &RequestContext, uuid: String, ) -> Pin> + Send>> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await; - if capabilities.is_err() { - return Box::pin(stream::once( - async move { Err(capabilities.err().unwrap()) }, - )); + match check_capability(&context.capabilities, &PERSPECTIVE_SUBSCRIBE_CAPABILITY) { + Err(e) => return Box::pin(stream::once(async move { Err(e.into()) })), + Ok(_) => { + let pubsub = get_global_pubsub().await; + let topic = &PERSPECTIVE_SYNC_STATE_CHANGE_TOPIC; + subscribe_and_process::( + pubsub, + topic.to_string(), + Some(uuid), + ) + .await + } } - - let cap_check = check_capabilities( - context.js_handle.clone(), - capabilities.unwrap(), - serde_json::to_value(PERSPECTIVE_SUBSCRIBE_CAPABILITY.clone()).unwrap(), - ) - .await; - - if cap_check.is_err() { - return Box::pin(stream::once(async move { Err(cap_check.err().unwrap()) })); - }; - - let pubsub = get_global_pubsub().await; - let topic = &PERSPECTIVE_SYNC_STATE_CHANGE_TOPIC; - - subscribe_and_process::(pubsub, topic.to_string(), Some(uuid)).await } async fn perspective_updated( &self, context: &RequestContext, ) -> Pin> + Send>> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await; - if capabilities.is_err() { - return Box::pin(stream::once( - async move { Err(capabilities.err().unwrap()) }, - )); + match check_capability(&context.capabilities, &PERSPECTIVE_SUBSCRIBE_CAPABILITY) { + Err(e) => return Box::pin(stream::once(async move { Err(e.into()) })), + Ok(_) => { + let pubsub = get_global_pubsub().await; + let topic = &PERSPECTIVE_UPDATED_TOPIC; + subscribe_and_process::(pubsub, topic.to_string(), None).await + } } - - let cap_check = check_capabilities( - context.js_handle.clone(), - capabilities.unwrap(), - serde_json::to_value(PERSPECTIVE_SUBSCRIBE_CAPABILITY.clone()).unwrap(), - ) - .await; - - if cap_check.is_err() { - return Box::pin(stream::once(async move { Err(cap_check.err().unwrap()) })); - }; - - let pubsub = get_global_pubsub().await; - let topic = &PERSPECTIVE_UPDATED_TOPIC; - - subscribe_and_process::(pubsub, topic.to_string(), None).await } async fn runtime_message_received( &self, context: &RequestContext, ) -> Pin> + Send>> { - let capabilities = - get_capabilies(context.js_handle.clone(), context.capability.clone()).await; - if capabilities.is_err() { - return Box::pin(stream::once( - async move { Err(capabilities.err().unwrap()) }, - )); + match check_capability(&context.capabilities, &PERSPECTIVE_SUBSCRIBE_CAPABILITY) { + Err(e) => return Box::pin(stream::once(async move { Err(e.into()) })), + Ok(_) => { + let pubsub = get_global_pubsub().await; + let topic = &RUNTIME_MESSAGED_RECEIVED_TOPIC; + subscribe_and_process::(pubsub, topic.to_string(), None) + .await + } } - - let cap_check = check_capabilities( - context.js_handle.clone(), - capabilities.unwrap(), - serde_json::to_value(PERSPECTIVE_SUBSCRIBE_CAPABILITY.clone()).unwrap(), - ) - .await; - - if cap_check.is_err() { - return Box::pin(stream::once(async move { Err(cap_check.err().unwrap()) })); - }; - - let pubsub = get_global_pubsub().await; - let topic = &RUNTIME_MESSAGED_RECEIVED_TOPIC; - - subscribe_and_process::(pubsub, topic.to_string(), None).await } } diff --git a/rust-executor/src/graphql/utils.rs b/rust-executor/src/graphql/utils.rs deleted file mode 100644 index 5114f2ff5..000000000 --- a/rust-executor/src/graphql/utils.rs +++ /dev/null @@ -1,113 +0,0 @@ -use juniper::{graphql_value, FieldError, FieldResult}; -use serde::{Deserialize, Serialize}; - -use crate::js_core::JsCoreHandle; - -pub async fn get_capabilies( - js: JsCoreHandle, - capability: String, -) -> FieldResult { - let mut js = js.clone(); - let script = format!( - r#"JSON.stringify( - await core.callResolver("Query", "getCapabilities", "{}") - )"#, - capability - ); - let result = js.execute(script).await; - match result { - Ok(result) => { - let result = serde_json::from_str::(&result)?; - match result.get("Ok") { - Some(ok) => Ok(ok - .get("capabilities") - .expect("missing capabilities") - .to_owned()), - None => Err(FieldError::new( - result.get("Error").unwrap(), - graphql_value!({ "type": "UNAUTHORIZED" }), - )), - } - } - Err(e) => Err(FieldError::new( - e.to_string(), - graphql_value!({ "type": "UNAUTHORIZED" }), - )), - } -} - -pub async fn check_capabilities( - js: JsCoreHandle, - capability: serde_json::Value, - expected_capabilities: serde_json::Value, -) -> FieldResult<()> { - let mut js = js.clone(); - - let script = format!( - r#"JSON.stringify( - await core.callResolver("Query", "checkCapability", {}, {}) - )"#, - capability, expected_capabilities - ); - let result = js.execute(script).await; - match result { - Ok(_result) => Ok(()), - Err(err) => Err(FieldError::new( - err.to_string(), - graphql_value!({ "type": "UNAUTHORIZED" }), - )), - } -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct Capability { - pub with: WithCapability, - pub can: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct WithCapability { - pub domain: String, - pub pointers: Vec, -} - -lazy_static::lazy_static! { - pub static ref AGENT: String = String::from("agent"); - pub static ref PERSPECTIVE: String = String::from("perspective"); - pub static ref RUNTIME_MESSAGES: String = String::from("runtime.messages"); - pub static ref RUNTIME_EXCEPTION: String = String::from("runtime.exception"); - pub static ref WILD_CARD: String = String::from("*"); - pub static ref SUBSCRIBE: String = String::from("SUBSCRIBE"); - - pub static ref AGENT_SUBSCRIBE_CAPABILITY: Capability = Capability { - with: WithCapability { - domain: AGENT.to_string(), - pointers: vec![WILD_CARD.to_string()], - }, - can: vec![SUBSCRIBE.to_string()], - }; - - pub static ref PERSPECTIVE_SUBSCRIBE_CAPABILITY: Capability = Capability { - with: WithCapability { - domain: PERSPECTIVE.to_string(), - pointers: vec![WILD_CARD.to_string()], - }, - can: vec![SUBSCRIBE.to_string()], - }; - - pub static ref RUNTIME_MESSAGES_SUBSCRIBE_CAPABILITY: Capability = Capability { - with: WithCapability{ - domain: RUNTIME_MESSAGES.to_string(), - pointers: vec![WILD_CARD.to_string()], - }, - can: vec![SUBSCRIBE.to_string()], - }; - - pub static ref RUNTIME_EXCEPTION_SUBSCRIBE_CAPABILITY: Capability = Capability { - with: WithCapability{ - domain: RUNTIME_EXCEPTION.to_string(), - pointers: vec![WILD_CARD.to_string()], - }, - can: vec![SUBSCRIBE.to_string()], - }; -} diff --git a/rust-executor/src/holochain_service/holochain_service_extension.rs b/rust-executor/src/holochain_service/holochain_service_extension.rs index 62dc1c08f..f36b7e20d 100644 --- a/rust-executor/src/holochain_service/holochain_service_extension.rs +++ b/rust-executor/src/holochain_service/holochain_service_extension.rs @@ -1,6 +1,6 @@ use std::borrow::Cow; -use deno_core::{error::AnyError, include_js_files, op, Extension, Op, anyhow::anyhow}; +use deno_core::{error::AnyError, include_js_files, op2, Extension, Op, anyhow::anyhow}; use holochain::{ conductor::api::AppInfo, prelude::{ @@ -21,13 +21,13 @@ const TIMEOUT_DURATION: Duration = Duration::from_secs(10); const APP_INSTALL_TIMEOUT_DURATION: Duration = Duration::from_secs(20); -#[op] -async fn start_holochain_conductor(config: LocalConductorConfig) -> Result<(), AnyError> { +#[op2(async)] +async fn start_holochain_conductor(#[serde] config: LocalConductorConfig) -> Result<(), AnyError> { HolochainService::init(config).await?; Ok(()) } -#[op] +#[op2(async)] async fn log_dht_status() -> Result<(), AnyError> { let res = timeout( TIMEOUT_DURATION, @@ -45,8 +45,9 @@ async fn log_dht_status() -> Result<(), AnyError> { } } -#[op] -async fn install_app(install_app_payload: InstallAppPayload) -> Result { +#[op2(async)] +#[serde] +async fn install_app(#[serde] install_app_payload: InstallAppPayload) -> Result { timeout( APP_INSTALL_TIMEOUT_DURATION, async { @@ -56,8 +57,9 @@ async fn install_app(install_app_payload: InstallAppPayload) -> Result Result, AnyError> { +#[op2(async)] +#[serde] +async fn get_app_info(#[string] app_id: String) -> Result, AnyError> { timeout( TIMEOUT_DURATION, async { @@ -69,13 +71,14 @@ async fn get_app_info(app_id: String) -> Result, AnyError> { //TODO //Have install app use lair to generate the membrane proof -#[op] +#[op2(async)] +#[serde] async fn call_zome_function( - app_id: String, - cell_name: String, - zome_name: String, - fn_name: String, - payload: Option, + #[string] app_id: String, + #[string] cell_name: String, + #[string] zome_name: String, + #[string] fn_name: String, + #[serde] payload: Option, ) -> Result { timeout( TIMEOUT_DURATION, @@ -86,7 +89,8 @@ async fn call_zome_function( ).await.map_err(|_| anyhow!("Timeout error"))? } -#[op] +#[op2(async)] +#[serde] async fn agent_infos() -> Result, AnyError> { timeout( TIMEOUT_DURATION, @@ -97,8 +101,8 @@ async fn agent_infos() -> Result, AnyError> { ).await.map_err(|_| anyhow!("Timeout error"))? } -#[op] -async fn add_agent_infos(agent_infos_payload: Vec) -> Result<(), AnyError> { +#[op2(async)] +async fn add_agent_infos(#[serde] agent_infos_payload: Vec) -> Result<(), AnyError> { timeout( TIMEOUT_DURATION, async { @@ -108,8 +112,8 @@ async fn add_agent_infos(agent_infos_payload: Vec) -> Result<() ).await.map_err(|_| anyhow!("Timeout error"))? } -#[op] -async fn remove_app(app_id: String) -> Result<(), AnyError> { +#[op2(async)] +async fn remove_app(#[string] app_id: String) -> Result<(), AnyError> { timeout( TIMEOUT_DURATION, async { @@ -119,8 +123,9 @@ async fn remove_app(app_id: String) -> Result<(), AnyError> { ).await.map_err(|_| anyhow!("Timeout error"))? } -#[op] -async fn sign_string(data: String) -> Result { +#[op2(async)] +#[serde] +async fn sign_string(#[string] data: String) -> Result { timeout( TIMEOUT_DURATION, async { @@ -130,7 +135,7 @@ async fn sign_string(data: String) -> Result { ).await.map_err(|_| anyhow!("Timeout error"))? } -#[op] +#[op2(async)] async fn shutdown() -> Result<(), AnyError> { timeout( TIMEOUT_DURATION, @@ -141,7 +146,8 @@ async fn shutdown() -> Result<(), AnyError> { ).await.map_err(|_| anyhow!("Timeout error"))? } -#[op] +#[op2(async)] +#[serde] async fn get_agent_key() -> Result, AnyError> { timeout( TIMEOUT_DURATION, @@ -152,8 +158,9 @@ async fn get_agent_key() -> Result, AnyError> { ).await.map_err(|_| anyhow!("Timeout error"))? } -#[op] -async fn pack_dna(path: String) -> Result { +#[op2(async)] +#[string] +async fn pack_dna(#[string] path: String) -> Result { timeout( TIMEOUT_DURATION, async { @@ -163,8 +170,9 @@ async fn pack_dna(path: String) -> Result { ).await.map_err(|_| anyhow!("Timeout error"))? } -#[op] -async fn unpack_dna(path: String) -> Result { +#[op2(async)] +#[string] +async fn unpack_dna(#[string] path: String) -> Result { timeout( TIMEOUT_DURATION, async { diff --git a/rust-executor/src/holochain_service/mod.rs b/rust-executor/src/holochain_service/mod.rs index 9d76420c6..68d74e8aa 100644 --- a/rust-executor/src/holochain_service/mod.rs +++ b/rust-executor/src/holochain_service/mod.rs @@ -7,6 +7,7 @@ use deno_core::anyhow::anyhow; use deno_core::error::AnyError; use holochain::conductor::api::{AppInfo, CellInfo, ZomeCall}; use holochain::conductor::config::ConductorConfig; +use holochain::conductor::paths::DataRootPath; use holochain::conductor::{ConductorBuilder, ConductorHandle}; use holochain::prelude::agent_store::AgentInfoSigned; use holochain::prelude::hash_type::Agent; @@ -37,6 +38,23 @@ pub(crate) use interface::{ use self::interface::set_holochain_service; +const COASYS_BOOTSTRAP_AGENT_INFO: &str = r#"["g6VhZ2VudMQkjjQGnd0y3eNvqw351QN/BcffiZg6J9G14EgVJF8xtboPJ1JhqXNpZ25hdHVyZcRA9bcq8D4YjAyktbBUbY4pRvGLBMmWpi97gtpYH57Wk9C+ZqaN3uJ9w66c0wNVyCUZYRc5bqx86x2cug9osTiBBKphZ2VudF9pbmZvxQEEhqVzcGFjZcQkPQg0AmUOishkx9wPmcfqHh5ddjhlO9qItiC8g1xaUhEgi4lKpWFnZW50xCSONAad3TLd42+rDfnVA38Fx9+JmDon0bXgSBUkXzG1ug8nUmGkdXJsc5HZSXdzczovL3NpZ25hbC5ob2xvLmhvc3QvdHg1LXdzLzVNUlROTTJKVlZ5eXJTaXplUDBqdkZNc0V5dE9fWURXWGhSTTM5X1V5eHesc2lnbmVkX2F0X21zzwAAAY5bJg50sGV4cGlyZXNfYWZ0ZXJfbXPOABJPgKltZXRhX2luZm/EIoG7ZGh0X3N0b3JhZ2VfYXJjX2hhbGZfbGVuZ3RozoAAAAE=","g6VhZ2VudMQkYR6gjJDtHwyVLgPyMPxqCTlWqrF/M1IwpuCe954g16kCqIyAqXNpZ25hdHVyZcRAgDSxZYBoaMCYfs73SXq4qJ4mrqurWdMee+ZBQcuyIK3hmd4mOjJntVhUWYAl2VipbHZURQetUsxOQF0N6NskDqphZ2VudF9pbmZvxQEEhqVzcGFjZcQk9oJTRkGwgXj5TsmcXpOw2fxaP10UwrJQ1ZPRxOHb7AveMw5rpWFnZW50xCRhHqCMkO0fDJUuA/Iw/GoJOVaqsX8zUjCm4J73niDXqQKojICkdXJsc5HZSXdzczovL3NpZ25hbC5ob2xvLmhvc3QvdHg1LXdzL1VEemtzYTV0T0hNZHFoMkNKTmpjdVVTSThfal9qOGFCU3ZkdS1vdGpERHesc2lnbmVkX2F0X21zzwAAAY5bKCi6sGV4cGlyZXNfYWZ0ZXJfbXPOABJPgKltZXRhX2luZm/EIoG7ZGh0X3N0b3JhZ2VfYXJjX2hhbGZfbGVuZ3RozoAAAAE=","g6VhZ2VudMQk5NcjXGZZr0jOYrZp4KF2TaZuEmj5PBCh28xhYOQQJEP/SspSqXNpZ25hdHVyZcRAlv/7sPGLR6VX/2JDKx3wyw3//6EIj/EX3DOmRVkS2R13qORs3nDUhQ51So+0nc/gwWHWcg20pxQRBKGkEeOLDqphZ2VudF9pbmZvxQEEhqVzcGFjZcQkV3IE5ULOpAblNonA9Wr627RpfzdQAgHoQIaKIr5Zzkw/FltDpWFnZW50xCTk1yNcZlmvSM5itmngoXZNpm4SaPk8EKHbzGFg5BAkQ/9KylKkdXJsc5HZSXdzczovL3NpZ25hbC5ob2xvLmhvc3QvdHg1LXdzL3dPTGU1QVRxQU9BQmVNTXJlSWM0WEp4SmtmWXZjemhHTEthY3htdjRfemOsc2lnbmVkX2F0X21zzwAAAY5oI18MsGV4cGlyZXNfYWZ0ZXJfbXPOABJPgKltZXRhX2luZm/EIoG7ZGh0X3N0b3JhZ2VfYXJjX2hhbGZfbGVuZ3RozoAAAAE=","g6VhZ2VudMQkQbRRlHmaJ/2SuywnYDVHZVFcb6ih1pHi68mvZVwHEIIV1vuEqXNpZ25hdHVyZcRATk3GJzOYYVAf8eNyWXEKFimESKwM8PD1HbOWRovxlgTpiUZr44eOphdohH/IK57zY46sgbgmWntySxBPN8yrCqphZ2VudF9pbmZvxQEEhqVzcGFjZcQkV3IE5ULOpAblNonA9Wr627RpfzdQAgHoQIaKIr5Zzkw/FltDpWFnZW50xCRBtFGUeZon/ZK7LCdgNUdlUVxvqKHWkeLrya9lXAcQghXW+4SkdXJsc5HZSXdzczovL3NpZ25hbC5ob2xvLmhvc3QvdHg1LXdzL0E3azZBb1hCcERjZmhnbVMyRWR6WkFGNmRxb1hOU3cwbG4zNlV3VHB3d3esc2lnbmVkX2F0X21zzwAAAY5oI0OqsGV4cGlyZXNfYWZ0ZXJfbXPOABJPgKltZXRhX2luZm/EIoG7ZGh0X3N0b3JhZ2VfYXJjX2hhbGZfbGVuZ3RozoAAAAE=","g6VhZ2VudMQk5NcjXGZZr0jOYrZp4KF2TaZuEmj5PBCh28xhYOQQJEP/SspSqXNpZ25hdHVyZcRA9+m4o8S0OrPgkjsqJoIQZ6W9EELRA2xZg6cTVhRIrpGcUn/o6hEbXGWfxrEk4THZODxRXMNHigh3MmtAZ4y9CaphZ2VudF9pbmZvxQEEhqVzcGFjZcQklxWgNc13qMIF710YH2pZIrjFH1XtVjyKL04lMcMILyFejerPpWFnZW50xCTk1yNcZlmvSM5itmngoXZNpm4SaPk8EKHbzGFg5BAkQ/9KylKkdXJsc5HZSXdzczovL3NpZ25hbC5ob2xvLmhvc3QvdHg1LXdzL3dPTGU1QVRxQU9BQmVNTXJlSWM0WEp4SmtmWXZjemhHTEthY3htdjRfemOsc2lnbmVkX2F0X21zzwAAAY5oIsPYsGV4cGlyZXNfYWZ0ZXJfbXPOABJPgKltZXRhX2luZm/EIoG7ZGh0X3N0b3JhZ2VfYXJjX2hhbGZfbGVuZ3RozoAAAAE=","g6VhZ2VudMQkjjQGnd0y3eNvqw351QN/BcffiZg6J9G14EgVJF8xtboPJ1JhqXNpZ25hdHVyZcRAM9eEupFv62L9HK5NELDCVdJsbpocdmaybuLTBzc30Sm0CI3rQ2BGlRFWRzajYfzfACURF+JRM1gqcbZ2q7KiBaphZ2VudF9pbmZvxQEEhqVzcGFjZcQkyTpTbofXI6V7nagFNAXn3AvXHmVkCHJ7Uh3fYJWUre/zH6skpWFnZW50xCSONAad3TLd42+rDfnVA38Fx9+JmDon0bXgSBUkXzG1ug8nUmGkdXJsc5HZSXdzczovL3NpZ25hbC5ob2xvLmhvc3QvdHg1LXdzLzVNUlROTTJKVlZ5eXJTaXplUDBqdkZNc0V5dE9fWURXWGhSTTM5X1V5eHesc2lnbmVkX2F0X21zzwAAAY5bJfS7sGV4cGlyZXNfYWZ0ZXJfbXPOABJPgKltZXRhX2luZm/EIoG7ZGh0X3N0b3JhZ2VfYXJjX2hhbGZfbGVuZ3RozoAAAAE=","g6VhZ2VudMQkYR6gjJDtHwyVLgPyMPxqCTlWqrF/M1IwpuCe954g16kCqIyAqXNpZ25hdHVyZcRAm3cIZoSV10b/9DjnqXmnvN+540/tzL+pt0uxNOMI8WlMut+v3zN3OaKn7JFQADK4uuukWSdsgivBwoC97UF9CaphZ2VudF9pbmZvxQEEhqVzcGFjZcQkbuFteSq4HRRld55JZKTjbahhHQAcoH6T281H4E2Ha7834VoOpWFnZW50xCRhHqCMkO0fDJUuA/Iw/GoJOVaqsX8zUjCm4J73niDXqQKojICkdXJsc5HZSXdzczovL3NpZ25hbC5ob2xvLmhvc3QvdHg1LXdzL1VEemtzYTV0T0hNZHFoMkNKTmpjdVVTSThfal9qOGFCU3ZkdS1vdGpERHesc2lnbmVkX2F0X21zzwAAAY5bJSt1sGV4cGlyZXNfYWZ0ZXJfbXPOABJPgKltZXRhX2luZm/EIoG7ZGh0X3N0b3JhZ2VfYXJjX2hhbGZfbGVuZ3RozoAAAAE=","g6VhZ2VudMQkjjQGnd0y3eNvqw351QN/BcffiZg6J9G14EgVJF8xtboPJ1JhqXNpZ25hdHVyZcRA/MGKEUZyzLX7T5aoTwMD6Xa6CwUCWl5YDEY/U49SR07sakCNkm6g2cXQBibSPoS+BIu/zFE/meVe9WTA0xAHAKphZ2VudF9pbmZvxQEEhqVzcGFjZcQkbuFteSq4HRRld55JZKTjbahhHQAcoH6T281H4E2Ha7834VoOpWFnZW50xCSONAad3TLd42+rDfnVA38Fx9+JmDon0bXgSBUkXzG1ug8nUmGkdXJsc5HZSXdzczovL3NpZ25hbC5ob2xvLmhvc3QvdHg1LXdzLzVNUlROTTJKVlZ5eXJTaXplUDBqdkZNc0V5dE9fWURXWGhSTTM5X1V5eHesc2lnbmVkX2F0X21zzwAAAY5bJ+kUsGV4cGlyZXNfYWZ0ZXJfbXPOABJPgKltZXRhX2luZm/EIoG7ZGh0X3N0b3JhZ2VfYXJjX2hhbGZfbGVuZ3RozoAAAAE="]"#; + +pub fn agent_infos_from_str(agent_infos: &str) -> Result, AnyError> { + let agent_infos: Vec = serde_json::from_str(&agent_infos)?; + let agent_infos: Vec = agent_infos + .into_iter() + .map(|encoded_info| { + let info_bytes = base64::decode(encoded_info) + .expect("Failed to decode base64 AgentInfoSigned"); + AgentInfoSigned::decode(&info_bytes) + .expect("Failed to decode AgentInfoSigned") + }) + .collect(); + + Ok(agent_infos) +} + #[derive(Clone)] pub struct HolochainService { pub conductor: ConductorHandle, @@ -114,7 +132,7 @@ impl HolochainService { match message { HolochainServiceRequest::InstallApp(payload, response) => { match timeout( - std::time::Duration::from_secs(10), + std::time::Duration::from_secs(10), service.install_app(payload) ).await.map_err(|_| anyhow!("Timeout error; InstallApp call")) { Ok(result) => { @@ -134,7 +152,7 @@ impl HolochainService { response, } => { match timeout( - std::time::Duration::from_secs(5), + std::time::Duration::from_secs(5), service.call_zome_function(app_id, cell_name, zome_name, fn_name, payload) ).await.map_err(|_| anyhow!("Timeout error; Call Zome Function")) { Ok(result) => { @@ -147,7 +165,7 @@ impl HolochainService { } HolochainServiceRequest::RemoveApp(app_id, response_tx) => { match timeout( - std::time::Duration::from_secs(10), + std::time::Duration::from_secs(10), service.remove_app(app_id) ).await.map_err(|_| anyhow!("Timeout error; Remove App")) { Ok(result) => { @@ -160,7 +178,7 @@ impl HolochainService { } HolochainServiceRequest::AgentInfos(response_tx) => { match timeout( - std::time::Duration::from_secs(3), + std::time::Duration::from_secs(3), service.agent_infos() ).await.map_err(|_| anyhow!("Timeout error; AgentInfos")) { Ok(result) => { @@ -173,7 +191,7 @@ impl HolochainService { } HolochainServiceRequest::AddAgentInfos(agent_infos, response_tx) => { match timeout( - std::time::Duration::from_secs(3), + std::time::Duration::from_secs(3), service.add_agent_infos(agent_infos) ).await.map_err(|_| anyhow!("Timeout error; AddAgentInfos")) { Ok(result) => { @@ -186,7 +204,7 @@ impl HolochainService { } HolochainServiceRequest::Sign(data, response_tx) => { match timeout( - std::time::Duration::from_secs(3), + std::time::Duration::from_secs(3), service.sign(data) ).await.map_err(|_| anyhow!("Timeout error; Sign")) { Ok(result) => { @@ -199,7 +217,7 @@ impl HolochainService { } HolochainServiceRequest::Shutdown(response_tx) => { match timeout( - std::time::Duration::from_secs(3), + std::time::Duration::from_secs(3), service.shutdown() ).await.map_err(|_| anyhow!("Timeout error Shutdown")) { Ok(result) => { @@ -212,7 +230,7 @@ impl HolochainService { } HolochainServiceRequest::GetAgentKey(response_tx) => { match timeout( - std::time::Duration::from_secs(3), + std::time::Duration::from_secs(3), service.get_agent_key() ).await.map_err(|_| anyhow!("Timeout error; GetAgentKey")) { Ok(result) => { @@ -225,7 +243,7 @@ impl HolochainService { } HolochainServiceRequest::GetAppInfo(app_id, response_tx) => { match timeout( - std::time::Duration::from_secs(3), + std::time::Duration::from_secs(3), service.get_app_info(app_id) ).await.map_err(|_| anyhow!("Timeout error; GetAppInfo")) { Ok(result) => { @@ -238,7 +256,7 @@ impl HolochainService { } HolochainServiceRequest::LogNetworkMetrics(response_tx) => { match timeout( - std::time::Duration::from_secs(3), + std::time::Duration::from_secs(3), service.log_network_metrics() ).await.map_err(|_| anyhow!("Timeout error; LogNetworkMetrics")) { Ok(result) => { @@ -251,7 +269,7 @@ impl HolochainService { } HolochainServiceRequest::PackDna(path, response_tx) => { match timeout( - std::time::Duration::from_secs(3), + std::time::Duration::from_secs(3), HolochainService::pack_dna(path) ).await.map_err(|_| anyhow!("Timeout error; PackDna")) { Ok(result) => { @@ -264,7 +282,7 @@ impl HolochainService { } HolochainServiceRequest::UnPackDna(path, response_tx) => { match timeout( - std::time::Duration::from_secs(3), + std::time::Duration::from_secs(3), HolochainService::unpack_dna(path) ).await.map_err(|_| anyhow!("Timeout error; UnpackDna")) { Ok(result) => { @@ -295,6 +313,8 @@ impl HolochainService { _ => unreachable!(), }; + inteface.add_agent_infos(agent_infos_from_str(COASYS_BOOTSTRAP_AGENT_INFO).expect("Couldn't deserialize hard-wired AgentInfo")).await?; + set_holochain_service(inteface).await; Ok(()) @@ -308,17 +328,18 @@ impl HolochainService { config } else { let mut config = ConductorConfig::default(); - config.environment_path = PathBuf::from(local_config.conductor_path.clone()).into(); + let data_root_path: DataRootPath = PathBuf::from(local_config.conductor_path.clone()).into(); + config.data_root_path = Some(data_root_path); config.admin_interfaces = None; let mut kitsune_config = KitsuneP2pConfig::default(); - let mut tuning_params = KitsuneP2pTuningParams::default().as_ref().clone(); + let tuning_params = KitsuneP2pTuningParams::default().as_ref().clone(); // How long should we hold off talking to a peer // we've previously gotten errors speaking to. // [Default: 5 minute; now updated to 2 minutes] // tuning_params.gossip_peer_on_error_next_gossip_delay_ms = 1000 * 60 * 2; - + // How often should we update and publish our agent info? // [Default: 5 minutes; now updated to 2 minutes] // tuning_params.gossip_agent_info_update_interval_ms = 1000 * 60 * 2; @@ -326,6 +347,10 @@ impl HolochainService { kitsune_config.tuning_params = Arc::new(tuning_params); if local_config.use_bootstrap { + // prod - https://bootstrap.holo.host + // staging - https://bootstrap-staging.holo.host + // dev - https://bootstrap-dev.holohost.workers.dev + // own - http://207.148.16.17:38245 kitsune_config.bootstrap_service = Some(Url2::parse(local_config.bootstrap_url)); } else { kitsune_config.bootstrap_service = None; @@ -337,6 +362,9 @@ impl HolochainService { } if local_config.use_proxy { kitsune_config.transport_pool = vec![TransportConfig::WebRTC { + // prod - wss://signal.holo.host + // dev - wss://signal.holotest.net + // our - ws://207.148.16.17:42697 signal_url: local_config.proxy_url, }]; } else { @@ -347,9 +375,7 @@ impl HolochainService { }, ]; } - config.network = Some(kitsune_config); - - println!("wow 1 {:?}", config); + config.network = kitsune_config; config }; @@ -361,9 +387,9 @@ impl HolochainService { .build() .await; - if conductor.is_err() { - info!("Could not start holochain conductor: {:#?}", conductor.err()); - panic!("Could not start holochain conductor"); + if let Err(e) = conductor { + info!("Could not start holochain conductor: {:#?}", e); + panic!("Could not start holochain conductor: {:#?}", e); } info!("Started holochain conductor"); @@ -566,10 +592,11 @@ impl HolochainService { pub async fn log_network_metrics(&self) -> Result<(), AnyError> { let metrics = self.conductor.dump_network_metrics(None).await?; - info!("Network metrics: {}", serde_json::to_string_pretty(&serde_json::Value::try_from(metrics)?)?); + info!("Network metrics: {}",metrics); let stats = self.conductor.dump_network_stats().await?; - info!("Network stats: {}", serde_json::to_string_pretty(&serde_json::Value::try_from(stats)?)?); + info!("Network stats: {}", stats); + Ok(()) } diff --git a/rust-executor/src/js_core/agent_extension.js b/rust-executor/src/js_core/agent_extension.js new file mode 100644 index 000000000..59476085d --- /dev/null +++ b/rust-executor/src/js_core/agent_extension.js @@ -0,0 +1,39 @@ +((globalThis) => { + const core = Deno.core; + + globalThis.AGENT = { + didDocument: () => { + return core.ops.agent_did_document(); + }, + signingKeyId: () => { + return core.ops.agent_signing_key_id(); + }, + did: () => { + return core.ops.agent_did(); + }, + createSignedExpression: (data) => { + try { + return core.ops.agent_create_signed_expression(data); + } catch (error) { + console.error("Error calling agent_create_signed_expression:", error); + console.error("Data was:", data) + console.log("Falling back to stringified version") + try { + let stringified = JSON.stringify(data); + let resultString = core.ops.agent_create_signed_expression_stringified(stringified) + let result = JSON.parse(resultString); + return result; + } catch (error) { + console.error("Error calling agent_create_signed_expression_stringified:", error); + console.error("Data was:", JSON.stringify(data)) + } + } + }, + sign: (payload) => { + return core.ops.agent_sign(payload); + }, + signStringHex: (payload) => { + return core.ops.agent_sign_string_hex(payload); + }, + }; +})(globalThis); \ No newline at end of file diff --git a/rust-executor/src/js_core/agent_extension.rs b/rust-executor/src/js_core/agent_extension.rs new file mode 100644 index 000000000..eb9c33981 --- /dev/null +++ b/rust-executor/src/js_core/agent_extension.rs @@ -0,0 +1,72 @@ +use deno_core::{error::AnyError, include_js_files, op2, Extension, Op}; +use std::borrow::Cow; +use crate::agent::{create_signed_expression, did, did_document, sign, sign_string_hex, signing_key_id}; + +use super::utils::sort_json_value; + +#[op2] +#[serde] +fn agent_did_document() -> Result { + Ok(did_document()) +} + +#[op2] +#[string] +fn agent_signing_key_id() -> Result { + Ok(signing_key_id()) +} + +#[op2] +#[string] +fn agent_did() -> Result { + Ok(did()) +} + +#[op2] +#[serde] +fn agent_create_signed_expression(#[serde] data: serde_json::Value) -> Result { + let sorted_json = sort_json_value(&data); + let signed_expression = create_signed_expression(sorted_json)?; + Ok(serde_json::to_value(signed_expression)?) +} + +#[op2] +#[string] +fn agent_create_signed_expression_stringified(#[string] data: String) -> Result { + let data: serde_json::Value = serde_json::from_str(&data)?; + let sorted_json = sort_json_value(&data); + let signed_expression = create_signed_expression(sorted_json)?; + let stringified = serde_json::to_string(&signed_expression)?; + Ok(stringified) +} + +#[op2] +#[serde] +fn agent_sign(#[buffer] payload: &[u8]) -> Result, AnyError> { + sign(payload) +} + + +#[op2] +#[string] +fn agent_sign_string_hex(#[string] payload: String) -> Result { + sign_string_hex(payload) +} + + +pub fn build() -> Extension { + Extension { + name: "agent", + js_files: Cow::Borrowed(&include_js_files!(rust_executor "src/js_core/agent_extension.js",)), + ops: Cow::Borrowed(&[ + agent_did_document::DECL, + agent_signing_key_id::DECL, + agent_did::DECL, + agent_create_signed_expression::DECL, + agent_create_signed_expression_stringified::DECL, + agent_sign::DECL, + agent_sign_string_hex::DECL, + ]), + ..Default::default() + } +} \ No newline at end of file diff --git a/rust-executor/src/js_core/jwt_extension.js b/rust-executor/src/js_core/jwt_extension.js deleted file mode 100644 index 2059d9ae4..000000000 --- a/rust-executor/src/js_core/jwt_extension.js +++ /dev/null @@ -1,13 +0,0 @@ -((globalThis) => { - const core = Deno.core; - - globalThis.JWT = { - generateJwt: async (issuer, audience, expiration_time, capabilities) => { - return core.opAsync("generate_jwt", issuer, audience, expiration_time, capabilities); - }, - verifyJwt: async (token) => { - return core.opAsync("verify_jwt", token); - } - }; - })(globalThis); - \ No newline at end of file diff --git a/rust-executor/src/js_core/jwt_extension.rs b/rust-executor/src/js_core/jwt_extension.rs deleted file mode 100644 index b64ee6bc2..000000000 --- a/rust-executor/src/js_core/jwt_extension.rs +++ /dev/null @@ -1,119 +0,0 @@ -use std::{time::{SystemTime, UNIX_EPOCH}, borrow::Cow}; - -use deno_core::{anyhow::anyhow, error::AnyError, include_js_files, op, Extension, Op}; -use jsonwebtoken::{encode, Algorithm, DecodingKey, EncodingKey, Header}; -use serde::{Deserialize, Serialize}; - -use crate::wallet::Wallet; - -#[derive(Debug, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct AuthInfoExtended { - request_id: String, - auth: AuthInfo, -} - -#[derive(Debug, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct AuthInfo { - app_name: String, - app_desc: String, - app_domain: Option, - app_url: Option, - app_icon_path: Option, - capabilities: Option>, -} - -#[derive(Debug, Serialize, Deserialize)] -pub struct Capability { - with: Resource, - can: Vec, -} - -#[derive(Debug, Serialize, Deserialize)] -pub struct Resource { - domain: String, - pointers: Vec, -} - -#[derive(Debug, Serialize, Deserialize)] -struct Claims { - iss: String, - aud: String, - exp: u64, - iat: u64, - capabilities: AuthInfo, -} - -#[op] -async fn generate_jwt( - issuer: String, - audience: String, - expiration_time: u64, - capabilities: AuthInfo, -) -> Result { - // Get the private key - let wallet = Wallet::instance(); - let wallet_lock = wallet.lock().expect("wallet lock"); - let wallet_ref = wallet_lock.as_ref().expect("wallet instance"); - let name = "main".to_string(); - - let secret_key = wallet_ref - .get_secret_key(&name) - .ok_or(anyhow!("main key not found. call createMainKey() first"))?; - - let now = SystemTime::now(); - let unix_timestamp = now - .duration_since(UNIX_EPOCH) - .expect("Time went backwards") - .as_secs(); - - let payload = Claims { - iss: issuer, - aud: audience, - exp: unix_timestamp + expiration_time, - iat: unix_timestamp, - capabilities: capabilities, - }; - - let token = encode( - &Header::default(), - &payload, - &EncodingKey::from_secret(secret_key.as_slice()), - )?; - - Ok(token) -} - -#[op] -async fn verify_jwt(token: String) -> Result { - //Get the private key - let wallet = Wallet::instance(); - let wallet_lock = wallet.lock().expect("wallet lock"); - let wallet_ref = wallet_lock.as_ref().expect("wallet instance"); - let name = "main".to_string(); - - let secret_key = wallet_ref - .get_secret_key(&name) - .ok_or(anyhow!("main key not found. call createMainKey() first"))?; - - let result = jsonwebtoken::decode::( - &token, - &DecodingKey::from_secret(secret_key.as_slice()), - &jsonwebtoken::Validation::new(Algorithm::HS256), - )?; - - Ok(result.claims) -} - -pub fn build() -> Extension { - Extension { - name: "jwt", - js_files: Cow::Borrowed(&include_js_files!(holochain_service "src/js_core/jwt_extension.js",)), - ops: Cow::Borrowed(&[ - generate_jwt::DECL, - verify_jwt::DECL - ]), - ..Default::default() - } -} diff --git a/rust-executor/src/js_core/languages_extension.js b/rust-executor/src/js_core/languages_extension.js new file mode 100644 index 000000000..d586344bf --- /dev/null +++ b/rust-executor/src/js_core/languages_extension.js @@ -0,0 +1,16 @@ +((globalThis) => { + const core = Deno.core; + + globalThis.LANGUAGE_CONTROLLER = { + perspectiveDiffReceived: (diff, language_address) => { + return core.ops.perspective_diff_received(diff, language_address); + }, + syncStateChanged: (syncState, language_address) => { + return core.ops.sync_state_changed(syncState, language_address); + }, + telepresenceSignalReceived: (signal, language_address) => { + return core.ops.telepresence_signal_received(signal, language_address); + }, + }; + })(globalThis); + \ No newline at end of file diff --git a/rust-executor/src/js_core/languages_extension.rs b/rust-executor/src/js_core/languages_extension.rs new file mode 100644 index 000000000..7e08d2410 --- /dev/null +++ b/rust-executor/src/js_core/languages_extension.rs @@ -0,0 +1,47 @@ +use std::borrow::Cow; +use deno_core::{include_js_files, op2, Extension, Op}; + +use crate::{graphql::graphql_types::{PerspectiveExpression, PerspectiveState}, types::PerspectiveDiff}; + + +#[op2] +#[serde] +fn perspective_diff_received( + #[serde] diff: PerspectiveDiff, + #[string] language_address: String +) { + crate::perspectives::handle_perspective_diff_from_link_language(diff, language_address); +} + +#[op2] +#[serde] +fn sync_state_changed( + #[serde] state: PerspectiveState, + #[string] language_address: String +) { + crate::perspectives::handle_sync_state_changed_from_link_language(state, language_address); +} + + +#[op2] +#[serde] +fn telepresence_signal_received( + #[serde] signal: PerspectiveExpression, + #[string] language_address: String +) { + crate::perspectives::handle_telepresence_signal_from_link_language(signal, language_address); +} + + +pub fn build() -> Extension { + Extension { + name: "agent", + js_files: Cow::Borrowed(&include_js_files!(rust_executor "src/js_core/languages_extension.js",)), + ops: Cow::Borrowed(&[ + perspective_diff_received::DECL, + sync_state_changed::DECL, + telepresence_signal_received::DECL, + ]), + ..Default::default() + } +} \ No newline at end of file diff --git a/rust-executor/src/js_core/mod.rs b/rust-executor/src/js_core/mod.rs index 8e0cff76f..6bb449168 100644 --- a/rust-executor/src/js_core/mod.rs +++ b/rust-executor/src/js_core/mod.rs @@ -19,13 +19,16 @@ use tokio::sync::{ use log::{error, info}; use options::{main_module_url, main_worker_options}; +mod agent_extension; mod futures; -mod jwt_extension; mod options; +mod languages_extension; mod pubsub_extension; +mod signature_extension; mod string_module_loader; mod utils_extension; mod wallet_extension; +mod utils; use self::futures::{EventLoopFuture, SmartGlobalVariableFuture}; use crate::holochain_service::maybe_get_holochain_service; @@ -100,6 +103,7 @@ impl JsCoreHandle { #[derive(Debug)] struct JsCoreRequest { script: String, + #[allow(dead_code)] id: String, response_tx: oneshot::Sender } @@ -158,7 +162,7 @@ impl JsCore { .worker .lock() .await; - worker.bootstrap(&BootstrapOptions::default()); + worker.bootstrap(BootstrapOptions::default()); worker .execute_main_module(&main_module_url()) .await diff --git a/rust-executor/src/js_core/options.rs b/rust-executor/src/js_core/options.rs index 9314aaa3a..0d9194529 100644 --- a/rust-executor/src/js_core/options.rs +++ b/rust-executor/src/js_core/options.rs @@ -3,8 +3,8 @@ use std::{collections::HashMap, rc::Rc}; use url::Url; use super::{ - jwt_extension, pubsub_extension, string_module_loader::StringModuleLoader, utils_extension, - wallet_extension, + pubsub_extension, string_module_loader::StringModuleLoader, utils_extension, + wallet_extension, signature_extension, agent_extension, languages_extension, }; use crate::holochain_service::holochain_service_extension; use crate::prolog_service::prolog_service_extension; @@ -21,7 +21,7 @@ pub fn module_map() -> HashMap { ); map.insert( "https://ad4m.runtime/executor".to_string(), - include_str!("../../../executor/lib/bundle.js").to_string(), + include_str!("../../executor/lib/bundle.js").to_string(), ); map } @@ -36,8 +36,10 @@ pub fn main_worker_options() -> WorkerOptions { let utils_ext = utils_extension::build(); let sub_ext = pubsub_extension::build(); let holochain_ext = holochain_service_extension::build(); - let jwt_ext = jwt_extension::build(); let prolog_ext = prolog_service_extension::build(); + let signature_ext = signature_extension::build(); + let agent_ext = agent_extension::build(); + let languages_ext = languages_extension::build(); WorkerOptions { extensions: vec![ @@ -45,8 +47,10 @@ pub fn main_worker_options() -> WorkerOptions { utils_ext, sub_ext, holochain_ext, - jwt_ext, prolog_ext, + signature_ext, + agent_ext, + languages_ext, ], module_loader: Rc::new(loader), ..Default::default() diff --git a/rust-executor/src/js_core/pubsub_extension.rs b/rust-executor/src/js_core/pubsub_extension.rs index 28feb5bb4..52e27faf0 100644 --- a/rust-executor/src/js_core/pubsub_extension.rs +++ b/rust-executor/src/js_core/pubsub_extension.rs @@ -1,16 +1,17 @@ use std::borrow::Cow; -use deno_core::{error::AnyError, include_js_files, op, Extension, Op}; +use deno_core::{error::AnyError, include_js_files, op2, Extension, Op}; use crate::pubsub::get_global_pubsub; -#[op] -async fn publish(topic: String, data: String) -> Result<(), AnyError> { +#[op2(async)] +async fn publish(#[string] topic: String, #[string] data: String) -> Result<(), AnyError> { let pub_sub = get_global_pubsub().await; pub_sub.publish(&topic, &data).await; Ok(()) } + pub fn build() -> Extension { Extension { name: "pubsub", diff --git a/rust-executor/src/js_core/signature_extension.js b/rust-executor/src/js_core/signature_extension.js new file mode 100644 index 000000000..64118d8e1 --- /dev/null +++ b/rust-executor/src/js_core/signature_extension.js @@ -0,0 +1,14 @@ +((globalThis) => { + const core = Deno.core; + + globalThis.SIGNATURE = { + verifyStringSignedByDID: (did, didSigningKeyId, data, signedData) => { + let { isValid } = core.ops.signature_verify_string_signed_by_did(did, didSigningKeyId, data, signedData) + return isValid; + }, + verify: (expression) => { + let { isValid } = core.ops.signature_verify(expression); + return isValid; + } + }; +})(globalThis); \ No newline at end of file diff --git a/rust-executor/src/js_core/signature_extension.rs b/rust-executor/src/js_core/signature_extension.rs new file mode 100644 index 000000000..429ad3685 --- /dev/null +++ b/rust-executor/src/js_core/signature_extension.rs @@ -0,0 +1,51 @@ +use deno_core::{error::AnyError, include_js_files, op2, Extension, Op}; +use serde::{Deserialize, Serialize}; +use std::borrow::Cow; +use crate::types::Expression; +use crate::agent::signatures::{verify_string_signed_by_did, verify}; + +use super::utils::sort_json_value; + +#[derive(Serialize, Deserialize, Clone)] +#[serde(rename_all = "camelCase")] +pub struct SignatureVerificationResult { + pub is_valid: bool, +} + +#[op2] +#[serde] +fn signature_verify_string_signed_by_did( + #[string] did: String, + #[string] data: String, + #[string] signed_data: String, +) -> Result { + let is_valid = verify_string_signed_by_did(&did, &data, &signed_data)?; + Ok(SignatureVerificationResult { is_valid }) +} + +#[op2] +#[serde] +fn signature_verify( + #[serde] expr: Expression, +) -> Result { + let sorted_expression = Expression { + author: expr.author, + timestamp: expr.timestamp, + data: sort_json_value(&expr.data), + proof: expr.proof, + }; + let is_valid = verify(&sorted_expression)?; + Ok(SignatureVerificationResult { is_valid }) +} + +pub fn build() -> Extension { + Extension { + name: "signature", + js_files: Cow::Borrowed(&include_js_files!(rust_executor "src/js_core/signature_extension.js",)), + ops: Cow::Borrowed(&[ + signature_verify_string_signed_by_did::DECL, + signature_verify::DECL, + ]), + ..Default::default() + } +} \ No newline at end of file diff --git a/rust-executor/src/js_core/utils.rs b/rust-executor/src/js_core/utils.rs new file mode 100644 index 000000000..26101fad5 --- /dev/null +++ b/rust-executor/src/js_core/utils.rs @@ -0,0 +1,17 @@ +use std::collections::BTreeMap; + +pub fn sort_json_value(value: &serde_json::Value) -> serde_json::Value { + match value { + serde_json::Value::Object(obj) => { + let mut map = BTreeMap::new(); + for (k, v) in obj { + map.insert(k.clone(), sort_json_value(v)); + } + serde_json::Value::Object(serde_json::Map::from_iter(map.into_iter())) + }, + serde_json::Value::Array(arr) => { + serde_json::Value::Array(arr.iter().map(sort_json_value).collect()) + }, + _ => value.clone(), + } +} \ No newline at end of file diff --git a/rust-executor/src/js_core/utils_extension.rs b/rust-executor/src/js_core/utils_extension.rs index ece2caa2a..76093e679 100644 --- a/rust-executor/src/js_core/utils_extension.rs +++ b/rust-executor/src/js_core/utils_extension.rs @@ -1,15 +1,16 @@ use std::borrow::Cow; use cid::Cid; -use deno_core::{error::AnyError, include_js_files, op, Extension, Op}; +use deno_core::{error::AnyError, include_js_files, op2, Extension, Op}; use multibase::Base; use multihash::{Code, MultihashDigest}; use log::{error, info, debug, warn}; use super::JS_CORE_HANDLE; -#[op] -fn hash(data: String) -> Result { +#[op2] +#[string] +fn hash(#[string] data: String) -> Result { // Compute the SHA-256 multihash let multihash = Code::Sha2_256.digest(data.as_bytes()); @@ -22,36 +23,41 @@ fn hash(data: String) -> Result { Ok(format!("Qm{}", encoded_cid)) } -#[op] -fn console_log(data: String) -> Result { - info!("[JSCORE]: {:?}", data); +#[op2] +#[string] +fn console_log(#[string] data: String) -> Result { + info!("[JSCORE]: {}", data); Ok(String::from("temp")) } -#[op] -fn console_debug(data: String) -> Result { - debug!("[JSCORE]: {:?}", data); +#[op2] +#[string] +fn console_debug(#[string] data: String) -> Result { + debug!("[JSCORE]: {}", data); Ok(String::from("temp")) } -#[op] -fn console_error(data: String) -> Result { - error!("[JSCORE]: {:?}", data); +#[op2] +#[string] +fn console_error(#[string] data: String) -> Result { + error!("[JSCORE]: {}", data); Ok(String::from("temp")) } -#[op] -fn console_warn(data: String) -> Result { - warn!("[JSCORE]: {:?}", data); +#[op2] +#[string] +fn console_warn(#[string] data: String) -> Result { + warn!("[JSCORE]: {}", data); Ok(String::from("temp")) } -#[op] -async fn load_module(path: String) -> Result { +#[op2(async)] +#[string] +async fn load_module(#[string] path: String) -> Result { info!("Trying to load module: {}", path); let mut js_core_handle = JS_CORE_HANDLE.lock().await; diff --git a/rust-executor/src/js_core/wallet_extension.js b/rust-executor/src/js_core/wallet_extension.js index 7a58c66bb..4893380a4 100644 --- a/rust-executor/src/js_core/wallet_extension.js +++ b/rust-executor/src/js_core/wallet_extension.js @@ -29,12 +29,6 @@ sign: (payload) => { return core.ops.wallet_sign(payload); }, - verify: (publicKey, message, signature) => { - if(typeof signature === "string") { - signature = Uint8Array.from(signature); - } - return core.ops.wallet_verify(publicKey, message, signature); - } }; })(globalThis); \ No newline at end of file diff --git a/rust-executor/src/js_core/wallet_extension.rs b/rust-executor/src/js_core/wallet_extension.rs index df69a1156..820028f28 100644 --- a/rust-executor/src/js_core/wallet_extension.rs +++ b/rust-executor/src/js_core/wallet_extension.rs @@ -1,9 +1,7 @@ use std::borrow::Cow; use base64::{engine::general_purpose as base64engine, Engine as _}; -use deno_core::{anyhow::anyhow, error::AnyError, include_js_files, op, Extension, Op}; -use did_key::{CoreSign, PatchedKeyPair}; -use log::error; +use deno_core::{anyhow::anyhow, error::AnyError, include_js_files, op2, Extension, Op}; use serde::{Deserialize, Serialize}; use crate::wallet::Wallet; @@ -16,7 +14,8 @@ pub struct Key { pub encoding: String, } -#[op] +#[op2] +#[serde] fn wallet_get_main_key() -> Result { let wallet_instance = Wallet::instance(); let wallet = wallet_instance.lock().expect("wallet lock"); @@ -35,7 +34,8 @@ fn wallet_get_main_key() -> Result { }) } -#[op] +#[op2] +#[serde] fn wallet_get_main_key_document() -> Result { let wallet_instance = Wallet::instance(); let wallet = wallet_instance.lock().expect("wallet lock"); @@ -46,7 +46,8 @@ fn wallet_get_main_key_document() -> Result { .ok_or(anyhow!("main key not found. call createMainKey() first")) } -#[op] +#[op2] +#[serde] fn wallet_create_main_key() -> Result<(), AnyError> { let wallet_instance = Wallet::instance(); let mut wallet = wallet_instance.lock().expect("wallet lock"); @@ -55,7 +56,7 @@ fn wallet_create_main_key() -> Result<(), AnyError> { Ok(()) } -#[op] +#[op2(fast)] fn wallet_is_unlocked() -> Result { let wallet_instance = Wallet::instance(); let wallet = wallet_instance.lock().expect("wallet lock"); @@ -63,64 +64,46 @@ fn wallet_is_unlocked() -> Result { Ok(wallet_ref.is_unlocked()) } -#[op] -fn wallet_unlock(passphrase: String) -> Result<(), AnyError> { +#[op2] +#[serde] +fn wallet_unlock(#[string] passphrase: String) -> Result<(), AnyError> { let wallet_instance = Wallet::instance(); let mut wallet = wallet_instance.lock().expect("wallet lock"); let wallet_ref = wallet.as_mut().expect("wallet instance"); wallet_ref.unlock(passphrase).map_err(|e| e.into()) } -#[op] -fn wallet_lock(passphrase: String) -> Result<(), AnyError> { +#[op2] +#[serde] +fn wallet_lock(#[string] passphrase: String) -> Result<(), AnyError> { let wallet_instance = Wallet::instance(); let mut wallet = wallet_instance.lock().expect("wallet lock"); let wallet_ref = wallet.as_mut().expect("wallet instance"); Ok(wallet_ref.lock(passphrase)) } -#[op] -fn wallet_export(passphrase: String) -> Result { +#[op2] +#[string] +fn wallet_export(#[string] passphrase: String) -> Result { let wallet_instance = Wallet::instance(); let mut wallet = wallet_instance.lock().expect("wallet lock"); let wallet_ref = wallet.as_mut().expect("wallet instance"); Ok(wallet_ref.export(passphrase)) } -#[op] -fn wallet_load(data: String) -> Result<(), AnyError> { +#[op2] +#[serde] +fn wallet_load(#[string] data: String) -> Result<(), AnyError> { let wallet_instance = Wallet::instance(); let mut wallet = wallet_instance.lock().expect("wallet lock"); let wallet_ref = wallet.as_mut().expect("wallet instance"); Ok(wallet_ref.load(data)) } -#[op] -fn wallet_sign(payload: &[u8]) -> Result, AnyError> { - let wallet_instance = Wallet::instance(); - let wallet = wallet_instance.lock().expect("wallet lock"); - let wallet_ref = wallet.as_ref().expect("wallet instance"); - let name = "main".to_string(); - let signature = wallet_ref - .sign(&name, payload) - .ok_or(anyhow!("main key not found. call createMainKey() first"))?; - Ok(signature) -} - -#[op] -fn wallet_verify(did: String, message: &[u8], signature: &[u8]) -> bool { - if let Ok(key_pair) = PatchedKeyPair::try_from(did.as_str()) { - match key_pair.verify(message, signature) { - Ok(_) => true, - Err(e) => { - error!("Signature verification failed: {:?}", e); - false - } - } - } else { - error!("Failed to parse DID as key method: {}", did); - false - } +#[op2] +#[serde] +fn wallet_sign(#[buffer] payload: &[u8]) -> Result, AnyError> { + crate::agent::sign(payload) } pub fn build() -> Extension { @@ -137,7 +120,6 @@ pub fn build() -> Extension { wallet_export::DECL, wallet_load::DECL, wallet_sign::DECL, - wallet_verify::DECL, ]), ..Default::default() } diff --git a/rust-executor/src/languages/byte_array.rs b/rust-executor/src/languages/byte_array.rs new file mode 100644 index 000000000..9cf45bd39 --- /dev/null +++ b/rust-executor/src/languages/byte_array.rs @@ -0,0 +1,49 @@ +use serde::Deserialize; +use serde::de::{self, Deserializer, Visitor, MapAccess}; +use std::fmt; + +#[derive(Debug)] +pub struct ByteArray(Vec); + +impl From for Vec { + fn from(bytes: ByteArray) -> Vec { + bytes.0 + } +} + +struct ByteArrayVisitor; + +impl<'de> Visitor<'de> for ByteArrayVisitor { + type Value = ByteArray; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("a map representing a byte array") + } + + fn visit_map(self, mut access: M) -> Result + where + M: MapAccess<'de>, + { + let mut bytes = Vec::new(); + + while let Some((key, value)) = access.next_entry::()? { + let index: usize = key.parse().map_err(de::Error::custom)?; + // Ensure the vector is large enough to hold the byte at index `key`. + if index >= bytes.len() { + bytes.resize(index + 1, 0); + } + bytes[index] = value; + } + + Ok(ByteArray(bytes)) + } +} + +impl<'de> Deserialize<'de> for ByteArray { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + deserializer.deserialize_map(ByteArrayVisitor) + } +} diff --git a/rust-executor/src/languages/language.rs b/rust-executor/src/languages/language.rs new file mode 100644 index 000000000..4954d2f67 --- /dev/null +++ b/rust-executor/src/languages/language.rs @@ -0,0 +1,231 @@ +use deno_core::error::AnyError; +use crate::{graphql::graphql_types::{OnlineAgent, PerspectiveExpression}, js_core::JsCoreHandle, types::{Perspective, PerspectiveDiff}}; +use super::byte_array::ByteArray; + +#[derive(Clone)] +pub struct Language { + address: String, + js_core: JsCoreHandle, +} + +fn parse_revision(js_result: String) -> Result, AnyError> { + if let Ok(maybe_revision) = serde_json::from_str::>(&js_result) { + Ok(maybe_revision.map(|revision| { + let vec: Vec = revision.into(); + base64::encode(&vec) + })) + } else { + Ok(serde_json::from_str::>(&js_result)?) + } +} +impl Language { + pub fn new(address: String, js_core: JsCoreHandle) -> Self { + Self { + address, + js_core + } + } + + pub async fn sync(&mut self) -> Result<(), AnyError> { + let script = format!( + r#" + JSON.stringify( + await core.languageController.languageByRef({{address:"{}"}}) + ? + await (await core.languageController.languageByRef({{address:"{}"}})).linksAdapter.sync() + : + null + ) + "#, + self.address, + self.address, + ); + let _result: String = self.js_core.execute(script).await?; + Ok(()) + } + + pub async fn commit(&mut self, diff: PerspectiveDiff) -> Result, AnyError> { + let script = format!( + r#" + JSON.stringify( + await core.languageController.languageByRef({{address:"{}"}}) + ? + await (await core.languageController.languageByRef({{address:"{}"}})).linksAdapter.commit({}) + : + null + ) + "#, + self.address, + self.address, + serde_json::to_string(&diff)?, + ); + let result: String = self.js_core.execute(script).await?; + parse_revision(result) + } + + pub async fn current_revision(&mut self) -> Result, AnyError> { + let script = format!( + r#" + JSON.stringify( + await core.languageController.languageByRef({{address:"{}"}}) + ? + await (await core.languageController.languageByRef({{address:"{}"}})).linksAdapter.currentRevision() + : + null + ) + "#, + self.address, + self.address, + ); + let result: String = self.js_core.execute(script).await?; + parse_revision(result) + } + + pub async fn render(&mut self) -> Result, AnyError> { + let script = format!( + r#" + JSON.stringify( + await core.languageController.languageByRef({{address:"{}"}}) + ? + await (await core.languageController.languageByRef({{address:"{}"}})).linksAdapter.render() + : + null + ) + "#, + self.address, + self.address, + ); + let result: String = self.js_core.execute(script).await?; + let maybe_value = serde_json::from_str(&result)?; + Ok(maybe_value) + } + + pub async fn others(&mut self) -> Result, AnyError> { + let script = format!( + r#" + JSON.stringify( + await core.languageController.languageByRef({{address:"{}"}}) + ? + await (await core.languageController.languageByRef({{address:"{}"}})).linksAdapter.others() + : + null + ) + "#, + self.address, + self.address, + ); + let result: String = self.js_core.execute(script).await?; + let others_vec = serde_json::from_str(&result)?; + Ok(others_vec) + } + + pub async fn has_telepresence_adapter(&mut self) -> Result { + let script = format!( + r#" + JSON.stringify( + await core.languageController.languageByRef({{address:"{}"}}) + && + await (await core.languageController.languageByRef({{address:"{}"}})).telepresenceAdapter + ? + true + : + false + ) + "#, + self.address, + self.address, + ); + let result: String = self.js_core.execute(script).await?; + let has_telepresence_adapter = serde_json::from_str(&result)?; + Ok(has_telepresence_adapter) + } + + + pub async fn set_online_status(&mut self, status: PerspectiveExpression) -> Result<(), AnyError> { + let script = format!( + r#" + JSON.stringify( + await core.languageController.languageByRef({{address:"{}"}}) + ? + await (await core.languageController.languageByRef({{address:"{}"}})).telepresenceAdapter.setOnlineStatus({}) + : + null + ) + "#, + self.address, + self.address, + serde_json::to_string(&status)?, + ); + let _result: String = self.js_core.execute(script).await?; + Ok(()) + } + + pub async fn get_online_agents(&mut self) -> Result, AnyError> { + let script = format!( + r#" + JSON.stringify( + await core.languageController.languageByRef({{address:"{}"}}) + ? + await (await core.languageController.languageByRef({{address:"{}"}})).telepresenceAdapter.getOnlineAgents() + : + null + ) + "#, + self.address, + self.address, + ); + let result: String = self.js_core.execute(script).await?; + let online_agents = serde_json::from_str(&result)?; + Ok(online_agents) + } + + pub async fn send_signal( + &mut self, + remote_agent_did: String, + payload: PerspectiveExpression + ) -> Result<(), AnyError> { + let script = format!( + r#" + JSON.stringify( + await core.languageController.languageByRef({{address:"{}"}}) + ? + await (await core.languageController.languageByRef({{address:"{}"}})).telepresenceAdapter.sendSignal("{}", {}) + : + null + ) + "#, + self.address, + self.address, + remote_agent_did, + serde_json::to_string(&payload)?, + ); + let _result: String = self.js_core.execute(script).await?; + Ok(()) + } + + pub async fn send_broadcast( + &mut self, + payload: PerspectiveExpression + ) -> Result<(), AnyError> { + let script = format!( + r#" + JSON.stringify( + await core.languageController.languageByRef({{address:"{}"}}) + ? + await (await core.languageController.languageByRef({{address:"{}"}})).telepresenceAdapter.sendBroadcast({}) + : + null + ) + "#, + self.address, + self.address, + serde_json::to_string(&payload)?, + ); + let _result: String = self.js_core.execute(script).await?; + Ok(()) + } + + + + +} diff --git a/rust-executor/src/languages/mod.rs b/rust-executor/src/languages/mod.rs new file mode 100644 index 000000000..0649ac07b --- /dev/null +++ b/rust-executor/src/languages/mod.rs @@ -0,0 +1,105 @@ +pub mod language; +mod byte_array; + +use std::sync::{Arc, Mutex}; +use deno_core::error::AnyError; + +use crate::{graphql::graphql_types::{DecoratedNeighbourhoodExpression, Neighbourhood}, js_core::JsCoreHandle}; +use crate::types::Address; +use language::Language; + +lazy_static! { + static ref LANGUAGE_CONTROLLER_INSTANCE: Arc>> = Arc::new(Mutex::new(None)); +} + +#[derive(Clone)] +pub struct LanguageController { + js_core: JsCoreHandle, +} + +impl LanguageController { + pub fn init_global_instance(js_core: JsCoreHandle) { + let mut instance = LANGUAGE_CONTROLLER_INSTANCE.lock().unwrap(); + *instance = Some(LanguageController::new(js_core)); + } + + pub fn global_instance() -> LanguageController { + LANGUAGE_CONTROLLER_INSTANCE.lock().unwrap().as_ref().expect("LanguageController not initialized").clone() + } + + fn new(js_core: JsCoreHandle) -> Self { + Self { + js_core, + } + } + + pub async fn install_language(language: Address) -> Result<(), AnyError> { + Self::global_instance().js_core.execute("await core.waitForLanguages()".into()).await?; + + let script = format!( + r#"JSON.stringify( + await core.languageController.installLanguage("{}") + )"#, + language, + ); + let _result = Self::global_instance().js_core.execute(script).await?; + Ok(()) + } + + pub async fn create_neighbourhood(neighbourhood: Neighbourhood) -> Result { + Self::global_instance().js_core.execute("await core.waitForLanguages()".into()).await?; + + let neighbourhood_json = serde_json::to_string(&neighbourhood)?; + let script = format!( + r#" + await core + .languageController + .getNeighbourhoodLanguage() + .expressionAdapter + .putAdapter + .createPublic({}) + "#, + neighbourhood_json, + ); + let result: String = Self::global_instance().js_core.execute(script).await?; + Ok(result) + } + + pub async fn get_neighbourhood(address: Address) -> Result, AnyError> { + Self::global_instance().js_core.execute("await core.waitForLanguages()".into()).await?; + + let script = format!( + r#" + JSON.stringify( + await core + .languageController + .getPerspective("{}") + ) + "#, + address, + ); + let result: String = Self::global_instance().js_core.execute(script).await?; + println!("lul 4.5 {:?}", result.clone()); + let neighbourhood: Option = serde_json::from_str(&result)?; + Ok(neighbourhood) + } + + pub async fn language_by_address(address: Address) -> Result, AnyError> { + Self::global_instance().js_core.execute("await core.waitForLanguages()".into()).await?; + + let script = format!( + r#" + await core.languageController.languageByRef({{ address: "{}" }}) ? true : false + "#, + address, + ); + let result: String = Self::global_instance().js_core.execute(script).await?; + let language_installed = serde_json::from_str::(&result)?; + if language_installed { + let language = Language::new(address, Self::global_instance().js_core.clone()); + Ok(Some(language)) + } else { + Ok(None) + } + } +} diff --git a/rust-executor/src/lib.rs b/rust-executor/src/lib.rs index 72deae26d..2735b7482 100644 --- a/rust-executor/src/lib.rs +++ b/rust-executor/src/lib.rs @@ -1,3 +1,6 @@ +#[macro_use] +extern crate lazy_static; + pub mod config; mod globals; pub mod graphql; @@ -6,72 +9,63 @@ mod js_core; mod prolog_service; mod utils; mod wallet; -use tokio; - +//use tokio; pub mod init; mod pubsub; mod dapp_server; +pub mod agent; +mod db; +pub mod types; +pub mod perspectives; +pub mod languages; +mod neighbourhoods; +#[cfg(test)] +mod test_utils; -use std::env; -use log::info; + +use tokio; +use std::{env, thread::JoinHandle}; +use log::{info, warn, error}; use js_core::JsCore; pub use config::Ad4mConfig; pub use holochain_service::run_local_hc_services; -use crate::{prolog_service::init_prolog_service, dapp_server::serve_dapp}; +use crate::{dapp_server::serve_dapp, db::Ad4mDb, prolog_service::init_prolog_service, languages::LanguageController}; /// Runs the GraphQL server and the deno core runtime -pub async fn run(mut config: Ad4mConfig) { - env::set_var("RUST_LOG", "holochain=warn,wasmer_compiler_cranelift=warn,rust_executor=info,warp::server"); +pub async fn run(mut config: Ad4mConfig) -> JoinHandle<()> { + env::set_var("RUST_LOG", "holochain=warn,wasmer_compiler_cranelift=warn,rust_executor=debug,warp::server"); let _ = env_logger::try_init(); config.prepare(); - info!("Initializing Prolog service..."); - init_prolog_service().await; - - info!("Starting js_core..."); - let mut js_core_handle = JsCore::start(config.clone()).await; - info!("Finished start"); - js_core_handle.initialized().await; - info!("js_core initialized."); - - info!("Starting GraphQL..."); - - if config.run_dapp_server.unwrap() { - std::thread::spawn(|| { - let runtime = tokio::runtime::Builder::new_multi_thread() - .enable_all() - .thread_name(String::from("dapp_server")) - .build() - .unwrap(); - runtime.block_on(serve_dapp(8080)).unwrap(); - }); + info!("Initializing Ad4mDb..."); + + Ad4mDb::init_global_instance( + config.app_data_path + .as_ref() + .map(|path| std::path::Path::new(path).join("ad4m_db.sqlite").to_string_lossy().into_owned()) + .expect("App data path not set in Ad4mConfig") + .as_str() + ).expect("Failed to initialize Ad4mDb"); + + agent::capabilities::apps_map::set_data_file_path( + config.app_data_path + .as_ref() + .map(|path| std::path::Path::new(path).join("apps_data.json").to_string_lossy().into_owned()) + .expect("App data path not set in Ad4mConfig") + ); + + if let Some(admin_credential) = &config.admin_credential { + if admin_credential.is_empty() { + warn!("adminCredential is not set or empty, empty token will possess admin capabilities."); + } + } else { + warn!("adminCredential is not set or empty, empty token will possess admin capabilities."); } - let handle = std::thread::spawn(move || { - let runtime = tokio::runtime::Builder::new_multi_thread() - .enable_all() - .thread_name(String::from("graphql_server")) - .build() - .unwrap(); - runtime.block_on(graphql::start_server( - js_core_handle, - config.gql_port.expect("Did not get gql port"), - config.app_data_path.expect("Did not get app data path") - )).unwrap(); - }); - handle.join().unwrap(); -} - -/// Runs the GraphQL server and the deno core runtime -pub async fn run_with_tokio(mut config: Ad4mConfig) { - env::set_var("RUST_LOG", "holochain=warn,wasmer_compiler_cranelift=warn,rust_executor=debug,warp::server"); - let _ = env_logger::try_init(); - config.prepare(); - info!("Initializing Prolog service..."); init_prolog_service().await; @@ -80,16 +74,26 @@ pub async fn run_with_tokio(mut config: Ad4mConfig) { js_core_handle.initialized().await; info!("js_core initialized."); + LanguageController::init_global_instance(js_core_handle.clone()); + perspectives::initialize_from_db(); + info!("Starting GraphQL..."); - if config.run_dapp_server.unwrap() { + let app_dir = config.app_data_path + .as_ref() + .expect("App data path not set in Ad4mConfig") + .clone(); + + if let Some(true) = config.run_dapp_server { std::thread::spawn(|| { let runtime = tokio::runtime::Builder::new_multi_thread() .thread_name(String::from("dapp_server")) .enable_all() .build() .unwrap(); - runtime.block_on(serve_dapp(8080)).unwrap(); + if let Err(e) = runtime.block_on(serve_dapp(8080, app_dir)) { + error!("Failed to start dapp server: {:?}", e); + } }); }; @@ -101,10 +105,7 @@ pub async fn run_with_tokio(mut config: Ad4mConfig) { .unwrap(); runtime.block_on(graphql::start_server( js_core_handle, - config.gql_port.expect("Did not get gql port"), - config.app_data_path.expect("Did not get app data path") + config )).unwrap(); - }); - - //TODO; we need someway to know that the graphql server is running before we allow this function to return + }) } \ No newline at end of file diff --git a/rust-executor/src/main.rs b/rust-executor/src/main.rs index 69427065e..14c38d93b 100644 --- a/rust-executor/src/main.rs +++ b/rust-executor/src/main.rs @@ -1,3 +1,8 @@ +#[macro_use] +extern crate lazy_static; + +pub mod agent; +mod config; mod globals; mod graphql; mod holochain_service; @@ -6,10 +11,16 @@ mod prolog; mod prolog_service; mod utils; mod wallet; -mod config; - +mod types; +mod perspectives; +mod db; pub mod init; mod pubsub; +mod neighbourhoods; +mod languages; + +#[cfg(test)] +mod test_utils; use log::{error, info}; use rust_executor::Ad4mConfig; @@ -22,7 +33,10 @@ use js_core::JsCore; #[tokio::main(flavor = "multi_thread")] async fn main() { prolog::run(); - env::set_var("RUST_LOG", "holochain=warn,wasmer_compiler_cranelift=warn,rust_executor=info,warp::server"); + env::set_var( + "RUST_LOG", + "holochain=warn,wasmer_compiler_cranelift=warn,rust_executor=info,warp::server", + ); env_logger::try_init().expect("could not logger"); let mut config = Ad4mConfig::default(); @@ -38,13 +52,7 @@ async fn main() { info!("js_core initialized."); info!("Starting GraphQL..."); - match graphql::start_server( - js_core_handle, - config.gql_port.expect("Did not get gql port"), - config.app_data_path.expect("Did not get app data path"), - ) - .await - { + match graphql::start_server(js_core_handle, config).await { Ok(_) => { info!("GraphQL server stopped."); std::process::exit(0); diff --git a/rust-executor/src/mainnet_seed.json b/rust-executor/src/mainnet_seed.json index 8d131009e..90cba2320 100644 --- a/rust-executor/src/mainnet_seed.json +++ b/rust-executor/src/mainnet_seed.json @@ -4,12 +4,12 @@ "did:key:z6MkvPpWxwXAnLtMcoc9sX7GEoJ96oNnQ3VcQJRLspNJfpE7" ], "knownLinkLanguages": [ - "QmzSYwdg8JYEkFbcaV1XizduGxGyPt4dPjeJ4DdzAKajSqdckBj", - "QmzSYwdox6uFm5D93VyDTqs7aGjQr5UHzhpRi7yPbAEhwCXFiju", + "QmzSYwdj7LmLiY7p5vEzBPuQpW3CmAB41vEJe9hkVB9w6ndhcE5", + "QmzSYwdnyTVrzufV8HfUfFRwDSiZZjRoBimrm95qjh6KCG9Z6YW", "QmzSYwdnHrRH8MmuPWKKrDvFoVyW5CophNpT1ipQUCcenPVTQnd" ], - "directMessageLanguage": "QmzSYwdhTvszHze6xSojgaDmm9iPGr78iSbvVnQ1SgXo7t62PA9", - "agentLanguage": "QmzSYwdZDdgxiyE8crozqbxoBP52h6ocMdDq2S2mg4ScjzVLWKQ", + "directMessageLanguage": "QmzSYwdbXD5LGiAHJAJknFgfigD2rb6ZYRUC8o8LRR9peP3pFGc", + "agentLanguage": "QmzSYwdoGSndfmEVKuP4Tsof64bSdiqYWgV9wypbvmgSELYoKet", "perspectiveLanguage": "QmzSYwddxFCzVD63LgR8MTBaUEcwf9jhB3XjLbYBp2q8V1MqVtS", "neighbourhoodLanguage": "QmzSYwdo2a6E4XghRHrN5eCReyYRDeRE8VnRbvqgoWZsr9B4pxV", "languageLanguageBundle": "// https://deno.land/x/url_join@1.0.0/mod.ts\nvar urlJoin = function(...args) {\n let input;\n if (typeof args[0] === \"object\") {\n input = args[0];\n } else {\n input = [].slice.call(args);\n }\n return normalize(input);\n};\nvar normalize = (strArray) => {\n const resultArray = [];\n if (strArray.length === 0) {\n return \"\";\n }\n if (typeof strArray[0] !== \"string\") {\n throw new TypeError(\"Url must be a string. Received \" + strArray[0]);\n }\n if (strArray[0].match(/^[^/:]+:\\/*$/) && strArray.length > 1) {\n const first = strArray.shift();\n strArray[0] = first + strArray[0];\n }\n if (strArray[0].match(/^file:\\/\\/\\//)) {\n strArray[0] = strArray[0].replace(/^([^/:]+):\\/*/, \"$1:///\");\n } else {\n strArray[0] = strArray[0].replace(/^([^/:]+):\\/*/, \"$1://\");\n }\n for (let i = 0; i < strArray.length; i++) {\n let component = strArray[i];\n if (typeof component !== \"string\") {\n throw new TypeError(\"Url must be a string. Received \" + component);\n }\n if (component === \"\") {\n continue;\n }\n if (i > 0) {\n component = component.replace(/^[\\/]+/, \"\");\n }\n if (i < strArray.length - 1) {\n component = component.replace(/[\\/]+$/, \"\");\n } else {\n component = component.replace(/[\\/]+$/, \"/\");\n }\n resultArray.push(component);\n }\n let str = resultArray.join(\"/\");\n str = str.replace(/\\/(\\?|&|#[^!])/g, \"$1\");\n let parts = str.split(\"?\");\n str = parts.shift() + (parts.length > 0 ? \"?\" : \"\") + parts.join(\"&\");\n return str;\n};\n\n// https://deno.land/x/axiod@0.26.2/helpers.ts\nvar methods = [\n \"get\",\n \"post\",\n \"put\",\n \"delete\",\n \"options\",\n \"head\",\n \"connect\",\n \"trace\",\n \"patch\"\n];\nvar addInterceptor = () => {\n const interceptor = {\n list: [],\n use: function(fulfilled, rejected) {\n const id = this.list.length;\n this.list.push({\n fulfilled,\n rejected\n });\n return id;\n },\n eject: function(index) {\n if (this.list[index]) {\n this.list[index] = null;\n }\n }\n };\n return interceptor;\n};\n\n// https://deno.land/x/axiod@0.26.2/mod.ts\nfunction axiod(url, config) {\n if (typeof url === \"string\") {\n return axiod.request(Object.assign({}, axiod.defaults, { url }, config));\n }\n return axiod.request(Object.assign({}, axiod.defaults, url));\n}\naxiod.defaults = {\n url: \"/\",\n method: \"get\",\n timeout: 0,\n withCredentials: false,\n validateStatus: (status) => {\n return status >= 200 && status < 300;\n }\n};\naxiod.create = (config) => {\n const instance = axiod.bind({});\n instance.defaults = Object.assign({}, axiod.defaults, config);\n instance._request = request;\n instance.request = (options) => {\n return instance._request(Object.assign({}, instance.defaults, options));\n };\n instance.get = (url, config2) => {\n return instance.request(\n Object.assign({}, { url }, config2, { method: \"get\" })\n );\n };\n instance.post = (url, data, config2) => {\n return instance.request(\n Object.assign({}, { url }, config2, { method: \"post\", data })\n );\n };\n instance.put = (url, data, config2) => {\n return instance.request(\n Object.assign({}, { url }, config2, { method: \"put\", data })\n );\n };\n instance.delete = (url, data, config2) => {\n return instance.request(\n Object.assign({}, { url }, config2, { method: \"delete\", data })\n );\n };\n instance.options = (url, data, config2) => {\n return instance.request(\n Object.assign({}, { url }, config2, { method: \"options\", data })\n );\n };\n instance.head = (url, data, config2) => {\n return instance.request(\n Object.assign({}, { url }, config2, { method: \"head\", data })\n );\n };\n instance.connect = (url, data, config2) => {\n return instance.request(\n Object.assign({}, { url }, config2, { method: \"connect\", data })\n );\n };\n instance.trace = (url, data, config2) => {\n return instance.request(\n Object.assign({}, { url }, config2, { method: \"trace\", data })\n );\n };\n instance.patch = (url, data, config2) => {\n return instance.request(\n Object.assign({}, { url }, config2, { method: \"patch\", data })\n );\n };\n instance.interceptors = {\n request: addInterceptor(),\n response: addInterceptor()\n };\n instance.interceptors.request.list = [];\n instance.interceptors.response.list = [];\n return instance;\n};\nasync function request(config) {\n if (this.interceptors.request.list.length > 0) {\n for (const interceptor of this.interceptors.request.list) {\n if (interceptor) {\n const { fulfilled } = interceptor;\n if (fulfilled && config) {\n config = await fulfilled(config);\n }\n }\n }\n }\n let {\n url = \"/\",\n baseURL,\n method,\n headers,\n params = {},\n data,\n timeout,\n withCredentials,\n auth,\n validateStatus,\n paramsSerializer,\n transformRequest,\n transformResponse,\n redirect,\n responseType = \"json\"\n } = config;\n if (baseURL) {\n url = urlJoin(baseURL, url);\n }\n if (method) {\n if (methods.indexOf(method.toLowerCase().trim()) === -1) {\n throw new Error(`Method ${method} is not supported`);\n } else {\n method = method.toLowerCase().trim();\n }\n } else {\n method = \"get\";\n }\n let _params = \"\";\n if (params) {\n if (paramsSerializer) {\n _params = paramsSerializer(params);\n } else {\n _params = Object.keys(params).map((key) => {\n return encodeURIComponent(key) + \"=\" + encodeURIComponent(params[key]);\n }).join(\"&\");\n }\n }\n if (withCredentials) {\n if (auth?.username && auth?.password) {\n if (!headers) {\n headers = {};\n }\n headers[\"Authorization\"] = \"Basic \" + btoa(unescape(encodeURIComponent(`${auth.username}:${auth.password}`)));\n }\n }\n const fetchRequestObject = {};\n if (method !== \"get\") {\n fetchRequestObject.method = method.toUpperCase();\n }\n if (_params) {\n url = urlJoin(url, `?${_params}`);\n }\n if (data && method !== \"get\") {\n if (transformRequest && Array.isArray(transformRequest) && transformRequest.length > 0) {\n for (var i = 0; i < (transformRequest || []).length; i++) {\n if (transformRequest && transformRequest[i]) {\n data = transformRequest[i](data, headers);\n }\n }\n }\n if (typeof data === \"string\" || data instanceof FormData || data instanceof URLSearchParams) {\n fetchRequestObject.body = data;\n } else {\n try {\n fetchRequestObject.body = JSON.stringify(data);\n if (!headers) {\n headers = {};\n }\n headers[\"Accept\"] = \"application/json\";\n headers[\"Content-Type\"] = \"application/json\";\n } catch (ex) {\n }\n }\n }\n if (headers) {\n const _headers = new Headers();\n Object.keys(headers).forEach((header) => {\n if (headers && headers[header]) {\n _headers.set(header, headers[header]);\n }\n });\n fetchRequestObject.headers = _headers;\n }\n const controller = new AbortController();\n fetchRequestObject.signal = controller.signal;\n let timeoutCounter = 0;\n if ((timeout || 0) > 0) {\n timeoutCounter = setTimeout(() => {\n timeoutCounter = 0;\n controller.abort();\n }, timeout);\n }\n if (redirect) {\n fetchRequestObject.redirect = redirect;\n }\n return fetch(url, fetchRequestObject).then(async (x) => {\n if (timeoutCounter) {\n clearTimeout(timeoutCounter);\n }\n const _status = x.status;\n const _statusText = x.statusText;\n let _data = null;\n try {\n const response2 = x.clone();\n if (responseType === \"json\") {\n _data = await response2.json();\n } else if (responseType === \"text\") {\n _data = await response2.text();\n } else if (responseType === \"arraybuffer\") {\n _data = await response2.arrayBuffer();\n } else if (responseType === \"blob\") {\n _data = await response2.blob();\n } else if (responseType === \"stream\") {\n _data = (await response2.blob()).stream();\n } else {\n _data = await response2.text();\n }\n } catch (ex) {\n _data = await x.clone().text();\n }\n if (transformResponse) {\n if (transformResponse && Array.isArray(transformResponse) && transformResponse.length > 0) {\n for (var i2 = 0; i2 < (transformResponse || []).length; i2++) {\n if (transformResponse && transformResponse[i2]) {\n _data = transformResponse[i2](_data);\n }\n }\n }\n }\n const _headers = x.headers;\n const _config = {\n url,\n baseURL,\n method,\n headers,\n params,\n data,\n timeout,\n withCredentials,\n auth,\n paramsSerializer,\n redirect,\n responseType\n };\n let isValidStatus = true;\n if (validateStatus) {\n isValidStatus = validateStatus(_status);\n } else {\n isValidStatus = _status >= 200 && _status <= 303;\n }\n let response = null;\n let error = null;\n if (isValidStatus) {\n response = {\n status: _status,\n statusText: _statusText,\n data: _data,\n headers: _headers,\n config: _config\n };\n } else {\n error = {\n response: {\n status: _status,\n statusText: _statusText,\n data: _data,\n headers: _headers\n },\n config: _config\n };\n }\n if (this.interceptors.response.list.length > 0) {\n for (const interceptor of this.interceptors.response.list) {\n if (interceptor) {\n const { fulfilled, rejected } = interceptor;\n if (fulfilled && response) {\n response = await fulfilled(response);\n }\n if (rejected && error) {\n error = await rejected(error);\n }\n }\n }\n }\n if (error) {\n return Promise.reject(error);\n }\n return Promise.resolve(response);\n });\n}\naxiod._request = request;\naxiod.request = request;\naxiod.get = (url, config) => {\n return axiod.request(\n Object.assign({}, { url }, config, { method: \"get\" })\n );\n};\naxiod.post = (url, data, config) => {\n return axiod.request(\n Object.assign({}, { url }, config, { method: \"post\", data })\n );\n};\naxiod.put = (url, data, config) => {\n return axiod.request(\n Object.assign({}, { url }, config, { method: \"put\", data })\n );\n};\naxiod.delete = (url, data, config) => {\n return axiod.request(\n Object.assign({}, { url }, config, { method: \"delete\", data })\n );\n};\naxiod.options = (url, data, config) => {\n return axiod.request(\n Object.assign({}, { url }, config, { method: \"options\", data })\n );\n};\naxiod.head = (url, data, config) => {\n return axiod.request(\n Object.assign({}, { url }, config, { method: \"head\", data })\n );\n};\naxiod.connect = (url, data, config) => {\n return axiod.request(\n Object.assign({}, { url }, config, { method: \"connect\", data })\n );\n};\naxiod.trace = (url, data, config) => {\n return axiod.request(\n Object.assign({}, { url }, config, { method: \"trace\", data })\n );\n};\naxiod.patch = (url, data, config) => {\n return axiod.request(\n Object.assign({}, { url }, config, { method: \"patch\", data })\n );\n};\naxiod.interceptors = {\n request: addInterceptor(),\n response: addInterceptor()\n};\nvar mod_default = axiod;\n\n// languageAdapter.ts\nvar LangAdapter = class {\n constructor(context) {\n }\n async getLanguageSource(address) {\n if (address.substring(0, 2) != \"Qm\") {\n console.error(\"LanguageLanguage.getLanguageSource(): The address is not a valid hash\");\n return \"\";\n }\n const cid = address.toString();\n let presignedUrl;\n try {\n const getPresignedUrl = await mod_default.get(PROXY_URL + `?key=${cid}`);\n presignedUrl = getPresignedUrl.data.url;\n } catch (e) {\n console.error(\"Get language source failed at getting presigned url\", address);\n throw e;\n }\n let languageSource;\n try {\n const getLanguageSource = await mod_default.get(presignedUrl);\n languageSource = getLanguageSource.data;\n } catch (e) {\n console.error(\"Get language source failed at getting language source\", address);\n throw e;\n }\n return languageSource;\n }\n};\n\n// putAdapter.ts\nvar CloudflarePutAdapter = class {\n #agent;\n constructor(context) {\n this.#agent = context.agent;\n }\n async createPublic(language) {\n const hash = UTILS.hash(language.bundle.toString());\n if (hash != language.meta.address)\n throw new Error(`Language Persistence: Can't store language. Address stated in meta differs from actual file\nWanted: ${language.meta.address}\nGot: ${hash}`);\n const agent = this.#agent;\n const expression = agent.createSignedExpression(language.meta);\n const key = `meta-${hash}`;\n const metaPostData = {\n key,\n // Content of the new object.\n value: JSON.stringify(expression)\n };\n try {\n const metaPostResult = await mod_default.post(PROXY_URL, metaPostData);\n if (metaPostResult.status != 200) {\n console.error(\"Upload language meta data gets error: \", metaPostResult);\n }\n const languageBundleBucketParams = {\n key: hash,\n // Content of the new object.\n value: language.bundle.toString()\n };\n const bundlePostResult = await mod_default.post(PROXY_URL, languageBundleBucketParams);\n if (bundlePostResult.status != 200) {\n console.error(\"Upload language bundle data gets error: \", metaPostResult);\n }\n return hash;\n } catch (e) {\n if (e.response.status == 400 && e.response.data.includes(\"Key already exists\")) {\n console.log(\"[Cloudflare-based Language Language]: Tried to replace existing language. Ignoring...\");\n return hash;\n }\n console.error(\"[Cloudflare-based Language Language]: Error storing Language: \", e.response.data);\n throw e;\n }\n }\n};\n\n// adapter.ts\nvar Adapter = class {\n constructor(context) {\n this.putAdapter = new CloudflarePutAdapter(context);\n }\n async get(address) {\n if (address.substring(0, 2) != \"Qm\") {\n console.error(\"LanguageLanguage.get(): The address is not a valid hash\");\n return null;\n }\n const metaDataKey = `meta-${address}`;\n let presignedUrl;\n try {\n const getPresignedUrl = await mod_default.get(PROXY_URL + `?key=${metaDataKey}`);\n presignedUrl = getPresignedUrl.data.url;\n } catch (e) {\n console.error(\"Get meta information failed at getting presigned url\", address);\n return null;\n }\n let metaObject;\n try {\n const getMetaObject = await mod_default.get(presignedUrl);\n metaObject = getMetaObject.data;\n } catch (e) {\n console.error(\"Get meta information failed at getting meta information\", presignedUrl);\n return null;\n }\n return metaObject;\n }\n};\n\n// index.ts\nvar name = \"languages\";\nvar PROXY_URL = \"https://bootstrap-store-gateway.perspect3vism.workers.dev\";\nfunction interactions(expression) {\n return [];\n}\nasync function create(context) {\n const expressionAdapter = new Adapter(context);\n const languageAdapter = new LangAdapter(context);\n return {\n name,\n expressionAdapter,\n languageAdapter,\n interactions\n };\n}\nexport {\n PROXY_URL,\n create as default,\n name\n};\n" diff --git a/rust-executor/src/neighbourhoods.rs b/rust-executor/src/neighbourhoods.rs new file mode 100644 index 000000000..078e2ddbe --- /dev/null +++ b/rust-executor/src/neighbourhoods.rs @@ -0,0 +1,79 @@ +use deno_core::anyhow::anyhow; +use deno_core::error::AnyError; +use uuid::Uuid; + +use crate::graphql::graphql_types::{PerspectiveHandle, PerspectiveState, Neighbourhood, Perspective}; +use crate::languages::LanguageController; +use crate::perspectives::{add_perspective, all_perspectives, get_perspective, update_perspective}; +use crate::types::*; + +pub async fn neighbourhood_publish_from_perspective( + uuid: &str, + link_language: String, + meta: Perspective, +) -> Result { + let perspective = get_perspective(uuid).ok_or(anyhow!("Perspective not found"))?; + + LanguageController::install_language(link_language.clone()).await?; + + let neighbourhood = Neighbourhood { + link_language, + meta + }; + + // Create neighbourhood + let neighbourhood_address = LanguageController::create_neighbourhood(neighbourhood).await?; + + let neighbourhood_url = format!("neighbourhood://{}", neighbourhood_address); + let neighbourhood_exp = LanguageController::get_neighbourhood(neighbourhood_address) + .await? + .ok_or(anyhow!("Could not retrieve NeigbourhoodExpression which was just created. Problem with Neighbourhood language"))?; + + let mut perspective_handle = perspective.persisted.lock().await.clone(); + // Add shared perspective to original perspective and then update controller + perspective_handle.shared_url = Some(neighbourhood_url.clone()); + perspective_handle.neighbourhood = Some(neighbourhood_exp); + perspective_handle.state = PerspectiveState::Synced; + update_perspective(&perspective_handle).await.map_err(|e| anyhow!(e))?; + Ok(neighbourhood_url) +} + +pub async fn install_neighbourhood( + url: String, +) -> Result { + let perspectives = all_perspectives(); + + for p in perspectives.iter() { + let handle = p.persisted.lock().await; + if handle.shared_url == Some(url.clone()) { + return Err(anyhow!("Neighbourhood with URL {} already installed", url)); + } + } + + let expression_ref = ExpressionRef::try_from(url.to_string())?; + let neighbourhood_exp = LanguageController::get_neighbourhood(expression_ref.expression).await?; + if neighbourhood_exp.is_none() { + return Err(anyhow!("Could not find neighbourhood with URL {}", url)); + } + log::info!("Core.install_neighbourhood(): Got neighbourhood {:?}", neighbourhood_exp); + let neighbourhood = neighbourhood_exp.unwrap(); + + let state = if LanguageController::language_by_address(neighbourhood.data.link_language.clone()).await?.is_some() { + PerspectiveState::LinkLanguageInstalledButNotSynced + } else { + PerspectiveState::LinkLanguageFailedToInstall + }; + + log::info!("Core.install_neighbourhood(): Creating perspective {}, {:?}, {:?}", url, neighbourhood, state); + + let handle = PerspectiveHandle { + uuid: Uuid::new_v4().to_string(), + name: Some(url.clone()), + shared_url: Some(url.clone()), + neighbourhood: Some(neighbourhood), + state, + }; + add_perspective(handle.clone(), Some(true)).await.map_err(|e| anyhow!(e))?; + + Ok(handle) +} diff --git a/rust-executor/src/perspectives/mod.rs b/rust-executor/src/perspectives/mod.rs new file mode 100644 index 000000000..1357a10f3 --- /dev/null +++ b/rust-executor/src/perspectives/mod.rs @@ -0,0 +1,274 @@ +pub mod perspective_instance; +pub mod sdna; +pub mod utils; +use std::sync::RwLock; +use std::collections::HashMap; +use lazy_static::lazy_static; +use perspective_instance::PerspectiveInstance; +use crate::graphql::graphql_types::{PerspectiveHandle, PerspectiveState, PerspectiveExpression}; + +use crate::db::Ad4mDb; +use crate::pubsub::{get_global_pubsub, PERSPECTIVE_ADDED_TOPIC, PERSPECTIVE_REMOVED_TOPIC, PERSPECTIVE_UPDATED_TOPIC}; +use crate::types::PerspectiveDiff; + +lazy_static! { + static ref PERSPECTIVES: RwLock>> = RwLock::new(HashMap::new()); +} + +pub fn initialize_from_db() { + let handles = Ad4mDb::global_instance() + .lock() + .expect("Couldn't get write lock on Ad4mDb") + .as_ref() + .expect("Ad4mDb not initialized") + .get_all_perspectives() + .expect("Couldn't get perspectives from db"); + let mut perspectives = PERSPECTIVES.write().unwrap(); + for handle in handles { + let p = PerspectiveInstance::new(handle.clone(), None); + tokio::spawn(p.clone().start_background_tasks()); + perspectives.insert( + handle.uuid.clone(), + RwLock::new(p) + ); + } +} + +pub async fn add_perspective(handle: PerspectiveHandle, created_from_join: Option) -> Result<(), String> { + if PERSPECTIVES.read().unwrap().contains_key(&handle.uuid) { + return Err(format!("Perspective with uuid {} already exists", &handle.uuid)); + } + + Ad4mDb::global_instance() + .lock() + .expect("Couldn't get write lock on Ad4mDb") + .as_ref() + .expect("Ad4mDb not initialized") + .add_perspective(&handle) + .map_err(|e| e.to_string())?; + + let p = PerspectiveInstance::new(handle.clone(), created_from_join); + tokio::spawn(p.clone().start_background_tasks()); + + { + let mut perspectives = PERSPECTIVES.write().unwrap(); + perspectives.insert( + handle.uuid.clone(), + RwLock::new(p) + ); + } + + get_global_pubsub() + .await + .publish( + &PERSPECTIVE_ADDED_TOPIC, + &serde_json::to_string(&handle).unwrap(), + ) + .await; + Ok(()) +} + +pub fn all_perspectives() -> Vec { + PERSPECTIVES + .read() + .expect("Couldn't get read lock on PERSPECTIVES") + .values() + .map(|lock| lock.read().expect("Couldn't get read lock on PerspectiveInstance").clone()) + .collect() +} + +pub fn get_perspective(uuid: &str) -> Option { + PERSPECTIVES + .read() + .expect("Couldn't get read lock on PERSPECTIVES") + .get(uuid) + .map(|lock| lock.read().expect("Couldn't get read lock on PerspectiveInstance").clone()) +} + +pub async fn update_perspective(handle: &PerspectiveHandle) -> Result<(), String> { + { + if PERSPECTIVES.read().unwrap().get(&handle.uuid).is_none() { + return Err(format!("Perspective with uuid {} not found", &handle.uuid)); + } + + let instance = PERSPECTIVES + .read() + .unwrap() + .get(&handle.uuid) + .unwrap() + .read() + .unwrap() + .clone(); + + instance.update_from_handle(handle.clone()).await; + + Ad4mDb::with_global_instance(|db| { + db.update_perspective(&handle) + .map_err(|e| e.to_string()) + })?; + + } + + get_global_pubsub() + .await + .publish( + &PERSPECTIVE_UPDATED_TOPIC, + &serde_json::to_string(&handle).unwrap(), + ) + .await; + Ok(()) +} + +pub async fn remove_perspective(uuid: &str) -> Option { + if let Err(e) = Ad4mDb::global_instance() + .lock() + .expect("Couldn't get write lock on Ad4mDb") + .as_ref() + .expect("Ad4mDb not initialized") + .remove_perspective(uuid) { + log::error!("Error removing perspective from db: {}", e); + } + + let removed_instance = { + let mut perspectives = PERSPECTIVES.write().unwrap(); + perspectives.remove(uuid).and_then(|instance_lock| instance_lock.into_inner().ok()) + }; + + if let Some(ref instance) = removed_instance { + instance.teardown_background_tasks().await; + } + + get_global_pubsub() + .await + .publish( + &PERSPECTIVE_REMOVED_TOPIC, + &String::from(uuid), + ) + .await; + removed_instance +} + +pub fn handle_perspective_diff_from_link_language(diff: PerspectiveDiff, language_address: String) { + tokio::spawn(handle_perspective_diff_from_link_language_impl(diff, language_address)); +} + +async fn perspective_by_link_language(language_address: String) -> Option { + let perspectives = PERSPECTIVES + .read() + .unwrap() + .values() + .map(|lock| lock.read().unwrap().clone()) + .collect::>(); + for perspective in perspectives.into_iter() { + let handle = perspective.persisted.lock().await.clone(); + + if let Some(nh) = handle.neighbourhood { + if nh.data.link_language == language_address { + return Some(perspective); + } + } + } + None +} + +pub async fn handle_perspective_diff_from_link_language_impl(diff: PerspectiveDiff, language_address: String) { + if let Some(perspective) = perspective_by_link_language(language_address.clone()).await { + perspective.diff_from_link_language(diff).await; + } +} + +pub fn handle_sync_state_changed_from_link_language(state: PerspectiveState, language_address: String) { + tokio::spawn(handle_sync_state_changed_from_link_language_impl(state, language_address)); +} + +pub async fn handle_sync_state_changed_from_link_language_impl(state: PerspectiveState, language_address: String) { + if let Some(perspective) = perspective_by_link_language(language_address.clone()).await { + match perspective.update_perspective_state(state).await { + Ok(_) => (), + Err(e) => log::error!("Error updating perspective state from link language: {}", e) + } + } +} + +pub fn handle_telepresence_signal_from_link_language(signal: PerspectiveExpression, language_address: String) { + tokio::spawn(handle_telepresence_signal_from_link_language_impl(signal, language_address)); +} + +pub async fn handle_telepresence_signal_from_link_language_impl(signal: PerspectiveExpression, language_address: String) { + if let Some(perspective) = perspective_by_link_language(language_address.clone()).await { + perspective.telepresence_signal_from_link_language(signal).await; + } +} + + +#[cfg(test)] +mod tests { + use tokio::runtime::Runtime; + + use super::*; + + fn setup() { + //setup_wallet(); + Ad4mDb::init_global_instance(":memory:").unwrap(); + } + + async fn find_perspective_by_uuid(all_perspectives: &Vec, uuid: &String) -> Option { + for p in all_perspectives { + if p.persisted.lock().await.uuid == *uuid { + return Some(p.clone()); + } + } + + None + } + + #[tokio::test] + async fn test_perspective_persistence_roundtrip() { + setup(); + assert!(all_perspectives().is_empty()); + + let handle1 = PerspectiveHandle::new_from_name("Test Perspective 1".to_string()); + let handle2 = PerspectiveHandle::new_from_name("Test Perspective 2".to_string()); + + add_perspective(handle1.clone(), None).await.expect("Failed to add perspective"); + add_perspective(handle2.clone(), None).await.expect("Failed to add perspective"); + // Test the get_all_perspectives function + let perspectives = all_perspectives(); + + // Assert expected results + assert_eq!(perspectives.len(), 2); + + assert!(find_perspective_by_uuid(&perspectives, &handle1.uuid).await.is_some()); + assert!(find_perspective_by_uuid(&perspectives, &handle2.uuid).await.is_some()); + + let p1 = find_perspective_by_uuid(&perspectives, &handle1.uuid) + .await + .expect("Failed to find perspective by uuid"); + assert_eq!(p1.persisted.lock().await.name, Some("Test Perspective 1".to_string())); + + + let mut handle_updated = handle1.clone(); + handle_updated.name = Some("Test Perspective 1 Updated".to_string()); + update_perspective(&handle_updated).await.expect("Failed to update perspective"); + + let p1_updated = get_perspective(&handle1.uuid).unwrap(); + assert_eq!(p1_updated.persisted.lock().await.name, Some("Test Perspective 1 Updated".to_string())); + + let perspectives = all_perspectives(); + assert_eq!(perspectives.len(), 2); + let p1_updated_from_all = find_perspective_by_uuid(&perspectives, &handle1.uuid) + .await + .expect("Failed to find perspective by uuid"); + assert_eq!(p1_updated_from_all.persisted.lock().await.name, Some("Test Perspective 1 Updated".to_string())); + + + // Clean up test perspectives + remove_perspective(handle1.uuid.as_str()).await; + let perspectives = all_perspectives(); + assert_eq!(perspectives.len(), 1); + assert!(find_perspective_by_uuid(&perspectives, &handle2.uuid).await.is_some()); + } + + // Additional tests for other functions can be added here +} + diff --git a/rust-executor/src/perspectives/perspective_instance.rs b/rust-executor/src/perspectives/perspective_instance.rs new file mode 100644 index 000000000..869ff307b --- /dev/null +++ b/rust-executor/src/perspectives/perspective_instance.rs @@ -0,0 +1,1159 @@ +use std::sync::Arc; +use std::time::Duration; +use tokio::{join, time}; +use tokio::sync::Mutex; +use ad4m_client::literal::Literal; +use chrono::DateTime; +use deno_core::anyhow::anyhow; +use deno_core::error::AnyError; +use serde::{Serialize, Deserialize}; +use crate::agent::create_signed_expression; +use crate::languages::language::Language; +use crate::languages::LanguageController; +use crate::prolog_service::engine::PrologEngine; +use crate::pubsub::{get_global_pubsub, NEIGHBOURHOOD_SIGNAL_TOPIC, PERSPECTIVE_LINK_ADDED_TOPIC, PERSPECTIVE_LINK_REMOVED_TOPIC, PERSPECTIVE_LINK_UPDATED_TOPIC, PERSPECTIVE_SYNC_STATE_CHANGE_TOPIC}; +use crate::{db::Ad4mDb, types::*}; +use crate::graphql::graphql_types::{DecoratedPerspectiveDiff, LinkMutations, LinkQuery, LinkStatus, NeighbourhoodSignalFilter, OnlineAgent, PerspectiveExpression, PerspectiveHandle, PerspectiveLinkFilter, PerspectiveLinkUpdatedFilter, PerspectiveState, PerspectiveStateFilter}; +use super::sdna::init_engine_facts; +use super::update_perspective; +use super::utils::prolog_resolution_to_string; + + +#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)] +pub enum SdnaType { + SubjectClass, + Flow, + Custom, +} + +impl SdnaType { + pub fn from_string(s: &str) -> Result { + match s { + "subject_class" => Ok(SdnaType::SubjectClass), + "flow" => Ok(SdnaType::Flow), + "custom" => Ok(SdnaType::Custom), + _ => Err(anyhow!("Invalid SDNA type: {}. Must one of 'subject_class', 'flow' or 'custom'.", s)), + } + } +} + +#[derive(Clone)] +pub struct PerspectiveInstance { + pub persisted: Arc>, + + pub created_from_join: bool, + pub is_fast_polling: bool, + pub retries: u32, + + prolog_engine: Arc>>, + prolog_needs_rebuild: Arc>, + is_teardown: Arc>, + sdna_change_mutex: Arc>, + link_language: Arc>>, +} + +impl PerspectiveInstance { + pub fn new( + handle: PerspectiveHandle, + created_from_join: Option, + ) -> Self { + PerspectiveInstance { + persisted: Arc::new(Mutex::new(handle.clone())), + + created_from_join: created_from_join.unwrap_or(false), + is_fast_polling: false, + retries: 0, + prolog_engine: Arc::new(Mutex::new(None)), + prolog_needs_rebuild: Arc::new(Mutex::new(true)), + is_teardown: Arc::new(Mutex::new(false)), + sdna_change_mutex: Arc::new(Mutex::new(())), + link_language: Arc::new(Mutex::new(None)), + } + } + + pub async fn start_background_tasks(self) { + let _ = join!( + self.ensure_link_language(), + self.nh_sync_loop(), + self.pending_diffs_loop(), + ); + } + + pub async fn teardown_background_tasks(&self) { + *self.is_teardown.lock().await = true; + } + + async fn ensure_link_language(&self) { + let mut interval = time::interval(Duration::from_secs(5)); + while !self.is_teardown.lock().await.clone() { + if self.link_language.lock().await.is_none() && self.persisted.lock().await.neighbourhood.is_some() { + let nh = self.persisted.lock().await.neighbourhood.as_ref().expect("must be some").clone(); + + match LanguageController::language_by_address(nh.data.link_language.clone()).await { + Ok(Some(language)) => { + { + let mut link_language_guard = self.link_language.lock().await; + *link_language_guard = Some(language); + } + if self.persisted.lock().await.state == PerspectiveState::NeighbourhoodCreationInitiated { + self.ensure_public_links_are_shared().await; + } + self.update_perspective_state_log_error(PerspectiveState::LinkLanguageInstalledButNotSynced).await; + break; + }, + Ok(None) => { + log::debug!("Link language {} not installed yet, retrying in 5 seconds", nh.data.link_language.clone()); + self.update_perspective_state_log_error(PerspectiveState::LinkLanguageFailedToInstall).await; + }, + Err(e) => { + log::error!("Error when calling language_by_address: {:?}", e); + self.update_perspective_state_log_error(PerspectiveState::LinkLanguageFailedToInstall).await; + } + } + } + interval.tick().await; + } + } + + async fn nh_sync_loop(&self) { + let mut interval = time::interval(Duration::from_secs(3)); + while !self.is_teardown.lock().await.clone() { + let mut link_language_guard = self.link_language.lock().await; + if let Some(link_language) = link_language_guard.as_mut() { + match link_language.sync().await { + Ok(_) => (), + Err(e) => { + log::error!("Error calling sync on link language: {:?}", e); + let _ = self.update_perspective_state(PerspectiveState::LinkLanguageInstalledButNotSynced).await; + } + } + } + interval.tick().await; + } + } + + async fn pending_diffs_loop(&self) { + let mut interval = time::interval(Duration::from_secs(10)); + let uuid = self.persisted.lock().await.uuid.clone(); + while !self.is_teardown.lock().await.clone() { + if let Err(e) = (|| async { + let mut link_language_guard = self.link_language.lock().await; + if let Some(link_language) = link_language_guard.as_mut() { + // We have a link language. + // Let's see if we have a revision yet (otherwise we're not synced yet and should keep our diffs pending) + if link_language.current_revision().await.map_err(|e| anyhow!("current_revision error: {}",e))?.is_some() { + // Ok, we are synced and have a revision. Let's commit our pending diffs. + let pending_diffs = Ad4mDb::with_global_instance(|db| db.get_pending_diffs(&uuid)).map_err(|e| anyhow!("get_pending_diffs error: {}",e))?; + + if pending_diffs.additions.is_empty() && pending_diffs.removals.is_empty() { + return Ok(()); + } + log::info!("Found pending diffs: {:?}\n Committing...", pending_diffs); + let commit_result = link_language.commit(pending_diffs).await; + log::info!("Pending diffs commit result: {:?}", commit_result); + return match commit_result { + Ok(Some(_)) => { + Ad4mDb::with_global_instance(|db| db.clear_pending_diffs(&uuid)).map_err(|e| anyhow!("clear_pending_diffs error: {}",e))?; + Ok(()) + }, + Ok(None) => { + Err(anyhow!("Error committing pending diffs. No diff returned.")) + }, + Err(e) => { + Err(anyhow!("Error committing pending diffs: {:?}", e)) + } + } + } + } + Ok(()) + })().await { + log::error!("Error in pending_diffs_loop: {:?}", e); + } + interval.tick().await; + } + } + + async fn ensure_public_links_are_shared(&self) { + let uuid = self.persisted.lock().await.uuid.clone(); + let mut link_language_guard = self.link_language.lock().await; + if let Some(link_language) = link_language_guard.as_mut() { + let mut local_links = Ad4mDb::with_global_instance(|db| + db.get_all_links(&uuid) + ).unwrap(); + + local_links.retain(|(_, status)| status == &LinkStatus::Shared); + + let remote_links = match link_language.current_revision().await { + Ok(Some(_)) => link_language.render() + .await + .unwrap_or(None) + .unwrap_or_default() + .links, + _ => vec![], + }; + + let mut links_to_commit = Vec::new(); + for (local_link, _) in &local_links { + if !remote_links.iter().any(|e| + e.author == local_link.author && + e.timestamp == local_link.timestamp && + e.data.source == local_link.data.source && + e.data.target == local_link.data.target && + e.data.predicate == local_link.data.predicate + ) { + links_to_commit.push(local_link.clone()); + } + } + + if !links_to_commit.is_empty() { + let result = link_language.commit(PerspectiveDiff { + additions: links_to_commit, + removals: vec![], + }).await; + + if let Err(e) = result { + log::error!("Error calling link language's commit in ensure_public_links_are_shared: {:?}", e); + } + } + + //Ad4mDb::with_global_instance(|db| db.add_many_links(&self.persisted.lock().await.uuid, &remote_links)).unwrap(); // Assuming add_many_links takes a reference to a Vec and returns Result<(), AnyError> + } + } + + pub async fn update_perspective_state(&self, state: PerspectiveState) -> Result<(), AnyError> { + if self.persisted.lock().await.state != state { + let mut handle = self.persisted.lock().await.clone(); + handle.state = state.clone(); + + update_perspective(&handle).await.map_err(|e| anyhow!(e))?; + + get_global_pubsub() + .await + .publish( + &PERSPECTIVE_SYNC_STATE_CHANGE_TOPIC, + &serde_json::to_string(&PerspectiveStateFilter { + perspective: handle, + state: serde_json::to_string(&state).expect("must be able to serialze PerspectiveState"), + }).unwrap(), + ) + .await; + } + Ok(()) + } + + async fn update_perspective_state_log_error(&self, state: PerspectiveState) { + if let Err(e) = self.update_perspective_state(state).await { + log::error!("Error updating perspective state: {:?}", e); + } + } + + + pub async fn update_from_handle(&self, handle: PerspectiveHandle) { + *self.persisted.lock().await = handle; + } + + pub async fn commit(&self, diff: &PerspectiveDiff) -> Result, AnyError> { + let handle = self.persisted.lock().await.clone(); + if handle.neighbourhood.is_none() { + return Ok(None) + } + + + let mut can_commit = false; + if !self.created_from_join { + can_commit = true; + } else { + if let Some(link_language) = self.link_language.lock().await.as_mut() { + if link_language.current_revision().await?.is_some() { + can_commit = true; + } + } + }; + + if can_commit { + if let Some(link_language) = self.link_language.lock().await.as_mut() { + return Ok(link_language.commit(diff.clone()).await?); + } + } + + Err(anyhow!("Cannot commit diff. Not yet synced with neighbourhood...")) + } + + pub async fn diff_from_link_language(&self, diff: PerspectiveDiff) { + let handle = self.persisted.lock().await.clone(); + if !diff.additions.is_empty() { + Ad4mDb::global_instance() + .lock() + .expect("Couldn't get write lock on Ad4mDb") + .as_ref() + .expect("Ad4mDb not initialized") + .add_many_links(&handle.uuid, diff.additions.clone(), &LinkStatus::Shared) + .expect("Failed to add many links"); + } + + if !diff.removals.is_empty() { + for link in &diff.removals { + Ad4mDb::global_instance() + .lock() + .expect("Couldn't get write lock on Ad4mDb") + .as_ref() + .expect("Ad4mDb not initialized") + .remove_link(&handle.uuid, link) + .expect("Failed to remove link"); + } + } + self.set_prolog_rebuild_flag().await; + + + for link in &diff.additions { + get_global_pubsub() + .await + .publish( + &PERSPECTIVE_LINK_ADDED_TOPIC, + &serde_json::to_string(&PerspectiveLinkFilter { + perspective: handle.clone(), + link: DecoratedLinkExpression::from((link.clone(), LinkStatus::Shared)), + }).unwrap(), + ) + .await; + } + + for link in &diff.removals { + get_global_pubsub() + .await + .publish( + &PERSPECTIVE_LINK_REMOVED_TOPIC, + &serde_json::to_string(&PerspectiveLinkFilter { + perspective: handle.clone(), + link: DecoratedLinkExpression::from((link.clone(), LinkStatus::Shared)), + }).unwrap(), + ) + .await; + } + } + + pub async fn telepresence_signal_from_link_language(&self, mut signal: PerspectiveExpression) { + signal.verify_signatures(); + let handle = self.persisted.lock().await.clone(); + get_global_pubsub() + .await + .publish( + &NEIGHBOURHOOD_SIGNAL_TOPIC, + &serde_json::to_string(&NeighbourhoodSignalFilter { + perspective: handle, + signal, + }).unwrap(), + ) + .await; + } + + pub async fn add_link(&mut self, link: Link, status: LinkStatus) -> Result { + let link_expression = create_signed_expression(link)?; + let link = self.add_link_expression(link_expression.into(), status).await; + link + } + + async fn set_prolog_rebuild_flag(&self) { + *self.prolog_needs_rebuild.lock().await = true; + } + + pub async fn add_link_expression(&mut self, link_expression: LinkExpression, status: LinkStatus) -> Result { + let handle = self.persisted.lock().await.clone(); + Ad4mDb::global_instance() + .lock() + .expect("Couldn't get write lock on Ad4mDb") + .as_ref() + .expect("Ad4mDb not initialized") + .add_link(&handle.uuid, &link_expression, &status)?; + + let decorated_link_expression = DecoratedLinkExpression::from((link_expression.clone(), status.clone())); + self.set_prolog_rebuild_flag().await; + + get_global_pubsub() + .await + .publish( + &PERSPECTIVE_LINK_ADDED_TOPIC, + &serde_json::to_string(&PerspectiveLinkFilter { + perspective: handle.clone(), + link: decorated_link_expression.clone(), + }).unwrap(), + ) + .await; + + if status == LinkStatus::Shared { + let diff = PerspectiveDiff { + additions: vec![link_expression.clone()], + removals: vec![], + }; + + let self_clone = self.clone(); + let diff_clone = diff.clone(); + let handle_clone = handle.clone(); + + tokio::spawn(async move { + match self_clone.commit(&diff_clone).await { + Ok(_) => (), + Err(_) => { + let global_instance = Ad4mDb::global_instance(); + let db = global_instance.lock().expect("Couldn't get write lock on Ad4mDb"); + + if let Some(db) = db.as_ref() { + db.add_pending_diff(&handle_clone.uuid, &diff_clone).unwrap_or_else(|e| { + eprintln!("Failed to add pending diff: {}", e); + }); + } else { + panic!("Ad4mDb not initialized"); + } + } + } + }); + } + + Ok(decorated_link_expression) + } + + + pub async fn add_links(&mut self, links: Vec, status: LinkStatus) -> Result, AnyError> { + let handle = self.persisted.lock().await.clone(); + let uuid = handle.uuid.clone(); + let link_expressions = links.into_iter() + .map(|l| create_signed_expression(l).map(|l| LinkExpression::from(l))) + .collect::, AnyError>>(); + + let link_expressions = link_expressions?; + + + let decorated_link_expressions = link_expressions.clone().into_iter() + .map(|l| DecoratedLinkExpression::from((l, status.clone()))) + .collect::>(); + + self.set_prolog_rebuild_flag().await; + + for link in &decorated_link_expressions { + get_global_pubsub() + .await + .publish( + &PERSPECTIVE_LINK_ADDED_TOPIC, + &serde_json::to_string(&PerspectiveLinkFilter { + perspective: handle.clone(), + link: link.clone(), + }).unwrap(), + ) + .await; + } + self.set_prolog_rebuild_flag().await; + + + let diff = PerspectiveDiff { + additions: link_expressions.clone(), + removals: vec![], + }; + let add_links_result = self.commit(&diff).await; + + if add_links_result.is_err() { + Ad4mDb::global_instance() + .lock() + .expect("Couldn't get write lock on Ad4mDb") + .as_ref() + .expect("Ad4mDb not initialized") + .add_pending_diff(&uuid, &diff)?; + } + + Ad4mDb::global_instance() + .lock() + .expect("Couldn't get write lock on Ad4mDb") + .as_ref() + .expect("Ad4mDb not initialized") + .add_many_links(&uuid, link_expressions.clone(), &status)?; + + Ok(decorated_link_expressions) + } + + pub async fn link_mutations(&mut self, mutations: LinkMutations, status: LinkStatus) -> Result { + let handle = self.persisted.lock().await.clone(); + let additions = mutations.additions.into_iter() + .map(Link::from) + .map(create_signed_expression) + .map(|r| r.map(LinkExpression::from)) + .collect::, AnyError>>()?; + let removals = mutations.removals.into_iter() + .map(LinkExpression::try_from) + .collect::, AnyError>>()?; + + Ad4mDb::global_instance() + .lock() + .expect("Couldn't get write lock on Ad4mDb") + .as_ref() + .expect("Ad4mDb not initialized") + .add_many_links(&handle.uuid, additions.clone(), &status)?; + + for link in &removals { + Ad4mDb::global_instance() + .lock() + .expect("Couldn't get write lock on Ad4mDb") + .as_ref() + .expect("Ad4mDb not initialized") + .remove_link(&handle.uuid, link)?; + } + + self.set_prolog_rebuild_flag().await; + + let diff = PerspectiveDiff { + additions: additions.clone(), + removals: removals.clone() + }; + + let decorated_diff = DecoratedPerspectiveDiff { + additions: additions.into_iter().map(|l| DecoratedLinkExpression::from((l, status.clone()))).collect::>(), + removals: removals.clone().into_iter().map(|l| DecoratedLinkExpression::from((l, status.clone()))).collect::>(), + }; + + for link in &decorated_diff.additions { + get_global_pubsub() + .await + .publish( + &PERSPECTIVE_LINK_ADDED_TOPIC, + &serde_json::to_string(&PerspectiveLinkFilter { + perspective: handle.clone(), + link: link.clone(), + }).unwrap(), + ) + .await; + } + + for link in &decorated_diff.removals { + get_global_pubsub() + .await + .publish( + &PERSPECTIVE_LINK_REMOVED_TOPIC, + &serde_json::to_string(&PerspectiveLinkFilter { + perspective: handle.clone(), + link: link.clone(), + }).unwrap(), + ) + .await; + } + + let mutation_result = self.commit(&diff).await; + + if mutation_result.is_err() { + Ad4mDb::global_instance() + .lock() + .expect("Couldn't get write lock on Ad4mDb") + .as_ref() + .expect("Ad4mDb not initialized") + .add_pending_diff(&handle.uuid, &diff)?; + } + + self.set_prolog_rebuild_flag().await; + + Ok(decorated_diff) + } + + pub async fn update_link(&mut self, old_link: LinkExpression, new_link: Link) -> Result { + let handle = self.persisted.lock().await.clone(); + let link_option = Ad4mDb::global_instance() + .lock() + .expect("Couldn't get lock on Ad4mDb") + .as_ref() + .expect("Ad4mDb not initialized") + .get_link(&handle.uuid, &old_link)?; + + let (link, link_status) = match link_option { + Some(link) => link, + None => { + return Err(AnyError::msg(format!( + "NH [{}] ({}) Link not found in perspective \"{}\": {:?}", + handle.shared_url.clone().unwrap_or("not-shared".to_string()), + handle.name.clone().unwrap_or("".to_string()), + handle.uuid, + old_link + ))) + } + }; + + let new_link_expression = LinkExpression::from(create_signed_expression(new_link)?); + + Ad4mDb::global_instance() + .lock() + .expect("Couldn't get write lock on Ad4mDb") + .as_ref() + .expect("Ad4mDb not initialized") + .update_link(&handle.uuid, &link, &new_link_expression)?; + + let decorated_new_link_expression = DecoratedLinkExpression::from((new_link_expression.clone(), link_status.clone())); + let decorated_old_link = DecoratedLinkExpression::from((old_link.clone(), link_status)); + + self.set_prolog_rebuild_flag().await; + get_global_pubsub() + .await + .publish( + &PERSPECTIVE_LINK_UPDATED_TOPIC, + &serde_json::to_string(&PerspectiveLinkUpdatedFilter { + perspective: handle.clone(), + old_link: decorated_old_link, + new_link: decorated_new_link_expression.clone(), + }).unwrap(), + ) + .await; + + let diff = PerspectiveDiff { + additions: vec![new_link_expression.clone()], + removals: vec![old_link.clone()], + }; + let mutation_result = self.commit(&diff).await; + + if mutation_result.is_err() { + Ad4mDb::global_instance() + .lock() + .expect("Couldn't get lock on Ad4mDb") + .as_ref() + .expect("Ad4mDb not initialized") + .add_pending_diff(&handle.uuid, &diff)?; + } + + Ok(decorated_new_link_expression) + } + + pub async fn remove_link(&mut self, link_expression: LinkExpression) -> Result { + let handle = self.persisted.lock().await.clone(); + if let Some((link_from_db, status)) = Ad4mDb::with_global_instance(|db| db.get_link(&handle.uuid, &link_expression))? { + Ad4mDb::with_global_instance(|db| db.remove_link(&handle.uuid, &link_expression))?; + + self.set_prolog_rebuild_flag().await; + get_global_pubsub() + .await + .publish( + &PERSPECTIVE_LINK_REMOVED_TOPIC, + &serde_json::to_string(&PerspectiveLinkFilter { + perspective: handle.clone(), + link: DecoratedLinkExpression::from((link_expression.clone(), status.clone())), + }).unwrap(), + ) + .await; + + let diff = PerspectiveDiff { + additions: vec![], + removals: vec![link_expression.clone()], + }; + let mutation_result = self.commit(&diff).await; + + if mutation_result.is_err() { + Ad4mDb::with_global_instance(|db| db.add_pending_diff(&handle.uuid, &diff))?; + } + + Ok(DecoratedLinkExpression::from((link_from_db, status))) + } else { + Err(anyhow!("Link not found")) + } + } + + async fn get_links_local(&self, query: &LinkQuery) -> Result, AnyError> { + let uuid = self.persisted.lock().await.uuid.clone(); + let mut result = if query.source.is_none() && query.predicate.is_none() && query.target.is_none() { + Ad4mDb::with_global_instance(|db| { + db.get_all_links(&uuid) + })? + } else if let Some(source) = &query.source { + Ad4mDb::with_global_instance(|db| { + db.get_links_by_source(&uuid, source) + })? + } else if let Some(target) = &query.target { + Ad4mDb::with_global_instance(|db| { + db.get_links_by_target(&uuid, target) + })? + } else if let Some(predicate) = &query.predicate { + Ad4mDb::with_global_instance(|db| { + Ok::, AnyError>( + db.get_all_links(& uuid)? + .into_iter() + .filter(|(link, _)| link.data.predicate.as_ref() == Some(predicate)) + .collect::>() + ) + })? + } else { + vec![] + }; + + if let Some(predicate) = &query.predicate { + result.retain(|(link, _status)| link.data.predicate.as_ref() == Some(predicate)); + } + + if let Some(target) = &query.target { + result.retain(|(link, _status)| link.data.target == *target); + } + + if let Some(source) = &query.source { + result.retain(|(link, _status)| link.data.source == *source); + } + + let until_date: Option> = query.until_date.clone().map(|d| d.into()); + let from_date: Option> = query.from_date.clone().map(|d| d.into()); + + if let Some(from_date) = &from_date { + result.retain(|(link, _)| { + let link_date = DateTime::parse_from_rfc3339(&link.timestamp).unwrap(); + link_date >= *from_date + }); + } + + if let Some(until_date) = &until_date { + result.retain(|(link, _)| { + let link_date = DateTime::parse_from_rfc3339(&link.timestamp).unwrap(); + link_date <= *until_date + }); + } + /* + + if let Some(limit) = query.limit { + let limit = limit as usize; + let result_length = result.len(); + let start_limit = if from_date >= until_date { + result_length.saturating_sub(limit) + } else { + 0 + } as usize; + + let end_limit = if from_date >= until_date { + result_length + } else { + limit.min(result_length) + } as usize; + + result = result[..limit as usize].to_vec(); + } + */ + Ok(result) + } + + pub async fn get_links(&self, q: &LinkQuery) -> Result, AnyError> { + let mut reverse = false; + let mut query = q.clone(); + + if let Some(until_date) = query.until_date.as_ref() { + if let Some(from_date) = query.from_date.as_ref() { + let chrono_from_date: chrono::DateTime = from_date.clone().into(); + let chrono_until_date: chrono::DateTime = until_date.clone().into(); + if chrono_from_date > chrono_until_date { + reverse = true; + query.from_date = q.until_date.clone(); + query.until_date = q.from_date.clone(); + } + } + } + + let mut links = self.get_links_local(&query).await?; + + links.sort_by(|(a, _), (b, _)| { + let a_time = DateTime::parse_from_rfc3339(&a.timestamp).unwrap(); + let b_time = DateTime::parse_from_rfc3339(&b.timestamp).unwrap(); + if reverse { + b_time.cmp(&a_time) + + } else { + a_time.cmp(&b_time) + } + }); + + if let Some(limit) = query.limit { + let limit = links.len().min(limit as usize); + links = links[..limit as usize].to_vec(); + } + + Ok(links + .into_iter() + .map(|(link, status)| { + DecoratedLinkExpression::from((link.clone(), status)).into() + }) + .collect()) + } + + + + /// Adds the given Social DNA code to the perspective's SDNA code + pub async fn add_sdna(&mut self, name: String, mut sdna_code: String, sdna_type: SdnaType) -> Result { + let mut added = false; + let mutex = self.sdna_change_mutex.clone(); + let _guard = mutex.lock().await; + + let predicate = match sdna_type { + SdnaType::SubjectClass => "ad4m://has_subject_class", + SdnaType::Flow => "ad4m://has_flow", + SdnaType::Custom => "ad4m://has_custom_sdna", + }; + + let literal_name = Literal::from_string(name).to_url().expect("just initialized Literal couldn't be turned into URL"); + + let links = self.get_links(&LinkQuery { + source: Some("ad4m://self".to_string()), + predicate: Some(predicate.to_string()), + target: Some(literal_name.clone()), + from_date: None, + until_date: None, + limit: None, + }).await?; + + let mut sdna_links: Vec = Vec::new(); + + if let Err(_) = Literal::from_url(sdna_code.clone()) { + sdna_code = Literal::from_string(sdna_code).to_url().expect("just initialized Literal couldn't be turned into URL"); + } + + + + if links.is_empty() { + sdna_links.push(Link { + source: "ad4m://self".to_string(), + predicate: Some(predicate.to_string()), + target: literal_name.clone(), + }); + + sdna_links.push(Link { + source: literal_name, + predicate: Some("ad4m://sdna".to_string()), + target: sdna_code, + }); + + self.add_links(sdna_links, LinkStatus::Shared).await?; + added = true; + } + // Mutex guard is automatically dropped here + Ok(added) + } + + + /// Executes a Prolog query against the engine, spawning and initializing the engine if necessary. + pub async fn prolog_query(&mut self, query: String) -> Result { + let mut maybe_prolog_engine = self.prolog_engine.lock().await; + if maybe_prolog_engine.is_none() { + let mut engine = PrologEngine::new(); + engine.spawn().await.map_err(|e| anyhow!("Failed to spawn Prolog engine: {}", e))?; + *maybe_prolog_engine = Some(engine); + self.set_prolog_rebuild_flag().await; + } + + let prolog_enging_option_ref = maybe_prolog_engine.as_ref(); + let prolog_engine = prolog_enging_option_ref.as_ref().expect("Must be some since we initialized the engine above"); + + let mut needs_rebuild = self.prolog_needs_rebuild.lock().await; + + if *needs_rebuild { + let all_links = self.get_links(&LinkQuery::default()).await?; + let facts = init_engine_facts(all_links, self.persisted.lock().await.neighbourhood.as_ref().map(|n| n.author.clone())).await?; + prolog_engine.load_module_string("facts".to_string(), facts).await?; + *needs_rebuild = false; + } + + let query = if !query.ends_with(".") { + query + "." + } else { + query + }; + + let result = prolog_engine + .run_query(query).await?.map_err(|e| anyhow!(e))?; + Ok(prolog_resolution_to_string(result)) + } + + async fn no_link_language_error(&self) -> AnyError { + let handle = self.persisted.lock().await.clone(); + anyhow!("Perspective {} has no link language installed. State is: {:?}", handle.uuid, handle.state) + } + + pub async fn others(&self) -> Result, AnyError> { + let mut link_language_guard = self.link_language.lock().await; + if let Some(link_language) = link_language_guard.as_mut() { + link_language.others().await + } else { + Err(self.no_link_language_error().await) + } + } + + pub async fn has_telepresence_adapter(&self) -> bool { + let mut link_language_guard = self.link_language.lock().await; + if let Some(link_language) = link_language_guard.as_mut() { + match link_language.has_telepresence_adapter().await { + Ok(result) => result, + Err(e) => { + log::error!("Error calling has_telepresence_adapter: {:?}", e); + false + } + } + } else { + false + } + } + + pub async fn online_agents(&self) -> Result, AnyError> { + let mut link_language_guard = self.link_language.lock().await; + if let Some(link_language) = link_language_guard.as_mut() { + Ok(link_language.get_online_agents() + .await? + .into_iter() + .map(|mut a| { + a.status.verify_signatures(); + a + }) + .collect()) + } else { + Err(self.no_link_language_error().await) + } + } + + pub async fn set_online_status(&self, status: PerspectiveExpression) -> Result<(), AnyError> { + let mut link_language_guard = self.link_language.lock().await; + if let Some(link_language) = link_language_guard.as_mut() { + link_language.set_online_status(status).await + } else { + Err(self.no_link_language_error().await) + } + } + + pub async fn send_signal( + &self, + remote_agent_did: String, + payload: PerspectiveExpression + ) -> Result<(), AnyError> { + let mut link_language_guard = self.link_language.lock().await; + if let Some(link_language) = link_language_guard.as_mut() { + link_language.send_signal(remote_agent_did, payload).await + } else { + Err(self.no_link_language_error().await) + } + } + + pub async fn send_broadcast( + &self, + payload: PerspectiveExpression + ) -> Result<(), AnyError> { + let mut link_language_guard = self.link_language.lock().await; + if let Some(link_language) = link_language_guard.as_mut() { + link_language.send_broadcast(payload).await + } else { + Err(self.no_link_language_error().await) + } + } + + +} + + + + + +#[cfg(test)] +mod tests { + use super::*; + use crate::graphql::graphql_types::PerspectiveState; + use crate::perspectives::perspective_instance::{PerspectiveHandle}; + use crate::db::Ad4mDb; + use uuid::Uuid; + use crate::test_utils::setup_wallet; + use fake::{Fake, Faker}; + + fn setup() -> PerspectiveInstance { + setup_wallet(); + Ad4mDb::init_global_instance(":memory:").unwrap(); + + PerspectiveInstance::new( + PerspectiveHandle { + uuid: Uuid::new_v4().to_string(), + name: Some("Test Perspective".to_string()), + shared_url: None, + neighbourhood: None, + state: PerspectiveState::Private, + }, + None + ) + } + + pub fn create_link() -> Link { + Link { + source: format!("https://{}.com", Faker.fake::()), + target: format!("https://{}.org", Faker.fake::()), + predicate: Some(format!("https://{}.net", Faker.fake::())), + } + } + + #[tokio::test] + async fn test_get_all_links_after_adding_five() { + let mut perspective = setup(); + let mut all_links = Vec::new(); + + for _ in 0..5 { + let link = create_link(); + let expression = perspective.add_link(link.clone(), LinkStatus::Local).await.unwrap(); + all_links.push(expression); + } + + let query = LinkQuery::default(); + let links = perspective.get_links(&query).await.unwrap(); + assert_eq!(links.len(), 5); + assert_eq!(links, all_links); + } + + #[tokio::test] + async fn test_get_links_by_source() { + let mut perspective = setup(); + let mut all_links = Vec::new(); + let source = "ad4m://self"; + + for i in 0..5 { + let mut link = create_link(); + if i % 2 == 0 { + link.source = source.to_string(); + } + + let expression = perspective.add_link(link.clone(), LinkStatus::Shared).await.unwrap(); + all_links.push(expression); + } + + let query = LinkQuery { + source: Some(source.to_string()), + ..Default::default() + }; + let links = perspective.get_links(&query).await.unwrap(); + let expected_links: Vec<_> = all_links + .into_iter() + .filter(|expr| expr.data.source == source) + .collect(); + assert_eq!(links.len(), expected_links.len()); + assert_eq!(links, expected_links); + } + + + #[tokio::test] + async fn test_remove_link() { + let mut perspective = setup(); + let link = create_link(); + let status = LinkStatus::Local; + + // Add a link to the perspective + let expression = perspective.add_link(link.clone(), status).await.unwrap(); + + // Ensure the link is present + let query = LinkQuery::default(); + let links_before_removal = perspective.get_links(&query).await.unwrap(); + assert!(links_before_removal.contains(&expression)); + + // Remove the link from the perspective + perspective.remove_link(expression.clone().into()).await.unwrap(); + + // Ensure the link is no longer present + let links_after_removal = perspective.get_links(&query).await.unwrap(); + assert!(!links_after_removal.contains(&expression)); + } + + #[tokio::test] + async fn test_link_query_date_filtering() { + let mut perspective = setup(); + let mut all_links = Vec::new(); + let now = chrono::Utc::now(); + + // Add links with timestamps spread out by one minute intervals + for i in 0..5 { + let mut link = create_link(); + link.target = format!("lang://test-target {}",i); + let mut link = create_signed_expression(link).expect("Failed to create link"); + link.timestamp = (now - chrono::Duration::minutes(5) + chrono::Duration::minutes(i as i64)).to_rfc3339(); + let expression = perspective.add_link_expression(LinkExpression::from(link.clone()), LinkStatus::Shared).await.unwrap(); + all_links.push(expression); + println!("Added link with timestamp: {}, {:?}", link.timestamp, link); + } + + // Query for links with a from_date set to 3 minutes in + let from_date = (now - chrono::Duration::minutes(5) + chrono::Duration::minutes(3)).into(); + let query_with_from_date = LinkQuery { + from_date: Some(from_date), + ..Default::default() + }; + //println!("Query with from_date: {:?}", query_with_from_date); + let links_from_date = perspective.get_links(&query_with_from_date).await.unwrap(); + //println!("Links from date: {:?}", links_from_date); + assert_eq!(links_from_date.len(), 2); + + // Query for links with an until_date set to 3 minutes in + let until_date = (now - chrono::Duration::minutes(5) + chrono::Duration::minutes(3)).into(); + let query_with_until_date = LinkQuery { + until_date: Some(until_date), + ..Default::default() + }; + let links_until_date = perspective.get_links(&query_with_until_date).await.unwrap(); + assert_eq!(links_until_date.len(), 4); + + // Query for links with both from_date and until_date set to filter a range + let from_date = (now - chrono::Duration::minutes(4)).into(); + let until_date = (now - chrono::Duration::minutes(2) - chrono::Duration::seconds(30)).into(); + let query_with_date_range = LinkQuery { + from_date: Some(from_date), + until_date: Some(until_date), + ..Default::default() + }; + let links_date_range = perspective.get_links(&query_with_date_range).await.unwrap(); + assert_eq!(links_date_range.len(), 2); + + + // reverse for descending order + let from_date = (now).into(); + let until_date = (now - chrono::Duration::minutes(10)).into(); + + let query_with_date_range = LinkQuery { + from_date: Some(from_date), + until_date: Some(until_date), + ..Default::default() + }; + + let links_date_desc = perspective.get_links(&query_with_date_range).await.unwrap(); + assert_eq!(links_date_desc.len(), 5); + assert_eq!(links_date_desc[0].data.target, all_links[4].data.target); + assert_eq!(links_date_desc[1].data.target, all_links[3].data.target); + assert_eq!(links_date_desc[2].data.target, all_links[2].data.target); + assert_eq!(links_date_desc[3].data.target, all_links[1].data.target); + assert_eq!(links_date_desc[4].data.target, all_links[0].data.target); + + + // reverse for descending order with limit + let from_date = (now).into(); + let until_date = (now - chrono::Duration::minutes(10)).into(); + + let query_with_date_range = LinkQuery { + from_date: Some(from_date), + until_date: Some(until_date), + limit: Some(3), + ..Default::default() + }; + + let links_date_desc = perspective.get_links(&query_with_date_range).await.unwrap(); + assert_eq!(links_date_desc.len(), 3); + links_date_desc.iter().for_each(|l| println!("Link: {:?}", l.data.target)); + assert_eq!(links_date_desc[0].data.target, all_links[4].data.target); + assert_eq!(links_date_desc[1].data.target, all_links[3].data.target); + assert_eq!(links_date_desc[2].data.target, all_links[2].data.target); + + + // ascending order with limit + let from_date = (now - chrono::Duration::minutes(10)).into(); + let until_date = (now).into(); + + let query_with_date_range = LinkQuery { + from_date: Some(from_date), + until_date: Some(until_date), + limit: Some(3), + ..Default::default() + }; + + let links_date_desc = perspective.get_links(&query_with_date_range).await.unwrap(); + assert_eq!(links_date_desc.len(), 3); + links_date_desc.iter().for_each(|l| println!("Link: {:?}", l.data.target)); + assert_eq!(links_date_desc[0].data.target, all_links[0].data.target); + assert_eq!(links_date_desc[1].data.target, all_links[1].data.target); + assert_eq!(links_date_desc[2].data.target, all_links[2].data.target); + + + + } + + // Additional tests for updateLink, removeLink, syncWithSharingAdapter, etc. would go here + // following the same pattern as above. +} + diff --git a/rust-executor/src/perspectives/sdna.rs b/rust-executor/src/perspectives/sdna.rs new file mode 100644 index 000000000..0150c5d4e --- /dev/null +++ b/rust-executor/src/perspectives/sdna.rs @@ -0,0 +1,222 @@ +use crate::agent; +use crate::types::{DecoratedLinkExpression, ExpressionRef, LanguageRef, Link}; +use ad4m_client::literal::Literal; +use chrono::DateTime; +use deno_core::error::AnyError; +use std::collections::{HashMap, HashSet}; +use std::convert::TryFrom; +use log; + +fn triple_fact(l: &DecoratedLinkExpression) -> String { + format!("triple(\"{}\", \"{}\", \"{}\").", l.data.source, l.data.predicate.as_ref().unwrap_or(&"".to_string()), l.data.target) +} + +fn link_fact(l: &DecoratedLinkExpression) -> String { + format!( + "link(\"{}\", \"{}\", \"{}\", {}, \"{}\").", + l.data.source, + l.data.predicate.as_ref().unwrap_or(&"".to_string()), + l.data.target, + DateTime::parse_from_rfc3339(&l.timestamp).unwrap().timestamp_millis(), + l.author + ) +} + +async fn node_facts(all_links: &Vec<&DecoratedLinkExpression>) -> Result, AnyError> { + let mut lang_addrs = Vec::new(); + let mut lang_names = Vec::new(); + let mut expr_addrs = Vec::new(); + + let mut nodes = HashSet::new(); + for link in all_links.iter() { + if !link.data.source.is_empty() { + nodes.insert(link.data.source.clone()); + } + if let Some(predicate) = link.data.predicate.as_ref() { + if !predicate.is_empty() { + nodes.insert(predicate.clone()); + } + } + if !link.data.target.is_empty() { + nodes.insert(link.data.target.clone()); + } + } + + lang_addrs.push(":- discontiguous(languageAddress/2).".to_string()); + lang_names.push(":- discontiguous(languageName/2).".to_string()); + expr_addrs.push(":- discontiguous(expressionAddress/2).".to_string()); + + for node in nodes.iter() { + if node == "false" || node == "true" { + continue; + } + match ExpressionRef::try_from(node.clone()) { + Ok(expression_ref) => { + let lang = if expression_ref.language.name.is_empty() { + //TODO wire up LanguageController + //language_controller.language_by_ref(&ref.language).await? + LanguageRef { + name: "unknown".to_string(), + address: "unknown".to_string(), + } + } else { + expression_ref.language.clone() + }; + + lang_addrs.push(format!("languageAddress(\"{}\", \"{}\").", node, expression_ref.language.address)); + lang_names.push(format!("languageName(\"{}\", \"{}\").", node, lang.name)); + expr_addrs.push(format!("expressionAddress(\"{}\", \"{}\").", node, expression_ref.expression)); + }, + Err(e) => { + if !e.to_string().contains("Language not found by reference") { + log::debug!("While creating expressionLanguageFacts: {:?}", e); + } + } + } + } + + Ok(lang_addrs.into_iter().chain(lang_names).chain(expr_addrs).collect()) +} + + +fn is_sdna_link(link: &Link) -> bool { + link.source == "ad4m://self" && ["ad4m://has_subject_class", "ad4m://has_flow", "ad4m://has_custom_sdna"].contains(&link.predicate.as_deref().unwrap_or("")) +} + + + +pub async fn init_engine_facts(all_links: Vec, neighbourhood_author: Option) -> Result, AnyError> { + let mut lines: Vec = Vec::new(); + + // triple/3 + // link/5 + lines.push(":- discontiguous(triple/3).".to_string()); + lines.push(":- discontiguous(link/5).".to_string()); + + let links_without_sdna: Vec<_> = all_links.iter().filter(|l| !is_sdna_link(&l.data)).collect(); + + for link in &links_without_sdna { + lines.push(triple_fact(link)); + } + for link in &links_without_sdna { + lines.push(link_fact(link)); + } + + // reachable/2 + lines.push(":- discontiguous(reachable/2).".to_string()); + lines.push("reachable(A,B) :- triple(A,_,B).".to_string()); + lines.push("reachable(A,B) :- triple(A,_,X), reachable(X,B).".to_string()); + + // hiddenExpression/1 + lines.push(":- discontiguous(hiddenExpression/1).".to_string()); + + // lines.extend(node_facts(&links_without_sdna).await?); + + // Social DNA zomes + lines.push(":- discontiguous(register_sdna_flow/2).".to_string()); + lines.push(":- discontiguous(flowable/2).".to_string()); + lines.push(":- discontiguous(flow_state/3).".to_string()); + lines.push(":- discontiguous(start_action/2).".to_string()); + lines.push(":- discontiguous(action/4).".to_string()); + + lines.push(":- discontiguous(subject_class/2).".to_string()); + lines.push(":- discontiguous(constructor/2).".to_string()); + lines.push(":- discontiguous(destructor/2).".to_string()); + lines.push(":- discontiguous(instance/2).".to_string()); + + lines.push(":- discontiguous(property/2).".to_string()); + lines.push(":- discontiguous(property_getter/4).".to_string()); + lines.push(":- discontiguous(property_setter/3).".to_string()); + lines.push(":- discontiguous(property_resolve/2).".to_string()); + lines.push(":- discontiguous(property_resolve_language/3).".to_string()); + lines.push(":- discontiguous(property_named_option/4).".to_string()); + + lines.push(":- discontiguous(collection/2).".to_string()); + lines.push(":- discontiguous(collection_getter/4).".to_string()); + lines.push(":- discontiguous(collection_setter/3).".to_string()); + lines.push(":- discontiguous(collection_remover/3).".to_string()); + lines.push(":- discontiguous(collection_adder/3).".to_string()); + + lines.push(":- discontiguous(p3_class_icon/2).".to_string()); + lines.push(":- discontiguous(p3_class_color/2).".to_string()); + lines.push(":- discontiguous(p3_instance_color/3).".to_string()); + + lines.push(":- use_module(library(lists)).".to_string()); + + let lib = r#" +:- discontiguous(paginate/4). +paginate(Data, PageNumber, PageSize, PageData) :- +PageNumber > 0, +PageSize > 0, +length(Data, DataLength), +MaxSkip is max(0, DataLength - PageSize), +SkipCount is min((PageNumber - 1) * PageSize, MaxSkip), +skipN(Data, SkipCount, SkippedData), +takeN(SkippedData, PageSize, PageData). + +:- discontiguous(skipN/3). +skipN(Data, 0, Data). +skipN([_|Rest], N, SkippedData) :- +N > 0, +NextN is N - 1, +skipN(Rest, NextN, SkippedData). + +:- discontiguous(takeN/3). +takeN(_, 0, []). +takeN([Item|Rest], N, [Item|PageRest]) :- +N > 0, +NextN is N - 1, +takeN(Rest, NextN, PageRest). + "#; + + lines.extend(lib.split('\n').map(|s| s.to_string())); + + let mut author_agents = vec![agent::did()]; + if let Some(neughbourhood_author) = neighbourhood_author { + author_agents.push(neughbourhood_author); + } + + let mut seen_subject_classes = HashMap::new(); + for link_expression in all_links { + let link = &link_expression.data; + + if link_expression.proof.valid.unwrap_or(false) && author_agents.contains(&link_expression.author) { + if is_sdna_link(link) { + let name = Literal::from_url(link.target.clone())? + .get() + .expect("must work") + .to_string(); + + let entry = seen_subject_classes.entry(name.clone()).or_insert_with(|| HashMap::new()); + entry.insert("type".to_string(), link.predicate.as_ref().expect("sdna link must have predicate").clone()); + } + + if link.predicate == Some("ad4m://sdna".to_string()) { + let name = Literal::from_url(link.source.clone())?.get().expect("must work").to_string(); + let code = Literal::from_url(link.target.clone())?.get().expect("must work").to_string(); + + let subject_class = seen_subject_classes.entry(name.clone()).or_insert_with(|| HashMap::new()); + let existing_timestamp = subject_class.get("timestamp").and_then(|t| t.parse::().ok()); + let current_timestamp = link_expression.timestamp.parse::().ok(); + + if let (Some(existing), Some(current)) = (existing_timestamp, current_timestamp) { + if current > existing { + subject_class.insert("code".to_string(), code); + subject_class.insert("timestamp".to_string(), link_expression.timestamp.clone()); + } + } else { + subject_class.insert("code".to_string(), code); + subject_class.insert("timestamp".to_string(), link_expression.timestamp.clone()); + } + } + } + } + + for (_name, properties) in seen_subject_classes.iter() { + if let Some(code) = properties.get(&"code".to_string()) { + lines.extend(code.split('\n').map(|s| s.to_string())); + } + } + + Ok(lines) +} diff --git a/rust-executor/src/perspectives/utils.rs b/rust-executor/src/perspectives/utils.rs new file mode 100644 index 000000000..6a938382b --- /dev/null +++ b/rust-executor/src/perspectives/utils.rs @@ -0,0 +1,72 @@ +use scryer_prolog::machine::parsed_results::{Value, QueryMatch, QueryResolution}; + +pub fn prolog_value_to_json_tring(value: Value) -> String { + match value { + Value::Integer(i) => format!("{}", i), + Value::Float(f) => format!("{}", f), + Value::Rational(r) => format!("{}", r), + Value::Atom(a) => format!("{}", a.as_str()), + Value::String(s) => + if let Err(_e) = serde_json::from_str::(s.as_str()) { + //treat as string literal + //escape double quotes + format!("\"{}\"", s + .replace("\"", "\\\"") + .replace("\n", "\\n") + .replace("\t", "\\t") + .replace("\r", "\\r")) + } else { + //return valid json string + s + }, + Value::List(l) => { + let mut string_result = "[".to_string(); + for (i, v) in l.iter().enumerate() { + if i > 0 { + string_result.push_str(", "); + } + string_result.push_str(&prolog_value_to_json_tring(v.clone())); + } + string_result.push_str("]"); + string_result + } + Value::Structure(s, l) => { + let mut string_result = format!("\"{}\": [", s.as_str()); + for (i, v) in l.iter().enumerate() { + if i > 0 { + string_result.push_str(", "); + } + string_result.push_str(&prolog_value_to_json_tring(v.clone())); + } + string_result.push_str("]"); + string_result + } + _ => "null".to_string(), + } +} + +fn prolog_match_to_json_string(query_match: &QueryMatch) -> String { + let mut string_result = "{".to_string(); + for (i, (k, v)) in query_match.bindings.iter().enumerate() { + if i > 0 { + string_result.push_str(", "); + } + string_result.push_str(&format!("\"{}\": {}", k, prolog_value_to_json_tring(v.clone()))); + } + string_result.push_str("}"); + string_result +} + +pub fn prolog_resolution_to_string(resultion: QueryResolution) -> String { + match resultion { + QueryResolution::True => "true".to_string(), + QueryResolution::False => "false".to_string(), + QueryResolution::Matches(matches) => { + let matches_json: Vec = matches + .iter() + .map(|m| prolog_match_to_json_string(m)) + .collect(); + format!("[{}]", matches_json.join(", ")) + } + } +} \ No newline at end of file diff --git a/rust-executor/src/prolog_service/mod.rs b/rust-executor/src/prolog_service/mod.rs index 4d3560280..9a1b1e9d0 100644 --- a/rust-executor/src/prolog_service/mod.rs +++ b/rust-executor/src/prolog_service/mod.rs @@ -145,13 +145,13 @@ mod prolog_test { let query = String::from("non_existant_predicate(\"a\",\"p1\",\"b\")."); let result = service - .run_query(engine_name.clone(), query) + .run_query(engine_name.clone(), query) .await .expect("Error running query"); assert_eq!( result, - Err(String::from("error(existence_error(procedure,non_existant_predicate/3),non_existant_predicate/3).")) + Err(String::from("error existence_error procedure / non_existant_predicate 3 / non_existant_predicate 3")) ); } diff --git a/rust-executor/src/prolog_service/prolog_service_extension.rs b/rust-executor/src/prolog_service/prolog_service_extension.rs index 747ed94bb..d9a43c36e 100644 --- a/rust-executor/src/prolog_service/prolog_service_extension.rs +++ b/rust-executor/src/prolog_service/prolog_service_extension.rs @@ -1,18 +1,18 @@ use std::borrow::Cow; -use deno_core::{error::AnyError, include_js_files, op, Extension, anyhow::bail, Op}; +use deno_core::{error::AnyError, include_js_files, op2, Extension, anyhow::bail, Op}; use scryer_prolog::machine::parsed_results::{Value, QueryMatch, QueryResolution}; use super::get_prolog_service; -#[op] -async fn spawn_engine(engine_name: String) -> Result<(), AnyError> { +#[op2(async)] +async fn spawn_engine(#[string] engine_name: String) -> Result<(), AnyError> { let mut service = get_prolog_service().await; service.spawn_engine(engine_name).await } -#[op] -async fn remove_engine(engine_name: String) -> Result<(), AnyError> { +#[op2(async)] +async fn remove_engine(#[string] engine_name: String) -> Result<(), AnyError> { let mut service = get_prolog_service().await; service.remove_engine(engine_name).await } @@ -75,8 +75,9 @@ fn prolog_match_to_json_string(query_match: &QueryMatch) -> String { string_result } -#[op] -async fn run_query(engine_name: String, query: String) -> Result { +#[op2(async)] +#[string] +async fn run_query(#[string] engine_name: String, #[string] query: String) -> Result { let service = get_prolog_service().await; let result = service .run_query(engine_name, query) @@ -99,11 +100,11 @@ async fn run_query(engine_name: String, query: String) -> Result, + #[string] engine_name: String, + #[string] module_name: String, + #[serde] program_lines: Vec, ) -> Result<(), AnyError> { let service = get_prolog_service().await; service diff --git a/rust-executor/src/pubsub.rs b/rust-executor/src/pubsub.rs index dbe656aef..2e7835f1a 100644 --- a/rust-executor/src/pubsub.rs +++ b/rust-executor/src/pubsub.rs @@ -2,7 +2,7 @@ use crate::graphql::graphql_types::GetFilter; use crate::graphql::graphql_types::GetValue; use futures::Stream; use futures::StreamExt; -use juniper::{graphql_value, FieldError, FieldResult}; +use coasys_juniper::{graphql_value, FieldError, FieldResult}; use log::{debug, error, warn}; use serde::de::DeserializeOwned; use std::collections::HashMap; @@ -98,7 +98,11 @@ pub(crate) async fn subscribe_and_process< futures::future::ready(Some(Ok(value))) } Err(e) => { - error!("Failed to deserialize message: {:?}", e); + let type_name = std::any::type_name::(); + error!("Failed to deserialize pubsub message: {:?}", e); + error!("Type: {}", type_name); + error!("Message: {:?}", msg); + let field_error = FieldError::new( e, graphql_value!({ "type": "INTERNAL_ERROR_COULD_NOT_SERIALIZE" }), diff --git a/rust-executor/src/test_utils.rs b/rust-executor/src/test_utils.rs new file mode 100644 index 000000000..9b27060b0 --- /dev/null +++ b/rust-executor/src/test_utils.rs @@ -0,0 +1,8 @@ +use crate::wallet::Wallet; + +pub fn setup_wallet() { + let wallet_instance = Wallet::instance(); + let mut wallet = wallet_instance.lock().expect("wallet lock"); + let wallet_ref = wallet.as_mut().expect("wallet instance"); + wallet_ref.generate_keypair("main".to_string()); +} \ No newline at end of file diff --git a/rust-executor/src/types.rs b/rust-executor/src/types.rs new file mode 100644 index 000000000..8aef79993 --- /dev/null +++ b/rust-executor/src/types.rs @@ -0,0 +1,341 @@ +use deno_core::{anyhow::anyhow, error::AnyError}; +use serde::{Deserialize, Serialize}; +use coasys_juniper::{ + GraphQLObject, GraphQLValue, +}; + +use crate::{agent::signatures::verify, graphql::graphql_types::{LinkExpressionInput, LinkInput, LinkStatus, PerspectiveInput}}; +use regex::Regex; + +#[derive(Default, Debug, Deserialize, Serialize, Clone, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct Expression { + pub author: String, + pub timestamp: String, + pub data: T, + pub proof: ExpressionProof, +} + +#[derive(GraphQLObject, Default, Debug, Deserialize, Serialize, Clone, PartialEq)] +pub struct ExpressionProof { + pub key: String, + pub signature: String, +} + +#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)] +pub struct VerifiedExpression { + pub author: String, + pub timestamp: String, + pub data: T, + pub proof: DecoratedExpressionProof, +} + +#[derive(GraphQLObject, Default, Debug, Deserialize, Serialize, Clone, PartialEq)] + +pub struct DecoratedExpressionProof { + pub key: String, + pub signature: String, + pub valid: Option, + pub invalid: Option, +} + +impl From> for VerifiedExpression { + fn from(expr: Expression) -> Self { + let valid = match verify(&expr) { + Ok(valid) => valid, + Err(_) => false, + }; + let invalid = !valid; + VerifiedExpression { + author: expr.author, + timestamp: expr.timestamp, + data: expr.data, + proof: DecoratedExpressionProof { + key: expr.proof.key, + signature: expr.proof.signature, + valid: Some(valid), + invalid: Some(invalid), + }, + } + } +} + + + +#[derive(GraphQLObject, Default, Debug, Deserialize, Serialize, Clone, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct Link { + pub predicate: Option, + pub source: String, + pub target: String, +} + +impl From for Link { + fn from(input: LinkInput) -> Self { + Link { + predicate: input.predicate, + source: input.source, + target: input.target, + } + } +} + +impl Link { + pub fn normalize(&self) -> Link { + let predicate = match self.predicate.as_ref().map(String::as_str) { + Some("") => None, + _ => self.predicate.clone(), + }; + + Link { + predicate, + source: self.source.clone(), + target: self.target.clone(), + } + } +} + +#[derive(GraphQLObject, Debug, Deserialize, Serialize, Clone, PartialEq)] +pub struct LinkExpression { + pub author: String, + pub timestamp: String, + pub data: Link, + pub proof: ExpressionProof, + pub status: Option, +} + +impl TryFrom for LinkExpression { + type Error = AnyError; + fn try_from(input: LinkExpressionInput) -> Result { + let data = Link { + predicate: input.data.predicate, + source: input.data.source, + target: input.data.target, + }.normalize(); + Ok(LinkExpression { + author: input.author, + timestamp: input.timestamp, + data: data, + proof: ExpressionProof { + key: input.proof.key.ok_or(anyhow!("Key is required"))?, + signature: input.proof.signature.ok_or(anyhow!("Key is required"))?, + }, + status: input.status, + }) + } +} + +impl LinkExpression { + pub fn from_input_without_proof(input: LinkExpressionInput) -> Self { + let data = Link { + predicate: input.data.predicate, + source: input.data.source, + target: input.data.target, + }.normalize(); + LinkExpression { + author: input.author, + timestamp: input.timestamp, + data, + proof: ExpressionProof::default(), + status: input.status.into() + } + } +} + +impl From for Expression { + fn from(expr: LinkExpression) -> Self { + Expression { + author: expr.author, + timestamp: expr.timestamp, + data: expr.data, + proof: expr.proof, + } + } +} + +impl From> for LinkExpression { + fn from(expr: Expression) -> Self { + LinkExpression { + author: expr.author, + timestamp: expr.timestamp, + data: expr.data.normalize(), + proof: expr.proof, + status: None, + } + } +} + + + +#[derive(GraphQLObject, Default, Debug, Deserialize, Serialize, Clone, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct DecoratedLinkExpression { + pub author: String, + pub timestamp: String, + pub data: Link, + pub proof: DecoratedExpressionProof, + pub status: Option, +} + +impl DecoratedLinkExpression { + pub fn verify_signature(&mut self) { + let link_expr = Expression:: { + author: self.author.clone(), + timestamp: self.timestamp.clone(), + data: self.data.normalize(), + proof: ExpressionProof { + key: self.proof.key.clone(), + signature: self.proof.signature.clone(), + }, + }; + let valid = match verify(&link_expr) { + Ok(valid) => valid, + Err(_) => false, + }; + self.proof.valid = Some(valid); + self.proof.invalid = Some(!valid); + } +} + +impl From<(LinkExpression, LinkStatus)> for DecoratedLinkExpression { + fn from((expr, status): (LinkExpression, LinkStatus)) -> Self { + let mut expr: Expression = expr.into(); + expr.data = expr.data.normalize(); + let verified_expr: VerifiedExpression = expr.into(); + DecoratedLinkExpression { + author: verified_expr.author, + timestamp: verified_expr.timestamp, + data: verified_expr.data, + proof: verified_expr.proof, + status: Some(status), + } + } +} + +impl From for LinkExpression { + fn from(decorated: DecoratedLinkExpression) -> Self { + LinkExpression { + author: decorated.author, + timestamp: decorated.timestamp, + data: decorated.data.normalize(), + proof: ExpressionProof { + key: decorated.proof.key, + signature: decorated.proof.signature, + }, + status: decorated.status, + } + } +} + + +#[derive(GraphQLObject, Serialize, Deserialize, Debug, Clone, PartialEq, Default)] +pub struct Perspective { + pub links: Vec, +} + +impl From for Perspective { + fn from(input: PerspectiveInput) -> Self { + let links = input.links + .into_iter() + .map(|link| LinkExpression::try_from(link)) + .filter_map(Result::ok) + .collect(); + Perspective { links } + } +} + +#[derive(GraphQLObject, Serialize, Deserialize, Debug, Clone, PartialEq)] +pub struct Neighbourhood { + pub link_language: String, + pub meta: Perspective, +} + +#[derive(GraphQLObject, Serialize, Deserialize, Debug, Clone, PartialEq)] +pub struct NeighbourhoodExpression { + pub author: String, + pub data: Neighbourhood, + pub proof: ExpressionProof, + pub timestamp: String, +} + +pub type Address = String; + +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] +pub struct LanguageRef { + pub name: String, + pub address: Address, +} + +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] +pub struct ExpressionRef { + pub language: LanguageRef, + pub expression: Address, +} + +impl TryFrom for ExpressionRef { + type Error = AnyError; + + fn try_from(value: String) -> Result { + if value.starts_with("literal://") { + let language_ref = LanguageRef { + address: "literal".to_string(), + name: "literal".to_string(), + }; + let content = value[10..].to_string(); + return Ok(ExpressionRef { + language: language_ref, + expression: content, + }); + } + + let uri_regexp = Regex::new(r"^([^:^\s]+):\/\/([\s\S]+)$").unwrap(); + if let Some(uri_captures) = uri_regexp.captures(&value) { + if uri_captures.len() == 3 { + let language = uri_captures.get(1).unwrap().as_str().to_string(); + let expression = uri_captures.get(2).unwrap().as_str().to_string(); + + let language_ref = LanguageRef { + address: language, + name: "".to_string(), // Assuming name is not provided in the URI + }; + + return Ok(ExpressionRef { + language: language_ref, + expression, + }); + } + } + + let did_regexp = Regex::new(r"^did:([^\s]+)$").unwrap(); + if let Some(did_captures) = did_regexp.captures(&value) { + if did_captures.len() == 2 { + let language_ref = LanguageRef { + address: "did".to_string(), + name: "".to_string(), // Assuming name is not provided in the DID + }; + + return Ok(ExpressionRef { + language: language_ref, + expression: value, + }); + } + } + + Err(anyhow!("Couldn't parse string as expression URL or DID: {}", value)) + } +} + +impl ToString for ExpressionRef { + fn to_string(&self) -> String { + if self.language.address == "did" { + return self.expression.clone(); + } + format!("{}://{}", self.language.address, self.expression) + } +} + +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] +pub struct PerspectiveDiff { + pub additions: Vec, + pub removals: Vec, +} \ No newline at end of file diff --git a/setVersion.js b/setVersion.js index 72323daf1..8a4220a5b 100644 --- a/setVersion.js +++ b/setVersion.js @@ -62,6 +62,21 @@ console.log("Core version: " + core.version + " -> " + VERSION) core.version = VERSION fs.writeFileSync('core/package.json', JSON.stringify(core, null, 2) + '\n') +const hookHelpers = JSON.parse(fs.readFileSync('ad4m-hooks/helpers/package.json', 'utf8')) +console.log("Hook Helpers version: " + core.version + " -> " + VERSION) +hookHelpers.version = VERSION +fs.writeFileSync('ad4m-hooks/helpers/package.json', JSON.stringify(hookHelpers, null, 2) + '\n') + +const reactHooks = JSON.parse(fs.readFileSync('ad4m-hooks/react/package.json', 'utf8')) +console.log("Ad4m React hook version: " + reactHooks.version + " -> " + VERSION) +reactHooks.version = VERSION +fs.writeFileSync('ad4m-hooks/react/package.json', JSON.stringify(reactHooks, null, 2) + '\n') + +const vueHooks = JSON.parse(fs.readFileSync('ad4m-hooks/vue/package.json', 'utf8')) +console.log("Ad4m Vue hook version: " + vueHooks.version + " -> " + VERSION) +vueHooks.version = VERSION +fs.writeFileSync('ad4m-hooks/vue/package.json', JSON.stringify(vueHooks, null, 2) + '\n') + const executor = JSON.parse(fs.readFileSync('executor/package.json', 'utf8')) console.log("Executor version: " + executor.version + " -> " + VERSION) executor.version = VERSION diff --git a/test-runner/package.json b/test-runner/package.json index acb5c99b7..f45b2d512 100644 --- a/test-runner/package.json +++ b/test-runner/package.json @@ -63,5 +63,5 @@ "bugs": { "url": "https://github.com/perspect3vism/ad4m-test/issues" }, - "version": "0.8.1" + "version": "0.9.0" } diff --git a/tests/js/package.json b/tests/js/package.json index ad1642bbc..2668efb97 100644 --- a/tests/js/package.json +++ b/tests/js/package.json @@ -6,7 +6,7 @@ "test-main": "node scripts/cleanTestingData.js && pnpm run prepare-test && pnpm run test-all && node scripts/cleanTestingData.js", "test:windows": "pnpm run prepare-test:windows && pnpm run test-all:windows && node scripts/cleanTestingData.js", "test-all:windows": "node scripts/cleanup.js && pnpm run test-simple && node scripts/cleanup.js && pnpm run test-app && node scripts/cleanup.js && pnpm run test-auth && node scripts/cleanup.js && pnpm run test-integration && node scripts/cleanup.js && pnpm run test-prolog-and-literals", - "test-all": "pnpm run test-simple && pnpm run test-app && pnpm run test-auth && pnpm run test-integration && pnpm run test-prolog-and-literals", + "test-all": "node scripts/cleanup.js && pnpm run test-simple && node scripts/cleanup.js && pnpm run test-app && node scripts/cleanup.js && pnpm run test-auth && node scripts/cleanup.js && pnpm run test-integration && node scripts/cleanup.js && pnpm run test-prolog-and-literals && node scripts/cleanup.js", "test-simple": "ts-mocha -p tsconfig.json --timeout 1200000 --exit tests/simple.test.ts", "test-integration": "ts-mocha -p tsconfig.json --timeout 1200000 --exit tests/integration.test.ts", "test-app": "ts-mocha -p tsconfig.json --timeout 1200000 --exit tests/app.test.ts", @@ -18,7 +18,7 @@ "prepare-test:windows": "powershell -ExecutionPolicy Bypass -File ./scripts/build-test-language.ps1 && powershell -ExecutionPolicy Bypass -File ./scripts/prepareTestDirectory.ps1 && deno run --allow-all scripts/get-builtin-test-langs.js && pnpm run inject-language-language && pnpm run publish-test-languages && pnpm run inject-publishing-agent", "inject-language-language": "node scripts/injectLanguageLanguageBundle.js", "inject-publishing-agent": "node scripts/injectPublishingAgent.js", - "publish-test-languages": "ts-node-esm --experimental-specifier-resolution=node --files ./utils/publishTestLangs.ts" + "publish-test-languages": "node --no-warnings=ExperimentalWarning --experimental-specifier-resolution=node --loader ts-node/esm ./utils/publishTestLangs.ts" }, "devDependencies": { "@apollo/client": "3.7.10", @@ -60,5 +60,5 @@ "dependencies": { "uuid": "*" }, - "version": "0.8.1" + "version": "0.9.0" } diff --git a/tests/js/tests/agent-language.ts b/tests/js/tests/agent-language.ts index d9abb7371..28f9bad2a 100644 --- a/tests/js/tests/agent-language.ts +++ b/tests/js/tests/agent-language.ts @@ -7,7 +7,7 @@ export default function agentLanguageTests(testContext: TestContext) { it("works across remote agents", async () => { const alice = testContext.alice! const didAlice = (await alice.agent.status()).did! - const bob = testContext.bob! + const bob = testContext.bob! const didBob = (await bob.agent.status()).did! const aliceHerself = await alice.agent.me() @@ -22,6 +22,6 @@ export default function agentLanguageTests(testContext: TestContext) { const aliceSeenFromBob = await bob.agent.byDID(didAlice) expect(aliceSeenFromBob).not.to.be.undefined expect(aliceSeenFromBob).to.be.eql(aliceHerself) - }) + }) } } \ No newline at end of file diff --git a/tests/js/tests/app.test.ts b/tests/js/tests/app.test.ts index e4daa5fde..b58842cb4 100644 --- a/tests/js/tests/app.test.ts +++ b/tests/js/tests/app.test.ts @@ -91,7 +91,7 @@ describe("Apps integration tests", () => { const oldApps = await adminAd4mClient!.agent.getApps(); expect(oldApps.length).to.be.equal(1); - expect(oldApps[0].revoked).to.be.equal(null); + expect(oldApps[0].revoked).to.be.false; const newApps = await adminAd4mClient!.agent.revokeToken(requestId); diff --git a/tests/js/tests/authentication.test.ts b/tests/js/tests/authentication.test.ts index 09229d69f..e8aaea31b 100644 --- a/tests/js/tests/authentication.test.ts +++ b/tests/js/tests/authentication.test.ts @@ -7,6 +7,7 @@ import chaiAsPromised from "chai-as-promised"; import { apolloClient, sleep, startExecutor } from "../utils/utils"; import { ChildProcess } from 'node:child_process'; import fetch from 'node-fetch' +import { ExceptionInfo } from "@coasys/ad4m/lib/src/runtime/RuntimeResolver"; //@ts-ignore global.fetch = fetch @@ -253,5 +254,74 @@ describe("Authentication integration tests", () => { await expect(call()).to.be.rejectedWith("Capability is not matched"); }) + + it("user with revoked token can not query agent status", async () => { + let requestId = await unAuthenticatedAppAd4mClient!.agent.requestCapability({ + appName: "demo-app", + appDesc: "demo-desc", + appDomain: "test.ad4m.org", + appUrl: "https://demo-link", + capabilities: [ + { + with: { + domain:"agent", + pointers:["*"] + }, + can: ["READ"] + } + ] as CapabilityInput[] + } as AuthInfoInput) + let rand = await adminAd4mClient!.agent.permitCapability(`{"requestId":"${requestId}","auth":{"appName":"demo-app","appDesc":"demo-desc","appUrl":"demo-url","capabilities":[{"with":{"domain":"agent","pointers":["*"]},"can":["READ"]}]}}`) + let jwt = await adminAd4mClient!.agent.generateJwt(requestId, rand) + + // @ts-ignore + let authenticatedAppAd4mClient = new Ad4mClient(apolloClient(gqlPort, jwt), false) + expect((await authenticatedAppAd4mClient!.agent.status()).isUnlocked).to.be.true; + + let oldApps = await adminAd4mClient!.agent.getApps(); + let newApps = await adminAd4mClient!.agent.revokeToken(requestId); + // revoking token should not change the number of apps + expect(newApps.length).to.be.equal(oldApps.length); + newApps.forEach((app, i) => { + if(app.requestId === requestId) { + expect(app.revoked).to.be.true; + } + }) + + const call = async () => { + return await authenticatedAppAd4mClient!.agent.status() + } + + await expect(call()).to.be.rejectedWith("Unauthorized access"); + }) + + it("requesting a capability toke should trigger a CapabilityRequested exception", async () => { + let excpetions: ExceptionInfo[] = []; + adminAd4mClient!.runtime.addExceptionCallback((e) => { excpetions.push(e); return null; }) + adminAd4mClient!.runtime.subscribeExceptionOccurred(); + + let requestId = await unAuthenticatedAppAd4mClient!.agent.requestCapability({ + appName: "demo-app", + appDesc: "demo-desc", + appDomain: "test.ad4m.org", + appUrl: "https://demo-link", + capabilities: [ + { + with: { + domain:"agent", + pointers:["*"] + }, + can: ["READ"] + } + ] as CapabilityInput[] + } as AuthInfoInput) + + await sleep(1000); + + expect(excpetions.length).to.be.equal(1); + expect(excpetions[0].type).to.be.equal("CAPABILITY_REQUESTED"); + let auth_info = JSON.parse(excpetions[0].addon!); + expect(auth_info.requestId).to.be.equal(requestId); + }) }) }) diff --git a/tests/js/tests/direct-messages.ts b/tests/js/tests/direct-messages.ts index f7acf5dae..58d737e6a 100644 --- a/tests/js/tests/direct-messages.ts +++ b/tests/js/tests/direct-messages.ts @@ -10,7 +10,7 @@ export default function directMessageTests(testContext: TestContext) { link.author = "did:test"; link.timestamp = new Date().toISOString(); link.data = new Link({ - source: Literal.from("me").toUrl(), + source: Literal.from("me").toUrl(), predicate: Literal.from("thinks").toUrl(), target: Literal.from("nothing").toUrl() }); @@ -28,11 +28,11 @@ export default function directMessageTests(testContext: TestContext) { }catch(e) { hasThrown = true } - + expect(hasThrown).to.be.true; - }) + }) - describe.skip("with Alice and Bob being friends", () => { + describe("with Alice and Bob being friends", () => { //@ts-ignore let alice, bob, didAlice, didBob @@ -52,7 +52,7 @@ export default function directMessageTests(testContext: TestContext) { link.timestamp = new Date().toISOString(); link.data = new Link({ //@ts-ignore - source: didBob, + source: didBob, predicate: Literal.from("is").toUrl(), target: Literal.from("online").toUrl() }); @@ -60,7 +60,7 @@ export default function directMessageTests(testContext: TestContext) { const statusBob = new Perspective([link]) //@ts-ignore await bob.runtime.setStatus(statusBob) - await sleep(1000) + await sleep(1000) //@ts-ignore const statusAlice = await alice.runtime.friendStatus(didBob) expect(statusAlice).not.to.be.undefined; @@ -91,7 +91,7 @@ export default function directMessageTests(testContext: TestContext) { expect((await bob.runtime.messageInbox(didAlice)).length).to.be.equal(1) //@ts-ignore expect((await bob.runtime.messageInbox("did:test:other")).length).to.be.equal(0) - + }) it("Alice finds her sent message in the outbox", async () => { diff --git a/tests/js/tests/expression.ts b/tests/js/tests/expression.ts index 9680a29f4..4773efbfc 100644 --- a/tests/js/tests/expression.ts +++ b/tests/js/tests/expression.ts @@ -144,6 +144,8 @@ export default function expressionTests(testContext: TestContext) { const expr2 = JSON.parse(expr2Raw) console.log(expr2) + expr.proof.valid = true + expr.proof.invalid = false expect(expr2).to.be.eql(expr) }) }) diff --git a/tests/js/tests/integration.test.ts b/tests/js/tests/integration.test.ts index 8a5d09c97..b521b2314 100644 --- a/tests/js/tests/integration.test.ts +++ b/tests/js/tests/integration.test.ts @@ -167,7 +167,7 @@ describe("Integration tests", function () { await testContext.bob.agent.updatePublicPerspective(new Perspective([link])) - //await testContext.makeAllNodesKnown() + await testContext.makeAllNodesKnown() }) after(async () => { @@ -183,6 +183,6 @@ describe("Integration tests", function () { describe('Agent Language', agentLanguageTests(testContext)) describe('Language', languageTests(testContext)) describe('Neighbourhood', neighbourhoodTests(testContext)) - describe('Direct Messages', directMessageTests(testContext)) + //describe('Direct Messages', directMessageTests(testContext)) }) }) \ No newline at end of file diff --git a/tests/js/tests/neighbourhood.ts b/tests/js/tests/neighbourhood.ts index 83d3de3de..e9d4e17eb 100644 --- a/tests/js/tests/neighbourhood.ts +++ b/tests/js/tests/neighbourhood.ts @@ -29,7 +29,7 @@ export default function neighbourhoodTests(testContext: TestContext) { link.timestamp = new Date().toISOString(); link.data = new Link({source: "src", target: "target", predicate: "pred"}); link.proof = new ExpressionProof("sig", "key"); - const publishPerspective = await ad4mClient.neighbourhood.publishFromPerspective(create.uuid, socialContext.address, + const publishPerspective = await ad4mClient.neighbourhood.publishFromPerspective(create.uuid, socialContext.address, new Perspective( [link] ) @@ -53,18 +53,18 @@ export default function neighbourhoodTests(testContext: TestContext) { const socialContext = await alice.languages.applyTemplateAndPublish(DIFF_SYNC_OFFICIAL, JSON.stringify({uid: uuidv4(), name: "Alice's neighbourhood with Bob"})); expect(socialContext.name).to.be.equal("Alice's neighbourhood with Bob"); const neighbourhoodUrl = await alice.neighbourhood.publishFromPerspective(aliceP1.uuid, socialContext.address, new Perspective()) - + let bobP1 = await bob.neighbourhood.joinFromUrl(neighbourhoodUrl); - + await testContext.makeAllNodesKnown() - + expect(bobP1!.name).not.to.be.undefined; expect(bobP1!.sharedUrl).to.be.equal(neighbourhoodUrl) expect(bobP1!.neighbourhood).not.to.be.undefined;; expect(bobP1!.neighbourhood!.data.linkLanguage).to.be.equal(socialContext.address); expect(bobP1!.neighbourhood!.data.meta.links.length).to.be.equal(0); }) - + it('shared link created by Alice received by Bob', async () => { const alice = testContext.alice const bob = testContext.bob @@ -93,10 +93,13 @@ export default function neighbourhoodTests(testContext: TestContext) { bobLinks = await bob.perspective.queryLinks(bobP1!.uuid, new LinkQuery({source: 'root'})) tries++ } - + expect(bobLinks.length).to.be.equal(1) + expect(bobLinks[0].data.target).to.be.equal('test://test') + expect(bobLinks[0].proof.valid).to.be.true; }) + it('local link created by Alice NOT received by Bob', async () => { const alice = testContext.alice const bob = testContext.bob @@ -124,7 +127,7 @@ export default function neighbourhoodTests(testContext: TestContext) { bobLinks = await bob.perspective.queryLinks(bobP1!.uuid, new LinkQuery({source: 'root'})) tries++ } - + expect(bobLinks.length).to.be.equal(0) }) @@ -140,7 +143,7 @@ export default function neighbourhoodTests(testContext: TestContext) { const perspectives = await alice.perspective.all(); }) - + // it('can get the correct state change signals', async () => { // const aliceP1 = await testContext.alice.perspective.add("state-changes") // expect(aliceP1.state).to.be.equal(PerspectiveState.Private); @@ -218,7 +221,7 @@ export default function neighbourhoodTests(testContext: TestContext) { const bobP1Handle = await bob.neighbourhood.joinFromUrl(neighbourhoodUrl); const bobP1 = await bob.perspective.byUUID(bobP1Handle.uuid) await testContext.makeAllNodesKnown() - + aliceNH = aliceP1.getNeighbourhoodProxy() bobNH = bobP1!.getNeighbourhoodProxy() aliceDID = (await alice.agent.me()).did @@ -256,7 +259,7 @@ export default function neighbourhoodTests(testContext: TestContext) { expect(aliceOnline[0].did).to.be.equal(bobDID) console.log(aliceOnline[0].status); expect(aliceOnline[0].status.data.links).to.deep.equal(testPerspective.links) - + expect(bobOnline.length).to.be.equal(1) expect(bobOnline[0].did).to.be.equal(aliceDID) expect(bobOnline[0].status.data.links).to.deep.equal(testPerspective.links) @@ -264,7 +267,7 @@ export default function neighbourhoodTests(testContext: TestContext) { await aliceNH!.setOnlineStatusU(PerspectiveUnsignedInput.fromLink(new Link({ source: "test://source", - target: "test://target" + target: "test://target" }))) const bobOnline2 = await bobNH!.onlineAgents() @@ -277,7 +280,7 @@ export default function neighbourhoodTests(testContext: TestContext) { // TODO: Signature check for the whole perspective is broken // Got to fix that and add back this assertion //expect(bobOnline2[0].status.proof.valid).to.be.true - + }) it('they can send signals via `sendSignal` and receive callbacks via `addSignalHandler`', async () => { @@ -318,7 +321,7 @@ export default function neighbourhoodTests(testContext: TestContext) { //@ts-ignore expect(bobData.data.links).to.deep.equal(aliceSignal.links) - + let link2 = new Link({source: "bob", target: "alice", predicate: "signal"}); const bobSignal = new PerspectiveUnsignedInput([link2]) diff --git a/tests/js/tests/perspective.ts b/tests/js/tests/perspective.ts index 1eb6a3e6a..2dcfd4055 100644 --- a/tests/js/tests/perspective.ts +++ b/tests/js/tests/perspective.ts @@ -83,7 +83,7 @@ export default function perspectiveTests(testContext: TestContext) { const snapshot = await create.snapshot(); expect(snapshot.links.length).to.equal(0); }) - + it('can make mutations using perspective addLinks(), removeLinks() & linkMutations()', async () => { const ad4mClient = testContext.ad4mClient!; @@ -115,7 +115,7 @@ export default function perspectiveTests(testContext: TestContext) { expect(linksPostRemove.length).to.equal(0); const addTwoMore = await create.addLinks(links); - + const linkMutation = { additions: links, removals: addTwoMore @@ -149,14 +149,14 @@ export default function perspectiveTests(testContext: TestContext) { expect(queryLinksAll.length).to.equal(5); - // Get all the links in ascending order + // Get 3 of the links in descending order let queryLinksAsc = await ad4mClient!.perspective.queryLinks(create.uuid, new LinkQuery({source: "lang://test", fromDate: new Date(), untilDate: new Date("August 19, 1975 23:15:30"), limit: 3})); expect(queryLinksAsc.length).to.equal(3); - expect(queryLinksAsc[0].data.target).to.equal(addLink3.data.target) + expect(queryLinksAsc[0].data.target).to.equal(addLink5.data.target) expect(queryLinksAsc[1].data.target).to.equal(addLink4.data.target) - expect(queryLinksAsc[2].data.target).to.equal(addLink5.data.target) + expect(queryLinksAsc[2].data.target).to.equal(addLink3.data.target) - // Get all the links in ascending order + // Get 3 of the links in descending order let queryLinksDesc = await ad4mClient!.perspective.queryLinks(create.uuid, new LinkQuery({source: "lang://test", fromDate: new Date("August 19, 1975 23:15:30"), untilDate: new Date(), limit: 3})); expect(queryLinksDesc.length).to.equal(3); expect(queryLinksDesc[0].data.target).to.equal(addLink.data.target) @@ -174,7 +174,7 @@ export default function perspectiveTests(testContext: TestContext) { //Test can get only the first link let queryLinksFirst = await ad4mClient!.perspective.queryLinks(create.uuid, new LinkQuery({ - source: "lang://test", fromDate: new Date(addLink.timestamp), + source: "lang://test", fromDate: new Date(addLink.timestamp), untilDate: new Date(new Date(addLink2.timestamp).getTime() - 1) })); expect(queryLinksFirst.length).to.equal(1); @@ -211,7 +211,7 @@ export default function perspectiveTests(testContext: TestContext) { expect(perspectiveSnaphot!.links.length).to.equal(1); //Update the link to new link - const updateLink = await ad4mClient.perspective.updateLink(create.uuid, addLink, + const updateLink = await ad4mClient.perspective.updateLink(create.uuid, addLink, new Link({source: "lang://test2", target: "lang://test-target2", predicate: "lang://predicate2"})); expect(updateLink.data.target).to.equal("lang://test-target2"); expect(updateLink.data.source).to.equal("lang://test2"); @@ -246,12 +246,14 @@ export default function perspectiveTests(testContext: TestContext) { const name = "Subscription Test Perspective" const p = await ad4mClient.perspective.add(name) + await sleep(1000) expect(perspectiveAdded.calledOnce).to.be.true; const pSeenInAddCB = perspectiveAdded.getCall(0).args[0]; expect(pSeenInAddCB.uuid).to.equal(p.uuid) expect(pSeenInAddCB.name).to.equal(p.name) const p1 = await ad4mClient.perspective.update(p.uuid , "New Name") + await sleep(1000) expect(perspectiveUpdated.calledOnce).to.be.true; const pSeenInUpdateCB = perspectiveUpdated.getCall(0).args[0]; expect(pSeenInUpdateCB.uuid).to.equal(p1.uuid) @@ -266,16 +268,20 @@ export default function perspectiveTests(testContext: TestContext) { await ad4mClient.perspective.addPerspectiveLinkUpdatedListener(p1.uuid, [linkUpdated]) const linkExpression = await ad4mClient.perspective.addLink(p1.uuid , {source: 'root', target: 'lang://123'}) + await sleep(1000) expect(linkAdded.calledOnce).to.be.true; expect(linkAdded.getCall(0).args[0]).to.eql(linkExpression) const updatedLinkExpression = await ad4mClient.perspective.updateLink(p1.uuid , linkExpression, {source: 'root', target: 'lang://456'}) + await sleep(1000) expect(linkUpdated.calledOnce).to.be.true; expect(linkUpdated.getCall(0).args[0].newLink).to.eql(updatedLinkExpression) + const copiedUpdatedLinkExpression = {...updatedLinkExpression} + await ad4mClient.perspective.removeLink(p1.uuid , updatedLinkExpression) expect(linkRemoved.calledOnce).to.be.true; - expect(linkRemoved.getCall(0).args[0]).to.eql(updatedLinkExpression) + expect(linkRemoved.getCall(0).args[0]).to.eql(copiedUpdatedLinkExpression) }) it('can run Prolog queries', async () => { @@ -318,10 +324,10 @@ export default function perspectiveTests(testContext: TestContext) { it('can do link CRUD', async () => { const all = new LinkQuery({}) const testLink = new Link({ - source: 'test://source', - predicate: 'test://predicate', + source: 'test://source', + predicate: 'test://predicate', target: 'test://target' - }) + }) expect(await proxy.get(all)).to.eql([]) @@ -379,7 +385,7 @@ export default function perspectiveTests(testContext: TestContext) { expect(result2.target).to.equal(link2.target) expect(await proxy.getSingleTarget(new LinkQuery(link1))).to.equal('target2') }) - + }) } } \ No newline at end of file diff --git a/tests/js/tests/prolog-and-literals.test.ts b/tests/js/tests/prolog-and-literals.test.ts index cddfc04a0..31da7256a 100644 --- a/tests/js/tests/prolog-and-literals.test.ts +++ b/tests/js/tests/prolog-and-literals.test.ts @@ -2,8 +2,8 @@ import { expect } from "chai"; import { ChildProcess } from 'node:child_process'; import { Ad4mClient, Link, LinkQuery, Literal, PerspectiveProxy, SmartLiteral, SMART_LITERAL_CONTENT_PREDICATE, - instanceQuery, Subject, subjectProperty, - subjectCollection, subjectFlag, + InstanceQuery, Subject, SubjectProperty, + SubjectCollection, SubjectFlag, SDNAClass, SubjectEntity, } from "@coasys/ad4m"; @@ -263,18 +263,18 @@ describe("Prolog + Literals", () => { }) class Message { //@ts-ignore - @subjectFlag({ + @SubjectFlag({ through: "ad4m://type", value: "ad4m://message" }) type: string = "" //@ts-ignore - @instanceQuery() + @InstanceQuery() static async all(perspective: PerspectiveProxy): Promise { return [] } //@ts-ignore - @subjectProperty({ + @SubjectProperty({ through: "todo://state", initial: "todo://ready", writable: true, @@ -303,20 +303,20 @@ describe("Prolog + Literals", () => { // isSubjectInstance = [hasLink("todo://state")] //@ts-ignore - @instanceQuery() + @InstanceQuery() static async all(perspective: PerspectiveProxy): Promise { return [] } - @instanceQuery({where: {state: "todo://ready"}}) + @InstanceQuery({where: {state: "todo://ready"}}) static async allReady(perspective: PerspectiveProxy): Promise { return [] } - @instanceQuery({where: { state: "todo://done" }}) + @InstanceQuery({where: { state: "todo://done" }}) static async allDone(perspective: PerspectiveProxy): Promise { return [] } - @instanceQuery({condition: 'triple("ad4m://self", _, Instance)'}) + @InstanceQuery({condition: 'triple("ad4m://self", _, Instance)'}) static async allSelf(perspective: PerspectiveProxy): Promise { return [] } //@ts-ignore - @subjectProperty({ + @SubjectProperty({ through: "todo://state", initial:"todo://ready", writable: true, @@ -325,36 +325,36 @@ describe("Prolog + Literals", () => { state: string = "" //@ts-ignore - @subjectProperty({ + @SubjectProperty({ through: "todo://has_title", writable: true, resolveLanguage: "literal" }) title: string = "" - @subjectProperty({ + @SubjectProperty({ getter: `triple(Base, "flux://has_reaction", "flux://thumbsup"), Value = true` }) isLiked: boolean = false //@ts-ignore - @subjectCollection({ through: "todo://comment" }) + @SubjectCollection({ through: "todo://comment" }) // @ts-ignore comments: string[] = [] //@ts-ignore - @subjectCollection({ through: "flux://entry_type" }) + @SubjectCollection({ through: "flux://entry_type" }) entries: string[] = [] //@ts-ignore - @subjectCollection({ + @SubjectCollection({ through: "flux://entry_type", where: { isInstance: Message } }) messages: string[] = [] //@ts-ignore - @subjectCollection({ + @SubjectCollection({ through: "flux://entry_type", where: { condition: `triple(Target, "flux://has_reaction", "flux://thumbsup")` } }) @@ -401,7 +401,7 @@ describe("Prolog + Literals", () => { expect(todos.length).to.equal(3) }) - it("can retrieve all mathching instance through instanceQuery(where: ..)", async () => { + it("can retrieve all mathching instance through InstanceQuery(where: ..)", async () => { let todos = await Todo.allReady(perspective!) expect(todos.length).to.equal(1) expect(await todos[0].state).to.equal("todo://ready") @@ -411,7 +411,7 @@ describe("Prolog + Literals", () => { expect(await todos[0].state).to.equal("todo://done") }) - it("can retrieve matching instance through instanceQuery(condition: ..)", async () => { + it("can retrieve matching instance through InstanceQuery(condition: ..)", async () => { let todos = await Todo.allSelf(perspective!) expect(todos.length).to.equal(0) @@ -447,7 +447,7 @@ describe("Prolog + Literals", () => { name: "Test" }) class Test { - @subjectProperty({through: "test://test_numer"}) + @SubjectProperty({through: "test://test_numer"}) number: number = 0 } @@ -549,25 +549,32 @@ describe("Prolog + Literals", () => { }) class Recipe extends SubjectEntity { //@ts-ignore - @subjectFlag({ + @SubjectFlag({ through: "ad4m://type", value: "ad4m://recipe" }) type: string = "" //@ts-ignore - @subjectProperty({ + @SubjectProperty({ through: "recipe://name", writable: true, }) name: string = "" + // @ts-ignore + @SubjectProperty({ + through: "recipe://boolean", + writable: true, + }) + booleanTest: boolean = false + //@ts-ignore - @subjectCollection({ through: "recipe://entries" }) + @SubjectCollection({ through: "recipe://entries" }) entries: string[] = [] // @ts-ignore - @subjectCollection({ + @SubjectCollection({ through: "recipe://entries", where: { condition: `triple(Target, "recipe://has_ingredient", "recipe://test")` } }) @@ -575,12 +582,12 @@ describe("Prolog + Literals", () => { ingredients: []; //@ts-ignore - @subjectCollection({ through: "recipe://comment" }) + @SubjectCollection({ through: "recipe://comment" }) // @ts-ignore comments: string[] = [] //@ts-ignore - @subjectProperty({ + @SubjectProperty({ through: "recipe://local", writable: true, local: true @@ -599,6 +606,7 @@ describe("Prolog + Literals", () => { const recipe = new Recipe(perspective!, root) recipe.name = "recipe://test"; + recipe.booleanTest = false; await recipe.save(); @@ -607,6 +615,7 @@ describe("Prolog + Literals", () => { await recipe2.get(); expect(recipe2.name).to.equal("recipe://test") + expect(recipe2.booleanTest).to.equal(false) }) it("update()", async () => { diff --git a/tests/js/utils/utils.ts b/tests/js/utils/utils.ts index b78162d69..4d910346b 100644 --- a/tests/js/utils/utils.ts +++ b/tests/js/utils/utils.ts @@ -22,7 +22,7 @@ export async function isProcessRunning(processName: string): Promise { })() if (!cmd) throw new Error("Invalid OS"); - + return new Promise((resolve, reject) => { //@ts-ignore exec(cmd, (err: ExecException, stdout: string, stderr: string) => { @@ -30,11 +30,11 @@ export async function isProcessRunning(processName: string): Promise { resolve(stdout.toLowerCase().indexOf(processName.toLowerCase()) > -1) }) - }) + }) } export async function runHcLocalServices(): Promise<{proxyUrl: string | null, bootstrapUrl: string | null, process: ChildProcess}> { - const command = path.resolve(__dirname, '..', '..', '..','target', 'release', 'ad4m'); + const command = path.resolve(__dirname, '..', '..', '..','target', 'release', 'ad4m-executor'); let servicesProcess = exec(`${command} run-local-hc-services`); let proxyUrl: string | null = null; @@ -61,8 +61,8 @@ export async function runHcLocalServices(): Promise<{proxyUrl: string | null, bo return {proxyUrl, bootstrapUrl, process: servicesProcess}; } -export async function startExecutor(dataPath: string, - bootstrapSeedPath: string, +export async function startExecutor(dataPath: string, + bootstrapSeedPath: string, gqlPort: number, hcAdminPort: number, hcAppPort: number, @@ -71,22 +71,22 @@ export async function startExecutor(dataPath: string, proxyUrl: string = "wss://signal.holotest.net", bootstrapUrl: string = "https://bootstrap.holo.host", ): Promise { - const command = path.resolve(__dirname, '..', '..', '..','target', 'release', 'ad4m'); + const command = path.resolve(__dirname, '..', '..', '..','target', 'release', 'ad4m-executor'); console.log(bootstrapSeedPath); console.log(dataPath); let executorProcess = null as ChildProcess | null; rmSync(dataPath, { recursive: true, force: true }) execSync(`${command} init --data-path ${dataPath} --network-bootstrap-seed ${bootstrapSeedPath}`, {cwd: process.cwd()}) - + console.log("Starting executor") console.log("USING LOCAL BOOTSTRAP & PROXY URL: ", bootstrapUrl, proxyUrl); - + if (!adminCredential) { - executorProcess = exec(`${command} run --app-data-path ${dataPath} --gql-port ${gqlPort} --hc-admin-port ${hcAdminPort} --hc-app-port ${hcAppPort} --hc-proxy-url ${proxyUrl} --hc-bootstrap-url ${bootstrapUrl} --hc-use-bootstrap false --hc-use-proxy true --hc-use-local-proxy true --hc-use-mdns true --language-language-only ${languageLanguageOnly} --run-dapp-server false`, {}) + executorProcess = exec(`${command} run --app-data-path ${dataPath} --gql-port ${gqlPort} --hc-admin-port ${hcAdminPort} --hc-app-port ${hcAppPort} --hc-proxy-url ${proxyUrl} --hc-bootstrap-url ${bootstrapUrl} --hc-use-bootstrap true --hc-use-proxy true --hc-use-local-proxy true --hc-use-mdns true --language-language-only ${languageLanguageOnly} --run-dapp-server false`, {}) } else { - executorProcess = exec(`${command} run --app-data-path ${dataPath} --gql-port ${gqlPort} --hc-admin-port ${hcAdminPort} --hc-app-port ${hcAppPort} --hc-proxy-url ${proxyUrl} --hc-bootstrap-url ${bootstrapUrl} --hc-use-bootstrap false --hc-use-proxy true --hc-use-local-proxy true --hc-use-mdns true --language-language-only ${languageLanguageOnly} --admin-credential ${adminCredential} --run-dapp-server false`, {}) + executorProcess = exec(`${command} run --app-data-path ${dataPath} --gql-port ${gqlPort} --hc-admin-port ${hcAdminPort} --hc-app-port ${hcAppPort} --hc-proxy-url ${proxyUrl} --hc-bootstrap-url ${bootstrapUrl} --hc-use-bootstrap true --hc-use-proxy true --hc-use-local-proxy true --hc-use-mdns true --language-language-only ${languageLanguageOnly} --admin-credential ${adminCredential} --run-dapp-server false`, {}) } let executorReady = new Promise((resolve, reject) => { executorProcess!.stdout!.on('data', (data) => { @@ -98,7 +98,7 @@ export async function startExecutor(dataPath: string, if (data.includes(`listening on http://127.0.0.1:${gqlPort}`)) { resolve() } - }); + }); }) executorProcess!.stdout!.on('data', (data) => { @@ -109,7 +109,7 @@ export async function startExecutor(dataPath: string, }); console.log("Waiting for executor to settle...") - await executorReady + await executorReady return executorProcess; } @@ -149,7 +149,7 @@ export function apolloClient(port: number, token?: string): ApolloClient { } }, }); - + return client; } diff --git a/turbo.json b/turbo.json index 7e5499e86..acae71ce2 100644 --- a/turbo.json +++ b/turbo.json @@ -6,12 +6,16 @@ "outputs": ["dist/**", "lib/**", "build/**"] }, "build-libs": { - "dependsOn": ["@coasys/ad4m#build", "@coasys/ad4m-connect#build", "@coasys/ad4m-executor#build", "@coasys/ad4m-cli#build", "@coasys/dapp#build"], + "dependsOn": ["@coasys/dapp#build", "@coasys/ad4m#build", "@coasys/ad4m-connect#build", "@coasys/ad4m-executor#build", "@coasys/ad4m-cli#build"], + "outputs": ["dist/**", "lib/**", "build/**"] + }, + "build-core-executor": { + "dependsOn": ["@coasys/ad4m#build", "@coasys/ad4m-executor#build", "@coasys/dapp#build"], "outputs": ["dist/**", "lib/**", "build/**"] }, "build-languages": { - "dependsOn": ["@coasys/perspective-diff-sync#build", "@coasys/agent-language#build", - "@coasys/direct-message-language#build", "@coasys/perspective-language#build", + "dependsOn": ["@coasys/perspective-diff-sync#build", "@coasys/agent-language#build", + "@coasys/direct-message-language#build", "@coasys/perspective-language#build", "@coasys/language-language#build", "@coasys/neighbourhood-language#build", "@coasys/file-storage#build", "@coasys/perspective-diff-sync-socket-signaling#build", "@coasys/centralized-perspective-diff-sync#build", "@coasys/centralized-agent-language#build", @@ -24,6 +28,16 @@ "outputs": ["dist/**", "lib/**", "build/**"] }, + "rust-ad4m-executor#build": { + "dependsOn": ["@coasys/dapp#build"], + "outputs": ["dist/**", "lib/**", "build/**"] + }, + + "ad4m-cli#build": { + "dependsOn": ["@coasys/dapp#build"], + "outputs": ["dist/**", "lib/**", "build/**"] + }, + "ad4m-launcher#package-ad4m": { "dependsOn": ["build-libs"], "outputs": ["dist/**"] diff --git a/ui/package.json b/ui/package.json index a1516e2f7..b9500de2f 100644 --- a/ui/package.json +++ b/ui/package.json @@ -4,10 +4,10 @@ "type": "module", "dependencies": { "@apollo/client": "3.7.10", - "@junto-foundation/junto-elements": "^0.5.5", "@coasys/ad4m": "link:../core", + "@junto-foundation/junto-elements": "^0.5.5", "@preact/preset-vite": "^2.4.0", - "@tauri-apps/api": "^1.4.0", + "@tauri-apps/api": "^1.5.3", "apollo-boost": "^0.4.9", "graphql": "15.7.2", "graphql-ws": "5.12.0", @@ -53,7 +53,7 @@ }, "devDependencies": { "@prefresh/vite": "^2.2.9", - "@tauri-apps/cli": "1.4.0", + "@tauri-apps/cli": "1.5.11", "@testing-library/jest-dom": "^5.16.2", "@testing-library/react": "^12.1.4", "@testing-library/user-event": "^13.5.0", @@ -65,11 +65,11 @@ "customize-cra": "1.0.0", "react-app-rewired": "^2.2.1", "react-error-overlay": "6.0.9", - "vite": "^4.0.1", - "run-script-os": "^1.1.6" + "run-script-os": "^1.1.6", + "vite": "^4.0.1" }, "resolutions": { "react-error-overlay": "6.0.9" }, - "version": "0.8.1" + "version": "0.9.0" } diff --git a/ui/public/tray.html b/ui/public/tray.html new file mode 100644 index 000000000..68182e188 --- /dev/null +++ b/ui/public/tray.html @@ -0,0 +1,67 @@ + + + + + + + + +
+
+

+ ADAM launcher is minimized, click on the tray icon to open it. +

+

+ This popup will automatically close in 5 seconds. +

+
+
+ + + + + \ No newline at end of file diff --git a/ui/src-tauri/Cargo.toml b/ui/src-tauri/Cargo.toml index 7b1d912e8..4540ef9ad 100644 --- a/ui/src-tauri/Cargo.toml +++ b/ui/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ad4m-launcher" -version = "0.8.1" +version = "0.9.0" description = "Administration of ad4m services" authors = ["Kaichao Sun"] license = "" @@ -13,7 +13,7 @@ publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [build-dependencies] -tauri-build = { version = "1.0.4", features = [] } +tauri-build = { version = "1.5.1", features = [] } [dependencies] serde_json = "1.0" @@ -27,15 +27,15 @@ directories = "4.0.1" opener = "0.5.0" open = "2.0.1" sysinfo = "0.29.7" -tauri = { version = "1.4.1", features = [ "updater", "api-all", "system-tray"] } +tauri = { version = "1.6.1", features = [ "updater", "api-all", "system-tray"] } uuid = { version = "0.8", features = ["v4"] } localtunnel-client = "0.0.12" tokio = { version = "1.19.2", features = ["full"] } tauri-plugin-positioner = { version = "1.0", features = ["system-tray"] } remove_dir_all = "0.7.0" -reqwest = { version = "0.11.17", features = ["json", "native-tls"] } +reqwest = { version = "0.11.20", features = ["json", "native-tls"] } ad4m-client = { path = "../../rust-client" } -rust-executor = { path = "../../rust-executor" } +ad4m-executor = { path = "../../rust-executor" } chrono = "0.4" env_logger = "0.10.0" colored = "2.0" diff --git a/ui/src-tauri/src/app_state.rs b/ui/src-tauri/src/app_state.rs new file mode 100644 index 000000000..8db40a23e --- /dev/null +++ b/ui/src-tauri/src/app_state.rs @@ -0,0 +1,72 @@ +use std::fs::{File, OpenOptions}; +use std::io::prelude::*; +use std::path::PathBuf; +use serde::{Serialize, Deserialize}; +use tauri::api::path::home_dir; + +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct AgentList { + pub name: String, + pub path: PathBuf, + pub bootstrap: Option, +} + +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct LauncherState { + pub agent_list: Vec, + pub selected_agent: Option, +} + +impl LauncherState { + pub fn save(&mut self) -> std::io::Result<()> { + let path = home_dir().expect("Could not get home dir").join("ad4m-state.json"); + let mut file = File::create(&path)?; + let data = serde_json::to_string(&self).unwrap(); + file.write_all(data.as_bytes())?; + Ok(()) + } + + pub fn load() -> std::io::Result { + let path = home_dir().expect("Could not get home dir").join("ad4m-state.json"); + let mut file = OpenOptions::new().read(true).write(true).create(true).open(&path)?; + let mut data = String::new(); + file.read_to_string(&mut data)?; + + let state = match serde_json::from_str(&data) { + Ok(state) => state, + Err(_) => { + let agent = AgentList { + name: "Main Net".to_string(), + path: PathBuf::from(home_dir().expect("Could not get home dir")).join(".ad4m".to_string()), + bootstrap: None + }; + + LauncherState { + agent_list: vec![{ + agent.clone() + }], + selected_agent: Some(agent) + } + } + }; + + Ok(state) + } + + pub fn add_agent(&mut self, agent: AgentList) { + if !self.is_agent_taken(&agent.name, &agent.path) { + self.agent_list.push(agent); + } + } + + pub fn remove_agent(&mut self, agent: AgentList) { + self.agent_list.retain(|a| a.name != agent.name && &a.path != &agent.path); + } + + pub fn is_agent_taken(&self, new_name: &str, new_path: &PathBuf) -> bool { + self.agent_list.iter().any(|agent| agent.name == new_name && (&agent.path == new_path)) + } +} + + + diff --git a/ui/src-tauri/src/commands/app.rs b/ui/src-tauri/src/commands/app.rs index 9065f2d74..5842d39a4 100644 --- a/ui/src-tauri/src/commands/app.rs +++ b/ui/src-tauri/src/commands/app.rs @@ -1,11 +1,11 @@ extern crate remove_dir_all; -use std::time::{Duration, SystemTime}; - -use crate::Payload; +use crate::app_state::{AgentList, LauncherState}; +use crate::util::create_tray_message_windows; use crate::{config::data_path, get_main_window}; use remove_dir_all::*; +use tauri::api::path::home_dir; use tauri::{LogicalSize, Manager}; use tauri::Size; use tauri_plugin_positioner::{Position, WindowExt}; @@ -41,28 +41,66 @@ pub fn open_tray(app_handle: tauri::AppHandle) { } #[tauri::command] -pub fn open_tray_message(app_handle: tauri::AppHandle) { - let tray_window = app_handle.get_window("TrayMessage").unwrap(); - let _ = tray_window.show(); +pub fn add_app_agent_state(agent: AgentList) { + let mut state = LauncherState::load().unwrap(); + + let mut new_agent = agent.clone(); - let _ = tray_window.emit("tray_message_open", Payload {message: "".to_string()}); + new_agent.path = home_dir().unwrap().join(agent.path); - let seconds = Duration::from_secs(5); + state.add_agent(new_agent); + + state.save().unwrap(); +} + +#[tauri::command] +pub fn remove_app_agent_state(agent: AgentList) { + let mut state = LauncherState::load().unwrap(); - let start = SystemTime::now(); - loop { - std::thread::sleep(Duration::new(5, 0)); + state.remove_agent(agent.clone()); + + state.save().unwrap(); +} + +#[tauri::command] +pub fn set_selected_agent(agent: AgentList) { + let mut state = LauncherState::load().unwrap(); + + state.selected_agent = Some(agent); + + state.save().unwrap(); +} - match start.elapsed() { - Ok(elapsed) if elapsed > seconds => { +#[tauri::command] +pub fn get_app_agent_list() -> Option { + let state = LauncherState::load().unwrap(); + + serde_json::to_string(&state).ok() +} + +#[tauri::command] +#[cfg(feature = "custom-protocol")] +pub fn open_tray_message(app_handle: tauri::AppHandle) { + match app_handle.get_window("TrayMessage") { + Some(tray_window) => { + if let Ok(true) = tray_window.is_visible() { let _ = tray_window.hide(); - return; + } else { + let _ = tray_window.show(); } - _ => (), + }, + None => { + create_tray_message_windows(&app_handle); } } } +#[tauri::command] +#[cfg(not(feature = "custom-protocol"))] +pub fn open_tray_message(app_handle: tauri::AppHandle) { + println!("In debug mode won't open tray message"); +} + #[tauri::command] pub fn clear_state(app_handle: tauri::AppHandle) { let _ = remove_dir_all(data_path()); diff --git a/ui/src-tauri/src/commands/proxy.rs b/ui/src-tauri/src/commands/proxy.rs index fe0dc4c29..fe9706a53 100644 --- a/ui/src-tauri/src/commands/proxy.rs +++ b/ui/src-tauri/src/commands/proxy.rs @@ -5,7 +5,7 @@ use ad4m_client::Ad4mClient; use crate::{AppState, ProxyState, ProxyService}; -const PROXY_SERVER: &str = "https://proxy-worker.ad4m.dev"; +const PROXY_SERVER: &str = "http://140.82.10.81:3030"; const AD4M_SERVER: &str = "http://127.0.0.1"; #[tauri::command] @@ -59,7 +59,7 @@ pub async fn login_proxy(subdomain: String, app_state: State<'_, AppState>, prox endpoint: None, shutdown_signal: None, }; - + Ok(()) } @@ -121,7 +121,5 @@ pub fn stop_proxy(proxy: State<'_, ProxyState>) { } fn format_subdomain(subdomain: &str) -> String { - let subdomain = subdomain.replace("did:key:", "").to_lowercase(); - let max_len = std::cmp::min(32, subdomain.len()); - subdomain[0..max_len].to_string() + subdomain.replace("did:key:", "") } diff --git a/ui/src-tauri/src/config.rs b/ui/src-tauri/src/config.rs index fbe3ffd83..df1c18ea1 100644 --- a/ui/src-tauri/src/config.rs +++ b/ui/src-tauri/src/config.rs @@ -6,10 +6,18 @@ pub fn data_path() -> PathBuf { home_dir().expect("Could not get home dir").join(".ad4m") } +pub fn data_dev_path() -> PathBuf { + home_dir().expect("Could not get home dir").join(".ad4m-dev") +} + pub fn log_path() -> PathBuf { data_path().join("ad4m.log") } +pub fn log_dev_path() -> PathBuf { + data_path().join("ad4m.log") +} + #[cfg(feature = "custom-protocol")] pub fn app_url() -> String { "index.html".to_string() @@ -22,7 +30,7 @@ pub fn app_url() -> String { #[cfg(feature = "custom-protocol")] pub fn app_tray_message_url() -> String { - "index.html/tray_message".to_string() + "tray.html".to_string() } #[cfg(not(feature = "custom-protocol"))] diff --git a/ui/src-tauri/src/main.rs b/ui/src-tauri/src/main.rs index de25135ca..4313b59b0 100644 --- a/ui/src-tauri/src/main.rs +++ b/ui/src-tauri/src/main.rs @@ -43,14 +43,15 @@ mod util; mod system_tray; mod menu; mod commands; +mod app_state; use tauri::Manager; +use crate::app_state::LauncherState; use crate::commands::proxy::{get_proxy, login_proxy, setup_proxy, stop_proxy}; use crate::commands::state::{get_port, request_credential}; -use crate::commands::app::{close_application, close_main_window, clear_state, open_tray, open_tray_message, open_dapp}; -use crate::config::data_path; +use crate::commands::app::{add_app_agent_state, get_app_agent_list, remove_app_agent_state, set_selected_agent, close_application, close_main_window, clear_state, open_tray, open_tray_message, open_dapp}; +use crate::config::{data_dev_path, data_path}; use crate::config::log_path; -use crate::util::create_tray_message_windows; use crate::util::find_port; use crate::menu::{handle_menu_event, open_logs_folder}; use crate::util::{create_main_window, save_executor_port}; @@ -86,7 +87,7 @@ fn rlim_execute() { } } let rlim_max = 1000 as u64; - + println!("Current RLIMIT_NOFILE: current: {}, max: {}", rlim.rlim_cur, rlim_max); // Attempt to increase the limit @@ -110,17 +111,23 @@ fn rlim_execute() { fn main() { env::set_var("RUST_LOG", "holochain=warn,wasmer_compiler_cranelift=warn,rust_executor=info,warp::server"); + let state = LauncherState::load().unwrap(); + + let selected_agent = state.selected_agent.clone().unwrap(); + let app_path = selected_agent.path; + let bootstrap_path = selected_agent.bootstrap; + #[cfg(not(target_os = "windows"))] rlim_execute(); - if !data_path().exists() { - let _ = fs::create_dir_all(data_path()); + if !app_path.exists() { + let _ = fs::create_dir_all(app_path.clone()); } if log_path().exists() { let _ = fs::remove_file(log_path()); } - + let target = Box::new(File::create(log_path()).expect("Can't create file")); env_logger::Builder::new() @@ -148,19 +155,19 @@ fn main() { ) }) .init(); - + let format = format::debug_fn(move |writer, _field, value| { debug!("TRACE: {:?}", value); write!(writer, "{:?}", value) }); - + let filter = EnvFilter::from_default_env(); let subscriber = tracing_subscriber::fmt() .with_env_filter(filter) .fmt_fields(format) .finish(); - + tracing::subscriber::set_global_default(subscriber) .expect("Failed to set tracing subscriber"); @@ -171,8 +178,8 @@ fn main() { save_executor_port(free_port); match rust_executor::init::init( - Some(String::from(data_path().to_str().unwrap())), - None + Some(String::from(app_path.to_str().unwrap())), + bootstrap_path.and_then(|path| path.to_str().map(|s| s.to_string())), ) { Ok(()) => { println!("Ad4m initialized sucessfully"); @@ -209,7 +216,11 @@ fn main() { clear_state, open_tray, open_tray_message, - open_dapp + open_dapp, + add_app_agent_state, + get_app_agent_list, + set_selected_agent, + remove_app_agent_state ]) .setup(move |app| { // Hides the dock icon @@ -226,7 +237,7 @@ fn main() { let mut config = Ad4mConfig::default(); config.admin_credential = Some(req_credential.to_string()); - config.app_data_path = Some(String::from(data_path().to_str().unwrap())); + config.app_data_path = Some(String::from(app_path.to_str().unwrap())); config.gql_port = Some(free_port); config.network_bootstrap_seed = None; config.run_dapp_server = Some(true); @@ -237,22 +248,12 @@ fn main() { let handle = app.handle(); async fn spawn_executor(config: Ad4mConfig, splashscreen_clone: Window, handle: &AppHandle) { - let my_closure = || { - let url = app_url(); - info!("Executor clone on: {:?}", url); - let _ = splashscreen_clone.hide(); - create_tray_message_windows(&handle); - let main = get_main_window(&handle); - main.emit("ready", Payload { message: "ad4m-executor is ready".into() }).unwrap(); - }; - - match rust_executor::run_with_tokio(config.clone()).await { - () => { - my_closure(); - - info!("GraphQL server stopped.") - } - } + rust_executor::run(config.clone()).await; + let url = app_url(); + info!("Executor clone on: {:?}", url); + let _ = splashscreen_clone.hide(); + let main = get_main_window(&handle); + main.emit("ready", Payload { message: "ad4m-executor is ready".into() }).unwrap(); } tauri::async_runtime::spawn(async move { diff --git a/ui/src-tauri/src/util.rs b/ui/src-tauri/src/util.rs index 5c2cd2a39..b074a5c6b 100644 --- a/ui/src-tauri/src/util.rs +++ b/ui/src-tauri/src/util.rs @@ -24,7 +24,7 @@ pub fn find_port(start_port: u16, end_port: u16) -> u16 { ); } -pub fn has_processes_running(name: &str) -> usize { +pub fn _has_processes_running(name: &str) -> usize { let processes = System::new_all(); let processes_by_name: Vec<&Process> = processes.processes_by_exact_name(name).collect(); processes_by_name.len() @@ -37,12 +37,12 @@ pub fn create_main_window(app: &AppHandle) { .center() .focused(true) .inner_size(1000.0, 700.0) - .title("AD4M"); + .title("ADAM Launcher"); let _ = new_ad4m_window.build(); let tray_window = app.get_window("AD4M").unwrap(); - let _ = tray_window.set_decorations(false); + let _ = tray_window.set_decorations(true); let _ = tray_window.set_always_on_top(true); //let _ = tray_window.move_window(Position::TrayCenter); @@ -78,10 +78,10 @@ pub fn create_tray_message_windows(app: &AppHandle) { let new_ad4m_window = WindowBuilder::new(app, "TrayMessage", WindowUrl::App(url.into())) .center() - .focused(false) - .inner_size(300.0, 80.0) + .focused(true) + .inner_size(360.0, 120.0) .title("TrayMessage") - .visible(false); + .visible(true); let _ = new_ad4m_window.build(); diff --git a/ui/src-tauri/tauri.conf.json b/ui/src-tauri/tauri.conf.json index ee2f07ed6..3fec8d232 100644 --- a/ui/src-tauri/tauri.conf.json +++ b/ui/src-tauri/tauri.conf.json @@ -1,13 +1,14 @@ { "package": { "productName": "ADAM Launcher", - "version": "0.8.1" + "version": "0.9.0" }, "build": { "distDir": "../dist", "devPath": "http://127.0.0.1:3000", "beforeDevCommand": "", - "beforeBuildCommand": "" + "beforeBuildCommand": "", + "withGlobalTauri": true }, "tauri": { "systemTray": { @@ -80,7 +81,7 @@ "center": true, "focus": true, "visible": true, - "decorations": false, + "decorations": true, "url": "/splashscreen" } ], diff --git a/ui/src/components/Login.tsx b/ui/src/components/Login.tsx index fb324d4f9..f3b76da01 100644 --- a/ui/src/components/Login.tsx +++ b/ui/src/components/Login.tsx @@ -8,7 +8,7 @@ import { invoke } from "@tauri-apps/api"; const Login = (props: any) => { const { state: { loading, hasLoginError }, - methods: { generateAgent, unlockAgent }, + methods: { generateAgent, unlockAgent, mutateAgent }, } = useContext(AgentContext); const { @@ -38,17 +38,16 @@ const Login = (props: any) => { const clearAgent = async () => { let agentStatus = await client?.agent.status(); - + if (!agentStatus?.isUnlocked) { await invoke("clear_state"); } }; const generate = () => { - checkUsernamePassword(); - - if (username.length > 0 && password.length > 0) { - generateAgent(username, firstName, lastName, password); + checkPassword(); + if (password.length > 0) { + generateAgent(password); } }; @@ -67,7 +66,11 @@ const Login = (props: any) => { event: React.KeyboardEvent ) => { if (event.key === "Enter") { - gotoNextSignUpStep(); + checkPassword(); + if (password.length > 0) { + generate(); + setCurrentIndex(3); + } } }; @@ -79,13 +82,7 @@ const Login = (props: any) => { } }; - const checkUsernamePassword = () => { - if (username.length === 0) { - setUsernameError("Username is requied"); - } else { - setUsernameError(null); - } - + const checkPassword = () => { if (password.length === 0) { setPasswordError("Password is requied"); } else { @@ -93,21 +90,13 @@ const Login = (props: any) => { } }; - const gotoNextSignUpStep = () => { - checkUsernamePassword(); - - if (username.length > 0 && password.length > 0) { - setCurrentSignupIndex(1); - } - }; - useEffect(() => { if (!connected && !connectedLaoding) { navigate("/connect"); } else if (connected && isUnlocked) { navigate("/apps"); } else if (isInitialized) { - setCurrentIndex(5); + setCurrentIndex(6); } }, [connected, isUnlocked, navigate, isInitialized, connectedLaoding]); @@ -158,9 +147,11 @@ const Login = (props: any) => {
Privacy and Security - AD4M generates keys on your device, so only you have access to - your account and data. No third parties can snoop on your data - without your consent. + ADAM generates keys on your device, so only you have access to + your account and data. +

+ We will ask for a password used to encrypt your local keys. + Don't forget it! There is no way to recover it.

@@ -183,9 +174,12 @@ const Login = (props: any) => { )} + + {currentIndex === 2 && ( +
-
+
{ }} gradient > - -
- Agent centric - - With AD4M you own your data and decide what apps get to use it. - No more app silos with you as the central authority. Censorship - free. - -
- - - setCurrentIndex(1)} + + setPassword(e.target.value)} + onKeyDown={onSignupStepOneKeyDown} > - Previous - + setShowPassword(!showPassword)} + slot="end" + variant="link" + square + > + + + setCurrentIndex(3)} + style={{ alignSelf: "center" }} + onClick={() => {setCurrentIndex(3); generate();}} + loading={loading} + disabled={password.length == 0} > - Next + Generate Agent
- )} + )} + {currentIndex === 3 && (
@@ -240,110 +247,55 @@ const Login = (props: any) => {
Censorship free - AD4M allows you to express yourself without fear of censorship - or suppression. You can share your thoughts and opinions without - worrying about being silenced by a central authority. + ADAM allows you to express yourself without fear of censorship + or suppression. You can share your thoughts and opinions + without depending on a central authority or a particular app. +

+ That includes and starts with your personal profile. + In the next step you can add optional information about yourself + that ADAM will make available publicly to other users through any ADAM app.

setCurrentIndex(2)} + full + variant="primary" + onClick={() => setCurrentIndex(4)} > - Previous + Next - {!isInitialized ? ( - setCurrentIndex(4)} - > - Create account - - ) : ( - { - setCurrentIndex(5); - }} - > - Sign in - - )}
)} + + {currentIndex === 4 && (
- {currentSignupIndex === 0 && ( - - setUsername(e.target.value)} - > - setPassword(e.target.value)} - onKeyDown={onSignupStepOneKeyDown} - > - setShowPassword(!showPassword)} - slot="end" - variant="link" - square - > - - - - gotoNextSignUpStep()} - loading={loading} - > - Next - - - )} - {currentSignupIndex === 1 && ( + style={{ + width: "80px", + height: "80px", + margin: "0 auto", + marginBottom: "var(--j-space-500)", + }} + gradient + > + setUsername(e.target.value)} + > { maxlength={30} autovalidate type="text" - onKeyDown={onSignupStepTwoKeyDown} onInput={(e: any) => setFirstName(e.target.value)} > { maxlength={30} autovalidate type="text" - onKeyDown={onSignupStepTwoKeyDown} onInput={(e: any) => setLastName(e.target.value)} > { size="lg" variant="primary" style={{ alignSelf: "center" }} - onClick={() => generate()} - loading={loading} + onClick={() => setCurrentIndex(5) } > - Generate Agent + Initialize public profile - )} +
-
+ )} + + {currentIndex === 5 && ( +
+
+ + +
+ Agent centric + + With ADAM you own your data and decide what apps get to use it. + No more app silos with you as the central authority. +

+ Once agent generation is done, ADAM will run on your device, in the background. + Open an ADAM app, like Flux, and connect it to your ADAM agent. +

+ To interact with ADAM, click the ADAM icon in your system tray (next to the clock). + +

+ { mutateAgent(username, firstName, lastName) } } + loading={loading} + > + Finish ADAM setup + +
+
+ )} + + {currentIndex === 6 && (
{ > Reset agent - - - { - setHolochain(e.target.checked); - }} - > - {`Enable Holochain`} - - - - This ADAM release includes a new unstable Holochain release for testing. - - - Regular use of ADAM will work without Holochain using our centralized testing Languages. - - - - { methods: { toggleExpertMode }, } = useContext(Ad4minContext); + const [appState, setAppState] = useState({} as any); + const [trustedAgents, setTrustedAgents] = useState([]); const [trustedAgentModalOpen, settrustedAgentModalOpen] = useState(false); const [clearAgentModalOpen, setClearAgentModalOpen] = useState(false); + const [showAgentSelection, setShowAgentSelection] = useState(false); + const [createAgent, setCreateAgent] = useState(false); + const [newAgentName, setNewAgentName] = useState(""); + const [file, setFile] = useState(null); const [proxy, setProxy] = useState(""); const [qrcodeModal, setQRCodeModal] = useState(false); + const [copied, setCopied] = useState(false); + const [password, setPassword] = useState(""); const [showPassword, setShowPassword] = useState(false); const [loadingProxy, setLoadingProxy] = useState(false); + const [showAddHcAgentInfos, setShowAddHcAgentInfos] = useState(false); + + const [addHcAgentInfos, setAddHcAgentInfos] = useState(""); + function openLogs() { appWindow.emit("copyLogs"); } @@ -89,6 +102,11 @@ const Profile = (props: Props) => { setPassword(value); }; + const getAppState = useCallback(async () => { + const state = await invoke("get_app_agent_list"); + setAppState(JSON.parse(state)) + }, []); + const getTrustedAgents = useCallback(async () => { if (url) { const client = await buildAd4mClient(url, false); @@ -123,10 +141,31 @@ const Profile = (props: Props) => { } }, [url]); + const getAgentInfo = async () => { + const info = await client?.runtime.hcAgentInfos(); + + console.log("info", info); + + await writeText(info); + + setCopied(true); + + setTimeout(() => { + setCopied(false); + closeSecretCodeModal(); + }, 3000); + } + + const addAgentInfo = async (info: string) => { + await client?.runtime.hcAddAgentInfos(info); + setShowAddHcAgentInfos(false); + } + useEffect(() => { fetchCurrentAgentProfile(); getTrustedAgents(); - }, [fetchCurrentAgentProfile, getTrustedAgents]); + getAppState(); + }, [fetchCurrentAgentProfile, getTrustedAgents, getAppState]); useEffect(() => { const getProxy = async () => { @@ -195,6 +234,19 @@ const Profile = (props: Props) => { } }; + const creatAgentFunc = async () => { + await invoke("add_app_agent_state", { + agent: { + name: newAgentName, + path: `.${newAgentName.toLowerCase()}`, + bootstrap: file, + } + }); + + setCreateAgent(false); + getAppState(); + } + return (
@@ -253,6 +305,36 @@ const Profile = (props: Props) => { + {expertMode && ( +
+ + { + getAgentInfo() + }} + full + variant="secondary" + > + + Copy Holochain Agent Info(s) + + + + + { + setShowAddHcAgentInfos(true) + }} + full + variant="secondary" + > + + Add Holochain Agent Info(s) + + +
+ )} + @@ -260,6 +342,13 @@ const Profile = (props: Props) => { + + setShowAgentSelection(true)} full variant="secondary"> + + Select agent + + + setClearAgentModalOpen(true)} @@ -271,6 +360,37 @@ const Profile = (props: Props) => { + {showAddHcAgentInfos && ( + setAddHcAgentInfos(e.target.open)} + > + + + + Add Holochain Agents Info + + + + setAddHcAgentInfos(e.target.value)} + > + + addAgentInfo(addHcAgentInfos)} + full + loading={loading}> + Add Agent Info + + + + + )} + {trustedAgentModalOpen && ( { )} + {showAgentSelection && ( + setShowAgentSelection(e.target.open)} + > + + + + Select agent + + + + Disclaimer: After changing the agent you will have to restart the launcher + for it to start using the new agent + + + { + appState.agent_list.map((agent: any) => ( + <> + { + invoke("set_selected_agent", { agent }); + getAppState(); + setShowAgentSelection(false); + }} + > + {agent.name} + + + + )) + } + setCreateAgent(true)}> + + Add new agent + + + + )} + + { + createAgent && ( + setCreateAgent(e.target.open)} + > + + + + Create new agent + + + setNewAgentName(e.target.value)} + required> + + setFile(e.target.value)} + required + > + + + Create Agent + + + + ) + } + {clearAgentModalOpen && ( { - appWindow.listen('tray_message_open', () => { - let i = 5; - const interval = setInterval(() => { + let i = 5; + const interval = setInterval(async () => { if (count === 0) { + appWindow.close() clearInterval(interval) - } else { + } else if (i > 0){ i -= 1; setCount(i) } - }, 1000) - }) }, []) return ( diff --git a/ui/src/context/AgentContext.tsx b/ui/src/context/AgentContext.tsx index e42d82e77..8b2aea035 100644 --- a/ui/src/context/AgentContext.tsx +++ b/ui/src/context/AgentContext.tsx @@ -15,7 +15,8 @@ type ContextProps = { methods: { unlockAgent: (str: string, holochain: boolean) => void, lockAgent: (str: string) => void, - generateAgent: (username: string, firstName: string, lastName: string, password: string) => void, + generateAgent: (password: string) => void, + mutateAgent: (username: string, firstName: string, lastName: string) => void, }; } @@ -28,6 +29,7 @@ const initialState: ContextProps = { unlockAgent: () => null, lockAgent: () => null, generateAgent: () => null, + mutateAgent: () => null } } @@ -44,7 +46,7 @@ export function AgentProvider({ children }: any) { const [state, setState] = useState(initialState.state); - + const setLoading = (loading: boolean) => { setState((prev) => ({ ...prev, @@ -52,21 +54,40 @@ export function AgentProvider({ children }: any) { })) } - const generateAgent = async (username: string, firstName: string, lastName: string, password: string) => { + const generateAgent = async (password: string) => { setLoading(true); + console.log("Generating agent"); let agentStatus = await client!.agent.generate(password); - const additions = []; + console.log("generate done with: ", agentStatus); + + console.log("agent status in generate: ", agentStatus); + + setLoading(false); + + await invoke('login_proxy', { subdomain: agentStatus.did! }); + }; - additions.push( - new Link({ - source: agentStatus.did!, - target: Literal.from(username).toUrl(), - predicate: PREDICATE_USERNAME - }) - ); + const mutateAgent = async (username: string, firstName: string, lastName: string) => { + const agentStatus = await client!.agent.status(); + handleLogin(client!, agentStatus.isUnlocked, agentStatus.did!); + + await invoke('close_main_window'); + await invoke('open_tray_message'); + + const additions = []; + + if(username) { + additions.push( + new Link({ + source: agentStatus.did!, + target: Literal.from(username).toUrl(), + predicate: PREDICATE_USERNAME + }) + ); + } if (firstName) { additions.push( @@ -88,28 +109,19 @@ export function AgentProvider({ children }: any) { ); } + console.log("mutating public perspective: ", additions); await client?.agent.mutatePublicPerspective({ additions, removals: [] - }) + }); - handleLogin(client!, agentStatus.isUnlocked, agentStatus.did!); - - console.log("agent status in generate: ", agentStatus); - - setLoading(false); - - await invoke('close_main_window'); - await invoke('open_tray_message'); - await invoke('login_proxy', { subdomain: agentStatus.did! }); - navigate('/apps'); - }; + } const unlockAgent = async (password: string, holochain: boolean) => { - console.log("wow", password, holochain) + console.log("Holochain config:", holochain) setLoading(true) - + let agentStatus = await client?.agent.unlock(password, holochain); setLoading(false); @@ -135,16 +147,17 @@ export function AgentProvider({ children }: any) { handleLogin(client!, status!.isUnlocked, status!.did!); setLoading(false); - } + } return ( -