diff --git a/.ceramicDev.config.json b/.ceramicDev.config.json new file mode 100644 index 000000000..3f5d12749 --- /dev/null +++ b/.ceramicDev.config.json @@ -0,0 +1,35 @@ +{ + "anchor": { }, + "http-api": { + "cors-allowed-origins": [ + ".*" + ], + "admin-dids": [ + "did:key:z6MktbKJrMnhVJ37QFTo12911ycm2juKDUzWHDVETu9s5a9T" + ] + }, + "ipfs": { + "mode": "remote", + "host": "http://host.docker.internal:5001" + }, + "logger": { + "log-level": 2 + }, + "metrics": { + "metrics-exporter-enabled": false, + "metrics-port": 9090 + }, + "network": { + "name": "inmemory" + }, + "node": {}, + "state-store": { + "mode": "fs", + "local-directory": "/root/.ceramic/statestore" + }, + "indexing": { + "db": "postgres://walter:white@db_postgres:5432/postgres", + "allow-queries-before-historical-sync": true, + "models": [] + } +} diff --git a/.ceramicTemplate.config.json b/.ceramicTemplate.config.json new file mode 100644 index 000000000..029129191 --- /dev/null +++ b/.ceramicTemplate.config.json @@ -0,0 +1,35 @@ +{ + "anchor": { }, + "http-api": { + "cors-allowed-origins": [ + ".*" + ], + "admin-dids": [ + "did:key:z6MktbKJrMnhVJ37QFTo12911ycm2juKDUzWHDVETu9s5a9T" + ] + }, + "ipfs": { + "mode": "remote", + "host": "@DOCKER_HOST@" + }, + "logger": { + "log-level": 2 + }, + "metrics": { + "metrics-exporter-enabled": false, + "metrics-port": 9090 + }, + "network": { + "name": "inmemory" + }, + "node": {}, + "state-store": { + "mode": "fs", + "local-directory": "/root/.ceramic/statestore" + }, + "indexing": { + "db": "@POSTGRES_URI@", + "allow-queries-before-historical-sync": true, + "models": [] + } +} diff --git a/.env.example b/.env.example index 1d87f36b7..d6b37f9be 100755 --- a/.env.example +++ b/.env.example @@ -5,6 +5,8 @@ PORT=5420 IPFS_NODE_URL=http://host.docker.internal:5001 PUBLIC_IPFS_RESOLVER=https://ipfs.io +# IPFS_RESOLVER_OVERRIDE=http://host.docker.internal:8089/ipfs + ### Database - Postgres PG_HOST=db_boilerplate PG_PORT=5432 @@ -29,7 +31,7 @@ REDIS_URL=redis://host.docker.internal:6379 # LOCAL DEV MNEMONIC=test test test test test test test test test test test junk -# http://localhost:1984 +# http://localhost:1984 # # LIVE: # host: 'arweave.net', @@ -75,8 +77,6 @@ VSCODE_ACCESS_TOKEN= # nodes media server (DOI resolution, video transcoding, LaTeX -> PDF Conversion) NODES_MEDIA_SERVER_URL=http://host.docker.internal:5454 -DISABLE_EXTERNAL_PUBLISH=1 - # honeycomb.io telemetry OTEL_SERVICE_NAME= HONEYCOMB_API_KEY= @@ -88,4 +88,11 @@ MEDIA_SECRET_KEY=supersecret ORCID_API_DOMAIN=https://api.sandbox.orcid.org ORCID_CLIENT_ID= -ORCID_CLIENT_SECRET= \ No newline at end of file +ORCID_CLIENT_SECRET= + +REPO_SERVER_URL=http://host.docker.internal:5445 +REPO_SERVICE_SECRET_KEY=secretrepo +# Ceramic publish feature toggle, set to 1 for active +TOGGLE_CERAMIC= +# If above is set, clone `@desci-labs/desci-codex` and put the path to it here +CODEX_REPO_PATH= diff --git a/.env.test b/.env.test index bf5effb0f..a20e598d1 100644 --- a/.env.test +++ b/.env.test @@ -69,4 +69,7 @@ CSO_CLASSIFIER_API= VSCODE_ACCESS_TOKEN= # nodes media server (DOI resolution, video transcoding, LaTeX -> PDF Conversion) -NODES_MEDIA_SERVER_URL=http://host.docker.internal:5454 \ No newline at end of file +NODES_MEDIA_SERVER_URL=http://host.docker.internal:5454 + +REPO_SERVICE_SECRET_KEY="m8sIy5BPygBcX3+ZmMVuAA10k6w59BSCZd+Z5+VLYm4=" +REPO_SERVER_URL=http://host.docker.internal:5485 \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 513e78b89..7f4f8d6b1 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,4 +1,3 @@ -Asana ticket: Closes # ## Description of the Problem / Feature diff --git a/.github/workflows/build-and-test.yaml b/.github/workflows/build-and-test.yaml index 32215e714..5da51f4b3 100644 --- a/.github/workflows/build-and-test.yaml +++ b/.github/workflows/build-and-test.yaml @@ -7,6 +7,7 @@ on: paths: - .github/workflows/** - desci-server/** + - desci-repo/** - desci-contracts/** - Dockerfile @@ -47,7 +48,7 @@ jobs: docker info - name: Install dependencies - run: cd desci-models && npm i -g yarn && yarn && yarn build && cd ../desci-server && yarn + run: cd desci-models && npm i -g yarn && yarn && yarn build && cd ../desci-server && yarn && cd ../desci-repo && yarn - name: Stub contract run: | diff --git a/.github/workflows/build-repo-server.yaml b/.github/workflows/build-repo-server.yaml new file mode 100644 index 000000000..28a649186 --- /dev/null +++ b/.github/workflows/build-repo-server.yaml @@ -0,0 +1,187 @@ +# build.yml +on: + # pull_request: + # paths: + # - desci-server/** + push: + paths: + - .github/workflows/** + - desci-repo/** + branches: # array of glob patterns matching against refs/heads. Optional; defaults to all + - main # triggers on pushes that contain changes + - develop + - demo + +name: Build desci-repo + +# https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html +env: + AWS_DEFAULT_REGION: us-east-2 + AWS_DEFAULT_OUTPUT: json + AWS_ACCOUNT_ID: ${{ secrets.AWS_ACCOUNT_ID }} + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + CONTAINER_IMAGE: desci-repo-server + DOCKER_BUILDKIT: 1 + +jobs: + # build-and-test: + # runs-on: ubuntu-latest + # # container: + # # image: ubuntu:latest + # # options: --user 1001 + + # steps: + # - name: Check out repository + # uses: actions/checkout@v2 + + # - name: Set up the environment + # # Replace this line with the appropriate setup for your project + # # Examples: + # uses: actions/setup-node@v2 + # with: + # node-version: 16 + + # - name: Set up docker-compose + # run: | + # sudo curl -L "https://github.com/docker/compose/releases/download/v2.18.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose + # sudo docker-compose --version + # docker info + + # - name: Install dependencies + # run: cd desci-repo && yarn + + # - name: Run tests + # run: | + # cd desci-repo && export DOCKER_BUILDKIT=1 && yarn && yarn test + # echo "exit code $?" + # if [ $? -ne 0 ]; then + # exit 1 + # fi + + build-and-push: + # needs: build-and-test + name: Build and deploy + runs-on: ubuntu-latest + steps: + - uses: hashicorp/setup-terraform@v1 + - name: Checkout + uses: actions/checkout@master + + # Add steps here like linting, testing, minification, etc. + - id: install-aws-cli + uses: unfor19/install-aws-cli-action@v1 + with: + version: 1 + + - uses: prepor/action-aws-iam-authenticator@master + - run: aws-iam-authenticator version + + - name: Install Kubectl + run: | + #$(curl -Ls https://dl.k8s.io/release/stable.txt) + version=v1.23.6 + echo "using kubectl@$version" + curl -sLO "https://dl.k8s.io/release/$version/bin/linux/amd64/kubectl" -o kubectl + chmod +x kubectl + mv kubectl /usr/local/bin + mkdir $HOME/.kube + sudo apt-get update + sudo apt-get install less + echo ${{ secrets.KUBE_CONFIG_DATA }} | base64 --decode > $HOME/.kube/config + aws sts get-caller-identity + kubectl describe deployments + + - name: Build and tag the image (DEV) + if: github.ref == 'refs/heads/develop' + run: | + # Build and tag the image + docker build \ + -t $CONTAINER_IMAGE-dev:latest \ + -t $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$CONTAINER_IMAGE-dev \ + ./desci-repo + + - name: Build and tag the image (DEMO) + if: github.ref == 'refs/heads/demo' + run: | + # Build and tag the image + docker build \ + -t $CONTAINER_IMAGE-demo:latest \ + -t $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$CONTAINER_IMAGE-demo \ + ./desci-repo + + - name: Build and tag the image (PROD) + if: github.ref == 'refs/heads/main' + run: | + # Build and tag the image + docker build \ + -t $CONTAINER_IMAGE:latest \ + -t $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$CONTAINER_IMAGE \ + ./desci-repo + + # Add additional steps here like scanning of image + + # Only push to registry on dev + - name: Push (DEV) + if: github.ref == 'refs/heads/develop' + run: | + # Push image to AWS ECR + aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com + docker tag $CONTAINER_IMAGE-dev:latest $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$CONTAINER_IMAGE-dev:${{ github.sha }} + docker tag $CONTAINER_IMAGE-dev:latest $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$CONTAINER_IMAGE-dev:latest + docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$CONTAINER_IMAGE-dev:${{ github.sha }} + docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$CONTAINER_IMAGE-dev:latest + + - name: Push (DEMO) + if: github.ref == 'refs/heads/demo' + run: | + # Push image to AWS ECR + aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com + docker tag $CONTAINER_IMAGE-demo:latest $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$CONTAINER_IMAGE-demo:${{ github.sha }} + docker tag $CONTAINER_IMAGE-demo:latest $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$CONTAINER_IMAGE-demo:latest + docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$CONTAINER_IMAGE-demo:${{ github.sha }} + docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$CONTAINER_IMAGE-demo:latest + + - name: Push (PROD) + if: github.ref == 'refs/heads/main' + run: | + # Push image to AWS ECR + aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com + docker tag $CONTAINER_IMAGE:latest $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$CONTAINER_IMAGE:${{ github.sha }} + docker tag $CONTAINER_IMAGE:latest $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$CONTAINER_IMAGE:latest + docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$CONTAINER_IMAGE:${{ github.sha }} + docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$CONTAINER_IMAGE:latest + + - name: Deploy to EKS (DEV) + # uses: steebchen/kubectl@v2.0.0 + if: github.ref == 'refs/heads/develop' + run: | # defaults to latest kubectl binary version + kubectl apply -f desci-repo/kubernetes/deployment_dev.yaml + kubectl set image deployment/desci-repo-server-dev desci-repo-server-dev=$AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$CONTAINER_IMAGE-dev:${{ github.sha }} --record + + - name: Deploy to EKS (DEMO) + # uses: steebchen/kubectl@v2.0.0 + if: github.ref == 'refs/heads/demo' + run: | # defaults to latest kubectl binary version + kubectl set image deployment/desci-repo-server-demo desci-repo-server-demo=$AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$CONTAINER_IMAGE-demo:${{ github.sha }} --record + + - name: Deploy to EKS (PROD) + if: github.ref == 'refs/heads/main' + run: | # defaults to latest kubectl binary version + kubectl apply -f desci-repo/kubernetes/deployment.yaml + kubectl set image deployment/desci-repo-server desci-repo-server=$AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$CONTAINER_IMAGE:${{ github.sha }} --record + + - name: Verify EKS Deployment (DEV) + if: github.ref == 'refs/heads/develop' + run: | + kubectl rollout status deployment/desci-repo-server-dev + + - name: Verify EKS Deployment (DEMO) + if: github.ref == 'refs/heads/demo' + run: | + kubectl rollout status deployment/desci-repo-server-demo + + - name: Verify EKS Deployment (PROD) + if: github.ref == 'refs/heads/main' + run: | + kubectl rollout status deployment/desci-repo-server diff --git a/.github/workflows/build-server.yaml b/.github/workflows/build-server.yaml index 3684c076e..3145a3cf7 100644 --- a/.github/workflows/build-server.yaml +++ b/.github/workflows/build-server.yaml @@ -179,6 +179,7 @@ jobs: # uses: steebchen/kubectl@v2.0.0 if: github.ref == 'refs/heads/develop' run: | # defaults to latest kubectl binary version + kubectl apply -f desci-server/kubernetes/deployment_dev.yaml kubectl set image deployment/desci-server-dev desci-server-dev=$AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$CONTAINER_IMAGE-dev:${{ github.sha }} --record - name: Deploy to EKS (DEMO) @@ -190,6 +191,7 @@ jobs: - name: Deploy to EKS (PROD) if: github.ref == 'refs/heads/main' run: | # defaults to latest kubectl binary version + kubectl apply -f desci-server/kubernetes/deployment.yaml kubectl set image deployment/desci-server desci-server=$AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$CONTAINER_IMAGE:${{ github.sha }} --record - name: Verify EKS Deployment (DEV) diff --git a/.vscode/launch.json b/.vscode/launch.json index 42d72b1ec..069982987 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -15,14 +15,34 @@ "remoteRoot": "/app" }, { + "name": "Docker: Attach to Desci Repo", "type": "node", "request": "attach", - "name": "Mocha Tests", + "restart": true, + "port": 9232, + "address": "localhost", + "localRoot": "${workspaceFolder}", + "remoteRoot": "/app" + }, + { + "type": "node", + "request": "attach", + "name": "Docker: Mocha Tests", "restart": true, "port": 9227, "address": "localhost", "localRoot": "${workspaceFolder}", "remoteRoot": "/app" + }, + { + "type": "node", + "request": "attach", + "name": "Scripts Debug", + "restart": true, + "port": 9277, + "address": "localhost", + "localRoot": "${workspaceFolder}", + "remoteRoot": "/app" } ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index 203dc8173..8115ce5a3 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,22 +1,24 @@ { - "explorer.compactFolders": false, - "files.exclude": { - "**/node_modules/**": true - }, - "yaml.schemas": { - "https://gitpod.io/schemas/gitpod-schema.json": "file:///workspace/desci-nodes/.gitpod.yml" - }, - "solidity.defaultCompiler": "localFile", - "tailwindCSS.includeLanguages": { - "typescript": "javascript", // if you are using typescript - "typescriptreact": "javascript" // if you are using typescript with react - }, - "editor.quickSuggestions": { - "strings": true // forces VS Code to trigger completions when editing "string" content - }, - "tailwindCSS.experimental.classRegex": [ - "tw`([^`]*)", // tw`...` - "tw\\.[^`]+`([^`]*)`", // tw.xxx`...` - "tw\\(.*?\\).*?`([^`]*)" // tw(Component)`...` - ] -} \ No newline at end of file + "explorer.compactFolders": false, + "files.exclude": { + "**/node_modules/**": false + }, + "yaml.schemas": { + "https://gitpod.io/schemas/gitpod-schema.json": "file:///workspace/desci-nodes/.gitpod.yml" + }, + "solidity.defaultCompiler": "localFile", + "tailwindCSS.includeLanguages": { + "typescript": "javascript", // if you are using typescript + "typescriptreact": "javascript" // if you are using typescript with react + }, + "editor.quickSuggestions": { + "strings": true // forces VS Code to trigger completions when editing "string" content + }, + "tailwindCSS.experimental.classRegex": [ + "tw`([^`]*)", // tw`...` + "tw\\.[^`]+`([^`]*)`", // tw.xxx`...` + "tw\\(.*?\\).*?`([^`]*)" // tw(Component)`...` + ], + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true +} diff --git a/Dockerfile b/Dockerfile index ac38cb6a1..a86fc21f1 100755 --- a/Dockerfile +++ b/Dockerfile @@ -39,6 +39,8 @@ COPY --chown=node:node ./desci-contracts/.openzeppelin ./src/desci-contracts-con # copy contract abis RUN rm -r ./src/desci-contracts-artifacts RUN mkdir ./src/desci-contracts-artifacts +RUN mkdir -p /app/desci-repo/repo-tmp +RUN mkdir -p /app/desci-server/repo-tmp COPY --chown=node:node ./desci-contracts/artifacts ./src/desci-contracts-artifacts RUN mv package.json package.json.old @@ -56,6 +58,8 @@ RUN yarn build # server api EXPOSE 5420 +EXPOSE 9227 + # prisma studio EXPOSE 5555 diff --git a/Makefile b/Makefile index dd254c8b2..c4c7f4b69 100644 --- a/Makefile +++ b/Makefile @@ -25,7 +25,7 @@ clean-rec: $(MAKE) -C desci-server clean .PHONY: .env -.env: nodes-media/.env +.env: nodes-media/.env desci-repo/.env # Phony target, always runs but is idempotent # Copies example env if not present, and fails until MNEMONIC is set cp --no-clobber .env.example .env || true @@ -37,3 +37,6 @@ desci-contracts/.env: .env nodes-media/.env: cp nodes-media/.env.example nodes-media/.env +desci-repo/.env: + cp desci-repo/.env.example desci-repo/.env + diff --git a/README.md b/README.md index c4ce87d14..ee3c683f2 100644 --- a/README.md +++ b/README.md @@ -112,6 +112,9 @@ This starts: 4. expedition explorer for local dev (http://localhost:3001) 5. graph index pointing to latest deployed contract (http://localhost:8080) 6. Local IPFS node (private, swarm key enabled) (http://localhost:5001 or http://localhost:8089) +7. Local Ceramic node, run `bootstrapCeramic.sh` to initialize (http://localhost:7007) + +**Note:** The Ceramic publish functionality needs to be activated by setting the corresponding environment variable, see `.env.example` for instructions. **Note:** nodes-media (http://localhost:5454, responsible for DOI / PDF downloads, and for media transcoding) is disabled in the dev cluster by default, but can be uncommented in `docker-compose.dev.yml` for local development
diff --git a/bootstrapCeramic.sh b/bootstrapCeramic.sh new file mode 100755 index 000000000..1e37365e2 --- /dev/null +++ b/bootstrapCeramic.sh @@ -0,0 +1,60 @@ +#! /usr/bin/env bash + +# This script will try to find the `desci-codex` repo and run the +# model deployments. This yields a runtime definition file, which is +# necessary to instantiate the composeDB client used for publishing. +# +# This needs to be re-run when local-data is cleaned, as the models will +# get new streamIDs, and hence the runtime definition file is changed. +# +# There is no damage trying to run this multiple times in a row; it's +# idempotent. + +CTX="[bootstrapCeramic.sh]" + +set -euo pipefail +trap catch ERR +catch() { + echo "$CTX script failed" + exit 1 +} + +# Assert running from repo root +if [[ ! -f .env ]]; then + echo "$CTX Must run from repo root, aborting!" + exit 1 +fi + +# Assert desci-codex repo available +CODEX_REPO_PATH=$(grep "CODEX_REPO_PATH" .env | cut -d"=" -f2) +if [[ -z "$CODEX_REPO_PATH" ]]; then + echo "$CTX CODEX_REPO_PATH not set in .env, aborting!" + exit 1 +else + echo "$CTX Found codex repo path: $CODEX_REPO_PATH" +fi + +# Assert ceramic service is running +RUNNING_SERVICES=$(docker compose --project-name desci ps --services) +if ! grep -q ceramic <<<"$RUNNING_SERVICES"; then + echo "$CTX the ceramic compose service doesn't seem to be running, aborting!" + exit 1 +fi + +# Setup desci-codex and deploy composites +pushd "$CODEX_REPO_PATH" +if [[ ! -d "node_modules" ]]; then + echo "$CTX installing deps desci-codex..." + npm ci +fi + +echo "$CTX deploying composites..." +npm run --workspace packages/composedb deployComposites +popd + +echo "$CTX composites deployed! Copying composite runtime definition to local-data/ceramic..." +cp \ + "$CODEX_REPO_PATH/packages/composedb/src/__generated__/definition.js" \ + local-data/ceramic/definition.js + +echo "$CTX Done! Re-run this script if local state is cleaned." diff --git a/ceramic.Dockerfile b/ceramic.Dockerfile new file mode 100644 index 000000000..0d3fc5f41 --- /dev/null +++ b/ceramic.Dockerfile @@ -0,0 +1,9 @@ +FROM ceramicnetwork/js-ceramic:3.2.0 + +COPY interpolateConfigVars.sh . +COPY .ceramicTemplate.config.json . + +ENTRYPOINT [ \ + "bash", "-c", \ + "./interpolateConfigVars.sh .ceramicTemplate.config.json | jq > daemon.config.json && ./packages/cli/bin/ceramic.js daemon --config daemon.config.json" \ +] diff --git a/desci-contracts/artifacts/contracts/DpidRegistry.sol/DpidRegistry.json b/desci-contracts/artifacts/contracts/DpidRegistry.sol/DpidRegistry.json index 73e937914..659f0a75e 100644 --- a/desci-contracts/artifacts/contracts/DpidRegistry.sol/DpidRegistry.json +++ b/desci-contracts/artifacts/contracts/DpidRegistry.sol/DpidRegistry.json @@ -421,8 +421,8 @@ "type": "function" } ], - "bytecode": "0x60806040523480156200001157600080fd5b50620000226200002860201b60201c565b620001d3565b600060019054906101000a900460ff16156200007b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000729062000127565b60405180910390fd5b60ff801660008054906101000a900460ff1660ff161015620000ed5760ff6000806101000a81548160ff021916908360ff1602179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860ff604051620000e4919062000149565b60405180910390a15b565b6000620000fe60278362000166565b91506200010b8262000184565b604082019050919050565b620001218162000177565b82525050565b600060208201905081810360008301526200014281620000ef565b9050919050565b600060208201905062000160600083018462000116565b92915050565b600082825260208201905092915050565b600060ff82169050919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320696e69746960008201527f616c697a696e6700000000000000000000000000000000000000000000000000602082015250565b61230880620001e36000396000f3fe6080604052600436106101145760003560e01c80638129fc1c116100a0578063ced72f8711610064578063ced72f871461037f578063cef25dbc146103aa578063cfb51928146103c6578063da4a984214610403578063f2fde38b1461043357610114565b80638129fc1c146102aa57806381e104ca146102c15780638da5cb5b146102ec578063a40a990b14610317578063ba51b14e1461034057610114565b80634b22d5d0116100e75780634b22d5d0146101c75780634fb6020e146102045780635cb316351461022d57806369fe0e2d1461026a578063715018a61461029357610114565b80631785b6771461011957806318ae19c21461013557806322b3cd4e146101725780633ccfd60b146101b0575b600080fd5b610133600480360381019061012e9190611889565b61045c565b005b34801561014157600080fd5b5061015c60048036038101906101579190611906565b6104d8565b6040516101699190611e0a565b60405180910390f35b34801561017e57600080fd5b5061019960048036038101906101949190611889565b610568565b6040516101a7929190611e25565b60405180910390f35b3480156101bc57600080fd5b506101c561060e565b005b3480156101d357600080fd5b506101ee60048036038101906101e99190611889565b61066c565b6040516101fb9190611bfb565b60405180910390f35b34801561021057600080fd5b5061022b60048036038101906102269190611983565b610845565b005b34801561023957600080fd5b50610254600480360381019061024f9190611906565b610857565b6040516102619190611bfb565b60405180910390f35b34801561027657600080fd5b50610291600480360381019061028c9190611983565b6108d8565b005b34801561029f57600080fd5b506102a86108ea565b005b3480156102b657600080fd5b506102bf6108fe565b005b3480156102cd57600080fd5b506102d6610cfa565b6040516102e39190611e0a565b60405180910390f35b3480156102f857600080fd5b50610301610d04565b60405161030e9190611be0565b60405180910390f35b34801561032357600080fd5b5061033e600480360381019061033991906118b2565b610d2e565b005b34801561034c57600080fd5b5061036760048036038101906103629190611889565b610e52565b60405161037693929190611c6f565b60405180910390f35b34801561038b57600080fd5b50610394610e9c565b6040516103a19190611e0a565b60405180910390f35b6103c460048036038101906103bf91906118b2565b610ea6565b005b3480156103d257600080fd5b506103ed60048036038101906103e89190611942565b610f41565b6040516103fa9190611c16565b60405180910390f35b61041d60048036038101906104189190611906565b610f6b565b60405161042a9190611e0a565b60405180910390f35b34801561043f57600080fd5b5061045a60048036038101906104559190611860565b611227565b005b6104d581600067ffffffffffffffff8111156104a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156104cf5781602001602082028036833780820191505090505b50610ea6565b50565b600082606560008581526020019081526020016000206000015414610532576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052990611d6a565b60405180910390fd5b60006065600085815260200190815260200160002090508060030160008481526020019081526020016000205491505092915050565b600080826065600085815260200190815260200160002060000154146105c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ba90611d6a565b60405180910390fd5b600060656000858152602001908152602001600020905080600401548160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169250925050915091565b6106166112ab565b6000610620610d04565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610668573d6000803e3d6000fd5b5050565b600080600090506000806040518060600160405280602781526020016122ac60279139905060005b602060ff1681101561082357600060f81b8682602081106106de577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561071257809250610823565b60005b825181101561080f57828181518110610757577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168783602081106107bd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156107fc5784806107f490611fcb565b95505061080f565b808061080790611fcb565b915050610715565b50808061081b90611fcb565b915050610694565b50818310156108385760009350505050610840565b600193505050505b919050565b61084d6112ab565b8060678190555050565b6000826065600085815260200190815260200160002060000154146108b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a890611d6a565b60405180910390fd5b60006065600085815260200190815260200160002090508060040154831091505092915050565b6108e06112ab565b8060668190555050565b6108f26112ab565b6108fc6000611329565b565b60008060019054906101000a900460ff1615905080801561092f5750600160008054906101000a900460ff1660ff16105b8061095c575061093e306113ef565b15801561095b5750600160008054906101000a900460ff1660ff16145b5b61099b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099290611d8a565b60405180910390fd5b60016000806101000a81548160ff021916908360ff16021790555080156109d8576001600060016101000a81548160ff0219169083151502179055505b6601c6bf526340006066819055506706f05b59d3b2000060678190555060008067ffffffffffffffff811115610a37577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610a655781602001602082028036833780820191505090505b509050610a73600082611412565b610a9d7f647069640000000000000000000000000000000000000000000000000000000082611412565b610ac77f646369746500000000000000000000000000000000000000000000000000000082611412565b610af17f646576000000000000000000000000000000000000000000000000000000000082611412565b610b1b7f737461676500000000000000000000000000000000000000000000000000000082611412565b610b457f626574610000000000000000000000000000000000000000000000000000000082611412565b610b6f7f646573636900000000000000000000000000000000000000000000000000000082611412565b610b997f6e6f64650000000000000000000000000000000000000000000000000000000082611412565b610bc37f6e6f64657300000000000000000000000000000000000000000000000000000082611412565b610bed7f646f69000000000000000000000000000000000000000000000000000000000082611412565b610c177f610000000000000000000000000000000000000000000000000000000000000082611412565b610c417f640000000000000000000000000000000000000000000000000000000000000082611412565b610c6b7f780000000000000000000000000000000000000000000000000000000000000082611412565b610c957f7a0000000000000000000000000000000000000000000000000000000000000082611412565b610c9d6115a5565b508015610cf75760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024986001604051610cee9190611ccf565b60405180910390a15b50565b6000606754905090565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b81610d376115fe565b73ffffffffffffffffffffffffffffffffffffffff166065600083815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd190611d4a565b60405180910390fd5b600060656000858152602001908152602001600020905082816002019080519060200190610e09929190611667565b507f2f78800ab5b47f6617eaf3124043ced0ee3ae49c0b4a77167ee4cd2fbc674f0484610e346115fe565b85604051610e4493929190611c31565b60405180910390a150505050565b60656020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040154905083565b6000606654905090565b606754341015610eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee290611dea565b60405180910390fd5b610ef48261066c565b610f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2a90611d6a565b60405180910390fd5b610f3d8282611412565b5050565b600080829050600081511415610f5d576000801b915050610f66565b60208301519150505b919050565b6000606654341015610fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa990611dea565b60405180910390fd5b8260656000858152602001908152602001600020600001541461100a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100190611d6a565b60405180910390fd5b60006065600085815260200190815260200160002090506000816002018054905011156111a6576000816002018054905090506000805b82811015611162576000846002018281548110611087577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a082316110da6115fe565b6040518263ffffffff1660e01b81526004016110f69190611be0565b60206040518083038186803b15801561110e57600080fd5b505afa158015611122573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114691906119ac565b1115611156576001925050611162565b81600101915050611041565b50806111a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119a90611d2a565b60405180910390fd5b50505b60008160040154905083826003016000838152602001908152602001600020819055507fd5fa0e9a716b3ec4895a48223ad309e2d3fa5e27f04d8dc9b3c33cc738a50eb085826040516111fa929190611ca6565b60405180910390a181600401600081548092919061121790611fcb565b9190505550809250505092915050565b61122f6112ab565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561129f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129690611d0a565b60405180910390fd5b6112a881611329565b50565b6112b36115fe565b73ffffffffffffffffffffffffffffffffffffffff166112d1610d04565b73ffffffffffffffffffffffffffffffffffffffff1614611327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131e90611daa565b60405180910390fd5b565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000801b606560008481526020019081526020016000206000015414801561149c5750600073ffffffffffffffffffffffffffffffffffffffff166065600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b6114db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d290611cea565b60405180910390fd5b60006065600084815260200190815260200160002090506114fa6115fe565b8160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508281600001819055508181600201908051906020019061155d929190611667565b507f1603286ac6b9f753cbc1a1d33146ab15a401314d80d8553aa8fb1473df47f3ec836115886115fe565b8460405161159893929190611c31565b60405180910390a1505050565b600060019054906101000a900460ff166115f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115eb90611dca565b60405180910390fd5b6115fc611606565b565b600033905090565b600060019054906101000a900460ff16611655576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164c90611dca565b60405180910390fd5b6116656116606115fe565b611329565b565b8280548282559060005260206000209081019282156116e0579160200282015b828111156116df5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190611687565b5b5090506116ed91906116f1565b5090565b5b8082111561170a5760008160009055506001016116f2565b5090565b600061172161171c84611e73565b611e4e565b9050808382526020820190508285602086028201111561174057600080fd5b60005b85811015611770578161175688826117b8565b845260208401935060208301925050600181019050611743565b5050509392505050565b600061178d61178884611e9f565b611e4e565b9050828152602081018484840111156117a557600080fd5b6117b0848285611f8b565b509392505050565b6000813590506117c781612266565b92915050565b600082601f8301126117de57600080fd5b81356117ee84826020860161170e565b91505092915050565b6000813590506118068161227d565b92915050565b600082601f83011261181d57600080fd5b813561182d84826020860161177a565b91505092915050565b60008135905061184581612294565b92915050565b60008151905061185a81612294565b92915050565b60006020828403121561187257600080fd5b6000611880848285016117b8565b91505092915050565b60006020828403121561189b57600080fd5b60006118a9848285016117f7565b91505092915050565b600080604083850312156118c557600080fd5b60006118d3858286016117f7565b925050602083013567ffffffffffffffff8111156118f057600080fd5b6118fc858286016117cd565b9150509250929050565b6000806040838503121561191957600080fd5b6000611927858286016117f7565b925050602061193885828601611836565b9150509250929050565b60006020828403121561195457600080fd5b600082013567ffffffffffffffff81111561196e57600080fd5b61197a8482850161180c565b91505092915050565b60006020828403121561199557600080fd5b60006119a384828501611836565b91505092915050565b6000602082840312156119be57600080fd5b60006119cc8482850161184b565b91505092915050565b60006119e183836119ed565b60208301905092915050565b6119f681611f1a565b82525050565b611a0581611f1a565b82525050565b6000611a1682611ee0565b611a208185611ef8565b9350611a2b83611ed0565b8060005b83811015611a5c578151611a4388826119d5565b9750611a4e83611eeb565b925050600181019050611a2f565b5085935050505092915050565b611a7281611f2c565b82525050565b611a8181611f38565b82525050565b611a9081611f79565b82525050565b6000611aa3600c83611f09565b9150611aae82612083565b602082019050919050565b6000611ac6602683611f09565b9150611ad1826120ac565b604082019050919050565b6000611ae9601883611f09565b9150611af4826120fb565b602082019050919050565b6000611b0c601283611f09565b9150611b1782612124565b602082019050919050565b6000611b2f600e83611f09565b9150611b3a8261214d565b602082019050919050565b6000611b52602e83611f09565b9150611b5d82612176565b604082019050919050565b6000611b75602083611f09565b9150611b80826121c5565b602082019050919050565b6000611b98602b83611f09565b9150611ba3826121ee565b604082019050919050565b6000611bbb600c83611f09565b9150611bc68261223d565b602082019050919050565b611bda81611f62565b82525050565b6000602082019050611bf560008301846119fc565b92915050565b6000602082019050611c106000830184611a69565b92915050565b6000602082019050611c2b6000830184611a78565b92915050565b6000606082019050611c466000830186611a78565b611c5360208301856119fc565b8181036040830152611c658184611a0b565b9050949350505050565b6000606082019050611c846000830186611a78565b611c9160208301856119fc565b611c9e6040830184611bd1565b949350505050565b6000604082019050611cbb6000830185611a78565b611cc86020830184611bd1565b9392505050565b6000602082019050611ce46000830184611a87565b92915050565b60006020820190508181036000830152611d0381611a96565b9050919050565b60006020820190508181036000830152611d2381611ab9565b9050919050565b60006020820190508181036000830152611d4381611adc565b9050919050565b60006020820190508181036000830152611d6381611aff565b9050919050565b60006020820190508181036000830152611d8381611b22565b9050919050565b60006020820190508181036000830152611da381611b45565b9050919050565b60006020820190508181036000830152611dc381611b68565b9050919050565b60006020820190508181036000830152611de381611b8b565b9050919050565b60006020820190508181036000830152611e0381611bae565b9050919050565b6000602082019050611e1f6000830184611bd1565b92915050565b6000604082019050611e3a6000830185611bd1565b611e4760208301846119fc565b9392505050565b6000611e58611e69565b9050611e648282611f9a565b919050565b6000604051905090565b600067ffffffffffffffff821115611e8e57611e8d612043565b5b602082029050602081019050919050565b600067ffffffffffffffff821115611eba57611eb9612043565b5b611ec382612072565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000611f2582611f42565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000611f8482611f6c565b9050919050565b82818337600083830152505050565b611fa382612072565b810181811067ffffffffffffffff82111715611fc257611fc1612043565b5b80604052505050565b6000611fd682611f62565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561200957612008612014565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f5072656669782074616b656e0000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f556e617574686f72697a65643a20546f6b656e20676174650000000000000000600082015250565b7f4f6e6c79206f776e657220757064617465730000000000000000000000000000600082015250565b7f496e76616c696420707265666978000000000000000000000000000000000000600082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b7f4665652072657175697265640000000000000000000000000000000000000000600082015250565b61226f81611f1a565b811461227a57600080fd5b50565b61228681611f38565b811461229157600080fd5b50565b61229d81611f62565b81146122a857600080fd5b5056fe6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f2ea2646970667358221220540d3c6aee462c68f946c96febe6f10b56a69559b7785d8a25414bd10c68f16264736f6c63430008040033", - "deployedBytecode": "0x6080604052600436106101145760003560e01c80638129fc1c116100a0578063ced72f8711610064578063ced72f871461037f578063cef25dbc146103aa578063cfb51928146103c6578063da4a984214610403578063f2fde38b1461043357610114565b80638129fc1c146102aa57806381e104ca146102c15780638da5cb5b146102ec578063a40a990b14610317578063ba51b14e1461034057610114565b80634b22d5d0116100e75780634b22d5d0146101c75780634fb6020e146102045780635cb316351461022d57806369fe0e2d1461026a578063715018a61461029357610114565b80631785b6771461011957806318ae19c21461013557806322b3cd4e146101725780633ccfd60b146101b0575b600080fd5b610133600480360381019061012e9190611889565b61045c565b005b34801561014157600080fd5b5061015c60048036038101906101579190611906565b6104d8565b6040516101699190611e0a565b60405180910390f35b34801561017e57600080fd5b5061019960048036038101906101949190611889565b610568565b6040516101a7929190611e25565b60405180910390f35b3480156101bc57600080fd5b506101c561060e565b005b3480156101d357600080fd5b506101ee60048036038101906101e99190611889565b61066c565b6040516101fb9190611bfb565b60405180910390f35b34801561021057600080fd5b5061022b60048036038101906102269190611983565b610845565b005b34801561023957600080fd5b50610254600480360381019061024f9190611906565b610857565b6040516102619190611bfb565b60405180910390f35b34801561027657600080fd5b50610291600480360381019061028c9190611983565b6108d8565b005b34801561029f57600080fd5b506102a86108ea565b005b3480156102b657600080fd5b506102bf6108fe565b005b3480156102cd57600080fd5b506102d6610cfa565b6040516102e39190611e0a565b60405180910390f35b3480156102f857600080fd5b50610301610d04565b60405161030e9190611be0565b60405180910390f35b34801561032357600080fd5b5061033e600480360381019061033991906118b2565b610d2e565b005b34801561034c57600080fd5b5061036760048036038101906103629190611889565b610e52565b60405161037693929190611c6f565b60405180910390f35b34801561038b57600080fd5b50610394610e9c565b6040516103a19190611e0a565b60405180910390f35b6103c460048036038101906103bf91906118b2565b610ea6565b005b3480156103d257600080fd5b506103ed60048036038101906103e89190611942565b610f41565b6040516103fa9190611c16565b60405180910390f35b61041d60048036038101906104189190611906565b610f6b565b60405161042a9190611e0a565b60405180910390f35b34801561043f57600080fd5b5061045a60048036038101906104559190611860565b611227565b005b6104d581600067ffffffffffffffff8111156104a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156104cf5781602001602082028036833780820191505090505b50610ea6565b50565b600082606560008581526020019081526020016000206000015414610532576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052990611d6a565b60405180910390fd5b60006065600085815260200190815260200160002090508060030160008481526020019081526020016000205491505092915050565b600080826065600085815260200190815260200160002060000154146105c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ba90611d6a565b60405180910390fd5b600060656000858152602001908152602001600020905080600401548160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169250925050915091565b6106166112ab565b6000610620610d04565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610668573d6000803e3d6000fd5b5050565b600080600090506000806040518060600160405280602781526020016122ac60279139905060005b602060ff1681101561082357600060f81b8682602081106106de577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561071257809250610823565b60005b825181101561080f57828181518110610757577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168783602081106107bd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156107fc5784806107f490611fcb565b95505061080f565b808061080790611fcb565b915050610715565b50808061081b90611fcb565b915050610694565b50818310156108385760009350505050610840565b600193505050505b919050565b61084d6112ab565b8060678190555050565b6000826065600085815260200190815260200160002060000154146108b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a890611d6a565b60405180910390fd5b60006065600085815260200190815260200160002090508060040154831091505092915050565b6108e06112ab565b8060668190555050565b6108f26112ab565b6108fc6000611329565b565b60008060019054906101000a900460ff1615905080801561092f5750600160008054906101000a900460ff1660ff16105b8061095c575061093e306113ef565b15801561095b5750600160008054906101000a900460ff1660ff16145b5b61099b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099290611d8a565b60405180910390fd5b60016000806101000a81548160ff021916908360ff16021790555080156109d8576001600060016101000a81548160ff0219169083151502179055505b6601c6bf526340006066819055506706f05b59d3b2000060678190555060008067ffffffffffffffff811115610a37577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610a655781602001602082028036833780820191505090505b509050610a73600082611412565b610a9d7f647069640000000000000000000000000000000000000000000000000000000082611412565b610ac77f646369746500000000000000000000000000000000000000000000000000000082611412565b610af17f646576000000000000000000000000000000000000000000000000000000000082611412565b610b1b7f737461676500000000000000000000000000000000000000000000000000000082611412565b610b457f626574610000000000000000000000000000000000000000000000000000000082611412565b610b6f7f646573636900000000000000000000000000000000000000000000000000000082611412565b610b997f6e6f64650000000000000000000000000000000000000000000000000000000082611412565b610bc37f6e6f64657300000000000000000000000000000000000000000000000000000082611412565b610bed7f646f69000000000000000000000000000000000000000000000000000000000082611412565b610c177f610000000000000000000000000000000000000000000000000000000000000082611412565b610c417f640000000000000000000000000000000000000000000000000000000000000082611412565b610c6b7f780000000000000000000000000000000000000000000000000000000000000082611412565b610c957f7a0000000000000000000000000000000000000000000000000000000000000082611412565b610c9d6115a5565b508015610cf75760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024986001604051610cee9190611ccf565b60405180910390a15b50565b6000606754905090565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b81610d376115fe565b73ffffffffffffffffffffffffffffffffffffffff166065600083815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd190611d4a565b60405180910390fd5b600060656000858152602001908152602001600020905082816002019080519060200190610e09929190611667565b507f2f78800ab5b47f6617eaf3124043ced0ee3ae49c0b4a77167ee4cd2fbc674f0484610e346115fe565b85604051610e4493929190611c31565b60405180910390a150505050565b60656020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040154905083565b6000606654905090565b606754341015610eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee290611dea565b60405180910390fd5b610ef48261066c565b610f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2a90611d6a565b60405180910390fd5b610f3d8282611412565b5050565b600080829050600081511415610f5d576000801b915050610f66565b60208301519150505b919050565b6000606654341015610fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa990611dea565b60405180910390fd5b8260656000858152602001908152602001600020600001541461100a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100190611d6a565b60405180910390fd5b60006065600085815260200190815260200160002090506000816002018054905011156111a6576000816002018054905090506000805b82811015611162576000846002018281548110611087577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a082316110da6115fe565b6040518263ffffffff1660e01b81526004016110f69190611be0565b60206040518083038186803b15801561110e57600080fd5b505afa158015611122573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114691906119ac565b1115611156576001925050611162565b81600101915050611041565b50806111a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119a90611d2a565b60405180910390fd5b50505b60008160040154905083826003016000838152602001908152602001600020819055507fd5fa0e9a716b3ec4895a48223ad309e2d3fa5e27f04d8dc9b3c33cc738a50eb085826040516111fa929190611ca6565b60405180910390a181600401600081548092919061121790611fcb565b9190505550809250505092915050565b61122f6112ab565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561129f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129690611d0a565b60405180910390fd5b6112a881611329565b50565b6112b36115fe565b73ffffffffffffffffffffffffffffffffffffffff166112d1610d04565b73ffffffffffffffffffffffffffffffffffffffff1614611327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131e90611daa565b60405180910390fd5b565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000801b606560008481526020019081526020016000206000015414801561149c5750600073ffffffffffffffffffffffffffffffffffffffff166065600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b6114db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d290611cea565b60405180910390fd5b60006065600084815260200190815260200160002090506114fa6115fe565b8160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508281600001819055508181600201908051906020019061155d929190611667565b507f1603286ac6b9f753cbc1a1d33146ab15a401314d80d8553aa8fb1473df47f3ec836115886115fe565b8460405161159893929190611c31565b60405180910390a1505050565b600060019054906101000a900460ff166115f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115eb90611dca565b60405180910390fd5b6115fc611606565b565b600033905090565b600060019054906101000a900460ff16611655576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164c90611dca565b60405180910390fd5b6116656116606115fe565b611329565b565b8280548282559060005260206000209081019282156116e0579160200282015b828111156116df5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190611687565b5b5090506116ed91906116f1565b5090565b5b8082111561170a5760008160009055506001016116f2565b5090565b600061172161171c84611e73565b611e4e565b9050808382526020820190508285602086028201111561174057600080fd5b60005b85811015611770578161175688826117b8565b845260208401935060208301925050600181019050611743565b5050509392505050565b600061178d61178884611e9f565b611e4e565b9050828152602081018484840111156117a557600080fd5b6117b0848285611f8b565b509392505050565b6000813590506117c781612266565b92915050565b600082601f8301126117de57600080fd5b81356117ee84826020860161170e565b91505092915050565b6000813590506118068161227d565b92915050565b600082601f83011261181d57600080fd5b813561182d84826020860161177a565b91505092915050565b60008135905061184581612294565b92915050565b60008151905061185a81612294565b92915050565b60006020828403121561187257600080fd5b6000611880848285016117b8565b91505092915050565b60006020828403121561189b57600080fd5b60006118a9848285016117f7565b91505092915050565b600080604083850312156118c557600080fd5b60006118d3858286016117f7565b925050602083013567ffffffffffffffff8111156118f057600080fd5b6118fc858286016117cd565b9150509250929050565b6000806040838503121561191957600080fd5b6000611927858286016117f7565b925050602061193885828601611836565b9150509250929050565b60006020828403121561195457600080fd5b600082013567ffffffffffffffff81111561196e57600080fd5b61197a8482850161180c565b91505092915050565b60006020828403121561199557600080fd5b60006119a384828501611836565b91505092915050565b6000602082840312156119be57600080fd5b60006119cc8482850161184b565b91505092915050565b60006119e183836119ed565b60208301905092915050565b6119f681611f1a565b82525050565b611a0581611f1a565b82525050565b6000611a1682611ee0565b611a208185611ef8565b9350611a2b83611ed0565b8060005b83811015611a5c578151611a4388826119d5565b9750611a4e83611eeb565b925050600181019050611a2f565b5085935050505092915050565b611a7281611f2c565b82525050565b611a8181611f38565b82525050565b611a9081611f79565b82525050565b6000611aa3600c83611f09565b9150611aae82612083565b602082019050919050565b6000611ac6602683611f09565b9150611ad1826120ac565b604082019050919050565b6000611ae9601883611f09565b9150611af4826120fb565b602082019050919050565b6000611b0c601283611f09565b9150611b1782612124565b602082019050919050565b6000611b2f600e83611f09565b9150611b3a8261214d565b602082019050919050565b6000611b52602e83611f09565b9150611b5d82612176565b604082019050919050565b6000611b75602083611f09565b9150611b80826121c5565b602082019050919050565b6000611b98602b83611f09565b9150611ba3826121ee565b604082019050919050565b6000611bbb600c83611f09565b9150611bc68261223d565b602082019050919050565b611bda81611f62565b82525050565b6000602082019050611bf560008301846119fc565b92915050565b6000602082019050611c106000830184611a69565b92915050565b6000602082019050611c2b6000830184611a78565b92915050565b6000606082019050611c466000830186611a78565b611c5360208301856119fc565b8181036040830152611c658184611a0b565b9050949350505050565b6000606082019050611c846000830186611a78565b611c9160208301856119fc565b611c9e6040830184611bd1565b949350505050565b6000604082019050611cbb6000830185611a78565b611cc86020830184611bd1565b9392505050565b6000602082019050611ce46000830184611a87565b92915050565b60006020820190508181036000830152611d0381611a96565b9050919050565b60006020820190508181036000830152611d2381611ab9565b9050919050565b60006020820190508181036000830152611d4381611adc565b9050919050565b60006020820190508181036000830152611d6381611aff565b9050919050565b60006020820190508181036000830152611d8381611b22565b9050919050565b60006020820190508181036000830152611da381611b45565b9050919050565b60006020820190508181036000830152611dc381611b68565b9050919050565b60006020820190508181036000830152611de381611b8b565b9050919050565b60006020820190508181036000830152611e0381611bae565b9050919050565b6000602082019050611e1f6000830184611bd1565b92915050565b6000604082019050611e3a6000830185611bd1565b611e4760208301846119fc565b9392505050565b6000611e58611e69565b9050611e648282611f9a565b919050565b6000604051905090565b600067ffffffffffffffff821115611e8e57611e8d612043565b5b602082029050602081019050919050565b600067ffffffffffffffff821115611eba57611eb9612043565b5b611ec382612072565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000611f2582611f42565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000611f8482611f6c565b9050919050565b82818337600083830152505050565b611fa382612072565b810181811067ffffffffffffffff82111715611fc257611fc1612043565b5b80604052505050565b6000611fd682611f62565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561200957612008612014565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f5072656669782074616b656e0000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f556e617574686f72697a65643a20546f6b656e20676174650000000000000000600082015250565b7f4f6e6c79206f776e657220757064617465730000000000000000000000000000600082015250565b7f496e76616c696420707265666978000000000000000000000000000000000000600082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b7f4665652072657175697265640000000000000000000000000000000000000000600082015250565b61226f81611f1a565b811461227a57600080fd5b50565b61228681611f38565b811461229157600080fd5b50565b61229d81611f62565b81146122a857600080fd5b5056fe6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f2ea2646970667358221220540d3c6aee462c68f946c96febe6f10b56a69559b7785d8a25414bd10c68f16264736f6c63430008040033", + "bytecode": "0x60806040523480156200001157600080fd5b50620000226200002860201b60201c565b620001d3565b600060019054906101000a900460ff16156200007b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000729062000127565b60405180910390fd5b60ff801660008054906101000a900460ff1660ff161015620000ed5760ff6000806101000a81548160ff021916908360ff1602179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860ff604051620000e4919062000149565b60405180910390a15b565b6000620000fe60278362000166565b91506200010b8262000184565b604082019050919050565b620001218162000177565b82525050565b600060208201905081810360008301526200014281620000ef565b9050919050565b600060208201905062000160600083018462000116565b92915050565b600082825260208201905092915050565b600060ff82169050919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320696e69746960008201527f616c697a696e6700000000000000000000000000000000000000000000000000602082015250565b61230880620001e36000396000f3fe6080604052600436106101145760003560e01c80638129fc1c116100a0578063ced72f8711610064578063ced72f871461037f578063cef25dbc146103aa578063cfb51928146103c6578063da4a984214610403578063f2fde38b1461043357610114565b80638129fc1c146102aa57806381e104ca146102c15780638da5cb5b146102ec578063a40a990b14610317578063ba51b14e1461034057610114565b80634b22d5d0116100e75780634b22d5d0146101c75780634fb6020e146102045780635cb316351461022d57806369fe0e2d1461026a578063715018a61461029357610114565b80631785b6771461011957806318ae19c21461013557806322b3cd4e146101725780633ccfd60b146101b0575b600080fd5b610133600480360381019061012e9190611889565b61045c565b005b34801561014157600080fd5b5061015c60048036038101906101579190611906565b6104d8565b6040516101699190611e0a565b60405180910390f35b34801561017e57600080fd5b5061019960048036038101906101949190611889565b610568565b6040516101a7929190611e25565b60405180910390f35b3480156101bc57600080fd5b506101c561060e565b005b3480156101d357600080fd5b506101ee60048036038101906101e99190611889565b61066c565b6040516101fb9190611bfb565b60405180910390f35b34801561021057600080fd5b5061022b60048036038101906102269190611983565b610845565b005b34801561023957600080fd5b50610254600480360381019061024f9190611906565b610857565b6040516102619190611bfb565b60405180910390f35b34801561027657600080fd5b50610291600480360381019061028c9190611983565b6108d8565b005b34801561029f57600080fd5b506102a86108ea565b005b3480156102b657600080fd5b506102bf6108fe565b005b3480156102cd57600080fd5b506102d6610cfa565b6040516102e39190611e0a565b60405180910390f35b3480156102f857600080fd5b50610301610d04565b60405161030e9190611be0565b60405180910390f35b34801561032357600080fd5b5061033e600480360381019061033991906118b2565b610d2e565b005b34801561034c57600080fd5b5061036760048036038101906103629190611889565b610e52565b60405161037693929190611c6f565b60405180910390f35b34801561038b57600080fd5b50610394610e9c565b6040516103a19190611e0a565b60405180910390f35b6103c460048036038101906103bf91906118b2565b610ea6565b005b3480156103d257600080fd5b506103ed60048036038101906103e89190611942565b610f41565b6040516103fa9190611c16565b60405180910390f35b61041d60048036038101906104189190611906565b610f6b565b60405161042a9190611e0a565b60405180910390f35b34801561043f57600080fd5b5061045a60048036038101906104559190611860565b611227565b005b6104d581600067ffffffffffffffff8111156104a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156104cf5781602001602082028036833780820191505090505b50610ea6565b50565b600082606560008581526020019081526020016000206000015414610532576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052990611d6a565b60405180910390fd5b60006065600085815260200190815260200160002090508060030160008481526020019081526020016000205491505092915050565b600080826065600085815260200190815260200160002060000154146105c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ba90611d6a565b60405180910390fd5b600060656000858152602001908152602001600020905080600401548160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169250925050915091565b6106166112ab565b6000610620610d04565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610668573d6000803e3d6000fd5b5050565b600080600090506000806040518060600160405280602781526020016122ac60279139905060005b602060ff1681101561082357600060f81b8682602081106106de577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561071257809250610823565b60005b825181101561080f57828181518110610757577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168783602081106107bd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156107fc5784806107f490611fcb565b95505061080f565b808061080790611fcb565b915050610715565b50808061081b90611fcb565b915050610694565b50818310156108385760009350505050610840565b600193505050505b919050565b61084d6112ab565b8060678190555050565b6000826065600085815260200190815260200160002060000154146108b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a890611d6a565b60405180910390fd5b60006065600085815260200190815260200160002090508060040154831091505092915050565b6108e06112ab565b8060668190555050565b6108f26112ab565b6108fc6000611329565b565b60008060019054906101000a900460ff1615905080801561092f5750600160008054906101000a900460ff1660ff16105b8061095c575061093e306113ef565b15801561095b5750600160008054906101000a900460ff1660ff16145b5b61099b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099290611d8a565b60405180910390fd5b60016000806101000a81548160ff021916908360ff16021790555080156109d8576001600060016101000a81548160ff0219169083151502179055505b6601c6bf526340006066819055506706f05b59d3b2000060678190555060008067ffffffffffffffff811115610a37577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610a655781602001602082028036833780820191505090505b509050610a73600082611412565b610a9d7f647069640000000000000000000000000000000000000000000000000000000082611412565b610ac77f646369746500000000000000000000000000000000000000000000000000000082611412565b610af17f646576000000000000000000000000000000000000000000000000000000000082611412565b610b1b7f737461676500000000000000000000000000000000000000000000000000000082611412565b610b457f626574610000000000000000000000000000000000000000000000000000000082611412565b610b6f7f646573636900000000000000000000000000000000000000000000000000000082611412565b610b997f6e6f64650000000000000000000000000000000000000000000000000000000082611412565b610bc37f6e6f64657300000000000000000000000000000000000000000000000000000082611412565b610bed7f646f69000000000000000000000000000000000000000000000000000000000082611412565b610c177f610000000000000000000000000000000000000000000000000000000000000082611412565b610c417f640000000000000000000000000000000000000000000000000000000000000082611412565b610c6b7f780000000000000000000000000000000000000000000000000000000000000082611412565b610c957f7a0000000000000000000000000000000000000000000000000000000000000082611412565b610c9d6115a5565b508015610cf75760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024986001604051610cee9190611ccf565b60405180910390a15b50565b6000606754905090565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b81610d376115fe565b73ffffffffffffffffffffffffffffffffffffffff166065600083815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd190611d4a565b60405180910390fd5b600060656000858152602001908152602001600020905082816002019080519060200190610e09929190611667565b507f2f78800ab5b47f6617eaf3124043ced0ee3ae49c0b4a77167ee4cd2fbc674f0484610e346115fe565b85604051610e4493929190611c31565b60405180910390a150505050565b60656020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040154905083565b6000606654905090565b606754341015610eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee290611dea565b60405180910390fd5b610ef48261066c565b610f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2a90611d6a565b60405180910390fd5b610f3d8282611412565b5050565b600080829050600081511415610f5d576000801b915050610f66565b60208301519150505b919050565b6000606654341015610fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa990611dea565b60405180910390fd5b8260656000858152602001908152602001600020600001541461100a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100190611d6a565b60405180910390fd5b60006065600085815260200190815260200160002090506000816002018054905011156111a6576000816002018054905090506000805b82811015611162576000846002018281548110611087577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a082316110da6115fe565b6040518263ffffffff1660e01b81526004016110f69190611be0565b60206040518083038186803b15801561110e57600080fd5b505afa158015611122573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114691906119ac565b1115611156576001925050611162565b81600101915050611041565b50806111a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119a90611d2a565b60405180910390fd5b50505b60008160040154905083826003016000838152602001908152602001600020819055507fd5fa0e9a716b3ec4895a48223ad309e2d3fa5e27f04d8dc9b3c33cc738a50eb085826040516111fa929190611ca6565b60405180910390a181600401600081548092919061121790611fcb565b9190505550809250505092915050565b61122f6112ab565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561129f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129690611d0a565b60405180910390fd5b6112a881611329565b50565b6112b36115fe565b73ffffffffffffffffffffffffffffffffffffffff166112d1610d04565b73ffffffffffffffffffffffffffffffffffffffff1614611327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131e90611daa565b60405180910390fd5b565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000801b606560008481526020019081526020016000206000015414801561149c5750600073ffffffffffffffffffffffffffffffffffffffff166065600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b6114db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d290611cea565b60405180910390fd5b60006065600084815260200190815260200160002090506114fa6115fe565b8160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508281600001819055508181600201908051906020019061155d929190611667565b507f1603286ac6b9f753cbc1a1d33146ab15a401314d80d8553aa8fb1473df47f3ec836115886115fe565b8460405161159893929190611c31565b60405180910390a1505050565b600060019054906101000a900460ff166115f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115eb90611dca565b60405180910390fd5b6115fc611606565b565b600033905090565b600060019054906101000a900460ff16611655576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164c90611dca565b60405180910390fd5b6116656116606115fe565b611329565b565b8280548282559060005260206000209081019282156116e0579160200282015b828111156116df5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190611687565b5b5090506116ed91906116f1565b5090565b5b8082111561170a5760008160009055506001016116f2565b5090565b600061172161171c84611e73565b611e4e565b9050808382526020820190508285602086028201111561174057600080fd5b60005b85811015611770578161175688826117b8565b845260208401935060208301925050600181019050611743565b5050509392505050565b600061178d61178884611e9f565b611e4e565b9050828152602081018484840111156117a557600080fd5b6117b0848285611f8b565b509392505050565b6000813590506117c781612266565b92915050565b600082601f8301126117de57600080fd5b81356117ee84826020860161170e565b91505092915050565b6000813590506118068161227d565b92915050565b600082601f83011261181d57600080fd5b813561182d84826020860161177a565b91505092915050565b60008135905061184581612294565b92915050565b60008151905061185a81612294565b92915050565b60006020828403121561187257600080fd5b6000611880848285016117b8565b91505092915050565b60006020828403121561189b57600080fd5b60006118a9848285016117f7565b91505092915050565b600080604083850312156118c557600080fd5b60006118d3858286016117f7565b925050602083013567ffffffffffffffff8111156118f057600080fd5b6118fc858286016117cd565b9150509250929050565b6000806040838503121561191957600080fd5b6000611927858286016117f7565b925050602061193885828601611836565b9150509250929050565b60006020828403121561195457600080fd5b600082013567ffffffffffffffff81111561196e57600080fd5b61197a8482850161180c565b91505092915050565b60006020828403121561199557600080fd5b60006119a384828501611836565b91505092915050565b6000602082840312156119be57600080fd5b60006119cc8482850161184b565b91505092915050565b60006119e183836119ed565b60208301905092915050565b6119f681611f1a565b82525050565b611a0581611f1a565b82525050565b6000611a1682611ee0565b611a208185611ef8565b9350611a2b83611ed0565b8060005b83811015611a5c578151611a4388826119d5565b9750611a4e83611eeb565b925050600181019050611a2f565b5085935050505092915050565b611a7281611f2c565b82525050565b611a8181611f38565b82525050565b611a9081611f79565b82525050565b6000611aa3600c83611f09565b9150611aae82612083565b602082019050919050565b6000611ac6602683611f09565b9150611ad1826120ac565b604082019050919050565b6000611ae9601883611f09565b9150611af4826120fb565b602082019050919050565b6000611b0c601283611f09565b9150611b1782612124565b602082019050919050565b6000611b2f600e83611f09565b9150611b3a8261214d565b602082019050919050565b6000611b52602e83611f09565b9150611b5d82612176565b604082019050919050565b6000611b75602083611f09565b9150611b80826121c5565b602082019050919050565b6000611b98602b83611f09565b9150611ba3826121ee565b604082019050919050565b6000611bbb600c83611f09565b9150611bc68261223d565b602082019050919050565b611bda81611f62565b82525050565b6000602082019050611bf560008301846119fc565b92915050565b6000602082019050611c106000830184611a69565b92915050565b6000602082019050611c2b6000830184611a78565b92915050565b6000606082019050611c466000830186611a78565b611c5360208301856119fc565b8181036040830152611c658184611a0b565b9050949350505050565b6000606082019050611c846000830186611a78565b611c9160208301856119fc565b611c9e6040830184611bd1565b949350505050565b6000604082019050611cbb6000830185611a78565b611cc86020830184611bd1565b9392505050565b6000602082019050611ce46000830184611a87565b92915050565b60006020820190508181036000830152611d0381611a96565b9050919050565b60006020820190508181036000830152611d2381611ab9565b9050919050565b60006020820190508181036000830152611d4381611adc565b9050919050565b60006020820190508181036000830152611d6381611aff565b9050919050565b60006020820190508181036000830152611d8381611b22565b9050919050565b60006020820190508181036000830152611da381611b45565b9050919050565b60006020820190508181036000830152611dc381611b68565b9050919050565b60006020820190508181036000830152611de381611b8b565b9050919050565b60006020820190508181036000830152611e0381611bae565b9050919050565b6000602082019050611e1f6000830184611bd1565b92915050565b6000604082019050611e3a6000830185611bd1565b611e4760208301846119fc565b9392505050565b6000611e58611e69565b9050611e648282611f9a565b919050565b6000604051905090565b600067ffffffffffffffff821115611e8e57611e8d612043565b5b602082029050602081019050919050565b600067ffffffffffffffff821115611eba57611eb9612043565b5b611ec382612072565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000611f2582611f42565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000611f8482611f6c565b9050919050565b82818337600083830152505050565b611fa382612072565b810181811067ffffffffffffffff82111715611fc257611fc1612043565b5b80604052505050565b6000611fd682611f62565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561200957612008612014565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f5072656669782074616b656e0000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f556e617574686f72697a65643a20546f6b656e20676174650000000000000000600082015250565b7f4f6e6c79206f776e657220757064617465730000000000000000000000000000600082015250565b7f496e76616c696420707265666978000000000000000000000000000000000000600082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b7f4665652072657175697265640000000000000000000000000000000000000000600082015250565b61226f81611f1a565b811461227a57600080fd5b50565b61228681611f38565b811461229157600080fd5b50565b61229d81611f62565b81146122a857600080fd5b5056fe6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f2ea2646970667358221220b8cac9a8d8f3de013face3e7fec9a14f0a1e3f3d09fe342a5252c76f07a42da364736f6c63430008040033", + "deployedBytecode": "0x6080604052600436106101145760003560e01c80638129fc1c116100a0578063ced72f8711610064578063ced72f871461037f578063cef25dbc146103aa578063cfb51928146103c6578063da4a984214610403578063f2fde38b1461043357610114565b80638129fc1c146102aa57806381e104ca146102c15780638da5cb5b146102ec578063a40a990b14610317578063ba51b14e1461034057610114565b80634b22d5d0116100e75780634b22d5d0146101c75780634fb6020e146102045780635cb316351461022d57806369fe0e2d1461026a578063715018a61461029357610114565b80631785b6771461011957806318ae19c21461013557806322b3cd4e146101725780633ccfd60b146101b0575b600080fd5b610133600480360381019061012e9190611889565b61045c565b005b34801561014157600080fd5b5061015c60048036038101906101579190611906565b6104d8565b6040516101699190611e0a565b60405180910390f35b34801561017e57600080fd5b5061019960048036038101906101949190611889565b610568565b6040516101a7929190611e25565b60405180910390f35b3480156101bc57600080fd5b506101c561060e565b005b3480156101d357600080fd5b506101ee60048036038101906101e99190611889565b61066c565b6040516101fb9190611bfb565b60405180910390f35b34801561021057600080fd5b5061022b60048036038101906102269190611983565b610845565b005b34801561023957600080fd5b50610254600480360381019061024f9190611906565b610857565b6040516102619190611bfb565b60405180910390f35b34801561027657600080fd5b50610291600480360381019061028c9190611983565b6108d8565b005b34801561029f57600080fd5b506102a86108ea565b005b3480156102b657600080fd5b506102bf6108fe565b005b3480156102cd57600080fd5b506102d6610cfa565b6040516102e39190611e0a565b60405180910390f35b3480156102f857600080fd5b50610301610d04565b60405161030e9190611be0565b60405180910390f35b34801561032357600080fd5b5061033e600480360381019061033991906118b2565b610d2e565b005b34801561034c57600080fd5b5061036760048036038101906103629190611889565b610e52565b60405161037693929190611c6f565b60405180910390f35b34801561038b57600080fd5b50610394610e9c565b6040516103a19190611e0a565b60405180910390f35b6103c460048036038101906103bf91906118b2565b610ea6565b005b3480156103d257600080fd5b506103ed60048036038101906103e89190611942565b610f41565b6040516103fa9190611c16565b60405180910390f35b61041d60048036038101906104189190611906565b610f6b565b60405161042a9190611e0a565b60405180910390f35b34801561043f57600080fd5b5061045a60048036038101906104559190611860565b611227565b005b6104d581600067ffffffffffffffff8111156104a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156104cf5781602001602082028036833780820191505090505b50610ea6565b50565b600082606560008581526020019081526020016000206000015414610532576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052990611d6a565b60405180910390fd5b60006065600085815260200190815260200160002090508060030160008481526020019081526020016000205491505092915050565b600080826065600085815260200190815260200160002060000154146105c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ba90611d6a565b60405180910390fd5b600060656000858152602001908152602001600020905080600401548160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169250925050915091565b6106166112ab565b6000610620610d04565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610668573d6000803e3d6000fd5b5050565b600080600090506000806040518060600160405280602781526020016122ac60279139905060005b602060ff1681101561082357600060f81b8682602081106106de577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561071257809250610823565b60005b825181101561080f57828181518110610757577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168783602081106107bd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156107fc5784806107f490611fcb565b95505061080f565b808061080790611fcb565b915050610715565b50808061081b90611fcb565b915050610694565b50818310156108385760009350505050610840565b600193505050505b919050565b61084d6112ab565b8060678190555050565b6000826065600085815260200190815260200160002060000154146108b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a890611d6a565b60405180910390fd5b60006065600085815260200190815260200160002090508060040154831091505092915050565b6108e06112ab565b8060668190555050565b6108f26112ab565b6108fc6000611329565b565b60008060019054906101000a900460ff1615905080801561092f5750600160008054906101000a900460ff1660ff16105b8061095c575061093e306113ef565b15801561095b5750600160008054906101000a900460ff1660ff16145b5b61099b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099290611d8a565b60405180910390fd5b60016000806101000a81548160ff021916908360ff16021790555080156109d8576001600060016101000a81548160ff0219169083151502179055505b6601c6bf526340006066819055506706f05b59d3b2000060678190555060008067ffffffffffffffff811115610a37577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610a655781602001602082028036833780820191505090505b509050610a73600082611412565b610a9d7f647069640000000000000000000000000000000000000000000000000000000082611412565b610ac77f646369746500000000000000000000000000000000000000000000000000000082611412565b610af17f646576000000000000000000000000000000000000000000000000000000000082611412565b610b1b7f737461676500000000000000000000000000000000000000000000000000000082611412565b610b457f626574610000000000000000000000000000000000000000000000000000000082611412565b610b6f7f646573636900000000000000000000000000000000000000000000000000000082611412565b610b997f6e6f64650000000000000000000000000000000000000000000000000000000082611412565b610bc37f6e6f64657300000000000000000000000000000000000000000000000000000082611412565b610bed7f646f69000000000000000000000000000000000000000000000000000000000082611412565b610c177f610000000000000000000000000000000000000000000000000000000000000082611412565b610c417f640000000000000000000000000000000000000000000000000000000000000082611412565b610c6b7f780000000000000000000000000000000000000000000000000000000000000082611412565b610c957f7a0000000000000000000000000000000000000000000000000000000000000082611412565b610c9d6115a5565b508015610cf75760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024986001604051610cee9190611ccf565b60405180910390a15b50565b6000606754905090565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b81610d376115fe565b73ffffffffffffffffffffffffffffffffffffffff166065600083815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd190611d4a565b60405180910390fd5b600060656000858152602001908152602001600020905082816002019080519060200190610e09929190611667565b507f2f78800ab5b47f6617eaf3124043ced0ee3ae49c0b4a77167ee4cd2fbc674f0484610e346115fe565b85604051610e4493929190611c31565b60405180910390a150505050565b60656020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040154905083565b6000606654905090565b606754341015610eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee290611dea565b60405180910390fd5b610ef48261066c565b610f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2a90611d6a565b60405180910390fd5b610f3d8282611412565b5050565b600080829050600081511415610f5d576000801b915050610f66565b60208301519150505b919050565b6000606654341015610fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa990611dea565b60405180910390fd5b8260656000858152602001908152602001600020600001541461100a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100190611d6a565b60405180910390fd5b60006065600085815260200190815260200160002090506000816002018054905011156111a6576000816002018054905090506000805b82811015611162576000846002018281548110611087577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a082316110da6115fe565b6040518263ffffffff1660e01b81526004016110f69190611be0565b60206040518083038186803b15801561110e57600080fd5b505afa158015611122573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114691906119ac565b1115611156576001925050611162565b81600101915050611041565b50806111a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119a90611d2a565b60405180910390fd5b50505b60008160040154905083826003016000838152602001908152602001600020819055507fd5fa0e9a716b3ec4895a48223ad309e2d3fa5e27f04d8dc9b3c33cc738a50eb085826040516111fa929190611ca6565b60405180910390a181600401600081548092919061121790611fcb565b9190505550809250505092915050565b61122f6112ab565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561129f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129690611d0a565b60405180910390fd5b6112a881611329565b50565b6112b36115fe565b73ffffffffffffffffffffffffffffffffffffffff166112d1610d04565b73ffffffffffffffffffffffffffffffffffffffff1614611327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131e90611daa565b60405180910390fd5b565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000801b606560008481526020019081526020016000206000015414801561149c5750600073ffffffffffffffffffffffffffffffffffffffff166065600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b6114db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d290611cea565b60405180910390fd5b60006065600084815260200190815260200160002090506114fa6115fe565b8160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508281600001819055508181600201908051906020019061155d929190611667565b507f1603286ac6b9f753cbc1a1d33146ab15a401314d80d8553aa8fb1473df47f3ec836115886115fe565b8460405161159893929190611c31565b60405180910390a1505050565b600060019054906101000a900460ff166115f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115eb90611dca565b60405180910390fd5b6115fc611606565b565b600033905090565b600060019054906101000a900460ff16611655576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164c90611dca565b60405180910390fd5b6116656116606115fe565b611329565b565b8280548282559060005260206000209081019282156116e0579160200282015b828111156116df5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190611687565b5b5090506116ed91906116f1565b5090565b5b8082111561170a5760008160009055506001016116f2565b5090565b600061172161171c84611e73565b611e4e565b9050808382526020820190508285602086028201111561174057600080fd5b60005b85811015611770578161175688826117b8565b845260208401935060208301925050600181019050611743565b5050509392505050565b600061178d61178884611e9f565b611e4e565b9050828152602081018484840111156117a557600080fd5b6117b0848285611f8b565b509392505050565b6000813590506117c781612266565b92915050565b600082601f8301126117de57600080fd5b81356117ee84826020860161170e565b91505092915050565b6000813590506118068161227d565b92915050565b600082601f83011261181d57600080fd5b813561182d84826020860161177a565b91505092915050565b60008135905061184581612294565b92915050565b60008151905061185a81612294565b92915050565b60006020828403121561187257600080fd5b6000611880848285016117b8565b91505092915050565b60006020828403121561189b57600080fd5b60006118a9848285016117f7565b91505092915050565b600080604083850312156118c557600080fd5b60006118d3858286016117f7565b925050602083013567ffffffffffffffff8111156118f057600080fd5b6118fc858286016117cd565b9150509250929050565b6000806040838503121561191957600080fd5b6000611927858286016117f7565b925050602061193885828601611836565b9150509250929050565b60006020828403121561195457600080fd5b600082013567ffffffffffffffff81111561196e57600080fd5b61197a8482850161180c565b91505092915050565b60006020828403121561199557600080fd5b60006119a384828501611836565b91505092915050565b6000602082840312156119be57600080fd5b60006119cc8482850161184b565b91505092915050565b60006119e183836119ed565b60208301905092915050565b6119f681611f1a565b82525050565b611a0581611f1a565b82525050565b6000611a1682611ee0565b611a208185611ef8565b9350611a2b83611ed0565b8060005b83811015611a5c578151611a4388826119d5565b9750611a4e83611eeb565b925050600181019050611a2f565b5085935050505092915050565b611a7281611f2c565b82525050565b611a8181611f38565b82525050565b611a9081611f79565b82525050565b6000611aa3600c83611f09565b9150611aae82612083565b602082019050919050565b6000611ac6602683611f09565b9150611ad1826120ac565b604082019050919050565b6000611ae9601883611f09565b9150611af4826120fb565b602082019050919050565b6000611b0c601283611f09565b9150611b1782612124565b602082019050919050565b6000611b2f600e83611f09565b9150611b3a8261214d565b602082019050919050565b6000611b52602e83611f09565b9150611b5d82612176565b604082019050919050565b6000611b75602083611f09565b9150611b80826121c5565b602082019050919050565b6000611b98602b83611f09565b9150611ba3826121ee565b604082019050919050565b6000611bbb600c83611f09565b9150611bc68261223d565b602082019050919050565b611bda81611f62565b82525050565b6000602082019050611bf560008301846119fc565b92915050565b6000602082019050611c106000830184611a69565b92915050565b6000602082019050611c2b6000830184611a78565b92915050565b6000606082019050611c466000830186611a78565b611c5360208301856119fc565b8181036040830152611c658184611a0b565b9050949350505050565b6000606082019050611c846000830186611a78565b611c9160208301856119fc565b611c9e6040830184611bd1565b949350505050565b6000604082019050611cbb6000830185611a78565b611cc86020830184611bd1565b9392505050565b6000602082019050611ce46000830184611a87565b92915050565b60006020820190508181036000830152611d0381611a96565b9050919050565b60006020820190508181036000830152611d2381611ab9565b9050919050565b60006020820190508181036000830152611d4381611adc565b9050919050565b60006020820190508181036000830152611d6381611aff565b9050919050565b60006020820190508181036000830152611d8381611b22565b9050919050565b60006020820190508181036000830152611da381611b45565b9050919050565b60006020820190508181036000830152611dc381611b68565b9050919050565b60006020820190508181036000830152611de381611b8b565b9050919050565b60006020820190508181036000830152611e0381611bae565b9050919050565b6000602082019050611e1f6000830184611bd1565b92915050565b6000604082019050611e3a6000830185611bd1565b611e4760208301846119fc565b9392505050565b6000611e58611e69565b9050611e648282611f9a565b919050565b6000604051905090565b600067ffffffffffffffff821115611e8e57611e8d612043565b5b602082029050602081019050919050565b600067ffffffffffffffff821115611eba57611eb9612043565b5b611ec382612072565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000611f2582611f42565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000611f8482611f6c565b9050919050565b82818337600083830152505050565b611fa382612072565b810181811067ffffffffffffffff82111715611fc257611fc1612043565b5b80604052505050565b6000611fd682611f62565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561200957612008612014565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f5072656669782074616b656e0000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f556e617574686f72697a65643a20546f6b656e20676174650000000000000000600082015250565b7f4f6e6c79206f776e657220757064617465730000000000000000000000000000600082015250565b7f496e76616c696420707265666978000000000000000000000000000000000000600082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b7f4665652072657175697265640000000000000000000000000000000000000000600082015250565b61226f81611f1a565b811461227a57600080fd5b50565b61228681611f38565b811461229157600080fd5b50565b61229d81611f62565b81146122a857600080fd5b5056fe6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f2ea2646970667358221220b8cac9a8d8f3de013face3e7fec9a14f0a1e3f3d09fe342a5252c76f07a42da364736f6c63430008040033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/desci-contracts/artifacts/hardhat/console.sol/console.json b/desci-contracts/artifacts/hardhat/console.sol/console.json index 8b32a7734..1c1dfa9f8 100644 --- a/desci-contracts/artifacts/hardhat/console.sol/console.json +++ b/desci-contracts/artifacts/hardhat/console.sol/console.json @@ -3,8 +3,8 @@ "contractName": "console", "sourceName": "hardhat/console.sol", "abi": [], - "bytecode": "0x60566050600b82828239805160001a6073146043577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212201066baf0131e6eab0b5e9cc6cb6d59b6b1ce6f56164f850f45f0e1316d420ed964736f6c63430008040033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212201066baf0131e6eab0b5e9cc6cb6d59b6b1ce6f56164f850f45f0e1316d420ed964736f6c63430008040033", + "bytecode": "0x60566050600b82828239805160001a6073146043577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212201073b46b4383ee9435320c671ef5445e763cf4b6c620cd2cd9e821f80c16b70264736f6c63430008040033", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212201073b46b4383ee9435320c671ef5445e763cf4b6c620cd2cd9e821f80c16b70264736f6c63430008040033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/desci-contracts/package.json b/desci-contracts/package.json index f71f8b25f..b911921d2 100644 --- a/desci-contracts/package.json +++ b/desci-contracts/package.json @@ -12,9 +12,9 @@ "deploy:dpid:ganache": "yarn stubHardhatAnalytics && rm -f ./.openzeppelin/unknown-1337.json ; rm -f ./.openzeppelin/unknown-dpid.json ; hardhat run scripts/deployDpidRegistry.js --network ganache && mv ./.openzeppelin/unknown-1337.json ./.openzeppelin/unknown-dpid.json", "graph:codegen": "graph codegen subgraph/subgraph.yaml -o subgraph/generated", "graph:build": "graph build subgraph/subgraph.yaml", - "graph:create-local": "graph create nodes --node http://127.0.0.1:8020 subgraph/subgraph.yaml", + "graph:create-local": "graph create nodes --node http://127.0.0.1:8020", "graph:deploy-local": "graph deploy nodes --ipfs http://127.0.0.1:5001 --node http://127.0.0.1:8020 -l v0.0.1 subgraph/subgraph.yaml", - "graph:create-docker": "graph create nodes --node http://host.docker.internal:8020 subgraph/subgraph.yaml", + "graph:create-docker": "graph create nodes --node http://host.docker.internal:8020", "graph:deploy-docker": "graph deploy nodes --ipfs http://host.docker.internal:5001 --node http://host.docker.internal:8020 -l v0.0.1 subgraph/subgraph.yaml", "graph:create-dev-local": "cp subgraph/subgraph.local.yaml subgraph/subgraph.yaml && graph create nodes --node http://127.0.0.1:8020", "graph:deploy-dev-local": "cp subgraph/subgraph.local.yaml subgraph/subgraph.yaml && graph deploy nodes --ipfs http://127.0.0.1:5001 --node http://127.0.0.1:8020", @@ -27,8 +27,8 @@ "/typechain-types" ], "devDependencies": { - "@graphprotocol/graph-cli": "^0.30.2", - "@graphprotocol/graph-ts": "^0.27.0", + "@graphprotocol/graph-cli": "^0.59.0", + "@graphprotocol/graph-ts": "^0.32.0", "@nomiclabs/hardhat-ethers": "^2.0.0", "@nomiclabs/hardhat-waffle": "^2.0.1", "@openzeppelin/contracts-upgradeable": "^4.7.3", @@ -43,7 +43,7 @@ "ethereum-waffle": "^3.4.0", "ethers": "^5.4.4", "ganache": "^7.8.0", - "hardhat": "^2.5.0", + "hardhat": "^2.19.2", "hardhat-deploy": "^0.8.11", "hardhat-deploy-ethers": "^0.3.0-beta.10", "hardhat-gas-reporter": "^1.0.4", diff --git a/desci-contracts/scripts/seed.sh b/desci-contracts/scripts/seed.sh index 6d0e0cf46..e7b5503d8 100755 --- a/desci-contracts/scripts/seed.sh +++ b/desci-contracts/scripts/seed.sh @@ -28,7 +28,7 @@ check() { done echo "[seed:$CONTRACT_NAME] deployment found, killing ganache..." - ps aux | grep ganache-cli | grep -v grep | awk '{print $2}' | xargs -r -t kill || echo "[seed:$CONTRACT_NAME] ganache not running" + pkill -f "npm exec ganache" || echo "[seed:$CONTRACT_NAME] ganache not running" echo "[seed:$CONTRACT_NAME] ganache killed" } diff --git a/desci-contracts/typechain-types/factories/DpidRegistry__factory.ts b/desci-contracts/typechain-types/factories/DpidRegistry__factory.ts index a6f3ba35d..8e887f7b0 100644 --- a/desci-contracts/typechain-types/factories/DpidRegistry__factory.ts +++ b/desci-contracts/typechain-types/factories/DpidRegistry__factory.ts @@ -426,7 +426,7 @@ const _abi = [ ]; const _bytecode = - "0x60806040523480156200001157600080fd5b50620000226200002860201b60201c565b620001d3565b600060019054906101000a900460ff16156200007b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000729062000127565b60405180910390fd5b60ff801660008054906101000a900460ff1660ff161015620000ed5760ff6000806101000a81548160ff021916908360ff1602179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860ff604051620000e4919062000149565b60405180910390a15b565b6000620000fe60278362000166565b91506200010b8262000184565b604082019050919050565b620001218162000177565b82525050565b600060208201905081810360008301526200014281620000ef565b9050919050565b600060208201905062000160600083018462000116565b92915050565b600082825260208201905092915050565b600060ff82169050919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320696e69746960008201527f616c697a696e6700000000000000000000000000000000000000000000000000602082015250565b61230880620001e36000396000f3fe6080604052600436106101145760003560e01c80638129fc1c116100a0578063ced72f8711610064578063ced72f871461037f578063cef25dbc146103aa578063cfb51928146103c6578063da4a984214610403578063f2fde38b1461043357610114565b80638129fc1c146102aa57806381e104ca146102c15780638da5cb5b146102ec578063a40a990b14610317578063ba51b14e1461034057610114565b80634b22d5d0116100e75780634b22d5d0146101c75780634fb6020e146102045780635cb316351461022d57806369fe0e2d1461026a578063715018a61461029357610114565b80631785b6771461011957806318ae19c21461013557806322b3cd4e146101725780633ccfd60b146101b0575b600080fd5b610133600480360381019061012e9190611889565b61045c565b005b34801561014157600080fd5b5061015c60048036038101906101579190611906565b6104d8565b6040516101699190611e0a565b60405180910390f35b34801561017e57600080fd5b5061019960048036038101906101949190611889565b610568565b6040516101a7929190611e25565b60405180910390f35b3480156101bc57600080fd5b506101c561060e565b005b3480156101d357600080fd5b506101ee60048036038101906101e99190611889565b61066c565b6040516101fb9190611bfb565b60405180910390f35b34801561021057600080fd5b5061022b60048036038101906102269190611983565b610845565b005b34801561023957600080fd5b50610254600480360381019061024f9190611906565b610857565b6040516102619190611bfb565b60405180910390f35b34801561027657600080fd5b50610291600480360381019061028c9190611983565b6108d8565b005b34801561029f57600080fd5b506102a86108ea565b005b3480156102b657600080fd5b506102bf6108fe565b005b3480156102cd57600080fd5b506102d6610cfa565b6040516102e39190611e0a565b60405180910390f35b3480156102f857600080fd5b50610301610d04565b60405161030e9190611be0565b60405180910390f35b34801561032357600080fd5b5061033e600480360381019061033991906118b2565b610d2e565b005b34801561034c57600080fd5b5061036760048036038101906103629190611889565b610e52565b60405161037693929190611c6f565b60405180910390f35b34801561038b57600080fd5b50610394610e9c565b6040516103a19190611e0a565b60405180910390f35b6103c460048036038101906103bf91906118b2565b610ea6565b005b3480156103d257600080fd5b506103ed60048036038101906103e89190611942565b610f41565b6040516103fa9190611c16565b60405180910390f35b61041d60048036038101906104189190611906565b610f6b565b60405161042a9190611e0a565b60405180910390f35b34801561043f57600080fd5b5061045a60048036038101906104559190611860565b611227565b005b6104d581600067ffffffffffffffff8111156104a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156104cf5781602001602082028036833780820191505090505b50610ea6565b50565b600082606560008581526020019081526020016000206000015414610532576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052990611d6a565b60405180910390fd5b60006065600085815260200190815260200160002090508060030160008481526020019081526020016000205491505092915050565b600080826065600085815260200190815260200160002060000154146105c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ba90611d6a565b60405180910390fd5b600060656000858152602001908152602001600020905080600401548160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169250925050915091565b6106166112ab565b6000610620610d04565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610668573d6000803e3d6000fd5b5050565b600080600090506000806040518060600160405280602781526020016122ac60279139905060005b602060ff1681101561082357600060f81b8682602081106106de577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561071257809250610823565b60005b825181101561080f57828181518110610757577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168783602081106107bd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156107fc5784806107f490611fcb565b95505061080f565b808061080790611fcb565b915050610715565b50808061081b90611fcb565b915050610694565b50818310156108385760009350505050610840565b600193505050505b919050565b61084d6112ab565b8060678190555050565b6000826065600085815260200190815260200160002060000154146108b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a890611d6a565b60405180910390fd5b60006065600085815260200190815260200160002090508060040154831091505092915050565b6108e06112ab565b8060668190555050565b6108f26112ab565b6108fc6000611329565b565b60008060019054906101000a900460ff1615905080801561092f5750600160008054906101000a900460ff1660ff16105b8061095c575061093e306113ef565b15801561095b5750600160008054906101000a900460ff1660ff16145b5b61099b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099290611d8a565b60405180910390fd5b60016000806101000a81548160ff021916908360ff16021790555080156109d8576001600060016101000a81548160ff0219169083151502179055505b6601c6bf526340006066819055506706f05b59d3b2000060678190555060008067ffffffffffffffff811115610a37577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610a655781602001602082028036833780820191505090505b509050610a73600082611412565b610a9d7f647069640000000000000000000000000000000000000000000000000000000082611412565b610ac77f646369746500000000000000000000000000000000000000000000000000000082611412565b610af17f646576000000000000000000000000000000000000000000000000000000000082611412565b610b1b7f737461676500000000000000000000000000000000000000000000000000000082611412565b610b457f626574610000000000000000000000000000000000000000000000000000000082611412565b610b6f7f646573636900000000000000000000000000000000000000000000000000000082611412565b610b997f6e6f64650000000000000000000000000000000000000000000000000000000082611412565b610bc37f6e6f64657300000000000000000000000000000000000000000000000000000082611412565b610bed7f646f69000000000000000000000000000000000000000000000000000000000082611412565b610c177f610000000000000000000000000000000000000000000000000000000000000082611412565b610c417f640000000000000000000000000000000000000000000000000000000000000082611412565b610c6b7f780000000000000000000000000000000000000000000000000000000000000082611412565b610c957f7a0000000000000000000000000000000000000000000000000000000000000082611412565b610c9d6115a5565b508015610cf75760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024986001604051610cee9190611ccf565b60405180910390a15b50565b6000606754905090565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b81610d376115fe565b73ffffffffffffffffffffffffffffffffffffffff166065600083815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd190611d4a565b60405180910390fd5b600060656000858152602001908152602001600020905082816002019080519060200190610e09929190611667565b507f2f78800ab5b47f6617eaf3124043ced0ee3ae49c0b4a77167ee4cd2fbc674f0484610e346115fe565b85604051610e4493929190611c31565b60405180910390a150505050565b60656020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040154905083565b6000606654905090565b606754341015610eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee290611dea565b60405180910390fd5b610ef48261066c565b610f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2a90611d6a565b60405180910390fd5b610f3d8282611412565b5050565b600080829050600081511415610f5d576000801b915050610f66565b60208301519150505b919050565b6000606654341015610fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa990611dea565b60405180910390fd5b8260656000858152602001908152602001600020600001541461100a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100190611d6a565b60405180910390fd5b60006065600085815260200190815260200160002090506000816002018054905011156111a6576000816002018054905090506000805b82811015611162576000846002018281548110611087577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a082316110da6115fe565b6040518263ffffffff1660e01b81526004016110f69190611be0565b60206040518083038186803b15801561110e57600080fd5b505afa158015611122573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114691906119ac565b1115611156576001925050611162565b81600101915050611041565b50806111a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119a90611d2a565b60405180910390fd5b50505b60008160040154905083826003016000838152602001908152602001600020819055507fd5fa0e9a716b3ec4895a48223ad309e2d3fa5e27f04d8dc9b3c33cc738a50eb085826040516111fa929190611ca6565b60405180910390a181600401600081548092919061121790611fcb565b9190505550809250505092915050565b61122f6112ab565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561129f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129690611d0a565b60405180910390fd5b6112a881611329565b50565b6112b36115fe565b73ffffffffffffffffffffffffffffffffffffffff166112d1610d04565b73ffffffffffffffffffffffffffffffffffffffff1614611327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131e90611daa565b60405180910390fd5b565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000801b606560008481526020019081526020016000206000015414801561149c5750600073ffffffffffffffffffffffffffffffffffffffff166065600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b6114db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d290611cea565b60405180910390fd5b60006065600084815260200190815260200160002090506114fa6115fe565b8160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508281600001819055508181600201908051906020019061155d929190611667565b507f1603286ac6b9f753cbc1a1d33146ab15a401314d80d8553aa8fb1473df47f3ec836115886115fe565b8460405161159893929190611c31565b60405180910390a1505050565b600060019054906101000a900460ff166115f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115eb90611dca565b60405180910390fd5b6115fc611606565b565b600033905090565b600060019054906101000a900460ff16611655576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164c90611dca565b60405180910390fd5b6116656116606115fe565b611329565b565b8280548282559060005260206000209081019282156116e0579160200282015b828111156116df5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190611687565b5b5090506116ed91906116f1565b5090565b5b8082111561170a5760008160009055506001016116f2565b5090565b600061172161171c84611e73565b611e4e565b9050808382526020820190508285602086028201111561174057600080fd5b60005b85811015611770578161175688826117b8565b845260208401935060208301925050600181019050611743565b5050509392505050565b600061178d61178884611e9f565b611e4e565b9050828152602081018484840111156117a557600080fd5b6117b0848285611f8b565b509392505050565b6000813590506117c781612266565b92915050565b600082601f8301126117de57600080fd5b81356117ee84826020860161170e565b91505092915050565b6000813590506118068161227d565b92915050565b600082601f83011261181d57600080fd5b813561182d84826020860161177a565b91505092915050565b60008135905061184581612294565b92915050565b60008151905061185a81612294565b92915050565b60006020828403121561187257600080fd5b6000611880848285016117b8565b91505092915050565b60006020828403121561189b57600080fd5b60006118a9848285016117f7565b91505092915050565b600080604083850312156118c557600080fd5b60006118d3858286016117f7565b925050602083013567ffffffffffffffff8111156118f057600080fd5b6118fc858286016117cd565b9150509250929050565b6000806040838503121561191957600080fd5b6000611927858286016117f7565b925050602061193885828601611836565b9150509250929050565b60006020828403121561195457600080fd5b600082013567ffffffffffffffff81111561196e57600080fd5b61197a8482850161180c565b91505092915050565b60006020828403121561199557600080fd5b60006119a384828501611836565b91505092915050565b6000602082840312156119be57600080fd5b60006119cc8482850161184b565b91505092915050565b60006119e183836119ed565b60208301905092915050565b6119f681611f1a565b82525050565b611a0581611f1a565b82525050565b6000611a1682611ee0565b611a208185611ef8565b9350611a2b83611ed0565b8060005b83811015611a5c578151611a4388826119d5565b9750611a4e83611eeb565b925050600181019050611a2f565b5085935050505092915050565b611a7281611f2c565b82525050565b611a8181611f38565b82525050565b611a9081611f79565b82525050565b6000611aa3600c83611f09565b9150611aae82612083565b602082019050919050565b6000611ac6602683611f09565b9150611ad1826120ac565b604082019050919050565b6000611ae9601883611f09565b9150611af4826120fb565b602082019050919050565b6000611b0c601283611f09565b9150611b1782612124565b602082019050919050565b6000611b2f600e83611f09565b9150611b3a8261214d565b602082019050919050565b6000611b52602e83611f09565b9150611b5d82612176565b604082019050919050565b6000611b75602083611f09565b9150611b80826121c5565b602082019050919050565b6000611b98602b83611f09565b9150611ba3826121ee565b604082019050919050565b6000611bbb600c83611f09565b9150611bc68261223d565b602082019050919050565b611bda81611f62565b82525050565b6000602082019050611bf560008301846119fc565b92915050565b6000602082019050611c106000830184611a69565b92915050565b6000602082019050611c2b6000830184611a78565b92915050565b6000606082019050611c466000830186611a78565b611c5360208301856119fc565b8181036040830152611c658184611a0b565b9050949350505050565b6000606082019050611c846000830186611a78565b611c9160208301856119fc565b611c9e6040830184611bd1565b949350505050565b6000604082019050611cbb6000830185611a78565b611cc86020830184611bd1565b9392505050565b6000602082019050611ce46000830184611a87565b92915050565b60006020820190508181036000830152611d0381611a96565b9050919050565b60006020820190508181036000830152611d2381611ab9565b9050919050565b60006020820190508181036000830152611d4381611adc565b9050919050565b60006020820190508181036000830152611d6381611aff565b9050919050565b60006020820190508181036000830152611d8381611b22565b9050919050565b60006020820190508181036000830152611da381611b45565b9050919050565b60006020820190508181036000830152611dc381611b68565b9050919050565b60006020820190508181036000830152611de381611b8b565b9050919050565b60006020820190508181036000830152611e0381611bae565b9050919050565b6000602082019050611e1f6000830184611bd1565b92915050565b6000604082019050611e3a6000830185611bd1565b611e4760208301846119fc565b9392505050565b6000611e58611e69565b9050611e648282611f9a565b919050565b6000604051905090565b600067ffffffffffffffff821115611e8e57611e8d612043565b5b602082029050602081019050919050565b600067ffffffffffffffff821115611eba57611eb9612043565b5b611ec382612072565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000611f2582611f42565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000611f8482611f6c565b9050919050565b82818337600083830152505050565b611fa382612072565b810181811067ffffffffffffffff82111715611fc257611fc1612043565b5b80604052505050565b6000611fd682611f62565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561200957612008612014565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f5072656669782074616b656e0000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f556e617574686f72697a65643a20546f6b656e20676174650000000000000000600082015250565b7f4f6e6c79206f776e657220757064617465730000000000000000000000000000600082015250565b7f496e76616c696420707265666978000000000000000000000000000000000000600082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b7f4665652072657175697265640000000000000000000000000000000000000000600082015250565b61226f81611f1a565b811461227a57600080fd5b50565b61228681611f38565b811461229157600080fd5b50565b61229d81611f62565b81146122a857600080fd5b5056fe6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f2ea2646970667358221220540d3c6aee462c68f946c96febe6f10b56a69559b7785d8a25414bd10c68f16264736f6c63430008040033"; + "0x60806040523480156200001157600080fd5b50620000226200002860201b60201c565b620001d3565b600060019054906101000a900460ff16156200007b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000729062000127565b60405180910390fd5b60ff801660008054906101000a900460ff1660ff161015620000ed5760ff6000806101000a81548160ff021916908360ff1602179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860ff604051620000e4919062000149565b60405180910390a15b565b6000620000fe60278362000166565b91506200010b8262000184565b604082019050919050565b620001218162000177565b82525050565b600060208201905081810360008301526200014281620000ef565b9050919050565b600060208201905062000160600083018462000116565b92915050565b600082825260208201905092915050565b600060ff82169050919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320696e69746960008201527f616c697a696e6700000000000000000000000000000000000000000000000000602082015250565b61230880620001e36000396000f3fe6080604052600436106101145760003560e01c80638129fc1c116100a0578063ced72f8711610064578063ced72f871461037f578063cef25dbc146103aa578063cfb51928146103c6578063da4a984214610403578063f2fde38b1461043357610114565b80638129fc1c146102aa57806381e104ca146102c15780638da5cb5b146102ec578063a40a990b14610317578063ba51b14e1461034057610114565b80634b22d5d0116100e75780634b22d5d0146101c75780634fb6020e146102045780635cb316351461022d57806369fe0e2d1461026a578063715018a61461029357610114565b80631785b6771461011957806318ae19c21461013557806322b3cd4e146101725780633ccfd60b146101b0575b600080fd5b610133600480360381019061012e9190611889565b61045c565b005b34801561014157600080fd5b5061015c60048036038101906101579190611906565b6104d8565b6040516101699190611e0a565b60405180910390f35b34801561017e57600080fd5b5061019960048036038101906101949190611889565b610568565b6040516101a7929190611e25565b60405180910390f35b3480156101bc57600080fd5b506101c561060e565b005b3480156101d357600080fd5b506101ee60048036038101906101e99190611889565b61066c565b6040516101fb9190611bfb565b60405180910390f35b34801561021057600080fd5b5061022b60048036038101906102269190611983565b610845565b005b34801561023957600080fd5b50610254600480360381019061024f9190611906565b610857565b6040516102619190611bfb565b60405180910390f35b34801561027657600080fd5b50610291600480360381019061028c9190611983565b6108d8565b005b34801561029f57600080fd5b506102a86108ea565b005b3480156102b657600080fd5b506102bf6108fe565b005b3480156102cd57600080fd5b506102d6610cfa565b6040516102e39190611e0a565b60405180910390f35b3480156102f857600080fd5b50610301610d04565b60405161030e9190611be0565b60405180910390f35b34801561032357600080fd5b5061033e600480360381019061033991906118b2565b610d2e565b005b34801561034c57600080fd5b5061036760048036038101906103629190611889565b610e52565b60405161037693929190611c6f565b60405180910390f35b34801561038b57600080fd5b50610394610e9c565b6040516103a19190611e0a565b60405180910390f35b6103c460048036038101906103bf91906118b2565b610ea6565b005b3480156103d257600080fd5b506103ed60048036038101906103e89190611942565b610f41565b6040516103fa9190611c16565b60405180910390f35b61041d60048036038101906104189190611906565b610f6b565b60405161042a9190611e0a565b60405180910390f35b34801561043f57600080fd5b5061045a60048036038101906104559190611860565b611227565b005b6104d581600067ffffffffffffffff8111156104a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156104cf5781602001602082028036833780820191505090505b50610ea6565b50565b600082606560008581526020019081526020016000206000015414610532576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052990611d6a565b60405180910390fd5b60006065600085815260200190815260200160002090508060030160008481526020019081526020016000205491505092915050565b600080826065600085815260200190815260200160002060000154146105c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ba90611d6a565b60405180910390fd5b600060656000858152602001908152602001600020905080600401548160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169250925050915091565b6106166112ab565b6000610620610d04565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610668573d6000803e3d6000fd5b5050565b600080600090506000806040518060600160405280602781526020016122ac60279139905060005b602060ff1681101561082357600060f81b8682602081106106de577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561071257809250610823565b60005b825181101561080f57828181518110610757577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168783602081106107bd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156107fc5784806107f490611fcb565b95505061080f565b808061080790611fcb565b915050610715565b50808061081b90611fcb565b915050610694565b50818310156108385760009350505050610840565b600193505050505b919050565b61084d6112ab565b8060678190555050565b6000826065600085815260200190815260200160002060000154146108b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a890611d6a565b60405180910390fd5b60006065600085815260200190815260200160002090508060040154831091505092915050565b6108e06112ab565b8060668190555050565b6108f26112ab565b6108fc6000611329565b565b60008060019054906101000a900460ff1615905080801561092f5750600160008054906101000a900460ff1660ff16105b8061095c575061093e306113ef565b15801561095b5750600160008054906101000a900460ff1660ff16145b5b61099b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099290611d8a565b60405180910390fd5b60016000806101000a81548160ff021916908360ff16021790555080156109d8576001600060016101000a81548160ff0219169083151502179055505b6601c6bf526340006066819055506706f05b59d3b2000060678190555060008067ffffffffffffffff811115610a37577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610a655781602001602082028036833780820191505090505b509050610a73600082611412565b610a9d7f647069640000000000000000000000000000000000000000000000000000000082611412565b610ac77f646369746500000000000000000000000000000000000000000000000000000082611412565b610af17f646576000000000000000000000000000000000000000000000000000000000082611412565b610b1b7f737461676500000000000000000000000000000000000000000000000000000082611412565b610b457f626574610000000000000000000000000000000000000000000000000000000082611412565b610b6f7f646573636900000000000000000000000000000000000000000000000000000082611412565b610b997f6e6f64650000000000000000000000000000000000000000000000000000000082611412565b610bc37f6e6f64657300000000000000000000000000000000000000000000000000000082611412565b610bed7f646f69000000000000000000000000000000000000000000000000000000000082611412565b610c177f610000000000000000000000000000000000000000000000000000000000000082611412565b610c417f640000000000000000000000000000000000000000000000000000000000000082611412565b610c6b7f780000000000000000000000000000000000000000000000000000000000000082611412565b610c957f7a0000000000000000000000000000000000000000000000000000000000000082611412565b610c9d6115a5565b508015610cf75760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024986001604051610cee9190611ccf565b60405180910390a15b50565b6000606754905090565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b81610d376115fe565b73ffffffffffffffffffffffffffffffffffffffff166065600083815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd190611d4a565b60405180910390fd5b600060656000858152602001908152602001600020905082816002019080519060200190610e09929190611667565b507f2f78800ab5b47f6617eaf3124043ced0ee3ae49c0b4a77167ee4cd2fbc674f0484610e346115fe565b85604051610e4493929190611c31565b60405180910390a150505050565b60656020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040154905083565b6000606654905090565b606754341015610eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee290611dea565b60405180910390fd5b610ef48261066c565b610f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2a90611d6a565b60405180910390fd5b610f3d8282611412565b5050565b600080829050600081511415610f5d576000801b915050610f66565b60208301519150505b919050565b6000606654341015610fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa990611dea565b60405180910390fd5b8260656000858152602001908152602001600020600001541461100a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100190611d6a565b60405180910390fd5b60006065600085815260200190815260200160002090506000816002018054905011156111a6576000816002018054905090506000805b82811015611162576000846002018281548110611087577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a082316110da6115fe565b6040518263ffffffff1660e01b81526004016110f69190611be0565b60206040518083038186803b15801561110e57600080fd5b505afa158015611122573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114691906119ac565b1115611156576001925050611162565b81600101915050611041565b50806111a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119a90611d2a565b60405180910390fd5b50505b60008160040154905083826003016000838152602001908152602001600020819055507fd5fa0e9a716b3ec4895a48223ad309e2d3fa5e27f04d8dc9b3c33cc738a50eb085826040516111fa929190611ca6565b60405180910390a181600401600081548092919061121790611fcb565b9190505550809250505092915050565b61122f6112ab565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561129f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129690611d0a565b60405180910390fd5b6112a881611329565b50565b6112b36115fe565b73ffffffffffffffffffffffffffffffffffffffff166112d1610d04565b73ffffffffffffffffffffffffffffffffffffffff1614611327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131e90611daa565b60405180910390fd5b565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000801b606560008481526020019081526020016000206000015414801561149c5750600073ffffffffffffffffffffffffffffffffffffffff166065600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b6114db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d290611cea565b60405180910390fd5b60006065600084815260200190815260200160002090506114fa6115fe565b8160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508281600001819055508181600201908051906020019061155d929190611667565b507f1603286ac6b9f753cbc1a1d33146ab15a401314d80d8553aa8fb1473df47f3ec836115886115fe565b8460405161159893929190611c31565b60405180910390a1505050565b600060019054906101000a900460ff166115f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115eb90611dca565b60405180910390fd5b6115fc611606565b565b600033905090565b600060019054906101000a900460ff16611655576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164c90611dca565b60405180910390fd5b6116656116606115fe565b611329565b565b8280548282559060005260206000209081019282156116e0579160200282015b828111156116df5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190611687565b5b5090506116ed91906116f1565b5090565b5b8082111561170a5760008160009055506001016116f2565b5090565b600061172161171c84611e73565b611e4e565b9050808382526020820190508285602086028201111561174057600080fd5b60005b85811015611770578161175688826117b8565b845260208401935060208301925050600181019050611743565b5050509392505050565b600061178d61178884611e9f565b611e4e565b9050828152602081018484840111156117a557600080fd5b6117b0848285611f8b565b509392505050565b6000813590506117c781612266565b92915050565b600082601f8301126117de57600080fd5b81356117ee84826020860161170e565b91505092915050565b6000813590506118068161227d565b92915050565b600082601f83011261181d57600080fd5b813561182d84826020860161177a565b91505092915050565b60008135905061184581612294565b92915050565b60008151905061185a81612294565b92915050565b60006020828403121561187257600080fd5b6000611880848285016117b8565b91505092915050565b60006020828403121561189b57600080fd5b60006118a9848285016117f7565b91505092915050565b600080604083850312156118c557600080fd5b60006118d3858286016117f7565b925050602083013567ffffffffffffffff8111156118f057600080fd5b6118fc858286016117cd565b9150509250929050565b6000806040838503121561191957600080fd5b6000611927858286016117f7565b925050602061193885828601611836565b9150509250929050565b60006020828403121561195457600080fd5b600082013567ffffffffffffffff81111561196e57600080fd5b61197a8482850161180c565b91505092915050565b60006020828403121561199557600080fd5b60006119a384828501611836565b91505092915050565b6000602082840312156119be57600080fd5b60006119cc8482850161184b565b91505092915050565b60006119e183836119ed565b60208301905092915050565b6119f681611f1a565b82525050565b611a0581611f1a565b82525050565b6000611a1682611ee0565b611a208185611ef8565b9350611a2b83611ed0565b8060005b83811015611a5c578151611a4388826119d5565b9750611a4e83611eeb565b925050600181019050611a2f565b5085935050505092915050565b611a7281611f2c565b82525050565b611a8181611f38565b82525050565b611a9081611f79565b82525050565b6000611aa3600c83611f09565b9150611aae82612083565b602082019050919050565b6000611ac6602683611f09565b9150611ad1826120ac565b604082019050919050565b6000611ae9601883611f09565b9150611af4826120fb565b602082019050919050565b6000611b0c601283611f09565b9150611b1782612124565b602082019050919050565b6000611b2f600e83611f09565b9150611b3a8261214d565b602082019050919050565b6000611b52602e83611f09565b9150611b5d82612176565b604082019050919050565b6000611b75602083611f09565b9150611b80826121c5565b602082019050919050565b6000611b98602b83611f09565b9150611ba3826121ee565b604082019050919050565b6000611bbb600c83611f09565b9150611bc68261223d565b602082019050919050565b611bda81611f62565b82525050565b6000602082019050611bf560008301846119fc565b92915050565b6000602082019050611c106000830184611a69565b92915050565b6000602082019050611c2b6000830184611a78565b92915050565b6000606082019050611c466000830186611a78565b611c5360208301856119fc565b8181036040830152611c658184611a0b565b9050949350505050565b6000606082019050611c846000830186611a78565b611c9160208301856119fc565b611c9e6040830184611bd1565b949350505050565b6000604082019050611cbb6000830185611a78565b611cc86020830184611bd1565b9392505050565b6000602082019050611ce46000830184611a87565b92915050565b60006020820190508181036000830152611d0381611a96565b9050919050565b60006020820190508181036000830152611d2381611ab9565b9050919050565b60006020820190508181036000830152611d4381611adc565b9050919050565b60006020820190508181036000830152611d6381611aff565b9050919050565b60006020820190508181036000830152611d8381611b22565b9050919050565b60006020820190508181036000830152611da381611b45565b9050919050565b60006020820190508181036000830152611dc381611b68565b9050919050565b60006020820190508181036000830152611de381611b8b565b9050919050565b60006020820190508181036000830152611e0381611bae565b9050919050565b6000602082019050611e1f6000830184611bd1565b92915050565b6000604082019050611e3a6000830185611bd1565b611e4760208301846119fc565b9392505050565b6000611e58611e69565b9050611e648282611f9a565b919050565b6000604051905090565b600067ffffffffffffffff821115611e8e57611e8d612043565b5b602082029050602081019050919050565b600067ffffffffffffffff821115611eba57611eb9612043565b5b611ec382612072565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000611f2582611f42565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000611f8482611f6c565b9050919050565b82818337600083830152505050565b611fa382612072565b810181811067ffffffffffffffff82111715611fc257611fc1612043565b5b80604052505050565b6000611fd682611f62565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561200957612008612014565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f5072656669782074616b656e0000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f556e617574686f72697a65643a20546f6b656e20676174650000000000000000600082015250565b7f4f6e6c79206f776e657220757064617465730000000000000000000000000000600082015250565b7f496e76616c696420707265666978000000000000000000000000000000000000600082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b7f4665652072657175697265640000000000000000000000000000000000000000600082015250565b61226f81611f1a565b811461227a57600080fd5b50565b61228681611f38565b811461229157600080fd5b50565b61229d81611f62565b81146122a857600080fd5b5056fe6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f2ea2646970667358221220b8cac9a8d8f3de013face3e7fec9a14f0a1e3f3d09fe342a5252c76f07a42da364736f6c63430008040033"; type DpidRegistryConstructorParams = | [signer?: Signer] diff --git a/desci-contracts/yarn.lock b/desci-contracts/yarn.lock index be130812b..1c9bee75f 100644 --- a/desci-contracts/yarn.lock +++ b/desci-contracts/yarn.lock @@ -23,12 +23,41 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/runtime@^7.9.2": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.19.0.tgz#22b11c037b094d27a8a2504ea4dcff00f50e2259" - integrity sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA== +"@chainsafe/as-sha256@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz#3639df0e1435cab03f4d9870cc3ac079e57a6fc9" + integrity sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg== + +"@chainsafe/persistent-merkle-tree@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz#4c9ee80cc57cd3be7208d98c40014ad38f36f7ff" + integrity sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + +"@chainsafe/persistent-merkle-tree@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz#2b4a62c9489a5739dedd197250d8d2f5427e9f63" + integrity sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + +"@chainsafe/ssz@^0.10.0": + version "0.10.2" + resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.10.2.tgz#c782929e1bb25fec66ba72e75934b31fd087579e" + integrity sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + "@chainsafe/persistent-merkle-tree" "^0.5.0" + +"@chainsafe/ssz@^0.9.2": + version "0.9.4" + resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.9.4.tgz#696a8db46d6975b600f8309ad3a12f7c0e310497" + integrity sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ== dependencies: - regenerator-runtime "^0.13.4" + "@chainsafe/as-sha256" "^0.3.1" + "@chainsafe/persistent-merkle-tree" "^0.4.2" + case "^1.6.3" "@cspotcode/source-map-consumer@0.8.0": version "0.8.0" @@ -42,6 +71,13 @@ dependencies: "@cspotcode/source-map-consumer" "0.8.0" +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + "@ensdomains/ens@^0.4.4": version "0.4.5" resolved "https://registry.yarnpkg.com/@ensdomains/ens/-/ens-0.4.5.tgz#e0aebc005afdc066447c6e22feb4eda89a5edbfc" @@ -111,75 +147,6 @@ patch-package "^6.2.2" postinstall-postinstall "^2.1.0" -"@ethereumjs/block@^3.5.0", "@ethereumjs/block@^3.6.0", "@ethereumjs/block@^3.6.1": - version "3.6.1" - resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.6.1.tgz#50574d3e993ae247dcfe2abbdb91d2a4a22accb9" - integrity sha512-o5d/zpGl4SdVfdTfrsq9ZgYMXddc0ucKMiFW5OphBCX+ep4xzYnSjboFcZXT2V/tcSBr84VrKWWp21CGVb3DGw== - dependencies: - "@ethereumjs/common" "^2.6.1" - "@ethereumjs/tx" "^3.5.0" - ethereumjs-util "^7.1.4" - merkle-patricia-tree "^4.2.3" - -"@ethereumjs/blockchain@^5.5.0", "@ethereumjs/blockchain@^5.5.1": - version "5.5.1" - resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.5.1.tgz#60f1f50592c06cc47e1704800b88b7d32f609742" - integrity sha512-JS2jeKxl3tlaa5oXrZ8mGoVBCz6YqsGG350XVNtHAtNZXKk7pU3rH4xzF2ru42fksMMqzFLzKh9l4EQzmNWDqA== - dependencies: - "@ethereumjs/block" "^3.6.0" - "@ethereumjs/common" "^2.6.0" - "@ethereumjs/ethash" "^1.1.0" - debug "^2.2.0" - ethereumjs-util "^7.1.3" - level-mem "^5.0.1" - lru-cache "^5.1.1" - semaphore-async-await "^1.5.1" - -"@ethereumjs/common@^2.6.0", "@ethereumjs/common@^2.6.1", "@ethereumjs/common@^2.6.2": - version "2.6.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.2.tgz#eb006c9329c75c80f634f340dc1719a5258244df" - integrity sha512-vDwye5v0SVeuDky4MtKsu+ogkH2oFUV8pBKzH/eNBzT8oI91pKa8WyzDuYuxOQsgNgv5R34LfFDh2aaw3H4HbQ== - dependencies: - crc-32 "^1.2.0" - ethereumjs-util "^7.1.4" - -"@ethereumjs/ethash@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/ethash/-/ethash-1.1.0.tgz#7c5918ffcaa9cb9c1dc7d12f77ef038c11fb83fb" - integrity sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA== - dependencies: - "@ethereumjs/block" "^3.5.0" - "@types/levelup" "^4.3.0" - buffer-xor "^2.0.1" - ethereumjs-util "^7.1.1" - miller-rabin "^4.0.0" - -"@ethereumjs/tx@^3.4.0", "@ethereumjs/tx@^3.5.0": - version "3.5.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.0.tgz#783b0aeb08518b9991b23f5155763bbaf930a037" - integrity sha512-/+ZNbnJhQhXC83Xuvy6I9k4jT5sXiV0tMR9C+AzSSpcCV64+NB8dTE1m3x98RYMqb8+TLYWA+HML4F5lfXTlJw== - dependencies: - "@ethereumjs/common" "^2.6.1" - ethereumjs-util "^7.1.4" - -"@ethereumjs/vm@^5.6.0": - version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.7.1.tgz#3bf757fbad0081838ccb4f22003cd73319ab3616" - integrity sha512-NiFm5FMaeDGZ9ojBL+Y9Y/xhW6S4Fgez+zPBM402T5kLsfeAR9mrRVckYhvkGVJ6FMwsY820CLjYP5OVwMjLTg== - dependencies: - "@ethereumjs/block" "^3.6.1" - "@ethereumjs/blockchain" "^5.5.1" - "@ethereumjs/common" "^2.6.2" - "@ethereumjs/tx" "^3.5.0" - async-eventemitter "^0.2.4" - core-js-pure "^3.0.1" - debug "^4.3.3" - ethereumjs-util "^7.1.4" - functional-red-black-tree "^1.0.1" - mcl-wasm "^0.7.1" - merkle-patricia-tree "^4.2.3" - rustbn.js "~0.2.0" - "@ethersproject/abi@5.0.0-beta.153": version "5.0.0-beta.153" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz#43a37172b33794e4562999f6e2d555b7599a8eee" @@ -225,6 +192,21 @@ "@ethersproject/properties" "^5.5.0" "@ethersproject/strings" "^5.5.0" +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/abstract-provider@5.5.1", "@ethersproject/abstract-provider@^5.5.0": version "5.5.1" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.5.1.tgz#2f1f6e8a3ab7d378d8ad0b5718460f85649710c5" @@ -238,7 +220,7 @@ "@ethersproject/transactions" "^5.5.0" "@ethersproject/web" "^5.5.0" -"@ethersproject/abstract-provider@^5.7.0": +"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== @@ -262,7 +244,7 @@ "@ethersproject/logger" "^5.5.0" "@ethersproject/properties" "^5.5.0" -"@ethersproject/abstract-signer@^5.7.0": +"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== @@ -284,7 +266,7 @@ "@ethersproject/logger" "^5.5.0" "@ethersproject/rlp" "^5.5.0" -"@ethersproject/address@^5.0.4", "@ethersproject/address@^5.7.0": +"@ethersproject/address@5.7.0", "@ethersproject/address@^5.0.4", "@ethersproject/address@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== @@ -302,7 +284,7 @@ dependencies: "@ethersproject/bytes" "^5.5.0" -"@ethersproject/base64@^5.7.0": +"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== @@ -317,6 +299,14 @@ "@ethersproject/bytes" "^5.5.0" "@ethersproject/properties" "^5.5.0" +"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" + integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/bignumber@5.5.0", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.3.0", "@ethersproject/bignumber@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.5.0.tgz#875b143f04a216f4f8b96245bde942d42d279527" @@ -326,7 +316,7 @@ "@ethersproject/logger" "^5.5.0" bn.js "^4.11.9" -"@ethersproject/bignumber@^5.0.7", "@ethersproject/bignumber@^5.7.0": +"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.0.7", "@ethersproject/bignumber@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== @@ -342,7 +332,7 @@ dependencies: "@ethersproject/logger" "^5.5.0" -"@ethersproject/bytes@^5.0.4", "@ethersproject/bytes@^5.7.0": +"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.0.4", "@ethersproject/bytes@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== @@ -356,7 +346,7 @@ dependencies: "@ethersproject/bignumber" "^5.5.0" -"@ethersproject/constants@^5.0.4", "@ethersproject/constants@^5.7.0": +"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.0.4", "@ethersproject/constants@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== @@ -379,6 +369,22 @@ "@ethersproject/properties" "^5.5.0" "@ethersproject/transactions" "^5.5.0" +"@ethersproject/contracts@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" + integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== + dependencies: + "@ethersproject/abi" "^5.7.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/hash@5.5.0", "@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.5.0.tgz#7cee76d08f88d1873574c849e0207dcb32380cc9" @@ -393,7 +399,7 @@ "@ethersproject/properties" "^5.5.0" "@ethersproject/strings" "^5.5.0" -"@ethersproject/hash@^5.0.4": +"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.0.4", "@ethersproject/hash@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== @@ -426,6 +432,24 @@ "@ethersproject/transactions" "^5.5.0" "@ethersproject/wordlists" "^5.5.0" +"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" + integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + "@ethersproject/json-wallets@5.5.0", "@ethersproject/json-wallets@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.5.0.tgz#dd522d4297e15bccc8e1427d247ec8376b60e325" @@ -445,6 +469,25 @@ aes-js "3.0.0" scrypt-js "3.0.1" +"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" + integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + aes-js "3.0.0" + scrypt-js "3.0.1" + "@ethersproject/keccak256@5.5.0", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.5.0.tgz#e4b1f9d7701da87c564ffe336f86dcee82983492" @@ -453,7 +496,7 @@ "@ethersproject/bytes" "^5.5.0" js-sha3 "0.8.0" -"@ethersproject/keccak256@^5.0.3", "@ethersproject/keccak256@^5.7.0": +"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.0.3", "@ethersproject/keccak256@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== @@ -466,7 +509,7 @@ resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.5.0.tgz#0c2caebeff98e10aefa5aef27d7441c7fd18cf5d" integrity sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg== -"@ethersproject/logger@^5.0.5", "@ethersproject/logger@^5.7.0": +"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.0.5", "@ethersproject/logger@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== @@ -478,6 +521,13 @@ dependencies: "@ethersproject/logger" "^5.5.0" +"@ethersproject/networks@5.7.1": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== + dependencies: + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.0.tgz#df72a392f1a63a57f87210515695a31a245845ad" @@ -493,6 +543,14 @@ "@ethersproject/bytes" "^5.5.0" "@ethersproject/sha2" "^5.5.0" +"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" + integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/properties@5.5.0", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.5.0.tgz#61f00f2bb83376d2071baab02245f92070c59995" @@ -500,7 +558,7 @@ dependencies: "@ethersproject/logger" "^5.5.0" -"@ethersproject/properties@^5.0.3", "@ethersproject/properties@^5.7.0": +"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.0.3", "@ethersproject/properties@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== @@ -532,6 +590,32 @@ bech32 "1.1.4" ws "7.4.6" +"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.1", "@ethersproject/providers@^5.7.2": + version "5.7.2" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + bech32 "1.1.4" + ws "7.4.6" + "@ethersproject/random@5.5.1", "@ethersproject/random@^5.5.0": version "5.5.1" resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.5.1.tgz#7cdf38ea93dc0b1ed1d8e480ccdaf3535c555415" @@ -540,6 +624,14 @@ "@ethersproject/bytes" "^5.5.0" "@ethersproject/logger" "^5.5.0" +"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" + integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp@5.5.0", "@ethersproject/rlp@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.5.0.tgz#530f4f608f9ca9d4f89c24ab95db58ab56ab99a0" @@ -548,7 +640,7 @@ "@ethersproject/bytes" "^5.5.0" "@ethersproject/logger" "^5.5.0" -"@ethersproject/rlp@^5.7.0": +"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== @@ -565,6 +657,15 @@ "@ethersproject/logger" "^5.5.0" hash.js "1.1.7" +"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" + integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + hash.js "1.1.7" + "@ethersproject/signing-key@5.5.0", "@ethersproject/signing-key@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.5.0.tgz#2aa37169ce7e01e3e80f2c14325f624c29cedbe0" @@ -577,7 +678,7 @@ elliptic "6.5.4" hash.js "1.1.7" -"@ethersproject/signing-key@^5.7.0": +"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== @@ -601,6 +702,18 @@ "@ethersproject/sha2" "^5.5.0" "@ethersproject/strings" "^5.5.0" +"@ethersproject/solidity@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" + integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/strings@5.5.0", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.5.0.tgz#e6784d00ec6c57710755699003bc747e98c5d549" @@ -610,7 +723,7 @@ "@ethersproject/constants" "^5.5.0" "@ethersproject/logger" "^5.5.0" -"@ethersproject/strings@^5.0.4", "@ethersproject/strings@^5.7.0": +"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.0.4", "@ethersproject/strings@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== @@ -634,7 +747,7 @@ "@ethersproject/rlp" "^5.5.0" "@ethersproject/signing-key" "^5.5.0" -"@ethersproject/transactions@^5.7.0": +"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== @@ -658,6 +771,15 @@ "@ethersproject/constants" "^5.5.0" "@ethersproject/logger" "^5.5.0" +"@ethersproject/units@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" + integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/wallet@5.5.0", "@ethersproject/wallet@^5.3.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.5.0.tgz#322a10527a440ece593980dca6182f17d54eae75" @@ -679,6 +801,27 @@ "@ethersproject/transactions" "^5.5.0" "@ethersproject/wordlists" "^5.5.0" +"@ethersproject/wallet@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" + integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/json-wallets" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + "@ethersproject/web@5.5.1", "@ethersproject/web@^5.5.0": version "5.5.1" resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.5.1.tgz#cfcc4a074a6936c657878ac58917a61341681316" @@ -690,6 +833,17 @@ "@ethersproject/properties" "^5.5.0" "@ethersproject/strings" "^5.5.0" +"@ethersproject/web@5.7.1": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== + dependencies: + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/web@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.0.tgz#40850c05260edad8b54827923bbad23d96aac0bc" @@ -712,44 +866,114 @@ "@ethersproject/properties" "^5.5.0" "@ethersproject/strings" "^5.5.0" -"@graphprotocol/graph-cli@^0.30.2": - version "0.30.4" - resolved "https://registry.yarnpkg.com/@graphprotocol/graph-cli/-/graph-cli-0.30.4.tgz#c1b353eb3362450259b78acc9f969e67c9f55858" - integrity sha512-BZNnkSJBgGIVvSx/cxlep1ytKhvGM1ZUZU/73Lu4yH+lpGQN3UtKjlUzcasHqPEwqyp47OifMHlHxDBm4+CVoQ== +"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" + integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== dependencies: - assemblyscript "0.19.10" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@fastify/busboy@^2.0.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.0.tgz#0709e9f4cb252351c609c6e6d8d6779a8d25edff" + integrity sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA== + +"@float-capital/float-subgraph-uncrashable@^0.0.0-alpha.4": + version "0.0.0-internal-testing.5" + resolved "https://registry.yarnpkg.com/@float-capital/float-subgraph-uncrashable/-/float-subgraph-uncrashable-0.0.0-internal-testing.5.tgz#060f98440f6e410812766c5b040952d2d02e2b73" + integrity sha512-yZ0H5e3EpAYKokX/AbtplzlvSxEJY7ZfpvQyDzyODkks0hakAAlDG6fQu1SlDJMWorY7bbq1j7fCiFeTWci6TA== + dependencies: + "@rescript/std" "9.0.0" + graphql "^16.6.0" + graphql-import-node "^0.0.5" + js-yaml "^4.1.0" + +"@graphprotocol/graph-cli@^0.59.0": + version "0.59.0" + resolved "https://registry.yarnpkg.com/@graphprotocol/graph-cli/-/graph-cli-0.59.0.tgz#ff5b899204a22f984f97bcc92d8a092b81dcdb0d" + integrity sha512-uddsyUootdhQgMqQXkrD0INn/nNkQB+3t5luRzjY0pxA4O9hidXjYZNScjvSgf3eiaN0rcEs/s56qa/dsy4LwA== + dependencies: + "@float-capital/float-subgraph-uncrashable" "^0.0.0-alpha.4" + "@oclif/core" "2.8.6" + "@oclif/plugin-autocomplete" "^2.3.6" + "@oclif/plugin-not-found" "^2.4.0" + "@whatwg-node/fetch" "^0.8.4" + assemblyscript "0.19.23" binary-install-raw "0.0.13" chalk "3.0.0" - chokidar "3.5.1" - debug "4.1.1" - docker-compose "0.23.4" + chokidar "3.5.3" + debug "4.3.4" + docker-compose "0.23.19" dockerode "2.5.8" - fs-extra "9.0.0" - glob "7.1.6" - gluegun "https://github.com/edgeandnode/gluegun#v4.3.1-pin-colors-dep" + fs-extra "9.1.0" + glob "9.3.5" + gluegun "5.1.2" graphql "15.5.0" - immutable "3.8.2" - ipfs-http-client "34.0.0" - jayson "3.2.0" - js-yaml "3.13.1" - node-fetch "2.6.0" - pkginfo "0.4.1" + immutable "4.2.1" + ipfs-http-client "55.0.0" + jayson "4.0.0" + js-yaml "3.14.1" prettier "1.19.1" request "2.88.2" - semver "7.3.5" + semver "7.4.0" sync-request "6.1.0" - tmp-promise "3.0.2" + tmp-promise "3.0.3" web3-eth-abi "1.7.0" which "2.0.2" - yaml "1.9.2" + yaml "1.10.2" -"@graphprotocol/graph-ts@^0.27.0": - version "0.27.0" - resolved "https://registry.yarnpkg.com/@graphprotocol/graph-ts/-/graph-ts-0.27.0.tgz#948fe1716f6082964a01a63a19bcbf9ac44e06ff" - integrity sha512-r1SPDIZVQiGMxcY8rhFSM0y7d/xAbQf5vHMWUf59js1KgoyWpM6P3tczZqmQd7JTmeyNsDGIPzd9FeaxllsU4w== +"@graphprotocol/graph-ts@^0.32.0": + version "0.32.0" + resolved "https://registry.yarnpkg.com/@graphprotocol/graph-ts/-/graph-ts-0.32.0.tgz#36f8cd8e4ef42c3c32536cceb9995ab990f51d29" + integrity sha512-YfKLT2w+ItXD/VPYQiAKtINQONVsAOkcqVFMHlhUy0fcEBVWuFBT53hJNI0/l5ujQa4TSxtzrKW/7EABAdgI8g== dependencies: assemblyscript "0.19.10" +"@ipld/dag-cbor@^7.0.0": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@ipld/dag-cbor/-/dag-cbor-7.0.3.tgz#aa31b28afb11a807c3d627828a344e5521ac4a1e" + integrity sha512-1VVh2huHsuohdXC1bGJNE8WR72slZ9XE2T3wbBBq31dm7ZBatmKLLxrB+XAqafxfRFjv08RZmj/W/ZqaM13AuA== + dependencies: + cborg "^1.6.0" + multiformats "^9.5.4" + +"@ipld/dag-json@^8.0.1": + version "8.0.11" + resolved "https://registry.yarnpkg.com/@ipld/dag-json/-/dag-json-8.0.11.tgz#8d30cc2dfacb0aef04d327465d3df91e79e8b6ce" + integrity sha512-Pea7JXeYHTWXRTIhBqBlhw7G53PJ7yta3G/sizGEZyzdeEwhZRr0od5IQ0r2ZxOt1Do+2czddjeEPp+YTxDwCA== + dependencies: + cborg "^1.5.4" + multiformats "^9.5.4" + +"@ipld/dag-pb@^2.1.3": + version "2.1.18" + resolved "https://registry.yarnpkg.com/@ipld/dag-pb/-/dag-pb-2.1.18.tgz#12d63e21580e87c75fd1a2c62e375a78e355c16f" + integrity sha512-ZBnf2fuX9y3KccADURG5vb9FaOeMjFkCrNysB0PtftME/4iCTjxfaLoNq/IAh5fTqUOMXvryN6Jyka4ZGuMLIg== + dependencies: + multiformats "^9.5.4" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@metamask/eth-sig-util@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.0.tgz#11553ba06de0d1352332c1bde28c8edd00e0dcf6" @@ -766,6 +990,16 @@ resolved "https://registry.yarnpkg.com/@multiformats/base-x/-/base-x-4.0.1.tgz#95ff0fa58711789d53aefb2590a8b7a4e715d121" integrity sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw== +"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" + integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== + +"@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" + integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -787,6 +1021,206 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@nomicfoundation/ethereumjs-block@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.2.tgz#13a7968f5964f1697da941281b7f7943b0465d04" + integrity sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q== + dependencies: + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + ethereum-cryptography "0.1.3" + ethers "^5.7.1" + +"@nomicfoundation/ethereumjs-blockchain@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.2.tgz#45323b673b3d2fab6b5008535340d1b8fea7d446" + integrity sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-ethash" "3.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + abstract-level "^1.0.3" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + level "^8.0.0" + lru-cache "^5.1.1" + memory-level "^1.0.0" + +"@nomicfoundation/ethereumjs-common@4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.2.tgz#a15d1651ca36757588fdaf2a7d381a150662a3c3" + integrity sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg== + dependencies: + "@nomicfoundation/ethereumjs-util" "9.0.2" + crc-32 "^1.2.0" + +"@nomicfoundation/ethereumjs-ethash@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.2.tgz#da77147f806401ee996bfddfa6487500118addca" + integrity sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + abstract-level "^1.0.3" + bigint-crypto-utils "^3.0.23" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-evm@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.2.tgz#4c2f4b84c056047102a4fa41c127454e3f0cfcf6" + integrity sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ== + dependencies: + "@ethersproject/providers" "^5.7.1" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + mcl-wasm "^0.7.1" + rustbn.js "~0.2.0" + +"@nomicfoundation/ethereumjs-rlp@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.2.tgz#4fee8dc58a53ac6ae87fb1fca7c15dc06c6b5dea" + integrity sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA== + +"@nomicfoundation/ethereumjs-statemanager@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.2.tgz#3ba4253b29b1211cafe4f9265fee5a0d780976e0" + integrity sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA== + dependencies: + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + ethers "^5.7.1" + js-sdsl "^4.1.4" + +"@nomicfoundation/ethereumjs-trie@6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.2.tgz#9a6dbd28482dca1bc162d12b3733acab8cd12835" + integrity sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ== + dependencies: + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + "@types/readable-stream" "^2.3.13" + ethereum-cryptography "0.1.3" + readable-stream "^3.6.0" + +"@nomicfoundation/ethereumjs-tx@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.2.tgz#117813b69c0fdc14dd0446698a64be6df71d7e56" + integrity sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g== + dependencies: + "@chainsafe/ssz" "^0.9.2" + "@ethersproject/providers" "^5.7.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-util@9.0.2": + version "9.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.2.tgz#16bdc1bb36f333b8a3559bbb4b17dac805ce904d" + integrity sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ== + dependencies: + "@chainsafe/ssz" "^0.10.0" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-vm@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.2.tgz#3b0852cb3584df0e18c182d0672a3596c9ca95e6" + integrity sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-blockchain" "7.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-evm" "2.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-statemanager" "2.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + mcl-wasm "^0.7.1" + rustbn.js "~0.2.0" + +"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz#4c858096b1c17fe58a474fe81b46815f93645c15" + integrity sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w== + +"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz#6e25ccdf6e2d22389c35553b64fe6f3fdaec432c" + integrity sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA== + +"@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz#0a224ea50317139caeebcdedd435c28a039d169c" + integrity sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA== + +"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz#dfa085d9ffab9efb2e7b383aed3f557f7687ac2b" + integrity sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg== + +"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz#c9e06b5d513dd3ab02a7ac069c160051675889a4" + integrity sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w== + +"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz#8d328d16839e52571f72f2998c81e46bf320f893" + integrity sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA== + +"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz#9b49d0634b5976bb5ed1604a1e1b736f390959bb" + integrity sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w== + +"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz#e2867af7264ebbcc3131ef837878955dd6a3676f" + integrity sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg== + +"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz#0685f78608dd516c8cdfb4896ed451317e559585" + integrity sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ== + +"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz#c9a44f7108646f083b82e851486e0f6aeb785836" + integrity sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw== + +"@nomicfoundation/solidity-analyzer@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz#f5f4d36d3f66752f59a57e7208cd856f3ddf6f2d" + integrity sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg== + optionalDependencies: + "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.1" + "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.1" + "@nomicfoundation/solidity-analyzer-freebsd-x64" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.1" + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc" "0.1.1" + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.1" + "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.1" + "@nomiclabs/hardhat-ethers@^2.0.0": version "2.0.5" resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.5.tgz#131b0da1b71680d5a01569f916ae878229d326d3" @@ -800,6 +1234,93 @@ "@types/sinon-chai" "^3.2.3" "@types/web3" "1.0.19" +"@oclif/core@2.8.6": + version "2.8.6" + resolved "https://registry.yarnpkg.com/@oclif/core/-/core-2.8.6.tgz#7eb6984108f471ad0d719d3c07cde14c47ab17c5" + integrity sha512-1QlPaHMhOORySCXkQyzjsIsy2GYTilOw3LkjeHkCgsPJQjAT4IclVytJusWktPbYNys9O+O4V23J44yomQvnBQ== + dependencies: + "@types/cli-progress" "^3.11.0" + ansi-escapes "^4.3.2" + ansi-styles "^4.3.0" + cardinal "^2.1.1" + chalk "^4.1.2" + clean-stack "^3.0.1" + cli-progress "^3.12.0" + debug "^4.3.4" + ejs "^3.1.8" + fs-extra "^9.1.0" + get-package-type "^0.1.0" + globby "^11.1.0" + hyperlinker "^1.0.0" + indent-string "^4.0.0" + is-wsl "^2.2.0" + js-yaml "^3.14.1" + natural-orderby "^2.0.3" + object-treeify "^1.1.33" + password-prompt "^1.1.2" + semver "^7.3.7" + string-width "^4.2.3" + strip-ansi "^6.0.1" + supports-color "^8.1.1" + supports-hyperlinks "^2.2.0" + ts-node "^10.9.1" + tslib "^2.5.0" + widest-line "^3.1.0" + wordwrap "^1.0.0" + wrap-ansi "^7.0.0" + +"@oclif/core@^2.15.0": + version "2.15.0" + resolved "https://registry.yarnpkg.com/@oclif/core/-/core-2.15.0.tgz#f27797b30a77d13279fba88c1698fc34a0bd0d2a" + integrity sha512-fNEMG5DzJHhYmI3MgpByTvltBOMyFcnRIUMxbiz2ai8rhaYgaTHMG3Q38HcosfIvtw9nCjxpcQtC8MN8QtVCcA== + dependencies: + "@types/cli-progress" "^3.11.0" + ansi-escapes "^4.3.2" + ansi-styles "^4.3.0" + cardinal "^2.1.1" + chalk "^4.1.2" + clean-stack "^3.0.1" + cli-progress "^3.12.0" + debug "^4.3.4" + ejs "^3.1.8" + get-package-type "^0.1.0" + globby "^11.1.0" + hyperlinker "^1.0.0" + indent-string "^4.0.0" + is-wsl "^2.2.0" + js-yaml "^3.14.1" + natural-orderby "^2.0.3" + object-treeify "^1.1.33" + password-prompt "^1.1.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + supports-color "^8.1.1" + supports-hyperlinks "^2.2.0" + ts-node "^10.9.1" + tslib "^2.5.0" + widest-line "^3.1.0" + wordwrap "^1.0.0" + wrap-ansi "^7.0.0" + +"@oclif/plugin-autocomplete@^2.3.6": + version "2.3.10" + resolved "https://registry.yarnpkg.com/@oclif/plugin-autocomplete/-/plugin-autocomplete-2.3.10.tgz#787f6208cdfe10ffc68ad89e9e7f1a7ad0e8987f" + integrity sha512-Ow1AR8WtjzlyCtiWWPgzMyT8SbcDJFr47009riLioHa+MHX2BCDtVn2DVnN/E6b9JlPV5ptQpjefoRSNWBesmg== + dependencies: + "@oclif/core" "^2.15.0" + chalk "^4.1.0" + debug "^4.3.4" + +"@oclif/plugin-not-found@^2.4.0": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@oclif/plugin-not-found/-/plugin-not-found-2.4.3.tgz#3d24095adb0f3876cb4bcfdfdcb775086cf6d4b5" + integrity sha512-nIyaR4y692frwh7wIHZ3fb+2L6XEecQwRDIb4zbEam0TvaVmBQWZoColQyWA84ljFBPZ8XWiQyTz+ixSwdRkqg== + dependencies: + "@oclif/core" "^2.15.0" + chalk "^4" + fast-levenshtein "^3.0.0" + "@openzeppelin/contracts-upgradeable@^4.7.3": version "4.7.3" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.7.3.tgz#f1d606e2827d409053f3e908ba4eb8adb1dd6995" @@ -833,6 +1354,91 @@ proper-lockfile "^4.1.1" solidity-ast "^0.4.15" +"@peculiar/asn1-schema@^2.3.6": + version "2.3.8" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.3.8.tgz#04b38832a814e25731232dd5be883460a156da3b" + integrity sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA== + dependencies: + asn1js "^3.0.5" + pvtsutils "^1.3.5" + tslib "^2.6.2" + +"@peculiar/json-schema@^1.1.12": + version "1.1.12" + resolved "https://registry.yarnpkg.com/@peculiar/json-schema/-/json-schema-1.1.12.tgz#fe61e85259e3b5ba5ad566cb62ca75b3d3cd5339" + integrity sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w== + dependencies: + tslib "^2.0.0" + +"@peculiar/webcrypto@^1.4.0": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@peculiar/webcrypto/-/webcrypto-1.4.3.tgz#078b3e8f598e847b78683dc3ba65feb5029b93a7" + integrity sha512-VtaY4spKTdN5LjJ04im/d/joXuvLbQdgy5Z4DXF4MFZhQ+MTrejbNMkfZBp1Bs3O5+bFqnJgyGdPuZQflvIa5A== + dependencies: + "@peculiar/asn1-schema" "^2.3.6" + "@peculiar/json-schema" "^1.1.12" + pvtsutils "^1.3.2" + tslib "^2.5.0" + webcrypto-core "^1.7.7" + +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== + +"@rescript/std@9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@rescript/std/-/std-9.0.0.tgz#df53f3fa5911cb4e85bd66b92e9e58ddf3e4a7e1" + integrity sha512-zGzFsgtZ44mgL4Xef2gOy1hrRVdrs9mcxCOOKZrIPsmbZW14yTkaF591GXxpQvjXiHtgZ/iA9qLyWH6oSReIxQ== + "@resolver-engine/core@^0.3.3": version "0.3.3" resolved "https://registry.yarnpkg.com/@resolver-engine/core/-/core-0.3.3.tgz#590f77d85d45bc7ecc4e06c654f41345db6ca967" @@ -870,6 +1476,28 @@ path-browserify "^1.0.0" url "^0.11.0" +"@scure/base@~1.1.0": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.5.tgz#1d85d17269fe97694b9c592552dd9e5e33552157" + integrity sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ== + +"@scure/bip32@1.1.5": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" + integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw== + dependencies: + "@noble/hashes" "~1.2.0" + "@noble/secp256k1" "~1.7.0" + "@scure/base" "~1.1.0" + +"@scure/bip39@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" + integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg== + dependencies: + "@noble/hashes" "~1.2.0" + "@scure/base" "~1.1.0" + "@sentry/core@5.30.0": version "5.30.0" resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" @@ -943,7 +1571,7 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== -"@solidity-parser/parser@^0.14.0", "@solidity-parser/parser@^0.14.1": +"@solidity-parser/parser@^0.14.0": version "0.14.1" resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.1.tgz#179afb29f4e295a77cc141151f26b3848abc3c46" integrity sha512-eLjj2L6AuQjBB6s/ibwCAc0DwrR5Ge+ys+wgWo+bviU7fV2nTMQhU63CGaDKXg9iTmMxwhkyoggdIR7ZGRfMgw== @@ -1026,11 +1654,6 @@ dependencies: fs-extra "^9.1.0" -"@types/abstract-leveldown@*": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz#f055979a99f7654e84d6b8e6267419e9c4cfff87" - integrity sha512-q5veSX6zjUy/DlDhR4Y4cU0k2Ar+DT2LUraP00T19WLmTO6Se1djepCCaqU6nQrwcJ5Hyo/CWqxTzrrFg8eqbQ== - "@types/bn.js@*", "@types/bn.js@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68" @@ -1050,6 +1673,13 @@ resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.0.tgz#23509ebc1fa32f1b4d50d6a66c4032d5b8eaabdc" integrity sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw== +"@types/cli-progress@^3.11.0": + version "3.11.5" + resolved "https://registry.yarnpkg.com/@types/cli-progress/-/cli-progress-3.11.5.tgz#9518c745e78557efda057e3f96a5990c717268c3" + integrity sha512-D4PbNRbviKyppS5ivBGyFO29POlySLmA2HyUFE4p5QGazAMM3CwkKWcvTl8gvElSuxRh6FPKL8XmidX873ou4g== + dependencies: + "@types/node" "*" + "@types/concat-stream@^1.6.0": version "1.6.1" resolved "https://registry.yarnpkg.com/@types/concat-stream/-/concat-stream-1.6.1.tgz#24bcfc101ecf68e886aaedce60dfd74b632a1b74" @@ -1057,22 +1687,13 @@ dependencies: "@types/node" "*" -"@types/connect@^3.4.32": - version "3.4.35" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== +"@types/connect@^3.4.33": + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== dependencies: "@types/node" "*" -"@types/express-serve-static-core@^4.16.9": - version "4.17.30" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz#0f2f99617fa8f9696170c46152ccf7500b34ac04" - integrity sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/form-data@0.0.33": version "0.0.33" resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-0.0.33.tgz#c9ac85b2a5fd18435b8c85d9ecb50e6d6c893ff8" @@ -1080,30 +1701,21 @@ dependencies: "@types/node" "*" -"@types/level-errors@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/level-errors/-/level-errors-3.0.0.tgz#15c1f4915a5ef763b51651b15e90f6dc081b96a8" - integrity sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ== - -"@types/levelup@^4.3.0": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@types/levelup/-/levelup-4.3.3.tgz#4dc2b77db079b1cf855562ad52321aa4241b8ef4" - integrity sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA== - dependencies: - "@types/abstract-leveldown" "*" - "@types/level-errors" "*" - "@types/node" "*" - -"@types/lodash@^4.14.139": - version "4.14.184" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.184.tgz#23f96cd2a21a28e106dc24d825d4aa966de7a9fe" - integrity sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q== +"@types/long@^4.0.1": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" + integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== "@types/lru-cache@5.1.1", "@types/lru-cache@^5.1.0": version "5.1.1" resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== +"@types/minimatch@^3.0.4": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" + integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== + "@types/mkdirp@^0.5.2": version "0.5.2" resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f" @@ -1129,21 +1741,28 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.21.tgz#864b987c0c68d07b4345845c3e63b75edd143644" integrity sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ== +"@types/node@>=13.7.0": + version "20.10.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.5.tgz#47ad460b514096b7ed63a1dae26fad0914ed3ab2" + integrity sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw== + dependencies: + undici-types "~5.26.4" + "@types/node@^10.0.3": version "10.17.60" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== +"@types/node@^12.12.54": + version "12.20.55" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" + integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== + "@types/node@^12.12.6": version "12.20.46" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.46.tgz#7e49dee4c54fd19584e6a9e0da5f3dc2e9136bc7" integrity sha512-cPjLXj8d6anFPzFvOPxS3fvly3Shm5nTfl6g8X5smexixbuGUf7hfr21J5tX9JW+UPStp/5P5R8qrKL5IyVJ+A== -"@types/node@^12.7.7": - version "12.20.55" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" - integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== - "@types/node@^16.4.10": version "16.11.26" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.26.tgz#63d204d136c9916fb4dcd1b50f9740fe86884e47" @@ -1171,15 +1790,18 @@ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.4.tgz#5d9b63132df54d8909fce1c3f8ca260fdd693e17" integrity sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA== -"@types/qs@*", "@types/qs@^6.2.31", "@types/qs@^6.9.4": +"@types/qs@^6.2.31", "@types/qs@^6.9.4": version "6.9.7" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== -"@types/range-parser@*": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== +"@types/readable-stream@^2.3.13": + version "2.3.15" + resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-2.3.15.tgz#3d79c9ceb1b6a57d5f6e6976f489b9b5384321ae" + integrity sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ== + dependencies: + "@types/node" "*" + safe-buffer "~5.1.1" "@types/resolve@^0.0.8": version "0.0.8" @@ -1233,11 +1855,45 @@ "@types/bn.js" "*" "@types/underscore" "*" +"@types/ws@^7.4.4": + version "7.4.7" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" + integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== + dependencies: + "@types/node" "*" + "@ungap/promise-all-settled@1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== +"@whatwg-node/events@^0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@whatwg-node/events/-/events-0.0.3.tgz#13a65dd4f5893f55280f766e29ae48074927acad" + integrity sha512-IqnKIDWfXBJkvy/k6tzskWTc2NK3LcqHlb+KHGCrjOCH4jfQckRX0NAiIcC/vIqQkzLYw2r2CTSwAxcrtcD6lA== + +"@whatwg-node/fetch@^0.8.4": + version "0.8.8" + resolved "https://registry.yarnpkg.com/@whatwg-node/fetch/-/fetch-0.8.8.tgz#48c6ad0c6b7951a73e812f09dd22d75e9fa18cae" + integrity sha512-CdcjGC2vdKhc13KKxgsc6/616BQ7ooDIgPeTuAiE8qfCnS0mGzcfCOoZXypQSz73nxI+GWc7ZReIAVhxoE1KCg== + dependencies: + "@peculiar/webcrypto" "^1.4.0" + "@whatwg-node/node-fetch" "^0.3.6" + busboy "^1.6.0" + urlpattern-polyfill "^8.0.0" + web-streams-polyfill "^3.2.1" + +"@whatwg-node/node-fetch@^0.3.6": + version "0.3.6" + resolved "https://registry.yarnpkg.com/@whatwg-node/node-fetch/-/node-fetch-0.3.6.tgz#e28816955f359916e2d830b68a64493124faa6d0" + integrity sha512-w9wKgDO4C95qnXZRwZTfCmLWqyRnooGjcIwG0wADWjw9/HN0p7dtvtgSvItZtUyNteEvgTrd8QojNEqV6DAGTA== + dependencies: + "@whatwg-node/events" "^0.0.3" + busboy "^1.6.0" + fast-querystring "^1.1.1" + fast-url-parser "^1.1.3" + tslib "^2.3.1" + "@yarnpkg/lockfile@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" @@ -1251,7 +1907,7 @@ JSONStream@1.3.2: jsonparse "^1.2.0" through ">=2.2.7 <3" -JSONStream@^1.3.1: +JSONStream@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== @@ -1266,7 +1922,7 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" -abstract-level@1.0.3: +abstract-level@1.0.3, abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.3.tgz#78a67d3d84da55ee15201486ab44c09560070741" integrity sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA== @@ -1312,17 +1968,6 @@ abstract-leveldown@^5.0.0, abstract-leveldown@~5.0.0: dependencies: xtend "~4.0.0" -abstract-leveldown@^6.2.1: - version "6.3.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a" - integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ== - dependencies: - buffer "^5.5.0" - immediate "^3.2.3" - level-concat-iterator "~2.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - abstract-leveldown@~2.6.0: version "2.6.3" resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8" @@ -1330,17 +1975,6 @@ abstract-leveldown@~2.6.0: dependencies: xtend "~4.0.0" -abstract-leveldown@~6.2.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb" - integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ== - dependencies: - buffer "^5.5.0" - immediate "^3.2.3" - level-concat-iterator "~2.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -1409,12 +2043,7 @@ ansi-colors@4.1.1, ansi-colors@^4.1.1: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== -ansi-colors@^3.2.1: - version "3.2.4" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" - integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== - -ansi-escapes@^4.3.0: +ansi-escapes@^4.3.0, ansi-escapes@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -1453,18 +2082,36 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0, ansi-styles@^4.1.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0, ansi-styles@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" +ansicolors@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" + integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg== + antlr4ts@^0.5.0-alpha.4: version "0.5.0-alpha.4" resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== +any-signal@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/any-signal/-/any-signal-2.1.2.tgz#8d48270de0605f8b218cf9abe8e9c6a0e7418102" + integrity sha512-B+rDnWasMi/eWcajPcCWSlYc7muXOrcYrqgyzcdKisl2H/WTlQ0gip1KyQfr0ZlxJdsuWCj/LWwQm7fhyhRfIQ== + dependencies: + abort-controller "^3.0.0" + native-abort-controller "^1.0.3" + +any-signal@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/any-signal/-/any-signal-3.0.1.tgz#49cae34368187a3472e31de28fb5cb1430caa9a6" + integrity sha512-xgZgJtKEa9YmDqXodIgl7Fl1C8yNXr8w6gXjqK3LW4GcEiYT+6AQfJSE/8SPsEpLLmcvbv8YU+qet94UewHxqg== + anymatch@~3.1.1, anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" @@ -1473,13 +2120,12 @@ anymatch@~3.1.1, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -apisauce@^1.0.1: - version "1.1.5" - resolved "https://registry.yarnpkg.com/apisauce/-/apisauce-1.1.5.tgz#31d41a5cf805e401266cec67faf1a50f4aeae234" - integrity sha512-gKC8qb/bDJsPsnEXLZnXJ7gVx7dh87CEVNeIwv1dvaffnXoh5GHwac5pWR1P2broLiVj/fqFMQvLDDt/RhjiqA== +apisauce@^2.1.5: + version "2.1.6" + resolved "https://registry.yarnpkg.com/apisauce/-/apisauce-2.1.6.tgz#94887f335bf3d735305fc895c8a191c9c2608a7f" + integrity sha512-MdxR391op/FucS2YQRfB/NMRyCnHEPDd4h17LRIuVYi0BpGmMhpxc0shbOpfs5ahABuBEffNCGal5EcsydbBWg== dependencies: - axios "^0.21.2" - ramda "^0.25.0" + axios "^0.21.4" app-module-path@^2.2.0: version "2.2.0" @@ -1547,6 +2193,11 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + array-uniq@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" @@ -1567,12 +2218,7 @@ asap@~2.0.6: resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= -asmcrypto.js@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/asmcrypto.js/-/asmcrypto.js-2.3.2.tgz#b9f84bd0a1fb82f21f8c29cc284a707ad17bba2e" - integrity sha512-3FgFARf7RupsZETQ1nHnhLUUvpcttcCq1iZCaVAbJZbCZ5VNRrNyvpDyHTOb0KC3llFcsyOT/a99NZcCbeiEsA== - -asn1.js@^5.0.1, asn1.js@^5.2.0: +asn1.js@^5.2.0: version "5.4.1" resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== @@ -1589,6 +2235,15 @@ asn1@~0.2.3: dependencies: safer-buffer "~2.1.0" +asn1js@^3.0.1, asn1js@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-3.0.5.tgz#5ea36820443dbefb51cc7f88a2ebb5b462114f38" + integrity sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ== + dependencies: + pvtsutils "^1.3.2" + pvutils "^1.1.3" + tslib "^2.4.0" + assemblyscript@0.19.10: version "0.19.10" resolved "https://registry.yarnpkg.com/assemblyscript/-/assemblyscript-0.19.10.tgz#7ede6d99c797a219beb4fa4614c3eab9e6343c8e" @@ -1597,6 +2252,15 @@ assemblyscript@0.19.10: binaryen "101.0.0-nightly.20210723" long "^4.0.0" +assemblyscript@0.19.23: + version "0.19.23" + resolved "https://registry.yarnpkg.com/assemblyscript/-/assemblyscript-0.19.23.tgz#16ece69f7f302161e2e736a0f6a474e6db72134c" + integrity sha512-fwOQNZVTMga5KRsfY80g7cpOl4PsFQczMwHzdtgoqLXaYhkhavufKb0sB0l3T1DUxpAufA0KNhlbpuuhZUwxMA== + dependencies: + binaryen "102.0.0-nightly.20211028" + long "^5.2.0" + source-map-support "^0.5.20" + assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" @@ -1612,7 +2276,12 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= -async-eventemitter@0.2.4, async-eventemitter@^0.2.2, async-eventemitter@^0.2.4: +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async-eventemitter@0.2.4, async-eventemitter@^0.2.2: version "0.2.4" resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== @@ -1643,12 +2312,10 @@ async@^2.0.1, async@^2.1.2, async@^2.4.0, async@^2.5.0, async@^2.6.1: dependencies: lodash "^4.17.14" -async@^2.6.2, async@^2.6.3: - version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" - integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== - dependencies: - lodash "^4.17.14" +async@^3.2.3: + version "3.2.5" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" + integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== asynckit@^0.4.0: version "0.4.0" @@ -1675,7 +2342,7 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== -axios@^0.21.1, axios@^0.21.2: +axios@^0.21.1, axios@^0.21.4: version "0.21.4" resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== @@ -2250,6 +2917,11 @@ bech32@1.1.4: resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== +bigint-crypto-utils@^3.0.23: + version "3.3.0" + resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz#72ad00ae91062cf07f2b1def9594006c279c1d77" + integrity sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg== + bignumber.js@^9.0.0: version "9.0.2" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.2.tgz#71c6c6bed38de64e24a65ebe16cfcf23ae693673" @@ -2274,6 +2946,11 @@ binaryen@101.0.0-nightly.20210723: resolved "https://registry.yarnpkg.com/binaryen/-/binaryen-101.0.0-nightly.20210723.tgz#b6bb7f3501341727681a03866c0856500eec3740" integrity sha512-eioJNqhHlkguVSbblHOtLqlhtC882SOEPKmNFZaDuz1hzQjolxZ+eu3/kaS10n3sGPONsIZsO7R9fR00UyhEUA== +binaryen@102.0.0-nightly.20211028: + version "102.0.0-nightly.20211028" + resolved "https://registry.yarnpkg.com/binaryen/-/binaryen-102.0.0-nightly.20211028.tgz#8f1efb0920afd34509e342e37f84313ec936afb2" + integrity sha512-GCJBVB5exbxzzvyt8MGDv/MeUjs6gkXDvf4xOIItRBptYl0Tz5sm1o/uG95YK0L0VeG5ajDu3hRtkBP2kzqC5w== + bindings@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" @@ -2307,27 +2984,18 @@ bl@^1.0.0: readable-stream "^2.3.5" safe-buffer "^5.1.1" -bl@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/bl/-/bl-3.0.1.tgz#1cbb439299609e419b5a74d7fce2f8b37d8e5c6f" - integrity sha512-jrCW5ZhfQ/Vt07WX1Ngs+yn9BDqPL/gw28S7s9H6QK/gupnizNzJAss5akW20ISgOrbLTlXOOCTJeNUQqruAWQ== - dependencies: - readable-stream "^3.0.1" - -bl@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - blakejs@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.1.tgz#bf313053978b2cd4c444a48795710be05c785702" integrity sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg== +blob-to-it@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/blob-to-it/-/blob-to-it-1.0.4.tgz#f6caf7a4e90b7bb9215fa6a318ed6bd8ad9898cb" + integrity sha512-iCmk0W4NdbrWgRRuxOriU8aM5ijeVLI61Zulsmg/lUHNr7pYjoj+U77opLefNagevtrrbMt3JQ5Qip7ar178kA== + dependencies: + browser-readablestream-to-it "^1.0.3" + bluebird@^3.5.0, bluebird@^3.5.2: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" @@ -2369,19 +3037,6 @@ body-parser@1.19.2, body-parser@^1.16.0: raw-body "2.4.3" type-is "~1.6.18" -borc@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/borc/-/borc-2.1.2.tgz#6ce75e7da5ce711b963755117dd1b187f6f8cf19" - integrity sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w== - dependencies: - bignumber.js "^9.0.0" - buffer "^5.5.0" - commander "^2.15.0" - ieee754 "^1.1.13" - iso-url "~0.4.7" - json-text-sequence "~0.1.0" - readable-stream "^3.6.0" - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -2390,6 +3045,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" @@ -2418,6 +3080,21 @@ brorand@^1.0.1, brorand@^1.1.0: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= +browser-level@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browser-level/-/browser-level-1.0.1.tgz#36e8c3183d0fe1c405239792faaab5f315871011" + integrity sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ== + dependencies: + abstract-level "^1.0.2" + catering "^2.1.1" + module-error "^1.0.2" + run-parallel-limit "^1.1.0" + +browser-readablestream-to-it@^1.0.0, browser-readablestream-to-it@^1.0.1, browser-readablestream-to-it@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/browser-readablestream-to-it/-/browser-readablestream-to-it-1.0.3.tgz#ac3e406c7ee6cdf0a502dd55db33bab97f7fba76" + integrity sha512-+12sHB+Br8HIh6VAMVEG5r3UXCyESIgDW7kzk3BjIXa43DVqVwL7GC5TW3jeh+72dtcH99pPVpw0X8i0jt+/kw== + browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" @@ -2485,7 +3162,7 @@ browserslist@^3.2.6: caniuse-lite "^1.0.30000844" electron-to-chromium "^1.3.47" -bs58@^4.0.0, bs58@^4.0.1: +bs58@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= @@ -2541,7 +3218,7 @@ buffer-xor@^2.0.1: dependencies: safe-buffer "^5.1.1" -buffer@^5.0.5, buffer@^5.2.1, buffer@^5.4.2, buffer@^5.4.3, buffer@^5.5.0, buffer@^5.6.0: +buffer@^5.0.5, buffer@^5.2.1, buffer@^5.5.0, buffer@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -2549,7 +3226,7 @@ buffer@^5.0.5, buffer@^5.2.1, buffer@^5.4.2, buffer@^5.4.3, buffer@^5.5.0, buffe base64-js "^1.3.1" ieee754 "^1.1.13" -buffer@^6.0.3: +buffer@^6.0.1, buffer@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== @@ -2571,10 +3248,12 @@ bufferutil@^4.0.1: dependencies: node-gyp-build "^4.3.0" -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== +busboy@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" bytes@3.1.2: version "3.1.2" @@ -2665,12 +3344,25 @@ caniuse-lite@^1.0.30000844: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz#e11eba4b87e24d22697dae05455d5aea28550d5f" integrity sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ== +cardinal@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" + integrity sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw== + dependencies: + ansicolors "~0.3.2" + redeyed "~2.1.0" + +case@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/case/-/case-1.6.3.tgz#0a4386e3e9825351ca2e6216c60467ff5f1ea1c9" + integrity sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ== + caseless@^0.12.0, caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -catering@^2.0.0, catering@^2.1.0: +catering@^2.0.0, catering@^2.1.0, catering@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== @@ -2682,6 +3374,11 @@ cbor@^8.0.0: dependencies: nofilter "^3.1.0" +cborg@^1.5.4, cborg@^1.6.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/cborg/-/cborg-1.10.2.tgz#83cd581b55b3574c816f82696307c7512db759a1" + integrity sha512-b3tFPA9pUr2zCUiCfRd2+wok2/LBSNUMKOuRRok+WlvvAgEt/PlbgPTsZUcwCOs53IJvLgTp0eotwtosE6njug== + chai@^4.3.4: version "4.3.6" resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" @@ -2695,7 +3392,7 @@ chai@^4.3.4: pathval "^1.1.1" type-detect "^4.0.5" -chalk@3.0.0, chalk@^3.0.0: +chalk@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== @@ -2723,7 +3420,7 @@ chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.1.0, chalk@^4.1.1: +chalk@^4, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2763,21 +3460,6 @@ chokidar@3.3.0: optionalDependencies: fsevents "~2.1.1" -chokidar@3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" - integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.5.0" - optionalDependencies: - fsevents "~2.3.1" - chokidar@3.5.3, chokidar@^3.4.0: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" @@ -2808,7 +3490,7 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== -cids@^0.7.1, cids@~0.7.0, cids@~0.7.1: +cids@^0.7.1: version "0.7.5" resolved "https://registry.yarnpkg.com/cids/-/cids-0.7.5.tgz#60a08138a99bfb69b6be4ceb63bfef7a396b28b2" integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA== @@ -2829,17 +3511,6 @@ cids@^1.1.9: multihashes "^4.0.1" uint8arrays "^3.0.0" -cids@~0.8.0: - version "0.8.3" - resolved "https://registry.yarnpkg.com/cids/-/cids-0.8.3.tgz#aaf48ac8ed857c3d37dad94d8db1d8c9407b92db" - integrity sha512-yoXTbV3llpm+EBGWKeL9xKtksPE/s6DPoDSY4fn8I8TEW1zehWXPSB0pwAXVDlLaOlrw+sNynj995uD9abmPhA== - dependencies: - buffer "^5.6.0" - class-is "^1.1.0" - multibase "^1.0.0" - multicodec "^1.0.1" - multihashes "^1.0.1" - cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -2863,11 +3534,29 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" +classic-level@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.3.0.tgz#5e36680e01dc6b271775c093f2150844c5edd5c8" + integrity sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg== + dependencies: + abstract-level "^1.0.2" + catering "^2.1.0" + module-error "^1.0.1" + napi-macros "^2.2.2" + node-gyp-build "^4.3.0" + clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== +clean-stack@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-3.0.1.tgz#155bf0b2221bf5f4fba89528d24c5953f17fe3a8" + integrity sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg== + dependencies: + escape-string-regexp "4.0.0" + cli-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" @@ -2875,12 +3564,29 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" +cli-progress@^3.12.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/cli-progress/-/cli-progress-3.12.0.tgz#807ee14b66bcc086258e444ad0f19e7d42577942" + integrity sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A== + dependencies: + string-width "^4.2.3" + cli-spinners@^2.2.0: version "2.7.0" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.7.0.tgz#f815fd30b5f9eaac02db604c7a231ed7cb2f797a" integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw== -cli-table3@^0.5.0, cli-table3@~0.5.0: +cli-table3@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.0.tgz#b7b1bc65ca8e7b5cef9124e13dc2b21e2ce4faee" + integrity sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ== + dependencies: + object-assign "^4.1.0" + string-width "^4.2.0" + optionalDependencies: + colors "^1.1.2" + +cli-table3@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== @@ -2976,11 +3682,6 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -colors@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" - integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== - colors@1.4.0, colors@^1.1.2: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" @@ -3032,7 +3733,7 @@ commander@3.0.2: resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== -commander@^2.12.2, commander@^2.15.0: +commander@^2.20.3: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -3062,13 +3763,6 @@ concat-stream@^1.5.1, concat-stream@^1.6.0, concat-stream@^1.6.2, concat-stream@ readable-stream "^2.2.2" typedarray "^0.0.6" -"concat-stream@github:max-mapper/concat-stream#feat/smaller": - version "2.0.0" - resolved "https://codeload.github.com/max-mapper/concat-stream/tar.gz/057bc7b5d6d8df26c8cf00a3f151b6721a0a8034" - dependencies: - inherits "^2.0.3" - readable-stream "^3.0.2" - content-disposition@0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" @@ -3145,16 +3839,16 @@ cors@^2.8.1: object-assign "^4" vary "^1" -cosmiconfig@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" - integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== +cosmiconfig@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== dependencies: "@types/parse-json" "^4.0.0" - import-fresh "^3.1.0" + import-fresh "^3.2.1" parse-json "^5.0.0" path-type "^4.0.0" - yaml "^1.7.2" + yaml "^1.10.0" crc-32@^1.2.0: version "1.2.1" @@ -3208,6 +3902,15 @@ cross-fetch@^2.1.0, cross-fetch@^2.1.1: node-fetch "2.6.1" whatwg-fetch "2.0.4" +cross-spawn@7.0.3, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -3219,15 +3922,6 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - "crypt@>= 0.0.1": version "0.0.2" resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" @@ -3286,12 +3980,12 @@ debug@4, debug@4.3.3, debug@^4.1.1, debug@^4.3.3: dependencies: ms "2.1.2" -debug@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== +debug@4.3.4, debug@^4.3.1, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: - ms "^2.1.1" + ms "2.1.2" debug@^3.1.0, debug@^3.2.6: version "3.2.7" @@ -3300,13 +3994,6 @@ debug@^3.1.0, debug@^3.2.6: dependencies: ms "^2.1.1" -debug@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - decamelize@^1.1.1, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -3380,14 +4067,6 @@ deferred-leveldown@~4.0.0: abstract-leveldown "~5.0.0" inherits "^2.0.3" -deferred-leveldown@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" - integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw== - dependencies: - abstract-leveldown "~6.2.1" - inherits "^2.0.3" - define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -3422,16 +4101,16 @@ defined@~1.0.0: resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= +delay@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" + integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= -delimit-stream@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/delimit-stream/-/delimit-stream-0.1.0.tgz#9b8319477c0e5f8aeb3ce357ae305fc25ea1cd2b" - integrity sha512-a02fiQ7poS5CnjiJBAsjGLPp5EwVoGHNeu9sziBd9huppRfsAFIpv5zNLv0V1gbop53ilngAf5Kf331AwcoRBQ== - depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" @@ -3462,11 +4141,6 @@ detect-indent@^4.0.0: dependencies: repeating "^2.0.0" -detect-node@^2.0.4: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== - diff@3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" @@ -3491,10 +4165,28 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" -docker-compose@0.23.4: - version "0.23.4" - resolved "https://registry.yarnpkg.com/docker-compose/-/docker-compose-0.23.4.tgz#43bcabcde55a6ba2873b52fe0ccd99dd8fdceba8" - integrity sha512-yWdXby9uQ8o4syOfvoSJ9ZlTnLipvUmDn59uaYY5VGIUSUAfMPPGqE1DE3pOCnfSg9Tl9UOOFO0PCSAzuIHmuA== +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dns-over-http-resolver@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/dns-over-http-resolver/-/dns-over-http-resolver-1.2.3.tgz#194d5e140a42153f55bb79ac5a64dd2768c36af9" + integrity sha512-miDiVSI6KSNbi4SVifzO/reD8rMnxgrlnkrlkugOLQpWQTe2qMdHsZp5DmfKjxNE+/T3VAAYLQUZMv9SMr6+AA== + dependencies: + debug "^4.3.1" + native-fetch "^3.0.0" + receptacle "^1.3.2" + +docker-compose@0.23.19: + version "0.23.19" + resolved "https://registry.yarnpkg.com/docker-compose/-/docker-compose-0.23.19.tgz#9947726e2fe67bdfa9e8efe1ff15aa0de2e10eb8" + integrity sha512-v5vNLIdUqwj4my80wxFDkNH+4S85zsRuH29SO7dCWVWPCMt/ohZBsGN6g6KXWifT0pzQ7uOxqEKCYCDPJ8Vz4g== + dependencies: + yaml "^1.10.2" docker-modem@^1.0.8: version "1.0.9" @@ -3559,10 +4251,26 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -ejs@^2.6.1: - version "2.7.4" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" - integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== +ejs@3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.6.tgz#5bfd0a0689743bb5268b3550cceeebbc1702822a" + integrity sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw== + dependencies: + jake "^10.6.1" + +ejs@^3.1.8: + version "3.1.9" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" + integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== + dependencies: + jake "^10.8.5" + +electron-fetch@^1.7.2: + version "1.9.1" + resolved "https://registry.yarnpkg.com/electron-fetch/-/electron-fetch-1.9.1.tgz#e28bfe78d467de3f2dec884b1d72b8b05322f30f" + integrity sha512-M9qw6oUILGVrcENMSRRefE1MbHPIz0h79EKIeJWK9v563aT9Qkh8aEHPO1H5vi970wPirNY+jO9OpFoLiMsMGA== + dependencies: + encoding "^0.1.13" electron-to-chromium@^1.3.47: version "1.4.75" @@ -3618,38 +4326,21 @@ encoding-down@5.0.4, encoding-down@~5.0.0: level-errors "^2.0.0" xtend "^4.0.1" -encoding-down@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b" - integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw== - dependencies: - abstract-leveldown "^6.2.1" - inherits "^2.0.3" - level-codec "^9.0.0" - level-errors "^2.0.0" - -encoding@^0.1.11: +encoding@^0.1.11, encoding@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== dependencies: iconv-lite "^0.6.2" -end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: +end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" -enquirer@2.3.4: - version "2.3.4" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.4.tgz#c608f2e1134c7f68c1c9ee056de13f9b31076de9" - integrity sha512-pkYrrDZumL2VS6VBGDhqbajCM2xpkUNLuKfGPjfKaSIBKYopQbqEFyrOkRMIb2HDR/rO1kGhEt/5twBwtzKBXw== - dependencies: - ansi-colors "^3.2.1" - -enquirer@^2.3.0, enquirer@^2.3.6: +enquirer@2.3.6, enquirer@^2.3.0, enquirer@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== @@ -3661,15 +4352,10 @@ env-paths@^2.2.0: resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== -err-code@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" - integrity sha512-CJAN+O0/yA1CKfRn9SXOGctSpEM7DCon/r/5r2eXFMY2zCCJBasFhcM5I+1kh3Ap11FsQCX+vGHceNPvpWKhoA== - -err-code@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" - integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== +err-code@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-3.0.1.tgz#a444c7b992705f2b120ee320b09972eef331c920" + integrity sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA== errno@~0.1.1: version "0.1.8" @@ -3778,7 +4464,7 @@ escape-string-regexp@4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -esprima@^4.0.0: +esprima@^4.0.0, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -3956,7 +4642,7 @@ ethereum-common@^0.0.18: resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f" integrity sha1-L9w1dvIykDNYl26znaeDIT/5Uj8= -ethereum-cryptography@^0.1.2, ethereum-cryptography@^0.1.3: +ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== @@ -3977,6 +4663,16 @@ ethereum-cryptography@^0.1.2, ethereum-cryptography@^0.1.3: secp256k1 "^4.0.1" setimmediate "^1.0.5" +ethereum-cryptography@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz#5ccfa183e85fdaf9f9b299a79430c044268c9b3a" + integrity sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw== + dependencies: + "@noble/hashes" "1.2.0" + "@noble/secp256k1" "1.7.1" + "@scure/bip32" "1.1.5" + "@scure/bip39" "1.1.1" + ethereum-waffle@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-3.4.0.tgz#990b3c6c26db9c2dd943bf26750a496f60c04720" @@ -4143,7 +4839,7 @@ ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereum rlp "^2.0.0" safe-buffer "^5.1.1" -ethereumjs-util@^7.0.2, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.3, ethereumjs-util@^7.1.4: +ethereumjs-util@^7.0.2, ethereumjs-util@^7.1.0: version "7.1.4" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.4.tgz#a6885bcdd92045b06f596c7626c3e89ab3312458" integrity sha512-p6KmuPCX4mZIqsQzXfmSx9Y0l2hqf+VkAiwSisW3UKUFdk8ZkAt+AYaor83z2nSi6CU2zSsXMlD80hAbNEGM0A== @@ -4269,6 +4965,42 @@ ethers@^5.0.1, ethers@^5.0.2, ethers@^5.4.4, ethers@^5.5.2: "@ethersproject/web" "5.5.1" "@ethersproject/wordlists" "5.5.0" +ethers@^5.7.1: + version "5.7.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== + dependencies: + "@ethersproject/abi" "5.7.0" + "@ethersproject/abstract-provider" "5.7.0" + "@ethersproject/abstract-signer" "5.7.0" + "@ethersproject/address" "5.7.0" + "@ethersproject/base64" "5.7.0" + "@ethersproject/basex" "5.7.0" + "@ethersproject/bignumber" "5.7.0" + "@ethersproject/bytes" "5.7.0" + "@ethersproject/constants" "5.7.0" + "@ethersproject/contracts" "5.7.0" + "@ethersproject/hash" "5.7.0" + "@ethersproject/hdnode" "5.7.0" + "@ethersproject/json-wallets" "5.7.0" + "@ethersproject/keccak256" "5.7.0" + "@ethersproject/logger" "5.7.0" + "@ethersproject/networks" "5.7.1" + "@ethersproject/pbkdf2" "5.7.0" + "@ethersproject/properties" "5.7.0" + "@ethersproject/providers" "5.7.2" + "@ethersproject/random" "5.7.0" + "@ethersproject/rlp" "5.7.0" + "@ethersproject/sha2" "5.7.0" + "@ethersproject/signing-key" "5.7.0" + "@ethersproject/solidity" "5.7.0" + "@ethersproject/strings" "5.7.0" + "@ethersproject/transactions" "5.7.0" + "@ethersproject/units" "5.7.0" + "@ethersproject/wallet" "5.7.0" + "@ethersproject/web" "5.7.1" + "@ethersproject/wordlists" "5.7.0" + ethjs-unit@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" @@ -4308,20 +5040,19 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -execa@^3.0.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89" - integrity sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g== +execa@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" is-stream "^2.0.0" merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - p-finally "^2.0.0" - signal-exit "^3.0.2" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" strip-final-newline "^2.0.0" exit-on-epipe@~1.0.1: @@ -4342,11 +5073,6 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -explain-error@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/explain-error/-/explain-error-1.0.4.tgz#a793d3ac0cad4c6ab571e9968fbbab6cb2532929" - integrity sha512-/wSgNMxFusiYRy1rd19LT2SQlIXDppHpumpWo06wxjflD1OYxDLbl6rMVw+U3bxD5Nuhex4TKqv9Aem4D0lVzQ== - express@^4.14.0: version "4.17.3" resolved "https://registry.yarnpkg.com/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1" @@ -4446,11 +5172,21 @@ fake-merkle-patricia-tree@^1.0.1: dependencies: checkpoint-store "^1.1.0" +fast-decode-uri-component@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz#46f8b6c22b30ff7a81357d4f59abfae938202543" + integrity sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg== + fast-deep-equal@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-fifo@^1.0.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" + integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== + fast-glob@^3.2.5: version "3.2.11" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" @@ -4462,11 +5198,48 @@ fast-glob@^3.2.5: merge2 "^1.3.0" micromatch "^4.0.4" +fast-glob@^3.2.9: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== +fast-levenshtein@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz#37b899ae47e1090e40e3fd2318e4d5f0142ca912" + integrity sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ== + dependencies: + fastest-levenshtein "^1.0.7" + +fast-querystring@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fast-querystring/-/fast-querystring-1.1.2.tgz#a6d24937b4fc6f791b4ee31dcb6f53aeafb89f53" + integrity sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg== + dependencies: + fast-decode-uri-component "^1.0.1" + +fast-url-parser@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" + integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== + dependencies: + punycode "^1.3.2" + +fastest-levenshtein@^1.0.7: + version "1.0.16" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== + fastq@^1.6.0: version "1.13.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" @@ -4486,6 +5259,13 @@ file-uri-to-path@1.0.0: resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -4588,11 +5368,6 @@ flat@^5.0.2: resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -flatmap@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/flatmap/-/flatmap-0.0.3.tgz#1f18a4d938152d495965f9c958d923ab2dd669b4" - integrity sha512-OuR+o7kHVe+x9RtIujPay7Uw3bvDZBZFSBXClEphZuSDLmZTqMdclasf4vFSsogC8baDz0eaC2NdO/2dlXHBKQ== - flow-stoplight@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/flow-stoplight/-/flow-stoplight-1.0.0.tgz#4a292c5bcff8b39fa6cc0cb1a853d86f27eeff7b" @@ -4695,15 +5470,15 @@ fs-constants@^1.0.0: resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== -fs-extra@9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.0.tgz#b6afc31036e247b2466dc99c29ae797d5d4580a3" - integrity sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g== +fs-extra@9.1.0, fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== dependencies: at-least-node "^1.0.0" graceful-fs "^4.2.0" jsonfile "^6.0.1" - universalify "^1.0.0" + universalify "^2.0.0" fs-extra@^0.30.0: version "0.30.0" @@ -4743,20 +5518,10 @@ fs-extra@^7.0.0, fs-extra@^7.0.1: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-jetpack@^2.2.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/fs-jetpack/-/fs-jetpack-2.4.0.tgz#6080c4ab464a019d37a404baeb47f32af8835026" - integrity sha512-S/o9Dd7K9A7gicVU32eT8G0kHcmSu0rCVdP79P0MWInKFb8XpTc8Syhoo66k9no+HDshtlh4pUJTws8X+8fdFQ== +fs-jetpack@4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/fs-jetpack/-/fs-jetpack-4.3.1.tgz#cdfd4b64e6bfdec7c7dc55c76b39efaa7853bb20" + integrity sha512-dbeOK84F6BiQzk2yqqCVwCPWTxAvVGJ3fMQc6E2wuEohS28mR6yHngbrKuVCK1KHRx/ccByDylqu4H5PCP2urQ== dependencies: minimatch "^3.0.2" rimraf "^2.6.3" @@ -4790,7 +5555,7 @@ fsevents@~2.1.1: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== -fsevents@~2.3.1, fsevents@~2.3.2: +fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -4887,6 +5652,16 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: has "^1.0.3" has-symbols "^1.0.1" +get-iterator@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-iterator/-/get-iterator-1.0.2.tgz#cd747c02b4c084461fac14f48f6b45a80ed25c82" + integrity sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg== + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + get-port@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" @@ -4904,13 +5679,18 @@ get-stream@^4.1.0: dependencies: pump "^3.0.0" -get-stream@^5.0.0, get-stream@^5.1.0: +get-stream@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== dependencies: pump "^3.0.0" +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + get-symbol-description@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" @@ -4950,18 +5730,6 @@ glob@7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - glob@7.2.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.6, glob@~7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" @@ -4974,6 +5742,16 @@ glob@7.2.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.6, glob@~7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" +glob@9.3.5: + version "9.3.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.5.tgz#ca2ed8ca452781a3009685607fdf025a899dfe21" + integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== + dependencies: + fs.realpath "^1.0.0" + minimatch "^8.0.2" + minipass "^4.2.4" + path-scurry "^1.6.1" + global@~4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" @@ -4987,20 +5765,33 @@ globals@^9.18.0: resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== -"gluegun@https://github.com/edgeandnode/gluegun#v4.3.1-pin-colors-dep": - version "4.3.1" - resolved "https://github.com/edgeandnode/gluegun#b34b9003d7bf556836da41b57ef36eb21570620a" +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +gluegun@5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/gluegun/-/gluegun-5.1.2.tgz#ffa0beda0fb6bbc089a867157b08602beae2c8cf" + integrity sha512-Cwx/8S8Z4YQg07a6AFsaGnnnmd8mN17414NcPS3OoDtZRwxgsvwRNJNg69niD6fDa8oNwslCG0xH7rEpRNNE/g== dependencies: - apisauce "^1.0.1" + apisauce "^2.1.5" app-module-path "^2.2.0" - cli-table3 "~0.5.0" - colors "1.3.3" - cosmiconfig "6.0.0" - cross-spawn "^7.0.0" - ejs "^2.6.1" - enquirer "2.3.4" - execa "^3.0.0" - fs-jetpack "^2.2.2" + cli-table3 "0.6.0" + colors "1.4.0" + cosmiconfig "7.0.1" + cross-spawn "7.0.3" + ejs "3.1.6" + enquirer "2.3.6" + execa "5.1.1" + fs-jetpack "4.3.1" lodash.camelcase "^4.3.0" lodash.kebabcase "^4.1.1" lodash.lowercase "^4.3.0" @@ -5016,12 +5807,11 @@ globals@^9.18.0: lodash.trimstart "^4.5.1" lodash.uppercase "^4.3.0" lodash.upperfirst "^4.3.1" - ora "^4.0.0" + ora "4.0.2" pluralize "^8.0.0" - ramdasauce "^2.1.0" - semver "^7.0.0" - which "^2.0.0" - yargs-parser "^16.1.0" + semver "7.3.5" + which "2.0.2" + yargs-parser "^21.0.0" got@9.6.0: version "9.6.0" @@ -5070,11 +5860,21 @@ graceful-fs@^4.2.4: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +graphql-import-node@^0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/graphql-import-node/-/graphql-import-node-0.0.5.tgz#caf76a6cece10858b14f27cce935655398fc1bf0" + integrity sha512-OXbou9fqh9/Lm7vwXT0XoRN9J5+WCYKnbiTalgFDvkQERITRmcfncZs6aVABedd5B85yQU5EULS4a5pnbpuI0Q== + graphql@15.5.0: version "15.5.0" resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.5.0.tgz#39d19494dbe69d1ea719915b578bf920344a69d5" integrity sha512-OmaM7y0kaK31NKG31q4YbD2beNYa6jBBKtMFT6gLYJljHLJr42IqJ8KX08u3Li/0ifzTU5HjmoOOrwa5BRLeDA== +graphql@^16.6.0: + version "16.8.1" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.8.1.tgz#1930a965bef1170603702acdb68aedd3f3cf6f07" + integrity sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw== + growl@1.10.5: version "1.10.5" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" @@ -5134,23 +5934,27 @@ hardhat-gas-reporter@^1.0.4: eth-gas-reporter "^0.2.24" sha1 "^1.1.1" -hardhat@^2.5.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.9.0.tgz#3154faf616a87b735fd81311e68b82f1d7dd9916" - integrity sha512-jF8UlisdQ07ldCqaRU+rEB6lzAJzWS5Gg4KT2pUyqat0hJc7jfccE8ITRvAGP8ksC6DZ+kRpDfUSgoLsPFynaA== - dependencies: - "@ethereumjs/block" "^3.6.0" - "@ethereumjs/blockchain" "^5.5.0" - "@ethereumjs/common" "^2.6.0" - "@ethereumjs/tx" "^3.4.0" - "@ethereumjs/vm" "^5.6.0" +hardhat@^2.19.2: + version "2.19.3" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.19.3.tgz#fe3b28b889e34a074ea5b740c227e3c8d4ce56e8" + integrity sha512-zUvfILiu1O7W1a+t5E1nCJ6z1danRLNizQkSEQCCgDYcRx13AGXtH1MVZajKmdLmXIjKAPReTp/8JQQ4ZHaX3g== + dependencies: "@ethersproject/abi" "^5.1.2" "@metamask/eth-sig-util" "^4.0.0" + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-blockchain" "7.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-evm" "2.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-statemanager" "2.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + "@nomicfoundation/ethereumjs-vm" "7.0.2" + "@nomicfoundation/solidity-analyzer" "^0.1.0" "@sentry/node" "^5.18.1" - "@solidity-parser/parser" "^0.14.1" "@types/bn.js" "^5.1.0" "@types/lru-cache" "^5.1.0" - abort-controller "^3.0.0" adm-zip "^0.4.16" aggregate-error "^3.0.0" ansi-escapes "^4.3.0" @@ -5160,31 +5964,27 @@ hardhat@^2.5.0: debug "^4.1.1" enquirer "^2.3.0" env-paths "^2.2.0" - ethereum-cryptography "^0.1.2" + ethereum-cryptography "^1.0.3" ethereumjs-abi "^0.6.8" - ethereumjs-util "^7.1.3" find-up "^2.1.0" fp-ts "1.19.3" fs-extra "^7.0.1" - glob "^7.1.3" + glob "7.2.0" immutable "^4.0.0-rc.12" io-ts "1.10.4" + keccak "^3.0.2" lodash "^4.17.11" - merkle-patricia-tree "^4.2.2" mnemonist "^0.38.0" - mocha "^9.2.0" + mocha "^10.0.0" p-map "^4.0.0" - qs "^6.7.0" raw-body "^2.4.1" resolve "1.17.0" semver "^6.3.0" - slash "^3.0.0" solc "0.7.3" source-map-support "^0.5.13" stacktrace-parser "^0.1.10" - "true-case-path" "^2.2.1" tsort "0.0.1" - undici "^4.14.1" + undici "^5.14.0" uuid "^8.3.2" ws "^7.4.6" @@ -5307,11 +6107,6 @@ heap@0.2.6: resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac" integrity sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw= -hi-base32@~0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/hi-base32/-/hi-base32-0.5.1.tgz#1279f2ddae2673219ea5870c2121d2a33132857e" - integrity sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA== - hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -5400,10 +6195,15 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" -human-signals@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" - integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +hyperlinker@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hyperlinker/-/hyperlinker-1.0.0.tgz#23dc9e38a206b208ee49bc2d6c8ef47027df0c0e" + integrity sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ== iconv-lite@0.4.24: version "0.4.24" @@ -5431,6 +6231,11 @@ ieee754@^1.1.13, ieee754@^1.2.1: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== +ignore@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" + integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== + immediate@^3.2.3: version "3.3.0" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" @@ -5441,17 +6246,17 @@ immediate@~3.2.3: resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c" integrity sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw= -immutable@3.8.2: - version "3.8.2" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" - integrity sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg== +immutable@4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.2.1.tgz#8a4025691018c560a40c67e43d698f816edc44d4" + integrity sha512-7WYV7Q5BTs0nlQm7tl92rDYYoyELLKHoDMBKhrxEoiV4mrfVdRz8hzPiYOzH7yWjzoVEamxRuAqhxL2PLRwZYQ== immutable@^4.0.0-rc.12: version "4.0.0" resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0.tgz#b86f78de6adef3608395efb269a91462797e2c23" integrity sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw== -import-fresh@^3.1.0: +import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -5482,6 +6287,20 @@ inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, i resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +interface-datastore@^6.0.2: + version "6.1.1" + resolved "https://registry.yarnpkg.com/interface-datastore/-/interface-datastore-6.1.1.tgz#5150a00de2e7513eaadba58bcafd059cb50004c1" + integrity sha512-AmCS+9CT34pp2u0QQVXjKztkuq3y5T+BIciuiHDDtDZucZD8VudosnSdUyXJV6IsRkN5jc4RFDhCk1O6Q3Gxjg== + dependencies: + interface-store "^2.0.2" + nanoid "^3.0.2" + uint8arrays "^3.0.0" + +interface-store@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/interface-store/-/interface-store-2.0.2.tgz#83175fd2b0c501585ed96db54bb8ba9d55fce34c" + integrity sha512-rScRlhDcz6k199EkHqT8NpM87ebN89ICOzILoBHgaG36/WX50N32BnU/kpZgCGPLhARRAWUUX5/cyaIjt7Kipg== + internal-slot@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" @@ -5510,136 +6329,105 @@ io-ts@1.10.4: dependencies: fp-ts "^1.0.0" -ip-regex@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" - integrity sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw== - ip-regex@^4.0.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== -ip@^1.1.5: - version "1.1.8" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" - integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== - ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -ipfs-block@~0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/ipfs-block/-/ipfs-block-0.8.1.tgz#05e1068832775e8f1c2da5b64106cc837fd2acb9" - integrity sha512-0FaCpmij+jZBoUYhjoB5ptjdl9QzvrdRIoBmUU5JiBnK2GA+4YM/ifklaB8ePRhA/rRzhd+KYBjvMFMAL4NrVQ== - dependencies: - cids "~0.7.0" - class-is "^1.1.0" - -ipfs-http-client@34.0.0: - version "34.0.0" - resolved "https://registry.yarnpkg.com/ipfs-http-client/-/ipfs-http-client-34.0.0.tgz#8804d06a11c22306332a8ffa0949b6f672a0c9c8" - integrity sha512-4RCkk8ix4Dqn6sxqFVwuXWCZ1eLFPsVaj6Ijvu1fs9VYgxgVudsW9PWwarlr4mw1xUCmPWYyXnEbGgzBrfMy0Q== +ipfs-core-types@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/ipfs-core-types/-/ipfs-core-types-0.9.0.tgz#cb201ff7a9470651ba14c4e7fae56661a55bf37e" + integrity sha512-VJ8vJSHvI1Zm7/SxsZo03T+zzpsg8pkgiIi5hfwSJlsrJ1E2v68QPlnLshGHUSYw89Oxq0IbETYl2pGTFHTWfg== dependencies: - abort-controller "^3.0.0" - async "^2.6.1" - bignumber.js "^9.0.0" - bl "^3.0.0" - bs58 "^4.0.1" - buffer "^5.4.2" - cids "~0.7.1" - concat-stream "github:max-mapper/concat-stream#feat/smaller" - debug "^4.1.0" - detect-node "^2.0.4" - end-of-stream "^1.4.1" - err-code "^2.0.0" - explain-error "^1.0.4" - flatmap "0.0.3" - glob "^7.1.3" - ipfs-block "~0.8.1" - ipfs-utils "~0.0.3" - ipld-dag-cbor "~0.15.0" - ipld-dag-pb "~0.17.3" - ipld-raw "^4.0.0" - is-ipfs "~0.6.1" - is-pull-stream "0.0.0" - is-stream "^2.0.0" - iso-stream-http "~0.1.2" - iso-url "~0.4.6" - iterable-ndjson "^1.1.0" - just-kebab-case "^1.1.0" - just-map-keys "^1.1.0" - kind-of "^6.0.2" - ky "^0.11.2" - ky-universal "^0.2.2" - lru-cache "^5.1.1" - multiaddr "^6.0.6" - multibase "~0.6.0" - multicodec "~0.5.1" - multihashes "~0.4.14" - ndjson "github:max-mapper/ndjson#feat/readable-stream3" - once "^1.4.0" - peer-id "~0.12.3" - peer-info "~0.15.1" - promise-nodeify "^3.0.1" - promisify-es6 "^1.0.3" - pull-defer "~0.2.3" - pull-stream "^3.6.9" - pull-to-stream "~0.1.1" - pump "^3.0.0" - qs "^6.5.2" - readable-stream "^3.1.1" - stream-to-pull-stream "^1.7.2" - tar-stream "^2.0.1" - through2 "^3.0.1" + interface-datastore "^6.0.2" + multiaddr "^10.0.0" + multiformats "^9.4.13" -ipfs-utils@~0.0.3: - version "0.0.4" - resolved "https://registry.yarnpkg.com/ipfs-utils/-/ipfs-utils-0.0.4.tgz#946114cfeb6afb4454b4ccb10d2327cd323b0cce" - integrity sha512-7cZf6aGj2FG3XJWhCNwn4mS93Q0GEWjtBZvEHqzgI43U2qzNDCyzfS1pei1Y5F+tw/zDJ5U4XG0G9reJxR53Ig== +ipfs-core-utils@^0.13.0: + version "0.13.0" + resolved "https://registry.yarnpkg.com/ipfs-core-utils/-/ipfs-core-utils-0.13.0.tgz#8f0ec9aaa7c24f6f307e6e76e7bdc1cefd829894" + integrity sha512-HP5EafxU4/dLW3U13CFsgqVO5Ika8N4sRSIb/dTg16NjLOozMH31TXV0Grtu2ZWo1T10ahTzMvrfT5f4mhioXw== dependencies: - buffer "^5.2.1" - is-buffer "^2.0.3" - is-electron "^2.2.0" - is-pull-stream "0.0.0" - is-stream "^2.0.0" - kind-of "^6.0.2" - readable-stream "^3.4.0" + any-signal "^2.1.2" + blob-to-it "^1.0.1" + browser-readablestream-to-it "^1.0.1" + debug "^4.1.1" + err-code "^3.0.1" + ipfs-core-types "^0.9.0" + ipfs-unixfs "^6.0.3" + ipfs-utils "^9.0.2" + it-all "^1.0.4" + it-map "^1.0.4" + it-peekable "^1.0.2" + it-to-stream "^1.0.0" + merge-options "^3.0.4" + multiaddr "^10.0.0" + multiaddr-to-uri "^8.0.0" + multiformats "^9.4.13" + nanoid "^3.1.23" + parse-duration "^1.0.0" + timeout-abort-controller "^2.0.0" + uint8arrays "^3.0.0" -ipld-dag-cbor@~0.15.0: - version "0.15.3" - resolved "https://registry.yarnpkg.com/ipld-dag-cbor/-/ipld-dag-cbor-0.15.3.tgz#283afdb81d5b07db8e4fff7a10ef5e517e87f299" - integrity sha512-m23nG7ZyoVFnkK55/bLAErc7EfiMgaEQlqHWDTGzPI+O5r6bPfp+qbL5zTVSIT8tpbHmu174dwerVtLoVgeVyA== +ipfs-http-client@55.0.0: + version "55.0.0" + resolved "https://registry.yarnpkg.com/ipfs-http-client/-/ipfs-http-client-55.0.0.tgz#8b713c5fa318e873b7d7ad099a4eb14320a5b0ce" + integrity sha512-GpvEs7C7WL9M6fN/kZbjeh4Y8YN7rY8b18tVWZnKxRsVwM25cIFrRI8CwNt3Ugin9yShieI3i9sPyzYGMrLNnQ== dependencies: - borc "^2.1.2" - buffer "^5.5.0" - cids "~0.8.0" - is-circular "^1.0.2" - multicodec "^1.0.0" - multihashing-async "~0.8.0" + "@ipld/dag-cbor" "^7.0.0" + "@ipld/dag-json" "^8.0.1" + "@ipld/dag-pb" "^2.1.3" + abort-controller "^3.0.0" + any-signal "^2.1.2" + debug "^4.1.1" + err-code "^3.0.1" + ipfs-core-types "^0.9.0" + ipfs-core-utils "^0.13.0" + ipfs-utils "^9.0.2" + it-first "^1.0.6" + it-last "^1.0.4" + merge-options "^3.0.4" + multiaddr "^10.0.0" + multiformats "^9.4.13" + native-abort-controller "^1.0.3" + parse-duration "^1.0.0" + stream-to-it "^0.2.2" + uint8arrays "^3.0.0" -ipld-dag-pb@~0.17.3: - version "0.17.4" - resolved "https://registry.yarnpkg.com/ipld-dag-pb/-/ipld-dag-pb-0.17.4.tgz#080841cfdd014d996f8da7f3a522ec8b1f6b6494" - integrity sha512-YwCxETEMuXVspOKOhjIOHJvKvB/OZfCDkpSFiYBQN2/JQjM9y/RFCYzIQGm0wg7dCFLrhvfjAZLTSaKs65jzWA== +ipfs-unixfs@^6.0.3: + version "6.0.9" + resolved "https://registry.yarnpkg.com/ipfs-unixfs/-/ipfs-unixfs-6.0.9.tgz#f6613b8e081d83faa43ed96e016a694c615a9374" + integrity sha512-0DQ7p0/9dRB6XCb0mVCTli33GzIzSVx5udpJuVM47tGcD+W+Bl4LsnoLswd3ggNnNEakMv1FdoFITiEnchXDqQ== dependencies: - cids "~0.7.0" - class-is "^1.1.0" - multicodec "~0.5.1" - multihashing-async "~0.7.0" - protons "^1.0.1" - stable "~0.1.8" + err-code "^3.0.1" + protobufjs "^6.10.2" -ipld-raw@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/ipld-raw/-/ipld-raw-4.0.1.tgz#49a6f58cdfece5a4d581925b19ee19255be2a29d" - integrity sha512-WjIdtZ06jJEar8zh+BHB84tE6ZdbS/XNa7+XCArOYfmeJ/c01T9VQpeMwdJQYn5c3s5UvvCu7y4VIi3vk2g1bA== +ipfs-utils@^9.0.2: + version "9.0.14" + resolved "https://registry.yarnpkg.com/ipfs-utils/-/ipfs-utils-9.0.14.tgz#24f5fda1f4567685eb32bca2543d518f95fd8704" + integrity sha512-zIaiEGX18QATxgaS0/EOQNoo33W0islREABAcxXE8n7y2MGAlB+hdsxXn4J0hGZge8IqVQhW8sWIb+oJz2yEvg== dependencies: - cids "~0.7.0" - multicodec "^1.0.0" - multihashing-async "~0.8.0" + any-signal "^3.0.0" + browser-readablestream-to-it "^1.0.0" + buffer "^6.0.1" + electron-fetch "^1.7.2" + err-code "^3.0.1" + is-electron "^2.2.0" + iso-url "^1.1.5" + it-all "^1.0.4" + it-glob "^1.0.1" + it-to-stream "^1.0.0" + merge-options "^3.0.4" + nanoid "^3.1.20" + native-fetch "^3.0.0" + node-fetch "^2.6.8" + react-native-fetch-api "^3.0.0" + stream-to-it "^0.2.2" is-accessor-descriptor@^0.1.6: version "0.1.6" @@ -5695,7 +6483,7 @@ is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-buffer@^2.0.3, is-buffer@^2.0.5, is-buffer@~2.0.3: +is-buffer@^2.0.5, is-buffer@~2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== @@ -5712,11 +6500,6 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-circular@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-circular/-/is-circular-1.0.2.tgz#2e0ab4e9835f4c6b0ea2b9855a84acd501b8366c" - integrity sha512-YttjnrswnUYRVJvxCvu8z+PGMUSzC2JttP0OEXezlAEdp3EXzhf7IZ3j0gRAybJBQupedIZFhY61Tga6E0qASA== - is-core-module@^2.8.1: version "2.8.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" @@ -5839,13 +6622,6 @@ is-interactive@^1.0.0: resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== -is-ip@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-2.0.0.tgz#68eea07e8a0a0a94c2d080dd674c731ab2a461ab" - integrity sha512-9MTn0dteHETtyUx8pxqMwg5hMBi3pvlyglJ+b79KOCca0po23337LbVV2Hl4xmMvfw++ljnO0/+5G6G+0Szh6g== - dependencies: - ip-regex "^2.0.0" - is-ip@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-3.1.0.tgz#2ae5ddfafaf05cb8008a62093cf29734f657c5d8" @@ -5853,18 +6629,6 @@ is-ip@^3.1.0: dependencies: ip-regex "^4.0.0" -is-ipfs@~0.6.1: - version "0.6.3" - resolved "https://registry.yarnpkg.com/is-ipfs/-/is-ipfs-0.6.3.tgz#82a5350e0a42d01441c40b369f8791e91404c497" - integrity sha512-HyRot1dvLcxImtDqPxAaY1miO6WsiP/z7Yxpg2qpaLWv5UdhAPtLvHJ4kMLM0w8GSl8AFsVF23PHe1LzuWrUlQ== - dependencies: - bs58 "^4.0.1" - cids "~0.7.0" - mafmt "^7.0.0" - multiaddr "^7.2.1" - multibase "~0.6.0" - multihashes "~0.4.13" - is-negative-zero@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" @@ -5911,16 +6675,6 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-promise@~1, is-promise@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-1.0.1.tgz#31573761c057e33c2e91aab9e96da08cefbe76e5" - integrity sha512-mjWH5XxnhMA8cFnDchr6qRP9S/kLntKuEfIYku+PaN1CnS8v+OG9O/BKpRCVRJvpIkgAZm0Pf5Is3iSSOILlcg== - -is-pull-stream@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/is-pull-stream/-/is-pull-stream-0.0.0.tgz#a3bc3d1c6d3055151c46bde6f399efed21440ca9" - integrity sha512-NWLwqCc95I6m8FZDYLAmVJc9Xgk8O+8pPOoDKFTC293FH4S7FBcbLCw3WWPCdiT8uUSdzPy47VM08WPDMJJrag== - is-regex@^1.0.4, is-regex@^1.1.4, is-regex@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -5995,7 +6749,7 @@ is-windows@^1.0.2: resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== -is-wsl@^2.1.1: +is-wsl@^2.1.1, is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== @@ -6017,27 +6771,10 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -iso-random-stream@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/iso-random-stream/-/iso-random-stream-1.1.2.tgz#c703da2c518db573277c5678cc43c5298283d64c" - integrity sha512-7y0tsBBgQs544iTYjyrMp5xvgrbYR8b+plQq1Bryp+03p0LssrxC9C1M0oHv4QESDt7d95c74XvMk/yawKqX+A== - dependencies: - buffer "^6.0.3" - readable-stream "^3.4.0" - -iso-stream-http@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/iso-stream-http/-/iso-stream-http-0.1.2.tgz#b3dfea4c9f23ff26d078d40c539cfc0dfebacd37" - integrity sha512-oHEDNOysIMTNypbg2f1SlydqRBvjl4ZbSE9+0awVxnkx3K2stGTFwB/kpVqnB6UEfF8QD36kAjDwZvqyXBLMnQ== - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^3.1.1" - -iso-url@~0.4.6, iso-url@~0.4.7: - version "0.4.7" - resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-0.4.7.tgz#de7e48120dae46921079fe78f325ac9e9217a385" - integrity sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog== +iso-url@^1.1.5: + version "1.2.1" + resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-1.2.1.tgz#db96a49d8d9a64a1c889fc07cc525d093afb1811" + integrity sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng== isobject@^2.0.0: version "2.1.0" @@ -6051,6 +6788,11 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= +isomorphic-ws@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" + integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -6064,36 +6806,90 @@ isurl@^1.0.0-alpha5: has-to-string-tag-x "^1.2.0" is-object "^1.0.1" -iterable-ndjson@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/iterable-ndjson/-/iterable-ndjson-1.1.0.tgz#36f7e8a5bb04fd087d384f29e44fc4280fc014fc" - integrity sha512-OOp1Lb0o3k5MkXHx1YaIY5Z0ELosZfTnBaas9f8opJVcZGBIONA2zY/6CYE+LKkqrSDooIneZbrBGgOZnHPkrg== +it-all@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/it-all/-/it-all-1.0.6.tgz#852557355367606295c4c3b7eff0136f07749335" + integrity sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A== + +it-first@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/it-first/-/it-first-1.0.7.tgz#a4bef40da8be21667f7d23e44dae652f5ccd7ab1" + integrity sha512-nvJKZoBpZD/6Rtde6FXqwDqDZGF1sCADmr2Zoc0hZsIvnE449gRFnGctxDf09Bzc/FWnHXAdaHVIetY6lrE0/g== + +it-glob@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/it-glob/-/it-glob-1.0.2.tgz#bab9b04d6aaac42884502f3a0bfee84c7a29e15e" + integrity sha512-Ch2Dzhw4URfB9L/0ZHyY+uqOnKvBNeS/SMcRiPmJfpHiM0TsUZn+GkpcZxAoF3dJVdPm/PuIk3A4wlV7SUo23Q== dependencies: - string_decoder "^1.2.0" + "@types/minimatch" "^3.0.4" + minimatch "^3.0.4" -jayson@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/jayson/-/jayson-3.2.0.tgz#df6d8139cd9f6ee2f56c8c2deaee448da7eccf1b" - integrity sha512-DZQnwA57GcStw4soSYB2VntWXFfoWvmSarlaWePDYOWhjxT72PBM4atEBomaTaS1uqk3jFC9UO9AyWjlujo3xw== - dependencies: - "@types/connect" "^3.4.32" - "@types/express-serve-static-core" "^4.16.9" - "@types/lodash" "^4.14.139" - "@types/node" "^12.7.7" - JSONStream "^1.3.1" - commander "^2.12.2" +it-last@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/it-last/-/it-last-1.0.6.tgz#4106232e5905ec11e16de15a0e9f7037eaecfc45" + integrity sha512-aFGeibeiX/lM4bX3JY0OkVCFkAw8+n9lkukkLNivbJRvNz8lI3YXv5xcqhFUV2lDJiraEK3OXRDbGuevnnR67Q== + +it-map@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/it-map/-/it-map-1.0.6.tgz#6aa547e363eedcf8d4f69d8484b450bc13c9882c" + integrity sha512-XT4/RM6UHIFG9IobGlQPFQUrlEKkU4eBUFG3qhWhfAdh1JfF2x11ShCrKCdmZ0OiZppPfoLuzcfA4cey6q3UAQ== + +it-peekable@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/it-peekable/-/it-peekable-1.0.3.tgz#8ebe933767d9c5aa0ae4ef8e9cb3a47389bced8c" + integrity sha512-5+8zemFS+wSfIkSZyf0Zh5kNN+iGyccN02914BY4w/Dj+uoFEoPSvj5vaWn8pNZJNSxzjW0zHRxC3LUb2KWJTQ== + +it-to-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/it-to-stream/-/it-to-stream-1.0.0.tgz#6c47f91d5b5df28bda9334c52782ef8e97fe3a4a" + integrity sha512-pLULMZMAB/+vbdvbZtebC0nWBTbG581lk6w8P7DfIIIKUfa8FbY7Oi0FxZcFPbxvISs7A9E+cMpLDBc1XhpAOA== + dependencies: + buffer "^6.0.3" + fast-fifo "^1.0.0" + get-iterator "^1.0.2" + p-defer "^3.0.0" + p-fifo "^1.0.0" + readable-stream "^3.6.0" + +jake@^10.6.1, jake@^10.8.5: + version "10.8.7" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f" + integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + +jayson@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jayson/-/jayson-4.0.0.tgz#145a0ced46f900934c9b307e1332bcb0c7dbdb17" + integrity sha512-v2RNpDCMu45fnLzSk47vx7I+QUaOsox6f5X0CUlabAFwxoP+8MfAY0NQRFwOEYXIxm8Ih5y6OaEa5KYiQMkyAA== + dependencies: + "@types/connect" "^3.4.33" + "@types/node" "^12.12.54" + "@types/ws" "^7.4.4" + JSONStream "^1.3.5" + commander "^2.20.3" + delay "^5.0.0" es6-promisify "^5.0.0" eyes "^0.1.8" + isomorphic-ws "^4.0.1" json-stringify-safe "^5.0.1" - lodash "^4.17.15" - uuid "^3.2.1" + uuid "^8.3.2" + ws "^7.4.5" + +js-sdsl@^4.1.4: + version "4.4.2" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.2.tgz#2e3c031b1f47d3aca8b775532e3ebb0818e7f847" + integrity sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w== js-sha3@0.5.7, js-sha3@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc= -js-sha3@0.8.0, js-sha3@^0.8.0, js-sha3@~0.8.0: +js-sha3@0.8.0, js-sha3@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== @@ -6116,7 +6912,15 @@ js-yaml@3.13.1: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@4.1.0: +js-yaml@3.14.1, js-yaml@^3.14.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@4.1.0, js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== @@ -6194,13 +6998,6 @@ json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -json-text-sequence@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/json-text-sequence/-/json-text-sequence-0.1.1.tgz#a72f217dc4afc4629fff5feb304dc1bd51a2f3d2" - integrity sha512-L3mEegEWHRekSHjc7+sc8eJhba9Clq1PZ8kMkzf8OxElhXc8O4TS5MwcVlj9aEbm5dr81N90WHC5nAz3UO971w== - dependencies: - delimit-stream "0.1.0" - json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" @@ -6249,16 +7046,6 @@ jsprim@^1.2.2: json-schema "0.4.0" verror "1.10.0" -just-kebab-case@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/just-kebab-case/-/just-kebab-case-1.1.0.tgz#ebe854fde84b0afa4e597fcd870b12eb3c026755" - integrity sha512-QkuwuBMQ9BQHMUEkAtIA4INLrkmnnveqlFB1oFi09gbU0wBdZo6tTnyxNWMR84zHxBuwK7GLAwqN8nrvVxOLTA== - -just-map-keys@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/just-map-keys/-/just-map-keys-1.2.1.tgz#ef6e16133b7d34329962dfae9101d581abb1b143" - integrity sha512-Dmyz1Cy2SWM+PpqDPB1kdDglyexdzMthnAsvOIE9w4OPj8NDRuY1mh20x/JfG5w6fCGw9F0WmcofJhYZ4MiuyA== - keccak@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.1.tgz#ae30a0e94dbe43414f741375cff6d64c8bea0bff" @@ -6286,10 +7073,14 @@ keccak@^2.0.0: nan "^2.14.0" safe-buffer "^5.2.0" -keypair@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/keypair/-/keypair-1.0.4.tgz#a749a45f388593f3950f18b3757d32a93bd8ce83" - integrity sha512-zwhgOhhniaL7oxMgUMKKw5219PWWABMO+dgMnzJOQ2/5L3XJtTJGhW2PEXlxXj9zaccdReZJZ83+4NPhVfNVDg== +keccak@^3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d" + integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" keyv@^3.0.0: version "3.1.0" @@ -6336,19 +7127,6 @@ klaw@^1.0.0: optionalDependencies: graceful-fs "^4.1.9" -ky-universal@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/ky-universal/-/ky-universal-0.2.2.tgz#7a36e1a75641a98f878157463513965f799f5bfe" - integrity sha512-fb32o/fKy/ux2ALWa9HU2hvGtfOq7/vn2nH0FpVE+jwNzyTeORlAbj3Fiw+WLMbUlmVqZIWupnLZ2USHvqwZHw== - dependencies: - abort-controller "^3.0.0" - node-fetch "^2.3.0" - -ky@^0.11.2: - version "0.11.2" - resolved "https://registry.yarnpkg.com/ky/-/ky-0.11.2.tgz#4ffe6621d9d9ab61bf0f5500542e3a96d1ba0815" - integrity sha512-5Aou5BWue5/mkPqIRqzSWW+0Hkl403pr/2AIrCKYw7cVl/Xoe8Xe4KLBO0PRjbz7GnRe1/8wW1KhqQNFFE7/GQ== - lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" @@ -6375,11 +7153,6 @@ level-concat-iterator@^3.0.0: dependencies: catering "^2.1.0" -level-concat-iterator@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263" - integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw== - level-errors@^1.0.3: version "1.1.2" resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.1.2.tgz#4399c2f3d3ab87d0625f7e3676e2d807deff404d" @@ -6429,15 +7202,6 @@ level-iterator-stream@~3.0.0: readable-stream "^2.3.6" xtend "^4.0.0" -level-iterator-stream@~4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c" - integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q== - dependencies: - inherits "^2.0.4" - readable-stream "^3.4.0" - xtend "^4.0.2" - level-mem@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-3.0.1.tgz#7ce8cf256eac40f716eb6489654726247f5a89e5" @@ -6446,22 +7210,6 @@ level-mem@^3.0.1: level-packager "~4.0.0" memdown "~3.0.0" -level-mem@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-5.0.1.tgz#c345126b74f5b8aa376dc77d36813a177ef8251d" - integrity sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg== - dependencies: - level-packager "^5.0.3" - memdown "^5.0.0" - -level-packager@^5.0.3: - version "5.1.1" - resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939" - integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ== - dependencies: - encoding-down "^6.3.0" - levelup "^4.3.2" - level-packager@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-4.0.1.tgz#7e7d3016af005be0869bc5fa8de93d2a7f56ffe6" @@ -6503,13 +7251,6 @@ level-supports@^4.0.0: resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a" integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA== -level-supports@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d" - integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg== - dependencies: - xtend "^4.0.2" - level-transcoder@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c" @@ -6535,14 +7276,13 @@ level-ws@^1.0.0: readable-stream "^2.2.8" xtend "^4.0.1" -level-ws@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-2.0.0.tgz#207a07bcd0164a0ec5d62c304b4615c54436d339" - integrity sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA== +level@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/level/-/level-8.0.0.tgz#41b4c515dabe28212a3e881b61c161ffead14394" + integrity sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ== dependencies: - inherits "^2.0.3" - readable-stream "^3.1.0" - xtend "^4.0.1" + browser-level "^1.0.1" + classic-level "^1.2.0" leveldown@6.1.0: version "6.1.0" @@ -6576,51 +7316,6 @@ levelup@^1.2.1: semver "~5.4.1" xtend "~4.0.0" -levelup@^4.3.2: - version "4.4.0" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6" - integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ== - dependencies: - deferred-leveldown "~5.3.0" - level-errors "~2.0.0" - level-iterator-stream "~4.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - -libp2p-crypto-secp256k1@~0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/libp2p-crypto-secp256k1/-/libp2p-crypto-secp256k1-0.3.1.tgz#4cbeb857f5cfe5fefb1253e6b2994420c0ca166e" - integrity sha512-evrfK/CeUSd/lcELUdDruyPBvxDmLairth75S32OLl3H+++2m2fV24JEtxzdFS9JH3xEFw0h6JFO8DBa1bP9dA== - dependencies: - async "^2.6.2" - bs58 "^4.0.1" - multihashing-async "~0.6.0" - nodeify "^1.0.1" - safe-buffer "^5.1.2" - secp256k1 "^3.6.2" - -libp2p-crypto@~0.16.1: - version "0.16.4" - resolved "https://registry.yarnpkg.com/libp2p-crypto/-/libp2p-crypto-0.16.4.tgz#fb1a4ba39d56789303947784b5b0d6cefce12fdc" - integrity sha512-II8HxKc9jbmQp34pprlluNxsBCWJDjHRPYJzuRy7ragztNip9Zb7uJ4lCje6gGzz4DNAcHkAUn+GqCIK1592iA== - dependencies: - asmcrypto.js "^2.3.2" - asn1.js "^5.0.1" - async "^2.6.1" - bn.js "^4.11.8" - browserify-aes "^1.2.0" - bs58 "^4.0.1" - iso-random-stream "^1.1.0" - keypair "^1.0.1" - libp2p-crypto-secp256k1 "~0.3.0" - multihashing-async "~0.5.1" - node-forge "^0.10.0" - pem-jwk "^2.0.0" - protons "^1.0.1" - rsa-pem-to-jwk "^1.1.3" - tweetnacl "^1.0.0" - ursa-optional "~0.10.0" - lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" @@ -6770,6 +7465,11 @@ long@^4.0.0: resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== +long@^5.2.0: + version "5.2.3" + resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" + integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== + looper@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/looper/-/looper-2.0.0.tgz#66cd0c774af3d4fedac53794f742db56da8f09ec" @@ -6825,6 +7525,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +"lru-cache@^9.1.1 || ^10.0.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.1.0.tgz#2098d41c2dc56500e6c88584aa656c84de7d0484" + integrity sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag== + lru_map@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" @@ -6840,20 +7545,6 @@ ltgt@~2.1.1: resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.1.3.tgz#10851a06d9964b971178441c23c9e52698eece34" integrity sha1-EIUaBtmWS5cReEQcI8nlJpjuzjQ= -mafmt@^6.0.2: - version "6.0.10" - resolved "https://registry.yarnpkg.com/mafmt/-/mafmt-6.0.10.tgz#3ad251c78f14f8164e66f70fd3265662da41113a" - integrity sha512-FjHDnew6dW9lUu3eYwP0FvvJl9uvNbqfoJM+c1WJcSyutNEIlyu6v3f/rlPnD1cnmue38IjuHlhBdIh3btAiyw== - dependencies: - multiaddr "^6.1.0" - -mafmt@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/mafmt/-/mafmt-7.1.0.tgz#4126f6d0eded070ace7dbbb6fb04977412d380b5" - integrity sha512-vpeo9S+hepT3k2h5iFxzEHvvR0GPBx9uKaErmnRzYNcaKb03DgOArjEMlgG4a9LcuZZ89a3I8xbeto487n26eA== - dependencies: - multiaddr "^7.3.0" - make-error@^1.1.1: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" @@ -6912,18 +7603,6 @@ memdown@^1.0.0: ltgt "~2.2.0" safe-buffer "~5.1.1" -memdown@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/memdown/-/memdown-5.1.0.tgz#608e91a9f10f37f5b5fe767667a8674129a833cb" - integrity sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw== - dependencies: - abstract-leveldown "~6.2.1" - functional-red-black-tree "~1.0.1" - immediate "~3.2.3" - inherits "~2.0.1" - ltgt "~2.2.0" - safe-buffer "~5.2.0" - memdown@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/memdown/-/memdown-3.0.0.tgz#93aca055d743b20efc37492e9e399784f2958309" @@ -6936,6 +7615,15 @@ memdown@~3.0.0: ltgt "~2.2.0" safe-buffer "~5.1.1" +memory-level@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692" + integrity sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og== + dependencies: + abstract-level "^1.0.0" + functional-red-black-tree "^1.0.1" + module-error "^1.0.1" + memorystream@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" @@ -6946,12 +7634,19 @@ merge-descriptors@1.0.1: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= +merge-options@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/merge-options/-/merge-options-3.0.4.tgz#84709c2aa2a4b24c1981f66c179fe5565cc6dbb7" + integrity sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ== + dependencies: + is-plain-obj "^2.1.0" + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.3.0: +merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== @@ -6983,18 +7678,6 @@ merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: rlp "^2.0.0" semaphore ">=1.0.1" -merkle-patricia-tree@^4.2.2, merkle-patricia-tree@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.3.tgz#b4e5d485d231f02b255ed79a7852f9d12ee0c09f" - integrity sha512-S4xevdXl5KvdBGgUxhQcxoep0onqXiIhzfwZp4M78kIuJH3Pu9o9IUgqhzSFOR2ykLO6t265026Xb6PY0q2UFQ== - dependencies: - "@types/levelup" "^4.3.0" - ethereumjs-util "^7.1.4" - level-mem "^5.0.1" - level-ws "^2.0.0" - readable-stream "^3.6.0" - semaphore-async-await "^1.5.1" - methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -7086,13 +7769,34 @@ minimatch@3.0.4: dependencies: brace-expansion "^1.1.7" -minimatch@^3.0.2, minimatch@^3.0.4: +minimatch@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^8.0.2: + version "8.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-8.0.4.tgz#847c1b25c014d4e9a7f68aaf63dedd668a626229" + integrity sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" @@ -7113,6 +7817,16 @@ minipass@^3.0.0: dependencies: yallist "^4.0.0" +minipass@^4.2.4: + version "4.2.8" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.8.tgz#f0010f64393ecfc1d1ccb5f582bcaf45f48e1a3a" + integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": + version "7.0.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== + minizlib@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" @@ -7162,6 +7876,33 @@ mnemonist@^0.38.0: dependencies: obliterator "^2.0.0" +mocha@^10.0.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" + integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== + dependencies: + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.4" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.2.0" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "5.0.1" + ms "2.1.3" + nanoid "3.3.3" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + workerpool "6.2.1" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + mocha@^7.1.1: version "7.2.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604" @@ -7192,7 +7933,7 @@ mocha@^7.1.1: yargs-parser "13.1.2" yargs-unparser "1.6.0" -mocha@^9.0.3, mocha@^9.2.0: +mocha@^9.0.3: version "9.2.1" resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.1.tgz#a1abb675aa9a8490798503af57e8782a78f1338e" integrity sha512-T7uscqjJVS46Pq1XDXyo9Uvey9gd3huT/DD9cYBb4K2Xc/vbKRPUWK067bxDQRK0yIz6Jxk73IrnimvASzBNAQ== @@ -7227,7 +7968,7 @@ mock-fs@^4.1.0: resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18" integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw== -module-error@^1.0.1: +module-error@^1.0.1, module-error@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== @@ -7252,29 +7993,24 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multiaddr@^6.0.3, multiaddr@^6.0.6, multiaddr@^6.1.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/multiaddr/-/multiaddr-6.1.1.tgz#9aae57b3e399089b9896d9455afa8f6b117dff06" - integrity sha512-Q1Ika0F9MNhMtCs62Ue+GWIJtRFEhZ3Xz8wH7/MZDVZTWhil1/H2bEGN02kUees3hkI3q1oHSjmXYDM0gxaFjQ== +multiaddr-to-uri@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/multiaddr-to-uri/-/multiaddr-to-uri-8.0.0.tgz#65efe4b1f9de5f6b681aa42ff36a7c8db7625e58" + integrity sha512-dq4p/vsOOUdVEd1J1gl+R2GFrXJQH8yjLtz4hodqdVbieg39LvBOdMQRdQnfbg5LSM/q1BYNVf5CBbwZFFqBgA== dependencies: - bs58 "^4.0.1" - class-is "^1.1.0" - hi-base32 "~0.5.0" - ip "^1.1.5" - is-ip "^2.0.0" - varint "^5.0.0" + multiaddr "^10.0.0" -multiaddr@^7.2.1, multiaddr@^7.3.0: - version "7.5.0" - resolved "https://registry.yarnpkg.com/multiaddr/-/multiaddr-7.5.0.tgz#976c88e256e512263445ab03b3b68c003d5f485e" - integrity sha512-GvhHsIGDULh06jyb6ev+VfREH9evJCFIRnh3jUt9iEZ6XDbyoisZRFEI9bMvK/AiR6y66y6P+eoBw9mBYMhMvw== +multiaddr@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/multiaddr/-/multiaddr-10.0.1.tgz#0d15848871370860a4d266bb44d93b3dac5d90ef" + integrity sha512-G5upNcGzEGuTHkzxezPrrD6CaIHR9uo+7MwqhNVcXTs33IInon4y7nMiGxl2CY5hG7chvYQUQhz5V52/Qe3cbg== dependencies: - buffer "^5.5.0" - cids "~0.8.0" - class-is "^1.1.0" + dns-over-http-resolver "^1.2.3" + err-code "^3.0.1" is-ip "^3.1.0" - multibase "^0.7.0" - varint "^5.0.0" + multiformats "^9.4.5" + uint8arrays "^3.0.0" + varint "^6.0.0" multibase@^0.7.0: version "0.7.0" @@ -7284,14 +8020,6 @@ multibase@^0.7.0: base-x "^3.0.8" buffer "^5.5.0" -multibase@^1.0.0, multibase@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-1.0.1.tgz#4adbe1de0be8a1ab0274328b653c3f1903476724" - integrity sha512-KcCxpBVY8fdVKu4dJMAahq4F/2Z/9xqEjIiR7PiMe7LRGeorFn2NLmicN6nLBCqQvft6MG2Lc9X5P0IdyvnxEw== - dependencies: - base-x "^3.0.8" - buffer "^5.5.0" - multibase@^4.0.1: version "4.0.6" resolved "https://registry.yarnpkg.com/multibase/-/multibase-4.0.6.tgz#6e624341483d6123ca1ede956208cb821b440559" @@ -7307,14 +8035,14 @@ multibase@~0.6.0: base-x "^3.0.8" buffer "^5.5.0" -multicodec@^0.5.5, multicodec@~0.5.1: +multicodec@^0.5.5: version "0.5.7" resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-0.5.7.tgz#1fb3f9dd866a10a55d226e194abba2dcc1ee9ffd" integrity sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA== dependencies: varint "^5.0.0" -multicodec@^1.0.0, multicodec@^1.0.1: +multicodec@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-1.0.4.tgz#46ac064657c40380c28367c90304d8ed175a714f" integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg== @@ -7330,12 +8058,17 @@ multicodec@^3.0.1: uint8arrays "^3.0.0" varint "^6.0.0" +multiformats@^9.4.13, multiformats@^9.4.5, multiformats@^9.5.4: + version "9.9.0" + resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.9.0.tgz#c68354e7d21037a8f1f8833c8ccd68618e8f1d37" + integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== + multiformats@^9.4.2: version "9.7.1" resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.7.1.tgz#ab348e5fd6f8e7fb3fd56033211bda48854e2173" integrity sha512-TaVmGEBt0fhxiNJMGphBfB+oGvUxFs8KgGvgl8d3C+GWtrFcvXdJ2196eg+dYhmSFClmgFfSfJEklo+SZzdNuw== -multihashes@^0.4.15, multihashes@~0.4.13, multihashes@~0.4.14, multihashes@~0.4.15: +multihashes@^0.4.15, multihashes@~0.4.15: version "0.4.21" resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5" integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw== @@ -7344,15 +8077,6 @@ multihashes@^0.4.15, multihashes@~0.4.13, multihashes@~0.4.14, multihashes@~0.4. multibase "^0.7.0" varint "^5.0.0" -multihashes@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-1.0.1.tgz#a89415d68283cf6287c6e219e304e75ce7fb73fe" - integrity sha512-S27Tepg4i8atNiFaU5ZOm3+gl3KQlUanLs/jWcBxQHFttgq+5x1OgbQmf2d8axJ/48zYGBd/wT9d723USMFduw== - dependencies: - buffer "^5.6.0" - multibase "^1.0.1" - varint "^5.0.0" - multihashes@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-4.0.3.tgz#426610539cd2551edbf533adeac4c06b3b90fb05" @@ -7362,52 +8086,6 @@ multihashes@^4.0.1: uint8arrays "^3.0.0" varint "^5.0.2" -multihashing-async@~0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/multihashing-async/-/multihashing-async-0.5.2.tgz#4af40e0dde2f1dbb12a7c6b265181437ac26b9de" - integrity sha512-mmyG6M/FKxrpBh9xQDUvuJ7BbqT93ZeEeH5X6LeMYKoYshYLr9BDdCsvDtZvn+Egf+/Xi+aOznrWL4vp3s+p0Q== - dependencies: - blakejs "^1.1.0" - js-sha3 "~0.8.0" - multihashes "~0.4.13" - murmurhash3js "^3.0.1" - nodeify "^1.0.1" - -multihashing-async@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/multihashing-async/-/multihashing-async-0.6.0.tgz#c1fc6696a624b9bf39b160b0c4c4e7ba3f394453" - integrity sha512-Qv8pgg99Lewc191A5nlXy0bSd2amfqlafNJZmarU6Sj7MZVjpR94SCxQjf4DwPtgWZkiLqsjUQBXA2RSq+hYyA== - dependencies: - blakejs "^1.1.0" - js-sha3 "~0.8.0" - multihashes "~0.4.13" - murmurhash3js "^3.0.1" - nodeify "^1.0.1" - -multihashing-async@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/multihashing-async/-/multihashing-async-0.7.0.tgz#3234fb98295be84386b85bfd20377d3e5be20d6b" - integrity sha512-SCbfl3f+DzJh+/5piukga9ofIOxwfT05t8R4jfzZIJ88YE9zU9+l3K2X+XB19MYyxqvyK9UJRNWbmQpZqQlbRA== - dependencies: - blakejs "^1.1.0" - buffer "^5.2.1" - err-code "^1.1.2" - js-sha3 "~0.8.0" - multihashes "~0.4.13" - murmurhash3js-revisited "^3.0.0" - -multihashing-async@~0.8.0: - version "0.8.2" - resolved "https://registry.yarnpkg.com/multihashing-async/-/multihashing-async-0.8.2.tgz#3d5da05df27d83be923f6d04143a0954ff87f27f" - integrity sha512-2lKa1autuCy8x7KIEj9aVNbAb3aIMRFYIwN7mq/zD4pxgNIVgGlm+f6GKY4880EOF2Y3GktHYssRy7TAJQ2DyQ== - dependencies: - blakejs "^1.1.0" - buffer "^5.4.3" - err-code "^2.0.0" - js-sha3 "^0.8.0" - multihashes "^1.0.1" - murmurhash3js-revisited "^3.0.0" - murmur-128@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/murmur-128/-/murmur-128-0.2.1.tgz#a9f6568781d2350ecb1bf80c14968cadbeaa4b4d" @@ -7417,31 +8095,11 @@ murmur-128@^0.2.1: fmix "^0.1.0" imul "^1.0.0" -murmurhash3js-revisited@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz#6bd36e25de8f73394222adc6e41fa3fac08a5869" - integrity sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g== - -murmurhash3js@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/murmurhash3js/-/murmurhash3js-3.0.1.tgz#3e983e5b47c2a06f43a713174e7e435ca044b998" - integrity sha512-KL8QYUaxq7kUbcl0Yto51rMcYt7E/4N4BG3/c96Iqw1PQrTRspu8Cpx4TZ4Nunib1d4bEkIH3gjCYlP2RLBdow== - -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - nan@^2.14.0: version "2.15.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== -nan@^2.14.2: - version "2.16.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.16.0.tgz#664f43e45460fb98faf00edca0bb0d7b8dce7916" - integrity sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA== - nano-json-stream-parser@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f" @@ -7452,6 +8110,16 @@ nanoid@3.2.0: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.2.0.tgz#62667522da6673971cca916a6d3eff3f415ff80c" integrity sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA== +nanoid@3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" + integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== + +nanoid@^3.0.2, nanoid@^3.1.20, nanoid@^3.1.23: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -7469,19 +8137,30 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" +napi-macros@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.2.2.tgz#817fef20c3e0e40a963fbf7b37d1600bd0201044" + integrity sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g== + napi-macros@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== -"ndjson@github:max-mapper/ndjson#feat/readable-stream3": - version "1.5.0" - resolved "https://codeload.github.com/max-mapper/ndjson/tar.gz/4db16da6b42e5b39bf300c3a7cde62abb3fa3a11" - dependencies: - json-stringify-safe "^5.0.1" - minimist "^1.2.0" - split2 "^3.1.0" - through2 "^3.0.0" +native-abort-controller@^1.0.3, native-abort-controller@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/native-abort-controller/-/native-abort-controller-1.0.4.tgz#39920155cc0c18209ff93af5bc90be856143f251" + integrity sha512-zp8yev7nxczDJMoP6pDxyD20IU0T22eX8VwN2ztDccKvSZhRaV33yP1BGwKSZfXuqWUzsXopVFjBdau9OOAwMQ== + +native-fetch@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/native-fetch/-/native-fetch-3.0.0.tgz#06ccdd70e79e171c365c75117959cf4fe14a09bb" + integrity sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw== + +natural-orderby@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/natural-orderby/-/natural-orderby-2.0.3.tgz#8623bc518ba162f8ff1cdb8941d74deb0fdcc016" + integrity sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q== negotiator@0.6.3: version "0.6.3" @@ -7511,23 +8190,25 @@ node-environment-flags@1.0.6: object.getownpropertydescriptors "^2.0.3" semver "^5.7.0" -node-fetch@2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" - integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== - node-fetch@2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== -node-fetch@^2.3.0, node-fetch@^2.6.1: +node-fetch@^2.6.1: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== dependencies: whatwg-url "^5.0.0" +node-fetch@^2.6.8: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + node-fetch@~1.7.1: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" @@ -7536,11 +8217,6 @@ node-fetch@~1.7.1: encoding "^0.1.11" is-stream "^1.0.1" -node-forge@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" - integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== - node-gyp-build@4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4" @@ -7551,14 +8227,6 @@ node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== -nodeify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/nodeify/-/nodeify-1.0.1.tgz#64ab69a7bdbaf03ce107b4f0335c87c0b9e91b1d" - integrity sha512-n7C2NyEze8GCo/z73KdbjRsBiLbv6eBn1FxwYKQ23IqGo7pQY3mhQan61Sv7eEDJCiyUjTVrVkXTzJCo1dW7Aw== - dependencies: - is-promise "~1.0.0" - promise "~1.3.0" - nofilter@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" @@ -7584,7 +8252,7 @@ normalize-url@^4.1.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== -npm-run-path@^4.0.0: +npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== @@ -7609,11 +8277,6 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa" - integrity sha512-CdsOUYIh5wIiozhJ3rLQgmUTgcyzFwZZrqhkKhODMoGtPKM+wt0h0CNIoauJWMsS9822EdzPsF/6mb4nLvPN5g== - object-assign@^4, object-assign@^4.0.0, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -7651,6 +8314,11 @@ object-keys@~0.4.0: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= +object-treeify@^1.1.33: + version "1.1.33" + resolved "https://registry.yarnpkg.com/object-treeify/-/object-treeify-1.1.33.tgz#f06fece986830a3cba78ddd32d4c11d1f76cdf40" + integrity sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A== + object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -7720,7 +8388,7 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^5.1.0: +onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== @@ -7739,25 +8407,17 @@ open@^7.4.2: version "4.5.0" resolved "https://github.com/OpenZeppelin/openzeppelin-contracts#dc739dcbe34fb0c7b15c4e197c6ba3fe9b0c8946" -optimist@~0.3.5: - version "0.3.7" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.3.7.tgz#c90941ad59e4273328923074d2cf2e7cbc6ec0d9" - integrity sha512-TCx0dXQzVtSCg2OgY/bO9hjM9cV4XYx09TVK+s3+FhkjT6LovsLe+pPMzpWf+6yXK/hUizs2gUoTw3jHM0VaTQ== - dependencies: - wordwrap "~0.0.2" - -ora@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-4.1.1.tgz#566cc0348a15c36f5f0e979612842e02ba9dddbc" - integrity sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A== +ora@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/ora/-/ora-4.0.2.tgz#0e1e68fd45b135d28648b27cf08081fa6e8a297d" + integrity sha512-YUOZbamht5mfLxPmk4M35CD/5DuOkAacxlEUbStVXpBAt4fyhBf+vZHI/HRkI++QUp3sNoeA2Gw4C+hi4eGSig== dependencies: - chalk "^3.0.0" + chalk "^2.4.2" cli-cursor "^3.1.0" cli-spinners "^2.2.0" is-interactive "^1.0.0" log-symbols "^3.0.0" - mute-stream "0.0.8" - strip-ansi "^6.0.0" + strip-ansi "^5.2.0" wcwidth "^1.0.1" os-homedir@^1.0.0: @@ -7787,16 +8447,24 @@ p-cancelable@^1.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== +p-defer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-3.0.0.tgz#d1dceb4ee9b2b604b1d94ffec83760175d4e6f83" + integrity sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw== + +p-fifo@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-fifo/-/p-fifo-1.0.0.tgz#e29d5cf17c239ba87f51dde98c1d26a9cfe20a63" + integrity sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A== + dependencies: + fast-fifo "^1.0.0" + p-defer "^3.0.0" + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= -p-finally@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" - integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== - p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -7886,6 +8554,11 @@ parse-cache-control@^1.0.1: resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e" integrity sha1-juqz5U+laSD+Fro493+iGqzC104= +parse-duration@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/parse-duration/-/parse-duration-1.1.0.tgz#5192084c5d8f2a3fd676d04a451dbd2e05a1819c" + integrity sha512-z6t9dvSJYaPoQq7quMzdEagSFtpGu+utzHqqxmpVWNNZRIXnvqyCvn9XsTdh7c/w0Bqmdz3RB3YnRaKtpRtEXQ== + parse-headers@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.4.tgz#9eaf2d02bed2d1eff494331ce3df36d7924760bf" @@ -7918,6 +8591,14 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= +password-prompt@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/password-prompt/-/password-prompt-1.1.3.tgz#05e539f4e7ca4d6c865d479313f10eb9db63ee5f" + integrity sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw== + dependencies: + ansi-escapes "^4.3.2" + cross-spawn "^7.0.3" + patch-package@6.2.2: version "6.2.2" resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.2.2.tgz#71d170d650c65c26556f0d0fbbb48d92b6cc5f39" @@ -7997,6 +8678,14 @@ path-parse@^1.0.6, path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-scurry@^1.6.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== + dependencies: + lru-cache "^9.1.1 || ^10.0.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -8032,33 +8721,6 @@ pbkdf2@^3.0.17, pbkdf2@^3.0.3, pbkdf2@^3.0.9: safe-buffer "^5.0.1" sha.js "^2.4.8" -peer-id@~0.12.2, peer-id@~0.12.3: - version "0.12.5" - resolved "https://registry.yarnpkg.com/peer-id/-/peer-id-0.12.5.tgz#b22a1edc5b4aaaa2bb830b265ba69429823e5179" - integrity sha512-3xVWrtIvNm9/OPzaQBgXDrfWNx63AftgFQkvqO6YSZy7sP3Fuadwwbn54F/VO9AnpyW/26i0WRQz9FScivXrmw== - dependencies: - async "^2.6.3" - class-is "^1.1.0" - libp2p-crypto "~0.16.1" - multihashes "~0.4.15" - -peer-info@~0.15.1: - version "0.15.1" - resolved "https://registry.yarnpkg.com/peer-info/-/peer-info-0.15.1.tgz#21254a7c516d0dd046b150120b9aaf1b9ad02146" - integrity sha512-Y91Q2tZRC0CpSTPd1UebhGqniOrOAk/aj60uYUcWJXCoLTAnGu+4LJGoiay8ayudS6ice7l3SKhgL/cS62QacA== - dependencies: - mafmt "^6.0.2" - multiaddr "^6.0.3" - peer-id "~0.12.2" - unique-by "^1.0.0" - -pem-jwk@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pem-jwk/-/pem-jwk-2.0.0.tgz#1c5bb264612fc391340907f5c1de60c06d22f085" - integrity sha512-rFxu7rVoHgQ5H9YsP50dDWf0rHjreVA2z0yPiWr5WdH/UHb29hKtF7h6l8vNd1cbYR1t0QL+JKhW55a2ZV4KtA== - dependencies: - asn1.js "^5.0.1" - performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -8086,11 +8748,6 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= -pkginfo@0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff" - integrity sha512-8xCNE/aT/EXKenuMDZ+xTVwkT8gsoHN2z/Q29l80u0ppGEXVvsKRzNMbtKhg8LS8k1tJLAHHylf6p4VFmP6XUQ== - pluralize@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" @@ -8151,11 +8808,6 @@ process@^0.11.10: resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= -promise-nodeify@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/promise-nodeify/-/promise-nodeify-3.0.1.tgz#f0f5d9720ee9ec71dd2bfa92667be504c10229c2" - integrity sha512-ghsSuzZXJX8iO7WVec2z7GI+Xk/EyiD+JZK7AZKhUqYfpLa/Zs4ylUD+CwwnKlG6G3HnkUPMAi6PO7zeqGKssg== - promise-to-callback@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/promise-to-callback/-/promise-to-callback-1.0.0.tgz#5d2a749010bfb67d963598fcd3960746a68feef7" @@ -8171,18 +8823,6 @@ promise@^8.0.0: dependencies: asap "~2.0.6" -promise@~1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/promise/-/promise-1.3.0.tgz#e5cc9a4c8278e4664ffedc01c7da84842b040175" - integrity sha512-R9WrbTF3EPkVtWjp7B7umQGVndpsi+rsDAfrR4xAALQpFLa/+2OriecLhawxzvii2gd9+DZFwROWDuUUaqS5yA== - dependencies: - is-promise "~1" - -promisify-es6@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/promisify-es6/-/promisify-es6-1.0.3.tgz#b012668c4df3c965ce13daac2b3a4d1726a96346" - integrity sha512-N9iVG+CGJsI4b4ZGazjwLnxErD2d9Pe4DPvvXSxYA9tFNu8ymXME4Qs5HIQ0LMJpNM7zj+m0NlNnNeqFpKzqnA== - proper-lockfile@^4.1.1: version "4.1.2" resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz#c8b9de2af6b2f1601067f98e01ac66baa223141f" @@ -8192,20 +8832,24 @@ proper-lockfile@^4.1.1: retry "^0.12.0" signal-exit "^3.0.2" -protocol-buffers-schema@^3.3.1: - version "3.6.0" - resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz#77bc75a48b2ff142c1ad5b5b90c94cd0fa2efd03" - integrity sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw== - -protons@^1.0.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/protons/-/protons-1.2.1.tgz#5f1e0db8b2139469cd1c3b4e332a4c2d95d0a218" - integrity sha512-2oqDyc/SN+tNcJf8XxrXhYL7sQn2/OMl8mSdD7NVGsWjMEmAbks4eDVnCyf0vAoRbBWyWTEXWk4D8XfuKVl3zg== - dependencies: - buffer "^5.5.0" - protocol-buffers-schema "^3.3.1" - signed-varint "^2.0.1" - varint "^5.0.0" +protobufjs@^6.10.2: + version "6.11.4" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.4.tgz#29a412c38bf70d89e537b6d02d904a6f448173aa" + integrity sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw== + 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.1" + "@types/node" ">=13.7.0" + long "^4.0.0" proxy-addr@~2.0.7: version "2.0.7" @@ -8247,7 +8891,7 @@ pull-cat@^1.1.9: resolved "https://registry.yarnpkg.com/pull-cat/-/pull-cat-1.1.11.tgz#b642dd1255da376a706b6db4fa962f5fdb74c31b" integrity sha1-tkLdElXaN2pwa220+pYvX9t0wxs= -pull-defer@^0.2.2, pull-defer@~0.2.3: +pull-defer@^0.2.2: version "0.2.3" resolved "https://registry.yarnpkg.com/pull-defer/-/pull-defer-0.2.3.tgz#4ee09c6d9e227bede9938db80391c3dac489d113" integrity sha512-/An3KE7mVjZCqNhZsr22k1Tx8MACnUnHZZNPSJ0S62td8JtYr/AiRG42Vz7Syu31SoTLUzVIe61jtT/pNdjVYA== @@ -8278,18 +8922,11 @@ pull-pushable@^2.0.0: resolved "https://registry.yarnpkg.com/pull-pushable/-/pull-pushable-2.2.0.tgz#5f2f3aed47ad86919f01b12a2e99d6f1bd776581" integrity sha1-Xy867UethpGfAbEqLpnW8b13ZYE= -pull-stream@^3.2.3, pull-stream@^3.4.0, pull-stream@^3.6.8, pull-stream@^3.6.9: +pull-stream@^3.2.3, pull-stream@^3.4.0, pull-stream@^3.6.8: version "3.6.14" resolved "https://registry.yarnpkg.com/pull-stream/-/pull-stream-3.6.14.tgz#529dbd5b86131f4a5ed636fdf7f6af00781357ee" integrity sha512-KIqdvpqHHaTUA2mCYcLG1ibEbu/LCKoJZsBWyv9lSYtPkJPBq8m3Hxa103xHi6D2thj5YXa0TqK3L3GUkwgnew== -pull-to-stream@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pull-to-stream/-/pull-to-stream-0.1.1.tgz#fa2058528528e3542b81d6f17cbc42288508ff37" - integrity sha512-thZkMv6F9PILt9zdvpI2gxs19mkDrlixYKX6cOBxAW16i1NZH+yLAmF4r8QfJ69zuQh27e01JZP9y27tsH021w== - dependencies: - readable-stream "^3.1.1" - pull-window@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/pull-window/-/pull-window-2.1.4.tgz#fc3b86feebd1920c7ae297691e23f705f88552f0" @@ -8323,30 +8960,40 @@ punycode@2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" integrity sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0= +punycode@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +pvtsutils@^1.3.2, pvtsutils@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.5.tgz#b8705b437b7b134cd7fd858f025a23456f1ce910" + integrity sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA== + dependencies: + tslib "^2.6.1" + +pvutils@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.3.tgz#f35fc1d27e7cd3dfbd39c0826d173e806a03f5a3" + integrity sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ== + qs@6.9.7: version "6.9.7" resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe" integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw== -qs@^6.4.0, qs@^6.7.0, qs@^6.9.4: +qs@^6.4.0, qs@^6.9.4: version "6.10.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== dependencies: side-channel "^1.0.4" -qs@^6.5.2: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - qs@~6.5.2: version "6.5.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" @@ -8371,23 +9018,6 @@ queue-microtask@^1.2.2, queue-microtask@^1.2.3: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -ramda@^0.24.1: - version "0.24.1" - resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.24.1.tgz#c3b7755197f35b8dc3502228262c4c91ddb6b857" - integrity sha512-HEm619G8PaZMfkqCa23qiOe7r3R0brPu7ZgOsgKUsnvLhd0qhc/vTjkUovomgPWa5ECBa08fJZixth9LaoBo5w== - -ramda@^0.25.0: - version "0.25.0" - resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.25.0.tgz#8fdf68231cffa90bc2f9460390a0cb74a29b29a9" - integrity sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ== - -ramdasauce@^2.1.0: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ramdasauce/-/ramdasauce-2.1.3.tgz#acb45ecc7e4fc4d6f39e19989b4a16dff383e9c2" - integrity sha512-Ml3CPim4SKwmg5g9UI77lnRSeKr/kQw7YhQ6rfdMcBYy6DMlwmkEwQqjygJ3OhxPR+NfFfpjKl3Tf8GXckaqqg== - dependencies: - ramda "^0.24.1" - randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.0.6, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -8428,6 +9058,13 @@ raw-body@^2.4.1: iconv-lite "0.4.24" unpipe "1.0.0" +react-native-fetch-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/react-native-fetch-api/-/react-native-fetch-api-3.0.0.tgz#81e1bb6562c292521bc4eca52fe1097f4c1ebab5" + integrity sha512-g2rtqPjdroaboDKTsJCTlcmtw54E25OjyaunUP0anOZn4Fuo2IKs8BVfe02zVggA/UysbmfSnRJIqtNkAgggNA== + dependencies: + p-defer "^3.0.0" + read-pkg-up@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" @@ -8445,15 +9082,6 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -"readable-stream@2 || 3", readable-stream@^3.0.0, readable-stream@^3.0.1, readable-stream@^3.0.2, readable-stream@^3.0.6, readable-stream@^3.1.0, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - readable-stream@^1.0.33: version "1.1.14" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" @@ -8477,6 +9105,15 @@ readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.2.2, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@^3.0.6, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readable-stream@~1.0.15, readable-stream@~1.0.26-4: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" @@ -8494,13 +9131,6 @@ readdirp@~3.2.0: dependencies: picomatch "^2.0.4" -readdirp@~3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" - integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== - dependencies: - picomatch "^2.2.1" - readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -8508,6 +9138,20 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +receptacle@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/receptacle/-/receptacle-1.3.2.tgz#a7994c7efafc7a01d0e2041839dab6c4951360d2" + integrity sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A== + dependencies: + ms "^2.1.1" + +redeyed@~2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b" + integrity sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ== + dependencies: + esprima "~4.0.0" + reduce-flatten@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" @@ -8523,11 +9167,6 @@ regenerator-runtime@^0.11.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== -regenerator-runtime@^0.13.4: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== - regenerator-transform@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" @@ -8730,6 +9369,11 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +retimer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/retimer/-/retimer-3.0.0.tgz#98b751b1feaf1af13eb0228f8ea68b8f9da530df" + integrity sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA== + retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" @@ -8769,20 +9413,12 @@ rlp@^2.0.0, rlp@^2.2.1, rlp@^2.2.2, rlp@^2.2.3, rlp@^2.2.4: dependencies: bn.js "^5.2.0" -rsa-pem-to-jwk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/rsa-pem-to-jwk/-/rsa-pem-to-jwk-1.1.3.tgz#245e76bdb7e7234cfee7ca032d31b54c38fab98e" - integrity sha512-ZlVavEvTnD8Rzh/pdB8NH4VF5GNEtF6biGQcTtC4GKFMsbZR08oHtOYefbhCN+JnJIuMItiCDCMycdcMrw6blA== - dependencies: - object-assign "^2.0.0" - rsa-unpack "0.0.6" - -rsa-unpack@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/rsa-unpack/-/rsa-unpack-0.0.6.tgz#f50ebd56a628378e631f297161026ce9ab4eddba" - integrity sha512-HRrl8GHjjPziPFRDJPq/v5OxZ3IPdksV5h3cime/oHgcgM1k1toO5OdtzClgBqRf5dF6IgptOB0g/zFb0w5zQw== +run-parallel-limit@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz#be80e936f5768623a38a963262d6bef8ff11e7ba" + integrity sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw== dependencies: - optimist "~0.3.5" + queue-microtask "^1.2.2" run-parallel@^1.1.9: version "1.2.0" @@ -8851,7 +9487,7 @@ secp256k1@4.0.3, secp256k1@^4.0.1: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" -secp256k1@^3.0.1, secp256k1@^3.6.2: +secp256k1@^3.0.1: version "3.8.0" resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.8.0.tgz#28f59f4b01dbee9575f56a47034b7d2e3b3b352d" integrity sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw== @@ -8870,11 +9506,6 @@ seedrandom@3.0.1: resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.1.tgz#eb3dde015bcf55df05a233514e5df44ef9dce083" integrity sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg== -semaphore-async-await@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa" - integrity sha1-hXvvXjZEYBykuVcLh+nfXKEpdPo= - semaphore@>=1.0.1, semaphore@^1.0.3, semaphore@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa" @@ -8892,15 +9523,22 @@ semver@7.3.5: dependencies: lru-cache "^6.0.0" +semver@7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.4.0.tgz#8481c92feffc531ab1e012a8ffc15bdd3a0f4318" + integrity sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw== + dependencies: + lru-cache "^6.0.0" + semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.0.0: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== +semver@^7.3.7: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" @@ -9040,18 +9678,11 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.2: +signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -signed-varint@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/signed-varint/-/signed-varint-2.0.1.tgz#50a9989da7c98c2c61dad119bc97470ef8528129" - integrity sha512-abgDPg1106vuZZOvw7cFwdCABddfJRz5akcCcchzTbhyhYnsG31y4AlZEgp315T7W3nQq5P4xeOm186ZiPVFzw== - dependencies: - varint "~5.0.0" - simple-concat@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" @@ -9081,6 +9712,15 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -9182,7 +9822,7 @@ source-map-support@^0.4.15: dependencies: source-map "^0.5.6" -source-map-support@^0.5.13: +source-map-support@^0.5.13, source-map-support@^0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -9243,13 +9883,6 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" -split2@^3.1.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" - integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== - dependencies: - readable-stream "^3.0.0" - sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -9270,11 +9903,6 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" -stable@~0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - stacktrace-parser@^0.1.10: version "0.1.10" resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" @@ -9305,7 +9933,14 @@ stealthy-require@^1.1.1: resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= -stream-to-pull-stream@^1.7.1, stream-to-pull-stream@^1.7.2: +stream-to-it@^0.2.2: + version "0.2.4" + resolved "https://registry.yarnpkg.com/stream-to-it/-/stream-to-it-0.2.4.tgz#d2fd7bfbd4a899b4c0d6a7e6a533723af5749bd0" + integrity sha512-4vEbkSs83OahpmBybNJXlJd7d6/RxzkkSdT3I0mnGt79Xd2Kk+e1JqbvAvsQfCeKj3aKb0QIWkyK3/n0j506vQ== + dependencies: + get-iterator "^1.0.2" + +stream-to-pull-stream@^1.7.1: version "1.7.3" resolved "https://registry.yarnpkg.com/stream-to-pull-stream/-/stream-to-pull-stream-1.7.3.tgz#4161aa2d2eb9964de60bfa1af7feaf917e874ece" integrity sha512-6sNyqJpr5dIOQdgNy/xcDWwDuzAsAwVzhzrWlAPAQ7Lkjx/rv0wgvxEyKwTq6FmNd5rjTrELt/CLmaSw7crMGg== @@ -9313,6 +9948,11 @@ stream-to-pull-stream@^1.7.1, stream-to-pull-stream@^1.7.2: looper "^3.0.0" pull-stream "^3.2.3" +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" @@ -9349,7 +9989,7 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.1.0, string-width@^4.2.0: +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -9383,7 +10023,7 @@ string.prototype.trimstart@^1.0.4: call-bind "^1.0.2" define-properties "^1.1.3" -string_decoder@^1.1.1, string_decoder@^1.2.0: +string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== @@ -9466,7 +10106,7 @@ supports-color@6.0.0: dependencies: has-flag "^3.0.0" -supports-color@8.1.1: +supports-color@8.1.1, supports-color@^8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== @@ -9485,13 +10125,21 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^7.1.0: +supports-color@^7.0.0, supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" +supports-hyperlinks@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" + integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" @@ -9584,17 +10232,6 @@ tar-stream@^1.1.2: to-buffer "^1.1.1" xtend "^4.0.0" -tar-stream@^2.0.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - tar@^4.0.2: version "4.4.19" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" @@ -9658,14 +10295,6 @@ through2@^2.0.3: readable-stream "~2.3.6" xtend "~4.0.1" -through2@^3.0.0, through2@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4" - integrity sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ== - dependencies: - inherits "^2.0.4" - readable-stream "2 || 3" - "through@>=2.2.7 <3", through@~2.3.4, through@~2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -9676,10 +10305,19 @@ timed-out@^4.0.0, timed-out@^4.0.1: resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= -tmp-promise@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.2.tgz#6e933782abff8b00c3119d63589ca1fb9caaa62a" - integrity sha512-OyCLAKU1HzBjL6Ev3gxUeraJNlbNingmi8IrHHEsYH8LTmEuhvYfqvhn2F/je+mjf4N58UmZ96OMEy1JanSCpA== +timeout-abort-controller@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/timeout-abort-controller/-/timeout-abort-controller-2.0.0.tgz#d6a59209132e520413092dd4b4d71eaaf5887feb" + integrity sha512-2FAPXfzTPYEgw27bQGTHc0SzrbmnU2eso4qo172zMLZzaGqeu09PFa5B2FCUHM1tflgRqPgn5KQgp6+Vex4uNA== + dependencies: + abort-controller "^3.0.0" + native-abort-controller "^1.0.4" + retimer "^3.0.0" + +tmp-promise@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" + integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ== dependencies: tmp "^0.2.0" @@ -9774,11 +10412,6 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= -"true-case-path@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-2.2.1.tgz#c5bf04a5bbec3fd118be4084461b3a27c4d796bf" - integrity sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q== - ts-command-line-args@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.2.1.tgz#fd6913e542099012c0ffb2496126a8f38305c7d6" @@ -9846,11 +10479,35 @@ ts-node@^10.1.0: v8-compile-cache-lib "^3.0.0" yn "3.1.1" +ts-node@^10.9.1: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tslib@^2.0.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.5.0, tslib@^2.6.1, tslib@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + tsort@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" @@ -10016,10 +10673,17 @@ underscore@1.9.1: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== -undici@^4.14.1: - version "4.14.1" - resolved "https://registry.yarnpkg.com/undici/-/undici-4.14.1.tgz#7633b143a8a10d6d63335e00511d071e8d52a1d9" - integrity sha512-WJ+g+XqiZcATcBaUeluCajqy4pEDcQfK1vy+Fo+bC4/mqXI9IIQD/XWHLS70fkGUT6P52Drm7IFslO651OdLPQ== +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +undici@^5.14.0: + version "5.28.2" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.2.tgz#fea200eac65fc7ecaff80a023d1a0543423b4c91" + integrity sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w== + dependencies: + "@fastify/busboy" "^2.0.0" union-value@^1.0.0: version "1.0.1" @@ -10031,21 +10695,11 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^2.0.1" -unique-by@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-by/-/unique-by-1.0.0.tgz#5220c86ba7bc572fb713ad74651470cb644212bd" - integrity sha512-rJRXK5V0zL6TiSzhoGNpJp5dr+TZBLoPJFC06rLn17Ug++7Aa0Qnve5v+skXeQxx6/sI7rBsSesa6MAcmFi8Ew== - universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== -universalify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" - integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== - universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" @@ -10113,13 +10767,10 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" -ursa-optional@~0.10.0: - version "0.10.2" - resolved "https://registry.yarnpkg.com/ursa-optional/-/ursa-optional-0.10.2.tgz#bd74e7d60289c22ac2a69a3c8dea5eb2817f9681" - integrity sha512-TKdwuLboBn7M34RcvVTuQyhvrA8gYKapuVdm0nBP0mnBc7oECOfUQZrY91cefL3/nm64ZyrejSRrhTVdX7NG/A== - dependencies: - bindings "^1.5.0" - nan "^2.14.2" +urlpattern-polyfill@^8.0.0: + version "8.0.2" + resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-8.0.2.tgz#99f096e35eff8bf4b5a2aa7d58a1523d6ebc7ce5" + integrity sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ== use@^3.1.0: version "3.1.1" @@ -10176,7 +10827,7 @@ uuid@3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== -uuid@^3.2.1, uuid@^3.3.2: +uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== @@ -10191,6 +10842,11 @@ v8-compile-cache-lib@^3.0.0: resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz#0582bcb1c74f3a2ee46487ceecf372e46bce53e8" integrity sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA== +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -10199,7 +10855,7 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -varint@^5.0.0, varint@^5.0.2, varint@~5.0.0: +varint@^5.0.0, varint@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== @@ -10230,6 +10886,11 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" +web-streams-polyfill@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" + integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== + web3-bzz@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.11.tgz#41bc19a77444bd5365744596d778b811880f707f" @@ -10516,6 +11177,17 @@ web3@1.2.11: web3-shh "1.2.11" web3-utils "1.2.11" +webcrypto-core@^1.7.7: + version "1.7.7" + resolved "https://registry.yarnpkg.com/webcrypto-core/-/webcrypto-core-1.7.7.tgz#06f24b3498463e570fed64d7cab149e5437b162c" + integrity sha512-7FjigXNsBfopEj+5DV2nhNpfic2vumtjjgPmeDKk45z+MJwXKKfhPB7118Pfzrmh4jqOMST6Ch37iPAHoImg5g== + dependencies: + "@peculiar/asn1-schema" "^2.3.6" + "@peculiar/json-schema" "^1.1.12" + asn1js "^3.0.1" + pvtsutils "^1.3.2" + tslib "^2.4.0" + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -10586,7 +11258,7 @@ which@1.3.1, which@^1.2.9: dependencies: isexe "^2.0.0" -which@2.0.2, which@^2.0.0, which@^2.0.1: +which@2.0.2, which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== @@ -10600,15 +11272,22 @@ wide-align@1.1.3: dependencies: string-width "^1.0.2 || 2" +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + window-size@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" integrity sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU= -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw== +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== wordwrapjs@^4.0.0: version "4.0.1" @@ -10623,6 +11302,11 @@ workerpool@6.2.0: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== +workerpool@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" + integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" @@ -10680,6 +11364,11 @@ ws@^5.1.1: dependencies: async-limiter "~1.0.0" +ws@^7.4.5: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + ws@^7.4.6: version "7.5.7" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" @@ -10727,7 +11416,7 @@ xmlhttprequest@1.8.0: resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw= -xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== @@ -10769,14 +11458,7 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@1.9.2: - version "1.9.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.9.2.tgz#f0cfa865f003ab707663e4f04b3956957ea564ed" - integrity sha512-HPT7cGGI0DuRcsO51qC1j9O16Dh1mZ2bnXwsi0jrSpsLz0WxOLSLXfkABVl6bZO629py3CU+OMJtpNHDLB97kg== - dependencies: - "@babel/runtime" "^7.9.2" - -yaml@^1.7.2: +yaml@1.10.2, yaml@^1.10.0, yaml@^1.10.2: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== @@ -10794,14 +11476,6 @@ yargs-parser@20.2.4: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== -yargs-parser@^16.1.0: - version "16.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-16.1.0.tgz#73747d53ae187e7b8dbe333f95714c76ea00ecf1" - integrity sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - yargs-parser@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" @@ -10815,6 +11489,11 @@ yargs-parser@^20.2.2: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== +yargs-parser@^21.0.0: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + yargs-unparser@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" diff --git a/desci-models/.prettierignore b/desci-models/.prettierignore new file mode 100755 index 000000000..53c37a166 --- /dev/null +++ b/desci-models/.prettierignore @@ -0,0 +1 @@ +dist \ No newline at end of file diff --git a/desci-models/.prettierrc b/desci-models/.prettierrc new file mode 100755 index 000000000..6599520f8 --- /dev/null +++ b/desci-models/.prettierrc @@ -0,0 +1,6 @@ +{ + "printWidth": 120, + "semi": true, + "singleQuote": true, + "trailingComma": "all" +} diff --git a/desci-models/README.md b/desci-models/README.md index 405ebeebf..73b57eb52 100644 --- a/desci-models/README.md +++ b/desci-models/README.md @@ -51,11 +51,11 @@ yarn test Create a research object using the provided TypeScript interfaces in the `nodes-models` module: ```typescript -import { ResearchObjectV1 } from "./nodes-models/ResearchObject"; +import { ResearchObjectV1 } from './nodes-models/ResearchObject'; const researchObject: ResearchObjectV1 = { - version: "desci-nodes-0.2.0", - title: "My Research Project", + version: 'desci-nodes-0.2.0', + title: 'My Research Project', // ... }; ``` @@ -65,7 +65,7 @@ const researchObject: ResearchObjectV1 = { Import the `RoCrateTransformer` class and use it to convert a research object to and from the RO-Crate format: ```typescript -import { RoCrateTransformer } from "./nodes-models/transformers/RoCrateTransformer"; +import { RoCrateTransformer } from './nodes-models/transformers/RoCrateTransformer'; const transformer = new RoCrateTransformer(); const roCrate = transformer.exportObject(researchObject); diff --git a/desci-models/package-lock.json b/desci-models/package-lock.json new file mode 100644 index 000000000..a4233902d --- /dev/null +++ b/desci-models/package-lock.json @@ -0,0 +1,3498 @@ +{ + "name": "@desci-labs/desci-models", + "version": "0.1.21", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@desci-labs/desci-models", + "version": "0.1.21", + "license": "MIT", + "dependencies": { + "jsonld": "^8.1.1", + "schema-dts": "^1.1.2", + "typescript": "^4.9.4", + "util": "^0.12.5", + "zod": "^3.20.2" + }, + "devDependencies": { + "@types/chai": "^4.3.4", + "@types/jsonld": "^1.5.8", + "@types/mocha": "^10.0.1", + "@types/node": "^16.11.12", + "chai": "^4.3.7", + "mocha": "^10.2.0", + "nyc": "^15.1.0", + "ts-interface-builder": "^0.3.3", + "ts-interface-checker": "^1.0.2", + "ts-node": "^10.9.1" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.20.10", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz", + "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", + "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.12", + "@babel/types": "^7.20.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", + "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", + "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.10", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz", + "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", + "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", + "dev": true, + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.12.tgz", + "integrity": "sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@digitalbazaar/http-client": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@digitalbazaar/http-client/-/http-client-3.4.0.tgz", + "integrity": "sha512-B/T3Xlo5UjPkoAqX/DQOAF2D5khgNZJZhoQ1d1b3ykYd2XnwOQ6srz1T+SsWVfjbXyLajN7j/nfKy7QiUofN+A==", + "license": "BSD-3-Clause", + "dependencies": { + "ky": "^0.33.3", + "ky-universal": "^0.11.0", + "undici": "^5.21.2" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/jsonld": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@types/jsonld/-/jsonld-1.5.8.tgz", + "integrity": "sha512-4l5t/jDnJpqZ+i7CLTTgPcT5BYXnAnwJupb07aAokPufCV0SjDHcwctUkSTuhIuSU9yHok+WOOngIGCtpL96gw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mocha": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", + "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "16.18.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.23.tgz", + "integrity": "sha512-XAMpaw1s1+6zM+jn2tmw8MyaRDIJfXxqmIQIS0HfoGYPuf7dUWeiUKopwq13KFX9lEp1+THGtlaaYx39Nxr58g==", + "dev": true, + "license": "MIT" + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-require-extensions": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true, + "license": "ISC" + }, + "node_modules/browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001442", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001442.tgz", + "integrity": "sha512-239m03Pqy0hwxYPYR5JwOIxRJfLTWtle9FV8zosfV5pHg+/51uD4nxcUlM8+mWWGfwKtt8lJNHnD3cWw9VZ6ow==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/canonicalize": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/canonicalize/-/canonicalize-1.0.8.tgz", + "integrity": "sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A==", + "license": "Apache-2.0" + }, + "node_modules/chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/default-require-extensions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "license": "MIT" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true, + "license": "ISC" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "append-transform": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", + "dev": true, + "license": "ISC", + "dependencies": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonld": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/jsonld/-/jsonld-8.1.1.tgz", + "integrity": "sha512-TbtV1hlnoDYxbscazbxcS7seDGV+pc0yktxpMySh0OBFvnLw/TIth0jiQtP/9r+ywuCbtj10XjDNBIkRgiyeUg==", + "license": "BSD-3-Clause", + "dependencies": { + "@digitalbazaar/http-client": "^3.2.0", + "canonicalize": "^1.0.1", + "lru-cache": "^6.0.0", + "rdf-canonize": "^3.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/ky": { + "version": "0.33.3", + "resolved": "https://registry.npmjs.org/ky/-/ky-0.33.3.tgz", + "integrity": "sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/ky?sponsor=1" + } + }, + "node_modules/ky-universal": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/ky-universal/-/ky-universal-0.11.0.tgz", + "integrity": "sha512-65KyweaWvk+uKKkCrfAf+xqN2/epw1IJDtlyCPxYffFCMR8u1sp2U65NtWpnozYfZxQ6IUzIlvUcw+hQ82U2Xw==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "node-fetch": "^3.2.10" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/ky-universal?sponsor=1" + }, + "peerDependencies": { + "ky": ">=0.31.4", + "web-streams-polyfill": ">=3.2.1" + }, + "peerDependenciesMeta": { + "web-streams-polyfill": { + "optional": true + } + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/mocha/node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "dev": true, + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.1.tgz", + "integrity": "sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-releases": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", + "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/nyc/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/rdf-canonize": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-3.3.0.tgz", + "integrity": "sha512-gfSNkMua/VWC1eYbSkVaL/9LQhFeOh0QULwv7Or0f+po8pMgQ1blYQFe1r9Mv2GJZXw88Cz/drnAnB9UlNnHfQ==", + "license": "BSD-3-Clause", + "dependencies": { + "setimmediate": "^1.0.5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "dev": true, + "license": "ISC", + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true, + "license": "ISC" + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/schema-dts": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.2.tgz", + "integrity": "sha512-MpNwH0dZJHinVxk9bT8XUdjKTxMYrA5bLtrrGmFA6PTLwlOKnhi67XoRd6/ty+Djt6ZC0slR57qFhZDNMI6DhQ==", + "license": "Apache-2.0", + "peerDependencies": { + "typescript": ">=4.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true, + "license": "ISC" + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-interface-builder": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/ts-interface-builder/-/ts-interface-builder-0.3.3.tgz", + "integrity": "sha512-WHQwVBy0+Sv/jcHhKlyFgTyEVTM0GEPEw+gLmOYlZiJC1/eh5ah2EHSw7o+RUrl2grjEAMU6MTOItCuQIVJvnQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "commander": "^2.12.2", + "fs-extra": "^4.0.3", + "glob": "^7.1.6", + "typescript": "^3.0.0" + }, + "bin": { + "ts-interface-builder": "bin/ts-interface-builder" + } + }, + "node_modules/ts-interface-builder/node_modules/typescript": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-1.0.2.tgz", + "integrity": "sha512-4IKKvhZRXhvtYF/mtu+OCfBqJKV6LczUq4kQYcpT+iSB7++R9+giWnp2ecwWMIcnG16btVOkXFnoxLSYMN1Q1g==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/undici": { + "version": "5.21.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.21.2.tgz", + "integrity": "sha512-f6pTQ9RF4DQtwoWSaC42P/NKlUjvezVvd9r155ohqkwFNRyBKM3f3pcty3ouusefNRyM25XhIQEbeQ46sZDJfQ==", + "license": "MIT", + "dependencies": { + "busboy": "^1.6.0" + }, + "engines": { + "node": ">=12.18" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/yargs/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/yargs/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.20.2", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.20.2.tgz", + "integrity": "sha512-1MzNQdAvO+54H+EaK5YpyEy0T+Ejo/7YLHS93G3RnYWh5gaotGHwGeN/ZO687qEDU2y4CdStQYXVHIgrUl5UVQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/desci-models/package.json b/desci-models/package.json index 84c1f4dae..be668473e 100644 --- a/desci-models/package.json +++ b/desci-models/package.json @@ -1,6 +1,6 @@ { "name": "@desci-labs/desci-models", - "version": "0.1.21", + "version": "0.2.1", "description": "Data models for DeSci Nodes", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -23,10 +23,7 @@ "license": "MIT", "dependencies": { "jsonld": "^8.1.1", - "schema-dts": "^1.1.2", - "typescript": "^4.9.4", - "util": "^0.12.5", - "zod": "^3.20.2" + "schema-dts": "^1.1.2" }, "devDependencies": { "@types/chai": "^4.3.4", @@ -38,6 +35,7 @@ "nyc": "^15.1.0", "ts-interface-builder": "^0.3.3", "ts-interface-checker": "^1.0.2", - "ts-node": "^10.9.1" + "ts-node": "^10.9.1", + "typescript": "^4.9.4" } } diff --git a/desci-models/src/ResearchObject.ts b/desci-models/src/ResearchObject.ts index 49aefa838..cea5e500e 100644 --- a/desci-models/src/ResearchObject.ts +++ b/desci-models/src/ResearchObject.ts @@ -12,12 +12,13 @@ export interface ResearchObjectPreviewResult { } export interface IpldUrl { - ["/"]: string; + ['/']: string; } export interface ResearchObjectV1 extends ResearchObject { - version: "desci-nodes-0.1.0" | "desci-nodes-0.2.0" | 1; + version: 'desci-nodes-0.1.0' | 'desci-nodes-0.2.0' | 1; title?: string; + description?: string; defaultLicense?: string; coverImage?: string | IpldUrl; components: ResearchObjectV1Component[]; @@ -79,12 +80,12 @@ export interface ResearchObjectTransaction { } export enum ResearchObjectValidationType { - GRANT = "grant", - REVIEW = "review", - CONFERENCE = "conference", - AUDIT = "audit", - CERTIFICATION = "certification", - CERTIFICATION_ARC = "certification-arc", + GRANT = 'grant', + REVIEW = 'review', + CONFERENCE = 'conference', + AUDIT = 'audit', + CERTIFICATION = 'certification', + CERTIFICATION_ARC = 'certification-arc', } export interface ResearchObjectValidationDeposit { token: string; @@ -104,13 +105,13 @@ export interface ResearchObjectV1Validation { } export enum ResearchObjectAttributeKey { - ACM_AVAILABLE = "available", - ACM_FUNCTIONAL = "functional", - ACM_REUSABLE = "reusable", - ACM_REPRODUCED = "reproduced", - ACM_REPLICATED = "replicated", - AUTHORSHIP_VERIFIED = "authorship-verified", - COMPUTATIONAL_REPRODUCIBILITY = "computational-reproducibility", + ACM_AVAILABLE = 'available', + ACM_FUNCTIONAL = 'functional', + ACM_REUSABLE = 'reusable', + ACM_REPRODUCED = 'reproduced', + ACM_REPLICATED = 'replicated', + AUTHORSHIP_VERIFIED = 'authorship-verified', + COMPUTATIONAL_REPRODUCIBILITY = 'computational-reproducibility', } export interface ResearchObjectV1Attributes { @@ -119,36 +120,55 @@ export interface ResearchObjectV1Attributes { } export enum ResearchObjectComponentType { - DATA_BUCKET = "data-bucket", - UNKNOWN = "unknown", - PDF = "pdf", - CODE = "code", - VIDEO = "video", - TERMINAL = "terminal", // not used, TODO: remove - DATA = "data", - LINK = "link", // external link + DATA_BUCKET = 'data-bucket', + UNKNOWN = 'unknown', + PDF = 'pdf', + CODE = 'code', + VIDEO = 'video', + TERMINAL = 'terminal', // not used, TODO: remove + DATA = 'data', + LINK = 'link', // external link } export enum ResearchObjectComponentDocumentSubtype { - RESEARCH_ARTICLE = "research-article", - PREREGISTERED_REPORT = "preregistered-report", - PREREGISTERED_ANALYSIS_PLAN = "preregistered-analysis-plan", - SUPPLEMENTARY_INFORMATION = "supplementary-information", - PRESENTATION_DECK = "presentation-deck", - OTHER = "other", + RESEARCH_ARTICLE = 'research-article', + PREREGISTERED_REPORT = 'preregistered-report', + PREREGISTERED_ANALYSIS_PLAN = 'preregistered-analysis-plan', + SUPPLEMENTARY_INFORMATION = 'supplementary-information', + PRESENTATION_DECK = 'presentation-deck', + AUTHOR_ACCEPTED = 'author-accepted', + PREPRINT = 'preprint', + REVIEW_REPORT = 'review-report', + MANUSCRIPT = 'manuscript', + OTHER = 'other', +} + +export enum ResearchObjectComponentDataSubtype { + PROCESSED_DATA = 'processed-data', + RAW_DATA = 'raw-data', + IMAGE = 'image', + OTHER = 'other', +} + +export enum ResearchObjectComponentCodeSubtype { + CODE_SCRIPTS = 'code-scripts', + SOFTWARE_PACKAGE = 'software-package', + OTHER = 'other', } export enum ResearchObjectComponentLinkSubtype { - COMMUNITY_DISCUSSION = "community-discussion", - VIDEO_RESOURCE = "video-resource", - EXTERNAL_API = "external-api", - RESTRICTED_DATA = "restricted", - PRESENTATION_DECK = "presentation-deck", - OTHER = "other", + COMMUNITY_DISCUSSION = 'community-discussion', + VIDEO_RESOURCE = 'video-resource', + EXTERNAL_API = 'external-api', + RESTRICTED_DATA = 'restricted', + PRESENTATION_DECK = 'presentation-deck', + OTHER = 'other', } export type ResearchObjectComponentSubtypes = | ResearchObjectComponentDocumentSubtype + | ResearchObjectComponentDataSubtype + | ResearchObjectComponentCodeSubtype | ResearchObjectComponentLinkSubtype; export interface CommonComponentPayload { @@ -188,8 +208,8 @@ export interface DataComponentPayload { export interface DataBucketComponent extends ResearchObjectV1Component { type: ResearchObjectComponentType.DATA_BUCKET; - id: "root"; - name: "root"; + id: 'root'; + name: 'root'; payload: DataBucketComponentPayload; } export interface DataBucketComponentPayload { @@ -210,11 +230,13 @@ export interface ExternalLinkComponent extends ResearchObjectV1Component { export interface DataComponent extends ResearchObjectV1Component { type: ResearchObjectComponentType.DATA; + subtype?: ResearchObjectComponentDataSubtype; payload: DataComponentPayload & DataComponentMetadata; } export interface CodeComponent extends ResearchObjectV1Component { type: ResearchObjectComponentType.CODE; + subtype?: ResearchObjectComponentCodeSubtype; payload: { language?: string; code?: string; @@ -246,9 +268,7 @@ export interface Scaled { pageIndex?: number; } -export interface PdfAnnotation - extends ResearchObjectComponentAnnotation, - Scaled { +export interface PdfAnnotation extends ResearchObjectComponentAnnotation, Scaled { move?: boolean; text?: string; title?: string; @@ -263,18 +283,18 @@ export interface ResearchObjectComponentAnnotation { } export enum ResearchObjectV1AuthorRole { - AUTHOR = "Author", - NODE_STEWARD = "Node Steward", + AUTHOR = 'Author', + NODE_STEWARD = 'Node Steward', } /** * Maps FileExtensions => ResearchObjectComponentTypes - * @example { + * @example { * '.py': ResearchObjectComponentType.CODE, * '.ipynb': ResearchObjectComponentType.CODE, * '.csv': ResearchObjectComponentType.DATA, * '.pdf': ResearchObjectComponentType.PDF * } */ -export type ResearchObjectComponentTypeMap = Record -export type FileExtension = string; \ No newline at end of file +export type ResearchObjectComponentTypeMap = Record; +export type FileExtension = string; diff --git a/desci-models/src/RoCrate.ts b/desci-models/src/RoCrate.ts index e6286dec4..6d1d29935 100644 --- a/desci-models/src/RoCrate.ts +++ b/desci-models/src/RoCrate.ts @@ -1,16 +1,9 @@ -import { ComputerLanguage } from "schema-dts"; -import { - CreativeWork, - SoftwareSourceCode, - Thing, - Person, - Organization, - Dataset, -} from "schema-dts"; +import { ComputerLanguage } from 'schema-dts'; +import { CreativeWork, SoftwareSourceCode, Thing, Person, Organization, Dataset } from 'schema-dts'; interface RoCrateFormalParameter { - "@type": "FormalParameter"; - "@id": string; + '@type': 'FormalParameter'; + '@id': string; name: string; valueRequired?: boolean; format?: string; @@ -20,7 +13,7 @@ interface RoCrateFormalParameter { } interface RoCrateWorkflow { - "@type": "Workflow"; + '@type': 'Workflow'; conformsTo: string; creator: Person; dateCreated: string; @@ -42,6 +35,6 @@ export type RoCrateGraph = | Dataset; export interface RoCrate { - "@context": string; - "@graph": RoCrateGraph[]; + '@context': string; + '@graph': RoCrateGraph[]; } diff --git a/desci-models/src/constants.ts b/desci-models/src/constants.ts index a877999c9..0f7156f8f 100644 --- a/desci-models/src/constants.ts +++ b/desci-models/src/constants.ts @@ -1,4 +1,4 @@ -import { ResearchObjectComponentType } from "./ResearchObject"; +import { ResearchObjectComponentType } from './ResearchObject'; -export const RESEARCH_OBJECT_NODES_PREFIX = "objects/"; -export const DEFAULT_COMPONENT_TYPE = ResearchObjectComponentType.DATA; \ No newline at end of file +export const RESEARCH_OBJECT_NODES_PREFIX = 'objects/'; +export const DEFAULT_COMPONENT_TYPE = ResearchObjectComponentType.DATA; diff --git a/desci-models/src/index.ts b/desci-models/src/index.ts index 34792777a..acd3254ef 100644 --- a/desci-models/src/index.ts +++ b/desci-models/src/index.ts @@ -1,5 +1,5 @@ -export * from "./ResearchObject"; -export * from "./constants"; -export * from "./transformers/index"; -export * from "./trees/treeTools"; -export * from "./trees/treeTypes"; +export * from './ResearchObject'; +export * from './constants'; +export * from './transformers/index'; +export * from './trees/treeTools'; +export * from './trees/treeTypes'; diff --git a/desci-models/src/transformers/BaseTransformer.ts b/desci-models/src/transformers/BaseTransformer.ts index e1cfc7b52..fd542a6d8 100644 --- a/desci-models/src/transformers/BaseTransformer.ts +++ b/desci-models/src/transformers/BaseTransformer.ts @@ -1,4 +1,4 @@ -import { ResearchObject } from "../ResearchObject"; +import { ResearchObject } from '../ResearchObject'; interface ImportFunc { (input: any): ResearchObject; } diff --git a/desci-models/src/transformers/RdfTransformer.ts b/desci-models/src/transformers/RdfTransformer.ts index 9897b4fdf..06fce30ff 100644 --- a/desci-models/src/transformers/RdfTransformer.ts +++ b/desci-models/src/transformers/RdfTransformer.ts @@ -1,23 +1,23 @@ -import { ResearchObject } from "../ResearchObject"; +import { ResearchObject } from '../ResearchObject'; -import { BaseTransformer } from "./BaseTransformer"; +import { BaseTransformer } from './BaseTransformer'; -import { RoCrateTransformer } from "./RoCrateTransformer"; +import { RoCrateTransformer } from './RoCrateTransformer'; -import { toRDF } from "jsonld"; +import { toRDF } from 'jsonld'; export class RdfTransformer implements BaseTransformer { importObject(input: any): ResearchObject { - throw new Error("importObject method not implemented."); + throw new Error('importObject method not implemented.'); } async exportObject(input: ResearchObject): Promise { const jsonLdData = new RoCrateTransformer().exportObject(input); - console.log("jsonLdData", jsonLdData); + console.log('jsonLdData', jsonLdData); const nquads = await toRDF(jsonLdData, { - format: "application/n-quads", + format: 'application/n-quads', }); return nquads; diff --git a/desci-models/src/transformers/RoCrateTransformer.ts b/desci-models/src/transformers/RoCrateTransformer.ts index e5275be46..a3aff4773 100644 --- a/desci-models/src/transformers/RoCrateTransformer.ts +++ b/desci-models/src/transformers/RoCrateTransformer.ts @@ -1,4 +1,4 @@ -import { CreativeWork, Dataset, SoftwareSourceCode } from "schema-dts"; +import { CreativeWork, Dataset, SoftwareSourceCode } from 'schema-dts'; import { CommonComponentPayload, DataComponentMetadata, @@ -10,65 +10,62 @@ import { ResearchObjectV1, ResearchObjectV1Author, ResearchObjectV1Component, -} from "../ResearchObject"; -import { RoCrateGraph } from "../RoCrate"; -import { BaseTransformer } from "./BaseTransformer"; -import { isNodeRoot, isResearchObjectComponentTypeMap } from "../trees/treeTools"; +} from '../ResearchObject'; +import { RoCrateGraph } from '../RoCrate'; +import { BaseTransformer } from './BaseTransformer'; +import { isNodeRoot, isResearchObjectComponentTypeMap } from '../trees/treeTools'; -const IPFS_RESOLVER_HTTP = "https://ipfs.io/ipfs/"; +const IPFS_RESOLVER_HTTP = 'https://ipfs.io/ipfs/'; const cleanupUrlOrCid = (str: string) => { - return str?.replace(new RegExp(`^${IPFS_RESOLVER_HTTP}`), ""); + return str?.replace(new RegExp(`^${IPFS_RESOLVER_HTTP}`), ''); }; const formatOrcid = (str: string | undefined) => { if (!str) { return false; } - return `https://orcid.org/${str.replace( - new RegExp(`^https://orcid.org/`), - "" - )}`; + return `https://orcid.org/${str.replace(new RegExp(`^https://orcid.org/`), '')}`; }; const LICENSES_TO_URL: { [k: string]: string } = { - "CC-BY-4.0": "https://creativecommons.org/licenses/by/4.0/", - "CC-BY": "https://creativecommons.org/licenses/by/4.0/", - "CC-BY-SA-4.0": "https://creativecommons.org/licenses/by-sa/4.0/", - "CC-BY-SA": "https://creativecommons.org/licenses/by-sa/4.0/", - "CC-BY-ND-4.0": "https://creativecommons.org/licenses/by-nd/4.0/", - "CC-BY-ND": "https://creativecommons.org/licenses/by-nd/4.0/", - "CC-BY-NC-4.0": "https://creativecommons.org/licenses/by-nc/4.0/", - "CC-BY-NC": "https://creativecommons.org/licenses/by-nc/4.0/", - "CC-BY-NC-SA-4.0": "https://creativecommons.org/licenses/by-nc-sa/4.0/", - "CC-BY-NC-SA": "https://creativecommons.org/licenses/by-nc-sa/4.0/", - "CC-BY-NC-ND-4.0": "https://creativecommons.org/licenses/by-nc-nd/4.0/", - "CC-BY-NC-ND": "https://creativecommons.org/licenses/by-nc-nd/4.0/", - "CC0-1.0": "https://creativecommons.org/publicdomain/zero/1.0/", + 'CC-BY-4.0': 'https://creativecommons.org/licenses/by/4.0/', + 'CC-BY': 'https://creativecommons.org/licenses/by/4.0/', + 'CC-BY-SA-4.0': 'https://creativecommons.org/licenses/by-sa/4.0/', + 'CC-BY-SA': 'https://creativecommons.org/licenses/by-sa/4.0/', + 'CC-BY-ND-4.0': 'https://creativecommons.org/licenses/by-nd/4.0/', + 'CC-BY-ND': 'https://creativecommons.org/licenses/by-nd/4.0/', + 'CC-BY-NC-4.0': 'https://creativecommons.org/licenses/by-nc/4.0/', + 'CC-BY-NC': 'https://creativecommons.org/licenses/by-nc/4.0/', + 'CC-BY-NC-SA-4.0': 'https://creativecommons.org/licenses/by-nc-sa/4.0/', + 'CC-BY-NC-SA': 'https://creativecommons.org/licenses/by-nc-sa/4.0/', + 'CC-BY-NC-ND-4.0': 'https://creativecommons.org/licenses/by-nc-nd/4.0/', + 'CC-BY-NC-ND': 'https://creativecommons.org/licenses/by-nc-nd/4.0/', + 'CC0-1.0': 'https://creativecommons.org/publicdomain/zero/1.0/', - "CC BY": "https://creativecommons.org/licenses/by/4.0/", - "CC BY-SA": "https://creativecommons.org/licenses/by-sa/4.0/", - "CC BY-ND": "https://creativecommons.org/licenses/by-nd/4.0/", - "CC BY-NC": "https://creativecommons.org/licenses/by-nc/4.0/", - "CC BY-NC-SA": "https://creativecommons.org/licenses/by-nc-sa/4.0/", - "CC BY-NC-ND": "https://creativecommons.org/licenses/by-nc-nd/4.0/", - CC0: "https://creativecommons.org/publicdomain/zero/1.0/", - "GPL-3.0": "https://www.gnu.org/licenses/gpl-3.0.en.html", - "MIT License": "https://opensource.org/licenses/MIT", - "Apache License 2.0": "https://www.apache.org/licenses/LICENSE-2.0", - "Apache 2.0": "https://www.apache.org/licenses/LICENSE-2.0", - "Mozilla Public License 2.0": "https://www.mozilla.org/en-US/MPL/2.0/", - "MPL 2.0": "https://www.mozilla.org/en-US/MPL/2.0/", - MIT: "https://opensource.org/licenses/MIT", - "BSD-3-Clause": "https://opensource.org/licenses/BSD-3-Clause", - "BSD-2-Clause": "https://opensource.org/licenses/BSD-2-Clause", - "Apache-2.0": "https://www.apache.org/licenses/LICENSE-2.0", - "LGPL-3.0": "https://www.gnu.org/licenses/lgpl-3.0.en.html", - "LGPL-2.1": "https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html", - "MPL-2.0": "https://www.mozilla.org/en-US/MPL/2.0/", - "CDDL-1.0": "https://opensource.org/licenses/CDDL-1.0", - "EPL-2.0": "https://opensource.org/licenses/EPL-2.0", - "AGPL-3.0": "https://www.gnu.org/licenses/agpl-3.0.en.html", - Unlicense: "https://unlicense.org/", + 'CC BY': 'https://creativecommons.org/licenses/by/4.0/', + 'CC BY-SA': 'https://creativecommons.org/licenses/by-sa/4.0/', + 'CC BY-ND': 'https://creativecommons.org/licenses/by-nd/4.0/', + 'CC BY-NC': 'https://creativecommons.org/licenses/by-nc/4.0/', + 'CC BY-NC-SA': 'https://creativecommons.org/licenses/by-nc-sa/4.0/', + 'CC BY-NC-ND': 'https://creativecommons.org/licenses/by-nc-nd/4.0/', + CC0: 'https://creativecommons.org/publicdomain/zero/1.0/', + 'GPL-3.0': 'https://www.gnu.org/licenses/gpl-3.0.en.html', + 'MIT License': 'https://opensource.org/licenses/MIT', + 'Apache License 2.0': 'https://www.apache.org/licenses/LICENSE-2.0', + 'Apache 2.0': 'https://www.apache.org/licenses/LICENSE-2.0', + 'Mozilla Public License 2.0': 'https://www.mozilla.org/en-US/MPL/2.0/', + 'MPL 2.0': 'https://www.mozilla.org/en-US/MPL/2.0/', + MIT: 'https://opensource.org/licenses/MIT', + 'BSD-3-Clause': 'https://opensource.org/licenses/BSD-3-Clause', + 'BSD-2-Clause': 'https://opensource.org/licenses/BSD-2-Clause', + 'Apache-2.0': 'https://www.apache.org/licenses/LICENSE-2.0', + 'LGPL-3.0': 'https://www.gnu.org/licenses/lgpl-3.0.en.html', + 'LGPL-2.1': 'https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html', + 'MPL-2.0': 'https://www.mozilla.org/en-US/MPL/2.0/', + 'CDDL-1.0': 'https://opensource.org/licenses/CDDL-1.0', + 'EPL-2.0': 'https://opensource.org/licenses/EPL-2.0', + 'AGPL-3.0': 'https://www.gnu.org/licenses/agpl-3.0.en.html', + Unlicense: 'https://unlicense.org/', }; const licenseToUrl = (license: string) => { @@ -81,26 +78,18 @@ export class RoCrateTransformer implements BaseTransformer { nodeObject: ResearchObjectV1 | undefined; importObject(obj: any): ResearchObject { const crate = obj; - const mainEntity = crate["@graph"].find( - (entity: any) => entity["@type"] === "Dataset" - ); + const mainEntity = crate['@graph'].find((entity: any) => entity['@type'] === 'Dataset'); const authors = mainEntity.creator?.map((creator: any) => ({ name: creator.name, - orcid: creator["@id"].startsWith("https://orcid.org/") - ? creator["@id"] - : undefined, - googleScholar: creator["@id"].startsWith("https://scholar.google.com/") - ? creator["@id"] - : undefined, - role: "Author", + orcid: creator['@id'].startsWith('https://orcid.org/') ? creator['@id'] : undefined, + googleScholar: creator['@id'].startsWith('https://scholar.google.com/') ? creator['@id'] : undefined, + role: 'Author', })); - const components = crate["@graph"] - .filter((entity: any) => entity["@id"] !== "ro-crate-metadata.json") - .map((component: any) => - this.mapCrateComponentToResearchObjectComponent(component) - ); + const components = crate['@graph'] + .filter((entity: any) => entity['@id'] !== 'ro-crate-metadata.json') + .map((component: any) => this.mapCrateComponentToResearchObjectComponent(component)); const researchObject: ResearchObjectV1 = { version: 1, @@ -110,7 +99,7 @@ export class RoCrateTransformer implements BaseTransformer { authors: authors, }; - if (mainEntity.url && typeof mainEntity.url === "string") { + if (mainEntity.url && typeof mainEntity.url === 'string') { const doiMatch = mainEntity.url.match(/https:\/\/doi\.org\/(.+)\/(.+)/); if (doiMatch) { researchObject.dpid = { @@ -128,38 +117,36 @@ export class RoCrateTransformer implements BaseTransformer { this.nodeObject = nodeObject; const authors = nodeObject.authors?.map(this.mapAuthor); const crate: any = { - "@context": "https://w3id.org/ro/crate/1.1/context", - "@graph": [ + '@context': 'https://w3id.org/ro/crate/1.1/context', + '@graph': [ { - "@id": "ro-crate-metadata.json", - "@type": "CreativeWork", + '@id': 'ro-crate-metadata.json', + '@type': 'CreativeWork', conformsTo: { - "@id": "https://w3id.org/ro/crate/1.1", + '@id': 'https://w3id.org/ro/crate/1.1', }, about: { - "@id": "./", + '@id': './', }, }, { - "@id": "./", - "@type": "CreativeWork", + '@id': './', + '@type': 'CreativeWork', name: nodeObject.title, - license: licenseToUrl(nodeObject.defaultLicense || "CC-BY-SA-4.0"), - url: nodeObject.dpid - ? `https://${nodeObject.dpid.prefix}.dpid.org/${nodeObject.dpid.id}` - : undefined, + license: licenseToUrl(nodeObject.defaultLicense || 'CC-BY-SA-4.0'), + url: nodeObject.dpid ? `https://${nodeObject.dpid.prefix}.dpid.org/${nodeObject.dpid.id}` : undefined, creator: authors - ?.filter((a) => a["@id"]) + ?.filter((a) => a['@id']) .map((a) => ({ // don't expand all author info, stored elsewhere - "@id": a["@id"], + '@id': a['@id'], })), }, ].concat(authors || [{}]), }; nodeObject.components.forEach((component) => { - crate["@graph"].push(this.mapComponent(component)); + crate['@graph'].push(this.mapComponent(component)); }); return crate; @@ -168,53 +155,41 @@ export class RoCrateTransformer implements BaseTransformer { private mapAuthor(author: ResearchObjectV1Author): any { const id = formatOrcid(author.orcid) || author.googleScholar; return { - ...(id ? { "@id": id } : {}), - "@type": "Person", + ...(id ? { '@id': id } : {}), + '@type': 'Person', name: author.name, }; } private mapComponent(component: ResearchObjectV1Component): RoCrateGraph { const commonPayload = component.payload as CommonComponentPayload; - let crateComponent: Omit = { - "@id": component.id, + let crateComponent: Omit = { + '@id': component.id, name: component.name, - ...(commonPayload.licenseType - ? { license: licenseToUrl(commonPayload.licenseType) } - : {}), - ...(commonPayload.description - ? { description: commonPayload.description } - : {}), - ...(commonPayload.keywords - ? { keywords: commonPayload.keywords.join(", ") } - : {}), + ...(commonPayload.licenseType ? { license: licenseToUrl(commonPayload.licenseType) } : {}), + ...(commonPayload.description ? { description: commonPayload.description } : {}), + ...(commonPayload.keywords ? { keywords: commonPayload.keywords.join(', ') } : {}), }; if (component.type === ResearchObjectComponentType.PDF) { const creativeWork: CreativeWork = { ...(crateComponent as CreativeWork), }; - creativeWork.encodingFormat = "application/pdf"; - (creativeWork as any)["/"] = cleanupUrlOrCid( - (component.payload as any).url - ); - creativeWork.url = `https://ipfs.io/ipfs/${cleanupUrlOrCid( - (component.payload as any).url - )}`; - creativeWork["@type"] = "CreativeWork"; + creativeWork.encodingFormat = 'application/pdf'; + (creativeWork as any)['/'] = cleanupUrlOrCid((component.payload as any).url); + creativeWork.url = `https://ipfs.io/ipfs/${cleanupUrlOrCid((component.payload as any).url)}`; + creativeWork['@type'] = 'CreativeWork'; crateComponent = creativeWork; } else if (component.type === ResearchObjectComponentType.CODE) { const softwareSourceCode: SoftwareSourceCode = { ...(crateComponent as SoftwareSourceCode), }; - softwareSourceCode.encodingFormat = "text/plain"; + softwareSourceCode.encodingFormat = 'text/plain'; - (softwareSourceCode as any)["/"] = cleanupUrlOrCid(component.payload.url); - softwareSourceCode.url = `https://ipfs.io/ipfs/${cleanupUrlOrCid( - component.payload.url - )}`; + (softwareSourceCode as any)['/'] = cleanupUrlOrCid(component.payload.url); + softwareSourceCode.url = `https://ipfs.io/ipfs/${cleanupUrlOrCid(component.payload.url)}`; softwareSourceCode.discussionUrl = component.payload.externalUrl; - softwareSourceCode["@type"] = "SoftwareSourceCode"; + softwareSourceCode['@type'] = 'SoftwareSourceCode'; crateComponent = softwareSourceCode; } else if ( component.type === ResearchObjectComponentType.DATA || @@ -224,7 +199,7 @@ export class RoCrateTransformer implements BaseTransformer { const dataset: Dataset = { ...(crateComponent as Dataset), }; - if (!(isNodeRoot(component))) { + if (!isNodeRoot(component)) { const dataPayload = component.payload as DataComponentMetadata; if (dataPayload.ontologyPurl) { dataset.schemaVersion = dataPayload.ontologyPurl; @@ -236,21 +211,19 @@ export class RoCrateTransformer implements BaseTransformer { dataset.schemaVersion = dataPayload.cedarLink; } } - dataset.encodingFormat = "application/octet-stream"; - (dataset as any)["/"] = cleanupUrlOrCid( - (component.payload as any).url || (component.payload as any).cid - ); + dataset.encodingFormat = 'application/octet-stream'; + (dataset as any)['/'] = cleanupUrlOrCid((component.payload as any).url || (component.payload as any).cid); dataset.url = `https://ipfs.io/ipfs/${cleanupUrlOrCid( - (component.payload as any).url || (component.payload as any).cid + (component.payload as any).url || (component.payload as any).cid, )}`; - dataset["@type"] = "Dataset"; + dataset['@type'] = 'Dataset'; crateComponent = dataset; } else if (component.type === ResearchObjectComponentType.LINK) { const creativeWork: CreativeWork = { ...(crateComponent as CreativeWork), }; creativeWork.url = component.payload.url; - creativeWork["@type"] = "WebSite"; + creativeWork['@type'] = 'WebSite'; crateComponent = creativeWork; } // add additional properties for root folder @@ -258,34 +231,31 @@ export class RoCrateTransformer implements BaseTransformer { const dataset: Dataset = { ...(crateComponent as Dataset), }; - dataset["@id"] = "./root"; - dataset["hasPart"] = this.nodeObject!.components.filter( - (d) => d.type === ResearchObjectComponentType.DATA - ).map((d) => ({ "@id": d.id })); + dataset['@id'] = './root'; + dataset['hasPart'] = this.nodeObject!.components.filter((d) => d.type === ResearchObjectComponentType.DATA).map( + (d) => ({ '@id': d.id }), + ); crateComponent = dataset; } return crateComponent as any; } - private mapCrateComponentToResearchObjectComponent( - crateComponent: any - ): ResearchObjectV1Component { + private mapCrateComponentToResearchObjectComponent(crateComponent: any): ResearchObjectV1Component { const nodeComponent: ResearchObjectV1Component = { - id: crateComponent["@id"] || crateComponent["url"], + id: crateComponent['@id'] || crateComponent['url'], name: crateComponent.name, type: ResearchObjectComponentType.UNKNOWN, payload: {}, }; - let encodingFormat = - crateComponent.encodingFormat || this.getFileMimeType(crateComponent.url); + let encodingFormat = crateComponent.encodingFormat || this.getFileMimeType(crateComponent.url); - const roType = typeof crateComponent != "string" && crateComponent["@type"]; + const roType = typeof crateComponent != 'string' && crateComponent['@type']; if (!encodingFormat) { const typeMap: any = { - SoftwareSourceCode: "text/plain", - Dataset: "application/octet-stream", + SoftwareSourceCode: 'text/plain', + Dataset: 'application/octet-stream', }; if (Array.isArray(roType)) { Object.keys(typeMap).forEach((key) => { @@ -298,18 +268,18 @@ export class RoCrateTransformer implements BaseTransformer { } } - if (encodingFormat === "application/pdf") { + if (encodingFormat === 'application/pdf') { nodeComponent.type = ResearchObjectComponentType.PDF; - (nodeComponent.payload as any)["/"] = crateComponent.url; + (nodeComponent.payload as any)['/'] = crateComponent.url; (nodeComponent.payload as any).url = crateComponent.url; - } else if (encodingFormat === "text/plain") { + } else if (encodingFormat === 'text/plain') { nodeComponent.type = ResearchObjectComponentType.CODE; - (nodeComponent.payload as any)["/"] = crateComponent.url; + (nodeComponent.payload as any)['/'] = crateComponent.url; (nodeComponent.payload as any).url = crateComponent.url; - } else if (encodingFormat === "application/octet-stream") { + } else if (encodingFormat === 'application/octet-stream') { nodeComponent.type = ResearchObjectComponentType.DATA; (nodeComponent.payload as any).cid = crateComponent.url; - (nodeComponent.payload as any)["/"] = crateComponent.url; + (nodeComponent.payload as any)['/'] = crateComponent.url; } else { nodeComponent.type = ResearchObjectComponentType.UNKNOWN; } @@ -318,19 +288,19 @@ export class RoCrateTransformer implements BaseTransformer { } private getFileMimeType(url: string): string | null { - const fileExtension = url?.split(".").pop()?.toLowerCase() || ""; + const fileExtension = url?.split('.').pop()?.toLowerCase() || ''; switch (fileExtension) { - case "pdf": - return "application/pdf"; - case "txt": - case "js": - case "py": - case "java": - return "text/plain"; - case "bin": - case "dat": - return "application/octet-stream"; + case 'pdf': + return 'application/pdf'; + case 'txt': + case 'js': + case 'py': + case 'java': + return 'text/plain'; + case 'bin': + case 'dat': + return 'application/octet-stream'; default: return null; } diff --git a/desci-models/src/transformers/index.ts b/desci-models/src/transformers/index.ts index 994859b9a..0a49ccc60 100644 --- a/desci-models/src/transformers/index.ts +++ b/desci-models/src/transformers/index.ts @@ -1,3 +1,3 @@ -export * from "./BaseTransformer"; -export * from "./RdfTransformer"; -export * from "./RoCrateTransformer"; +export * from './BaseTransformer'; +export * from './RdfTransformer'; +export * from './RoCrateTransformer'; diff --git a/desci-models/src/trees/treeTools.ts b/desci-models/src/trees/treeTools.ts index 050e61a16..f90439138 100644 --- a/desci-models/src/trees/treeTools.ts +++ b/desci-models/src/trees/treeTools.ts @@ -6,8 +6,8 @@ import { ResearchObjectComponentTypeMap, ResearchObjectV1, ResearchObjectV1Component, -} from "../ResearchObject"; -import { DEFAULT_COMPONENT_TYPE } from "../constants"; +} from '../ResearchObject'; +import { DEFAULT_COMPONENT_TYPE } from '../constants'; import { AccessStatus, ComponentTypesForStats, @@ -20,30 +20,26 @@ import { NODE_KEEP_FILE, RecursiveLsResult, VirtualDriveArgs, -} from "./treeTypes"; +} from './treeTypes'; -export const DRIVE_NODE_ROOT_PATH = "root"; +export const DRIVE_NODE_ROOT_PATH = 'root'; export function fillIpfsTree(manifest: ResearchObjectV1, ipfsTree: FileDir[]) { const pathToCompMap = generatePathCompMap(manifest); const pathToDriveMap = generateFlatPathDriveMap(ipfsTree as DriveObject[]); const pathToSizeMap = generatePathSizeMap(pathToDriveMap); //Sources dir sizes - const driveObjectTree = convertIpfsTreeToDriveObjectTree( - ipfsTree as DriveObject[], - pathToCompMap, - pathToSizeMap - ); + const driveObjectTree = convertIpfsTreeToDriveObjectTree(ipfsTree as DriveObject[], pathToCompMap, pathToSizeMap); // Potentially keep if we want to return the root node // eslint-disable-next-line no-array-reduce/no-reduce const rootSize = driveObjectTree.reduce((acc, curr) => acc + curr.size, 0); - const rootComponent = manifest.components?.find((c) => isNodeRoot(c)) + const rootComponent = manifest.components?.find((c) => isNodeRoot(c)); const rootComponentType = rootComponent?.type ?? ResearchObjectComponentType.DATA_BUCKET; - + const treeRoot = createVirtualDrive({ - name: "Node Root", + name: 'Node Root', componentType: rootComponentType, path: DRIVE_NODE_ROOT_PATH, contains: driveObjectTree, @@ -58,9 +54,9 @@ export function fillIpfsTree(manifest: ResearchObjectV1, ipfsTree: FileDir[]) { export function getAncestorComponent( drive: DriveObject, - pathToCompMap: Record + pathToCompMap: Record, ): ResearchObjectV1Component | null { - const pathSplit = drive.path!.split("/"); + const pathSplit = drive.path!.split('/'); /** * This part being commented out enables inheritance from the root // < 3 === don't inherit from root @@ -68,43 +64,44 @@ export function getAncestorComponent( */ while (pathSplit.length > 1) { pathSplit.pop(); - const parentPath = pathSplit.join("/"); + const parentPath = pathSplit.join('/'); const parent = pathToCompMap[parentPath]; if (parent && parent.type !== ResearchObjectComponentType.UNKNOWN) { - if (parent.type === ResearchObjectComponentType.DATA_BUCKET) { - // To prevent inheriting of the data-bucket type, as it should only be a singleton. - parent.type = DEFAULT_COMPONENT_TYPE; - } + if (parent.type === ResearchObjectComponentType.DATA_BUCKET) { + // To prevent inheriting of the data-bucket type, as it should only be a singleton. + parent.type = DEFAULT_COMPONENT_TYPE; + } return parent; } } return null; } -export function isResearchObjectComponentTypeMap( - componentType: any -): componentType is ResearchObjectComponentTypeMap { +export function isResearchObjectComponentTypeMap(componentType: any): componentType is ResearchObjectComponentTypeMap { return ( - typeof componentType === "object" && + typeof componentType === 'object' && componentType !== null && !(componentType instanceof Array) && !(componentType instanceof Date) ); } -export function extractComponentTypeFromTypeMap(path: string, typeMap: ResearchObjectComponentTypeMap): ResearchObjectComponentType { -const extension = extractExtension(path) -if (extension) { - return typeMap[extension] ?? DEFAULT_COMPONENT_TYPE; -} -return DEFAULT_COMPONENT_TYPE; +export function extractComponentTypeFromTypeMap( + path: string, + typeMap: ResearchObjectComponentTypeMap, +): ResearchObjectComponentType { + const extension = extractExtension(path); + if (extension) { + return typeMap[extension] ?? DEFAULT_COMPONENT_TYPE; + } + return DEFAULT_COMPONENT_TYPE; } //Convert IPFS tree to DriveObject tree V2 export function convertIpfsTreeToDriveObjectTree( tree: DriveObject[], pathToCompMap: Record, - pathToSizeMap: Record + pathToSizeMap: Record, ) { // tree = tree.filter((branch) => !FILTER_LIST.includes(branch.name)); // LEAVE THIS TO THE FRONTEND tree.forEach((branch) => { @@ -112,39 +109,37 @@ export function convertIpfsTreeToDriveObjectTree( const neutralPath = neutralizePath(branch.path!); branch.path = neutralPath; const component = pathToCompMap[branch.path!]; - const ancestorComponent: ResearchObjectV1Component | null = - getAncestorComponent(branch, pathToCompMap); - - if (branch.type === FileType.FILE) { - // Component type determination for FILES only - if (component?.type) { - const cType = isResearchObjectComponentTypeMap(component.type) ? extractComponentTypeFromTypeMap(component.payload.path, component.type) : component.type; - branch.componentType = cType; - } else if (ancestorComponent?.type) { - const cType = isResearchObjectComponentTypeMap(ancestorComponent.type) ? extractComponentTypeFromTypeMap(neutralPath, ancestorComponent.type) : ancestorComponent.type; - branch.componentType = cType; - } else { - branch.componentType = ResearchObjectComponentType.UNKNOWN - } + const ancestorComponent: ResearchObjectV1Component | null = getAncestorComponent(branch, pathToCompMap); + + if (branch.type === FileType.FILE) { + // Component type determination for FILES only + if (component?.type) { + const cType = isResearchObjectComponentTypeMap(component.type) + ? extractComponentTypeFromTypeMap(component.payload.path, component.type) + : component.type; + branch.componentType = cType; + } else if (ancestorComponent?.type) { + const cType = isResearchObjectComponentTypeMap(ancestorComponent.type) + ? extractComponentTypeFromTypeMap(neutralPath, ancestorComponent.type) + : ancestorComponent.type; + branch.componentType = cType; + } else { + branch.componentType = ResearchObjectComponentType.UNKNOWN; } + } if ( component && !isResearchObjectComponentTypeMap(component.type) && - [ - ResearchObjectComponentType.PDF, - ResearchObjectComponentType.LINK, - ].includes(component.type as ResearchObjectComponentType) + [ResearchObjectComponentType.PDF, ResearchObjectComponentType.LINK].includes( + component.type as ResearchObjectComponentType, + ) ) { - branch.componentSubtype = ( - component as PdfComponent | ExternalLinkComponent - ).subtype; + branch.componentSubtype = (component as PdfComponent | ExternalLinkComponent).subtype; } // useful for annotation insert on file tree under a code component for example (refer to component id later) branch.componentId = component?.id || ancestorComponent?.id; - branch.accessStatus = fileDirBranch.published - ? AccessStatus.PUBLIC - : AccessStatus.PRIVATE; + branch.accessStatus = fileDirBranch.published ? AccessStatus.PUBLIC : AccessStatus.PRIVATE; //Determine partials if (!fileDirBranch.published && branch.contains && branch.contains.length) { @@ -157,23 +152,12 @@ export function convertIpfsTreeToDriveObjectTree( branch.metadata = inheritMetadata(branch.path, pathToCompMap); branch.starred = component?.starred || false; // branch.lastModified = formatDbDate(branch.lastModified) || tempDate; // LEAVE THIS TO FRONTEND - if ( - branch.contains && - branch.contains.length && - branch.type === FileType.DIR - ) { + if (branch.contains && branch.contains.length && branch.type === FileType.DIR) { // Component type determination for dirs - branch.componentType = - component?.type || - ancestorComponent?.type || - ResearchObjectComponentType.UNKNOWN; + branch.componentType = component?.type || ancestorComponent?.type || ResearchObjectComponentType.UNKNOWN; branch.size = pathToSizeMap[branch.path!] || 0; - branch.contains = convertIpfsTreeToDriveObjectTree( - branch.contains, - pathToCompMap, - pathToSizeMap - ); + branch.contains = convertIpfsTreeToDriveObjectTree(branch.contains, pathToCompMap, pathToSizeMap); branch.componentStats = calculateComponentStats(branch); } }); @@ -183,8 +167,7 @@ export function convertIpfsTreeToDriveObjectTree( export function isHiddenObject(currentObject: DriveObject) { return ( !currentObject || - (currentObject.type === FileType.FILE && - currentObject.name === ".DS_Store") || + (currentObject.type === FileType.FILE && currentObject.name === '.DS_Store') || currentObject.name === NODE_KEEP_FILE ); } @@ -194,7 +177,7 @@ export function isDirectory(currentObject: DriveObject) { } export function isNodeRoot(component: ResearchObjectV1Component) { - return component.type === ResearchObjectComponentType.DATA_BUCKET || component.payload.path === 'root' + return component.type === ResearchObjectComponentType.DATA_BUCKET || component.payload.path === 'root'; } /** @@ -205,43 +188,39 @@ export function isNodeRoot(component: ResearchObjectV1Component) { */ export function calculateComponentStats(dirDrive: DriveObject) { -// return createEmptyComponentStats(); + // return createEmptyComponentStats(); const cachedStats = dirDrive.componentStats; if (cachedStats) { return cachedStats; } - return dirDrive?.contains?.reduce( - (acc: ComponentStats, currentObject: DriveObject) => { - /** Exclude hidden files */ - if (isHiddenObject(currentObject)) { - return acc; - } - + return dirDrive?.contains?.reduce((acc: ComponentStats, currentObject: DriveObject) => { + /** Exclude hidden files */ + if (isHiddenObject(currentObject)) { + return acc; + } - const key = currentObject.componentType as ComponentTypesForStats; + const key = currentObject.componentType as ComponentTypesForStats; - /** Base Case for files */ - if (!isDirectory(currentObject)) { - acc[key].count += 1; - acc[key].size += currentObject.size; + /** Base Case for files */ + if (!isDirectory(currentObject)) { + acc[key].count += 1; + acc[key].size += currentObject.size; + } else { + acc.dirs += 1; + /** Base Case for Directories */ + if (currentObject.componentStats) { + /** If cached stats values exist */ + acc = addComponentStats(acc, currentObject.componentStats); } else { - acc.dirs += 1; - /** Base Case for Directories */ - if (currentObject.componentStats) { - /** If cached stats values exist */ - acc = addComponentStats(acc, currentObject.componentStats); - } else { - /** If cached stats values do NOT exist, calculate them */ - const res = calculateComponentStats(currentObject); - if (res) { - acc = addComponentStats(acc, res); - } + /** If cached stats values do NOT exist, calculate them */ + const res = calculateComponentStats(currentObject); + if (res) { + acc = addComponentStats(acc, res); } } - return acc; - }, - createEmptyComponentStats() - ); + } + return acc; + }, createEmptyComponentStats()); } const EMPTY_COMPONENT_STAT = { @@ -259,10 +238,7 @@ export const createEmptyComponentStats = (): ComponentStats => ({ // link: { ...EMPTY_COMPONENT_STAT }, }); -export function addComponentStats( - objA: ComponentStats, - objB: ComponentStats -): ComponentStats { +export function addComponentStats(objA: ComponentStats, objB: ComponentStats): ComponentStats { const result: ComponentStats = { ...createEmptyComponentStats(), // ensure all stats are zeroed to start ...JSON.parse(JSON.stringify(objA)), @@ -270,16 +246,15 @@ export function addComponentStats( for (const key in objB) { if (key !== 'dirs') { - const keyTyped = key as ComponentTypesForStats; - + result[keyTyped] = { count: objA[keyTyped].count + objB[keyTyped].count, size: objA[keyTyped].size + objB[keyTyped].size, // dirs: objA[keyTyped].dirs + objB[keyTyped].dirs, }; } else { - result['dirs'] = objA['dirs'] + objB['dirs'] + result['dirs'] = objA['dirs'] + objB['dirs']; } } @@ -294,22 +269,19 @@ export function hasPublic(tree: DriveObject): boolean { }); } -export function inheritMetadata( - path: DrivePath, - pathToCompMap: Record -) { +export function inheritMetadata(path: DrivePath, pathToCompMap: Record) { const comp = pathToCompMap[path]; if (comp) { const specificMetadata = extractComponentMetadata(comp); if (Object.keys(specificMetadata).length) return specificMetadata; } - const pathSplit = path.split("/"); + const pathSplit = path.split('/'); // < 3 === don't inherit from root if (pathSplit.length < 3) return {}; while (pathSplit.length > 1) { pathSplit.pop(); - const parentPath = pathSplit.join("/"); + const parentPath = pathSplit.join('/'); const parent = pathToCompMap[parentPath]; if (parent) { const potentialMetadata = extractComponentMetadata(parent); @@ -319,19 +291,17 @@ export function inheritMetadata( return {}; } -export function extractComponentMetadata( - component: ResearchObjectV1Component -): DriveMetadata { +export function extractComponentMetadata(component: ResearchObjectV1Component): DriveMetadata { if (!component) return {}; const metadata: DriveMetadata = {}; const validMetadataKeys: (keyof DriveMetadata)[] = [ - "title", - "keywords", - "description", - "licenseType", - "ontologyPurl", - "cedarLink", - "controlledVocabTerms", + 'title', + 'keywords', + 'description', + 'licenseType', + 'ontologyPurl', + 'cedarLink', + 'controlledVocabTerms', ]; validMetadataKeys.forEach((k) => { @@ -341,9 +311,7 @@ export function extractComponentMetadata( return metadata; } -export function generatePathCompMap( - manifest: ResearchObjectV1 -): Record { +export function generatePathCompMap(manifest: ResearchObjectV1): Record { const componentsMap: Record = {}; manifest.components.forEach((c) => { switch (c.type) { @@ -361,9 +329,7 @@ export function generatePathCompMap( return componentsMap; } -export function generateFlatPathDriveMap( - tree: DriveObject[] -): Record { +export function generateFlatPathDriveMap(tree: DriveObject[]): Record { const contents = recursiveFlattenTree(tree); const map: Record = {}; (contents as DriveObject[]).forEach((d: DriveObject) => { @@ -373,9 +339,7 @@ export function generateFlatPathDriveMap( return map; } -export function generatePathSizeMap( - flatPathDriveMap: Record -): Record { +export function generatePathSizeMap(flatPathDriveMap: Record): Record { const pathSizeMap: Record = {}; const dirSizeMap: Record = {}; @@ -388,9 +352,8 @@ export function generatePathSizeMap( let parentPath = path; while (parentPath) { - const lastSlashIndex = parentPath.lastIndexOf("/"); - parentPath = - lastSlashIndex >= 0 ? parentPath.substring(0, lastSlashIndex) : ""; + const lastSlashIndex = parentPath.lastIndexOf('/'); + parentPath = lastSlashIndex >= 0 ? parentPath.substring(0, lastSlashIndex) : ''; if (parentPath in dirSizeMap) { dirSizeMap[parentPath] += drive.size; } @@ -428,7 +391,7 @@ export function createVirtualDrive({ lastModified: lastModified || tempDate, accessStatus: accessStatus || AccessStatus.PRIVATE, metadata: metadata || {}, - cid: cid || "", + cid: cid || '', type: type || FileType.DIR, parent: parent || null, path: path || undefined, @@ -436,14 +399,12 @@ export function createVirtualDrive({ ...(uid && { uid: uid }), }; } -export const tempDate = "12/02/2022 7:00PM"; +export const tempDate = '12/02/2022 7:00PM'; -export function recursiveFlattenTree( - tree: T[] -): T[] { +export function recursiveFlattenTree(tree: T[]): T[] { // eslint-disable-next-line no-array-reduce/no-reduce return tree.reduce((acc: T[], node: T) => { - if (node.type === "dir" && node.contains) { + if (node.type === 'dir' && node.contains) { return acc.concat(node, recursiveFlattenTree(node.contains as T[])); } else { return acc.concat(node); @@ -452,27 +413,24 @@ export function recursiveFlattenTree( } export function neutralizePath(path: DrivePath) { - if (!path.includes("/") && path.length) return "root"; - if (path.split("/")[0] === "root") return path; + if (!path.includes('/') && path.length) return 'root'; + if (path.split('/')[0] === 'root') return path; return path.replace(/^[^/]+/, DRIVE_NODE_ROOT_PATH); } export function deneutralizePath(path: DrivePath, rootCid: string) { - if (!path.includes("/") && path.length) return rootCid; + if (!path.includes('/') && path.length) return rootCid; return path.replace(/^[^/]+/, rootCid); } // Clones a node removing its children to a specified depth -export function pruneNode( - node: DriveObject, - depth: number -): DriveObject | null { +export function pruneNode(node: DriveObject, depth: number): DriveObject | null { if (depth < 0) { return null; } const cloned: DriveObject = { ...node }; - if (node.type === "dir" && node.contains && depth > 0) { + if (node.type === 'dir' && node.contains && depth > 0) { cloned.contains = node.contains .map((child) => pruneNode(child, depth - 1)) .filter((n) => n !== null) as DriveObject[]; @@ -483,17 +441,13 @@ export function pruneNode( return cloned; } -export function findAndPruneNode( - root: DriveObject, - path: string, - depth?: number -): DriveObject | null { +export function findAndPruneNode(root: DriveObject, path: string, depth?: number): DriveObject | null { if (root.path === path) { // If depth is undefined, return the node directly without cloning or pruning return depth !== undefined ? pruneNode(root, depth) : root; } - if (root.type === "dir" && root.contains) { + if (root.type === 'dir' && root.contains) { for (const child of root.contains) { const foundNode = findAndPruneNode(child, path, depth); if (foundNode) { @@ -505,7 +459,6 @@ export function findAndPruneNode( return null; } - export function extractExtension(path: string): FileExtension | null { const splitName = path.split('.'); const extension = splitName.length > 1 ? '.' + splitName.pop() : ''; diff --git a/desci-models/src/trees/treeTypes.ts b/desci-models/src/trees/treeTypes.ts index 2132eaaf6..eb7031b73 100644 --- a/desci-models/src/trees/treeTypes.ts +++ b/desci-models/src/trees/treeTypes.ts @@ -4,7 +4,7 @@ import { ResearchObjectComponentSubtypes, ResearchObjectComponentType, ResearchObjectComponentTypeMap, -} from "../ResearchObject"; +} from '../ResearchObject'; export interface DriveObject { uid?: string; @@ -29,8 +29,7 @@ export interface DriveObject { external?: boolean; } -export const NODE_KEEP_FILE = ".nodeKeep"; - +export const NODE_KEEP_FILE = '.nodeKeep'; export type ComponentTypesForStats = | ResearchObjectComponentType.CODE @@ -40,27 +39,27 @@ export type ComponentTypesForStats = // | ResearchObjectComponentType.LINK; export type DirStat = { - dirs: number -} -export type ComponentTypeStats ={ + dirs: number; +}; +export type ComponentTypeStats = { [key in ComponentTypesForStats]: { count: number; size: number; }; -} +}; export type ComponentStats = DirStat & ComponentTypeStats; export type DriveMetadata = CommonComponentPayload & DataComponentMetadata; export enum FileType { - DIR = "dir", - FILE = "file", + DIR = 'dir', + FILE = 'file', } export enum DriveNonComponentTypes { - MANIFEST = "manifest", - UNKNOWN = "unknown", + MANIFEST = 'manifest', + UNKNOWN = 'unknown', } export interface IpfsPinnedResult { @@ -72,7 +71,7 @@ export interface IpfsPinnedResult { export interface RecursiveLsResult extends IpfsPinnedResult { name: string; contains?: RecursiveLsResult[]; - type: "dir" | "file"; + type: 'dir' | 'file'; parent?: RecursiveLsResult; external?: boolean; } @@ -103,10 +102,10 @@ export interface VirtualDriveArgs { } export enum AccessStatus { - PUBLIC = "Public", - PRIVATE = "Private", - PARTIAL = "Partial", - EXTERNAL = "External", - UPLOADING = "Uploading", - FAILED = "Failed", + PUBLIC = 'Public', + PRIVATE = 'Private', + PARTIAL = 'Partial', + EXTERNAL = 'External', + UPLOADING = 'Uploading', + FAILED = 'Failed', } diff --git a/desci-models/tests/ResearchObject.test.ts b/desci-models/tests/ResearchObject.test.ts index 173b2b6f6..33c530e22 100644 --- a/desci-models/tests/ResearchObject.test.ts +++ b/desci-models/tests/ResearchObject.test.ts @@ -1,34 +1,33 @@ -import { describe } from "mocha"; -import { expect } from "chai"; -import ResearchObjectTi from "../src/ResearchObject-ti"; -import { createCheckers } from "ts-interface-checker"; +import { describe } from 'mocha'; +import { expect } from 'chai'; +import ResearchObjectTi from '../src/ResearchObject-ti'; +import { createCheckers } from 'ts-interface-checker'; const checkers = createCheckers(ResearchObjectTi); -describe("ResearchObject", () => { - it("Has a simple valid base form", () => { +describe('ResearchObject', () => { + it('Has a simple valid base form', () => { const obj = { version: 1, components: [], authors: [] }; checkers.ResearchObjectV1.check(obj); }); - it("Fails without required fields", () => { + it('Fails without required fields', () => { const obj = {}; - expect(() => checkers.ResearchObjectV1.check(obj)).to - .throw(`value.version is missing + expect(() => checkers.ResearchObjectV1.check(obj)).to.throw(`value.version is missing value.version is missing value.components is missing`); }); - it("Supports external links with IPLD payload", () => { + it('Supports external links with IPLD payload', () => { const obj = { version: 1, components: [ { - name: "", - id: "", - type: "link", + name: '', + id: '', + type: 'link', payload: { - url: "https://google.com", - archives: [{ accessDate: 213, url: { "/": "cid" } }], + url: 'https://google.com', + archives: [{ accessDate: 213, url: { '/': 'cid' } }], }, }, ], @@ -37,9 +36,9 @@ value.components is missing`); checkers.ResearchObjectV1.check(obj); }); - it("Supports version string", () => { + it('Supports version string', () => { const obj = { - version: "desci-nodes-0.1.0", + version: 'desci-nodes-0.1.0', components: [], authors: [], }; diff --git a/desci-models/tests/TreeTools.test.ts b/desci-models/tests/TreeTools.test.ts index 76c5231e3..a1604e086 100644 --- a/desci-models/tests/TreeTools.test.ts +++ b/desci-models/tests/TreeTools.test.ts @@ -1,25 +1,13 @@ -import { describe } from "mocha"; -import { expect } from "chai"; -import { - AccessStatus, - ComponentStats, - DriveObject, - FileType, -} from "../src/trees/treeTypes"; -import { - calculateComponentStats, - addComponentStats, - createEmptyComponentStats, -} from "../src/trees/treeTools"; -import { ResearchObjectComponentType } from "../src/ResearchObject"; +import { describe } from 'mocha'; +import { expect } from 'chai'; +import { AccessStatus, ComponentStats, DriveObject, FileType } from '../src/trees/treeTypes'; +import { calculateComponentStats, addComponentStats, createEmptyComponentStats } from '../src/trees/treeTools'; +import { ResearchObjectComponentType } from '../src/ResearchObject'; -describe("TreeTools", () => { - describe("addComponentStats", () => { - it("adds two empty objects", () => { - const res = addComponentStats( - createEmptyComponentStats(), - createEmptyComponentStats() - ); +describe('TreeTools', () => { + describe('addComponentStats', () => { + it('adds two empty objects', () => { + const res = addComponentStats(createEmptyComponentStats(), createEmptyComponentStats()); expect(res.code.count).to.eq(0); expect(res.code.size).to.eq(0); expect(res.data.count).to.eq(0); @@ -30,7 +18,7 @@ describe("TreeTools", () => { expect(res.unknown.size).to.eq(0); }); - it("adds an empty object to a nonempty object", () => { + it('adds an empty object to a nonempty object', () => { const res = addComponentStats( { code: { @@ -51,7 +39,7 @@ describe("TreeTools", () => { }, unknown: { count: 5, size: 5, dirs: 51 }, }, - createEmptyComponentStats() + createEmptyComponentStats(), ); expect(res.code.count).to.eq(1); expect(res.code.size).to.eq(1); @@ -70,16 +58,16 @@ describe("TreeTools", () => { expect(res.unknown.dirs).to.eq(51); }); }); - describe("calculateComponentStats", () => { - it("calculates empty case correctly", () => { + describe('calculateComponentStats', () => { + it('calculates empty case correctly', () => { const emptyDrive: DriveObject = { - name: "", - lastModified: "", + name: '', + lastModified: '', componentType: ResearchObjectComponentType.DATA_BUCKET, accessStatus: AccessStatus.PUBLIC, size: 0, metadata: {}, - cid: "", + cid: '', type: FileType.DIR, }; const res = calculateComponentStats(emptyDrive); @@ -90,24 +78,24 @@ describe("TreeTools", () => { // expect(res?.video).to.be.undefined; }); - it("calculates simple case correctly", () => { + it('calculates simple case correctly', () => { const simpleDrive: DriveObject = { - name: "", - lastModified: "", + name: '', + lastModified: '', componentType: ResearchObjectComponentType.DATA_BUCKET, accessStatus: AccessStatus.PUBLIC, size: 0, metadata: {}, - cid: "", + cid: '', type: FileType.DIR, contains: [ { componentType: ResearchObjectComponentType.CODE, size: 1, - cid: "1", + cid: '1', accessStatus: AccessStatus.PUBLIC, - name: "a", - lastModified: "1", + name: 'a', + lastModified: '1', metadata: {}, type: FileType.FILE, }, @@ -126,44 +114,44 @@ describe("TreeTools", () => { expect(res.unknown.count).to.eq(0); }); - it("calculates with every component present in data bucket correctly", () => { + it('calculates with every component present in data bucket correctly', () => { const simpleDrive: DriveObject = { - name: "", - lastModified: "", + name: '', + lastModified: '', componentType: ResearchObjectComponentType.DATA_BUCKET, accessStatus: AccessStatus.PUBLIC, size: 0, metadata: {}, - cid: "", + cid: '', type: FileType.DIR, contains: [ { componentType: ResearchObjectComponentType.CODE, size: 1, - cid: "1", + cid: '1', accessStatus: AccessStatus.PUBLIC, - name: "a", - lastModified: "1", + name: 'a', + lastModified: '1', metadata: {}, type: FileType.FILE, }, { componentType: ResearchObjectComponentType.DATA, size: 2, - cid: "2", + cid: '2', accessStatus: AccessStatus.PUBLIC, - name: "b", - lastModified: "1", + name: 'b', + lastModified: '1', metadata: {}, type: FileType.FILE, }, { componentType: ResearchObjectComponentType.UNKNOWN, size: 3, - cid: "3", + cid: '3', accessStatus: AccessStatus.PUBLIC, - name: "c", - lastModified: "1", + name: 'c', + lastModified: '1', metadata: {}, type: FileType.FILE, }, @@ -195,44 +183,44 @@ describe("TreeTools", () => { // expect(res.link.count).to.eq(1); }); - it("calculates nesting of single component type correctly", () => { + it('calculates nesting of single component type correctly', () => { const simpleDrive: DriveObject = { - name: "", - lastModified: "", + name: '', + lastModified: '', componentType: ResearchObjectComponentType.DATA_BUCKET, accessStatus: AccessStatus.PUBLIC, size: 0, metadata: {}, - cid: "", + cid: '', type: FileType.DIR, contains: [ { componentType: ResearchObjectComponentType.CODE, size: 20, - cid: "1", + cid: '1', accessStatus: AccessStatus.PUBLIC, - name: "code", - lastModified: "1", + name: 'code', + lastModified: '1', metadata: {}, type: FileType.DIR, contains: [ { componentType: ResearchObjectComponentType.CODE, size: 10, - cid: "2", + cid: '2', accessStatus: AccessStatus.PUBLIC, - name: "code", - lastModified: "1", + name: 'code', + lastModified: '1', metadata: {}, type: FileType.FILE, }, { componentType: ResearchObjectComponentType.CODE, size: 10, - cid: "3", + cid: '3', accessStatus: AccessStatus.PUBLIC, - name: "code2", - lastModified: "1", + name: 'code2', + lastModified: '1', metadata: {}, type: FileType.FILE, }, @@ -247,54 +235,54 @@ describe("TreeTools", () => { expect(res.code.dirs).to.eq(1); }); - it("calculates nesting of single component type and an additional component nested correctly", () => { + it('calculates nesting of single component type and an additional component nested correctly', () => { const simpleDrive: DriveObject = { - name: "", - lastModified: "", + name: '', + lastModified: '', componentType: ResearchObjectComponentType.DATA_BUCKET, accessStatus: AccessStatus.PUBLIC, size: 0, metadata: {}, - cid: "", + cid: '', type: FileType.DIR, contains: [ { componentType: ResearchObjectComponentType.CODE, size: 30, - cid: "1", + cid: '1', accessStatus: AccessStatus.PUBLIC, - name: "code", - lastModified: "1", + name: 'code', + lastModified: '1', metadata: {}, type: FileType.DIR, contains: [ { componentType: ResearchObjectComponentType.CODE, size: 10, - cid: "2", + cid: '2', accessStatus: AccessStatus.PUBLIC, - name: "code", - lastModified: "1", + name: 'code', + lastModified: '1', metadata: {}, type: FileType.FILE, }, { componentType: ResearchObjectComponentType.CODE, size: 10, - cid: "3", + cid: '3', accessStatus: AccessStatus.PUBLIC, - name: "code2", - lastModified: "1", + name: 'code2', + lastModified: '1', metadata: {}, type: FileType.FILE, }, { componentType: ResearchObjectComponentType.UNKNOWN, size: 10, - cid: "4", + cid: '4', accessStatus: AccessStatus.PUBLIC, - name: "unknown", - lastModified: "1", + name: 'unknown', + lastModified: '1', metadata: {}, type: FileType.FILE, }, @@ -313,74 +301,74 @@ describe("TreeTools", () => { expect(res.unknown.dirs).to.eq(0); }); - it("calculates deep complex nesting of multiple component types", () => { + it('calculates deep complex nesting of multiple component types', () => { const simpleDrive: DriveObject = { - name: "", - lastModified: "", + name: '', + lastModified: '', componentType: ResearchObjectComponentType.DATA_BUCKET, accessStatus: AccessStatus.PUBLIC, size: 0, metadata: {}, - cid: "", + cid: '', type: FileType.DIR, contains: [ { componentType: ResearchObjectComponentType.CODE, size: 30, - cid: "1", + cid: '1', accessStatus: AccessStatus.PUBLIC, - name: "code", - lastModified: "1", + name: 'code', + lastModified: '1', metadata: {}, type: FileType.DIR, contains: [ { componentType: ResearchObjectComponentType.CODE, size: 10, - cid: "2", + cid: '2', accessStatus: AccessStatus.PUBLIC, - name: "code", - lastModified: "1", + name: 'code', + lastModified: '1', metadata: {}, type: FileType.FILE, }, { componentType: ResearchObjectComponentType.CODE, size: 10, - cid: "3", + cid: '3', accessStatus: AccessStatus.PUBLIC, - name: "code2", - lastModified: "1", + name: 'code2', + lastModified: '1', metadata: {}, type: FileType.FILE, }, { componentType: ResearchObjectComponentType.UNKNOWN, size: 10, - cid: "4", + cid: '4', accessStatus: AccessStatus.PUBLIC, - name: "unknown", - lastModified: "1", + name: 'unknown', + lastModified: '1', metadata: {}, type: FileType.FILE, }, { componentType: ResearchObjectComponentType.UNKNOWN, size: 10, - cid: "5", + cid: '5', accessStatus: AccessStatus.PUBLIC, - name: "unknown-folder", - lastModified: "1", + name: 'unknown-folder', + lastModified: '1', metadata: {}, type: FileType.DIR, contains: [ { componentType: ResearchObjectComponentType.CODE, size: 100, - cid: "3", + cid: '3', accessStatus: AccessStatus.PUBLIC, - name: "code3", - lastModified: "1", + name: 'code3', + lastModified: '1', metadata: {}, type: FileType.FILE, }, @@ -402,15 +390,15 @@ describe("TreeTools", () => { }); }); - it("defers to cached component stats if available", () => { + it('defers to cached component stats if available', () => { const simpleDrive: DriveObject = { - name: "", - lastModified: "", + name: '', + lastModified: '', componentType: ResearchObjectComponentType.DATA_BUCKET, accessStatus: AccessStatus.PUBLIC, size: 0, metadata: {}, - cid: "", + cid: '', type: FileType.DIR, componentStats: { code: { count: 1337, size: 1337, dirs: 1337 }, @@ -423,10 +411,10 @@ describe("TreeTools", () => { { componentType: ResearchObjectComponentType.CODE, size: 30, - cid: "1", + cid: '1', accessStatus: AccessStatus.PUBLIC, - name: "code", - lastModified: "1", + name: 'code', + lastModified: '1', metadata: {}, type: FileType.DIR, @@ -434,50 +422,50 @@ describe("TreeTools", () => { { componentType: ResearchObjectComponentType.CODE, size: 10, - cid: "2", + cid: '2', accessStatus: AccessStatus.PUBLIC, - name: "code", - lastModified: "1", + name: 'code', + lastModified: '1', metadata: {}, type: FileType.FILE, }, { componentType: ResearchObjectComponentType.CODE, size: 10, - cid: "3", + cid: '3', accessStatus: AccessStatus.PUBLIC, - name: "code2", - lastModified: "1", + name: 'code2', + lastModified: '1', metadata: {}, type: FileType.FILE, }, { componentType: ResearchObjectComponentType.UNKNOWN, size: 10, - cid: "4", + cid: '4', accessStatus: AccessStatus.PUBLIC, - name: "unknown", - lastModified: "1", + name: 'unknown', + lastModified: '1', metadata: {}, type: FileType.FILE, }, { componentType: ResearchObjectComponentType.UNKNOWN, size: 10, - cid: "5", + cid: '5', accessStatus: AccessStatus.PUBLIC, - name: "unknown-folder", - lastModified: "1", + name: 'unknown-folder', + lastModified: '1', metadata: {}, type: FileType.DIR, contains: [ { componentType: ResearchObjectComponentType.CODE, size: 100, - cid: "3", + cid: '3', accessStatus: AccessStatus.PUBLIC, - name: "code3", - lastModified: "1", + name: 'code3', + lastModified: '1', metadata: {}, type: FileType.FILE, }, @@ -498,64 +486,64 @@ describe("TreeTools", () => { expect(res.unknown.dirs).to.eq(1337); }); - it("defers to nested cached component stats if available", () => { + it('defers to nested cached component stats if available', () => { const simpleDrive: DriveObject = { - name: "", - lastModified: "", + name: '', + lastModified: '', componentType: ResearchObjectComponentType.DATA_BUCKET, accessStatus: AccessStatus.PUBLIC, size: 0, metadata: {}, - cid: "", + cid: '', type: FileType.DIR, contains: [ { componentType: ResearchObjectComponentType.CODE, size: 30, - cid: "1", + cid: '1', accessStatus: AccessStatus.PUBLIC, - name: "code", - lastModified: "1", + name: 'code', + lastModified: '1', metadata: {}, type: FileType.DIR, contains: [ { componentType: ResearchObjectComponentType.CODE, size: 10, - cid: "2", + cid: '2', accessStatus: AccessStatus.PUBLIC, - name: "code", - lastModified: "1", + name: 'code', + lastModified: '1', metadata: {}, type: FileType.FILE, }, { componentType: ResearchObjectComponentType.CODE, size: 10, - cid: "3", + cid: '3', accessStatus: AccessStatus.PUBLIC, - name: "code2", - lastModified: "1", + name: 'code2', + lastModified: '1', metadata: {}, type: FileType.FILE, }, { componentType: ResearchObjectComponentType.UNKNOWN, size: 10, - cid: "4", + cid: '4', accessStatus: AccessStatus.PUBLIC, - name: "unknown", - lastModified: "1", + name: 'unknown', + lastModified: '1', metadata: {}, type: FileType.FILE, }, { componentType: ResearchObjectComponentType.UNKNOWN, size: 10, - cid: "5", + cid: '5', accessStatus: AccessStatus.PUBLIC, - name: "unknown-folder", - lastModified: "1", + name: 'unknown-folder', + lastModified: '1', metadata: {}, type: FileType.DIR, componentStats: { @@ -569,10 +557,10 @@ describe("TreeTools", () => { { componentType: ResearchObjectComponentType.CODE, size: 100, - cid: "3", + cid: '3', accessStatus: AccessStatus.PUBLIC, - name: "code3", - lastModified: "1", + name: 'code3', + lastModified: '1', metadata: {}, type: FileType.FILE, }, diff --git a/desci-models/tests/example-data/exampleNodeWithAuthors.json b/desci-models/tests/example-data/exampleNodeWithAuthors.json index 3f5951bfa..8184860af 100644 --- a/desci-models/tests/example-data/exampleNodeWithAuthors.json +++ b/desci-models/tests/example-data/exampleNodeWithAuthors.json @@ -145,15 +145,7 @@ "text": "Reproduce Figure B1 [Fig B1](#/code/303046a7-47e1-4e36-8541-ab5ede4d86c5?path=codes/plot_figure_10.ipynb&line=14)\n" } ], - "keywords": [ - "alma", - "lupus", - "protoplanetary disks", - "dust", - "gas", - "astronomy", - "astrophysics" - ], + "keywords": ["alma", "lupus", "protoplanetary disks", "dust", "gas", "astronomy", "astrophysics"], "description": "This is the research report associated with the Node \"Exploring Lupus\". The PDF has previously been published at https://arxiv.org/abs/1604.05719 and was visually altered slightly for the purpose of re-publishing on DeSci Nodes." }, "starred": true, @@ -183,15 +175,7 @@ "title": "Preprocessed Data for Node \"Exploring Lupus\"", "ontologyPurl": "https://www.ebi.ac.uk/ols/ontologies/srao/terms?iri=http%3A%2F%2Fwww.fairsharing.org%2Fontology%2Fsubject%2FSRAO_0000189&lang=en&viewMode=All&siblings=false", "controlledVocabTerms": [], - "keywords": [ - "atronomy", - "astophysics", - "alma telescope", - "lupus", - "protoplanetary disks", - "gas", - "dust" - ], + "keywords": ["atronomy", "astophysics", "alma telescope", "lupus", "protoplanetary disks", "gas", "dust"], "description": "This data is processed data from the ALMA Telescope as well as literature data as cited in the paper that has been used to analyze the dust and gas massess of Lupus protoplanetary disks." }, "starred": false diff --git a/desci-models/tests/transformers/RdfTransformer.test.ts b/desci-models/tests/transformers/RdfTransformer.test.ts index b6ccdd81b..9246f86c3 100644 --- a/desci-models/tests/transformers/RdfTransformer.test.ts +++ b/desci-models/tests/transformers/RdfTransformer.test.ts @@ -1,19 +1,19 @@ -import { describe } from "mocha"; -import { expect } from "chai"; +import { describe } from 'mocha'; +import { expect } from 'chai'; -import exampleNode from "../example-data/exampleNode.json"; -import { RdfTransformer } from "../../src/transformers/RdfTransformer"; +import exampleNode from '../example-data/exampleNode.json'; +import { RdfTransformer } from '../../src/transformers/RdfTransformer'; -describe("RdfTransformer", () => { - it("should convert a ResearchObject to RDF", async () => { +describe('RdfTransformer', () => { + it('should convert a ResearchObject to RDF', async () => { const transformer = new RdfTransformer(); const researchObject = exampleNode; const rdfOutput = await transformer.exportObject(researchObject); - console.log("RDF Output", rdfOutput); + console.log('RDF Output', rdfOutput); // Replace the following line with checks specific to your expected RDF output - expect(rdfOutput).to.be.a("string"); + expect(rdfOutput).to.be.a('string'); }); }); diff --git a/desci-models/tests/transformers/RoCrateTransformer.test.ts b/desci-models/tests/transformers/RoCrateTransformer.test.ts index 4c237e231..0db9fe37b 100644 --- a/desci-models/tests/transformers/RoCrateTransformer.test.ts +++ b/desci-models/tests/transformers/RoCrateTransformer.test.ts @@ -1,29 +1,24 @@ -import { describe } from "mocha"; -import { expect } from "chai"; -import { RoCrateTransformer } from "../../src/transformers/RoCrateTransformer"; -import ResearchObjectTi from "../../src/ResearchObject-ti"; -import { RoCrate, RoCrateGraph } from "../../src/RoCrate"; -import { createCheckers } from "ts-interface-checker"; -import exampleNode from "../example-data/exampleNode.json"; -import exampleRoCrate from "../example-data/exampleRoCrate.json"; -import exampleNodeWithAuthors from "../example-data/exampleNodeWithAuthors.json"; -import expectedJsonLd from "../example-data/exampleNodeToRoCrate.json"; -import exampleRoCrateWithWorkflow from "../example-data/roCrateWithWorkflow.json"; -import { - CodeComponent, - DataComponent, - PdfComponent, - ResearchObjectV1, -} from "../../src/ResearchObject"; - -import { CreativeWork } from "schema-dts"; -const context = "https://www.researchobject.org/ro-crate/1.1/context.jsonld"; +import { describe } from 'mocha'; +import { expect } from 'chai'; +import { RoCrateTransformer } from '../../src/transformers/RoCrateTransformer'; +import ResearchObjectTi from '../../src/ResearchObject-ti'; +import { RoCrate, RoCrateGraph } from '../../src/RoCrate'; +import { createCheckers } from 'ts-interface-checker'; +import exampleNode from '../example-data/exampleNode.json'; +import exampleRoCrate from '../example-data/exampleRoCrate.json'; +import exampleNodeWithAuthors from '../example-data/exampleNodeWithAuthors.json'; +import expectedJsonLd from '../example-data/exampleNodeToRoCrate.json'; +import exampleRoCrateWithWorkflow from '../example-data/roCrateWithWorkflow.json'; +import { CodeComponent, DataComponent, PdfComponent, ResearchObjectV1 } from '../../src/ResearchObject'; + +import { CreativeWork } from 'schema-dts'; +const context = 'https://www.researchobject.org/ro-crate/1.1/context.jsonld'; const checkers = createCheckers(ResearchObjectTi); const transformer = new RoCrateTransformer(); -describe("RoCrateTransformer", () => { - it("Imports a simple valid RO-Crate object", () => { +describe('RoCrateTransformer', () => { + it('Imports a simple valid RO-Crate object', () => { const roCrate = exampleRoCrate; const researchObject = transformer.importObject(roCrate); @@ -31,7 +26,7 @@ describe("RoCrateTransformer", () => { }); // skipping due to lossy conversion, need to update spec to capture encoding - it("Exports a simple valid ResearchObject to RO-Crate format", async () => { + it('Exports a simple valid ResearchObject to RO-Crate format', async () => { const researchObject = exampleNode; const roCrate = transformer.exportObject(researchObject); @@ -41,156 +36,124 @@ describe("RoCrateTransformer", () => { expect(roCrate).to.deep.equal(expectedJsonLd); }); - it("Properly imports PDF components", () => { + it('Properly imports PDF components', () => { const roCrate = exampleRoCrate; - const researchObject = transformer.importObject( - roCrate - ) as ResearchObjectV1; - const pdfComponent = researchObject.components.find( - (component) => component.type === "pdf" - ) as PdfComponent; + const researchObject = transformer.importObject(roCrate) as ResearchObjectV1; + const pdfComponent = researchObject.components.find((component) => component.type === 'pdf') as PdfComponent; expect(pdfComponent).to.not.be.undefined; - expect(pdfComponent.payload.url).to.equal( - "https://example.com/example.pdf" - ); + expect(pdfComponent.payload.url).to.equal('https://example.com/example.pdf'); }); - it("Properly imports code components", () => { + it('Properly imports code components', () => { const roCrate = exampleRoCrateWithWorkflow; - const researchObject = transformer.importObject( - roCrate - ) as ResearchObjectV1; + const researchObject = transformer.importObject(roCrate) as ResearchObjectV1; - const codeComponent = researchObject.components.find( - (component) => component.type === "code" - ) as CodeComponent; + const codeComponent = researchObject.components.find((component) => component.type === 'code') as CodeComponent; expect(codeComponent).to.not.be.undefined; - expect(codeComponent.payload.url).to.equal( - "http://example.com/workflows/alignment" - ); + expect(codeComponent.payload.url).to.equal('http://example.com/workflows/alignment'); }); - it("Properly imports data components", () => { + it('Properly imports data components', () => { const roCrate = exampleRoCrate; - const researchObject = transformer.importObject( - roCrate - ) as ResearchObjectV1; - const dataComponent = researchObject.components.find( - (component) => component.type === "data" - ) as DataComponent; + const researchObject = transformer.importObject(roCrate) as ResearchObjectV1; + const dataComponent = researchObject.components.find((component) => component.type === 'data') as DataComponent; expect(dataComponent).to.not.be.undefined; - expect(dataComponent.payload.cid).to.equal( - "https://doi.org/10.5281/zenodo.1234567" - ); + expect(dataComponent.payload.cid).to.equal('https://doi.org/10.5281/zenodo.1234567'); }); - it("Properly exports PDF components", () => { + it('Properly exports PDF components', () => { const researchObject = exampleNode; const roCrate = transformer.exportObject(researchObject) as RoCrate; - const pdfComponent = roCrate["@graph"].find( + const pdfComponent = roCrate['@graph'].find( (item: RoCrateGraph) => - typeof item !== "string" && - item["@type"] && - item["@type"] === "CreativeWork" && - (item as CreativeWork).encodingFormat === "application/pdf" + typeof item !== 'string' && + item['@type'] && + item['@type'] === 'CreativeWork' && + (item as CreativeWork).encodingFormat === 'application/pdf', ) as CreativeWork; expect(pdfComponent).to.not.be.undefined; expect(pdfComponent.url).to.equal( - "https://ipfs.io/ipfs/bafybeic3ach4ibambafznjsa3p446ghds3hp7742fkisldroe4wt6q5bsy" - ); - expect((pdfComponent as any)["/"]).to.equal( - "bafybeic3ach4ibambafznjsa3p446ghds3hp7742fkisldroe4wt6q5bsy" + 'https://ipfs.io/ipfs/bafybeic3ach4ibambafznjsa3p446ghds3hp7742fkisldroe4wt6q5bsy', ); + expect((pdfComponent as any)['/']).to.equal('bafybeic3ach4ibambafznjsa3p446ghds3hp7742fkisldroe4wt6q5bsy'); }); - it("Properly exports code components", () => { + it('Properly exports code components', () => { const researchObject = exampleNode; const roCrate = transformer.exportObject(researchObject); - const codeComponent = roCrate["@graph"].find( + const codeComponent = roCrate['@graph'].find( (item: RoCrateGraph) => - typeof item !== "string" && - item["@type"] === "SoftwareSourceCode" && - item.encodingFormat === "text/plain" + typeof item !== 'string' && item['@type'] === 'SoftwareSourceCode' && item.encodingFormat === 'text/plain', ); expect(codeComponent).to.not.be.undefined; - expect(codeComponent["/"]).to.equal( - "bafybeibzxn2il4q7att4bf3lvrcc2peovcdokv3jsbzne5v6ad5tr6mi6i" - ); + expect(codeComponent['/']).to.equal('bafybeibzxn2il4q7att4bf3lvrcc2peovcdokv3jsbzne5v6ad5tr6mi6i'); expect(codeComponent.url).to.equal( - "https://ipfs.io/ipfs/bafybeibzxn2il4q7att4bf3lvrcc2peovcdokv3jsbzne5v6ad5tr6mi6i" + 'https://ipfs.io/ipfs/bafybeibzxn2il4q7att4bf3lvrcc2peovcdokv3jsbzne5v6ad5tr6mi6i', ); }); - it("Properly exports data components", () => { + it('Properly exports data components', () => { const researchObject = exampleNode; const roCrate = transformer.exportObject(researchObject); - const dataComponent = roCrate["@graph"].find( + const dataComponent = roCrate['@graph'].find( (item: RoCrateGraph) => - typeof item !== "string" && - item["@type"] === "Dataset" && - item.encodingFormat === "application/octet-stream" + typeof item !== 'string' && item['@type'] === 'Dataset' && item.encodingFormat === 'application/octet-stream', ); expect(dataComponent).to.not.be.undefined; expect(dataComponent.url).to.equal( - "https://ipfs.io/ipfs/bafybeigzwjr6xkcdy4b7rrtzbbpwq3isx3zaesfopnpr3bqld3uddc5k3m" - ); - expect(dataComponent["/"]).to.equal( - "bafybeigzwjr6xkcdy4b7rrtzbbpwq3isx3zaesfopnpr3bqld3uddc5k3m" + 'https://ipfs.io/ipfs/bafybeigzwjr6xkcdy4b7rrtzbbpwq3isx3zaesfopnpr3bqld3uddc5k3m', ); + expect(dataComponent['/']).to.equal('bafybeigzwjr6xkcdy4b7rrtzbbpwq3isx3zaesfopnpr3bqld3uddc5k3m'); }); - it("Properly exports authors", () => { + it('Properly exports authors', () => { const researchObject = exampleNodeWithAuthors; const roCrate = transformer.exportObject(researchObject); // console.log("RO", roCrate); - const authors = roCrate["@graph"].filter( - (item: RoCrateGraph) => - typeof item !== "string" && item["@type"] === "Person" + const authors = roCrate['@graph'].filter( + (item: RoCrateGraph) => typeof item !== 'string' && item['@type'] === 'Person', ); expect(authors).to.not.be.undefined; expect(authors.length).to.equal(17); }); - it("Properly handles CEDAR link", () => { + it('Properly handles CEDAR link', () => { const researchObject = exampleNodeWithAuthors; const roCrate = transformer.exportObject(researchObject); // console.log("RO", roCrate); - const cedar = roCrate["@graph"].find( + const cedar = roCrate['@graph'].find( (item: RoCrateGraph) => - typeof item !== "string" && - item["@type"] === "Dataset" && - item["@id"] == "dd562a70-0bb9-4a07-8b00-c414bc8b9ad9" && - item["schemaVersion"] && - item["schemaVersion"].toString().length > 0 + typeof item !== 'string' && + item['@type'] === 'Dataset' && + item['@id'] == 'dd562a70-0bb9-4a07-8b00-c414bc8b9ad9' && + item['schemaVersion'] && + item['schemaVersion'].toString().length > 0, ); expect(cedar).to.not.be.undefined; }); - it("Adds orcid.org prefix to author ids", () => { + it('Adds orcid.org prefix to author ids', () => { const researchObject = exampleNodeWithAuthors; const roCrate = transformer.exportObject(researchObject); // console.log("RO", roCrate); - console.log("EXPORTED RO-CRATE", JSON.stringify(roCrate)); - const authors = roCrate["@graph"].filter( - (item: RoCrateGraph) => - typeof item !== "string" && item["@type"] === "Person" + console.log('EXPORTED RO-CRATE', JSON.stringify(roCrate)); + const authors = roCrate['@graph'].filter( + (item: RoCrateGraph) => typeof item !== 'string' && item['@type'] === 'Person', ); expect(authors).to.not.be.undefined; - expect(authors[0]["@id"]).to.equal( - `https://orcid.org/${researchObject.authors[0].orcid}` - ); + expect(authors[0]['@id']).to.equal(`https://orcid.org/${researchObject.authors[0].orcid}`); }); }); diff --git a/desci-models/tsconfig.json b/desci-models/tsconfig.json index 41c6cdfc2..0ef1ef792 100644 --- a/desci-models/tsconfig.json +++ b/desci-models/tsconfig.json @@ -1,14 +1,12 @@ { - "compilerOptions": { - "module": "commonjs", - "target": "es2015", - "declaration": true, - "outDir": "./dist", - "strict": true, - "resolveJsonModule": true, - "esModuleInterop": true - }, - "include": [ - "src/**/*" - ] -} \ No newline at end of file + "compilerOptions": { + "module": "commonjs", + "target": "es2015", + "declaration": true, + "outDir": "./dist", + "strict": true, + "resolveJsonModule": true, + "esModuleInterop": true + }, + "include": ["src/**/*"] +} diff --git a/desci-models/yarn.lock b/desci-models/yarn.lock index 6e31745ea..c72e97c15 100644 --- a/desci-models/yarn.lock +++ b/desci-models/yarn.lock @@ -401,11 +401,6 @@ assertion-error@^1.1.0: resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" @@ -470,14 +465,6 @@ caching-transform@^4.0.0: package-hash "^4.0.0" write-file-atomic "^3.0.0" -call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" @@ -760,13 +747,6 @@ flat@^5.0.2: resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - foreground-child@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz" @@ -806,11 +786,6 @@ fsevents@~2.3.2: resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" @@ -826,15 +801,6 @@ get-func-name@^2.0.0: resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz" integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.3: - version "1.2.0" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz" - integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" @@ -876,13 +842,6 @@ globals@^11.1.0: resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6: version "4.2.10" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" @@ -898,25 +857,6 @@ has-flag@^4.0.0: resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - hasha@^5.0.0: version "5.2.2" resolved "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz" @@ -953,19 +893,11 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3: +inherits@2: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -is-arguments@^1.0.4: - version "1.1.1" - resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" @@ -973,11 +905,6 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-callable@^1.1.3: - version "1.2.7" - resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" @@ -988,13 +915,6 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-generator-function@^1.0.7: - version "1.0.10" - resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" @@ -1017,17 +937,6 @@ is-stream@^2.0.0: resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-typed-array@^1.1.10, is-typed-array@^1.1.3: - version "1.1.10" - resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz" - integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" @@ -1724,17 +1633,6 @@ update-browserslist-db@^1.0.9: escalade "^3.1.1" picocolors "^1.0.0" -util@^0.12.5: - version "0.12.5" - resolved "https://registry.npmjs.org/util/-/util-0.12.5.tgz" - integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - which-typed-array "^1.1.2" - uuid@^8.3.2: version "8.3.2" resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" @@ -1755,18 +1653,6 @@ which-module@^2.0.0: resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz" integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== -which-typed-array@^1.1.2: - version "1.1.9" - resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz" - integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - is-typed-array "^1.1.10" - which@^2.0.1: version "2.0.2" resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" @@ -1899,8 +1785,3 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zod@^3.20.2: - version "3.20.2" - resolved "https://registry.npmjs.org/zod/-/zod-3.20.2.tgz" - integrity sha512-1MzNQdAvO+54H+EaK5YpyEy0T+Ejo/7YLHS93G3RnYWh5gaotGHwGeN/ZO687qEDU2y4CdStQYXVHIgrUl5UVQ== diff --git a/desci-repo/.dockerignore b/desci-repo/.dockerignore new file mode 100755 index 000000000..5e3971c4b --- /dev/null +++ b/desci-repo/.dockerignore @@ -0,0 +1,6 @@ +config +database +dist +node_modules +.git +.env \ No newline at end of file diff --git a/desci-repo/.env.example b/desci-repo/.env.example new file mode 100644 index 000000000..2e202f8bf --- /dev/null +++ b/desci-repo/.env.example @@ -0,0 +1,5 @@ +REPO_SERVICE_SECRET_KEY=secretrepo +NODE_ENV=dev +JWT_SECRET=secretshhh +DATABASE_URL=postgresql://walter:white@db_boilerplate:5432/boilerplate +IPFS_RESOLVER_OVERRIDE=http://host.docker.internal:8089/ipfs diff --git a/desci-repo/.env.test b/desci-repo/.env.test new file mode 100755 index 000000000..40a5d82a8 --- /dev/null +++ b/desci-repo/.env.test @@ -0,0 +1,23 @@ +NODE_ENV=test + +PORT=5484 + +IPFS_NODE_URL=http://host.docker.internal:5002 +PUBLIC_IPFS_RESOLVER=https://ipfs.io +### Database - Postgres +PG_HOST=host.docker.internal +PG_PORT=5434 +POSTGRES_USER=walter +POSTGRES_PASSWORD=white +POSTGRES_DB=boilerplate +DATABASE_URL=postgresql://walter:white@host.docker.internal:5434/boilerplate + +### JWT +JWT_SECRET=secretshhh +JWT_EXPIRATION= + +# FOR Communicating with REPO SERVICE +REPO_SERVICE_SECRET_KEY="m8sIy5BPygBcX3+ZmMVuAA10k6w59BSCZd+Z5+VLYm4=" +REPO_SERVER_URL=http://host.docker.internal:5485 + +IPFS_RESOLVER_OVERRIDE=http://host.docker.internal:8089/ipfs \ No newline at end of file diff --git a/desci-repo/.gitignore b/desci-repo/.gitignore new file mode 100755 index 000000000..13d8cfa39 --- /dev/null +++ b/desci-repo/.gitignore @@ -0,0 +1,16 @@ +node_modules +# Keep environment variables out of version control +.env +database/boilerplate/ +database/test/ +dist +.nebulus +log/access.log + +temp_downloads +.nyc_output +coverage + +server.log + +repo-tmp \ No newline at end of file diff --git a/desci-repo/.prettierignore b/desci-repo/.prettierignore new file mode 100755 index 000000000..53c37a166 --- /dev/null +++ b/desci-repo/.prettierignore @@ -0,0 +1 @@ +dist \ No newline at end of file diff --git a/desci-repo/.prettierrc b/desci-repo/.prettierrc new file mode 100755 index 000000000..6599520f8 --- /dev/null +++ b/desci-repo/.prettierrc @@ -0,0 +1,6 @@ +{ + "printWidth": 120, + "semi": true, + "singleQuote": true, + "trailingComma": "all" +} diff --git a/desci-repo/Dockerfile b/desci-repo/Dockerfile new file mode 100644 index 000000000..bb96428bd --- /dev/null +++ b/desci-repo/Dockerfile @@ -0,0 +1,23 @@ +FROM node:16.20.0-bookworm + +VOLUME /root/.yarn + +RUN npm install -g npm@9.8.1 + +RUN mkdir /app +WORKDIR /app +RUN mkdir /app/repo-tmp +RUN mkdir -p /app/desci-repo/repo-tmp + +COPY . . + +RUN --mount=type=cache,target=/root/.yarn YARN_CACHE_FOLDER=/root/.yarn yarn install +RUN yarn build + +# server api +EXPOSE 5484 + +# websocket +EXPOSE 5445 + +CMD [ "yarn", "start" ] \ No newline at end of file diff --git a/desci-repo/LICENSE b/desci-repo/LICENSE new file mode 100755 index 000000000..96485bab8 --- /dev/null +++ b/desci-repo/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 DeSci Labs AG + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/desci-repo/Makefile b/desci-repo/Makefile new file mode 100644 index 000000000..7047abba4 --- /dev/null +++ b/desci-repo/Makefile @@ -0,0 +1,8 @@ +.PHONY: install clean + +install: + yarn --frozen-lockfile + +clean: + rm -rf node_modules + diff --git a/desci-repo/kubernetes/deployment.yaml b/desci-repo/kubernetes/deployment.yaml new file mode 100755 index 000000000..2df2dadb0 --- /dev/null +++ b/desci-repo/kubernetes/deployment.yaml @@ -0,0 +1,75 @@ +apiVersion: v1 +kind: Service +metadata: + name: desci-repo-server-prod-service + labels: + App: DesciRepoServerProd +spec: + type: ClusterIP + selector: + App: DesciRepoServerProd + ports: + - name: server-api + port: 5484 + targetPort: 5484 + - name: ws-api + port: 5445 + targetPort: 5445 + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: desci-repo-server + labels: + App: DesciRepoServerProd +spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + App: DesciRepoServerProd + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + annotations: + vault.hashicorp.com/agent-inject: 'true' + vault.hashicorp.com/agent-inject-status: 'update' + vault.hashicorp.com/role: app-vault-reader + vault.hashicorp.com/agent-inject-secret-config: secrets/desci-server/staging/db + vault.hashicorp.com/agent-inject-template-config: | + {{- with secret "secrets/desci-server/staging/repo" -}} + echo "sourcing"; + export REPO_SERVICE_SECRET_KEY={{ .Data.REPO_SERVICE_SECRET_KEY }} + export NODE_ENV=production + export JWT_SECRET={{ .Data.JWT_SECRET }} + export DATABASE_URL={{ .Data.DATABASE_URL }} + export IPFS_RESOLVER_OVERRIDE={{ .Data.IPFS_RESOLVER_OVERRIDE }} + + {{- end -}} + labels: + App: DesciRepoServerProd + spec: + containers: + - image: 523044037273.dkr.ecr.us-east-2.amazonaws.com/desci-repo-server:latest + name: desci-repo-server + command: ['/bin/bash', '-c'] + args: + - echo "SOURCING ENV"; source /vault/secrets/config; NODE_PATH=./dist node ./dist/index.js; + ports: + - containerPort: 5484 + name: server-api + - containerPort: 5445 + name: ws-api + resources: + limits: + cpu: '2' + memory: 16Gi + requests: + cpu: '1' + memory: 8Gi + serviceAccountName: 'vault-auth' diff --git a/desci-repo/kubernetes/deployment_dev.yaml b/desci-repo/kubernetes/deployment_dev.yaml new file mode 100644 index 000000000..7bf69344c --- /dev/null +++ b/desci-repo/kubernetes/deployment_dev.yaml @@ -0,0 +1,74 @@ +apiVersion: v1 +kind: Service +metadata: + name: desci-repo-server-dev-service + labels: + App: DesciRepoServerDev +spec: + type: ClusterIP + selector: + App: DesciRepoServerDev + ports: + - name: server-api + port: 5484 + targetPort: 5484 + - name: ws-api + port: 5445 + targetPort: 5445 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: desci-repo-server-dev + labels: + App: DesciRepoServerDev +spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + App: DesciRepoServerDev + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + annotations: + vault.hashicorp.com/agent-inject: 'true' + vault.hashicorp.com/agent-inject-status: 'update' + vault.hashicorp.com/role: app-vault-reader + vault.hashicorp.com/agent-inject-secret-config: secrets/desci-server/dev/db + vault.hashicorp.com/agent-inject-template-config: | + {{- with secret "secrets/desci-server/dev/repo" -}} + echo "sourcing"; + export REPO_SERVICE_SECRET_KEY={{ .Data.REPO_SERVICE_SECRET_KEY }} + export NODE_ENV=production + export JWT_SECRET={{ .Data.JWT_SECRET }} + export DATABASE_URL={{ .Data.DATABASE_URL }} + export IPFS_RESOLVER_OVERRIDE={{ .Data.IPFS_RESOLVER_OVERRIDE }} + + {{- end -}} + labels: + App: DesciRepoServerDev + spec: + containers: + - image: 523044037273.dkr.ecr.us-east-2.amazonaws.com/desci-repo-server-dev:latest + name: desci-repo-server-dev + command: ['/bin/bash', '-c'] + args: + - echo "SOURCING ENV"; source /vault/secrets/config; NODE_PATH=./dist node ./dist/index.js; + ports: + - containerPort: 5484 + name: server-api + - containerPort: 5445 + name: ws-api + resources: + limits: + cpu: '2' + memory: 16Gi + requests: + cpu: '1' + memory: 8Gi + serviceAccountName: 'vault-auth' diff --git a/desci-repo/log/.gitkeep b/desci-repo/log/.gitkeep new file mode 100755 index 000000000..e69de29bb diff --git a/desci-repo/nodemon.json b/desci-repo/nodemon.json new file mode 100644 index 000000000..a1ef42433 --- /dev/null +++ b/desci-repo/nodemon.json @@ -0,0 +1,12 @@ +{ + "watch": [ + "." + ], + "ext": ".ts,.js,*", + "ignore": [ + "log/server.log" + ], + "verbose": true, + "exec": "npx kill-port 5484 9232; sleep 5; node -r ts-node/register --inspect=0.0.0.0:9232", + "delay": 300 +} \ No newline at end of file diff --git a/desci-repo/package.json b/desci-repo/package.json new file mode 100644 index 000000000..d7965dd25 --- /dev/null +++ b/desci-repo/package.json @@ -0,0 +1,81 @@ +{ + "name": "@desci-labs/desci-repo", + "version": "0.0.1", + "description": "", + "type": "module", + "engines": { + "node": ">=16.14" + }, + "scripts": { + "build": "rimraf dist && tsc", + "start": "NODE_PATH=./dist node ./dist/index.js", + "dev": "npm-run-all --parallel watch-compile watch-dev", + "docker:dev": "docker-compose --file docker-compose.repo.yml --compatibility up --build", + "watch-dev": "debug=* nodemon --watch \"dist/**/*\" -e js ./dist/index.js", + "watch-compile": "debug=* tsc -w --preserveWatchOutput", + "test": "echo \"Error: no test specified\" && exit 1", + "lint": "eslint --max-warnings 0 --ext .js,ts src", + "lint-staged-husky": "lint-staged", + "lint-prettier": "prettier --config .prettierrc --list-different '{src,test}/**/*.{ts,js,css,scss}'", + "prettier": "prettier --config .prettierrc --write './**/*.{ts,js,css,scss,json,md}'", + "commit": "git-cz" + }, + "keywords": [], + "author": "", + "license": "ISC", + "lint-staged": { + "*": [ + "pretty-quick --staged" + ], + "{src,test}/**/*.{js,ts}": [ + "eslint --max-warnings 0" + ] + }, + "devDependencies": { + "@automerge/automerge": "^2.1.10", + "@automerge/automerge-repo": "^1.0.19", + "@automerge/automerge-repo-network-websocket": "^1.0.19", + "@automerge/automerge-repo-storage-nodefs": "^1.0.19", + "@types/cors": "^2.8.17", + "@types/express": "^4.17.21", + "@types/jsonwebtoken": "^9.0.5", + "@types/morgan": "^1.9.9", + "@types/pg": "^8.10.9", + "@types/ws": "^8.5.10", + "@typescript-eslint/eslint-plugin": "^6.13.1", + "dotenv-cli": "^7.3.0", + "eslint": "^8.55.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-no-array-reduce": "^1.0.62", + "eslint-plugin-prettier": "^5.0.1", + "lint-staged": "11.1.2", + "nodemon": "^3.0.2", + "npm-run-all": "^4.1.5", + "prettier": "^3.1.0", + "pretty-quick": "^3.1.3", + "regenerator-runtime": "^0.14.0", + "rimraf": "^5.0.5", + "ts-node": "10.9.1", + "ts-node-dev": "^2.0.0", + "typescript": "5.1.6" + }, + "dependencies": { + "@desci-labs/desci-models": "^0.1.21", + "@sentry/node": "^7.84.0", + "@sentry/tracing": "^7.84.0", + "axios": "^1.6.2", + "cors": "^2.8.5", + "dotenv": "^16.3.1", + "express": "^4.18.2", + "jsonwebtoken": "^9.0.2", + "morgan": "^1.10.0", + "pg": "^8.11.3", + "pino": "^8.16.2", + "pino-http": "^8.5.1", + "pino-pretty": "^10.2.3", + "reflect-metadata": "^0.1.13", + "uuid": "^9.0.1", + "ws": "^8.14.2" + } +} diff --git a/desci-repo/scripts/be-node-dev.sh b/desci-repo/scripts/be-node-dev.sh new file mode 100755 index 000000000..7b36a9a34 --- /dev/null +++ b/desci-repo/scripts/be-node-dev.sh @@ -0,0 +1,14 @@ +#!/bin/sh +echo "Install bash and execute 'wait-for-it.sh' script" +apt-get add --update bash + +./desci-repo/scripts/wait-for-it.sh $PG_HOST:5432 --timeout=5 --strict -- echo "postgres up and running" + +# npm run migration:run +# npm run seed:run +chmod -R 777 /app/node_modules/.prisma +chmod -R 777 /app/node_modules/prisma +# chmod -R 777 /root/ && chown node:node /root/.cache/prisma/master/2920a97877e12e055c1333079b8d19cee7f33826/debian-openssl-1.1.x/libquery-engine # for prisma studio +# cd desci-repo +yarn +yarn dev diff --git a/desci-repo/scripts/be-node-test.sh b/desci-repo/scripts/be-node-test.sh new file mode 100755 index 000000000..ca192d6d2 --- /dev/null +++ b/desci-repo/scripts/be-node-test.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# ls -ltr /app/node_modules/@desci-labs/desci-models/dist + +echo "Install bash and execute 'wait-for-it.sh' script" +apt-get add --update bash +./desci-repo/scripts/wait-for-it.sh $PG_HOST:5434 --timeout=5 --strict -- echo "postgres up and running" + +mkdir -p /app/desci-repo/repo-tmp +chmod -R 777 /app/desci-repo/repo-tmp +cd desci-repo +yarn +yarn build +yarn start diff --git a/desci-repo/scripts/wait-for-it.sh b/desci-repo/scripts/wait-for-it.sh new file mode 100755 index 000000000..b347930f9 --- /dev/null +++ b/desci-repo/scripts/wait-for-it.sh @@ -0,0 +1,180 @@ +#!/usr/bin/env bash + +WAITFORIT_cmdname=${0##*/} + +echoerr() { if [[ $WAITFORIT_QUIET -ne 1 ]]; then echo "$@" 1>&2; fi } + +usage() +{ + cat << USAGE >&2 +Usage: + $WAITFORIT_cmdname host:port [-s] [-t timeout] [-- command args] + -h HOST | --host=HOST Host or IP under test + -p PORT | --port=PORT TCP port under test + Alternatively, you specify the host and port as host:port + -s | --strict Only execute subcommand if the test succeeds + -q | --quiet Don't output any status messages + -t TIMEOUT | --timeout=TIMEOUT + Timeout in seconds, zero for no timeout + -- COMMAND ARGS Execute command with args after the test finishes +USAGE + exit 1 +} + +wait_for() +{ + if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then + echoerr "$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT" + else + echoerr "$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout" + fi + WAITFORIT_start_ts=$(date +%s) + while : + do + if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then + nc -z $WAITFORIT_HOST $WAITFORIT_PORT + WAITFORIT_result=$? + else + (echo > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1 + WAITFORIT_result=$? + fi + if [[ $WAITFORIT_result -eq 0 ]]; then + WAITFORIT_end_ts=$(date +%s) + echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds" + break + fi + sleep 1 + done + return $WAITFORIT_result +} + +wait_for_wrapper() +{ + if [[ $WAITFORIT_QUIET -eq 1 ]]; then + timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT & + else + timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT & + fi + WAITFORIT_PID=$! + trap "kill -INT -$WAITFORIT_PID" INT + wait $WAITFORIT_PID + WAITFORIT_RESULT=$? + if [[ $WAITFORIT_RESULT -ne 0 ]]; then + echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT" + fi + return $WAITFORIT_RESULT +} + +# process arguments +while [[ $# -gt 0 ]] +do + case "$1" in + *:* ) + WAITFORIT_hostport=(${1//:/ }) + WAITFORIT_HOST=${WAITFORIT_hostport[0]} + WAITFORIT_PORT=${WAITFORIT_hostport[1]} + shift 1 + ;; + --child) + WAITFORIT_CHILD=1 + shift 1 + ;; + -q | --quiet) + WAITFORIT_QUIET=1 + shift 1 + ;; + -s | --strict) + WAITFORIT_STRICT=1 + shift 1 + ;; + -h) + WAITFORIT_HOST="$2" + if [[ $WAITFORIT_HOST == "" ]]; then break; fi + shift 2 + ;; + --host=*) + WAITFORIT_HOST="${1#*=}" + shift 1 + ;; + -p) + WAITFORIT_PORT="$2" + if [[ $WAITFORIT_PORT == "" ]]; then break; fi + shift 2 + ;; + --port=*) + WAITFORIT_PORT="${1#*=}" + shift 1 + ;; + -t) + WAITFORIT_TIMEOUT="$2" + if [[ $WAITFORIT_TIMEOUT == "" ]]; then break; fi + shift 2 + ;; + --timeout=*) + WAITFORIT_TIMEOUT="${1#*=}" + shift 1 + ;; + --) + shift + WAITFORIT_CLI=("$@") + break + ;; + --help) + usage + ;; + *) + echoerr "Unknown argument: $1" + usage + ;; + esac +done + +if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then + echoerr "Error: you need to provide a host and port to test." + usage +fi + +WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-15} +WAITFORIT_STRICT=${WAITFORIT_STRICT:-0} +WAITFORIT_CHILD=${WAITFORIT_CHILD:-0} +WAITFORIT_QUIET=${WAITFORIT_QUIET:-0} + +# Check to see if timeout is from busybox? +WAITFORIT_TIMEOUT_PATH=$(type -p timeout) +WAITFORIT_TIMEOUT_PATH=$(realpath $WAITFORIT_TIMEOUT_PATH 2>/dev/null || readlink -f $WAITFORIT_TIMEOUT_PATH) + +WAITFORIT_BUSYTIMEFLAG="" +if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then + WAITFORIT_ISBUSY=1 + # Check if busybox timeout uses -t flag + # (recent Alpine versions don't support -t anymore) + if timeout &>/dev/stdout | grep -q -e '-t '; then + WAITFORIT_BUSYTIMEFLAG="-t" + fi +else + WAITFORIT_ISBUSY=0 +fi + +if [[ $WAITFORIT_CHILD -gt 0 ]]; then + wait_for + WAITFORIT_RESULT=$? + exit $WAITFORIT_RESULT +else + if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then + wait_for_wrapper + WAITFORIT_RESULT=$? + else + wait_for + WAITFORIT_RESULT=$? + fi +fi + +if [[ $WAITFORIT_CLI != "" ]]; then + if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then + echoerr "$WAITFORIT_cmdname: strict mode, refusing to execute subprocess" + exit $WAITFORIT_RESULT + fi + exec "${WAITFORIT_CLI[@]}" +else + exit $WAITFORIT_RESULT +fi \ No newline at end of file diff --git a/desci-repo/src/config.ts b/desci-repo/src/config.ts new file mode 100644 index 000000000..77fcdf4cd --- /dev/null +++ b/desci-repo/src/config.ts @@ -0,0 +1,6 @@ +export const PUBLIC_IPFS_PATH = + process.env.NODE_ENV === 'dev' + ? `http://host.docker.internal:8089/ipfs` + : process.env.NODE_ENV === 'test' + ? 'http://host.docker.internal:8090/ipfs' + : 'https://ipfs.desci.com/ipfs'; \ No newline at end of file diff --git a/desci-repo/src/controllers/nodes/documents.ts b/desci-repo/src/controllers/nodes/documents.ts new file mode 100644 index 000000000..9429738df --- /dev/null +++ b/desci-repo/src/controllers/nodes/documents.ts @@ -0,0 +1,202 @@ +import { Request, Response } from 'express'; +import { ResearchObjectDocument } from '../../types.js'; +// import { getLatestManifest } from './utils.js'; +import { logger } from '../../logger.js'; +import { AutomergeUrl, DocumentId } from '@automerge/automerge-repo'; +import { RequestWithNode } from '../../middleware/guard.js'; +import { backendRepo } from '../../repo.js'; +import { ManifestActions, getAutomergeUrl, getDocumentUpdater } from '../../services/manifestRepo.js'; +import { findNodeByUuid, query } from '../../db/index.js'; +// import * as db from '../../db/index.js'; + +// const getNodeDocument = async function (req: RequestWithNode, res: Response) { +// try { +// console.log('[START GetNodeDocument]', req.user.id, req.node.uuid); + +// const node = req.node; + +// if (!node) { +// logger.info({ module: 'GetNodeDocument' }, 'Node not found', 'Request Params', req.params); +// res.status(400).send({ ok: false, message: `Node with uuid ${req.params.uuid} not found!` }); +// return; +// } + +// const parsedUuid = node.uuid.slice(0, -1) as NodeUuid; + +// let documentId = node.manifestDocumentId; +// let document: ResearchObjectDocument | null = null; + +// if (!documentId || documentId == '') { +// logger.info({ parsedUuid, query: req?.query?.g, node }, 'Before GetLatestManifest'); +// const manifest = await getLatestManifest(node.uuid, req.query?.g as string, node); +// logger.info({ parsedUuid, manifest }, 'Node latest manifest'); + +// if (!manifest) { +// res.status(500).send({ ok: false, message: 'Error pulling node manifest' }); +// return; +// } + +// // Object.assign({}, researchObject) as ResearchObjectV1; // todo: pull latest draft manifest +// const handle = backendRepo.create(); +// logger.info({ manifest, doc: handle.documentId }, 'Create new document'); +// handle.change( +// (document) => { +// document.manifest = manifest; +// document.uuid = parsedUuid; +// document.driveClock = Date.now().toString(); +// }, +// { message: 'Init Document', time: Date.now() }, +// ); + +// document = await handle.doc(); +// documentId = handle.documentId; +// logger.info('Initialized new document with Last published manfiest', { manifest }); + +// const result = await db.query('UPDATE "Node" SET manifestDocumentId = $1 WHERE id = $2 RETURNING *', [ +// handle.documentId, +// node.id, +// ]); +// console.log('Node UPDATED', result); + +// const updatedNode = result[0]; +// logger.info({ document, updatedNode }, 'Node updated'); +// } else { +// const handle = backendRepo.find(documentId as AnyDocumentId); +// document = await handle.doc(); +// if (document.uuid !== parsedUuid && handle.isReady()) { +// handle.change( +// (document) => { +// document.uuid = parsedUuid; +// }, +// { message: 'Update Document', time: Date.now() }, +// ); +// } +// document = await handle.doc(); +// } +// logger.info({ documentId }, 'End GetDocumentId'); +// res.status(200).send({ ok: true, documentId, document }); +// } catch (err) { +// logger.error('Creating new document Error', req.body, err); +// console.log(err); +// res.status(500).send({ ok: false, message: JSON.stringify(err) }); +// } +// }; + +export const createNodeDocument = async function (req: Request, res: Response) { + logger.info('START [CreateNodeDocument]', req.body, req.params); + try { + if (!(req.body.uuid && req.body.manifest)) { + res.status(400).send({ ok: false, message: 'Invalid data' }); + return; + } + + let { uuid, manifest } = req.body; + + logger.info('[Backend REPO]:', backendRepo.networkSubsystem.peerId); + + uuid = uuid.endsWith('.') ? uuid.slice(0, -1) : uuid; + const handle = backendRepo.create(); + handle.change( + (d) => { + d.manifest = manifest; + d.uuid = uuid; + d.driveClock = Date.now().toString(); + }, + { message: 'Init Document', time: Date.now() }, + ); + + const document = await handle.doc(); + + // await prisma.node.update({ where: { id: node.id }, data: { manifestDocumentId: handle.documentId } }); + const result = await query('UPDATE "Node" SET "manifestDocumentId" = $1 WHERE uuid = $2', [ + handle.documentId, + uuid, + ]); + + console.log('UPDATE DOCUMENT ID', result); + logger.info('[AUTOMERGE]::[HANDLE NEW CHANGED]', handle.url, handle.isReady(), document); + + res.status(200).send({ ok: true, documentId: handle.documentId, document }); + logger.info('END [CreateNodeDocument]', { documentId: handle.documentId, document }); + } catch (err) { + console.error('Error [CreateNodeDocument]', err); + logger.error('END [CreateNodeDocument]', err); + res.status(500).send({ ok: false, message: JSON.stringify(err) }); + } +}; + +export const getLatestNodeManifest = async function (req: Request, res: Response) { + logger.info({ params: req.params }, 'START [getLatestNodeManifest]'); + try { + console.log('[getLatestNodeManifest]', req.params); + if (!req.params.uuid) { + res.status(400).send({ ok: false, message: 'Invalid data' }); + return; + } + + const { uuid } = req.params; + + // const queryResult = await pool.query('SELECT * FROM nodes WHERE uuid = $1', [uuid]); + // console.log('user:', queryResult.rows[0]); + + console.log('[getLatestNodeManifest]', { uuid }); + const node = await findNodeByUuid(uuid); + console.log('[node]', { node }); + + if (!node) { + res.status(400).send({ ok: false, message: `Node with uuid ${uuid} not found!` }); + return; + } + + const automergeUrl = getAutomergeUrl(node.manifestDocumentId as DocumentId); + const handle = backendRepo.find(automergeUrl as AutomergeUrl); + + const document = await handle.doc(); + + logger.info('[END]:: GetLatestNodeManifest]', { manifest: document.manifest }); + res.status(200).send({ ok: true, document }); + } catch (err) { + console.error('Error [getLatestNodeManifest]', err); + logger.error(err, 'Error [getLatestNodeManifest]'); + res.status(500).send({ ok: false, message: JSON.stringify(err) }); + } +}; + +export const dispatchDocumentChange = async function (req: RequestWithNode, res: Response) { + logger.info({ params: req.params }, 'START [dispatchDocumentChange]'); + try { + if (!(req.body.uuid && req.body.documentId && req.body.actions)) { + res.status(400).send({ ok: false, message: 'Invalid data' }); + return; + } + + const actions = req.body.actions as ManifestActions[]; + const documentId = req.body.documentId as DocumentId; + + if (!(actions && actions.length > 0)) { + res.status(400).send({ ok: false, message: 'No actions to dispatch' }); + return; + } + + let document: ResearchObjectDocument; + + const dispatchChange = getDocumentUpdater(documentId); + + for (const action of actions) { + logger.info({ action }, '[AUTOMERGE]::[dispatch Update]'); + document = await dispatchChange(action); + } + + if (!document) { + res.status(400).send({ ok: false, message: 'Document not found' }); + return; + } + + logger.info('END [dispatchDocumentChange]', { document }); + res.status(200).send({ ok: true, document }); + } catch (err) { + logger.error(err, 'Error [dispatchDocumentChange]'); + console.error('Error [dispatchDocumentChange]', err); + res.status(500).send({ ok: false, message: JSON.stringify(err) }); + } +}; diff --git a/desci-repo/src/controllers/nodes/utils.ts b/desci-repo/src/controllers/nodes/utils.ts new file mode 100644 index 000000000..4ea58f538 --- /dev/null +++ b/desci-repo/src/controllers/nodes/utils.ts @@ -0,0 +1,44 @@ +import axios from 'axios'; +import { ResearchObjectV1 } from '@desci-labs/desci-models'; +import { PUBLIC_IPFS_PATH } from '../../config.js'; +import { logger as parentLogger } from '../../logger.js'; +import { createIpfsUnresolvableError } from '../../lib/errors.js'; +import { findNodeByUuid } from '../../db/index.js'; +import { Node } from '../../middleware/guard.js'; + +export async function getLatestManifest( + nodeUuid: string, + resolver: string, + node?: Node, +): Promise { + parentLogger.info({ nodeUuid, resolver, node }, 'Start Node latest manifest'); + node = node || (await findNodeByUuid(nodeUuid)); // (await prisma.node.findUnique({ where: { uuid: nodeUuid } })); + const latestManifestCid = node.manifestUrl || node.cid; + const manifestUrl = latestManifestCid ? cleanupManifestUrl(latestManifestCid as string, resolver as string) : null; + return manifestUrl ? await(await axios.get(manifestUrl)).data : null; +} + +export const cleanupManifestUrl = (url: string, gateway?: string) => { + if (url && (PUBLIC_IPFS_PATH || gateway)) { + const s = url.split('/'); + const res = `${gateway ? gateway : PUBLIC_IPFS_PATH}/${s[s.length - 1]}`; + parentLogger.info({ fn: 'cleanupManifestUrl', url, gateway }, `resolving ${url} => ${res}`); + return res; + } + return url; +}; + +export async function getManifestFromNode( + node: Node, + queryString?: string, +): Promise<{ manifest: ResearchObjectV1; manifestCid: string }> { + // debugger; + const manifestCid = node.manifestUrl || node.cid; + const manifestUrlEntry = manifestCid ? cleanupManifestUrl(manifestCid as string, queryString as string) : null; + try { + const fetchedManifest = manifestUrlEntry ? await (await axios.get(manifestUrlEntry)).data : null; + return { manifest: fetchedManifest, manifestCid }; + } catch (e) { + throw createIpfsUnresolvableError(`Error fetching manifest from IPFS, manifestCid: ${manifestCid}`); + } +} \ No newline at end of file diff --git a/desci-repo/src/db/index.ts b/desci-repo/src/db/index.ts new file mode 100644 index 000000000..d4b0ce511 --- /dev/null +++ b/desci-repo/src/db/index.ts @@ -0,0 +1,42 @@ +// import * as pg from 'pg'; + +const pg = await import('pg').then((value) => value.default); +const { Pool } = pg; + +console.log('DB', process.env.DATABASE_URL); + +export const pool = new Pool({ + connectionString: process.env.DATABASE_URL, + options: '-c search_path=public', +}); + +// pool.on('error', (err, client) => { +// console.error('Unexpected error on idle client', err, client); +// // process.exit(-1); +// }); + +export const client = await pool.connect(); + +// console.log('DB CLIENT', client.) + +export const findNodeByUuid = async (uuid: string) => { + try { + const result = await pool.query('SELECT * FROM "Node" WHERE uuid = $1', [uuid]); + return result.rows[0]; + } catch (err) { + console.log('[Error]::findNodeByUuid', err); + return undefined; + } +}; + +export const query = async (query: string, values?: (string | number | object)[]) => { + try { + // const client = await pool.connect(); + const result = await pool.query(query, values ? values : undefined); + // console.log('QUERY RESULT', result.rowCount); + return result.rows; + } catch (err) { + console.error('[QUERY ERROR]::', err); + return undefined; + } +}; diff --git a/desci-repo/src/index.ts b/desci-repo/src/index.ts new file mode 100644 index 000000000..2db1093ea --- /dev/null +++ b/desci-repo/src/index.ts @@ -0,0 +1,9 @@ +import { logger } from './logger.js'; +import { server } from './server.js'; +// import * as db from './dbs/index.js'; + +server.ready().then(async (_) => { + logger.info('server is ready'); + // const nodes = await pool.query('SELECT * from nodes'); + // console.log('nodes', nodes); +}); diff --git a/desci-repo/src/lib/PostgresStorageAdapter.ts b/desci-repo/src/lib/PostgresStorageAdapter.ts new file mode 100644 index 000000000..69b007839 --- /dev/null +++ b/desci-repo/src/lib/PostgresStorageAdapter.ts @@ -0,0 +1,106 @@ +import path from 'path'; + +import { Chunk, StorageAdapter, StorageKey } from '@automerge/automerge-repo'; + +import { logger as parentLogger } from '../logger.js'; +import { query } from '../db/index.js'; + +const logger = parentLogger.child({ module: 'PostgresStorageAdapter' }); +export class PostgresStorageAdapter extends StorageAdapter { + private cache: { [key: string]: Uint8Array } = {}; + tableName: string; + + constructor() { + super(); + this.tableName = 'DocumentStore'; + } + + async load(keyArray: StorageKey): Promise { + const key = getKey(keyArray); + if (this.cache[key]) return this.cache[key]; + + try { + const result = await query(`SELECT * FROM "${this.tableName}" WHERE key = $1`, [key]); + logger.info({ value: result.length, key }, '[LOAD DOCUMENT]::'); + + const response = result[0]; + if (!response) return undefined; + return new Uint8Array(response.value); + } catch (error) { + logger.error({ action: 'Load', key }, 'PostgresStorageAdaptser::Load ==> Error loading document'); + throw error; + } + } + + async save(keyArray: StorageKey, binary: Uint8Array): Promise { + const key = getKey(keyArray); + this.cache[key] = binary; + + try { + logger.info({ action: 'Save', key }, 'PostgresStorageAdaptser::Save'); + + await query( + `INSERT INTO "${this.tableName}" (key, value) VALUES ($1, $2) ON CONFLICT(key) DO UPDATE SET value = $2 RETURNING key`, + [key, Buffer.from(binary)], + ); + } catch (e) { + logger.error({ e, key }, 'PostgresStorageAdapter::Save ==> Error saving document'); + } + } + + async remove(keyArray: string[]): Promise { + const key = getKey(keyArray); + // remove from cache + delete this.cache[key]; + + try { + logger.info({ action: 'Remove', key }, 'PostgresStorageAdapter::Remove'); + await query(`DELETE FROM "${this.tableName}" WHERE key = $1 RETURNING key`, [key]); + } catch (e) { + logger.error({ e, key }, 'PostgresStorageAdapter::Remove ==> Error deleting document'); + } + } + + async loadRange(keyPrefix: StorageKey): Promise { + const cachedKeys = this.cachedKeys(keyPrefix); + const storedKeys = await this.loadRangeKeys(keyPrefix); + const allKeys = [...new Set([...cachedKeys, ...storedKeys])]; + + const chunks = await Promise.all( + allKeys.map(async (keyString) => { + const key: StorageKey = keyString.split(path.sep); + const data = await this.load(key); + return { data, key }; + }), + ); + return chunks; + } + + async removeRange(keyPrefix: StorageKey): Promise { + const key = getKey(keyPrefix); + this.cachedKeys(keyPrefix).forEach((key) => delete this.cache[key]); + try { + logger.info({ key, keyPrefix }, 'DELETE DOCUMENT RANGE'); + const result = await query(`DELETE FROM "${this.tableName}" WHERE key LIKE $1 RETURNING key`, [`${key}%`]); + console.log({ result, key }, 'DELETED MANY RANGE'); + } catch (e) { + logger.error({ keyPrefix, key }, '[DELETE RANGE kEYS]'); + } + } + + private cachedKeys(keyPrefix: string[]): string[] { + const cacheKeyPrefixString = getKey(keyPrefix); + return Object.keys(this.cache).filter((key) => key.startsWith(cacheKeyPrefixString)); + } + + private async loadRangeKeys(keyPrefix: string[]): Promise { + logger.info({ keyPrefix }, 'LoadRange Keys'); + const response = await query(`SELECT key FROM "${this.tableName}" WHERE key LIKE $1`, [`${keyPrefix}%`]); + logger.info({ keyPrefix, response: response?.length }, '[LOADED RANGE Keys]'); + + return response.map((row) => row.key); + } +} + +// HELPERS +const getKey = (key: StorageKey): string => path.join(...key); diff --git a/desci-repo/src/lib/errors.ts b/desci-repo/src/lib/errors.ts new file mode 100644 index 000000000..4f5ab1065 --- /dev/null +++ b/desci-repo/src/lib/errors.ts @@ -0,0 +1,155 @@ +import { v4 } from 'uuid'; + +export type Either = { ok: true; value: T } | { ok: false; value: E }; + +export type ProcessingError = + | UnhandledError + | MixingExternalDataError + | NotEnoughSpaceError + | InvalidManifestError + | IpfsUnresolvableError + | DuplicateFileError + | IpfsUploadFailureError + | DagExtensionFailureError + | ManifestPersistFailError + | ExternalUrlResolutionError; + +interface BaseProcessingError { + type: string; + status: number; + message: string; +} + +interface UnhandledError extends BaseProcessingError { + type: 'UnhandledError'; + message: string; + error: Error; + status: 500; +} + +export const createUnhandledError = (error: Error): UnhandledError => ({ + type: 'UnhandledError', + message: `Unhandled error occured, error reference: ${v4()}`, + error: error, + status: 500, +}); + +interface MixingExternalDataError extends BaseProcessingError { + type: 'MixingExternalDataError'; + message: string; + status: 400; +} + +export const createMixingExternalDataError = (): MixingExternalDataError => ({ + type: 'MixingExternalDataError', + message: 'Unable to add files to external CID directory', + status: 400, +}); + +interface NotEnoughSpaceError extends BaseProcessingError { + type: 'NotEnoughSpaceError'; + message: string; + status: 507; +} + +export const createNotEnoughSpaceError = (message: string): NotEnoughSpaceError => ({ + type: 'NotEnoughSpaceError', + message, + status: 507, +}); + +interface InvalidManifestError extends BaseProcessingError { + type: 'InvalidManifestError'; + message: string; + status: 400; +} + +export const createInvalidManifestError = (message: string): InvalidManifestError => ({ + type: 'InvalidManifestError', + message, + status: 400, +}); + +interface IpfsUnresolvableError extends BaseProcessingError { + type: 'IpfsUnresolvableError'; + message: string; + status: 404; +} + +export const createIpfsUnresolvableError = (message: string): IpfsUnresolvableError => ({ + type: 'IpfsUnresolvableError', + message, + status: 404, +}); + +interface DuplicateFileError extends BaseProcessingError { + type: 'DuplicateFileError'; + message: string; + status: 409; +} + +export const createDuplicateFileError = (): DuplicateFileError => ({ + type: 'DuplicateFileError', + message: 'Duplicate files rejected', + status: 409, +}); + +interface IpfsUploadFailureError extends BaseProcessingError { + type: 'IpfsUploadFailureError'; + message: string; + status: 502; +} + +export const createIpfsUploadFailureError = (): IpfsUploadFailureError => ({ + type: 'IpfsUploadFailureError', + message: 'Failed to upload files onto IPFS', + status: 502, +}); + +interface DagExtensionFailureError extends BaseProcessingError { + type: 'DagExtensionFailureError'; + message: string; + status: 500; +} + +export const createDagExtensionFailureError = (): DagExtensionFailureError => ({ + type: 'DagExtensionFailureError', + message: 'DAG extension failed', + status: 500, +}); + +interface ManifestPersistFailError extends BaseProcessingError { + type: 'ManifestPersistFailError'; + message: string; + status: 500; +} + +export const createManifestPersistFailError = (message: string): ManifestPersistFailError => ({ + type: 'ManifestPersistFailError', + message, + status: 500, +}); + +interface ExternalUrlResolutionError extends BaseProcessingError { + type: 'ExternalUrlResolutionError'; + message: string; + status: 500; +} + +export const createExternalUrlResolutionError = (message: string): ExternalUrlResolutionError => ({ + type: 'ExternalUrlResolutionError', + message, + status: 500, +}); + +interface NewFolderCreationError extends BaseProcessingError { + type: 'NewFolderCreationError'; + message: string; + status: 500; +} + +export const createNewFolderCreationError = (message: string): NewFolderCreationError => ({ + type: 'NewFolderCreationError', + message, + status: 500, +}); diff --git a/desci-repo/src/logger.ts b/desci-repo/src/logger.ts new file mode 100644 index 000000000..335ff2b3c --- /dev/null +++ b/desci-repo/src/logger.ts @@ -0,0 +1,72 @@ +import { pino } from 'pino'; +import { fileURLToPath } from 'url'; +import path from 'path'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const logLevel = process.env.PINO_LOG_LEVEL || 'trace'; + +const devTransport = { + target: 'pino-pretty', + level: logLevel, + options: { + colorize: true, + }, +}; + +const fileTransport = { + target: 'pino/file', + options: { destination: `${__dirname}/../log/server.log` }, + level: 'trace', +}; + +console.log('[DIR NAME]::', __dirname, __filename, logLevel); + +export const logger = pino({ + level: logLevel, + serializers: { + files: omitBuffer, + }, + transport: + process.env.NODE_ENV === 'production' + ? undefined + : { + targets: [devTransport, fileTransport], + }, + redact: { + paths: [ + 'req.headers.cookie', + 'req.headers.authorization', + 'user.email', + '*.user.email', + 'user.name', + '*.user.name', + 'user.website', + '*.user.website', + 'user.googleScholarUrl', + '*.user.googleScholarUrl', + 'user.walletAddress', + '*.user.walletAddress', + 'user.siweNonce', + '*.user.siweNonce', + 'user.orcid', + '*.user.orcid', + 'authorization', + '*.authorization', + '*.Authorization', + 'Authorization', + ], + }, +}); + +function omitBuffer(array) { + return array.map((obj) => { + const { buffer, ...rest } = obj; + return rest; + }); +} + +process.on('uncaughtException', (err) => { + logger.fatal(err, 'uncaught exception'); +}); diff --git a/desci-repo/src/middleware/ensureApiKey.ts b/desci-repo/src/middleware/ensureApiKey.ts new file mode 100644 index 000000000..2d610d3d6 --- /dev/null +++ b/desci-repo/src/middleware/ensureApiKey.ts @@ -0,0 +1,14 @@ +import { Request, Response, NextFunction } from 'express'; +import { logger } from '../logger.js'; + +const REPO_SERVICE_API_KEY = process.env.REPO_SERVICE_SECRET_KEY; + +export const ensureApiKey = async (req: Request, res: Response, next: NextFunction) => { + const apiKey = req.headers['x-api-key']; + logger.info({ module: 'EnsureApiKey', apiKey }, 'VERIFY API KEY from', req.hostname); + if (!apiKey || apiKey !== REPO_SERVICE_API_KEY) { + res.sendStatus(401); + return; + } + next(); +}; diff --git a/desci-repo/src/middleware/guard.ts b/desci-repo/src/middleware/guard.ts new file mode 100644 index 000000000..c7fbf50a5 --- /dev/null +++ b/desci-repo/src/middleware/guard.ts @@ -0,0 +1,61 @@ +// import { Node, User } from '@prisma/client'; +import { Request, Response, NextFunction } from 'express'; + +import { extractAuthToken, extractUserFromToken } from './permissions.js'; +import { logger as parentLogger } from '../logger.js'; +import { hideEmail } from '../services/user.js'; +import { query } from '../db/index.js'; + +const logger = parentLogger.child({ module: 'MIDDLEWARE/GUARD' }); + +export type Node = { + id: number; + title: string; + cid: string; + ownerId: number; + uuid: string | null; + manifestUrl: string; + manifestDocumentId: string; +}; + +export interface RequestWithUser extends Request { + user: { email: string; id: number }; +} + +export interface RequestWithNode extends RequestWithUser { + node: Node; + // nodeAccess: NodeAccess; +} + +export const ensureNodeAccess = async (req: RequestWithUser, res: Response, next: NextFunction) => { + logger.info('START EnsureNodeAccess'); + const token = await extractAuthToken(req); + const user = await extractUserFromToken(token); + + if (!(user && user.id > 0)) { + res.status(401).send({ ok: false, message: 'Unauthorized' }); + return; + } + req.user = user; + + const uuid = req.body?.uuid || req.query?.uuid || req.params?.uuid; + + if (!uuid) { + logger.info({ module: 'GetNodeDocument' }, 'Node not found', 'Request Params', req.params); + res.status(400).send({ message: 'Bad Request' }); + return; + } + + const rows = await query('SELECT * FROM "Node" WHERE uuid = $1 AND ownerId = $2'); + const node = rows[0]; + + logger.info({ email: hideEmail(user.email), uuid, node }, '[EnsureNodeAccess]:: => '); + if (!node) { + logger.info({ uuid, user }, `Node not found ${req.params}`); + res.status(401).send({ message: 'Unauthorized' }); + return; + } + + (req as RequestWithNode).node = node; + next(); +}; diff --git a/desci-repo/src/middleware/permissions.ts b/desci-repo/src/middleware/permissions.ts new file mode 100644 index 000000000..907c700f9 --- /dev/null +++ b/desci-repo/src/middleware/permissions.ts @@ -0,0 +1,95 @@ +import { NextFunction, Request as ExpressRequest, Response } from 'express'; +import jwt from 'jsonwebtoken'; + +import { logger } from '../logger.js'; +import { getUserByEmail, getUserByOrcId } from '../services/user.js'; + +export const ensureUser = async (req: ExpressRequest, res: Response, next: NextFunction) => { + const token = await extractAuthToken(req); + const retrievedUser = await extractUserFromToken(token); + if (!retrievedUser) { + res.status(401).send({ ok: false, message: 'Unauthorized' }); + } else { + (req as any).user = retrievedUser; + next(); + } +}; + +/** + * Extract JWT Authorisation token from IncommingRequest + */ +export const extractAuthToken = async (request: ExpressRequest | Request) => { + let token: string | undefined; + // get from query string + token = request.url.split('auth=')[1]; + // logger.info({ url: request.url, token }, 'got url extract'); + if (!token) { + // Try to retrieve the token from the auth header + const authHeader = request.headers['authorization']; + if (authHeader) { + token = authHeader.split(' ')[1]; + } + logger.info({ module: 'Permissions::extractAuthToken', authHeaderLength: authHeader?.length || 0 }, 'Request'); + + // If auth token wasn't found in the header, try retrieve from cookies + if (!token && request['cookies']) { + token = request['cookies']['auth']; + } + + // If Auth token is null and request.headers.cookie is valid, attempt to parse auth token from cookie + // Request.Headers.Cookie is of the format `auth=tokenvalue; path=/` + if (!token && request.headers['cookie']) { + const parsedTokenValue = request.headers['cookie'] + .split(';') + .map((entry) => entry.split('=')) + .filter(([key]) => key.trim().toLowerCase() === 'auth')[0]; + token = parsedTokenValue?.[1]; + // console.log('parsedTokenValue', parsedTokenValue); + } + } + return token; +}; + +/** + * Attempt to retrieve user from JWT Authorisation token + */ +export const extractUserFromToken = async (token: string): Promise => { + return new Promise(async (resolve, reject) => { + if (!token) { + resolve(null); + return; + } + + jwt.verify(token, process.env.JWT_SECRET as string, async (err: any, user: any) => { + if (err) { + logger.error({ module: 'ExtractAuthUser', err }, 'anon request'); + // reject(err); + resolve(null); + return; + } + + // logger.info({ module: 'ExtractAuthUser', user }, 'User decrypted'); + + if (!user) { + resolve(null); + return; + } + + const loggedInUserEmail = user.email as string; + const shouldFetchUserByOrcId = Boolean(user.orcid); + + const retrievedUser = shouldFetchUserByOrcId + ? await getUserByOrcId(user.orcid) + : await getUserByEmail(loggedInUserEmail); + + // logger.info({ user: retrievedUser.id }, 'User Retrieved'); + + if (!retrievedUser || !retrievedUser.id) { + resolve(null); + return; + } + + resolve(retrievedUser); + }); + }); +}; diff --git a/desci-repo/src/repo.ts b/desci-repo/src/repo.ts new file mode 100644 index 000000000..e51b695ea --- /dev/null +++ b/desci-repo/src/repo.ts @@ -0,0 +1,77 @@ +import os from 'os'; + +import { DocHandleChangePayload, DocHandleEvents, PeerId, Repo, RepoConfig } from '@automerge/automerge-repo'; +import { NodeWSServerAdapter } from '@automerge/automerge-repo-network-websocket'; +import { WebSocketServer } from 'ws'; + +import { PostgresStorageAdapter } from './lib/PostgresStorageAdapter.js'; +import { logger } from './logger.js'; +import { verifyNodeDocumentAccess } from './services/nodes.js'; +import { ResearchObjectDocument } from './types.js'; +import * as db from './db/index.js'; + +export const socket = new WebSocketServer({ port: 5445, path: '/sync' }); +const hostname = os.hostname(); + +const adapter = new NodeWSServerAdapter(socket); +const config: RepoConfig = { + network: [adapter], + storage: new PostgresStorageAdapter(), + peerId: `storage-server-${hostname}` as PeerId, + // Since this is a server, we don't share generously — meaning we only sync documents they already + // know about and can ask for by ID. + sharePolicy: async (peerId, documentId) => { + try { + // peer format: `peer-[user#id]:[unique string combination] + if (peerId.toString().length < 8) return false; + + const userId = peerId.split(':')?.[0]?.split('-')?.[1]; + const isAuthorised = await verifyNodeDocumentAccess(Number(userId), documentId); + logger.info({ peerId, userId, documentId, isAuthorised }, '[SHARE POLICY CALLED]::'); + return isAuthorised; + } catch (err) { + logger.error({ err }, 'Error in share policy'); + return false; + } + }, +}; +export const backendRepo = new Repo(config); +const handleChange = async (change: DocHandleChangePayload) => { + logger.trace({ change: change.handle.documentId, uuid: (await change.handle.doc()).uuid }, 'Document Changed'); + const newTitle = change.patchInfo.after.manifest.title; + const newCover = change.patchInfo.after.manifest.coverImage; + const uuid = change.doc.uuid.endsWith('.') ? change.doc.uuid : change.doc.uuid + '.'; + logger.info({ uuid: uuid + '.', newTitle }, 'UPDATE NODE'); + + try { + // TODO: Check if update message is 'UPDATE TITLE' + if (newTitle) { + const result = await db.query('UPDATE "Node" SET title = $1 WHERE uuid = $2', [newTitle, uuid]); + logger.info({ newTitle, result }, 'TITLE UPDATED'); + } + + // TODO: Check if update message is 'UPDATE TITLE' + // Update the cover image url in the db for fetching collection + if (newCover) { + const coverUrl = process.env.IPFS_RESOLVER_OVERRIDE + '/' + newCover; + const result = await db.query( + 'INSERT INTO "NodeCover" (url, cid, "nodeUuid", version) VALUES ($1, $2, $3, $4) ON CONFLICT("nodeUuid", version) DO UPDATE SET url = $1, cid = $2', + [coverUrl, newCover as string, uuid, 0], + ); + logger.info({ uuid, coverUrl, result }, 'COVER UPDATED'); + } + } catch (err) { + console.error('[Error in DOCUMENT CHANG HANDLER CALLBACK]', err); + logger.error(err, '[Error in DOCUMENT CHANG HANDLER CALLBACK]'); + } +}; + +backendRepo.on('document', async (doc) => { + doc.handle.on>('change', handleChange); +}); + +backendRepo.off('document', async (doc) => { + doc.handle.off('change', handleChange); +}); + +// todo: Recover from RangeError -> reset repo and return a new instance diff --git a/desci-repo/src/routes/index.ts b/desci-repo/src/routes/index.ts new file mode 100644 index 000000000..bea92cb50 --- /dev/null +++ b/desci-repo/src/routes/index.ts @@ -0,0 +1,14 @@ +import { Router } from 'express'; + +import page404 from './pages/404.js'; +import pageRoot from './pages/root.js'; +import v1 from './v1/v1.js'; + +const router = Router(); + +router.use(`/v1`, v1); + +router.use(pageRoot); +router.use(page404); + +export default router; diff --git a/desci-repo/src/routes/pages/404.ts b/desci-repo/src/routes/pages/404.ts new file mode 100644 index 000000000..f5ee87cbb --- /dev/null +++ b/desci-repo/src/routes/pages/404.ts @@ -0,0 +1,9 @@ +import { Router } from 'express'; + +const router = Router(); + +router.get('*', (req, res, next) => { + return res.status(404).json('404 Not Found'); +}); + +export default router; diff --git a/desci-repo/src/routes/pages/root.ts b/desci-repo/src/routes/pages/root.ts new file mode 100644 index 000000000..5258ac7cb --- /dev/null +++ b/desci-repo/src/routes/pages/root.ts @@ -0,0 +1,9 @@ +import { Router } from 'express'; + +const router = Router(); + +router.get('/', (req, res, next) => { + res.status(200).header('Content-Type', 'text/html').send(`

Desci Repo

`); +}); + +export default router; diff --git a/desci-repo/src/routes/v1/nodes.ts b/desci-repo/src/routes/v1/nodes.ts new file mode 100644 index 000000000..a93f73df6 --- /dev/null +++ b/desci-repo/src/routes/v1/nodes.ts @@ -0,0 +1,15 @@ +import { Router } from 'express'; +import { + createNodeDocument, + dispatchDocumentChange, + getLatestNodeManifest, +} from '../../controllers/nodes/documents.js'; +import { ensureApiKey } from '../../middleware/ensureApiKey.js'; + +const router = Router(); + +router.get('/documents/draft/:uuid', [ensureApiKey], getLatestNodeManifest); +router.post('/documents/dispatch', [ensureApiKey], dispatchDocumentChange); +router.post('/documents', [ensureApiKey], createNodeDocument); + +export default router; diff --git a/desci-repo/src/routes/v1/v1.ts b/desci-repo/src/routes/v1/v1.ts new file mode 100644 index 000000000..71af4398a --- /dev/null +++ b/desci-repo/src/routes/v1/v1.ts @@ -0,0 +1,9 @@ +import { Router } from 'express'; + +import nodes from './nodes.js'; + +const router = Router(); + +router.use('/nodes', nodes); + +export default router; diff --git a/desci-repo/src/server.ts b/desci-repo/src/server.ts new file mode 100644 index 000000000..5ed1b6554 --- /dev/null +++ b/desci-repo/src/server.ts @@ -0,0 +1,200 @@ +// @ts-check +import express from 'express'; +import type { Express, Request } from 'express'; +import cors from 'cors'; +import bodyParser from 'body-parser'; + +import 'dotenv/config'; +import 'reflect-metadata'; +import path from 'path'; + +import * as Sentry from '@sentry/node'; +import type { Server as HttpServer } from 'http'; +import { v4 } from 'uuid'; + +import routes from './routes/index.js'; +// import SocketServer from './wsServer.js'; + +import { fileURLToPath } from 'url'; +import { socket as wsSocket } from './repo.js'; +import { logger } from './logger.js'; +import { extractAuthToken, extractUserFromToken } from './middleware/permissions.js'; +import { pinoHttp } from 'pino-http'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const ENABLE_TELEMETRY = process.env.NODE_ENV === 'production'; +const IS_DEV = !ENABLE_TELEMETRY; + +const serverUuid = v4(); + +const allowlist = [ + 'http://localhost:3000', + 'http://localhost:3001', + 'http://localhost:61440', + 'http://localhost:3002', + 'http://host.docker.internal:3000', + 'http://host.docker.internal:3002', + 'http://127.0.0.1:3000', + 'https://nodes.desci.com', + 'https://nodes-dev.desci.com', + 'https://nodes-demo.desci.com', + 'd2195goqok3wlx.amplifyapp.com', + 'd3ge8gcb3rt5iw.amplifyapp.com', + 'desci.com', + 'gitpod.io', + 'loca.lt' /** NOT SECURE */, + 'vercel.app' /** NOT SECURE */, +]; +class AppServer { + #readyResolvers: ((value: any) => void)[] = []; + + #isReady = false; + + app: Express; + server: HttpServer; + port: number; + + constructor() { + this.app = express(); + this.#initSerialiser(); + + this.app.use(function (req, res, next) { + const origin = req.headers.origin; + if ( + allowlist.indexOf(origin) !== -1 || + allowlist.filter((a) => a.indexOf('http') != 0 && origin && origin.endsWith(a)).length + ) { + res.setHeader('Access-Control-Allow-Origin', origin); + res.setHeader( + 'Access-Control-Allow-Headers', + 'X-Requested-With,Content-Type,Authorization,sentry-trace,baggage', + ); + res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PATCH, OPTIONS, PUT, DELETE'); + res.setHeader('Access-Control-Allow-Credentials', 'true'); + // if (req.headers['set-cookie']) { + // res.setHeader('set-cookie', req.headers['set-cookie']); + // } + } + next(); + }); + + this.#initTelemetry(); + + this.app.use(bodyParser.json({ limit: '100mb' })); + this.app.use(bodyParser.urlencoded({ extended: false })); + + this.app.set('trust proxy', 2); // detect AWS ELB IP + cloudflare + + this.app.use(cors()); + + this.app.get('/readyz', (_, res) => { + res.status(200).json({ status: 'ok' }); + }); + + this.app.use('/', routes); + this.app.get('/id', (_, res) => { + res.status(200).json({ id: serverUuid }); + }); + + this.port = parseInt(process.env.PORT) || 5484; + logger.info(`Server starting on port ${this.port}`); + this.server = this.app.listen(this.port, () => { + this.#isReady = true; + this.#readyResolvers.forEach((resolve) => resolve(true)); + logger.info(`Server running on port ${this.port}`); + }); + + wsSocket.on('listening', () => { + logger.info({ module: 'WebSocket SERVER', port: wsSocket.address() }, 'WebSocket Server Listening'); + }); + wsSocket.on('connection', async (socket, request) => { + try { + logger.info({ module: 'WebSocket SERVER' }, 'WebSocket Connection Attempt'); + const token = await extractAuthToken(request as Request); + const authUser = await extractUserFromToken(token); + if (!authUser) { + socket.close(); // Close connection if user is not authorized + return; + } + logger.info( + { module: 'WebSocket SERVER', id: authUser.id, name: authUser.name }, + 'WebSocket Connection Authorised', + ); + socket.on('message', (message) => { + // Handle incoming messages + // console.log(`Received message: ${message}`); + }); + // Additional event listeners (e.g., 'close', 'error') can be set up here + } catch (error) { + socket.close(); // Close the connection in case of an error + logger.error(error, 'Error during WebSocket connection'); + } + }); + } + + #initSerialiser() { + this.app.use( + pinoHttp({ + logger, + serializers: { + res: (res) => { + if (IS_DEV) { + return { + responseTime: res.responseTime, + status: res.statusCode, + }; + } else { + return res; + } + }, + req: (req) => { + if (IS_DEV) { + return { + query: req.query, + params: req.params, + method: req.method, + url: req.url, + }; + } else { + return req; + } + }, + }, + }), + ); + } + + #initTelemetry() { + if (ENABLE_TELEMETRY) { + logger.info('[DeSci Repo] Telemetry enabled'); + Sentry.init({ + dsn: 'https://d508a5c408f34b919ccd94aac093e076@o1330109.ingest.sentry.io/6619754', + release: 'desci-nodes-repo@' + process.env.npm_package_version, + integrations: [], + // Set tracesSampleRate to 1.0 to capture 100% + // of transactions for performance monitoring. + // We recommend adjusting this value in production + tracesSampleRate: 1.0, + }); + this.app.use(Sentry.Handlers.requestHandler()); + this.app.use(Sentry.Handlers.tracingHandler()); + this.app.use(Sentry.Handlers.errorHandler()); + } else { + logger.info('[DeSci Repo] Telemetry disabled'); + } + } + + async ready() { + if (this.#isReady) { + return true; + } + + return new Promise((resolve) => { + this.#readyResolvers.push(resolve); + }); + } +} + +export const server = new AppServer(); diff --git a/desci-repo/src/services/manifestRepo.ts b/desci-repo/src/services/manifestRepo.ts new file mode 100644 index 000000000..e849cb735 --- /dev/null +++ b/desci-repo/src/services/manifestRepo.ts @@ -0,0 +1,268 @@ +import { Doc, getHeads } from '@automerge/automerge'; +import { AutomergeUrl, DocumentId } from '@automerge/automerge-repo'; +import { + ResearchObjectComponentTypeMap, + ResearchObjectV1Component, + isResearchObjectComponentTypeMap, +} from '@desci-labs/desci-models'; + +import { logger } from '../logger.js'; +import { backendRepo } from '../repo.js'; +import { ResearchObjectDocument } from '../types.js'; + +export type NodeUuid = string & { _kind: 'uuid' }; + +export const getAutomergeUrl = (documentId: DocumentId): AutomergeUrl => { + return `automerge:${documentId}` as AutomergeUrl; +}; + +// export const createManifestDocument = async function ({ node, manifest }: { node: Node; manifest: ResearchObjectV1 }) { +// logger.info({ uuid: node.uuid }, 'START [CreateNodeDocument]'); +// const uuid = node.uuid.replace(/\.$/, ''); +// logger.info('[Backend REPO]:', backendRepo.networkSubsystem.peerId); + +// const handle = backendRepo.create(); +// handle.change( +// (document) => { +// document.manifest = manifest; +// document.uuid = uuid; +// document.driveClock = Date.now().toString(); +// }, +// { message: 'Init Document', time: Date.now() }, +// ); + +// const document = await handle.doc(); +// logger.info('[AUTOMERGE]::[HANDLE NEW CHANGED]', handle.url, handle.isReady(), document); + +// await prisma.node.update({ where: { id: node.id }, data: { manifestDocumentId: handle.documentId } }); + +// logger.info('END [CreateNodeDocument]', { documentId: handle.documentId }); +// return handle.documentId; +// }; + +// export const getDraftManifestFromUuid = async function (uuid: NodeUuid) { +// logger.info({ uuid }, 'START [getDraftManifestFromUuid]'); +// // const backendRepo = server.repo; +// const node = await prisma.node.findFirst({ +// where: { uuid }, +// }); + +// if (!node) { +// throw new Error(`Node with uuid ${uuid} not found!`); +// } + +// const automergeUrl = getAutomergeUrl(node.manifestDocumentId as DocumentId); +// const handle = backendRepo.find(automergeUrl as AutomergeUrl); + +// const document = await handle.doc(); + +// logger.info({ uuid: document.uuid, documentId: handle.documentId }, '[AUTOMERGE]::[Document Found]'); + +// logger.info({ uuid }, '[END]::GetDraftManifestFromUuid'); +// return document.manifest; +// }; + +// export const getDraftManifest = async function (node: Node) { +// return getDraftManifestFromUuid(node.uuid as NodeUuid); +// }; + +// export const getLatestManifestFromNode = async (node: Node) => { +// logger.info({ uuid: node.uuid }, 'START [getLatestManifestFromNode]'); +// let manifest = await getDraftManifestFromUuid(node.uuid as NodeUuid); +// if (!manifest) { +// const publishedManifest = await getManifestFromNode(node); +// manifest = publishedManifest.manifest; +// } +// return manifest; +// }; + +export function assertNever(value: never) { + console.error('Unknown value', value); + throw Error('Not Possible'); +} + +export type ManifestActions = + | { type: 'Add Components'; components: ResearchObjectV1Component[] } + | { type: 'Delete Component'; componentId: string } + | { type: 'Delete Components'; pathsToDelete: string[] } + | { type: 'Rename Component'; path: string; fileName: string } + | { type: 'Rename Component Path'; oldPath: string; newPath: string } + | { + type: 'Update Component'; + component: ResearchObjectV1Component; + componentIndex: number; + } + | { + type: 'Assign Component Type'; + component: ResearchObjectV1Component; + componentTypeMap: ResearchObjectComponentTypeMap; + } + | { type: 'Set Drive Clock'; time: string }; + +export const getDocumentUpdater = (documentId: DocumentId) => { + const automergeUrl = getAutomergeUrl(documentId); + const handle = backendRepo.find(automergeUrl as AutomergeUrl); + + return async (action: ManifestActions) => { + if (!handle) return null; + let latestDocument = await handle.doc(); + + if (!latestDocument) { + logger.error({ node: documentId }, 'Automerge document not found'); + throw new Error('Automerge Document Not found'); + } + + const heads = getHeads(latestDocument); + logger.info({ heads }, `Document`); + logger.info({ action }, `DocumentUpdater::Dispatched`); + + switch (action.type) { + case 'Add Components': + const uniqueComponents = action.components.filter( + (componentToAdd) => + !latestDocument.manifest.components.some((c) => c.payload?.path === componentToAdd.payload?.path), + ); + if (uniqueComponents.length > 0) { + handle.change( + (document) => { + uniqueComponents.forEach((component) => { + document.manifest.components.push(component); + }); + }, + { time: Date.now(), message: action.type }, + ); + } + break; + case 'Rename Component': + handle.change( + (document) => { + const component = document.manifest.components.find((c) => c.payload?.path === action.path); + if (component) component.name = action.fileName; + }, + { time: Date.now(), message: action.type }, + ); + break; + case 'Delete Component': + const deleteIdx = latestDocument.manifest.components.findIndex((c) => c.id === action.componentId); + if (deleteIdx !== -1) { + logger.info({ action, deleteIdx }, `DocumentUpdater::Deleteing`); + handle.change( + (document) => { + document.manifest.components.splice(deleteIdx, 1); + }, + { time: Date.now(), message: action.type }, + ); + } + break; + case 'Delete Components': + const componentEntries = latestDocument.manifest.components + .map((c) => (action.pathsToDelete.includes(c.payload?.path) ? c.payload?.path : null)) + .filter(Boolean) as string[]; + if (componentEntries.length > 0) { + logger.info({ action, componentEntries }, `DocumentUpdater::Delete Components`); + handle.change( + (document) => { + for (const path of componentEntries) { + const deleteIdx = document.manifest.components.findIndex((c) => c.payload?.path === path); + logger.info({ path, deleteIdx }, `DocumentUpdater::Delete`); + if (deleteIdx !== -1) document.manifest.components.splice(deleteIdx, 1); + } + }, + { time: Date.now(), message: action.type }, + ); + } + break; + case 'Rename Component Path': + const components = latestDocument.manifest.components.filter( + (component) => + component.payload?.path?.startsWith(action.oldPath + '/') || component.payload?.path === action.oldPath, + ); + if (components.length > 0) { + handle.change( + (document) => { + const components = document.manifest.components.filter( + (component) => + component.payload?.path.startsWith(action.oldPath + '/') || + component.payload?.path === action.oldPath, + ); + for (const component of components) { + component.payload.path = component.payload?.path.replace(action.oldPath, action.newPath); + } + }, + { time: Date.now(), message: action.type }, + ); + } + break; + case 'Update Component': + handle.change( + (document) => { + updateManifestComponent(document, action.component, action.componentIndex); + }, + { time: Date.now(), message: action.type }, + ); + break; + case 'Assign Component Type': + handle.change( + (document) => { + updateComponentTypeMap(document, action.component.payload?.path, action.componentTypeMap); + }, + { time: Date.now(), message: action.type }, + ); + break; + case 'Set Drive Clock': + handle.change( + (document) => { + if (document.driveClock && document.driveClock === action.time) return; // Don't update if already the latest + document.driveClock = action.time; + }, + { time: Date.now(), message: action.type }, + ); + break; + default: + assertNever(action); + } + latestDocument = await handle.doc(); + const updatedHeads = getHeads(latestDocument); + logger.info({ action, heads: updatedHeads }, `DocumentUpdater::Exit`); + return latestDocument; + }; +}; + +const updateManifestComponent = ( + doc: Doc, + component: ResearchObjectV1Component, + componentIndex: number, +) => { + if (componentIndex === -1 || componentIndex === undefined) return; + + const currentComponent = doc.manifest.components[componentIndex]; + currentComponent.type = component?.type || currentComponent.type; + + if (!currentComponent.starred) currentComponent.starred = false; + currentComponent.starred = component?.starred || currentComponent.starred; +}; + +const updateComponentTypeMap = ( + doc: Doc, + path: string, + compTypeMap: ResearchObjectComponentTypeMap, +) => { + const currentComponent = doc.manifest.components.find((c) => c.payload?.path === path); + if (!currentComponent) return; + + const existingType = currentComponent.type; + if (!isResearchObjectComponentTypeMap(existingType)) { + currentComponent.type = {}; + } + + const componentType = currentComponent.type; + const update = { + ...(isResearchObjectComponentTypeMap(existingType) && { ...existingType }), + ...compTypeMap, + }; + + Object.entries(update).forEach(([key, value]) => { + if (!componentType[key]) componentType[key] = ''; + componentType[key] = value; + }); +}; diff --git a/desci-repo/src/services/nodes.ts b/desci-repo/src/services/nodes.ts new file mode 100644 index 000000000..c1778a8c3 --- /dev/null +++ b/desci-repo/src/services/nodes.ts @@ -0,0 +1,24 @@ +import { query } from '../db/index.js'; +import { logger } from '../logger.js'; + +export const verifyNodeDocumentAccess = async (userId: number, documentId: string) => { + try { + logger.info({ userId, documentId }, 'START [verifyNodeDocumentAccess]::Node'); + const rows = await query('SELECT * FROM "Node" WHERE "manifestDocumentId" = $1 AND "ownerId" = $2', [ + documentId, + userId, + ]); + const node = rows[0]; + logger.info( + { uuid: node.uuid, userId, ownerId: node.ownerId, documentId: node.manifestDocumentId }, + '[verifyNodeDocumentAccess]::Node', + ); + + if (!node) return false; + + if (node.manifestDocumentId === documentId && node.ownerId === userId) return true; + return false; + } catch (e) { + return false; + } +}; diff --git a/desci-repo/src/services/user.ts b/desci-repo/src/services/user.ts new file mode 100644 index 000000000..d440a491f --- /dev/null +++ b/desci-repo/src/services/user.ts @@ -0,0 +1,30 @@ +import { logger as parentLogger } from '../logger.js'; +import { query } from '../db/index.js'; + +export const hideEmail = (email: string) => { + return email.replace(/(.{1,1})(.*)(@.*)/, '$1...$3'); +}; + +const logger = parentLogger.child({ module: 'UserService' }); + +export async function getUserByOrcId(orcid: string): Promise { + logger.trace({ fn: 'getUserByOrcId' }, 'user::getUserByOrcId'); + logger.info({ fn: 'getUserByOrcId' }, 'user::getUserByOrcId'); + // const user = await prisma.user.findFirst({ where: { orcid } }); + const rows = await query('SELECT * FROM "User" WHERE orcid = $1', [orcid]); + const user = rows[0]; + logger.info({ fn: 'getUserByOrcId' }, 'user::getUserByOrcId'); + return user; +} + +export async function getUserByEmail(email: string): Promise { + logger.trace({ fn: 'getUserByEmail' }, `user::getUserByEmail ${hideEmail(email)}`); + logger.info({ email }, 'user::getUserByemail'); + + const rows = await query('SELECT * FROM "User" WHERE email = $1', [email]); + logger.info(rows.length, 'USER'); + + const user = rows[0]; + + return user; +} diff --git a/desci-repo/src/types.ts b/desci-repo/src/types.ts new file mode 100644 index 000000000..79d6062c8 --- /dev/null +++ b/desci-repo/src/types.ts @@ -0,0 +1,7 @@ +import { ResearchObjectV1 } from '@desci-labs/desci-models'; + +export interface ResearchObjectDocument { + manifest: ResearchObjectV1; + uuid: string; + driveClock: string; +} \ No newline at end of file diff --git a/desci-repo/tsconfig.json b/desci-repo/tsconfig.json new file mode 100755 index 000000000..bbf1fbff2 --- /dev/null +++ b/desci-repo/tsconfig.json @@ -0,0 +1,41 @@ +{ + "compilerOptions": { + "module": "nodenext", + /** + * Implied by "module: nodenext": + * "moduleResolution": "nodenext", + * "esModuleInterop": true, + */ + "target": "esnext", + // Recommended by docs, but a lot of errors + // "verbatimModuleSyntax": true, + "lib": [ + "esnext", + "dom" + ], + "outDir": "./dist", + "removeComments": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "resolveJsonModule": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "skipLibCheck": true, + // dagConcat.cjs requires this + "allowJs": true, + "inlineSourceMap": true, + "paths": { + // Overrides a built-in Response type + "express": [ + "./src/types/express" + ] + } + }, + "include": [ + "./src/**/*.ts", + ], + "exclude": [ + "test/**/*.ts" + ], + "compileOnSave": true +} \ No newline at end of file diff --git a/desci-repo/yarn.lock b/desci-repo/yarn.lock new file mode 100644 index 000000000..d3135b92a --- /dev/null +++ b/desci-repo/yarn.lock @@ -0,0 +1,4191 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@automerge/automerge-repo-network-websocket@^1.0.19": + version "1.0.19" + resolved "https://registry.yarnpkg.com/@automerge/automerge-repo-network-websocket/-/automerge-repo-network-websocket-1.0.19.tgz#d375dacf517e5e1f1074bf05eec8b0f6b97a81a2" + integrity sha512-he/cRcZ9byNHZN0ws/c7rwjT6ocbAdPr2EGvTUp6QeIhRlcICqyTuIJjUSG0MyxckO8FbqcBKnfsiaTRCx/b3Q== + dependencies: + "@automerge/automerge-repo" "^1.0.19" + cbor-x "^1.3.0" + eventemitter3 "^5.0.1" + isomorphic-ws "^5.0.0" + ws "^8.7.0" + +"@automerge/automerge-repo-storage-nodefs@^1.0.19": + version "1.0.19" + resolved "https://registry.yarnpkg.com/@automerge/automerge-repo-storage-nodefs/-/automerge-repo-storage-nodefs-1.0.19.tgz#64d319baef35b8e3a39e09455c43c8793499fc2a" + integrity sha512-B6KlD+btLycfIYJoBHvV0gDppc/QxM/WEInUtG+cDZyf6T0vLfJJbBQhHOcYTqH6cVW0Lmg4WA04Agyvpz8YLA== + dependencies: + "@automerge/automerge-repo" "^1.0.19" + rimraf "^5.0.1" + +"@automerge/automerge-repo@^1.0.19": + version "1.0.19" + resolved "https://registry.yarnpkg.com/@automerge/automerge-repo/-/automerge-repo-1.0.19.tgz#cb90845a87a116c65cf9ba5d0d75d2e24169455d" + integrity sha512-IcfX9xkbk+YY7IhG+ZCoUVccou2MmHGXvu/XGOICFmUIaG1mkQAPzZU2u5r2JUX0cpr/2PcIPOeCletJMssnWw== + dependencies: + "@automerge/automerge" "^2.1.7" + bs58check "^3.0.1" + cbor-x "^1.3.0" + debug "^4.3.4" + eventemitter3 "^5.0.1" + fast-sha256 "^1.3.0" + tiny-typed-emitter "^2.1.0" + ts-node "^10.9.1" + uuid "^9.0.0" + xstate "^4.37.0" + +"@automerge/automerge-wasm@0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@automerge/automerge-wasm/-/automerge-wasm-0.9.0.tgz#1b0e1ea595feeb47ea0f4b685bf2ffb7fa61f97c" + integrity sha512-wTPcW3wVk20D1x0DOko/RsfZV1mlc8HJynqgTRhVocOxFIU/RCilnYRfJmSb8LwCG2uZzfqg0DLsEBqQZ53KBQ== + +"@automerge/automerge@^2.1.10", "@automerge/automerge@^2.1.7": + version "2.1.10" + resolved "https://registry.yarnpkg.com/@automerge/automerge/-/automerge-2.1.10.tgz#257f9f94c37db088008548cca7e57e853d1ed354" + integrity sha512-xj8R3fQHZmDYnrYW5WrBqWm/r5sLV9Z7mu89pJ10wGLVS2V+iAB2os85DoOGI2etzjmQsoHyrd97GBmszjH4zQ== + dependencies: + "@automerge/automerge-wasm" "0.9.0" + uuid "^9.0.0" + +"@babel/code-frame@^7.0.0": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" + integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== + dependencies: + "@babel/highlight" "^7.23.4" + chalk "^2.4.2" + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/highlight@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + +"@cbor-extract/cbor-extract-darwin-arm64@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-darwin-arm64/-/cbor-extract-darwin-arm64-2.2.0.tgz#8d65cb861a99622e1b4a268e2d522d2ec6137338" + integrity sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w== + +"@cbor-extract/cbor-extract-darwin-x64@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-darwin-x64/-/cbor-extract-darwin-x64-2.2.0.tgz#9fbec199c888c5ec485a1839f4fad0485ab6c40a" + integrity sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w== + +"@cbor-extract/cbor-extract-linux-arm64@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-linux-arm64/-/cbor-extract-linux-arm64-2.2.0.tgz#bf77e0db4a1d2200a5aa072e02210d5043e953ae" + integrity sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ== + +"@cbor-extract/cbor-extract-linux-arm@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-linux-arm/-/cbor-extract-linux-arm-2.2.0.tgz#491335037eb8533ed8e21b139c59f6df04e39709" + integrity sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q== + +"@cbor-extract/cbor-extract-linux-x64@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-linux-x64/-/cbor-extract-linux-x64-2.2.0.tgz#672574485ccd24759bf8fb8eab9dbca517d35b97" + integrity sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw== + +"@cbor-extract/cbor-extract-win32-x64@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-win32-x64/-/cbor-extract-win32-x64-2.2.0.tgz#4b3f07af047f984c082de34b116e765cb9af975f" + integrity sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w== + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@desci-labs/desci-models@^0.1.21": + version "0.1.22" + resolved "https://registry.yarnpkg.com/@desci-labs/desci-models/-/desci-models-0.1.22.tgz#82959adca7819548fe808abe7d77663225740fd6" + integrity sha512-hfMUA2jtX3FH+p42kHU1GdKr5vvlmGPNJazjlaGDehs13z6HrNGZFKEue6H6qYkgH1wIlu8PgkjRqnlOsDz5Zg== + dependencies: + jsonld "^8.1.1" + schema-dts "^1.1.2" + typescript "^4.9.4" + util "^0.12.5" + zod "^3.20.2" + +"@digitalbazaar/http-client@^3.4.1": + version "3.4.1" + resolved "https://registry.yarnpkg.com/@digitalbazaar/http-client/-/http-client-3.4.1.tgz#5116fc44290d647cfe4b615d1f3fad9d6005e44d" + integrity sha512-Ahk1N+s7urkgj7WvvUND5f8GiWEPfUw0D41hdElaqLgu8wZScI8gdI0q+qWw5N1d35x7GCRH2uk9mi+Uzo9M3g== + dependencies: + ky "^0.33.3" + ky-universal "^0.11.0" + undici "^5.21.2" + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.56.0": + version "8.56.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b" + integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A== + +"@fastify/busboy@^2.0.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.0.tgz#0709e9f4cb252351c609c6e6d8d6779a8d25edff" + integrity sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA== + +"@humanwhocodes/config-array@^0.11.13": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== + dependencies: + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" + integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@noble/hashes@^1.2.0": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" + integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@pkgr/core@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" + integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== + +"@sentry-internal/tracing@7.94.1": + version "7.94.1" + resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.94.1.tgz#27909da03c1541a83002cab655814ec208242b9e" + integrity sha512-znxCdrz7tPXm9Bwoe46PW72Zr0Iv7bXT6+b2LNg5fxWiCQVBbQFrMuVvtXEmHxeRRJVEgTh/4TdulB7wrtQIUQ== + dependencies: + "@sentry/core" "7.94.1" + "@sentry/types" "7.94.1" + "@sentry/utils" "7.94.1" + +"@sentry/core@7.94.1": + version "7.94.1" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.94.1.tgz#3696cd78b2196ac27fda5bcfb2338f46241a3ff8" + integrity sha512-4sjiMnkbGpv9O98YHVZe7fHNwwdYl+zLoCOoEOadtrJ1EYYvnK/MSixN2HJF7g/0s22xd4xY958QyNIRVR+Iiw== + dependencies: + "@sentry/types" "7.94.1" + "@sentry/utils" "7.94.1" + +"@sentry/node@^7.84.0": + version "7.94.1" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-7.94.1.tgz#3e123e546330d89e71004f9f5cad1f9ba7581598" + integrity sha512-30nyrfVbY1vNoWg5ptGW+soykU532VvKLuXiKty3SKEXjp5bv23JrCcVtuwp9KrW4josHOJbxZUqeNni85YplQ== + dependencies: + "@sentry-internal/tracing" "7.94.1" + "@sentry/core" "7.94.1" + "@sentry/types" "7.94.1" + "@sentry/utils" "7.94.1" + +"@sentry/tracing@^7.84.0": + version "7.94.1" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-7.94.1.tgz#e300f6a1a2c6df2565503e2eedd59511d1ca9ceb" + integrity sha512-/mkIZNanqqtQt9+vmuIYMiT7/XAhkkMUgAJ68kFt640QxwgHbTvV7f7gsQRXtZKv3zZCd+nmNfXPNeF6PIek7Q== + dependencies: + "@sentry-internal/tracing" "7.94.1" + +"@sentry/types@7.94.1": + version "7.94.1" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.94.1.tgz#97b653a6e73078fc82a2c9d2129e22c7ae1ee248" + integrity sha512-A7CdEXFSgGyWv2BT2p9cAvJfb+dypvOtsY8ZvZvdPLUa7kqCV7ndhURUqKjvMBzsL2GParHn3ehDTl2eVc7pvA== + +"@sentry/utils@7.94.1": + version "7.94.1" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.94.1.tgz#1164934cf6e2277fb404744b27de38a04310895d" + integrity sha512-gQ2EaMpUU1gGH3S+iqpog9gkXbCo8tlhGYA9a5FUtEtER3D3OAlp8dGFwClwzWDAwzjdLT1+X55zmEptU1cP/A== + dependencies: + "@sentry/types" "7.94.1" + +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@types/body-parser@*": + version "1.19.5" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" + integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== + dependencies: + "@types/node" "*" + +"@types/cors@^2.8.17": + version "2.8.17" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.17.tgz#5d718a5e494a8166f569d986794e49c48b216b2b" + integrity sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA== + dependencies: + "@types/node" "*" + +"@types/express-serve-static-core@^4.17.33": + version "4.17.41" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz#5077defa630c2e8d28aa9ffc2c01c157c305bef6" + integrity sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@^4.17.21": + version "4.17.21" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" + integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/http-errors@*": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== + +"@types/json-schema@^7.0.12": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/jsonwebtoken@^9.0.5": + version "9.0.5" + resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-9.0.5.tgz#0bd9b841c9e6c5a937c17656e2368f65da025588" + integrity sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA== + dependencies: + "@types/node" "*" + +"@types/mime@*": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.4.tgz#2198ac274de6017b44d941e00261d5bc6a0e0a45" + integrity sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw== + +"@types/mime@^1": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== + +"@types/morgan@^1.9.9": + version "1.9.9" + resolved "https://registry.yarnpkg.com/@types/morgan/-/morgan-1.9.9.tgz#d60dec3979e16c203a000159daa07d3fb7270d7f" + integrity sha512-iRYSDKVaC6FkGSpEVVIvrRGw0DfJMiQzIn3qr2G5B3C//AWkulhXgaBd7tS9/J79GWSYMTHGs7PfI5b3Y8m+RQ== + dependencies: + "@types/node" "*" + +"@types/node@*": + version "20.11.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.5.tgz#be10c622ca7fcaa3cf226cf80166abc31389d86e" + integrity sha512-g557vgQjUUfN76MZAN/dt1z3dzcUsimuysco0KeluHgrPdJXkP/XdAURgyO2W9fZWHRtRBiVKzKn8vyOAwlG+w== + dependencies: + undici-types "~5.26.4" + +"@types/parse-json@^4.0.0": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" + integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== + +"@types/pg@^8.10.9": + version "8.10.9" + resolved "https://registry.yarnpkg.com/@types/pg/-/pg-8.10.9.tgz#d20bb948c6268c5bd847e2bf968f1194c5a2355a" + integrity sha512-UksbANNE/f8w0wOMxVKKIrLCbEMV+oM1uKejmwXr39olg4xqcfBDbXxObJAt6XxHbDa4XTKOlUEcEltXDX+XLQ== + dependencies: + "@types/node" "*" + pg-protocol "*" + pg-types "^4.0.1" + +"@types/qs@*": + version "6.9.11" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.11.tgz#208d8a30bc507bd82e03ada29e4732ea46a6bbda" + integrity sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ== + +"@types/range-parser@*": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== + +"@types/semver@^7.5.0": + version "7.5.6" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.6.tgz#c65b2bfce1bec346582c07724e3f8c1017a20339" + integrity sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A== + +"@types/send@*": + version "0.17.4" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-static@*": + version "1.15.5" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.5.tgz#15e67500ec40789a1e8c9defc2d32a896f05b033" + integrity sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ== + dependencies: + "@types/http-errors" "*" + "@types/mime" "*" + "@types/node" "*" + +"@types/strip-bom@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2" + integrity sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ== + +"@types/strip-json-comments@0.0.30": + version "0.0.30" + resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1" + integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== + +"@types/ws@^8.5.10": + version "8.5.10" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" + integrity sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A== + dependencies: + "@types/node" "*" + +"@typescript-eslint/eslint-plugin@^6.13.1": + version "6.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.19.0.tgz#db03f3313b57a30fbbdad2e6929e88fc7feaf9ba" + integrity sha512-DUCUkQNklCQYnrBSSikjVChdc84/vMPDQSgJTHBZ64G9bA9w0Crc0rd2diujKbTdp6w2J47qkeHQLoi0rpLCdg== + dependencies: + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "6.19.0" + "@typescript-eslint/type-utils" "6.19.0" + "@typescript-eslint/utils" "6.19.0" + "@typescript-eslint/visitor-keys" "6.19.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/scope-manager@6.19.0": + version "6.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.19.0.tgz#b6d2abb825b29ab70cb542d220e40c61c1678116" + integrity sha512-dO1XMhV2ehBI6QN8Ufi7I10wmUovmLU0Oru3n5LVlM2JuzB4M+dVphCPLkVpKvGij2j/pHBWuJ9piuXx+BhzxQ== + dependencies: + "@typescript-eslint/types" "6.19.0" + "@typescript-eslint/visitor-keys" "6.19.0" + +"@typescript-eslint/type-utils@6.19.0": + version "6.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.19.0.tgz#522a494ef0d3e9fdc5e23a7c22c9331bbade0101" + integrity sha512-mcvS6WSWbjiSxKCwBcXtOM5pRkPQ6kcDds/juxcy/727IQr3xMEcwr/YLHW2A2+Fp5ql6khjbKBzOyjuPqGi/w== + dependencies: + "@typescript-eslint/typescript-estree" "6.19.0" + "@typescript-eslint/utils" "6.19.0" + debug "^4.3.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/types@6.19.0": + version "6.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.19.0.tgz#689b0498c436272a6a2059b09f44bcbd90de294a" + integrity sha512-lFviGV/vYhOy3m8BJ/nAKoAyNhInTdXpftonhWle66XHAtT1ouBlkjL496b5H5hb8dWXHwtypTqgtb/DEa+j5A== + +"@typescript-eslint/typescript-estree@6.19.0": + version "6.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.19.0.tgz#0813ba364a409afb4d62348aec0202600cb468fa" + integrity sha512-o/zefXIbbLBZ8YJ51NlkSAt2BamrK6XOmuxSR3hynMIzzyMY33KuJ9vuMdFSXW+H0tVvdF9qBPTHA91HDb4BIQ== + dependencies: + "@typescript-eslint/types" "6.19.0" + "@typescript-eslint/visitor-keys" "6.19.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/utils@6.19.0": + version "6.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.19.0.tgz#557b72c3eeb4f73bef8037c85dae57b21beb1a4b" + integrity sha512-QR41YXySiuN++/dC9UArYOg4X86OAYP83OWTewpVx5ct1IZhjjgTLocj7QNxGhWoTqknsgpl7L+hGygCO+sdYw== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.19.0" + "@typescript-eslint/types" "6.19.0" + "@typescript-eslint/typescript-estree" "6.19.0" + semver "^7.5.4" + +"@typescript-eslint/visitor-keys@6.19.0": + version "6.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.19.0.tgz#4565e0ecd63ca1f81b96f1dd76e49f746c6b2b49" + integrity sha512-hZaUCORLgubBvtGpp1JEFEazcuEdfxta9j4iUwdSAr7mEsYYAp3EAUyCZk3VEEqGj6W+AV4uWyrDGtrlawAsgQ== + dependencies: + "@typescript-eslint/types" "6.19.0" + eslint-visitor-keys "^3.4.1" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.1.1: + version "8.3.2" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" + integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== + +acorn@^8.4.1, acorn@^8.9.0: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-includes@^3.1.7: + version "3.1.7" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" + integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.findlastindex@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz#b37598438f97b579166940814e2c0493a4f50207" + integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.2.1" + +array.prototype.flat@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +arraybuffer.prototype.slice@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" + integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +atomic-sleep@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" + integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +axios@^1.6.2: + version "1.6.5" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.5.tgz#2c090da14aeeab3770ad30c3a1461bc970fb0cd8" + integrity sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg== + dependencies: + follow-redirects "^1.15.4" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base-x@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-4.0.0.tgz#d0e3b7753450c73f8ad2389b5c018a4af7b2224a" + integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +basic-auth@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" + integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== + dependencies: + safe-buffer "5.1.2" + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + 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" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +bs58@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-5.0.0.tgz#865575b4d13c09ea2a84622df6c8cbeb54ffc279" + integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ== + dependencies: + base-x "^4.0.0" + +bs58check@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-3.0.1.tgz#2094d13720a28593de1cba1d8c4e48602fdd841c" + integrity sha512-hjuuJvoWEybo7Hn/0xOrczQKKEKD63WguEjlhLExYs2wUBcebDC1jDNK17eEAD2lYfw82d5ASC1d7K3SWszjaQ== + dependencies: + "@noble/hashes" "^1.2.0" + bs58 "^5.0.0" + +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-writer@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-2.0.0.tgz#ce7eb81a38f7829db09c873f2fbb792c0c98ec04" + integrity sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw== + +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" + integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== + dependencies: + function-bind "^1.1.2" + get-intrinsic "^1.2.1" + set-function-length "^1.1.1" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +canonicalize@^1.0.1: + version "1.0.8" + resolved "https://registry.yarnpkg.com/canonicalize/-/canonicalize-1.0.8.tgz#24d1f1a00ed202faafd9bf8e63352cd4450c6df1" + integrity sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A== + +cbor-extract@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cbor-extract/-/cbor-extract-2.2.0.tgz#cee78e630cbeae3918d1e2e58e0cebaf3a3be840" + integrity sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA== + dependencies: + node-gyp-build-optional-packages "5.1.1" + optionalDependencies: + "@cbor-extract/cbor-extract-darwin-arm64" "2.2.0" + "@cbor-extract/cbor-extract-darwin-x64" "2.2.0" + "@cbor-extract/cbor-extract-linux-arm" "2.2.0" + "@cbor-extract/cbor-extract-linux-arm64" "2.2.0" + "@cbor-extract/cbor-extract-linux-x64" "2.2.0" + "@cbor-extract/cbor-extract-win32-x64" "2.2.0" + +cbor-x@^1.3.0: + version "1.5.8" + resolved "https://registry.yarnpkg.com/cbor-x/-/cbor-x-1.5.8.tgz#3bd7bc61120692b5031d7f782a39b64f51f1d825" + integrity sha512-gc3bHBsvG6GClCY6c0/iip+ghlqizkVp+TtaL927lwvP4VP9xBdi1HmqPR5uj/Mj/0TOlngMkIYa25wKg+VNrQ== + optionalDependencies: + cbor-extract "^2.2.0" + +chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@^3.5.1, chokidar@^3.5.2: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^2.0.16, colorette@^2.0.7: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +cors@^2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +cosmiconfig@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +data-uri-to-buffer@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" + integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== + +dateformat@^4.6.3: + version "4.6.3" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.6.3.tgz#556fa6497e5217fedb78821424f8a1c22fa3f4b5" + integrity sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA== + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +define-data-property@^1.0.1, define-data-property@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +depd@2.0.0, depd@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-libc@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.2.tgz#8ccf2ba9315350e1241b88d0ac3b0e1fbd99605d" + integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dotenv-cli@^7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/dotenv-cli/-/dotenv-cli-7.3.0.tgz#21e33e7944713001677658d68856063968edfbd2" + integrity sha512-314CA4TyK34YEJ6ntBf80eUY+t1XaFLyem1k9P0sX1gn30qThZ5qZr/ZwE318gEnzyYP9yj9HJk6SqwE0upkfw== + dependencies: + cross-spawn "^7.0.3" + dotenv "^16.3.0" + dotenv-expand "^10.0.0" + minimist "^1.2.6" + +dotenv-expand@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-10.0.0.tgz#12605d00fb0af6d0a592e6558585784032e4ef37" + integrity sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A== + +dotenv@^16.3.0, dotenv@^16.3.1: + version "16.3.2" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.2.tgz#3cb611ce5a63002dbabf7c281bc331f69d28f03f" + integrity sha512-HTlk5nmhkm8F6JcdXvHIzaorzCoziNQT9mGxLPVXW8wJF1TiGSL60ZGB4gHWabHOaMmWmhvk2/lPHfnBiT78AQ== + +dynamic-dedupe@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz#06e44c223f5e4e94d78ef9db23a6515ce2f962a1" + integrity sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ== + dependencies: + xtend "^4.0.0" + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +ecdsa-sig-formatter@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enquirer@^2.3.6: + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== + dependencies: + ansi-colors "^4.1.1" + strip-ansi "^6.0.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.22.1: + version "1.22.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32" + integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA== + dependencies: + array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.2" + available-typed-arrays "^1.0.5" + call-bind "^1.0.5" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.2" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.12" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + safe-array-concat "^1.0.1" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.8" + string.prototype.trimend "^1.0.7" + string.prototype.trimstart "^1.0.7" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.13" + +es-set-tostringtag@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9" + integrity sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q== + dependencies: + get-intrinsic "^1.2.2" + has-tostringtag "^1.0.0" + hasown "^2.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-prettier@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f" + integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== + +eslint-import-resolver-node@^0.3.9: + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== + dependencies: + debug "^3.2.7" + is-core-module "^2.13.0" + resolve "^1.22.4" + +eslint-module-utils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== + dependencies: + debug "^3.2.7" + +eslint-plugin-import@^2.29.0: + version "2.29.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" + integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== + dependencies: + 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-import-resolver-node "^0.3.9" + eslint-module-utils "^2.8.0" + hasown "^2.0.0" + is-core-module "^2.13.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.fromentries "^2.0.7" + object.groupby "^1.0.1" + object.values "^1.1.7" + semver "^6.3.1" + tsconfig-paths "^3.15.0" + +eslint-plugin-no-array-reduce@^1.0.62: + version "1.0.62" + resolved "https://registry.yarnpkg.com/eslint-plugin-no-array-reduce/-/eslint-plugin-no-array-reduce-1.0.62.tgz#925dee5bbe37f41ce7aa6ebb149c3988dd5b8d48" + integrity sha512-Hnauv6BNmo2RPNG6ka1fc2WcNDtsbcutCbvx188goD/EdSNab3Jp26HgmMSFERiqu3VQdIebHSnSKIS1GUrvoA== + +eslint-plugin-prettier@^5.0.1: + version "5.1.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz#17cfade9e732cef32b5f5be53bd4e07afd8e67e1" + integrity sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw== + dependencies: + prettier-linter-helpers "^1.0.0" + synckit "^0.8.6" + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8.55.0: + version "8.56.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.56.0.tgz#4957ce8da409dc0809f99ab07a1b94832ab74b15" + integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.56.0" + "@humanwhocodes/config-array" "^0.11.13" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + +events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +express@^4.18.2: + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + 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" + +fast-copy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fast-copy/-/fast-copy-3.0.1.tgz#9e89ef498b8c04c1cd76b33b8e14271658a732aa" + integrity sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== + +fast-glob@^3.2.9: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fast-redact@^3.1.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.3.0.tgz#7c83ce3a7be4898241a46560d51de10f653f7634" + integrity sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ== + +fast-safe-stringify@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +fast-sha256@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-sha256/-/fast-sha256-1.3.0.tgz#7916ba2054eeb255982608cccd0f6660c79b7ae6" + integrity sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ== + +fastq@^1.6.0: + version "1.16.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.16.0.tgz#83b9a9375692db77a822df081edb6a9cf6839320" + integrity sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA== + dependencies: + reusify "^1.0.4" + +fetch-blob@^3.1.2, fetch-blob@^3.1.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9" + integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ== + dependencies: + node-domexception "^1.0.0" + web-streams-polyfill "^3.0.3" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + 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" + +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flatted@^3.2.9: + version "3.2.9" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" + integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== + +follow-redirects@^1.15.4: + version "1.15.5" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" + integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +formdata-polyfill@^4.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" + integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== + dependencies: + fetch-blob "^3.1.2" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + 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-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-stream@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^10.3.7: + version "10.3.10" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.5" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.2: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" + integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== + dependencies: + get-intrinsic "^1.2.2" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + +help-me@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/help-me/-/help-me-5.0.0.tgz#b1ebe63b967b74060027c2ac61f9be12d354a6f6" + integrity sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg== + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore-by-default@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== + +ignore@^5.2.0, ignore@^5.2.4, ignore@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" + integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +internal-slot@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930" + integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg== + dependencies: + get-intrinsic "^1.2.2" + hasown "^2.0.0" + side-channel "^1.0.4" + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.13.0, is-core-module@^2.13.1: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.3, is-typed-array@^1.1.9: + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== + dependencies: + which-typed-array "^1.1.11" + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isomorphic-ws@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz#e5529148912ecb9b451b46ed44d53dae1ce04bbf" + integrity sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw== + +jackspeak@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +joycon@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" + integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +jsonld@^8.1.1: + version "8.3.2" + resolved "https://registry.yarnpkg.com/jsonld/-/jsonld-8.3.2.tgz#7033f8994aed346b536e9046025f7f1fe9669934" + integrity sha512-MwBbq95szLwt8eVQ1Bcfwmgju/Y5P2GdtlHE2ncyfuYjIdEhluUVyj1eudacf1mOkWIoS9GpDBTECqhmq7EOaA== + dependencies: + "@digitalbazaar/http-client" "^3.4.1" + canonicalize "^1.0.1" + lru-cache "^6.0.0" + rdf-canonize "^3.4.0" + +jsonwebtoken@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz#65ff91f4abef1784697d40952bb1998c504caaf3" + integrity sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ== + dependencies: + jws "^3.2.2" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" + ms "^2.1.1" + semver "^7.5.4" + +jwa@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" + integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jws@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" + integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== + dependencies: + jwa "^1.4.1" + safe-buffer "^5.0.1" + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +ky-universal@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/ky-universal/-/ky-universal-0.11.0.tgz#f5edf857865aaaea416a1968222148ad7d9e4017" + integrity sha512-65KyweaWvk+uKKkCrfAf+xqN2/epw1IJDtlyCPxYffFCMR8u1sp2U65NtWpnozYfZxQ6IUzIlvUcw+hQ82U2Xw== + dependencies: + abort-controller "^3.0.0" + node-fetch "^3.2.10" + +ky@^0.33.3: + version "0.33.3" + resolved "https://registry.yarnpkg.com/ky/-/ky-0.33.3.tgz#bf1ad322a3f2c3428c13cfa4b3af95e6c4a2f543" + integrity sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +lint-staged@11.1.2: + version "11.1.2" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-11.1.2.tgz#4dd78782ae43ee6ebf2969cad9af67a46b33cd90" + integrity sha512-6lYpNoA9wGqkL6Hew/4n1H6lRqF3qCsujVT0Oq5Z4hiSAM7S6NksPJ3gnr7A7R52xCtiZMcEUNNQ6d6X5Bvh9w== + dependencies: + chalk "^4.1.1" + cli-truncate "^2.1.0" + commander "^7.2.0" + cosmiconfig "^7.0.0" + debug "^4.3.1" + enquirer "^2.3.6" + execa "^5.0.0" + listr2 "^3.8.2" + log-symbols "^4.1.0" + micromatch "^4.0.4" + normalize-path "^3.0.0" + please-upgrade-node "^3.2.0" + string-argv "0.3.1" + stringify-object "^3.3.0" + +listr2@^3.8.2: + version "3.14.0" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" + integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== + dependencies: + cli-truncate "^2.1.0" + colorette "^2.0.16" + log-update "^4.0.0" + p-map "^4.0.0" + rfdc "^1.3.0" + rxjs "^7.5.1" + through "^2.3.8" + wrap-ansi "^7.0.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== + +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== + +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== + +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== + dependencies: + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +"lru-cache@^9.1.1 || ^10.0.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.1.0.tgz#2098d41c2dc56500e6c88584aa656c84de7d0484" + integrity sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag== + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@9.0.3, minimatch@^9.0.1: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": + version "7.0.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== + +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +morgan@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" + integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== + dependencies: + basic-auth "~2.0.1" + debug "2.6.9" + depd "~2.0.0" + on-finished "~2.3.0" + on-headers "~1.0.2" + +mri@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" + integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-domexception@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" + integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== + +node-fetch@^3.2.10: + version "3.3.2" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.2.tgz#d1e889bacdf733b4ff3b2b243eb7a12866a0b78b" + integrity sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA== + dependencies: + data-uri-to-buffer "^4.0.0" + fetch-blob "^3.1.4" + formdata-polyfill "^4.0.10" + +node-gyp-build-optional-packages@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz#52b143b9dd77b7669073cbfe39e3f4118bfc603c" + integrity sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw== + dependencies: + detect-libc "^2.0.1" + +nodemon@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.0.3.tgz#244a62d1c690eece3f6165c6cdb0db03ebd80b76" + integrity sha512-7jH/NXbFPxVaMwmBCC2B9F/V6X1VkEdNgx3iu9jji8WxWcvhMWkmhNWhI5077zknOnZnBzba9hZP6bCPJLSReQ== + dependencies: + chokidar "^3.5.2" + debug "^4" + ignore-by-default "^1.0.1" + minimatch "^3.1.2" + pstree.remy "^1.1.8" + semver "^7.5.3" + simple-update-notifier "^2.0.0" + supports-color "^5.5.0" + touch "^3.1.0" + undefsafe "^2.0.5" + +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== + dependencies: + abbrev "1" + +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-all@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba" + integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== + dependencies: + ansi-styles "^3.2.1" + chalk "^2.4.1" + cross-spawn "^6.0.5" + memorystream "^0.3.1" + minimatch "^3.0.4" + pidtree "^0.3.0" + read-pkg "^3.0.0" + shell-quote "^1.6.1" + string.prototype.padend "^3.0.0" + +npm-run-path@^4.0.0, npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +object-assign@^4: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.1, object-inspect@^1.9.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.fromentries@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" + integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.groupby@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.1.tgz#d41d9f3c8d6c778d9cbac86b4ee9f5af103152ee" + integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + +object.values@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" + integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +obuf@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-exit-leak-free@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz#fed195c9ebddb7d9e4c3842f93f281ac8dadd3b8" + integrity sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +packet-reader@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-1.0.0.tgz#9238e5480dedabacfe1fe3f2771063f164157d74" + integrity sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-scurry@^1.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== + dependencies: + lru-cache "^9.1.1 || ^10.0.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pg-cloudflare@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz#e6d5833015b170e23ae819e8c5d7eaedb472ca98" + integrity sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q== + +pg-connection-string@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.2.tgz#713d82053de4e2bd166fab70cd4f26ad36aab475" + integrity sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA== + +pg-int8@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" + integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== + +pg-numeric@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pg-numeric/-/pg-numeric-1.0.2.tgz#816d9a44026086ae8ae74839acd6a09b0636aa3a" + integrity sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw== + +pg-pool@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.6.1.tgz#5a902eda79a8d7e3c928b77abf776b3cb7d351f7" + integrity sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og== + +pg-protocol@*, pg-protocol@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.6.0.tgz#4c91613c0315349363af2084608db843502f8833" + integrity sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q== + +pg-types@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3" + integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== + dependencies: + pg-int8 "1.0.1" + postgres-array "~2.0.0" + postgres-bytea "~1.0.0" + postgres-date "~1.0.4" + postgres-interval "^1.1.0" + +pg-types@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-4.0.2.tgz#399209a57c326f162461faa870145bb0f918b76d" + integrity sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng== + dependencies: + pg-int8 "1.0.1" + pg-numeric "1.0.2" + postgres-array "~3.0.1" + postgres-bytea "~3.0.0" + postgres-date "~2.1.0" + postgres-interval "^3.0.0" + postgres-range "^1.1.1" + +pg@^8.11.3: + version "8.11.3" + resolved "https://registry.yarnpkg.com/pg/-/pg-8.11.3.tgz#d7db6e3fe268fcedd65b8e4599cda0b8b4bf76cb" + integrity sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g== + dependencies: + buffer-writer "2.0.0" + packet-reader "1.0.0" + pg-connection-string "^2.6.2" + pg-pool "^3.6.1" + pg-protocol "^1.6.0" + pg-types "^2.1.0" + pgpass "1.x" + optionalDependencies: + pg-cloudflare "^1.1.1" + +pgpass@1.x: + version "1.0.5" + resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.5.tgz#9b873e4a564bb10fa7a7dbd55312728d422a223d" + integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug== + dependencies: + split2 "^4.1.0" + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +picomatch@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-3.0.1.tgz#817033161def55ec9638567a2f3bbc876b3e7516" + integrity sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag== + +pidtree@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" + integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== + +pino-abstract-transport@^1.0.0, pino-abstract-transport@v1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz#083d98f966262164504afb989bccd05f665937a8" + integrity sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA== + dependencies: + readable-stream "^4.0.0" + split2 "^4.0.0" + +pino-http@^8.5.1: + version "8.6.1" + resolved "https://registry.yarnpkg.com/pino-http/-/pino-http-8.6.1.tgz#46338caea759c9c86fc44f3226ed6976364ec269" + integrity sha512-J0hiJgUExtBXP2BjrK4VB305tHXS31sCmWJ9XJo2wPkLHa1NFPuW4V9wjG27PAc2fmBCigiNhQKpvrx+kntBPA== + dependencies: + get-caller-file "^2.0.5" + pino "^8.17.1" + pino-std-serializers "^6.2.2" + process-warning "^3.0.0" + +pino-pretty@^10.2.3: + version "10.3.1" + resolved "https://registry.yarnpkg.com/pino-pretty/-/pino-pretty-10.3.1.tgz#e3285a5265211ac6c7cd5988f9e65bf3371a0ca9" + integrity sha512-az8JbIYeN/1iLj2t0jR9DV48/LQ3RC6hZPpapKPkb84Q+yTidMCpgWxIT3N0flnBDilyBQ1luWNpOeJptjdp/g== + dependencies: + colorette "^2.0.7" + dateformat "^4.6.3" + fast-copy "^3.0.0" + fast-safe-stringify "^2.1.1" + help-me "^5.0.0" + joycon "^3.1.1" + minimist "^1.2.6" + on-exit-leak-free "^2.1.0" + pino-abstract-transport "^1.0.0" + pump "^3.0.0" + readable-stream "^4.0.0" + secure-json-parse "^2.4.0" + sonic-boom "^3.0.0" + strip-json-comments "^3.1.1" + +pino-std-serializers@^6.0.0, pino-std-serializers@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz#d9a9b5f2b9a402486a5fc4db0a737570a860aab3" + integrity sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA== + +pino@^8.16.2, pino@^8.17.1: + version "8.17.2" + resolved "https://registry.yarnpkg.com/pino/-/pino-8.17.2.tgz#0ed20175623a69d31664a1e8a5f85476272224be" + integrity sha512-LA6qKgeDMLr2ux2y/YiUt47EfgQ+S9LznBWOJdN3q1dx2sv0ziDLUBeVpyVv17TEcGCBuWf0zNtg3M5m1NhhWQ== + dependencies: + atomic-sleep "^1.0.0" + fast-redact "^3.1.1" + on-exit-leak-free "^2.1.0" + pino-abstract-transport v1.1.0 + pino-std-serializers "^6.0.0" + process-warning "^3.0.0" + quick-format-unescaped "^4.0.3" + real-require "^0.2.0" + safe-stable-stringify "^2.3.1" + sonic-boom "^3.7.0" + thread-stream "^2.0.0" + +please-upgrade-node@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" + integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg== + dependencies: + semver-compare "^1.0.0" + +postgres-array@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" + integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== + +postgres-array@~3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-3.0.2.tgz#68d6182cb0f7f152a7e60dc6a6889ed74b0a5f98" + integrity sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog== + +postgres-bytea@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" + integrity sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w== + +postgres-bytea@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-3.0.0.tgz#9048dc461ac7ba70a6a42d109221619ecd1cb089" + integrity sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw== + dependencies: + obuf "~1.1.2" + +postgres-date@~1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8" + integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== + +postgres-date@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-2.1.0.tgz#b85d3c1fb6fb3c6c8db1e9942a13a3bf625189d0" + integrity sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA== + +postgres-interval@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695" + integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ== + dependencies: + xtend "^4.0.0" + +postgres-interval@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-3.0.0.tgz#baf7a8b3ebab19b7f38f07566c7aab0962f0c86a" + integrity sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw== + +postgres-range@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/postgres-range/-/postgres-range-1.1.3.tgz#9ccd7b01ca2789eb3c2e0888b3184225fa859f76" + integrity sha512-VdlZoocy5lCP0c/t66xAfclglEapXPCIVhqqJRncYpvbCgImF0w67aPKfbqUMr72tO2k5q0TdTZwCLjPTI6C9g== + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^3.1.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.4.tgz#4723cadeac2ce7c9227de758e5ff9b14e075f283" + integrity sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ== + +pretty-quick@^3.1.3: + version "3.3.1" + resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-3.3.1.tgz#cfde97fec77a8d201a0e0c9c71d9990e12587ee2" + integrity sha512-3b36UXfYQ+IXXqex6mCca89jC8u0mYLqFAN5eTQKoXO6oCQYcIVYZEB/5AlBHI7JPYygReM2Vv6Vom/Gln7fBg== + dependencies: + execa "^4.1.0" + find-up "^4.1.0" + ignore "^5.3.0" + mri "^1.2.0" + picocolors "^1.0.0" + picomatch "^3.0.1" + tslib "^2.6.2" + +process-warning@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-3.0.0.tgz#96e5b88884187a1dce6f5c3166d611132058710b" + integrity sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +pstree.remy@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" + integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-format-unescaped@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" + integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rdf-canonize@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/rdf-canonize/-/rdf-canonize-3.4.0.tgz#87f88342b173cc371d812a07de350f0c1aa9f058" + integrity sha512-fUeWjrkOO0t1rg7B2fdyDTvngj+9RlUyL92vOdiB7c0FPguWVsniIMjEtHH+meLBO9rzkUlUzBVXgWrjI8P9LA== + dependencies: + setimmediate "^1.0.5" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +readable-stream@^4.0.0: + version "4.5.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.2.tgz#9e7fc4c45099baeed934bff6eb97ba6cf2729e09" + integrity sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g== + dependencies: + abort-controller "^3.0.0" + buffer "^6.0.3" + events "^3.3.0" + process "^0.11.10" + string_decoder "^1.3.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +real-require@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.2.0.tgz#209632dea1810be2ae063a6ac084fee7e33fba78" + integrity sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg== + +reflect-metadata@^0.1.13: + version "0.1.14" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.14.tgz#24cf721fe60677146bb77eeb0e1f9dece3d65859" + integrity sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A== + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +regexp.prototype.flags@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" + integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + set-function-name "^2.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^1.0.0, resolve@^1.10.0, resolve@^1.22.4: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rfdc@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f" + integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg== + +rimraf@^2.6.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rimraf@^5.0.1, rimraf@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.5.tgz#9be65d2d6e683447d2e9013da2bf451139a61ccf" + integrity sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A== + dependencies: + glob "^10.3.7" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^7.5.1: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +safe-array-concat@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.0.tgz#8d0cae9cb806d6d1c06e08ab13d847293ebe0692" + integrity sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg== + dependencies: + call-bind "^1.0.5" + get-intrinsic "^1.2.2" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-buffer@5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex-test@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.2.tgz#3ba32bdb3ea35f940ee87e5087c60ee786c3f6c5" + integrity sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ== + dependencies: + call-bind "^1.0.5" + get-intrinsic "^1.2.2" + is-regex "^1.1.4" + +safe-stable-stringify@^2.3.1: + version "2.4.3" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" + integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +schema-dts@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/schema-dts/-/schema-dts-1.1.2.tgz#82ccf71b5dcb80065a1cc5941888507a4ce1e44b" + integrity sha512-MpNwH0dZJHinVxk9bT8XUdjKTxMYrA5bLtrrGmFA6PTLwlOKnhi67XoRd6/ty+Djt6ZC0slR57qFhZDNMI6DhQ== + +secure-json-parse@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/secure-json-parse/-/secure-json-parse-2.7.0.tgz#5a5f9cd6ae47df23dba3151edd06855d47e09862" + integrity sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw== + +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== + +"semver@2 || 3 || 4 || 5", semver@^5.5.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.5.3, semver@^7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + 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" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +set-function-length@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.0.tgz#2f81dc6c16c7059bda5ab7c82c11f03a515ed8e1" + integrity sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w== + 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-function-name@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" + integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== + dependencies: + define-data-property "^1.0.1" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.0" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.6.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.2, signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +simple-update-notifier@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" + integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== + dependencies: + semver "^7.5.3" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +sonic-boom@^3.0.0, sonic-boom@^3.7.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-3.8.0.tgz#e442c5c23165df897d77c3c14ef3ca40dec66a66" + integrity sha512-ybz6OYOUjoQQCQ/i4LU8kaToD8ACtYP+Cj5qd2AO36bwbdewxWJ3ArmJ2cr6AvxlL2o0PqnCcPGUgkILbfkaCA== + dependencies: + atomic-sleep "^1.0.0" + +source-map-support@^0.5.12: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spdx-correct@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.16" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz#a14f64e0954f6e25cc6587bd4f392522db0d998f" + integrity sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw== + +split2@^4.0.0, split2@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +string-argv@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" + integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== + +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0: + name string-width-cjs + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string.prototype.padend@^3.0.0: + version "3.1.5" + resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.5.tgz#311ef3a4e3c557dd999cdf88fbdde223f2ac0f95" + integrity sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string.prototype.trim@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" + integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string.prototype.trimend@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" + integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string.prototype.trimstart@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" + integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string_decoder@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + name strip-ansi-cjs + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^5.3.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +synckit@^0.8.6: + version "0.8.8" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.8.tgz#fe7fe446518e3d3d49f5e429f443cf08b6edfcd7" + integrity sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ== + dependencies: + "@pkgr/core" "^0.1.0" + tslib "^2.6.2" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +thread-stream@^2.0.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-2.4.1.tgz#6d588b14f0546e59d3f306614f044bc01ce43351" + integrity sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg== + dependencies: + real-require "^0.2.0" + +through@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +tiny-typed-emitter@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz#b3b027fdd389ff81a152c8e847ee2f5be9fad7b5" + integrity sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +touch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" + integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== + dependencies: + nopt "~1.0.10" + +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +ts-api-utils@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" + integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== + +ts-node-dev@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ts-node-dev/-/ts-node-dev-2.0.0.tgz#bdd53e17ab3b5d822ef519928dc6b4a7e0f13065" + integrity sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w== + dependencies: + chokidar "^3.5.1" + dynamic-dedupe "^0.3.0" + minimist "^1.2.6" + mkdirp "^1.0.4" + resolve "^1.0.0" + rimraf "^2.6.1" + source-map-support "^0.5.12" + tree-kill "^1.2.2" + ts-node "^10.4.0" + tsconfig "^7.0.0" + +ts-node@10.9.1: + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +ts-node@^10.4.0, ts-node@^10.9.1: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tsconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7" + integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw== + dependencies: + "@types/strip-bom" "^3.0.0" + "@types/strip-json-comments" "0.0.30" + strip-bom "^3.0.0" + strip-json-comments "^2.0.0" + +tslib@^2.1.0, tslib@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +typescript@5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" + integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== + +typescript@^4.9.4: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +undefsafe@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" + integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +undici@^5.21.2: + version "5.28.2" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.2.tgz#fea200eac65fc7ecaff80a023d1a0543423b4c91" + integrity sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w== + dependencies: + "@fastify/busboy" "^2.0.0" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util@^0.12.5: + version "0.12.5" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^9.0.0, uuid@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +web-streams-polyfill@^3.0.3: + version "3.3.2" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.2.tgz#32e26522e05128203a7de59519be3c648004343b" + integrity sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ== + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-typed-array@^1.1.11, which-typed-array@^1.1.13, which-typed-array@^1.1.2: + version "1.1.13" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" + integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.4" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + name wrap-ansi-cjs + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@^8.14.2, ws@^8.7.0: + version "8.16.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" + integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== + +xstate@^4.37.0: + version "4.38.3" + resolved "https://registry.yarnpkg.com/xstate/-/xstate-4.38.3.tgz#4e15e7ad3aa0ca1eea2010548a5379966d8f1075" + integrity sha512-SH7nAaaPQx57dx6qvfcIgqKRXIh4L0A1iYEqim4s1u7c9VoCgzZc+63FY90AKU4ZzOC2cfJzTnpO4zK7fCUzzw== + +xtend@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zod@^3.20.2: + version "3.22.4" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" + integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg== diff --git a/desci-server/.eslintrc.js b/desci-server/.eslintrc.cjs similarity index 100% rename from desci-server/.eslintrc.js rename to desci-server/.eslintrc.cjs diff --git a/desci-server/.mocharc.json b/desci-server/.mocharc.json new file mode 100644 index 000000000..72a03424c --- /dev/null +++ b/desci-server/.mocharc.json @@ -0,0 +1,3 @@ +{ + "node-option": ["experimental-specifier-resolution=node", "loader=ts-node/esm"] +} diff --git a/desci-server/ORCID.md b/desci-server/ORCID.md index b6fd16356..55fa64efd 100755 --- a/desci-server/ORCID.md +++ b/desci-server/ORCID.md @@ -1,16 +1,15 @@ -ORCID ---------- +## ORCID https://sandbox.orcid.org/oauth/authorize?client_id=APP-QARWQ92Z2SOZPMA0&response_type=code&scope=/authenticate&redirect_uri=http://localhost:5420 -Client ID: +Client ID: APP-QARWQ92Z2SOZPMA0 -Client secret: +Client secret: ec77bb26-921f-4276-a205-056746677203 Redirect URIs: https://api.sandbox.orcid.org https://developers.google.com/oauthplayground https://localhost -http://localhost:5420 \ No newline at end of file +http://localhost:5420 diff --git a/desci-server/data/fields.json b/desci-server/data/fields.json index 2c9704864..7ff0cd556 100644 --- a/desci-server/data/fields.json +++ b/desci-server/data/fields.json @@ -1 +1,437 @@ -["Food Security","Hydrogeology","Linguistics","Cartography","Forest Management","Plant Nutrition","Civil Engineering","Farming Systems Research","Plant Cultivation","Agriculture","Agronomy","Econometrics","Economics","Geochemistry","Animal Physiology","Plant Physiology","Ergonomics","Animal Nutrition","Agricultural Law","Economic Policy","Fisheries Science","Geodesy","Geophysics","Logistics Engineering","Environmental Science","Horticulture","Hydraulic Engineering","Hydrology","Urban Planning","Animal Breeding","Life Science","Limnology","Mechanical Engineering","Mineralogy","Acoustics","Plant Genetics","Aquaculture","Photogrammetry","Physical Geography","Plant Breeding","Plant Ecology","Public Finance","Remote Sensing","Rural and Agricultural Sociology","Atmospheric Science","Social Anthropology","Social Policy","Soil Science","Water Management","Animal Husbandry","Agricultural Economics","Agricultural Engineering","Knowledge and Information Systems","Agroecology","Phylogeny","Functional Genomics","Ontology and Terminology","Phylogenomics","Pharmacogenomics","Medicinal Chemistry","Informatics","Taxonomy","Botany","Virology","Comparative Genomics","Cheminformatics","Systems Biology","Molecular biology","Biodiversity","Quantitative Genetics","Population Genetics","Embryology","Anatomy","Data Management","Metabolomics","Epigenomics","Metagenomics","Data Security","Biochemistry","Phylogenetics","Biotechnology","Phenomics","Evolutionary Biology","Physiology","Neurobiology","Computational Biology","Transcriptomics","Mathematics","Computer Science","Physics","Molecular Genetics","Drug Discovery","Translational Medicine","Biomaterials","Chemical Biology","Analytical Chemistry","Synthetic Chemistry","Drug Development","Biotherapeutics","Marine Biology","Molecular Medicine","Nutritional Science","Omics","Systems Medicine","Veterinary Medicine","Geriatric Medicine","Pain Medicine","Anaesthesiology","Critical Care Medicine","Dentistry","Otolaryngology","Gender Medicine","Traumatology","Medical Toxicology","Pediatrics","Traditional Medicine","Applied Mathematics","Pure Mathematics","Data Governance","Freshwater Science","Human Genetics","Tropical Medicine","Medical Biotechnology","Personalized Medicine","Microbial Ecology","Metatranscriptomics","Respiratory Medicine","Vascular Surgery","Proteogenomics","Data Quality","Preclinical Studies","Biomedical Science","Clinical Studies","Health Services Research","Psychotherapy","Glycomics","Anthropology","Architecture","Artificial Intelligence","Biology","Biophysics","Chemical Engineering","Chemistry","Clinical Chemistry","Organic Chemistry","Physical Chemistry","Medical Informatics","Culture","Demographics","Dermatology","Developmental Biology","Ecology","Electrophysiology","Engineering Science","Entomology","Epidemiology","Forensic Medicine","Gastroenterology","Genetics","Geography","Gynecology","Hematology","Immunogenetics","Microbiology","Nephrology","Neurology","Neurophysiology","Nuclear Medicine","Obstetrics","Occupational Medicine","Ophthalmology","Pharmacology","Psychiatry","Psychology","Clinical Psychology","Educational Psychology","Psychosomatic Medicine","Public Health","Radiobiology","Radiology","Rheumatology","Social Science","Software Engineering","Statistics","Surgery","Oral Surgery","Thermodynamics","Toxicology","Urology","Zoology","Digital Image Processing","Policy","Oncology","Microbial Genetics","Bioinformatics","Cell Biology","Immunology","Bioengineering","Developmental Neurobiology","Molecular Dynamics","Structural Biology","Pathology","Human Biology","Computational Chemistry","Nanotechnology","Animal Genetics","Enzymology","Clinical Immunology","Database Management","Developmental Psychology","Microbial Physiology","Medical Microbiology","Polymer Chemistry","Health Science","Electrical Engineering","Mechanics","Proteomics","Structural Genomics","Toxicogenomics","Synthesis Chemistry","Drug Metabolism","Philosophy","History","Genomics","Cardiology","Regenerative Medicine","Neuroscience","Data Visualization","Cognitive Neuroscience","Cultural Anthropology","Archaeology","Art","Automation","Criminal Law","Criminology","Geology","Humanities","Jurisprudence","Medicine","Metallurgy","Oceanography","Musculoskeletal Medicine","Paleontology","Parasitology","Pharmacy","Natural Science","Population Dynamics","Primary Health Care","Medical Psychology","Social Medicine","Global Health","Nonlinear Dynamics","Ecosystem Science","Radiation Oncology","Natural History","Theology","Ancient History","Medieval History","Infectious Disease Medicine","Meteorology","Earth Science","Data Mining","Drug Repositioning","Synthetic Biology","Reproductive Health","Transfusion Medicine","Plant Anatomy","Humanities and Social Science","Ancient Cultures","Prehistory","Classical Philology","Egyptology","Early Modern History","Modern History","History of Science","Fine Arts","Art History","Musicology","Media Studies","Applied Linguistics","Historical Linguistics","Literary Studies","Medieval German Literature","German Literature","European Literature","Comparative Literature","Asian Studies","African Studies","Islamic Studies","Religious Studies","Protestant Theology","Roman Catholic Theology","History of Philosophy","Theoretical Philosophy","Practical Philosophy","Social and Behavioural Science","Education Science","Research on Teaching, Learning and Training","Professional Socialization","Biological Psychology","Social Psychology","Differential Psychology","Sociological Theory","Empirical Social Research","Communication Science","Political Science","Economic Theory","Business Administration","Economic and Social History","Philosophy of Law","Private Law","Public Law","Inter-organismic Interactions of Plants","Phytochemistry","Plant Cell Biology","Behavioural Biology","Molecular Microbiology","Applied Microbiology","Molecular Infection Biology","Medical Biometry","Pathobiochemistry","Cardiothoracic Surgery","Medical Physics","Molecular Neuroscience","Cellular Neuroscience","Systemic Neuroscience","Comparative Neurobiology","Molecular Neurology","Biological Psychiatry","Phytomedicine","Clinical Veterinary Medicine","Molecular Chemistry","Inorganic Molecular Chemistry","Organic Molecular Chemistry","Solid-State Chemistry","Molecular Physical Chemistry","Theoretical Chemistry","Biomimetic Chemistry","Food Chemistry","Polymer Research","Polymer Physics","Condensed Matter Physics","Experimental Condensed Matter Physics","Theoretical Condensed Matter Physics","Atomic, Molecular, Optical and Plasma Physics","Particles, Nuclei and Fields","Soft Matter Physics","Astrophysics and Astronomy","Geoinformatics","Human Geography","Water Research","Industrial Engineering","Production Technology","Metal-Cutting Manufacturing Engineering","Primary Shaping Technology","Plastics Engineering","Thermal Engineering","Process Engineering","Technical Chemistry","Mechanical Process Engineering","Biological Process Engineering","Thermal Technology","Energy Engineering","Fluid Mechanics","Materials Engineering","Thermomechanical Processing","Sintering","Composite Materials","Mechanical Behaviour of Construction Materials","Coating and Surface Technology","Materials Science","Functional Materials Research","Microstructural Mechanical Properties of Materials","Materials Structuring and Functionalisation","Systems Engineering","Robotics","Measurement Systems","Microsystems","Human-Machine Systems Engineering","Component Engineering","Telecommunication Engineering","Power Engineering","Theoretical Computer Science","Computer Architecture","Construction Engineering","Construction History","Transportation Planning","Building Engineering Physics","Structural Engineering","Applied Mechanics","Geotechnics","Maritime Engineering","Aerospace Engineering","Building Informatics","Landscape Planning","Sustainable Building Technology","Building Design","Materials Informatics","Neurogenetics","Computational Neuroscience","Mathematical Psychology","Industrial and Organisational Psychology","Surface Science","Area Studies","American Studies","Oceania Studies","Arabian Studies","Jewish Studies","Diabetology","Theatre Studies","Data Integration","Food Process Engineering","Statistical Physics","Angiology","Legal History","American Literature","Cultural Studies","Ancient Near Eastern Studies","Orthopedic Surgery","Community Care","Epigenetics","Medicines Research and Development","Safety Science","Endocrinology","Medical Virology","Subject Agnostic","Scientific Instrument Design","Metataxonomics","Metaproteomics","Selenography","Cosmology","Electromagnetism","Gemology","Bathymetry","Hydrography"] \ No newline at end of file +[ + "Food Security", + "Hydrogeology", + "Linguistics", + "Cartography", + "Forest Management", + "Plant Nutrition", + "Civil Engineering", + "Farming Systems Research", + "Plant Cultivation", + "Agriculture", + "Agronomy", + "Econometrics", + "Economics", + "Geochemistry", + "Animal Physiology", + "Plant Physiology", + "Ergonomics", + "Animal Nutrition", + "Agricultural Law", + "Economic Policy", + "Fisheries Science", + "Geodesy", + "Geophysics", + "Logistics Engineering", + "Environmental Science", + "Horticulture", + "Hydraulic Engineering", + "Hydrology", + "Urban Planning", + "Animal Breeding", + "Life Science", + "Limnology", + "Mechanical Engineering", + "Mineralogy", + "Acoustics", + "Plant Genetics", + "Aquaculture", + "Photogrammetry", + "Physical Geography", + "Plant Breeding", + "Plant Ecology", + "Public Finance", + "Remote Sensing", + "Rural and Agricultural Sociology", + "Atmospheric Science", + "Social Anthropology", + "Social Policy", + "Soil Science", + "Water Management", + "Animal Husbandry", + "Agricultural Economics", + "Agricultural Engineering", + "Knowledge and Information Systems", + "Agroecology", + "Phylogeny", + "Functional Genomics", + "Ontology and Terminology", + "Phylogenomics", + "Pharmacogenomics", + "Medicinal Chemistry", + "Informatics", + "Taxonomy", + "Botany", + "Virology", + "Comparative Genomics", + "Cheminformatics", + "Systems Biology", + "Molecular biology", + "Biodiversity", + "Quantitative Genetics", + "Population Genetics", + "Embryology", + "Anatomy", + "Data Management", + "Metabolomics", + "Epigenomics", + "Metagenomics", + "Data Security", + "Biochemistry", + "Phylogenetics", + "Biotechnology", + "Phenomics", + "Evolutionary Biology", + "Physiology", + "Neurobiology", + "Computational Biology", + "Transcriptomics", + "Mathematics", + "Computer Science", + "Physics", + "Molecular Genetics", + "Drug Discovery", + "Translational Medicine", + "Biomaterials", + "Chemical Biology", + "Analytical Chemistry", + "Synthetic Chemistry", + "Drug Development", + "Biotherapeutics", + "Marine Biology", + "Molecular Medicine", + "Nutritional Science", + "Omics", + "Systems Medicine", + "Veterinary Medicine", + "Geriatric Medicine", + "Pain Medicine", + "Anaesthesiology", + "Critical Care Medicine", + "Dentistry", + "Otolaryngology", + "Gender Medicine", + "Traumatology", + "Medical Toxicology", + "Pediatrics", + "Traditional Medicine", + "Applied Mathematics", + "Pure Mathematics", + "Data Governance", + "Freshwater Science", + "Human Genetics", + "Tropical Medicine", + "Medical Biotechnology", + "Personalized Medicine", + "Microbial Ecology", + "Metatranscriptomics", + "Respiratory Medicine", + "Vascular Surgery", + "Proteogenomics", + "Data Quality", + "Preclinical Studies", + "Biomedical Science", + "Clinical Studies", + "Health Services Research", + "Psychotherapy", + "Glycomics", + "Anthropology", + "Architecture", + "Artificial Intelligence", + "Biology", + "Biophysics", + "Chemical Engineering", + "Chemistry", + "Clinical Chemistry", + "Organic Chemistry", + "Physical Chemistry", + "Medical Informatics", + "Culture", + "Demographics", + "Dermatology", + "Developmental Biology", + "Ecology", + "Electrophysiology", + "Engineering Science", + "Entomology", + "Epidemiology", + "Forensic Medicine", + "Gastroenterology", + "Genetics", + "Geography", + "Gynecology", + "Hematology", + "Immunogenetics", + "Microbiology", + "Nephrology", + "Neurology", + "Neurophysiology", + "Nuclear Medicine", + "Obstetrics", + "Occupational Medicine", + "Ophthalmology", + "Pharmacology", + "Psychiatry", + "Psychology", + "Clinical Psychology", + "Educational Psychology", + "Psychosomatic Medicine", + "Public Health", + "Radiobiology", + "Radiology", + "Rheumatology", + "Social Science", + "Software Engineering", + "Statistics", + "Surgery", + "Oral Surgery", + "Thermodynamics", + "Toxicology", + "Urology", + "Zoology", + "Digital Image Processing", + "Policy", + "Oncology", + "Microbial Genetics", + "Bioinformatics", + "Cell Biology", + "Immunology", + "Bioengineering", + "Developmental Neurobiology", + "Molecular Dynamics", + "Structural Biology", + "Pathology", + "Human Biology", + "Computational Chemistry", + "Nanotechnology", + "Animal Genetics", + "Enzymology", + "Clinical Immunology", + "Database Management", + "Developmental Psychology", + "Microbial Physiology", + "Medical Microbiology", + "Polymer Chemistry", + "Health Science", + "Electrical Engineering", + "Mechanics", + "Proteomics", + "Structural Genomics", + "Toxicogenomics", + "Synthesis Chemistry", + "Drug Metabolism", + "Philosophy", + "History", + "Genomics", + "Cardiology", + "Regenerative Medicine", + "Neuroscience", + "Data Visualization", + "Cognitive Neuroscience", + "Cultural Anthropology", + "Archaeology", + "Art", + "Automation", + "Criminal Law", + "Criminology", + "Geology", + "Humanities", + "Jurisprudence", + "Medicine", + "Metallurgy", + "Oceanography", + "Musculoskeletal Medicine", + "Paleontology", + "Parasitology", + "Pharmacy", + "Natural Science", + "Population Dynamics", + "Primary Health Care", + "Medical Psychology", + "Social Medicine", + "Global Health", + "Nonlinear Dynamics", + "Ecosystem Science", + "Radiation Oncology", + "Natural History", + "Theology", + "Ancient History", + "Medieval History", + "Infectious Disease Medicine", + "Meteorology", + "Earth Science", + "Data Mining", + "Drug Repositioning", + "Synthetic Biology", + "Reproductive Health", + "Transfusion Medicine", + "Plant Anatomy", + "Humanities and Social Science", + "Ancient Cultures", + "Prehistory", + "Classical Philology", + "Egyptology", + "Early Modern History", + "Modern History", + "History of Science", + "Fine Arts", + "Art History", + "Musicology", + "Media Studies", + "Applied Linguistics", + "Historical Linguistics", + "Literary Studies", + "Medieval German Literature", + "German Literature", + "European Literature", + "Comparative Literature", + "Asian Studies", + "African Studies", + "Islamic Studies", + "Religious Studies", + "Protestant Theology", + "Roman Catholic Theology", + "History of Philosophy", + "Theoretical Philosophy", + "Practical Philosophy", + "Social and Behavioural Science", + "Education Science", + "Research on Teaching, Learning and Training", + "Professional Socialization", + "Biological Psychology", + "Social Psychology", + "Differential Psychology", + "Sociological Theory", + "Empirical Social Research", + "Communication Science", + "Political Science", + "Economic Theory", + "Business Administration", + "Economic and Social History", + "Philosophy of Law", + "Private Law", + "Public Law", + "Inter-organismic Interactions of Plants", + "Phytochemistry", + "Plant Cell Biology", + "Behavioural Biology", + "Molecular Microbiology", + "Applied Microbiology", + "Molecular Infection Biology", + "Medical Biometry", + "Pathobiochemistry", + "Cardiothoracic Surgery", + "Medical Physics", + "Molecular Neuroscience", + "Cellular Neuroscience", + "Systemic Neuroscience", + "Comparative Neurobiology", + "Molecular Neurology", + "Biological Psychiatry", + "Phytomedicine", + "Clinical Veterinary Medicine", + "Molecular Chemistry", + "Inorganic Molecular Chemistry", + "Organic Molecular Chemistry", + "Solid-State Chemistry", + "Molecular Physical Chemistry", + "Theoretical Chemistry", + "Biomimetic Chemistry", + "Food Chemistry", + "Polymer Research", + "Polymer Physics", + "Condensed Matter Physics", + "Experimental Condensed Matter Physics", + "Theoretical Condensed Matter Physics", + "Atomic, Molecular, Optical and Plasma Physics", + "Particles, Nuclei and Fields", + "Soft Matter Physics", + "Astrophysics and Astronomy", + "Geoinformatics", + "Human Geography", + "Water Research", + "Industrial Engineering", + "Production Technology", + "Metal-Cutting Manufacturing Engineering", + "Primary Shaping Technology", + "Plastics Engineering", + "Thermal Engineering", + "Process Engineering", + "Technical Chemistry", + "Mechanical Process Engineering", + "Biological Process Engineering", + "Thermal Technology", + "Energy Engineering", + "Fluid Mechanics", + "Materials Engineering", + "Thermomechanical Processing", + "Sintering", + "Composite Materials", + "Mechanical Behaviour of Construction Materials", + "Coating and Surface Technology", + "Materials Science", + "Functional Materials Research", + "Microstructural Mechanical Properties of Materials", + "Materials Structuring and Functionalisation", + "Systems Engineering", + "Robotics", + "Measurement Systems", + "Microsystems", + "Human-Machine Systems Engineering", + "Component Engineering", + "Telecommunication Engineering", + "Power Engineering", + "Theoretical Computer Science", + "Computer Architecture", + "Construction Engineering", + "Construction History", + "Transportation Planning", + "Building Engineering Physics", + "Structural Engineering", + "Applied Mechanics", + "Geotechnics", + "Maritime Engineering", + "Aerospace Engineering", + "Building Informatics", + "Landscape Planning", + "Sustainable Building Technology", + "Building Design", + "Materials Informatics", + "Neurogenetics", + "Computational Neuroscience", + "Mathematical Psychology", + "Industrial and Organisational Psychology", + "Surface Science", + "Area Studies", + "American Studies", + "Oceania Studies", + "Arabian Studies", + "Jewish Studies", + "Diabetology", + "Theatre Studies", + "Data Integration", + "Food Process Engineering", + "Statistical Physics", + "Angiology", + "Legal History", + "American Literature", + "Cultural Studies", + "Ancient Near Eastern Studies", + "Orthopedic Surgery", + "Community Care", + "Epigenetics", + "Medicines Research and Development", + "Safety Science", + "Endocrinology", + "Medical Virology", + "Subject Agnostic", + "Scientific Instrument Design", + "Metataxonomics", + "Metaproteomics", + "Selenography", + "Cosmology", + "Electromagnetism", + "Gemology", + "Bathymetry", + "Hydrography" +] diff --git a/desci-server/docs/desci-server-api.postman_collection.json b/desci-server/docs/desci-server-api.postman_collection.json index d5a3578d8..3b77b0baa 100755 --- a/desci-server/docs/desci-server-api.postman_collection.json +++ b/desci-server/docs/desci-server-api.postman_collection.json @@ -1,675 +1,589 @@ { - "info": { - "_postman_id": "3ab8fa21-efe0-47f5-ba4d-dfd5d6cc065a", - "name": "desci-server API", - "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" - }, - "item": [ - { - "name": "/auth", - "item": [ - { - "name": "/login", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "var jsonData = JSON.parse(responseBody);", - "", - "postman.setEnvironmentVariable(\"token\", jsonData.data);" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "name": "Content-Type", - "type": "text", - "value": "application/x-www-form-urlencoded" - }, - { - "key": "Accept-Language", - "value": "{{language}}", - "type": "text" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "email", - "value": "admin1@admin.com", - "type": "text" - }, - { - "key": "password", - "value": "admin123", - "type": "text" - } - ] - }, - "url": { - "raw": "{{baseUrl}}/v1/auth/login", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "v1", - "auth", - "login" - ] - } - }, - "response": [] - }, - { - "name": "/register", - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "name": "Content-Type", - "value": "application/json", - "type": "text" - }, - { - "key": "Accept-Language", - "value": "{{language}}", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\n \"email\": \"sinaiman@gmail.com\"\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{baseUrl}}/v1/auth/register", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "v1", - "auth", - "register" - ] - } - }, - "response": [] - }, - { - "name": "/profile", - "protocolProfileBehavior": { - "disableBodyPruning": true - }, - "request": { - "method": "GET", - "header": [ - { - "key": "Content-Type", - "name": "Content-Type", - "type": "text", - "value": "application/x-www-form-urlencoded" - }, - { - "key": "Authorization", - "value": "{{token}}", - "type": "text" - }, - { - "key": "Accept-Language", - "value": "{{language}}", - "type": "text" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "password", - "value": "admin", - "type": "text" - }, - { - "key": "passwordNew", - "value": "admin", - "type": "text" - }, - { - "key": "passwordConfirm", - "value": "admin", - "type": "text" - } - ] - }, - "url": { - "raw": "{{baseUrl}}/v1/auth/profile", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "v1", - "auth", - "profile" - ] - } - }, - "response": [] - }, - { - "name": "/change-password Copy", - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "name": "Content-Type", - "type": "text", - "value": "application/x-www-form-urlencoded" - }, - { - "key": "Authorization", - "value": "{{token}}", - "type": "text" - }, - { - "key": "Accept-Language", - "value": "{{language}}", - "type": "text" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "password", - "value": "admin", - "type": "text" - }, - { - "key": "passwordNew", - "value": "admin", - "type": "text" - }, - { - "key": "passwordConfirm", - "value": "admin", - "type": "text" - } - ] - }, - "url": { - "raw": "{{baseUrl}}/change-password", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "change-password" - ] - } - }, - "response": [] - }, - { - "name": "ORCID Token", - "protocolProfileBehavior": { - "disableBodyPruning": true - }, - "request": { - "method": "GET", - "header": [], - "body": { - "mode": "raw", - "raw": "", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "https://sandbox.orcid.org/oauth/token", - "protocol": "https", - "host": [ - "sandbox", - "orcid", - "org" - ], - "path": [ - "oauth", - "token" - ] - } - }, - "response": [] - }, - { - "name": "ORCID Authenticated Request", - "request": { - "method": "GET", - "header": [], - "url": null - }, - "response": [] - } - ] - }, - { - "name": "/misc", - "item": [ - { - "name": "/change-language", - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "name": "Content-Type", - "type": "text", - "value": "application/x-www-form-urlencoded" - }, - { - "key": "Accept-Language", - "type": "text", - "value": "sl-SI" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "language", - "value": "sl-SI", - "type": "text" - } - ] - }, - "url": { - "raw": "{{baseUrl}}/misc/change-language", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "misc", - "change-language" - ] - } - }, - "response": [] - } - ] - }, - { - "name": "/users", - "item": [ - { - "name": "/", - "protocolProfileBehavior": { - "disableBodyPruning": true - }, - "request": { - "method": "GET", - "header": [ - { - "key": "Content-Type", - "name": "Content-Type", - "type": "text", - "value": "application/x-www-form-urlencoded" - }, - { - "key": "Accept-Language", - "type": "text", - "value": "sl-SI" - }, - { - "key": "Authorization", - "value": "{{token}}", - "type": "text" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [] - }, - "url": { - "raw": "{{baseUrl}}/v1/users", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "v1", - "users" - ] - } - }, - "response": [] - }, - { - "name": "/:id", - "protocolProfileBehavior": { - "disableBodyPruning": true - }, - "request": { - "method": "GET", - "header": [ - { - "key": "Content-Type", - "name": "Content-Type", - "type": "text", - "value": "application/x-www-form-urlencoded" - }, - { - "key": "Accept-Language", - "type": "text", - "value": "sl-SI" - }, - { - "key": "Authorization", - "type": "text", - "value": "{{token}}" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [] - }, - "url": { - "raw": "{{baseUrl}}/v1/users/3", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "v1", - "users", - "3" - ] - } - }, - "response": [] - }, - { - "name": "/:id", - "request": { - "method": "DELETE", - "header": [ - { - "key": "Content-Type", - "name": "Content-Type", - "type": "text", - "value": "application/x-www-form-urlencoded" - }, - { - "key": "Accept-Language", - "type": "text", - "value": "sl-SI" - }, - { - "key": "Authorization", - "type": "text", - "value": "{{token}}" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [] - }, - "url": { - "raw": "{{baseUrl}}/v1/users/9", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "v1", - "users", - "9" - ] - } - }, - "response": [] - }, - { - "name": "/:id", - "request": { - "method": "PATCH", - "header": [ - { - "key": "Content-Type", - "name": "Content-Type", - "type": "text", - "value": "application/x-www-form-urlencoded" - }, - { - "key": "Accept-Language", - "type": "text", - "value": "sl-SI" - }, - { - "key": "Authorization", - "type": "text", - "value": "{{token}}" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "username", - "value": "Tyrion1", - "type": "text" - }, - { - "key": "name", - "value": "test name", - "type": "text" - } - ] - }, - "url": { - "raw": "{{baseUrl}}/v1/users/5", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "v1", - "users", - "5" - ] - } - }, - "response": [] - } - ] - }, - { - "name": "/discoveries", - "item": [ - { - "name": "Mint", - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\n \"title\": \"A Paper\",\n \"links\": {\n \"pdf\": [\"https://www.pnas.org/content/pnas/117/18/9782.full.pdf\", \"https://www.researchgate.net/profile/Lynne-Webb/publication/320925277_Online_Research_Methods_Qualitative/links/5a593e2545851545026fd682/Online-Research-Methods-Qualitative.pdf\"],\n \"code\": [\"https://github.com/skogard/nebulus\"]\n }\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{baseUrl}}/v1/discoveries/mint", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "v1", - "discoveries", - "mint" - ] - } - }, - "response": [] - }, - { - "name": "DOI", - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\n \"doi\": \"https://doi.org/10.7554/eLife.00778\"\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{baseUrl}}/v1/discoveries/doi", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "v1", - "discoveries", - "doi" - ] - } - }, - "response": [] - }, - { - "name": "Mint Permaweb", - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\n \"title\": \"A Paper\",\n \"links\": {\n \"pdf\": [\"https://www.pnas.org/content/pnas/117/18/9782.full.pdf\", \"https://www.researchgate.net/profile/Lynne-Webb/publication/320925277_Online_Research_Methods_Qualitative/links/5a593e2545851545026fd682/Online-Research-Methods-Qualitative.pdf\"],\n \"code\": [\"https://github.com/skogard/nebulus\"]\n }\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{baseUrl}}/v1/discoveries/mintPermanent", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "v1", - "discoveries", - "mintPermanent" - ] - } - }, - "response": [] - }, - { - "name": "List", - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{baseUrl}}/v1/discoveries", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "v1", - "discoveries" - ] - } - }, - "response": [] - }, - { - "name": "PDF Proxy", - "request": { - "method": "GET", - "header": [], - "url": null - }, - "response": [] - } - ] - }, - { - "name": "/ipfs", - "item": [ - { - "name": "read", - "request": { - "method": "GET", - "header": [], - "url": null - }, - "response": [] - }, - { - "name": "test", - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{baseUrl}}/v1/ipfs/test", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "v1", - "ipfs", - "test" - ] - } - }, - "response": [] - } - ] - }, - { - "name": "/arcs", - "item": [ - { - "name": "List", - "request": { - "method": "GET", - "header": [], - "url": null - }, - "response": [] - }, - { - "name": "Get", - "request": { - "method": "GET", - "header": [], - "url": null - }, - "response": [] - } - ] - }, - { - "name": "Root", - "request": { - "method": "GET", - "header": [], - "url": null - }, - "response": [] - } - ] -} \ No newline at end of file + "info": { + "_postman_id": "3ab8fa21-efe0-47f5-ba4d-dfd5d6cc065a", + "name": "desci-server API", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" + }, + "item": [ + { + "name": "/auth", + "item": [ + { + "name": "/login", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var jsonData = JSON.parse(responseBody);", + "", + "postman.setEnvironmentVariable(\"token\", jsonData.data);" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "type": "text", + "value": "application/x-www-form-urlencoded" + }, + { + "key": "Accept-Language", + "value": "{{language}}", + "type": "text" + } + ], + "body": { + "mode": "urlencoded", + "urlencoded": [ + { + "key": "email", + "value": "admin1@admin.com", + "type": "text" + }, + { + "key": "password", + "value": "admin123", + "type": "text" + } + ] + }, + "url": { + "raw": "{{baseUrl}}/v1/auth/login", + "host": ["{{baseUrl}}"], + "path": ["v1", "auth", "login"] + } + }, + "response": [] + }, + { + "name": "/register", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Accept-Language", + "value": "{{language}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"email\": \"sinaiman@gmail.com\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/v1/auth/register", + "host": ["{{baseUrl}}"], + "path": ["v1", "auth", "register"] + } + }, + "response": [] + }, + { + "name": "/profile", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "type": "text", + "value": "application/x-www-form-urlencoded" + }, + { + "key": "Authorization", + "value": "{{token}}", + "type": "text" + }, + { + "key": "Accept-Language", + "value": "{{language}}", + "type": "text" + } + ], + "body": { + "mode": "urlencoded", + "urlencoded": [ + { + "key": "password", + "value": "admin", + "type": "text" + }, + { + "key": "passwordNew", + "value": "admin", + "type": "text" + }, + { + "key": "passwordConfirm", + "value": "admin", + "type": "text" + } + ] + }, + "url": { + "raw": "{{baseUrl}}/v1/auth/profile", + "host": ["{{baseUrl}}"], + "path": ["v1", "auth", "profile"] + } + }, + "response": [] + }, + { + "name": "/change-password Copy", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "type": "text", + "value": "application/x-www-form-urlencoded" + }, + { + "key": "Authorization", + "value": "{{token}}", + "type": "text" + }, + { + "key": "Accept-Language", + "value": "{{language}}", + "type": "text" + } + ], + "body": { + "mode": "urlencoded", + "urlencoded": [ + { + "key": "password", + "value": "admin", + "type": "text" + }, + { + "key": "passwordNew", + "value": "admin", + "type": "text" + }, + { + "key": "passwordConfirm", + "value": "admin", + "type": "text" + } + ] + }, + "url": { + "raw": "{{baseUrl}}/change-password", + "host": ["{{baseUrl}}"], + "path": ["change-password"] + } + }, + "response": [] + }, + { + "name": "ORCID Token", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "https://sandbox.orcid.org/oauth/token", + "protocol": "https", + "host": ["sandbox", "orcid", "org"], + "path": ["oauth", "token"] + } + }, + "response": [] + }, + { + "name": "ORCID Authenticated Request", + "request": { + "method": "GET", + "header": [], + "url": null + }, + "response": [] + } + ] + }, + { + "name": "/misc", + "item": [ + { + "name": "/change-language", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "type": "text", + "value": "application/x-www-form-urlencoded" + }, + { + "key": "Accept-Language", + "type": "text", + "value": "sl-SI" + } + ], + "body": { + "mode": "urlencoded", + "urlencoded": [ + { + "key": "language", + "value": "sl-SI", + "type": "text" + } + ] + }, + "url": { + "raw": "{{baseUrl}}/misc/change-language", + "host": ["{{baseUrl}}"], + "path": ["misc", "change-language"] + } + }, + "response": [] + } + ] + }, + { + "name": "/users", + "item": [ + { + "name": "/", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "type": "text", + "value": "application/x-www-form-urlencoded" + }, + { + "key": "Accept-Language", + "type": "text", + "value": "sl-SI" + }, + { + "key": "Authorization", + "value": "{{token}}", + "type": "text" + } + ], + "body": { + "mode": "urlencoded", + "urlencoded": [] + }, + "url": { + "raw": "{{baseUrl}}/v1/users", + "host": ["{{baseUrl}}"], + "path": ["v1", "users"] + } + }, + "response": [] + }, + { + "name": "/:id", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "type": "text", + "value": "application/x-www-form-urlencoded" + }, + { + "key": "Accept-Language", + "type": "text", + "value": "sl-SI" + }, + { + "key": "Authorization", + "type": "text", + "value": "{{token}}" + } + ], + "body": { + "mode": "urlencoded", + "urlencoded": [] + }, + "url": { + "raw": "{{baseUrl}}/v1/users/3", + "host": ["{{baseUrl}}"], + "path": ["v1", "users", "3"] + } + }, + "response": [] + }, + { + "name": "/:id", + "request": { + "method": "DELETE", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "type": "text", + "value": "application/x-www-form-urlencoded" + }, + { + "key": "Accept-Language", + "type": "text", + "value": "sl-SI" + }, + { + "key": "Authorization", + "type": "text", + "value": "{{token}}" + } + ], + "body": { + "mode": "urlencoded", + "urlencoded": [] + }, + "url": { + "raw": "{{baseUrl}}/v1/users/9", + "host": ["{{baseUrl}}"], + "path": ["v1", "users", "9"] + } + }, + "response": [] + }, + { + "name": "/:id", + "request": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "type": "text", + "value": "application/x-www-form-urlencoded" + }, + { + "key": "Accept-Language", + "type": "text", + "value": "sl-SI" + }, + { + "key": "Authorization", + "type": "text", + "value": "{{token}}" + } + ], + "body": { + "mode": "urlencoded", + "urlencoded": [ + { + "key": "username", + "value": "Tyrion1", + "type": "text" + }, + { + "key": "name", + "value": "test name", + "type": "text" + } + ] + }, + "url": { + "raw": "{{baseUrl}}/v1/users/5", + "host": ["{{baseUrl}}"], + "path": ["v1", "users", "5"] + } + }, + "response": [] + } + ] + }, + { + "name": "/discoveries", + "item": [ + { + "name": "Mint", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"title\": \"A Paper\",\n \"links\": {\n \"pdf\": [\"https://www.pnas.org/content/pnas/117/18/9782.full.pdf\", \"https://www.researchgate.net/profile/Lynne-Webb/publication/320925277_Online_Research_Methods_Qualitative/links/5a593e2545851545026fd682/Online-Research-Methods-Qualitative.pdf\"],\n \"code\": [\"https://github.com/skogard/nebulus\"]\n }\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/v1/discoveries/mint", + "host": ["{{baseUrl}}"], + "path": ["v1", "discoveries", "mint"] + } + }, + "response": [] + }, + { + "name": "DOI", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"doi\": \"https://doi.org/10.7554/eLife.00778\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/v1/discoveries/doi", + "host": ["{{baseUrl}}"], + "path": ["v1", "discoveries", "doi"] + } + }, + "response": [] + }, + { + "name": "Mint Permaweb", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"title\": \"A Paper\",\n \"links\": {\n \"pdf\": [\"https://www.pnas.org/content/pnas/117/18/9782.full.pdf\", \"https://www.researchgate.net/profile/Lynne-Webb/publication/320925277_Online_Research_Methods_Qualitative/links/5a593e2545851545026fd682/Online-Research-Methods-Qualitative.pdf\"],\n \"code\": [\"https://github.com/skogard/nebulus\"]\n }\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/v1/discoveries/mintPermanent", + "host": ["{{baseUrl}}"], + "path": ["v1", "discoveries", "mintPermanent"] + } + }, + "response": [] + }, + { + "name": "List", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/v1/discoveries", + "host": ["{{baseUrl}}"], + "path": ["v1", "discoveries"] + } + }, + "response": [] + }, + { + "name": "PDF Proxy", + "request": { + "method": "GET", + "header": [], + "url": null + }, + "response": [] + } + ] + }, + { + "name": "/ipfs", + "item": [ + { + "name": "read", + "request": { + "method": "GET", + "header": [], + "url": null + }, + "response": [] + }, + { + "name": "test", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/v1/ipfs/test", + "host": ["{{baseUrl}}"], + "path": ["v1", "ipfs", "test"] + } + }, + "response": [] + } + ] + }, + { + "name": "/arcs", + "item": [ + { + "name": "List", + "request": { + "method": "GET", + "header": [], + "url": null + }, + "response": [] + }, + { + "name": "Get", + "request": { + "method": "GET", + "header": [], + "url": null + }, + "response": [] + } + ] + }, + { + "name": "Root", + "request": { + "method": "GET", + "header": [], + "url": null + }, + "response": [] + } + ] +} diff --git a/desci-server/kubernetes/deployment.yaml b/desci-server/kubernetes/deployment.yaml index 67e735cc6..e4a9cdddf 100755 --- a/desci-server/kubernetes/deployment.yaml +++ b/desci-server/kubernetes/deployment.yaml @@ -72,6 +72,8 @@ spec: export MEDIA_SECRET_KEY={{ .Data.MEDIA_SECRET_KEY }} export ESTUARY_API_KEY={{ .Data.ESTUARY_API_KEY }} export ESTUARY_API_URL={{ .Data.ESTUARY_API_URL }} + export REPO_SERVER_URL={{ .Data.REPO_SERVER_URL }} + export REPO_SERVICE_SECRET_KEY={{ .Data.REPO_SERVICE_SECRET_KEY }} export DEBUG_TEST=0; echo "appfinish"; {{- end -}} diff --git a/desci-server/kubernetes/deployment_dev.yaml b/desci-server/kubernetes/deployment_dev.yaml index 40be5dd55..ee25fc863 100644 --- a/desci-server/kubernetes/deployment_dev.yaml +++ b/desci-server/kubernetes/deployment_dev.yaml @@ -72,6 +72,8 @@ spec: export MEDIA_SECRET_KEY={{ .Data.MEDIA_SECRET_KEY }} export ESTUARY_API_KEY={{ .Data.ESTUARY_API_KEY }} export ESTUARY_API_URL={{ .Data.ESTUARY_API_URL }} + export REPO_SERVER_URL={{ .Data.REPO_SERVER_URL }} + export REPO_SERVICE_SECRET_KEY={{ .Data.REPO_SERVICE_SECRET_KEY }} export DEBUG_TEST=0; echo "appfinish"; {{- end -}} @@ -87,6 +89,8 @@ spec: ports: - containerPort: 5420 name: server-api + - containerPort: 5445 + name: ws-api resources: limits: cpu: '0.7' diff --git a/desci-server/nodemon.json b/desci-server/nodemon.json index cdb9594dd..ff4d090d7 100644 --- a/desci-server/nodemon.json +++ b/desci-server/nodemon.json @@ -3,6 +3,6 @@ "ext": ".ts,.js,*", "ignore": ["log/server.log"], "verbose": true, - "exec": "npx kill-port 5420 9229 ; sleep 1; node -r ts-node/register --inspect=0.0.0.0:9229", - "delay": 2500 + "exec": "npx kill-port 5420 9229; sleep 5; node -r ts-node/register --inspect=0.0.0.0", + "delay": 300 } diff --git a/desci-server/package.json b/desci-server/package.json index a2ea20841..0aa86760e 100755 --- a/desci-server/package.json +++ b/desci-server/package.json @@ -5,18 +5,22 @@ "engines": { "node": ">=16.14" }, + "type": "module", "scripts": { "dev": "concurrently \"npm run watch-compile\" \"npm run watch-dev\"", - "watch-compile": "debug=* NODE_PATH=./src swc src -w --log-watch-compilation --out-dir dist", - "watch-dev": "debug=* NODE_PATH=./src nodemon --watch \"dist/**/*\" -e js ./dist/index.js", - "script:fix-mirrors": "debug=* NODE_PATH=./src ts-node-dev ./src/scripts/retry-mirrors.ts", - "script:upgrade-manifests": "debug=* NODE_PATH=./src ts-node-dev ./src/scripts/upgradeManifests.ts", - "script:test-upgrade-manifests": "debug=* NODE_PATH=./src ts-node-dev ./src/scripts/testUpgradeManifests.ts", - "script:fill-research-fields": "debug=* NODE_PATH=./src ts-node-dev ./src/scripts/fill-research-fields.ts", - "script:fix-data-refs": "debug=* NODE_PATH=./src ts-node-dev ./src/scripts/dataRefDoctor.ts", - "script:active-users": "debug=* NODE_PATH=./src ts-node-dev ./src/scripts/activeUsers.ts", - "script:invalidate-redis-cache": "debug=* NODE_PATH=./src ts-node-dev ./src/scripts/invalidate-redis-cache.ts", - "script:increase-base-drive-storage": "debug=* NODE_PATH=./src ts-node-dev ./src/scripts/increase-base-drive-storage.ts", + "watch-compile": "debug=* tsc -w --preserveWatchOutput", + "watch-dev": "debug=* nodemon --watch \"dist/**/*\" -e js ./dist/index.js", + "script:fix-mirrors": "debug=* node --no-warnings --enable-source-maps --loader ts-node/esm ./src/scripts/retry-mirrors.ts", + "script:upgrade-manifests": "debug=* node --no-warnings --enable-source-maps --loader ts-node/esm ./src/scripts/upgradeManifests.ts", + "script:test-upgrade-manifests": "debug=* node --no-warnings --enable-source-maps --loader ts-node/esm ./src/scripts/testUpgradeManifests.ts", + "script:fill-research-fields": "debug=* node --no-warnings --enable-source-maps --loader ts-node/esm ./src/scripts/fill-research-fields.ts", + "script:fix-data-refs": "debug=* node --no-warnings --enable-source-maps --loader ts-node/esm ./src/scripts/dataRefDoctor.ts", + "script:active-users": "debug=* node --no-warnings --enable-source-maps --loader ts-node/esm ./src/scripts/activeUsers.ts", + "script:invalidate-redis-cache": "debug=* node --no-warnings --enable-source-maps --loader ts-node/esm ./src/scripts/invalidate-redis-cache.ts", + "script:increase-base-drive-storage": "debug=* node --no-warnings --enable-source-maps --loader ts-node/esm ./src/scripts/increase-base-drive-storage.ts", + "script:testing": "debug=* node --no-warnings --enable-source-maps --loader ts-node/esm ./src/scripts/testing.ts", + "script:migrate-draft-trees": "debug=* node --no-warnings --enable-source-maps --loader ts-node/esm ./src/scripts/migrate-draft-trees.ts", + "script:endorse-dpid": "debug=* node --no-warnings --enable-source-maps --loader ts-node/esm ./src/scripts/endorseDpid.ts", "build": "rimraf dist && tsc && yarn copy-files", "copy-files": "copyfiles -u 1 src/**/*.cjs dist/", "generate": "npx prisma generate", @@ -28,11 +32,11 @@ "lint-staged-husky": "lint-staged", "lint-prettier": "prettier --config .prettierrc --list-different '{src,test}/**/*.{ts,js,css,scss}'", "prettier": "prettier --config .prettierrc --write './**/*.{ts,js,css,scss,json,md}'", - "test:destructive": "NODE_PATH=./src mocha --colors --require ts-node/register 'test/integration/**/*.test.ts' --timeout 20000 --exit", + "test:destructive": "mocha --colors --require ts-node/esm 'test/integration/**/*.test.ts' --timeout 20000 --exit", "test:destructive:debug": "yarn test:destructive --inspect=0.0.0.0:9227", - "test": "yarn docker:test && docker-compose --file ../docker-compose.test.yml down", - "coverage:destructive": "nyc --all -r lcov -e .ts -x \"*.test.ts\" npm run test:destructive", - "coverage:destructive:debug": "nyc --all -r lcov -e .ts -x \"*.test.ts\" npm run test:destructive:debug", + "test": "yarn docker:test && docker-compose --file ../docker-compose.test.yml --compatibility down", + "coverage:destructive": "nyc --all --parser-plugins='[\"importAssertions\"]' -r lcov -e .ts -x \"*.test.ts\" npm run test:destructive", + "coverage:destructive:debug": "nyc --all --parser-plugins='[\"importAssertions\"]' -r lcov -e .ts -x \"*.test.ts\" npm run test:destructive:debug", "commit": "git-cz", "db:forward": "kubectl run --env REMOTE_HOST=$REMOTE_HOST --env REMOTE_PORT=5432 --env LOCAL_PORT=8080 --port 8080 --image marcnuri/port-forward test-port-forward ; kubectl port-forward test-port-forward 8080:8080", "docker:dev": "../dockerDev.sh", @@ -42,6 +46,9 @@ "podman:dev": "podman-compose --file docker-compose.yml --file docker-compose.dev.yml up --build" }, "dependencies": { + "@automerge/automerge": "2.1.10", + "@automerge/automerge-repo": "^1.0.19", + "@automerge/automerge-repo-network-websocket": "^1.0.19", "@desci-labs/desci-models": "link:./desci-models", "@gitcoinco/passport-sdk-reader": "^0.1.4", "@honeycombio/opentelemetry-node": "^0.3.2", @@ -53,6 +60,7 @@ "@sendgrid/mail": "^7.7.0", "@sentry/node": "^7.12.0", "@sentry/tracing": "^7.12.0", + "@types/lodash-es": "^4.17.12", "@types/mkdirp": "^1.0.2", "@types/multer": "^1.4.7", "@types/tar": "^6.1.3", @@ -79,7 +87,7 @@ "ipfs-utils": "9.0.6", "jsonwebtoken": "^8.5.1", "kill-port": "^2.0.1", - "lodash": "^4.17.21", + "lodash-es": "^4.17.21", "mkdirp": "^1.0.4", "morgan": "^1.10.0", "multer": "^1.4.5-lts.1", @@ -102,6 +110,7 @@ "url-safe-base64": "^1.2.0", "uuid": "^8.3.2", "validator": "^13.6.0", + "ws": "^8.15.0", "yaml": "^1.10.2", "yauzl": "^2.10.0", "yazl": "^2.5.1", @@ -109,6 +118,7 @@ "zlib": "^1.0.5" }, "devDependencies": { + "@babel/plugin-syntax-import-assertions": "^7.23.3", "@commitlint/cli": "^13.1.0", "@commitlint/config-conventional": "^13.1.0", "@swc/cli": "^0.1.62", @@ -127,11 +137,12 @@ "@types/mocha": "^10.0.1", "@types/morgan": "^1.9.3", "@types/multer-s3": "^3.0.1", - "@types/node": "^16.4.13", + "@types/node": "^20.10.4", "@types/supertest": "^2.0.12", "@types/validator": "^13.6.3", - "@typescript-eslint/eslint-plugin": "^4.29.1", - "@typescript-eslint/parser": "^4.29.1", + "@types/ws": "^8.5.10", + "@typescript-eslint/eslint-plugin": "^6.14.0", + "@typescript-eslint/parser": "^6.14.0", "chai": "^4.3.4", "chokidar": "^3.5.3", "commitizen": "^4.2.4", @@ -139,22 +150,23 @@ "dotenv": "^10.0.0", "dotenv-cli": "^4.0.0", "eslint": "^7.32.0", - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-import": "^2.24.0", - "eslint-plugin-no-array-reduce": "^1.0.22", - "eslint-plugin-prettier": "^3.4.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-no-array-reduce": "^1.0.62", + "eslint-plugin-prettier": "^5.0.1", + "generic-pool": "^3.9.0", "ipfs-core": "^0.15.4", "lint-staged": "^11.1.2", "mocha": "^9.0.3", "nodemon": "^2.0.22", "nyc": "^15.1.0", - "prettier": "^2.3.2", + "prettier": "^3.1.1", "pretty-quick": "^3.1.1", "prisma-dbml-generator": "^0.7.0", "supertest": "^6.3.3", - "ts-node": "10.2.0", + "ts-node": "^10.9.2", "ts-node-dev": "^1.1.8", - "typescript": "4.3.5" + "typescript": "^5.0.0" }, "lint-staged": { "*": [ @@ -175,6 +187,6 @@ } }, "prisma": { - "seed": "npx ts-node prisma/seed.ts" + "seed": "node --no-warnings=ExperimentalWarning --loader ts-node/esm prisma/seed.ts" } } diff --git a/desci-server/prisma/migrations/20231128184308_add_draft_node_tree_table/migration.sql b/desci-server/prisma/migrations/20231128184308_add_draft_node_tree_table/migration.sql new file mode 100644 index 000000000..46640f0d0 --- /dev/null +++ b/desci-server/prisma/migrations/20231128184308_add_draft_node_tree_table/migration.sql @@ -0,0 +1,20 @@ +-- CreateTable +CREATE TABLE "DraftNodeTree" ( + "id" SERIAL NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "path" TEXT, + "cid" TEXT NOT NULL, + "directory" BOOLEAN NOT NULL, + "size" INTEGER NOT NULL, + "nodeId" INTEGER NOT NULL, + "userId" INTEGER NOT NULL, + + CONSTRAINT "DraftNodeTree_pkey" PRIMARY KEY ("id") +); + +-- AddForeignKey +ALTER TABLE "DraftNodeTree" ADD CONSTRAINT "DraftNodeTree_nodeId_fkey" FOREIGN KEY ("nodeId") REFERENCES "Node"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "DraftNodeTree" ADD CONSTRAINT "DraftNodeTree_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/desci-server/prisma/migrations/20231128190859_add_external_bool_to_draft_node_tree_table/migration.sql b/desci-server/prisma/migrations/20231128190859_add_external_bool_to_draft_node_tree_table/migration.sql new file mode 100644 index 000000000..7aa49b3c6 --- /dev/null +++ b/desci-server/prisma/migrations/20231128190859_add_external_bool_to_draft_node_tree_table/migration.sql @@ -0,0 +1,8 @@ +/* + Warnings: + + - Added the required column `external` to the `DraftNodeTree` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE "DraftNodeTree" ADD COLUMN "external" BOOLEAN NOT NULL; diff --git a/desci-server/prisma/migrations/20231129121419_non_optional_path_in_draft_node_tree/migration.sql b/desci-server/prisma/migrations/20231129121419_non_optional_path_in_draft_node_tree/migration.sql new file mode 100644 index 000000000..cba25213b --- /dev/null +++ b/desci-server/prisma/migrations/20231129121419_non_optional_path_in_draft_node_tree/migration.sql @@ -0,0 +1,8 @@ +/* + Warnings: + + - Made the column `path` on table `DraftNodeTree` required. This step will fail if there are existing NULL values in that column. + +*/ +-- AlterTable +ALTER TABLE "DraftNodeTree" ALTER COLUMN "path" SET NOT NULL; diff --git a/desci-server/prisma/migrations/20231201191632_add_path_nodeid_uniqueness_constraint_draft_node_tree/migration.sql b/desci-server/prisma/migrations/20231201191632_add_path_nodeid_uniqueness_constraint_draft_node_tree/migration.sql new file mode 100644 index 000000000..8d573ac9a --- /dev/null +++ b/desci-server/prisma/migrations/20231201191632_add_path_nodeid_uniqueness_constraint_draft_node_tree/migration.sql @@ -0,0 +1,8 @@ +/* + Warnings: + + - A unique constraint covering the columns `[nodeId,path]` on the table `DraftNodeTree` will be added. If there are existing duplicate values, this will fail. + +*/ +-- CreateIndex +CREATE UNIQUE INDEX "DraftNodeTree_nodeId_path_key" ON "DraftNodeTree"("nodeId", "path"); diff --git a/desci-server/prisma/migrations/20231205012324_add_manifest_document_id_to_node_table/migration.sql b/desci-server/prisma/migrations/20231205012324_add_manifest_document_id_to_node_table/migration.sql new file mode 100644 index 000000000..ef8ff3e1f --- /dev/null +++ b/desci-server/prisma/migrations/20231205012324_add_manifest_document_id_to_node_table/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Node" ADD COLUMN "manifestDocumentId" TEXT NOT NULL DEFAULT ''; diff --git a/desci-server/prisma/migrations/20231206234316_add_automerge_document_storage_table/migration.sql b/desci-server/prisma/migrations/20231206234316_add_automerge_document_storage_table/migration.sql new file mode 100644 index 000000000..3558917c1 --- /dev/null +++ b/desci-server/prisma/migrations/20231206234316_add_automerge_document_storage_table/migration.sql @@ -0,0 +1,7 @@ +-- CreateTable +CREATE TABLE "DocumentStore" ( + "key" TEXT NOT NULL, + "value" BYTEA NOT NULL, + + CONSTRAINT "DocumentStore_pkey" PRIMARY KEY ("key") +); diff --git a/desci-server/prisma/migrations/20231211151127_remove_users_from_draft_node_trees/migration.sql b/desci-server/prisma/migrations/20231211151127_remove_users_from_draft_node_trees/migration.sql new file mode 100644 index 000000000..f8bf71ca4 --- /dev/null +++ b/desci-server/prisma/migrations/20231211151127_remove_users_from_draft_node_trees/migration.sql @@ -0,0 +1,2 @@ +-- DropForeignKey +ALTER TABLE "DraftNodeTree" DROP CONSTRAINT "DraftNodeTree_userId_fkey"; diff --git a/desci-server/prisma/migrations/20231211152916_remove_user_id_draft_node_trees/migration.sql b/desci-server/prisma/migrations/20231211152916_remove_user_id_draft_node_trees/migration.sql new file mode 100644 index 000000000..a4103df82 --- /dev/null +++ b/desci-server/prisma/migrations/20231211152916_remove_user_id_draft_node_trees/migration.sql @@ -0,0 +1,8 @@ +/* + Warnings: + + - You are about to drop the column `userId` on the `DraftNodeTree` table. All the data in the column will be lost. + +*/ +-- AlterTable +ALTER TABLE "DraftNodeTree" DROP COLUMN "userId"; diff --git a/desci-server/prisma/migrations/20231213211511_/migration.sql b/desci-server/prisma/migrations/20231213211511_/migration.sql new file mode 100644 index 000000000..d16192e8c --- /dev/null +++ b/desci-server/prisma/migrations/20231213211511_/migration.sql @@ -0,0 +1,8 @@ +/* + Warnings: + + - A unique constraint covering the columns `[path,versionId]` on the table `PublicDataReference` will be added. If there are existing duplicate values, this will fail. + +*/ +-- CreateIndex +CREATE UNIQUE INDEX "PublicDataReference_path_versionId_key" ON "PublicDataReference"("path", "versionId"); diff --git a/desci-server/prisma/migrations/20240110020737_add_community_and_items_feed_and_endorsements/migration.sql b/desci-server/prisma/migrations/20240110020737_add_community_and_items_feed_and_endorsements/migration.sql new file mode 100644 index 000000000..28f1065e7 --- /dev/null +++ b/desci-server/prisma/migrations/20240110020737_add_community_and_items_feed_and_endorsements/migration.sql @@ -0,0 +1,69 @@ +-- AlterTable +ALTER TABLE "User" ADD COLUMN "desciCommunityId" INTEGER; + +-- CreateTable +CREATE TABLE "NodeFeedItem" ( + "id" SERIAL NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "nodeUuid" TEXT NOT NULL, + "nodeUuidHex" TEXT NOT NULL, + "manifestCid" TEXT NOT NULL, + "title" TEXT NOT NULL, + "date" TIMESTAMP(3) NOT NULL, + "authors" TEXT NOT NULL, + "abstract" TEXT NOT NULL, + + CONSTRAINT "NodeFeedItem_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "NodeFeedItemEndorsement" ( + "id" SERIAL NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "nodeUuid" TEXT NOT NULL, + "nodeUuidHex" TEXT NOT NULL, + "nodeDpid10" TEXT NOT NULL, + "manifestCid" TEXT NOT NULL, + "title" TEXT NOT NULL, + "date" TIMESTAMP(3) NOT NULL, + "authors" TEXT NOT NULL, + "abstract" TEXT NOT NULL, + "userId" INTEGER NOT NULL, + "nodeFeedItemId" INTEGER NOT NULL, + + CONSTRAINT "NodeFeedItemEndorsement_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "DesciCommunity" ( + "id" SERIAL NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "name" TEXT NOT NULL, + "description" TEXT NOT NULL, + + CONSTRAINT "DesciCommunity_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "NodeFeedItem_nodeUuid_key" ON "NodeFeedItem"("nodeUuid"); + +-- CreateIndex +CREATE UNIQUE INDEX "NodeFeedItem_nodeUuidHex_key" ON "NodeFeedItem"("nodeUuidHex"); + +-- CreateIndex +CREATE UNIQUE INDEX "DesciCommunity_name_key" ON "DesciCommunity"("name"); + +-- AddForeignKey +ALTER TABLE "User" ADD CONSTRAINT "User_desciCommunityId_fkey" FOREIGN KEY ("desciCommunityId") REFERENCES "DesciCommunity"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "NodeFeedItemEndorsement" ADD CONSTRAINT "NodeFeedItemEndorsement_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "NodeFeedItemEndorsement" ADD CONSTRAINT "NodeFeedItemEndorsement_nodeFeedItemId_fkey" FOREIGN KEY ("nodeFeedItemId") REFERENCES "NodeFeedItem"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "NodeFeedItemEndorsement" ADD CONSTRAINT "NodeFeedItemEndorsement_id_fkey" FOREIGN KEY ("id") REFERENCES "DesciCommunity"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/desci-server/prisma/migrations/20240110044029_dpid10/migration.sql b/desci-server/prisma/migrations/20240110044029_dpid10/migration.sql new file mode 100644 index 000000000..650eb6b14 --- /dev/null +++ b/desci-server/prisma/migrations/20240110044029_dpid10/migration.sql @@ -0,0 +1,42 @@ +/* + Warnings: + + - You are about to drop the column `abstract` on the `NodeFeedItemEndorsement` table. All the data in the column will be lost. + - You are about to drop the column `authors` on the `NodeFeedItemEndorsement` table. All the data in the column will be lost. + - You are about to drop the column `date` on the `NodeFeedItemEndorsement` table. All the data in the column will be lost. + - You are about to drop the column `manifestCid` on the `NodeFeedItemEndorsement` table. All the data in the column will be lost. + - You are about to drop the column `nodeDpid10` on the `NodeFeedItemEndorsement` table. All the data in the column will be lost. + - You are about to drop the column `title` on the `NodeFeedItemEndorsement` table. All the data in the column will be lost. + - A unique constraint covering the columns `[nodeDpid10]` on the table `NodeFeedItem` will be added. If there are existing duplicate values, this will fail. + - Added the required column `nodeDpid10` to the `NodeFeedItem` table without a default value. This is not possible if the table is not empty. + - Added the required column `desciCommunityId` to the `NodeFeedItemEndorsement` table without a default value. This is not possible if the table is not empty. + - Added the required column `type` to the `NodeFeedItemEndorsement` table without a default value. This is not possible if the table is not empty. + +*/ +-- DropForeignKey +ALTER TABLE "NodeFeedItemEndorsement" DROP CONSTRAINT "NodeFeedItemEndorsement_id_fkey"; + +-- DropIndex +DROP INDEX "NodeFeedItem_nodeUuidHex_key"; + +-- DropIndex +DROP INDEX "NodeFeedItem_nodeUuid_key"; + +-- AlterTable +ALTER TABLE "NodeFeedItem" ADD COLUMN "nodeDpid10" TEXT NOT NULL; + +-- AlterTable +ALTER TABLE "NodeFeedItemEndorsement" DROP COLUMN "abstract", +DROP COLUMN "authors", +DROP COLUMN "date", +DROP COLUMN "manifestCid", +DROP COLUMN "nodeDpid10", +DROP COLUMN "title", +ADD COLUMN "desciCommunityId" INTEGER NOT NULL, +ADD COLUMN "type" TEXT NOT NULL; + +-- CreateIndex +CREATE UNIQUE INDEX "NodeFeedItem_nodeDpid10_key" ON "NodeFeedItem"("nodeDpid10"); + +-- AddForeignKey +ALTER TABLE "NodeFeedItemEndorsement" ADD CONSTRAINT "NodeFeedItemEndorsement_desciCommunityId_fkey" FOREIGN KEY ("desciCommunityId") REFERENCES "DesciCommunity"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/desci-server/prisma/migrations/20240110050930_endorse_dpid/migration.sql b/desci-server/prisma/migrations/20240110050930_endorse_dpid/migration.sql new file mode 100644 index 000000000..c661df16b --- /dev/null +++ b/desci-server/prisma/migrations/20240110050930_endorse_dpid/migration.sql @@ -0,0 +1,12 @@ +/* + Warnings: + + - You are about to drop the column `nodeUuid` on the `NodeFeedItemEndorsement` table. All the data in the column will be lost. + - You are about to drop the column `nodeUuidHex` on the `NodeFeedItemEndorsement` table. All the data in the column will be lost. + - Added the required column `nodeDpid10` to the `NodeFeedItemEndorsement` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE "NodeFeedItemEndorsement" DROP COLUMN "nodeUuid", +DROP COLUMN "nodeUuidHex", +ADD COLUMN "nodeDpid10" TEXT NOT NULL; diff --git a/desci-server/prisma/migrations/20240110092031_add_ceramic_streamid_to_node/migration.sql b/desci-server/prisma/migrations/20240110092031_add_ceramic_streamid_to_node/migration.sql new file mode 100644 index 000000000..aec2c14fe --- /dev/null +++ b/desci-server/prisma/migrations/20240110092031_add_ceramic_streamid_to_node/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Node" ADD COLUMN "ceramicStream" TEXT; diff --git a/desci-server/prisma/schema.prisma b/desci-server/prisma/schema.prisma index b388c9915..dca84b18e 100755 --- a/desci-server/prisma/schema.prisma +++ b/desci-server/prisma/schema.prisma @@ -20,6 +20,7 @@ model Node { replicationFactor Int ownerId Int uuid String? @unique @default(uuid()) + manifestDocumentId String @default("") privateShare PrivateShare? owner User @relation(fields: [ownerId], references: [id]) authorInvites AuthorInvite[] @@ -35,6 +36,8 @@ model Node { isDeleted Boolean @default(false) deletedAt DateTime? UploadJobs UploadJobs[] + DraftNodeTree DraftNodeTree[] + ceramicStream String? @@index([ownerId]) @@index([uuid]) @@ -120,36 +123,36 @@ model Wallet { } model User { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - email String @unique - phoneNumber String? @unique + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + email String @unique + phoneNumber String? @unique name String? website String? googleScholarUrl String? researchInterests String? - gitcoinPassport String? @unique - walletAddress String? @unique - isPatron Boolean @default(false) - isWarden Boolean @default(false) - isKeeper Boolean @default(false) - pseudonym String? @unique - orcid String? @unique + gitcoinPassport String? @unique + walletAddress String? @unique + isPatron Boolean @default(false) + isWarden Boolean @default(false) + isKeeper Boolean @default(false) + pseudonym String? @unique + orcid String? @unique // rorPid String[] @default([]) // organization String[] @default([]) - isAdmin Boolean @default(false) - isVerified Boolean @default(false) - verificationCode String @default("") - siweNonce String @default("") + isAdmin Boolean @default(false) + isVerified Boolean @default(false) + verificationCode String @default("") + siweNonce String @default("") authTokens AuthToken[] - authorInvitesReceived AuthorInvite[] @relation("ReceivedAuthorInvites") - authorInvitesSent AuthorInvite[] @relation("SentAuthorInvites") - receivedTransactions ChainTransaction[] @relation("ReceivedTransactions") - sentTransactions ChainTransaction[] @relation("SentTransactions") + authorInvitesReceived AuthorInvite[] @relation("ReceivedAuthorInvites") + authorInvitesSent AuthorInvite[] @relation("SentAuthorInvites") + receivedTransactions ChainTransaction[] @relation("ReceivedTransactions") + sentTransactions ChainTransaction[] @relation("SentTransactions") interactionLogs InteractionLog[] - invitesReceived Invite[] @relation("ReceivedInvites") - invitesSent Invite[] @relation("SentInvites") + invitesReceived Invite[] @relation("ReceivedInvites") + invitesSent Invite[] @relation("SentInvites") ownedNodes Node[] authoredNodes NodeAuthor[] nodeVotes NodeVote[] @@ -158,15 +161,19 @@ model User { identities UserIdentity[] Waitlist Waitlist[] wallets Wallet[] - canRunCode Boolean? @default(false) + canRunCode Boolean? @default(false) DataReference DataReference[] CidPruneList CidPruneList[] PublicDataReference PublicDataReference[] FriendReferral FriendReferral[] - currentDriveStorageLimitGb Int @default(100) - maxDriveStorageLimitGb Int @default(500) + currentDriveStorageLimitGb Int @default(100) + maxDriveStorageLimitGb Int @default(500) userOrganizations UserOrganizations[] UploadJobs UploadJobs[] + // DraftNodeTree DraftNodeTree[] + NodeFeedItemEndorsement NodeFeedItemEndorsement[] + DesciCommunity DesciCommunity? @relation(fields: [desciCommunityId], references: [id]) + desciCommunityId Int? @@index([orcid]) @@index([walletAddress]) @@ -378,6 +385,8 @@ model PublicDataReference { node Node @relation(fields: [nodeId], references: [id]) user User? @relation(fields: [userId], references: [id]) nodeVersion NodeVersion? @relation(fields: [versionId], references: [id]) + + @@unique([path, versionId]) } model IpfsMirror { @@ -490,6 +499,69 @@ model UploadJobs { user User @relation(fields: [userId], references: [id]) } +model DocumentStore { + key String @id + value Bytes +} + +model DraftNodeTree { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + path String + cid String + directory Boolean + size Int + external Boolean + nodeId Int + // userId Int + node Node @relation(fields: [nodeId], references: [id]) + // user User @relation(fields: [userId], references: [id]) + + @@unique([nodeId, path]) +} + +// create a model for Node UUIDs, titles, dates, authors, and abstracts +model NodeFeedItem { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + nodeUuid String + nodeUuidHex String + nodeDpid10 String @unique + manifestCid String + title String + date DateTime + authors String + abstract String + nodeFeedItemEndorsement NodeFeedItemEndorsement[] +} + +model NodeFeedItemEndorsement { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + nodeDpid10 String + type String + userId Int + nodeFeedItemId Int + desciCommunityId Int + user User @relation(fields: [userId], references: [id]) + nodeFeedItem NodeFeedItem @relation(fields: [nodeFeedItemId], references: [id]) + desciCommunity DesciCommunity @relation(fields: [desciCommunityId], references: [id]) +} + +// an organization that endorses work and has members +model DesciCommunity { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + name String @unique + description String + members User[] + endorsements NodeFeedItemEndorsement[] +} + enum UploadType { REGULAR EXTERNAL_URL diff --git a/desci-server/prisma/seed.ts b/desci-server/prisma/seed.ts index be98e7d00..897ed8bbb 100755 --- a/desci-server/prisma/seed.ts +++ b/desci-server/prisma/seed.ts @@ -1,5 +1,5 @@ -import researchFieldsData from '../data/fields.json'; -import prisma from '../src/client'; +import researchFieldsData from '../data/fields.json' assert { type: 'json' }; +import { prisma } from '../src/client.js'; async function main() { const owner = await prisma.user.upsert({ diff --git a/desci-server/scripts/be-node-test.sh b/desci-server/scripts/be-node-test.sh index c7e829029..5e6b8a202 100755 --- a/desci-server/scripts/be-node-test.sh +++ b/desci-server/scripts/be-node-test.sh @@ -10,9 +10,14 @@ apt-get add --update bash # chmod -R 777 /app/node_modules/.prisma # chmod -R 777 /app/node_modules/prisma # chmod -R 777 /root/ && chown node:node /root/.cache/prisma/master/2920a97877e12e055c1333079b8d19cee7f33826/debian-openssl-1.1.x/libquery-engine # for prisma studio +mkdir -p /app/desci-server/repo-tmp chmod -R 777 /app/desci-server/repo-tmp cd desci-server yarn run migrate npx prisma db seed -(npx prisma studio&) -npm run coverage:destructive:debug \ No newline at end of file + +# update prisma client in desci-repo in case it not initialized properly +cp node_modules/.prisma/*/* ../desci-repo/node_modules/.prisma/ + +(npx prisma studio &) +npm run test:destructive:debug diff --git a/desci-server/src/client.ts b/desci-server/src/client.ts index 107264ae8..9b6c4ce30 100755 --- a/desci-server/src/client.ts +++ b/desci-server/src/client.ts @@ -1,5 +1,3 @@ -import { PrismaClient } from '@prisma/client' +import { PrismaClient } from '@prisma/client'; -let prisma = new PrismaClient() - -export default prisma \ No newline at end of file +export const prisma = new PrismaClient(); diff --git a/desci-server/src/config/index.ts b/desci-server/src/config/index.ts index 0face561d..ba9134ddd 100644 --- a/desci-server/src/config/index.ts +++ b/desci-server/src/config/index.ts @@ -1,9 +1,11 @@ +import 'dotenv/config'; + export const PUBLIC_IPFS_PATH = process.env.NODE_ENV === 'dev' ? `http://host.docker.internal:8089/ipfs` : process.env.NODE_ENV === 'test' - ? 'http://host.docker.internal:8090/ipfs' - : 'https://ipfs.desci.com/ipfs'; + ? 'http://host.docker.internal:8090/ipfs' + : 'https://ipfs.desci.com/ipfs'; export const MEDIA_SERVER_API_URL = process.env.NODES_MEDIA_SERVER_URL; export const MEDIA_SERVER_API_KEY = process.env.MEDIA_SECRET_KEY; diff --git a/desci-server/src/controllers/admin/analytics.ts b/desci-server/src/controllers/admin/analytics.ts index ee5efa3f6..88386b304 100644 --- a/desci-server/src/controllers/admin/analytics.ts +++ b/desci-server/src/controllers/admin/analytics.ts @@ -1,20 +1,20 @@ import { User } from '@prisma/client'; import { Request, Response } from 'express'; -import parentLogger from 'logger'; +import { logger as parentLogger } from '../../logger.js'; import { getCountActiveUsersInMonth, getCountActiveUsersInXDays, getNodeViewsInMonth, getNodeViewsInXDays, -} from 'services/interactionLog'; +} from '../../services/interactionLog.js'; import { getCountNewNodesInXDays, getBytesInXDays, getCountNewNodesInMonth, getBytesInMonth, -} from 'services/nodeManager'; -import { getCountNewUsersInMonth, getCountNewUsersInXDays } from 'services/user'; +} from '../../services/nodeManager.js'; +import { getCountNewUsersInMonth, getCountNewUsersInXDays } from '../../services/user.js'; const logger = parentLogger.child({ module: 'ADMIN::AnalyticsController' }); diff --git a/desci-server/src/controllers/admin/index.ts b/desci-server/src/controllers/admin/index.ts index 77dc4f52a..83e15fdea 100644 --- a/desci-server/src/controllers/admin/index.ts +++ b/desci-server/src/controllers/admin/index.ts @@ -1 +1 @@ -export * from './analytics'; +export * from './analytics.js'; diff --git a/desci-server/src/controllers/auth/index.ts b/desci-server/src/controllers/auth/index.ts index d339548a6..45dc76871 100755 --- a/desci-server/src/controllers/auth/index.ts +++ b/desci-server/src/controllers/auth/index.ts @@ -1,6 +1,6 @@ -export * from './login'; -export * from './logout'; -export * from './register'; -export * from './profile'; -export * from './orcid'; -export * from './magic'; +export * from './login.js'; +export * from './logout.js'; +export * from './register.js'; +export * from './profile.js'; +export * from './orcid.js'; +export * from './magic.js'; diff --git a/desci-server/src/controllers/auth/login.ts b/desci-server/src/controllers/auth/login.ts index 81fc30f69..7ecbbad5d 100755 --- a/desci-server/src/controllers/auth/login.ts +++ b/desci-server/src/controllers/auth/login.ts @@ -1,9 +1,17 @@ import { Request, Response, NextFunction } from 'express'; -import prisma from 'client'; + +import { RequestWithUser } from '../../middleware/authorisation.js'; export const login = async (req: Request, res: Response, next: NextFunction) => { const { email } = req.body; res.send({ ok: false }); +}; +export const check = async (req: RequestWithUser, res: Response, next: NextFunction) => { + if (req.user) { + res.status(200).send({ ok: true }); + } + + res.send({ ok: false }); }; diff --git a/desci-server/src/controllers/auth/logout.ts b/desci-server/src/controllers/auth/logout.ts index b9ee5cdb7..1ddc0e931 100755 --- a/desci-server/src/controllers/auth/logout.ts +++ b/desci-server/src/controllers/auth/logout.ts @@ -1,7 +1,5 @@ import { Request, Response, NextFunction } from 'express'; -import { oneYear } from './magic'; - export const logout = async (req: Request, res: Response, next: NextFunction) => { // req.session.destroy((err) => { // if you send data here it gives an error and kills the process lol diff --git a/desci-server/src/controllers/auth/magic.ts b/desci-server/src/controllers/auth/magic.ts index 2131a760a..d63f44576 100644 --- a/desci-server/src/controllers/auth/magic.ts +++ b/desci-server/src/controllers/auth/magic.ts @@ -2,16 +2,14 @@ import { ActionType } from '@prisma/client'; import { Request, Response, NextFunction } from 'express'; import jwt from 'jsonwebtoken'; -import prismaClient from 'client'; -import logger from 'logger'; -import { magicLinkRedeem, sendMagicLink } from 'services/auth'; -import { saveInteraction } from 'services/interactionLog'; -import { client } from 'services/ipfs'; -import { checkIfUserAcceptedTerms, connectOrcidToUserIfPossible } from 'services/user'; -import { sendCookie } from 'utils/sendCookie'; +import { prisma as prismaClient } from '../../client.js'; +import { logger } from '../../logger.js'; +import { magicLinkRedeem, sendMagicLink } from '../../services/auth.js'; +import { saveInteraction } from '../../services/interactionLog.js'; +import { checkIfUserAcceptedTerms, connectOrcidToUserIfPossible } from '../../services/user.js'; +import { sendCookie } from '../../utils/sendCookie.js'; -import { getOrcidRecord } from './orcid'; -import { orcidCheck } from './orcidNext'; +import { getOrcidRecord } from './orcid.js'; export const generateAccessToken = (payload) => { return jwt.sign(payload, process.env.JWT_SECRET, { expiresIn: '1y' }); @@ -35,7 +33,7 @@ export const magic = async (req: Request, res: Response, next: NextFunction) => where: { email: { equals: email, - mode: 'insensitive' + mode: 'insensitive', }, }, }); diff --git a/desci-server/src/controllers/auth/orcid.ts b/desci-server/src/controllers/auth/orcid.ts index 686c893c5..592f4ae53 100755 --- a/desci-server/src/controllers/auth/orcid.ts +++ b/desci-server/src/controllers/auth/orcid.ts @@ -4,9 +4,9 @@ import { Request, Response } from 'express'; import jwt from 'jsonwebtoken'; import qs from 'qs'; -import parentLogger from 'logger'; -import { saveInteraction } from 'services/interactionLog'; -import { createUser, getUserByOrcId } from 'services/user'; +import { logger as parentLogger } from '../../logger.js'; +import { saveInteraction } from '../../services/interactionLog.js'; +import { createUser, getUserByOrcId } from '../../services/user.js'; const logger = parentLogger.child({ module: 'AUTH::OrcidController' }); diff --git a/desci-server/src/controllers/auth/orcidNext.ts b/desci-server/src/controllers/auth/orcidNext.ts index 54279be8d..13b969a90 100644 --- a/desci-server/src/controllers/auth/orcidNext.ts +++ b/desci-server/src/controllers/auth/orcidNext.ts @@ -3,14 +3,15 @@ */ import { ActionType } from '@prisma/client'; -import { NextFunction, Request, Response } from 'express'; +import { Request, Response } from 'express'; -import parentLogger from 'logger'; -import { saveInteraction } from 'services/interactionLog'; -import { connectOrcidToUserIfPossible } from 'services/user'; -import { sendCookie } from 'utils/sendCookie'; +import { logger as parentLogger } from '../../logger.js'; +import { saveInteraction } from '../../services/interactionLog.js'; +import { connectOrcidToUserIfPossible } from '../../services/user.js'; +import { sendCookie } from '../../utils/sendCookie.js'; + +import { OrcIdRecordData, getOrcidRecord } from './orcid.js'; -import { OrcIdRecordData, getOrcidRecord } from './orcid'; const logger = parentLogger.child({ module: 'AUTH::OrcidNextController' }); /** * check if orcid account is already linked diff --git a/desci-server/src/controllers/auth/profile.ts b/desci-server/src/controllers/auth/profile.ts index bb9ccea6c..537b91205 100755 --- a/desci-server/src/controllers/auth/profile.ts +++ b/desci-server/src/controllers/auth/profile.ts @@ -1,10 +1,9 @@ import { Wallet } from '@prisma/client'; import { Request, Response, NextFunction } from 'express'; -import prisma from 'client'; -import { logUserAction } from 'controllers/log'; -import logger from 'logger'; -import { getUserConsent, saveInteraction } from 'services/interactionLog'; +import { prisma } from '../../client.js'; +import { logger } from '../../logger.js'; +import { getUserConsent, saveInteraction } from '../../services/interactionLog.js'; export const profile = async (req: Request, res: Response, next: NextFunction) => { const user = (req as any).user; diff --git a/desci-server/src/controllers/auth/register.ts b/desci-server/src/controllers/auth/register.ts index 5c647c6a5..84900f77c 100755 --- a/desci-server/src/controllers/auth/register.ts +++ b/desci-server/src/controllers/auth/register.ts @@ -1,6 +1,6 @@ import { Request, Response, NextFunction } from 'express'; -import prisma from 'client'; +import { prisma } from '../../client.js'; export const register = async (req: Request, res: Response, next: NextFunction) => { const { email, tokendId } = req.body; diff --git a/desci-server/src/controllers/data/delete.ts b/desci-server/src/controllers/data/delete.ts index 29e6bf91c..4383415b2 100644 --- a/desci-server/src/controllers/data/delete.ts +++ b/desci-server/src/controllers/data/delete.ts @@ -1,22 +1,16 @@ -import { - ResearchObjectComponentType, - ResearchObjectV1, - deneutralizePath, - isNodeRoot, - neutralizePath, -} from '@desci-labs/desci-models'; -import { DataReference, DataType } from '@prisma/client'; +import { DocumentId } from '@automerge/automerge-repo'; +import { ResearchObjectV1 } from '@desci-labs/desci-models'; +import { DataType, Node, Prisma } from '@prisma/client'; import { Request, Response } from 'express'; -import prisma from 'client'; -import parentLogger from 'logger'; -import { updateManifestDataBucket } from 'services/data/processing'; -import { removeFileFromDag } from 'services/ipfs'; -import { prepareDataRefs } from 'utils/dataRefTools'; -import { updateManifestComponentDagCids } from 'utils/driveUtils'; +import { prisma } from '../../client.js'; +import { logger as parentLogger } from '../../logger.js'; +import { getLatestDriveTime } from '../../services/draftTrees.js'; +import { NodeUuid, getLatestManifestFromNode } from '../../services/manifestRepo.js'; +import repoService from '../../services/repoService.js'; -import { ErrorResponse } from './update'; -import { getLatestManifest, persistManifest } from './utils'; +import { ErrorResponse } from './update.js'; +import { persistManifest } from './utils.js'; interface DeleteResponse { status?: number; @@ -49,106 +43,80 @@ export const deleteData = async (req: Request, res: Response isNodeRoot(c)); + const latestManifest = await getLatestManifestFromNode(node); try { - /* - ** Delete from DAG - */ - const splitContextPath = path.split('/'); - splitContextPath.shift(); //remove root - const pathToDelete = splitContextPath.pop(); - const cleanContextPath = splitContextPath.join('/'); - logger.debug('DATA::Delete cleanContextPath: ', cleanContextPath, ' Deleting: ', pathToDelete); - const { updatedDagCidMap, updatedRootCid } = await removeFileFromDag( - dataBucket.payload.cid, - cleanContextPath, - pathToDelete, - ); - - /* - ** Prepare updated refs + /** + * Remove draft node tree entries, add them to the cid prune list */ - const existingDataRefs = await prisma.dataReference.findMany({ + // debugger; + const entriesToDelete = await prisma.draftNodeTree.findMany({ where: { nodeId: node.id, - userId: owner.id, - type: { not: DataType.MANIFEST }, + OR: [ + { + path: { + startsWith: path + '/', + }, + }, + { + path: path, + }, + ], }, }); - //map existing ref neutral paths to the ref - const existingRefMap = existingDataRefs.reduce((map, ref) => { - map[neutralizePath(ref.path)] = ref; - return map; - }, {}); - - const newRefs = await prepareDataRefs(node.uuid, latestManifest, updatedRootCid); - - // Find the dags that need updating - const dataRefUpdates: Partial[] = newRefs.map((newDataRef) => { - const newRefNeutralPath = neutralizePath(newDataRef.path); - const match = existingRefMap[newRefNeutralPath]; - match.rootCid = updatedRootCid; - if (match) { - return { ...match, ...newDataRef }; - } else { - return newDataRef; - } - }); + const entriesToDeleteIds = entriesToDelete.map((e) => e.id); - /* - ** Delete dataRefs, add to cidPruneList - */ - const deneutralizedPath = deneutralizePath(path, dataBucket?.payload?.cid); - const dataRefsToDelete = existingDataRefs.filter( - (e) => e.path.startsWith(deneutralizedPath + '/') || e.path === deneutralizedPath, - ); - - const dataRefDeletionIds = dataRefsToDelete.map((e) => e.id); - const formattedPruneList = dataRefsToDelete.map((e) => { + const formattedPruneList: Prisma.CidPruneListCreateManyInput[] = entriesToDelete.map((e) => { return { - description: '[DATA::DELETE]path: ' + neutralizePath(e.path), + description: '[DATA::DELETE db]path: ' + e.path, cid: e.cid, - type: e.type, + type: DataType.UNKNOWN, size: e.size, nodeId: e.nodeId, - userId: e.userId, + userId: owner.id, directory: e.directory, }; }); + // debugger; + const existingDataRefs = await prisma.dataReference.findMany({ + where: { + nodeId: node.id, + userId: owner.id, + type: { not: DataType.MANIFEST }, + }, + }); - const [deletions, creations, ...updates] = await prisma.$transaction([ - prisma.dataReference.deleteMany({ where: { id: { in: dataRefDeletionIds } } }), + const dataRefsToDelete = existingDataRefs.filter((e) => e.path.startsWith(path + '/') || e.path === path); + + const dataRefDeletionIds = dataRefsToDelete.map((e) => e.id); + + const [deletions, creations, dataRefDeletions] = await prisma.$transaction([ + prisma.draftNodeTree.deleteMany({ where: { id: { in: entriesToDeleteIds } } }), prisma.cidPruneList.createMany({ data: formattedPruneList }), - ...(dataRefUpdates as any).map((fd) => { - return prisma.dataReference.update({ where: { id: fd.id }, data: fd }); - }), + prisma.dataReference.deleteMany({ where: { id: { in: dataRefDeletionIds } } }), ]); + console.log('[DELETE]::', deletions.count); logger.info( - `DATA::Delete ${deletions.count} dataReferences deleted, ${creations.count} cidPruneList entries added, ${updates.length} dataReferences updated`, + `DATA::Delete ${deletions.count} draftNodeTree entries deleted, ${creations.count} cidPruneList entries added, ${dataRefDeletions.count} dataReferences deleted`, ); /* ** Delete components in Manifest, update DAG cids in manifest */ - const componentDeletionIds = latestManifest.components + const pathsToDelete = latestManifest.components .filter((c) => c.payload?.path?.startsWith(path + '/') || c.payload?.path === path) - .map((c) => c.id); - - let updatedManifest = deleteComponentsFromManifest({ - manifest: latestManifest, - componentIds: componentDeletionIds, - }); - - updatedManifest = updateManifestDataBucket({ - manifest: updatedManifest, - newRootCid: updatedRootCid, - }); - - if (Object.keys(updatedDagCidMap).length) { - updatedManifest = updateManifestComponentDagCids(updatedManifest, updatedDagCidMap); + .map((c) => (c.payload?.path as string) || ''); + + let updatedManifest = latestManifest; + try { + updatedManifest = await deleteComponentsFromManifest({ + node, + pathsToDelete, + }); + } catch (err) { + logger.error({ err }, 'Error: deleteComponentsFromManifest'); } const { persistedManifestCid } = await persistManifest({ manifest: updatedManifest, node, userId: owner.id }); @@ -157,25 +125,46 @@ export const deleteData = async (req: Request, res: Response c.id === compId); - manifest.components.splice(componentIndex, 1); - } - return manifest; +export async function deleteComponentsFromManifest({ node, pathsToDelete }: UpdatingManifestParams) { + parentLogger.info({ pathsToDelete }, `deleteComponentsFromManifest:`); + const response = await repoService.dispatchAction({ + uuid: node.uuid, + documentId: node.manifestDocumentId as DocumentId, + actions: [{ type: 'Delete Components', pathsToDelete }], + }); + + return response?.manifest; } diff --git a/desci-server/src/controllers/data/diff.ts b/desci-server/src/controllers/data/diff.ts index ec2f314a0..bba3cdd72 100644 --- a/desci-server/src/controllers/data/diff.ts +++ b/desci-server/src/controllers/data/diff.ts @@ -1,7 +1,6 @@ import { ComponentStats, DriveObject, - ResearchObjectComponentType, ResearchObjectV1, calculateComponentStats, createEmptyComponentStats, @@ -11,14 +10,15 @@ import { import axios from 'axios'; import { Request, Response } from 'express'; -import prisma from 'client'; -import { cleanupManifestUrl } from 'controllers/nodes'; -import parentLogger from 'logger'; -import { getFromCache, setToCache } from 'redisClient'; -import { TreeDiff, diffTrees, subtractComponentStats, subtractNestedObjectValues } from 'utils/diffUtils'; -import { getTreeAndFill } from 'utils/driveUtils'; +import { prisma } from '../../client.js'; +// import { cleanupManifestUrl } from 'controllers/nodes/'; +import { logger as parentLogger } from '../../logger.js'; +import { getFromCache, setToCache } from '../../redisClient.js'; +import { TreeDiff, diffTrees, subtractComponentStats } from '../../utils/diffUtils.js'; +import { getTreeAndFill } from '../../utils/driveUtils.js'; +import { cleanupManifestUrl } from '../../utils/manifest.js'; -import { ErrorResponse } from './update'; +import { ErrorResponse } from './update.js'; interface DiffResponse extends Diffs { status?: number; diff --git a/desci-server/src/controllers/data/index.ts b/desci-server/src/controllers/data/index.ts index 92b3ae296..ee09de1af 100644 --- a/desci-server/src/controllers/data/index.ts +++ b/desci-server/src/controllers/data/index.ts @@ -1,5 +1,5 @@ -export * from './researchFields'; -export * from './update'; -export * from './delete'; -export * from './retrieve'; -export * from './rename'; +export * from './researchFields.js'; +export * from './update.js'; +export * from './delete.js'; +export * from './retrieve.js'; +export * from './rename.js'; diff --git a/desci-server/src/controllers/data/move.ts b/desci-server/src/controllers/data/move.ts index b873ec57f..0bfcf72a6 100644 --- a/desci-server/src/controllers/data/move.ts +++ b/desci-server/src/controllers/data/move.ts @@ -1,23 +1,17 @@ -import { - ResearchObjectComponentType, - ResearchObjectV1, - ResearchObjectV1Component, - isNodeRoot, - neutralizePath, - recursiveFlattenTree, -} from '@desci-labs/desci-models'; +import { DocumentId } from '@automerge/automerge-repo'; +import { ResearchObjectV1, neutralizePath } from '@desci-labs/desci-models'; import { DataType } from '@prisma/client'; import { Request, Response } from 'express'; -import prisma from 'client'; -import parentLogger from 'logger'; -import { updateManifestDataBucket } from 'services/data/processing'; -import { RecursiveLsResult, getDirectoryTree, moveFileInDag } from 'services/ipfs'; -import { prepareDataRefs } from 'utils/dataRefTools'; -import { generateExternalCidMap, updateManifestComponentDagCids } from 'utils/driveUtils'; +import { prisma } from '../../client.js'; +import { logger as parentLogger } from '../../logger.js'; +import { ensureUniquePathsDraftTree, getLatestDriveTime } from '../../services/draftTrees.js'; +import { NodeUuid, getLatestManifestFromNode } from '../../services/manifestRepo.js'; +import repoService from '../../services/repoService.js'; +import { prepareDataRefsForDraftTrees } from '../../utils/dataRefTools.js'; -import { ErrorResponse } from './update'; -import { getLatestManifest, persistManifest } from './utils'; +import { ErrorResponse } from './update.js'; +import { persistManifest } from './utils.js'; interface MoveResponse { status?: number; @@ -52,79 +46,76 @@ export const moveData = async (req: Request, res: Response isNodeRoot(c)); + // const latestManifest = await getLatestManifestFromNode(node); try { + const newPathSplit = newPath.split('/'); + const fileName = newPathSplit.pop(); + const newContextPath = newPathSplit.join('/'); + /* ** New path collision check */ - const externalCidMap = await generateExternalCidMap(node.uuid); - const oldFlatTree = recursiveFlattenTree(await getDirectoryTree(dataBucket.payload.cid, externalCidMap)); - const hasDuplicates = oldFlatTree.some((oldBranch) => neutralizePath(oldBranch.path) === newPath); - if (hasDuplicates) { + const noDuplicates = await ensureUniquePathsDraftTree({ + nodeId: node.id, + contextPath: newContextPath, + filesBeingAdded: [{ originalname: fileName }], + }); + + if (!noDuplicates) { logger.info('[DATA::Move] Rejected as duplicate paths were found'); return res.status(400).json({ error: 'Name collision' }); } - /* - ** Update in dag + /** + * Update draftNodeTree entries for the move operation */ - const splitContextPath = oldPath.split('/'); - splitContextPath.shift(); //remove root - const fileToMove = splitContextPath.pop(); - const cleanContextPath = splitContextPath.join('/'); - - const splitNewPath = newPath.split('/'); - splitNewPath.shift(); //remove root - const cleanNewPath = splitNewPath.join('/'); - logger.debug(`[DATA::Move] cleanContextPath: ${cleanContextPath}, Moving: ${fileToMove} to: ${newPath}`); - const { updatedDagCidMap, updatedRootCid } = await moveFileInDag( - dataBucket.payload.cid, - cleanContextPath, - fileToMove, - cleanNewPath, - ); - /* - ** Updates old paths in the manifest component payloads to the new ones, updates the data bucket root CID and any DAG CIDs changed along the way - */ - let updatedManifest = updateComponentPathsInManifest({ - manifest: latestManifest, - oldPath: oldPath, - newPath: newPath, + const entriesToUpdate = await prisma.draftNodeTree.findMany({ + where: { + nodeId: node.id, + OR: [ + { + path: { + startsWith: oldPath + '/', + }, + }, + { + path: oldPath, + }, + ], + }, }); - updatedManifest = updateManifestDataBucket({ - manifest: updatedManifest, - newRootCid: updatedRootCid, + const updatesToPerform = entriesToUpdate.map((e) => { + return { + ...e, + path: e.path.replace(oldPath, newPath), + }; }); - // note: updatedDagCidMap here unreliable - if (Object.keys(updatedDagCidMap).length) { - updatedManifest = updateManifestComponentDagCids(updatedManifest, updatedDagCidMap); - } + const [...updates] = await prisma.$transaction([ + ...(updatesToPerform as any).map((fd) => { + return prisma.draftNodeTree.update({ where: { id: fd.id }, data: fd }); + }), + ]); + logger.info(`[DATA::Move] ${updates.length} draftNodeTree entries updated to perform the move operation`); /* - ** Workaround for keeping manifest cids in sync + ** Updates old paths in the manifest component payloads to the new ones, updates the data bucket root CID and any DAG CIDs changed along the way */ - const flatTree = recursiveFlattenTree( - await getDirectoryTree(updatedRootCid, externalCidMap), - ) as RecursiveLsResult[]; - const flatTreePathMap = flatTree.reduce((map, branch) => { - branch.path = neutralizePath(branch.path); - map[branch.path] = branch; - return map; - }, {}); - for (let i = 0; i < updatedManifest.components.length; i++) { - const currentComponent = updatedManifest.components[i]; - if (currentComponent.payload.path === 'root' || currentComponent.type === ResearchObjectComponentType.LINK) - continue; //skip data bucket and ext-links - const match = flatTreePathMap[currentComponent.payload.path]; - if (match) { - updatedManifest.components[i].payload.cid = match?.cid; - updatedManifest.components[i].payload.url = match?.cid; - } + let updatedManifest: ResearchObjectV1; + + try { + const response = await repoService.dispatchAction({ + uuid, + documentId: node.manifestDocumentId as DocumentId, + actions: [{ type: 'Rename Component Path', oldPath, newPath }], + }); + updatedManifest = response ? response.manifest : await getLatestManifestFromNode(node); + } catch (err) { + logger.error({ err }, '[Source]: Rename Component Path'); + updatedManifest = await getLatestManifestFromNode(node); } /* @@ -138,19 +129,18 @@ export const moveData = async (req: Request, res: Response { map[neutralizePath(ref.path)] = ref; return map; }, {}); const dataRefsToUpdate = newRefs.map((newRef) => { - const neutralizedNewRefPath = neutralizePath(newRef.path); // if paths are unchanged (unaffected by the move), their match is found in the line below - let match = existingRefMap[neutralizedNewRefPath]; + let match = existingRefMap[newRef.path]; if (!match) { // if paths are changed (affected by the move), their match should be found in the line below - const wouldBeOldPath = neutralizedNewRefPath.replace(newPath, oldPath); + const wouldBeOldPath = newRef.path.replace(newPath, oldPath); match = existingRefMap[wouldBeOldPath]; } if (match === undefined) { @@ -164,12 +154,12 @@ export const moveData = async (req: Request, res: Response { return prisma.dataReference.update({ where: { id: fd.id }, data: fd }); }), ]); - logger.info(`[DATA::Move] ${updates.length} dataReferences updated`); + logger.info(`[DATA::Move] ${dataRefUpdates.length} dataReferences updated`); const { persistedManifestCid } = await persistManifest({ manifest: updatedManifest, node, userId: owner.id }); if (!persistedManifestCid) @@ -177,27 +167,30 @@ export const moveData = async (req: Request, res: Response { - if (c.payload?.path.startsWith(oldPath + '/') || c.payload.path === oldPath) { - manifest.components[idx].payload.path = c.payload.path.replace(oldPath, newPath); - } - }); - return manifest; -} diff --git a/desci-server/src/controllers/data/rename.ts b/desci-server/src/controllers/data/rename.ts index 16f38c050..49c9bd80b 100644 --- a/desci-server/src/controllers/data/rename.ts +++ b/desci-server/src/controllers/data/rename.ts @@ -1,23 +1,17 @@ -import { - ResearchObjectComponentType, - ResearchObjectV1, - ResearchObjectV1Component, - isNodeRoot, - neutralizePath, - recursiveFlattenTree, -} from '@desci-labs/desci-models'; -import { DataType } from '@prisma/client'; +import { DocumentId } from '@automerge/automerge-repo'; +import { ResearchObjectV1, neutralizePath } from '@desci-labs/desci-models'; +import { DataType, Node } from '@prisma/client'; import { Request, Response } from 'express'; -import prisma from 'client'; -import parentLogger from 'logger'; -import { updateManifestDataBucket } from 'services/data/processing'; -import { getDirectoryTree, renameFileInDag } from 'services/ipfs'; -import { prepareDataRefs } from 'utils/dataRefTools'; -import { generateExternalCidMap, updateManifestComponentDagCids } from 'utils/driveUtils'; +import { prisma } from '../../client.js'; +import { logger as parentLogger } from '../../logger.js'; +import { ensureUniquePathsDraftTree, getLatestDriveTime } from '../../services/draftTrees.js'; +import { NodeUuid, getLatestManifestFromNode } from '../../services/manifestRepo.js'; +import repoService from '../../services/repoService.js'; +import { prepareDataRefsForDraftTrees } from '../../utils/dataRefTools.js'; -import { ErrorResponse } from './update'; -import { getLatestManifest, persistManifest, separateFileNameAndExtension } from './utils'; +import { ErrorResponse } from './update.js'; +import { persistManifest, separateFileNameAndExtension } from './utils.js'; interface RenameResponse { status?: number; @@ -29,7 +23,6 @@ export const renameData = async (req: Request, res: Response isNodeRoot(c)); + const latestManifest = await getLatestManifestFromNode(node); try { /* ** New name collision check */ - const externalCidMap = await generateExternalCidMap(node.uuid); - const oldFlatTree = recursiveFlattenTree(await getDirectoryTree(dataBucket.payload.cid, externalCidMap)); + // const externalCidMap = await generateExternalCidMap(node.uuid); + const contextPathSplit = path.split('/'); + contextPathSplit.pop(); + const contextPath = contextPathSplit.join('/'); + await ensureUniquePathsDraftTree({ nodeId: node.id, contextPath, filesBeingAdded: [{ originalname: newName }] }); + const oldPathSplit = path.split('/'); oldPathSplit.pop(); oldPathSplit.push(newName); const newPath = oldPathSplit.join('/'); - const hasDuplicates = oldFlatTree.some((oldBranch) => oldBranch.path.includes(newPath)); - if (hasDuplicates) { - logger.info('[DATA::Rename] Rejected as duplicate paths were found'); - return res.status(400).json({ error: 'Name collision' }); - } - - /* - ** Update in dag - */ - const splitContextPath = path.split('/'); - splitContextPath.shift(); //remove root - const linkToRename = splitContextPath.pop(); - const cleanContextPath = splitContextPath.join('/'); - logger.debug(`DATA::Rename cleanContextPath: ${cleanContextPath}, Renaming: ${linkToRename}, to : ${newName}`); - const { updatedDagCidMap, updatedRootCid } = await renameFileInDag( - dataBucket.payload.cid, - cleanContextPath, - linkToRename, - newName, - ); /* ** Updates old paths in the manifest component payloads to the new ones, updates the data bucket root CID and any DAG CIDs changed along the way */ - let updatedManifest = updateComponentPathsInManifest({ manifest: latestManifest, oldPath: path, newPath: newPath }); - updatedManifest = updateManifestDataBucket({ - manifest: updatedManifest, - newRootCid: updatedRootCid, + let updatedManifest = latestManifest; + try { + const response = await repoService.dispatchAction({ + uuid, + documentId: node.manifestDocumentId as DocumentId, + actions: [{ type: 'Rename Component Path', oldPath: path, newPath }], + }); + // dispatchChange({ type: 'Rename Component Path', oldPath: path, newPath }); + updatedManifest = response.manifest; + } catch (err) { + logger.error({ err }, 'Source: Rename Component Path'); + updatedManifest = await repoService.getDraftManifest(node.uuid as NodeUuid); + // return res.status(400).json({ error: 'failed' }); + } + + // Get all entries that need to be updated + const entriesToUpdate = await prisma.draftNodeTree.findMany({ + where: { + OR: [ + { nodeId: node.id, path: path }, + { nodeId: node.id, path: { startsWith: path + '/' } }, + ], + }, }); - if (Object.keys(updatedDagCidMap).length) { - updatedManifest = updateManifestComponentDagCids(updatedManifest, updatedDagCidMap); - } + // Update === with newPath, and .replace the ones that start with oldPath + "/" + const updateOperations = entriesToUpdate.map((entry) => { + const updatedPath = entry.path.startsWith(path + '/') ? entry.path.replace(path, newPath) : newPath; + + return prisma.draftNodeTree.update({ + where: { id: entry.id }, + data: { path: updatedPath }, + }); + }); + + const updatedEntries = await Promise.all(updateOperations); if (renameComponent) { - const componentIndex = updatedManifest.components.findIndex((c) => c.payload.path === newPath); + // If checkbox ticked to rename the component along with the filename, note: not used in capybara + // const componentIndex = updatedManifest.components.findIndex((c) => c.payload.path === newPath); const { fileName } = separateFileNameAndExtension(newName); - updatedManifest.components[componentIndex].name = fileName; + // updatedManifest.components[componentIndex].name = fileName; + try { + const response = await repoService.dispatchAction({ + uuid, + documentId: node.manifestDocumentId as DocumentId, + actions: [{ type: 'Rename Component', path: newPath, fileName }], + }); + // updatedManifest = await dispatchChange({ type: 'Rename Component', path: newPath, fileName }); + updatedManifest = response?.manifest; + } catch (err) { + logger.error({ err }, 'Source: Rename Component'); + updatedManifest = await repoService.getDraftManifest(node.uuid as NodeUuid); + } } + if (!updatedManifest) { + updatedManifest = await getLatestManifestFromNode(node); + } /* ** Prepare updated refs */ @@ -118,14 +135,14 @@ export const renameData = async (req: Request, res: Response { map[neutralizePath(ref.path)] = ref; return map; }, {}); + // const missingRefs = []; // for debugging const dataRefUpdates = newRefs.map((newRef) => { const neutralNewPath = neutralizePath(newRef.path); let match = existingRefMap[neutralNewPath]; // covers path unchanged refs @@ -137,6 +154,7 @@ export const renameData = async (req: Request, res: Response { - if (c.payload?.path.startsWith(oldPath + '/') || c.payload.path === oldPath) { - manifest.components[idx].payload.path = c.payload.path.replace(oldPath, newPath); - } - }); - return manifest; -} diff --git a/desci-server/src/controllers/data/researchFields.ts b/desci-server/src/controllers/data/researchFields.ts index f7670c908..11f2ddee7 100644 --- a/desci-server/src/controllers/data/researchFields.ts +++ b/desci-server/src/controllers/data/researchFields.ts @@ -1,7 +1,7 @@ import { ResearchFields } from '@prisma/client'; import { Request, Response, NextFunction } from 'express'; -import prisma from 'client'; +import { prisma } from '../../client.js'; const cache = {}; diff --git a/desci-server/src/controllers/data/retrieve.ts b/desci-server/src/controllers/data/retrieve.ts index 2d5f58760..f175d195e 100644 --- a/desci-server/src/controllers/data/retrieve.ts +++ b/desci-server/src/controllers/data/retrieve.ts @@ -8,15 +8,16 @@ import { Request, Response, NextFunction } from 'express'; import mkdirp from 'mkdirp'; import tar from 'tar'; -import prisma from 'client'; -import { cleanupManifestUrl } from 'controllers/nodes'; -import parentLogger from 'logger'; -import redisClient, { getOrCache } from 'redisClient'; -import { getDatasetTar } from 'services/ipfs'; -import { getTreeAndFill, getTreeAndFillDeprecated } from 'utils/driveUtils'; +import { prisma } from '../../client.js'; +import { logger as parentLogger } from '../../logger.js'; +import redisClient, { getOrCache } from '../../redisClient.js'; +import { getDatasetTar } from '../../services/ipfs.js'; +import { getLatestManifestFromNode } from '../../services/manifestRepo.js'; +import { getTreeAndFill, getTreeAndFillDeprecated } from '../../utils/driveUtils.js'; +import { cleanupManifestUrl } from '../../utils/manifest.js'; -import { ErrorResponse } from './update'; -import { getLatestManifest } from './utils'; +import { ErrorResponse } from './update.js'; +// import { getLatestManifest } from './utils.js'; export enum DataReferenceSrc { PRIVATE = 'private', @@ -124,46 +125,25 @@ export const retrieveTree = async (req: Request, res: Response await getTreeAndFill(manifest, uuid, ownerId), - ); - if (!filledTree) throw new Error('[retrieveTree] Failed to retrieve tree from cache'); - } catch (err) { - logger.warn({ fn: 'retrieveTree', err }, '[retrieveTree] error'); - logger.info('[retrieveTree] Falling back on uncached tree retrieval'); - filledTree = await getTreeAndFill(manifest, uuid, ownerId); - } + const manifest = await getLatestManifestFromNode(node); + const filledTree = (await getTreeAndFill(manifest, uuid, ownerId)) ?? []; - const depthTree = await getOrCache(depthCacheKey, async () => { - const tree = findAndPruneNode(filledTree[0], dataPath, depth); + let tree = findAndPruneNode(filledTree[0], dataPath, depth); if (tree?.type === 'file' || tree === undefined) { + // Logic to avoid returning files, if a file is the path requested, it returns its parent //tree can result in undefined if the dag link was recently renamed const poppedDataPath = dataPath.substring(0, dataPath.lastIndexOf('/')); - return findAndPruneNode(filledTree[0], poppedDataPath, depth); - } else { - return tree; + tree = findAndPruneNode(filledTree[0], poppedDataPath, depth); } - }); - return res.status(200).json({ tree: [depthTree], date: dataset?.updatedAt.toString() }); + return res.status(200).json({ tree: [tree], date: dataset?.updatedAt.toString() }); + } catch (err) { + logger.error({ err }, 'Failed to retrieve tree'); + return res.status(400).json({ error: 'failed' }); + } }; interface PubTreeResponse { diff --git a/desci-server/src/controllers/data/update.ts b/desci-server/src/controllers/data/update.ts index ddbb3ade7..447442b27 100644 --- a/desci-server/src/controllers/data/update.ts +++ b/desci-server/src/controllers/data/update.ts @@ -1,67 +1,16 @@ -import fs from 'fs'; - -import { - neutralizePath, - recursiveFlattenTree, - ResearchObjectComponentType, - ResearchObjectV1, - DriveObject, - DrivePath, -} from '@desci-labs/desci-models'; -import { User } from '@prisma/client'; -import axios from 'axios'; +import { ResearchObjectV1, DriveObject } from '@desci-labs/desci-models'; import { Response } from 'express'; -import { rimraf } from 'rimraf'; - -import prisma from 'client'; -import parentLogger from 'logger'; -import { AuthedRequest } from 'middleware/ensureWriteAccess'; -import { processExternalUrlDataToIpfs } from 'services/data/externalUrlProcessing'; -import { - cleanupDanglingRefs, - extractRootDagCidFromManifest, - filterFirstNestings, - getManifestFromNode, - handleCleanupOnMidProcessingError, - processNewFolder, - processS3DataToIpfs, - updateDataReferences, - updateManifestDataBucket, -} from 'services/data/processing'; -import { hasAvailableDataUsageForUpload } from 'services/dataService'; -import { - addDirToIpfs, - addFilesToDag, - getDirectoryTree, - IpfsDirStructuredInput, - IpfsPinnedResult, - pinDirectory, - RecursiveLsResult, -} from 'services/ipfs'; -import { fetchFileStreamFromS3, isS3Configured } from 'services/s3'; -import { - arrayXor, - calculateTotalZipUncompressedSize, - extractZipFileAndCleanup, - processExternalUrls, - saveZipStreamToDisk, - zipUrlToStream, -} from 'utils'; -import { - FirstNestingComponent, - addComponentsToManifest, - generateExternalCidMap, - generateManifestPathsToDbTypeMap, - getTreeAndFill, - updateManifestComponentDagCids, -} from 'utils/driveUtils'; - -import { persistManifest } from './utils'; -const TEMP_REPO_ZIP_PATH = './repo-tmp'; +import { prisma } from '../../client.js'; +import { logger as parentLogger } from '../../logger.js'; +import { RequestWithNode } from '../../middleware/authorisation.js'; +import { processExternalUrlDataToIpfs } from '../../services/data/externalUrlProcessing.js'; +import { processNewFolder, processS3DataToIpfs } from '../../services/data/processing.js'; +import { IpfsPinnedResult } from '../../services/ipfs.js'; +import { arrayXor } from '../../utils.js'; export interface UpdateResponse { status?: number; - rootDataCid: string; + rootDataCid?: string; manifest: ResearchObjectV1; manifestCid: string; tree: DriveObject[]; @@ -73,10 +22,10 @@ export interface ErrorResponse { status?: number; } -export const update = async (req: AuthedRequest, res: Response) => { +export const update = async (req: RequestWithNode, res: Response) => { const owner = req.user; let node = req.node; - const { uuid, manifest, contextPath, componentType, componentSubtype, newFolderName } = req.body; + const { uuid, manifest: draftManifest, contextPath, componentType, componentSubtype, newFolderName } = req.body; // temp workaround for non-file uploads if (!node) { @@ -96,7 +45,7 @@ export const update = async (req: AuthedRequest, res: Response (uploadSizeBytes += f.size)); - if (externalUrl) uploadSizeBytes += externalUrlTotalSizeBytes; - const hasStorageSpaceToUpload = await hasAvailableDataUsageForUpload(owner, { fileSizeBytes: uploadSizeBytes }); - if (!hasStorageSpaceToUpload) - return res.status(400).json({ - error: `upload size of ${uploadSizeBytes} exceeds users data budget of ${owner.currentDriveStorageLimitGb} GB`, - }); - - //Pull old tree - const externalCidMap = await generateExternalCidMap(node.uuid); - const oldFlatTree = recursiveFlattenTree(await getDirectoryTree(rootCid, externalCidMap)) as RecursiveLsResult[]; - oldFlatTree.push({ cid: rootCid, path: rootCid, name: 'Old Root Dir', type: 'dir', size: 0 }); - - /* - ** Check if update path contains externals, disable adding to external DAGs - */ - const pathMatch = (oldFlatTree as RecursiveLsResult[]).find((c) => { - const neutralPath = neutralizePath(c.path); - return neutralPath === contextPath; - }); - if (pathMatch?.external) return res.status(400).json({ error: 'Cannot update externally added directories' }); - - /* - ** Determine the path of the directory to be updated - */ - const splitContextPath = contextPath.split('/'); - splitContextPath.shift(); - //cleanContextPath = how many dags need to be reset, n + 1 - const cleanContextPath = splitContextPath.join('/'); - logger.debug('[UPDATE DATASET] cleanContextPath: ', cleanContextPath); - - //ensure all paths are unique to prevent borking datasets, reject if fails unique check - const oldTreePathsMap: Record = oldFlatTree.reduce((map, branch) => { - map[neutralizePath(branch.path)] = branch; - return map; - }, {}); - - let newPathsFormatted: string[] = []; - const header = !!cleanContextPath ? rootCid + '/' + cleanContextPath : rootCid; - if (files.length) { - newPathsFormatted = files.map((f) => { - if (f.originalname[0] !== '/') f.originalname = '/' + f.originalname; - return header + f.originalname; - }); - } - if (externalUrl) { - if (externalUrlFiles?.length > 0) { - newPathsFormatted = externalUrlFiles.map((f) => { - return header + '/' + f.path; - }); - } - - // Code repo, add repo dir path - if (zipPath.length > 0) { - newPathsFormatted = [header + '/' + externalUrl.path]; - } else { - } - } - - if (newFolderName) { - newPathsFormatted = [header + '/' + newFolderName]; - } - const hasDuplicates = newPathsFormatted.some((newPath) => newPath in oldTreePathsMap); - if (hasDuplicates) { - logger.info('[UPDATE DATASET] Rejected as duplicate paths were found'); - return res.status(400).json({ error: 'Duplicate files rejected' }); - } - - //Pin the new files - const structuredFilesForPinning: IpfsDirStructuredInput[] = await Promise.all( - files.map(async (f: any) => { - if (isS3Configured) { - const fileStream = await fetchFileStreamFromS3(f.key); - return { path: f.originalname, content: fileStream }; - } - return { path: f.originalname, content: f.buffer }; - }), - ); - - if (structuredFilesForPinning.length || externalUrlFiles?.length) { - const filesToPin = structuredFilesForPinning.length ? structuredFilesForPinning : externalUrlFiles; - if (filesToPin.length) uploaded = await pinDirectory(filesToPin); - if (!uploaded.length) return res.status(400).json({ error: 'Failed uploading to ipfs' }); - logger.info('[UPDATE DATASET] Pinned files: ', uploaded.length); - } - - // Pin the zip file (CODE REPO) - if (zipPath.length > 0) { - const outputPath = zipPath.replace('.zip', ''); - logger.debug({ outputPath }, 'Starting unzipping to output directory'); - await extractZipFileAndCleanup(zipPath, outputPath); - logger.debug({ outputPath }, 'extraction complete, starting pinning'); - const pinResult = await addDirToIpfs(outputPath); - - // Overrides the path name of the root directory - pinResult[pinResult.length - 1].path = externalUrl.path; - uploaded = pinResult; - - // Cleanup - await rimraf(outputPath); - } - - //New folder creation, add to uploaded - if (newFolderName) { - const newFolder = await pinDirectory([{ path: newFolderName + '/.nodeKeep', content: Buffer.from('') }]); - if (!newFolder.length) return res.status(400).json({ error: 'Failed creating new folder' }); - uploaded = newFolder; - } - - /* - ** Add files to dag, get new root cid - */ - //Filtered to first nestings only - const { filesToAddToDag, filteredFiles } = filterFirstNestings(uploaded); - - const { updatedRootCid: newRootCidString, updatedDagCidMap } = await addFilesToDag( - rootCid, - cleanContextPath, - filesToAddToDag, - ); - if (typeof newRootCidString !== 'string') throw Error('DAG extension failed, files already pinned'); - - //repull of node required, previous manifestUrl may already be stale - const ltsNode = await prisma.node.findFirst({ - where: { - ownerId: owner.id, - uuid: node.uuid, - }, - }); - - const { manifest: latestManifest } = await getManifestFromNode(ltsNode); - - let updatedManifest = updateManifestDataBucket({ - manifest: latestManifest, - newRootCid: newRootCidString, - }); - - //Update all existing DAG components with new CIDs if they were apart of a cascading update - if (Object.keys(updatedDagCidMap).length) { - updatedManifest = updateManifestComponentDagCids(updatedManifest, updatedDagCidMap); - } - - //Only needs to happen if a predefined component type is to be added - if (componentType) { - const firstNestingComponents: FirstNestingComponent[] = filteredFiles.map((file) => { - const neutralFullPath = contextPath + '/' + file.path; - const pathSplit = file.path.split('/'); - const name = pathSplit.pop(); - return { - name: name, - path: neutralFullPath, - cid: file.cid, - componentType, - componentSubtype, - star: true, - ...(externalUrl && { externalUrl: externalUrl.url }), - }; - }); - updatedManifest = addComponentsToManifest(updatedManifest, firstNestingComponents); - } - - // //For adding correct types to the db, when a predefined component type is used **PROBABLY NO LONGER NEEDED WITH prepareDataRefs()** - // const newFilePathDbTypeMap = {}; - // uploaded.forEach((file: IpfsPinnedResult) => { - // const neutralFullPath = contextPath + '/' + file.path; - // const deneutralizedFullPath = deneutralizePath(neutralFullPath, newRootCidString); - // newFilePathDbTypeMap[deneutralizedFullPath] = ROTypesToPrismaTypes[componentType] || DataType.UNKNOWN; - // }); - - try { - const upserts = await updateDataReferences({ - node: ltsNode, - user: owner, - updatedManifest, - newRootCidString, - externalCidMap, - }); - - if (upserts) logger.info(`${upserts.length} new data references added/modified`); - - // //CLEANUP DANGLING REFERENCES// - const pruneRes = await cleanupDanglingRefs({ - newRootCidString, - externalCidMap, - oldTreePathsMap, - manifestPathsToDbComponentTypesMap: manifestPathsToTypesPrune, - node, - user: owner as User, - }); - logger.info(`[PRUNING] ${pruneRes.count} cidPruneList entries added.`); - //END OF CLEAN UP// - - const { persistedManifestCid, date } = await persistManifest({ manifest: updatedManifest, node, userId: owner.id }); - if (!persistedManifestCid) - throw Error(`Failed to persist manifest: ${updatedManifest}, node: ${node}, userId: ${owner.id}`); - - const tree = await getTreeAndFill(updatedManifest, uuid, owner.id); - return res.status(200).json({ - rootDataCid: newRootCidString, - manifest: updatedManifest, - manifestCid: persistedManifestCid, - tree: tree, - date: date, - }); - } catch (e: any) { - logger.error(`[UPDATE DATASET] error: ${e}`); - if (uploaded.length) { - handleCleanupOnMidProcessingError({ - pinnedFiles: uploaded, - manifestPathsToDbComponentTypesMap: manifestPathsToTypesPrune, - node, - user: owner, - }); - } - return res.status(400).json({ error: 'failed #1' }); - } + return res.status(400).json({ status: 400, error: 'invalid API params' }); }; diff --git a/desci-server/src/controllers/data/updateExternalCid.ts b/desci-server/src/controllers/data/updateExternalCid.ts index 834706b00..40720c664 100644 --- a/desci-server/src/controllers/data/updateExternalCid.ts +++ b/desci-server/src/controllers/data/updateExternalCid.ts @@ -1,50 +1,16 @@ -import { - IpfsPinnedResult, - RecursiveLsResult, - ResearchObjectComponentType, - deneutralizePath, - isNodeRoot, - neutralizePath, - recursiveFlattenTree, -} from '@desci-labs/desci-models'; -import { DataType, User } from '@prisma/client'; -import axios from 'axios'; +import { User } from '@prisma/client'; import { Response, Request } from 'express'; -import prisma from 'client'; -import { cleanupManifestUrl } from 'controllers/nodes'; -import parentLogger from 'logger'; -import { updateManifestDataBucket } from 'services/data/processing'; -import { - FilesToAddToDag, - GetExternalSizeAndTypeResult, - addFilesToDag, - convertToCidV1, - getDirectoryTree, - getExternalCidSizeAndType, - isDir, - pinExternalDags, - pubRecursiveLs, -} from 'services/ipfs'; -import { prepareDataRefs, prepareDataRefsExternalCids } from 'utils/dataRefTools'; -import { - FirstNestingComponent, - ROTypesToPrismaTypes, - addComponentsToManifest, - generateExternalCidMap, - generateManifestPathsToDbTypeMap, - getTreeAndFill, - inheritComponentType, - updateManifestComponentDagCids, -} from 'utils/driveUtils'; +import { prisma } from '../../client.js'; +import { logger as parentLogger } from '../../logger.js'; +import { processExternalCidDataToIpfs } from '../../services/data/externalCidProcessing.js'; -import { ErrorResponse, UpdateResponse } from './update'; -import { persistManifest } from './utils'; +import { ErrorResponse, UpdateResponse } from './update.js'; export const updateExternalCid = async (req: Request, res: Response) => { const owner = (req as any).user as User; const { uuid, contextPath, componentType, componentSubtype } = req.body; - let { externalCids } = req.body; + const { externalCids } = req.body; const logger = parentLogger.child({ // id: req.id, @@ -58,8 +24,8 @@ export const updateExternalCid = async (req: Request, res: Response neutralizePath(extDag.path) === contextPath); - - const cidTypesSizes: Record = {}; - if (externalCids && externalCids.length) { - try { - externalCids = externalCids.map((extCid) => ({ ...extCid, cid: convertToCidV1(extCid.cid) })); - for (const extCid of externalCids) { - const { isDirectory, size } = await getExternalCidSizeAndType(extCid.cid); - if (size !== undefined && isDirectory !== undefined) { - cidTypesSizes[extCid.cid] = { size, isDirectory }; - } else { - throw new Error(`Failed to get size and type of external CID: ${extCid}`); - } - } - } catch (e: any) { - logger.warn(`[UPDATE DAG] External CID Method: ${e}`); - return res.status(400).json({ error: 'Failed to resolve external CID' }); - } - } - - //finding rootCid, used for cleanup later - const manifestCidEntry = node.manifestUrl || node.cid; - const manifestUrlEntry = manifestCidEntry - ? cleanupManifestUrl(manifestCidEntry as string, req.query?.g as string) - : null; - - const fetchedManifestEntry = manifestUrlEntry ? await (await axios.get(manifestUrlEntry)).data : null; - const latestManifestEntry = fetchedManifestEntry; - const rootCid = latestManifestEntry.components.find((c) => isNodeRoot(c)).payload.cid; - - const manifestPathsToTypesPrune = generateManifestPathsToDbTypeMap(latestManifestEntry); - - //Pull old tree - const externalCidMap = await generateExternalCidMap(node.uuid); - const oldFlatTree = recursiveFlattenTree(await getDirectoryTree(rootCid, externalCidMap)) as RecursiveLsResult[]; - - /* - ** Determine the path of the directory to be updated - */ - const splitContextPath = contextPath.split('/'); - splitContextPath.shift(); - //cleanContextPath = how many dags need to be reset, n + 1 - const cleanContextPath = splitContextPath.join('/'); - logger.debug('[UPDATE DATASET] cleanContextPath: ', cleanContextPath); - - /* - ** UNIQUENESS CHECK, NO DUPLICATE PATHS - */ - const OldTreePaths = oldFlatTree.map((e) => e.path); - let newPathsFormatted: string[] = []; - const header = !!cleanContextPath ? rootCid + '/' + cleanContextPath : rootCid; - - if (externalCids?.length && Object.keys(cidTypesSizes)?.length) { - newPathsFormatted = externalCids.map((extCid) => header + '/' + extCid.name); - } - - const hasDuplicates = OldTreePaths.some((oldPath) => newPathsFormatted.includes(oldPath)); - if (hasDuplicates) { - logger.info('[UPDATE DATASET] Rejected as duplicate paths were found'); - return res.status(400).json({ error: 'Duplicate files rejected' }); - } - - //[EXTERNAL CIDS] If External Cids used, add to uploaded, and add to externalCidMap, also add to externalDagsToPin - /* - ** PIN THE DAGS - */ - let uploaded = []; - const externalDagsToPin = []; - if (externalCids?.length && Object.keys(cidTypesSizes)?.length) { - uploaded = []; - for await (const extCid of externalCids) { - const { size, isDirectory } = cidTypesSizes[extCid.cid]; - - // if file, may need to omit from being added to extCidMap - externalCidMap[extCid.cid] = { size, directory: isDirectory, path: extCid.name }; - if (isDirectory) { - //Get external dag tree, add to external dag pin list - let tree: RecursiveLsResult[]; - try { - tree = await pubRecursiveLs(extCid.cid, extCid.name); - } catch (e) { - logger.info( - { extCid }, - '[UPDATE DATASET] External DAG tree resolution failed, the contents within the DAG were unable to be retrieved, rejecting update.', - ); - return res - .status(400) - .json({ error: 'Failed resolving external dag tree, the DAG or its contents were unable to be retrieved' }); - } - const flatTree = recursiveFlattenTree(tree); - (flatTree as RecursiveLsResult[]).forEach((file: RecursiveLsResult) => { - cidTypesSizes[file.cid] = { size: file.size, isDirectory: file.type === 'dir' }; - if (file.type === 'dir') { - externalDagsToPin.push(file.cid); - uploaded.push({ path: file.path, cid: file.cid, size: file.size }); - externalCidMap[file.cid] = { size: file.size, directory: file.type === 'dir', path: file.path }; - } - }); - // debugger; - externalDagsToPin.push(extCid.cid); - } - uploaded.push({ - path: extCid.name, - cid: extCid.cid, - size: size, - }); - } - } - //pin exteralDagsToPin - let externalDagsPinned = []; - if (externalDagsToPin.length) { - externalDagsPinned = await pinExternalDags(externalDagsToPin); - } - - /* - ** Add files to dag, get new root cid - */ - //Filtered to first nestings only - const filteredFiles = uploaded.filter((file) => { - return file.path.split('/').length === 1; - }); - - const filesToAddToDag: FilesToAddToDag = {}; - filteredFiles.forEach((file) => { - filesToAddToDag[file.path] = { cid: file.cid, size: file.size }; - }); - - const { updatedRootCid: newRootCidString, updatedDagCidMap } = await addFilesToDag( - rootCid, - cleanContextPath, - filesToAddToDag, - ); - if (typeof newRootCidString !== 'string') throw Error('DAG extension failed, files already pinned'); - - //repull of node required, previous manifestUrl may already be stale - const ltsNode = await prisma.node.findFirst({ - where: { - ownerId: owner.id, - uuid: node.uuid, - }, - }); - - const latestManifestCid = ltsNode.manifestUrl || ltsNode.cid; - const manifestUrl = latestManifestCid - ? cleanupManifestUrl(latestManifestCid as string, req.query?.g as string) - : null; - - // debugger; - - const fetchedManifest = manifestUrl ? await (await axios.get(manifestUrl)).data : null; - const latestManifest = fetchedManifest; - - const dataBucketId = latestManifest.components.find((c) => isNodeRoot(c)).id; - - let updatedManifest = updateManifestDataBucket({ - manifest: latestManifest, - newRootCid: newRootCidString, - }); - - //Update all existing DAG components with new CIDs if they were apart of a cascading update - /* - ** Might be unnecessary in ext-cid only update - */ - if (Object.keys(updatedDagCidMap).length) { - updatedManifest = updateManifestComponentDagCids(updatedManifest, updatedDagCidMap); - } - - //Only needs to happen if a predefined component type is to be added - if (componentType) { - const firstNestingComponents: FirstNestingComponent[] = filteredFiles.map((file) => { - const neutralFullPath = contextPath + '/' + file.path; - const pathSplit = file.path.split('/'); - const name = pathSplit.pop(); - return { - name: name, - path: neutralFullPath, - cid: file.cid, - componentType, - componentSubtype, - star: true, - }; - }); - updatedManifest = addComponentsToManifest(updatedManifest, firstNestingComponents); - } - - logger.debug('ADDING CORRECT TYPES'); - //For adding correct types to the db, when a predefined component type is used - const newFilePathDbTypeMap = {}; - const externalPathsAdded = {}; - const hasCidTypeSizes = Object.keys(cidTypesSizes)?.length; - uploaded.forEach((file: IpfsPinnedResult) => { - const neutralFullPath = contextPath + '/' + file.path; - const deneutralizedFullPath = deneutralizePath(neutralFullPath, newRootCidString); - newFilePathDbTypeMap[deneutralizedFullPath] = ROTypesToPrismaTypes[componentType] || DataType.UNKNOWN; - if (hasCidTypeSizes) externalPathsAdded[deneutralizedFullPath] = true; + const { ok, value } = await processExternalCidDataToIpfs({ + user: owner, + node, + externalCids, + contextPath, + // componentType, + // componentSubtype, }); - - try { - //Update refs - logger.debug('Preparing data refs'); - - const newRefs = await prepareDataRefsExternalCids( - node.uuid, - updatedManifest, - newRootCidString, - false, - externalCidMap, - ); - logger.debug('Completed preparing data refs'); - - //existing refs - const existingRefs = await prisma.dataReference.findMany({ - where: { - nodeId: node.id, - userId: owner.id, - type: { not: DataType.MANIFEST }, - }, - }); - - // setup refs, matching existing ones with their id, and marking external ones - const refs = newRefs.map((ref) => { - // add id's if exists - const existingRef = existingRefs.find((r) => neutralizePath(r.path) === neutralizePath(ref.path)); - if (existingRef) ref.id = existingRef.id; - - // handle externals (may be needed) - const extTypeAndSize = externalCidMap[ref.cid]; - if (extTypeAndSize) { - ref.directory = extTypeAndSize.directory; - ref.external = true; - } - return ref; - }); - - const dataRefCreates = []; - const dataRefUpdates = refs.filter((ref) => { - const isUpdate = 'id' in ref; - if (!isUpdate) dataRefCreates.push(ref); - return isUpdate; - }); - - const upserts = await prisma.$transaction([ - ...(dataRefUpdates as any).map((fd) => { - return prisma.dataReference.update({ where: { id: fd.id }, data: fd }); - }), - prisma.dataReference.createMany({ data: dataRefCreates }), - ]); - if (upserts) logger.info(`${upserts.length} new data references added/modified`); - - // //CLEANUP DANGLING REFERENCES// - oldFlatTree.push({ cid: rootCid, path: rootCid, name: 'Old Root Dir', type: 'dir', size: 0 }); - - logger.debug('Before retrieving new tree'); - - const flatTree = recursiveFlattenTree( - await getDirectoryTree(newRootCidString, externalCidMap), - ) as RecursiveLsResult[]; - flatTree.push({ - name: 'root', - cid: newRootCidString, - type: 'dir', - path: newRootCidString, - size: 0, - }); - - logger.debug('After retrieving new tree'); - - //length should be n + 1, n being nested dirs modified + rootCid - const pruneList = (oldFlatTree as RecursiveLsResult[]).filter((oldF) => { - //a path match && a CID difference = prune - return flatTree.some((newF) => neutralizePath(oldF.path) === neutralizePath(newF.path) && oldF.cid !== newF.cid); - }); - - const formattedPruneList = pruneList.map((e) => { - const neutralPath = neutralizePath(e.path); - return { - description: 'DANGLING DAG, UPDATED DATASET (update v2)', - cid: e.cid, - type: inheritComponentType(neutralPath, manifestPathsToTypesPrune) || DataType.UNKNOWN, - size: 0, //only dags being removed in an update op - nodeId: node.id, - userId: owner.id, - directory: e.type === 'dir' ? true : false, - }; - }); - - const pruneRes = await prisma.cidPruneList.createMany({ data: formattedPruneList }); - logger.info(`[PRUNING] ${pruneRes.count} cidPruneList entries added.`); - //END OF CLEAN UP// - const { persistedManifestCid, date } = await persistManifest({ manifest: updatedManifest, node, userId: owner.id }); - if (!persistedManifestCid) - throw Error(`Failed to persist manifest: ${updatedManifest}, node: ${node}, userId: ${owner.id}`); - - const tree = await getTreeAndFill(updatedManifest, uuid, owner.id); + debugger; + if (ok) { + const { + manifest: updatedManifest, + manifestCid: persistedManifestCid, + tree: tree, + date: date, + } = value as UpdateResponse; return res.status(200).json({ - rootDataCid: newRootCidString, manifest: updatedManifest, manifestCid: persistedManifestCid, tree: tree, date: date, }); - } catch (e: any) { - logger.error(`[UPDATE DATASET] error: ${e}`); - if (uploaded.length || externalDagsPinned.length) { - logger.error( - { filesPinned: uploaded, externalDagsPinned }, - `[UPDATE DATASET E:2] CRITICAL! FILES PINNED, DB ADD FAILED`, - ); - const formattedPruneList = uploaded.map(async (e) => { - const neutralPath = neutralizePath(e.path); - return { - description: '[UPDATE DATASET E:2] FILES PINNED WITH DB ENTRY FAILURE (update v2)', - cid: e.cid, - type: inheritComponentType(neutralPath, manifestPathsToTypesPrune) || DataType.UNKNOWN, - size: e.size || 0, - nodeId: node.id, - userId: owner.id, - directory: await isDir(e.cid), - }; - }); - externalDagsPinned.forEach((extDagCid) => { - const extTypeAndSize = externalCidMap[extDagCid]; - formattedPruneList.push({ - description: '[UPDATE DATASET E:2] FILES PINNED WITH DB ENTRY FAILURE (update v2)', - cid: extDagCid, - type: DataType.UNKNOWN, - size: extTypeAndSize?.size || 0, - nodeId: node.id, - userId: owner.id, - directory: extTypeAndSize.directory, - } as any); - }); - const prunedEntries = await prisma.cidPruneList.createMany({ data: await Promise.all(formattedPruneList) }); - if (prunedEntries.count) { - logger.info({ prunedEntries }, `[UPDATE DATASET E:2] ${prunedEntries.count} ADDED FILES TO PRUNE LIST`); - } else { - logger.error(`[UPDATE DATASET E:2] failed adding files to prunelist, db may be down`); - } - } - return res.status(400).json({ error: 'failed #1' }); + } else { + logger.error({ value }, 'ext-cid processing error occured'); + if (!('message' in value)) return res.status(500); + return res.status(value.status).json({ status: value.status, error: value.message }); } - - return res.status(400); }; diff --git a/desci-server/src/controllers/data/utils.ts b/desci-server/src/controllers/data/utils.ts index afc788514..fe90da8f7 100644 --- a/desci-server/src/controllers/data/utils.ts +++ b/desci-server/src/controllers/data/utils.ts @@ -1,12 +1,12 @@ -import { DataComponent, DrivePath, ResearchObjectComponentType, ResearchObjectV1 } from '@desci-labs/desci-models'; +import { DataComponent, ResearchObjectComponentType, ResearchObjectV1 } from '@desci-labs/desci-models'; import { Node } from '@prisma/client'; import axios from 'axios'; import { v4 as uuid } from 'uuid'; -import prisma from 'client'; -import { cleanupManifestUrl } from 'controllers/nodes'; -import parentLogger from 'logger'; -import { updateManifestAndAddToIpfs } from 'services/ipfs'; +import { prisma } from '../../client.js'; +import { logger as parentLogger } from '../../logger.js'; +import { updateManifestAndAddToIpfs } from '../../services/ipfs.js'; +import { cleanupManifestUrl } from '../../utils/manifest.js'; const logger = parentLogger.child({ module: 'DATA::Utils', @@ -86,6 +86,12 @@ export async function getLatestManifest( return manifestUrl ? await (await axios.get(manifestUrl)).data : null; } +export async function getLatestManifestFromRepo(uuid: string): Promise { + // todo: retrieve documentId from uuid and call repo.find to get latest document manifest; + + return null; +} + export function separateFileNameAndExtension(fileName: string): { fileName: string; extension?: string; diff --git a/desci-server/src/controllers/log/index.ts b/desci-server/src/controllers/log/index.ts index 3416fd795..e45fbbee6 100644 --- a/desci-server/src/controllers/log/index.ts +++ b/desci-server/src/controllers/log/index.ts @@ -1 +1 @@ -export * from './userAction'; +export * from './userAction.js'; diff --git a/desci-server/src/controllers/log/userAction.ts b/desci-server/src/controllers/log/userAction.ts index 85bb42bc5..b62eb9c80 100644 --- a/desci-server/src/controllers/log/userAction.ts +++ b/desci-server/src/controllers/log/userAction.ts @@ -1,8 +1,8 @@ import { ActionType, User } from '@prisma/client'; import { Request, Response, NextFunction } from 'express'; -import logger from 'logger'; -import { saveInteraction } from 'services/interactionLog'; +import { logger } from '../../logger.js'; +import { saveInteraction } from '../../services/interactionLog.js'; /** * TODO: Put this in desci-models? diff --git a/desci-server/src/controllers/nodes-mirror/test.ts b/desci-server/src/controllers/nodes-mirror/test.ts index fdec746e4..96c8e6676 100755 --- a/desci-server/src/controllers/nodes-mirror/test.ts +++ b/desci-server/src/controllers/nodes-mirror/test.ts @@ -1,23 +1,19 @@ +import { Request, Response, NextFunction } from 'express'; import grpc from 'grpc'; // import * as Mirror from 'desci-nodes-mirror/mirror/v1/mirror_grpc_pb'; -import { Request, Response, NextFunction } from 'express'; // import { EnqueueRequest, RemoteFile } from 'desci-nodes-mirror/mirror/v1/mirror_pb'; export const test = async (req: Request, res: Response, next: NextFunction) => { // const client = new Mirror.MirrorServiceClient('0.0.0.0:8080', grpc.credentials.createInsecure()); - // const request = new EnqueueRequest(); // const f = new RemoteFile(); // f.setUrl('https://arxiv.org/pdf/2203.03614.pdf'); // request.addFiles(f); - // const handle = (result: any, b: any) => { // console.log('RESULT'); // console.log(result); - // res.send({ ok: 1, result, b }); // }; - // try { // console.log("ENQUEUE"); // client.enqueue(request, null, handle); diff --git a/desci-server/src/controllers/nodes/consent.ts b/desci-server/src/controllers/nodes/consent.ts index 3f5a70f8e..308b52114 100644 --- a/desci-server/src/controllers/nodes/consent.ts +++ b/desci-server/src/controllers/nodes/consent.ts @@ -1,8 +1,7 @@ import { ActionType } from '@prisma/client'; import { Request, Response, NextFunction } from 'express'; -import prisma from 'client'; -import { getUserConsent, saveInteraction } from 'services/interactionLog'; +import { getUserConsent, saveInteraction } from '../../services/interactionLog.js'; export const consent = async (req: Request, res: Response, next: NextFunction) => { const user = (req as any).user; diff --git a/desci-server/src/controllers/nodes/documents.ts b/desci-server/src/controllers/nodes/documents.ts new file mode 100644 index 000000000..91e99de22 --- /dev/null +++ b/desci-server/src/controllers/nodes/documents.ts @@ -0,0 +1,90 @@ +import { Response } from 'express'; + +import { prisma } from '../../client.js'; +import { logger } from '../../logger.js'; +import { RequestWithNode } from '../../middleware/authorisation.js'; +import { NodeUuid } from '../../services/manifestRepo.js'; +import repoService from '../../services/repoService.js'; +import { getLatestManifest } from '../data/utils.js'; +// import { ResearchObjectDocument } from '../../types/documents.js'; +// import { backendRepo } from '../../repo.js'; + +export const getNodeDocument = async function (req: RequestWithNode, response: Response) { + try { + logger.info({ userId: req.user.id, uuid: req.node.uuid }, '[START] GetNodeDocument'); + // response.status(403).send({ ok: false, message: 'This api is deprecated' }); + // const repo = backendRepo; + + const node = req.node; + + const manifest = await getLatestManifest(node.uuid, req.query?.g as string, node); + + if (!node.manifestDocumentId) { + const result = await repoService.initDraftDocument({ uuid: node.uuid, manifest }); + + if (!result) { + logger.error({ result, uuid: node.uuid }, 'Automerge document Creation Error'); + response.status(400).send({ ok: false, message: 'Could not intialize new draft document' }); + return; + } + + await prisma.node.update({ where: { id: node.id }, data: { manifestDocumentId: result.documentId } }); + + response.status(200).send({ documentId: result.document, document: result.document }); + } else { + const document = await repoService.getDraftDocument({ uuid: node.uuid as NodeUuid }); + response.status(200).send({ documentId: node.manifestDocumentId, document }); + } + // if (!documentId || documentId == '') { + // logger.info({ uuid, query: req?.query?.g, node }, 'Before GetLatestManifest'); + // const manifest = await getLatestManifest(uuid, req.query?.g as string, node); + // logger.info({ uuid, manifest }, 'Node latest manifest'); + + // if (!manifest) { + // response.status(500).send({ ok: false, message: 'Error pulling node manifest' }); + // return; + // } + + // // Object.assign({}, researchObject) as ResearchObjectV1; // todo: pull latest draft manifest + // const handle = repo.create(); + // logger.info({ manifest, doc: handle.documentId }, 'Create new document'); + // handle.change( + // (document) => { + // document.manifest = manifest; + // document.uuid = uuid; + // document.driveClock = Date.now().toString(); + // }, + // { message: 'Init Document', time: Date.now() }, + // ); + + // document = await handle.doc(); + // documentId = handle.documentId; + + // logger.info({ document, documentId, manifest }, 'Initialized new document with Last published manifest'); + + // await prisma.node.update({ + // where: { id: node.id }, + // data: { manifestDocumentId: handle.documentId }, + // }); + // const updatedNode = await prisma.node.findFirst({ where: { id: node.id } }); + // logger.info({ document, updatedNode }, 'Node updated'); + // } else { + // const handle = repo.find(documentId as AnyDocumentId); + // document = await handle.doc(); + // if (document.uuid !== uuid && handle.isReady()) { + // handle.change( + // (document) => { + // document.uuid = uuid; + // }, + // { message: 'Update Document', time: Date.now() }, + // ); + // } + // document = await handle.doc(); + // } + // logger.info({ documentId, document }, 'End GetDocumentId'); + } catch (err) { + logger.error({ err }, 'Creating new document Error', req.body, err); + + response.status(500).send({ ok: false, message: JSON.stringify(err) }); + } +}; diff --git a/desci-server/src/controllers/nodes/draftCreate.ts b/desci-server/src/controllers/nodes/draftCreate.ts index d9f0fa683..71683136b 100755 --- a/desci-server/src/controllers/nodes/draftCreate.ts +++ b/desci-server/src/controllers/nodes/draftCreate.ts @@ -1,28 +1,29 @@ +import { DocumentId } from '@automerge/automerge-repo'; import { - DEFAULT_COMPONENT_TYPE, ExternalLinkComponent, PdfComponent, ResearchObjectComponentLinkSubtype, ResearchObjectComponentType, ResearchObjectV1, isNodeRoot, - isResearchObjectComponentTypeMap, } from '@desci-labs/desci-models'; -import { DataReference, DataType } from '@prisma/client'; +import { DataReference } from '@prisma/client'; import { Request, Response, NextFunction } from 'express'; -import prisma from 'client'; -import parentLogger from 'logger'; -import { getDataUsageForUserBytes, hasAvailableDataUsageForUpload } from 'services/dataService'; +import { prisma } from '../../client.js'; +import { logger as parentLogger } from '../../logger.js'; +import { getDataUsageForUserBytes, hasAvailableDataUsageForUpload } from '../../services/dataService.js'; import { addBufferToIpfs, downloadFilesAndMakeManifest, downloadSingleFile, updateManifestAndAddToIpfs, -} from 'services/ipfs'; -import { createNodeDraftBlank } from 'services/nodeManager'; -import { randomUUID64 } from 'utils'; -import { DRIVE_NODE_ROOT_PATH, ROTypesToPrismaTypes, getDbComponentType } from 'utils/driveUtils'; +} from '../../services/ipfs.js'; +import { NodeUuid } from '../../services/manifestRepo.js'; +import { createNodeDraftBlank } from '../../services/nodeManager.js'; +import repoService from '../../services/repoService.js'; +import { DRIVE_NODE_ROOT_PATH, ROTypesToPrismaTypes, getDbComponentType } from '../../utils/driveUtils.js'; +import { randomUUID64 } from '../../utils.js'; export const draftCreate = async (req: Request, res: Response, next: NextFunction) => { const { @@ -77,7 +78,6 @@ export const draftCreate = async (req: Request, res: Response, next: NextFunctio const dataConsumptionBytes = await getDataUsageForUserBytes(owner); - // eslint-disable-next-line no-array-reduce/no-reduce const uploadSizeBytes = files.map((f) => f.size).reduce((total, size) => total + size, 0); const hasStorageSpaceToUpload = await hasAvailableDataUsageForUpload(owner, { fileSizeBytes: uploadSizeBytes }); @@ -118,12 +118,29 @@ export const draftCreate = async (req: Request, res: Response, next: NextFunctio const nodeCopy = Object.assign({}, node); nodeCopy.uuid = nodeCopy.uuid.replace(/\.$/, ''); + const result = await repoService.initDraftDocument({ uuid: node.uuid as NodeUuid, manifest: researchObject }); + + if (!result) { + logger.error({ researchObject, uuid: node.uuid }, 'Automerge document Creation Error'); + res.status(400).send({ ok: false, message: 'Could not intialize new draft document' }); + return; + } + + const documentId = result.documentId; + const document = result.document; + + await prisma.node.update({ where: { id: node.id }, data: { manifestDocumentId: documentId } }); + + logger.info({ uuid: node.uuid, documentId }, 'Automerge document created'); + res.send({ ok: true, hash, uri, node: nodeCopy, version: nodeVersion, + documentId, + document, }); return; } catch (err) { diff --git a/desci-server/src/controllers/nodes/draftUpdate.ts b/desci-server/src/controllers/nodes/draftUpdate.ts index 87c7e894b..c6c3f89f1 100644 --- a/desci-server/src/controllers/nodes/draftUpdate.ts +++ b/desci-server/src/controllers/nodes/draftUpdate.ts @@ -1,10 +1,12 @@ import { ResearchObjectV1 } from '@desci-labs/desci-models'; import { Request, Response, NextFunction } from 'express'; -import prisma from 'client'; -import parentLogger from 'logger'; -import { updateManifestAndAddToIpfs } from 'services/ipfs'; -import { cleanManifestForSaving } from 'utils/manifestDraftUtils'; +import { prisma } from '../../client.js'; +import { logger as parentLogger } from '../../logger.js'; +import { updateManifestAndAddToIpfs } from '../../services/ipfs.js'; +import { NodeUuid } from '../../services/manifestRepo.js'; +import repoService from '../../services/repoService.js'; +import { cleanManifestForSaving } from '../../utils/manifestDraftUtils.js'; export const draftUpdate = async (req: Request, res: Response, next: NextFunction) => { const { uuid, manifest } = req.body; @@ -46,7 +48,17 @@ export const draftUpdate = async (req: Request, res: Response, next: NextFunctio }, }); - const manifestParsed: ResearchObjectV1 = req.body.manifest as ResearchObjectV1; + let manifestParsed: ResearchObjectV1; + + try { + manifestParsed = await repoService.getDraftManifest(node.uuid as NodeUuid); //await getDraftManifestFromUuid(node.uuid as NodeUuid); + } catch (e) { + manifestParsed = req.body.manifest as ResearchObjectV1; + } + + if (!manifestParsed) { + manifestParsed = req.body.manifest as ResearchObjectV1; + } const updatedMeta: any = {}; if (manifestParsed.title) updatedMeta.title = manifestParsed.title; @@ -60,6 +72,13 @@ export const draftUpdate = async (req: Request, res: Response, next: NextFunctio const uri = `${hash}`; + logger.info( + { + updatedMeta, + }, + `Updating node ${node.uuid}`, + ); + await prisma.node.update({ where: { id: node.id, diff --git a/desci-server/src/controllers/nodes/feed.ts b/desci-server/src/controllers/nodes/feed.ts new file mode 100644 index 000000000..022de7ab7 --- /dev/null +++ b/desci-server/src/controllers/nodes/feed.ts @@ -0,0 +1,30 @@ +import { NodeFeedItem } from '@prisma/client'; +import { Sql } from '@prisma/client/runtime/index.js'; +import { Request, Response, NextFunction } from 'express'; + +import { prisma } from '../../client.js'; +// list feeditems that have FeedItemEndorsement of null organization + +export const feed = async (req: Request, res: Response) => { + // get the latest feed items + const page = parseInt(req.query.page as string) || 1; + const size = parseInt(req.query.size as string) || 10; + const feedItems = await prisma.$queryRaw( + new Sql( + [ + ` + SELECT "NodeFeedItem".*, "NodeFeedItemEndorsement"."desciCommunityId" as "endorsementOrganizationId" + from "NodeFeedItem" + LEFT JOIN "NodeFeedItemEndorsement" ON "NodeFeedItem"."id" = "NodeFeedItemEndorsement"."nodeFeedItemId" + where "NodeFeedItemEndorsement".id is not null + ORDER BY "NodeFeedItem"."createdAt" DESC + LIMIT ${size} OFFSET ${Math.max(0, page - 1) * size} + + `, + ], + [], + ), + ); + + res.send({ feedItem: feedItems }); +}; diff --git a/desci-server/src/controllers/nodes/index.ts b/desci-server/src/controllers/nodes/index.ts index 006ac2743..1dccea38d 100755 --- a/desci-server/src/controllers/nodes/index.ts +++ b/desci-server/src/controllers/nodes/index.ts @@ -1,12 +1,13 @@ -export * from './draftCreate'; -export * from './draftUpdate'; -export * from './list'; -export * from './retrieveDoi'; -export * from './proxyPdf'; -export * from './show'; -export * from './consent'; -export * from './api'; -export * from './publish'; -export * from './share'; -export * from './nodesCover'; -export * from './manager'; +export * from './draftCreate.js'; +export * from './draftUpdate.js'; +export * from './list.js'; +export * from './retrieveDoi.js'; +export * from './proxyPdf.js'; +export * from './show.js'; +export * from './consent.js'; +export * from './api.js'; +export * from './publish.js'; +export * from './prepublish.js'; +export * from './share.js'; +export * from './nodesCover.js'; +export * from './manager.js'; diff --git a/desci-server/src/controllers/nodes/legacyManifestApi.ts b/desci-server/src/controllers/nodes/legacyManifestApi.ts index 535795997..91afcb110 100644 --- a/desci-server/src/controllers/nodes/legacyManifestApi.ts +++ b/desci-server/src/controllers/nodes/legacyManifestApi.ts @@ -1,9 +1,9 @@ import { Request, Response, NextFunction } from 'express'; -import prisma from 'client'; -import logger from 'logger'; -import { getIndexedResearchObjects } from 'theGraph'; -import { encodeBase64UrlSafe } from 'utils'; +import { prisma } from '../../client.js'; +import { logger } from '../../logger.js'; +import { getIndexedResearchObjects } from '../../theGraph.js'; +import { encodeBase64UrlSafe } from '../../utils.js'; //takes a hex uuid or array of hex uuids, returns a mapped array of hexuuids, titles export const retrieveTitle = async (req: Request, res: Response, next: NextFunction) => { diff --git a/desci-server/src/controllers/nodes/list.ts b/desci-server/src/controllers/nodes/list.ts index 8d689da4d..d623dabce 100755 --- a/desci-server/src/controllers/nodes/list.ts +++ b/desci-server/src/controllers/nodes/list.ts @@ -2,10 +2,10 @@ import { Request, Response, NextFunction } from 'express'; -import prisma from 'client'; -import parentLogger from 'logger'; -import { getIndexedResearchObjects } from 'theGraph'; -import { decodeBase64UrlSafeToHex, encodeBase64UrlSafe, randomUUID64 } from 'utils'; +import { prisma } from '../../client.js'; +import { logger as parentLogger } from '../../logger.js'; +import { getIndexedResearchObjects } from '../../theGraph.js'; +import { decodeBase64UrlSafeToHex, randomUUID64 } from '../../utils.js'; export const list = async (req: Request, res: Response, next: NextFunction) => { const owner = (req as any).user; @@ -26,6 +26,7 @@ export const list = async (req: Request, res: Response, next: NextFunction) => { title: true, manifestUrl: true, cid: true, + NodeCover: true, }, where: { ownerId: owner.id, @@ -60,6 +61,7 @@ export const list = async (req: Request, res: Response, next: NextFunction) => { title: true, manifestUrl: true, cid: true, + NodeCover: true, }, where: { ownerId: owner.id, diff --git a/desci-server/src/controllers/nodes/manager.ts b/desci-server/src/controllers/nodes/manager.ts index 69b2f09e3..3a917425e 100644 --- a/desci-server/src/controllers/nodes/manager.ts +++ b/desci-server/src/controllers/nodes/manager.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from 'express'; -import prisma from 'client'; -import parentLogger from 'logger'; +import { prisma } from '../../client.js'; +import { logger as parentLogger } from '../../logger.js'; export const deleteNode = async (req: Request, res: Response, next: NextFunction) => { const user = (req as any).user; diff --git a/desci-server/src/controllers/nodes/mintPermanent.ts b/desci-server/src/controllers/nodes/mintPermanent.ts index 7ea8c77e5..3466ee2d2 100755 --- a/desci-server/src/controllers/nodes/mintPermanent.ts +++ b/desci-server/src/controllers/nodes/mintPermanent.ts @@ -1,10 +1,8 @@ -import fs from 'fs'; - import Arweave from 'arweave'; import axios from 'axios'; import { Request, Response, NextFunction } from 'express'; -import parentLogger from 'logger'; +import { logger as parentLogger } from '../../logger.js'; const logger = parentLogger.child({ // id: req.id, diff --git a/desci-server/src/controllers/nodes/nodesCover.ts b/desci-server/src/controllers/nodes/nodesCover.ts index 73336d05c..4cdb470cf 100644 --- a/desci-server/src/controllers/nodes/nodesCover.ts +++ b/desci-server/src/controllers/nodes/nodesCover.ts @@ -2,12 +2,11 @@ import { PdfComponent, ResearchObjectComponentType, ResearchObjectV1 } from '@de import axios from 'axios'; import { Request, Response, NextFunction } from 'express'; -import prisma from 'client'; -import { MEDIA_SERVER_API_KEY, MEDIA_SERVER_API_URL } from 'config'; -import parentLogger from 'logger'; -import { cacheNodeMetadata } from 'services/nodeManager'; - -import { cleanupManifestUrl } from './show'; +import { prisma } from '../../client.js'; +import { MEDIA_SERVER_API_KEY, MEDIA_SERVER_API_URL } from '../../config/index.js'; +import { logger as parentLogger } from '../../logger.js'; +import { cacheNodeMetadata } from '../../services/nodeManager.js'; +import { cleanupManifestUrl } from '../../utils/manifest.js'; if (!process.env.NODES_MEDIA_SERVER_URL) { throw Error('NODES_MEDIA_SERVER_URL not found, add to env file'); @@ -18,8 +17,8 @@ const parseVersion = (version: string): number | undefined => { return !isNaN(parseInt(version)) ? +version : version[0]?.toLowerCase() === 'v' && version.length > 1 - ? parseInt(version.substring(1)) - 1 - : undefined; + ? parseInt(version.substring(1)) - 1 + : undefined; }; export const getCoverImage = async (req: Request, res: Response, next: NextFunction) => { diff --git a/desci-server/src/controllers/nodes/prepublish.ts b/desci-server/src/controllers/nodes/prepublish.ts new file mode 100644 index 000000000..56f7df86b --- /dev/null +++ b/desci-server/src/controllers/nodes/prepublish.ts @@ -0,0 +1,100 @@ +import { ResearchObjectV1 } from '@desci-labs/desci-models'; +import { NodeVersion } from '@prisma/client'; +import { Response } from 'express'; + +import { prisma } from '../../client.js'; +import { logger as parentLogger } from '../../logger.js'; +import { RequestWithNode } from '../../middleware/authorisation.js'; +import { updateManifestDataBucket } from '../../services/data/processing.js'; +import { NodeUuid } from '../../services/manifestRepo.js'; +import repoService from '../../services/repoService.js'; +import { prepareDataRefsForDagSkeleton } from '../../utils/dataRefTools.js'; +import { dagifyAndAddDbTreeToIpfs } from '../../utils/draftTreeUtils.js'; +import { persistManifest } from '../data/utils.js'; + +type PrepublishResponse = PrepublishSuccessResponse | PrepublishErrorResponse; +export interface PrepublishSuccessResponse { + ok: boolean; + updatedManifestCid: string; + updatedManifest: ResearchObjectV1; + version?: NodeVersion; + ceramicStream?: string; +} + +export interface PrepublishErrorResponse { + ok: false; + error: string; + status?: number; +} + +/** + * DAGifies the drafts current DB tree state, adds the structure to IPFS (No Files Pinned, Folders staged), and updates the manifest data bucket CID. + */ +export const prepublish = async (req: RequestWithNode, res: Response) => { + const owner = req.user; + const node = req.node; + const { uuid } = req.body; + const logger = parentLogger.child({ + // id: req.id, + module: 'NODE::PrepublishController', + body: req.body, + uuid, + user: (req as any).user, + ceramicStream: node.ceramicStream, + }); + if (!uuid) { + return res.status(400).json({ ok: false, error: 'UUID is required.' }); + } + try { + // Sourced from middleware EnsureUser + if (!owner.id || owner.id < 1) { + throw Error('User ID mismatch'); + } + + // Sourced from middleware EnsureWriteAccess + if (!node) { + logger.warn({ owner, uuid }, `unauthed node user: ${owner}, node uuid provided: ${uuid}`); + return res.status(403).json({ ok: false, error: 'Failed' }); + } + + const manifest = await repoService.getDraftManifest(node.uuid as NodeUuid); + + /** + * Dagify and add DAGs to IPFS (No Files Pinned yet, just the folder structure added to IPFS (NOT PINNED!)) + */ + const nodeFileTreeDagCid = await dagifyAndAddDbTreeToIpfs(node.id); + + // Update manifest data bucket CID, and persist the manifest + // TODO: use repo service action dispatcher method instead + const updatedManifest = updateManifestDataBucket({ manifest, newRootCid: nodeFileTreeDagCid }); + const { persistedManifestCid, nodeVersion } = await persistManifest({ + manifest: updatedManifest, + node, + userId: owner.id, + }); + + // Create public data refs for the DAGs + const pubDataRefs = await prepareDataRefsForDagSkeleton({ node, dataBucketCid: nodeFileTreeDagCid, manifest }); + // Append the version to the data refs + const readyPubDataRefs = pubDataRefs.map((ref) => ({ ...ref, versionId: nodeVersion.id })); + const createdPublicRefs = await prisma.publicDataReference.createMany({ + data: readyPubDataRefs, + skipDuplicates: true, + }); + + logger.info( + `[Prepublish DAG Skeleton Refs] Created ${createdPublicRefs.count} public data refs for node ${node.id}`, + ); + + return res.status(200).send({ + ok: true, + updatedManifestCid: persistedManifestCid, + updatedManifest: updatedManifest, + version: nodeVersion, + ceramicStream: node.ceramicStream, + }); + } catch (err) { + logger.error({ err }, '[prepublish::prepublish] node-pre-publish-err'); + return res.status(400).send({ ok: false, error: err.message }); + } +}; diff --git a/desci-server/src/controllers/nodes/proxyPdf.ts b/desci-server/src/controllers/nodes/proxyPdf.ts index 50c31f006..615d11ca0 100755 --- a/desci-server/src/controllers/nodes/proxyPdf.ts +++ b/desci-server/src/controllers/nodes/proxyPdf.ts @@ -1,8 +1,8 @@ // Mirror PDF for CORS -import { Request, Response, NextFunction } from 'express'; +import { Request, Response } from 'express'; import request from 'request'; -import logger from 'logger'; +import { logger } from '../../logger.js'; export const proxyPdf = async (req: Request, res: Response) => { const { q } = req.query; diff --git a/desci-server/src/controllers/nodes/publish.ts b/desci-server/src/controllers/nodes/publish.ts index 0eb9aef1b..5db33b6d1 100644 --- a/desci-server/src/controllers/nodes/publish.ts +++ b/desci-server/src/controllers/nodes/publish.ts @@ -2,22 +2,23 @@ import { ResearchObjectV1 } from '@desci-labs/desci-models'; import { ActionType, Prisma } from '@prisma/client'; import { Request, Response, NextFunction } from 'express'; -import prisma from 'client'; -import parentLogger from 'logger'; -import { saveInteraction } from 'services/interactionLog'; +import { prisma } from '../../client.js'; +import { logger as parentLogger } from '../../logger.js'; +import { saveInteraction } from '../../services/interactionLog.js'; import { publishResearchObject, cacheNodeMetadata, getAllCidsRequiredForPublish, createPublicDataRefs, createDataMirrorJobs, -} from 'services/nodeManager'; -import { validateAndHealDataRefs } from 'utils/dataRefTools'; -import { discordNotify } from 'utils/discordUtils'; + setCeramicStream, +} from '../../services/nodeManager.js'; +import { discordNotify } from '../../utils/discordUtils.js'; // call node publish service and add job to queue -export const publish = async (req: Request, res: Response, next: NextFunction) => { - const { uuid, cid, manifest, transactionId } = req.body; +export const publish = async (req: Request, res: Response, _next: NextFunction) => { + const { uuid, cid, manifest, transactionId, nodeVersionId, ceramicStream } = req.body; + // debugger; const email = (req as any).user.email; const logger = parentLogger.child({ // id: req.id, @@ -31,7 +32,12 @@ export const publish = async (req: Request, res: Response, next: NextFunction) = user: (req as any).user, }); if (!uuid || !cid || !manifest) { - return res.status(404).send({ message: 'uuid, cid, and manifest must be valid' }); + return res.status(404).send({ message: 'uuid, cid, email, and manifest must be valid' }); + } + + if (email === undefined || email === null) { + // Prevent any issues with prisma findFirst with undefined fields + return res.status(401).send({ message: 'email must be valid' }); } try { @@ -49,9 +55,10 @@ export const publish = async (req: Request, res: Response, next: NextFunction) = const node = await prisma.node.findFirst({ where: { ownerId: owner.id, - uuid: uuid + '.', + uuid: uuid.endsWith('.') ? uuid : uuid + '.', }, }); + if (!node) { logger.warn({ owner, uuid }, `unauthed node user: ${owner}, node uuid provided: ${uuid}`); return res.status(400).json({ error: 'failed' }); @@ -59,14 +66,43 @@ export const publish = async (req: Request, res: Response, next: NextFunction) = /**TODO: END MOVE TO MIDDLEWARE */ // update node version - const nodeVersion = await prisma.nodeVersion.create({ - data: { + const latestNodeVersion = await prisma.nodeVersion.findFirst({ + where: { + id: nodeVersionId || -1, + nodeId: node.id, + }, + orderBy: { + id: 'desc', + }, + }); + + // Prevent duplicating the NodeVersion entry if the latest version is the same as the one we're trying to publish, as a draft save is triggered before publishing + const latestNodeVersionId = latestNodeVersion?.manifestUrl === cid ? latestNodeVersion.id : -1; + + const nodeVersion = await prisma.nodeVersion.upsert({ + where: { + id: latestNodeVersionId, + }, + update: { + transactionId, + }, + create: { nodeId: node.id, manifestUrl: cid, transactionId, }, }); + if (process.env.TOGGLE_CERAMIC === "1") { + if (ceramicStream) { + logger.trace(`[ceramic] setting streamID on node`); + await setCeramicStream(uuid, ceramicStream); + } else { + // Likely feature toggle is active in backend, but not in frontend + logger.warn(`[ceramic] wanted to set streamID for ${node.uuid} but request did not contain one`) + } + }; + logger.trace(`[publish::publish] nodeUuid=${node.uuid}, manifestCid=${cid}, transaction=${transactionId}`); const cidsPayload = { @@ -98,7 +134,6 @@ export const publish = async (req: Request, res: Response, next: NextFunction) = * Create a job per mirror in order to track the status of the upload * There can be multiple mirrors per node, right now there is just Estuary */ - const dataMirrorJobs = await createDataMirrorJobs(cidsRequiredForPublish, owner.id); // TODO: update public data refs to link versionId @@ -164,15 +199,7 @@ export const publish = async (req: Request, res: Response, next: NextFunction) = // trigger ipfs storage upload, but don't wait for it to finish, will happen async publishResearchObject(publicDataReferences) .then(handleMirrorSuccess) - .catch(handleMirrorFail) - .finally(async () => { - await validateAndHealDataRefs({ - nodeUuid: node.uuid!, - manifestCid: cid, - publicRefs: true, - markExternals: true, - }); - }); + .catch(handleMirrorFail); /** * Save the cover art for this Node for later sharing: PDF -> JPG for this version diff --git a/desci-server/src/controllers/nodes/retrieveDoi.ts b/desci-server/src/controllers/nodes/retrieveDoi.ts index f783bfdbc..108873fe0 100755 --- a/desci-server/src/controllers/nodes/retrieveDoi.ts +++ b/desci-server/src/controllers/nodes/retrieveDoi.ts @@ -1,11 +1,9 @@ -import checkUrl from 'url'; - import { ActionType } from '@prisma/client'; import axios from 'axios'; -import { Request, Response, NextFunction } from 'express'; +import { Request, Response } from 'express'; // import { headlessDownloadPdf } from 'services/headlessBrowser'; -import { saveInteraction } from 'services/interactionLog'; +import { saveInteraction } from '../../services/interactionLog.js'; export interface ResearchObjectMetadata { title: string; diff --git a/desci-server/src/controllers/nodes/share.ts b/desci-server/src/controllers/nodes/share.ts index dafc8d327..24b88151f 100644 --- a/desci-server/src/controllers/nodes/share.ts +++ b/desci-server/src/controllers/nodes/share.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from 'express'; import ShortUniqueId from 'short-unique-id'; -import prisma from 'client'; +import { prisma } from '../../client.js'; export const createPrivateShare = async (req: Request, res: Response, next: NextFunction) => { const owner = (req as any).user; @@ -20,7 +20,8 @@ export const createPrivateShare = async (req: Request, res: Response, next: Next return; } - const shareUUID = new ShortUniqueId({ length: 10 }); + // short-unique-id does a weird default class export + const shareUUID = new ShortUniqueId.default({ length: 10 }); const shareId = shareUUID() as string; let privateShare = await prisma.privateShare.findFirst({ where: { nodeUUID: uuid + '.' } }); diff --git a/desci-server/src/controllers/nodes/show.ts b/desci-server/src/controllers/nodes/show.ts index 58f53ebef..cc92506d8 100755 --- a/desci-server/src/controllers/nodes/show.ts +++ b/desci-server/src/controllers/nodes/show.ts @@ -1,22 +1,16 @@ -import { ResearchObjectV1, ResearchObjectV1History, RESEARCH_OBJECT_NODES_PREFIX } from '@desci-labs/desci-models'; +import { ResearchObjectV1, RESEARCH_OBJECT_NODES_PREFIX } from '@desci-labs/desci-models'; import { Node } from '@prisma/client'; import axios from 'axios'; import { Request, Response, NextFunction } from 'express'; import { CID } from 'multiformats/cid'; -import prisma from 'client'; -import { PUBLIC_IPFS_PATH } from 'config'; -import parentLogger from 'logger'; - -export const cleanupManifestUrl = (url: string, gateway?: string) => { - if (url && (PUBLIC_IPFS_PATH || gateway)) { - const s = url.split('/'); - const res = `${gateway ? gateway : PUBLIC_IPFS_PATH}/${s[s.length - 1]}`; - parentLogger.info({ fn: 'cleanupManifestUrl', url, gateway }, `resolving ${url} => ${res}`); - return res; - } - return url; -}; +import { prisma } from '../../client.js'; +import { PUBLIC_IPFS_PATH } from '../../config/index.js'; +import { logger as parentLogger } from '../../logger.js'; +import { RequestWithNode } from '../../middleware/authorisation.js'; +import { NodeUuid } from '../../services/manifestRepo.js'; +import repoService from '../../services/repoService.js'; +import { cleanupManifestUrl } from '../../utils/manifest.js'; const transformManifestWithHistory = (data: ResearchObjectV1, researchNode: Node) => { const ro = Object.assign({}, data); @@ -46,8 +40,8 @@ const transformManifestWithHistory = (data: ResearchObjectV1, researchNode: Node }; // Return ResearchObject manifest via CID or ResearchObject database ID -export const show = async (req: Request, res: Response, next: NextFunction) => { - let ownerId = (req as any).user?.id; +export const show = async (req: RequestWithNode, res: Response, next: NextFunction) => { + let ownerId = req.user?.id; const shareId = req.query.shareId as string; let cid: string = null; let pid = req.params[0]; @@ -58,7 +52,7 @@ export const show = async (req: Request, res: Response, next: NextFunction) => { cid, pid, shareId, - user: (req as any).user, + user: { id: (req as any).user?.id, email: (req as any).user?.email }, }); logger.trace({}, 'show node'); @@ -105,10 +99,15 @@ export const show = async (req: Request, res: Response, next: NextFunction) => { gatewayUrl = cleanupManifestUrl(gatewayUrl, req.query?.g as string); logger.trace({ gatewayUrl, uuid }, 'transforming manifest'); (discovery as any).manifestData = transformManifestWithHistory((await axios.get(gatewayUrl)).data, discovery); + // Add draft manifest document + const nodeUuid = (uuid + '.') as NodeUuid; + const manifest = await repoService.getDraftManifest(nodeUuid); - delete (discovery as any).restBody; + logger.info({ manifest }, '[SHOW API GET DRAFT MANIFEST]'); - logger.trace({ gatewayUrl, uuid }, 'transformed manifest'); + if (manifest) (discovery as any).manifestData = transformManifestWithHistory(manifest, discovery); + delete (discovery as any).restBody; + logger.info({}, 'Retrive DraftManifest For /SHOW'); } catch (err) { logger.error( { err, manifestUrl: discovery.manifestUrl, gatewayUrl }, @@ -116,7 +115,7 @@ export const show = async (req: Request, res: Response, next: NextFunction) => { ); } - res.send(discovery); + res.send({ ...discovery }); return; } diff --git a/desci-server/src/controllers/nodes/versionDetails.ts b/desci-server/src/controllers/nodes/versionDetails.ts index 34323a4b8..47dc4530e 100644 --- a/desci-server/src/controllers/nodes/versionDetails.ts +++ b/desci-server/src/controllers/nodes/versionDetails.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from 'express'; -import prisma from 'client'; -import parentLogger from 'logger'; +import { prisma } from '../../client.js'; +import { logger as parentLogger } from '../../logger.js'; // call node publish service and add job to queue export const versionDetails = async (req: Request, res: Response, next: NextFunction) => { diff --git a/desci-server/src/controllers/proxy/index.ts b/desci-server/src/controllers/proxy/index.ts index d84ba6f56..da4671538 100644 --- a/desci-server/src/controllers/proxy/index.ts +++ b/desci-server/src/controllers/proxy/index.ts @@ -1 +1 @@ -export * from './ror'; +export * from './ror.js'; diff --git a/desci-server/src/controllers/proxy/orcidProfile.ts b/desci-server/src/controllers/proxy/orcidProfile.ts index 904bc325d..562ce76a4 100644 --- a/desci-server/src/controllers/proxy/orcidProfile.ts +++ b/desci-server/src/controllers/proxy/orcidProfile.ts @@ -1,8 +1,8 @@ import axios from 'axios'; import { Request, Response, NextFunction } from 'express'; -import prisma from 'client'; -import parentLogger from 'logger'; +import { prisma } from '../../client.js'; +import { logger as parentLogger } from '../../logger.js'; export const ORCID_API_URL = 'https://orcid.org'; diff --git a/desci-server/src/controllers/proxy/ror.ts b/desci-server/src/controllers/proxy/ror.ts index c13e79a9d..82e420055 100644 --- a/desci-server/src/controllers/proxy/ror.ts +++ b/desci-server/src/controllers/proxy/ror.ts @@ -1,8 +1,8 @@ -import { Organization, User } from '@prisma/client'; +import { Organization } from '@prisma/client'; import axios from 'axios'; import { Request, Response, NextFunction } from 'express'; -import prisma from 'client'; +import { prisma } from '../../client.js'; export const ROR_API_URL = 'https://api.ror.org/organizations'; const cache = {}; diff --git a/desci-server/src/controllers/raw/index.ts b/desci-server/src/controllers/raw/index.ts index f2448e8ac..4b620de16 100644 --- a/desci-server/src/controllers/raw/index.ts +++ b/desci-server/src/controllers/raw/index.ts @@ -1,3 +1,3 @@ -export * from './resolve'; -export * from './nft'; -export * from './versions'; +export * from './resolve.js'; +export * from './nft.js'; +export * from './versions.js'; diff --git a/desci-server/src/controllers/raw/nft.ts b/desci-server/src/controllers/raw/nft.ts index 1b20c8525..fca26ff7d 100644 --- a/desci-server/src/controllers/raw/nft.ts +++ b/desci-server/src/controllers/raw/nft.ts @@ -1,7 +1,7 @@ import { BigNumber } from 'ethers'; import { NextFunction, Request, Response } from 'express'; -import { encodeBase64UrlSafe } from 'utils'; +import { encodeBase64UrlSafe } from '../../utils.js'; /** * Get NFT metadata diff --git a/desci-server/src/controllers/raw/resolve.ts b/desci-server/src/controllers/raw/resolve.ts index d284e6840..21c3030b9 100644 --- a/desci-server/src/controllers/raw/resolve.ts +++ b/desci-server/src/controllers/raw/resolve.ts @@ -8,15 +8,16 @@ import axios from 'axios'; import { ethers } from 'ethers'; import { NextFunction, Request, Response } from 'express'; -import { decodeBase64UrlSafeToHex, hexToCid } from '@/../utils'; -import parentLogger from 'logger'; -import { getIndexedResearchObjects } from 'theGraph'; - -import goerli from '../../desci-contracts-artifacts/contracts/ResearchObject.sol/ResearchObject.json'; -import localhost from '../../desci-contracts-artifacts/contracts/ResearchObject.sol/ResearchObject.json'; -import goerliInfo from '../../desci-contracts-config/goerli-research-object.json'; -import localhostInfo from '../../desci-contracts-config/unknown-research-object.json'; - +import goerli from '../../desci-contracts-artifacts/contracts/ResearchObject.sol/ResearchObject.json' assert { type: 'json' }; +import localhost from '../../desci-contracts-artifacts/contracts/ResearchObject.sol/ResearchObject.json' assert { type: 'json' }; +import goerliInfo from '../../desci-contracts-config/goerli-research-object.json' assert { type: 'json' }; +import localhostInfo from '../../desci-contracts-config/unknown-research-object.json' assert { type: 'json' }; +import { logger as parentLogger } from '../../logger.js'; +import { getIndexedResearchObjects } from '../../theGraph.js'; +import { decodeBase64UrlSafeToHex, hexToCid } from '../../utils.js'; + +const IPFS_RESOLVER_OVERRIDE = process.env.IPFS_RESOLVER_OVERRIDE || ''; +//change export const directChainCall = async (decodedUuid: string) => { let provider; try { @@ -80,7 +81,6 @@ export const resolve = async (req: Request, res: Response, next: NextFunction) = user: (req as any).user, }); logger.debug(`[resolve::resolve] firstParam=${firstParam} secondParam=${secondParam}`); - // const node = await prisma.node.findFirst({ // where: { uuid }, // }); @@ -128,7 +128,7 @@ export const resolve = async (req: Request, res: Response, next: NextFunction) = // console.log('VERSION', version.args._cid); - const ipfsResolver = req.query.g || 'https://ipfs.desci.com/ipfs'; + const ipfsResolver = IPFS_RESOLVER_OVERRIDE || req.query.g || 'https://ipfs.desci.com/ipfs'; // TODO: add whitelist of resolvers if (!firstParam || !firstParam.trim().length) { diff --git a/desci-server/src/controllers/raw/versions.ts b/desci-server/src/controllers/raw/versions.ts index 12f18b08d..422991997 100644 --- a/desci-server/src/controllers/raw/versions.ts +++ b/desci-server/src/controllers/raw/versions.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from 'express'; -import logger from 'logger'; -import { getIndexedResearchObjects } from 'theGraph'; +import { logger } from '../../logger.js'; +import { getIndexedResearchObjects } from '../../theGraph.js'; /** * Get all versions of research object from index (publicView) diff --git a/desci-server/src/controllers/referral/acceptReferralById.ts b/desci-server/src/controllers/referral/acceptReferralById.ts index e30b13fa0..f3e7db861 100644 --- a/desci-server/src/controllers/referral/acceptReferralById.ts +++ b/desci-server/src/controllers/referral/acceptReferralById.ts @@ -1,10 +1,14 @@ import { ActionType, FriendReferralStatus, User } from '@prisma/client'; import { Request, Response } from 'express'; -import parentLogger from 'logger'; -import { getReferralByUuid, updateReferralAwardedStorage, updateReferralStatus } from 'services/friendReferral'; -import { saveInteraction } from 'services/interactionLog'; -import { increaseUsersDriveLimit } from 'services/user'; +import { logger as parentLogger } from '../../logger.js'; +import { + getReferralByUuid, + updateReferralAwardedStorage, + updateReferralStatus, +} from '../../services/friendReferral.js'; +import { saveInteraction } from '../../services/interactionLog.js'; +import { increaseUsersDriveLimit } from '../../services/user.js'; export const DRIVE_STORAGE_LIMIT_INCREASE_GB = 5; export const acceptReferralById = async (req: Request, res: Response) => { diff --git a/desci-server/src/controllers/referral/getReferralsByUserId.ts b/desci-server/src/controllers/referral/getReferralsByUserId.ts index 4b543bfd2..59b8f9ba1 100644 --- a/desci-server/src/controllers/referral/getReferralsByUserId.ts +++ b/desci-server/src/controllers/referral/getReferralsByUserId.ts @@ -1,8 +1,8 @@ import { User } from '@prisma/client'; import { Request, Response } from 'express'; -import parentLogger from 'logger'; -import { getReferralsByUserId as getReferralsByUserIdDb } from 'services/friendReferral'; +import { logger as parentLogger } from '../../logger.js'; +import { getReferralsByUserId as getReferralsByUserIdDb } from '../../services/friendReferral.js'; export const getReferralsByUserId = async (req: Request, res: Response) => { const logger = parentLogger.child({ diff --git a/desci-server/src/controllers/referral/index.ts b/desci-server/src/controllers/referral/index.ts index 4486ae440..b1a38436b 100644 --- a/desci-server/src/controllers/referral/index.ts +++ b/desci-server/src/controllers/referral/index.ts @@ -1,3 +1,3 @@ -export * from './newReferral'; -export * from './getReferralsByUserId'; -export * from './acceptReferralById'; +export * from './newReferral.js'; +export * from './getReferralsByUserId.js'; +export * from './acceptReferralById.js'; diff --git a/desci-server/src/controllers/referral/newReferral.ts b/desci-server/src/controllers/referral/newReferral.ts index 48a0e7926..8e4efbf01 100644 --- a/desci-server/src/controllers/referral/newReferral.ts +++ b/desci-server/src/controllers/referral/newReferral.ts @@ -1,10 +1,11 @@ import { ActionType, FriendReferral, User } from '@prisma/client'; -import { SES } from 'aws-sdk'; +import awsSdk from 'aws-sdk'; import { Request, Response } from 'express'; -import parentLogger from 'logger'; -import { saveFriendReferral } from 'services/friendReferral'; -import { saveInteraction } from 'services/interactionLog'; +import { logger as parentLogger } from '../../logger.js'; +import { saveFriendReferral } from '../../services/friendReferral.js'; +import { saveInteraction } from '../../services/interactionLog.js'; +const { SES } = awsSdk; interface ExpectedBody { emails: string[]; diff --git a/desci-server/src/controllers/users/associateWallet.ts b/desci-server/src/controllers/users/associateWallet.ts index 3a3fcc3d3..1f77173c4 100755 --- a/desci-server/src/controllers/users/associateWallet.ts +++ b/desci-server/src/controllers/users/associateWallet.ts @@ -3,10 +3,10 @@ import { ethers } from 'ethers'; import { NextFunction, Request, Response } from 'express'; import { ErrorTypes, SiweMessage } from 'siwe'; -import prisma from 'client'; -import parentLogger from 'logger'; -import { saveInteraction } from 'services/interactionLog'; -import { writeExternalIdToOrcidProfile } from 'services/user'; +import { prisma } from '../../client.js'; +import { logger as parentLogger } from '../../logger.js'; +import { saveInteraction } from '../../services/interactionLog.js'; +import { writeExternalIdToOrcidProfile } from '../../services/user.js'; const createWalletNickname = async (user: Prisma.UserWhereInput) => { const count = await prisma.wallet.count({ diff --git a/desci-server/src/controllers/users/index.ts b/desci-server/src/controllers/users/index.ts index d8b69885a..230e954dc 100755 --- a/desci-server/src/controllers/users/index.ts +++ b/desci-server/src/controllers/users/index.ts @@ -1,5 +1,5 @@ -export * from './destroy'; -export * from './updateProfile'; -export * from './list'; -export * from './show'; -export * from './associateWallet'; +export * from './destroy.js'; +export * from './updateProfile.js'; +export * from './list.js'; +export * from './show.js'; +export * from './associateWallet.js'; diff --git a/desci-server/src/controllers/users/list.ts b/desci-server/src/controllers/users/list.ts index ad0483c88..28a9ec434 100755 --- a/desci-server/src/controllers/users/list.ts +++ b/desci-server/src/controllers/users/list.ts @@ -1,7 +1,8 @@ import { Request, Response, NextFunction } from 'express'; -import client from '../../client'; + +import { prisma } from '../../client.js'; export const list = async (req: Request, res: Response, next: NextFunction) => { - const users = await client.user.findMany(); + const users = await prisma.user.findMany(); res.send({ users }); }; diff --git a/desci-server/src/controllers/users/show.ts b/desci-server/src/controllers/users/show.ts index a7b00dad3..5cf2ce5a3 100755 --- a/desci-server/src/controllers/users/show.ts +++ b/desci-server/src/controllers/users/show.ts @@ -2,6 +2,4 @@ import { Request, Response, NextFunction } from 'express'; export const show = async (req: Request, res: Response, next: NextFunction) => { const id = req.params.id; - - }; diff --git a/desci-server/src/controllers/users/updateProfile.ts b/desci-server/src/controllers/users/updateProfile.ts index d29e796ab..b8a9beb33 100755 --- a/desci-server/src/controllers/users/updateProfile.ts +++ b/desci-server/src/controllers/users/updateProfile.ts @@ -1,8 +1,8 @@ import { Organization, User } from '@prisma/client'; import { Request, Response, NextFunction } from 'express'; -import prisma from 'client'; -import parentLogger from 'logger'; +import { prisma } from '../../client.js'; +import { logger as parentLogger } from '../../logger.js'; interface ExpectedBody { username: string; diff --git a/desci-server/src/controllers/users/usage.ts b/desci-server/src/controllers/users/usage.ts index e79e67d7c..afdc3c321 100644 --- a/desci-server/src/controllers/users/usage.ts +++ b/desci-server/src/controllers/users/usage.ts @@ -1,8 +1,8 @@ import { User } from '@prisma/client'; import { Request, Response, NextFunction } from 'express'; -import { getDataUsageForUserBytes, getPublicDataUsageForUserBytes } from 'services/dataService'; -import { gbToBytes } from 'utils/driveUtils'; +import { getDataUsageForUserBytes, getPublicDataUsageForUserBytes } from '../../services/dataService.js'; +import { gbToBytes } from '../../utils/driveUtils.js'; export const usage = async (req: Request, res: Response, next: NextFunction) => { const user = (req as any).user as User; diff --git a/desci-server/src/controllers/waitlist/add.ts b/desci-server/src/controllers/waitlist/add.ts index ed4d7e2cb..3f1e362b1 100644 --- a/desci-server/src/controllers/waitlist/add.ts +++ b/desci-server/src/controllers/waitlist/add.ts @@ -1,8 +1,9 @@ import { Request, Response, NextFunction } from 'express'; -import * as waitlist from '../../services/waitlist'; + +import * as waitlist from '../../services/waitlist.js'; export const add = async (req: Request, res: Response, next: NextFunction) => { - let success: Boolean = false; + let success: boolean = false; try { success = await waitlist.addUser(req.body.email); res.send({ success }); diff --git a/desci-server/src/controllers/waitlist/index.ts b/desci-server/src/controllers/waitlist/index.ts index 51b92637d..4b0316506 100644 --- a/desci-server/src/controllers/waitlist/index.ts +++ b/desci-server/src/controllers/waitlist/index.ts @@ -1,3 +1,3 @@ -export * from './add'; -export * from './list'; -export * from './promote'; +export * from './add.js'; +export * from './list.js'; +export * from './promote.js'; diff --git a/desci-server/src/controllers/waitlist/list.ts b/desci-server/src/controllers/waitlist/list.ts index 1959063f0..52056af87 100644 --- a/desci-server/src/controllers/waitlist/list.ts +++ b/desci-server/src/controllers/waitlist/list.ts @@ -1,5 +1,6 @@ import { Request, Response, NextFunction } from 'express'; -import * as waitlist from '../../services/waitlist'; + +import * as waitlist from '../../services/waitlist.js'; export const list = async (req: Request, res: Response, next: NextFunction) => { const user = (req as any).user; diff --git a/desci-server/src/controllers/waitlist/promote.ts b/desci-server/src/controllers/waitlist/promote.ts index 2f686841f..b2f600a8d 100644 --- a/desci-server/src/controllers/waitlist/promote.ts +++ b/desci-server/src/controllers/waitlist/promote.ts @@ -1,5 +1,6 @@ import { Request, Response, NextFunction } from 'express'; -import * as waitlist from '../../services/waitlist'; + +import * as waitlist from '../../services/waitlist.js'; export const promote = async (req: Request, res: Response, next: NextFunction) => { const user = (req as any).user; diff --git a/desci-server/src/index.ts b/desci-server/src/index.ts index d9a3d1431..5b224b49a 100755 --- a/desci-server/src/index.ts +++ b/desci-server/src/index.ts @@ -1,177 +1,6 @@ -import 'dotenv/config'; -import 'reflect-metadata'; +import { server } from './server.js'; -import * as Sentry from '@sentry/node'; -import * as Tracing from '@sentry/tracing'; -import bodyParser from 'body-parser'; -import cookieParser from 'cookie-parser'; -import express from 'express'; -import helmet from 'helmet'; -import { createProxyMiddleware } from 'http-proxy-middleware'; -import pinoHttp from 'pino-http'; - -import prismaClient from 'client'; -import './utils/response/customSuccess'; -import { orcidConnect } from 'controllers/auth'; -import { orcidCheck } from 'controllers/auth/orcidNext'; -import logger from 'logger'; -import { ensureUserIfPresent } from 'middleware/ensureUserIfPresent'; - -import { errorHandler } from './middleware/errorHandler'; -import routes from './routes'; - -export const app = express(); - -const ENABLE_TELEMETRY = process.env.NODE_ENV === 'production'; -const IS_DEV = !ENABLE_TELEMETRY; -if (ENABLE_TELEMETRY) { - logger.info('[DeSci Nodes] Telemetry enabled'); - Sentry.init({ - dsn: 'https://d508a5c408f34b919ccd94aac093e076@o1330109.ingest.sentry.io/6619754', - release: 'desci-nodes-server@' + process.env.npm_package_version, - integrations: [new Tracing.Integrations.Prisma({ client: prismaClient })], - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for performance monitoring. - // We recommend adjusting this value in production - tracesSampleRate: 1.0, - }); - app.use(Sentry.Handlers.requestHandler()); - app.use(Sentry.Handlers.tracingHandler()); -} else { - logger.info('[DeSci Nodes] Telemetry disabled'); -} - -app.use( - pinoHttp({ - logger, - serializers: { - res: (res) => { - if (IS_DEV) { - return { - responseTime: res.responseTime, - status: res.statusCode, - }; - } else { - return res; - } - }, - req: (req) => { - if (IS_DEV) { - return { - query: req.query, - params: req.params, - method: req.method, - url: req.url, - }; - } else { - return req; - } - }, - }, - }), -); - -const allowlist = [ - 'http://localhost:3000', - 'http://localhost:3001', - 'http://localhost:61440', - 'http://localhost:3002', - 'http://host.docker.internal:3000', - 'http://host.docker.internal:3002', - 'http://127.0.0.1:3000', - 'https://nodes.desci.com', - 'https://nodes-dev.desci.com', - 'https://nodes-demo.desci.com', - 'https://dev.desci.com', - 'https://nodes-devel.desci.com', - 'https://nodes-dev-vercel.desci.com', - 'https://nodes-v1.desci.com', - 'https://nodes-v1-dev.desci.com', - 'd2195goqok3wlx.amplifyapp.com', - 'd3ge8gcb3rt5iw.amplifyapp.com', - 'desci.com', - 'gitpod.io', - 'loca.lt' /** NOT SECURE */, - 'vercel.app' /** NOT SECURE */, -]; - -const corsOptionsDelegate = function (req, callback) { - let corsOptions; - const origin = req.header('Origin'); - const allowed = allowlist.indexOf(origin) !== -1; - logger.info({ fn: 'corsOptionsDelegate', origin, allowed }, `in cors ${origin} ${allowed}`); - if (allowed) { - corsOptions = { origin: true, credentials: true }; // reflect (enable) the requested origin in the CORS response - } else { - corsOptions = { origin: false }; // disable CORS for this request - } - callback(null, corsOptions); // callback expects two parameters: error and options -}; - -// app.use(cors(corsOptionsDelegate)); -app.use(function (req, res, next) { - const origin = req.headers.origin; - if ( - allowlist.indexOf(origin) !== -1 || - allowlist.filter((a) => a.indexOf('http') != 0 && origin && origin.endsWith(a)).length - ) { - res.setHeader('Access-Control-Allow-Origin', origin); - res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,Content-Type,Authorization,sentry-trace,baggage'); - res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PATCH, OPTIONS, PUT, DELETE'); - res.setHeader('Access-Control-Allow-Credentials', 'true'); - // if (req.headers['set-cookie']) { - // res.setHeader('set-cookie', req.headers['set-cookie']); - // } - } - next(); -}); - -app.use( - createProxyMiddleware({ - target: process.env.NODES_MEDIA_SERVER_URL, - changeOrigin: true, - pathFilter: ['/v1/latex/upload', '/v1/latex/compile'], - }), -); - -// app.use(cors()); -app.use(helmet()); -app.use(bodyParser.json({ limit: '100mb' })); -app.use(bodyParser.urlencoded({ extended: false })); -const oneYear = 1000 * 60 * 60 * 24 * 365; -// app.use( -// session({ -// secret: process.env.SESSION_KEY, -// resave: true, -// saveUninitialized: true, -// cookie: { maxAge: oneYear, ...(process.env.NODE_ENV == 'dev' ? {} : { sameSite: 'none', secure: true }) }, -// store: new PrismaSessionStore(prisma, { -// checkPeriod: 2 * 60 * 1000, //ms -// dbRecordIdIsSessionId: true, -// dbRecordIdFunction: undefined, -// }), -// }), -// ); -app.use(cookieParser()); -app.set('trust proxy', 2); // detect AWS ELB IP + cloudflare - -app.get('/readyz', (req, res) => { - res.status(200).json({ status: 'ok' }); -}); - -app.get('/orcid', orcidConnect); -// orcid/next is the v2 orcid flow -app.post('/orcid/next', [ensureUserIfPresent], orcidCheck()); - -app.use('/', routes); - -if (ENABLE_TELEMETRY) { - app.use(Sentry.Handlers.errorHandler()); -} - -app.use(errorHandler); - -const port = process.env.PORT || 5420; -app.listen(port, () => { - logger.info(`Server running on port ${port}`); +server.ready().then((_) => { + console.log('server is ready'); }); +export const app = server.app; diff --git a/desci-server/src/lib/PostgresStorageAdapter.ts b/desci-server/src/lib/PostgresStorageAdapter.ts new file mode 100644 index 000000000..c1a85345e --- /dev/null +++ b/desci-server/src/lib/PostgresStorageAdapter.ts @@ -0,0 +1,99 @@ +import path from 'path'; + +import { Chunk, StorageAdapter, StorageKey } from '@automerge/automerge-repo'; + +import { prisma } from '../client.js'; +import { logger as parentLogger } from '../logger.js'; + +const logger = parentLogger.child({ module: 'PostgresStorageAdapter' }); +export class PostgresStorageAdapter extends StorageAdapter { + private client: typeof prisma; + private cache: { [key: string]: Uint8Array } = {}; + + constructor(client: typeof prisma) { + super(); + this.client = client; + } + + async load(keyArray: StorageKey): Promise { + const key = getKey(keyArray); + if (this.cache[key]) return this.cache[key]; + + try { + // logger.trace({ action: 'Load', key }, 'PostgresStorageAdaptser::Load'); + const response = await this.client.documentStore.findFirst({ where: { key } }); + if (!response) return undefined; + return new Uint8Array(response.value); + } catch (error) { + logger.error({ action: 'Load', key }, 'PostgresStorageAdaptser::Load ==> Error loading document'); + throw error; + } + } + + async save(keyArray: StorageKey, binary: Uint8Array): Promise { + const key = getKey(keyArray); + this.cache[key] = binary; + + try { + logger.info({ action: 'Save', key }, 'PostgresStorageAdaptser::Save'); + await this.client.documentStore.upsert({ + where: { key }, + create: { key, value: Buffer.from(binary) }, + update: { value: Buffer.from(binary) }, + }); + } catch (e) { + logger.error({ e }, 'PostgresStorageAdapter::Save ==> Error saving document'); + } + } + + async remove(keyArray: string[]): Promise { + const key = getKey(keyArray); + // remove from cache + delete this.cache[key]; + try { + logger.info({ action: 'Remove', key }, 'PostgresStorageAdaptser::Remove'); + await this.client.documentStore.delete({ where: { key: key } }); + } catch (e) { + logger.error({ e }, 'PostgresStorageAdapter::Remove ==> Error deleting document'); + } + } + + async loadRange(keyPrefix: StorageKey): Promise { + const cachedKeys = this.cachedKeys(keyPrefix); + const storedKeys = await this.loadRangeKeys(keyPrefix); + const allKeys = [...new Set([...cachedKeys, ...storedKeys])]; + + const chunks = await Promise.all( + allKeys.map(async (keyString) => { + const key: StorageKey = keyString.split(path.sep); + const data = await this.load(key); + return { data, key }; + }), + ); + return chunks; + } + + async removeRange(keyPrefix: StorageKey): Promise { + const key = getKey(keyPrefix); + this.cachedKeys(keyPrefix).forEach((key) => delete this.cache[key]); + try { + await this.client.documentStore.deleteMany({ where: { key: { startsWith: key } } }); + } catch (e) {} + } + + private cachedKeys(keyPrefix: string[]): string[] { + const cacheKeyPrefixString = getKey(keyPrefix); + return Object.keys(this.cache).filter((key) => key.startsWith(cacheKeyPrefixString)); + } + + private async loadRangeKeys(keyPrefix: string[]): Promise { + const response = await this.client.documentStore.findMany({ + where: { key: { startsWith: getKey(keyPrefix) } }, + select: { key: true }, + }); + return response.map((row) => row.key); + } +} + +// HELPERS +const getKey = (key: StorageKey): string => path.join(...key); diff --git a/desci-server/src/logger.ts b/desci-server/src/logger.ts index a0de6a8be..530ad52ee 100644 --- a/desci-server/src/logger.ts +++ b/desci-server/src/logger.ts @@ -1,4 +1,10 @@ -import pino from 'pino'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +import { pino } from 'pino'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); const logLevel = process.env.PINO_LOG_LEVEL || 'trace'; @@ -10,13 +16,15 @@ const devTransport = { }, }; +console.log('[DIR NAME]::', __dirname, __filename, logLevel); + const fileTransport = { target: 'pino/file', options: { destination: `${__dirname}/../log/server.log` }, level: 'trace', }; -const logger = pino({ +export const logger = pino({ level: logLevel, serializers: { files: omitBuffer, @@ -52,7 +60,6 @@ const logger = pino({ ], }, }); -export default logger; function omitBuffer(array) { return array.map((obj) => { diff --git a/desci-server/src/middleware/authorisation.ts b/desci-server/src/middleware/authorisation.ts new file mode 100644 index 000000000..9a3ce6a2d --- /dev/null +++ b/desci-server/src/middleware/authorisation.ts @@ -0,0 +1,115 @@ +import { Node, User } from '@prisma/client'; +import { Request, Response, NextFunction } from 'express'; + +import { prisma } from '../client.js'; +// import { CustomError } from '../utils/response/custom-error/CustomError'; +import { logger as parentLogger } from '../logger.js'; +import { hideEmail } from '../utils.js'; + +// import { extractAuthToken, extractUserFromToken } from './permissions.js'; + +export interface RequestWithUser extends Request { + user: User; +} + +export interface RequestWithNode extends RequestWithUser { + node: Node; +} + +export const ensureWriteNodeAccess = async (req: RequestWithUser, res: Response, next: NextFunction) => { + // Comes after ensureUser middleware, or if formdata fields are used, it should come after the middleware processing the formdata. + const user = req.user; + const { uuid } = req.body; + const logger = parentLogger.child({ + module: 'MIDDLEWARE::ensureWriteAccess', + user: { id: user.id }, + uuid: uuid, + }); + logger.info({ body: req.body }, 'Entered EnsureNodeAccess'); + if (!user || !uuid) { + logger.warn(user, `unauthed user entered ensureWriteAccess middleware, rejecting`); + return res.status(401).send({ ok: false, message: 'Unauthorized' }); + } + //validate requester owns the node + const node = await prisma.node.findFirst({ + where: { + ownerId: user.id, + uuid: uuid.endsWith('.') ? uuid : uuid + '.', + }, + }); + if (!node) { + logger.warn(user, `unauthed node user: ${user.id}, node uuid provided: ${uuid}`); + return res.status(401).send({ ok: false, message: 'Unauthorized' }); + } + (req as any).node = node; + return next(); +}; + +export const ensureNodeAccess = async (req: RequestWithUser, res: Response, next: NextFunction) => { + const user = req.user; + const uuid = req.body?.uuid || req.query?.uuid || req.params?.uuid; + const logger = parentLogger.child({ + module: 'MIDDLEWARE::ensureNodeAccess', + user: { id: user?.id }, + uuid, + }); + logger.info('START EnsureNodeAccess'); + + if (!(user && user.id > 0)) { + res.status(401).send({ ok: false, message: 'Unauthorized' }); + return; + } + (req as RequestWithUser).user = user; + + if (!uuid) { + logger.error({ uuid: req.body.uuid, body: req.body }, 'No UUID Found'); + res.status(400).send({ ok: false, message: 'Bad Request: Uuid Missing' }); + return; + } + logger.info('[EnsureNodeAccess]:: => ', { email: hideEmail(user.email), uuid }); + + const node = await prisma.node.findFirst({ + where: { uuid: uuid.endsWith('.') ? uuid : uuid + '.', ownerId: user.id }, + }); + + if (!node) { + res.status(400).send({ ok: false, message: `Node: ${uuid} not found` }); + return; + } + + (req as RequestWithNode).node = node; + logger.info({ uuid, user: user.id }, 'Access Granted'); + next(); +}; + +interface EnsureWriteAccessCheckResult { + ok: boolean; + node?: Node; +} + +export async function ensureWriteAccessCheck(user: User, uuid: string): Promise { + const logger = parentLogger.child({ + module: 'MIDDLEWARE::ensureWriteAccess', + user, + uuid: uuid, + }); + + if (!user || !uuid) { + logger.warn(user, `unauthed user entered ensureWriteAccess middleware, rejecting`); + return { ok: false }; + } + + //validate requester owns the node + const node = await prisma.node.findFirst({ + where: { + ownerId: user.id, + uuid: uuid.endsWith('.') ? uuid : uuid + '.', + }, + }); + if (!node) { + logger.warn(user, `unauthed node user: ${user.id}, node uuid provided: ${uuid}`); + return { ok: false }; + } + + return { ok: true, node }; +} diff --git a/desci-server/src/middleware/checkJwt.ts b/desci-server/src/middleware/checkJwt.ts index 3a5624e93..e3da249b6 100755 --- a/desci-server/src/middleware/checkJwt.ts +++ b/desci-server/src/middleware/checkJwt.ts @@ -1,11 +1,10 @@ import { Request, Response, NextFunction } from 'express'; import jwt from 'jsonwebtoken'; -import { oneYear } from 'controllers/auth'; - -import { JwtPayload } from '../types/JwtPayload'; -import { createJwtToken } from '../utils/createJwtToken'; -import { CustomError } from '../utils/response/custom-error/CustomError'; +import { oneYear } from '../controllers/auth/magic.js'; +import { JwtPayload } from '../types/JwtPayload.js'; +import { createJwtToken } from '../utils/createJwtToken.js'; +import { CustomError } from '../utils/response/custom-error/CustomError.js'; export const checkJwt = (req: Request, res: Response, next: NextFunction) => { let token: string | undefined; diff --git a/desci-server/src/middleware/ensureUser.ts b/desci-server/src/middleware/ensureUser.ts index 0e2bc72ce..77ebde032 100755 --- a/desci-server/src/middleware/ensureUser.ts +++ b/desci-server/src/middleware/ensureUser.ts @@ -1,20 +1,17 @@ import { User } from '@prisma/client'; import { Request, Response, NextFunction } from 'express'; -import jwt from 'jsonwebtoken'; -import prisma from 'client'; -import logger from 'logger'; -import { getUserByEmail, getUserByOrcId } from 'services/user'; +import { extractAuthToken, extractUserFromToken } from './permissions.js'; -export const ensureUser = async (req: Request, res: Response, next: NextFunction) => { - const retrievedUser = await retrieveUser(req); - if (!retrievedUser) { - res.status(401).send({ ok: false, message: 'Unauthorized' }); - return; - } - (req as any).user = retrievedUser; - next(); -}; +// export const ensureUser = async (req: Request, res: Response, next: NextFunction) => { +// const retrievedUser = await retrieveUser(req); +// if (!retrievedUser) { +// res.status(401).send({ ok: false, message: 'Unauthorized' }); +// return; +// } +// (req as any).user = retrievedUser; +// next(); +// }; /** * Attaches the user to the request (req.user), the difference between this middleware and ensureUser is that this is optional @@ -27,50 +24,7 @@ export const attachUser = async (req: Request, res: Response, next: NextFunction }; export const retrieveUser = async (req: Request): Promise => { - let token: string | undefined; - // Try to retrieve the token from the auth header - const authHeader = req.headers['authorization']; - if (authHeader) { - token = authHeader.split(' ')[1]; - } - - // If auth token wasn't found in the header, try retrieve from cookies - if (!token && req.cookies) { - token = req.cookies['auth']; - } - - return new Promise(async (success, fail) => { - if (!token) { - success(null); - return; - } - - jwt.verify(token, process.env.JWT_SECRET as string, async (err: any, user: any) => { - if (err) { - // anonymous user - logger.info({ module: 'retrieveUserMiddleware', authHeader, token }, 'anon request'); - success(null); - return; - } - - if (!user) { - success(null); - return; - } - - const loggedInUserEmail = user.email as string; - const shouldFetchUserByOrcId = Boolean(user.orcid); - - const retrievedUser = shouldFetchUserByOrcId - ? await getUserByOrcId(user.orcid) - : await getUserByEmail(loggedInUserEmail); - - if (!retrievedUser || !retrievedUser.id) { - success(null); - return; - } - - success(retrievedUser); - }); - }); + const token = await extractAuthToken(req); + const retrievedUser = await extractUserFromToken(token); + return retrievedUser; }; diff --git a/desci-server/src/middleware/ensureUserIfPresent.ts b/desci-server/src/middleware/ensureUserIfPresent.ts index 7072ebec6..c772924c3 100644 --- a/desci-server/src/middleware/ensureUserIfPresent.ts +++ b/desci-server/src/middleware/ensureUserIfPresent.ts @@ -1,12 +1,6 @@ -import { User } from '@prisma/client'; import { Request, Response, NextFunction } from 'express'; -import jwt from 'jsonwebtoken'; -import prisma from 'client'; - -import { CustomError } from '../utils/response/custom-error/CustomError'; - -import { retrieveUser } from './ensureUser'; +import { retrieveUser } from './ensureUser.js'; export const ensureUserIfPresent = async (req: Request, res: Response, next: NextFunction) => { const retrievedUser = await retrieveUser(req); diff --git a/desci-server/src/middleware/ensureWriteAccess.ts b/desci-server/src/middleware/ensureWriteAccess.ts deleted file mode 100644 index e9ff57b81..000000000 --- a/desci-server/src/middleware/ensureWriteAccess.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { Node, User } from '@prisma/client'; -import { Request, Response, NextFunction } from 'express'; - -import prisma from 'client'; -import parentLogger from 'logger'; - -export interface AuthedRequest extends Request { - user?: User; - node?: Node; -} - -export const ensureWriteAccess = async (req: Request, res: Response, next: NextFunction) => { - // Comes after ensureUser middleware, or if formdata fields are used, it should come after the middleware processing the formdata. - const user = (req as any).user; - const { uuid } = req.body; - - const logger = parentLogger.child({ - module: 'MIDDLEWARE::ensureWriteAccess', - user, - uuid: uuid, - }); - - if (!user || !uuid) { - logger.warn(user, `unauthed user entered ensureWriteAccess middleware, rejecting`); - return res.status(401).send({ ok: false, message: 'Unauthorized' }); - } - - //validate requester owns the node - const node = await prisma.node.findFirst({ - where: { - ownerId: user.id, - uuid: uuid.endsWith('.') ? uuid : uuid + '.', - }, - }); - if (!node) { - logger.warn(user, `unauthed node user: ${user.id}, node uuid provided: ${uuid}`); - return res.status(401).send({ ok: false, message: 'Unauthorized' }); - } - - (req as any).node = node; - return next(); -}; - -interface EnsureWriteAccessCheckResult { - ok: boolean; - node?: Node; -} - -export async function ensureWriteAccessCheck(user: User, uuid: string): Promise { - const logger = parentLogger.child({ - module: 'MIDDLEWARE::ensureWriteAccess', - user, - uuid: uuid, - }); - - if (!user || !uuid) { - logger.warn(user, `unauthed user entered ensureWriteAccess middleware, rejecting`); - return {ok: false} - } - - //validate requester owns the node - const node = await prisma.node.findFirst({ - where: { - ownerId: user.id, - uuid: uuid.endsWith('.') ? uuid : uuid + '.', - }, - }); - if (!node) { - logger.warn(user, `unauthed node user: ${user.id}, node uuid provided: ${uuid}`); - return {ok: false} - } - - return {ok: true, node} -} \ No newline at end of file diff --git a/desci-server/src/middleware/errorHandler.ts b/desci-server/src/middleware/errorHandler.ts index a39f51e33..99af1fd4d 100755 --- a/desci-server/src/middleware/errorHandler.ts +++ b/desci-server/src/middleware/errorHandler.ts @@ -1,6 +1,6 @@ import { Request, Response, NextFunction } from 'express'; -import { CustomError } from '../utils/response/custom-error/CustomError'; +import { CustomError } from '../utils/response/custom-error/CustomError.js'; export const errorHandler = (err: CustomError, req: Request, res: Response, next: NextFunction) => { return res.status(err.HttpStatusCode || 500).json(err.JSON || err.stack || err.message); diff --git a/desci-server/src/middleware/permissions.ts b/desci-server/src/middleware/permissions.ts new file mode 100644 index 000000000..671a4894f --- /dev/null +++ b/desci-server/src/middleware/permissions.ts @@ -0,0 +1,96 @@ +import { User } from '@prisma/client'; +import { NextFunction, Request as ExpressRequest, Response } from 'express'; +import jwt from 'jsonwebtoken'; + +import { logger } from '../logger.js'; +import { getUserByEmail, getUserByOrcId } from '../services/user.js'; + +export const ensureUser = async (req: ExpressRequest, res: Response, next: NextFunction) => { + const token = await extractAuthToken(req); + const retrievedUser = await extractUserFromToken(token); + if (!retrievedUser) { + res.status(401).send({ ok: false, message: 'Unauthorized' }); + } else { + (req as any).user = retrievedUser; + next(); + } +}; + +/** + * Extract JWT Authorisation token from IncommingRequest + */ +export const extractAuthToken = async (request: ExpressRequest | Request) => { + let token: string | undefined; + // get from query string + token = request.url.split('auth=')[1]; + // logger.info({ url: request.url, token }, 'got url extract'); + if (!token) { + // Try to retrieve the token from the auth header + const authHeader = request.headers['authorization']; + if (authHeader) { + token = authHeader.split(' ')[1]; + } + logger.info({ module: 'Permissions::extractAuthToken', authHeaderLength: authHeader?.length || 0 }, 'Request'); + + // If auth token wasn't found in the header, try retrieve from cookies + if (!token && request['cookies']) { + token = request['cookies']['auth']; + } + + // If Auth token is null and request.headers.cookie is valid, attempt to parse auth token from cookie + // Request.Headers.Cookie is of the format `auth=tokenvalue; path=/` + if (!token && request.headers['cookie']) { + const parsedTokenValue = request.headers['cookie'] + .split(';') + .map((entry) => entry.split('=')) + .filter(([key]) => key.trim().toLowerCase() === 'auth')[0]; + token = parsedTokenValue?.[1]; + // console.log('parsedTokenValue', parsedTokenValue); + } + } + return token; +}; + +/** + * Attempt to retrieve user from JWT Authorisation token + */ +export const extractUserFromToken = async (token: string): Promise => { + return new Promise(async (resolve, reject) => { + if (!token) { + resolve(null); + return; + } + + jwt.verify(token, process.env.JWT_SECRET as string, async (err: any, user: any) => { + if (err) { + logger.error({ module: 'ExtractAuthUser', err }, 'anon request'); + // reject(err); + resolve(null); + return; + } + + // logger.info({ module: 'ExtractAuthUser', user }, 'User decrypted'); + + if (!user) { + resolve(null); + return; + } + + const loggedInUserEmail = user.email as string; + const shouldFetchUserByOrcId = Boolean(user.orcid); + + const retrievedUser = shouldFetchUserByOrcId + ? await getUserByOrcId(user.orcid) + : await getUserByEmail(loggedInUserEmail); + + // logger.info({ user: retrievedUser.id }, 'User Retrieved'); + + if (!retrievedUser || !retrievedUser.id) { + resolve(null); + return; + } + + resolve(retrievedUser); + }); + }); +}; diff --git a/desci-server/src/middleware/upgradeManifest.ts b/desci-server/src/middleware/upgradeManifest.ts index 762f7fcd9..1602fbb42 100644 --- a/desci-server/src/middleware/upgradeManifest.ts +++ b/desci-server/src/middleware/upgradeManifest.ts @@ -7,11 +7,11 @@ import { import { DataType } from '@prisma/client'; import { Request, Response, NextFunction } from 'express'; -import prisma from 'client'; -import { getLatestManifest, persistManifest } from 'controllers/data/utils'; -import { createDag, createEmptyDag, FilesToAddToDag, getDirectoryTree, strIsCid } from 'services/ipfs'; -import { ensureUniqueString } from 'utils'; -import { addComponentsToManifest } from 'utils/driveUtils'; +import { prisma } from '../client.js'; +import { getLatestManifest, persistManifest } from '../controllers/data/utils.js'; +import { createDag, createEmptyDag, FilesToAddToDag, getDirectoryTree, strIsCid } from '../services/ipfs.js'; +import { DANGEROUSLY_addComponentsToManifest } from '../utils/driveUtils.js'; +import { ensureUniqueString } from '../utils.js'; /* upgrades the manifest from the old opiniated version to the unopiniated version @@ -144,8 +144,8 @@ export const upgradeManifestTransformer = async (req: Request, res: Response, ne path === researchReportPath ? ResearchObjectComponentType.PDF : path === codeReposPath - ? ResearchObjectComponentType.CODE - : ResearchObjectComponentType.DATA, + ? ResearchObjectComponentType.CODE + : ResearchObjectComponentType.DATA, }; }); @@ -158,7 +158,7 @@ export const upgradeManifestTransformer = async (req: Request, res: Response, ne }, }; manifestObj.components.unshift(dataBucketComponent); - manifestObj = addComponentsToManifest(manifestObj, opinionatedDirsFormatted); + manifestObj = DANGEROUSLY_addComponentsToManifest(manifestObj, opinionatedDirsFormatted); const dagTree = await getDirectoryTree(rootDagCid, {}); const flatTree = recursiveFlattenTree(dagTree); diff --git a/desci-server/src/redisClient.ts b/desci-server/src/redisClient.ts index 819faa211..08fc8f813 100644 --- a/desci-server/src/redisClient.ts +++ b/desci-server/src/redisClient.ts @@ -1,6 +1,6 @@ import { createClient } from 'redis'; -import parentLogger from 'logger'; +import { logger as parentLogger } from './logger.js'; const logger = parentLogger.child({ module: 'RedisClient', }); diff --git a/desci-server/src/repo.ts b/desci-server/src/repo.ts new file mode 100644 index 000000000..faa289291 --- /dev/null +++ b/desci-server/src/repo.ts @@ -0,0 +1,73 @@ +import os from 'os'; + +import { DocHandleChangePayload, DocHandleEvents, PeerId, Repo, RepoConfig } from '@automerge/automerge-repo'; +import { NodeWSServerAdapter } from '@automerge/automerge-repo-network-websocket'; +import { WebSocketServer } from 'ws'; + +import { prisma } from './client.js'; +import { PostgresStorageAdapter } from './lib/PostgresStorageAdapter.js'; +import { logger } from './logger.js'; +import { verifyNodeDocumentAccess } from './services/permissions.js'; +import { ResearchObjectDocument } from './types/documents.js'; + +// export const socket = new WebSocketServer({ port: 5446, path: '/sync' }); +const hostname = os.hostname(); + +// const adapter = new NodeWSServerAdapter(socket); +const config: RepoConfig = { + network: [], + storage: new PostgresStorageAdapter(prisma), + peerId: `storage-server-${hostname}` as PeerId, + // Since this is a server, we don't share generously — meaning we only sync documents they already + // know about and can ask for by ID. + sharePolicy: async (peerId, documentId) => { + return false; + // try { + // // peer format: `peer-[user#id]:[unique string combination] + // if (peerId.toString().length < 8) return false; + + // const userId = peerId.split(':')?.[0]?.split('-')?.[1]; + // const isAuthorised = await verifyNodeDocumentAccess(Number(userId), documentId); + // logger.trace({ peerId, userId, documentId, isAuthorised }, '[SHARE POLICY CALLED]::'); + // return isAuthorised; + // } catch (err) { + // logger.error({ err }, 'Error in share policy'); + // return false; + // } + }, +}; + +export const backendRepo = new Repo(config); + +const handleChange = async (change: DocHandleChangePayload) => { + logger.trace({ change: change.handle.documentId, uuid: (await change.handle.doc()).uuid }, 'Document Changed'); + const newTitle = change.patchInfo.after.manifest.title; + const newCover = change.patchInfo.after.manifest.coverImage; + const uuid = change.doc.uuid; + logger.info({ uuid: uuid + '.', newTitle }, 'UPDATE NODE'); + + await prisma.node.updateMany({ + where: { uuid: uuid + '.' }, + data: { title: newTitle }, + }); + + // Update the cover image url in the db for fetching collection + if (newCover) { + const coverUrl = process.env.IPFS_RESOLVER_OVERRIDE + newCover; + await prisma.nodeCover.upsert({ + where: { nodeUuid_version: { nodeUuid: uuid + '.', version: 0 } }, + update: { url: coverUrl, cid: newCover as string }, + create: { nodeUuid: uuid + '.', url: coverUrl, cid: newCover as string }, + }); + } +}; + +backendRepo.on('document', async (doc) => { + doc.handle.on>('change', handleChange); +}); + +backendRepo.off('document', async (doc) => { + doc.handle.off('change', handleChange); +}); + +// todo: Recover from RangeError -> reset repo and return a new instance diff --git a/desci-server/src/routes/index.ts b/desci-server/src/routes/index.ts index 43f0d77e6..4fd6d1216 100755 --- a/desci-server/src/routes/index.ts +++ b/desci-server/src/routes/index.ts @@ -1,10 +1,10 @@ import { Router } from 'express'; -import { resolve } from 'controllers/raw/resolve'; +import { resolve } from '../controllers/raw/resolve.js'; -import page404 from './pages/404'; -import pageRoot from './pages/root'; -import v1 from './v1/'; +import page404 from './pages/404.js'; +import pageRoot from './pages/root.js'; +import v1 from './v1/index.js'; const router = Router(); diff --git a/desci-server/src/routes/pages/root.ts b/desci-server/src/routes/pages/root.ts index dbcfe732b..0d013b84b 100755 --- a/desci-server/src/routes/pages/root.ts +++ b/desci-server/src/routes/pages/root.ts @@ -3,7 +3,10 @@ import { Router } from 'express'; const router = Router(); router.get('/', (req, res, next) => { - res.status(200).header('Content-Type', 'text/html').send(`DeSci Nodes Server [docs]`); + res + .status(200) + .header('Content-Type', 'text/html') + .send(`DeSci Nodes Server [docs]`); }); export default router; diff --git a/desci-server/src/routes/v1/admin.ts b/desci-server/src/routes/v1/admin.ts index 6cdf93b30..af9e5ed13 100644 --- a/desci-server/src/routes/v1/admin.ts +++ b/desci-server/src/routes/v1/admin.ts @@ -1,8 +1,8 @@ import { Router } from 'express'; -import { createCsv, getAnalytics } from 'controllers/admin'; -import { ensureAdmin } from 'middleware/ensureAdmin'; -import { ensureUser } from 'middleware/ensureUser'; +import { createCsv, getAnalytics } from '../../controllers/admin/analytics.js'; +import { ensureAdmin } from '../../middleware/ensureAdmin.js'; +import { ensureUser } from '../../middleware/permissions.js'; const router = Router(); diff --git a/desci-server/src/routes/v1/auth.ts b/desci-server/src/routes/v1/auth.ts index 9123407f9..0981d0e36 100755 --- a/desci-server/src/routes/v1/auth.ts +++ b/desci-server/src/routes/v1/auth.ts @@ -11,11 +11,13 @@ import { orcidConnectClose, validateOrcid, magic, -} from 'controllers/auth'; -import { ensureUser } from 'middleware/ensureUser'; + check, +} from '../../controllers/auth/index.js'; +import { ensureUser } from '../../middleware/permissions.js'; const router = Router(); +router.get('/check', [ensureUser], check); router.post('/login', login); router.delete('/logout', logout); router.get('/profile', [ensureUser], profile); diff --git a/desci-server/src/routes/v1/data.ts b/desci-server/src/routes/v1/data.ts index 97d8a426e..54ff342ee 100644 --- a/desci-server/src/routes/v1/data.ts +++ b/desci-server/src/routes/v1/data.ts @@ -3,14 +3,15 @@ import multer = require('multer'); import multerS3 from 'multer-s3'; import { v4 } from 'uuid'; -import { pubTree, retrieveTree, deleteData, update, renameData } from 'controllers/data'; -import { diffData } from 'controllers/data/diff'; -import { moveData } from 'controllers/data/move'; -import { updateExternalCid } from 'controllers/data/updateExternalCid'; -import logger from 'logger'; -import { attachUser, ensureUser } from 'middleware/ensureUser'; -import { ensureWriteAccess, ensureWriteAccessCheck } from 'middleware/ensureWriteAccess'; -import { isS3Configured, s3Client } from 'services/s3'; +import { diffData } from '../../controllers/data/diff.js'; +import { pubTree, retrieveTree, deleteData, update, renameData } from '../../controllers/data/index.js'; +import { moveData } from '../../controllers/data/move.js'; +import { updateExternalCid } from '../../controllers/data/updateExternalCid.js'; +import { logger } from '../../logger.js'; +import { ensureNodeAccess, ensureWriteAccessCheck } from '../../middleware/authorisation.js'; +import { attachUser } from '../../middleware/ensureUser.js'; +import { ensureUser } from '../../middleware/permissions.js'; +import { isS3Configured, s3Client } from '../../services/s3.js'; const router = Router(); @@ -66,11 +67,11 @@ const wrappedHandler = (req, res, next) => { }); }; -router.post('/update', [ensureUser, wrappedHandler], update); -router.post('/updateExternalCid', [ensureUser], updateExternalCid); -router.post('/delete', [ensureUser], deleteData); -router.post('/rename', [ensureUser], renameData); -router.post('/move', [ensureUser], moveData); +router.post('/update', [ensureUser, wrappedHandler, ensureNodeAccess], update); +router.post('/updateExternalCid', [ensureUser, ensureNodeAccess], updateExternalCid); +router.post('/delete', [ensureUser, ensureNodeAccess], deleteData); +router.post('/rename', [ensureUser, ensureNodeAccess], renameData); +router.post('/move', [ensureUser, ensureNodeAccess], moveData); router.get('/retrieveTree/:nodeUuid/:manifestCid', [ensureUser], retrieveTree); router.get('/retrieveTree/:nodeUuid/:manifestCid/:shareId?', retrieveTree); router.get('/pubTree/:nodeUuid/:manifestCid/:rootCid?', pubTree); diff --git a/desci-server/src/routes/v1/index.ts b/desci-server/src/routes/v1/index.ts index 1367f3519..59fb1611a 100755 --- a/desci-server/src/routes/v1/index.ts +++ b/desci-server/src/routes/v1/index.ts @@ -1,22 +1,22 @@ import { Router } from 'express'; -import { generateNonce, ErrorTypes, SiweMessage } from 'siwe'; +import { generateNonce } from 'siwe'; -import prisma from 'client'; -import { queryResearchFields } from 'controllers/data'; -import { queryRor } from 'controllers/proxy'; -import { nft } from 'controllers/raw'; -import { ensureUser } from 'middleware/ensureUser'; +import { prisma } from '../../client.js'; +import { queryResearchFields } from '../../controllers/data/index.js'; +import { queryRor } from '../../controllers/proxy/index.js'; +import { nft } from '../../controllers/raw/nft.js'; +import { ensureUser } from '../../middleware/permissions.js'; -import admin from './admin'; -import auth from './auth'; -import data from './data'; -import log from './log'; -import nodes from './nodes'; -import pub from './pub'; -import referral from './referral'; -import services from './services'; -import users from './users'; -import waitlist from './waitlist'; +import admin from './admin.js'; +import auth from './auth.js'; +import data from './data.js'; +import log from './log.js'; +import nodes from './nodes.js'; +import pub from './pub.js'; +import referral from './referral.js'; +import services from './services.js'; +import users from './users.js'; +import waitlist from './waitlist.js'; const router = Router(); diff --git a/desci-server/src/routes/v1/log.ts b/desci-server/src/routes/v1/log.ts index c6728aeba..d341f283e 100644 --- a/desci-server/src/routes/v1/log.ts +++ b/desci-server/src/routes/v1/log.ts @@ -1,7 +1,7 @@ import { Router } from 'express'; -import { logUserAction } from 'controllers/log/index'; -import { ensureUserIfPresent } from 'middleware/ensureUserIfPresent'; +import { logUserAction } from '../../controllers/log/index.js'; +import { ensureUserIfPresent } from '../../middleware/ensureUserIfPresent.js'; const router = Router(); diff --git a/desci-server/src/routes/v1/nodes.ts b/desci-server/src/routes/v1/nodes.ts index 07f2e0328..81e242f40 100755 --- a/desci-server/src/routes/v1/nodes.ts +++ b/desci-server/src/routes/v1/nodes.ts @@ -1,5 +1,7 @@ import { Router } from 'express'; +import { getNodeDocument } from '../../controllers/nodes/documents.js'; +import { feed } from '../../controllers/nodes/feed.js'; import { show, draftUpdate, @@ -11,21 +13,25 @@ import { consent, api, publish, + checkPrivateShareId, createPrivateShare, revokePrivateShare, getPrivateShare, - checkPrivateShareId, getCoverImage, deleteNode, -} from 'controllers/nodes/index'; -import { retrieveTitle } from 'controllers/nodes/legacyManifestApi'; -import { versionDetails } from 'controllers/nodes/versionDetails'; -import { ensureUser } from 'middleware/ensureUser'; +} from '../../controllers/nodes/index.js'; +import { retrieveTitle } from '../../controllers/nodes/legacyManifestApi.js'; +import { prepublish } from '../../controllers/nodes/prepublish.js'; +import { versionDetails } from '../../controllers/nodes/versionDetails.js'; +import { ensureNodeAccess } from '../../middleware/authorisation.js'; +import { ensureUser } from '../../middleware/permissions.js'; const router = Router(); +router.post('/prepublish', [ensureUser, ensureNodeAccess], prepublish); router.post('/publish', [ensureUser], publish); router.post('/createDraft', [ensureUser], draftCreate); +// is this api deprecated? router.post('/addComponentToDraft', [ensureUser], draftAddComponent); router.post('/updateDraft', [ensureUser], draftUpdate); router.get('/versionDetails', [], versionDetails); @@ -40,9 +46,12 @@ router.post('/share/:uuid', [ensureUser], createPrivateShare); router.post('/revokeShare/:uuid', [ensureUser], revokePrivateShare); router.get('/cover/:uuid', [], getCoverImage); router.get('/cover/:uuid/:version', [], getCoverImage); +router.get('/documents/:uuid', [ensureUser, ensureNodeAccess], getNodeDocument); router.delete('/:uuid', [ensureUser], deleteNode); +router.get('/feed', [], feed); + router.get('/legacy/retrieveTitle', retrieveTitle); router.post('/api/*', [], api); diff --git a/desci-server/src/routes/v1/pub.ts b/desci-server/src/routes/v1/pub.ts index 45f1860b3..cf37ae9b5 100644 --- a/desci-server/src/routes/v1/pub.ts +++ b/desci-server/src/routes/v1/pub.ts @@ -1,6 +1,6 @@ import { Router } from 'express'; -import { versions } from 'controllers/raw'; +import { versions } from '../../controllers/raw/versions.js'; const router = Router(); diff --git a/desci-server/src/routes/v1/referral.ts b/desci-server/src/routes/v1/referral.ts index e9103d32b..01055a4cd 100644 --- a/desci-server/src/routes/v1/referral.ts +++ b/desci-server/src/routes/v1/referral.ts @@ -1,7 +1,9 @@ import { Router } from 'express'; -import { getReferralsByUserId, newReferral, acceptReferralById } from 'controllers/referral'; -import { ensureUser } from 'middleware/ensureUser'; +import { acceptReferralById } from '../../controllers/referral/acceptReferralById.js'; +import { newReferral } from '../../controllers/referral/newReferral.js'; +import { ensureUser } from '../../middleware/permissions.js'; +import { getReferralsByUserId } from '../../services/friendReferral.js'; const router = Router(); diff --git a/desci-server/src/routes/v1/services.ts b/desci-server/src/routes/v1/services.ts index a3b260003..548be06e2 100644 --- a/desci-server/src/routes/v1/services.ts +++ b/desci-server/src/routes/v1/services.ts @@ -1,6 +1,6 @@ import { Router } from 'express'; -import { orcidDid, orcidProfile } from 'controllers/proxy/orcidProfile'; +import { orcidDid, orcidProfile } from '../../controllers/proxy/orcidProfile.js'; const router = Router(); diff --git a/desci-server/src/routes/v1/users.ts b/desci-server/src/routes/v1/users.ts index e50835d44..0aa5ab0a7 100755 --- a/desci-server/src/routes/v1/users.ts +++ b/desci-server/src/routes/v1/users.ts @@ -1,10 +1,9 @@ import { Router } from 'express'; -import { list, associateWallet, updateProfile, associateOrcidWallet } from 'controllers/users'; -import { usage } from 'controllers/users/usage'; -import { checkJwt } from 'middleware/checkJwt'; -import { ensureAdmin } from 'middleware/ensureAdmin'; -import { ensureUser } from 'middleware/ensureUser'; +import { list, associateWallet, updateProfile, associateOrcidWallet } from '../../controllers/users/index.js'; +import { usage } from '../../controllers/users/usage.js'; +import { ensureAdmin } from '../../middleware/ensureAdmin.js'; +import { ensureUser } from '../../middleware/permissions.js'; const router = Router(); diff --git a/desci-server/src/routes/v1/waitlist.ts b/desci-server/src/routes/v1/waitlist.ts index 9eb853cd2..54c048b77 100644 --- a/desci-server/src/routes/v1/waitlist.ts +++ b/desci-server/src/routes/v1/waitlist.ts @@ -1,8 +1,8 @@ import { Router } from 'express'; -import { add, list, promote } from 'controllers/waitlist'; -import { ensureAdmin } from 'middleware/ensureAdmin'; -import { ensureUser } from 'middleware/ensureUser'; +import { add, list, promote } from '../../controllers/waitlist/index.js'; +import { ensureAdmin } from '../../middleware/ensureAdmin.js'; +import { ensureUser } from '../../middleware/permissions.js'; const router = Router(); diff --git a/desci-server/src/scripts/activeUsers.ts b/desci-server/src/scripts/activeUsers.ts index 3c0178c3b..d004a5afb 100644 --- a/desci-server/src/scripts/activeUsers.ts +++ b/desci-server/src/scripts/activeUsers.ts @@ -1,5 +1,5 @@ -import logger from 'logger'; -import { getEmailsActiveUsersInXDays } from 'services/interactionLog'; +import { logger } from '../logger.js'; +import { getEmailsActiveUsersInXDays } from '../services/interactionLog.js'; (async () => { const [users7, users30, users90] = await Promise.all([ diff --git a/desci-server/src/scripts/dataRefDoctor.ts b/desci-server/src/scripts/dataRefDoctor.ts index 61d170400..3b6490a29 100644 --- a/desci-server/src/scripts/dataRefDoctor.ts +++ b/desci-server/src/scripts/dataRefDoctor.ts @@ -1,13 +1,13 @@ -import { DataType, Node, Prisma } from '@prisma/client'; +import { DataType, Prisma } from '@prisma/client'; import axios from 'axios'; -import prisma from 'client'; -import { cleanupManifestUrl } from 'controllers/nodes'; -import parentLogger from 'logger'; -import { getSizeForCid } from 'services/ipfs'; -import { getIndexedResearchObjects } from 'theGraph'; -import { hexToCid } from 'utils'; -import { validateAndHealDataRefs, validateDataReferences } from 'utils/dataRefTools'; +import { prisma } from '../client.js'; +import { logger as parentLogger } from '../logger.js'; +import { getSizeForCid } from '../services/ipfs.js'; +import { getIndexedResearchObjects } from '../theGraph.js'; +import { validateAndHealDataRefs, validateDataReferences } from '../utils/dataRefTools.js'; +import { cleanupManifestUrl } from '../utils/manifest.js'; +import { hexToCid } from '../utils.js'; /* Usage Guidelines: diff --git a/desci-server/src/scripts/endorseDpid.ts b/desci-server/src/scripts/endorseDpid.ts new file mode 100644 index 000000000..8b706b77b --- /dev/null +++ b/desci-server/src/scripts/endorseDpid.ts @@ -0,0 +1,120 @@ +import { ResearchObject, ResearchObjectV1 } from '@desci-labs/desci-models'; +import fetch from 'node-fetch'; + +import { prisma } from '../client.js'; +import { encodeBase64UrlSafe } from '../utils.js'; + +interface DpidDataEntry { + dpid: string; + id: string; + recentCid: string; + researchObject: DpidResearchObject; +} + +interface DpidResearchObject { + id: string; + versions: DpidVersion[]; +} + +interface DpidVersion { + id: string; + time: number; + cid: string; + index: number; +} + +// Example of how to type an array of these data entries +type DataEntries = DpidDataEntry[]; + +export const endorseDpid = async (dpid: string) => { + // const node = await prisma.node.findFirst({ + // where: { + // uuid: dpid, + // }, + // }); + // if (node) { + const dpidResolver = `https://beta.dpid.org/api/v1/dpid?page=${parseInt(dpid) + 1}&size=1&sort=asc`; + console.log({ dpidResolver }); + const dpidResponse = await fetch(dpidResolver); + const dpidJson = await dpidResponse.json(); + const dpidData: DpidDataEntry = dpidJson[0]; + console.log({ dpidData }); + + let nodeUuid: string = dpidData.researchObject.id; + // convert hex string to integer + const nodeUuidInt = Buffer.from(nodeUuid.substring(2), 'hex'); + // convert integer to hex + nodeUuid = nodeUuidInt.toString('base64url'); + + const nodeUuidHex = dpidData.researchObject.id; + // convert to url-safe-base64 + // nodeUuid = encodeBase64UrlSafe(Buffer.from(nodeUuid, 'hex')); + + console.log({ + ogId: dpidData.researchObject.id.substring(2), + nodeUuid, + nodeUuidHex, + // nodeUuidInt, + }); + + const manifestCid = dpidData.recentCid; + const data = await fetch(`https://ipfs.desci.com/ipfs/${manifestCid}`); + const manifest = (await data.json()) as ResearchObjectV1; + const title = manifest.title || 'Untitled Node'; + const abstract = manifest.description || 'No description provided'; + const date = new Date(dpidData.researchObject.versions[dpidData.researchObject.versions.length - 1].time * 1000); + const authors = manifest.authors.map((author) => author.name).join(', '); + + const user = await prisma.user.upsert({ + where: { + email: 'sina@desci.com', + }, + create: { + email: 'sina@desci.com', + }, + update: {}, + }); + const userId = user.id; + + const desciCommunityId = await prisma.desciCommunity.upsert({ + create: { + name: 'DeSci Labs', + description: 'DeSci Labs Community', + }, + update: {}, + where: { + name: 'DeSci Labs', + }, + }); + + const feedItem = await prisma.nodeFeedItem.upsert({ + where: { + nodeDpid10: dpid, + }, + create: { + nodeDpid10: dpid, + nodeUuid, + nodeUuidHex, + manifestCid, + title, + date, + authors, + abstract, + nodeFeedItemEndorsement: { + create: { + nodeDpid10: dpid, + userId, + desciCommunityId: desciCommunityId.id, + type: 'validation', + }, + }, + }, + update: { title, date, authors, abstract }, + }); + + console.log('feedItem', { feedItem }); + // } +}; + +// use first argument as dpid +endorseDpid(process.argv[2]); diff --git a/desci-server/src/scripts/fill-research-fields.ts b/desci-server/src/scripts/fill-research-fields.ts index 5eccfcd74..fe704e442 100644 --- a/desci-server/src/scripts/fill-research-fields.ts +++ b/desci-server/src/scripts/fill-research-fields.ts @@ -1,6 +1,7 @@ -import prisma from 'client'; +import { prisma } from '../client.js'; const main = async () => { + // eslint-disable-next-line @typescript-eslint/no-var-requires const researchFieldsData = require('../../data/fields.json'); const parsedFields: { name: string }[] = researchFieldsData.map((name) => ({ name })); diff --git a/desci-server/src/scripts/increase-base-drive-storage.ts b/desci-server/src/scripts/increase-base-drive-storage.ts index 91f0ee296..8bb3ea6b6 100644 --- a/desci-server/src/scripts/increase-base-drive-storage.ts +++ b/desci-server/src/scripts/increase-base-drive-storage.ts @@ -1,6 +1,6 @@ import dotenv from 'dotenv'; -import prisma from 'client'; +import { prisma } from '../client.js'; dotenv.config({ path: '../.env' }); export const increaseBaseDriveStoragePreview = async (targetDriveStorageGb: number, shouldApply: boolean) => { diff --git a/desci-server/src/scripts/invalidate-redis-cache.ts b/desci-server/src/scripts/invalidate-redis-cache.ts index 3b6cf50a0..b9a303501 100644 --- a/desci-server/src/scripts/invalidate-redis-cache.ts +++ b/desci-server/src/scripts/invalidate-redis-cache.ts @@ -1,11 +1,11 @@ -import { ResearchObjectComponentType, isNodeRoot } from '@desci-labs/desci-models'; +import { isNodeRoot } from '@desci-labs/desci-models'; import axios from 'axios'; -import { cleanupManifestUrl } from 'controllers/nodes'; -import parentLogger from 'logger'; -import redisClient from 'redisClient'; -import { getIndexedResearchObjects } from 'theGraph'; -import { hexToCid } from 'utils'; +import { logger as parentLogger } from '../logger.js'; +import redisClient from '../redisClient.js'; +import { getIndexedResearchObjects } from '../theGraph.js'; +import { cleanupManifestUrl } from '../utils/manifest.js'; +import { hexToCid } from '../utils.js'; const logger = parentLogger.child({ module: 'SCRIPTS::invalidateRedisKeys' }); /* diff --git a/desci-server/src/scripts/migrate-draft-trees.ts b/desci-server/src/scripts/migrate-draft-trees.ts new file mode 100644 index 000000000..5a40fda69 --- /dev/null +++ b/desci-server/src/scripts/migrate-draft-trees.ts @@ -0,0 +1,132 @@ +import readline from 'readline'; + +import { prisma } from '../client.js'; +import { logger as parentLogger } from '../logger.js'; +import { migrateIpfsTreeToNodeTree } from '../services/draftTrees.js'; + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, +}); + +const logger = parentLogger.child({ + module: 'Script::MigrateDraftTrees', +}); + +/** + * GUIDE: + * To migrate all nodes simply run + ***** npm run script:migrate-draft-trees + * + * To migrate a subset of nodes, you can add in START and END environment variables, e.g. + ***** START=0 END=100 npm run script:migrate-draft-trees + * this will run it across the first 100 nodes in the db + * + * To migrate a single node, you can add in NODE_ID environment variable, e.g. + ***** NODE_ID=70 npm run script:migrate-draft-trees + */ + +entry(); +function entry() { + const nodeId = process.env.NODE_ID ? parseInt(process.env.NODE_ID) : null; + if (nodeId) { + migrateDraftTree(nodeId); + } else { + migrateDraftTrees(); + } +} + +async function migrateDraftTrees() { + // Parse start/end environment vars + const start = process.env.START ? parseInt(process.env.START) : null; + const end = process.env.END ? parseInt(process.env.END) : null; + + const whereCondition = {}; + if (start !== null) { + whereCondition['id'] = { gte: start }; + } + if (end !== null) { + whereCondition['id'] = { ...whereCondition['id'], lte: end }; + } + + logger.info(whereCondition); + // Get all nodes within the params + const nodes = await prisma.node.findMany({ + where: whereCondition, + orderBy: { + id: 'asc', + }, + }); + + // Loop through each node + let idx = 1; + const totalNodes = nodes.length; + const failedUpgradeNodeIds = []; + const skippedUpgradeNodeIds = []; + for (const node of nodes) { + logger.info(`[${idx}/${totalNodes}] Migrating node ${node.uuid} , nodeId: ${node.id}`); + idx++; + try { + const draftNodeTreeEntries = await prisma.draftNodeTree.findMany({ where: { nodeId: node.id } }); + if (draftNodeTreeEntries.length > 0) { + skippedUpgradeNodeIds.push(node.id); + logger.error( + `Node ${node.uuid} , nodeId: ${node.id} has draft tree entries detected, skipping migration, manually review`, + ); + } else { + await migrateIpfsTreeToNodeTree(node.uuid); + } + } catch (error) { + logger.error({ error, node }, `Failed to migrate node ${node.uuid} , nodeId: ${node.id}`); + failedUpgradeNodeIds.push(node.id); + } + } + const successCount = totalNodes - failedUpgradeNodeIds.length - skippedUpgradeNodeIds.length; + const failCount = failedUpgradeNodeIds.length; + const skipCount = skippedUpgradeNodeIds.length; + + logger.info( + { failedUpgradeNodeIds, skippedUpgradeNodeIds, startParam: start, endParam: end }, + `Tree migration ran on ${totalNodes}, ${successCount} successful migrations, ${failCount} failed migrations, ${skipCount} skipped migrations`, + ); + cleanUpAndExit(); +} + +async function migrateDraftTree(nodeId: number) { + try { + const draftNodeTreeEntries = await prisma.draftNodeTree.findMany({ where: { nodeId } }); + const node = await prisma.node.findUnique({ where: { id: nodeId } }); + + const handleUserInput = async (resolve, reject) => { + if (draftNodeTreeEntries.length > 0) { + rl.question( + `Node ${nodeId} has draft tree entries detected, are you sure you want to continue? (Y/N) `, + async (answer) => { + if (answer.toLowerCase() === 'y') { + console.log('continuing...'); + await migrateIpfsTreeToNodeTree(node.uuid); + resolve(); + } else { + console.log('Exiting'); + reject(new Error('User chose not to continue')); + } + }, + ); + } else { + await migrateIpfsTreeToNodeTree(node.uuid); + resolve(); + } + }; + + // Wait for user input if needed + await new Promise(handleUserInput); + } catch (error) { + logger.error({ error, nodeId }, `Failed to migrate node ${nodeId}`); + } + cleanUpAndExit(); +} + +function cleanUpAndExit() { + rl.close(); + process.exit(0); +} diff --git a/desci-server/src/scripts/retry-mirrors.ts b/desci-server/src/scripts/retry-mirrors.ts index 0b30d9afe..8858bf5c0 100644 --- a/desci-server/src/scripts/retry-mirrors.ts +++ b/desci-server/src/scripts/retry-mirrors.ts @@ -1,7 +1,7 @@ import { PublicDataReferenceOnIpfsMirror } from '@prisma/client'; -import prisma from 'client'; -import logger from 'logger'; +import { prisma } from '../client.js'; +import { logger } from '../logger.js'; async function main() { const publicDataReferences = await prisma.publicDataReference.findMany({ diff --git a/desci-server/src/scripts/testUpgradeManifests.ts b/desci-server/src/scripts/testUpgradeManifests.ts index 120df3f32..e0071d0a8 100644 --- a/desci-server/src/scripts/testUpgradeManifests.ts +++ b/desci-server/src/scripts/testUpgradeManifests.ts @@ -11,15 +11,13 @@ import { ResearchObjectV1Component, } from '@desci-labs/desci-models'; -import { createDag, createEmptyDag, FilesToAddToDag, getDirectoryTree, strIsCid } from 'services/ipfs'; -import { ensureUniqueString } from 'utils'; -import { addComponentsToManifest } from 'utils/driveUtils'; +import { createDag, createEmptyDag, FilesToAddToDag, getDirectoryTree, strIsCid } from '../services/ipfs.js'; +import { DANGEROUSLY_addComponentsToManifest } from '../utils/driveUtils.js'; +import { ensureUniqueString } from '../utils.js'; /* This script only tests the DAG step, and only a manifest is required, no DB entries are required */ -// eslint-disable-next-line @typescript-eslint/no-var-requires -const { addToDir, concat, getSize, makeDir, updateDagCid } = require('../utils/dagConcat.cjs'); interface Manifest { fileName: string; @@ -27,7 +25,7 @@ interface Manifest { } async function loadFiles(folderPath: string): Promise { - const fileNames = await fs.readdirSync(folderPath); + const fileNames = fs.readdirSync(folderPath); const manifests: Manifest[] = []; for (const fileName of fileNames) { @@ -159,8 +157,8 @@ export async function testUpgradeManifests() { path === researchReportPath ? ResearchObjectComponentType.PDF : path === codeReposPath - ? ResearchObjectComponentType.CODE - : ResearchObjectComponentType.DATA, + ? ResearchObjectComponentType.CODE + : ResearchObjectComponentType.DATA, }; }); @@ -173,7 +171,7 @@ export async function testUpgradeManifests() { }, }; manifestObj.components.unshift(dataBucketComponent); - manifestObj = addComponentsToManifest(manifestObj, opinionatedDirsFormatted); + manifestObj = DANGEROUSLY_addComponentsToManifest(manifestObj, opinionatedDirsFormatted); const dagTree = await getDirectoryTree(rootDagCid, {}); const flatTree = recursiveFlattenTree(dagTree); diff --git a/desci-server/src/scripts/testing.ts b/desci-server/src/scripts/testing.ts new file mode 100644 index 000000000..ea3d8f41e --- /dev/null +++ b/desci-server/src/scripts/testing.ts @@ -0,0 +1,56 @@ +import { prisma } from '../client.js'; +import { logger as parentLogger } from '../logger.js'; +import { getManifestFromNode } from '../services/data/processing.js'; +import { getDirectoryTree } from '../services/ipfs.js'; +import { dagifyAndAddDbTreeToIpfs, draftNodeTreeEntriesToFlatIpfsTree } from '../utils/draftTreeUtils.js'; +import { generateExternalCidMap, generateManifestPathsToDbTypeMap, inheritComponentType } from '../utils/driveUtils.js'; + +const logger = parentLogger.child({ module: 'SCRIPTS::Testing' }); + +const rootCid = ''; +const nodeUuid = 'SN-CfB9BXpWy7-AJj5as4FahLDaAMtRCeXCZXhCHiuo.'; + +async function benchmark() { + const extCidMap = await generateExternalCidMap(nodeUuid, rootCid); + + await getDirectoryTree(rootCid, extCidMap); + + const node = await prisma.node.findUnique({ where: { uuid: nodeUuid } }); + + const startTime = process.hrtime(); + const tree = await prisma.draftNodeTree.findMany({ where: { nodeId: node.id } }); + await draftNodeTreeEntriesToFlatIpfsTree(tree); + const endTime = process.hrtime(startTime); + logger.error(`DB Execution time: ${endTime[0]}s ${endTime[1] / 1000000}ms`); +} + +// migrateIpfsTreeToNodeTree(nodeUuid); +// benchmark(); + +async function dbDraftTreeToIpfsTreeAndPin() { + const node = await prisma.node.findUnique({ where: { uuid: nodeUuid } }); + + const rootDagNode = await dagifyAndAddDbTreeToIpfs(node.id); + + if (rootDagNode) { + logger.info(`DAG pinned: ${rootDagNode}`); + } else { + logger.error(`DAG pinning failed: rootDagNode is undefined or null`); + } +} +// dbDraftTreeToIpfsTreeAndPin(); + +async function dbInheritanceFnTest() { + const path = 'root/orange.txt'; + const path2 = 'root/test/ing.txt'; + const node = await prisma.node.findFirst({ where: { id: 57 } }); + const { manifest } = await getManifestFromNode(node); + + const pathToDbTypeMap = generateManifestPathsToDbTypeMap(manifest); + const inheritedType = inheritComponentType(path, pathToDbTypeMap); + const inheritedType2 = inheritComponentType(path2, pathToDbTypeMap); + + console.log(path, inheritedType); + console.log(path2, inheritedType2); +} +dbInheritanceFnTest(); diff --git a/desci-server/src/scripts/upgradeManifests.ts b/desci-server/src/scripts/upgradeManifests.ts index 71c952e95..a8b373ee4 100644 --- a/desci-server/src/scripts/upgradeManifests.ts +++ b/desci-server/src/scripts/upgradeManifests.ts @@ -7,9 +7,8 @@ import { import { DataType } from '@prisma/client'; import axios from 'axios'; -import prisma from 'client'; -import { PersistManifestParams } from 'controllers/data/utils'; -import { cleanupManifestUrl } from 'controllers/nodes'; +import { prisma } from '../client.js'; +import { PersistManifestParams } from '../controllers/data/utils.js'; import { createDag, createEmptyDag, @@ -17,16 +16,10 @@ import { getDirectoryTree, strIsCid, updateManifestAndAddToIpfs, -} from 'services/ipfs'; -import { ensureUniqueString } from 'utils'; -import { addComponentsToManifest } from 'utils/driveUtils'; - -/* -upgrades the manifest from the old opiniated version to the unopiniated version -IMPORTANT: Called after ensureUser and multer -*/ -// eslint-disable-next-line @typescript-eslint/no-var-requires -const { addToDir, concat, getSize, makeDir, updateDagCid } = require('../utils/dagConcat.cjs'); +} from '../services/ipfs.js'; +import { DANGEROUSLY_addComponentsToManifest } from '../utils/driveUtils.js'; +import { cleanupManifestUrl } from '../utils/manifest.js'; +import { ensureUniqueString } from '../utils.js'; upgradeManifestsScript(); export async function upgradeManifestsScript() { @@ -176,8 +169,8 @@ export async function upgradeManifestsScript() { path === researchReportPath ? ResearchObjectComponentType.PDF : path === codeReposPath - ? ResearchObjectComponentType.CODE - : ResearchObjectComponentType.DATA, + ? ResearchObjectComponentType.CODE + : ResearchObjectComponentType.DATA, }; }); @@ -190,7 +183,7 @@ export async function upgradeManifestsScript() { }, }; manifestObj.components.unshift(dataBucketComponent); - manifestObj = addComponentsToManifest(manifestObj, opinionatedDirsFormatted); + manifestObj = DANGEROUSLY_addComponentsToManifest(manifestObj, opinionatedDirsFormatted); const dagTree = await getDirectoryTree(rootDagCid, {}); const flatTree = recursiveFlattenTree(dagTree); diff --git a/desci-server/src/server.ts b/desci-server/src/server.ts new file mode 100644 index 000000000..0656a9064 --- /dev/null +++ b/desci-server/src/server.ts @@ -0,0 +1,236 @@ +// @ts-check +import 'dotenv/config'; +import 'reflect-metadata'; +import * as child from 'child_process'; +// import fs from 'fs'; +import type { Server as HttpServer } from 'http'; +// import path from 'path'; +import { fileURLToPath } from 'url'; + +import * as Sentry from '@sentry/node'; +import * as Tracing from '@sentry/tracing'; +import bodyParser from 'body-parser'; +import cookieParser from 'cookie-parser'; +import express from 'express'; +import type { Express, Request } from 'express'; +import helmet from 'helmet'; +import { createProxyMiddleware } from 'http-proxy-middleware'; +import { pinoHttp } from 'pino-http'; +import { v4 } from 'uuid'; + +import { prisma } from './client.js'; +// eslint-disable-next-line import/order +import routes from './routes/index.js'; +import { orcidConnect } from './controllers/auth/orcid.js'; +import { orcidCheck } from './controllers/auth/orcidNext.js'; +import { logger } from './logger.js'; +import { ensureUserIfPresent } from './middleware/ensureUserIfPresent.js'; +import { errorHandler } from './middleware/errorHandler.js'; +// import SocketServer from './wsServer.js'; +import { extractAuthToken, extractUserFromToken } from './middleware/permissions.js'; +// import { socket as wsSocket } from './repo.js'; +const __filename = fileURLToPath(import.meta.url); +// const __dirname = path.dirname(__filename); + +const ENABLE_TELEMETRY = process.env.NODE_ENV === 'production'; +const IS_DEV = !ENABLE_TELEMETRY; + +const allowlist = [ + 'http://localhost:3000', + 'http://localhost:3001', + 'http://localhost:61440', + 'http://localhost:3002', + 'http://host.docker.internal:3000', + 'http://host.docker.internal:3002', + 'http://127.0.0.1:3000', + 'https://nodes.desci.com', + 'https://nodes-dev.desci.com', + 'https://nodes-demo.desci.com', + 'd2195goqok3wlx.amplifyapp.com', + 'd3ge8gcb3rt5iw.amplifyapp.com', + 'desci.com', + 'gitpod.io', + 'loca.lt' /** NOT SECURE */, + 'vercel.app' /** NOT SECURE */, +]; + +const serverUuid = v4(); + +class AppServer { + #readyResolvers: ((value: any) => void)[] = []; + + #isReady = false; + + app: Express; + server: HttpServer; + port: number; + // socketServer: SocketServer; + + constructor() { + this.app = express(); + this.#initSerialiser(); + + this.app.use(function (req, res, next) { + const origin = req.headers.origin; + if ( + allowlist.indexOf(origin) !== -1 || + allowlist.filter((a) => a.indexOf('http') != 0 && origin && origin.endsWith(a)).length + ) { + res.setHeader('Access-Control-Allow-Origin', origin); + res.setHeader( + 'Access-Control-Allow-Headers', + 'X-Requested-With,Content-Type,Authorization,sentry-trace,baggage', + ); + res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PATCH, OPTIONS, PUT, DELETE'); + res.setHeader('Access-Control-Allow-Credentials', 'true'); + // if (req.headers['set-cookie']) { + // res.setHeader('set-cookie', req.headers['set-cookie']); + // } + } + next(); + }); + + this.#attachProxies(); + this.#initTelemetry(); + + this.app.use(helmet()); + this.app.use(bodyParser.json({ limit: '100mb' })); + this.app.use(bodyParser.urlencoded({ extended: false })); + + this.app.use(cookieParser()); + this.app.set('trust proxy', 2); // detect AWS ELB IP + cloudflare + + this.#attachRouteHandlers(); + + this.app.use(errorHandler); + + this.port = parseInt(process.env.PORT) || 5420; + this.server = this.app.listen(this.port, () => { + this.#isReady = true; + this.#readyResolvers.forEach((resolve) => resolve(true)); + console.log(`Server running on port ${this.port}`); + }); + + // this.socketServer = new SocketServer(this.server, this.port); + // wsSocket.on('listening', () => { + // logger.info({ module: 'WebSocket SERVER', port: wsSocket.address() }, 'WebSocket Server Listening'); + // }); + // wsSocket.on('connection', async (socket, request) => { + // try { + // const token = await extractAuthToken(request as Request); + // const authUser = await extractUserFromToken(token); + // if (!authUser) { + // socket.close(); // Close connection if user is not authorized + // return; + // } + // logger.info( + // { module: 'WebSocket SERVER', id: authUser.id, name: authUser.name }, + // 'WebSocket Connection Authorised', + // ); + // socket.on('message', (message) => { + // // Handle incoming messages + // // console.log(`Received message: ${message}`); + // }); + // // Additional event listeners (e.g., 'close', 'error') can be set up here + // } catch (error) { + // socket.close(); // Close the connection in case of an error + // logger.error(error, 'Error during WebSocket connection'); + // } + // }); + } + + get httpServer() { + return this.httpServer; + } + + async ready() { + if (this.#isReady) { + return true; + } + + return new Promise((resolve) => { + this.#readyResolvers.push(resolve); + }); + } + + #attachRouteHandlers() { + this.app.get('/readyz', (_, res) => { + res.status(200).json({ status: 'ok' }); + }); + this.app.get('/version', (req, res) => { + const revision = child.execSync('git rev-parse HEAD').toString().trim(); + // const sha256 = child.execSync('find /app/desci-server/dist -type f -exec sha256sum \\;').toString().trim(); + res.status(200).json({ revision, npm: process.env.npm_package_version }); + }); + this.app.get('/id', (req, res) => { + res.status(200).json({ id: serverUuid, affinity: req.cookies['stickie-dev-ingress61'] }); + }); + this.app.get('/orcid', orcidConnect); + this.app.post('/orcid/next', [ensureUserIfPresent], orcidCheck()); + this.app.use('/', routes); + } + + #attachProxies() { + this.app.use( + createProxyMiddleware({ + target: process.env.NODES_MEDIA_SERVER_URL, + changeOrigin: true, + pathFilter: ['/v1/latex/upload', '/v1/latex/compile'], + }), + ); + } + + #initSerialiser() { + this.app.use( + pinoHttp({ + logger, + serializers: { + res: (res) => { + if (IS_DEV) { + return { + responseTime: res.responseTime, + status: res.statusCode, + }; + } else { + return res; + } + }, + req: (req) => { + if (IS_DEV) { + return { + query: req.query, + params: req.params, + method: req.method, + url: req.url, + }; + } else { + return req; + } + }, + }, + }), + ); + } + + #initTelemetry() { + if (ENABLE_TELEMETRY) { + logger.info('[DeSci Nodes] Telemetry enabled'); + Sentry.init({ + dsn: 'https://d508a5c408f34b919ccd94aac093e076@o1330109.ingest.sentry.io/6619754', + release: 'desci-nodes-server@' + process.env.npm_package_version, + integrations: [new Tracing.Integrations.Prisma({ client: prisma })], + // Set tracesSampleRate to 1.0 to capture 100% + // of transactions for performance monitoring. + // We recommend adjusting this value in production + tracesSampleRate: 1.0, + }); + this.app.use(Sentry.Handlers.requestHandler()); + this.app.use(Sentry.Handlers.tracingHandler()); + this.app.use(Sentry.Handlers.errorHandler()); + } else { + logger.info('[DeSci Nodes] Telemetry disabled'); + } + } +} + +export const server = new AppServer(); diff --git a/desci-server/src/services/auth.ts b/desci-server/src/services/auth.ts index 41d974591..0dd2b88ee 100644 --- a/desci-server/src/services/auth.ts +++ b/desci-server/src/services/auth.ts @@ -1,17 +1,16 @@ import { env } from 'process'; -import { Invite, prisma, User } from '@prisma/client'; +import { User } from '@prisma/client'; import sgMail from '@sendgrid/mail'; import AWS from 'aws-sdk'; -import parentLogger from 'logger'; -import createRandomCode from 'utils/createRandomCode'; +import { prisma as client } from '../client.js'; +import { logger as parentLogger } from '../logger.js'; +import createRandomCode from '../utils/createRandomCode.js'; +import { hideEmail } from '../utils.js'; AWS.config.update({ region: 'us-east-2' }); sgMail.setApiKey(process.env.SENDGRID_API_KEY); -import client from '../client'; - -import { hideEmail } from 'utils'; const logger = parentLogger.child({ module: 'Services::Auth' }); diff --git a/desci-server/src/services/data/externalCidProcessing.ts b/desci-server/src/services/data/externalCidProcessing.ts new file mode 100644 index 000000000..17e6b4818 --- /dev/null +++ b/desci-server/src/services/data/externalCidProcessing.ts @@ -0,0 +1,244 @@ +import { DocumentId } from '@automerge/automerge-repo'; +import { + FileType, + RecursiveLsResult, + ResearchObjectComponentSubtypes, + ResearchObjectComponentType, + recursiveFlattenTree, +} from '@desci-labs/desci-models'; +import { User, Node, Prisma } from '@prisma/client'; + +import { prisma } from '../../client.js'; +import { persistManifest } from '../../controllers/data/utils.js'; +import { logger as parentLogger } from '../../logger.js'; +import { ensureUniquePathsDraftTree, getLatestDriveTime } from '../../services/draftTrees.js'; +import { + GetExternalSizeAndTypeResult, + convertToCidV1, + getExternalCidSizeAndType, + pubRecursiveLs, +} from '../../services/ipfs.js'; +import { FirstNestingComponent, addComponentsToDraftManifest, getTreeAndFill } from '../../utils/driveUtils.js'; +import { NodeUuid, getLatestManifestFromNode } from '../manifestRepo.js'; +import repoService from '../repoService.js'; + +import { updateDataReferences } from './processing.js'; +import { + createIpfsUnresolvableError, + createManifestPersistFailError, + createUnhandledError, +} from './processingErrors.js'; + +const logger = parentLogger.child({ + module: 'Services::ExternalCidProcessing', +}); + +interface ProcessExternalCidDataToIpfsParams { + // files: any[]; + externalCids: any; + user: User; + node: Node; + /** + * @type {string} path to the directory to be updated + */ + contextPath: string; + componentType?: ResearchObjectComponentType; + componentSubtype?: ResearchObjectComponentSubtypes; +} + +/** + * Processes external-url file uploads, currently .pdf URLs and github code repo's + */ +export async function processExternalCidDataToIpfs({ + externalCids, + user, + node, + contextPath, + componentType, + componentSubtype, +}: ProcessExternalCidDataToIpfsParams) { + try { + // debugger; + /** + * Prepare the CIDs for addition, see if they're resolvable and get their sizes and types + */ + const cidTypesSizes: Record = {}; + if (externalCids && externalCids.length) { + try { + externalCids = externalCids.map((extCid) => ({ ...extCid, cid: convertToCidV1(extCid.cid) })); + for (const extCid of externalCids) { + const { isDirectory, size } = await getExternalCidSizeAndType(extCid.cid); + if (size !== undefined && isDirectory !== undefined) { + cidTypesSizes[extCid.cid] = { size, isDirectory }; + } else { + throw new Error(`Failed to get size and type of external CID: ${extCid}`); + } + } + } catch (e: any) { + logger.warn(`[UPDATE DAG] External CID Method: ${e}`); + throw createIpfsUnresolvableError(`Failed to resolve external CID`); + } + } + + /** + * Ensure no collisions + */ + const cidFileNames = externalCids.map((extCid) => extCid.name); + await ensureUniquePathsDraftTree({ + nodeId: node.id, + contextPath, + externalUrlFilePaths: cidFileNames, + }); + + /** + * Discover the entire tree if it's a DAG, prepare entries for the draft tree + */ + const externalCidMap = {}; + let entriesDiscovered = []; + // const externalDagsToPin = []; + if (externalCids?.length && Object.keys(cidTypesSizes)?.length) { + entriesDiscovered = []; + for await (const extCid of externalCids) { + const { size, isDirectory } = cidTypesSizes[extCid.cid]; + externalCidMap[extCid.cid] = { size, directory: isDirectory, path: extCid.name }; + if (isDirectory) { + //Get external dag tree, add to external dag pin list + let tree: RecursiveLsResult[]; + try { + tree = await pubRecursiveLs(extCid.cid, extCid.name); + } catch (e) { + logger.info( + { extCid }, + '[UPDATE ADD EXTERNAL CID] External DAG tree resolution failed, the contents within the DAG were unable to be retrieved, rejecting update.', + ); + throw createIpfsUnresolvableError( + `Failed resolving external dag tree, the DAG or its contents were unable to be retrieved`, + ); + } + const flatTree = recursiveFlattenTree(tree); + (flatTree as RecursiveLsResult[]).forEach((file: RecursiveLsResult) => { + cidTypesSizes[file.cid] = { size: file.size, isDirectory: file.type === FileType.DIR }; + entriesDiscovered.push({ + path: contextPath + '/' + file.path, + cid: file.cid, + size: file.size, + isDirectory: file.type === FileType.DIR, + }); + externalCidMap[file.cid] = { + size: file.size, + directory: file.type === FileType.DIR, + path: contextPath + '/' + file.path, + }; + }); + } + // Append root + entriesDiscovered.push({ + path: contextPath + '/' + extCid.name, + cid: extCid.cid, + size, + isDirectory, + }); + } + } + + const newDraftTreeEntries: Prisma.DraftNodeTreeCreateManyInput[] = entriesDiscovered.map((entry) => { + return { + nodeId: node.id, + // userId: user.id, + path: entry.path, + cid: entry.cid, + size: entry.size, + directory: entry.isDirectory, + external: true, + }; + }); + + const draftTreeEntriesAdded = await prisma.draftNodeTree.createMany({ + data: newDraftTreeEntries, + skipDuplicates: true, + }); + logger.info(`[EXTERNAL CID] ${draftTreeEntriesAdded.count} entries added to draft tree`); + + //repull of node required, previous manifestUrl may already be stale + const ltsNode = await prisma.node.findFirst({ + where: { + ownerId: user.id, + uuid: node.uuid, + }, + }); + + const extCidsBeingAdded = externalCids.map((extCid) => { + return { + name: extCid.name, + cid: extCid.cid, + size: cidTypesSizes[extCid.cid].size, + isDirectory: cidTypesSizes[extCid.cid].isDirectory, + }; + }); + + // Predefine components with their types, only happens if a predefined component type is passed + if (componentType) { + const firstNestingComponents: FirstNestingComponent[] = extCidsBeingAdded.map((file) => { + const neutralFullPath = contextPath + '/' + file.name; + return { + name: file.name, + path: neutralFullPath, + cid: file.cid, + componentType, + componentSubtype, + star: false, + }; + }); + + if (firstNestingComponents.length > 0) { + await addComponentsToDraftManifest(node, firstNestingComponents); + } + } + + const updatedManifest = await getLatestManifestFromNode(ltsNode); + + const upserts = await updateDataReferences({ node, user, updatedManifest }); + if (upserts) logger.info(`${upserts.length} new data references added/modified`); + + const { persistedManifestCid, date } = await persistManifest({ manifest: updatedManifest, node, userId: user.id }); + if (!persistedManifestCid) + throw createManifestPersistFailError( + `Failed to persist manifest: ${updatedManifest}, node: ${node}, userId: ${user.id}`, + ); + + /** + * Update drive clock on automerge document + */ + const latestDriveClock = await getLatestDriveTime(node.uuid as NodeUuid); + try { + // await manifestUpdater({ type: 'Set Drive Clock', time: latestDriveClock }); + const response = await repoService.dispatchAction({ + uuid: node.uuid, + documentId: node.manifestDocumentId as DocumentId, + actions: [{ type: 'Set Drive Clock', time: latestDriveClock }], + }); + logger.info({ response }, '[SET DRIVE CLOCK RESPONSE]'); + } catch (err) { + logger.error({ err }, 'Set Drive Clock'); + } + + const tree = await getTreeAndFill(updatedManifest, node.uuid, user.id); + + return { + ok: true, + value: { + manifest: updatedManifest, + manifestCid: persistedManifestCid, + tree: tree, + date: date, + }, + }; + // SUCCESS + } catch (error) { + // DB status to failed + // Socket emit to client + logger.error({ error }, 'Error processing S3 data to IPFS'); + const controlledErr = 'type' in error ? error : createUnhandledError(error); + return { ok: false, value: controlledErr }; + } +} diff --git a/desci-server/src/services/data/externalUrlProcessing.ts b/desci-server/src/services/data/externalUrlProcessing.ts index b53d8483d..9d4621c22 100644 --- a/desci-server/src/services/data/externalUrlProcessing.ts +++ b/desci-server/src/services/data/externalUrlProcessing.ts @@ -1,59 +1,55 @@ import fs from 'fs'; +import { DocumentId } from '@automerge/automerge-repo'; import { DrivePath, IpfsPinnedResult, RecursiveLsResult, ResearchObjectComponentSubtypes, ResearchObjectComponentType, - neutralizePath, + ResearchObjectV1, recursiveFlattenTree, } from '@desci-labs/desci-models'; -import { DataType, User, Node } from '@prisma/client'; +import { DataType, User, Node, Prisma } from '@prisma/client'; import axios from 'axios'; import { rimraf } from 'rimraf'; -import prisma from 'client'; -import { persistManifest } from 'controllers/data/utils'; -import parentLogger from 'logger'; -import { hasAvailableDataUsageForUpload } from 'services/dataService'; -import { IpfsDirStructuredInput, addDirToIpfs, addFilesToDag, getDirectoryTree } from 'services/ipfs'; +import { prisma } from '../../client.js'; +import { persistManifest } from '../../controllers/data/utils.js'; +import { logger as parentLogger } from '../../logger.js'; +import { hasAvailableDataUsageForUpload } from '../../services/dataService.js'; +import { ensureUniquePathsDraftTree, externalDirCheck, getLatestDriveTime } from '../../services/draftTrees.js'; +import { IpfsDirStructuredInput, addDirToIpfs, getDirectoryTree } from '../../services/ipfs.js'; +import { ipfsDagToDraftNodeTreeEntries } from '../../utils/draftTreeUtils.js'; +import { + ExtensionDataTypeMap, + addComponentsToDraftManifest, + generateManifestPathsToDbTypeMap, + getTreeAndFill, +} from '../../utils/driveUtils.js'; import { calculateTotalZipUncompressedSize, extractZipFileAndCleanup, processExternalUrls, saveZipStreamToDisk, zipUrlToStream, -} from 'utils'; -import { - ExtensionDataTypeMap, - addComponentsToManifest, - generateExternalCidMap, - generateManifestPathsToDbTypeMap, - getTreeAndFill, - updateManifestComponentDagCids, -} from 'utils/driveUtils'; +} from '../../utils.js'; +import { NodeUuid, getLatestManifestFromNode } from '../manifestRepo.js'; +import repoService from '../repoService.js'; import { - cleanupDanglingRefs, - ensureUniquePaths, - extractRootDagCidFromManifest, filterFirstNestings, - getManifestFromNode, handleCleanupOnMidProcessingError, - pathContainsExternalCids, pinNewFiles, predefineComponentsForPinnedFiles, updateDataReferences, - updateManifestDataBucket, -} from './processing'; +} from './processing.js'; import { - createDagExtensionFailureError, createExternalUrlResolutionError, createManifestPersistFailError, createNotEnoughSpaceError, createUnhandledError, -} from './processingErrors'; +} from './processingErrors.js'; const TEMP_REPO_ZIP_PATH = './repo-tmp'; @@ -88,27 +84,14 @@ export async function processExternalUrlDataToIpfs({ let pinResult: IpfsPinnedResult[] = []; let manifestPathsToTypesPrune: Record = {}; try { - const { manifest, manifestCid } = await getManifestFromNode(node); - const rootCid = extractRootDagCidFromManifest(manifest, manifestCid); + const manifest = await getLatestManifestFromNode(node); manifestPathsToTypesPrune = generateManifestPathsToDbTypeMap(manifest); // We can optionally do this after file resolution, may be more useful for code repos than pdfs // const componentTypeMap: ResearchObjectComponentTypeMap = constructComponentTypeMapFromFiles([externalUrl]); - // Pull old tree - const externalCidMap = await generateExternalCidMap(node.uuid); - const oldFlatTree = recursiveFlattenTree(await getDirectoryTree(rootCid, externalCidMap)) as RecursiveLsResult[]; - oldFlatTree.push({ cid: rootCid, path: rootCid, name: 'Old Root Dir', type: 'dir', size: 0 }); - // Map paths=>branch for constant lookup - const oldTreePathsMap: Record = oldFlatTree.reduce((map, branch) => { - // branch.path would still be deneutralized path, change if ever becomes necessary. - // i.e. branch.path === '/bafkrootcid/images/node.png' rather than '/root/images/node.png' - map[neutralizePath(branch.path)] = branch; - return map; - }, {}); - // External dir check - pathContainsExternalCids(oldTreePathsMap, contextPath); + await externalDirCheck(node.id, contextPath); /* ** External URL setup, currently used for Github Code Repositories & external PDFs @@ -165,19 +148,14 @@ export async function processExternalUrlDataToIpfs({ `upload size of ${externalUrlTotalSizeBytes} exceeds users data budget of ${user.currentDriveStorageLimitGb} GB`, ); - const splitContextPath = contextPath.split('/'); - splitContextPath.shift(); - //rootlessContextPath = how many dags need to be reset, n + 1, used for addToDag function - const rootlessContextPath = splitContextPath.join('/'); - // Check if paths are unique const externalUrlFilePaths = [externalUrl.path]; - ensureUniquePaths({ flatTreeMap: oldTreePathsMap, contextPath, externalUrlFilePaths }); + await ensureUniquePathsDraftTree({ nodeId: node.id, contextPath, externalUrlFilePaths }); - // Pin new files, structure for DAG extension, add to DAG + // Pin new files, add draftNodeTree entries if (externalUrlFiles?.length) { // External URL non-repo - pinResult = await pinNewFiles(externalUrlFiles); + pinResult = await pinNewFiles(externalUrlFiles, true); } else if (zipPath?.length > 0) { const outputPath = zipPath.replace('.zip', ''); logger.debug({ outputPath }, 'Starting unzipping to output directory'); @@ -190,14 +168,35 @@ export async function processExternalUrlDataToIpfs({ // Cleanup await rimraf(outputPath); } + // debugger; + const root = pinResult[pinResult.length - 1]; + const isCodeRepo = zipPath.length > 0; + let uploadedTree = (await getDirectoryTree(root.cid, {})) as RecursiveLsResult[]; + if (isCodeRepo) { + // Overrides the path name of the root directory + const rootName = externalUrl.path; + uploadedTree = [{ ...root, type: 'dir', name: rootName, contains: uploadedTree }]; + } + + // Prepare draft node tree entires + const flatUploadedTree = recursiveFlattenTree(uploadedTree); + + const parsedContextPath = isCodeRepo ? contextPath + '/' + externalUrl.path : contextPath; + const draftNodeTreeEntries: Prisma.DraftNodeTreeCreateManyInput[] = await ipfsDagToDraftNodeTreeEntries({ + ipfsTree: flatUploadedTree, + node, + user, + contextPath: parsedContextPath, + }); + + const addedEntries = await prisma.draftNodeTree.createMany({ + data: draftNodeTreeEntries, + skipDuplicates: true, + }); + logger.info(`Successfully added ${addedEntries.count} entries to DraftNodeTree`); + // debugger; const { filesToAddToDag, filteredFiles } = filterFirstNestings(pinResult); - const { - updatedRootCid: newRootCidString, - updatedDagCidMap, - contextPathNewCid, - } = await addFilesToDag(rootCid, rootlessContextPath, filesToAddToDag); - if (typeof newRootCidString !== 'string') throw createDagExtensionFailureError; /** * Repull latest node, to avoid stale manifest that may of been modified since last pull @@ -210,26 +209,14 @@ export async function processExternalUrlDataToIpfs({ }, }); - const { manifest: ltsManifest, manifestCid: ltsManifestCid } = await getManifestFromNode(ltsNode); - let updatedManifest = updateManifestDataBucket({ - manifest: ltsManifest, - newRootCid: newRootCidString, - }); - - //Update all existing DAG components with new CIDs if they were apart of a cascading update - if (Object.keys(updatedDagCidMap)?.length) { - updatedManifest = updateManifestComponentDagCids(updatedManifest, updatedDagCidMap); - } - - // if (componentTypeMap) { - // updatedManifest = assignTypeMapInManifest(updatedManifest, componentTypeMap, contextPath, contextPathNewCid); - // } + let updatedManifest: ResearchObjectV1; if (componentType) { /** * Automatically create a new component(s) for the files added, to the first nesting. * It doesn't need to create a new component for every file, only the first nested ones, as inheritance takes care of the children files. * Only needs to happen if a predefined component type is to be added */ + const firstNestingComponents = predefineComponentsForPinnedFiles({ pinnedFirstNestingFiles: filteredFiles, contextPath, @@ -237,24 +224,18 @@ export async function processExternalUrlDataToIpfs({ componentSubtype, externalUrl, }); - updatedManifest = addComponentsToManifest(updatedManifest, firstNestingComponents); + + if (firstNestingComponents?.length > 0) { + updatedManifest = await addComponentsToDraftManifest(node, firstNestingComponents); + } } + updatedManifest = updatedManifest ?? (await repoService.getDraftManifest(ltsNode.uuid as NodeUuid)); + // Update existing data references, add new data references. - const upserts = await updateDataReferences({ node, user, updatedManifest, newRootCidString, externalCidMap }); + const upserts = await updateDataReferences({ node, user, updatedManifest }); if (upserts) logger.info(`${upserts.length} new data references added/modified`); - // Cleanup, add old DAGs to prune list - const pruneRes = await cleanupDanglingRefs({ - newRootCidString, - externalCidMap, - oldTreePathsMap: oldTreePathsMap, - manifestPathsToDbComponentTypesMap: manifestPathsToTypesPrune, - node, - user, - }); - logger.info(`[PRUNING] ${pruneRes.count} cidPruneList entries added.`); - // Persist updated manifest, (pin, update Node DB entry) const { persistedManifestCid, date } = await persistManifest({ manifest: updatedManifest, node, userId: user.id }); if (!persistedManifestCid) @@ -262,12 +243,28 @@ export async function processExternalUrlDataToIpfs({ `Failed to persist manifest: ${updatedManifest}, node: ${node}, userId: ${user.id}`, ); + /** + * Update drive clock on automerge document + */ + const latestDriveClock = await getLatestDriveTime(node.uuid as NodeUuid); + try { + const response = await repoService.dispatchAction({ + uuid: node.uuid as NodeUuid, + documentId: node.manifestDocumentId as DocumentId, + actions: [{ type: 'Set Drive Clock', time: latestDriveClock }], + }); + if (response) { + updatedManifest = response.manifest; + } + } catch (err) { + logger.error({ err }, 'ERROR: Set Drive Clock'); + } + const tree = await getTreeAndFill(updatedManifest, node.uuid, user.id); return { ok: true, value: { - rootDataCid: newRootCidString, manifest: updatedManifest, manifestCid: persistedManifestCid, tree: tree, diff --git a/desci-server/src/services/data/processing.ts b/desci-server/src/services/data/processing.ts index 51d3d2a45..d1f8dcddb 100644 --- a/desci-server/src/services/data/processing.ts +++ b/desci-server/src/services/data/processing.ts @@ -1,3 +1,4 @@ +import { DocumentId } from '@automerge/automerge-repo'; import { DEFAULT_COMPONENT_TYPE, DrivePath, @@ -12,54 +13,54 @@ import { neutralizePath, recursiveFlattenTree, } from '@desci-labs/desci-models'; -import { User, Node, DataType } from '@prisma/client'; +import { User, Node, DataType, Prisma } from '@prisma/client'; import axios from 'axios'; import { v4 } from 'uuid'; -import prisma from 'client'; -import { UpdateResponse } from 'controllers/data'; -import { persistManifest } from 'controllers/data/utils'; -import { cleanupManifestUrl } from 'controllers/nodes'; -import parentLogger from 'logger'; -import { hasAvailableDataUsageForUpload } from 'services/dataService'; +import { prisma } from '../../client.js'; +import { UpdateResponse } from '../../controllers/data/update.js'; +import { persistManifest } from '../../controllers/data/utils.js'; +import { logger as parentLogger } from '../../logger.js'; +import { hasAvailableDataUsageForUpload } from '../../services/dataService.js'; +import { ensureUniquePathsDraftTree, externalDirCheck, getLatestDriveTime } from '../../services/draftTrees.js'; import { FilesToAddToDag, IpfsDirStructuredInput, IpfsPinnedResult, - addFilesToDag, getDirectoryTree, isDir, pinDirectory, -} from 'services/ipfs'; -import { fetchFileStreamFromS3, isS3Configured } from 'services/s3'; -import { prepareDataRefs } from 'utils/dataRefTools'; +} from '../../services/ipfs.js'; +import { fetchFileStreamFromS3, isS3Configured } from '../../services/s3.js'; +import { ResearchObjectDocument } from '../../types/documents.js'; +import { prepareDataRefs, prepareDataRefsForDraftTrees } from '../../utils/dataRefTools.js'; +import { DRAFT_CID, DRAFT_DIR_CID, ipfsDagToDraftNodeTreeEntries } from '../../utils/draftTreeUtils.js'; import { ExtensionDataTypeMap, ExternalCidMap, FirstNestingComponent, - generateExternalCidMap, generateManifestPathsToDbTypeMap, getTreeAndFill, inheritComponentType, - updateManifestComponentDagCids, urlOrCid, -} from 'utils/driveUtils'; -import { EXTENSION_MAP } from 'utils/extensions'; +} from '../../utils/driveUtils.js'; +import { EXTENSION_MAP } from '../../utils/extensions.js'; +import { cleanupManifestUrl } from '../../utils/manifest.js'; +import { NodeUuid, getLatestManifestFromNode } from '../manifestRepo.js'; +import repoService from '../repoService.js'; import { Either, ProcessingError, - createDagExtensionFailureError, createDuplicateFileError, createInvalidManifestError, createIpfsUnresolvableError, createIpfsUploadFailureError, createManifestPersistFailError, createMixingExternalDataError, - createNewFolderCreationError, createNotEnoughSpaceError, createUnhandledError, -} from './processingErrors'; +} from './processingErrors.js'; interface ProcessS3DataToIpfsParams { files: any[]; @@ -93,42 +94,34 @@ export async function processS3DataToIpfs({ try { ensureSpaceAvailable(files, user); - const { manifest, manifestCid } = await getManifestFromNode(node); - const rootCid = extractRootDagCidFromManifest(manifest, manifestCid); + const manifest = await getLatestManifestFromNode(node); manifestPathsToTypesPrune = generateManifestPathsToDbTypeMap(manifest); const componentTypeMap: ResearchObjectComponentTypeMap = constructComponentTypeMapFromFiles(files); - // Pull old tree - const externalCidMap = await generateExternalCidMap(node.uuid); - const oldFlatTree = recursiveFlattenTree(await getDirectoryTree(rootCid, externalCidMap)) as RecursiveLsResult[]; - oldFlatTree.push({ cid: rootCid, path: rootCid, name: 'Old Root Dir', type: 'dir', size: 0 }); - // Map paths=>branch for constant lookup - const oldTreePathsMap: Record = oldFlatTree.reduce((map, branch) => { - // branch.path would still be deneutralized path, change if ever becomes necessary. - // i.e. branch.path === '/bafkrootcid/images/node.png' rather than '/root/images/node.png' - map[neutralizePath(branch.path)] = branch; - return map; - }, {}); - // External dir check - pathContainsExternalCids(oldTreePathsMap, contextPath); + await externalDirCheck(node.id, contextPath); - const splitContextPath = contextPath.split('/'); - splitContextPath.shift(); - //rootlessContextPath = how many dags need to be reset, n + 1, used for addToDag function - const rootlessContextPath = splitContextPath.join('/'); // Check if paths are unique - ensureUniquePaths({ flatTreeMap: oldTreePathsMap, contextPath, filesBeingAdded: files }); - - // Pin new files, structure for DAG extension, add to DAG - pinResult = await pinNewFiles(files); - const { filesToAddToDag, filteredFiles } = filterFirstNestings(pinResult); - const { - updatedRootCid: newRootCidString, - updatedDagCidMap, - contextPathNewCid, - } = await addFilesToDag(rootCid, rootlessContextPath, filesToAddToDag); - if (typeof newRootCidString !== 'string') throw createDagExtensionFailureError; + await ensureUniquePathsDraftTree({ nodeId: node.id, contextPath, filesBeingAdded: files }); + + // Pin new files, add draftNodeTree entries + pinResult = await pinNewFiles(files, true); + if (pinResult) { + const root = pinResult[pinResult.length - 1]; + const rootTree = (await getDirectoryTree(root.cid, {})) as RecursiveLsResult[]; + // debugger; + const draftNodeTreeEntries: Prisma.DraftNodeTreeCreateManyInput[] = await ipfsDagToDraftNodeTreeEntries({ + ipfsTree: rootTree, + node, + user, + contextPath, + }); + const addedEntries = await prisma.draftNodeTree.createMany({ + data: draftNodeTreeEntries, + skipDuplicates: true, + }); + logger.info(`Successfully added ${addedEntries.count} entries to DraftNodeTree`); + } /** * Repull latest node, to avoid stale manifest that may of been modified since last pull @@ -141,16 +134,8 @@ export async function processS3DataToIpfs({ }, }); - const { manifest: ltsManifest, manifestCid: ltsManifestCid } = await getManifestFromNode(ltsNode); - let updatedManifest = updateManifestDataBucket({ - manifest: ltsManifest, - newRootCid: newRootCidString, - }); - - //Update all existing DAG components with new CIDs if they were apart of a cascading update - if (Object.keys(updatedDagCidMap).length) { - updatedManifest = updateManifestComponentDagCids(updatedManifest, updatedDagCidMap); - } + // const ltsManifest = await getLatestManifestFromNode(ltsNode); + let updatedManifest = await repoService.getDraftManifest(ltsNode.uuid as NodeUuid); if (componentTypeMap) { /** @@ -164,25 +149,13 @@ export async function processS3DataToIpfs({ // componentType, // componentSubtype, // }); - // updatedManifest = addComponentsToManifest(updatedManifest, firstNestingComponents); - updatedManifest = assignTypeMapInManifest(updatedManifest, componentTypeMap, contextPath, contextPathNewCid); + updatedManifest = await assignTypeMapInManifest(node, updatedManifest, componentTypeMap, contextPath, DRAFT_CID); + logger.info({ updatedManifest }, 'assignTypeMapInManifest'); } - // Update existing data references, add new data references. - const upserts = await updateDataReferences({ node, user, updatedManifest, newRootCidString, externalCidMap }); + const upserts = await updateDataReferences({ node, user, updatedManifest }); if (upserts) logger.info(`${upserts.length} new data references added/modified`); - // Cleanup, add old DAGs to prune list - const pruneRes = await cleanupDanglingRefs({ - newRootCidString, - externalCidMap, - oldTreePathsMap: oldTreePathsMap, - manifestPathsToDbComponentTypesMap: manifestPathsToTypesPrune, - node, - user, - }); - logger.info(`[PRUNING] ${pruneRes.count} cidPruneList entries added.`); - // Persist updated manifest, (pin, update Node DB entry) const { persistedManifestCid, date } = await persistManifest({ manifest: updatedManifest, node, userId: user.id }); if (!persistedManifestCid) @@ -190,12 +163,27 @@ export async function processS3DataToIpfs({ `Failed to persist manifest: ${updatedManifest}, node: ${node}, userId: ${user.id}`, ); + /** + * Update drive clock on automerge document + */ + const latestDriveClock = await getLatestDriveTime(node.uuid as NodeUuid); + try { + await repoService.dispatchAction({ + uuid: node.uuid as NodeUuid, + documentId: node.manifestDocumentId as DocumentId, + actions: [{ type: 'Set Drive Clock', time: latestDriveClock }], + }); + // await manifestUpdater({ type: 'Set Drive Clock', time: latestDriveClock }); + } catch (err) { + logger.error({ err }, 'Set Drive Clock'); + } + const tree = await getTreeAndFill(updatedManifest, node.uuid, user.id); return { ok: true, value: { - rootDataCid: newRootCidString, + // rootDataCid: newRootCidString, manifest: updatedManifest, manifestCid: persistedManifestCid, tree: tree, @@ -206,6 +194,7 @@ export async function processS3DataToIpfs({ } catch (error) { // DB status to failed // Socket emit to client + // const manifest = await getLatestManifestFromNode(node); logger.error({ error }, 'Error processing S3 data to IPFS'); if (pinResult.length) { handleCleanupOnMidProcessingError({ @@ -236,49 +225,30 @@ export async function processNewFolder({ contextPath, newFolderName, }: ProcessNewFolderParams): Promise> { - let pinResult: IpfsPinnedResult[] = []; - const manifestPathsToTypesPrune: Record = {}; try { - const { manifest, manifestCid } = await getManifestFromNode(node); - const rootCid = extractRootDagCidFromManifest(manifest, manifestCid); - - // Pull old tree - const externalCidMap = await generateExternalCidMap(node.uuid); - const oldFlatTree = recursiveFlattenTree(await getDirectoryTree(rootCid, externalCidMap)) as RecursiveLsResult[]; - oldFlatTree.push({ cid: rootCid, path: rootCid, name: 'Old Root Dir', type: 'dir', size: 0 }); - // Map paths=>branch for constant lookup - const oldTreePathsMap: Record = oldFlatTree.reduce((map, branch) => { - // branch.path would still be deneutralized path, change if ever becomes necessary. - // i.e. branch.path === '/bafkrootcid/images/node.png' rather than '/root/images/node.png' - map[neutralizePath(branch.path)] = branch; - return map; - }, {}); - // External dir check - pathContainsExternalCids(oldTreePathsMap, contextPath); + await externalDirCheck(node.id, contextPath); - const splitContextPath = contextPath.split('/'); - splitContextPath.shift(); - //rootlessContextPath = how many dags need to be reset, n + 1, used for addToDag function - const rootlessContextPath = splitContextPath.join('/'); + // Make sure newFolderName doesn't contain any slashes + newFolderName = newFolderName.replace(/\//g, ''); // Check if paths are unique - ensureUniquePaths({ flatTreeMap: oldTreePathsMap, contextPath, externalUrlFilePaths: [newFolderName] }); - - //New folder creation, structure for DAG extension, add to DAG - if (newFolderName) { - const newFolder = await pinDirectory([{ path: newFolderName + '/.nodeKeep', content: Buffer.from('') }]); - if (!newFolder.length) throw createNewFolderCreationError('Failed creating new folder'); - pinResult = newFolder; - } + await ensureUniquePathsDraftTree({ nodeId: node.id, contextPath, externalUrlFilePaths: [newFolderName] }); + + // Create new folder in draft node tree + const newFolderEntry = await prisma.draftNodeTree.create({ + data: { + path: contextPath + '/' + newFolderName, + cid: DRAFT_DIR_CID, + directory: true, + size: 0, + external: false, + nodeId: node.id, + // userId: user.id, + }, + }); - const { filesToAddToDag, filteredFiles } = filterFirstNestings(pinResult); - const { - updatedRootCid: newRootCidString, - updatedDagCidMap, - contextPathNewCid, - } = await addFilesToDag(rootCid, rootlessContextPath, filesToAddToDag); - if (typeof newRootCidString !== 'string') throw createDagExtensionFailureError; + const date = newFolderEntry.updatedAt; /** * Repull latest node, to avoid stale manifest that may of been modified since last pull @@ -291,64 +261,43 @@ export async function processNewFolder({ }, }); - const { manifest: ltsManifest, manifestCid: ltsManifestCid } = await getManifestFromNode(ltsNode); - let updatedManifest = updateManifestDataBucket({ - manifest: ltsManifest, - newRootCid: newRootCidString, - }); + let ltsManifest = await getLatestManifestFromNode(ltsNode); - //Update all existing DAG components with new CIDs if they were apart of a cascading update - if (Object.keys(updatedDagCidMap).length) { - updatedManifest = updateManifestComponentDagCids(updatedManifest, updatedDagCidMap); + /** + * Update drive clock on automerge document + */ + const latestDriveClock = await getLatestDriveTime(node.uuid as NodeUuid); + try { + // ltsManifest = await manifestUpdater({ type: 'Set Drive Clock', time: latestDriveClock }); + const response = await repoService.dispatchAction({ + uuid: node.uuid as NodeUuid, + documentId: node.manifestDocumentId as DocumentId, + actions: [{ type: 'Set Drive Clock', time: latestDriveClock }], + }); + if (response?.manifest) { + ltsManifest = response.manifest; + } + } catch (err) { + logger.error({ err }, 'Set Drive Clock'); } - // Update existing data references, add new data references. - const upserts = await updateDataReferences({ node, user, updatedManifest, newRootCidString, externalCidMap }); - if (upserts) logger.info(`${upserts.length} new data references added/modified`); - - // Cleanup, add old DAGs to prune list - const pruneRes = await cleanupDanglingRefs({ - newRootCidString, - externalCidMap, - oldTreePathsMap: oldTreePathsMap, - manifestPathsToDbComponentTypesMap: manifestPathsToTypesPrune, - node, - user, - }); - logger.info(`[PRUNING] ${pruneRes.count} cidPruneList entries added.`); - - // Persist updated manifest, (pin, update Node DB entry) - const { persistedManifestCid, date } = await persistManifest({ manifest: updatedManifest, node, userId: user.id }); - if (!persistedManifestCid) - throw createManifestPersistFailError( - `Failed to persist manifest: ${updatedManifest}, node: ${node}, userId: ${user.id}`, - ); - - const tree = await getTreeAndFill(updatedManifest, node.uuid, user.id); + const tree = await getTreeAndFill(ltsManifest, node.uuid, user.id); return { ok: true, value: { - rootDataCid: newRootCidString, - manifest: updatedManifest, - manifestCid: persistedManifestCid, + manifest: ltsManifest, + manifestCid: node.manifestUrl, tree: tree, - date: date, + date: date.toString(), }, }; // SUCCESS } catch (error) { // DB status to failed // Socket emit to client - logger.error({ error }, 'Error processing S3 data to IPFS'); - if (pinResult.length) { - handleCleanupOnMidProcessingError({ - pinnedFiles: pinResult, - manifestPathsToDbComponentTypesMap: manifestPathsToTypesPrune, - node, - user, - }); - } + console.log({ error }, 'Error processing new folder'); + logger.error({ error }, 'Error processing new folder'); const controlledErr = 'type' in error ? error : createUnhandledError(error); return { ok: false, value: controlledErr }; } @@ -399,7 +348,7 @@ export function pathContainsExternalCids(flatTreeMap: Record; contextPath: string; filesBeingAdded?: any[]; @@ -438,7 +387,7 @@ export function ensureUniquePaths({ return true; } -export async function pinNewFiles(files: any[]): Promise { +export async function pinNewFiles(files: any[], wrapWithDirectory = false): Promise { const structuredFilesForPinning: IpfsDirStructuredInput[] = await Promise.all( files.map(async (f: any) => { const path = f.originalname ?? f.path; @@ -452,7 +401,7 @@ export async function pinNewFiles(files: any[]): Promise { ); let uploaded: IpfsPinnedResult[]; if (structuredFilesForPinning.length) { - if (structuredFilesForPinning.length) uploaded = await pinDirectory(structuredFilesForPinning); + if (structuredFilesForPinning.length) uploaded = await pinDirectory(structuredFilesForPinning, wrapWithDirectory); if (!uploaded.length) throw createIpfsUploadFailureError(); logger.info('[UPDATE DATASET] Pinned files: ', uploaded.length); } @@ -538,18 +487,11 @@ interface UpdateDataReferencesParams { node: Node; user: User; updatedManifest: ResearchObjectV1; - newRootCidString: string; - externalCidMap: ExternalCidMap; } -export async function updateDataReferences({ - node, - user, - updatedManifest, - newRootCidString, - externalCidMap, -}: UpdateDataReferencesParams) { - const newRefs = await prepareDataRefs(node.uuid, updatedManifest, newRootCidString, false, externalCidMap); - +export async function updateDataReferences({ node, user, updatedManifest }: UpdateDataReferencesParams) { + // const newRefs = await prepareDataRefs(node.uuid, updatedManifest, newRootCidString, false, externalCidMap); + const newRefs = await prepareDataRefsForDraftTrees(node.uuid, updatedManifest); + // debugger; // Get old refs to match their DB entry id's with the updated refs const existingRefs = await prisma.dataReference.findMany({ where: { @@ -723,35 +665,51 @@ export function constructComponentTypeMapFromFiles(files: any[]): ResearchObject return componentTypeMap; } -export function assignTypeMapInManifest( +export async function assignTypeMapInManifest( + node: Node, manifest: ResearchObjectV1, compTypeMap: ResearchObjectComponentTypeMap, contextPath: DrivePath, contextPathNewCid: string, -): ResearchObjectV1 { - const componentIndex = manifest.components.findIndex((c) => c.payload.path === contextPath); - // Check if the component already exists, update its type map - if (componentIndex !== -1) { - const existingType = manifest.components[componentIndex].type; - manifest.components[componentIndex].type = { - ...(isResearchObjectComponentTypeMap(existingType) && { ...existingType }), - ...compTypeMap, - }; - } else { - // If doesn't exist, create the component and assign its type map - const compName = contextPath.split('/').pop(); - const comp = { - id: v4(), - name: compName, - type: compTypeMap, - // ...(c.componentSubtype && { subtype: c.componentSubtype }), - payload: { - ...urlOrCid(contextPathNewCid, ResearchObjectComponentType.DATA), - path: contextPath, - }, - // starred: c.star || false, - }; - manifest.components.push(comp); +): Promise { + try { + let document: ResearchObjectDocument; + const componentIndex = manifest.components.findIndex((c) => c.payload.path === contextPath); + // Check if the component already exists, update its type map + if (componentIndex !== -1) { + const prevComponent = manifest.components[componentIndex]; + document = await repoService.dispatchAction({ + uuid: node.uuid as NodeUuid, + documentId: node.manifestDocumentId as DocumentId, + actions: [ + { + type: 'Assign Component Type', + component: prevComponent, + componentTypeMap: compTypeMap, + }, + ], + }); + } else { + // If doesn't exist, create the component and assign its type map + const compName = contextPath.split('/').pop(); + const component = { + id: v4(), + name: compName, + type: compTypeMap, + payload: { + ...urlOrCid(contextPathNewCid, ResearchObjectComponentType.DATA), + path: contextPath, + }, + }; + document = await repoService.dispatchAction({ + uuid: node.uuid as NodeUuid, + documentId: node.manifestDocumentId as DocumentId, + actions: [{ type: 'Add Components', components: [component] }], + }); + } + return document.manifest; + } catch (err) { + logger.error(err, 'Error Caught in assignTypeMapInManifest'); + return manifest; } - return manifest; } diff --git a/desci-server/src/services/dataService.ts b/desci-server/src/services/dataService.ts index 493773af9..8ba0422d1 100644 --- a/desci-server/src/services/dataService.ts +++ b/desci-server/src/services/dataService.ts @@ -4,9 +4,9 @@ import { User } from '@prisma/client'; -import prisma from 'client'; -import logger from 'logger'; -import { gbToBytes } from 'utils/driveUtils'; +import { prisma } from '../client.js'; +import { logger } from '../logger.js'; +import { gbToBytes } from '../utils/driveUtils.js'; export const getDataUsageForUserBytes = async (user: User) => { const dataConsumption = await prisma.dataReference.aggregate({ diff --git a/desci-server/src/services/draftTrees.ts b/desci-server/src/services/draftTrees.ts new file mode 100644 index 000000000..86638816e --- /dev/null +++ b/desci-server/src/services/draftTrees.ts @@ -0,0 +1,149 @@ +import { neutralizePath } from '@desci-labs/desci-models'; +import { DataType } from '@prisma/client'; + +import { prisma } from '../client.js'; +import { logger as parentLogger } from '../logger.js'; +import { generateTimestampMapFromDataRefs } from '../utils/dataRefTools.js'; +import { TimestampMap, ipfsDagToDraftNodeTreeEntries } from '../utils/draftTreeUtils.js'; +import { generateExternalCidMap } from '../utils/driveUtils.js'; + +import { extractRootDagCidFromManifest, getManifestFromNode } from './data/processing.js'; +import { createDuplicateFileError, createMixingExternalDataError } from './data/processingErrors.js'; +import { getDirectoryTree } from './ipfs.js'; +import { NodeUuid } from './manifestRepo.js'; + +const logger = parentLogger.child({ + module: 'Services::DraftTrees', +}); + +export async function migrateIpfsTreeToNodeTree(nodeUuid: string) { + const node = await prisma.node.findUnique({ where: { uuid: nodeUuid }, include: { owner: true } }); + if (!node) { + throw new Error(`Node with uuid ${nodeUuid} not found`); + } + + const { manifest, manifestCid } = await getManifestFromNode(node); + const rootDagCid = extractRootDagCidFromManifest(manifest, manifestCid); + const externalCidMap = await generateExternalCidMap(nodeUuid); + + const ipfsTree = await getDirectoryTree(rootDagCid, externalCidMap); + + const timestampMap: TimestampMap = await generateTimestampMapFromDataRefs(node.id); + + const dbDraftTreeEntries = await ipfsDagToDraftNodeTreeEntries({ ipfsTree, node, user: node.owner, timestampMap }); + + await prisma.draftNodeTree.createMany({ + data: dbDraftTreeEntries, + skipDuplicates: true, + }); + + // Adjust existing private data references to use neutral paths + const currentPrivateDataRefs = await prisma.dataReference.findMany({ + where: { nodeId: node.id, type: { not: DataType.MANIFEST } }, + }); + const updatesForPrivateDataRefs = currentPrivateDataRefs.map((ref) => + prisma.dataReference.update({ + where: { + id: ref.id, + }, + data: { + path: neutralizePath(ref.path), + }, + }), + ); + try { + await prisma.$transaction(updatesForPrivateDataRefs); + logger.info(`Private data refs updated successfully for node ${nodeUuid}`); + } catch (error) { + logger.error({ error }, `Failed to update private data refs for node ${nodeUuid}`); + } + + logger.info(`Migrated IPFS tree to DraftNodeTree for node ${nodeUuid}`); +} + +export async function externalDirCheck(nodeId: number, path: string): Promise { + const contextDraftTreeNode = await prisma.draftNodeTree.findFirst({ + where: { nodeId, path }, + }); + if (contextDraftTreeNode?.external) throw createMixingExternalDataError(); + return false; +} + +export interface EnsureUniquePathsDraftTreeParams { + nodeId: number; + contextPath: string; + filesBeingAdded?: any[]; + externalUrlFilePaths?: string[]; +} + +export async function ensureUniquePathsDraftTree({ + contextPath, + filesBeingAdded, + externalUrlFilePaths, + nodeId, +}: EnsureUniquePathsDraftTreeParams): Promise { + // Ensure all paths being added are unique to prevent collisions + // debugger; + let newPathsFormatted: string[] = []; + const header = contextPath; + if (filesBeingAdded?.length) { + newPathsFormatted = filesBeingAdded.map((f) => { + if (f.originalname[0] !== '/') f.originalname = '/' + f.originalname; + return header + f.originalname; + }); + } + if (externalUrlFilePaths) { + if (externalUrlFilePaths?.length > 0) { + newPathsFormatted = externalUrlFilePaths.map((filePath) => { + return header + '/' + filePath; + }); + } + } + + const matches = await prisma.draftNodeTree.findMany({ + where: { + nodeId, + path: { + in: newPathsFormatted, + }, + }, + }); + + const hasDuplicates = matches.length; + if (hasDuplicates) { + logger.info('[UPDATE DATASET] Rejected as duplicate paths were found'); + throw createDuplicateFileError(); + } + return true; +} + +export async function getDraftTreeEntriesByUuid(uuid: NodeUuid) { + const node = await prisma.node.findFirst({ where: uuid.endsWith('.') ? { uuid } : { uuid: uuid + '.' } }); + + const treeEntries = await prisma.draftNodeTree.findMany({ + where: { + nodeId: node.id, + }, + }); + + return treeEntries; +} + +export async function getLatestDriveTime(nodeUuid: NodeUuid) { + const node = await prisma.node.findFirst({ + where: { + uuid: nodeUuid, + }, + }); + + const latestDriveTime = await prisma.draftNodeTree.findFirst({ + where: { + nodeId: node.id, + }, + orderBy: { + updatedAt: 'desc', + }, + }); + + return latestDriveTime?.updatedAt.getTime().toString() ?? new Date().getTime().toString(); +} diff --git a/desci-server/src/services/estuary.ts b/desci-server/src/services/estuary.ts index 3f793c7f7..425c1f063 100644 --- a/desci-server/src/services/estuary.ts +++ b/desci-server/src/services/estuary.ts @@ -1,9 +1,7 @@ -import { ReadStream } from 'fs'; - import axios, { AxiosResponse } from 'axios'; import FormData from 'form-data'; -import parentLogger from 'logger'; +import { logger as parentLogger } from '../logger.js'; type ACTIONS = 'PIN' | 'UPLOAD'; diff --git a/desci-server/src/services/friendReferral.ts b/desci-server/src/services/friendReferral.ts index a1d353eaf..b7cb8c2ce 100644 --- a/desci-server/src/services/friendReferral.ts +++ b/desci-server/src/services/friendReferral.ts @@ -1,7 +1,7 @@ import { FriendReferralStatus } from '@prisma/client'; -import client from '../client'; -import parentLogger from '../logger'; +import { prisma as client } from '../client.js'; +import { logger as parentLogger } from '../logger.js'; const logger = parentLogger.child({ module: 'Services::FriendReferral' }); diff --git a/desci-server/src/services/interactionLog.ts b/desci-server/src/services/interactionLog.ts index 214c986b7..6c18b8d0b 100755 --- a/desci-server/src/services/interactionLog.ts +++ b/desci-server/src/services/interactionLog.ts @@ -1,8 +1,8 @@ import { ActionType } from '@prisma/client'; import { Request } from 'express'; -import prisma from 'client'; -import parentLogger from 'logger'; +import { prisma } from '../client.js'; +import { logger as parentLogger } from '../logger.js'; const logger = parentLogger.child({ module: 'Services::InteractionLog' }); diff --git a/desci-server/src/services/invites.ts b/desci-server/src/services/invites.ts index 16606e5fe..61a349eec 100644 --- a/desci-server/src/services/invites.ts +++ b/desci-server/src/services/invites.ts @@ -1,11 +1,8 @@ -import crypto from 'crypto'; - import { User } from '@prisma/client'; -import parentLogger from 'logger'; -import createRandomCode from 'utils/createRandomCode'; - -import client from '../client'; +import { prisma as client } from '../client.js'; +import { logger as parentLogger } from '../logger.js'; +import createRandomCode from '../utils/createRandomCode.js'; const logger = parentLogger.child({ module: 'Services::Invites' }); diff --git a/desci-server/src/services/ipfs.ts b/desci-server/src/services/ipfs.ts index 3ae753539..5ceb2947c 100644 --- a/desci-server/src/services/ipfs.ts +++ b/desci-server/src/services/ipfs.ts @@ -3,37 +3,34 @@ import https from 'https'; import { Readable } from 'stream'; import { - CodeComponent, - PdfComponent, + type CodeComponent, + type PdfComponent, ResearchObjectComponentType, - ResearchObjectV1, - ResearchObjectV1Component, - deneutralizePath, + type ResearchObjectV1, + type ResearchObjectV1Component, } from '@desci-labs/desci-models'; import * as dagPb from '@ipld/dag-pb'; -import { PBNode } from '@ipld/dag-pb/src/interface'; -import { DataReference, DataType, NodeVersion, Prisma } from '@prisma/client'; +import type { PBNode } from '@ipld/dag-pb'; +import { DataReference, DataType, NodeVersion } from '@prisma/client'; import axios from 'axios'; -// import CID from 'cids'; import * as ipfs from 'ipfs-http-client'; import { CID as CID2, globSource } from 'ipfs-http-client'; import UnixFS from 'ipfs-unixfs'; import toBuffer from 'it-to-buffer'; -import flatten from 'lodash/flatten'; -import uniq from 'lodash/uniq'; +import { flatten, uniq } from 'lodash-es'; import * as multiformats from 'multiformats'; import { code as rawCode } from 'multiformats/codecs/raw'; -import prisma from 'client'; -import { PUBLIC_IPFS_PATH } from 'config'; -import parentLogger from 'logger'; -import { getOrCache } from 'redisClient'; -import { DRIVE_NODE_ROOT_PATH, ExternalCidMap, newCid, oldCid } from 'utils/driveUtils'; -import { getGithubExternalUrl, processGithubUrl } from 'utils/githubUtils'; -import { createManifest, getUrlsFromParam, makePublic } from 'utils/manifestDraftUtils'; +import { prisma } from '../client.js'; +import { PUBLIC_IPFS_PATH } from '../config/index.js'; +import { logger as parentLogger } from '../logger.js'; +import { getOrCache } from '../redisClient.js'; +import { addToDir, getSize, makeDir, updateDagCid } from '../utils/dagConcat.js'; +import { DRIVE_NODE_ROOT_PATH, type ExternalCidMap, type newCid, type oldCid } from '../utils/driveUtils.js'; +import { getGithubExternalUrl, processGithubUrl } from '../utils/githubUtils.js'; +import { createManifest, getUrlsFromParam, makePublic } from '../utils/manifestDraftUtils.js'; // eslint-disable-next-line @typescript-eslint/no-var-requires -const { addToDir, concat, getSize, makeDir, updateDagCid } = require('../utils/dagConcat.cjs'); export const IPFS_PATH_TMP = '/tmp/ipfs'; const logger = parentLogger.child({ @@ -374,7 +371,7 @@ export const getDirectoryTreeCids = async (cid: string, externalCidMap: External } }); }; - const flatCids: string[] = uniq( + const flatCids = uniq( recurse(tree) .filter(Boolean) .map((e) => e.cid || e) @@ -397,16 +394,22 @@ export const getDirectoryTree = async ( `[getDirectoryTree]retrieving tree for cid: ${cid}, ipfs online: ${isOnline}`, ); try { - const tree = await getOrCache( - `full-tree-${cid}${!returnFiles ? '-no-files' : ''}${cid}${!returnExternalFiles ? '-no-ext-files' : ''}`, - getTree, - ); + // const tree = await getOrCache( + // `full-tree-${cid}${!returnFiles ? '-no-files' : ''}${cid}${!returnExternalFiles ? '-no-ext-files' : ''}`, + // getTree, + // ); + const tree = null; if (tree) return tree; throw new Error('[getDirectoryTree] Failed to retrieve tree from cache'); } catch (err) { logger.warn({ fn: 'getDirectoryTree', err }, '[getDirectoryTree] error'); logger.info('[getDirectoryTree] Falling back on uncached tree retrieval'); - return getTree(); + const startTime = process.hrtime(); + const treeRes = await getTree(); + // return getTree(); + const endTime = process.hrtime(startTime); + logger.info(`[getDirectoryTree] Execution time: ${endTime[0]}s ${endTime[1] / 1000000}ms`); + return treeRes; } async function getTree() { if (Object.keys(externalCidMap).length === 0) { @@ -549,7 +552,7 @@ export async function mixedLs( } export const pubRecursiveLs = async (cid: string, carryPath?: string) => { - return await getOrCache(`tree-chunk-${cid}-${carryPath}`, async () => { + return await getOrCache(`tree-chunk-${cid}-${carryPath}-${Date.now()}`, async () => { logger.info({ fn: 'pubRecursiveLs', cid, carryPath }, 'Tree chunk not cached, retrieving from IPFS'); carryPath = carryPath || convertToCidV1(cid); const tree = []; @@ -943,6 +946,7 @@ export async function renameDagLink(dagCid: string | multiformats.CID, linkName: } const linkIdx = Links.findIndex((link) => link.Name === linkName); + logger.info({ Links, linkIdx, linkName, Link: Links[linkIdx] }, '[RENAME DAG LINK INFO]::'); Links[linkIdx].Name = newName; return client.block.put(dagPb.encode(dagPb.prepare({ Data, Links })), { diff --git a/desci-server/src/services/manifestRepo.ts b/desci-server/src/services/manifestRepo.ts new file mode 100644 index 000000000..8d5feb91b --- /dev/null +++ b/desci-server/src/services/manifestRepo.ts @@ -0,0 +1,268 @@ +import { Doc, getHeads } from '@automerge/automerge'; +import { AutomergeUrl, DocumentId } from '@automerge/automerge-repo'; +import { + ResearchObjectComponentTypeMap, + ResearchObjectV1Component, + isResearchObjectComponentTypeMap, +} from '@desci-labs/desci-models'; +import { Node } from '@prisma/client'; + +import { logger } from '../logger.js'; +import { backendRepo } from '../repo.js'; +import { ResearchObjectDocument } from '../types/documents.js'; + +import { getManifestFromNode } from './data/processing.js'; +import repoService from './repoService.js'; + +export type NodeUuid = string & { _kind: 'uuid' }; + +export const getAutomergeUrl = (documentId: DocumentId): AutomergeUrl => { + return `automerge:${documentId}` as AutomergeUrl; +}; + +// const createManifestDocument = async function ({ node, manifest }: { node: Node; manifest: ResearchObjectV1 }) { +// logger.info({ uuid: node.uuid }, 'START [CreateNodeDocument]'); +// const uuid = node.uuid.replace(/\.$/, ''); +// // const backendRepo = server.repo; +// logger.info('[Backend REPO]:', backendRepo.networkSubsystem.peerId); + +// const handle = backendRepo.create(); +// handle.change( +// (document) => { +// document.manifest = manifest; +// document.uuid = uuid; +// document.driveClock = Date.now().toString(); +// }, +// { message: 'Init Document', time: Date.now() }, +// ); + +// const document = await handle.doc(); +// logger.info('[AUTOMERGE]::[HANDLE NEW CHANGED]', handle.url, handle.isReady(), document); + +// await prisma.node.update({ where: { id: node.id }, data: { manifestDocumentId: handle.documentId } }); + +// logger.info('END [CreateNodeDocument]', { documentId: handle.documentId }); +// return handle.documentId; +// }; + +// TODO: remove after migration +// const getDraftManifestFromUuid = async function (uuid: NodeUuid) { +// logger.info({ uuid }, 'START [getDraftManifestFromUuid]'); +// // const backendRepo = server.repo; +// const node = await prisma.node.findFirst({ +// where: { uuid }, +// }); + +// if (!node) { +// throw new Error(`Node with uuid ${uuid} not found!`); +// } + +// const automergeUrl = getAutomergeUrl(node.manifestDocumentId as DocumentId); +// const handle = backendRepo.find(automergeUrl as AutomergeUrl); + +// const document = await handle.doc(); + +// logger.info({ uuid: document.uuid, documentId: handle.documentId }, '[AUTOMERGE]::[Document Found]'); + +// logger.info({ uuid }, '[END]::GetDraftManifestFromUuid'); +// return document.manifest; +// }; + +// export const getDraftManifest = async function (node: Node) { +// return getDraftManifestFromUuid(node.uuid as NodeUuid); +// }; + +export const getLatestManifestFromNode = async (node: Node) => { + logger.info({ uuid: node.uuid }, 'START [getLatestManifestFromNode]'); + let manifest = await repoService.getDraftManifest(node.uuid as NodeUuid); + if (!manifest) { + const publishedManifest = await getManifestFromNode(node); + manifest = publishedManifest.manifest; + } + return manifest; +}; + +export function assertNever(value: never) { + console.error('Unknown value', value); + throw Error('Not Possible'); +} + +export type ManifestActions = + | { type: 'Add Components'; components: ResearchObjectV1Component[] } + | { type: 'Delete Component'; componentId: string } + | { type: 'Delete Components'; pathsToDelete: string[] } + | { type: 'Rename Component'; path: string; fileName: string } + | { type: 'Rename Component Path'; oldPath: string; newPath: string } + | { + type: 'Update Component'; + component: ResearchObjectV1Component; + componentIndex: number; + } + | { + type: 'Assign Component Type'; + component: ResearchObjectV1Component; + componentTypeMap: ResearchObjectComponentTypeMap; + } + | { type: 'Set Drive Clock'; time: string }; + +const getNodeManifestUpdater = (node: Node) => { + const automergeUrl = getAutomergeUrl(node.manifestDocumentId as DocumentId); + const handle = backendRepo.find(automergeUrl as AutomergeUrl); + + return async (action: ManifestActions) => { + if (!handle) return null; + let latestDocument = await handle.doc(); + const heads = getHeads(latestDocument); + logger.info({ heads }, `Document`); + logger.info({ action }, `DocumentUpdater::Dispatched`); + + switch (action.type) { + case 'Add Components': + const uniqueComponents = action.components.filter( + (componentToAdd) => + !latestDocument.manifest.components.some((c) => c.payload?.path === componentToAdd.payload?.path), + ); + if (uniqueComponents.length > 0) { + handle.change( + (document) => { + uniqueComponents.forEach((component) => { + document.manifest.components.push(component); + }); + }, + { time: Date.now(), message: action.type }, + ); + } + break; + case 'Rename Component': + handle.change( + (document) => { + const component = document.manifest.components.find((c) => c.payload?.path === action.path); + if (component) component.name = action.fileName; + }, + { time: Date.now(), message: action.type }, + ); + break; + case 'Delete Component': + const deleteIdx = latestDocument.manifest.components.findIndex((c) => c.id === action.componentId); + if (deleteIdx !== -1) { + logger.info({ action, deleteIdx }, `DocumentUpdater::Deleteing`); + handle.change( + (document) => { + document.manifest.components.splice(deleteIdx, 1); + }, + { time: Date.now(), message: action.type }, + ); + } + break; + case 'Delete Components': + const componentEntries = latestDocument.manifest.components + .map((c) => (action.pathsToDelete.includes(c.payload?.path) ? c.payload?.path : null)) + .filter(Boolean) as string[]; + if (componentEntries.length > 0) { + logger.info({ action, componentEntries }, `DocumentUpdater::Delete Components`); + handle.change( + (document) => { + for (const path of componentEntries) { + const deleteIdx = document.manifest.components.findIndex((c) => c.payload?.path === path); + logger.info({ path, deleteIdx }, `DocumentUpdater::Delete`); + if (deleteIdx !== -1) document.manifest.components.splice(deleteIdx, 1); + } + }, + { time: Date.now(), message: action.type }, + ); + } + break; + case 'Rename Component Path': + const components = latestDocument.manifest.components.filter( + (component) => + component.payload?.path?.startsWith(action.oldPath + '/') || component.payload?.path === action.oldPath, + ); + if (components.length > 0) { + handle.change( + (document) => { + const components = document.manifest.components.filter( + (component) => + component.payload?.path.startsWith(action.oldPath + '/') || + component.payload?.path === action.oldPath, + ); + for (const component of components) { + component.payload.path = component.payload?.path.replace(action.oldPath, action.newPath); + } + }, + { time: Date.now(), message: action.type }, + ); + } + break; + case 'Update Component': + handle.change( + (document) => { + updateManifestComponent(document, action.component, action.componentIndex); + }, + { time: Date.now(), message: action.type }, + ); + break; + case 'Assign Component Type': + handle.change( + (document) => { + updateComponentTypeMap(document, action.component.payload?.path, action.componentTypeMap); + }, + { time: Date.now(), message: action.type }, + ); + break; + case 'Set Drive Clock': + handle.change( + (document) => { + if (document.driveClock && document.driveClock === action.time) return; // Don't update if already the latest + document.driveClock = action.time; + }, + { time: Date.now(), message: action.type }, + ); + break; + default: + assertNever(action); + } + latestDocument = await handle.doc(); + const updatedHeads = getHeads(latestDocument); + logger.info({ action, heads: updatedHeads }, `DocumentUpdater::Exit`); + return latestDocument.manifest; + }; +}; + +const updateManifestComponent = ( + doc: Doc, + component: ResearchObjectV1Component, + componentIndex: number, +) => { + if (componentIndex === -1 || componentIndex === undefined) return; + + const currentComponent = doc.manifest.components[componentIndex]; + currentComponent.type = component?.type || currentComponent.type; + + if (!currentComponent.starred) currentComponent.starred = false; + currentComponent.starred = component?.starred || currentComponent.starred; +}; + +const updateComponentTypeMap = ( + doc: Doc, + path: string, + compTypeMap: ResearchObjectComponentTypeMap, +) => { + const currentComponent = doc.manifest.components.find((c) => c.payload?.path === path); + if (!currentComponent) return; + + const existingType = currentComponent.type; + if (!isResearchObjectComponentTypeMap(existingType)) { + currentComponent.type = {}; + } + + const componentType = currentComponent.type; + const update = { + ...(isResearchObjectComponentTypeMap(existingType) && { ...existingType }), + ...compTypeMap, + }; + + Object.entries(update).forEach(([key, value]) => { + if (!componentType[key]) componentType[key] = ''; + componentType[key] = value; + }); +}; diff --git a/desci-server/src/services/nodeManager.ts b/desci-server/src/services/nodeManager.ts index 8549a4f9c..e140db41a 100644 --- a/desci-server/src/services/nodeManager.ts +++ b/desci-server/src/services/nodeManager.ts @@ -2,17 +2,16 @@ import { PdfComponent, ResearchObjectComponentType, ResearchObjectV1 } from '@de import { DataType, Prisma, PublicDataReference, User } from '@prisma/client'; import axios from 'axios'; -import prisma from 'client'; -import { MEDIA_SERVER_API_KEY, MEDIA_SERVER_API_URL, PUBLIC_IPFS_PATH } from 'config'; -import { cleanupManifestUrl } from 'controllers/nodes'; -import parentLogger from 'logger'; -import { uploadDataToEstuary } from 'services/estuary'; -import { getIndexedResearchObjects } from 'theGraph'; -import { hexToCid, randomUUID64 } from 'utils'; -import { asyncMap } from 'utils'; -import { generateDataReferences } from 'utils/dataRefTools'; - -import { addBufferToIpfs, downloadFilesAndMakeManifest, getSizeForCid, resolveIpfsData } from './ipfs'; +import { prisma } from '../client.js'; +import { MEDIA_SERVER_API_KEY, MEDIA_SERVER_API_URL, PUBLIC_IPFS_PATH } from '../config/index.js'; +import { logger as parentLogger } from '../logger.js'; +import { uploadDataToEstuary } from '../services/estuary.js'; +import { getIndexedResearchObjects } from '../theGraph.js'; +import { generateDataReferences } from '../utils/dataRefTools.js'; +import { cleanupManifestUrl } from '../utils/manifest.js'; +import { hexToCid, randomUUID64, asyncMap } from '../utils.js'; + +import { addBufferToIpfs, downloadFilesAndMakeManifest, getSizeForCid, resolveIpfsData } from './ipfs.js'; const ESTUARY_MIRROR_ID = 1; @@ -55,11 +54,26 @@ export const createNodeDraftBlank = async ( return nodeCopy; }; +export const setCeramicStream = async (uuid: string, ceramicStream: string) => { + logger.debug({ fn: 'setCeramicStream', uuid, ceramicStream}, 'node::setCeramicStream'); + uuid = uuid.endsWith(".") ? uuid : uuid + "."; + return await prisma.node.update({ + + data: { + ceramicStream, + }, + where: { + uuid, + } + }); +}; + export const createPublicDataRefs = async ( data: Prisma.PublicDataReferenceCreateManyInput[], userId: number | undefined, versionId: number | undefined, ) => { + debugger; const dataWithVersions = data.map((d) => ({ ...d, versionId })); const publicDataRefRes = await prisma.publicDataReference.createMany({ data: dataWithVersions, @@ -150,6 +164,7 @@ export const getAllCidsRequiredForPublish = async ( nodeId: number | undefined, versionId: number | undefined, ): Promise => { + // debugger; // ensure public data refs staged matches our data bucket cids const latestManifestEntry: ResearchObjectV1 = (await axios.get(`${PUBLIC_IPFS_PATH}/${manifestCid}`)).data; // const manifestString = manifestBuffer.toString('utf8'); @@ -341,8 +356,8 @@ export const cacheNodeMetadata = async (uuid: string, manifestCid: string, versi versionToCache !== undefined && versionToCache < history.versions.length ? versionToCache : history?.versions.length - ? history.versions.length - 1 - : 0; + ? history.versions.length - 1 + : 0; if (!manifestCid || manifestCid.length === 0) { history.versions.reverse(); @@ -359,6 +374,7 @@ export const cacheNodeMetadata = async (uuid: string, manifestCid: string, versi // console.log('cacheNodeMetadata::Manifest', manifest); const pdfs = manifest.components.filter( + // todo: update check to include file extension (.pdf) (c) => c.type === ResearchObjectComponentType.PDF && c.starred, ) as PdfComponent[]; logger.debug({ pdfs }, 'PDFS:::=>>>>>>>>>>>>'); diff --git a/desci-server/src/services/permissions.ts b/desci-server/src/services/permissions.ts new file mode 100644 index 000000000..5deba653d --- /dev/null +++ b/desci-server/src/services/permissions.ts @@ -0,0 +1,15 @@ +import { prisma } from '../client.js'; + +export const verifyNodeDocumentAccess = async (userId: number, documentId: string) => { + try { + const node = await prisma.node.findFirst({ + where: { AND: [{ manifestDocumentId: documentId }, { ownerId: userId }] }, + }); + if (!node) return false; + + if (node.manifestDocumentId === documentId && node.ownerId === userId) return true; + return false; + } catch (e) { + return false; + } +}; diff --git a/desci-server/src/services/repoService.ts b/desci-server/src/services/repoService.ts new file mode 100644 index 000000000..8ee4b438d --- /dev/null +++ b/desci-server/src/services/repoService.ts @@ -0,0 +1,100 @@ +import { DocumentId } from '@automerge/automerge-repo'; +import { ResearchObjectV1 } from '@desci-labs/desci-models'; +import axios, { AxiosInstance } from 'axios'; + +import { logger as parentLogger } from '../logger.js'; +import { ResearchObjectDocument } from '../types/documents.js'; + +import { ManifestActions, NodeUuid } from './manifestRepo.js'; + +const logger = parentLogger.child({ module: 'Repo Service' }); + +type ApiResponse = { ok: boolean } & B; + +class RepoService { + #client: AxiosInstance; + #apiKey: string; + + baseUrl: string; + + constructor() { + this.#apiKey = process.env.REPO_SERVICE_SECRET_KEY; + this.baseUrl = process.env.REPO_SERVER_URL; + + if (!this.#apiKey || !this.baseUrl) { + throw new Error('[REPO SERVICE]: env.REPO_SERVER_URL or env.REPO_SERVICE_SECRET_KEY missing'); + } + + logger.info({ url: this.baseUrl }, 'Init Repo Service'); + + this.#client = axios.create({ + baseURL: this.baseUrl, + headers: { 'x-api-key': this.#apiKey }, + }); + } + + async dispatchAction(arg: { uuid: NodeUuid | string; documentId: DocumentId; actions: ManifestActions[] }) { + logger.info({ arg }, 'Disatch Changes'); + const response = await this.#client.post<{ ok: boolean; document: ResearchObjectDocument }>( + `${this.baseUrl}/v1/nodes/documents/dispatch`, + arg, + ); + logger.info({ arg, response: response.data }, 'Disatch Changes Response'); + if (response.status === 200 && response.data.ok) { + return response.data.document; + } else { + // logger.info({ response: response.data }, 'Disatch Changes Response'); + return null; + } + } + + async initDraftDocument(arg: { uuid: string; manifest: ResearchObjectV1 }) { + logger.info({ arg }, 'Create Draft'); + try { + const response = await this.#client.post< + ApiResponse<{ documentId: DocumentId; document: ResearchObjectDocument }> + >(`${this.baseUrl}/v1/nodes/documents`, arg); + logger.info({ response: response.data }, 'Create Draft Response'); + if (response.status === 200 && response.data.ok) { + return response.data; + } else { + return null; + } + } catch (err) { + logger.error({ err }, 'Create Draft Error'); + return null; + } + } + + async getDraftDocument(arg: { uuid: NodeUuid }) { + logger.info({ arg }, 'Retrieve Draft Document'); + try { + const response = await this.#client.get>( + `${this.baseUrl}/v1/nodes/documents/draft/${arg.uuid}`, + ); + logger.info({ response: response.data }, 'Draft Retrieval Response'); + if (response.status === 200 && response.data.ok) { + return response.data.document; + } else { + return null; + } + } catch (err) { + logger.error({ err }, 'GET Draft Document Error'); + return null; + } + } + async getDraftManifest(uuid: NodeUuid) { + logger.info({ uuid }, 'Retrieve Draft Document'); + // try {} catch (err) {} + try { + const response = await this.getDraftDocument({ uuid }); + return response ? response.manifest : null; + } catch (err) { + logger.error({ err }, 'GET Draft manifest Error'); + return null; + } + } +} + +const repoService = new RepoService(); +export default repoService; diff --git a/desci-server/src/services/s3.ts b/desci-server/src/services/s3.ts index 4773a7082..cbd8999d7 100644 --- a/desci-server/src/services/s3.ts +++ b/desci-server/src/services/s3.ts @@ -1,6 +1,6 @@ import { S3Client, GetObjectCommand } from '@aws-sdk/client-s3'; -import parentLogger from 'logger'; +import { logger as parentLogger } from '../logger.js'; const logger = parentLogger.child({ module: 'Services::S3', diff --git a/desci-server/src/services/user.ts b/desci-server/src/services/user.ts index 98d7eecdf..c94405b3c 100644 --- a/desci-server/src/services/user.ts +++ b/desci-server/src/services/user.ts @@ -1,13 +1,12 @@ -import { ActionType, AuthToken, AuthTokenSource, User, prisma } from '@prisma/client'; +import { AuthTokenSource, User } from '@prisma/client'; import axios from 'axios'; -import { OrcIdRecordData, generateAccessToken, getOrcidRecord } from 'controllers/auth'; -import parentLogger from 'logger'; -import { hideEmail } from 'utils'; +import { prisma as client } from '../client.js'; +import { OrcIdRecordData, generateAccessToken, getOrcidRecord } from '../controllers/auth/index.js'; +import { logger as parentLogger } from '../logger.js'; +import { hideEmail } from '../utils.js'; -import client from '../client'; - -import { getUserConsent, saveInteraction } from './interactionLog'; +import { getUserConsent } from './interactionLog.js'; const logger = parentLogger.child({ module: 'Services::User', }); @@ -267,10 +266,14 @@ export async function getUserByOrcId(orcid: string): Promise { export async function getUserByEmail(email: string): Promise { logger.trace({ fn: 'getUserByEmail' }, `user::getUserByEmail ${hideEmail(email)}`); - const user = await client.user.findFirst({ where: { email: { - equals: email, - mode: 'insensitive' - } } }); + const user = await client.user.findFirst({ + where: { + email: { + equals: email, + mode: 'insensitive', + }, + }, + }); return user; } diff --git a/desci-server/src/services/waitlist.ts b/desci-server/src/services/waitlist.ts index 6c68dc6b9..6eaabd91e 100644 --- a/desci-server/src/services/waitlist.ts +++ b/desci-server/src/services/waitlist.ts @@ -1,4 +1,4 @@ -import client from '../client'; +import { prisma as client } from '../client.js'; const promote = async (id: number): Promise => { console.log('waitlist::promote', id); @@ -60,7 +60,7 @@ const addUser = async (email: string): Promise => { if (!user) { user = await client.user.create({ data: { - email + email, }, }); } diff --git a/desci-server/src/theGraph.ts b/desci-server/src/theGraph.ts index a30f6186b..5c7ae421d 100644 --- a/desci-server/src/theGraph.ts +++ b/desci-server/src/theGraph.ts @@ -4,8 +4,8 @@ import axios from 'axios'; -import logger from 'logger'; -import { decodeBase64UrlSafeToHex } from 'utils'; +import { logger } from './logger.js'; +import { decodeBase64UrlSafeToHex } from './utils.js'; export const getIndexedResearchObjects = async (urlSafe64s: string[]) => { const hex = urlSafe64s.map(decodeBase64UrlSafeToHex).map((h) => `0x${h}`); diff --git a/desci-server/src/types/documents.ts b/desci-server/src/types/documents.ts new file mode 100644 index 000000000..c62e0a679 --- /dev/null +++ b/desci-server/src/types/documents.ts @@ -0,0 +1,7 @@ +import { ResearchObjectV1 } from '@desci-labs/desci-models'; + +export interface ResearchObjectDocument { + manifest: ResearchObjectV1; + uuid: string; + driveClock?: string; +} diff --git a/desci-server/src/utils.ts b/desci-server/src/utils.ts index fe42aed05..77fc45a17 100644 --- a/desci-server/src/utils.ts +++ b/desci-server/src/utils.ts @@ -1,5 +1,5 @@ import { randomBytes } from 'crypto'; -import fs, { promises as fsPromises } from 'fs'; +import fs from 'fs'; import * as path from 'path'; import { Readable } from 'stream'; @@ -10,8 +10,8 @@ import { CID } from 'multiformats/cid'; import { encode, decode } from 'url-safe-base64'; import * as yauzl from 'yauzl'; -import parentLogger from 'logger'; -import { processGithubUrl } from 'utils/githubUtils'; +import { logger as parentLogger } from './logger.js'; +import { processGithubUrl } from './utils/githubUtils.js'; const logger = parentLogger.child({ module: 'utils', diff --git a/desci-server/src/utils/createJwtToken.ts b/desci-server/src/utils/createJwtToken.ts index 44541983e..4e3e160ee 100755 --- a/desci-server/src/utils/createJwtToken.ts +++ b/desci-server/src/utils/createJwtToken.ts @@ -1,6 +1,6 @@ import jwt from 'jsonwebtoken'; -import { JwtPayload } from '../types/JwtPayload'; +import { JwtPayload } from '../types/JwtPayload.js'; export const createJwtToken = (payload: JwtPayload): string => { return jwt.sign(payload, process.env.JWT_SECRET!, { diff --git a/desci-server/src/utils/dagConcat.cjs b/desci-server/src/utils/dagConcat.ts similarity index 74% rename from desci-server/src/utils/dagConcat.cjs rename to desci-server/src/utils/dagConcat.ts index cc6841844..f6624baab 100644 --- a/desci-server/src/utils/dagConcat.cjs +++ b/desci-server/src/utils/dagConcat.ts @@ -1,26 +1,27 @@ //Thanks to https://github.com/webrecorder/ipfs-composite-files /* eslint-disable @typescript-eslint/no-var-requires */ -const dagPb = require('@ipld/dag-pb'); -const UnixFS = require('ipfs-unixfs'); -const multiformats = require('multiformats'); -const { code } = require('multiformats/codecs/raw'); +import { encode, decode, prepare } from '@ipld/dag-pb'; +import UnixFS from 'ipfs-unixfs'; +import { CID } from 'multiformats'; +import { code as rawCode } from 'multiformats/codecs/raw'; + +// const { default: UnixFS } = IpfsUnixFS; -const rawCode = code; // =========================================================================== -async function getSize(ipfs, cid, allowDir = false) { +export async function getSize(ipfs, cid, allowDir = false) { const block = await ipfs.block.get(cid); // console.log('cid: ', cid); - if (typeof cid === 'string') cid = multiformats.CID.parse(cid); + if (typeof cid === 'string') cid = CID.parse(cid); // console.log('cid.code: ', cid.code); // if raw, use length of block if (cid.code == rawCode) { return block.length; } - const { Data } = dagPb.decode(block); + const { Data } = decode(block); // otherwise, parse to unixfs node - let unixfs = UnixFS.unmarshal(Data); + const unixfs = UnixFS.unmarshal(Data); if (!allowDir && unixfs.isDirectory()) { throw new Error(`cid ${cid} is a directory, only files allowed`); @@ -31,13 +32,12 @@ async function getSize(ipfs, cid, allowDir = false) { } else if (!unixfs.isDirectory()) { return unixfs.fileSize(); } else { - // eslint-disable-next-line no-array-reduce/no-reduce return unixfs.blockSizes.reduce((a, b) => a + b, 0); } } // =========================================================================== -async function concat(ipfs, cids, sizes = {}) { +export async function concat(ipfs, cids, sizes = {}) { if (cids.length === 1) { return cids[0]; } @@ -84,7 +84,7 @@ async function _createDirLinks(ipfs, files) { } // =========================================================================== -async function makeDir(ipfs, files) { +export async function makeDir(ipfs, files) { // debugger; const node = new UnixFS({ type: 'directory' }); @@ -96,17 +96,17 @@ async function makeDir(ipfs, files) { } // =========================================================================== -async function addToDir(ipfs, dirCid, files) { +export async function addToDir(ipfs, dirCid, files) { if (dirCid.code == rawCode) { throw new Error('raw cid -- not a directory'); } const block = await ipfs.block.get(dirCid); - let { Data, Links } = dagPb.decode(block); + const { Data, Links } = decode(block); // debugger; - let node = UnixFS.unmarshal(Data); + const node = UnixFS.unmarshal(Data); UnixFS.unmarshal; if (!node.isDirectory()) { @@ -115,16 +115,16 @@ async function addToDir(ipfs, dirCid, files) { const newLinks = await _createDirLinks(ipfs, files); // debugger; - Links = [...Links, ...newLinks]; + const UpdatedLinks = [...Links, ...newLinks]; // todo: disallow duplicates - Links.sort((a, b) => (a.Name < b.Name ? -1 : 1)); + UpdatedLinks.sort((a, b) => (a.Name < b.Name ? -1 : 1)); - return await putBlock(ipfs, { Data, Links }); + return await putBlock(ipfs, { Data, Links: UpdatedLinks }); } //nodeCid refers to the dag node being updated, oldCid is the cid of the link to be replaced, newCid is the cid of the new link -async function updateDagCid(ipfs, nodeCid, oldCid, newCid) { +export async function updateDagCid(ipfs, nodeCid, oldCid, newCid) { if (typeof nodeCid === 'string') oldCid = CID.parse(oldCid); if (typeof oldCid === 'string') oldCid = CID.parse(oldCid); if (typeof newCid === 'string') newCid = CID.parse(newCid); @@ -135,16 +135,16 @@ async function updateDagCid(ipfs, nodeCid, oldCid, newCid) { const block = await ipfs.block.get(nodeCid); - let { Data, Links } = dagPb.decode(block); + const { Data, Links } = decode(block); - let node = UnixFS.unmarshal(Data); + const node = UnixFS.unmarshal(Data); UnixFS.unmarshal; if (!node.isDirectory()) { throw new Error(`file cid -- not a directory`); } - linkIdx = Links.findIndex((link) => link.Hash.equals(oldCid)); + const linkIdx = Links.findIndex((link) => link.Hash.equals(oldCid)); // debugger; if (linkIdx !== -1) { @@ -156,16 +156,8 @@ async function updateDagCid(ipfs, nodeCid, oldCid, newCid) { // =========================================================================== function putBlock(ipfs, node) { - return ipfs.block.put(dagPb.encode(dagPb.prepare(node)), { + return ipfs.block.put(encode(prepare(node)), { version: 1, format: 'dag-pb', }); } - -module.exports = { - addToDir, - concat, - getSize, - makeDir, - updateDagCid, -}; diff --git a/desci-server/src/utils/dataRefTools.ts b/desci-server/src/utils/dataRefTools.ts index b10e04f73..aff32a688 100644 --- a/desci-server/src/utils/dataRefTools.ts +++ b/desci-server/src/utils/dataRefTools.ts @@ -1,19 +1,20 @@ import { FileType, ResearchObjectV1, isNodeRoot, neutralizePath, recursiveFlattenTree } from '@desci-labs/desci-models'; -import { DataReference, DataType, Prisma } from '@prisma/client'; +import { DataReference, DataType, NodeVersion, Prisma, Node } from '@prisma/client'; import axios from 'axios'; -import prisma from 'client'; -import { PUBLIC_IPFS_PATH } from 'config'; -import parentLogger from 'logger'; -import { discoveryLs, getDirectoryTree } from 'services/ipfs'; -import { objectPropertyXor, omitKeys } from 'utils'; +import { prisma } from '../client.js'; +import { PUBLIC_IPFS_PATH } from '../config/index.js'; +import { logger as parentLogger } from '../logger.js'; +import { discoveryLs, getDirectoryTree } from '../services/ipfs.js'; +import { objectPropertyXor, omitKeys } from '../utils.js'; +import { DRAFT_CID, TimestampMap, draftNodeTreeEntriesToFlatIpfsTree } from './draftTreeUtils.js'; import { generateExternalCidMap, generateManifestPathsToDbTypeMap, inheritComponentType, ExternalCidMap, -} from './driveUtils'; +} from './driveUtils.js'; const logger = parentLogger.child({ module: 'Utils::DataRefTools' }); @@ -55,11 +56,13 @@ export async function generateDataReferences({ Prisma.DataReferenceCreateManyInput[] | Prisma.PublicDataReferenceCreateManyInput[] > { nodeUuid = nodeUuid.endsWith('.') ? nodeUuid : nodeUuid + '.'; + const isPublished = !!versionId; const node = await prisma.node.findFirst({ where: { uuid: nodeUuid, }, }); + // debugger; if (!node) throw new Error(`Node not found for uuid ${nodeUuid}`); const manifestEntry: ResearchObjectV1 = (await axios.get(`${PUBLIC_IPFS_PATH}/${manifestCid}`)).data; const dataBucketCid = manifestEntry.components.find((c) => isNodeRoot(c)).payload.cid; @@ -82,10 +85,15 @@ export async function generateDataReferences({ ? await extractExternalCidMapFromTreeUrl(workingTreeUrl) : await generateExternalCidMap(node.uuid); let dataTree; - if (markExternals) { - dataTree = recursiveFlattenTree(await discoveryLs(dataBucketCid, externalCidMap)); + if (isPublished) { + if (markExternals) { + dataTree = recursiveFlattenTree(await discoveryLs(dataBucketCid, externalCidMap)); + } else { + dataTree = recursiveFlattenTree(await getDirectoryTree(dataBucketCid, externalCidMap, true, false)); + } } else { - dataTree = recursiveFlattenTree(await getDirectoryTree(dataBucketCid, externalCidMap, true, false)); + const dbTree = await prisma.draftNodeTree.findMany({ where: { nodeId: node.id } }); + dataTree = await draftNodeTreeEntriesToFlatIpfsTree(dbTree); } const manifestPathsToDbTypes = generateManifestPathsToDbTypeMap(manifestEntry); @@ -96,7 +104,7 @@ export async function generateDataReferences({ cid: entry.cid, path: entry.path, userId: node.ownerId, - rootCid: dataBucketCid, + rootCid: isPublished ? dataBucketCid : DRAFT_CID, root: false, directory: entry.type === 'dir', size: entry.size, @@ -107,8 +115,9 @@ export async function generateDataReferences({ // ...(!markExternals ? {} : entry.external ? { external: true } : { external: null }), }; }); + // debugger; - return [dataRootEntry, ...dataTreeToPubRef]; + return [...(isPublished ? [dataRootEntry] : []), ...dataTreeToPubRef]; } // used to prepare data refs for a given dag and manifest (differs from generateDataReferences in that you don't need the updated manifestCid ahead of time) @@ -169,6 +178,96 @@ export async function prepareDataRefs( return [dataRootEntry, ...dataTreeToPubRef]; } +export async function prepareDataRefsForDraftTrees( + nodeUuid: string, + manifest: ResearchObjectV1, +): Promise { + nodeUuid = nodeUuid.endsWith('.') ? nodeUuid : nodeUuid + '.'; + const node = await prisma.node.findFirst({ + where: { + uuid: nodeUuid, + }, + }); + if (!node) throw new Error(`Node not found for uuid ${nodeUuid}`); + const manifestEntry: ResearchObjectV1 = manifest; + + const dbTree = await prisma.draftNodeTree.findMany({ where: { nodeId: node.id } }); + const dataTree = await draftNodeTreeEntriesToFlatIpfsTree(dbTree); + const manifestPathsToDbTypes = generateManifestPathsToDbTypeMap(manifestEntry); + // debugger; + + const dataTreeToPubRef: Prisma.DataReferenceCreateManyInput[] = dataTree.map((entry) => { + const dbType = inheritComponentType(entry.path, manifestPathsToDbTypes); + return { + cid: entry.cid, + path: entry.path, + userId: node.ownerId, + rootCid: DRAFT_CID, + root: false, + directory: entry.type === 'dir', + size: entry.size, + type: dbType, + nodeId: node.id, + }; + }); + + return dataTreeToPubRef.filter((ref) => !ref.directory); +} + +export interface PrepareDataRefsForDagSkeletonArgs { + node: Node; + dataBucketCid: string; + manifest: ResearchObjectV1; +} + +/** + * Prepares data references for a DAG skeleton, this is used in the prepublish step where we pin the DAG structure, before we pin the files to the public IPFS node. + * We create publicDataRefs for the structure, to cover for the edge case of a garbage collection event occuring the moment someone publishes, their data would be lost. + */ +export async function prepareDataRefsForDagSkeleton({ + node, + dataBucketCid, + manifest, +}: PrepareDataRefsForDagSkeletonArgs) { + const manifestEntry: ResearchObjectV1 = manifest; + + const dataRootEntry: Prisma.PublicDataReferenceCreateManyInput = { + cid: dataBucketCid, + path: dataBucketCid, + userId: node.ownerId, + root: true, + rootCid: dataBucketCid, + directory: true, + size: 0, + type: DataType.DATA_BUCKET, + nodeId: node.id, + }; + + const externalCidMap = { ...(await generateExternalCidMap(node.uuid)) }; + const tree = await getDirectoryTree(dataBucketCid, externalCidMap, false); + + const dataTree = recursiveFlattenTree(tree).filter((entry) => entry.type === FileType.DIR); + const manifestPathsToDbTypes = generateManifestPathsToDbTypeMap(manifestEntry); + + const dataTreeToPubRef: Prisma.DataReferenceCreateManyInput[] = dataTree.map((entry) => { + const neutralPath = neutralizePath(entry.path); + const dbType = inheritComponentType(neutralPath, manifestPathsToDbTypes); + return { + cid: entry.cid, + path: entry.path, + userId: node.ownerId, + rootCid: dataBucketCid, + root: false, + directory: entry.type === 'dir', + size: entry.size, + type: dbType, + nodeId: node.id, + }; + }); + + return [dataRootEntry, ...dataTreeToPubRef]; +} + export async function prepareDataRefsExternalCids( nodeUuid: string, manifest: ResearchObjectV1, @@ -333,7 +432,13 @@ export async function validateDataReferences({ // ref consumed, don't add to unused refs usedRefIds[exists.id] = true; } - if (!exists) missingRefs.push(requiredRef); + if (!exists) { + if (requiredRef.directory && !publicRefs) { + // if the required entry doesn't exist in a draft node and it's a directory, it's an unnecessary ref, and should be omitted. + } else { + missingRefs.push(requiredRef); + } + } }); const unusedRefs = currentRefs.filter((currentRef) => !(currentRef.id in usedRefIds)); @@ -454,3 +559,18 @@ export async function validateAndHealDataRefs({ ); } } + +/** + * Helper function to generate a timestamp map from a node's data refs, mapping paths -> psql db default timestamps + */ +export async function generateTimestampMapFromDataRefs(nodeId: number): Promise { + const dataRefs = await prisma.dataReference.findMany({ where: { nodeId, type: { not: DataType.MANIFEST } } }); + const timestampMap: TimestampMap = {}; + dataRefs.forEach((ref: DataReference) => { + if (ref.path) { + const neutralPath = neutralizePath(ref.path); + timestampMap[neutralPath] = { createdAt: ref.createdAt, updatedAt: ref.updatedAt }; + } + }); + return timestampMap; +} diff --git a/desci-server/src/utils/discordUtils.ts b/desci-server/src/utils/discordUtils.ts index d3e036682..743a5e842 100644 --- a/desci-server/src/utils/discordUtils.ts +++ b/desci-server/src/utils/discordUtils.ts @@ -1,6 +1,6 @@ import { DiscordNotification } from '@penseapp/discord-notification'; -import logger from 'logger'; +import { logger } from '../logger.js'; const discordNotification = new DiscordNotification( process.env.SERVER_URL, diff --git a/desci-server/src/utils/draftTreeUtils.ts b/desci-server/src/utils/draftTreeUtils.ts new file mode 100644 index 000000000..79a36acff --- /dev/null +++ b/desci-server/src/utils/draftTreeUtils.ts @@ -0,0 +1,212 @@ +import { + DrivePath, + FileType, + NODE_KEEP_FILE, + RecursiveLsResult, + deneutralizePath, + neutralizePath, + recursiveFlattenTree, +} from '@desci-labs/desci-models'; +import { encode, prepare } from '@ipld/dag-pb'; +import { DraftNodeTree, Node, Prisma, User } from '@prisma/client'; +import CID from 'cids'; +import UnixFS from 'ipfs-unixfs'; +import DagPb from 'ipld-dag-pb'; +import type { DAGLink as DAGLinkType } from 'ipld-dag-pb'; + +import { prisma } from '../client.js'; +import { logger as parentLogger } from '../logger.js'; +import { client } from '../services/ipfs.js'; +// import * as multiformats from 'multiformats'; +// const dagPb = require('@ipld/dag-pb'); +// console.log('[IMPORT]', DagPbImport); +// const { default: DagPb } = DagPbImport; +const { DAGNode, DAGLink } = DagPb; + +const logger = parentLogger.child({ + module: 'Utils::DraftTreeUtils', +}); + +export const DRAFT_CID = 'draft'; +export const DRAFT_DIR_CID = 'dir'; + +export type TimestampMap = Record; + +interface IpfsDagToDraftNodeTreeEntriesParams { + ipfsTree: RecursiveLsResult[]; + node: Node; + user: User; + timestampMap?: TimestampMap; + contextPath?: string; +} + +/** + * Converts an IPFS tree to an array of DraftNodeTree entries ready to be added to the DraftNodeTree table + * @param timestampMap - Optional map that maps drive paths to their created/last modified timestamps, if not provided then they'll be generated automatically by the DB. + */ +export function ipfsDagToDraftNodeTreeEntries({ + ipfsTree, + node, + user, + timestampMap, + contextPath, +}: IpfsDagToDraftNodeTreeEntriesParams): Prisma.DraftNodeTreeCreateManyInput[] { + // debugger; + const flatIpfsTree = recursiveFlattenTree(ipfsTree); + const draftNodeTreeEntries: Prisma.DraftNodeTreeCreateManyInput[] = []; + + flatIpfsTree.forEach((fd) => { + const timestampEntry = timestampMap?.[fd.path]; + const draftNodeTreeEntry: Prisma.DraftNodeTreeCreateManyInput = { + cid: fd.type === FileType.FILE ? fd.cid : DRAFT_DIR_CID, + size: fd.size, + directory: fd.type === FileType.DIR, + path: contextPath ? deneutralizePath(fd.path, contextPath) : neutralizePath(fd.path), + external: fd.external ?? false, + nodeId: node.id, + // userId: user.id, + ...(timestampEntry && { createdAt: timestampEntry.createdAt, updatedAt: timestampEntry.updatedAt }), + }; + draftNodeTreeEntries.push(draftNodeTreeEntry); + }); + + return draftNodeTreeEntries; +} + +/** + * Converts a draftNodeTree to a flat IPFS tree, ready to be consumed by functions that take a flat IPFS tree. + * More efficient than converting to an IPFS tree and then flattening it, when unflatenned variant is unnecessary. + */ +export function draftNodeTreeEntriesToFlatIpfsTree(draftNodeTree: DraftNodeTree[]) { + const flatIpfsTree: RecursiveLsResult[] = []; + draftNodeTree.forEach((entry) => { + const { cid, size, directory, path, external } = entry; + const flatIpfsTreeEntry: RecursiveLsResult = { + cid, + size, + type: directory ? FileType.DIR : FileType.FILE, + path, + name: path.split('/').pop(), + external: external ?? false, + }; + flatIpfsTree.push(flatIpfsTreeEntry); + }); + return flatIpfsTree; +} + +/** + * Converts a flat IPFS tree structure to a hierarchical tree structure. + */ +export function flatTreeToHierarchicalTree(flatTree: RecursiveLsResult[]): RecursiveLsResult[] { + const treeMap = new Map(); + const rootNodes: RecursiveLsResult[] = []; + + flatTree.forEach((node) => { + treeMap.set(node.path, node); + node.contains = []; + }); + + flatTree.forEach((node) => { + const pathParts = node.path.split('/'); + pathParts.pop(); // Remove the current node part + const parentPath = pathParts.join('/'); + + if (treeMap.has(parentPath)) { + const parentNode = treeMap.get(parentPath); + parentNode?.contains?.push(node); + } else { + rootNodes.push(node); // Root node + } + }); + + return rootNodes; +} + +/* + * Function to add a DAGNode to IPFS and return its CID + */ +async function addDagNodeToIpfs(dagNode) { + const cid = await client.block.put(encode(prepare(dagNode)), { + version: 1, + format: 'dag-pb', + // pin: true, + }); + // logger.debug(`Added DAGNode to IPFS: ${cid.toString()}`); + return cid; +} + +/* + * Converts a draft node tree to a dag-pb tree and pins it to the IPFS node + * NOTE: Only the DAG structure is pinned in this step, not the files themselves. + */ +export async function dagifyAndAddDbTreeToIpfs(nodeId: number): Promise { + // Fetch tree entries from the database + const treeEntries = await prisma.draftNodeTree.findMany({ + where: { nodeId: nodeId }, + }); + // debugger; + // Convert the flat tree entries to a hierarchical tree structure + const flatTree = draftNodeTreeEntriesToFlatIpfsTree(treeEntries); + const hierarchicalTree = flatTreeToHierarchicalTree(flatTree); + const root = { + contains: hierarchicalTree, + cid: DRAFT_DIR_CID, + size: 0, + type: FileType.DIR, + path: 'root', + name: 'root', + }; + + // Function to recursively create DAGNodes from the tree structure + async function createDagNode(treeNode: RecursiveLsResult): Promise { + if (treeNode.type === 'dir') { + // Fill empty directories with a placeholder file to prevent issues + if (!treeNode.contains?.length) { + const nodeKeep = await client.add(Buffer.from(''), { cidVersion: 1 }); + treeNode.contains = [ + { + cid: nodeKeep.cid.toString(), + size: nodeKeep.size, + type: FileType.FILE, + path: `${treeNode.path}/${NODE_KEEP_FILE}`, + name: NODE_KEEP_FILE, + external: false, + }, + ]; + } + + const links: DAGLinkType[] = []; + // Create a new UnixFS instance for a directory + const unixFsEntry = new UnixFS({ type: 'directory' }); + + for (const child of treeNode.contains || []) { + const childCid = await createDagNode(child); + // logger.debug(`Child CID: ${childCid}`); // debugging + + try { + const cidV1 = new CID(childCid); + // Create a new DAGLink + const link = new DAGLink(child.name, child.size, cidV1); + links.push(link); + } catch (error) { + logger.error({ error, childCid }, 'Error creating CID or DAGLink'); + throw error; + } + } + + // Serialize the UnixFS entry to a buffer + const buffer = unixFsEntry.marshal(); + // Create a new DAGNode with the serialized UnixFS entry + const dagNode = new DAGNode(buffer, links); + // Add the DAGNode to IPFS and return its CID + const cid = await addDagNodeToIpfs(dagNode); + return cid.toString(); + } else { + // For files, directly return the CID + return treeNode.cid; + } + } + + const rootCid = await createDagNode(root); + return rootCid.toString(); +} diff --git a/desci-server/src/utils/driveUtils.ts b/desci-server/src/utils/driveUtils.ts index dff7ff5c8..23c409221 100644 --- a/desci-server/src/utils/driveUtils.ts +++ b/desci-server/src/utils/driveUtils.ts @@ -1,26 +1,32 @@ import { randomUUID } from 'crypto'; +import { DocumentId } from '@automerge/automerge-repo'; import { DEFAULT_COMPONENT_TYPE, DrivePath, FileExtension, ResearchObjectComponentSubtypes, ResearchObjectComponentType, + ResearchObjectComponentTypeMap, ResearchObjectV1, ResearchObjectV1Component, + extractExtension, fillIpfsTree, isNodeRoot, isResearchObjectComponentTypeMap, } from '@desci-labs/desci-models'; -import { DataReference, DataType } from '@prisma/client'; +import { DataReference, DataType, Node } from '@prisma/client'; -import prisma from 'client'; -import { DataReferenceSrc } from 'controllers/data'; -import { separateFileNameAndExtension } from 'controllers/data/utils'; -import logger from 'logger'; -import { getOrCache } from 'redisClient'; -import { getDirectoryTree, RecursiveLsResult } from 'services/ipfs'; -import { getIndexedResearchObjects } from 'theGraph'; +import { prisma } from '../client.js'; +import { DataReferenceSrc } from '../controllers/data/retrieve.js'; +import { logger } from '../logger.js'; +import { getOrCache } from '../redisClient.js'; +import { getDirectoryTree, type RecursiveLsResult } from '../services/ipfs.js'; +import { ManifestActions, NodeUuid } from '../services/manifestRepo.js'; +import repoService from '../services/repoService.js'; +import { getIndexedResearchObjects } from '../theGraph.js'; + +import { draftNodeTreeEntriesToFlatIpfsTree, flatTreeToHierarchicalTree } from './draftTreeUtils.js'; export function fillDirSizes(tree, cidInfoMap) { const contains = []; @@ -135,14 +141,28 @@ export async function getTreeAndFill( published?: boolean, ) { // debugger; - const dataBucket = manifest.components.find((c) => isNodeRoot(c)); - if (!dataBucket) throw new Error(`No data bucket found in manifest for nodeUuid ${nodeUuid}`); + let dataBucket = manifest.components.find((c) => isNodeRoot(c)); + if (!dataBucket) { + dataBucket = { + payload: { cid: 'draft' }, + id: 'bucket-placeholder', + name: 'draft-placeholder', + type: ResearchObjectComponentType.DATA_BUCKET, + }; + logger.warn({ nodeUuid, ownerId }, "Couldn't find data bucket in manifest, using placeholder"); + } const rootCid = dataBucket.payload.cid; const externalCidMap = published ? await generateExternalCidMap(nodeUuid + '.', rootCid) : await generateExternalCidMap(nodeUuid + '.'); - let tree: RecursiveLsResult[] = await getDirectoryTree(rootCid, externalCidMap); + const node = await prisma.node.findUnique({ where: { uuid: nodeUuid.endsWith('.') ? nodeUuid : nodeUuid + '.' } }); + + const dbTree = await prisma.draftNodeTree.findMany({ where: { nodeId: node.id } }); + let tree: RecursiveLsResult[] = published + ? await getDirectoryTree(rootCid, externalCidMap) + : flatTreeToHierarchicalTree(await draftNodeTreeEntriesToFlatIpfsTree(dbTree)); + logger.info('ran getTreeAndFill'); /* ** Get all entries for the nodeUuid, for filling the tree ** Both entries neccessary to determine publish state, prioritize public entries over private @@ -201,7 +221,7 @@ export async function getTreeAndFill( } tree = fillCidInfo(tree, cidInfoMap); - const treeRoot = await fillIpfsTree(manifest, tree); + const treeRoot = fillIpfsTree(manifest, tree); return treeRoot; } @@ -249,22 +269,31 @@ export const ROTypesToPrismaTypes = { * else it returns the default component type. */ export function getDbComponentType(component: ResearchObjectV1Component) { - if (isNodeRoot(component)) return ROTypesToPrismaTypes[ResearchObjectComponentType.DATA_BUCKET]; + // if (isNodeRoot(component)) return ROTypesToPrismaTypes[ResearchObjectComponentType.DATA_BUCKET]; return isResearchObjectComponentTypeMap(component.type) - ? ROTypesToPrismaTypes[DEFAULT_COMPONENT_TYPE] + ? componentTypeMapToDbComponentTypeMap(component.type) : ROTypesToPrismaTypes[component.type]; } +function componentTypeMapToDbComponentTypeMap(componentTypeMap: ResearchObjectComponentTypeMap) { + const dbTypeMap: Record = {}; + Object.keys(componentTypeMap).forEach((ext) => { + dbTypeMap[ext as FileExtension] = ROTypesToPrismaTypes[componentTypeMap[ext as FileExtension]]; + }); + return dbTypeMap; +} + export type ExtensionDataTypeMap = Record; export function generateManifestPathsToDbTypeMap(manifest: ResearchObjectV1) { const manifestPathsToTypes: Record = {}; manifest.components.forEach((c) => { if (c.payload?.path) { const dbType: DataType = getDbComponentType(c); + if (dbType) manifestPathsToTypes[c.payload.path] = dbType; } }); - manifestPathsToTypes[DRIVE_NODE_ROOT_PATH] = DataType.DATA_BUCKET; + // manifestPathsToTypes[DRIVE_NODE_ROOT_PATH] = DataType.DATA_BUCKET; return manifestPathsToTypes; } @@ -273,31 +302,52 @@ export function generateManifestPathsToDbTypeMap(manifest: ResearchObjectV1) { * NOTE: Used for DB DataType, not ResearchObjectComponentType! */ export function inheritComponentType(path, pathToDbTypeMap: Record): DataType { - let naturalType = pathToDbTypeMap[path]; - if (isResearchObjectComponentTypeMap(naturalType)) { - // Extract extension from path - const { extension } = separateFileNameAndExtension(path); - // See if extension lives inside the map - if (extension && naturalType[extension]) { - naturalType = (naturalType as ExtensionDataTypeMap)[extension]; + if (path === DRIVE_NODE_ROOT_PATH) return DataType.DATA_BUCKET; + + // Check if path has a direct type on it, meaning a component exists for that path + const directType = pathToDbTypeMap[path]; + if (directType) { + // The direct type is either a component type map or a type + if (isResearchObjectComponentTypeMap(directType)) { + // If it is a component type map, return it as as the default component type (Data), as a component type map isn't a valid DB type. + return ROTypesToPrismaTypes[DEFAULT_COMPONENT_TYPE]; } else { - // Fallback on DEFAULT_COMPONENT_TYPE - const defaultDataType = ROTypesToPrismaTypes[DEFAULT_COMPONENT_TYPE]; - naturalType = defaultDataType; + // It's a regular type, return it. + return directType as DataType; } } - if (naturalType && naturalType !== DataType.UNKNOWN) return naturalType as DataType; + + // debugger; + // No direct types found, so try to inherit from parents const pathSplit = path.split('/'); - if (pathSplit.length < 3) return DataType.UNKNOWN; + // If pathSplit.length is < 2, and a direct component doesn't exist on it, it has no parent to inherit from. + if (pathSplit.length < 2) return DataType.UNKNOWN; while (pathSplit.length > 1) { + // debugger; pathSplit.pop(); + const parentPath = pathSplit.join('/'); - const parent = pathToDbTypeMap[parentPath]; - if (parent && parent !== DataType.UNKNOWN) { - return parent as DataType; + const parentType = pathToDbTypeMap[parentPath]; + if (parentType) { + // A parent with a type exists, it's either a type or a component type map. + if (isResearchObjectComponentTypeMap(parentType)) { + const extension = extractExtension(path); + if (extension && parentType[extension]) { + // A match on the extension was found inside the parents component type map, return it. + return (parentType as ExtensionDataTypeMap)[extension] as DataType; + } else { + // A component type map exists, but it doesn't contain the extension, return the default component type (Data). + return ROTypesToPrismaTypes[DEFAULT_COMPONENT_TYPE]; + } + } else { + // The parent has a regular type, return it. + return parentType as DataType; + } } } - return DataType.UNKNOWN; + // Inheritance failed to find a type, return default. + // return DataType.UNKNOWN; + return ROTypesToPrismaTypes[DEFAULT_COMPONENT_TYPE]; } /* @@ -329,7 +379,17 @@ export interface FirstNestingComponent { star?: boolean; externalUrl?: string; } -export function addComponentsToManifest(manifest: ResearchObjectV1, firstNestingComponents: FirstNestingComponent[]) { + +/** + * This function is used to manually update the manifest document by mutating it in playce + * @param manifest ResearchObjectV1 + * @param firstNestingComponents array of components to add to manifest + * @returns updated manifest object with newly added components + */ +export function DANGEROUSLY_addComponentsToManifest( + manifest: ResearchObjectV1, + firstNestingComponents: FirstNestingComponent[], +) { //add duplicate path check firstNestingComponents.forEach((c) => { const comp = { @@ -349,16 +409,50 @@ export function addComponentsToManifest(manifest: ResearchObjectV1, firstNesting return manifest; } -export type oldCid = string; -export type newCid = string; -export function updateManifestComponentDagCids(manifest: ResearchObjectV1, updatedDagCidMap: Record) { - manifest.components.forEach((c) => { - if (c.payload?.cid in updatedDagCidMap) c.payload.cid = updatedDagCidMap[c.payload.cid]; - if (c.payload?.url in updatedDagCidMap) c.payload.url = updatedDagCidMap[c.payload.url]; +export async function addComponentsToDraftManifest(node: Node, firstNestingComponents: FirstNestingComponent[]) { + //add duplicate path check + const components = firstNestingComponents.map((entry) => { + return { + id: randomUUID(), + name: entry.name, + ...(entry.componentType && { type: entry.componentType }), + ...(entry.componentSubtype && { subtype: entry.componentSubtype }), + payload: { + ...urlOrCid(entry.cid, entry.componentType), + path: entry.path, + ...(entry.externalUrl && { externalUrl: entry.externalUrl }), + }, + starred: entry.star || false, + }; }); - return manifest; + + const actions: ManifestActions[] = [{ type: 'Add Components', components }]; + try { + // updatedManifest = await manifestUpdater({ type: 'Add Components', components }); + logger.info({ uuid: node.uuid, actions }, '[AddComponentsToDraftManifest]'); + const response = await repoService.dispatchAction({ + uuid: node.uuid as NodeUuid, + documentId: node.manifestDocumentId as DocumentId, + actions, + }); + logger.info({ actions, response }, '[AddComponentsToDraftManifest]'); + return response?.manifest; + } catch (err) { + logger.error({ err, actions }, '[ERROR addComponentsToDraftManifest]'); + return null; + } } +export type oldCid = string; +export type newCid = string; +// export function updateManifestComponentDagCids(manifest: ResearchObjectV1, updatedDagCidMap: Record) { +// manifest.components.forEach((c) => { +// if (c.payload?.cid in updatedDagCidMap) c.payload.cid = updatedDagCidMap[c.payload.cid]; +// if (c.payload?.url in updatedDagCidMap) c.payload.url = updatedDagCidMap[c.payload.url]; +// }); +// return manifest; +// } + export type ExternalCidMap = Record; export async function generateExternalCidMap(nodeUuid, dataBucketCid?: string) { diff --git a/desci-server/src/utils/generateArweaveKeys.ts b/desci-server/src/utils/generateArweaveKeys.ts index 602bfcc33..ec73db5e7 100755 --- a/desci-server/src/utils/generateArweaveKeys.ts +++ b/desci-server/src/utils/generateArweaveKeys.ts @@ -1,6 +1,6 @@ -import dotenv from 'dotenv' -dotenv.config({ path: __dirname + '/../../.env' }); import Arweave from 'arweave/node'; +import dotenv from 'dotenv'; +dotenv.config({ path: __dirname + '/.env' }); const config = { host: process.env.ARWEAVE_HOST, @@ -15,7 +15,7 @@ let k; arweave.wallets.generate().then((key) => { k = key; arweave.wallets.jwkToAddress(k).then((address) => { - console.log("PUBLIC ADDRESS", address); - console.log("PRIVATE KEY", Buffer.from(JSON.stringify(k)).toString('base64')); + console.log('PUBLIC ADDRESS', address); + console.log('PRIVATE KEY', Buffer.from(JSON.stringify(k)).toString('base64')); }); }); diff --git a/desci-server/src/utils/githubUtils.ts b/desci-server/src/utils/githubUtils.ts index 53845d9c7..397e67516 100644 --- a/desci-server/src/utils/githubUtils.ts +++ b/desci-server/src/utils/githubUtils.ts @@ -1,6 +1,6 @@ import axios from 'axios'; -import logger from 'logger'; +import { logger } from '../logger.js'; interface GithubUrlInfo { branch: string; diff --git a/desci-server/src/utils/manifest.ts b/desci-server/src/utils/manifest.ts new file mode 100644 index 000000000..6b569b851 --- /dev/null +++ b/desci-server/src/utils/manifest.ts @@ -0,0 +1,12 @@ +import { PUBLIC_IPFS_PATH } from '../config/index.js'; +import { logger as parentLogger } from '../logger.js'; + +export const cleanupManifestUrl = (url: string, gateway?: string) => { + if (url && (PUBLIC_IPFS_PATH || gateway)) { + const s = url.split('/'); + const res = `${gateway ? gateway : PUBLIC_IPFS_PATH}/${s[s.length - 1]}`; + parentLogger.info({ fn: 'cleanupManifestUrl', url, gateway }, `resolving ${url} => ${res}`); + return res; + } + return url; +}; diff --git a/desci-server/src/utils/manifestDraftUtils.ts b/desci-server/src/utils/manifestDraftUtils.ts index bbf4e7477..73b4154a9 100644 --- a/desci-server/src/utils/manifestDraftUtils.ts +++ b/desci-server/src/utils/manifestDraftUtils.ts @@ -1,6 +1,6 @@ import { PdfComponentPayload, ResearchObjectComponentType, ResearchObjectV1 } from '@desci-labs/desci-models'; -import { UrlWithCid } from 'services/ipfs'; +import { UrlWithCid } from '../services/ipfs.js'; export const cleanManifestForSaving = (manifest: ResearchObjectV1) => { manifest.components = manifest.components.map((c) => { diff --git a/desci-server/src/utils/response/custom-error/CustomError.ts b/desci-server/src/utils/response/custom-error/CustomError.ts index 891809ed1..5fcf4c5bf 100755 --- a/desci-server/src/utils/response/custom-error/CustomError.ts +++ b/desci-server/src/utils/response/custom-error/CustomError.ts @@ -1,4 +1,4 @@ -import { ErrorType, ErrorValidation, ErrorResponse } from './types'; +import { ErrorType, ErrorValidation, ErrorResponse } from './types.js'; export class CustomError extends Error { private httpStatusCode: number; diff --git a/desci-server/src/utils/sendCookie.ts b/desci-server/src/utils/sendCookie.ts index e94ce120f..c62e1e1fd 100644 --- a/desci-server/src/utils/sendCookie.ts +++ b/desci-server/src/utils/sendCookie.ts @@ -1,7 +1,7 @@ -import { Response } from 'express'; +import { type Response } from 'express'; -import { oneDay, oneYear } from 'controllers/auth'; -import logger from 'logger'; +import { oneDay, oneYear } from '../controllers/auth/magic.js'; +import { logger } from '../logger.js'; export const sendCookie = (res: Response, token: string, isDevMode: boolean) => { if (isDevMode && process.env.SERVER_URL === 'https://nodes-api-dev.desci.com') { // insecure cookie for local dev, should only be used for testing diff --git a/desci-server/test/integration/auth.test.ts b/desci-server/test/integration/auth.test.ts index 29b5aaafb..e75ecdd18 100644 --- a/desci-server/test/integration/auth.test.ts +++ b/desci-server/test/integration/auth.test.ts @@ -5,11 +5,11 @@ import cookieParser from 'cookie-parser'; import express from 'express'; import supertest from 'supertest'; -import prisma from '../../src/client'; -import { generateAccessToken } from '../../src/controllers/auth/magic'; -import { ensureUser, retrieveUser } from '../../src/middleware/ensureUser'; -import { magicLinkRedeem, sendMagicLink } from '../../src/services/auth'; -import { expectThrowsAsync } from '../util'; +import { prisma } from '../../src/client.js'; +import { generateAccessToken } from '../../src/controllers/auth/magic.js'; +import { ensureUser } from '../../src/middleware/permissions.js'; +import { magicLinkRedeem, sendMagicLink } from '../../src/services/auth.js'; +import { expectThrowsAsync } from '../util.js'; describe('Magic Link Authentication', () => { let user: User; diff --git a/desci-server/test/integration/automerge.test.ts b/desci-server/test/integration/automerge.test.ts new file mode 100644 index 000000000..764755155 --- /dev/null +++ b/desci-server/test/integration/automerge.test.ts @@ -0,0 +1,40 @@ +import 'dotenv/config'; +import 'mocha'; +import { expect } from 'chai'; + +describe('Automerge Integration', () => { + describe('Backend Repo is Initialized', () => { + it('Backend Repo should be ready', () => { + expect(true).to.be.equal(true); + }); + }); + + describe('Creating a Node should create a new Automerge Document', () => { + it('Backend Repo should be ready', () => { + expect(true).to.be.equal(true); + }); + }); + + describe('Existing Nodes should get an Automerge Document', () => { + it('Backend Repo should be ready', () => { + expect(true).to.be.equal(true); + }); + }); + + describe('Authorisation', () => { + it('Backend Repo should be ready', () => { + expect(true).to.be.equal(true); + }); + }); + + describe('Update Automerge Document', () => { + it('Backend Repo should be ready', () => { + expect(true).to.be.equal(true); + }); + }); + describe('DAG Altering Operations should be synced', () => { + it('Backend Repo should be ready', () => { + expect(true).to.be.equal(true); + }); + }); +}); diff --git a/desci-server/test/integration/data.test.ts b/desci-server/test/integration/data.test.ts index 076485ad2..72fa51708 100644 --- a/desci-server/test/integration/data.test.ts +++ b/desci-server/test/integration/data.test.ts @@ -1,5 +1,8 @@ import 'dotenv/config'; import 'mocha'; +import assert from 'assert'; + +import { DocumentId } from '@automerge/automerge-repo'; import { DriveObject, FileDir, @@ -15,19 +18,53 @@ import { expect } from 'chai'; import jwt from 'jsonwebtoken'; import request from 'supertest'; -import prisma from '../../src/client'; -import { app } from '../../src/index'; +import { prisma } from '../../src/client.js'; +import { app } from '../../src/index.js'; +import { backendRepo } from '../../src/repo.js'; +import { migrateIpfsTreeToNodeTree } from '../../src/services/draftTrees.js'; import { addFilesToDag, getDirectoryTree, getSizeForCid, client as ipfs, spawnEmptyManifest, -} from '../../src/services/ipfs'; -import { randomUUID64 } from '../../src/utils'; -import { validateAndHealDataRefs, validateDataReferences } from '../../src/utils/dataRefTools'; -import { addComponentsToManifest } from '../../src/utils/driveUtils'; -import { spawnExampleDirDag } from '../util'; +} from '../../src/services/ipfs.js'; +import { NodeUuid, getAutomergeUrl } from '../../src/services/manifestRepo.js'; +// import { ResearchObjectDocument } from '../../src/types/documents.js'; +import repoService from '../../src/services/repoService.js'; +import { validateAndHealDataRefs, validateDataReferences } from '../../src/utils/dataRefTools.js'; +import { draftNodeTreeEntriesToFlatIpfsTree } from '../../src/utils/draftTreeUtils.js'; +import { addComponentsToDraftManifest } from '../../src/utils/driveUtils.js'; +import { randomUUID64 } from '../../src/utils.js'; +import { spawnExampleDirDag } from '../util.js'; + +const createDraftNode = async (user: User, baseManifest: ResearchObjectV1, baseManifestCid: string) => { + const node = await prisma.node.create({ + data: { + ownerId: user.id, + uuid: randomUUID64(), + title: '', + manifestUrl: baseManifestCid, + replicationFactor: 0, + }, + }); + + const response = await repoService.initDraftDocument({ + uuid: node.uuid as NodeUuid, + manifest: baseManifest, + }); + + if (response?.document && response.documentId) { + await prisma.node.update({ where: { id: node.id }, data: { manifestDocumentId: response.documentId } }); + } + const updatedNode = await prisma.node.findFirst({ where: { id: node.id } }); + console.log('Draft Node create', response); + + assert(response?.documentId); + assert(response?.document); + + return { node: updatedNode || node, documentId: response?.documentId }; +}; describe('Data Controllers', () => { let user: User; @@ -67,16 +104,10 @@ describe('Data Controllers', () => { describe('Update a node with a new file', () => { let node: Node; let res: request.Response; + before(async () => { - node = await prisma.node.create({ - data: { - ownerId: user.id, - uuid: randomUUID64(), - title: '', - manifestUrl: baseManifestCid, - replicationFactor: 0, - }, - }); + const nodeData = await createDraftNode(user, baseManifest, baseManifestCid); + node = nodeData.node; res = await request(app) .post('/v1/data/update') @@ -112,14 +143,16 @@ describe('Data Controllers', () => { manifestCid: res.body.manifestCid, publicRefs: false, }); + // debugger; const correctRefs = missingRefs.length === 0 && unusedRefs.length === 0 && Object.keys(diffRefs).length === 0; expect(correctRefs).to.equal(true); }); - it('should have an updated manifest data bucket cid', () => { - const oldDataBucketCid = baseManifest.components[0].payload.cid; - const newDataBucketCid = res.body.manifest.components[0].payload.cid; - expect(oldDataBucketCid).to.not.equal(newDataBucketCid); - }); + // IDEALLY REPLACED WITH A NONCE TEST + // it('should have an updated manifest data bucket cid', () => { + // const oldDataBucketCid = baseManifest.components[0].payload.cid; + // const newDataBucketCid = res.body.manifest.components[0].payload.cid; + // expect(oldDataBucketCid).to.not.equal(newDataBucketCid); + // }); it('should reject if unauthed', async () => { const newRes = await request(app) .post('/v1/data/update') @@ -166,15 +199,8 @@ describe('Data Controllers', () => { let node: Node; let res: request.Response; before(async () => { - node = await prisma.node.create({ - data: { - ownerId: user.id, - uuid: randomUUID64(), - title: '', - manifestUrl: baseManifestCid, - replicationFactor: 0, - }, - }); + const nodeData = await createDraftNode(user, baseManifest, baseManifestCid); + node = nodeData.node; res = await request(app) .post('/v1/data/update') @@ -209,30 +235,28 @@ describe('Data Controllers', () => { manifestCid: res.body.manifestCid, publicRefs: false, }); + // debugger; const correctRefs = missingRefs.length === 0 && unusedRefs.length === 0 && Object.keys(diffRefs).length === 0; expect(correctRefs).to.equal(true); }); - it('should have an updated manifest data bucket cid', () => { - const oldDataBucketCid = baseManifest.components[0].payload.cid; - const newDataBucketCid = res.body.manifest.components[0].payload.cid; - expect(oldDataBucketCid).to.not.equal(newDataBucketCid); - }); + // it('should have an updated manifest data bucket cid', () => { + // const oldDataBucketCid = baseManifest.components[0].payload.cid; + // const newDataBucketCid = res.body.manifest.components[0].payload.cid; + // expect(oldDataBucketCid).to.not.equal(newDataBucketCid); + // }); }); describe('Update a node with a code repo via external URL', () => { let node: Node; let res: request.Response; const externalRepoUrl = 'https://github.com/github/dev'; const externalRepoPath = 'A Repo'; + let documentId: DocumentId; + before(async () => { - node = await prisma.node.create({ - data: { - ownerId: user.id, - uuid: randomUUID64(), - title: '', - manifestUrl: baseManifestCid, - replicationFactor: 0, - }, - }); + const nodeData = await createDraftNode(user, baseManifest, baseManifestCid); + node = nodeData.node; + documentId = nodeData.documentId; + res = await request(app) .post('/v1/data/update') .set('authorization', authHeaderVal) @@ -241,6 +265,7 @@ describe('Data Controllers', () => { .field('contextPath', 'root') .field('externalUrl', JSON.stringify({ url: externalRepoUrl, path: externalRepoPath })) .field('componentType', ResearchObjectComponentType.CODE); + console.log('[Response]::', res.body); }); it('should return status 200', () => { @@ -267,21 +292,28 @@ describe('Data Controllers', () => { manifestCid: res.body.manifestCid, publicRefs: false, }); + // debugger; const correctRefs = missingRefs.length === 0 && unusedRefs.length === 0 && Object.keys(diffRefs).length === 0; expect(correctRefs).to.equal(true); }); - it('should have an updated manifest data bucket cid', () => { - const oldDataBucketCid = baseManifest.components[0].payload.cid; - const newDataBucketCid = res.body.manifest.components[0].payload.cid; - expect(oldDataBucketCid).to.not.equal(newDataBucketCid); - }); - it('should have added a code component to the manifest', () => { + // it('should have an updated manifest data bucket cid', () => { + // const oldDataBucketCid = baseManifest.components[0].payload.cid; + // const newDataBucketCid = res.body.manifest.components[0].payload.cid; + // expect(oldDataBucketCid).to.not.equal(newDataBucketCid); + // }); + it('should have added a code component to the manifest', async () => { + console.log(res.body.manifest); + const handle = backendRepo.find(getAutomergeUrl(documentId)); + const doc = await handle.doc(); + console.log('Doc', doc); + const newCodeComponent = res.body.manifest.components.find( (c) => c.type === ResearchObjectComponentType.CODE && c.payload.path === 'root/' + externalRepoPath, ); expect(!!newCodeComponent).to.equal(true); }); it('should have added the repo url to the new code components payload', () => { + console.log('[log]', res.body.manifest); const newCodeComponent = res.body.manifest.components.find( (c) => c.type === ResearchObjectComponentType.CODE && c.payload.path === 'root/' + externalRepoPath, ); @@ -311,15 +343,9 @@ describe('Data Controllers', () => { manifest.components[0].payload.cid = exampleDagCid; manifestCid = (await ipfs.add(JSON.stringify(manifest), { cidVersion: 1, pin: true })).cid.toString(); - node = await prisma.node.create({ - data: { - ownerId: user.id, - uuid: randomUUID64(), - title: '', - manifestUrl: manifestCid, - replicationFactor: 0, - }, - }); + const nodeData = await createDraftNode(user, manifest, manifestCid); + node = nodeData.node; + const manifestEntry: Prisma.DataReferenceCreateManyInput = { cid: manifestCid, userId: user.id, @@ -390,7 +416,7 @@ describe('Data Controllers', () => { const deleteDirPath = 'root/dir/subdir'; before(async () => { - let manifest = { ...baseManifest }; + let manifest: ResearchObjectV1 = { ...baseManifest }; const exampleDagCid = await spawnExampleDirDag(); manifest.components[0].payload.cid = exampleDagCid; const componentsToAdd = ['dir/subdir', 'dir/subdir/b.txt'].map((path) => ({ @@ -400,18 +426,14 @@ describe('Data Controllers', () => { componentType: ResearchObjectComponentType.CODE, star: true, })); - manifest = addComponentsToManifest(manifest, componentsToAdd); + + const nodeData = await createDraftNode(user, manifest, baseManifestCid); + node = nodeData.node; + + manifest = (await addComponentsToDraftManifest(node, componentsToAdd)) ?? manifest; const manifestCid = (await ipfs.add(JSON.stringify(manifest), { cidVersion: 1, pin: true })).cid.toString(); + await prisma.node.update({ where: { id: node.id }, data: { manifestUrl: manifestCid } }); - node = await prisma.node.create({ - data: { - ownerId: user.id, - uuid: randomUUID64(), - title: '', - manifestUrl: manifestCid, - replicationFactor: 0, - }, - }); const manifestEntry: Prisma.DataReferenceCreateManyInput = { cid: manifestCid, userId: user.id, @@ -422,6 +444,8 @@ describe('Data Controllers', () => { nodeId: node.id, }; + await migrateIpfsTreeToNodeTree(node.uuid!); + await prisma.dataReference.create({ data: manifestEntry }); await validateAndHealDataRefs({ nodeUuid: node.uuid!, manifestCid, publicRefs: false }); @@ -440,11 +464,11 @@ describe('Data Controllers', () => { it('should return new manifestCid', () => { expect(res.body).to.have.property('manifestCid'); }); - it('should have an updated manifest data bucket cid', () => { - const oldDataBucketCid = baseManifest.components[0].payload.cid; - const newDataBucketCid = res.body.manifest.components[0].payload.cid; - expect(oldDataBucketCid).to.not.equal(newDataBucketCid); - }); + // it('should have an updated manifest data bucket cid', () => { + // const oldDataBucketCid = baseManifest.components[0].payload.cid; + // const newDataBucketCid = res.body.manifest.components[0].payload.cid; + // expect(oldDataBucketCid).to.not.equal(newDataBucketCid); + // }); it('should reject if unauthed', async () => { const res = await request(app).post(`/v1/data/delete`).send({ uuid: node.uuid, path: 'root/dir' }); expect(res.statusCode).to.not.equal(200); @@ -476,10 +500,8 @@ describe('Data Controllers', () => { expect(!!containedComponentFound).to.not.equal(true); }); it('should add deleted entries to cidPruneList', async () => { - const deletedCids = [ - 'bafybeiceadgl6eqm52csjdkuch4wyawuyckbt6j4jg3tpxgs2we5mgy254', - 'bafkreig7pzyokaqvit2igs564zfj4n4j726ex2auodpwfhfnnxnqgmqklq', - ]; + const deletedCids = ['bafkreig7pzyokaqvit2igs564zfj4n4j726ex2auodpwfhfnnxnqgmqklq']; + // debugger; const pruneListEntries = await prisma.cidPruneList.findMany({ where: { cid: { in: deletedCids } } }); const allEntriesFound = deletedCids.every((cid) => pruneListEntries.some((entry) => entry.cid === cid)); expect(allEntriesFound).to.equal(true); @@ -512,18 +534,14 @@ describe('Data Controllers', () => { componentType: ResearchObjectComponentType.CODE, star: true, })); - manifest = addComponentsToManifest(manifest, componentsToAdd); + + const nodeData = await createDraftNode(user, baseManifest, baseManifestCid); + node = nodeData.node; + + manifest = (await addComponentsToDraftManifest(node, componentsToAdd)) ?? manifest; const manifestCid = (await ipfs.add(JSON.stringify(manifest), { cidVersion: 1, pin: true })).cid.toString(); + await prisma.node.update({ where: { id: node.id }, data: { manifestUrl: manifestCid } }); - node = await prisma.node.create({ - data: { - ownerId: user.id, - uuid: randomUUID64(), - title: '', - manifestUrl: manifestCid, - replicationFactor: 0, - }, - }); const manifestEntry: Prisma.DataReferenceCreateManyInput = { cid: manifestCid, userId: user.id, @@ -534,6 +552,7 @@ describe('Data Controllers', () => { nodeId: node.id, }; + await migrateIpfsTreeToNodeTree(node.uuid!); await prisma.dataReference.create({ data: manifestEntry }); await validateAndHealDataRefs({ nodeUuid: node.uuid!, manifestCid, publicRefs: false }); res = await request(app) @@ -551,21 +570,24 @@ describe('Data Controllers', () => { it('should return new manifestCid', () => { expect(res.body).to.have.property('manifestCid'); }); - it('databucket dag should contain renamed directory and nested files', async () => { - const databucketCid = res.body.manifest.components[0].payload.cid; - const flatTree = recursiveFlattenTree(await getDirectoryTree(databucketCid, {})) as FileDir[]; - const renamedDir = flatTree.find((f) => neutralizePath(f.path) === newPath); - const nestedFile = flatTree.find((f) => neutralizePath(f.path) === newPath + '/b.txt'); + it('draft tree should contain renamed directory and nested files', async () => { + const treeEntries = await prisma.draftNodeTree.findMany({ + where: { nodeId: node.id }, + }); + const flatTree = draftNodeTreeEntriesToFlatIpfsTree(treeEntries); + const renamedDir = flatTree.find((f) => f.path === newPath); + const nestedFile = flatTree.find((f) => f.path === newPath + '/b.txt'); + // debugger; expect(!!renamedDir).to.equal(true); expect(!!nestedFile).to.equal(true); expect(renamedDir?.type).to.equal('dir'); expect(nestedFile?.type).to.equal('file'); }); - it('should have an updated manifest data bucket cid', () => { - const oldDataBucketCid = baseManifest.components[0].payload.cid; - const newDataBucketCid = res.body.manifest.components[0].payload.cid; - expect(oldDataBucketCid).to.not.equal(newDataBucketCid); - }); + // it('should have an updated manifest data bucket cid', () => { + // const oldDataBucketCid = baseManifest.components[0].payload.cid; + // const newDataBucketCid = res.body.manifest.components[0].payload.cid; + // expect(oldDataBucketCid).to.not.equal(newDataBucketCid); + // }); it('should reject if unauthed', async () => { const res = await request(app) .post(`/v1/data/rename`) @@ -596,6 +618,7 @@ describe('Data Controllers', () => { expect(!!newPathFound).to.equal(true); }); it('should cascade update all manifest component paths that were dependent on the renamed directory', () => { + console.log('[LOG]::', res.body.manifest); const oldPathContainedComponentFound = res.body.manifest.components.some((c) => c.payload.path.includes(renameDirPath), ); @@ -604,14 +627,16 @@ describe('Data Controllers', () => { expect(!!containedNewPathFound).to.equal(true); }); it('should rename component card if renameComponent flag is true', () => { + console.log('[LOG]::', res.body.manifest); const componentCard = res.body.manifest.components.find((c) => c.payload.path === newPath); expect(componentCard.name).to.equal('dubdir'); }); it('should reject if new name already exists within the same directory', async () => { + // debugger; const res = await request(app) .post(`/v1/data/rename`) .set('authorization', authHeaderVal) - .send({ uuid: node.uuid!, path: 'dir/a.txt', newName: 'c.txt' }); + .send({ uuid: node.uuid!, path: 'root/dir/a.txt', newName: 'c.txt' }); expect(res.statusCode).to.not.equal(200); }); }); @@ -656,18 +681,15 @@ describe('Data Controllers', () => { star: true, }; }); - manifest = addComponentsToManifest(manifest, componentsToAdd); + + const nodeData = await createDraftNode(user, manifest, baseManifestCid); + node = nodeData.node; + + manifest = (await addComponentsToDraftManifest(node, componentsToAdd)) ?? manifest; const manifestCid = (await ipfs.add(JSON.stringify(manifest), { cidVersion: 1, pin: true })).cid.toString(); - node = await prisma.node.create({ - data: { - ownerId: user.id, - uuid: randomUUID64(), - title: '', - manifestUrl: manifestCid, - replicationFactor: 0, - }, - }); + await prisma.node.update({ where: { id: node.id }, data: { manifestUrl: manifestCid } }); + const manifestEntry: Prisma.DataReferenceCreateManyInput = { cid: manifestCid, userId: user.id, @@ -678,6 +700,7 @@ describe('Data Controllers', () => { nodeId: node.id, }; + await migrateIpfsTreeToNodeTree(node.uuid!); await prisma.dataReference.create({ data: manifestEntry }); await validateAndHealDataRefs({ nodeUuid: node.uuid!, manifestCid, publicRefs: false }); res = await request(app) @@ -695,18 +718,22 @@ describe('Data Controllers', () => { it('should return new manifestCid', () => { expect(res.body).to.have.property('manifestCid'); }); - it('databucket dag should contain moved directory', async () => { - const databucketCid = res.body.manifest.components[0].payload.cid; - const flatTree = recursiveFlattenTree(await getDirectoryTree(databucketCid, {})) as RecursiveLsResult[]; - const movedDir = flatTree.find((f) => neutralizePath(f.path) === moveToPath); + it('draft tree should contain moved directory', async () => { + // const databucketCid = res.body.manifest.components[0].payload.cid; + // const flatTree = recursiveFlattenTree(await getDirectoryTree(databucketCid, {})) as RecursiveLsResult[]; + const treeEntries = await prisma.draftNodeTree.findMany({ + where: { nodeId: node.id }, + }); + const flatTree = draftNodeTreeEntriesToFlatIpfsTree(treeEntries); + const movedDir = flatTree.find((f) => f.path === moveToPath); expect(!!movedDir).to.equal(true); expect(movedDir?.type).to.equal('dir'); }); - it('should have an updated manifest data bucket cid', () => { - const oldDataBucketCid = baseManifest.components[0].payload.cid; - const newDataBucketCid = res.body.manifest.components[0].payload.cid; - expect(oldDataBucketCid).to.not.equal(newDataBucketCid); - }); + // it('should have an updated manifest data bucket cid', () => { + // const oldDataBucketCid = baseManifest.components[0].payload.cid; + // const newDataBucketCid = res.body.manifest.components[0].payload.cid; + // expect(oldDataBucketCid).to.not.equal(newDataBucketCid); + // }); it('should reject if unauthed', async () => { const res = await request(app) .post(`/v1/data/move`) @@ -742,6 +769,7 @@ describe('Data Controllers', () => { const containedNewPathFound = res.body.manifest.components.find( (c) => c.payload.path === moveToPath + '/b.txt', ); + console.log('[log];:', oldPathContainedComponentFound, containedNewPathFound, res.body.manifest); expect(!!oldPathContainedComponentFound).to.not.equal(true); expect(!!containedNewPathFound).to.equal(true); }); diff --git a/desci-server/test/integration/invites.test.ts b/desci-server/test/integration/invites.test.ts index 345dd6aad..c781a58d8 100644 --- a/desci-server/test/integration/invites.test.ts +++ b/desci-server/test/integration/invites.test.ts @@ -1,10 +1,9 @@ import 'mocha'; import { User } from '@prisma/client'; -import { expect } from 'chai'; -import prisma from '../../src/client'; -import * as invites from '../../src/services/invites'; -import { expectThrowsAsync } from '../util'; +import { prisma } from '../../src/client.js'; +import * as invites from '../../src/services/invites.js'; +import { expectThrowsAsync } from '../util.js'; describe('Invites', () => { let admin: User; diff --git a/desci-server/test/integration/ipfs.test.ts b/desci-server/test/integration/ipfs.test.ts index c54e0190e..fcb4e0046 100644 --- a/desci-server/test/integration/ipfs.test.ts +++ b/desci-server/test/integration/ipfs.test.ts @@ -5,10 +5,9 @@ import { ResearchObjectV1, recursiveFlattenTree } from '@desci-labs/desci-models import { User, Node } from '@prisma/client'; import { expect } from 'chai'; -import prisma from '../../src/client'; -import * as ipfs from '../../src/services/ipfs'; -import { generateExternalCidMap } from '../../src/utils/driveUtils'; -import { expectThrowsAsync } from '../util'; +import { prisma } from '../../src/client.js'; +import * as ipfs from '../../src/services/ipfs.js'; +import { generateExternalCidMap } from '../../src/utils/driveUtils.js'; describe('IPFS', () => { let admin: User; diff --git a/desci-server/test/integration/orcidNext.test.ts b/desci-server/test/integration/orcidNext.test.ts index 35d9899fa..d6c850b59 100644 --- a/desci-server/test/integration/orcidNext.test.ts +++ b/desci-server/test/integration/orcidNext.test.ts @@ -4,15 +4,15 @@ import bodyParser from 'body-parser'; import { expect } from 'chai'; import cookieParser from 'cookie-parser'; import express from 'express'; -import pinoHttp from 'pino-http'; +import { pinoHttp } from 'pino-http'; import supertest from 'supertest'; -import prisma from '../../src/client'; -import { generateAccessToken } from '../../src/controllers/auth/magic'; -import { OrcIdRecordData } from '../../src/controllers/auth/orcid'; -import { orcidCheck } from '../../src/controllers/auth/orcidNext'; -import logger from '../../src/logger'; -import { ensureUserIfPresent } from '../../src/middleware/ensureUserIfPresent'; +import { prisma } from '../../src/client.js'; +import { generateAccessToken } from '../../src/controllers/auth/magic.js'; +import { OrcIdRecordData } from '../../src/controllers/auth/orcid.js'; +import { orcidCheck } from '../../src/controllers/auth/orcidNext.js'; +import { logger } from '../../src/logger.js'; +import { ensureUserIfPresent } from '../../src/middleware/ensureUserIfPresent.js'; // describe('ORCiD Auth', () => { // let user: User; diff --git a/desci-server/test/integration/proccessing.test.ts b/desci-server/test/integration/proccessing.test.ts index 3aa4f4cf0..e02355a12 100644 --- a/desci-server/test/integration/proccessing.test.ts +++ b/desci-server/test/integration/proccessing.test.ts @@ -1,9 +1,9 @@ -import { DrivePath, RecursiveLsResult, ResearchObjectV1, isNodeRoot } from '@desci-labs/desci-models'; +import { ResearchObjectV1, isNodeRoot } from '@desci-labs/desci-models'; import { Node, User } from '@prisma/client'; import { expect } from 'chai'; import { describe, it } from 'mocha'; -import prisma from '../../src/client'; +import { prisma } from '../../src/client.js'; import { ensureSpaceAvailable, ensureUniquePaths, @@ -12,9 +12,9 @@ import { getManifestFromNode, pathContainsExternalCids, updateManifestDataBucket, -} from '../../src/services/data/processing'; -import { client as ipfs, spawnEmptyManifest } from '../../src/services/ipfs'; -import { randomUUID64 } from '../../src/utils'; +} from '../../src/services/data/processing.js'; +import { client as ipfs, spawnEmptyManifest } from '../../src/services/ipfs.js'; +import { randomUUID64 } from '../../src/utils.js'; describe('Data Processing Functions Tests', () => { let user: User; diff --git a/desci-server/test/util.ts b/desci-server/test/util.ts index 299375efc..fd26ff665 100644 --- a/desci-server/test/util.ts +++ b/desci-server/test/util.ts @@ -1,9 +1,9 @@ import { expect } from 'chai'; -import { IpfsDirStructuredInput, IpfsPinnedResult, client as ipfs, pinDirectory } from '../src/services/ipfs'; +import { IpfsDirStructuredInput, IpfsPinnedResult, client as ipfs, pinDirectory } from '../src/services/ipfs.js'; const expectThrowsAsync = async (method, errorMessage) => { - let error = null; + let error: Error | null = null; try { await method(); } catch (err) { @@ -12,7 +12,7 @@ const expectThrowsAsync = async (method, errorMessage) => { } expect(error).to.be.an('Error'); if (errorMessage) { - expect(error.message).to.equal(errorMessage); + expect(error?.message).to.equal(errorMessage); } }; export { expectThrowsAsync }; diff --git a/desci-server/tsconfig.json b/desci-server/tsconfig.json index 43a4fbc22..cf8be759a 100755 --- a/desci-server/tsconfig.json +++ b/desci-server/tsconfig.json @@ -1,28 +1,42 @@ { "compilerOptions": { + "module": "nodenext", + /** + * Implied by "module: nodenext": + * "moduleResolution": "nodenext", + * "esModuleInterop": true, + */ "target": "esnext", - "module": "commonjs", - "lib": ["dom", "es6", "esnext", "es2017", "esnext.asynciterable"], - // "sourceMap": true, + + // Recommended by docs, but a lot of errors + // "verbatimModuleSyntax": true, + + "lib": [ + "esnext", + "dom" + ], "outDir": "./dist", - "moduleResolution": "node", "removeComments": true, - "allowSyntheticDefaultImports": true, - "esModuleInterop": true, "emitDecoratorMetadata": true, "experimentalDecorators": true, "resolveJsonModule": true, - "typeRoots": ["./src/types", "./node_modules/@types"], - "baseUrl": "src/", "noImplicitReturns": true, "noFallthroughCasesInSwitch": true, "skipLibCheck": true, - "inlineSourceMap": true + // dagConcat.cjs requires this + "allowJs": true, + "inlineSourceMap": true, + "paths": { + // Overrides a built-in Response type + "express": ["./src/types/express"] + } }, - "include": ["./src/**/*.tsx", "./src/**/*.ts", "./src/**/*.cjs"], - "exclude": ["node_modules", "test/**/*.ts"], - "compileOnSave": true, - "ts-node": { - "swc": true - } + "include": [ + "./src/**/*.tsx", + "./src/**/*.ts", + "./src/**/*.cjs", + "src/utils/dagConcat.ts" + ], + "exclude": ["test/**/*.ts"], + "compileOnSave": true } diff --git a/desci-server/yarn.lock b/desci-server/yarn.lock index 72e39c751..90653e0ce 100755 --- a/desci-server/yarn.lock +++ b/desci-server/yarn.lock @@ -48,6 +48,59 @@ resolved "https://registry.yarnpkg.com/@assemblyscript/loader/-/loader-0.9.4.tgz#a483c54c1253656bb33babd464e3154a173e1577" integrity sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA== +"@automerge/automerge-repo-network-websocket@^1.0.19": + version "1.0.19" + resolved "https://registry.yarnpkg.com/@automerge/automerge-repo-network-websocket/-/automerge-repo-network-websocket-1.0.19.tgz#d375dacf517e5e1f1074bf05eec8b0f6b97a81a2" + integrity sha512-he/cRcZ9byNHZN0ws/c7rwjT6ocbAdPr2EGvTUp6QeIhRlcICqyTuIJjUSG0MyxckO8FbqcBKnfsiaTRCx/b3Q== + dependencies: + "@automerge/automerge-repo" "^1.0.19" + cbor-x "^1.3.0" + eventemitter3 "^5.0.1" + isomorphic-ws "^5.0.0" + ws "^8.7.0" + +"@automerge/automerge-repo@^1.0.19": + version "1.0.19" + resolved "https://registry.yarnpkg.com/@automerge/automerge-repo/-/automerge-repo-1.0.19.tgz#cb90845a87a116c65cf9ba5d0d75d2e24169455d" + integrity sha512-IcfX9xkbk+YY7IhG+ZCoUVccou2MmHGXvu/XGOICFmUIaG1mkQAPzZU2u5r2JUX0cpr/2PcIPOeCletJMssnWw== + dependencies: + "@automerge/automerge" "^2.1.7" + bs58check "^3.0.1" + cbor-x "^1.3.0" + debug "^4.3.4" + eventemitter3 "^5.0.1" + fast-sha256 "^1.3.0" + tiny-typed-emitter "^2.1.0" + ts-node "^10.9.1" + uuid "^9.0.0" + xstate "^4.37.0" + +"@automerge/automerge-wasm@0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@automerge/automerge-wasm/-/automerge-wasm-0.7.0.tgz#f8c66c228eabc0d7723e25f300e5fc266d7a3f29" + integrity sha512-nql3kAO0xAYslEfrr2uTQe595fasKsOKxXEkNpilP97F3T0PD7n0YP9MirLiAytNRBXYccMayhN+hP5Af4xprA== + +"@automerge/automerge-wasm@0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@automerge/automerge-wasm/-/automerge-wasm-0.9.0.tgz#1b0e1ea595feeb47ea0f4b685bf2ffb7fa61f97c" + integrity sha512-wTPcW3wVk20D1x0DOko/RsfZV1mlc8HJynqgTRhVocOxFIU/RCilnYRfJmSb8LwCG2uZzfqg0DLsEBqQZ53KBQ== + +"@automerge/automerge@2.1.10": + version "2.1.10" + resolved "https://registry.yarnpkg.com/@automerge/automerge/-/automerge-2.1.10.tgz#257f9f94c37db088008548cca7e57e853d1ed354" + integrity sha512-xj8R3fQHZmDYnrYW5WrBqWm/r5sLV9Z7mu89pJ10wGLVS2V+iAB2os85DoOGI2etzjmQsoHyrd97GBmszjH4zQ== + dependencies: + "@automerge/automerge-wasm" "0.9.0" + uuid "^9.0.0" + +"@automerge/automerge@^2.1.7": + version "2.1.9" + resolved "https://registry.yarnpkg.com/@automerge/automerge/-/automerge-2.1.9.tgz#69776836deee0976bb41741db656ff5be741cf92" + integrity sha512-KcSJaCGDaWU7wuqBoM8pmrnFhsp0g7Bs6Smf0HtaBLS7BjtRK9l/PQNXtSEwAdsfoWhA8XjYDkIpOpKMY1pmpA== + dependencies: + "@automerge/automerge-wasm" "0.7.0" + uuid "^9.0.0" + "@aws-crypto/crc32@3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-3.0.0.tgz#07300eca214409c33e3ff769cd5697b57fdd38fa" @@ -726,6 +779,11 @@ "@babel/traverse" "^7.18.0" "@babel/types" "^7.18.0" +"@babel/helper-plugin-utils@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + "@babel/helper-simple-access@^7.17.7": version "7.18.2" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz#4dc473c2169ac3a1c9f4a51cfcd091d1c36fcff9" @@ -773,6 +831,13 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.5.tgz#337062363436a893a2d22faa60be5bb37091c83c" integrity sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw== +"@babel/plugin-syntax-import-assertions@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz#9c05a7f592982aff1a2768260ad84bcd3f0c77fc" + integrity sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/runtime@^7.21.0": version "7.22.6" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.6.tgz#57d64b9ae3cff1d67eb067ae117dac087f5bd438" @@ -813,6 +878,36 @@ "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" +"@cbor-extract/cbor-extract-darwin-arm64@2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-darwin-arm64/-/cbor-extract-darwin-arm64-2.1.1.tgz#5721f6dd3feae0b96d23122853ce977e0671b7a6" + integrity sha512-blVBy5MXz6m36Vx0DfLd7PChOQKEs8lK2bD1WJn/vVgG4FXZiZmZb2GECHFvVPA5T7OnODd9xZiL3nMCv6QUhA== + +"@cbor-extract/cbor-extract-darwin-x64@2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-darwin-x64/-/cbor-extract-darwin-x64-2.1.1.tgz#c25e7d0133950d87d101d7b3afafea8d50d83f5f" + integrity sha512-h6KFOzqk8jXTvkOftyRIWGrd7sKQzQv2jVdTL9nKSf3D2drCvQB/LHUxAOpPXo3pv2clDtKs3xnHalpEh3rDsw== + +"@cbor-extract/cbor-extract-linux-arm64@2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-linux-arm64/-/cbor-extract-linux-arm64-2.1.1.tgz#48f78e7d8f0fcc84ed074b6bfa6d15dd83187c63" + integrity sha512-SxAaRcYf8S0QHaMc7gvRSiTSr7nUYMqbUdErBEu+HYA4Q6UNydx1VwFE68hGcp1qvxcy9yT5U7gA+a5XikfwSQ== + +"@cbor-extract/cbor-extract-linux-arm@2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-linux-arm/-/cbor-extract-linux-arm-2.1.1.tgz#7507d346389cb682e44fab8fae9534edd52e2e41" + integrity sha512-ds0uikdcIGUjPyraV4oJqyVE5gl/qYBpa/Wnh6l6xLE2lj/hwnjT2XcZCChdXwW/YFZ1LUHs6waoYN8PmK0nKQ== + +"@cbor-extract/cbor-extract-linux-x64@2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-linux-x64/-/cbor-extract-linux-x64-2.1.1.tgz#b7c1d2be61c58ec18d58afbad52411ded63cd4cd" + integrity sha512-GVK+8fNIE9lJQHAlhOROYiI0Yd4bAZ4u++C2ZjlkS3YmO6hi+FUxe6Dqm+OKWTcMpL/l71N6CQAmaRcb4zyJuA== + +"@cbor-extract/cbor-extract-win32-x64@2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-win32-x64/-/cbor-extract-win32-x64-2.1.1.tgz#21b11a1a3f18c3e7d62fd5f87438b7ed2c64c1f7" + integrity sha512-2Niq1C41dCRIDeD8LddiH+mxGlO7HJ612Ll3D/E73ZWBmycued+8ghTr/Ho3CMOWPUEr08XtyBMVXAjqF+TcKw== + "@chainsafe/libp2p-gossipsub@^1.0.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@chainsafe/libp2p-gossipsub/-/libp2p-gossipsub-1.2.0.tgz#2203c837eb04ca5d1cd53026d7376364b19c5473" @@ -1044,18 +1139,6 @@ dependencies: chalk "^4.1.0" -"@cspotcode/source-map-consumer@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" - integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== - -"@cspotcode/source-map-support@0.6.1": - version "0.6.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.6.1.tgz#118511f316e2e87ee4294761868e254d3da47960" - integrity sha512-DX3Z+T5dt1ockmPdobJS/FAsQPW4V4SrWEhD2iYQT2Cb2tQsiMnYxrcUH9By/Z3B+v0S5LMBkQtV/XOBbpLEOg== - dependencies: - "@cspotcode/source-map-consumer" "0.8.0" - "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.yarnpkg.com/@cspotcode%2fsource-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" @@ -1086,6 +1169,18 @@ ts-node "^9" tslib "^2" +"@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.5.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + "@eslint/eslintrc@^0.4.3": version "0.4.3" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" @@ -2428,6 +2523,11 @@ resolved "https://registry.yarnpkg.com/@noble/ed25519/-/ed25519-1.7.0.tgz#583ac38340a479314b9e348d4572101ed9492f9d" integrity sha512-LeAxFK0+181zQOhOUuKE8Jnd3duzYhDNd3iCLxpmzA5K+e4I1FdbrK3Ot0ZHBwZMeRD/6EojyUfTbpHZ+hkQHg== +"@noble/hashes@^1.2.0": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" + integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== + "@noble/secp256k1@^1.5.4": version "1.6.3" resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.6.3.tgz#7eed12d9f4404b416999d0c87686836c4c5c9b94" @@ -3354,6 +3454,18 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== +"@pkgr/utils@^2.4.2": + version "2.4.2" + resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.4.2.tgz#9e638bbe9a6a6f165580dc943f138fd3309a2cbc" + integrity sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw== + dependencies: + cross-spawn "^7.0.3" + fast-glob "^3.3.0" + is-glob "^4.0.3" + open "^9.1.0" + picocolors "^1.0.0" + tslib "^2.6.0" + "@prisma/client@4.2.1": version "4.2.1" resolved "https://registry.yarnpkg.com/@prisma/client/-/client-4.2.1.tgz#b384587f6066070381ea4c90228a14697a0c271b" @@ -4654,10 +4766,10 @@ dependencies: "@types/node" "*" -"@types/json-schema@^7.0.7": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== +"@types/json-schema@^7.0.12": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/json5@^0.0.29": version "0.0.29" @@ -4725,6 +4837,18 @@ dependencies: "@types/koa" "*" +"@types/lodash-es@^4.17.12": + version "4.17.12" + resolved "https://registry.yarnpkg.com/@types/lodash-es/-/lodash-es-4.17.12.tgz#65f6d1e5f80539aa7cfbfc962de5def0cf4f341b" + integrity sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ== + dependencies: + "@types/lodash" "*" + +"@types/lodash@*": + version "4.14.202" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.202.tgz#f09dbd2fb082d507178b2f2a5c7e74bd72ff98f8" + integrity sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ== + "@types/long@*", "@types/long@^4.0.1": version "4.0.2" resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" @@ -4825,10 +4949,12 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.54.tgz#59ed60e7b0d56905a654292e8d73275034eb6283" integrity sha512-1RWYiq+5UfozGsU6MwJyFX6BtktcT10XRjvcAQmskCtMcW3tPske88lM/nHv7BQG1w9KBXI1zPGuu5PnNCX14g== -"@types/node@^16.4.13": - version "16.11.41" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.41.tgz#88eb485b1bfdb4c224d878b7832239536aa2f813" - integrity sha512-mqoYK2TnVjdkGk8qXAVGc/x9nSaTpSrFaGFm43BUH3IdoBV0nta6hYaGmdOvIMlbHJbUEVen3gvwpwovAZKNdQ== +"@types/node@^20.10.4": + version "20.10.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.4.tgz#b246fd84d55d5b1b71bf51f964bd514409347198" + integrity sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg== + dependencies: + undici-types "~5.26.4" "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -4897,6 +5023,11 @@ resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.2.tgz#ed279a64fa438bb69f2480eda44937912bb7480a" integrity sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow== +"@types/semver@^7.5.0": + version "7.5.6" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.6.tgz#c65b2bfce1bec346582c07724e3f8c1017a20339" + integrity sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A== + "@types/serve-static@*": version "1.13.10" resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" @@ -4950,6 +5081,13 @@ resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.7.3.tgz#3193c0a3c03a7d1189016c62b4fba4b149ef5e33" integrity sha512-DNviAE5OUcZ5s+XEQHRhERLg8fOp8gSgvyJ4aaFASx5wwaObm+PBwTIMXiOFm1QrSee5oYwEAYb7LMzX2O88gA== +"@types/ws@^8.5.10": + version "8.5.10" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" + integrity sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A== + dependencies: + "@types/node" "*" + "@types/yazl@^2.4.2": version "2.4.2" resolved "https://registry.yarnpkg.com/@types/yazl/-/yazl-2.4.2.tgz#d5f8a4752261badbf1a36e8b49e042dc18ec84bc" @@ -4957,75 +5095,90 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@^4.29.1": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276" - integrity sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg== +"@typescript-eslint/eslint-plugin@^6.14.0": + version "6.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.14.0.tgz#fc1ab5f23618ba590c87e8226ff07a760be3dd7b" + integrity sha512-1ZJBykBCXaSHG94vMMKmiHoL0MhNHKSVlcHVYZNw+BKxufhqQVTOawNpwwI1P5nIFZ/4jLVop0mcY6mJJDFNaw== dependencies: - "@typescript-eslint/experimental-utils" "4.33.0" - "@typescript-eslint/scope-manager" "4.33.0" - debug "^4.3.1" - functional-red-black-tree "^1.0.1" - ignore "^5.1.8" - regexpp "^3.1.0" - semver "^7.3.5" - tsutils "^3.21.0" - -"@typescript-eslint/experimental-utils@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd" - integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q== - dependencies: - "@types/json-schema" "^7.0.7" - "@typescript-eslint/scope-manager" "4.33.0" - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/typescript-estree" "4.33.0" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "6.14.0" + "@typescript-eslint/type-utils" "6.14.0" + "@typescript-eslint/utils" "6.14.0" + "@typescript-eslint/visitor-keys" "6.14.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/parser@^6.14.0": + version "6.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.14.0.tgz#a2d6a732e0d2b95c73f6a26ae7362877cc1b4212" + integrity sha512-QjToC14CKacd4Pa7JK4GeB/vHmWFJckec49FR4hmIRf97+KXole0T97xxu9IFiPxVQ1DBWrQ5wreLwAGwWAVQA== + dependencies: + "@typescript-eslint/scope-manager" "6.14.0" + "@typescript-eslint/types" "6.14.0" + "@typescript-eslint/typescript-estree" "6.14.0" + "@typescript-eslint/visitor-keys" "6.14.0" + debug "^4.3.4" -"@typescript-eslint/parser@^4.29.1": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899" - integrity sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA== +"@typescript-eslint/scope-manager@6.14.0": + version "6.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.14.0.tgz#53d24363fdb5ee0d1d8cda4ed5e5321272ab3d48" + integrity sha512-VT7CFWHbZipPncAZtuALr9y3EuzY1b1t1AEkIq2bTXUPKw+pHoXflGNG5L+Gv6nKul1cz1VH8fz16IThIU0tdg== dependencies: - "@typescript-eslint/scope-manager" "4.33.0" - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/typescript-estree" "4.33.0" - debug "^4.3.1" + "@typescript-eslint/types" "6.14.0" + "@typescript-eslint/visitor-keys" "6.14.0" -"@typescript-eslint/scope-manager@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3" - integrity sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ== +"@typescript-eslint/type-utils@6.14.0": + version "6.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.14.0.tgz#ac9cb5ba0615c837f1a6b172feeb273d36e4f8af" + integrity sha512-x6OC9Q7HfYKqjnuNu5a7kffIYs3No30isapRBJl1iCHLitD8O0lFbRcVGiOcuyN837fqXzPZ1NS10maQzZMKqw== dependencies: - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/visitor-keys" "4.33.0" - -"@typescript-eslint/types@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" - integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== + "@typescript-eslint/typescript-estree" "6.14.0" + "@typescript-eslint/utils" "6.14.0" + debug "^4.3.4" + ts-api-utils "^1.0.1" -"@typescript-eslint/typescript-estree@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609" - integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA== - dependencies: - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/visitor-keys" "4.33.0" - debug "^4.3.1" - globby "^11.0.3" - is-glob "^4.0.1" - semver "^7.3.5" - tsutils "^3.21.0" +"@typescript-eslint/types@6.14.0": + version "6.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.14.0.tgz#935307f7a931016b7a5eb25d494ea3e1f613e929" + integrity sha512-uty9H2K4Xs8E47z3SnXEPRNDfsis8JO27amp2GNCnzGETEW3yTqEIVg5+AI7U276oGF/tw6ZA+UesxeQ104ceA== -"@typescript-eslint/visitor-keys@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd" - integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg== +"@typescript-eslint/typescript-estree@6.14.0": + version "6.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.14.0.tgz#90c7ddd45cd22139adf3d4577580d04c9189ac13" + integrity sha512-yPkaLwK0yH2mZKFE/bXkPAkkFgOv15GJAUzgUVonAbv0Hr4PK/N2yaA/4XQbTZQdygiDkpt5DkxPELqHguNvyw== dependencies: - "@typescript-eslint/types" "4.33.0" - eslint-visitor-keys "^2.0.0" + "@typescript-eslint/types" "6.14.0" + "@typescript-eslint/visitor-keys" "6.14.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/utils@6.14.0": + version "6.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.14.0.tgz#856a9e274367d99ffbd39c48128b93a86c4261e3" + integrity sha512-XwRTnbvRr7Ey9a1NT6jqdKX8y/atWG+8fAIu3z73HSP8h06i3r/ClMhmaF/RGWGW1tHJEwij1uEg2GbEmPYvYg== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.14.0" + "@typescript-eslint/types" "6.14.0" + "@typescript-eslint/typescript-estree" "6.14.0" + semver "^7.5.4" + +"@typescript-eslint/visitor-keys@6.14.0": + version "6.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.14.0.tgz#1d1d486581819287de824a56c22f32543561138e" + integrity sha512-fB5cw6GRhJUz03MrROVuj5Zm/Q+XWlVdIsFj+Zb1Hvqouc8t+XP2H5y53QYU/MGtd2dPg6/vJJlhoX3xc2ehfw== + dependencies: + "@typescript-eslint/types" "6.14.0" + eslint-visitor-keys "^3.4.1" "@ungap/promise-all-settled@1.1.2": version "1.1.2" @@ -5355,6 +5508,14 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + array-differ@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" @@ -5370,15 +5531,15 @@ array-ify@^1.0.0: resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== -array-includes@^3.1.4: - version "3.1.5" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" - integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== +array-includes@^3.1.7: + version "3.1.7" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" + integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" - get-intrinsic "^1.1.1" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" is-string "^1.0.7" array-shuffle@^2.0.0: @@ -5396,15 +5557,49 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array.prototype.flat@^1.2.5: - version "1.3.0" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" - integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== +array.prototype.findlastindex@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz#b37598438f97b579166940814e2c0493a4f50207" + integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" + get-intrinsic "^1.2.1" + +array.prototype.flat@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +arraybuffer.prototype.slice@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" + integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" @@ -5586,6 +5781,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base-x@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-4.0.0.tgz#d0e3b7753450c73f8ad2389b5c018a4af7b2224a" + integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw== + base64-js@^1.0.2, base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -5620,6 +5820,11 @@ bech32@1.1.4: resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== +big-integer@^1.6.44: + version "1.6.52" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85" + integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg== + bignumber.js@^9.0.0, bignumber.js@^9.0.1, bignumber.js@^9.0.2: version "9.0.2" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.2.tgz#71c6c6bed38de64e24a65ebe16cfcf23ae693673" @@ -5792,6 +5997,13 @@ bowser@^2.11.0: resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f" integrity sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA== +bplist-parser@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e" + integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw== + dependencies: + big-integer "^1.6.44" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -5840,6 +6052,21 @@ browserslist@^4.20.2: node-releases "^2.0.5" picocolors "^1.0.0" +bs58@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-5.0.0.tgz#865575b4d13c09ea2a84622df6c8cbeb54ffc279" + integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ== + dependencies: + base-x "^4.0.0" + +bs58check@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-3.0.1.tgz#2094d13720a28593de1cba1d8c4e48602fdd841c" + integrity sha512-hjuuJvoWEybo7Hn/0xOrczQKKEKD63WguEjlhLExYs2wUBcebDC1jDNK17eEAD2lYfw82d5ASC1d7K3SWszjaQ== + dependencies: + "@noble/hashes" "^1.2.0" + bs58 "^5.0.0" + buffer-crc32@^0.2.1, buffer-crc32@^0.2.13, buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" @@ -5898,6 +6125,13 @@ bufrw@^1.3.0: hexer "^1.5.0" xtend "^4.0.0" +bundle-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-3.0.0.tgz#ba59bcc9ac785fb67ccdbf104a2bf60c099f0e1a" + integrity sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw== + dependencies: + run-applescript "^5.0.0" + busboy@^1.0.0, busboy@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" @@ -5958,6 +6192,15 @@ call-bind@^1.0.0, call-bind@^1.0.2: function-bind "^1.1.1" get-intrinsic "^1.0.2" +call-bind@^1.0.4, call-bind@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" + integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== + dependencies: + function-bind "^1.1.2" + get-intrinsic "^1.2.1" + set-function-length "^1.1.1" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -6007,6 +6250,27 @@ catering@^2.0.0, catering@^2.1.0: resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== +cbor-extract@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/cbor-extract/-/cbor-extract-2.1.1.tgz#f154b31529fdb6b7c70fb3ca448f44eda96a1b42" + integrity sha512-1UX977+L+zOJHsp0mWFG13GLwO6ucKgSmSW6JTl8B9GUvACvHeIVpFqhU92299Z6PfD09aTXDell5p+lp1rUFA== + dependencies: + node-gyp-build-optional-packages "5.0.3" + optionalDependencies: + "@cbor-extract/cbor-extract-darwin-arm64" "2.1.1" + "@cbor-extract/cbor-extract-darwin-x64" "2.1.1" + "@cbor-extract/cbor-extract-linux-arm" "2.1.1" + "@cbor-extract/cbor-extract-linux-arm64" "2.1.1" + "@cbor-extract/cbor-extract-linux-x64" "2.1.1" + "@cbor-extract/cbor-extract-win32-x64" "2.1.1" + +cbor-x@^1.3.0: + version "1.5.6" + resolved "https://registry.yarnpkg.com/cbor-x/-/cbor-x-1.5.6.tgz#cbc5a8267bcd89a559d32339fe7ec442bc3b3862" + integrity sha512-+TXdnDNdr8JH5GQRoAhjdT/5s5N+b71s2Nz8DpDRyuWx0uzMj8JTR3AqqMTBO/1HtUBHZpmK1enD2ViXFx0Nug== + optionalDependencies: + cbor-extract "^2.1.1" + cborg@^1.0.4, cborg@^1.2.1, cborg@^1.3.3: version "1.9.4" resolved "https://registry.yarnpkg.com/cborg/-/cborg-1.9.4.tgz#85354ee6e0fe017dd34e300c3dcd044407a27800" @@ -6753,7 +7017,7 @@ dateformat@^4.6.3: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.6.3.tgz#556fa6497e5217fedb78821424f8a1c22fa3f4b5" integrity sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA== -debug@2.6.9, debug@^2.6.9: +debug@2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -6835,6 +7099,24 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== +default-browser-id@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-3.0.0.tgz#bee7bbbef1f4e75d31f98f4d3f1556a14cea790c" + integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA== + dependencies: + bplist-parser "^0.2.0" + untildify "^4.0.0" + +default-browser@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-4.0.0.tgz#53c9894f8810bf86696de117a6ce9085a3cbc7da" + integrity sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA== + dependencies: + bundle-name "^3.0.0" + default-browser-id "^3.0.0" + execa "^7.1.1" + titleize "^3.0.0" + default-gateway@^6.0.2, default-gateway@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" @@ -6862,6 +7144,20 @@ deferred-leveldown@^7.0.0: abstract-leveldown "^7.2.0" inherits "^2.0.3" +define-data-property@^1.0.1, define-data-property@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +define-lazy-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" + integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== + define-properties@^1.1.3, define-properties@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" @@ -6870,6 +7166,15 @@ define-properties@^1.1.3, define-properties@^1.1.4: has-property-descriptors "^1.0.0" object-keys "^1.1.1" +define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + del@^6.0.0: version "6.1.1" resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" @@ -7222,7 +7527,7 @@ error@^7.0.0: dependencies: string-template "~0.2.1" -es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5, es-abstract@^1.20.0: +es-abstract@^1.19.0, es-abstract@^1.19.5, es-abstract@^1.20.0: version "1.20.1" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== @@ -7251,6 +7556,60 @@ es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19 string.prototype.trimstart "^1.0.5" unbox-primitive "^1.0.2" +es-abstract@^1.22.1: + version "1.22.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32" + integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA== + dependencies: + array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.2" + available-typed-arrays "^1.0.5" + call-bind "^1.0.5" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.2" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.12" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + safe-array-concat "^1.0.1" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.8" + string.prototype.trimend "^1.0.7" + string.prototype.trimstart "^1.0.7" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.13" + +es-set-tostringtag@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9" + integrity sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q== + dependencies: + get-intrinsic "^1.2.2" + has-tostringtag "^1.0.0" + hasown "^2.0.0" + es-shim-unscopables@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" @@ -7302,57 +7661,62 @@ escape-string-regexp@^5.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== -eslint-config-prettier@^8.3.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" - integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== +eslint-config-prettier@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f" + integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== -eslint-import-resolver-node@^0.3.6: - version "0.3.6" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" - integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== +eslint-import-resolver-node@^0.3.9: + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== dependencies: debug "^3.2.7" - resolve "^1.20.0" + is-core-module "^2.13.0" + resolve "^1.22.4" -eslint-module-utils@^2.7.3: - version "2.7.3" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee" - integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ== +eslint-module-utils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== dependencies: debug "^3.2.7" - find-up "^2.1.0" -eslint-plugin-import@^2.24.0: - version "2.26.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" - integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== +eslint-plugin-import@^2.29.0: + version "2.29.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz#8133232e4329ee344f2f612885ac3073b0b7e155" + integrity sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg== dependencies: - array-includes "^3.1.4" - array.prototype.flat "^1.2.5" - debug "^2.6.9" + 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-import-resolver-node "^0.3.6" - eslint-module-utils "^2.7.3" - has "^1.0.3" - is-core-module "^2.8.1" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.8.0" + hasown "^2.0.0" + is-core-module "^2.13.1" is-glob "^4.0.3" minimatch "^3.1.2" - object.values "^1.1.5" - resolve "^1.22.0" - tsconfig-paths "^3.14.1" - -eslint-plugin-no-array-reduce@^1.0.22: - version "1.0.60" - resolved "https://registry.yarnpkg.com/eslint-plugin-no-array-reduce/-/eslint-plugin-no-array-reduce-1.0.60.tgz#7bee1f6200705ecc8916124906f6780d9a30518f" - integrity sha512-weC908O35mjzHhWdwGe1QnJXDutawB8Mgo637Cltt0qYiaBuYE4WD+u6CnJHANG2vulk04PEwFJIjWh9KDYCHA== - -eslint-plugin-prettier@^3.4.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz#e9ddb200efb6f3d05ffe83b1665a716af4a387e5" - integrity sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g== + object.fromentries "^2.0.7" + object.groupby "^1.0.1" + object.values "^1.1.7" + semver "^6.3.1" + tsconfig-paths "^3.14.2" + +eslint-plugin-no-array-reduce@^1.0.62: + version "1.0.62" + resolved "https://registry.yarnpkg.com/eslint-plugin-no-array-reduce/-/eslint-plugin-no-array-reduce-1.0.62.tgz#925dee5bbe37f41ce7aa6ebb149c3988dd5b8d48" + integrity sha512-Hnauv6BNmo2RPNG6ka1fc2WcNDtsbcutCbvx188goD/EdSNab3Jp26HgmMSFERiqu3VQdIebHSnSKIS1GUrvoA== + +eslint-plugin-prettier@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.1.tgz#a3b399f04378f79f066379f544e42d6b73f11515" + integrity sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg== dependencies: prettier-linter-helpers "^1.0.0" + synckit "^0.8.5" eslint-scope@^5.1.1: version "5.1.1" @@ -7369,13 +7733,6 @@ eslint-utils@^2.1.0: dependencies: eslint-visitor-keys "^1.1.0" -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" @@ -7386,6 +7743,11 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + eslint@^7.32.0: version "7.32.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" @@ -7531,6 +7893,11 @@ eventemitter3@^4.0.0, eventemitter3@^4.0.4, eventemitter3@^4.0.7: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + events@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" @@ -7584,6 +7951,21 @@ execa@^4.0.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execa@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-7.2.0.tgz#657e75ba984f42a70f38928cedc87d6f2d4fe4e9" + integrity sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.1" + human-signals "^4.3.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^3.0.7" + strip-final-newline "^3.0.0" + executable@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" @@ -7716,6 +8098,17 @@ fast-glob@^3.2.5: merge2 "^1.3.0" micromatch "^4.0.4" +fast-glob@^3.3.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -7736,6 +8129,11 @@ fast-safe-stringify@^2.1.1: resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== +fast-sha256@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-sha256/-/fast-sha256-1.3.0.tgz#7916ba2054eeb255982608cccd0f6660c79b7ae6" + integrity sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ== + fast-write-atomic@0.2.1, fast-write-atomic@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/fast-write-atomic/-/fast-write-atomic-0.2.1.tgz#7ee8ef0ce3c1f531043c09ae8e5143361ab17ede" @@ -7867,13 +8265,6 @@ find-up@5.0.0, find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== - dependencies: - locate-path "^2.0.0" - find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" @@ -8078,6 +8469,11 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + function-timeout@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/function-timeout/-/function-timeout-0.1.1.tgz#6bf71d3d24c894d43b2bec312cabb8c5add2e9da" @@ -8093,12 +8489,22 @@ function.prototype.name@^1.1.5: es-abstract "^1.19.0" functions-have-names "^1.2.2" +function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== -functions-have-names@^1.2.2: +functions-have-names@^1.2.2, functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== @@ -8136,7 +8542,7 @@ gcp-metadata@^5.0.0: gaxios "^5.0.0" json-bigint "^1.0.0" -generic-pool@*, generic-pool@3.9.0: +generic-pool@*, generic-pool@3.9.0, generic-pool@^3.9.0: version "3.9.0" resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-3.9.0.tgz#36f4a678e963f4fdb8707eab050823abc4e8f5e4" integrity sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g== @@ -8170,6 +8576,16 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: has "^1.0.3" has-symbols "^1.0.3" +get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + 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-iterator@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/get-iterator/-/get-iterator-1.0.2.tgz#cd747c02b4c084461fac14f48f6b45a80ed25c82" @@ -8190,7 +8606,7 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-stream@6.0.1, get-stream@^6.0.0: +get-stream@6.0.1, get-stream@^6.0.0, get-stream@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== @@ -8349,6 +8765,13 @@ globals@^13.6.0, globals@^13.9.0: dependencies: type-fest "^0.20.2" +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + globby@11.0.4: version "11.0.4" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" @@ -8361,7 +8784,7 @@ globby@11.0.4: merge2 "^1.3.0" slash "^3.0.0" -globby@^11.0.1, globby@^11.0.3: +globby@^11.0.1, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -8378,6 +8801,13 @@ google-protobuf@^3.20.0-rc.2: resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.20.1.tgz#1b255c2b59bcda7c399df46c65206aa3c7a0ce8b" integrity sha512-XMf1+O32FjYIV3CYu6Tuh5PNbfNEU5Xu22X+Xkdb/DUexFlCzhvv7d5Iirm4AOwn8lv4al1YvIhzGrg2j9Zfzw== +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + got@^11.8.5: version "11.8.6" resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" @@ -8400,6 +8830,11 @@ graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + growl@1.10.5: version "1.10.5" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" @@ -8465,6 +8900,11 @@ has-property-descriptors@^1.0.0: dependencies: get-intrinsic "^1.1.1" +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" @@ -8515,6 +8955,13 @@ hashlru@^2.3.0: resolved "https://registry.yarnpkg.com/hashlru/-/hashlru-2.3.0.tgz#5dc15928b3f6961a2056416bb3a4910216fdfb51" integrity sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A== +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + he@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -8677,6 +9124,11 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== +human-signals@^4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" + integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== + iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -8711,11 +9163,16 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.1.4, ignore@^5.1.8, ignore@^5.2.0: +ignore@^5.1.4, ignore@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== +ignore@^5.2.4: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" + integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== + import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -8869,6 +9326,15 @@ internal-slot@^1.0.3: has "^1.0.3" side-channel "^1.0.4" +internal-slot@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930" + integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg== + dependencies: + get-intrinsic "^1.2.2" + hasown "^2.0.0" + side-channel "^1.0.4" + invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" @@ -9710,6 +10176,15 @@ is-arguments@^1.0.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -9747,6 +10222,11 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== +is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + is-ci@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.0.tgz#c7e7be3c9d8eef7d0fa144390bd1e4b88dc4c994" @@ -9759,6 +10239,13 @@ is-circular@^1.0.2: resolved "https://registry.yarnpkg.com/is-circular/-/is-circular-1.0.2.tgz#2e0ab4e9835f4c6b0ea2b9855a84acd501b8366c" integrity sha512-YttjnrswnUYRVJvxCvu8z+PGMUSzC2JttP0OEXezlAEdp3EXzhf7IZ3j0gRAybJBQupedIZFhY61Tga6E0qASA== +is-core-module@^2.13.0, is-core-module@^2.13.1: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + is-core-module@^2.2.0, is-core-module@^2.5.0, is-core-module@^2.8.1: version "2.9.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" @@ -9780,6 +10267,16 @@ is-date-object@^1.0.1: dependencies: has-tostringtag "^1.0.0" +is-docker@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-docker@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" + integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== + is-domain-name@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-domain-name/-/is-domain-name-1.0.1.tgz#f6eb33b14a497541dca58335137d4466e0c20da1" @@ -9831,6 +10328,13 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-inside-container@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" + integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== + dependencies: + is-docker "^3.0.0" + is-ip@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-3.1.0.tgz#2ae5ddfafaf05cb8008a62093cf29734f657c5d8" @@ -9967,6 +10471,11 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" @@ -9988,6 +10497,13 @@ is-text-path@^1.0.1: dependencies: text-extensions "^1.0.0" +is-typed-array@^1.1.10, is-typed-array@^1.1.12: + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== + dependencies: + which-typed-array "^1.1.11" + is-typed-array@^1.1.3, is-typed-array@^1.1.9: version "1.1.9" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.9.tgz#246d77d2871e7d9f5aeb1d54b9f52c71329ece67" @@ -10026,6 +10542,13 @@ is-windows@^1.0.1, is-windows@^1.0.2: resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -10036,6 +10559,11 @@ isarray@^1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -10064,6 +10592,11 @@ iso-url@~0.4.7: resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-0.4.7.tgz#de7e48120dae46921079fe78f325ac9e9217a385" integrity sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog== +isomorphic-ws@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz#e5529148912ecb9b451b46ed44d53dae1ce04bbf" + integrity sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw== + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -10584,6 +11117,13 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + json5@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" @@ -11260,14 +11800,6 @@ listr2@^3.12.2: through "^2.3.8" wrap-ansi "^7.0.0" -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -11282,6 +11814,11 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash-es@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" @@ -11609,6 +12146,11 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + mimic-response@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" @@ -12104,6 +12646,11 @@ node-forge@^1.1.0, node-forge@^1.2.1: resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== +node-gyp-build-optional-packages@5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.3.tgz#92a89d400352c44ad3975010368072b41ad66c17" + integrity sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA== + node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: version "4.4.0" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4" @@ -12219,6 +12766,13 @@ npm-run-path@^4.0.0, npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" +npm-run-path@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" + integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== + dependencies: + path-key "^4.0.0" + npmlog@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" @@ -12282,6 +12836,11 @@ object-inspect@^1.12.0, object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== +object-inspect@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -12297,14 +12856,43 @@ object.assign@^4.1.2: has-symbols "^1.0.1" object-keys "^1.1.1" -object.values@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" - integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== +object.assign@^4.1.4: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.fromentries@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" + integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.groupby@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.1.tgz#d41d9f3c8d6c778d9cbac86b4ee9f5af103152ee" + integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + +object.values@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" + integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" observable-webworkers@^1.0.0: version "1.0.0" @@ -12361,6 +12949,23 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + +open@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/open/-/open-9.1.0.tgz#684934359c90ad25742f5a26151970ff8c6c80b6" + integrity sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg== + dependencies: + default-browser "^4.0.0" + define-lazy-prop "^3.0.0" + is-inside-container "^1.0.0" + is-wsl "^2.2.0" + opentracing@^0.14.4: version "0.14.7" resolved "https://registry.yarnpkg.com/opentracing/-/opentracing-0.14.7.tgz#25d472bd0296dc0b64d7b94cbc995219031428f5" @@ -12452,13 +13057,6 @@ p-finally@^1.0.0: resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - p-limit@^2.2.0, p-limit@^2.2.2: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -12480,13 +13078,6 @@ p-limit@^4.0.0: dependencies: yocto-queue "^1.0.0" -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== - dependencies: - p-limit "^1.1.0" - p-locate@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" @@ -12623,11 +13214,6 @@ p-times@^3.0.0: dependencies: p-map "^4.0.0" -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== - p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" @@ -12687,11 +13273,6 @@ parseurl@~1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -12712,6 +13293,11 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + path-parse@^1.0.6, path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" @@ -12931,10 +13517,10 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^2.3.2: - version "2.7.0" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.0.tgz#a4fdae07e5596c51c9857ea676cd41a0163879d6" - integrity sha512-nwoX4GMFgxoPC6diHvSwmK/4yU8FFH3V8XWtLQrbj4IBsK2pkYhG4kf/ljF/haaZ/aii+wNJqISrCDPgxGWDVQ== +prettier@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.1.1.tgz#6ba9f23165d690b6cbdaa88cb0807278f7019848" + integrity sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw== pretty-quick@^3.1.1: version "3.1.3" @@ -13475,6 +14061,15 @@ regexp.prototype.flags@^1.4.3: define-properties "^1.1.3" functions-have-names "^1.2.2" +regexp.prototype.flags@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" + integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + set-function-name "^2.0.0" + regexpp@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" @@ -13589,7 +14184,7 @@ resolve@1.20.0: is-core-module "^2.2.0" path-parse "^1.0.6" -resolve@^1.0.0, resolve@^1.10.0, resolve@^1.20.0, resolve@^1.22.0: +resolve@^1.0.0, resolve@^1.10.0: version "1.22.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== @@ -13607,6 +14202,15 @@ resolve@^1.22.1: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^1.22.4: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + responselike@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" @@ -13688,6 +14292,13 @@ rimraf@~2.6.2: dependencies: glob "^7.1.3" +run-applescript@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-5.0.0.tgz#e11e1c932e055d5c6b40d98374e0268d9b11899c" + integrity sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg== + dependencies: + execa "^5.0.0" + run-async@^2.2.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" @@ -13728,6 +14339,16 @@ rxjs@^7.8.1: dependencies: tslib "^2.1.0" +safe-array-concat@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" + integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + isarray "^2.0.5" + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -13738,6 +14359,15 @@ safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, s resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + safe-stable-stringify@^2.3.1: version "2.4.3" resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" @@ -13823,6 +14453,11 @@ semver@^6.0.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + semver@^7.2.1, semver@^7.3.4, semver@^7.3.5: version "7.3.7" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" @@ -13844,6 +14479,13 @@ semver@^7.3.8: dependencies: lru-cache "^6.0.0" +semver@^7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + semver@~7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" @@ -13895,6 +14537,25 @@ set-delayed-interval@^1.0.0: resolved "https://registry.yarnpkg.com/set-delayed-interval/-/set-delayed-interval-1.0.0.tgz#1f7c065780a365f10250f8a80e2be10175ea0388" integrity sha512-29fhAwuZlLcuBnW/EwxvLcg2D3ELX+VBDNhnavs3YYkab72qmrcSeQNVdzl8EcPPahGQXhBM6MKdPLCQGMDakw== +set-function-length@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" + integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== + dependencies: + define-data-property "^1.1.1" + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +set-function-name@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" + integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== + dependencies: + define-data-property "^1.0.1" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.0" + set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" @@ -13968,7 +14629,7 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -14278,6 +14939,7 @@ string-to-stream@^1.1.0: readable-stream "^2.1.0" "string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + name string-width-cjs version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -14321,6 +14983,15 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" +string.prototype.trim@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" + integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + string.prototype.trimend@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" @@ -14330,6 +15001,15 @@ string.prototype.trimend@^1.0.5: define-properties "^1.1.4" es-abstract "^1.19.5" +string.prototype.trimend@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" + integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + string.prototype.trimstart@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" @@ -14339,6 +15019,15 @@ string.prototype.trimstart@^1.0.5: define-properties "^1.1.4" es-abstract "^1.19.5" +string.prototype.trimstart@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" + integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -14368,6 +15057,7 @@ stringify-object@3.3.0: is-regexp "^1.0.0" "strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + name strip-ansi-cjs version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -14429,6 +15119,11 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + strip-indent@3.0.0, strip-indent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" @@ -14536,6 +15231,14 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +synckit@^0.8.5: + version "0.8.6" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.6.tgz#b69b7fbce3917c2673cbdc0d87fb324db4a5b409" + integrity sha512-laHF2savN6sMeHCjLRkheIU4wo3Zg9Ln5YOjOo7sZ5dVQW8yF5pPE5SIw1dsPhq3TRp1jisKRCdPhfs/1WMqDA== + dependencies: + "@pkgr/utils" "^2.4.2" + tslib "^2.6.2" + table@^6.0.9: version "6.8.0" resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" @@ -14739,6 +15442,16 @@ timestamp-nano@^1.0.0: resolved "https://registry.yarnpkg.com/timestamp-nano/-/timestamp-nano-1.0.0.tgz#03bf0b43c2bdcb913a6a02fbaae6f97d68650f3a" integrity sha512-NO/1CZigzlCWQiWdIGv8ebXt6Uk77zdLz2NE7KcZRU5Egj2+947lzUpk30xQUQlq5dRY25j7ZulG4RfA2DHYfA== +tiny-typed-emitter@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz#b3b027fdd389ff81a152c8e847ee2f5be9fad7b5" + integrity sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA== + +titleize@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53" + integrity sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ== + tmp@0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" @@ -14822,6 +15535,11 @@ truncate-utf8-bytes@^1.0.0: dependencies: utf8-byte-length "^1.0.1" +ts-api-utils@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" + integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== + ts-dedent@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5" @@ -14852,24 +15570,6 @@ ts-node-dev@^1.1.8: ts-node "^9.0.0" tsconfig "^7.0.0" -ts-node@10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.2.0.tgz#f1e88249a00e26aa95e9a93c50f70241a8a1c4bb" - integrity sha512-FstYHtQz6isj8rBtYMN4bZdnXN1vq4HCbqn9vdNQcInRqtB86PePJQIxE6es0PhxKWhj2PHuwbG40H+bxkZPmg== - dependencies: - "@cspotcode/source-map-support" "0.6.1" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - yn "3.1.1" - ts-node@7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf" @@ -14922,6 +15622,25 @@ ts-node@^10.8.0: v8-compile-cache-lib "^3.0.1" yn "3.1.1" +ts-node@^10.9.1, ts-node@^10.9.2: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + ts-node@^9, ts-node@^9.0.0: version "9.1.1" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" @@ -14934,7 +15653,17 @@ ts-node@^9, ts-node@^9.0.0: source-map-support "^0.5.17" yn "3.1.1" -tsconfig-paths@^3.14.1, tsconfig-paths@^3.5.0: +tsconfig-paths@^3.14.2: + version "3.14.2" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" + integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tsconfig-paths@^3.5.0: version "3.14.1" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== @@ -14954,7 +15683,7 @@ tsconfig@^7.0.0: strip-bom "^3.0.0" strip-json-comments "^2.0.0" -tslib@^1.11.1, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: +tslib@^1.11.1, tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -14964,18 +15693,11 @@ tslib@^2, tslib@^2.1.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== -tslib@^2.3.1, tslib@^2.5.0: +tslib@^2.3.1, tslib@^2.5.0, tslib@^2.6.0, tslib@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - tulons@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/tulons/-/tulons-0.0.7.tgz#31677402ab51dc51478d375f90df76ea2ca8cbb9" @@ -15050,6 +15772,45 @@ type-is@^1.6.4, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -15062,11 +15823,6 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript@4.3.5: - version "4.3.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" - integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== - typescript@^4.4.3, typescript@^4.6.4: version "4.7.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" @@ -15077,6 +15833,11 @@ typescript@^4.9.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== +typescript@^5.0.0: + version "5.3.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" + integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== + typical@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/typical/-/typical-6.0.1.tgz#89bd1a6aa5e5e96fa907fb6b7579223bff558a06" @@ -15132,6 +15893,11 @@ undefsafe@^2.0.5: resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + undici@3.3.6: version "3.3.6" resolved "https://registry.yarnpkg.com/undici/-/undici-3.3.6.tgz#06d3b97b7eeff46bce6f8a71079c09f64dd59dc1" @@ -15265,6 +16031,11 @@ uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +uuid@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + v8-compile-cache-lib@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" @@ -15360,6 +16131,17 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== +which-typed-array@^1.1.11, which-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" + integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.4" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + which-typed-array@^1.1.2: version "1.1.8" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.8.tgz#0cfd53401a6f334d90ed1125754a42ed663eb01f" @@ -15409,6 +16191,7 @@ workerpool@6.2.0: integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + name wrap-ansi-cjs version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -15468,11 +16251,21 @@ ws@^7.3.1: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.8.tgz#ac2729881ab9e7cbaf8787fe3469a48c5c7f636a" integrity sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw== +ws@^8.15.0: + version "8.15.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.15.0.tgz#db080a279260c5f532fc668d461b8346efdfcf86" + integrity sha512-H/Z3H55mrcrgjFwI+5jKavgXvwQLtfPCUEp6pi35VhoB0pfcHnSoyuTzkBEZpzq49g1193CUEwIvmsjcotenYw== + ws@^8.4.0: version "8.8.1" resolved "https://registry.yarnpkg.com/ws/-/ws-8.8.1.tgz#5dbad0feb7ade8ecc99b830c1d77c913d4955ff0" integrity sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA== +ws@^8.7.0: + version "8.15.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.15.1.tgz#271ba33a45ca0cc477940f7f200cd7fba7ee1997" + integrity sha512-W5OZiCjXEmk0yZ66ZN82beM5Sz7l7coYxpRkzS+p9PP+ToQry8szKh+61eNktr7EA9DOwvFGhfC605jDHbP6QQ== + ws@~8.2.3: version "8.2.3" resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba" @@ -15524,6 +16317,11 @@ xsalsa20@^1.1.0: resolved "https://registry.yarnpkg.com/xsalsa20/-/xsalsa20-1.2.0.tgz#e5a05cb26f8cef723f94a559102ed50c1b44c25c" integrity sha512-FIr/DEeoHfj7ftfylnoFt3rAIRoWXpx2AoDfrT2qD2wtp7Dp+COajvs/Icb7uHqRW9m60f5iXZwdsJJO3kvb7w== +xstate@^4.37.0: + version "4.38.3" + resolved "https://registry.yarnpkg.com/xstate/-/xstate-4.38.3.tgz#4e15e7ad3aa0ca1eea2010548a5379966d8f1075" + integrity sha512-SH7nAaaPQx57dx6qvfcIgqKRXIh4L0A1iYEqim4s1u7c9VoCgzZc+63FY90AKU4ZzOC2cfJzTnpO4zK7fCUzzw== + xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index e79944a55..f30ce58c7 100755 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -55,6 +55,7 @@ services: ports: - "5420:5420" - "9229:9229" + - "9277:9277" - "5555:5555" extra_hosts: - host.docker.internal:host-gateway @@ -130,13 +131,22 @@ services: # EXPERIMENTAL_SUBGRAPH_VERSION_SWITCHING_MODE: synced ipfs: - image: ipfs/go-ipfs:v0.13.0 + image: ipfs/kubo:v0.24.0 container_name: "ipfs" environment: IPFS_SWARM_KEY: "/key/swarm/psk/1.0.0/\n/base16/\n9d002c50635a479d29dcc0ccb49d862952a0dcc52baddd253167adcd496c8d04" ports: - "5001:5001" - "8089:8080" + command: + # These are defaults from the go-ipfs dockerfile CMD + - "daemon" + - "--migrate=true" + - "--agent-version-suffix=docker" + # This is necessary before ceramic ships Recon, the new tip gossip protocol + - "--enable-pubsub-experiment" + extra_hosts: + - host.docker.internal:host-gateway volumes: - ./local-data/ipfs:/data/ipfs healthcheck: @@ -154,6 +164,25 @@ services: volumes: - ./local-data/redis:/data + ceramic: + image: ceramicnetwork/js-ceramic:3.2.0 + container_name: ceramic + ports: + - "7007:7007" + environment: + NODE_ENV: production + extra_hosts: + - host.docker.internal:host-gateway + volumes: + - ./local-data/ceramic/statestore:/root/.ceramic/statestore + - ./.ceramicDev.config.json:/root/.ceramic/daemon.config.json + depends_on: + ipfs: + condition: + service_healthy + db_postgres: + condition: + service_healthy # desci_nodes_backend_test: # container_name: 'be_test_boilerplate' diff --git a/docker-compose.repo.yml b/docker-compose.repo.yml new file mode 100644 index 000000000..45ef44b6c --- /dev/null +++ b/docker-compose.repo.yml @@ -0,0 +1,25 @@ +version: "3" + +services: + desci_repo: + container_name: "desci_repo" + entrypoint: /bin/sh './scripts/be-node-dev.sh' + build: ./desci-repo + env_file: + - ./desci-repo/.env + ports: + - "5484:5484" + - "5445:5445" + - "9232:9232" + extra_hosts: + - host.docker.internal:host-gateway + depends_on: + db_postgres: + condition: + service_healthy + links: + - db_postgres + volumes: + - ./desci-repo:/app/ + - /app/node_modules + - ./local-data/yarn_cache:/root/.yarn \ No newline at end of file diff --git a/docker-compose.test.yml b/docker-compose.test.yml index 6339f4559..88db82939 100755 --- a/docker-compose.test.yml +++ b/docker-compose.test.yml @@ -1,14 +1,14 @@ -version: '3' +version: "3" services: nodes_test_db: - container_name: 'nodes_test_db' - image: 'postgres:12.6-alpine' + container_name: "nodes_test_db" + image: "postgres:12.6-alpine" restart: always env_file: - .env.test ports: - - '5434:5432' + - "5434:5432" # volumes: # - ./database/test:/var/lib/postgresql/data/ @@ -18,17 +18,18 @@ services: env_file: - .env.test ports: - - '5421:5420' - - '9227:9227' - - '5557:5555' + - "5421:5420" + - "9227:9227" + - "5557:5555" extra_hosts: - host.docker.internal:host-gateway depends_on: - nodes_test_db - nodes_test_ipfs + - nodes_test_repo_service links: - nodes_test_db - container_name: 'nodes_backend_test' + container_name: "nodes_backend_test" volumes: - .:/app/ # - /app/node_modules @@ -40,10 +41,29 @@ services: environment: IPFS_SWARM_KEY: "/key/swarm/psk/1.0.0/\n/base16/\n9d002c50635a479d29dcc0ccb49d862952a0dcc52baddd253167adcd496c8d04" ports: - - '5002:5001' - - '8090:8080' + - "5002:5001" + - "8090:8080" volumes: - ./local-data/test/ipfs:/data/ipfs + + nodes_test_repo_service: + container_name: "nodes_test_repo_service" + entrypoint: /bin/sh './desci-repo/scripts/be-node-test.sh' + build: ./desci-repo + env_file: + - ./desci-repo/.env.test + ports: + - "5485:5484" + - "5446:5445" + extra_hosts: + - host.docker.internal:host-gateway + depends_on: + - nodes_test_db + links: + - nodes_test_db + volumes: + - .:/app/ + - ./local-data/yarn_cache:/root/.yarn # desci_nodes_backend_test: # container_name: 'be_test_boilerplate' # command: echo 'Test container ready' diff --git a/dockerDev.sh b/dockerDev.sh index a4919f16d..c7b22327f 100755 --- a/dockerDev.sh +++ b/dockerDev.sh @@ -11,8 +11,7 @@ catch() { assert_command_available() { local cmd_to_check=$1 - if ! command -v "$cmd_to_check" &> /dev/null - then + if ! command -v "$cmd_to_check" &>/dev/null; then echo "[dockerDev] Script dependency '$cmd_to_check' is not installed, aborting" exit 1 fi @@ -28,8 +27,7 @@ init_node() { # Since nvm is loaded through shell config, it's not available # in scripts unless we source it manually local NVM_SCRIPT="$NVM_DIR/nvm.sh" - if [[ -s "$NVM_SCRIPT" ]] - then + if [[ -s "$NVM_SCRIPT" ]]; then source "$NVM_SCRIPT" else echo "[dockerDev] Could not find $NVM_SCRIPT, aborting" @@ -64,10 +62,11 @@ done # Default to empty if unset ADDITIONAL_FLAGS=${ADDITIONAL_FLAGS:-""} echo "[dockerDev] PWD=$PWD" -COMPOSE_HTTP_TIMEOUT=120 docker-compose \ +COMPOSE_HTTP_TIMEOUT=320 docker-compose \ --project-name desci \ --file docker-compose.yml \ --file docker-compose.dev.yml \ + --file docker-compose.repo.yml \ $ADDITIONAL_FLAGS \ --compatibility \ up \ diff --git a/dockerWithDesciRepo.sh b/dockerWithDesciRepo.sh new file mode 100755 index 000000000..8097600cd --- /dev/null +++ b/dockerWithDesciRepo.sh @@ -0,0 +1 @@ +ADDITIONAL_FLAGS="--file docker-compose.repo.yml" ./dockerDev.sh \ No newline at end of file diff --git a/interpolateConfigVars.sh b/interpolateConfigVars.sh new file mode 100755 index 000000000..de3b1a2f3 --- /dev/null +++ b/interpolateConfigVars.sh @@ -0,0 +1,38 @@ +#! /usr/bin/env bash + +set -euo pipefail + +# Send output to stderr +echoerr() { + echo "$@" 1>&2; +} + +TEMPLATE_FILE=$1 +if [[ -z "$TEMPLATE_FILE" ]]; then + echoerr "Template file not passed as first argument, exiting." + exit 1 +fi + +# Get all variables needing substitution +TEMPLATE_VARS=$(grep --only-matching "@.*@" "$TEMPLATE_FILE" | tr --delete "@") + +# Check that each template var exists in env +while read -r templateVar; do + if ! printenv "$templateVar" &>/dev/null; then + echoerr "$templateVar is not set in environment, exiting." + exit 1 + fi +done <<<"$TEMPLATE_VARS" + + +# For each line in the template file +while read -r line; do + # If we got a variable in the line... + if var=$(grep --only-matching "@.*@" <<<"$line" | tr --delete "@"); then + # ...replace it with the env variable + sed "s/@$var@/$(printenv "$var")/" <<<"$line" + else + # ...else just re-print the line + echo "$line" + fi +done < "$TEMPLATE_FILE" diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index fb57ccd13..000000000 --- a/yarn.lock +++ /dev/null @@ -1,4 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - -