diff --git a/.github/disabled_workflows/castor.yml b/.github/disabled_workflows/castor.yml
deleted file mode 100644
index ade4209dd2..0000000000
--- a/.github/disabled_workflows/castor.yml
+++ /dev/null
@@ -1,29 +0,0 @@
-name: Castor testing workflow
-
-# Cancel previously running workflows if new commit pushed to the branch
-# this will help to push fixes earlier and stop previous workflows
-concurrency:
- group: ${{ github.head_ref }}${{ github.ref }}-castor
- cancel-in-progress: true
-
-on:
- push:
- branches:
- - "main"
- paths:
- - ".github/workflows/castor.yml"
- - ".github/workflows/scala-unit-tests.yml"
- - "castor/**"
- pull_request:
- paths:
- - ".github/workflows/castor.yml"
- - ".github/workflows/scala-unit-tests.yml"
- - "castor/**"
-
-jobs:
- build-and-test-castor:
- uses: ./.github/workflows/scala-unit-tests.yml
- with:
- component-name: "Castor"
- component-dir: "castor/lib"
- secrets: inherit
diff --git a/.github/disabled_workflows/connect.yml b/.github/disabled_workflows/connect.yml
deleted file mode 100644
index 65be4b8856..0000000000
--- a/.github/disabled_workflows/connect.yml
+++ /dev/null
@@ -1,29 +0,0 @@
-name: Connect testing workflow
-
-# Cancel previously running workflows if new commit pushed to the branch
-# this will help to push fixes earlier and stop previous workflows
-concurrency:
- group: ${{ github.head_ref }}${{ github.ref }}-connect
- cancel-in-progress: true
-
-on:
- push:
- branches:
- - "main"
- paths:
- - ".github/workflows/connect.yml"
- - ".github/workflows/scala-unit-tests.yml"
- - "connect/lib/**"
- pull_request:
- paths:
- - ".github/workflows/connect.yml"
- - ".github/workflows/scala-unit-tests.yml"
- - "connect/lib/**"
-
-jobs:
- build-and-test-connect:
- uses: ./.github/workflows/scala-unit-tests.yml
- with:
- component-name: "Connect Lib"
- component-dir: "connect/lib"
- secrets: inherit
diff --git a/.github/disabled_workflows/iris-client.yml b/.github/disabled_workflows/iris-client.yml
deleted file mode 100644
index d7a6a04607..0000000000
--- a/.github/disabled_workflows/iris-client.yml
+++ /dev/null
@@ -1,30 +0,0 @@
-name: Iris client testing workflow
-
-# Cancel previously running workflows if new commit pushed to the branch
-# this will help to push fixes earlier and stop previous workflows
-concurrency:
- group: ${{ github.head_ref }}${{ github.ref }}-iris-client
- cancel-in-progress: true
-
-on:
- push:
- branches:
- - "main"
- paths:
- - ".github/workflows/iris-client.yml"
- - ".github/workflows/scala-unit-tests.yml"
- - "iris/client/**"
- pull_request:
- paths:
- - ".github/workflows/iris-client.yml"
- - ".github/workflows/scala-unit-tests.yml"
- - "iris/client/**"
-
-jobs:
- build-and-test-iris-client:
- uses: ./.github/workflows/scala-unit-tests.yml
- with:
- component-name: "Iris Client"
- component-dir: "iris/client/scala-client"
- measure-coverage: false
- secrets: inherit
diff --git a/.github/disabled_workflows/iris-service.yml b/.github/disabled_workflows/iris-service.yml
deleted file mode 100644
index f69cdd74e6..0000000000
--- a/.github/disabled_workflows/iris-service.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-name: Iris service testing workflow
-
-# Cancel previously running workflows if new commit pushed to the branch
-# this will help to push fixes earlier and stop previous workflows
-concurrency:
- group: ${{ github.head_ref }}${{ github.ref }}-iris-service
- cancel-in-progress: true
-
-on:
- push:
- branches:
- - "main"
- paths:
- - ".github/workflows/iris-service.yml"
- - ".github/workflows/scala-unit-tests.yml"
- - "iris/service/**"
- pull_request:
- paths:
- - ".github/workflows/iris-service.yml"
- - ".github/workflows/scala-unit-tests.yml"
- - "iris/service/**"
-
-jobs:
- build-and-test-iris-service:
- uses: ./.github/workflows/scala-unit-tests.yml
- with:
- component-name: "Iris Service"
- component-dir: "iris/service"
- measure-coverage: false
- secrets: inherit
- release:
- if: github.event_name == 'push'
- uses: ./.github/workflows/release.yml
- with:
- release-component: "iris/service"
- secrets: inherit
diff --git a/.github/disabled_workflows/mercury-mediator.yml b/.github/disabled_workflows/mercury-mediator.yml
deleted file mode 100644
index e6e6e95fb2..0000000000
--- a/.github/disabled_workflows/mercury-mediator.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-name: Mercury mediator testing workflow
-
-# Cancel previously running workflows if new commit pushed to the branch
-# this will help to push fixes earlier and stop previous workflows
-concurrency:
- group: ${{ github.head_ref }}${{ github.ref }}-mercury-mediator
- cancel-in-progress: true
-
-on:
- push:
- branches:
- - "main"
- paths:
- - ".github/workflows/mercury-mediator.yml"
- - ".github/workflows/scala-unit-tests.yml"
- - "mercury-mediator/**"
- pull_request:
- paths:
- - ".github/workflows/mercury-mediator.yml"
- - ".github/workflows/scala-unit-tests.yml"
- - "mercury-mediator/**"
-
-jobs:
- build-and-test-mercury-mediator:
- uses: ./.github/workflows/scala-unit-tests.yml
- with:
- component-name: "Mercury Mediator"
- component-dir: "mercury/mercury-mediator"
- measure-coverage: false
- secrets: inherit
- release:
- if: github.event_name == 'push'
- uses: ./.github/workflows/release.yml
- with:
- release-component: "mercury/mercury-mediator"
- secrets: inherit
diff --git a/.github/disabled_workflows/mercury.yml b/.github/disabled_workflows/mercury.yml
deleted file mode 100644
index 138ccb3e2f..0000000000
--- a/.github/disabled_workflows/mercury.yml
+++ /dev/null
@@ -1,29 +0,0 @@
-name: Mercury testing workflow
-
-# Cancel previously running workflows if new commit pushed to the branch
-# this will help to push fixes earlier and stop previous workflows
-concurrency:
- group: ${{ github.head_ref }}${{ github.ref }}-mercury
- cancel-in-progress: true
-
-on:
- push:
- branches:
- - "main"
- paths:
- - ".github/workflows/mercury.yml"
- - ".github/workflows/scala-unit-tests.yml"
- - "mercury/mercury-library/**"
- pull_request:
- paths:
- - ".github/workflows/mercury.yml"
- - ".github/workflows/scala-unit-tests.yml"
- - "mercury/mercury-library/**"
-
-jobs:
- build-and-test-mercury:
- uses: ./.github/workflows/scala-unit-tests.yml
- with:
- component-name: "Mercury Lib"
- component-dir: "mercury/mercury-library"
- secrets: inherit
diff --git a/.github/disabled_workflows/pollux.yml b/.github/disabled_workflows/pollux.yml
deleted file mode 100644
index 1eb8f5ab5a..0000000000
--- a/.github/disabled_workflows/pollux.yml
+++ /dev/null
@@ -1,29 +0,0 @@
-name: Pollux testing workflow
-
-# Cancel previously running workflows if new commit pushed to the branch
-# this will help to push fixes earlier and stop previous workflows
-concurrency:
- group: ${{ github.head_ref }}${{ github.ref }}-pollux
- cancel-in-progress: true
-
-on:
- push:
- branches:
- - "main"
- paths:
- - ".github/workflows/pollux.yml"
- - ".github/workflows/scala-unit-tests.yml"
- - "pollux/**"
- pull_request:
- paths:
- - ".github/workflows/pollux.yml"
- - ".github/workflows/scala-unit-tests.yml"
- - "pollux/**"
-
-jobs:
- build-and-test-pollux:
- uses: ./.github/workflows/scala-unit-tests.yml
- with:
- component-name: "Pollux Lib"
- component-dir: "pollux/lib"
- secrets: inherit
diff --git a/.github/disabled_workflows/prism-agent.yml b/.github/disabled_workflows/prism-agent.yml
deleted file mode 100644
index 37d35a9770..0000000000
--- a/.github/disabled_workflows/prism-agent.yml
+++ /dev/null
@@ -1,43 +0,0 @@
-name: Prism agent testing workflow
-
-# Cancel previously running workflows if new commit pushed to the branch
-# this will help to push fixes earlier and stop previous workflows
-concurrency:
- group: ${{ github.head_ref }}${{ github.ref }}-prism-agent
-
-on:
- push:
- tags:
- - "*"
- branches:
- - "main"
- paths:
- - ".github/workflows/prism-agent.yml"
- - ".github/workflows/scala-unit-tests.yml"
- - "prism-agent/**"
- pull_request:
- paths:
- - ".github/workflows/prism-agent.yml"
- - ".github/workflows/scala-unit-tests.yml"
- - "prism-agent/**"
-
-jobs:
- build-and-test-prism-agent:
- uses: ./.github/workflows/scala-unit-tests.yml
- with:
- component-name: "PRISM Agent"
- component-dir: "prism-agent/service"
- secrets: inherit
- release:
- if: github.event_name == 'push' && !contains(github.event.head_commit.message, 'chore(release)')
- uses: ./.github/workflows/release.yml
- with:
- release-component: "prism-agent/service"
- secrets: inherit
- deploy:
- if: startsWith(github.ref, 'refs/tags') && contains(github.event.head_commit.message, 'chore(release)')
- uses: ./.github/workflows/deployment.yml
- with:
- component-tag: "${{ github.ref_name }}"
- env: "dev"
- secrets: inherit
diff --git a/.github/disabled_workflows/prism-node-client.yml b/.github/disabled_workflows/prism-node-client.yml
deleted file mode 100644
index e7b3f2039b..0000000000
--- a/.github/disabled_workflows/prism-node-client.yml
+++ /dev/null
@@ -1,30 +0,0 @@
-name: Prism node client testing workflow
-
-# Cancel previously running workflows if new commit pushed to the branch
-# this will help to push fixes earlier and stop previous workflows
-concurrency:
- group: ${{ github.head_ref }}${{ github.ref }}-prism-node-client
- cancel-in-progress: true
-
-on:
- push:
- branches:
- - "main"
- paths:
- - ".github/workflows/prism-node-client.yml"
- - ".github/workflows/scala-unit-tests.yml"
- - "prism-node/client/**"
- pull_request:
- paths:
- - ".github/workflows/prism-node-client.yml"
- - ".github/workflows/scala-unit-tests.yml"
- - "prism-node/client/**"
-
-jobs:
- build-and-test-prism-node-client:
- uses: ./.github/workflows/scala-unit-tests.yml
- with:
- component-name: "PRISM Node Client"
- component-dir: "prism-node/client/scala-client"
- measure-coverage: false
- secrets: inherit
diff --git a/.github/docker/Dockerfile b/.github/docker/Dockerfile
new file mode 100644
index 0000000000..0966ec3fb9
--- /dev/null
+++ b/.github/docker/Dockerfile
@@ -0,0 +1,25 @@
+FROM ubuntu:22.04
+
+RUN apt-get update && \
+ apt-get install --no-install-recommends --yes \
+ git=1:2.* \
+ curl=7.* \
+ wget=1.21.* \
+ unzip=6.* \
+ zip=3.* \
+ jq=1.* \
+ python3=3.10.* \
+ python3-pip=22.* \
+ python3-setuptools=59.6.* \
+ python3-wheel=0.37.* \
+ gnupg=2.2.* \
+ default-jre=2:1.* \
+ build-essential=12.* && \
+ echo "deb https://repo.scala-sbt.org/scalasbt/debian all main" | tee /etc/apt/sources.list.d/sbt.list && \
+ echo "deb https://repo.scala-sbt.org/scalasbt/debian /" | tee /etc/apt/sources.list.d/sbt_old.list && \
+ curl -sL "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x2EE0EA64E40A89B84B2DF73499E82A75642AC823" | gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/trusted.gpg.d/scalasbt-release.gpg --import && \
+ chmod 644 /etc/apt/trusted.gpg.d/scalasbt-release.gpg && \
+ apt-get --allow-releaseinfo-change update && \
+ apt-get install --no-install-recommends --yes \
+ sbt=1.4.* \
+ && rm -rf /var/lib/apt/lists/*
diff --git a/.github/workflows/build-test-docker.yml b/.github/workflows/build-test-docker.yml
new file mode 100644
index 0000000000..3d9432b2ab
--- /dev/null
+++ b/.github/workflows/build-test-docker.yml
@@ -0,0 +1,60 @@
+name: Build Test Docker image
+
+on:
+ push:
+ branches: ["main"]
+ paths:
+ - ".github/docker/**"
+ - ".github/workflows/build-test-docker.yml"
+ pull_request:
+ paths:
+ - ".github/docker/**"
+ - ".github/workflows/build-test-docker.yml"
+
+env:
+ REGISTRY: ghcr.io
+ IMAGE_NAME: agent-ci-ubuntu-22-jdk-11
+
+jobs:
+ build-and-push-image:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ packages: write
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v3
+
+ - name: Log in to the Container registry
+ uses: docker/login-action@v1
+ with:
+ registry: ${{ env.REGISTRY }}
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Extract metadata (tags, labels) for Docker
+ id: meta
+ uses: docker/metadata-action@v3
+ with:
+ images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
+
+ - name: Build Docker image
+ if: ${{ github.event_name == 'pull_request' }}
+ uses: docker/build-push-action@v2
+ with:
+ context: .github/docker
+ push: false
+ tags: ${{ steps.meta.outputs.tags }}
+ labels: ${{ steps.meta.outputs.labels }}
+
+ - name: Build and push Docker image
+ if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
+ uses: docker/build-push-action@v2
+ with:
+ context: .github/docker
+ push: true
+ tags: |
+ "ghcr.io/input-output-hk/${{ env.IMAGE_NAME }}:latest"
+ "ghcr.io/input-output-hk/${{ env.IMAGE_NAME }}:main"
+ labels: ${{ steps.meta.outputs.labels }}
diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml
index 1d895e391f..c6b57f753f 100644
--- a/.github/workflows/e2e-tests.yml
+++ b/.github/workflows/e2e-tests.yml
@@ -35,7 +35,7 @@ jobs:
java-version: openjdk@1.11
- name: Setup Gradle
- uses: gradle/gradle-build-action@v2
+ uses: gradle/gradle-build-action@v2.8.0
- name: Install Python
uses: actions/setup-python@v2
diff --git a/.github/workflows/performance-tests.yml b/.github/workflows/performance-tests.yml
index cdc51d3228..b7998ed729 100644
--- a/.github/workflows/performance-tests.yml
+++ b/.github/workflows/performance-tests.yml
@@ -32,7 +32,7 @@ jobs:
java-version: openjdk@1.11
- name: Setup Gradle
- uses: gradle/gradle-build-action@v2
+ uses: gradle/gradle-build-action@v2.8.0
- name: Login to GitHub Container Registry
uses: docker/login-action@v2
diff --git a/.github/workflows/release-clients.yml b/.github/workflows/release-clients.yml
index e07395bdde..9ad37fbed4 100644
--- a/.github/workflows/release-clients.yml
+++ b/.github/workflows/release-clients.yml
@@ -32,7 +32,7 @@ jobs:
python-version: '3.10'
- name: Setup Gradle
- uses: gradle/gradle-build-action@v2
+ uses: gradle/gradle-build-action@v2.8.0
- name: Login to Github Hub
uses: docker/login-action@v2
diff --git a/.github/workflows/unit-tests-common.yml b/.github/workflows/unit-tests-common.yml
index 86a2cdefdc..8f02e5b22d 100644
--- a/.github/workflows/unit-tests-common.yml
+++ b/.github/workflows/unit-tests-common.yml
@@ -19,7 +19,7 @@ jobs:
name: "Build and unit tests for ${{ inputs.component-name }}"
runs-on: self-hosted
container:
- image: ghcr.io/input-output-hk/atala-qa-automation
+ image: ghcr.io/input-output-hk/agent-ci-ubuntu-22-jdk-11:0.1.0
volumes:
- /nix:/nix
credentials:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7855f0ac52..d45be32438 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,19 @@
+# [1.12.0](https://github.com/input-output-hk/atala-prism-building-blocks/compare/prism-agent-v1.11.0...prism-agent-v1.12.0) (2023-08-31)
+
+
+### Bug Fixes
+
+* **prism-agent:** invitation expiry configuration and new state ([#655](https://github.com/input-output-hk/atala-prism-building-blocks/issues/655)) ([c61999d](https://github.com/input-output-hk/atala-prism-building-blocks/commit/c61999dd2a256401c30d29b842f0092f4968c6ed))
+
+
+### Features
+
+* add anoncreds credential definition rest api ([#624](https://github.com/input-output-hk/atala-prism-building-blocks/issues/624)) ([99e338a](https://github.com/input-output-hk/atala-prism-building-blocks/commit/99e338af6dc1ab2b4b42f4b1bee2a917ccb77b4c))
+* allow external API keys to be defined for an agent ([#643](https://github.com/input-output-hk/atala-prism-building-blocks/issues/643)) ([756dea7](https://github.com/input-output-hk/atala-prism-building-blocks/commit/756dea707b1ced9de800cdabfded6dfc100e340e))
+* ATL-5571 Generalized Vault to Store Json ([#650](https://github.com/input-output-hk/atala-prism-building-blocks/issues/650)) ([ebf0328](https://github.com/input-output-hk/atala-prism-building-blocks/commit/ebf0328cfb5107954766fe93ffc6b42f4e5a4cb0))
+* ATL-5574 Prime Anoncred Lib ([#652](https://github.com/input-output-hk/atala-prism-building-blocks/issues/652)) ([70b2f16](https://github.com/input-output-hk/atala-prism-building-blocks/commit/70b2f16beecdef7eeeabb18f1b25244046ba5a65))
+* ATL-5575 Generalize and Streamline Json Schema SerDes logic ([#653](https://github.com/input-output-hk/atala-prism-building-blocks/issues/653)) ([eb4f8f4](https://github.com/input-output-hk/atala-prism-building-blocks/commit/eb4f8f488bcef421e20f770669dfff99f4c1dd98))
+
# [1.11.0](https://github.com/input-output-hk/atala-prism-building-blocks/compare/prism-agent-v1.10.0...prism-agent-v1.11.0) (2023-08-21)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index e147b01527..480ca729d4 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -3,293 +3,128 @@
We would love for you to contribute to Atala PRISM and help make it even better than it is today!
As a contributor, here are the guidelines we would like you to follow:
-- [Pull Requests](#pull-requests)
-- [Commit Message Guidelines](#commits)
-- [Release process](#releases)
-- Software development lifecycle (TBD)
+ - [DCO](#dco)
+ - [Issues and Bugs](#issue)
+ - [Feature Requests](#feature)
+ - [Submission Guidelines](#submit)
+ - [Coding Rules](#rules)
+ - [Commit Message Guidelines](#commit)
+
+## Developer Certificate of Origin (DCO)
-## Pull Requests
+PRISM Cloud Agent enforces the Developer Certificate of Origin (DCO). It requires all commit messages to contain the `Signed-off-by` line with an email address that matches the commit author and the name on your GitHub account.
-### Submitting a Pull Request
+Please read and follow set up [DCO](./DCO.md).
-**All code changes to the `main` branch must go through Pull Requests (PRs)**
+## Found a Bug?
-To create a Pull Request, follow the [Official GitHub PR guidelines](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request)
+If you find a bug in the source code, you can help us by [submitting an issue](#submit-issue).
-> Use `Create draft pull Request` option to create work-in-progress (WIP) PRs.
-> Remove draft state when PR is ready for review.
+Even better, you can [submit a Pull Request](#submit-pr) with a fix.
-Each pull request should be small enough to be reviewed in less than 30 minutes.
-Otherwise, break the PR into several ones.
-**NOTE**: It's important to create new commits when addressing the reviewer comments (instead of `git commit --amend`), so that we know what exactly changed.
+## Missing a Feature?
-### Pull Request naming
+You can *request* a new feature by [submitting an issue](#submit-issue) to our GitHub Repository.
+If you would like to *implement* a new feature, please consider the size of the change in order to determine the right steps to proceed:
-Pull Requests are expected to be named like `[ATL-XXXX]: short description` (ticket id as prefix with a short but understandable description).
+* For a **Major Feature**, first open an issue and outline your proposal so that it can be discussed.
+ This process allows us to better coordinate our efforts, prevent duplication of work, and help you to craft the change so that it is successfully accepted into the project.
-> Please note, PR title should not be a part of the `main` branch commit history. All commits in `main` should correspond to the [Commit Message Guidelines](#commits).
+ **Note**: Adding a new topic to the documentation, or significantly re-writing a topic, counts as a major feature.
-### Pull Request checklist
+* **Small Features** can be crafted and directly [submitted as a Pull Request](#submit-pr).
-All Pull Requests will get a checklist that everyone is expected to follow, failing to do so might delay people getting to review it.
-Check the [PR checklist](.github/PULL_REQUEST_TEMPLATE.md) for more info.
+## Submission Guidelines
-### Pull request CI checks
+### Submitting an Issue
-All pull requests will be subject to the following checks and actions:
+Before you submit an issue, please search the issue tracker. An issue for your problem might already exist and the discussion might inform you of workarounds readily available.
-| Name | Type | Description |
-|-----------------------|--------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| Linter | Check | Powered by megalinter - any changed source will be checked against configured linting rules (configured in .mega-linter.yml at root of repository). No automatic fixes will be generated. If the check fails, the author of the pull request must fix issues and update pull request. |
-| Pull request labeller | Action | Pull Request will be labelled based upon directory structure |
+You can file new issues by selecting a `Bug Report` template on our [Issues submition page](https://github.com/input-output-hk/atala-prism-building-blocks/issues/new/choose).
-Linting is also available as part of the pre-commit hooks, this will follow the same rules as the CI checks in that it will not automatically fix linting issues.
+### Submitting a Pull Request (PR)
-> You must run `pre-commit install` to install these hooks once you have cloned the repository. Instructions can be found [here](https://pre-commit.com/#usage)
+Before you submit your Pull Request (PR) consider the following guidelines:
-In order to automatically fix linting issues, you must install and run the megalinter tool yourself. Instructions for running locally can be found [here](https://megalinter.io/latest/mega-linter-runner/)
+1. Search [GitHub](https://github.com/input-output-hk/atala-prism-building-blocks/pulls) for an open or closed PR that relates to your submission.
+ You don't want to duplicate existing efforts.
-Use `npx mega-linter-runner --fix` after installation to fix any detected local issues
+2. Be sure that an issue describes the problem you're fixing, or documents the design for the feature you'd like to add.
+ Discussing the design upfront helps to ensure that we're ready to accept your work.
-### Pull Request review
+3. Make sure all your commits have DCO sign-off line with an email address that matches the commit author and the name on your GitHub account.
-The team `input-output-hk/atala` will be automatically set as reviewer when the PR is created, so that 2 reviewers from the team get assigned.
+4. [Fork](https://docs.github.com/en/github/getting-started-with-github/fork-a-repo) the https://github.com/input-output-hk/atala-prism-building-blocks repo.
-After that, you can add any other reviewer that should review the PR.
+5. In your forked repository, make your changes in a new git branch:
-At least 1 approval is mandatory to merge a PR.
+ ```shell
+ git checkout -b my-fix-branch main
+ ```
-Check [CODEOWNERS](.github/CODEOWNERS) for more info about main owners/reviewers of each part of the repository.
+6. Create your patch, **including appropriate test cases**.
-### Pull Request merging
+7. Follow our [Coding Rules](#rules).
-You are responsible to merge your PRs when they are ready, before that, ensure that your branch has all the changes from the base branch (like `main`).
+8. Ensure that all tests and CI checks pass.
-> Avoid merge commits, use rebase instead, a simple way is to just run `git config --global pull.rebase true` on each repository or run `git config --global pull.rebase true` once to get the effect on all repositories.
+9. Commit your changes using a descriptive commit message that follows our [commit message conventions](#commit).
+ Adherence to these conventions is necessary because release notes are automatically generated from these messages.
-**NOTE** If a PR breaks `main` (usually identified by CI checks failure), we shouldn't merge it but keep it opened until we are able to merge it without breaking `main`, this applies to experimental or controversial changes. NOT merge experimental stuff, keep it in a PR.
+ ```shell
+ git commit --all
+ ```
+ Note: the optional commit `-a` command line option will automatically "add" and "rm" edited files.
-Once the Pull Request is ready to be merged, you will have 2 options:
-1. `Squash and Merge`
-2. `Rebase and Merge`
+10. Push your branch to GitHub:
-#### Squash and merge
+ ```shell
+ git push origin my-fix-branch
+ ```
-`Squash and Merge` feature from Github combines all the PR commits into a single one.
+11. In GitHub, send a pull request to `atala-prism-building-blocks:main`.
-You are expected to review the auto-generated message and update it as necessary to get a decent commit message that fully corresponds to the [Commit Message Guidelines](#commits).
+That's it! Thank you for your contribution!
-Use this option when all commits you made in the PR can be combined into one.
+#### After your pull request is merged
-If this is not the case, use `Rebase and Merge` option.
+After your pull request is merged, you can safely delete your branch and pull the changes from the main (upstream) repository:
-#### Rebase and Merge
+* Delete the remote branch on GitHub either through the GitHub web UI or your local shell as follows:
-`Rebase and Merge` feature from Github attached all commits from the PR branch on top of the base branch.
+ ```shell
+ git push origin --delete my-fix-branch
+ ```
-You are expected to make sure that **all the commits** in the PR are corresponding to the [Commit Message Guidelines](#commits).
+* Check out the main branch:
-Use this option when the update you're working on contains several commits that should be merged to the `main` branch of the repository.
+ ```shell
+ git checkout main -f
+ ```
-## Commits
+* Delete the local branch:
-The following general rules are applied to all commits:
+ ```shell
+ git branch -D my-fix-branch
+ ```
-- Must be a small incremental change
-- Must be signed and verified by GitHub
+* Update your local `main` with the latest upstream version:
-> Follow [signing commits](docs/guides/signing-commits.md) guide to set up GPG keys to correctly sign your commits.
+ ```shell
+ git pull --ff upstream main
+ ```
-### Commits Message Format
+## Commit Message Format
-We have very precise rules over how our Git commit messages must be formatted.
-This format leads to **easier to read commit history**.
+Please, follow our [Commit Message guidelines](https://handbook.atalaprism.io/engineering/sdlc/commit-guidelines) for all commits you made, and make sure your PR title is following this format.
-This format is based on the [Conventional Commits Specification](https://www.conventionalcommits.org/en/v1.0.0/#summary).
+## Coding Rules
-Each commit message consists of a mandatory **header**, an optional **body**, and an optional **footer**.
+To ensure consistency throughout the source code, keep these rules in mind as you are working:
-```text
-
-
-
-
-
+## Overview
+
+The Enterprise Cloud Agent is a W3C/Aries standards-based cloud agent written in Scala that provides self-sovereign identity services to build products and solutions based on it. The term "cloud" indicates that it operates on servers and is not intended for use on mobile devices.
+
+Enterprise Cloud Agent supports standard-based protocols built on top of DIDComm V2 for issuing, verifying, and holding verifiable credentials using both JWT and Hyperledger AnonCreds (coming soon) formats.
+
+In order to use the Cloud Agent, you establish a business logic controller responsible for communicating with the agent (initiating HTTP requests and processing webhook notifications). This controller can be created using any programming language capable of sending and receiving HTTP requests.
+
+As a result, you can concentrate on crafting self-sovereign identity solutions using well-known web development tools, without the need to delve into the intricacies of lower-level cryptography and identity protocol internals.
+
+## Features
+
+* Rest API
+* DIDComm V2
+* W3C-compliant `did:prism` and `did:peer` methods
+* Credential types
+ * JWT
+ * AnonCreds (coming soon)
+* HTTP events notification
+* Cardano as a distributed ledger
+* Secrets management with Hashicorp vault
+* Multi-tenancy (coming soon)
+
+## Example use cases
+
+* A government issues verifiable credentials (VCs) to its citizens to prove their identity and access government services.
+* An enterprise issues VCs to its employees to prove their employment and access enterprise services.
+* A Web3 authentication service based on verifiable presentations (VPs).
+
+## Getting started
+
+### Understanding SSI
+
+Before starting to use the Cloud Agent, it is important to understand the basic concepts of self-sovereign identity (SSI). The following resources provide a good introduction to SSI:
+
+* [Atala PRISM SSI introduction](https://docs.atalaprism.io/docs/category/concepts/)
+* [Linux Foundation Course: Getting Started with SSI](https://www.edx.org/learn/computer-programming/the-linux-foundation-getting-started-with-self-sovereign-identity)
+
+### Architecture
+
+The next diagram offers a concise architectural overview, depicting a Cloud Agent instance, a controller, the interconnections linking the controller and agent, as well as the external routes to other agents and public ledgers across the Internet.
+
+![Enterprise Cloud Agent architecture](docs/images/cloud-agent-architecture-dark.png#gh-dark-mode-only)
+![Enterprise Cloud Agent architecture](docs/images/cloud-agent-architecture-light.png#gh-light-mode-only)
+
+### Installation and usage
+
+Enterprise Cloud Agent is distributed as a Docker image to be run in a containerized environment. All versions can be found [here](https://github.com/input-output-hk/atala-prism-building-blocks/pkgs/container/prism-agent).
+
+The following sections describe how to run the Enterprise Cloud Agent in different configurations.
+
+#### Configuration
+
+The Enterprise Cloud Agent can be configured to use different types of ledger, secret storage and DID persistence. Any combination of options is available, but the most common configurations are:
+
+| Configuration | Secret Storage | DIDs persistence | VDR |
+| -------------- | -------------- | ---------------- | ------------------------------------ |
+| Dev | PostgreSQL | No | In-memory |
+| Pre-production | PostgreSQL | Yes | Cardano testnet (preview or preprod) |
+| Production | Hashicorp | Yes | Cardano mainnet |
+
+To start playing with Cloud Agent, we recommend using the Dev configuration. Pre-production and production configurations are intended for real-world use cases and require additional more complex configurations of the Cardano stack setup.
+
+> If you're interested in a hosted version of Enterprise Cloud Agent, please, contact us at [atalaprism.io](https://atalaprism.io).
+
+#### System requirements
+
+System requirements can vary depending on the use case. The following are the minimum requirements for running the Cloud Agent with the Dev configuration:
+
+* Linux or MacOS operating system
+* Docker (with docker-compose support)
+* Modern x86 or ARM-based CPU
+* \>=2GB RAM
+
+#### Running locally in demo mode
+
+Here is a general example of running a Cloud Agent locally:
+```bash
+PORT=${PORT} PRISM_AGENT_VERSION=${PRISM_AGENT_VERSION} PRISM_NODE_VERSION=${PRISM_NODE_VERSION} \
+ docker compose \
+ -p "${AGENT_ROLE}" \
+ -f ./infrastructure/shared/docker-compose-demo.yml \
+ up --wait
+```
+
+The `PORT` variable is used to specify the port number for the Cloud Agent to listen on. The `PRISM_AGENT_VERSION` and `PRISM_NODE_VERSION` variables are used to specify the versions of the Cloud Agent and PRISM Node to use. The `AGENT_ROLE` variable is used to specify the role of the Cloud Agent. The `AGENT_ROLE` variable can be set to `issuer`, `verifier` or `holder`.
+
+In real life, you will need to start at least two Cloud Agent instances with different roles. For example, you can start one instance with the `issuer` role and another one with the `holder` role. The `issuer` instance will be used to issue verifiable credentials (VCs) and the `holder` instance will be used to hold VCs. Here is an example of how you can do this:
+
+```bash
+PORT=8080 PRISM_AGENT_VERSION=1.9.2 PRISM_NODE_VERSION=2.2.1 \
+ docker compose \
+ -p "issuer" \
+ -f ./infrastructure/shared/docker-compose-demo.yml \
+ up --wait
+```
+
+```bash
+PORT=8090 PRISM_AGENT_VERSION=1.9.2 PRISM_NODE_VERSION=2.2.1 \
+ docker compose \
+ -p "holder" \
+ -f ./infrastructure/shared/docker-compose-demo.yml \
+ up --wait
+```
+
+If the Cloud Agent is started successfully, all the running containers should achieve `Healthy` state, and Cloud Agent Rest API should be available at the specified port, for example:
+* `http://localhost:8080/prism-agent` for the `issuer` instance
+* `http://localhost:8090/prism-agent` for the `holder` instance
+
+You can check the status of the running containers using the [health endpoint](https://docs.atalaprism.io/agent-api/#tag/System/operation/systemHealth):
+```bash
+$ curl http://localhost:8080/prism-agent/_system/health
+{"version":"1.9.2"}
+```
+
+> For more information about all available configuration parameters, please, check [Cloud Agent configuration](https://docs.atalaprism.io/docs/atala-prism/prism-cloud-agent/environment-variables) section at the documentation portal and edit the `docker-compose-demo.yml` file accordingly.
+
+#### Compatibility between Cloud Agent and PRISM Node
+
+There could be some incompatibilities between the most latest versions of Enterprise Cloud Agent and PRISM Node. Please, use the following table to check the compatibility between the versions:
+
+| Cloud Agent | PRISM Node |
+|-------------|------------|
+| 1.12.0 | 2.2.1 |
+| 1.9.2 | 2.2.1 |
+| 1.6.0 | 2.1.1 |
+| 1.4.0 | 2.1.1 |
+
+> Please note: it is not guaranteed that the latest version of Enterprise Cloud Agent will work with the latest version of PRISM Node. We recommend using the versions from the table above.
+
+### Following the Enterprise Cloud Agent tutorials
+
+The following tutorials will help you get started with the Cloud Agent and issue your first credentials:
+
+* [Creating, updating and deactivating Decentralized Identifiers (DIDs)](https://docs.atalaprism.io/tutorials/category/dids/)
+* [Setting up connections between agents using out-of-band (OOB) protocol](https://docs.atalaprism.io/tutorials/connections/connection)
+* [Issuing verifiable credentials (VCs)](https://docs.atalaprism.io/tutorials/credentials/issue)
+* [Presenting VC proofs](https://docs.atalaprism.io/tutorials/credentials/present-proof)
+
## User documentation
-* [Documentation portal](https://docs.atalaprism.io/)
-* [Handbook](https://handbook.atalaprism.io/)
+All extended documentation, tutorials and API references for the PRISM ecosystem can be found at https://docs.atalaprism.io/
+
+## Contributing
+
+Please read our [contributions guidelines](./CONTRIBUTING.md) and submit your PRs. We enforce [developer certificate of origin (DCO) commit signing](./DCO.md).
+
+We also welcome issues submitted about problems you encounter in using Enterprise Cloud Agent.
-## Developer documentation
+## License
-* [Contributing Guidelines](CONTRIBUTING.md)
-* [Interdependencies](./docs/general/Interdependencies.md)
-* [Repositories & relationships](./docs/general/repositories_relationships.md)
-* [Code linting](./docs/guides/linting.md)
-* [Signing commits](./docs/guides/signing_commits.md)
-* [Running agent locally](./infrastructure/local/README.md)
+[Apache License Version 2.0](LICENSE)
-**Love Atala PRISM? Give our repo a star :star: :arrow_up:.**
+**Love the repo? Give our repo a star :star: :arrow_up:.**
diff --git a/build.sbt b/build.sbt
index b93e33f316..c837c90092 100644
--- a/build.sbt
+++ b/build.sbt
@@ -696,9 +696,7 @@ lazy val polluxAnoncreds = project
name := "pollux-anoncreds",
Compile / unmanagedJars += baseDirectory.value / "anoncreds-java-1.0-SNAPSHOT.jar",
Compile / unmanagedResourceDirectories ++= Seq(
- // export LD_LIBRARY_PATH=.../anoncreds-rs/uniffi/target/x86_64-unknown-linux-gnu/release:$LD_LIBRARY_PATH,
- baseDirectory.value / "native-lib" / "NATIVE" / "darwin-aarch64",
- baseDirectory.value / "native-lib" / "NATIVE" / "linux" / "amd64"
+ baseDirectory.value / "native-lib" / "NATIVE"
),
)
@@ -800,32 +798,6 @@ lazy val prismAgentServer = project
eventNotification
)
-// ##################
-// #### Mediator ####
-// ##################
-
-/** The mediator service */
-lazy val mediator = project
- .in(file("mercury/mercury-mediator"))
- .settings(name := "mercury-mediator")
- .settings(libraryDependencies += D.zio)
- .settings(libraryDependencies += D.zioHttp)
- .settings(libraryDependencies += D.munitZio)
- .settings(
- // Compile / unmanagedResourceDirectories += apiBaseDirectory.value,
- testFrameworks := Seq(new TestFramework("zio.test.sbt.ZTestFramework")),
- // ### Build Docker Image ###
- Docker / maintainer := "atala-coredid@iohk.io",
- Docker / dockerRepository := Some("ghcr.io"),
- Docker / dockerUsername := Some("input-output-hk"),
- // Docker / githubOwner := "atala-prism-building-blocks",
- // Docker / dockerUpdateLatest := true,
- dockerExposedPorts := Seq(8080),
- dockerBaseImage := "openjdk:11"
- )
- .enablePlugins(JavaAppPackaging, DockerPlugin)
- .dependsOn(models, agentDidcommx)
-
// ############################
// #### Release process #####
// ############################
@@ -837,15 +809,6 @@ releaseProcess := Seq[ReleaseStep](
runTest,
setReleaseVersion,
ReleaseStep(releaseStepTask(prismAgentServer / Docker / stage)),
- sys.env
- .get("RELEASE_MEDIATOR") match {
- case Some(value) => ReleaseStep(releaseStepTask(mediator / Docker / stage))
- case None =>
- ReleaseStep(action = st => {
- println("INFO: prism mediator release disabled!")
- st
- })
- },
setNextVersion
)
@@ -877,7 +840,6 @@ lazy val aggregatedProjects: Seq[ProjectReference] = Seq(
connectDoobie,
prismAgentWalletAPI,
prismAgentServer,
- mediator,
eventNotification,
)
diff --git a/connect/lib/core/src/main/scala/io/iohk/atala/connect/core/model/ConnectionRecord.scala b/connect/lib/core/src/main/scala/io/iohk/atala/connect/core/model/ConnectionRecord.scala
index 96de1bb7fa..b7d3f29036 100644
--- a/connect/lib/core/src/main/scala/io/iohk/atala/connect/core/model/ConnectionRecord.scala
+++ b/connect/lib/core/src/main/scala/io/iohk/atala/connect/core/model/ConnectionRecord.scala
@@ -52,6 +52,9 @@ object ConnectionRecord {
// Invitee has received an offer (In Holder DB)
case InvitationReceived extends ProtocolState
+ // Inviter Invitation is expired in Invitee DB
+ case InvitationExpired extends ProtocolState
+
// Invitee has created a Connection Request to Inviter
case ConnectionRequestPending extends ProtocolState
diff --git a/connect/lib/core/src/main/scala/io/iohk/atala/connect/core/model/error/ConnectionServiceError.scala b/connect/lib/core/src/main/scala/io/iohk/atala/connect/core/model/error/ConnectionServiceError.scala
index dfa93f00d2..88dff81e80 100644
--- a/connect/lib/core/src/main/scala/io/iohk/atala/connect/core/model/error/ConnectionServiceError.scala
+++ b/connect/lib/core/src/main/scala/io/iohk/atala/connect/core/model/error/ConnectionServiceError.scala
@@ -12,4 +12,5 @@ object ConnectionServiceError {
final case class UnexpectedError(msg: String) extends ConnectionServiceError
final case class InvalidFlowStateError(msg: String) extends ConnectionServiceError
final case class InvitationAlreadyReceived(msg: String) extends ConnectionServiceError
+
}
diff --git a/connect/lib/core/src/main/scala/io/iohk/atala/connect/core/service/ConnectionService.scala b/connect/lib/core/src/main/scala/io/iohk/atala/connect/core/service/ConnectionService.scala
index 85178d4058..ce9f10f676 100644
--- a/connect/lib/core/src/main/scala/io/iohk/atala/connect/core/service/ConnectionService.scala
+++ b/connect/lib/core/src/main/scala/io/iohk/atala/connect/core/service/ConnectionService.scala
@@ -35,6 +35,10 @@ trait ConnectionService {
def markConnectionResponseSent(recordId: UUID): ZIO[WalletAccessContext, ConnectionServiceError, ConnectionRecord]
+ def markConnectionInvitationExpired(
+ recordId: UUID
+ ): ZIO[WalletAccessContext, ConnectionServiceError, ConnectionRecord]
+
def receiveConnectionResponse(
response: ConnectionResponse
): ZIO[WalletAccessContext, ConnectionServiceError, ConnectionRecord]
diff --git a/connect/lib/core/src/main/scala/io/iohk/atala/connect/core/service/ConnectionServiceImpl.scala b/connect/lib/core/src/main/scala/io/iohk/atala/connect/core/service/ConnectionServiceImpl.scala
index 86a9718e28..fdded8282a 100644
--- a/connect/lib/core/src/main/scala/io/iohk/atala/connect/core/service/ConnectionServiceImpl.scala
+++ b/connect/lib/core/src/main/scala/io/iohk/atala/connect/core/service/ConnectionServiceImpl.scala
@@ -174,6 +174,18 @@ private class ConnectionServiceImpl(
case Some(value) => ZIO.succeed(value)
}
+ override def markConnectionInvitationExpired(
+ recordId: UUID
+ ): ZIO[WalletAccessContext, ConnectionServiceError, ConnectionRecord] =
+ updateConnectionProtocolState(
+ recordId,
+ ProtocolState.InvitationGenerated,
+ ProtocolState.InvitationExpired
+ ).flatMap {
+ case None => ZIO.fail(RecordIdNotFound(recordId))
+ case Some(value) => ZIO.succeed(value)
+ }
+
override def receiveConnectionRequest(
request: ConnectionRequest
): ZIO[WalletAccessContext, ConnectionServiceError, ConnectionRecord] =
diff --git a/connect/lib/core/src/main/scala/io/iohk/atala/connect/core/service/ConnectionServiceNotifier.scala b/connect/lib/core/src/main/scala/io/iohk/atala/connect/core/service/ConnectionServiceNotifier.scala
index e2aa489151..d632189398 100644
--- a/connect/lib/core/src/main/scala/io/iohk/atala/connect/core/service/ConnectionServiceNotifier.scala
+++ b/connect/lib/core/src/main/scala/io/iohk/atala/connect/core/service/ConnectionServiceNotifier.scala
@@ -54,6 +54,12 @@ class ConnectionServiceNotifier(
): ZIO[WalletAccessContext, ConnectionServiceError, ConnectionRecord] =
notifyOnSuccess(svc.markConnectionResponseSent(recordId))
+ // FIXME: should it be context aware????
+ override def markConnectionInvitationExpired(
+ recordId: UUID
+ ): ZIO[WalletAccessContext, ConnectionServiceError, ConnectionRecord] =
+ notifyOnSuccess(svc.markConnectionInvitationExpired(recordId))
+
override def receiveConnectionResponse(
response: ConnectionResponse
): ZIO[WalletAccessContext, ConnectionServiceError, ConnectionRecord] =
diff --git a/connect/lib/core/src/main/scala/io/iohk/atala/connect/core/service/MockConnectionService.scala b/connect/lib/core/src/main/scala/io/iohk/atala/connect/core/service/MockConnectionService.scala
index d5e3f005ef..38f7dee1f0 100644
--- a/connect/lib/core/src/main/scala/io/iohk/atala/connect/core/service/MockConnectionService.scala
+++ b/connect/lib/core/src/main/scala/io/iohk/atala/connect/core/service/MockConnectionService.scala
@@ -18,6 +18,8 @@ object MockConnectionService extends Mock[ConnectionService] {
object ReceiveConnectionRequest extends Effect[ConnectionRequest, ConnectionServiceError, ConnectionRecord]
object AcceptConnectionRequest extends Effect[UUID, ConnectionServiceError, ConnectionRecord]
object MarkConnectionResponseSent extends Effect[UUID, ConnectionServiceError, ConnectionRecord]
+ object MarkConnectionInvitationExpired extends Effect[UUID, ConnectionServiceError, ConnectionRecord]
+
object ReceiveConnectionResponse extends Effect[ConnectionResponse, ConnectionServiceError, ConnectionRecord]
override val compose: URLayer[mock.Proxy, ConnectionService] = ZLayer {
@@ -48,6 +50,9 @@ object MockConnectionService extends Mock[ConnectionService] {
override def acceptConnectionRequest(recordId: UUID): IO[ConnectionServiceError, ConnectionRecord] =
proxy(AcceptConnectionRequest, recordId)
+ override def markConnectionInvitationExpired(recordId: UUID): IO[ConnectionServiceError, ConnectionRecord] =
+ proxy(MarkConnectionInvitationExpired, recordId)
+
override def markConnectionResponseSent(recordId: UUID): IO[ConnectionServiceError, ConnectionRecord] =
proxy(MarkConnectionResponseSent, recordId)
diff --git a/connect/lib/core/src/test/scala/io/iohk/atala/connect/core/repository/ConnectionRepositorySpecSuite.scala b/connect/lib/core/src/test/scala/io/iohk/atala/connect/core/repository/ConnectionRepositorySpecSuite.scala
index a31c8f24c5..6cbf087338 100644
--- a/connect/lib/core/src/test/scala/io/iohk/atala/connect/core/repository/ConnectionRepositorySpecSuite.scala
+++ b/connect/lib/core/src/test/scala/io/iohk/atala/connect/core/repository/ConnectionRepositorySpecSuite.scala
@@ -246,6 +246,25 @@ object ConnectionRepositorySpecSuite {
assertTrue(updatedRecord.get.protocolState == ProtocolState.ConnectionRequestReceived)
}
},
+ test("updateConnectionProtocolState updates the record to InvitationExpired") {
+ for {
+ repo <- ZIO.service[ConnectionRepository]
+ aRecord = connectionRecord
+ _ <- repo.createConnectionRecord(aRecord)
+ record <- repo.getConnectionRecord(aRecord.id)
+ count <- repo.updateConnectionProtocolState(
+ aRecord.id,
+ ProtocolState.InvitationGenerated,
+ ProtocolState.InvitationExpired,
+ maxRetries
+ )
+ updatedRecord <- repo.getConnectionRecord(aRecord.id)
+ } yield {
+ assertTrue(count == 1) &&
+ assertTrue(record.get.protocolState == ProtocolState.InvitationGenerated) &&
+ assertTrue(updatedRecord.get.protocolState == ProtocolState.InvitationExpired)
+ }
+ },
test("updateConnectionProtocolState doesn't update the record for invalid states") {
for {
repo <- ZIO.service[ConnectionRepository]
diff --git a/connect/lib/core/src/test/scala/io/iohk/atala/connect/core/service/ConnectionServiceImplSpec.scala b/connect/lib/core/src/test/scala/io/iohk/atala/connect/core/service/ConnectionServiceImplSpec.scala
index 23203dc9b6..8c1d00c498 100644
--- a/connect/lib/core/src/test/scala/io/iohk/atala/connect/core/service/ConnectionServiceImplSpec.scala
+++ b/connect/lib/core/src/test/scala/io/iohk/atala/connect/core/service/ConnectionServiceImplSpec.scala
@@ -4,6 +4,7 @@ import io.circe.syntax.*
import io.iohk.atala.connect.core.model.ConnectionRecord
import io.iohk.atala.connect.core.model.ConnectionRecord.*
import io.iohk.atala.connect.core.model.error.ConnectionServiceError
+import io.iohk.atala.connect.core.model.error.ConnectionServiceError.InvalidFlowStateError
import io.iohk.atala.connect.core.repository.ConnectionRepositoryInMemory
import io.iohk.atala.mercury.model.{DidId, Message}
import io.iohk.atala.mercury.protocol.connection.ConnectionResponse
@@ -178,6 +179,33 @@ object ConnectionServiceImplSpec extends ZIOSpecDefault {
assertTrue(updatedRecord.connectionResponse.isEmpty)
}
}
+ }, {
+ test("receiveConnectionRequest should update the inviter record accordingly if Invitation Not expired") {
+ for {
+ inviterSvc <- ZIO.service[ConnectionService].provideLayer(connectionServiceLayer)
+ inviteeSvc <- ZIO.service[ConnectionService].provideLayer(connectionServiceLayer)
+ inviterRecord <- inviterSvc.createConnectionInvitation(
+ Some("Test connection invitation"),
+ DidId("did:peer:INVITER")
+ )
+ inviteeRecord <- inviteeSvc.receiveConnectionInvitation(inviterRecord.invitation.toBase64)
+ maybeAcceptedInvitationRecord <- inviteeSvc.acceptConnectionInvitation(
+ inviteeRecord.id,
+ DidId("did:peer:INVITEE")
+ )
+ connectionRequest = maybeAcceptedInvitationRecord.connectionRequest.get
+ connectionRecordUpdated <- inviterSvc.markConnectionInvitationExpired(inviterRecord.id)
+
+ exit <- inviterSvc.receiveConnectionRequest(connectionRequest).exit
+
+ } yield {
+ assertTrue(exit match
+ case Exit.Failure(Cause.Fail(_: InvalidFlowStateError, _)) => true
+ case _ => false
+ )
+
+ }
+ }
}, {
test("acceptingConnectionRequest should update the inviter record accordingly") {
for {
diff --git a/docs/decisions/20230206-use-flyway-to-manage-migrations-for-application-services.md b/docs/decisions/20230206-use-flyway-to-manage-migrations-for-application-services.md
new file mode 100644
index 0000000000..84e78458b9
--- /dev/null
+++ b/docs/decisions/20230206-use-flyway-to-manage-migrations-for-application-services.md
@@ -0,0 +1,73 @@
+# Use flyway to manage migrations for application services
+
+- Status: [ accepted | deprecated | superseded by [xxx](yyyymmdd-xxx.md)]
+- Deciders: [list everyone involved in the decision]
+- Date: [YYYY-MM-DD when the decision was last updated]
+- Tags: [space and/or comma separated list of tags]
+
+Technical Story: [description | ticket/issue URL]
+
+## Context and Problem Statement
+
+[Describe the context and problem statement, e.g., in free form using two to three sentences. You may want to articulate the problem in form of a question.]
+
+## Decision Drivers
+
+- [driver 1, e.g., a force, facing concern, …]
+- [driver 2, e.g., a force, facing concern, …]
+- …
+
+## Considered Options
+
+- [option 1]
+- [option 2]
+- [option 3]
+- …
+
+## Decision Outcome
+
+Chosen option: "[option 1]", because [justification. e.g., only option, which meets k.o. criterion decision driver | which resolves force force | … | comes out best (see below)].
+
+### Positive Consequences
+
+- [e.g., improvement of quality attribute satisfaction, follow-up decisions required, …]
+- …
+
+### Negative Consequences
+
+- [e.g., compromising quality attribute, follow-up decisions required, …]
+- …
+
+## Pros and Cons of the Options
+
+### [option 1]
+
+[example | description | pointer to more information | …]
+
+- Good, because [argument a]
+- Good, because [argument b]
+- Bad, because [argument c]
+- …
+
+### [option 2]
+
+[example | description | pointer to more information | …]
+
+- Good, because [argument a]
+- Good, because [argument b]
+- Bad, because [argument c]
+- …
+
+### [option 3]
+
+[example | description | pointer to more information | …]
+
+- Good, because [argument a]
+- Good, because [argument b]
+- Bad, because [argument c]
+- …
+
+## Links
+
+- [Link type](link to adr)
+- …
diff --git a/docs/decisions/20230206-use-scala3-instead-of-scala2-to-write-applications.md b/docs/decisions/20230206-use-scala3-instead-of-scala2-to-write-applications.md
new file mode 100644
index 0000000000..ce19fb6273
--- /dev/null
+++ b/docs/decisions/20230206-use-scala3-instead-of-scala2-to-write-applications.md
@@ -0,0 +1,73 @@
+# Use Scala3 instead of Scala2 to write applications
+
+- Status: [ accepted | deprecated | superseded by [xxx](yyyymmdd-xxx.md)]
+- Deciders: [list everyone involved in the decision]
+- Date: [YYYY-MM-DD when the decision was last updated]
+- Tags: [space and/or comma separated list of tags]
+
+Technical Story: [description | ticket/issue URL]
+
+## Context and Problem Statement
+
+[Describe the context and problem statement, e.g., in free form using two to three sentences. You may want to articulate the problem in form of a question.]
+
+## Decision Drivers
+
+- [driver 1, e.g., a force, facing concern, …]
+- [driver 2, e.g., a force, facing concern, …]
+- …
+
+## Considered Options
+
+- [option 1]
+- [option 2]
+- [option 3]
+- …
+
+## Decision Outcome
+
+Chosen option: "[option 1]", because [justification. e.g., only option, which meets k.o. criterion decision driver | which resolves force force | … | comes out best (see below)].
+
+### Positive Consequences
+
+- [e.g., improvement of quality attribute satisfaction, follow-up decisions required, …]
+- …
+
+### Negative Consequences
+
+- [e.g., compromising quality attribute, follow-up decisions required, …]
+- …
+
+## Pros and Cons of the Options
+
+### [option 1]
+
+[example | description | pointer to more information | …]
+
+- Good, because [argument a]
+- Good, because [argument b]
+- Bad, because [argument c]
+- …
+
+### [option 2]
+
+[example | description | pointer to more information | …]
+
+- Good, because [argument a]
+- Good, because [argument b]
+- Bad, because [argument c]
+- …
+
+### [option 3]
+
+[example | description | pointer to more information | …]
+
+- Good, because [argument a]
+- Good, because [argument b]
+- Bad, because [argument c]
+- …
+
+## Links
+
+- [Link type](link to adr)
+- …
diff --git a/docs/decisions/20230206-use-zio-as-a-functional-effect-system-within-applications-to-manage-conccurency.md b/docs/decisions/20230206-use-zio-as-a-functional-effect-system-within-applications-to-manage-conccurency.md
new file mode 100644
index 0000000000..7e5eee278c
--- /dev/null
+++ b/docs/decisions/20230206-use-zio-as-a-functional-effect-system-within-applications-to-manage-conccurency.md
@@ -0,0 +1,73 @@
+# Use ZIO as a functional effect system within applications to manage conccurency
+
+- Status: [ accepted | deprecated | superseded by [xxx](yyyymmdd-xxx.md)]
+- Deciders: [list everyone involved in the decision]
+- Date: [YYYY-MM-DD when the decision was last updated]
+- Tags: [space and/or comma separated list of tags]
+
+Technical Story: [description | ticket/issue URL]
+
+## Context and Problem Statement
+
+[Describe the context and problem statement, e.g., in free form using two to three sentences. You may want to articulate the problem in form of a question.]
+
+## Decision Drivers
+
+- [driver 1, e.g., a force, facing concern, …]
+- [driver 2, e.g., a force, facing concern, …]
+- …
+
+## Considered Options
+
+- [option 1]
+- [option 2]
+- [option 3]
+- …
+
+## Decision Outcome
+
+Chosen option: "[option 1]", because [justification. e.g., only option, which meets k.o. criterion decision driver | which resolves force force | … | comes out best (see below)].
+
+### Positive Consequences
+
+- [e.g., improvement of quality attribute satisfaction, follow-up decisions required, …]
+- …
+
+### Negative Consequences
+
+- [e.g., compromising quality attribute, follow-up decisions required, …]
+- …
+
+## Pros and Cons of the Options
+
+### [option 1]
+
+[example | description | pointer to more information | …]
+
+- Good, because [argument a]
+- Good, because [argument b]
+- Bad, because [argument c]
+- …
+
+### [option 2]
+
+[example | description | pointer to more information | …]
+
+- Good, because [argument a]
+- Good, because [argument b]
+- Bad, because [argument c]
+- …
+
+### [option 3]
+
+[example | description | pointer to more information | …]
+
+- Good, because [argument a]
+- Good, because [argument b]
+- Bad, because [argument c]
+- …
+
+## Links
+
+- [Link type](link to adr)
+- …
diff --git a/docs/general/interdependencies.md b/docs/general/interdependencies.md
index 0eec0dda20..45c5b25b53 100644
--- a/docs/general/interdependencies.md
+++ b/docs/general/interdependencies.md
@@ -42,7 +42,6 @@ flowchart
mercury --> pollux
mercury --> connect
mercury --> prism-agent
- mercury --> mediator
connect --> prism-agent
diff --git a/docs/images/cloud-agent-architecture-dark.png b/docs/images/cloud-agent-architecture-dark.png
new file mode 100644
index 0000000000..fce98d5e54
Binary files /dev/null and b/docs/images/cloud-agent-architecture-dark.png differ
diff --git a/docs/images/cloud-agent-architecture-light.png b/docs/images/cloud-agent-architecture-light.png
new file mode 100644
index 0000000000..6b931747a6
Binary files /dev/null and b/docs/images/cloud-agent-architecture-light.png differ
diff --git a/docs/images/dco.png b/docs/images/dco.png
new file mode 100644
index 0000000000..8cec0f83ee
Binary files /dev/null and b/docs/images/dco.png differ
diff --git a/infrastructure/charts/agent/Chart.yaml b/infrastructure/charts/agent/Chart.yaml
index 7b38a756bd..27ea55e203 100644
--- a/infrastructure/charts/agent/Chart.yaml
+++ b/infrastructure/charts/agent/Chart.yaml
@@ -18,7 +18,7 @@ version: 0.1.0
# incremented each time you make changes to the application. Versions are not expected to
# follow Semantic Versioning. They should reflect the version the application is using.
# It is recommended to use it with quotes.
-appVersion: "1.11.0"
+appVersion: "1.12.0"
dependencies:
- name: "vault"
version: "0.24.1"
diff --git a/infrastructure/charts/agent/templates/apisixroute.yaml b/infrastructure/charts/agent/templates/apisixroute.yaml
index 2bf0288414..238684d89f 100644
--- a/infrastructure/charts/agent/templates/apisixroute.yaml
+++ b/infrastructure/charts/agent/templates/apisixroute.yaml
@@ -97,6 +97,37 @@ spec:
---
+apiVersion: apisix.apache.org/v2
+kind: ApisixRoute
+metadata:
+ name: agent-credential-definition-registry-route
+ namespace: "{{ .Release.Namespace }}"
+ labels:
+ {{ template "labels.common" . }}
+spec:
+ http:
+ - name: agent-credential-definition-registry-rule
+ match:
+ hosts:
+ {{- range .Values.ingress.applicationUrls }}
+ - {{ . }}
+ {{- end }}
+ paths:
+ - /prism-agent/credential-definition-registry/definitions/*
+ methods:
+ - GET
+ backends:
+ - serviceName: agent-server-tapir-service
+ servicePort: 8085
+ plugins:
+ - name: proxy-rewrite
+ enable: true
+ config:
+ regex_uri: ["^/prism-agent/credential-definition-registry/definitions/(.*)", "credential-definition-registry/definitions/$1"]
+ {{ template "cors" . }}
+
+---
+
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
diff --git a/infrastructure/dev/get-versions.sh b/infrastructure/dev/get-versions.sh
index c2f51d2661..ccc91631eb 100755
--- a/infrastructure/dev/get-versions.sh
+++ b/infrastructure/dev/get-versions.sh
@@ -8,8 +8,5 @@ cd ${SCRIPT_DIR}
export PRISM_AGENT_VERSION=$(cd ../../ && sbt "project agent" -Dsbt.supershell=false -error "print version")
echo "prism-agent server version: ${PRISM_AGENT_VERSION}"
-export MERCURY_MEDIATOR_VERSION=$(cd ../../ && sbt "project mediator" -Dsbt.supershell=false -error "print version")
-echo "mercury-mediator version: ${MERCURY_MEDIATOR_VERSION}"
-
export PRISM_NODE_VERSION=v2.1.1
echo "prism node version: ${PRISM_NODE_VERSION}"
diff --git a/infrastructure/local/.env b/infrastructure/local/.env
index 247f06a6f3..9a9894cd73 100644
--- a/infrastructure/local/.env
+++ b/infrastructure/local/.env
@@ -1,4 +1,4 @@
-PRISM_AGENT_VERSION=1.9.2
+PRISM_AGENT_VERSION=1.12.0
PRISM_NODE_VERSION=2.2.1
PORT=80
NETWORK=prism
diff --git a/infrastructure/local/update_env.sh b/infrastructure/local/update_env.sh
index e8e695ed80..50a308f4b1 100755
--- a/infrastructure/local/update_env.sh
+++ b/infrastructure/local/update_env.sh
@@ -5,10 +5,8 @@ ENV_FILE="${SCRIPT_DIR}/.env"
pip install ${SCRIPT_DIR}/../utils/python/github-helpers > /dev/null 2>&1
-MERCURY_MEDIATOR_VERSION=$(github get-latest-package-version --package mercury-mediator --package-type container)
IRIS_SERVICE_VERSION=$(github get-latest-package-version --package iris-service --package-type container)
PRISM_AGENT_VERSION=$(github get-latest-package-version --package prism-agent --package-type container)
-sed -i.bak "s/MERCURY_MEDIATOR_VERSION=.*/MERCURY_MEDIATOR_VERSION=${MERCURY_MEDIATOR_VERSION}/" ${ENV_FILE} && rm -f ${ENV_FILE}.bak
sed -i.bak "s/IRIS_SERVICE_VERSION=.*/IRIS_SERVICE_VERSION=${IRIS_SERVICE_VERSION}/" ${ENV_FILE} && rm -f ${ENV_FILE}.bak
sed -i.bak "s/PRISM_AGENT_VERSION=.*/PRISM_AGENT_VERSION=${PRISM_AGENT_VERSION}/" ${ENV_FILE} && rm -f ${ENV_FILE}.bak
diff --git a/infrastructure/shared/apisix/conf/apisix.yaml b/infrastructure/shared/apisix/conf/apisix.yaml
index f291be8771..6d715ca1ca 100644
--- a/infrastructure/shared/apisix/conf/apisix.yaml
+++ b/infrastructure/shared/apisix/conf/apisix.yaml
@@ -1,16 +1,5 @@
plugins:
- name: proxy-rewrite
- - name: key-auth
-
-consumers:
- - username: default
- plugins:
- key-auth:
- key: "default"
- - username: default2
- plugins:
- key-auth:
- key: "default2"
routes:
- uri: /prism-agent/*
@@ -18,13 +7,11 @@ routes:
plugins:
proxy-rewrite:
regex_uri: ["^/prism-agent/(.*)", "/$1"]
-# key-auth: {}
- uri: /docs/prism-agent/api/*
upstream_id: 4
plugins:
proxy-rewrite:
regex_uri: ["^/docs/prism-agent/api/(.*)", "/docs/$1"]
-# key-auth: {}
- uri: /didcomm*
upstream_id: 3
plugins:
diff --git a/infrastructure/shared/docker-compose-db.yml b/infrastructure/shared/docker-compose-db.yml
deleted file mode 100644
index 1c5929fa11..0000000000
--- a/infrastructure/shared/docker-compose-db.yml
+++ /dev/null
@@ -1,28 +0,0 @@
----
-version: "3.8"
-
-services:
- ##########################
- # Database
- ##########################
- db:
- image: postgres:13
- environment:
- POSTGRES_MULTIPLE_DATABASES: "castor,pollux,connect,iris,agent,node_db"
- POSTGRES_USER: postgres
- POSTGRES_PASSWORD: postgres
- volumes:
- - pg_data_db:/var/lib/postgresql/data
- - ./postgres/init-script.sh:/docker-entrypoint-initdb.d/init-script.sh
- - ./postgres/max_conns.sql:/docker-entrypoint-initdb.d/max_conns.sql
- ports:
- - "5433:5432"
-
- healthcheck:
- test: ["CMD", "pg_isready", "-U", "postgres", "-d", "iris"]
- interval: 10s
- timeout: 5s
- retries: 5
-
-volumes:
- pg_data_db:
diff --git a/infrastructure/shared/docker-compose-demo.yml b/infrastructure/shared/docker-compose-demo.yml
new file mode 100644
index 0000000000..fb52b5125a
--- /dev/null
+++ b/infrastructure/shared/docker-compose-demo.yml
@@ -0,0 +1,77 @@
+---
+version: "3.8"
+
+services:
+
+ db:
+ image: postgres:13
+ environment:
+ POSTGRES_MULTIPLE_DATABASES: "castor,pollux,connect,iris,agent,node_db"
+ POSTGRES_USER: postgres
+ POSTGRES_PASSWORD: postgres
+ volumes:
+ - pg_data_db:/var/lib/postgresql/data
+ - ./postgres/init-script.sh:/docker-entrypoint-initdb.d/init-script.sh
+ - ./postgres/max_conns.sql:/docker-entrypoint-initdb.d/max_conns.sql
+ healthcheck:
+ test: ["CMD", "pg_isready", "-U", "postgres", "-d", "iris"]
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+ prism-node:
+ image: ghcr.io/input-output-hk/prism-node:${PRISM_NODE_VERSION}
+ environment:
+ NODE_PSQL_HOST: db:5432
+ depends_on:
+ db:
+ condition: service_healthy
+
+ prism-agent:
+ image: ghcr.io/input-output-hk/prism-agent:${PRISM_AGENT_VERSION}
+ environment:
+ DIDCOMM_SERVICE_URL: http://host.docker.internal:${PORT}/didcomm
+ PRISM_NODE_HOST: prism-node
+ PRISM_NODE_PORT: 50053
+ SECRET_STORAGE_BACKEND: postgres
+ DEV_MODE: true
+ CASTOR_DB_HOST: db
+ POLLUX_DB_HOST: db
+ CONNECT_DB_HOST: db
+ AGENT_DB_HOST: db
+ WALLET_SEED:
+ WEBHOOK_URL:
+ WEBHOOK_API_KEY:
+ depends_on:
+ db:
+ condition: service_healthy
+ prism-node:
+ condition: service_started
+ healthcheck:
+ test: ["CMD", "curl", "-f", "http://prism-agent:8085/connections"]
+ interval: 30s
+ timeout: 10s
+ retries: 5
+ extra_hosts:
+ - "host.docker.internal:host-gateway"
+
+ swagger-ui:
+ image: swaggerapi/swagger-ui:v5.4.2
+ environment:
+ - 'URLS=[
+ { name: "Prism Agent", url: "/docs/prism-agent/api/docs.yaml" }
+ ]'
+
+ apisix:
+ image: apache/apisix:2.15.0-alpine
+ volumes:
+ - ./apisix/conf/apisix.yaml:/usr/local/apisix/conf/apisix.yaml:ro
+ - ./apisix/conf/config.yaml:/usr/local/apisix/conf/config.yaml:ro
+ ports:
+ - "${PORT}:9080/tcp"
+ depends_on:
+ - prism-agent
+ - swagger-ui
+
+volumes:
+ pg_data_db:
diff --git a/infrastructure/shared/docker-compose.yml b/infrastructure/shared/docker-compose.yml
index c7a2b0ed20..1d6d89b44c 100644
--- a/infrastructure/shared/docker-compose.yml
+++ b/infrastructure/shared/docker-compose.yml
@@ -15,8 +15,8 @@ services:
- pg_data_db:/var/lib/postgresql/data
- ./postgres/init-script.sh:/docker-entrypoint-initdb.d/init-script.sh
- ./postgres/max_conns.sql:/docker-entrypoint-initdb.d/max_conns.sql
-# ports:
-# - "5432:5432"
+ # ports:
+ # - "5432:5432"
healthcheck:
test: ["CMD", "pg_isready", "-U", "postgres", "-d", "iris"]
interval: 10s
@@ -121,8 +121,7 @@ services:
image: swaggerapi/swagger-ui:v5.1.0
environment:
- 'URLS=[
- { name: "Prism Agent", url: "/docs/prism-agent/api/docs.yaml" },
- { name: "Mediator", url: "/docs/mediator/api/openapi-spec.yaml" }
+ { name: "Prism Agent", url: "/docs/prism-agent/api/docs.yaml" }
]'
apisix:
diff --git a/mercury/README.md b/mercury/README.md
index efbb97e542..db1fb3f277 100644
--- a/mercury/README.md
+++ b/mercury/README.md
@@ -2,21 +2,13 @@
We are following the directory structure defined in [RFC 0013 - Service-Oriented BB API Dependency Management](https://input-output.atlassian.net/wiki/spaces/ATB/pages/3534848001/RFC+0013+-+Service-Oriented+BB+API+Dependency+Management).
-> Note: The API folder has been moved into the `mercury-mediator` folder which does not conform with the published RFC - however - this change is required to ensure the CI process detects commits related to API changes and publishes the runnable image containing the API spec.
+**NOTE** - The `Mediator` development is part of the Mercury BB and is being implemented in a separate repository [atala-prism-mediator](https://github.com/input-output-hk/atala-prism-mediator).
**Folders:**
- `mercury-library`:
Is our project implementation of the DID Comm and DID Comm protocols.
-- `mercury-cloud-agent`:
- An implementation of a DID Comm Agent on the cloud.
-
-- `mercury-mediator`:
- Is our project implementation of the DID Comm mediator agent.
-
- See [Mercury Mediator](./mercury-mediator/Mercury-Mailbox-Mediator.md)
-
- `roots-id-mediator`:
Contains a configuration setup and utilities script to test interoperability against ROOTS-ID's mediator.
diff --git a/mercury/mercury-cloud-agent/src/main/.gitkeep b/mercury/mercury-cloud-agent/src/main/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/mercury/mercury-library/QuickStart.md b/mercury/mercury-library/QuickStart.md
index f57b3964c7..0d0193d47f 100644
--- a/mercury/mercury-library/QuickStart.md
+++ b/mercury/mercury-library/QuickStart.md
@@ -6,7 +6,6 @@ If you don't have [sbt](https://www.scala-sbt.org) installed already, you can us
./sbtx -h # shows an usage of a wrapper script
./sbtx compile # build the project
./sbtx test # run the tests
-./sbtx mediator/run # run the application (Main)
./sbtx agents/run # run example of encrypt / decrypt messages
```
diff --git a/mercury/mercury-library/README.md b/mercury/mercury-library/README.md
index 890a83fe6e..dcf6bf508e 100644
--- a/mercury/mercury-library/README.md
+++ b/mercury/mercury-library/README.md
@@ -2,7 +2,7 @@
## Index
-- [Mediator (Mailbox)](./mediator/Mercury-Mailbox-Mediator.md)
+- [Mediator (Mailbox)](./Mercury-Mailbox-Mediator.md)
- Protocols:
- [Invitation-Protocol](./protocol-invitation/Invitation-Protocol.md)
- [Mercury-Mailbox-Protocol](./protocol-mercury-mailbox/Mercury-Mailbox-Protocol.md)
@@ -17,8 +17,10 @@ Dependencies:
```mermaid
flowchart BT
- models %%[mercury-data-models]
- resolver %%[mercury-resolver]
+ models
+ %%[mercury-data-models]
+ resolver
+ %%[mercury-resolver]
invitation[protocol-invitation]
mailbox[protocol-mercury-mailbox]
routing[mercury-protocol-routing-2_0]
@@ -47,7 +49,6 @@ flowchart BT
subgraph DID agents
alice
bob
- mediator
agent-cli-didcommx
end
@@ -64,13 +65,10 @@ flowchart BT
alice --> agent-didcommx
bob --> agent-didcommx
- mediator -.->|server| mailbox
- mediator --> agent-didcommx
- %%mediator --> resolver
- mediator -.-> http
agent ---> models
- agent -..-> routing %% invitation
+ agent -..-> routing
+ %% invitation
agent-didcommx --> agent
@@ -91,12 +89,6 @@ flowchart BT
## Quick Reference Guide
```shell
-# Mailbox Mediator (zhttp)
-sbt "mediator/runMain io.iohk.atala.mercury.mediator.ZhttpMediator"
-
-# Mailbox Mediator (akka)
-sbt "mediator/runMain io.iohk.atala.mercury.mediator.Mediator"
-
# Alice Agent (send messagem to Bob's Mediator)
sbt "agentDidcommx/runMain io.iohk.atala.AgentClientAlice"
diff --git a/mercury/mercury-library/models/src/main/scala/io/iohk/atala/mercury/model/AttachmentDescriptor.scala b/mercury/mercury-library/models/src/main/scala/io/iohk/atala/mercury/model/AttachmentDescriptor.scala
index 75bb99a202..62f261d3da 100644
--- a/mercury/mercury-library/models/src/main/scala/io/iohk/atala/mercury/model/AttachmentDescriptor.scala
+++ b/mercury/mercury-library/models/src/main/scala/io/iohk/atala/mercury/model/AttachmentDescriptor.scala
@@ -123,7 +123,7 @@ object AttachmentDescriptor {
given attachmentDescriptorEncoderV1: Encoder[AttachmentDescriptor] = (a: AttachmentDescriptor) => {
Json.obj(
"@id" -> a.id.asJson,
- "mime-type" -> a.media_type.asJson,
+ "mime_type" -> a.media_type.asJson,
"data" -> a.data.asJson
)
}
diff --git a/mercury/mercury-library/protocol-issue-credential/src/main/scala/io/iohk/atala/mercury/protocol/issuecredential/Credential.scala b/mercury/mercury-library/protocol-issue-credential/src/main/scala/io/iohk/atala/mercury/protocol/issuecredential/Credential.scala
index 766a166312..fc505a85fb 100644
--- a/mercury/mercury-library/protocol-issue-credential/src/main/scala/io/iohk/atala/mercury/protocol/issuecredential/Credential.scala
+++ b/mercury/mercury-library/protocol-issue-credential/src/main/scala/io/iohk/atala/mercury/protocol/issuecredential/Credential.scala
@@ -1,7 +1,11 @@
package io.iohk.atala.mercury.protocol.issuecredential
import io.circe.generic.semiauto.*
import io.circe.{Decoder, Encoder}
-final case class Attribute(name: String, value: String, mimeType: Option[String] = None)
+final case class Attribute(
+ name: String,
+ value: String,
+ mime_type: Option[String] = None,
+)
object Attribute {
given Encoder[Attribute] = deriveEncoder[Attribute]
given Decoder[Attribute] = deriveDecoder[Attribute]
diff --git a/mercury/mercury-mediator/CHANGELOG.md b/mercury/mercury-mediator/CHANGELOG.md
deleted file mode 100644
index 712c47d312..0000000000
--- a/mercury/mercury-mediator/CHANGELOG.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# [mercury-mediator-v0.3.0](https://github.com/input-output-hk/atala-prism-building-blocks/compare/mercury-mediator-v0.2.0...mercury-mediator-v0.3.0) (2023-03-14)
-
-
-### Features
-
-* **mercury-mediator:** Update to Mercury 0.12.0; Fix code ([#257](https://github.com/input-output-hk/atala-prism-building-blocks/issues/257)) ([e990a92](https://github.com/input-output-hk/atala-prism-building-blocks/commit/e990a92a377e92925486f525a7c7ea977fe2797a))
-
-# [mercury-mediator-v0.2.0](https://github.com/input-output-hk/atala-prism-building-blocks/compare/mercury-mediator-v0.1.0...mercury-mediator-v0.2.0) (2022-11-23)
-
-
-### Features
-
-* **pollux:** implement Issue Credential v2 Protocol ([#144](https://github.com/input-output-hk/atala-prism-building-blocks/issues/144)) ([a80702f](https://github.com/input-output-hk/atala-prism-building-blocks/commit/a80702f5b255d8079085a6ec27c87baa6a23ac59)), closes [#92](https://github.com/input-output-hk/atala-prism-building-blocks/issues/92)
-
-# [mercury-mediator-v0.1.0](https://github.com/input-output-hk/atala-prism-building-blocks/compare/mercury-mediator-v0.0.1...mercury-mediator-v0.1.0) (2022-11-11)
-
-
-### Features
-
-* **mercury:** Bump Mercury version in Mediator ([#110](https://github.com/input-output-hk/atala-prism-building-blocks/issues/110)) ([3fd370a](https://github.com/input-output-hk/atala-prism-building-blocks/commit/3fd370a7f039b76a23f52bebeb57d5d0de94ea28))
-* **mercury:** Fix project mercury-mediator ATL-2030 ([#84](https://github.com/input-output-hk/atala-prism-building-blocks/issues/84)) ([1450c30](https://github.com/input-output-hk/atala-prism-building-blocks/commit/1450c30f8f23ec87cd868dbf41e71213e0b4dfbe))
-* **mercury:** Split Mercury projects ([#73](https://github.com/input-output-hk/atala-prism-building-blocks/issues/73)) ([e88ecd3](https://github.com/input-output-hk/atala-prism-building-blocks/commit/e88ecd3e22649e10f338037b0f3fc2e80a3acb68))
diff --git a/mercury/mercury-mediator/Mercury-Mailbox-Mediator.md b/mercury/mercury-mediator/Mercury-Mailbox-Mediator.md
deleted file mode 100644
index ecbce99f41..0000000000
--- a/mercury/mercury-mediator/Mercury-Mailbox-Mediator.md
+++ /dev/null
@@ -1,63 +0,0 @@
-# Mercury Mailbox Mediator
-
-## Accept Invitation for Mailbox (Flow Diagram)
-
-```mermaid
-sequenceDiagram
- participant Alice
- participant Mediator
- participant DID Resolver
-
- note over Alice: Mediation client or Mediated Agent
-
- rect rgb(0, 120, 255)
- note right of Alice: Alice accepts the invitation and register for a mailbox.
- Alice->>+Mediator: Register (HTTP)
- Mediator->>+DID Resolver: Ask for Alice DID document
- DID Resolver-->>-Mediator: DID document
- note over Mediator: Confirm the identity
- Mediator-->>-Alice: Registration done
- note over Alice: Alice updates his DID document (adding serviceEndpoint)
- end
-```
-
----
-
-## Send message through the mediator (Flow Diagram)
-
-**Alice wants to send a message to Bob:**
-
-```mermaid
-sequenceDiagram
- participant Alice
- participant DID Resolver
- participant Mediator
- participant Bob
-
- note over Bob: Mediation client or Mediated Agent
-
- rect rgb(0, 120, 255)
- Alice->>+DID Resolver: Ask for Bob DID document
- DID Resolver-->>-Alice: DID document
- note over Alice: Find the serviceEndpoint of Bob
- note over Alice: Mediation Request
- Alice->>+Mediator: Forward {Message to Bob}
-
- opt Depending on the registration (config)
- Mediator->>-Bob: Notify or send the playload to Bob
- note over Mediator,Bob: This can be an Email, Webhook, Push API, WebSocket (that is already open), etc
- end
- end
-
- rect rgb(0, 120, 255)
- opt Bob read Message.
- Bob->>+Mediator: Get message
- opt If the cache is too old
- Mediator->>+DID Resolver: Get updated Bob's DID document
- DID Resolver-->>-Mediator: DID document
- end
- note over Mediator: Confirm the identity
- Mediator-->>-Bob: {Message to Bob} (the playload of the Forward Message)
- end
- end
-```
diff --git a/mercury/mercury-mediator/api/mercury-cloud-agent-openapi.yaml b/mercury/mercury-mediator/api/mercury-cloud-agent-openapi.yaml
deleted file mode 100644
index 4782c5519a..0000000000
--- a/mercury/mercury-mediator/api/mercury-cloud-agent-openapi.yaml
+++ /dev/null
@@ -1,319 +0,0 @@
----
-openapi: 3.0.0
-info:
- title: Mediator API
- description: Mediator Api.
- version: 0.1.0
-servers:
- - url: http://atala-prism.io/v1
- description: Mediator API
- - url: http://localhost:8080
- description: for local testing
-paths:
- /invitations:
- post:
- tags:
- - invitation
- summary: Create a new out of band invitation
- operationId: CreateInvitation
- requestBody:
- required: true
- content:
- application/json:
- schema:
- type: object
- properties:
- data:
- type: object
- properties:
- goal-code:
- $ref: "#/components/schemas/GoalCode"
- responses:
- "201":
- description: Invitation created
- content:
- application/json:
- schema:
- required:
- - invitation
- properties:
- invitation:
- $ref: "#/components/schemas/Invitation"
-
- /invitations/{id}:
- parameters:
- - in: path
- name: id
- required: true
- schema:
- type: integer
- delete:
- tags:
- - invitation
- summary: Delete a out-of-band invitation
- operationId: DeleteInvitation
- responses:
- "200":
- description: Invitation deleted
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/DeleteResponse"
- get:
- tags:
- - invitation
- summary: Get out-of-band invitation
- operationId: GetInvitation
- responses:
- "200":
- description: Invitation deleted
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Invitation"
- /connections:
- post:
- tags:
- - connection
- summary: Create a new connection
- operationId: CreateConnection
- requestBody:
- required: true
- content:
- application/json:
- schema:
- type: object
- properties:
- data:
- type: object
- properties:
- goal-code:
- $ref: "#/components/schemas/GoalCode"
- responses:
- "201":
- description: connection created
- content:
- application/json:
- schema:
- required:
- - connection
- properties:
- invitation:
- $ref: "#/components/schemas/CreateConnection"
-
- /connections/{id}:
- parameters:
- - in: path
- name: id
- required: true
- schema:
- type: integer
- delete:
- tags:
- - connection
- summary: Delete the connection
- operationId: DeleteConnection
- responses:
- "200":
- description: connection deleted
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/DeleteResponse"
- get:
- tags:
- - connection
- summary: Get connection details
- operationId: GetConnection
- responses:
- "200":
- description: get a connection
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Connection"
- patch:
- tags:
- - connection
- summary: update connection single field
- operationId: UpdateConnection
- responses:
- "200":
- description: update the connection
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Connection"
-
- /messages:
- post:
- tags:
- - mediator
- summary: send a message
- operationId: SendMessage
- requestBody:
- required: true
- content:
- application/json:
- schema:
- type: object
- required:
- - id
- properties:
- id:
- $ref: "#/components/schemas/ConnectionId"
- responses:
- "201":
- description: Messages retrieved
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/MessageResponse"
- default:
- description: other_status
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/GenericErrorBody"
-
- /messages/{id}:
- parameters:
- - in: path
- name: id
- required: true
- schema:
- type: integer
- get:
- tags:
- - mediator
- summary: Get messages for given connection.
- operationId: GetMessage
- responses:
- "200":
- description: Send Message Response
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/SendMessageResponse"
- default:
- description: other_status
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/GenericErrorBody"
- delete:
- tags:
- - mediator
- summary: delete a message.
- operationId: delete message
- responses:
- "200":
- description: Unregister the mediator for this Connection
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/DeleteMessageResponse"
- default:
- description: other_status
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/GenericErrorBody"
-
-components:
- schemas:
- Invitation:
- title: Out of Band Invitation
- type: object
- example:
- {
- "id": "f3375429-b116-4224-b55f-563d7ef461f1",
- "type": "https://didcomm.org/out-of-band/2.0/invitation",
- "from": "did:prism:testnet:EiCRKRZKozDBAlxpZ0UI2UylXW6AmwSdQfguo0VGeyVKKg",
- "body":
- {"goal-code": "create-connection", "accept": ["didcomm/v2"]}
- }
- CreateConnection:
- title: Create Connection
- type: object
- example:
- {
- "id": "f3375429-b116-4224-b55f-563d7ef461f1",
- "type": "https://didcomm.org/connections/2.0/create-connection",
- "from": "did:prism:testnet:EiCRKRZKozDBAlxpZ0UI2UylXW6AmwSdQfguo0VGeyVKKg",
- "body": {},
- }
- Connection:
- title: Connection
- type: object
- example:
- {
- "id": "f3375429-b116-4224-b55f-563d7ef461f1",
- "type": "https://didcomm.org/connections/2.0/create-connection",
- "from": "did:prism:testnet:EiCRKRZKozDBAlxpZ0UI2UylXW6AmwSdQfguo0VGeyVKKg",
- "body": {},
- }
- GoalCode:
- title: DIDCommV2 Out of Band Invitation Goal Code
- type: string
- example: create-connection
- ConnectionId:
- title: Connection Id
- example: "8fb9ea21-d094-4506-86b6-c7c1627d753a"
- type: string
- MessageResponse:
- type: object
- title: List message pending messages.
- properties:
- message_count:
- description: Count of messages dispatched.
- type: integer
- format: int64
- example: 10
- messages:
- description: messages dispatched.
- type: array
- items:
- type: string
- example:
- - message_1
- - message_2
- - message_3
- GetConnectionResponse:
- type: object
- title: List Connections with mediator.
- properties:
- connections:
- description: Connections with mediator.
- type: array
- items:
- type: string
- example:
- - Connection_1
- - Connection_2
- - Connection_3
- SendMessageResponse:
- type: object
- title: send message response.
- example: {}
- DeleteMessageResponse:
- type: object
- title: send message response.
- example: {}
- DeleteResponse:
- type: object
- title: delete response.
- example: {}
- Code:
- type: integer
- format: int32
- title: Code is the error code of command errors.
- GenericErrorBody:
- type: object
- properties:
- code:
- $ref: "#/components/schemas/Code"
- message:
- type: string
-
----
\ No newline at end of file
diff --git a/mercury/mercury-mediator/api/mercury-mediator-openapi.yaml b/mercury/mercury-mediator/api/mercury-mediator-openapi.yaml
deleted file mode 100644
index c270e417e2..0000000000
--- a/mercury/mercury-mediator/api/mercury-mediator-openapi.yaml
+++ /dev/null
@@ -1,133 +0,0 @@
-openapi: 3.0.3
-info:
- title: Mailbox Mediator API
- description: OpenAPI for the Mailbox Mediator
- version: 0.1.0
- contact:
- name: Core DID
- email: atala-coredid@iohk.io
-
-servers:
- - url: "https://k8s-dev.atalaprism.io/mediator/"
- - url: "http://localhost/mediator/"
-
-tags:
- - name: Mailbox Mediator
- description: OpenAPI for the Mailbox Mediator
-
-paths:
- /:
- post:
- tags:
- - Mailbox Mediator
- operationId: postMessage
- summary: DID Comm
- description: Mediator accepts DID Comm message
- requestBody:
- description: DID Comm Message
- content:
- application/didcomm-encrypted+json:
- schema:
- $ref: "#/components/schemas/EncryptedMessage"
- application/didcomm-signed+json:
- schema:
- $ref: "#/components/schemas/SignedMessage"
- required: true
- responses:
- "202":
- description: Acknowledge that the message has been received (by mediator)
- content:
- application/didcomm-encrypted+json:
- schema:
- $ref: "#/components/schemas/EncryptedMessage"
- application/didcomm-signed+json:
- schema:
- $ref: "#/components/schemas/SignedMessage"
- "405":
- description: Invalid input
-security:
- - ApiKeyAuth: []
-components:
- securitySchemes:
- ApiKeyAuth:
- type: apiKey
- in: header
- name: apikey
- schemas:
- EncryptedMessage:
- type: object
- properties:
- ciphertext:
- type: string
- format: Base64URL
- example: "KWS7gJU7TbyJlcT9dPkCw-ohNigGaHSukR9MUqFM0THbCTCNkY-g5tahBFyszlKIKXs7qOtqzYyWbPou2q77XlAeYs93IhF6NvaIjyNqYklvj-OtJt9W2Pj5CLOMdsR0C30wchGoXd6wEQZY4ttbzpxYznqPmJ0b9KW6ZP-l4_DSRYe9B-1oSWMNmqMPwluKbtguC-riy356Xbu2C9ShfWmpmjz1HyJWQhZfczuwkWWlE63g26FMskIZZd_jGpEhPFHKUXCFwbuiw_Iy3R0BIzmXXdK_w7PZMMPbaxssl2UeJmLQgCAP8j8TukxV96EKa6rGgULvlo7qibjJqsS5j03bnbxkuxwbfyu3OxwgVzFWlyHbUH6p"
- protected:
- type: string
- format: Base64URL
- example: "eyJlcGsiOnsia3R5IjoiT0tQIiwiY3J2IjoiWDI1NTE5IiwieCI6IkpIanNtSVJaQWFCMHpSR193TlhMVjJyUGdnRjAwaGRIYlc1cmo4ZzBJMjQifSwiYXB2IjoiTmNzdUFuclJmUEs2OUEtcmtaMEw5WFdVRzRqTXZOQzNaZzc0QlB6NTNQQSIsInR5cCI6ImFwcGxpY2F0aW9uL2RpZGNvbW0tZW5jcnlwdGVkK2pzb24iLCJlbmMiOiJYQzIwUCIsImFsZyI6IkVDREgtRVMrQTI1NktXIn0"
- recipients:
- type: array
- items:
- $ref: "#/components/schemas/Recipient"
- example:
- - encrypted_key: "3n1olyBR3nY7ZGAprOx-b7wYAKza6cvOYjNwVg3miTnbLwPP_FmE1A"
- header:
- kid: "did:example:bob#key-x25519-1"
- - encrypted_key: "j5eSzn3kCrIkhQAWPnEwrFPMW6hG0zF_y37gUvvc5gvlzsuNX4hXrQ"
- header:
- kid: "did:example:bob#key-x25519-2"
- - encrypted_key: "TEWlqlq-ao7Lbynf0oZYhxs7ZB39SUWBCK4qjqQqfeItfwmNyDm73A"
- header:
- kid: "did:example:bob#key-x25519-3"
- tag:
- type: string
- format: Base64URL
- example: "6ylC_iAs4JvDQzXeY6MuYQ"
- iv:
- type: string
- format: Base64URL
- example: "ESpmcyGiZpRjc5urDela21TOOTW8Wqd1"
-
- Recipient:
- type: object
- properties:
- encrypted_key:
- type: string
- format: Base64URL
- example: "3n1olyBR3nY7ZGAprOx-b7wYAKza6cvOYjNwVg3miTnbLwPP_FmE1A"
- header:
- $ref: "#/components/schemas/Header"
- example:
- encrypted_key: "3n1olyBR3nY7ZGAprOx-b7wYAKza6cvOYjNwVg3miTnbLwPP_FmE1A"
- header:
- kid: "did:example:bob#key-x25519-1"
-
- Header:
- type: object
- properties:
- kid:
- type: string
- example: did:example:bob#key-x25519-1
-
- SignedMessage:
- type: object
- properties:
- payload:
- type: string
- example: "eyJpZCI6IjEyMzQ1Njc4OTAiLCJ0eXAiOiJhcHBsaWNhdGlvbi9kaWRjb21tLXBsYWluK2pzb24iLCJ0eXBlIjoiaHR0cDovL2V4YW1wbGUuY29tL3Byb3RvY29scy9sZXRzX2RvX2x1bmNoLzEuMC9wcm9wb3NhbCIsImZyb20iOiJkaWQ6ZXhhbXBsZTphbGljZSIsInRvIjpbImRpZDpleGFtcGxlOmJvYiJdLCJjcmVhdGVkX3RpbWUiOjE1MTYyNjkwMjIsImV4cGlyZXNfdGltZSI6MTUxNjM4NTkzMSwiYm9keSI6eyJtZXNzYWdlc3BlY2lmaWNhdHRyaWJ1dGUiOiJhbmQgaXRzIHZhbHVlIn19"
- format: Base64URL
- signatures:
- $ref: "#/components/schemas/JWMSignature"
-
- JWMSignature:
- type: object
- properties:
- protected:
- type: string
- format: Base64URL
- example: "eyJ0eXAiOiJhcHBsaWNhdGlvbi9kaWRjb21tLXNpZ25lZCtqc29uIiwiYWxnIjoiRWREU0EifQ"
- signature:
- type: string
- example: "FW33NnvOHV0Ted9-F7GZbkia-vYAfBKtH4oBxbrttWAhBZ6UFJMxcGjL3lwOl4YohI3kyyd08LHPWNMgP2EVCQ"
- header:
- $ref: "#/components/schemas/Header"
diff --git a/mercury/mercury-mediator/src/main/scala/io/iohk/atala/mercury/mediator/ConnectionStorage.scala b/mercury/mercury-mediator/src/main/scala/io/iohk/atala/mercury/mediator/ConnectionStorage.scala
deleted file mode 100644
index 4aafd3a893..0000000000
--- a/mercury/mercury-mediator/src/main/scala/io/iohk/atala/mercury/mediator/ConnectionStorage.scala
+++ /dev/null
@@ -1,42 +0,0 @@
-package io.iohk.atala.mercury.mediator
-
-import zio._
-import io.iohk.atala.mercury.model.DidId
-
-enum MediationState:
- case Requested extends MediationState
- case Granted extends MediationState
- case Denied extends MediationState
-
-trait ConnectionStorage {
- def store(id: DidId, msg: MediationState): UIO[MediationState]
- def get(id: DidId): UIO[Option[MediationState]]
-}
-
-final case class InMemoryConnectionStorage(private var bd: Map[DidId, MediationState]) extends ConnectionStorage {
- def store(id: DidId, msg: MediationState): UIO[MediationState] =
- ZIO.succeed {
- bd = bd + (id -> msg)
- msg
- }
- <* ZIO.logInfo(s"InMemoryConnectionStorage: $bd")
-
- def get(id: DidId): UIO[Option[MediationState]] =
- ZIO.succeed { bd.get(id) }
-}
-
-object ConnectionStorage {
-
- val layer: ULayer[ConnectionStorage] = {
- ZLayer.succeedEnvironment(
- ZEnvironment(InMemoryConnectionStorage(Map.empty))
- )
- }
-
- def store(id: DidId, msg: MediationState): URIO[ConnectionStorage, MediationState] =
- ZIO.serviceWithZIO(_.store(id, msg))
-
- def get(id: DidId): URIO[ConnectionStorage, Option[MediationState]] =
- ZIO.serviceWithZIO(_.get(id))
-
-}
diff --git a/mercury/mercury-mediator/src/main/scala/io/iohk/atala/mercury/mediator/ErrorInfo.scala b/mercury/mercury-mediator/src/main/scala/io/iohk/atala/mercury/mediator/ErrorInfo.scala
deleted file mode 100644
index 4e4cf19414..0000000000
--- a/mercury/mercury-mediator/src/main/scala/io/iohk/atala/mercury/mediator/ErrorInfo.scala
+++ /dev/null
@@ -1,6 +0,0 @@
-package io.iohk.atala.mercury.mediator
-
-sealed trait ErrorInfo
-case class NotFound(msg: String) extends ErrorInfo
-case class BadRequest(msg: String, errors: List[String] = List.empty) extends ErrorInfo
-case class InternalServerError(msg: String) extends ErrorInfo
diff --git a/mercury/mercury-mediator/src/main/scala/io/iohk/atala/mercury/mediator/MailStorage.scala b/mercury/mercury-mediator/src/main/scala/io/iohk/atala/mercury/mediator/MailStorage.scala
deleted file mode 100644
index 2e14d54607..0000000000
--- a/mercury/mercury-mediator/src/main/scala/io/iohk/atala/mercury/mediator/MailStorage.scala
+++ /dev/null
@@ -1,65 +0,0 @@
-package io.iohk.atala.mercury.mediator
-
-import zio._
-import io.iohk.atala.mercury.model.DidId
-
-type MessageString = String //FIXME Replace with Message
-// type ZDB = MyDB //ZState[MyDB]
-
-// final case class MyDB(bd: Map[DidId, Seq[MessageString]])
-
-// object MyDB {
-
-// // val live2 = ZIO.stateful(MyDB(Map.empty))
-// val live = ZState.initial(MyDB(Map.empty))
-
-// def store(id: DidId, msg: MessageString): URIO[ZDB, Unit] =
-// // TODO like ZIO.updateState[MyDB](state => state)
-// ZIO.serviceWithZIO(_.update(unbox => {
-// val newValue = unbox.bd + (id -> (unbox.bd.getOrElse(id, Seq.empty) :+ msg))
-// println("--" * 150)
-// println(newValue.mapValues(_.size))
-// MyDB(newValue)
-// }))
-
-// def get(id: DidId): URIO[ZDB, Seq[MessageString]] =
-// ZIO.serviceWithZIO(_.get.map { unbox =>
-// println(unbox)
-// println("%" * 150)
-// println(id)
-// println(unbox.bd.get(id))
-// unbox.bd.get(id).toSeq.flatten
-// })
-
-// }
-
-//TODO Rename to MailStorage
-trait MailStorage {
- def store(id: DidId, msg: MessageString): UIO[Unit]
- def get(id: DidId): UIO[Seq[MessageString]]
-}
-
-final case class InmemoryMailStorage(private var bd: Map[DidId, Seq[MessageString]]) extends MailStorage {
- def store(id: DidId, msg: MessageString): UIO[Unit] =
- ZIO.succeed { bd = bd + (id -> (bd.getOrElse(id, Seq.empty) :+ msg)) }
- <* ZIO.logInfo("InmemoryMailStorage: " + bd.view.mapValues(_.size).toMap.toString)
-
- def get(id: DidId): UIO[Seq[MessageString]] =
- ZIO.succeed { bd.get(id).toSeq.flatten }
-}
-
-object MailStorage {
-
- val layer: ULayer[MailStorage] = {
- ZLayer.succeedEnvironment(
- ZEnvironment(InmemoryMailStorage(Map.empty))
- )
- }
-
- def store(id: DidId, msg: MessageString): URIO[MailStorage, Unit] =
- ZIO.serviceWithZIO(_.store(id, msg))
-
- def get(id: DidId): URIO[MailStorage, Seq[MessageString]] =
- ZIO.serviceWithZIO(_.get(id))
-
-}
diff --git a/mercury/mercury-mediator/src/main/scala/io/iohk/atala/mercury/mediator/MediatorProgram.scala b/mercury/mercury-mediator/src/main/scala/io/iohk/atala/mercury/mediator/MediatorProgram.scala
deleted file mode 100644
index 9987680c46..0000000000
--- a/mercury/mercury-mediator/src/main/scala/io/iohk/atala/mercury/mediator/MediatorProgram.scala
+++ /dev/null
@@ -1,157 +0,0 @@
-package io.iohk.atala.mercury.mediator
-
-import zio.*
-
-import io.iohk.atala.mercury._
-import io.iohk.atala.mercury.DidOps._
-import io.iohk.atala.mercury.model.DidId
-import io.iohk.atala.mercury.model.Message
-import io.circe.Json.*
-import io.circe.parser.*
-import io.circe.JsonObject
-import io.circe.syntax._
-import io.iohk.atala.mercury.mediator.MediationState.{Denied, Granted}
-import io.iohk.atala.mercury.protocol.coordinatemediation.{MediateDeny, MediateGrant}
-object MediatorProgram {
- val port = 8080
-
- val startLogo =
- for {
- _ <- Console.printLine("""
- | ███╗ ███╗███████╗██████╗ ██████╗██╗ ██╗██████╗ ██╗ ██╗
- | ████╗ ████║██╔════╝██╔══██╗██╔════╝██║ ██║██╔══██╗╚██╗ ██╔╝
- | ██╔████╔██║█████╗ ██████╔╝██║ ██║ ██║██████╔╝ ╚████╔╝
- | ██║╚██╔╝██║██╔══╝ ██╔══██╗██║ ██║ ██║██╔══██╗ ╚██╔╝
- | ██║ ╚═╝ ██║███████╗██║ ██║╚██████╗╚██████╔╝██║ ██║ ██║
- | ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝
- |DID Comm V2 - Mediator agent - Build by Atala (IOHK)
- |""".stripMargin)
- mediator <- ZIO.service[DidAgent]
- _ <- Console.printLine(
- s"""
- |#####################################################
- |### Starting the server at http://localhost:$port
- |### Open API docs at http://localhost:$port/docs
- |### ${mediator.id.value}
- |### Press ENTER key to exit.
- |#####################################################""".stripMargin
- )
- } yield ()
-
- def toJson(parseToJson: String): JsonObject = {
- val aaa = parse(parseToJson).getOrElse(???)
- aaa.asObject.getOrElse(???)
- }
-
- // val messages = scala.collection mutable.Map[DidId, List[String]]() // TODO must be a service
-
- // private def messageProcessing(message: org.didcommx.didcomm.message.Message): String =
-
- def program(
- jsonString: String
- ): ZIO[DidAgent & DidOps & MailStorage & ConnectionStorage, Nothing, String] = {
- ZIO.logAnnotate("request-id", java.util.UUID.randomUUID.toString()) {
- for {
- _ <- ZIO.logInfo("Received new message")
- _ <- ZIO.logTrace(jsonString)
- mediatorMessage <- unpack(jsonString).map(_.message)
-
- ret <- // messageProcessing(mediatorMessage)
- {
- // val recipient = DidId(mediatorMessage.getTo.asScala.toList.head) // FIXME unsafe
- mediatorMessage.piuri match {
- case "https://didcomm.org/routing/2.0/forward" =>
- for {
- _ <- ZIO.logInfo("Mediator Forward Message: " + mediatorMessage.toString)
- _ <- ZIO.logInfo(
- "\n*********************************************************************************************************************************\n"
- + fromJsonObject(toJson(mediatorMessage.toString)).spaces2
- + "\n********************************************************************************************************************************\n"
- )
- msg = mediatorMessage.attachments.toSeq.flatten.map(e => e.data.toString).head // FIXME Head
- // msgxx = mediatorMessage.getAttachments().get(0).getData().toJSONObject().get("json").toString() //FIXME REMOVE
- nextRecipient = DidId(
- mediatorMessage
- .body("next")
- .flatMap(e => e.asString)
- .get // TODO remove get
- )
- _ <- ZIO.log(s"Store Massage for ${nextRecipient}: " + mediatorMessage.to)
- // db <- ZIO.service[ZState[MyDB]]
- _ <- MailStorage.store(nextRecipient, msg)
- _ <- ZIO.log(s"Stored Message for '$nextRecipient'")
- } yield ("Message Forwarded")
-
- case "https://atalaprism.io/mercury/mailbox/1.0/ReadMessages" =>
- for {
- _ <- ZIO.logInfo("Mediator ReadMessages: " + mediatorMessage.toString)
- senderDID = mediatorMessage.from.get // FIXME get
- _ <- ZIO.logInfo(s"Mediator ReadMessages get Messages from: $senderDID")
- seqMsg <- MailStorage.get(senderDID)
- } yield (seqMsg.last)
-
- case "https://didcomm.org/coordinate-mediation/2.0/mediate-request" =>
- for {
- _ <- ZIO.logInfo("Mediator ReadMessages: " + mediatorMessage.toString)
- senderDID = mediatorMessage.from.get // FIXME get
- _ <- ZIO.logInfo(s"Mediator ReadMessages get Messages from: $senderDID")
- mayBeConnection <- ConnectionStorage.get(senderDID)
- _ <- ZIO.logInfo(s"$senderDID state $mayBeConnection")
- // DO some checks before we grant this logic need more thought
- grantedOrDenied <- mayBeConnection
- .map(_ => ZIO.succeed(Denied))
- .getOrElse(ConnectionStorage.store(senderDID, Granted))
- _ <- ZIO.logInfo(s"$senderDID state $grantedOrDenied")
- messagePrepared <- makeMsg(senderDID, grantedOrDenied)
- _ <- ZIO.logInfo("Message Prepared: " + messagePrepared.toString)
- encryptedMsg <- packEncrypted(messagePrepared, to = senderDID)
- _ <- ZIO.logInfo(
- "\n*********************************************************************************************************************************\n"
- + fromJsonObject(encryptedMsg.asJson).spaces2
- + "\n***************************************************************************************************************************************\n"
- )
-
- } yield (fromJsonObject(encryptedMsg.asJson).noSpaces)
- case _ =>
- ZIO.succeed("Unknown Message Type")
- }
- }
- } yield (ret)
- }
- }
-
- def makeMsg(
- to: DidId,
- messageState: MediationState
- ): ZIO[DidAgent & DidOps, Nothing, Message] = for {
- from <- ZIO.service[DidAgent].map(_.id)
- // from <- ZIO.service[DidComm].map(_.myDid)
- message = messageState match
- case Granted =>
- val body = MediateGrant.Body(routing_did = from.value)
- val mediateGrant =
- MediateGrant(
- id = java.util.UUID.randomUUID().toString,
- `type` = MediateGrant.`type`,
- body = body
- )
- Message(
- `type` = mediateGrant.`type`,
- from = Some(from),
- to = Seq(to),
- body = JsonObject("routing_did" -> from.value.asJson)
- )
- case _ =>
- val mediateDeny =
- MediateDeny(
- id = java.util.UUID.randomUUID().toString,
- `type` = MediateDeny.`type`
- )
- Message(
- `type` = mediateDeny.`type`,
- from = Some(from),
- to = Seq(to)
- )
- } yield (message)
-
-}
diff --git a/mercury/mercury-mediator/src/main/scala/io/iohk/atala/mercury/mediator/Models.scala b/mercury/mercury-mediator/src/main/scala/io/iohk/atala/mercury/mediator/Models.scala
deleted file mode 100644
index 2f368cc48f..0000000000
--- a/mercury/mercury-mediator/src/main/scala/io/iohk/atala/mercury/mediator/Models.scala
+++ /dev/null
@@ -1,20 +0,0 @@
-package io.iohk.atala.mercury.mediator
-
-case class PublicKey(
- id: String,
- `type`: String,
- controller: String,
- publicKeyBase58: String
-)
-case class MediateRequest(
- id: String,
- `@type`: String,
- invitationId: String,
- publicKey: PublicKey
-)
-case class MediateResponse(
- id: String,
- `@type`: String,
- endpoint: String,
- routing_keys: Seq[String]
-)
diff --git a/mercury/mercury-mediator/src/main/scala/io/iohk/atala/mercury/mediator/ZhttpMediator.scala b/mercury/mercury-mediator/src/main/scala/io/iohk/atala/mercury/mediator/ZhttpMediator.scala
deleted file mode 100644
index 495c8418a2..0000000000
--- a/mercury/mercury-mediator/src/main/scala/io/iohk/atala/mercury/mediator/ZhttpMediator.scala
+++ /dev/null
@@ -1,103 +0,0 @@
-package io.iohk.atala.mercury.mediator
-
-import zio._
-import zio.http._
-import zio.http.model._
-
-import io.iohk.atala.mercury._
-import io.iohk.atala.mercury.resolvers.MediatorDidComm
-import scala.io.Source
-import java.util.Base64
-
-/** sbt "mediator/runMain io.iohk.atala.mercury.mediator.ZhttpMediator" */
-object ZhttpMediator extends ZIOAppDefault {
- val header = "content-type" -> MediaTypes.contentTypeEncrypted
-
- // Create HTTP route
- val app: HttpApp[DidAgent & DidOps & MailStorage & ConnectionStorage, Throwable] = Http.collectZIO[Request] {
- case req @ Method.POST -> !! if req.headersAsList.exists(h => (h.key == header._1) && h.value == header._2) =>
- req.body.asString
- .flatMap(data => MediatorProgram.program(data))
- .map(str => Response.text(str))
- case Method.GET -> !! / "api" / "openapi-spec.yaml" =>
- ZIO.succeed(
- Response.text(
- Source.fromResource("mercury-mediator-openapi.yaml").iter.mkString
- )
- )
- case req @ Method.GET -> !! / "oob_url" =>
- val serverUrl = s"http://locahost:${MediatorProgram.port}?_oob="
- InvitationPrograms.createInvitationV2().map(oob => Response.text(serverUrl + oob))
-
- case req @ Method.GET -> !! / "peer" / keyAgreementBase64 / keyAuthenticationBase64 / endpointBase64 => // REMOVE For debug purpose
- import io.iohk.atala.mercury.PeerDID
- import com.nimbusds.jose.jwk.OctetKeyPair
-
- // REMOVE Example for debug purpose
- // val keyAgreement = OctetKeyPair.parse("""{"kty":"OKP","d":"_4e_7Xn6TWV9ic_Fo187hGgsDi566sTbfI3yj167Gqc","crv":"X25519","x":"KQ-H8O6zyAtakmN1yc-Dztjy9RLhXNHHbyjoscsh_lQ"}""")
- // "eyJrdHkiOiJPS1AiLCJkIjoiXzRlXzdYbjZUV1Y5aWNfRm8xODdoR2dzRGk1NjZzVGJmSTN5ajE2N0dxYyIsImNydiI6IlgyNTUxOSIsIngiOiJLUS1IOE82enlBdGFrbU4xeWMtRHp0ank5UkxoWE5ISGJ5am9zY3NoX2xRIn0="
- // val keyAuthentication = OctetKeyPair.parse("""{"kty":"OKP","d":"ctDfZA_duF92Ypx3xsZgv2yCUdusd-3oy-9pBkp5Rgk","crv":"Ed25519","x":"Zjkryaft13epwbriH7TrJpgl3Y1vB1Gibnv2WqDskZk"}""")
- // "eyJrdHkiOiJPS1AiLCJkIjoiY3REZlpBX2R1RjkyWXB4M3hzWmd2MnlDVWR1c2QtM295LTlwQmtwNVJnayIsImNydiI6IkVkMjU1MTkiLCJ4IjoiWmprcnlhZnQxM2Vwd2JyaUg3VHJKcGdsM1kxdkIxR2libnYyV3FEc2taayJ9"
- // val endpoint = "http://localhost:9999"
- // aHR0cDovL2xvY2FsaG9zdDo5OTk5
-
- val keyAgreement = OctetKeyPair.parse(
- String(
- Base64
- .getUrlDecoder()
- .decode(keyAgreementBase64)
- )
- )
- val keyAuthentication = OctetKeyPair.parse(
- String(
- Base64
- .getUrlDecoder()
- .decode(keyAuthenticationBase64)
- )
- )
-
- val agentDID = for {
- peer <- ZIO.succeed(
- PeerDID.makePeerDid(
- jwkForKeyAgreement = keyAgreement,
- jwkForKeyAuthentication = keyAuthentication,
- serviceEndpoint = Some(
- String(
- Base64
- .getUrlDecoder()
- .decode(endpointBase64)
- )
- )
- )
- )
- _ <- Console.printLine(s"New PEER DID: ${peer.did}") *>
- Console.printLine(s"JWK for KeyAgreement: ${peer.jwkForKeyAgreement.toJSONString}") *>
- Console.printLine(s"JWK for KeyAuthentication: ${peer.jwkForKeyAuthentication.toJSONString}")
- ret <- ZIO.succeed(Response.text(peer.did.value.toString))
- } yield (ret)
- agentDID
-
- case req @ Method.GET -> !! / "resolve" / did => // REMOVE For debug purpose
- import org.didcommx.peerdid.VerificationMaterialFormatPeerDID
- def getDIDDocument = org.didcommx.peerdid.PeerDIDResolver
- .resolvePeerDID(did, VerificationMaterialFormatPeerDID.JWK)
- ZIO.succeed(Response.text(getDIDDocument))
-
- case req =>
- ZIO.succeed(
- Response.text(
- s"The request must be a POST to root with the Header $header"
- )
- )
- }
-
- val server = {
- val config = ServerConfig(address = new java.net.InetSocketAddress(8080))
- ServerConfig.live(config)(using Trace.empty) >>> Server.live
- }
-
- override val run = { MediatorProgram.startLogo *> Server.serve(app) }
- .provide(
- server ++ MediatorDidComm.peerDidMediator ++ DidCommX.liveLayer ++ MailStorage.layer ++ ConnectionStorage.layer
- )
-}
diff --git a/mercury/mercury-mediator/src/main/scala/io/iohk/atala/mercury/resolvers/MediatorDidComm.scala b/mercury/mercury-mediator/src/main/scala/io/iohk/atala/mercury/resolvers/MediatorDidComm.scala
deleted file mode 100644
index d5b09fb065..0000000000
--- a/mercury/mercury-mediator/src/main/scala/io/iohk/atala/mercury/resolvers/MediatorDidComm.scala
+++ /dev/null
@@ -1,17 +0,0 @@
-package io.iohk.atala.mercury.resolvers
-
-import zio._
-import io.iohk.atala.mercury._
-
-object MediatorDidComm {
-
- /** This genereate a new Agent with new keys each time it start.
- *
- * The identity of mediator will need to be static. TODO
- */
- val peerDidMediator: ZLayer[Any, Nothing, DidAgent] =
- AgentPeerService.makeLayer(
- PeerDidMediatorSecretResolver.peer
- )
-
-}
diff --git a/mercury/mercury-mediator/src/main/scala/io/iohk/atala/mercury/resolvers/MediatorSecretResolver.scala b/mercury/mercury-mediator/src/main/scala/io/iohk/atala/mercury/resolvers/MediatorSecretResolver.scala
deleted file mode 100644
index fbeb16e5f4..0000000000
--- a/mercury/mercury-mediator/src/main/scala/io/iohk/atala/mercury/resolvers/MediatorSecretResolver.scala
+++ /dev/null
@@ -1,67 +0,0 @@
-// package io.iohk.atala.mercury.resolvers
-
-// import org.didcommx.didcomm.common.{VerificationMaterial, VerificationMaterialFormat, VerificationMethodType}
-// import org.didcommx.didcomm.secret.{Secret, SecretResolverInMemory}
-// import scala.jdk.CollectionConverters._
-
-// object MediatorSecretResolver {
-// val jwkKey1 =
-// """{
-// | "kty":"EC",
-// | "d":"N3Hm1LXA210YVGGsXw_GklMwcLu_bMgnzDese6YQIyA",
-// | "crv":"secp256k1",
-// | "x":"aToW5EaTq5mlAf8C5ECYDSkqsJycrW-e1SQ6_GJcAOk",
-// | "y":"JAGX94caA21WKreXwYUaOCYTBMrqaX4KWIlsQZTHWCk"
-// |}""".stripMargin
-
-// val jwkKey2 =
-// """{
-// | "kty":"OKP",
-// | "d":"b9NnuOCB0hm7YGNvaE9DMhwH_wjZA1-gWD6dA0JWdL0",
-// | "crv":"X25519",
-// | "x":"GDTrI66K0pFfO54tlCSvfjjNapIs44dzpneBgyx0S3E"
-// |}""".stripMargin
-
-// val jwkKey3 =
-// """{
-// | "kty":"OKP",
-// | "d":"p-vteoF1gopny1HXywt76xz_uC83UUmrgszsI-ThBKk",
-// | "crv":"X25519",
-// | "x":"UT9S3F5ep16KSNBBShU2wh3qSfqYjlasZimn0mB8_VM"
-// |}""".stripMargin
-
-// val secretKey1 = new Secret(
-// "did:example:mediator#key-3",
-// VerificationMethodType.JSON_WEB_KEY_2020,
-// new VerificationMaterial(
-// VerificationMaterialFormat.JWK,
-// jwkKey1
-// )
-// )
-// val secretKeyAgreement1 = new Secret(
-// "did:example:mediator#key-agreement-1",
-// VerificationMethodType.JSON_WEB_KEY_2020,
-// new VerificationMaterial(
-// VerificationMaterialFormat.JWK,
-// jwkKey2
-// )
-// )
-
-// val secretKeyAgreement2 = new Secret(
-// "did:example:mediator#key-agreement-2",
-// VerificationMethodType.JSON_WEB_KEY_2020,
-// new VerificationMaterial(
-// VerificationMaterialFormat.JWK,
-// jwkKey3
-// )
-// )
-
-// val secretResolver = new SecretResolverInMemory(
-// Map(
-// "did:example:mediator#key-3" -> secretKey1,
-// "did:example:mediator#key-agreement-1" -> secretKeyAgreement1,
-// "did:example:mediator#key-agreement-2" -> secretKeyAgreement2
-// ).asJava
-// )
-
-// }
diff --git a/mercury/mercury-mediator/src/main/scala/io/iohk/atala/mercury/resolvers/PeerDidMediatorSecretResolver.scala b/mercury/mercury-mediator/src/main/scala/io/iohk/atala/mercury/resolvers/PeerDidMediatorSecretResolver.scala
deleted file mode 100644
index a6a13c4245..0000000000
--- a/mercury/mercury-mediator/src/main/scala/io/iohk/atala/mercury/resolvers/PeerDidMediatorSecretResolver.scala
+++ /dev/null
@@ -1,9 +0,0 @@
-package io.iohk.atala.mercury.resolvers
-
-import io.iohk.atala.mercury.PeerDID
-
-object PeerDidMediatorSecretResolver {
-
- val peer = PeerDID.makePeerDid()
-
-}
diff --git a/package-lock.json b/package-lock.json
index b2d436a631..d1bce97f47 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "atala-prism-building-blocks",
- "version": "1.11.0",
+ "version": "1.12.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "atala-prism-building-blocks",
- "version": "1.11.0",
+ "version": "1.12.0",
"devDependencies": {
"@commitlint/cli": "^17.0.3",
"@commitlint/config-conventional": "^17.0.3",
@@ -221,13 +221,13 @@
}
},
"node_modules/@commitlint/is-ignored": {
- "version": "17.4.4",
- "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.4.4.tgz",
- "integrity": "sha512-Y3eo1SFJ2JQDik4rWkBC4tlRIxlXEFrRWxcyrzb1PUT2k3kZ/XGNuCDfk/u0bU2/yS0tOA/mTjFsV+C4qyACHw==",
+ "version": "17.7.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.7.0.tgz",
+ "integrity": "sha512-043rA7m45tyEfW7Zv2vZHF++176MLHH9h70fnPoYlB1slKBeKl8BwNIlnPg4xBdRBVNPaCqvXxWswx2GR4c9Hw==",
"dev": true,
"dependencies": {
"@commitlint/types": "^17.4.4",
- "semver": "7.3.8"
+ "semver": "7.5.4"
},
"engines": {
"node": ">=v14"
@@ -1347,9 +1347,9 @@
}
},
"node_modules/conventional-changelog-writer/node_modules/semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
"bin": {
"semver": "bin/semver.js"
@@ -6379,9 +6379,9 @@
}
},
"node_modules/read-pkg/node_modules/semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true,
"bin": {
"semver": "bin/semver"
@@ -6738,9 +6738,9 @@
}
},
"node_modules/semver": {
- "version": "7.3.8",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
- "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
"dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
@@ -6765,9 +6765,9 @@
}
},
"node_modules/semver-diff/node_modules/semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
"bin": {
"semver": "bin/semver.js"
diff --git a/package.json b/package.json
index 80a8c75367..1793031a0b 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "atala-prism-building-blocks",
- "version": "1.11.0",
+ "version": "1.12.0",
"engines": {
"node": ">=16.13.0"
},
diff --git a/pollux/lib/anoncreds/native-lib/NATIVE/linux-aarch64/libuniffi_anoncreds.so b/pollux/lib/anoncreds/native-lib/NATIVE/linux-aarch64/libuniffi_anoncreds.so
new file mode 100755
index 0000000000..b920db327d
Binary files /dev/null and b/pollux/lib/anoncreds/native-lib/NATIVE/linux-aarch64/libuniffi_anoncreds.so differ
diff --git a/pollux/lib/anoncreds/native-lib/NATIVE/linux/amd64/libuniffi_anoncreds.so b/pollux/lib/anoncreds/native-lib/NATIVE/linux-x86-64/libuniffi_anoncreds.so
similarity index 61%
rename from pollux/lib/anoncreds/native-lib/NATIVE/linux/amd64/libuniffi_anoncreds.so
rename to pollux/lib/anoncreds/native-lib/NATIVE/linux-x86-64/libuniffi_anoncreds.so
index 32266eaf51..fd23c14014 100755
Binary files a/pollux/lib/anoncreds/native-lib/NATIVE/linux/amd64/libuniffi_anoncreds.so and b/pollux/lib/anoncreds/native-lib/NATIVE/linux-x86-64/libuniffi_anoncreds.so differ
diff --git a/pollux/lib/anoncredsTest/src/test/scala/Uniffy.scala b/pollux/lib/anoncredsTest/src/test/scala/Uniffy.scala
index 8edc9e4a27..ecc8297c75 100644
--- a/pollux/lib/anoncredsTest/src/test/scala/Uniffy.scala
+++ b/pollux/lib/anoncredsTest/src/test/scala/Uniffy.scala
@@ -1,4 +1,4 @@
-import uniffi.anoncreds._
+import uniffi.anoncreds.*
import uniffi.anoncreds.CredentialDefinition
object Uniffy extends App {
val prover = new Prover()
diff --git a/pollux/lib/anoncredsTest/src/test/scala/io/iohk/atala/pollux/anoncreds/PoCNewLib.scala b/pollux/lib/anoncredsTest/src/test/scala/io/iohk/atala/pollux/anoncreds/PoCNewLib.scala
index 16dc4b46e3..d12e6ad6c0 100644
--- a/pollux/lib/anoncredsTest/src/test/scala/io/iohk/atala/pollux/anoncreds/PoCNewLib.scala
+++ b/pollux/lib/anoncredsTest/src/test/scala/io/iohk/atala/pollux/anoncreds/PoCNewLib.scala
@@ -1,6 +1,7 @@
package io.iohk.atala.pollux.anoncreds
import org.scalatest.flatspec.AnyFlatSpec
+
import scala.jdk.CollectionConverters.*
/** polluxAnoncredsTest/Test/testOnly io.iohk.atala.pollux.anoncreds.PoCNewLib
diff --git a/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/model/error/CredentialSchemaError.scala b/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/model/error/CredentialSchemaError.scala
index b1557c3503..ac7cd1f1bf 100644
--- a/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/model/error/CredentialSchemaError.scala
+++ b/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/model/error/CredentialSchemaError.scala
@@ -3,15 +3,15 @@ package io.iohk.atala.pollux.core.model.error
import io.iohk.atala.pollux.core.model.schema.validator.JsonSchemaError
sealed trait CredentialSchemaError {
- def userMessage: String
+ def message: String
}
object CredentialSchemaError {
case class SchemaError(schemaError: JsonSchemaError) extends CredentialSchemaError {
- def userMessage: String = schemaError.error
+ def message: String = schemaError.error
}
- case class URISyntaxError(userMessage: String) extends CredentialSchemaError
- case class CredentialSchemaParsingError(userMessage: String) extends CredentialSchemaError
- case class UnsupportedCredentialSchemaType(userMessage: String) extends CredentialSchemaError
- case class UnexpectedError(userMessage: String) extends CredentialSchemaError
+ case class URISyntaxError(message: String) extends CredentialSchemaError
+ case class CredentialSchemaParsingError(message: String) extends CredentialSchemaError
+ case class UnsupportedCredentialSchemaType(message: String) extends CredentialSchemaError
+ case class UnexpectedError(message: String) extends CredentialSchemaError
}
diff --git a/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/model/schema/CredentialDefinition.scala b/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/model/schema/CredentialDefinition.scala
new file mode 100644
index 0000000000..554d36aab0
--- /dev/null
+++ b/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/model/schema/CredentialDefinition.scala
@@ -0,0 +1,143 @@
+package io.iohk.atala.pollux.core.model.schema
+
+import io.iohk.atala.pollux.core.model.error.CredentialSchemaError
+import io.iohk.atala.pollux.core.model.error.CredentialSchemaError.*
+import zio.*
+import zio.json.*
+
+import java.time.OffsetDateTime
+import java.time.ZoneOffset
+import java.util.UUID
+
+type Definition = zio.json.ast.Json
+type CorrectnessProof = zio.json.ast.Json
+
+/** @param guid
+ * Globally unique identifier of the CredentialDefinition object. It's calculated as a UUID from a string that
+ * contains the following fields: author, id, and version.
+ * @param id
+ * Locally unique identifier of the CredentialDefinition. It is a UUID. When the version of the credential definition
+ * changes, this `id` keeps the same value.
+ * @param name
+ * Human-readable name of the CredentialDefinition.
+ * @param description
+ * Human-readable description of the CredentialDefinition.
+ * @param version
+ * Version of the CredentialDefinition.
+ * @param author
+ * DID of the CredentialDefinition's author.
+ * @param authored
+ * Datetime stamp of the schema creation.
+ * @param tags
+ * Tags of the CredentialDefinition, used for convenient lookup.
+ * @param schemaId
+ * Schema ID that identifies the schema associated with this definition.
+ * @param definition
+ * Definition object that represents the actual definition of the credential.
+ * @param keyCorrectnessProof
+ * A proof that validates the correctness of the key within the context of the credential definition.
+ * @param signatureType
+ * Signature type used in the CredentialDefinition.
+ * @param supportRevocation
+ * Boolean flag indicating whether revocation is supported for this CredentialDefinition.
+ */
+case class CredentialDefinition(
+ guid: UUID,
+ id: UUID,
+ name: String,
+ description: String,
+ version: String,
+ author: String,
+ authored: OffsetDateTime,
+ tag: String,
+ schemaId: String,
+ definitionJsonSchemaId: String,
+ definition: Definition,
+ keyCorrectnessProofJsonSchemaId: String,
+ keyCorrectnessProof: CorrectnessProof,
+ signatureType: String,
+ supportRevocation: Boolean
+) {
+ def longId = CredentialDefinition.makeLongId(author, id, version)
+}
+
+object CredentialDefinition {
+
+ def makeLongId(author: String, id: UUID, version: String) =
+ s"$author/${id.toString}?version=${version}"
+
+ def makeGUID(author: String, id: UUID, version: String) =
+ UUID.nameUUIDFromBytes(makeLongId(author, id, version).getBytes)
+
+ def make(
+ in: Input,
+ definitionSchemaId: String,
+ definition: Definition,
+ proofSchemaId: String,
+ proof: CorrectnessProof
+ ): ZIO[Any, Nothing, CredentialDefinition] = {
+ for {
+ id <- zio.Random.nextUUID
+ cs <- make(id, in, definitionSchemaId, definition, proofSchemaId, proof)
+ } yield cs
+ }
+
+ def make(
+ id: UUID,
+ in: Input,
+ definitionSchemaId: String,
+ definition: Definition,
+ keyCorrectnessProofSchemaId: String,
+ keyCorrectnessProof: CorrectnessProof
+ ): ZIO[Any, Nothing, CredentialDefinition] = {
+ for {
+ ts <- zio.Clock.currentDateTime.map(
+ _.atZoneSameInstant(ZoneOffset.UTC).toOffsetDateTime
+ )
+ guid = makeGUID(in.author, id, in.version)
+ } yield CredentialDefinition(
+ guid = guid,
+ id = id,
+ name = in.name,
+ description = in.description,
+ version = in.version,
+ schemaId = in.schemaId,
+ author = in.author,
+ authored = in.authored.map(_.atZoneSameInstant(ZoneOffset.UTC).toOffsetDateTime).getOrElse(ts),
+ tag = in.tag,
+ definitionJsonSchemaId = definitionSchemaId,
+ definition = definition,
+ keyCorrectnessProofJsonSchemaId = keyCorrectnessProofSchemaId,
+ keyCorrectnessProof = keyCorrectnessProof,
+ signatureType = in.signatureType,
+ supportRevocation = in.supportRevocation
+ )
+ }
+
+ val defaultAgentDid = "did:prism:agent"
+
+ case class Input(
+ name: String,
+ description: String,
+ version: String,
+ authored: Option[OffsetDateTime],
+ tag: String,
+ author: String = defaultAgentDid,
+ schemaId: String,
+ signatureType: String,
+ supportRevocation: Boolean
+ )
+
+ case class Filter(
+ author: Option[String] = None,
+ name: Option[String] = None,
+ version: Option[String] = None,
+ tag: Option[String] = None
+ )
+
+ case class FilteredEntries(entries: Seq[CredentialDefinition], count: Long, totalCount: Long)
+
+ given JsonEncoder[CredentialDefinition] = DeriveJsonEncoder.gen[CredentialDefinition]
+
+ given JsonDecoder[CredentialDefinition] = DeriveJsonDecoder.gen[CredentialDefinition]
+}
diff --git a/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/model/schema/validator/SchemaSerDes.scala b/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/model/schema/validator/SchemaSerDes.scala
index 2c9717c380..bec8fc2e06 100644
--- a/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/model/schema/validator/SchemaSerDes.scala
+++ b/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/model/schema/validator/SchemaSerDes.scala
@@ -42,12 +42,12 @@ class SchemaSerDes[S](jsonSchemaSchemaStr: String) {
} yield json
}
- def validate(jsonString: String): IO[JsonSchemaError, Unit] = {
+ def validate(jsonString: String): IO[JsonSchemaError, Boolean] = {
for {
jsonSchemaSchema <- JsonSchemaUtils.jsonSchema(jsonSchemaSchemaStr)
schemaValidator = JsonSchemaValidatorImpl(jsonSchemaSchema)
_ <- schemaValidator.validate(jsonString)
- } yield {}
+ } yield true
}
}
diff --git a/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/repository/CredentialDefinitionRepository.scala b/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/repository/CredentialDefinitionRepository.scala
new file mode 100644
index 0000000000..9948aea3f5
--- /dev/null
+++ b/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/repository/CredentialDefinitionRepository.scala
@@ -0,0 +1,24 @@
+package io.iohk.atala.pollux.core.repository
+
+import io.iohk.atala.pollux.core.model.schema.CredentialDefinition
+import io.iohk.atala.pollux.core.repository.Repository.SearchCapability
+import io.iohk.atala.shared.models.WalletAccessContext
+import zio.{RIO, Task}
+
+import java.util.UUID
+
+trait CredentialDefinitionRepository
+ extends Repository[WalletTask, CredentialDefinition]
+ with SearchCapability[WalletTask, CredentialDefinition.Filter, CredentialDefinition] {
+ def create(cs: CredentialDefinition): RIO[WalletAccessContext, CredentialDefinition]
+
+ def getByGuid(guid: UUID): Task[Option[CredentialDefinition]]
+
+ def update(cs: CredentialDefinition): RIO[WalletAccessContext, Option[CredentialDefinition]]
+
+ def getAllVersions(id: UUID, author: String): RIO[WalletAccessContext, Seq[String]]
+
+ def delete(guid: UUID): RIO[WalletAccessContext, Option[CredentialDefinition]]
+
+ def deleteAll(): RIO[WalletAccessContext, Long]
+}
diff --git a/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/repository/CredentialDefinitionRepositoryInMemory.scala b/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/repository/CredentialDefinitionRepositoryInMemory.scala
new file mode 100644
index 0000000000..f3d4743f88
--- /dev/null
+++ b/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/repository/CredentialDefinitionRepositoryInMemory.scala
@@ -0,0 +1,123 @@
+package io.iohk.atala.pollux.core.repository
+
+import io.iohk.atala.pollux.core.model.*
+import io.iohk.atala.pollux.core.model.error.CredentialRepositoryError.*
+import io.iohk.atala.pollux.core.model.schema.CredentialDefinition
+import io.iohk.atala.shared.models.{WalletAccessContext, WalletId}
+import zio.*
+
+import java.util.UUID
+
+class CredentialDefinitionRepositoryInMemory(
+ walletRefs: Ref[Map[WalletId, Ref[Map[UUID, CredentialDefinition]]]]
+) extends CredentialDefinitionRepository {
+
+ private def walletStoreRef: URIO[WalletAccessContext, Ref[Map[UUID, CredentialDefinition]]] =
+ for {
+ walletId <- ZIO.serviceWith[WalletAccessContext](_.walletId)
+ refs <- walletRefs.get
+ maybeWalletRef = refs.get(walletId)
+ walletRef <- maybeWalletRef
+ .fold {
+ for {
+ ref <- Ref.make(Map.empty[UUID, CredentialDefinition])
+ _ <- walletRefs.set(refs.updated(walletId, ref))
+ } yield ref
+ }(ZIO.succeed)
+ } yield walletRef
+
+ override def create(record: CredentialDefinition): RIO[WalletAccessContext, CredentialDefinition] = {
+ for {
+ storeRef <- walletStoreRef
+ _ <- for {
+ store <- storeRef.get
+ maybeRecord = store.values.find(_.id == record.guid)
+ _ <- maybeRecord match
+ case None => ZIO.unit
+ case Some(value) => ZIO.fail(UniqueConstraintViolation("Unique Constraint Violation on 'id'"))
+ } yield ()
+ _ <- storeRef.update(r => r + (record.guid -> record))
+ } yield record
+ }
+
+ override def getByGuid(guid: UUID): Task[Option[CredentialDefinition]] = {
+ for {
+ storeRefs <- walletRefs.get
+ storeRefOption <- ZIO.filter(storeRefs.values)(storeRef => storeRef.get.map(_.contains(guid))).map(_.headOption)
+ record <- storeRefOption match {
+ case Some(storeRef) => storeRef.get.map(_.get(guid))
+ case None => ZIO.none
+ }
+ } yield record
+ }
+
+ override def update(cs: CredentialDefinition): RIO[WalletAccessContext, Option[CredentialDefinition]] = {
+ for {
+ storeRef <- walletStoreRef
+ store <- storeRef.get
+ maybeExisting = store.get(cs.id)
+ _ <- maybeExisting match {
+ case Some(existing) =>
+ val updatedStore = store.updated(cs.id, cs)
+ storeRef.set(updatedStore)
+ case None => ZIO.unit
+ }
+ } yield maybeExisting
+ }
+
+ override def getAllVersions(id: UUID, author: String): RIO[WalletAccessContext, Seq[String]] = {
+ for {
+ storeRef <- walletStoreRef
+ store <- storeRef.get
+ } yield store.values
+ .filter(credDef => credDef.id == id && credDef.author == author)
+ .map(_.version)
+ .toSeq
+ }
+
+ override def delete(guid: UUID): RIO[WalletAccessContext, Option[CredentialDefinition]] = {
+ for {
+ storeRef <- walletStoreRef
+ store <- storeRef.get
+ maybeRecord = store.get(guid)
+ _ <- maybeRecord match {
+ case Some(record) => storeRef.update(r => r - record.id)
+ case None => ZIO.unit
+ }
+ } yield maybeRecord
+ }
+
+ override def deleteAll(): RIO[WalletAccessContext, Long] = {
+ for {
+ storeRef <- walletStoreRef
+ store <- storeRef.get
+ deleted = store.size
+ _ <- storeRef.update(Map.empty)
+ } yield deleted.toLong
+ }
+
+ override def search(
+ query: Repository.SearchQuery[CredentialDefinition.Filter]
+ ): RIO[WalletAccessContext, Repository.SearchResult[CredentialDefinition]] = {
+ walletStoreRef.flatMap { storeRef =>
+ storeRef.get.map { store =>
+ val filtered = store.values.filter { credDef =>
+ query.filter.author.forall(_ == credDef.author) &&
+ query.filter.name.forall(_ == credDef.name) &&
+ query.filter.version.forall(_ == credDef.version) &&
+ query.filter.tag.forall(tag => credDef.tag == tag)
+ }
+ val paginated = filtered.slice(query.skip, query.skip + query.limit)
+ Repository.SearchResult(paginated.toSeq, paginated.size, filtered.size)
+ }
+ }
+ }
+}
+
+object CredentialDefinitionRepositoryInMemory {
+ val layer: ULayer[CredentialDefinitionRepository] = ZLayer.fromZIO(
+ Ref
+ .make(Map.empty[WalletId, Ref[Map[UUID, CredentialDefinition]]])
+ .map(CredentialDefinitionRepositoryInMemory(_))
+ )
+}
diff --git a/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/repository/CredentialSchemaRepository.scala b/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/repository/CredentialSchemaRepository.scala
index e69cd93f83..85315d0162 100644
--- a/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/repository/CredentialSchemaRepository.scala
+++ b/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/repository/CredentialSchemaRepository.scala
@@ -8,8 +8,6 @@ import zio.{RIO, Task}
import java.util.UUID
-type WalletTask[T] = RIO[WalletAccessContext, T]
-
trait CredentialSchemaRepository
extends Repository[WalletTask, CredentialSchema]
with SearchCapability[WalletTask, CredentialSchema.Filter, CredentialSchema] {
diff --git a/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/repository/repository.scala b/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/repository/repository.scala
index c8b0d63849..7b4ea2940f 100644
--- a/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/repository/repository.scala
+++ b/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/repository/repository.scala
@@ -1,7 +1,12 @@
package io.iohk.atala.pollux.core.repository
+import io.iohk.atala.shared.models.WalletAccessContext
+import zio.RIO
+
trait Repository[F[_], T]
+type WalletTask[T] = RIO[WalletAccessContext, T]
+
object Repository {
case class SearchQuery[Filter](filter: Filter, skip: Int, limit: Int)
diff --git a/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/service/CredentialDefinitionService.scala b/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/service/CredentialDefinitionService.scala
new file mode 100644
index 0000000000..d6933172b8
--- /dev/null
+++ b/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/service/CredentialDefinitionService.scala
@@ -0,0 +1,59 @@
+package io.iohk.atala.pollux.core.service
+
+import io.iohk.atala.pollux.core.model.error.CredentialSchemaError
+import io.iohk.atala.pollux.core.model.schema.CredentialDefinition
+import io.iohk.atala.pollux.core.model.schema.CredentialDefinition.*
+import io.iohk.atala.shared.models.WalletAccessContext
+import zio.{IO, ZIO}
+
+import java.util.UUID
+
+trait CredentialDefinitionService {
+ type Result[T] = ZIO[WalletAccessContext, CredentialDefinitionService.Error, T]
+
+ /** @param in
+ * CredentialDefinition form for creating the instance
+ * @return
+ * Created instance of the Credential Definition
+ */
+ def create(in: Input): Result[CredentialDefinition]
+
+ /** @param guid
+ * Globally unique UUID of the credential definition
+ * @return
+ * The instance of the credential definition or credential service error
+ */
+ def getByGUID(guid: UUID): IO[CredentialDefinitionService.Error, CredentialDefinition]
+
+ def delete(guid: UUID): Result[CredentialDefinition]
+
+ def lookup(filter: Filter, skip: Int, limit: Int): Result[FilteredEntries]
+}
+
+object CredentialDefinitionService {
+ sealed trait Error
+
+ object Error {
+ def apply(throwable: Throwable): Error = RepositoryError(throwable)
+
+ final case class RepositoryError(cause: Throwable) extends Error
+
+ final case class NotFoundError(guid: Option[UUID] = None, id: Option[UUID] = None, message: String) extends Error
+
+ object NotFoundError {
+ def byGuid(guid: UUID): NotFoundError =
+ NotFoundError(guid = Option(guid), message = s"Credential Definition record cannot be found by `guid`=$guid")
+
+ def byId(id: UUID): NotFoundError =
+ NotFoundError(id = Option(id), message = s"Credential Definition record cannot be found by `id`=$id")
+ }
+
+ final case class UpdateError(id: UUID, version: String, author: String, message: String) extends Error
+
+ final case class UnexpectedError(msg: String) extends Error
+
+ final case class CredentialDefinitionValidationError(cause: CredentialSchemaError) extends Error
+
+ final case class CredentialDefinitionCreationError(msg: String) extends Error
+ }
+}
diff --git a/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/service/CredentialDefinitionServiceImpl.scala b/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/service/CredentialDefinitionServiceImpl.scala
new file mode 100644
index 0000000000..9d90e837d3
--- /dev/null
+++ b/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/service/CredentialDefinitionServiceImpl.scala
@@ -0,0 +1,130 @@
+package io.iohk.atala.pollux.core.service
+
+import io.iohk.atala.agent.walletapi.storage
+import io.iohk.atala.agent.walletapi.storage.{DIDSecret, DIDSecretStorage}
+import io.iohk.atala.mercury.model.DidId
+import io.iohk.atala.pollux.anoncreds.{AnoncredLib, SchemaDef}
+import io.iohk.atala.pollux.core.model.error.CredentialSchemaError
+import io.iohk.atala.pollux.core.model.error.CredentialSchemaError.URISyntaxError
+import io.iohk.atala.pollux.core.model.schema.CredentialDefinition.{Filter, FilteredEntries}
+import io.iohk.atala.pollux.core.model.schema.CredentialSchema.parseCredentialSchema
+import io.iohk.atala.pollux.core.model.schema.`type`.anoncred.AnoncredSchemaSerDesV1
+import io.iohk.atala.pollux.core.model.schema.validator.JsonSchemaError
+import io.iohk.atala.pollux.core.model.schema.{CredentialDefinition, CredentialSchema}
+import io.iohk.atala.pollux.core.repository.CredentialDefinitionRepository
+import io.iohk.atala.pollux.core.repository.Repository.SearchQuery
+import io.iohk.atala.pollux.core.service.CredentialDefinitionService.Error.*
+import io.iohk.atala.pollux.core.service.serdes.{
+ PrivateCredentialDefinitionSchemaSerDesV1,
+ ProofKeyCredentialDefinitionSchemaSerDesV1,
+ PublicCredentialDefinitionSerDesV1
+}
+import zio.ZIO.getOrFailWith
+import zio.{IO, URLayer, ZIO, ZLayer}
+
+import java.net.URI
+import java.util.UUID
+import scala.util.Try
+
+class CredentialDefinitionServiceImpl(
+ didSecretStorage: DIDSecretStorage,
+ credentialDefinitionRepository: CredentialDefinitionRepository,
+ uriDereferencer: URIDereferencer
+) extends CredentialDefinitionService {
+ private val KEY_ID = "anoncred-credential-definition-private-key"
+
+ override def create(in: CredentialDefinition.Input): Result[CredentialDefinition] = {
+ for {
+ uri <- ZIO.attempt(new URI(in.schemaId))
+ content <- uriDereferencer.dereference(uri)
+ vcSchema <- parseCredentialSchema(content)
+ anoncredSchema <- AnoncredSchemaSerDesV1.schemaSerDes.deserialize(vcSchema.schema)
+ anoncredLibSchema =
+ SchemaDef(
+ in.schemaId,
+ anoncredSchema.version,
+ anoncredSchema.attrNames,
+ anoncredSchema.issuerId
+ )
+ anoncredLibCredentialDefinition <-
+ ZIO
+ .fromEither(
+ Try(
+ AnoncredLib.createCredDefinition(
+ in.author,
+ anoncredLibSchema,
+ in.tag,
+ in.supportRevocation
+ )
+ ).toEither
+ )
+ .mapError((t: Throwable) => CredentialDefinitionCreationError(t.getMessage))
+ publicCredentialDefinitionJson <-
+ PublicCredentialDefinitionSerDesV1.schemaSerDes.deserializeAsJson(
+ anoncredLibCredentialDefinition.cd.data
+ )
+ privateCredentialDefinitionJson <-
+ PrivateCredentialDefinitionSchemaSerDesV1.schemaSerDes.deserializeAsJson(
+ anoncredLibCredentialDefinition.cdPrivate.data
+ )
+ proofKeyCredentialDefinitionJson <-
+ ProofKeyCredentialDefinitionSchemaSerDesV1.schemaSerDes.deserializeAsJson(
+ anoncredLibCredentialDefinition.proofKey.data
+ )
+ cd <-
+ CredentialDefinition.make(
+ in,
+ PublicCredentialDefinitionSerDesV1.version,
+ publicCredentialDefinitionJson,
+ ProofKeyCredentialDefinitionSchemaSerDesV1.version,
+ proofKeyCredentialDefinitionJson
+ )
+ createdCredentialDefinition <- credentialDefinitionRepository.create(cd)
+ _ <-
+ didSecretStorage.insertKey(
+ DidId(in.author),
+ s"$KEY_ID/${createdCredentialDefinition.guid}",
+ DIDSecret(privateCredentialDefinitionJson, PrivateCredentialDefinitionSchemaSerDesV1.version)
+ )
+ } yield createdCredentialDefinition
+ }.mapError {
+ case e: CredentialDefinitionCreationError => e
+ case j: JsonSchemaError => UnexpectedError(j.error)
+ case s: URISyntaxError => UnexpectedError(s.message)
+ case u: URIDereferencerError => UnexpectedError(u.error)
+ case e: CredentialSchemaError => CredentialDefinitionValidationError(e)
+ case t: Throwable => RepositoryError(t)
+ }
+
+ override def delete(guid: UUID): Result[CredentialDefinition] =
+ for {
+ deleted_row_opt <- credentialDefinitionRepository
+ .delete(guid)
+ .mapError(RepositoryError.apply)
+ deleted_row <- getOrFailWith(NotFoundError.byGuid(guid))(deleted_row_opt)
+ } yield deleted_row
+
+ override def lookup(filter: CredentialDefinition.Filter, skip: Int, limit: Int): Result[FilteredEntries] = {
+ credentialDefinitionRepository
+ .search(SearchQuery(filter, skip, limit))
+ .mapError(t => RepositoryError(t))
+ .map(sr => FilteredEntries(sr.entries, sr.count.toInt, sr.totalCount.toInt))
+ }
+
+ override def getByGUID(guid: UUID): IO[CredentialDefinitionService.Error, CredentialDefinition] = {
+ credentialDefinitionRepository
+ .getByGuid(guid)
+ .mapError[CredentialDefinitionService.Error](t => RepositoryError(t))
+ .flatMap(
+ getOrFailWith(NotFoundError.byGuid(guid))(_)
+ )
+ }
+}
+
+object CredentialDefinitionServiceImpl {
+ val layer: URLayer[
+ DIDSecretStorage & CredentialDefinitionRepository & URIDereferencer,
+ CredentialDefinitionService
+ ] =
+ ZLayer.fromFunction(CredentialDefinitionServiceImpl(_, _, _))
+}
diff --git a/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/service/CredentialService.scala b/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/service/CredentialService.scala
index 354ec32eb3..bc40b036e9 100644
--- a/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/service/CredentialService.scala
+++ b/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/service/CredentialService.scala
@@ -155,7 +155,7 @@ object CredentialService {
): IO[CredentialServiceError, JsonObject] = {
for {
claims <- ZIO.foldLeft(attributes)(JsonObject()) { case (jsonObject, attr) =>
- attr.mimeType match
+ attr.mime_type match
case None =>
ZIO.succeed(jsonObject.add(attr.name, attr.value.asJson))
diff --git a/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/service/URIDereferencer.scala b/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/service/URIDereferencer.scala
index ded793c432..a53a119f51 100644
--- a/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/service/URIDereferencer.scala
+++ b/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/service/URIDereferencer.scala
@@ -8,10 +8,13 @@ trait URIDereferencer {
def dereference(uri: URI): IO[URIDereferencerError, String]
}
-sealed trait URIDereferencerError
+sealed trait URIDereferencerError {
+ def error: String
+}
object URIDereferencerError {
final case class ConnectionError(error: String) extends URIDereferencerError
- final case class ResourceNotFound(uri: URI) extends URIDereferencerError
+ final case class ResourceNotFound(uri: URI) extends URIDereferencerError:
+ override def error: String = uri.toString
final case class UnexpectedError(error: String) extends URIDereferencerError
}
diff --git a/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/service/serdes/PrivateCredentialDefinitionSchemaSerDesV1.scala b/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/service/serdes/PrivateCredentialDefinitionSchemaSerDesV1.scala
new file mode 100644
index 0000000000..6f7cadea72
--- /dev/null
+++ b/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/service/serdes/PrivateCredentialDefinitionSchemaSerDesV1.scala
@@ -0,0 +1,77 @@
+package io.iohk.atala.pollux.core.service.serdes
+
+import io.iohk.atala.pollux.core.model.schema.validator.SchemaSerDes
+import zio.*
+import zio.json.*
+
+case class CredentialDefinitionPrimaryPrivateKeyV1(p: String, q: String)
+
+case class CredentialDefinitionRevocationPrivateKeyV1(x: String, sk: String)
+
+case class PrivateCredentialDefinitionValueV1(
+ p_key: CredentialDefinitionPrimaryPrivateKeyV1,
+ r_key: Option[CredentialDefinitionRevocationPrivateKeyV1]
+)
+
+case class PrivateCredentialDefinitionSchemaSerDesV1(value: PrivateCredentialDefinitionValueV1)
+
+object PrivateCredentialDefinitionSchemaSerDesV1 {
+ val version: String = "PrivateCredentialDefinitionV1"
+ private val schema: String =
+ """
+ |{
+ | "$schema": "http://json-schema.org/draft-07/schema#",
+ | "type": "object",
+ | "properties": {
+ | "value": {
+ | "type": "object",
+ | "properties": {
+ | "p_key": {
+ | "type": "object",
+ | "properties": {
+ | "p": { "type": "string" },
+ | "q": { "type": "string" }
+ | },
+ | "required": ["p", "q"]
+ | },
+ | "r_key": {
+ | "type": ["object", "null"],
+ | "properties": {
+ | "x": { "type": "string" },
+ | "sk": { "type": "string" }
+ | },
+ | "required": ["x", "sk"]
+ | }
+ | },
+ | "required": ["p_key"]
+ | }
+ | },
+ | "required": ["value"]
+ |}
+ |
+ |""".stripMargin
+
+ val schemaSerDes: SchemaSerDes[PrivateCredentialDefinitionSchemaSerDesV1] = SchemaSerDes(schema)
+
+ given JsonEncoder[CredentialDefinitionPrimaryPrivateKeyV1] =
+ DeriveJsonEncoder.gen[CredentialDefinitionPrimaryPrivateKeyV1]
+
+ given JsonDecoder[CredentialDefinitionPrimaryPrivateKeyV1] =
+ DeriveJsonDecoder.gen[CredentialDefinitionPrimaryPrivateKeyV1]
+
+ given JsonEncoder[CredentialDefinitionRevocationPrivateKeyV1] =
+ DeriveJsonEncoder.gen[CredentialDefinitionRevocationPrivateKeyV1]
+
+ given JsonDecoder[CredentialDefinitionRevocationPrivateKeyV1] =
+ DeriveJsonDecoder.gen[CredentialDefinitionRevocationPrivateKeyV1]
+
+ given JsonEncoder[PrivateCredentialDefinitionValueV1] = DeriveJsonEncoder.gen[PrivateCredentialDefinitionValueV1]
+
+ given JsonDecoder[PrivateCredentialDefinitionValueV1] = DeriveJsonDecoder.gen[PrivateCredentialDefinitionValueV1]
+
+ given JsonEncoder[PrivateCredentialDefinitionSchemaSerDesV1] =
+ DeriveJsonEncoder.gen[PrivateCredentialDefinitionSchemaSerDesV1]
+
+ given JsonDecoder[PrivateCredentialDefinitionSchemaSerDesV1] =
+ DeriveJsonDecoder.gen[PrivateCredentialDefinitionSchemaSerDesV1]
+}
diff --git a/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/service/serdes/ProofKeyCredentialDefinitionSchemaSerDesV1.scala b/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/service/serdes/ProofKeyCredentialDefinitionSchemaSerDesV1.scala
new file mode 100644
index 0000000000..cf840d3f54
--- /dev/null
+++ b/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/service/serdes/ProofKeyCredentialDefinitionSchemaSerDesV1.scala
@@ -0,0 +1,49 @@
+package io.iohk.atala.pollux.core.service.serdes
+
+import io.iohk.atala.pollux.core.model.schema.validator.SchemaSerDes
+import zio.*
+import zio.json.*
+
+case class ProofKeyCredentialDefinitionSchemaSerDesV1(c: String, xz_cap: String, xr_cap: List[List[String]])
+
+object ProofKeyCredentialDefinitionSchemaSerDesV1 {
+ val version: String = "ProofKeyCredentialDefinitionV1"
+ private val schema: String =
+ """
+ |{
+ | "$schema": "http://json-schema.org/draft-07/schema#",
+ | "type": "object",
+ | "properties": {
+ | "c": {
+ | "type": "string"
+ | },
+ | "xz_cap": {
+ | "type": "string"
+ | },
+ | "xr_cap": {
+ | "type": "array",
+ | "items": {
+ | "type": "array",
+ | "items": {
+ | "type": "string"
+ | }
+ | }
+ | }
+ | },
+ | "required": [
+ | "c",
+ | "xz_cap",
+ | "xr_cap"
+ | ]
+ |}
+ |
+ |""".stripMargin
+
+ val schemaSerDes: SchemaSerDes[ProofKeyCredentialDefinitionSchemaSerDesV1] = SchemaSerDes(schema)
+
+ given JsonDecoder[ProofKeyCredentialDefinitionSchemaSerDesV1] =
+ DeriveJsonDecoder.gen[ProofKeyCredentialDefinitionSchemaSerDesV1]
+
+ given JsonEncoder[ProofKeyCredentialDefinitionSchemaSerDesV1] =
+ DeriveJsonEncoder.gen[ProofKeyCredentialDefinitionSchemaSerDesV1]
+}
diff --git a/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/service/serdes/PublicCredentialDefinitionSchemaSerDesV1.scala b/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/service/serdes/PublicCredentialDefinitionSchemaSerDesV1.scala
new file mode 100644
index 0000000000..98f0055459
--- /dev/null
+++ b/pollux/lib/core/src/main/scala/io/iohk/atala/pollux/core/service/serdes/PublicCredentialDefinitionSchemaSerDesV1.scala
@@ -0,0 +1,175 @@
+package io.iohk.atala.pollux.core.service.serdes
+
+import io.iohk.atala.pollux.core.model.schema.validator.SchemaSerDes
+import zio.*
+import zio.json.*
+
+case class PublicCredentialPrimaryPublicKeyV1(n: String, s: String, r: Map[String, String], rctxt: String, z: String)
+
+case class PublicCredentialRevocationKeyV1(
+ g: String,
+ g_dash: String,
+ h: String,
+ h0: String,
+ h1: String,
+ h2: String,
+ htilde: String,
+ h_cap: String,
+ u: String,
+ pk: String,
+ y: String
+)
+
+case class PublicCredentialValueV1(
+ primary: PublicCredentialPrimaryPublicKeyV1,
+ revocation: Option[PublicCredentialRevocationKeyV1]
+)
+
+case class PublicCredentialDefinitionSerDesV1(
+ schemaId: String,
+ `type`: String,
+ tag: String,
+ value: PublicCredentialValueV1
+)
+
+object PublicCredentialDefinitionSerDesV1 {
+ val version: String = "PublicCredentialDefinitionV1"
+
+ private val schema: String =
+ """
+ |{
+ | "$schema": "http://json-schema.org/draft-07/schema#",
+ | "title": "Generated schema for Root",
+ | "type": "object",
+ | "properties": {
+ | "schemaId": {
+ | "type": "string"
+ | },
+ | "type": {
+ | "type": "string"
+ | },
+ | "tag": {
+ | "type": "string"
+ | },
+ | "value": {
+ | "type": "object",
+ | "properties": {
+ | "primary": {
+ | "type": "object",
+ | "properties": {
+ | "n": {
+ | "type": "string"
+ | },
+ | "s": {
+ | "type": "string"
+ | },
+ | "r": {
+ | "type": "object",
+ | "properties": {
+ | }
+ | },
+ | "rctxt": {
+ | "type": "string"
+ | },
+ | "z": {
+ | "type": "string"
+ | }
+ | },
+ | "required": [
+ | "n",
+ | "s",
+ | "r",
+ | "rctxt",
+ | "z"
+ | ]
+ | },
+ | "revocation": {
+ | "type": "object",
+ | "properties": {
+ | "g": {
+ | "type": "string"
+ | },
+ | "g_dash": {
+ | "type": "string"
+ | },
+ | "h": {
+ | "type": "string"
+ | },
+ | "h0": {
+ | "type": "string"
+ | },
+ | "h1": {
+ | "type": "string"
+ | },
+ | "h2": {
+ | "type": "string"
+ | },
+ | "htilde": {
+ | "type": "string"
+ | },
+ | "h_cap": {
+ | "type": "string"
+ | },
+ | "u": {
+ | "type": "string"
+ | },
+ | "pk": {
+ | "type": "string"
+ | },
+ | "y": {
+ | "type": "string"
+ | }
+ | },
+ | "required": [
+ | "g",
+ | "g_dash",
+ | "h",
+ | "h0",
+ | "h1",
+ | "h2",
+ | "htilde",
+ | "h_cap",
+ | "u",
+ | "pk",
+ | "y"
+ | ]
+ | }
+ | },
+ | "required": [
+ | "primary"
+ | ]
+ | },
+ | "issuerId": {
+ | "type": "string"
+ | }
+ | },
+ | "required": [
+ | "schemaId",
+ | "type",
+ | "tag",
+ | "value",
+ | "issuerId"
+ | ]
+ |}
+ |
+ |""".stripMargin
+
+ val schemaSerDes: SchemaSerDes[PublicCredentialDefinitionSerDesV1] = SchemaSerDes(schema)
+
+ given JsonDecoder[PublicCredentialPrimaryPublicKeyV1] = DeriveJsonDecoder.gen[PublicCredentialPrimaryPublicKeyV1]
+
+ given JsonDecoder[PublicCredentialRevocationKeyV1] = DeriveJsonDecoder.gen[PublicCredentialRevocationKeyV1]
+
+ given JsonDecoder[PublicCredentialValueV1] = DeriveJsonDecoder.gen[PublicCredentialValueV1]
+
+ given JsonDecoder[PublicCredentialDefinitionSerDesV1] = DeriveJsonDecoder.gen[PublicCredentialDefinitionSerDesV1]
+
+ given JsonEncoder[PublicCredentialPrimaryPublicKeyV1] = DeriveJsonEncoder.gen[PublicCredentialPrimaryPublicKeyV1]
+
+ given JsonEncoder[PublicCredentialRevocationKeyV1] = DeriveJsonEncoder.gen[PublicCredentialRevocationKeyV1]
+
+ given JsonEncoder[PublicCredentialValueV1] = DeriveJsonEncoder.gen[PublicCredentialValueV1]
+
+ given JsonEncoder[PublicCredentialDefinitionSerDesV1] = DeriveJsonEncoder.gen[PublicCredentialDefinitionSerDesV1]
+
+}
diff --git a/pollux/lib/core/src/test/resources/anoncred-schema-example.json b/pollux/lib/core/src/test/resources/anoncred-schema-example.json
new file mode 100644
index 0000000000..bc6bea286d
--- /dev/null
+++ b/pollux/lib/core/src/test/resources/anoncred-schema-example.json
@@ -0,0 +1,28 @@
+{
+ "guid": "1631026d-5d55-3285-8ccd-bd70480cfbdc",
+ "id": "329da384-b2bb-497f-a605-4118dec75d31",
+ "longId": "did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff/329da384-b2bb-497f-a605-4118dec75d31?version=5.0.0",
+ "name": "DrivingLicense",
+ "version": "5.0.0",
+ "tags": [
+ "string"
+ ],
+ "description": "Simple credential schema for the driving licence verifiable credential.",
+ "type": "AnoncredSchemaV1",
+ "schema": {
+ "name": "Driving licence Anoncred Schema",
+ "version": "1.0",
+ "attrNames": [
+ "emailAddress",
+ "familyName",
+ "dateOfIssuance",
+ "drivingLicenseID",
+ "drivingClass"
+ ],
+ "issuerId": "http://www.example.com/issuer"
+ },
+ "author": "did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff",
+ "authored": "2023-04-06T08:48:01.654162Z",
+ "kind": "CredentialSchema",
+ "self": "/schema-registry/schemas/1631026d-5d55-3285-8ccd-bd70480cfbdc"
+}
diff --git a/pollux/lib/core/src/test/scala/io/iohk/atala/pollux/core/model/schema/AnoncredSchemaTypeSpec.scala b/pollux/lib/core/src/test/scala/io/iohk/atala/pollux/core/model/schema/AnoncredSchemaTypeSpec.scala
index ca6c2cf013..cca059b705 100644
--- a/pollux/lib/core/src/test/scala/io/iohk/atala/pollux/core/model/schema/AnoncredSchemaTypeSpec.scala
+++ b/pollux/lib/core/src/test/scala/io/iohk/atala/pollux/core/model/schema/AnoncredSchemaTypeSpec.scala
@@ -8,11 +8,26 @@ import zio.json.ast.Json
import zio.json.ast.Json.*
import zio.test.*
import zio.test.Assertion.*
+import zio.test.assertZIO
import scala.util.Random
object AnoncredSchemaTypeSpec extends ZIOSpecDefault {
override def spec: Spec[TestEnvironment with Scope, Any] = suite("AnoncredSchemaTypeTest")(
+ test("should validate a correct schema") {
+ val jsonSchema =
+ """
+ |{
+ | "name": "Anoncred",
+ | "version": "1.0",
+ | "attrNames": ["attr1", "attr2"],
+ | "issuerId": "issuer"
+ |}
+ |""".stripMargin
+
+ val schema: Json = jsonSchema.fromJson[Json].getOrElse(Json.Null)
+ assertZIO(AnoncredSchemaType.validate(schema))(isUnit)
+ },
test("should validate a correct schema") {
val jsonSchema =
"""
diff --git a/pollux/lib/core/src/test/scala/io/iohk/atala/pollux/core/model/schema/CredentialSchemaSpec.scala b/pollux/lib/core/src/test/scala/io/iohk/atala/pollux/core/model/schema/CredentialSchemaSpec.scala
index 5e4c25c019..95528e42bb 100644
--- a/pollux/lib/core/src/test/scala/io/iohk/atala/pollux/core/model/schema/CredentialSchemaSpec.scala
+++ b/pollux/lib/core/src/test/scala/io/iohk/atala/pollux/core/model/schema/CredentialSchemaSpec.scala
@@ -41,7 +41,7 @@ object CredentialSchemaSpec extends ZIOSpecDefault {
assertZIO(result.exit)(
fails(
isSubtype[CredentialSchemaError.UnsupportedCredentialSchemaType](
- hasField("userMessage", _.userMessage, equalTo(s"Unsupported VC Schema type $schemaType"))
+ hasField("message", _.message, equalTo(s"Unsupported VC Schema type $schemaType"))
)
)
)
@@ -128,7 +128,7 @@ object CredentialSchemaSpec extends ZIOSpecDefault {
assertZIO(result.exit)(
fails(
isSubtype[CredentialSchemaError.UnsupportedCredentialSchemaType](
- hasField("userMessage", _.userMessage, equalTo(s"Unsupported VC Schema type $schemaType"))
+ hasField("message", _.message, equalTo(s"Unsupported VC Schema type $schemaType"))
)
)
)
diff --git a/pollux/lib/core/src/test/scala/io/iohk/atala/pollux/core/service/CredentialDefinitionServiceImplSpec.scala b/pollux/lib/core/src/test/scala/io/iohk/atala/pollux/core/service/CredentialDefinitionServiceImplSpec.scala
new file mode 100644
index 0000000000..6ed020b520
--- /dev/null
+++ b/pollux/lib/core/src/test/scala/io/iohk/atala/pollux/core/service/CredentialDefinitionServiceImplSpec.scala
@@ -0,0 +1,47 @@
+package io.iohk.atala.pollux.core.service
+
+import zio.*
+import zio.test.*
+import zio.test.TestAspect.*
+
+import java.time.OffsetDateTime
+
+object CredentialDefinitionServiceImplSpec extends ZIOSpecDefault with CredentialDefinitionServiceSpecHelper {
+
+ override def spec = {
+ suite("CredentialServiceImpl")(
+ test("createCredentialDefinition with valid definition creates a valid credential record") {
+ check(
+ Gen.string,
+ Gen.string,
+ Gen.string,
+ Gen.string,
+ Gen.string
+ ) { (name, description, version, signatureType, tag) =>
+ for {
+ svc <- ZIO.service[CredentialDefinitionService]
+ record <- svc.createRecord(
+ name = name,
+ description = description,
+ version = version,
+ signatureType = signatureType,
+ tag = tag,
+ author = "did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff",
+ authored = Some(OffsetDateTime.parse("2022-03-10T12:00:00Z")),
+ schemaId = "resource:///anoncred-schema-example.json",
+ supportRevocation = true
+ )
+ } yield {
+ assertTrue(record.name == name)
+ assertTrue(record.description == description)
+ assertTrue(record.version == version)
+ assertTrue(record.signatureType == signatureType)
+ assertTrue(record.tag == tag)
+ assertTrue(record.supportRevocation)
+ assertTrue(record.name == name)
+ }
+ }
+ }
+ ).provideLayer(credentialDefinitionServiceLayer)
+ } @@ samples(1)
+}
diff --git a/pollux/lib/core/src/test/scala/io/iohk/atala/pollux/core/service/CredentialDefinitionServiceSpecHelper.scala b/pollux/lib/core/src/test/scala/io/iohk/atala/pollux/core/service/CredentialDefinitionServiceSpecHelper.scala
new file mode 100644
index 0000000000..cd0f7e937a
--- /dev/null
+++ b/pollux/lib/core/src/test/scala/io/iohk/atala/pollux/core/service/CredentialDefinitionServiceSpecHelper.scala
@@ -0,0 +1,57 @@
+package io.iohk.atala.pollux.core.service
+
+import io.iohk.atala.agent.walletapi.memory.DIDSecretStorageInMemory
+import io.iohk.atala.pollux.core.model.*
+import io.iohk.atala.pollux.core.model.schema.CredentialDefinition
+import io.iohk.atala.pollux.core.repository.CredentialDefinitionRepositoryInMemory
+import io.iohk.atala.shared.models.WalletId.*
+import io.iohk.atala.shared.models.{WalletAccessContext, WalletId}
+import zio.*
+
+import java.time.OffsetDateTime
+
+trait CredentialDefinitionServiceSpecHelper {
+
+ protected val defaultWalletLayer = ZLayer.succeed(WalletAccessContext(WalletId.default))
+
+ protected val credentialDefinitionServiceLayer =
+ DIDSecretStorageInMemory.layer ++ CredentialDefinitionRepositoryInMemory.layer ++ ResourceURIDereferencerImpl.layer >>>
+ CredentialDefinitionServiceImpl.layer ++ defaultWalletLayer
+
+ val defaultDefinition =
+ """
+ |{
+ | "name": "Anoncred",
+ | "version": "1.0",
+ | "attrNames": ["attr1", "attr2"],
+ | "issuerId": "issuer"
+ |}
+ |""".stripMargin
+
+ extension (svc: CredentialDefinitionService)
+ def createRecord(
+ name: String = "Name",
+ description: String = "Description",
+ version: String = "V1",
+ authored: Option[OffsetDateTime],
+ tag: String = "Tag1",
+ author: String = "did:prism:issuer",
+ schemaId: String,
+ signatureType: String = "CL",
+ supportRevocation: Boolean = false
+ ): svc.Result[CredentialDefinition] = {
+ svc.create(
+ CredentialDefinition.Input(
+ name = name,
+ description = description,
+ version = version,
+ authored = authored,
+ tag = tag,
+ author = author,
+ schemaId = schemaId,
+ signatureType = signatureType,
+ supportRevocation = supportRevocation
+ )
+ )
+ }
+}
diff --git a/pollux/lib/core/src/test/scala/io/iohk/atala/pollux/core/service/helper/PublicCredentialDefinitionSerDesSpec.scala b/pollux/lib/core/src/test/scala/io/iohk/atala/pollux/core/service/helper/PublicCredentialDefinitionSerDesSpec.scala
new file mode 100644
index 0000000000..4a05b09fd5
--- /dev/null
+++ b/pollux/lib/core/src/test/scala/io/iohk/atala/pollux/core/service/helper/PublicCredentialDefinitionSerDesSpec.scala
@@ -0,0 +1,102 @@
+package io.iohk.atala.pollux.core.service.helper
+
+import io.iohk.atala.pollux.core.service.serdes.PublicCredentialDefinitionSerDesV1
+import io.iohk.atala.pollux.core.service.serdes.PublicCredentialPrimaryPublicKeyV1
+import io.iohk.atala.pollux.core.service.serdes.PublicCredentialRevocationKeyV1
+import io.iohk.atala.pollux.core.service.serdes.PublicCredentialValueV1
+import zio.*
+import zio.test.*
+import zio.test.Assertion.*
+import zio.test.assertZIO
+
+object PublicCredentialDefinitionSerDesSpec extends ZIOSpecDefault {
+ val json =
+ """
+ |{
+ | "schemaId": "resource:///anoncred-schema-example.json",
+ | "type": "CL",
+ | "tag": "test",
+ | "value": {
+ | "primary": {
+ | "n": "12873673",
+ | "s": "195958",
+ | "r": {
+ | "dateofissuance": "6594197625",
+ | "drivingclass": "3074617132",
+ | "emailaddress": "3341067570",
+ | "drivinglicenseid": "876491794",
+ | "familyname": "9856376884",
+ | "master_secret": "6838477224"
+ | },
+ | "rctxt": "17824235801",
+ | "z": "91542827065"
+ | },
+ | "revocation": {
+ | "g": "1 16937B88A8",
+ | "g_dash": "1 0850513BB1 ",
+ | "h": "1 16CC8058A8",
+ | "h0": "1 09C6F7A8A8",
+ | "h1": "1 1D3302A8A8",
+ | "h2": "1 222D0DA8A8",
+ | "htilde": "1 187D07A8A8",
+ | "h_cap": "1 2006E7FE67 1 10000",
+ | "u": "1 10B512B541 1 03621",
+ | "pk": "1 13CD12A8A8",
+ | "y": "1 1544B63833 1 0B370"
+ | }
+ | },
+ | "issuerId": "did:prism:557a4ef2ed0cf86fb50d91577269136b3763722ef00a72a1fb1e66895f52b6d8"
+ |}
+ |""".stripMargin
+
+ override def spec: Spec[TestEnvironment with Scope, Any] = suite("PublicCredentialDefinitionSerDes")(
+ test("should validate a correct schema") {
+ assertZIO(PublicCredentialDefinitionSerDesV1.schemaSerDes.validate(json))(isTrue)
+ },
+ test("should deserialise") {
+ val primary = PublicCredentialPrimaryPublicKeyV1(
+ n = "12873673",
+ s = "195958",
+ r = Map(
+ "dateofissuance" -> "6594197625",
+ "drivingclass" -> "3074617132",
+ "emailaddress" -> "3341067570",
+ "drivinglicenseid" -> "876491794",
+ "familyname" -> "9856376884",
+ "master_secret" -> "6838477224"
+ ),
+ rctxt = "17824235801",
+ z = "91542827065"
+ )
+
+ val revocation = PublicCredentialRevocationKeyV1(
+ g = "1 16937B88A8",
+ g_dash = "1 0850513BB1 ",
+ h = "1 16CC8058A8",
+ h0 = "1 09C6F7A8A8",
+ h1 = "1 1D3302A8A8",
+ h2 = "1 222D0DA8A8",
+ htilde = "1 187D07A8A8",
+ h_cap = "1 2006E7FE67 1 10000",
+ u = "1 10B512B541 1 03621",
+ pk = "1 13CD12A8A8",
+ y = "1 1544B63833 1 0B370"
+ )
+
+ val publicCredentialValue = PublicCredentialValueV1(
+ primary = primary,
+ revocation = Some(revocation)
+ )
+
+ val publicCredentialDefinitionSerDes = PublicCredentialDefinitionSerDesV1(
+ schemaId = "resource:///anoncred-schema-example.json",
+ `type` = "CL",
+ tag = "test",
+ value = publicCredentialValue
+ )
+ assertZIO(PublicCredentialDefinitionSerDesV1.schemaSerDes.deserialize(json))(
+ Assertion.equalTo(publicCredentialDefinitionSerDes)
+ )
+ }
+ )
+}
diff --git a/pollux/lib/sql-doobie/src/main/resources/sql/pollux/V14__credential_definition_tables.sql b/pollux/lib/sql-doobie/src/main/resources/sql/pollux/V14__credential_definition_tables.sql
new file mode 100644
index 0000000000..e82c32e9c9
--- /dev/null
+++ b/pollux/lib/sql-doobie/src/main/resources/sql/pollux/V14__credential_definition_tables.sql
@@ -0,0 +1,34 @@
+CREATE TABLE public.credential_definition
+(
+ guid UUID PRIMARY KEY default gen_random_uuid(),
+ id UUID NOT NULL,
+ name VARCHAR(128) NOT NULL,
+ version VARCHAR(64) NOT NULL,
+ tags VARCHAR(64) ARRAY NULL,
+ description TEXT NULL,
+ definition_json_schema_id VARCHAR(64) NOT NULL,
+ definition json NOT NULL,
+ key_correctness_proof_json_schema_id VARCHAR(64) NOT NULL,
+ key_correctness_proof json NOT NULL,
+ author VARCHAR(255) NOT NULL,
+ authored TIMESTAMP WITH TIME ZONE NOT NULL,
+ proof_id UUID NULL,
+ schema_id VARCHAR(255) NOT NULL,
+ signature_type VARCHAR(64) NOT NULL,
+ support_revocation BOOLEAN NOT NULL,
+ wallet_id UUID NOT NULL,
+ UNIQUE (wallet_id, name, version, author)
+);
+
+CREATE INDEX credential_definition_name_index ON public.credential_definition (name);
+CREATE INDEX credential_definition_version_index ON public.credential_definition (version);
+CREATE INDEX credential_definition_tags_index ON public.credential_definition (tags);
+CREATE INDEX credential_definition_author_index ON public.credential_definition (author);
+CREATE INDEX credential_definition_authored_index ON public.credential_definition (authored);
+
+ALTER TABLE public.credential_definition ENABLE ROW LEVEL SECURITY;
+
+CREATE POLICY credential_definition_wallet_isolation
+ON public.credential_definition
+USING (wallet_id = current_setting('app.current_wallet_id')::UUID);
+
diff --git a/pollux/lib/sql-doobie/src/main/scala/io/iohk/atala/pollux/sql/model/db/CredentialDefinition.scala b/pollux/lib/sql-doobie/src/main/scala/io/iohk/atala/pollux/sql/model/db/CredentialDefinition.scala
new file mode 100644
index 0000000000..c9ef7e5ceb
--- /dev/null
+++ b/pollux/lib/sql-doobie/src/main/scala/io/iohk/atala/pollux/sql/model/db/CredentialDefinition.scala
@@ -0,0 +1,186 @@
+package io.iohk.atala.pollux.sql.model.db
+
+import io.getquill.*
+import io.getquill.context.json.PostgresJsonExtensions
+import io.getquill.doobie.DoobieContext
+import io.getquill.idiom.*
+import io.iohk.atala.pollux.core.model.schema.{CorrectnessProof, Definition}
+import io.iohk.atala.shared.models.WalletId
+
+import java.time.OffsetDateTime
+import java.util.UUID
+
+case class CredentialDefinition(
+ guid: UUID,
+ id: UUID,
+ name: String,
+ version: String,
+ author: String,
+ authored: OffsetDateTime,
+ tags: Seq[String],
+ description: String,
+ schemaId: String,
+ definitionJsonSchemaId: String,
+ definition: JsonValue[Definition],
+ keyCorrectnessProofJsonSchemaId: String,
+ keyCorrectnessProof: JsonValue[CorrectnessProof],
+ signatureType: String,
+ supportRevocation: Boolean,
+ walletId: WalletId
+) {
+ lazy val uniqueConstraintKey = author + name + version
+}
+
+object CredentialDefinition {
+ def fromModel(
+ m: io.iohk.atala.pollux.core.model.schema.CredentialDefinition,
+ walletId: WalletId
+ ): CredentialDefinition =
+ CredentialDefinition(
+ guid = m.guid,
+ id = m.id,
+ name = m.name,
+ version = m.version,
+ author = m.author,
+ authored = m.authored,
+ tags = Seq(m.tag),
+ description = m.description,
+ definitionJsonSchemaId = m.definitionJsonSchemaId,
+ definition = JsonValue(m.definition),
+ keyCorrectnessProofJsonSchemaId = m.keyCorrectnessProofJsonSchemaId,
+ keyCorrectnessProof = JsonValue(m.keyCorrectnessProof),
+ schemaId = m.schemaId,
+ signatureType = m.signatureType,
+ supportRevocation = m.supportRevocation,
+ walletId = walletId
+ )
+
+ def toModel(
+ db: CredentialDefinition
+ ): io.iohk.atala.pollux.core.model.schema.CredentialDefinition = {
+ io.iohk.atala.pollux.core.model.schema.CredentialDefinition(
+ guid = db.guid,
+ id = db.id,
+ name = db.name,
+ version = db.version,
+ author = db.author,
+ authored = db.authored,
+ tag = db.tags.headOption.getOrElse(""),
+ description = db.description,
+ definitionJsonSchemaId = db.definitionJsonSchemaId,
+ definition = db.definition.value,
+ keyCorrectnessProofJsonSchemaId = db.keyCorrectnessProofJsonSchemaId,
+ keyCorrectnessProof = db.keyCorrectnessProof.value,
+ schemaId = db.schemaId,
+ signatureType = db.signatureType,
+ supportRevocation = db.supportRevocation
+ )
+ }
+}
+
+object CredentialDefinitionSql extends DoobieContext.Postgres(SnakeCase) with PostgresJsonExtensions {
+ def insert(credentialDefinition: CredentialDefinition) = run {
+ quote(
+ query[CredentialDefinition]
+ .insertValue(lift(credentialDefinition))
+ ).returning(cs => cs)
+ }
+
+ def findByGUID(guid: UUID) = run {
+ quote(query[CredentialDefinition].filter(_.guid == lift(guid)).take(1))
+ }
+
+ def findByID(id: UUID) = run {
+ quote(query[CredentialDefinition].filter(_.id == lift(id)))
+ }
+
+ def getAllVersions(id: UUID, author: String) = run {
+ quote(
+ query[CredentialDefinition]
+ .filter(_.id == lift(id))
+ .filter(_.author == lift(author))
+ .sortBy(_.version)(ord = Ord.asc)
+ .map(_.version)
+ )
+ }
+
+ def update(credentialDefinition: CredentialDefinition) = run {
+ quote {
+ query[CredentialDefinition]
+ .filter(_.guid == lift(credentialDefinition.guid))
+ .updateValue(lift(credentialDefinition))
+ .returning(s => s)
+ }
+ }
+
+ def delete(guid: UUID) = run {
+ quote {
+ query[CredentialDefinition]
+ .filter(_.guid == lift(guid))
+ .delete
+ .returning(cs => cs)
+ }
+ }
+
+ def deleteAll = run {
+ quote {
+ query[CredentialDefinition].delete
+ }
+ }
+
+ def totalCount = run {
+ quote {
+ query[CredentialDefinition].size
+ }
+ }
+
+ def lookupCount(
+ idOpt: Option[UUID] = None,
+ authorOpt: Option[String] = None,
+ nameOpt: Option[String] = None,
+ versionOpt: Option[String] = None,
+ tagOpt: Option[String] = None
+ ) = run {
+ val q =
+ idOpt.fold(quote(query[CredentialDefinition]))(id =>
+ quote(query[CredentialDefinition].filter(cs => cs.id == lift(id)))
+ )
+
+ q.dynamic
+ .filterOpt(authorOpt)((cs, author) => quote(cs.author.like(author)))
+ .filterOpt(nameOpt)((cs, name) => quote(cs.name.like(name)))
+ .filterOpt(versionOpt)((cs, version) => quote(cs.version.like(version)))
+ .filter(cs =>
+ tagOpt
+ .fold(quote(true))(tag => quote(cs.tags.contains(lift(tag))))
+ )
+ .size
+ }
+
+ def lookup(
+ idOpt: Option[UUID] = None,
+ authorOpt: Option[String] = None,
+ nameOpt: Option[String] = None,
+ versionOpt: Option[String] = None,
+ tagOpt: Option[String] = None,
+ offset: Int = 0,
+ limit: Int = 1000
+ ) = run {
+ val q =
+ idOpt.fold(quote(query[CredentialDefinition]))(id =>
+ quote(query[CredentialDefinition].filter(cs => cs.id == lift(id)))
+ )
+
+ q.dynamic
+ .filterOpt(authorOpt)((cs, author) => quote(cs.author.like(author)))
+ .filterOpt(nameOpt)((cs, name) => quote(cs.name.like(name)))
+ .filterOpt(versionOpt)((cs, version) => quote(cs.version.like(version)))
+ .filter(cs =>
+ tagOpt
+ .fold(quote(true))(tag => quote(cs.tags.contains(lift(tag))))
+ )
+ .sortBy(cs => cs.id)
+ .drop(offset)
+ .take(limit)
+ }
+}
diff --git a/pollux/lib/sql-doobie/src/main/scala/io/iohk/atala/pollux/sql/repository/JdbcCredentialDefinitionRepository.scala b/pollux/lib/sql-doobie/src/main/scala/io/iohk/atala/pollux/sql/repository/JdbcCredentialDefinitionRepository.scala
new file mode 100644
index 0000000000..0b56798c6a
--- /dev/null
+++ b/pollux/lib/sql-doobie/src/main/scala/io/iohk/atala/pollux/sql/repository/JdbcCredentialDefinitionRepository.scala
@@ -0,0 +1,102 @@
+package io.iohk.atala.pollux.sql.repository
+
+import doobie.*
+import doobie.implicits.*
+import io.iohk.atala.pollux.core.model.schema.CredentialDefinition
+import io.iohk.atala.pollux.core.repository.Repository.*
+import io.iohk.atala.pollux.core.repository.{CredentialDefinitionRepository, Repository}
+import io.iohk.atala.pollux.sql.model.db.{CredentialDefinitionSql, CredentialDefinition as CredentialDefinitionRow}
+import io.iohk.atala.shared.db.ContextAwareTask
+import io.iohk.atala.shared.db.Implicits.*
+import io.iohk.atala.shared.models.WalletAccessContext
+import zio.*
+import zio.interop.catz.*
+
+import java.util.UUID
+
+case class JdbcCredentialDefinitionRepository(xa: Transactor[ContextAwareTask], xb: Transactor[Task])
+ extends CredentialDefinitionRepository {
+ import CredentialDefinitionSql.*
+
+ override def create(cd: CredentialDefinition): RIO[WalletAccessContext, CredentialDefinition] = {
+ ZIO.serviceWithZIO[WalletAccessContext](ctx =>
+ CredentialDefinitionSql
+ .insert(CredentialDefinitionRow.fromModel(cd, ctx.walletId))
+ .transactWallet(xa)
+ .map(CredentialDefinitionRow.toModel)
+ )
+ }
+
+ override def getByGuid(guid: UUID): Task[Option[CredentialDefinition]] = {
+ CredentialDefinitionSql
+ .findByGUID(guid)
+ .transact(xb)
+ .map(
+ _.headOption
+ .map(CredentialDefinitionRow.toModel)
+ )
+ }
+
+ override def update(cd: CredentialDefinition): RIO[WalletAccessContext, Option[CredentialDefinition]] = {
+ ZIO.serviceWithZIO[WalletAccessContext](ctx =>
+ CredentialDefinitionSql
+ .update(CredentialDefinitionRow.fromModel(cd, ctx.walletId))
+ .transactWallet(xa)
+ .map(Option.apply)
+ .map(_.map(CredentialDefinitionRow.toModel))
+ )
+ }
+
+ def getAllVersions(id: UUID, author: String): RIO[WalletAccessContext, Seq[String]] = {
+ CredentialDefinitionSql
+ .getAllVersions(id, author)
+ .transactWallet(xa)
+ }
+
+ override def delete(guid: UUID): RIO[WalletAccessContext, Option[CredentialDefinition]] = {
+ CredentialDefinitionSql
+ .delete(guid)
+ .transactWallet(xa)
+ .map(Option.apply)
+ .map(_.map(CredentialDefinitionRow.toModel))
+ }
+
+ def deleteAll(): RIO[WalletAccessContext, Long] = {
+ CredentialDefinitionSql.deleteAll
+ .transactWallet(xa)
+ }
+
+ override def search(
+ query: SearchQuery[CredentialDefinition.Filter]
+ ): RIO[WalletAccessContext, SearchResult[CredentialDefinition]] = {
+ for {
+ filteredRows <- CredentialDefinitionSql
+ .lookup(
+ authorOpt = query.filter.author,
+ nameOpt = query.filter.name,
+ versionOpt = query.filter.version,
+ tagOpt = query.filter.tag,
+ offset = query.skip,
+ limit = query.limit
+ )
+ .transactWallet(xa)
+ entries = filteredRows.map(CredentialDefinitionRow.toModel)
+
+ filteredRowsCount <- CredentialDefinitionSql
+ .lookupCount(
+ authorOpt = query.filter.author,
+ nameOpt = query.filter.name,
+ versionOpt = query.filter.version,
+ tagOpt = query.filter.tag
+ )
+ .transactWallet(xa)
+
+ totalRowsCount <- CredentialDefinitionSql.totalCount.transactWallet(xa)
+ } yield SearchResult(entries, filteredRowsCount, totalRowsCount)
+ }
+}
+
+object JdbcCredentialDefinitionRepository {
+ val layer: URLayer[Transactor[ContextAwareTask] & Transactor[Task], JdbcCredentialDefinitionRepository] =
+ ZLayer.fromFunction(JdbcCredentialDefinitionRepository.apply)
+}
diff --git a/pollux/lib/sql-doobie/src/test/scala/io/iohk/atala/pollux/sql/CredentialDefinitionSqlIntegrationSpec.scala b/pollux/lib/sql-doobie/src/test/scala/io/iohk/atala/pollux/sql/CredentialDefinitionSqlIntegrationSpec.scala
new file mode 100644
index 0000000000..e959135ce6
--- /dev/null
+++ b/pollux/lib/sql-doobie/src/test/scala/io/iohk/atala/pollux/sql/CredentialDefinitionSqlIntegrationSpec.scala
@@ -0,0 +1,217 @@
+package io.iohk.atala.pollux.sql
+
+import com.dimafeng.testcontainers.PostgreSQLContainer
+import doobie.*
+import doobie.util.transactor.Transactor
+import io.getquill.*
+import io.iohk.atala.pollux.sql.model.db.{CredentialDefinition, CredentialDefinitionSql}
+import io.iohk.atala.shared.db.ContextAwareTask
+import io.iohk.atala.shared.db.Implicits.*
+import io.iohk.atala.shared.models.{WalletAccessContext, WalletId}
+import io.iohk.atala.shared.test.containers.PostgresTestContainerSupport
+import io.iohk.atala.test.container.MigrationAspects.*
+import zio.*
+import zio.json.ast.Json
+import zio.test.*
+import zio.test.Assertion.*
+import zio.test.TestAspect.*
+
+import java.time.{OffsetDateTime, ZoneOffset}
+import java.util.UUID
+import scala.collection.mutable
+import scala.io.Source
+
+object CredentialDefinitionSqlIntegrationSpec extends ZIOSpecDefault with PostgresTestContainerSupport {
+
+ private val testEnvironmentLayer =
+ zio.test.testEnvironment ++
+ pgContainerLayer ++
+ contextAwareTransactorLayer ++
+ ZLayer.succeed(WalletAccessContext(WalletId.default))
+
+ object Vocabulary {
+ val verifiableCredentialTypes =
+ Source
+ .fromResource("data/verifiableCredentialTypes.csv")(scala.io.Codec.UTF8)
+ .getLines()
+ .toSet
+ val verifiableCredentialClaims = Source
+ .fromResource("data/verifiableCredentialClaims.csv")(scala.io.Codec.UTF8)
+ .getLines()
+ .toSet
+ }
+
+ object Generators {
+ val credentialDefinitionId = Gen.uuid
+ val credentialDefinitionName =
+ Gen.oneOf(Gen.fromIterable(Vocabulary.verifiableCredentialTypes))
+
+ val credentialDefinitionVersion = (Gen.int(1, 3) <*> Gen.int(0, 9) <*> Gen.int(0, 100))
+ .map { case (major, minor, patch) => s"$major.$minor.$patch" }
+
+ val credentialDefinitionDescription = Gen.alphaNumericStringBounded(5, 30)
+
+ val credentialDefinitionAttribute =
+ Gen.fromIterable(Vocabulary.verifiableCredentialClaims)
+ val credentialDefinitionAttributes = Gen.setOfBounded(1, 4)(credentialDefinitionAttribute).map(_.toList)
+ val jsonCredentialDefinition =
+ credentialDefinitionAttributes.map(attributes => Json.Arr(attributes.map(Json.Str(_)): _*))
+
+ val keyCorrectnessProofAttribute =
+ Gen.fromIterable(Vocabulary.verifiableCredentialClaims)
+ val keyCorrectnessProofAttributes = Gen.setOfBounded(1, 4)(credentialDefinitionAttribute).map(_.toList)
+ val jsonCorrectnessProof =
+ credentialDefinitionAttributes.map(attributes => Json.Arr(attributes.map(Json.Str(_)): _*))
+
+ val credentialDefinitionAuthor =
+ Gen.int(1000000, 9999999).map(i => s"did:prism:4fb06243213500578f59588de3e1dd9b266ec1b61e43b0ff86ad0712f$i")
+ val credentialDefinitionAuthored = Gen.offsetDateTime
+
+ val credentialDefinitionTag: Gen[Any, String] = Gen.alphaNumericStringBounded(3, 5)
+ val credentialDefinitionTags: Gen[Any, List[String]] =
+ Gen.setOfBounded(0, 3)(credentialDefinitionTag).map(_.toList)
+
+ val credentialDefinitionSchemaId = Gen.alphaNumericStringBounded(4, 12)
+ val keyCorrectnessProofJsonSchemaId = Gen.alphaNumericStringBounded(4, 12)
+ val definitionJsonSchemaId = Gen.alphaNumericStringBounded(4, 12)
+ val credentialDefinitionSignatureType = Gen.alphaNumericStringBounded(4, 12)
+ val credentialDefinitionSupportRevocation = Gen.boolean
+
+ val credentialDefinition: Gen[WalletAccessContext, CredentialDefinition] = for {
+ name <- credentialDefinitionName
+ version <- credentialDefinitionVersion
+ description <- credentialDefinitionDescription
+ definitionJsonSchemaId <- definitionJsonSchemaId
+ definition <- jsonCredentialDefinition
+ keyCorrectnessProofJsonSchemaId <- keyCorrectnessProofJsonSchemaId
+ keyCorrectnessProof <- jsonCredentialDefinition
+ tags <- credentialDefinitionTags
+ author <- credentialDefinitionAuthor
+ authored = OffsetDateTime.now(ZoneOffset.UTC)
+ id = UUID.randomUUID()
+ schemaId <- credentialDefinitionSchemaId
+ signatureType <- credentialDefinitionSignatureType
+ supportRevocation <- credentialDefinitionSupportRevocation
+ walletId <- Gen.fromZIO(ZIO.serviceWith[WalletAccessContext](_.walletId))
+ } yield CredentialDefinition(
+ guid = id,
+ id = id,
+ name = name,
+ version = version,
+ description = description,
+ author = author,
+ authored = authored,
+ tags = tags,
+ definitionJsonSchemaId = definitionJsonSchemaId,
+ definition = JsonValue(definition),
+ keyCorrectnessProofJsonSchemaId = keyCorrectnessProofJsonSchemaId,
+ keyCorrectnessProof = JsonValue(keyCorrectnessProof),
+ schemaId = schemaId,
+ signatureType = signatureType,
+ supportRevocation = supportRevocation,
+ walletId = walletId
+ )
+
+ private val unique = mutable.Set.empty[String]
+ val credentialDefinitionUnique = for {
+ _ <-
+ credentialDefinition // drain the value to evade the Gen from producing the same over and over again
+ s <- credentialDefinition if !unique.contains(s.uniqueConstraintKey)
+ _ = unique += s.uniqueConstraintKey
+ } yield s
+ }
+
+ def spec = (suite("credential-definition-registry DAL spec")(
+ credentialDefinitionRegistryCRUDSuite
+ ) @@ nondeterministic @@ sequential @@ timed @@ migrate(
+ schema = "public",
+ paths = "classpath:sql/pollux"
+ )).provideSomeLayerShared(testEnvironmentLayer)
+
+ val credentialDefinitionRegistryCRUDSuite = suite("credential-definition-registry CRUD operations")(
+ test("insert, findById, update and delete operations") {
+ for {
+ tx <- ZIO.service[Transactor[ContextAwareTask]]
+
+ expected <- Generators.credentialDefinition.runCollectN(1).map(_.head)
+ _ <- CredentialDefinitionSql.insert(expected).transactWallet(tx)
+ actual <- CredentialDefinitionSql
+ .findByGUID(expected.guid)
+ .transactWallet(tx)
+ .map(_.headOption)
+
+ credentialDefinitionCreated = assert(actual.get)(equalTo(expected))
+
+ updatedExpected = expected.copy(name = "new name")
+ updatedActual <- CredentialDefinitionSql
+ .update(updatedExpected)
+ .transactWallet(tx)
+ updatedActual2 <- CredentialDefinitionSql
+ .findByGUID(expected.id)
+ .transactWallet(tx)
+ .map(_.headOption)
+
+ credentialDefinitionUpdated =
+ assert(updatedActual)(equalTo(updatedExpected)) &&
+ assert(updatedActual2.get)(equalTo(updatedExpected))
+
+ deleted <- CredentialDefinitionSql.delete(expected.guid).transactWallet(tx)
+ notFound <- CredentialDefinitionSql
+ .findByGUID(expected.guid)
+ .transactWallet(tx)
+ .map(_.headOption)
+
+ credentialDefinitionDeleted =
+ assert(deleted)(equalTo(updatedExpected)) &&
+ assert(notFound)(isNone)
+
+ } yield credentialDefinitionCreated && credentialDefinitionUpdated && credentialDefinitionDeleted
+ },
+ test("insert N generated, findById, ensure constraint is not broken ") {
+ for {
+ tx <- ZIO.service[Transactor[ContextAwareTask]]
+ _ <- CredentialDefinitionSql.deleteAll.transactWallet(tx)
+
+ generatedCredentialDefinitions <- Generators.credentialDefinitionUnique.runCollectN(10)
+
+ allCredentialDefinitionsHaveUniqueId = assert(
+ generatedCredentialDefinitions
+ .map(_.id)
+ .toSet
+ .count(_ => true)
+ )(equalTo(generatedCredentialDefinitions.length))
+
+ allCredentialDefinitionsHaveUniqueConstraint = assert(
+ generatedCredentialDefinitions
+ .map(_.uniqueConstraintKey)
+ .toSet
+ .count(_ => true)
+ )(equalTo(generatedCredentialDefinitions.length))
+
+ _ <- ZIO.collectAll(
+ generatedCredentialDefinitions.map(credentialDefinition =>
+ CredentialDefinitionSql.insert(credentialDefinition).transactWallet(tx)
+ )
+ )
+
+ firstActual = generatedCredentialDefinitions.head
+ firstExpected <- CredentialDefinitionSql
+ .findByGUID(firstActual.guid)
+ .transactWallet(tx)
+ .map(_.headOption)
+
+ credentialDefinitionCreated = assert(firstActual)(equalTo(firstExpected.get))
+
+ totalCount <- CredentialDefinitionSql.totalCount.transactWallet(tx)
+ lookupCount <- CredentialDefinitionSql.lookupCount().transactWallet(tx)
+
+ totalCountIsN = assert(totalCount)(equalTo(generatedCredentialDefinitions.length))
+ lookupCountIsN = assert(lookupCount)(equalTo(generatedCredentialDefinitions.length))
+
+ } yield allCredentialDefinitionsHaveUniqueId &&
+ allCredentialDefinitionsHaveUniqueConstraint &&
+ credentialDefinitionCreated &&
+ totalCountIsN && lookupCountIsN
+ }
+ ) @@ nondeterministic @@ sequential @@ timed
+}
diff --git a/pollux/lib/sql-doobie/src/test/scala/io/iohk/atala/pollux/sql/CredentialSchemaSqlIntegrationSpec.scala b/pollux/lib/sql-doobie/src/test/scala/io/iohk/atala/pollux/sql/CredentialSchemaSqlIntegrationSpec.scala
index 3af020c1f3..58f8b59100 100644
--- a/pollux/lib/sql-doobie/src/test/scala/io/iohk/atala/pollux/sql/CredentialSchemaSqlIntegrationSpec.scala
+++ b/pollux/lib/sql-doobie/src/test/scala/io/iohk/atala/pollux/sql/CredentialSchemaSqlIntegrationSpec.scala
@@ -33,11 +33,11 @@ object CredentialSchemaSqlIntegrationSpec extends ZIOSpecDefault, PostgresTestCo
object Vocabulary {
val verifiableCredentialTypes =
Source
- .fromResource("data/verifiableCredentialTypes.csv")
+ .fromResource("data/verifiableCredentialTypes.csv")(scala.io.Codec.UTF8)
.getLines()
.toSet
val verifiableCredentialClaims = Source
- .fromResource("data/verifiableCredentialClaims.csv")
+ .fromResource("data/verifiableCredentialClaims.csv")(scala.io.Codec.UTF8)
.getLines()
.toSet
}
diff --git a/prism-agent/service/api/http/prism-agent-openapi-spec.yaml b/prism-agent/service/api/http/prism-agent-openapi-spec.yaml
index c6bf925421..1ae839c244 100644
--- a/prism-agent/service/api/http/prism-agent-openapi-spec.yaml
+++ b/prism-agent/service/api/http/prism-agent-openapi-spec.yaml
@@ -1,82 +1,84 @@
openapi: 3.0.3
info:
title: Prism Agent
- version: 1.11.0
+ version: 1.12.0
paths:
/schema-registry/schemas:
get:
tags:
- - Schema Registry
+ - Schema Registry
summary: Lookup schemas by indexed fields
- description: 'Lookup schemas by `author`, `name`, `tags` parameters and control
- the pagination by `offset` and `limit` parameters '
+ description:
+ "Lookup schemas by `author`, `name`, `tags` parameters and control
+ the pagination by `offset` and `limit` parameters "
operationId: lookupSchemasByQuery
parameters:
- - name: author
- in: query
- required: false
- schema:
- type: string
- example: did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff
- - name: name
- in: query
- required: false
- schema:
- type: string
- example: DrivingLicense
- - name: version
- in: query
- required: false
- schema:
- type: string
- example: 1.0.0
- - name: tags
- in: query
- required: false
- schema:
- type: string
- example: driving
- - name: offset
- in: query
- required: false
- schema:
- type: integer
- format: int32
- - name: limit
- in: query
- required: false
- schema:
- type: integer
- format: int32
- - name: order
- in: query
- required: false
- schema:
- type: string
+ - name: author
+ in: query
+ required: false
+ schema:
+ type: string
+ example: did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff
+ - name: name
+ in: query
+ required: false
+ schema:
+ type: string
+ example: DrivingLicense
+ - name: version
+ in: query
+ required: false
+ schema:
+ type: string
+ example: 1.0.0
+ - name: tags
+ in: query
+ required: false
+ schema:
+ type: string
+ example: driving
+ - name: offset
+ in: query
+ required: false
+ schema:
+ type: integer
+ format: int32
+ - name: limit
+ in: query
+ required: false
+ schema:
+ type: integer
+ format: int32
+ - name: order
+ in: query
+ required: false
+ schema:
+ type: string
responses:
- '200':
+ "200":
description: Collection of CredentialSchema records.
content:
application/json:
schema:
- $ref: '#/components/schemas/CredentialSchemaResponsePage'
- '400':
+ $ref: "#/components/schemas/CredentialSchemaResponsePage"
+ "400":
description: Invalid request parameters
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '500':
+ $ref: "#/components/schemas/ErrorResponse"
+ "500":
description: Internal server error
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
+ $ref: "#/components/schemas/ErrorResponse"
post:
tags:
- - Schema Registry
+ - Schema Registry
summary: Publish new schema to the schema registry
- description: Create the new credential schema record with metadata and internal
+ description:
+ Create the new credential schema record with metadata and internal
JSON Schema on behalf of Cloud Agent. The credential schema will be signed
by the keys of Cloud Agent and issued by the DID that corresponds to it.
operationId: createSchema
@@ -85,146 +87,149 @@ paths:
content:
application/json:
schema:
- $ref: '#/components/schemas/CredentialSchemaInput'
+ $ref: "#/components/schemas/CredentialSchemaInput"
required: true
responses:
- '201':
+ "201":
description: The new credential schema record is successfully created
content:
application/json:
schema:
- $ref: '#/components/schemas/CredentialSchemaResponse'
- '400':
+ $ref: "#/components/schemas/CredentialSchemaResponse"
+ "400":
description: Invalid request parameters
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '404':
+ $ref: "#/components/schemas/ErrorResponse"
+ "404":
description: Resource could not be found
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '500':
+ $ref: "#/components/schemas/ErrorResponse"
+ "500":
description: Internal server error
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
+ $ref: "#/components/schemas/ErrorResponse"
/schema-registry/{author}/{id}:
put:
tags:
- - Schema Registry
+ - Schema Registry
summary: Publish the new version of the credential schema to the schema registry
- description: Publish the new version of the credential schema record with metadata
+ description:
+ Publish the new version of the credential schema record with metadata
and internal JSON Schema on behalf of Cloud Agent. The credential schema will
be signed by the keys of Cloud Agent and issued by the DID that corresponds
to it.
operationId: updateSchema
parameters:
- - name: author
- in: path
- description: DID of the identity which authored the credential schema. A piece
- of Metadata.
- required: true
- schema:
- type: string
- - name: id
- in: path
- description: A locally unique identifier to address the schema. UUID is generated
- by the backend.
- required: true
- schema:
- type: string
- format: uuid
+ - name: author
+ in: path
+ description:
+ DID of the identity which authored the credential schema. A piece
+ of Metadata.
+ required: true
+ schema:
+ type: string
+ - name: id
+ in: path
+ description:
+ A locally unique identifier to address the schema. UUID is generated
+ by the backend.
+ required: true
+ schema:
+ type: string
+ format: uuid
requestBody:
description: JSON object required for the credential schema update
content:
application/json:
schema:
- $ref: '#/components/schemas/CredentialSchemaInput'
+ $ref: "#/components/schemas/CredentialSchemaInput"
required: true
responses:
- '200':
+ "200":
description: The credential schema record is successfully updated
content:
application/json:
schema:
- $ref: '#/components/schemas/CredentialSchemaResponse'
- '400':
+ $ref: "#/components/schemas/CredentialSchemaResponse"
+ "400":
description: Invalid request parameters
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '404':
+ $ref: "#/components/schemas/ErrorResponse"
+ "404":
description: Resource could not be found
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '500':
+ $ref: "#/components/schemas/ErrorResponse"
+ "500":
description: Internal server error
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
+ $ref: "#/components/schemas/ErrorResponse"
/schema-registry/schemas/{guid}:
get:
tags:
- - Schema Registry
+ - Schema Registry
summary: Fetch the schema from the registry by `guid`
description: Fetch the credential schema by the unique identifier
operationId: getSchemaById
parameters:
- - name: guid
- in: path
- description: Globally unique identifier of the credential schema record
- required: true
- schema:
- type: string
- format: uuid
+ - name: guid
+ in: path
+ description: Globally unique identifier of the credential schema record
+ required: true
+ schema:
+ type: string
+ format: uuid
responses:
- '200':
+ "200":
description: CredentialSchema found by `guid`
content:
application/json:
schema:
- $ref: '#/components/schemas/CredentialSchemaResponse'
- '400':
+ $ref: "#/components/schemas/CredentialSchemaResponse"
+ "400":
description: Invalid request parameters
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '404':
+ $ref: "#/components/schemas/ErrorResponse"
+ "404":
description: Resource could not be found
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '500':
+ $ref: "#/components/schemas/ErrorResponse"
+ "500":
description: Internal server error
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
+ $ref: "#/components/schemas/ErrorResponse"
/schema-registry/test:
get:
tags:
- - Schema Registry
+ - Schema Registry
summary: Trace the request input from the point of view of the server
description: Trace the request input from the point of view of the server
operationId: test
responses:
- '200':
- description: ''
+ "200":
+ description: ""
content:
application/json:
schema:
type: string
- '400':
+ "400":
description: Invalid value
content:
text/plain:
@@ -233,56 +238,57 @@ paths:
/verification/policies:
get:
tags:
- - Verification
+ - Verification
summary: Lookup verification policies by query
- description: Lookup verification policies by `name`, and control the pagination
+ description:
+ Lookup verification policies by `name`, and control the pagination
by `offset` and `limit` parameters
operationId: lookupVerificationPoliciesByQuery
parameters:
- - name: name
- in: query
- required: false
- schema:
- type: string
- - name: offset
- in: query
- required: false
- schema:
- type: integer
- format: int32
- - name: limit
- in: query
- required: false
- schema:
- type: integer
- format: int32
- - name: order
- in: query
- required: false
- schema:
- type: string
+ - name: name
+ in: query
+ required: false
+ schema:
+ type: string
+ - name: offset
+ in: query
+ required: false
+ schema:
+ type: integer
+ format: int32
+ - name: limit
+ in: query
+ required: false
+ schema:
+ type: integer
+ format: int32
+ - name: order
+ in: query
+ required: false
+ schema:
+ type: string
responses:
- '200':
- description: ''
+ "200":
+ description: ""
content:
application/json:
schema:
- $ref: '#/components/schemas/VerificationPolicyPage'
- '400':
+ $ref: "#/components/schemas/VerificationPolicyPage"
+ "400":
description: Invalid request parameters
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '500':
+ $ref: "#/components/schemas/ErrorResponse"
+ "500":
description: Internal server error
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
+ $ref: "#/components/schemas/ErrorResponse"
post:
tags:
- - Verification
+ - Verification
summary: Create the new verification policy
description: Create the new verification policy
operationId: createVerificationPolicy
@@ -291,202 +297,202 @@ paths:
content:
application/json:
schema:
- $ref: '#/components/schemas/VerificationPolicyInput'
+ $ref: "#/components/schemas/VerificationPolicyInput"
required: true
responses:
- '201':
+ "201":
description: Created verification policy entity
content:
application/json:
schema:
- $ref: '#/components/schemas/VerificationPolicy'
- '400':
+ $ref: "#/components/schemas/VerificationPolicy"
+ "400":
description: Invalid request parameters
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '500':
+ $ref: "#/components/schemas/ErrorResponse"
+ "500":
description: Internal server error
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
+ $ref: "#/components/schemas/ErrorResponse"
/verification/policies/{id}:
get:
tags:
- - Verification
+ - Verification
summary: Fetch the verification policy by id
description: Get the verification policy by id
operationId: getVerificationPolicyById
parameters:
- - name: id
- in: path
- description: Get the verification policy by id
- required: true
- schema:
- type: string
- format: uuid
+ - name: id
+ in: path
+ description: Get the verification policy by id
+ required: true
+ schema:
+ type: string
+ format: uuid
responses:
- '200':
- description: ''
+ "200":
+ description: ""
content:
application/json:
schema:
- $ref: '#/components/schemas/VerificationPolicy'
- '400':
+ $ref: "#/components/schemas/VerificationPolicy"
+ "400":
description: Invalid request parameters
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '404':
+ $ref: "#/components/schemas/ErrorResponse"
+ "404":
description: Resource could not be found
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '500':
+ $ref: "#/components/schemas/ErrorResponse"
+ "500":
description: Internal server error
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
+ $ref: "#/components/schemas/ErrorResponse"
put:
tags:
- - Verification
+ - Verification
summary: Update the verification policy object by id
description: Update the verification policy entry
operationId: updateVerificationPolicy
parameters:
- - name: id
- in: path
- required: true
- schema:
- type: string
- format: uuid
- - name: nonce
- in: query
- description: Nonce of the previous VerificationPolicy
- required: true
- schema:
- type: integer
- format: int32
+ - name: id
+ in: path
+ required: true
+ schema:
+ type: string
+ format: uuid
+ - name: nonce
+ in: query
+ description: Nonce of the previous VerificationPolicy
+ required: true
+ schema:
+ type: integer
+ format: int32
requestBody:
description: Update verification policy object
content:
application/json:
schema:
- $ref: '#/components/schemas/VerificationPolicyInput'
+ $ref: "#/components/schemas/VerificationPolicyInput"
required: true
responses:
- '200':
- description: ''
+ "200":
+ description: ""
content:
application/json:
schema:
- $ref: '#/components/schemas/VerificationPolicy'
- '400':
+ $ref: "#/components/schemas/VerificationPolicy"
+ "400":
description: Invalid request parameters
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '404':
+ $ref: "#/components/schemas/ErrorResponse"
+ "404":
description: Resource could not be found
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '500':
+ $ref: "#/components/schemas/ErrorResponse"
+ "500":
description: Internal server error
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
+ $ref: "#/components/schemas/ErrorResponse"
delete:
tags:
- - Verification
+ - Verification
summary: Deleted the verification policy by id
description: Delete the verification policy by id
operationId: deleteVerificationPolicyById
parameters:
- - name: id
- in: path
- description: Delete the verification policy by id
- required: true
- schema:
- type: string
- format: uuid
+ - name: id
+ in: path
+ description: Delete the verification policy by id
+ required: true
+ schema:
+ type: string
+ format: uuid
responses:
- '200':
+ "200":
description: Verification policy deleted successfully
- '400':
+ "400":
description: Invalid request parameters
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '404':
+ $ref: "#/components/schemas/ErrorResponse"
+ "404":
description: Resource could not be found
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '500':
+ $ref: "#/components/schemas/ErrorResponse"
+ "500":
description: Internal server error
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
+ $ref: "#/components/schemas/ErrorResponse"
/connections:
get:
tags:
- - Connections Management
+ - Connections Management
summary: Gets the list of connection records.
description: Get the list of connection records paginated
operationId: getConnections
parameters:
- - name: offset
- in: query
- required: false
- schema:
- type: integer
- format: int32
- - name: limit
- in: query
- required: false
- schema:
- type: integer
- format: int32
- - name: thid
- in: query
- description: The thid of a DIDComm communication.
- required: false
- schema:
- type: string
+ - name: offset
+ in: query
+ required: false
+ schema:
+ type: integer
+ format: int32
+ - name: limit
+ in: query
+ required: false
+ schema:
+ type: integer
+ format: int32
+ - name: thid
+ in: query
+ description: The thid of a DIDComm communication.
+ required: false
+ schema:
+ type: string
responses:
- '200':
+ "200":
description: The list of connection records.
content:
application/json:
schema:
- $ref: '#/components/schemas/ConnectionsPage'
- '400':
+ $ref: "#/components/schemas/ConnectionsPage"
+ "400":
description: Invalid request parameters
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '500':
+ $ref: "#/components/schemas/ErrorResponse"
+ "500":
description: Internal server error
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
+ $ref: "#/components/schemas/ErrorResponse"
post:
tags:
- - Connections Management
+ - Connections Management
summary: Creates a new connection record and returns an Out of Band invitation.
description: |2
@@ -499,72 +505,73 @@ paths:
content:
application/json:
schema:
- $ref: '#/components/schemas/CreateConnectionRequest'
+ $ref: "#/components/schemas/CreateConnectionRequest"
required: true
responses:
- '201':
- description: The connection record was created successfully, and is returned
+ "201":
+ description:
+ The connection record was created successfully, and is returned
in the response body.
content:
application/json:
schema:
- $ref: '#/components/schemas/Connection'
- '400':
+ $ref: "#/components/schemas/Connection"
+ "400":
description: Invalid request parameters
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '500':
+ $ref: "#/components/schemas/ErrorResponse"
+ "500":
description: Internal server error
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
+ $ref: "#/components/schemas/ErrorResponse"
/connections/{connectionId}:
get:
tags:
- - Connections Management
+ - Connections Management
summary: Gets an existing connection record by its unique identifier.
description: Gets an existing connection record by its unique identifier
operationId: getConnection
parameters:
- - name: connectionId
- in: path
- description: The unique identifier of the connection record.
- required: true
- schema:
- type: string
- format: uuid
+ - name: connectionId
+ in: path
+ description: The unique identifier of the connection record.
+ required: true
+ schema:
+ type: string
+ format: uuid
responses:
- '200':
+ "200":
description: The connection record.
content:
application/json:
schema:
- $ref: '#/components/schemas/Connection'
- '400':
+ $ref: "#/components/schemas/Connection"
+ "400":
description: Invalid request parameters
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '404':
+ $ref: "#/components/schemas/ErrorResponse"
+ "404":
description: Resource could not be found
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '500':
+ $ref: "#/components/schemas/ErrorResponse"
+ "500":
description: Internal server error
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
+ $ref: "#/components/schemas/ErrorResponse"
/connection-invitations:
post:
tags:
- - Connections Management
+ - Connections Management
summary: Accepts an Out of Band invitation.
description: |2
@@ -573,36 +580,37 @@ paths:
It returns a connection object in `ConnectionRequestPending` state, until the Connection Request is eventually sent to the inviter by the prism-agent's background process. The connection object state will then automatically move to `ConnectionRequestSent`.
operationId: acceptConnectionInvitation
requestBody:
- description: The request used by an invitee to accept a connection invitation
+ description:
+ The request used by an invitee to accept a connection invitation
received from an inviter, using out-of-band mechanism.
content:
application/json:
schema:
- $ref: '#/components/schemas/AcceptConnectionInvitationRequest'
+ $ref: "#/components/schemas/AcceptConnectionInvitationRequest"
required: true
responses:
- '200':
+ "200":
description: The invitation was successfully accepted.
content:
application/json:
schema:
- $ref: '#/components/schemas/Connection'
- '400':
+ $ref: "#/components/schemas/Connection"
+ "400":
description: Invalid request parameters
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '500':
+ $ref: "#/components/schemas/ErrorResponse"
+ "500":
description: Internal server error
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
+ $ref: "#/components/schemas/ErrorResponse"
/dids/{didRef}:
get:
tags:
- - DID
+ - DID
summary: Resolve Prism DID to a W3C representation
description: |
Resolve Prism DID to a W3C DID document representation.
@@ -611,79 +619,79 @@ paths:
The response is implemented according to [resolver HTTP binding](https://w3c-ccg.github.io/did-resolution/#bindings-https) in the DID resolution spec.
operationId: getDID
parameters:
- - name: didRef
- in: path
- description: Prism DID according to [the Prism DID method syntax](https://github.com/input-output-hk/prism-did-method-spec/blob/main/w3c-spec/PRISM-method.md#prism-did-method-syntax)
- required: true
- schema:
- type: string
- example: did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff
+ - name: didRef
+ in: path
+ description: Prism DID according to [the Prism DID method syntax](https://github.com/input-output-hk/prism-did-method-spec/blob/main/w3c-spec/PRISM-method.md#prism-did-method-syntax)
+ required: true
+ schema:
+ type: string
+ example: did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff
responses:
- '200':
- description: ''
+ "200":
+ description: ""
content:
application/ld+json; profile=https://w3id.org/did-resolution:
schema:
- $ref: '#/components/schemas/DIDResolutionResult'
+ $ref: "#/components/schemas/DIDResolutionResult"
application/did+ld+json:
schema:
- $ref: '#/components/schemas/DIDDocument'
- '400':
- description: ''
+ $ref: "#/components/schemas/DIDDocument"
+ "400":
+ description: ""
content:
application/ld+json; profile=https://w3id.org/did-resolution:
schema:
- $ref: '#/components/schemas/DIDResolutionResult'
+ $ref: "#/components/schemas/DIDResolutionResult"
application/did+ld+json:
schema:
type: string
description: Empty representation
- '404':
- description: ''
+ "404":
+ description: ""
content:
application/ld+json; profile=https://w3id.org/did-resolution:
schema:
- $ref: '#/components/schemas/DIDResolutionResult'
+ $ref: "#/components/schemas/DIDResolutionResult"
application/did+ld+json:
schema:
type: string
description: Empty representation
- '406':
- description: ''
+ "406":
+ description: ""
content:
application/ld+json; profile=https://w3id.org/did-resolution:
schema:
- $ref: '#/components/schemas/DIDResolutionResult'
+ $ref: "#/components/schemas/DIDResolutionResult"
application/did+ld+json:
schema:
type: string
description: Empty representation
- '410':
- description: ''
+ "410":
+ description: ""
content:
application/ld+json; profile=https://w3id.org/did-resolution:
schema:
- $ref: '#/components/schemas/DIDResolutionResult'
+ $ref: "#/components/schemas/DIDResolutionResult"
application/did+ld+json:
schema:
type: string
description: Empty representation
- '500':
- description: ''
+ "500":
+ description: ""
content:
application/ld+json; profile=https://w3id.org/did-resolution:
schema:
- $ref: '#/components/schemas/DIDResolutionResult'
+ $ref: "#/components/schemas/DIDResolutionResult"
application/did+ld+json:
schema:
type: string
description: Empty representation
- '501':
- description: ''
+ "501":
+ description: ""
content:
application/ld+json; profile=https://w3id.org/did-resolution:
schema:
- $ref: '#/components/schemas/DIDResolutionResult'
+ $ref: "#/components/schemas/DIDResolutionResult"
application/did+ld+json:
schema:
type: string
@@ -691,7 +699,7 @@ paths:
/did-registrar/dids:
get:
tags:
- - DID Registrar
+ - DID Registrar
summary: List all DIDs stored in Prism Agent's wallet
description: |-
List all DIDs stored in Prism Agent's wallet.
@@ -699,40 +707,40 @@ paths:
If the `limit` parameter is not set, it defaults to 100 items per page.
operationId: getDid-registrarDids
parameters:
- - name: offset
- in: query
- required: false
- schema:
- type: integer
- format: int32
- - name: limit
- in: query
- required: false
- schema:
- type: integer
- format: int32
+ - name: offset
+ in: query
+ required: false
+ schema:
+ type: integer
+ format: int32
+ - name: limit
+ in: query
+ required: false
+ schema:
+ type: integer
+ format: int32
responses:
- '200':
+ "200":
description: List Prism Agent managed DIDs
content:
application/json:
schema:
- $ref: '#/components/schemas/ManagedDIDPage'
- '400':
+ $ref: "#/components/schemas/ManagedDIDPage"
+ "400":
description: Invalid request parameters
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '500':
+ $ref: "#/components/schemas/ErrorResponse"
+ "500":
description: Internal server error
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
+ $ref: "#/components/schemas/ErrorResponse"
post:
tags:
- - DID Registrar
+ - DID Registrar
summary: Create unpublished DID and store it in Prism Agent's wallet
description: |-
Create unpublished DID and store it inside Prism Agent's wallet. The private keys of the DID is
@@ -742,118 +750,119 @@ paths:
content:
application/json:
schema:
- $ref: '#/components/schemas/CreateManagedDidRequest'
+ $ref: "#/components/schemas/CreateManagedDidRequest"
required: true
responses:
- '201':
+ "201":
description: Created unpublished DID.
content:
application/json:
schema:
- $ref: '#/components/schemas/CreateManagedDIDResponse'
- '400':
+ $ref: "#/components/schemas/CreateManagedDIDResponse"
+ "400":
description: Invalid request parameters
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '422':
+ $ref: "#/components/schemas/ErrorResponse"
+ "422":
description: Unable to process the request
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '500':
+ $ref: "#/components/schemas/ErrorResponse"
+ "500":
description: Internal server error
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
+ $ref: "#/components/schemas/ErrorResponse"
/did-registrar/dids/{didRef}:
get:
tags:
- - DID Registrar
+ - DID Registrar
summary: Get DID stored in Prism Agent's wallet
description: Get DID stored in Prism Agent's wallet
operationId: getDid-registrarDidsDidref
parameters:
- - name: didRef
- in: path
- description: Prism DID according to [the Prism DID method syntax](https://github.com/input-output-hk/prism-did-method-spec/blob/main/w3c-spec/PRISM-method.md#prism-did-method-syntax)
- required: true
- schema:
- type: string
- example: did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff
+ - name: didRef
+ in: path
+ description: Prism DID according to [the Prism DID method syntax](https://github.com/input-output-hk/prism-did-method-spec/blob/main/w3c-spec/PRISM-method.md#prism-did-method-syntax)
+ required: true
+ schema:
+ type: string
+ example: did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff
responses:
- '200':
+ "200":
description: Get Prism Agent managed DID
content:
application/json:
schema:
- $ref: '#/components/schemas/ManagedDID'
- '400':
+ $ref: "#/components/schemas/ManagedDID"
+ "400":
description: Invalid request parameters
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '404':
+ $ref: "#/components/schemas/ErrorResponse"
+ "404":
description: Resource could not be found
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '500':
+ $ref: "#/components/schemas/ErrorResponse"
+ "500":
description: Internal server error
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
+ $ref: "#/components/schemas/ErrorResponse"
/did-registrar/dids/{didRef}/publications:
post:
tags:
- - DID Registrar
+ - DID Registrar
summary: Publish the DID stored in Prism Agent's wallet to the VDR
description: Publish the DID stored in Prism Agent's wallet to the VDR.
operationId: postDid-registrarDidsDidrefPublications
parameters:
- - name: didRef
- in: path
- description: Prism DID according to [the Prism DID method syntax](https://github.com/input-output-hk/prism-did-method-spec/blob/main/w3c-spec/PRISM-method.md#prism-did-method-syntax)
- required: true
- schema:
- type: string
- example: did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff
+ - name: didRef
+ in: path
+ description: Prism DID according to [the Prism DID method syntax](https://github.com/input-output-hk/prism-did-method-spec/blob/main/w3c-spec/PRISM-method.md#prism-did-method-syntax)
+ required: true
+ schema:
+ type: string
+ example: did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff
responses:
- '202':
+ "202":
description: Publishing DID to the VDR.
content:
application/json:
schema:
- $ref: '#/components/schemas/DIDOperationResponse'
- '400':
+ $ref: "#/components/schemas/DIDOperationResponse"
+ "400":
description: Invalid request parameters
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '404':
+ $ref: "#/components/schemas/ErrorResponse"
+ "404":
description: Resource could not be found
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '500':
+ $ref: "#/components/schemas/ErrorResponse"
+ "500":
description: Internal server error
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
+ $ref: "#/components/schemas/ErrorResponse"
/did-registrar/dids/{didRef}/updates:
post:
tags:
- - DID Registrar
- summary: Update DID in Prism Agent's wallet and post update operation to the
+ - DID Registrar
+ summary:
+ Update DID in Prism Agent's wallet and post update operation to the
VDR
description: |-
Update DID in Prism Agent's wallet and post update operation to the VDR.
@@ -862,109 +871,112 @@ paths:
some operations being rejected as only one operation is allowed to be appended to the last confirmed operation.
operationId: postDid-registrarDidsDidrefUpdates
parameters:
- - name: didRef
- in: path
- description: Prism DID according to [the Prism DID method syntax](https://github.com/input-output-hk/prism-did-method-spec/blob/main/w3c-spec/PRISM-method.md#prism-did-method-syntax)
- required: true
- schema:
- type: string
- example: did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff
+ - name: didRef
+ in: path
+ description: Prism DID according to [the Prism DID method syntax](https://github.com/input-output-hk/prism-did-method-spec/blob/main/w3c-spec/PRISM-method.md#prism-did-method-syntax)
+ required: true
+ schema:
+ type: string
+ example: did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff
requestBody:
content:
application/json:
schema:
- $ref: '#/components/schemas/UpdateManagedDIDRequest'
+ $ref: "#/components/schemas/UpdateManagedDIDRequest"
required: true
responses:
- '202':
+ "202":
description: DID update operation accepted
content:
application/json:
schema:
- $ref: '#/components/schemas/DIDOperationResponse'
- '400':
+ $ref: "#/components/schemas/DIDOperationResponse"
+ "400":
description: Invalid request parameters
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '404':
+ $ref: "#/components/schemas/ErrorResponse"
+ "404":
description: Resource could not be found
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '409':
+ $ref: "#/components/schemas/ErrorResponse"
+ "409":
description: Cannot process due to conflict with current state of the resource
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '422':
+ $ref: "#/components/schemas/ErrorResponse"
+ "422":
description: Unable to process the request
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '500':
+ $ref: "#/components/schemas/ErrorResponse"
+ "500":
description: Internal server error
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
+ $ref: "#/components/schemas/ErrorResponse"
/did-registrar/dids/{didRef}/deactivations:
post:
tags:
- - DID Registrar
- summary: Deactivate DID in Prism Agent's wallet and post deactivate operation
+ - DID Registrar
+ summary:
+ Deactivate DID in Prism Agent's wallet and post deactivate operation
to the VDR
- description: Deactivate DID in Prism Agent's wallet and post deactivate operation
+ description:
+ Deactivate DID in Prism Agent's wallet and post deactivate operation
to the VDR.
operationId: postDid-registrarDidsDidrefDeactivations
parameters:
- - name: didRef
- in: path
- description: Prism DID according to [the Prism DID method syntax](https://github.com/input-output-hk/prism-did-method-spec/blob/main/w3c-spec/PRISM-method.md#prism-did-method-syntax)
- required: true
- schema:
- type: string
- example: did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff
+ - name: didRef
+ in: path
+ description: Prism DID according to [the Prism DID method syntax](https://github.com/input-output-hk/prism-did-method-spec/blob/main/w3c-spec/PRISM-method.md#prism-did-method-syntax)
+ required: true
+ schema:
+ type: string
+ example: did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff
responses:
- '202':
+ "202":
description: DID deactivation operation accepted
content:
application/json:
schema:
- $ref: '#/components/schemas/DIDOperationResponse'
- '400':
+ $ref: "#/components/schemas/DIDOperationResponse"
+ "400":
description: Invalid request parameters
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '404':
+ $ref: "#/components/schemas/ErrorResponse"
+ "404":
description: Resource could not be found
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '422':
+ $ref: "#/components/schemas/ErrorResponse"
+ "422":
description: Unable to process the request
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '500':
+ $ref: "#/components/schemas/ErrorResponse"
+ "500":
description: Internal server error
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
+ $ref: "#/components/schemas/ErrorResponse"
/issue-credentials/credential-offers:
post:
tags:
- - Issue Credentials Protocol
- summary: As a credential issuer, create a new credential offer to be sent to
+ - Issue Credentials Protocol
+ summary:
+ As a credential issuer, create a new credential offer to be sent to
a holder.
description: Creates a new credential offer in the database
operationId: createCredentialOffer
@@ -973,251 +985,257 @@ paths:
content:
application/json:
schema:
- $ref: '#/components/schemas/CreateIssueCredentialRecordRequest'
+ $ref: "#/components/schemas/CreateIssueCredentialRecordRequest"
required: true
responses:
- '201':
+ "201":
description: The issue credential record.
content:
application/json:
schema:
- $ref: '#/components/schemas/IssueCredentialRecord'
- '400':
+ $ref: "#/components/schemas/IssueCredentialRecord"
+ "400":
description: Invalid request parameters
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '500':
+ $ref: "#/components/schemas/ErrorResponse"
+ "500":
description: Internal server error
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
+ $ref: "#/components/schemas/ErrorResponse"
/issue-credentials/records:
get:
tags:
- - Issue Credentials Protocol
+ - Issue Credentials Protocol
summary: Gets the list of issue credential records.
description: Get the list of issue credential records paginated
operationId: getCredentialRecords
parameters:
- - name: offset
- in: query
- required: false
- schema:
- type: integer
- format: int32
- - name: limit
- in: query
- required: false
- schema:
- type: integer
- format: int32
- - name: thid
- in: query
- description: The thid of a DIDComm communication.
- required: false
- schema:
- type: string
+ - name: offset
+ in: query
+ required: false
+ schema:
+ type: integer
+ format: int32
+ - name: limit
+ in: query
+ required: false
+ schema:
+ type: integer
+ format: int32
+ - name: thid
+ in: query
+ description: The thid of a DIDComm communication.
+ required: false
+ schema:
+ type: string
responses:
- '200':
+ "200":
description: The list of issue credential records.
content:
application/json:
schema:
- $ref: '#/components/schemas/IssueCredentialRecordPage'
- '400':
+ $ref: "#/components/schemas/IssueCredentialRecordPage"
+ "400":
description: Invalid request parameters
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '500':
+ $ref: "#/components/schemas/ErrorResponse"
+ "500":
description: Internal server error
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
+ $ref: "#/components/schemas/ErrorResponse"
/issue-credentials/records/{recordId}:
get:
tags:
- - Issue Credentials Protocol
+ - Issue Credentials Protocol
summary: Gets an existing issue credential record by its unique identifier.
description: Gets issue credential records by record id
operationId: getCredentialRecord
parameters:
- - name: recordId
- in: path
- description: The unique identifier of the issue credential record.
- required: true
- schema:
- type: string
+ - name: recordId
+ in: path
+ description: The unique identifier of the issue credential record.
+ required: true
+ schema:
+ type: string
responses:
- '200':
+ "200":
description: The issue credential record.
content:
application/json:
schema:
- $ref: '#/components/schemas/IssueCredentialRecord'
- '400':
+ $ref: "#/components/schemas/IssueCredentialRecord"
+ "400":
description: Invalid request parameters
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '404':
+ $ref: "#/components/schemas/ErrorResponse"
+ "404":
description: Resource could not be found
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '500':
+ $ref: "#/components/schemas/ErrorResponse"
+ "500":
description: Internal server error
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
+ $ref: "#/components/schemas/ErrorResponse"
/issue-credentials/records/{recordId}/accept-offer:
post:
tags:
- - Issue Credentials Protocol
+ - Issue Credentials Protocol
summary: As a holder, accepts a credential offer received from an issuer.
- description: Accepts a credential offer received from a VC issuer and sends
+ description:
+ Accepts a credential offer received from a VC issuer and sends
back a credential request.
operationId: acceptCredentialOffer
parameters:
- - name: recordId
- in: path
- description: The unique identifier of the issue credential record.
- required: true
- schema:
- type: string
+ - name: recordId
+ in: path
+ description: The unique identifier of the issue credential record.
+ required: true
+ schema:
+ type: string
requestBody:
description: The accept credential offer request object.
content:
application/json:
schema:
- $ref: '#/components/schemas/AcceptCredentialOfferRequest'
+ $ref: "#/components/schemas/AcceptCredentialOfferRequest"
required: true
responses:
- '200':
+ "200":
description: The issue credential offer was successfully accepted.
content:
application/json:
schema:
- $ref: '#/components/schemas/IssueCredentialRecord'
- '400':
+ $ref: "#/components/schemas/IssueCredentialRecord"
+ "400":
description: Invalid request parameters
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '404':
+ $ref: "#/components/schemas/ErrorResponse"
+ "404":
description: Resource could not be found
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '500':
+ $ref: "#/components/schemas/ErrorResponse"
+ "500":
description: Internal server error
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
+ $ref: "#/components/schemas/ErrorResponse"
/issue-credentials/records/{recordId}/issue-credential:
post:
tags:
- - Issue Credentials Protocol
- summary: As an issuer, issues the verifiable credential related to the specified
+ - Issue Credentials Protocol
+ summary:
+ As an issuer, issues the verifiable credential related to the specified
record.
- description: Sends credential to a holder (holder DID is specified in credential
+ description:
+ Sends credential to a holder (holder DID is specified in credential
as subjectDid). Credential is constructed from the credential records found
by credential id.
operationId: issueCredential
parameters:
- - name: recordId
- in: path
- description: The unique identifier of the issue credential record.
- required: true
- schema:
- type: string
+ - name: recordId
+ in: path
+ description: The unique identifier of the issue credential record.
+ required: true
+ schema:
+ type: string
responses:
- '200':
- description: The request was processed successfully and the credential will
+ "200":
+ description:
+ The request was processed successfully and the credential will
be issued asynchronously.
content:
application/json:
schema:
- $ref: '#/components/schemas/IssueCredentialRecord'
- '400':
+ $ref: "#/components/schemas/IssueCredentialRecord"
+ "400":
description: Invalid request parameters
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '404':
+ $ref: "#/components/schemas/ErrorResponse"
+ "404":
description: Resource could not be found
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '500':
+ $ref: "#/components/schemas/ErrorResponse"
+ "500":
description: Internal server error
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
+ $ref: "#/components/schemas/ErrorResponse"
/present-proof/presentations:
get:
tags:
- - Present Proof
+ - Present Proof
summary: Gets the list of proof presentation records.
description: list of presentation statuses
operationId: getAllPresentation
parameters:
- - name: offset
- in: query
- required: false
- schema:
- type: integer
- format: int32
- - name: limit
- in: query
- required: false
- schema:
- type: integer
- format: int32
- - name: thid
- in: query
- required: false
- schema:
- type: string
+ - name: offset
+ in: query
+ required: false
+ schema:
+ type: integer
+ format: int32
+ - name: limit
+ in: query
+ required: false
+ schema:
+ type: integer
+ format: int32
+ - name: thid
+ in: query
+ required: false
+ schema:
+ type: string
responses:
- '200':
+ "200":
description: The list of proof presentation records.
content:
application/json:
schema:
- $ref: '#/components/schemas/PresentationStatusPage'
- '400':
+ $ref: "#/components/schemas/PresentationStatusPage"
+ "400":
description: Invalid request parameters
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '500':
+ $ref: "#/components/schemas/ErrorResponse"
+ "500":
description: Internal server error
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
+ $ref: "#/components/schemas/ErrorResponse"
post:
tags:
- - Present Proof
- summary: As a Verifier, create a new proof presentation request and send it
+ - Present Proof
+ summary:
+ As a Verifier, create a new proof presentation request and send it
to the Prover.
- description: Holder presents proof derived from the verifiable credential to
+ description:
+ Holder presents proof derived from the verifiable credential to
verifier.
operationId: requestPresentation
requestBody:
@@ -1225,173 +1243,176 @@ paths:
content:
application/json:
schema:
- $ref: '#/components/schemas/RequestPresentationInput'
+ $ref: "#/components/schemas/RequestPresentationInput"
required: true
responses:
- '201':
- description: The proof presentation request was created successfully and
+ "201":
+ description:
+ The proof presentation request was created successfully and
will be sent asynchronously to the Prover.
content:
application/json:
schema:
- $ref: '#/components/schemas/PresentationStatus'
- '400':
+ $ref: "#/components/schemas/PresentationStatus"
+ "400":
description: Invalid request parameters
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '500':
+ $ref: "#/components/schemas/ErrorResponse"
+ "500":
description: Internal server error
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
+ $ref: "#/components/schemas/ErrorResponse"
/present-proof/presentations/{presentationId}:
get:
tags:
- - Present Proof
- summary: Gets an existing proof presentation record by its unique identifier.
+ - Present Proof
+ summary:
+ Gets an existing proof presentation record by its unique identifier.
More information on the error can be found in the response body.
description: Returns an existing presentation record by id.
operationId: getPresentation
parameters:
- - name: presentationId
- in: path
- description: The unique identifier of the presentation record.
- required: true
- schema:
- type: string
- format: uuid
+ - name: presentationId
+ in: path
+ description: The unique identifier of the presentation record.
+ required: true
+ schema:
+ type: string
+ format: uuid
responses:
- '200':
+ "200":
description: The proof presentation record.
content:
application/json:
schema:
- $ref: '#/components/schemas/PresentationStatus'
- '400':
+ $ref: "#/components/schemas/PresentationStatus"
+ "400":
description: Invalid request parameters
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '404':
+ $ref: "#/components/schemas/ErrorResponse"
+ "404":
description: Resource could not be found
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '500':
+ $ref: "#/components/schemas/ErrorResponse"
+ "500":
description: Internal server error
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
+ $ref: "#/components/schemas/ErrorResponse"
patch:
tags:
- - Present Proof
- summary: Updates the proof presentation record matching the unique identifier,
+ - Present Proof
+ summary:
+ Updates the proof presentation record matching the unique identifier,
with the specific action to perform.
description: Accept or reject presentation of proof request.
operationId: updatePresentation
parameters:
- - name: presentationId
- in: path
- description: The unique identifier of the presentation record.
- required: true
- schema:
- type: string
- format: uuid
+ - name: presentationId
+ in: path
+ description: The unique identifier of the presentation record.
+ required: true
+ schema:
+ type: string
+ format: uuid
requestBody:
description: The action to perform on the proof presentation record.
content:
application/json:
schema:
- $ref: '#/components/schemas/RequestPresentationAction'
+ $ref: "#/components/schemas/RequestPresentationAction"
required: true
responses:
- '200':
+ "200":
description: The proof presentation record was successfully updated.
content:
application/json:
schema:
- $ref: '#/components/schemas/PresentationStatus'
- '400':
+ $ref: "#/components/schemas/PresentationStatus"
+ "400":
description: Invalid request parameters
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '404':
+ $ref: "#/components/schemas/ErrorResponse"
+ "404":
description: Resource could not be found
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '500':
+ $ref: "#/components/schemas/ErrorResponse"
+ "500":
description: Internal server error
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
+ $ref: "#/components/schemas/ErrorResponse"
/_system/health:
get:
tags:
- - System
+ - System
summary: As a system user, check the health status of the running service
description: Returns the health info object of the running service
operationId: systemHealth
responses:
- '200':
+ "200":
description: The health info object.
content:
application/json:
schema:
- $ref: '#/components/schemas/HealthInfo'
- '400':
+ $ref: "#/components/schemas/HealthInfo"
+ "400":
description: Invalid request parameters
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '500':
+ $ref: "#/components/schemas/ErrorResponse"
+ "500":
description: Internal server error
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
+ $ref: "#/components/schemas/ErrorResponse"
/_system/metrics:
get:
tags:
- - System
+ - System
summary: As a system user, check the health status of the running service
description: Returns the health info object of the running service
operationId: systemMetrics
responses:
- '200':
+ "200":
description: The metrics as pain strings.
content:
text/plain:
schema:
type: string
- '400':
+ "400":
description: Invalid request parameters
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
- '500':
+ $ref: "#/components/schemas/ErrorResponse"
+ "500":
description: Internal server error
content:
application/json:
schema:
- $ref: '#/components/schemas/ErrorResponse'
+ $ref: "#/components/schemas/ErrorResponse"
components:
schemas:
AcceptConnectionInvitationRequest:
required:
- - invitation
+ - invitation
type: object
properties:
invitation:
@@ -1400,23 +1421,24 @@ components:
example: eyJAaWQiOiIzZmE4NWY2NC01NzE3LTQ1NjItYjNmYy0yYzk2M2Y2NmFmYTYiLCJAdHlwZSI6Imh0dHBzOi8vZGlkY29tbS5vcmcvbXktZmFtaWx5LzEuMC9teS1tZXNzYWdlLXR5cGUiLCJkaWQiOiJXZ1d4cXp0ck5vb0c5MlJYdnhTVFd2IiwiaW1hZ2VVcmwiOiJodHRwOi8vMTkyLjE2OC41Ni4xMDEvaW1nL2xvZ28uanBnIiwibGFiZWwiOiJCb2IiLCJyZWNpcGllbnRLZXlzIjpbIkgzQzJBVnZMTXY2Z21NTmFtM3VWQWpacGZrY0pDd0R3blpuNnozd1htcVBWIl0sInJvdXRpbmdLZXlzIjpbIkgzQzJBVnZMTXY2Z21NTmFtM3VWQWpacGZrY0pDd0R3blpuNnozd1htcVBWIl0sInNlcnZpY2VFbmRwb2ludCI6Imh0dHA6Ly8xOTIuMTY4LjU2LjEwMTo4MDIwIn0=
AcceptCredentialOfferRequest:
required:
- - subjectId
+ - subjectId
type: object
properties:
subjectId:
type: string
- description: The short-form subject Prism DID to which the verifiable credential
+ description:
+ The short-form subject Prism DID to which the verifiable credential
should be issued.
example: did:prism:3bb0505d13fcb04d28a48234edb27b0d4e6d7e18a81e2c1abab58f3bbc21ce6f
ActionType:
type: string
enum:
- - ADD_KEY
- - ADD_SERVICE
- - PATCH_CONTEXT
- - REMOVE_KEY
- - REMOVE_SERVICE
- - UPDATE_SERVICE
+ - ADD_KEY
+ - ADD_SERVICE
+ - PATCH_CONTEXT
+ - REMOVE_KEY
+ - REMOVE_SERVICE
+ - UPDATE_SERVICE
Arr:
type: object
properties:
@@ -1425,21 +1447,21 @@ components:
items: {}
Bool:
required:
- - value
+ - value
type: object
properties:
value:
type: boolean
Connection:
required:
- - connectionId
- - thid
- - role
- - state
- - invitation
- - createdAt
- - self
- - kind
+ - connectionId
+ - thid
+ - role
+ - state
+ - invitation
+ - createdAt
+ - self
+ - kind
type: object
properties:
connectionId:
@@ -1449,7 +1471,8 @@ components:
example: 0527aea1-d131-3948-a34d-03af39aba8b4
thid:
type: string
- description: The unique identifier of the thread this connection record
+ description:
+ The unique identifier of the thread this connection record
belongs to. The value will identical on both sides of the connection (inviter
and invitee)
example: 0527aea1-d131-3948-a34d-03af39aba8b4
@@ -1459,12 +1482,14 @@ components:
example: Peter
myDid:
type: string
- description: The DID representing me as the inviter or invitee in this specific
+ description:
+ The DID representing me as the inviter or invitee in this specific
connection.
example: did:peer:12345
theirDid:
type: string
- description: The DID representing the other peer as the an inviter or invitee
+ description:
+ The DID representing the other peer as the an inviter or invitee
in this specific connection.
example: did:peer:67890
role:
@@ -1472,26 +1497,26 @@ components:
description: The role played by the Prism agent in the connection flow.
example: Inviter
enum:
- - Inviter
- - Invitee
+ - Inviter
+ - Invitee
state:
type: string
description: The current state of the connection protocol execution.
example: InvitationGenerated
enum:
- - InvitationGenerated
- - InvitationReceived
- - ConnectionRequestPending
- - ConnectionRequestSent
- - ConnectionRequestReceived
- - ConnectionResponsePending
- - ConnectionResponseSent
- - ConnectionResponseReceived
- - ProblemReportPending
- - ProblemReportSent
- - ProblemReportReceived
+ - InvitationGenerated
+ - InvitationReceived
+ - ConnectionRequestPending
+ - ConnectionRequestSent
+ - ConnectionRequestReceived
+ - ConnectionResponsePending
+ - ConnectionResponseSent
+ - ConnectionResponseReceived
+ - ProblemReportPending
+ - ProblemReportSent
+ - ProblemReportReceived
invitation:
- $ref: '#/components/schemas/ConnectionInvitation'
+ $ref: "#/components/schemas/ConnectionInvitation"
createdAt:
type: string
description: The date and time the connection record was created.
@@ -1512,67 +1537,71 @@ components:
example: Connection
ConnectionInvitation:
required:
- - id
- - type
- - from
- - invitationUrl
+ - id
+ - type
+ - from
+ - invitationUrl
type: object
properties:
id:
type: string
- description: The unique identifier of the invitation. It should be used
+ description:
+ The unique identifier of the invitation. It should be used
as parent thread ID (pthid) for the Connection Request message that follows.
format: uuid
example: 0527aea1-d131-3948-a34d-03af39aba8b4
type:
type: string
- description: The DIDComm Message Type URI (MTURI) the invitation message
+ description:
+ The DIDComm Message Type URI (MTURI) the invitation message
complies with.
example: https://didcomm.org/out-of-band/2.0/invitation
from:
type: string
- description: The DID representing the sender to be used by recipients for
+ description:
+ The DID representing the sender to be used by recipients for
future interactions.
example: did:peer:1234457
invitationUrl:
type: string
- description: The invitation message encoded as a URL. This URL follows the
+ description:
+ The invitation message encoded as a URL. This URL follows the
Out of [Band 2.0 protocol](https://identity.foundation/didcomm-messaging/spec/v2.0/#out-of-band-messages)
and can be used to generate a QR code for example.
example: https://my.domain.com/path?_oob=eyJAaWQiOiIzZmE4NWY2NC01NzE3LTQ1NjItYjNmYy0yYzk2M2Y2NmFmYTYiLCJAdHlwZSI6Imh0dHBzOi8vZGlkY29tbS5vcmcvbXktZmFtaWx5LzEuMC9teS1tZXNzYWdlLXR5cGUiLCJkaWQiOiJXZ1d4cXp0ck5vb0c5MlJYdnhTVFd2IiwiaW1hZ2VVcmwiOiJodHRwOi8vMTkyLjE2OC41Ni4xMDEvaW1nL2xvZ28uanBnIiwibGFiZWwiOiJCb2IiLCJyZWNpcGllbnRLZXlzIjpbIkgzQzJBVnZMTXY2Z21NTmFtM3VWQWpacGZrY0pDd0R3blpuNnozd1htcVBWIl0sInJvdXRpbmdLZXlzIjpbIkgzQzJBVnZMTXY2Z21NTmFtM3VWQWpacGZrY0pDd0R3blpuNnozd1htcVBWIl0sInNlcnZpY2VFbmRwb2ludCI6Imh0dHA6Ly8xOTIuMTY4LjU2LjEwMTo4MDIwIn0=
description: The invitation for this connection
ConnectionsPage:
required:
- - kind
- - self
- - pageOf
+ - kind
+ - self
+ - pageOf
type: object
properties:
contents:
type: array
items:
- $ref: '#/components/schemas/Connection'
- description: ''
+ $ref: "#/components/schemas/Connection"
+ description: ""
example: []
kind:
type: string
- description: ''
+ description: ""
example: ConnectionsPage
self:
type: string
- description: ''
+ description: ""
example: /prism-agent/connections?offset=10&limit=10
pageOf:
type: string
- description: ''
- example: ''
+ description: ""
+ example: ""
next:
type: string
- description: ''
+ description: ""
example: /prism-agent/connections?offset=20&limit=10
previous:
type: string
- description: ''
+ description: ""
example: /prism-agent/connections?offset=0&limit=10
CreateConnectionRequest:
type: object
@@ -1583,29 +1612,33 @@ components:
example: Peter
CreateIssueCredentialRecordRequest:
required:
- - claims
- - issuingDID
- - connectionId
+ - claims
+ - issuingDID
+ - connectionId
type: object
properties:
validityPeriod:
type: number
- description: The validity period in seconds of the verifiable credential
+ description:
+ The validity period in seconds of the verifiable credential
that will be issued.
format: double
example: 3600.0
schemaId:
type: string
- description: The unique identifier of the schema used for this credential
+ description:
+ The unique identifier of the schema used for this credential
offer.
example: https://agent-host.com/prism-agent/schema-registry/schemas/d9569cec-c81e-4779-aa86-0d5994d82676
claims:
- description: The claims that will be associated with the issued verifiable
+ description:
+ The claims that will be associated with the issued verifiable
credential.
example: (firstname,Alice)
automaticIssuance:
type: boolean
- description: Specifies whether or not the credential should be automatically
+ description:
+ Specifies whether or not the credential should be automatically
generated and issued when receiving the `CredentialRequest` from the holder.
If set to `false`, a manual approval by the issuer via API call will be
required for the VC to be issued.
@@ -1616,12 +1649,13 @@ components:
example: did:prism:issuerofverifiablecredentials
connectionId:
type: string
- description: The unique identifier of a DIDComm connection that already
+ description:
+ The unique identifier of a DIDComm connection that already
exists between the issuer and the holder, and that will be used to execute
the issue credential protocol.
CreateManagedDIDResponse:
required:
- - longFormDid
+ - longFormDid
type: object
properties:
longFormDid:
@@ -1630,44 +1664,46 @@ components:
example: did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff:Cr4BCrsBElsKBmF1dGgtMRAEQk8KCXNlY3AyNTZrMRIg0opTuxu-zt6aRbT1tPniG4eu4CYsQPM3rrLzvzNiNgwaIIFTnyT2N4U7qCQ78qtWC3-p0el6Hvv8qxG5uuEw-WgMElwKB21hc3RlcjAQAUJPCglzZWNwMjU2azESIKhBU0eCOO6Vinz_8vhtFSAhYYqrkEXC8PHGxkuIUev8GiAydFHLXb7c22A1Uj_PR21NZp6BCDQqNq2xd244txRgsQ
CreateManagedDidRequest:
required:
- - documentTemplate
+ - documentTemplate
type: object
properties:
documentTemplate:
- $ref: '#/components/schemas/CreateManagedDidRequestDocumentTemplate'
+ $ref: "#/components/schemas/CreateManagedDidRequestDocumentTemplate"
CreateManagedDidRequestDocumentTemplate:
type: object
properties:
publicKeys:
type: array
items:
- $ref: '#/components/schemas/ManagedDIDKeyTemplate'
+ $ref: "#/components/schemas/ManagedDIDKeyTemplate"
services:
type: array
items:
- $ref: '#/components/schemas/Service'
+ $ref: "#/components/schemas/Service"
contexts:
type: array
items:
type: string
CredentialSchemaInput:
required:
- - name
- - version
- - type
- - schema
- - author
+ - name
+ - version
+ - type
+ - schema
+ - author
type: object
properties:
name:
type: string
- description: A human-readable name for the credential schema. A piece of
+ description:
+ A human-readable name for the credential schema. A piece of
Metadata.
example: DrivingLicense
minLength: 1
version:
type: string
- description: Denotes the revision of a given Credential Schema. It should
+ description:
+ Denotes the revision of a given Credential Schema. It should
follow semantic version convention to describe the impact of the schema
evolution.
example: 1.0.0
@@ -1679,11 +1715,13 @@ components:
minLength: 1
type:
type: string
- description: This field resolves to a JSON schema with details about the
+ description:
+ This field resolves to a JSON schema with details about the
schema metadata that applies to the schema. A piece of Metadata.
example: https://w3c-ccg.github.io/vc-json-schemas/schema/2.0/schema.json
schema:
- description: Valid JSON Schema where the Credential Schema data fields are
+ description:
+ Valid JSON Schema where the Credential Schema data fields are
defined. A piece of Metadata
example:
$id: https://example.com/driving-license-1.0
@@ -1706,68 +1744,75 @@ components:
drivingClass:
type: integer
required:
- - emailAddress
- - familyName
- - dateOfIssuance
- - drivingLicenseID
- - drivingClass
+ - emailAddress
+ - familyName
+ - dateOfIssuance
+ - drivingLicenseID
+ - drivingClass
additionalProperties: false
tags:
type: array
items:
type: string
- description: Tokens that allow to lookup and filter the credential schema
+ description:
+ Tokens that allow to lookup and filter the credential schema
records.
example:
- - driving
- - licence
- - id
+ - driving
+ - licence
+ - id
author:
type: string
- description: DID of the identity which authored the credential schema. A
+ description:
+ DID of the identity which authored the credential schema. A
piece of Metadata.
example: did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff
pattern: ^did:(?[a-z0-9]+(:[a-z0-9]+)*)\:(?[^#?]*)$
CredentialSchemaResponse:
required:
- - guid
- - id
- - name
- - version
- - description
- - type
- - schema
- - author
- - authored
- - kind
- - self
+ - guid
+ - id
+ - name
+ - version
+ - description
+ - type
+ - schema
+ - author
+ - authored
+ - kind
+ - self
type: object
properties:
guid:
type: string
- description: 'Globally unique id of the credential schema.It''s composed
+ description:
+ "Globally unique id of the credential schema.It's composed
from the bytes of the string that contain the `author`, `name`, and `version`
- values.The string format looks like the resource identifier: `author`/`id`?version=`version`'
+ values.The string format looks like the resource identifier: `author`/`id`?version=`version`"
format: uuid
example: 0527aea1-d131-3948-a34d-03af39aba8b4
id:
type: string
- description: A locally unique identifier to address the schema. UUID is
+ description:
+ A locally unique identifier to address the schema. UUID is
generated by the backend.
example: 0527aea1-d131-3948-a34d-03af39aba8b5
longId:
type: string
- description: Resource id of the credential schema. Contains the `author`'s
+ description:
+ Resource id of the credential schema. Contains the `author`'s
DID, `id` and `version` fields.
example: did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff/0527aea1-d131-3948-a34d-03af39aba8b4?version=1.0.0
name:
type: string
- description: A human-readable name for the credential schema. A piece of
+ description:
+ A human-readable name for the credential schema. A piece of
Metadata.
example: DrivingLicense
version:
type: string
- description: Denotes the revision of a given Credential Schema. It should
+ description:
+ Denotes the revision of a given Credential Schema. It should
follow semantic version convention to describe the impact of the schema
evolution.
example: 1.0.0
@@ -1775,23 +1820,26 @@ components:
type: array
items:
type: string
- description: Tokens that allow to lookup and filter the credential schema
+ description:
+ Tokens that allow to lookup and filter the credential schema
records.
example:
- - driving
- - licence
- - id
+ - driving
+ - licence
+ - id
description:
type: string
description: A human-readable description of the credential schema
example: Simple credential schema for the driving licence verifiable credential.
type:
type: string
- description: This field resolves to a JSON schema with details about the
+ description:
+ This field resolves to a JSON schema with details about the
schema metadata that applies to the schema. A piece of Metadata.
example: https://w3c-ccg.github.io/vc-json-schemas/schema/2.0/schema.json
schema:
- description: Valid JSON Schema where the Credential Schema data fields are
+ description:
+ Valid JSON Schema where the Credential Schema data fields are
defined. A piece of Metadata
example:
$id: https://example.com/driving-license-1.0
@@ -1814,52 +1862,58 @@ components:
drivingClass:
type: integer
required:
- - emailAddress
- - familyName
- - dateOfIssuance
- - drivingLicenseID
- - drivingClass
+ - emailAddress
+ - familyName
+ - dateOfIssuance
+ - drivingLicenseID
+ - drivingClass
additionalProperties: false
author:
type: string
- description: DID of the identity which authored the credential schema. A
+ description:
+ DID of the identity which authored the credential schema. A
piece of Metadata.
example: did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff
authored:
type: string
- description: '[RFC3339](https://www.rfc-editor.org/rfc/rfc3339) date on
- which the credential schema was created. A piece of Metadata.'
+ description:
+ "[RFC3339](https://www.rfc-editor.org/rfc/rfc3339) date on
+ which the credential schema was created. A piece of Metadata."
format: date-time
example: 2022-03-10T12:00Z
proof:
- $ref: '#/components/schemas/Proof'
+ $ref: "#/components/schemas/Proof"
kind:
type: string
- description: A string that identifies the type of resource being returned
+ description:
+ A string that identifies the type of resource being returned
in the response.
example: CredentialSchema
self:
type: string
- description: The URL that uniquely identifies the resource being returned
+ description:
+ The URL that uniquely identifies the resource being returned
in the response.
example: /prism-agent/schema-registry/schemas/0527aea1-d131-3948-a34d-03af39aba8b4
CredentialSchemaResponsePage:
required:
- - kind
- - self
- - pageOf
+ - kind
+ - self
+ - pageOf
type: object
properties:
contents:
type: array
items:
- $ref: '#/components/schemas/CredentialSchemaResponse'
- description: A sequence of CredentialSchemaResponse objects representing
+ $ref: "#/components/schemas/CredentialSchemaResponse"
+ description:
+ A sequence of CredentialSchemaResponse objects representing
the list of credential schemas that the API response contains
example: []
kind:
type: string
- description: A string field indicating the type of the API response. In
+ description:
+ A string field indicating the type of the API response. In
this case, it will always be set to `CredentialSchemaPage`
example: CredentialSchemaPage
self:
@@ -1868,27 +1922,30 @@ components:
example: /prism-agent/schema-registry/schemas?skip=10&limit=10
pageOf:
type: string
- description: A string field indicating the type of resource that the contents
+ description:
+ A string field indicating the type of resource that the contents
field contains
example: /prism-agent/schema-registry/schemas
next:
type: string
- description: An optional string field containing the URL of the next page
+ description:
+ An optional string field containing the URL of the next page
of results. If the API response does not contain any more pages, this
field should be set to None.
example: /prism-agent/schema-registry/schemas?skip=20&limit=10
previous:
type: string
- description: An optional string field containing the URL of the previous
+ description:
+ An optional string field containing the URL of the previous
page of results. If the API response is the first page of results, this
field should be set to None.
example: /prism-agent/schema-registry/schemas?skip=0&limit=10
DIDDocument:
required:
- - id
+ - id
type: object
properties:
- '@context':
+ "@context":
type: array
items:
type: string
@@ -1901,12 +1958,12 @@ components:
example: did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff
controller:
type: string
- description: '[DID controller](https://www.w3.org/TR/did-core/#did-controller)'
+ description: "[DID controller](https://www.w3.org/TR/did-core/#did-controller)"
example: did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff
verificationMethod:
type: array
items:
- $ref: '#/components/schemas/VerificationMethod'
+ $ref: "#/components/schemas/VerificationMethod"
authentication:
type: array
items:
@@ -1930,14 +1987,15 @@ components:
service:
type: array
items:
- $ref: '#/components/schemas/Service'
+ $ref: "#/components/schemas/Service"
description: A W3C compliant Prism DID document representation.
DIDDocumentMetadata:
type: object
properties:
deactivated:
type: boolean
- description: If a DID has been deactivated, DID document metadata MUST include
+ description:
+ If a DID has been deactivated, DID document metadata MUST include
this property with the boolean value true. If a DID has not been deactivated,
this property is OPTIONAL, but if included, MUST have the boolean value
false.
@@ -1958,23 +2016,25 @@ components:
example: 4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff
created:
type: string
- description: The timestamp of the Cardano block that contained the first
+ description:
+ The timestamp of the Cardano block that contained the first
valid SignedAtalaOperation with a CreateDIDOperation that created the
DID.
- example: '2023-02-04T13:52:10Z'
+ example: "2023-02-04T13:52:10Z"
updated:
type: string
- description: The timestamp of the Cardano block that contained the latest
+ description:
+ The timestamp of the Cardano block that contained the latest
valid SignedAtalaOperation that changed the DID's internal state.
- example: '2023-02-04T13:52:10Z'
- description: '[DID document metadata](https://www.w3.org/TR/did-core/#did-document-metadata)'
+ example: "2023-02-04T13:52:10Z"
+ description: "[DID document metadata](https://www.w3.org/TR/did-core/#did-document-metadata)"
DIDOperationResponse:
required:
- - scheduledOperation
+ - scheduledOperation
type: object
properties:
scheduledOperation:
- $ref: '#/components/schemas/DidOperationSubmission'
+ $ref: "#/components/schemas/DidOperationSubmission"
DIDResolutionMetadata:
type: object
properties:
@@ -1990,28 +2050,28 @@ components:
type: string
description: The media type of the returned DID document
example: application/did+ld+json
- description: '[DID resolution metadata](https://www.w3.org/TR/did-core/#did-resolution-metadata)'
+ description: "[DID resolution metadata](https://www.w3.org/TR/did-core/#did-resolution-metadata)"
DIDResolutionResult:
required:
- - '@context'
- - didDocumentMetadata
- - didResolutionMetadata
+ - "@context"
+ - didDocumentMetadata
+ - didResolutionMetadata
type: object
properties:
- '@context':
+ "@context":
type: string
description: The JSON-LD context for the DID resolution result.
example: https://w3id.org/did-resolution/v1
didDocument:
- $ref: '#/components/schemas/DIDDocument'
+ $ref: "#/components/schemas/DIDDocument"
didDocumentMetadata:
- $ref: '#/components/schemas/DIDDocumentMetadata'
+ $ref: "#/components/schemas/DIDDocumentMetadata"
didResolutionMetadata:
- $ref: '#/components/schemas/DIDResolutionMetadata'
+ $ref: "#/components/schemas/DIDResolutionMetadata"
DidOperationSubmission:
required:
- - id
- - didRef
+ - id
+ - didRef
type: object
properties:
id:
@@ -2024,10 +2084,10 @@ components:
example: did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff
ErrorResponse:
required:
- - status
- - type
- - title
- - instance
+ - status
+ - type
+ - title
+ - instance
type: object
properties:
status:
@@ -2041,22 +2101,25 @@ components:
example: https://example.org/doc/#model-MalformedEmail/
title:
type: string
- description: A short, human-readable summary of the problem type. It does
+ description:
+ A short, human-readable summary of the problem type. It does
not change from occurrence to occurrence of the problem.
example: Malformed email
detail:
type: string
- description: A human-readable explanation specific to this occurrence of
+ description:
+ A human-readable explanation specific to this occurrence of
the problem.
example: The received '{}à!è@!.b}' email does not conform to the email format
instance:
type: string
- description: A URI reference that identifies the specific occurrence of
+ description:
+ A URI reference that identifies the specific occurrence of
the problem. It may or may not yield further information if dereferenced.
example: The received '{}à!è@!.b}' email does not conform to the email format
HealthInfo:
required:
- - version
+ - version
type: object
properties:
version:
@@ -2065,12 +2128,12 @@ components:
example: 1.1.0
IssueCredentialRecord:
required:
- - recordId
- - thid
- - claims
- - createdAt
- - role
- - protocolState
+ - recordId
+ - thid
+ - claims
+ - createdAt
+ - role
+ - protocolState
type: object
properties:
recordId:
@@ -2079,28 +2142,33 @@ components:
example: 80d612dc-0ded-4ac9-90b4-1b8eabb04545
thid:
type: string
- description: The unique identifier of the thread this credential record
+ description:
+ The unique identifier of the thread this credential record
belongs to. The value will identical on both sides of the issue flow (issuer
and holder)
example: 0527aea1-d131-3948-a34d-03af39aba8b4
subjectId:
type: string
- description: The identifier (e.g DID) of the subject to which the verifiable
+ description:
+ The identifier (e.g DID) of the subject to which the verifiable
credential will be issued.
example: did:prism:subjectofverifiablecredentials
validityPeriod:
type: number
- description: The validity period in seconds of the verifiable credential
+ description:
+ The validity period in seconds of the verifiable credential
that will be issued.
format: double
example: 3600.0
claims:
- description: The claims that will be associated with the issued verifiable
+ description:
+ The claims that will be associated with the issued verifiable
credential.
example: (firstname,Alice)
automaticIssuance:
type: boolean
- description: Specifies whether or not the credential should be automatically
+ description:
+ Specifies whether or not the credential should be automatically
generated and issued when receiving the `CredentialRequest` from the holder.
If set to `false`, a manual approval by the issuer via API call will be
required for the VC to be issued.
@@ -2109,42 +2177,45 @@ components:
type: string
description: The date and time when the issue credential record was created.
format: date-time
- example: '2023-08-21T11:02:33.111276Z'
+ example: "2023-08-31T12:08:00.885539Z"
updatedAt:
type: string
- description: The date and time when the issue credential record was last
+ description:
+ The date and time when the issue credential record was last
updated.
format: date-time
role:
type: string
- description: The role played by the Prism agent in the credential issuance
+ description:
+ The role played by the Prism agent in the credential issuance
flow.
example: Issuer
enum:
- - Issuer
- - Holder
+ - Issuer
+ - Holder
protocolState:
type: string
description: The current state of the issue credential protocol execution.
example: OfferPending
enum:
- - OfferPending
- - OfferSent
- - OfferReceived
- - RequestPending
- - RequestGenerated
- - RequestSent
- - RequestReceived
- - CredentialPending
- - CredentialGenerated
- - CredentialSent
- - CredentialReceived
- - ProblemReportPending
- - ProblemReportSent
- - ProblemReportReceived
+ - OfferPending
+ - OfferSent
+ - OfferReceived
+ - RequestPending
+ - RequestGenerated
+ - RequestSent
+ - RequestReceived
+ - CredentialPending
+ - CredentialGenerated
+ - CredentialSent
+ - CredentialReceived
+ - ProblemReportPending
+ - ProblemReportSent
+ - ProblemReportReceived
jwtCredential:
type: string
- description: The base64-encoded JWT verifiable credential that has been
+ description:
+ The base64-encoded JWT verifiable credential that has been
sent by the issuer.
issuingDID:
type: string
@@ -2152,9 +2223,9 @@ components:
example: did:prism:issuerofverifiablecredentials
IssueCredentialRecordPage:
required:
- - self
- - kind
- - pageOf
+ - self
+ - kind
+ - pageOf
type: object
properties:
self:
@@ -2167,43 +2238,48 @@ components:
example: /prism-agent/schema-registry/schemas?skip=10&limit=10
pageOf:
type: string
- description: A string field indicating the type of resource that the contents
+ description:
+ A string field indicating the type of resource that the contents
field contains
example: /prism-agent/schema-registry/schemas
next:
type: string
- description: An optional string field containing the URL of the next page
+ description:
+ An optional string field containing the URL of the next page
of results. If the API response does not contain any more pages, this
field should be set to None.
example: /prism-agent/schema-registry/schemas?skip=20&limit=10
previous:
type: string
- description: An optional string field containing the URL of the previous
+ description:
+ An optional string field containing the URL of the previous
page of results. If the API response is the first page of results, this
field should be set to None.
example: /prism-agent/schema-registry/schemas?skip=0&limit=10
contents:
type: array
items:
- $ref: '#/components/schemas/IssueCredentialRecord'
- description: A sequence of IssueCredentialRecord objects representing the
+ $ref: "#/components/schemas/IssueCredentialRecord"
+ description:
+ A sequence of IssueCredentialRecord objects representing the
list of credential records that the API response contains
example: []
Json:
- description: The service endpoint. Can contain multiple possible values as described
+ description:
+ The service endpoint. Can contain multiple possible values as described
in the [Create DID operation]
example: https://example.com
oneOf:
- - $ref: '#/components/schemas/Arr'
- - $ref: '#/components/schemas/Bool'
- - $ref: '#/components/schemas/Null'
- - $ref: '#/components/schemas/Num'
- - $ref: '#/components/schemas/Obj'
- - $ref: '#/components/schemas/Str'
+ - $ref: "#/components/schemas/Arr"
+ - $ref: "#/components/schemas/Bool"
+ - $ref: "#/components/schemas/Null"
+ - $ref: "#/components/schemas/Num"
+ - $ref: "#/components/schemas/Obj"
+ - $ref: "#/components/schemas/Str"
ManagedDID:
required:
- - did
- - status
+ - did
+ - status
type: object
properties:
did:
@@ -2212,7 +2288,8 @@ components:
example: did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff
longFormDid:
type: string
- description: A long-form DID. Mandatory when status is not PUBLISHED and
+ description:
+ A long-form DID. Mandatory when status is not PUBLISHED and
optional when status is PUBLISHED
example: did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff:Cr4BCrsBElsKBmF1dGgtMRAEQk8KCXNlY3AyNTZrMRIg0opTuxu-zt6aRbT1tPniG4eu4CYsQPM3rrLzvzNiNgwaIIFTnyT2N4U7qCQ78qtWC3-p0el6Hvv8qxG5uuEw-WgMElwKB21hc3RlcjAQAUJPCglzZWNwMjU2azESIKhBU0eCOO6Vinz_8vhtFSAhYYqrkEXC8PHGxkuIUev8GiAydFHLXb7c22A1Uj_PR21NZp6BCDQqNq2xd244txRgsQ
status:
@@ -2223,8 +2300,8 @@ components:
example: CREATED
ManagedDIDKeyTemplate:
required:
- - id
- - purpose
+ - id
+ - purpose
type: object
properties:
id:
@@ -2232,13 +2309,13 @@ components:
description: Identifier of a verification material in the DID Document
example: key-1
purpose:
- $ref: '#/components/schemas/Purpose'
+ $ref: "#/components/schemas/Purpose"
description: key-pair template to add to DID document.
ManagedDIDPage:
required:
- - self
- - kind
- - pageOf
+ - self
+ - kind
+ - pageOf
type: object
properties:
self:
@@ -2254,12 +2331,12 @@ components:
contents:
type: array
items:
- $ref: '#/components/schemas/ManagedDID'
- 'Null':
+ $ref: "#/components/schemas/ManagedDID"
+ "Null":
type: object
Num:
required:
- - value
+ - value
type: object
properties:
value:
@@ -2268,8 +2345,8 @@ components:
type: object
Options:
required:
- - challenge
- - domain
+ - challenge
+ - domain
type: object
properties:
challenge:
@@ -2280,7 +2357,8 @@ components:
type: string
description: The domain value can be any string or URI.
example: https://example-verifier.com
- description: The options to use when creating the proof presentation request
+ description:
+ The options to use when creating the proof presentation request
(e.g., domain, challenge).
PatchContextAction:
type: object
@@ -2291,10 +2369,10 @@ components:
type: string
PresentationStatus:
required:
- - presentationId
- - thid
- - role
- - status
+ - presentationId
+ - thid
+ - role
+ - status
type: object
properties:
presentationId:
@@ -2303,42 +2381,45 @@ components:
example: 3c6d9fa5-d277-431e-a6cb-d3956e47e610
thid:
type: string
- description: The unique identifier of the thread this presentation record
+ description:
+ The unique identifier of the thread this presentation record
belongs to. The value will identical on both sides of the presentation
flow (verifier and prover)
example: 0527aea1-d131-3948-a34d-03af39aba8b4
role:
type: string
- description: The role played by the Prism agent in the proof presentation
+ description:
+ The role played by the Prism agent in the proof presentation
flow.
example: Verifier
enum:
- - Verifier
- - Prover
+ - Verifier
+ - Prover
status:
type: string
description: The current state of the proof presentation record.
example: RequestPending
enum:
- - RequestPending
- - RequestSent
- - RequestReceived
- - RequestRejected
- - PresentationPending
- - PresentationGenerated
- - PresentationSent
- - PresentationReceived
- - PresentationVerified
- - PresentationAccepted
- - PresentationRejected
- - ProblemReportPending
- - ProblemReportSent
- - ProblemReportReceived
+ - RequestPending
+ - RequestSent
+ - RequestReceived
+ - RequestRejected
+ - PresentationPending
+ - PresentationGenerated
+ - PresentationSent
+ - PresentationReceived
+ - PresentationVerified
+ - PresentationAccepted
+ - PresentationRejected
+ - ProblemReportPending
+ - ProblemReportSent
+ - ProblemReportReceived
proofs:
type: array
items:
- $ref: '#/components/schemas/ProofRequestAux'
- description: The type of proofs requested in the context of this proof presentation
+ $ref: "#/components/schemas/ProofRequestAux"
+ description:
+ The type of proofs requested in the context of this proof presentation
request (e.g., VC schema, trusted issuers, etc.)
example: []
data:
@@ -2349,20 +2430,21 @@ components:
example: []
connectionId:
type: string
- description: The unique identifier of an established connection between
+ description:
+ The unique identifier of an established connection between
the verifier and the prover.
example: bc528dc8-69f1-4c5a-a508-5f8019047900
PresentationStatusPage:
required:
- - self
- - kind
- - pageOf
+ - self
+ - kind
+ - pageOf
type: object
properties:
contents:
type: array
items:
- $ref: '#/components/schemas/PresentationStatus'
+ $ref: "#/components/schemas/PresentationStatus"
description: A sequence of Presentation objects.
example: []
self:
@@ -2380,48 +2462,53 @@ components:
next:
type: string
description: URL of the next page (if available)
- example: ''
+ example: ""
previous:
type: string
description: URL of the previous page (if available)
- example: ''
+ example: ""
Proof:
required:
- - type
- - created
- - verificationMethod
- - proofPurpose
- - proofValue
- - jws
+ - type
+ - created
+ - verificationMethod
+ - proofPurpose
+ - proofValue
+ - jws
type: object
properties:
type:
type: string
- description: The type of cryptographic signature algorithm used to generate
+ description:
+ The type of cryptographic signature algorithm used to generate
the proof.
example: Ed25519Signature2018
created:
type: string
- description: The date and time at which the proof was created, in UTC format.
+ description:
+ The date and time at which the proof was created, in UTC format.
This field is used to ensure that the proof was generated before or at
the same time as the credential schema itself.
format: date-time
example: 2022-03-10T12:00Z
verificationMethod:
type: string
- description: The verification method used to generate the proof. This is
+ description:
+ The verification method used to generate the proof. This is
usually a DID and key ID combination that can be used to look up the public
key needed to verify the proof.
example: did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff#key-1
proofPurpose:
type: string
- description: 'The purpose of the proof (for example: `assertionMethod`).
+ description:
+ "The purpose of the proof (for example: `assertionMethod`).
This indicates that the proof is being used to assert that the issuer
- really issued this credential schema instance.'
+ really issued this credential schema instance."
example: assertionMethod
proofValue:
type: string
- description: The cryptographic signature value that was generated using
+ description:
+ The cryptographic signature value that was generated using
the private key associated with the verification method, and which can
be used to verify the proof.
example: FiPfjknHikKmZ...
@@ -2431,14 +2518,16 @@ components:
example: eyJhbGciOiJFZERTQSIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il0sImt0eSI6Ik...
domain:
type: string
- description: It specifies the domain context within which the credential
+ description:
+ It specifies the domain context within which the credential
schema and proof are being used
example: prims.atala.com
- description: A digital signature over the Credential Schema for the sake of
+ description:
+ A digital signature over the Credential Schema for the sake of
asserting authorship. A piece of Metadata.
example:
type: Ed25519Signature2018
- created: '2022-03-10T12:00:00Z'
+ created: "2022-03-10T12:00:00Z"
verificationMethod: did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff#key-1
proofPurpose: assertionMethod
proofValue: FiPfjknHikKmZ...
@@ -2446,7 +2535,7 @@ components:
domain: prims.atala.com
ProofRequestAux:
required:
- - schemaId
+ - schemaId
type: object
properties:
schemaId:
@@ -2457,15 +2546,16 @@ components:
type: array
items:
type: string
- description: One or more issuers that are trusted by the verifier emitting
+ description:
+ One or more issuers that are trusted by the verifier emitting
the proof presentation request.
example:
- - did:web:atalaprism.io/users/testUser
- - did.prism:123
- - did:prism:...
+ - did:web:atalaprism.io/users/testUser
+ - did.prism:123
+ - did:prism:...
PublicKeyJwk:
required:
- - kty
+ - kty
type: object
properties:
crv:
@@ -2481,21 +2571,21 @@ components:
description: Purpose of the verification material in the DID Document
example: authentication
enum:
- - assertionMethod
- - authentication
- - capabilityDelegation
- - capabilityInvocation
- - keyAgreement
+ - assertionMethod
+ - authentication
+ - capabilityDelegation
+ - capabilityInvocation
+ - keyAgreement
RemoveEntryById:
required:
- - id
+ - id
type: object
properties:
id:
type: string
RequestPresentationAction:
required:
- - action
+ - action
type: object
properties:
action:
@@ -2503,41 +2593,44 @@ components:
description: The action to perform on the proof presentation record.
example: request-accept
enum:
- - request-accept
- - request-reject
- - presentation-accept
- - presentation-reject
+ - request-accept
+ - request-reject
+ - presentation-accept
+ - presentation-reject
proofId:
type: array
items:
type: string
- description: The unique identifier of the issue credential record - and
+ description:
+ The unique identifier of the issue credential record - and
hence VC - to use as the prover accepts the presentation request. Only
applicable on the prover side when the action is `request-accept`.
RequestPresentationInput:
required:
- - connectionId
+ - connectionId
type: object
properties:
connectionId:
type: string
- description: The unique identifier of an established connection between
+ description:
+ The unique identifier of an established connection between
the verifier and the prover.
example: bc528dc8-69f1-4c5a-a508-5f8019047900
options:
- $ref: '#/components/schemas/Options'
+ $ref: "#/components/schemas/Options"
proofs:
type: array
items:
- $ref: '#/components/schemas/ProofRequestAux'
- description: The type of proofs requested in the context of this proof presentation
+ $ref: "#/components/schemas/ProofRequestAux"
+ description:
+ The type of proofs requested in the context of this proof presentation
request (e.g., VC schema, trusted issuers, etc.)
example: []
Service:
required:
- - id
- - type
- - serviceEndpoint
+ - id
+ - type
+ - serviceEndpoint
type: object
properties:
id:
@@ -2548,21 +2641,22 @@ components:
Returns the full ID (with DID prefix) when resolving DID
example: service-1
type:
- description: Service type. Can contain multiple possible values as described
+ description:
+ Service type. Can contain multiple possible values as described
in the [Create DID operation](https://github.com/input-output-hk/prism-did-method-spec/blob/main/w3c-spec/PRISM-method.md#create-did)
under the construction section.
example: Single(LinkedDomains)
oneOf:
- - type: array
- items:
- type: string
- - type: string
+ - type: array
+ items:
+ type: string
+ - type: string
serviceEndpoint:
- $ref: '#/components/schemas/Json'
+ $ref: "#/components/schemas/Json"
description: A service expressed in the DID document. https://www.w3.org/TR/did-core/#services
Str:
required:
- - value
+ - value
type: object
properties:
value:
@@ -2573,33 +2667,33 @@ components:
actions:
type: array
items:
- $ref: '#/components/schemas/UpdateManagedDIDRequestAction'
+ $ref: "#/components/schemas/UpdateManagedDIDRequestAction"
UpdateManagedDIDRequestAction:
required:
- - actionType
+ - actionType
type: object
properties:
actionType:
- $ref: '#/components/schemas/ActionType'
+ $ref: "#/components/schemas/ActionType"
addKey:
- $ref: '#/components/schemas/ManagedDIDKeyTemplate'
+ $ref: "#/components/schemas/ManagedDIDKeyTemplate"
removeKey:
- $ref: '#/components/schemas/RemoveEntryById'
+ $ref: "#/components/schemas/RemoveEntryById"
addService:
- $ref: '#/components/schemas/Service'
+ $ref: "#/components/schemas/Service"
removeService:
- $ref: '#/components/schemas/RemoveEntryById'
+ $ref: "#/components/schemas/RemoveEntryById"
updateService:
- $ref: '#/components/schemas/UpdateManagedDIDServiceAction'
+ $ref: "#/components/schemas/UpdateManagedDIDServiceAction"
patchContext:
- $ref: '#/components/schemas/PatchContextAction'
+ $ref: "#/components/schemas/PatchContextAction"
description: |-
A list of actions to perform on DID document.
The field `addKey`, `removeKey`, `addService`, `removeService`, `updateService`, `patchContext` must corresponds to
the `actionType` specified. For example, `addKey` must be present when `actionType` is `ADD_KEY`.
UpdateManagedDIDServiceAction:
required:
- - id
+ - id
type: object
properties:
id:
@@ -2610,20 +2704,21 @@ components:
description: The type of the service
example: LinkedDomains
oneOf:
- - type: array
- items:
- type: string
- - type: string
+ - type: array
+ items:
+ type: string
+ - type: string
serviceEndpoint:
- $ref: '#/components/schemas/Json'
- description: A patch to existing Service. 'type' and 'serviceEndpoint' cannot
+ $ref: "#/components/schemas/Json"
+ description:
+ A patch to existing Service. 'type' and 'serviceEndpoint' cannot
both be empty.
VerificationMethod:
required:
- - id
- - type
- - controller
- - publicKeyJwk
+ - id
+ - type
+ - controller
+ - publicKeyJwk
type: object
properties:
id:
@@ -2639,18 +2734,18 @@ components:
description: The DID that controls the verification method.
example: did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff
publicKeyJwk:
- $ref: '#/components/schemas/PublicKeyJwk'
+ $ref: "#/components/schemas/PublicKeyJwk"
description: A cryptographic public key expressed in the DID document. https://www.w3.org/TR/did-core/#verification-methods
VerificationPolicy:
required:
- - self
- - kind
- - id
- - nonce
- - name
- - description
- - createdAt
- - updatedAt
+ - self
+ - kind
+ - id
+ - nonce
+ - name
+ - description
+ - createdAt
+ - updatedAt
type: object
properties:
self:
@@ -2676,10 +2771,10 @@ components:
constraints:
type: array
items:
- $ref: '#/components/schemas/VerificationPolicyConstraint'
+ $ref: "#/components/schemas/VerificationPolicyConstraint"
VerificationPolicyConstraint:
required:
- - schemaId
+ - schemaId
type: object
properties:
schemaId:
@@ -2690,8 +2785,8 @@ components:
type: string
VerificationPolicyInput:
required:
- - name
- - description
+ - name
+ - description
type: object
properties:
id:
@@ -2704,12 +2799,12 @@ components:
constraints:
type: array
items:
- $ref: '#/components/schemas/VerificationPolicyConstraint'
+ $ref: "#/components/schemas/VerificationPolicyConstraint"
VerificationPolicyPage:
required:
- - self
- - kind
- - pageOf
+ - self
+ - kind
+ - pageOf
type: object
properties:
self:
@@ -2725,4 +2820,4 @@ components:
contents:
type: array
items:
- $ref: '#/components/schemas/VerificationPolicy'
+ $ref: "#/components/schemas/VerificationPolicy"
diff --git a/prism-agent/service/server/src/main/resources/application.conf b/prism-agent/service/server/src/main/resources/application.conf
index b416df6fd8..28c926f5cb 100644
--- a/prism-agent/service/server/src/main/resources/application.conf
+++ b/prism-agent/service/server/src/main/resources/application.conf
@@ -75,6 +75,8 @@ connect {
connectBgJobRecurrenceDelay = ${?CONNECT_BG_JOB_RECURRENCE_DELAY}
connectBgJobProcessingParallelism = 5
connectBgJobProcessingParallelism = ${?CONNECT_BG_JOB_PROCESSING_PARALLELISM}
+ connectInvitationExpiry = 300 seconds
+ connectInvitationExpiry = ${?CONNECT_INVITATION_EXPIRY}
}
agent {
diff --git a/prism-agent/service/server/src/main/scala/io/iohk/atala/agent/server/Main.scala b/prism-agent/service/server/src/main/scala/io/iohk/atala/agent/server/Main.scala
index 9af17127e0..94110b8c7c 100644
--- a/prism-agent/service/server/src/main/scala/io/iohk/atala/agent/server/Main.scala
+++ b/prism-agent/service/server/src/main/scala/io/iohk/atala/agent/server/Main.scala
@@ -27,12 +27,14 @@ import io.iohk.atala.iam.wallet.http.controller.WalletManagementControllerImpl
import io.iohk.atala.issue.controller.IssueControllerImpl
import io.iohk.atala.mercury.*
import io.iohk.atala.pollux.core.service.*
+import io.iohk.atala.pollux.credentialdefinition.controller.CredentialDefinitionControllerImpl
import io.iohk.atala.pollux.credentialschema.controller.{
CredentialSchemaController,
CredentialSchemaControllerImpl,
VerificationPolicyControllerImpl
}
import io.iohk.atala.pollux.sql.repository.{
+ JdbcCredentialDefinitionRepository,
JdbcCredentialRepository,
JdbcCredentialSchemaRepository,
JdbcPresentationRepository,
@@ -118,6 +120,7 @@ object MainApp extends ZIOAppDefault {
// controller
ConnectionControllerImpl.layer,
CredentialSchemaControllerImpl.layer,
+ CredentialDefinitionControllerImpl.layer,
DIDControllerImpl.layer,
DIDRegistrarControllerImpl.layer,
IssueControllerImpl.layer,
@@ -135,6 +138,7 @@ object MainApp extends ZIOAppDefault {
// service
ConnectionServiceImpl.layer >>> ConnectionServiceNotifier.layer,
CredentialSchemaServiceImpl.layer,
+ CredentialDefinitionServiceImpl.layer,
CredentialServiceImpl.layer >>> CredentialServiceNotifier.layer,
DIDServiceImpl.layer,
EntityServiceImpl.layer,
@@ -157,6 +161,7 @@ object MainApp extends ZIOAppDefault {
RepoModule.connectContextAwareTransactorLayer >>> JdbcConnectionRepository.layer,
RepoModule.polluxContextAwareTransactorLayer >>> JdbcCredentialRepository.layer,
RepoModule.polluxContextAwareTransactorLayer ++ RepoModule.polluxTransactorLayer >>> JdbcCredentialSchemaRepository.layer,
+ RepoModule.polluxContextAwareTransactorLayer ++ RepoModule.polluxTransactorLayer >>> JdbcCredentialDefinitionRepository.layer,
RepoModule.polluxContextAwareTransactorLayer >>> JdbcPresentationRepository.layer,
RepoModule.polluxContextAwareTransactorLayer >>> JdbcVerificationPolicyRepository.layer,
// event notification service
diff --git a/prism-agent/service/server/src/main/scala/io/iohk/atala/agent/server/PrismAgentApp.scala b/prism-agent/service/server/src/main/scala/io/iohk/atala/agent/server/PrismAgentApp.scala
index e24730e94a..d8c6fa2c96 100644
--- a/prism-agent/service/server/src/main/scala/io/iohk/atala/agent/server/PrismAgentApp.scala
+++ b/prism-agent/service/server/src/main/scala/io/iohk/atala/agent/server/PrismAgentApp.scala
@@ -4,12 +4,8 @@ import io.iohk.atala.agent.notification.WebhookPublisher
import io.iohk.atala.agent.server.config.AppConfig
import io.iohk.atala.agent.server.http.{ZHttp4sBlazeServer, ZHttpEndpoints}
import io.iohk.atala.agent.server.jobs.{BackgroundJobs, ConnectBackgroundJobs}
-import io.iohk.atala.agent.walletapi.model.Entity
-import io.iohk.atala.agent.walletapi.model.Wallet
-import io.iohk.atala.agent.walletapi.model.WalletSeed
-import io.iohk.atala.agent.walletapi.service.EntityService
-import io.iohk.atala.agent.walletapi.service.ManagedDIDService
-import io.iohk.atala.agent.walletapi.service.WalletManagementService
+import io.iohk.atala.agent.walletapi.model.{Entity, Wallet, WalletSeed}
+import io.iohk.atala.agent.walletapi.service.{EntityService, ManagedDIDService, WalletManagementService}
import io.iohk.atala.castor.controller.{DIDRegistrarServerEndpoints, DIDServerEndpoints}
import io.iohk.atala.castor.core.service.DIDService
import io.iohk.atala.connect.controller.ConnectionServerEndpoints
@@ -20,18 +16,14 @@ import io.iohk.atala.iam.authentication.apikey.ApiKeyAuthenticator
import io.iohk.atala.iam.entity.http.EntityServerEndpoints
import io.iohk.atala.iam.wallet.http.WalletManagementServerEndpoints
import io.iohk.atala.issue.controller.IssueServerEndpoints
-import io.iohk.atala.mercury.DidOps
-import io.iohk.atala.mercury.HttpClient
-import io.iohk.atala.pollux.core.service.CredentialService
-import io.iohk.atala.pollux.core.service.PresentationService
-import io.iohk.atala.pollux.credentialschema.SchemaRegistryServerEndpoints
-import io.iohk.atala.pollux.credentialschema.VerificationPolicyServerEndpoints
+import io.iohk.atala.mercury.{DidOps, HttpClient}
+import io.iohk.atala.pollux.core.service.{CredentialService, PresentationService}
+import io.iohk.atala.pollux.credentialdefinition.CredentialDefinitionRegistryServerEndpoints
+import io.iohk.atala.pollux.credentialschema.{SchemaRegistryServerEndpoints, VerificationPolicyServerEndpoints}
import io.iohk.atala.pollux.vc.jwt.DidResolver as JwtDidResolver
import io.iohk.atala.presentproof.controller.PresentProofServerEndpoints
import io.iohk.atala.resolvers.DIDResolver
-import io.iohk.atala.shared.models.HexString
-import io.iohk.atala.shared.models.WalletAccessContext
-import io.iohk.atala.shared.models.WalletId
+import io.iohk.atala.shared.models.{HexString, WalletAccessContext, WalletId}
import io.iohk.atala.system.controller.SystemServerEndpoints
import zio.*
@@ -122,35 +114,38 @@ object PrismAgentApp {
}
object AgentHttpServer {
+ val agentRESTServiceEndpoints = for {
+ allCredentialDefinitionRegistryEndpoints <- CredentialDefinitionRegistryServerEndpoints.all
+ allSchemaRegistryEndpoints <- SchemaRegistryServerEndpoints.all
+ allVerificationPolicyEndpoints <- VerificationPolicyServerEndpoints.all
+ allConnectionEndpoints <- ConnectionServerEndpoints.all
+ allIssueEndpoints <- IssueServerEndpoints.all
+ allDIDEndpoints <- DIDServerEndpoints.all
+ allDIDRegistrarEndpoints <- DIDRegistrarServerEndpoints.all
+ allPresentProofEndpoints <- PresentProofServerEndpoints.all
+ allSystemEndpoints <- SystemServerEndpoints.all
+ allEntityEndpoints <- EntityServerEndpoints.all
+ allWalletManagementEndpoints <- WalletManagementServerEndpoints.all
+ allEventEndpoints <- EventServerEndpoints.all
+ } yield allCredentialDefinitionRegistryEndpoints ++
+ allSchemaRegistryEndpoints ++
+ allVerificationPolicyEndpoints ++
+ allConnectionEndpoints ++
+ allDIDEndpoints ++
+ allDIDRegistrarEndpoints ++
+ allIssueEndpoints ++
+ allPresentProofEndpoints ++
+ allSystemEndpoints ++
+ allEntityEndpoints ++
+ allWalletManagementEndpoints ++
+ allEventEndpoints
def run =
for {
- allSchemaRegistryEndpoints <- SchemaRegistryServerEndpoints.all
- allVerificationPolicyEndpoints <- VerificationPolicyServerEndpoints.all
- allConnectionEndpoints <- ConnectionServerEndpoints.all
- allIssueEndpoints <- IssueServerEndpoints.all
- allDIDEndpoints <- DIDServerEndpoints.all
- allDIDRegistrarEndpoints <- DIDRegistrarServerEndpoints.all
- allPresentProofEndpoints <- PresentProofServerEndpoints.all
- allSystemEndpoints <- SystemServerEndpoints.all
- allEntityEndpoints <- EntityServerEndpoints.all
- allWalletManagementEndpoints <- WalletManagementServerEndpoints.all
- allEventEndpoints <- EventServerEndpoints.all
- allEndpoints = ZHttpEndpoints.withDocumentations[Task](
- allSchemaRegistryEndpoints ++
- allVerificationPolicyEndpoints ++
- allConnectionEndpoints ++
- allDIDEndpoints ++
- allDIDRegistrarEndpoints ++
- allIssueEndpoints ++
- allPresentProofEndpoints ++
- allSystemEndpoints ++
- allEntityEndpoints ++
- allWalletManagementEndpoints ++
- allEventEndpoints
- )
+ allEndpoints <- agentRESTServiceEndpoints
+ allEndpointsWithDocumentation = ZHttpEndpoints.withDocumentations[Task](allEndpoints)
server <- ZHttp4sBlazeServer.make
appConfig <- ZIO.service[AppConfig]
- _ <- server.start(allEndpoints, port = appConfig.agent.httpEndpoint.http.port).debug
+ _ <- server.start(allEndpointsWithDocumentation, port = appConfig.agent.httpEndpoint.http.port).debug
} yield ()
}
diff --git a/prism-agent/service/server/src/main/scala/io/iohk/atala/agent/server/config/AppConfig.scala b/prism-agent/service/server/src/main/scala/io/iohk/atala/agent/server/config/AppConfig.scala
index 5d0a0245b6..8f23db2ee5 100644
--- a/prism-agent/service/server/src/main/scala/io/iohk/atala/agent/server/config/AppConfig.scala
+++ b/prism-agent/service/server/src/main/scala/io/iohk/atala/agent/server/config/AppConfig.scala
@@ -40,7 +40,8 @@ final case class ConnectConfig(
database: DatabaseConfig,
connectBgJobRecordsLimit: Int,
connectBgJobRecurrenceDelay: Duration,
- connectBgJobProcessingParallelism: Int
+ connectBgJobProcessingParallelism: Int,
+ connectInvitationExpiry: Duration,
)
final case class PrismNodeConfig(service: GrpcServiceConfig)
diff --git a/prism-agent/service/server/src/main/scala/io/iohk/atala/agent/server/jobs/ConnectBackgroundJobs.scala b/prism-agent/service/server/src/main/scala/io/iohk/atala/agent/server/jobs/ConnectBackgroundJobs.scala
index 1242864d07..231ed2ce4e 100644
--- a/prism-agent/service/server/src/main/scala/io/iohk/atala/agent/server/jobs/ConnectBackgroundJobs.scala
+++ b/prism-agent/service/server/src/main/scala/io/iohk/atala/agent/server/jobs/ConnectBackgroundJobs.scala
@@ -14,11 +14,13 @@ import io.iohk.atala.mercury.model.*
import io.iohk.atala.mercury.model.error.*
import io.iohk.atala.resolvers.DIDResolver
import io.iohk.atala.shared.models.WalletAccessContext
-import io.iohk.atala.shared.utils.aspects.CustomMetricsAspect
import io.iohk.atala.shared.utils.DurationOps.toMetricsSeconds
+import io.iohk.atala.shared.utils.aspects.CustomMetricsAspect
import zio.*
import zio.metrics.*
+import java.time.{Duration, Instant}
+
object ConnectBackgroundJobs {
val didCommExchanges = {
@@ -39,7 +41,10 @@ object ConnectBackgroundJobs {
private[this] def performExchange(
record: ConnectionRecord
- ): URIO[DidOps & DIDResolver & HttpClient & ConnectionService & ManagedDIDService & WalletAccessContext, Unit] = {
+ ): URIO[
+ DidOps & DIDResolver & HttpClient & ConnectionService & ManagedDIDService & WalletAccessContext & AppConfig,
+ Unit
+ ] = {
import ProtocolState.*
import Role.*
@@ -59,6 +64,9 @@ object ConnectBackgroundJobs {
val InviterConnectionResponseMsgSuccess = counterMetric(
"connection_flow_inviter_connection_response_msg_success_counter"
)
+ val InviterConnectionInvitationExpiredSuccess = counterMetric(
+ "connection_flow_inviter_connection_invitation_expired_success_counter"
+ )
val InviteeProcessConnectionRecordPendingSuccess = counterMetric(
"connection_flow_invitee_process_connection_record_success_counter"
)
@@ -156,7 +164,6 @@ object ConnectBackgroundJobs {
else ZIO.fail(ErrorResponseReceivedFromPeerAgent(resp)) @@ InviterConnectionResponseMsgFailed
}
} yield ()
-
inviterProcessFlow
@@ InviterProcessConnectionRecordPendingSuccess.trackSuccess
@@ InviterProcessConnectionRecordPendingFailed.trackError
@@ -164,7 +171,35 @@ object ConnectBackgroundJobs {
@@ Metric
.gauge("connection_flow_inviter_process_connection_record_ms_gauge")
.trackDurationWith(_.toMetricsSeconds)
-
+ case ConnectionRecord(
+ id,
+ createdAt,
+ _,
+ _,
+ _,
+ Inviter,
+ InvitationGenerated,
+ _,
+ _,
+ _,
+ metaRetries,
+ _,
+ _
+ ) if metaRetries > 0 =>
+ for {
+ connectionService <- ZIO.service[ConnectionService]
+ config <- ZIO.service[AppConfig]
+ expired <- ZIO.succeed {
+ val expiryDuration = config.connect.connectInvitationExpiry
+ val actualDuration = Duration.between(createdAt, Instant.now())
+ actualDuration > expiryDuration
+ }
+ _ <-
+ if (expired) {
+ connectionService.markConnectionInvitationExpired(id)
+ @@ InviterConnectionInvitationExpiredSuccess
+ } else ZIO.unit
+ } yield ()
case _ => ZIO.unit
}
diff --git a/prism-agent/service/server/src/main/scala/io/iohk/atala/api/http/codec/DIDCodec.scala b/prism-agent/service/server/src/main/scala/io/iohk/atala/api/http/codec/DIDCodec.scala
index 4ffba6d049..dc2a566eb8 100644
--- a/prism-agent/service/server/src/main/scala/io/iohk/atala/api/http/codec/DIDCodec.scala
+++ b/prism-agent/service/server/src/main/scala/io/iohk/atala/api/http/codec/DIDCodec.scala
@@ -17,7 +17,12 @@ object DIDCodec {
}
def emptyDidJsonLD: Codec[String, DIDResolutionResult, DIDJsonLD] =
- didJsonLD.schema(s => Schema.schemaForString.description("Empty representation").as)
+ didJsonLD.schema(_ =>
+ Schema.schemaForByteArray
+ .description("Empty representation")
+ .encodedExample(Array.emptyByteArray)
+ .as
+ )
def didJsonLD: Codec[String, DIDResolutionResult, DIDJsonLD] = {
val errorMsg = "Decoding application/did+ld+json resource is not supported"
diff --git a/prism-agent/service/server/src/main/scala/io/iohk/atala/castor/controller/DIDEndpoints.scala b/prism-agent/service/server/src/main/scala/io/iohk/atala/castor/controller/DIDEndpoints.scala
index b8b63daf05..dd2aa28aa5 100644
--- a/prism-agent/service/server/src/main/scala/io/iohk/atala/castor/controller/DIDEndpoints.scala
+++ b/prism-agent/service/server/src/main/scala/io/iohk/atala/castor/controller/DIDEndpoints.scala
@@ -26,51 +26,51 @@ object DIDEndpoints {
val resolutionEndpointOutput = oneOf[DIDResolutionResult](
oneOfVariantValueMatcher(
StatusCode.Ok,
- oneOfBody[DIDResolutionResult](
- stringBodyUtf8AnyFormat(didResolutionJsonLD),
- stringBodyUtf8AnyFormat(didJsonLD)
+ oneOf[DIDResolutionResult](
+ oneOfVariant(stringBodyUtf8AnyFormat(didResolutionJsonLD)),
+ oneOfVariant(stringBodyUtf8AnyFormat(didJsonLD))
)
)(matchStatus(StatusCode.Ok)),
oneOfVariantValueMatcher(
StatusCode.BadRequest,
- oneOfBody[DIDResolutionResult](
- stringBodyUtf8AnyFormat(didResolutionJsonLD),
- stringBodyUtf8AnyFormat(emptyDidJsonLD)
+ oneOf[DIDResolutionResult](
+ oneOfVariant(stringBodyUtf8AnyFormat(didResolutionJsonLD)),
+ oneOfVariant(stringBodyUtf8AnyFormat(emptyDidJsonLD))
)
)(matchStatus(StatusCode.BadRequest)),
oneOfVariantValueMatcher(
StatusCode.NotFound,
- oneOfBody[DIDResolutionResult](
- stringBodyUtf8AnyFormat(didResolutionJsonLD),
- stringBodyUtf8AnyFormat(emptyDidJsonLD)
+ oneOf[DIDResolutionResult](
+ oneOfVariant(stringBodyUtf8AnyFormat(didResolutionJsonLD)),
+ oneOfVariant(stringBodyUtf8AnyFormat(emptyDidJsonLD))
)
)(matchStatus(StatusCode.NotFound)),
oneOfVariantValueMatcher(
StatusCode.NotAcceptable,
- oneOfBody[DIDResolutionResult](
- stringBodyUtf8AnyFormat(didResolutionJsonLD),
- stringBodyUtf8AnyFormat(emptyDidJsonLD)
+ oneOf[DIDResolutionResult](
+ oneOfVariant(stringBodyUtf8AnyFormat(didResolutionJsonLD)),
+ oneOfVariant(stringBodyUtf8AnyFormat(emptyDidJsonLD))
)
)(matchStatus(StatusCode.NotAcceptable)),
oneOfVariantValueMatcher(
StatusCode.Gone,
- oneOfBody[DIDResolutionResult](
- stringBodyUtf8AnyFormat(didResolutionJsonLD),
- stringBodyUtf8AnyFormat(emptyDidJsonLD)
+ oneOf[DIDResolutionResult](
+ oneOfVariant(stringBodyUtf8AnyFormat(didResolutionJsonLD)),
+ oneOfVariant(stringBodyUtf8AnyFormat(emptyDidJsonLD))
)
)(matchStatus(StatusCode.Gone)),
oneOfVariantValueMatcher(
StatusCode.NotImplemented,
- oneOfBody[DIDResolutionResult](
- stringBodyUtf8AnyFormat(didResolutionJsonLD),
- stringBodyUtf8AnyFormat(emptyDidJsonLD)
+ oneOf[DIDResolutionResult](
+ oneOfVariant(stringBodyUtf8AnyFormat(didResolutionJsonLD)),
+ oneOfVariant(stringBodyUtf8AnyFormat(emptyDidJsonLD))
)
)(matchStatus(StatusCode.NotImplemented)),
oneOfVariantValueMatcher(
StatusCode.InternalServerError,
- oneOfBody[DIDResolutionResult](
- stringBodyUtf8AnyFormat(didResolutionJsonLD),
- stringBodyUtf8AnyFormat(emptyDidJsonLD)
+ oneOf[DIDResolutionResult](
+ oneOfVariant(stringBodyUtf8AnyFormat(didResolutionJsonLD)),
+ oneOfVariant(stringBodyUtf8AnyFormat(emptyDidJsonLD))
)
)(_ => true),
)
diff --git a/prism-agent/service/server/src/main/scala/io/iohk/atala/issue/controller/IssueController.scala b/prism-agent/service/server/src/main/scala/io/iohk/atala/issue/controller/IssueController.scala
index 09b3d03202..fed0613511 100644
--- a/prism-agent/service/server/src/main/scala/io/iohk/atala/issue/controller/IssueController.scala
+++ b/prism-agent/service/server/src/main/scala/io/iohk/atala/issue/controller/IssueController.scala
@@ -61,9 +61,9 @@ object IssueController {
case CredentialServiceError.IrisError(msg) =>
ErrorResponse.internalServerError(title = "VDR Error", detail = Some(msg.toString))
case CredentialServiceError.CredentialSchemaError(e) =>
- ErrorResponse.badRequest(title = "Credential Schema Error", detail = Some(e.userMessage))
+ ErrorResponse.badRequest(title = "Credential Schema Error", detail = Some(e.message))
case CredentialServiceError.UnsupportedVCClaimsValue(error) =>
ErrorResponse.badRequest(detail = Some(error))
case CredentialServiceError.UnsupportedVCClaimsMimeType(mimeType) =>
- ErrorResponse.badRequest(detail = Some(s"Unsupported mime-type for claim: $mimeType"))
+ ErrorResponse.badRequest(detail = Some(s"Unsupported mime_type for claim: $mimeType"))
}
diff --git a/prism-agent/service/server/src/main/scala/io/iohk/atala/issue/controller/http/IssueCredentialRecord.scala b/prism-agent/service/server/src/main/scala/io/iohk/atala/issue/controller/http/IssueCredentialRecord.scala
index 3ff3f43f46..453db1e5e1 100644
--- a/prism-agent/service/server/src/main/scala/io/iohk/atala/issue/controller/http/IssueCredentialRecord.scala
+++ b/prism-agent/service/server/src/main/scala/io/iohk/atala/issue/controller/http/IssueCredentialRecord.scala
@@ -96,12 +96,12 @@ object IssueCredentialRecord {
.map(offer =>
offer.body.credential_preview.attributes
.foldLeft(Json.Obj()) { case (jsObject, attr) =>
- val jsonValue = attr.mimeType match
+ val jsonValue = attr.mime_type match
case Some("application/json") =>
val jsonString =
String(java.util.Base64.getUrlDecoder.decode(attr.value.getBytes(StandardCharsets.UTF_8)))
jsonString.fromJson[Json].getOrElse(Json.Str(s"Unsupported VC claims value: $jsonString"))
- case Some(mime) => Json.Str(s"Unsupported 'mime-type': $mime")
+ case Some(mime) => Json.Str(s"Unsupported 'mime_type': $mime")
case None => Json.Str(attr.value)
jsObject.copy(fields = jsObject.fields.appended(attr.name -> jsonValue))
}
diff --git a/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialdefinition/CredentialDefinitionRegistryEndpoints.scala b/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialdefinition/CredentialDefinitionRegistryEndpoints.scala
new file mode 100644
index 0000000000..337f8e9cf9
--- /dev/null
+++ b/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialdefinition/CredentialDefinitionRegistryEndpoints.scala
@@ -0,0 +1,122 @@
+package io.iohk.atala.pollux.credentialdefinition
+
+import io.iohk.atala.api.http.*
+import io.iohk.atala.api.http.EndpointOutputs.*
+import io.iohk.atala.api.http.codec.OrderCodec.*
+import io.iohk.atala.api.http.model.{Order, PaginationInput}
+import io.iohk.atala.iam.authentication.apikey.ApiKeyCredentials
+import io.iohk.atala.iam.authentication.apikey.ApiKeyEndpointSecurityLogic.apiKeyHeader
+import io.iohk.atala.pollux.credentialdefinition.http.{
+ CredentialDefinitionInput,
+ CredentialDefinitionResponse,
+ CredentialDefinitionResponsePage,
+ FilterInput
+}
+import sttp.model.StatusCode
+import sttp.tapir.json.zio.jsonBody
+import sttp.tapir.{
+ Endpoint,
+ EndpointInput,
+ PublicEndpoint,
+ endpoint,
+ extractFromRequest,
+ path,
+ query,
+ statusCode,
+ stringToPath
+}
+
+import java.util.UUID
+
+object CredentialDefinitionRegistryEndpoints {
+
+ val createCredentialDefinitionEndpoint: Endpoint[
+ ApiKeyCredentials,
+ (RequestContext, CredentialDefinitionInput),
+ ErrorResponse,
+ CredentialDefinitionResponse,
+ Any
+ ] =
+ endpoint.post
+ .securityIn(apiKeyHeader)
+ .in(extractFromRequest[RequestContext](RequestContext.apply))
+ .in("credential-definition-registry" / "definitions")
+ .in(
+ jsonBody[CredentialDefinitionInput]
+ .description(
+ "JSON object required for the credential definition creation"
+ )
+ )
+ .out(
+ statusCode(StatusCode.Created)
+ .description(
+ "The new credential definition record is successfully created"
+ )
+ )
+ .out(jsonBody[http.CredentialDefinitionResponse])
+ .description("Credential definition record")
+ .errorOut(basicFailureAndNotFoundAndForbidden)
+ .name("createCredentialDefinition")
+ .summary("Publish new definition to the definition registry")
+ .description(
+ "Create the new credential definition record with metadata and internal JSON Schema on behalf of Cloud Agent. " +
+ "The credential definition will be signed by the keys of Cloud Agent and issued by the DID that corresponds to it."
+ )
+ .tag("Credential Definition Registry")
+
+ val getCredentialDefinitionByIdEndpoint: PublicEndpoint[
+ (RequestContext, UUID),
+ ErrorResponse,
+ CredentialDefinitionResponse,
+ Any
+ ] =
+ endpoint.get
+ .in(extractFromRequest[RequestContext](RequestContext.apply))
+ .in(
+ "credential-definition-registry" / "definitions" / path[UUID]("guid").description(
+ "Globally unique identifier of the credential definition record"
+ )
+ )
+ .out(jsonBody[CredentialDefinitionResponse].description("CredentialDefinition found by `guid`"))
+ .errorOut(basicFailuresAndNotFound)
+ .name("getCredentialDefinitionById")
+ .summary("Fetch the credential definition from the registry by `guid`")
+ .description(
+ "Fetch the credential definition by the unique identifier"
+ )
+ .tag("Credential Definition Registry")
+
+ private val credentialDefinitionFilterInput: EndpointInput[http.FilterInput] = EndpointInput.derived[http.FilterInput]
+ private val paginationInput: EndpointInput[PaginationInput] = EndpointInput.derived[PaginationInput]
+ val lookupCredentialDefinitionsByQueryEndpoint: Endpoint[
+ ApiKeyCredentials,
+ (
+ RequestContext,
+ FilterInput,
+ PaginationInput,
+ Option[Order]
+ ),
+ ErrorResponse,
+ CredentialDefinitionResponsePage,
+ Any
+ ] =
+ endpoint.get
+ .securityIn(apiKeyHeader)
+ .in(extractFromRequest[RequestContext](RequestContext.apply))
+ .in(
+ "credential-definition-registry" / "definitions".description(
+ "Lookup credential definitions by query"
+ )
+ )
+ .in(credentialDefinitionFilterInput)
+ .in(paginationInput)
+ .in(query[Option[Order]]("order"))
+ .out(jsonBody[CredentialDefinitionResponsePage].description("Collection of CredentialDefinitions records."))
+ .errorOut(basicFailures)
+ .name("lookupCredentialDefinitionsByQuery")
+ .summary("Lookup credential definitions by indexed fields")
+ .description(
+ "Lookup credential definitions by `author`, `name`, `tag` parameters and control the pagination by `offset` and `limit` parameters "
+ )
+ .tag("Credential Definitions Registry")
+}
diff --git a/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialdefinition/CredentialDefinitionRegistryServerEndpoints.scala b/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialdefinition/CredentialDefinitionRegistryServerEndpoints.scala
new file mode 100644
index 0000000000..6f47f6eae8
--- /dev/null
+++ b/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialdefinition/CredentialDefinitionRegistryServerEndpoints.scala
@@ -0,0 +1,80 @@
+package io.iohk.atala.pollux.credentialdefinition
+
+import io.iohk.atala.agent.walletapi.model.Entity
+import io.iohk.atala.api.http.model.{Order, PaginationInput}
+import io.iohk.atala.api.http.{ErrorResponse, RequestContext}
+import io.iohk.atala.iam.authentication.Authenticator
+import io.iohk.atala.iam.authentication.apikey.ApiKeyEndpointSecurityLogic
+import io.iohk.atala.pollux.credentialdefinition
+import io.iohk.atala.pollux.credentialdefinition.CredentialDefinitionRegistryEndpoints.*
+import io.iohk.atala.pollux.credentialdefinition.controller.CredentialDefinitionController
+import io.iohk.atala.pollux.credentialdefinition.http.{CredentialDefinitionInput, FilterInput}
+import sttp.tapir.ztapir.*
+import zio.*
+
+import java.util.UUID
+
+class CredentialDefinitionRegistryServerEndpoints(
+ credentialDefinitionController: CredentialDefinitionController,
+ authenticator: Authenticator
+) {
+ def throwableToInternalServerError(throwable: Throwable) =
+ ZIO.fail[ErrorResponse](ErrorResponse.internalServerError(detail = Option(throwable.getMessage)))
+
+ val createCredentialDefinitionServerEndpoint: ZServerEndpoint[Any, Any] =
+ createCredentialDefinitionEndpoint
+ .zServerSecurityLogic(ApiKeyEndpointSecurityLogic.securityLogic(_)(authenticator))
+ .serverLogic {
+ case entity: Entity => { case (ctx: RequestContext, credentialDefinitionInput: CredentialDefinitionInput) =>
+ credentialDefinitionController
+ .createCredentialDefinition(credentialDefinitionInput)(ctx)
+ .provideSomeLayer(entity.wacLayer)
+ }
+ }
+
+ val getCredentialDefinitionByIdServerEndpoint: ZServerEndpoint[Any, Any] =
+ getCredentialDefinitionByIdEndpoint.zServerLogic { case (ctx: RequestContext, guid: UUID) =>
+ credentialDefinitionController.getCredentialDefinitionByGuid(guid)(ctx)
+ }
+
+ val lookupCredentialDefinitionsByQueryServerEndpoint: ZServerEndpoint[Any, Any] =
+ lookupCredentialDefinitionsByQueryEndpoint
+ .zServerSecurityLogic(ApiKeyEndpointSecurityLogic.securityLogic(_)(authenticator))
+ .serverLogic {
+ case entity: Entity => {
+ case (
+ ctx: RequestContext,
+ filter: FilterInput,
+ paginationInput: PaginationInput,
+ order: Option[Order]
+ ) =>
+ credentialDefinitionController
+ .lookupCredentialDefinitions(
+ filter,
+ paginationInput.toPagination,
+ order
+ )(ctx)
+ .provideSomeLayer(entity.wacLayer)
+ }
+ }
+
+ val all: List[ZServerEndpoint[Any, Any]] =
+ List(
+ createCredentialDefinitionServerEndpoint,
+ getCredentialDefinitionByIdServerEndpoint,
+ lookupCredentialDefinitionsByQueryServerEndpoint
+ )
+}
+
+object CredentialDefinitionRegistryServerEndpoints {
+ def all: URIO[CredentialDefinitionController & Authenticator, List[ZServerEndpoint[Any, Any]]] = {
+ for {
+ credentialDefinitionRegistryService <- ZIO.service[CredentialDefinitionController]
+ authenticator <- ZIO.service[Authenticator]
+ credentialDefinitionRegistryEndpoints = new CredentialDefinitionRegistryServerEndpoints(
+ credentialDefinitionRegistryService,
+ authenticator
+ )
+ } yield credentialDefinitionRegistryEndpoints.all
+ }
+}
diff --git a/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialdefinition/controller/CredentialDefinitionController.scala b/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialdefinition/controller/CredentialDefinitionController.scala
new file mode 100644
index 0000000000..e9c0d6d14e
--- /dev/null
+++ b/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialdefinition/controller/CredentialDefinitionController.scala
@@ -0,0 +1,71 @@
+package io.iohk.atala.pollux.credentialdefinition.controller
+
+import io.iohk.atala.api.http.*
+import io.iohk.atala.api.http.model.{Order, Pagination}
+import io.iohk.atala.pollux.core.service.CredentialDefinitionService
+import io.iohk.atala.pollux.core.service.CredentialDefinitionService.Error.*
+import io.iohk.atala.pollux.credentialdefinition.http.{
+ CredentialDefinitionInput,
+ CredentialDefinitionResponse,
+ CredentialDefinitionResponsePage,
+ FilterInput
+}
+import io.iohk.atala.shared.models.WalletAccessContext
+import zio.*
+
+import java.util.UUID
+import scala.language.implicitConversions
+
+trait CredentialDefinitionController {
+ def createCredentialDefinition(in: CredentialDefinitionInput)(implicit
+ rc: RequestContext
+ ): ZIO[WalletAccessContext, ErrorResponse, CredentialDefinitionResponse]
+
+ def getCredentialDefinitionByGuid(id: UUID)(implicit
+ rc: RequestContext
+ ): IO[ErrorResponse, CredentialDefinitionResponse]
+
+ def delete(guid: UUID)(implicit
+ rc: RequestContext
+ ): ZIO[WalletAccessContext, ErrorResponse, CredentialDefinitionResponse]
+
+ def lookupCredentialDefinitions(
+ filter: FilterInput,
+ pagination: Pagination,
+ order: Option[Order]
+ )(implicit
+ rc: RequestContext
+ ): ZIO[WalletAccessContext, ErrorResponse, CredentialDefinitionResponsePage]
+
+}
+
+object CredentialDefinitionController {
+ def domainToHttpError(
+ error: CredentialDefinitionService.Error
+ ): ErrorResponse = {
+ error match {
+ case RepositoryError(cause: Throwable) =>
+ ErrorResponse.internalServerError("RepositoryError", detail = Option(cause.toString))
+ case NotFoundError(_, _, message) =>
+ ErrorResponse.notFound(detail = Option(message))
+ case UpdateError(id, version, author, message) =>
+ ErrorResponse.badRequest(
+ title = "CredentialDefinitionUpdateError",
+ detail = Option(s"Credential definition update error: id=$id, version=$version, author=$author"),
+ instance = message
+ )
+ case CredentialDefinitionCreationError(msg: String) =>
+ ErrorResponse.badRequest(detail = Option(msg))
+ case UnexpectedError(msg: String) =>
+ ErrorResponse.internalServerError(detail = Option(msg))
+ case CredentialDefinitionValidationError(cause) =>
+ ErrorResponse.badRequest(detail = Some(cause.message))
+ }
+ }
+
+ implicit def domainToHttpErrorIO[R, T](
+ domainIO: ZIO[R, CredentialDefinitionService.Error, T]
+ ): ZIO[R, ErrorResponse, T] = {
+ domainIO.mapError(domainToHttpError)
+ }
+}
diff --git a/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialdefinition/controller/CredentialDefinitionControllerImpl.scala b/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialdefinition/controller/CredentialDefinitionControllerImpl.scala
new file mode 100644
index 0000000000..086d52da3e
--- /dev/null
+++ b/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialdefinition/controller/CredentialDefinitionControllerImpl.scala
@@ -0,0 +1,125 @@
+package io.iohk.atala.pollux.credentialdefinition.controller
+
+import io.iohk.atala.agent.walletapi.model.{ManagedDIDState, PublicationState}
+import io.iohk.atala.agent.walletapi.service.ManagedDIDService
+import io.iohk.atala.api.http.*
+import io.iohk.atala.api.http.model.{CollectionStats, Order, Pagination}
+import io.iohk.atala.castor.core.model.did.{LongFormPrismDID, PrismDID}
+import io.iohk.atala.pollux.core.model.schema.CredentialDefinition.FilteredEntries
+import io.iohk.atala.pollux.core.service.CredentialDefinitionService
+import io.iohk.atala.pollux.core.service.CredentialDefinitionService.Error.*
+import io.iohk.atala.pollux.credentialdefinition
+import io.iohk.atala.pollux.credentialdefinition.controller.CredentialDefinitionController.domainToHttpErrorIO
+import io.iohk.atala.pollux.credentialdefinition.http.CredentialDefinitionInput.toDomain
+import io.iohk.atala.pollux.credentialdefinition.http.CredentialDefinitionResponse.fromDomain
+import io.iohk.atala.pollux.credentialdefinition.http.{
+ CredentialDefinitionInput,
+ CredentialDefinitionResponse,
+ CredentialDefinitionResponsePage,
+ FilterInput
+}
+import io.iohk.atala.shared.models.WalletAccessContext
+import zio.*
+
+import java.util.UUID
+
+class CredentialDefinitionControllerImpl(service: CredentialDefinitionService, managedDIDService: ManagedDIDService)
+ extends CredentialDefinitionController {
+ override def createCredentialDefinition(
+ in: CredentialDefinitionInput
+ )(implicit
+ rc: RequestContext
+ ): ZIO[WalletAccessContext, ErrorResponse, CredentialDefinitionResponse] = {
+ (for {
+ _ <- validatePrismDID(in.author)
+ result <- service
+ .create(toDomain(in))
+ .map(cs => fromDomain(cs).withBaseUri(rc.request.uri))
+ } yield result).mapError {
+ case e: ErrorResponse => e
+ case e: CredentialDefinitionService.Error => CredentialDefinitionController.domainToHttpError(e)
+ }
+ }
+
+ override def getCredentialDefinitionByGuid(
+ guid: UUID
+ )(implicit rc: RequestContext): IO[ErrorResponse, CredentialDefinitionResponse] = {
+ service
+ .getByGUID(guid)
+ .map(
+ fromDomain(_)
+ .withSelf(rc.request.uri.toString)
+ )
+ }
+
+ override def delete(guid: UUID)(implicit
+ rc: RequestContext
+ ): ZIO[WalletAccessContext, ErrorResponse, CredentialDefinitionResponse] = {
+ service
+ .delete(guid)
+ .map(
+ fromDomain(_)
+ .withBaseUri(rc.request.uri)
+ )
+ }
+
+ override def lookupCredentialDefinitions(
+ filter: FilterInput,
+ pagination: Pagination,
+ order: Option[Order]
+ )(implicit
+ rc: RequestContext
+ ): ZIO[WalletAccessContext, ErrorResponse, CredentialDefinitionResponsePage] = {
+ for {
+ filteredEntries: FilteredEntries <- service.lookup(
+ filter.toDomain,
+ pagination.offset,
+ pagination.limit
+ )
+ entries = filteredEntries.entries
+ .map(fromDomain(_).withBaseUri(rc.request.uri))
+ .toList
+ page = CredentialDefinitionResponsePage(entries)
+ stats = CollectionStats(filteredEntries.totalCount, filteredEntries.count)
+ } yield CredentialDefinitionControllerLogic(rc, pagination, page, stats).result
+ }
+
+ private[this] def validatePrismDID(author: String) =
+ for {
+ authorDID <- ZIO
+ .fromEither(PrismDID.fromString(author))
+ .mapError(_ => ErrorResponse.badRequest(detail = Some(s"Unable to parse as a Prism DID: ${author}")))
+ longFormPrismDID <- getLongForm(authorDID, true)
+ } yield longFormPrismDID
+
+ private[this] def getLongForm(
+ did: PrismDID,
+ allowUnpublishedIssuingDID: Boolean = false
+ ): ZIO[WalletAccessContext, ErrorResponse, LongFormPrismDID] = {
+ for {
+ didState <- managedDIDService
+ .getManagedDIDState(did.asCanonical)
+ .mapError(e =>
+ ErrorResponse.internalServerError(detail =
+ Some(s"Error occurred while getting did from wallet: ${e.toString}")
+ )
+ )
+ .someOrFail(ErrorResponse.notFound(detail = Some(s"Issuer DID does not exist in the wallet: $did")))
+ .flatMap {
+ case s @ ManagedDIDState(_, _, _: PublicationState.Published) => ZIO.succeed(s)
+ case s =>
+ ZIO.cond(
+ allowUnpublishedIssuingDID,
+ s,
+ ErrorResponse.badRequest(detail = Some(s"Issuer DID must be published: $did"))
+ )
+ }
+ longFormPrismDID = PrismDID.buildLongFormFromOperation(didState.createOperation)
+ } yield longFormPrismDID
+ }
+}
+
+object CredentialDefinitionControllerImpl {
+ val layer: URLayer[CredentialDefinitionService & ManagedDIDService, CredentialDefinitionController] =
+ ZLayer.fromFunction(CredentialDefinitionControllerImpl(_, _))
+}
diff --git a/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialdefinition/controller/CredentialDefinitionControllerLogic.scala b/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialdefinition/controller/CredentialDefinitionControllerLogic.scala
new file mode 100644
index 0000000000..3ca826f26a
--- /dev/null
+++ b/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialdefinition/controller/CredentialDefinitionControllerLogic.scala
@@ -0,0 +1,43 @@
+package io.iohk.atala.pollux.credentialdefinition.controller
+
+import io.iohk.atala.api.http.RequestContext
+import io.iohk.atala.api.http.model.CollectionStats
+import io.iohk.atala.api.http.model.Pagination
+import io.iohk.atala.api.util.PaginationUtils
+import io.iohk.atala.pollux.credentialdefinition.http.CredentialDefinitionResponsePage
+import sttp.model.Uri
+
+case class CredentialDefinitionControllerLogic(
+ ctx: RequestContext,
+ pagination: Pagination,
+ page: CredentialDefinitionResponsePage,
+ stats: CollectionStats
+) {
+
+ def composeNextUri(uri: Uri): Option[Uri] =
+ PaginationUtils.composeNextUri(uri, page.contents, pagination, stats)
+
+ def composePreviousUri(uri: Uri): Option[Uri] =
+ PaginationUtils.composePreviousUri(uri, page.contents, pagination, stats)
+
+ def result: CredentialDefinitionResponsePage = {
+ val self = ctx.request.uri.toString
+ val pageOf = ctx.request.uri.copy(querySegments = Seq.empty).toString
+ val next = composeNextUri(ctx.request.uri).map(_.toString)
+ val previous = composePreviousUri(ctx.request.uri).map(_.toString)
+
+ val pageResult = page.copy(
+ self = self,
+ pageOf = pageOf,
+ next = next,
+ previous = previous,
+ contents = page.contents.map(item =>
+ item.withBaseUri(
+ ctx.request.uri.copy(querySegments = Seq.empty)
+ )
+ )
+ )
+
+ pageResult
+ }
+}
diff --git a/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialdefinition/http/CredentialDefinitionInput.scala b/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialdefinition/http/CredentialDefinitionInput.scala
new file mode 100644
index 0000000000..a3077891cb
--- /dev/null
+++ b/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialdefinition/http/CredentialDefinitionInput.scala
@@ -0,0 +1,66 @@
+package io.iohk.atala.pollux.credentialdefinition.http
+
+import io.iohk.atala.api.http.*
+import io.iohk.atala.pollux.core.model.schema.CredentialDefinition.Input
+import io.iohk.atala.pollux.credentialdefinition.http.CredentialDefinitionResponse.annotations
+import sttp.tapir.Schema
+import sttp.tapir.Schema.annotations.description
+import sttp.tapir.Schema.annotations.encodedExample
+import sttp.tapir.Schema.annotations.validate
+import sttp.tapir.Schema.annotations.validateEach
+import sttp.tapir.Validator.*
+import zio.json.*
+
+case class CredentialDefinitionInput(
+ @description(annotations.name.description)
+ @encodedExample(annotations.name.example)
+ @validate(nonEmptyString)
+ name: String,
+ @description(annotations.description.description)
+ @encodedExample(annotations.description.example)
+ @validateEach(nonEmptyString)
+ description: Option[String],
+ @description(annotations.version.description)
+ @encodedExample(annotations.version.example)
+ @validate(pattern(SemVerRegex))
+ version: String,
+ @description(annotations.tag.description)
+ @encodedExample(annotations.tag.example)
+ tag: String,
+ @description(annotations.author.description)
+ @encodedExample(annotations.author.example)
+ @validate(pattern(DIDRefRegex))
+ author: String,
+ @description(annotations.schemaId.description)
+ @encodedExample(annotations.schemaId.example)
+ schemaId: String,
+ @description(annotations.signatureType.description)
+ @encodedExample(annotations.signatureType.example)
+ signatureType: String,
+ @description(annotations.supportRevocation.description)
+ @encodedExample(annotations.supportRevocation.example)
+ supportRevocation: Boolean
+)
+
+object CredentialDefinitionInput {
+ def toDomain(in: CredentialDefinitionInput): Input =
+ Input(
+ name = in.name,
+ description = in.description.getOrElse(""),
+ version = in.version,
+ authored = None,
+ tag = in.tag,
+ author = in.author,
+ schemaId = in.schemaId,
+ signatureType = in.signatureType,
+ supportRevocation = in.supportRevocation
+ )
+
+ given encoder: JsonEncoder[CredentialDefinitionInput] =
+ DeriveJsonEncoder.gen[CredentialDefinitionInput]
+
+ given decoder: JsonDecoder[CredentialDefinitionInput] =
+ DeriveJsonDecoder.gen[CredentialDefinitionInput]
+
+ given schema: Schema[CredentialDefinitionInput] = Schema.derived
+}
diff --git a/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialdefinition/http/CredentialDefinitionResponse.scala b/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialdefinition/http/CredentialDefinitionResponse.scala
new file mode 100644
index 0000000000..f9365df062
--- /dev/null
+++ b/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialdefinition/http/CredentialDefinitionResponse.scala
@@ -0,0 +1,275 @@
+package io.iohk.atala.pollux.credentialdefinition.http
+
+import io.iohk.atala.api.http.*
+import io.iohk.atala.pollux.core.model
+import io.iohk.atala.pollux.core.model.schema.CredentialDefinition
+import io.iohk.atala.pollux.credentialdefinition.http.CredentialDefinitionResponse.annotations
+import sttp.model.Uri
+import sttp.model.Uri.*
+import sttp.tapir.Schema
+import sttp.tapir.Schema.annotations.default
+import sttp.tapir.Schema.annotations.description
+import sttp.tapir.Schema.annotations.encodedExample
+import sttp.tapir.Schema.annotations.encodedName
+import sttp.tapir.json.zio.schemaForZioJsonValue
+import zio.json.*
+import zio.json.ast.Json
+
+import java.time.OffsetDateTime
+import java.util.UUID
+
+case class CredentialDefinitionResponse(
+ @description(annotations.guid.description)
+ @encodedExample(annotations.guid.example)
+ guid: UUID,
+ @description(annotations.id.description)
+ @encodedExample(annotations.id.example)
+ id: String,
+ @description(annotations.longId.description)
+ @encodedExample(annotations.longId.example)
+ longId: Option[String],
+ @description(annotations.name.description)
+ @encodedExample(annotations.name.example)
+ name: String,
+ @description(annotations.version.description)
+ @encodedExample(annotations.version.example)
+ version: String,
+ @description(annotations.tag.description)
+ @encodedExample(annotations.tag.example)
+ tag: String,
+ @description(annotations.description.description)
+ @encodedExample(annotations.description.example)
+ description: String,
+ @description(annotations.author.description)
+ @encodedExample(annotations.author.example)
+ author: String,
+ @description(annotations.authored.description)
+ @encodedExample(annotations.authored.example)
+ authored: OffsetDateTime,
+ @description(annotations.schemaId.description)
+ @encodedExample(annotations.schemaId.example)
+ schemaId: String,
+ @description(annotations.definition.description)
+ @encodedExample(annotations.definition.example.toJson)
+ definition: zio.json.ast.Json,
+ @description(annotations.keyCorrectnessProof.description)
+ @encodedExample(annotations.keyCorrectnessProof.example.toJson)
+ keyCorrectnessProof: zio.json.ast.Json,
+ @description(annotations.signatureType.description)
+ @encodedExample(annotations.signatureType.example)
+ signatureType: String,
+ @description(annotations.supportRevocation.description)
+ @encodedExample(annotations.supportRevocation.example)
+ supportRevocation: Boolean,
+ @description(annotations.proof.description)
+ @encodedExample(annotations.proof.example.toJson)
+ proof: Option[Proof],
+ @description(annotations.kind.description)
+ @encodedExample(annotations.kind.example)
+ kind: String = "CredentialDefinition",
+ @description(annotations.self.description)
+ @encodedExample(annotations.self.example)
+ self: String = ""
+) {
+ def withBaseUri(base: Uri) = withSelf(base.addPath(guid.toString).toString)
+
+ def withSelf(self: String) = copy(self = self)
+}
+
+object CredentialDefinitionResponse {
+
+ def fromDomain(cd: CredentialDefinition): CredentialDefinitionResponse =
+ CredentialDefinitionResponse(
+ guid = cd.guid,
+ id = cd.id.toString,
+ longId = Option(cd.longId),
+ name = cd.name,
+ version = cd.version,
+ tag = cd.tag,
+ description = cd.description,
+ author = cd.author,
+ authored = cd.authored,
+ schemaId = cd.schemaId,
+ definition = cd.definition,
+ keyCorrectnessProof = cd.keyCorrectnessProof,
+ signatureType = cd.signatureType,
+ supportRevocation = cd.supportRevocation,
+ proof = None
+ )
+
+ given scala.Conversion[CredentialDefinition, CredentialDefinitionResponse] = fromDomain
+
+ given encoder: zio.json.JsonEncoder[CredentialDefinitionResponse] =
+ DeriveJsonEncoder.gen[CredentialDefinitionResponse]
+
+ given decoder: zio.json.JsonDecoder[CredentialDefinitionResponse] =
+ DeriveJsonDecoder.gen[CredentialDefinitionResponse]
+
+ given schema: Schema[CredentialDefinitionResponse] = Schema.derived
+
+ object annotations {
+ object guid
+ extends Annotation[UUID](
+ description = "Globally unique id of the credential definition." +
+ "It's composed from the bytes of the string that contain the `author`, `name`, and `version` values." +
+ "The string format looks like the resource identifier: " +
+ "`author`/`id`?version=`version`",
+ example = UUID.fromString("0527aea1-d131-3948-a34d-03af39aba8b4")
+ )
+
+ object id
+ extends Annotation[UUID](
+ description =
+ "A locally unique identifier to address the credential definition. UUID is generated by the backend.",
+ example = UUID.fromString("0527aea1-d131-3948-a34d-03af39aba8b5")
+ )
+
+ object longId
+ extends Annotation[String](
+ description =
+ "Resource id of the credential definition. Contains the `author`'s DID, `id` and `version` fields.",
+ example = "did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff" +
+ "/0527aea1-d131-3948-a34d-03af39aba8b4?version=1.0.0"
+ )
+
+ object self
+ extends Annotation[String](
+ description = "The URL that uniquely identifies the resource being returned in the response.",
+ example = "/prism-agent/credential-definition-registry/schemas/0527aea1-d131-3948-a34d-03af39aba8b4"
+ )
+
+ object kind
+ extends Annotation[String](
+ description = "A string that identifies the type of resource being returned in the response.",
+ example = "CredentialDefinition"
+ )
+
+ object proof
+ extends Annotation[Proof](
+ description = "A digital signature over the Credential Definition for the sake of asserting authorship. " +
+ "A piece of Metadata.",
+ example = Proof.Example
+ )
+
+ object name
+ extends Annotation[String](
+ description = "A human-readable name for the credential definition. A piece of Metadata.",
+ example = "DrivingLicense"
+ )
+
+ object version
+ extends Annotation[String](
+ description = "Denotes the revision of a given Credential Definition. " +
+ "It should follow semantic version convention to describe the impact of the credential definition evolution.",
+ example = "1.0.0"
+ )
+
+ object tag
+ extends Annotation[String](
+ description = "Token that allow to lookup and filter the credential definition records.",
+ example = "licence"
+ )
+
+ object description
+ extends Annotation[String](
+ description = "A human-readable description of the credential definition",
+ example = "Simple credential definition for the driving licence verifiable credential."
+ )
+
+ object author
+ extends Annotation[String](
+ description = "DID of the identity which authored the credential definition. " +
+ "A piece of Metadata.",
+ example = "did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff"
+ )
+
+ object schemaId
+ extends Annotation[Option[String]](
+ description = "The unique identifier of the schema used for this credential definition.",
+ example =
+ Some("https://agent-host.com/prism-agent/schema-registry/schemas/d9569cec-c81e-4779-aa86-0d5994d82676")
+ )
+
+ object authored
+ extends Annotation[OffsetDateTime](
+ description =
+ "[RFC3339](https://www.rfc-editor.org/rfc/rfc3339) date on which the credential definition was created. " +
+ "A piece of Metadata.",
+ example = OffsetDateTime.parse("2022-03-10T12:00:00Z")
+ )
+
+ object definition
+ extends Annotation[Json](
+ description = "Definition object that represents the actual definition of the credential.",
+ example = definitionExampleString.fromJson[Json].toOption.getOrElse(Json.Null)
+ )
+
+ object keyCorrectnessProof
+ extends Annotation[Json](
+ description =
+ "A proof that validates the correctness of the key within the context of the credential definition.",
+ example = keyCorrectnessProofExampleString.fromJson[Json].toOption.getOrElse(Json.Null)
+ )
+
+ object signatureType
+ extends Annotation[String](
+ description = "Signature type used in the CredentialDefinition.",
+ example = "CL"
+ )
+
+ object supportRevocation
+ extends Annotation[Boolean](
+ description = "Boolean flag indicating whether revocation is supported for this CredentialDefinition.",
+ example = false
+ )
+
+ val definitionExampleString =
+ """
+ |{
+ | "credentialSubject": {
+ | "emailAddress": "alice@wonderland.com",
+ | "givenName": "Alice",
+ | "familyName": "Wonderland",
+ | "dateOfIssuance": "2000-01-01T10:00:00Z",
+ | "drivingLicenseID": "12345",
+ | "drivingClass": 5
+ | }
+ |}
+ |""".stripMargin
+
+ val keyCorrectnessProofExampleString =
+ """
+ |{
+ |{
+ | "c": "5554...7318",
+ | "xz_cap": "6705...0199",
+ | "xr_cap": [
+ | [
+ | "dateofissuance",
+ | "6038...0939"
+ | ],
+ | [
+ | "drivingclass",
+ | "8038...0939"
+ | ],
+ | [
+ | "familyname",
+ | "3038...0939"
+ | ],
+ | [
+ | "drivinglicenseid",
+ | "9038...0939"
+ | ],
+ | [
+ | "emailaddress",
+ | "4038...0939"
+ | ],
+ | [
+ | "master_secret",
+ | "3058...0939"
+ | ]
+ | ]
+ |}
+ |""".stripMargin
+ }
+}
diff --git a/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialdefinition/http/CredentialDefinitionResponsePage.scala b/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialdefinition/http/CredentialDefinitionResponsePage.scala
new file mode 100644
index 0000000000..cfa8017dc6
--- /dev/null
+++ b/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialdefinition/http/CredentialDefinitionResponsePage.scala
@@ -0,0 +1,96 @@
+package io.iohk.atala.pollux.credentialdefinition.http
+
+import io.iohk.atala.api.http.Annotation
+import io.iohk.atala.pollux.credentialschema.http.CredentialSchemaResponsePage.annotations
+import sttp.tapir.Schema
+import sttp.tapir.Schema.annotations.description
+import sttp.tapir.Schema.annotations.encodedExample
+import zio.json.DeriveJsonDecoder
+import zio.json.DeriveJsonEncoder
+import zio.json.JsonDecoder
+import zio.json.JsonEncoder
+
+case class CredentialDefinitionResponsePage(
+ @description(annotations.contents.description)
+ @encodedExample(annotations.contents.example)
+ contents: Seq[CredentialDefinitionResponse],
+ @description(annotations.kind.description)
+ @encodedExample(annotations.kind.example)
+ kind: String = "CredentialDefinitionPage",
+ @description(annotations.self.description)
+ @encodedExample(annotations.self.example)
+ self: String = "",
+ @description(annotations.pageOf.description)
+ @encodedExample(annotations.pageOf.example)
+ pageOf: String = "",
+ @description(annotations.next.description)
+ @encodedExample(annotations.next.example)
+ next: Option[String] = None,
+ @description(annotations.previous.description)
+ @encodedExample(annotations.previous.example)
+ previous: Option[String] = None
+) {
+ def withSelf(self: String) = copy(self = self)
+}
+
+object CredentialDefinitionResponsePage {
+ given encoder: JsonEncoder[CredentialDefinitionResponsePage] =
+ DeriveJsonEncoder.gen[CredentialDefinitionResponsePage]
+
+ given decoder: JsonDecoder[CredentialDefinitionResponsePage] =
+ DeriveJsonDecoder.gen[CredentialDefinitionResponsePage]
+
+ given schema: Schema[CredentialDefinitionResponsePage] = Schema.derived
+
+ val Example = CredentialDefinitionResponsePage(
+ contents = annotations.contents.example,
+ kind = annotations.kind.example,
+ self = annotations.self.example,
+ pageOf = annotations.pageOf.example,
+ next = Some(annotations.next.example),
+ previous = Some(annotations.previous.example)
+ )
+
+ object annotations {
+
+ object contents
+ extends Annotation[Seq[CredentialDefinitionResponse]](
+ description =
+ "A sequence of CredentialDefinitionResponse objects representing the list of credential definitions that the API response contains",
+ example = Seq.empty
+ )
+
+ object kind
+ extends Annotation[String](
+ description =
+ "A string field indicating the type of the API response. In this case, it will always be set to `CredentialDefinitionPage`",
+ example = "CredentialDefinitionPage"
+ ) // TODO Tech Debt ticket - the kind in a collection should be collection, not the underlying record type
+
+ object self
+ extends Annotation[String](
+ description = "A string field containing the URL of the current API endpoint",
+ example = "/prism-agent/credential-definition-registry/definitions?skip=10&limit=10"
+ )
+
+ object pageOf
+ extends Annotation[String](
+ description = "A string field indicating the type of resource that the contents field contains",
+ example = "/prism-agent/credential-definition-registry/definitions"
+ )
+
+ object next
+ extends Annotation[String](
+ description = "An optional string field containing the URL of the next page of results. " +
+ "If the API response does not contain any more pages, this field should be set to None.",
+ example = "/prism-agent/credential-definition-registry/definitions?skip=20&limit=10"
+ )
+
+ object previous
+ extends Annotation[String](
+ description = "An optional string field containing the URL of the previous page of results. " +
+ "If the API response is the first page of results, this field should be set to None.",
+ example = "/prism-agent/credential-definition-registry/definitions?skip=0&limit=10"
+ )
+ }
+}
diff --git a/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialdefinition/http/FilterInput.scala b/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialdefinition/http/FilterInput.scala
new file mode 100644
index 0000000000..b7a1cf5826
--- /dev/null
+++ b/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialdefinition/http/FilterInput.scala
@@ -0,0 +1,58 @@
+package io.iohk.atala.pollux.credentialdefinition.http
+
+import io.iohk.atala.api.http.*
+import io.iohk.atala.pollux.core.model
+import io.iohk.atala.pollux.core.model.schema.CredentialDefinition
+import io.iohk.atala.pollux.credentialdefinition.http.FilterInput.annotations
+import sttp.tapir.EndpointIO.annotations.example
+import sttp.tapir.EndpointIO.annotations.query
+import sttp.tapir.Validator.*
+
+case class FilterInput(
+ @query
+ @example(Option(annotations.author.example))
+ author: Option[String] = Option.empty[String],
+ @query
+ @example(Option(annotations.name.example))
+ name: Option[String] = Option.empty[String],
+ @query
+ @example(Option(annotations.version.example))
+ version: Option[String] = Option.empty[String],
+ @query
+ @example(Option(annotations.tag.example))
+ tag: Option[String] = Option.empty[String]
+) {
+ def toDomain = CredentialDefinition.Filter(author, name, version, tag)
+}
+
+object FilterInput {
+ // TODO: for some reason @description attribute doesn't work together with @query in tapir
+ // need to invest more time and probably report the issue
+ object annotations {
+
+ object author
+ extends Annotation[String](
+ description =
+ "An optional field that can be used to filter the credential definition collection by `author`'s DID",
+ example = CredentialDefinitionResponse.annotations.author.example
+ )
+
+ object name
+ extends Annotation[String](
+ description = "An optional field that can be used to filter the credential definition records by `name`",
+ example = CredentialDefinitionResponse.annotations.name.example
+ )
+
+ object version
+ extends Annotation[String](
+ description = "An optional string field that can be used to filter resources by version",
+ example = CredentialDefinitionResponse.annotations.version.example
+ )
+
+ object tag
+ extends Annotation[String](
+ description = "An optional string field that can be used to filter resources by tag",
+ example = CredentialDefinitionResponse.annotations.tag.example
+ )
+ }
+}
diff --git a/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialdefinition/http/Proof.scala b/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialdefinition/http/Proof.scala
new file mode 100644
index 0000000000..5ee4087eec
--- /dev/null
+++ b/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialdefinition/http/Proof.scala
@@ -0,0 +1,104 @@
+package io.iohk.atala.pollux.credentialdefinition.http
+
+import io.iohk.atala.api.http.*
+import io.iohk.atala.pollux.credentialdefinition.http.Proof.annotations
+import sttp.tapir.Schema
+import sttp.tapir.Schema.annotations.description
+import sttp.tapir.Schema.annotations.encodedExample
+import sttp.tapir.generic.auto.*
+import zio.json.DeriveJsonDecoder
+import zio.json.DeriveJsonEncoder
+import zio.json.JsonDecoder
+import zio.json.JsonEncoder
+
+import java.time.OffsetDateTime
+
+case class Proof(
+ @description(annotations.`type`.description)
+ @encodedExample(annotations.`type`.example)
+ `type`: String,
+ @description(annotations.created.description)
+ @encodedExample(annotations.created.example)
+ created: OffsetDateTime,
+ @description(annotations.verificationMethod.description)
+ @encodedExample(annotations.verificationMethod.example)
+ verificationMethod: String,
+ @description(annotations.proofPurpose.description)
+ @encodedExample(annotations.proofPurpose.example)
+ proofPurpose: String,
+ @description(annotations.proofValue.description)
+ @encodedExample(annotations.proofValue.example)
+ proofValue: String,
+ @description(annotations.jws.description)
+ @encodedExample(annotations.jws.example)
+ jws: String,
+ @description(annotations.domain.description)
+ @encodedExample(annotations.domain.example)
+ domain: Option[String]
+)
+
+object Proof {
+ given encoder: JsonEncoder[Proof] = DeriveJsonEncoder.gen[Proof]
+ given decoder: JsonDecoder[Proof] = DeriveJsonDecoder.gen[Proof]
+ given schema: Schema[Proof] = Schema.derived
+
+ object annotations {
+ object `type`
+ extends Annotation[String](
+ description = "The type of cryptographic signature algorithm used to generate the proof.",
+ example = "Ed25519Signature2018"
+ )
+
+ object created
+ extends Annotation[OffsetDateTime](
+ description = "The date and time at which the proof was created, in UTC format. " +
+ "This field is used to ensure that the proof was generated before or at the same time as the credential definition itself.",
+ example = OffsetDateTime.parse("2022-03-10T12:00:00Z")
+ )
+
+ object proofPurpose
+ extends Annotation[String](
+ description = "The purpose of the proof (for example: `assertionMethod`). " +
+ "This indicates that the proof is being used to assert that the issuer really issued this credential definition instance.",
+ example = "assertionMethod"
+ )
+
+ object verificationMethod
+ extends Annotation[String](
+ description = "The verification method used to generate the proof. " +
+ "This is usually a DID and key ID combination that can be used to look up the public key needed to verify the proof.",
+ example = "did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff#key-1"
+ )
+
+ object jws
+ extends Annotation[String](
+ description = "The JSON Web Signature (JWS) that contains the proof information.",
+ example = "eyJhbGciOiJFZERTQSIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il0sImt0eSI6Ik..."
+ )
+
+ object proofValue
+ extends Annotation[String](
+ description =
+ "The cryptographic signature value that was generated using the private key associated with the verification method, " +
+ "and which can be used to verify the proof.",
+ example = "FiPfjknHikKmZ..."
+ )
+
+ object domain
+ extends Annotation[String](
+ description =
+ "It specifies the domain context within which the credential definition and proof are being used",
+ example = "prims.atala.com"
+ )
+ }
+
+ val Example = Proof(
+ `type` = annotations.`type`.example,
+ created = annotations.created.example,
+ verificationMethod = annotations.verificationMethod.example,
+ proofPurpose = annotations.proofPurpose.example,
+ proofValue = annotations.proofValue.example,
+ jws = annotations.jws.example,
+ domain = Some(annotations.domain.example)
+ )
+}
diff --git a/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialschema/controller/CredentialSchemaController.scala b/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialschema/controller/CredentialSchemaController.scala
index 81db6311a6..0f2149e114 100644
--- a/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialschema/controller/CredentialSchemaController.scala
+++ b/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialschema/controller/CredentialSchemaController.scala
@@ -60,7 +60,7 @@ object CredentialSchemaController {
case UnexpectedError(msg: String) =>
ErrorResponse.internalServerError(detail = Option(msg))
case CredentialSchemaValidationError(cause) =>
- ErrorResponse.badRequest(detail = Some(cause.userMessage))
+ ErrorResponse.badRequest(detail = Some(cause.message))
}
}
diff --git a/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialschema/http/FilterInput.scala b/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialschema/http/FilterInput.scala
index 95c5cf7fc8..c85b366863 100644
--- a/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialschema/http/FilterInput.scala
+++ b/prism-agent/service/server/src/main/scala/io/iohk/atala/pollux/credentialschema/http/FilterInput.scala
@@ -4,7 +4,8 @@ import io.iohk.atala.api.http.*
import io.iohk.atala.pollux.core.model
import io.iohk.atala.pollux.core.model.schema.CredentialSchema
import io.iohk.atala.pollux.credentialschema.http.FilterInput.annotations
-import sttp.tapir.EndpointIO.annotations.{example, query}
+import sttp.tapir.EndpointIO.annotations.example
+import sttp.tapir.EndpointIO.annotations.query
import sttp.tapir.Validator.*
case class FilterInput(
diff --git a/prism-agent/service/server/src/test/resources/anoncred-schema-example.json b/prism-agent/service/server/src/test/resources/anoncred-schema-example.json
new file mode 100644
index 0000000000..bc6bea286d
--- /dev/null
+++ b/prism-agent/service/server/src/test/resources/anoncred-schema-example.json
@@ -0,0 +1,28 @@
+{
+ "guid": "1631026d-5d55-3285-8ccd-bd70480cfbdc",
+ "id": "329da384-b2bb-497f-a605-4118dec75d31",
+ "longId": "did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff/329da384-b2bb-497f-a605-4118dec75d31?version=5.0.0",
+ "name": "DrivingLicense",
+ "version": "5.0.0",
+ "tags": [
+ "string"
+ ],
+ "description": "Simple credential schema for the driving licence verifiable credential.",
+ "type": "AnoncredSchemaV1",
+ "schema": {
+ "name": "Driving licence Anoncred Schema",
+ "version": "1.0",
+ "attrNames": [
+ "emailAddress",
+ "familyName",
+ "dateOfIssuance",
+ "drivingLicenseID",
+ "drivingClass"
+ ],
+ "issuerId": "http://www.example.com/issuer"
+ },
+ "author": "did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff",
+ "authored": "2023-04-06T08:48:01.654162Z",
+ "kind": "CredentialSchema",
+ "self": "/schema-registry/schemas/1631026d-5d55-3285-8ccd-bd70480cfbdc"
+}
diff --git a/prism-agent/service/server/src/test/resources/vc-schema-example.json b/prism-agent/service/server/src/test/resources/vc-schema-example.json
new file mode 100644
index 0000000000..9b0e106826
--- /dev/null
+++ b/prism-agent/service/server/src/test/resources/vc-schema-example.json
@@ -0,0 +1,60 @@
+{
+ "guid": "1631026d-5d55-3285-8ccd-bd70480cfbdc",
+ "id": "329da384-b2bb-497f-a605-4118dec75d31",
+ "longId": "did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff/329da384-b2bb-497f-a605-4118dec75d31?version=5.0.0",
+ "name": "DrivingLicense",
+ "version": "5.0.0",
+ "tags": [
+ "string"
+ ],
+ "description": "Simple credential schema for the driving licence verifiable credential.",
+ "type": "https://w3c-ccg.github.io/vc-json-schemas/schema/2.0/schema.json",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "description": "Driving License",
+ "type": "object",
+ "properties": {
+ "credentialSubject": {
+ "type": "object",
+ "properties": {
+ "emailAddress": {
+ "type": "string",
+ "format": "email"
+ },
+ "givenName": {
+ "type": "string"
+ },
+ "familyName": {
+ "type": "string"
+ },
+ "dateOfIssuance": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "drivingLicenseID": {
+ "type": "string"
+ },
+ "drivingClass": {
+ "type": "integer"
+ }
+ },
+ "required": [
+ "emailAddress",
+ "familyName",
+ "dateOfIssuance",
+ "drivingLicenseID",
+ "drivingClass"
+ ],
+ "additionalProperties": false
+ }
+ },
+ "required": [
+ "credentialSubject"
+ ],
+ "additionalProperties": false
+ },
+ "author": "did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff",
+ "authored": "2023-04-06T08:48:01.654162Z",
+ "kind": "CredentialSchema",
+ "self": "/schema-registry/schemas/1631026d-5d55-3285-8ccd-bd70480cfbdc"
+}
diff --git a/prism-agent/service/server/src/test/scala/io/iohk/atala/api/util/Tapir2StaticOAS.scala b/prism-agent/service/server/src/test/scala/io/iohk/atala/api/util/Tapir2StaticOAS.scala
index 8afab6f2cd..d015d6dd40 100644
--- a/prism-agent/service/server/src/test/scala/io/iohk/atala/api/util/Tapir2StaticOAS.scala
+++ b/prism-agent/service/server/src/test/scala/io/iohk/atala/api/util/Tapir2StaticOAS.scala
@@ -1,22 +1,17 @@
package io.iohk.atala.api.util
-import io.iohk.atala.castor.controller.{
- DIDController,
- DIDRegistrarController,
- DIDRegistrarServerEndpoints,
- DIDServerEndpoints
-}
-import io.iohk.atala.connect.controller.{ConnectionController, ConnectionServerEndpoints}
+import io.iohk.atala.agent.server.AgentHttpServer
+import io.iohk.atala.castor.controller.{DIDController, DIDRegistrarController}
+import io.iohk.atala.connect.controller.ConnectionController
+import io.iohk.atala.event.controller.EventController
import io.iohk.atala.iam.authentication.Authenticator
-import io.iohk.atala.iam.entity.http.EntityServerEndpoints
import io.iohk.atala.iam.entity.http.controller.EntityController
-import io.iohk.atala.iam.wallet.http.WalletManagementServerEndpoints
import io.iohk.atala.iam.wallet.http.controller.WalletManagementController
-import io.iohk.atala.issue.controller.{IssueController, IssueServerEndpoints}
+import io.iohk.atala.issue.controller.IssueController
+import io.iohk.atala.pollux.credentialdefinition.controller.CredentialDefinitionController
import io.iohk.atala.pollux.credentialschema.controller.{CredentialSchemaController, VerificationPolicyController}
-import io.iohk.atala.pollux.credentialschema.{SchemaRegistryServerEndpoints, VerificationPolicyServerEndpoints}
-import io.iohk.atala.presentproof.controller.{PresentProofController, PresentProofServerEndpoints}
-import io.iohk.atala.system.controller.{SystemController, SystemServerEndpoints}
+import io.iohk.atala.presentproof.controller.PresentProofController
+import io.iohk.atala.system.controller.SystemController
import org.scalatestplus.mockito.MockitoSugar.*
import sttp.tapir.docs.openapi.OpenAPIDocsInterpreter
import zio.{Scope, ZIO, ZIOAppArgs, ZIOAppDefault, ZLayer}
@@ -30,26 +25,7 @@ object Tapir2StaticOAS extends ZIOAppDefault {
@main override def run: ZIO[Any with ZIOAppArgs with Scope, Any, Any] = {
val effect = for {
args <- getArgs
- allSchemaRegistryEndpoints <- SchemaRegistryServerEndpoints.all
- allVerificationPolicyEndpoints <- VerificationPolicyServerEndpoints.all
- allConnectionEndpoints <- ConnectionServerEndpoints.all
- allIssueEndpoints <- IssueServerEndpoints.all
- allDIDEndpoints <- DIDServerEndpoints.all
- allDIDRegistrarEndpoints <- DIDRegistrarServerEndpoints.all
- allPresentProofEndpoints <- PresentProofServerEndpoints.all
- allSystemEndpoints <- SystemServerEndpoints.all
- allEntityEndpoints <- EntityServerEndpoints.all
- allWalletManagementEndpoints <- WalletManagementServerEndpoints.all
- allEndpoints = allSchemaRegistryEndpoints ++
- allVerificationPolicyEndpoints ++
- allConnectionEndpoints ++
- allDIDEndpoints ++
- allDIDRegistrarEndpoints ++
- allIssueEndpoints ++
- allPresentProofEndpoints ++
- allSystemEndpoints ++
- allEntityEndpoints ++
- allWalletManagementEndpoints
+ allEndpoints <- AgentHttpServer.agentRESTServiceEndpoints
} yield {
import sttp.apispec.openapi.circe.yaml.*
val yaml = OpenAPIDocsInterpreter().toOpenAPI(allEndpoints.map(_.endpoint), "Prism Agent", args(1)).toYaml
@@ -58,6 +34,7 @@ object Tapir2StaticOAS extends ZIOAppDefault {
}
effect.provideSomeLayer(
ZLayer.succeed(mock[ConnectionController]) ++
+ ZLayer.succeed(mock[CredentialDefinitionController]) ++
ZLayer.succeed(mock[CredentialSchemaController]) ++
ZLayer.succeed(mock[VerificationPolicyController]) ++
ZLayer.succeed(mock[DIDRegistrarController]) ++
@@ -67,7 +44,8 @@ object Tapir2StaticOAS extends ZIOAppDefault {
ZLayer.succeed(mock[SystemController]) ++
ZLayer.succeed(mock[EntityController]) ++
ZLayer.succeed(mock[WalletManagementController]) ++
- ZLayer.succeed(mock[Authenticator])
+ ZLayer.succeed(mock[Authenticator]) ++
+ ZLayer.succeed(mock[EventController])
)
}
diff --git a/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/credentialdefinition/CredentialDefinitionBasicSpec.scala b/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/credentialdefinition/CredentialDefinitionBasicSpec.scala
new file mode 100644
index 0000000000..db4c63deae
--- /dev/null
+++ b/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/credentialdefinition/CredentialDefinitionBasicSpec.scala
@@ -0,0 +1,159 @@
+package io.iohk.atala.pollux.credentialdefinition
+
+import io.iohk.atala.agent.walletapi.model.Entity
+import io.iohk.atala.agent.walletapi.storage.DIDSecretStorage
+import io.iohk.atala.api.http.ErrorResponse
+import io.iohk.atala.container.util.MigrationAspects.*
+import io.iohk.atala.iam.authentication.Authenticator
+import io.iohk.atala.mercury.model.DidId
+import io.iohk.atala.pollux.core.service.serdes.{
+ PrivateCredentialDefinitionSchemaSerDesV1,
+ ProofKeyCredentialDefinitionSchemaSerDesV1,
+ PublicCredentialDefinitionSerDesV1
+}
+import io.iohk.atala.pollux.credentialdefinition.controller.CredentialDefinitionController
+import io.iohk.atala.pollux.credentialdefinition.http.{CredentialDefinitionInput, CredentialDefinitionResponse}
+import sttp.client3.basicRequest
+import sttp.client3.ziojson.*
+import sttp.model.StatusCode
+import zio.*
+import zio.ZIO.*
+import zio.json.*
+import zio.test.*
+import zio.test.Assertion.*
+import zio.test.TestAspect.*
+
+import java.util.UUID
+
+object CredentialDefinitionBasicSpec extends ZIOSpecDefault with CredentialDefinitionTestTools:
+
+ val definitionString =
+ """
+ |{
+ | "credentialSubject": {
+ | "emailAddress": "alice@wonderland.com",
+ | "givenName": "Alice",
+ | "familyName": "Wonderland",
+ | "dateOfIssuance": "2000-01-01T10:00:00Z",
+ | "drivingLicenseID": "12345",
+ | "drivingClass": 5
+ | }
+ |}
+ |""".stripMargin
+
+ private val credentialDefinitionInput =
+ CredentialDefinitionInput(
+ name = "TestCredentialDefinition",
+ version = "1.0.0",
+ description = Option("Credential Definition Description"),
+ schemaId = "resource:///anoncred-schema-example.json",
+ tag = "test",
+ author = "did:prism:557a4ef2ed0cf86fb50d91577269136b3763722ef00a72a1fb1e66895f52b6d8",
+ signatureType = "CL",
+ supportRevocation = false
+ )
+
+ def spec = (
+ credentialDefinitionCreateAndGetOperationsSpec
+ @@ nondeterministic @@ sequential @@ timed @@ migrateEach(
+ schema = "public",
+ paths = "classpath:sql/pollux"
+ )
+ ).provideSomeLayerShared(mockManagedDIDServiceLayer.toLayer >+> testEnvironmentLayer)
+
+ private val credentialDefinitionCreateAndGetOperationsSpec = {
+ val backendZIO =
+ for {
+ controller <- ZIO.service[CredentialDefinitionController]
+ authenticator <- ZIO.service[Authenticator]
+ } yield httpBackend(controller, authenticator)
+
+ def createCredentialDefinitionResponseZIO = for {
+ backend <- backendZIO
+ response <- basicRequest
+ .post(credentialDefinitionUriBase)
+ .body(credentialDefinitionInput.toJsonPretty)
+ .response(asJsonAlways[CredentialDefinitionResponse])
+ .send(backend)
+ } yield response
+
+ def getCredentialDefinitionResponseZIO(uuid: UUID) = for {
+ backend <- backendZIO
+ response <- basicRequest
+ .get(credentialDefinitionUriBase.addPath(uuid.toString))
+ .response(asJsonAlways[CredentialDefinitionResponse])
+ .send(backend)
+ } yield response
+
+ suite("credential-definition-registry create and get by ID operations logic")(
+ test("create the new credential definition") {
+ for {
+ response <- createCredentialDefinitionResponseZIO
+ statusCodeIs201 = assert(response.code)(equalTo(StatusCode.Created))
+
+ credentialDefinition <- fromEither(response.body)
+ actualFields = CredentialDefinitionInput(
+ name = credentialDefinition.name,
+ version = credentialDefinition.version,
+ description = Some(credentialDefinition.description),
+ tag = credentialDefinition.tag,
+ author = credentialDefinition.author,
+ schemaId = credentialDefinition.schemaId,
+ signatureType = credentialDefinition.signatureType,
+ supportRevocation = credentialDefinition.supportRevocation
+ )
+
+ credentialDefinitionIsCreated = assert(credentialDefinitionInput)(equalTo(actualFields))
+
+ getCredentialDefinitionResponse <- getCredentialDefinitionResponseZIO(credentialDefinition.guid)
+ fetchedCredentialDefinition <- fromEither(getCredentialDefinitionResponse.body)
+ credentialDefinitionIsFetched = assert(fetchedCredentialDefinition)(equalTo(credentialDefinition))
+ maybeValidPublicDefinition <- PublicCredentialDefinitionSerDesV1.schemaSerDes.validate(
+ fetchedCredentialDefinition.definition.toString()
+ )
+ assertValidPublicDefinition = assert(maybeValidPublicDefinition)(Assertion.isTrue)
+ maybeValidKeyCorrectnessProof <- ProofKeyCredentialDefinitionSchemaSerDesV1.schemaSerDes.validate(
+ fetchedCredentialDefinition.keyCorrectnessProof.toString()
+ )
+ assertValidKeyCorrectnessProof = assert(maybeValidKeyCorrectnessProof)(Assertion.isTrue)
+ svc <- ZIO.service[DIDSecretStorage]
+ maybeDidSecret <- svc
+ .getKey(
+ DidId(credentialDefinitionInput.author),
+ s"anoncred-credential-definition-private-key/${fetchedCredentialDefinition.guid}",
+ PrivateCredentialDefinitionSchemaSerDesV1.version
+ )
+ .provideSomeLayer(Entity.Default.wacLayer)
+ (assertCorrectPrivateDefinitionSchema, maybeValidPrivateDefinitionZIO) = maybeDidSecret match {
+ case Some(didSecret) =>
+ val schemaAssertion =
+ assert(didSecret.schemaId)(equalTo(PrivateCredentialDefinitionSchemaSerDesV1.version))
+ val validPrivateDefinition =
+ PrivateCredentialDefinitionSchemaSerDesV1.schemaSerDes.validate(didSecret.json.toString())
+ (schemaAssertion, validPrivateDefinition)
+ case None =>
+ (assert(false)(Assertion.isTrue), ZIO.succeed(false))
+ }
+ maybeValidPrivateDefinition <- maybeValidPrivateDefinitionZIO
+ assertValidPrivateDefinition = assert(maybeValidPrivateDefinition)(Assertion.isTrue)
+ } yield statusCodeIs201 &&
+ credentialDefinitionIsCreated &&
+ credentialDefinitionIsFetched &&
+ assertValidPublicDefinition &&
+ assertValidKeyCorrectnessProof &&
+ assertCorrectPrivateDefinitionSchema &&
+ assertValidPrivateDefinition
+ },
+ test("get the credential definition by the wrong id") {
+ for {
+ backend <- backendZIO
+ uuid = UUID.randomUUID()
+
+ response <- basicRequest
+ .get(credentialDefinitionUriBase.addPath(uuid.toString))
+ .response(asJsonAlways[ErrorResponse])
+ .send(backend)
+ } yield assert(response.code)(equalTo(StatusCode.NotFound))
+ }
+ )
+ }
diff --git a/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/credentialdefinition/CredentialDefinitionFailureSpec.scala b/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/credentialdefinition/CredentialDefinitionFailureSpec.scala
new file mode 100644
index 0000000000..0ca39c620b
--- /dev/null
+++ b/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/credentialdefinition/CredentialDefinitionFailureSpec.scala
@@ -0,0 +1,42 @@
+package io.iohk.atala.pollux.credentialdefinition
+
+import io.iohk.atala.agent.walletapi.service.MockManagedDIDService
+import io.iohk.atala.api.http.ErrorResponse
+import io.iohk.atala.container.util.MigrationAspects.migrate
+import io.iohk.atala.iam.authentication.Authenticator
+import io.iohk.atala.pollux.credentialdefinition.controller.CredentialDefinitionController
+import sttp.client3.ziojson.*
+import sttp.client3.{DeserializationException, basicRequest}
+import sttp.model.StatusCode
+import zio.*
+import zio.ZIO.*
+import zio.test.*
+import zio.test.Assertion.*
+import zio.test.TestAspect.*
+
+object CredentialDefinitionFailureSpec extends ZIOSpecDefault with CredentialDefinitionTestTools:
+ def spec = (suite("credential-definition-registry bad request spec")(
+ credentialDefinitionBadRequestAsJsonSpec
+ ) @@ nondeterministic @@ sequential @@ timed @@ migrate(
+ schema = "public",
+ paths = "classpath:sql/pollux"
+ )).provideSomeLayerShared(MockManagedDIDService.empty >+> testEnvironmentLayer)
+
+ private val credentialDefinitionBadRequestAsJsonSpec =
+ test("create the credential definition with wrong json body returns BadRequest as json") {
+ for {
+ credentialDefinitionRegistryService <- ZIO.service[CredentialDefinitionController]
+ authenticator <- ZIO.service[Authenticator]
+ backend = httpBackend(credentialDefinitionRegistryService, authenticator)
+ response: CredentialDefinitionBadRequestResponse <- basicRequest
+ .post(credentialDefinitionUriBase)
+ .body("""{"foo":"bar"}""")
+ .response(asJsonAlways[ErrorResponse])
+ .send(backend)
+
+ itIsABadRequestStatusCode = assert(response.code)(equalTo(StatusCode.BadRequest))
+ theBodyWasParsedFromJsonAsBadRequest = assert(response.body)(
+ isRight(isSubtype[ErrorResponse](Assertion.anything))
+ )
+ } yield itIsABadRequestStatusCode // && theBodyWasParsedFromJsonAsBadRequest
+ }
diff --git a/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/credentialdefinition/CredentialDefinitionLookupAndPaginationSpec.scala b/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/credentialdefinition/CredentialDefinitionLookupAndPaginationSpec.scala
new file mode 100644
index 0000000000..e13b2c6c3f
--- /dev/null
+++ b/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/credentialdefinition/CredentialDefinitionLookupAndPaginationSpec.scala
@@ -0,0 +1,131 @@
+package io.iohk.atala.pollux.credentialdefinition
+
+import io.iohk.atala.container.util.MigrationAspects.migrate
+import io.iohk.atala.iam.authentication.Authenticator
+import io.iohk.atala.pollux.credentialdefinition.controller.CredentialDefinitionController
+import io.iohk.atala.pollux.credentialdefinition.http.{CredentialDefinitionResponse, CredentialDefinitionResponsePage}
+import io.iohk.atala.shared.models.{WalletAccessContext, WalletId}
+import sttp.client3.ziojson.*
+import sttp.client3.{DeserializationException, Response, UriContext, basicRequest}
+import sttp.model.{StatusCode, Uri}
+import zio.*
+import zio.json.EncoderOps
+import zio.test.*
+import zio.test.Assertion.*
+import zio.test.TestAspect.*
+
+object CredentialDefinitionLookupAndPaginationSpec
+ extends ZIOSpecDefault
+ with CredentialDefinitionTestTools
+ with CredentialDefinitionGen:
+
+ def fetchAllPages(
+ uri: Uri
+ ): ZIO[CredentialDefinitionController & Authenticator, Throwable, List[CredentialDefinitionResponsePage]] = {
+ for {
+ controller <- ZIO.service[CredentialDefinitionController]
+ authenticator <- ZIO.service[Authenticator]
+ backend = httpBackend(controller, authenticator)
+ response: CredentialDefinitionResponsePageType <-
+ for {
+ response <- basicRequest
+ .get(uri)
+ .response(asJsonAlways[CredentialDefinitionResponsePage])
+ .send(backend)
+ } yield {
+ println(response)
+ response
+ }
+ firstPage <- ZIO.fromEither(response.body)
+ otherPagesStream = zio.stream.ZStream
+ .unfoldZIO[Any, Throwable, CredentialDefinitionResponsePage, CredentialDefinitionResponsePage](firstPage)(
+ page =>
+ page.next
+ .map(n => uri"$n")
+ .fold(
+ ZIO.succeed(Option.empty[(CredentialDefinitionResponsePage, CredentialDefinitionResponsePage)])
+ )(nextPageUri =>
+ for {
+ nextPageResponse: CredentialDefinitionResponsePageType <-
+ basicRequest
+ .get(nextPageUri)
+ .response(asJsonAlways[CredentialDefinitionResponsePage])
+ .send(backend)
+ nextPage <- ZIO.fromEither(nextPageResponse.body)
+ } yield Some((nextPage, nextPage))
+ )
+ )
+ otherPages <- otherPagesStream.runCollect
+ .fold(_ => List.empty[CredentialDefinitionResponsePage], success => success.toList)
+
+ } yield List(firstPage) ++ otherPages
+ }
+
+ def spec = (
+ credentialDefinitionPaginationSpec @@
+ nondeterministic @@ sequential @@ timed @@ migrate(
+ schema = "public",
+ paths = "classpath:sql/pollux"
+ )
+ ).provideSomeLayerShared(
+ mockManagedDIDServiceLayer.exactly(20).toLayer >+> testEnvironmentLayer
+ )
+
+ private val credentialDefinitionPaginationSpec = suite("credential-definition-registry pagination logic")(
+ test("pagination of the first page with the empty query params") {
+ for {
+ _ <- deleteAllCredentialDefinitions
+ controller <- ZIO.service[CredentialDefinitionController]
+ authenticator <- ZIO.service[Authenticator]
+ backend = httpBackend(controller, authenticator)
+
+ inputs <- Generator.credentialDefinitionInput.runCollectN(10)
+ _ <- inputs
+ .map(in =>
+ basicRequest
+ .post(credentialDefinitionUriBase)
+ .body(in.toJsonPretty)
+ .response(asJsonAlways[CredentialDefinitionResponse])
+ .send(backend)
+ )
+ .reduce((l, r) => l.flatMap(_ => r))
+
+ response: CredentialDefinitionResponsePageType <- basicRequest
+ .get(uri"$credentialDefinitionUriBase?offset=0&limit=4")
+ .response(asJsonAlways[CredentialDefinitionResponsePage])
+ .send(backend)
+
+ credentialDefinitionPage <- ZIO.fromEither(response.body)
+
+ itIsSuccessfulResponse = assert(response.code)(equalTo(StatusCode.Ok))
+ itReturnedDefaultLimitOfItemsInOnePage = assert(credentialDefinitionPage.contents.length)(equalTo(4))
+ nextPage_isNonEmpty = assertTrue(credentialDefinitionPage.next.nonEmpty)
+ previousPage_isEmpty = assertTrue(credentialDefinitionPage.previous.isEmpty)
+ self_equalsTo_theValidUri = assert(credentialDefinitionPage.self)(
+ equalTo(s"$credentialDefinitionUriBase?offset=0&limit=4")
+ )
+ pageOf_equalTo_theValidUri = assert(credentialDefinitionPage.pageOf)(
+ equalTo(credentialDefinitionUriBase.toString)
+ )
+
+ } yield itIsSuccessfulResponse &&
+ itReturnedDefaultLimitOfItemsInOnePage &&
+ nextPage_isNonEmpty &&
+ previousPage_isEmpty &&
+ self_equalsTo_theValidUri &&
+ pageOf_equalTo_theValidUri
+ },
+ test("pagination and navigation over the pages") {
+ for {
+ _ <- deleteAllCredentialDefinitions
+ inputs <- generateCredentialDefinitionsN(10)
+
+ allPagesWithLimit1 <- fetchAllPages(uri"$credentialDefinitionUriBase?offset=0&limit=1")
+ allPagesWithLimit10 <- fetchAllPages(uri"$credentialDefinitionUriBase?offset=0&limit=5")
+ allPagesWithLimit15 <- fetchAllPages(uri"$credentialDefinitionUriBase?offset=0&limit=3")
+ } yield assert(inputs.length)(equalTo(10)) &&
+ assert(allPagesWithLimit1.length)(equalTo(10)) &&
+ assert(allPagesWithLimit10.length)(equalTo(2)) &&
+ assert(allPagesWithLimit15.length)(equalTo(4))
+ }
+ ).provideSomeLayer(ZLayer.succeed(WalletAccessContext(WalletId.default)))
diff --git a/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/credentialdefinition/CredentialDefinitionTestTools.scala b/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/credentialdefinition/CredentialDefinitionTestTools.scala
new file mode 100644
index 0000000000..f8b396c8ca
--- /dev/null
+++ b/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/credentialdefinition/CredentialDefinitionTestTools.scala
@@ -0,0 +1,205 @@
+package io.iohk.atala.pollux.credentialdefinition
+
+import com.dimafeng.testcontainers.PostgreSQLContainer
+import io.iohk.atala.agent.walletapi.memory.DIDSecretStorageInMemory
+import io.iohk.atala.agent.walletapi.model.{ManagedDIDState, PublicationState}
+import io.iohk.atala.agent.walletapi.service.{ManagedDIDService, MockManagedDIDService}
+import io.iohk.atala.agent.walletapi.storage.DIDSecretStorage
+import io.iohk.atala.api.http.ErrorResponse
+import io.iohk.atala.castor.core.model.did.PrismDIDOperation
+import io.iohk.atala.iam.authentication.{Authenticator, DefaultEntityAuthenticator}
+import io.iohk.atala.pollux.core.repository.CredentialDefinitionRepository
+import io.iohk.atala.pollux.core.service.{
+ CredentialDefinitionService,
+ CredentialDefinitionServiceImpl,
+ ResourceURIDereferencerImpl
+}
+import io.iohk.atala.pollux.credentialdefinition.controller.{
+ CredentialDefinitionController,
+ CredentialDefinitionControllerImpl
+}
+import io.iohk.atala.pollux.credentialdefinition.http.{
+ CredentialDefinitionInput,
+ CredentialDefinitionResponse,
+ CredentialDefinitionResponsePage
+}
+import io.iohk.atala.pollux.sql.repository.JdbcCredentialDefinitionRepository
+import io.iohk.atala.shared.models.WalletAccessContext
+import io.iohk.atala.shared.test.containers.PostgresTestContainerSupport
+import sttp.client3.testing.SttpBackendStub
+import sttp.client3.ziojson.*
+import sttp.client3.{DeserializationException, Response, UriContext, basicRequest}
+import sttp.monad.MonadError
+import sttp.tapir.server.interceptor.CustomiseInterceptors
+import sttp.tapir.server.stub.TapirStubInterpreter
+import sttp.tapir.ztapir.RIOMonadError
+import zio.*
+import zio.json.EncoderOps
+import zio.mock.Expectation
+import zio.test.{Assertion, Gen, ZIOSpecDefault}
+
+import java.time.OffsetDateTime
+
+trait CredentialDefinitionTestTools extends PostgresTestContainerSupport {
+ self: ZIOSpecDefault =>
+
+ type CredentialDefinitionBadRequestResponse =
+ Response[Either[DeserializationException[String], ErrorResponse]]
+ type CredentialDefinitionResponseType =
+ Response[Either[DeserializationException[String], CredentialDefinitionResponse]]
+ type CredentialDefinitionResponsePageType =
+ Response[
+ Either[DeserializationException[String], CredentialDefinitionResponsePage]
+ ]
+
+ private val controllerLayer =
+ DIDSecretStorageInMemory.layer >+>
+ systemTransactorLayer >+> contextAwareTransactorLayer >+> JdbcCredentialDefinitionRepository.layer >+>
+ ResourceURIDereferencerImpl.layer >+>
+ CredentialDefinitionServiceImpl.layer >+>
+ CredentialDefinitionControllerImpl.layer
+
+ val mockManagedDIDServiceLayer: Expectation[ManagedDIDService] = MockManagedDIDService
+ .GetManagedDIDState(
+ assertion = Assertion.anything,
+ result = Expectation.value(
+ Some(
+ ManagedDIDState(
+ PrismDIDOperation.Create(Nil, Nil, Nil),
+ 0,
+ PublicationState.Published(scala.collection.immutable.ArraySeq.empty)
+ )
+ )
+ )
+ )
+
+ val authenticatorLayer: TaskLayer[Authenticator] = DefaultEntityAuthenticator.layer
+
+ lazy val testEnvironmentLayer = ZLayer.makeSome[
+ ManagedDIDService,
+ CredentialDefinitionController & CredentialDefinitionRepository & CredentialDefinitionService &
+ PostgreSQLContainer & Authenticator & DIDSecretStorage
+ ](
+ controllerLayer,
+// CredentialDefinitionControllerImpl.layer,
+// CredentialDefinitionServiceImpl.layer,
+// JdbcCredentialDefinitionRepository.layer,
+// contextAwareTransactorLayer,
+// systemTransactorLayer,
+ pgContainerLayer,
+ authenticatorLayer
+ )
+
+ val credentialDefinitionUriBase = uri"http://test.com/credential-definition-registry/definitions"
+
+ def bootstrapOptions[F[_]](monadError: MonadError[F]) = {
+ new CustomiseInterceptors[F, Any](_ => ())
+ .defaultHandlers(ErrorResponse.failureResponseHandler)
+ }
+
+ def httpBackend(controller: CredentialDefinitionController, authenticator: Authenticator) = {
+ val credentialDefinitionRegistryEndpoints = CredentialDefinitionRegistryServerEndpoints(controller, authenticator)
+
+ val backend =
+ TapirStubInterpreter(
+ bootstrapOptions(new RIOMonadError[Any]),
+ SttpBackendStub(new RIOMonadError[Any])
+ )
+ .whenServerEndpoint(credentialDefinitionRegistryEndpoints.createCredentialDefinitionServerEndpoint)
+ .thenRunLogic()
+ .whenServerEndpoint(credentialDefinitionRegistryEndpoints.getCredentialDefinitionByIdServerEndpoint)
+ .thenRunLogic()
+ .whenServerEndpoint(
+ credentialDefinitionRegistryEndpoints.lookupCredentialDefinitionsByQueryServerEndpoint
+ )
+ .thenRunLogic()
+ .backend()
+ backend
+ }
+
+ def deleteAllCredentialDefinitions: RIO[CredentialDefinitionRepository & WalletAccessContext, Long] = {
+ for {
+ repository <- ZIO.service[CredentialDefinitionRepository]
+ count <- repository.deleteAll()
+ } yield count
+ }
+}
+
+trait CredentialDefinitionGen {
+ self: ZIOSpecDefault with CredentialDefinitionTestTools =>
+ object Generator {
+ val credentialDefinitionName = Gen.alphaNumericStringBounded(4, 12)
+ val majorVersion = Gen.int(1, 9)
+ val minorVersion = Gen.int(0, 9)
+ val patchVersion = Gen.int(0, 9)
+ val credentialDefinitionVersion =
+ majorVersion <*> minorVersion <*> patchVersion map (v => s"${v._1}.${v._2}.${v._3}")
+ val credentialDefinitionDescription = Gen.alphaNumericStringBounded(5, 30)
+ val credentialDefinitionAttribute = Gen.alphaNumericStringBounded(3, 9)
+ val credentialDefinitionAttributes = Gen.setOfBounded(1, 4)(credentialDefinitionAttribute).map(_.toList)
+ val credentialDefinitionAuthored = Gen.offsetDateTime(
+ min = OffsetDateTime.now().minusMonths(6),
+ max = OffsetDateTime.now()
+ )
+ val credentialDefinitionTag: Gen[Any, String] = Gen.alphaNumericStringBounded(3, 5)
+
+ val credentialDefinitionAuthor =
+ Gen.int(1000000, 9999999).map(i => s"did:prism:4fb06243213500578f59588de3e1dd9b266ec1b61e43b0ff86ad0712f$i")
+
+ val credentialDefinitionSchemaId = Gen.alphaNumericStringBounded(4, 12)
+ val credentialDefinitionSignatureType = Gen.alphaNumericStringBounded(4, 12)
+ val credentialDefinitionSupportRevocation = Gen.boolean
+
+ val definitionString =
+ """
+ |{
+ | "credentialSubject": {
+ | "emailAddress": "alice@wonderland.com",
+ | "givenName": "Alice",
+ | "familyName": "Wonderland",
+ | "dateOfIssuance": "2000-01-01T10:00:00Z",
+ | "drivingLicenseID": "12345",
+ | "drivingClass": 5
+ | }
+ |}
+ |""".stripMargin
+
+ val credentialDefinitionInput = for {
+ name <- credentialDefinitionName
+ version <- credentialDefinitionVersion
+ description <- credentialDefinitionDescription
+ author <- credentialDefinitionAuthor
+ tag <- credentialDefinitionTag
+ signatureType <- credentialDefinitionSignatureType
+ supportRevocation <- credentialDefinitionSupportRevocation
+ } yield CredentialDefinitionInput(
+ name = name,
+ version = version,
+ description = Some(description),
+ tag = tag,
+ author = author,
+ schemaId = "resource:///anoncred-schema-example.json",
+ signatureType = signatureType,
+ supportRevocation = supportRevocation
+ )
+ }
+
+ def generateCredentialDefinitionsN(
+ count: Int
+ ): ZIO[CredentialDefinitionController & Authenticator, Throwable, List[CredentialDefinitionInput]] =
+ for {
+ controller <- ZIO.service[CredentialDefinitionController]
+ authenticator <- ZIO.service[Authenticator]
+ backend = httpBackend(controller, authenticator)
+ inputs <- Generator.credentialDefinitionInput.runCollectN(count)
+ _ <- inputs
+ .map(in =>
+ basicRequest
+ .post(credentialDefinitionUriBase)
+ .body(in.toJsonPretty)
+ .response(asJsonAlways[CredentialDefinitionResponse])
+ .send(backend)
+ )
+ .reduce((l, r) => l.flatMap(_ => r))
+ } yield inputs
+}
diff --git a/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/CredentialSchemaAnoncredSpec.scala b/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/schema/CredentialSchemaAnoncredSpec.scala
similarity index 99%
rename from prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/CredentialSchemaAnoncredSpec.scala
rename to prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/schema/CredentialSchemaAnoncredSpec.scala
index 7a73683812..d5fc29523b 100644
--- a/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/CredentialSchemaAnoncredSpec.scala
+++ b/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/schema/CredentialSchemaAnoncredSpec.scala
@@ -1,4 +1,4 @@
-package io.iohk.atala.pollux
+package io.iohk.atala.pollux.schema
import io.iohk.atala.api.http.ErrorResponse
import io.iohk.atala.container.util.MigrationAspects.*
diff --git a/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/CredentialSchemaBasicSpec.scala b/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/schema/CredentialSchemaBasicSpec.scala
similarity index 99%
rename from prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/CredentialSchemaBasicSpec.scala
rename to prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/schema/CredentialSchemaBasicSpec.scala
index 6f0fc50f18..41bb921d9b 100644
--- a/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/CredentialSchemaBasicSpec.scala
+++ b/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/schema/CredentialSchemaBasicSpec.scala
@@ -1,4 +1,4 @@
-package io.iohk.atala.pollux
+package io.iohk.atala.pollux.schema
import com.dimafeng.testcontainers.PostgreSQLContainer
import io.iohk.atala.agent.walletapi.service.ManagedDIDService
diff --git a/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/CredentialSchemaFailureSpec.scala b/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/schema/CredentialSchemaFailureSpec.scala
similarity index 93%
rename from prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/CredentialSchemaFailureSpec.scala
rename to prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/schema/CredentialSchemaFailureSpec.scala
index b0b1521157..8b20b3830c 100644
--- a/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/CredentialSchemaFailureSpec.scala
+++ b/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/schema/CredentialSchemaFailureSpec.scala
@@ -1,4 +1,4 @@
-package io.iohk.atala.pollux
+package io.iohk.atala.pollux.schema
import com.dimafeng.testcontainers.PostgreSQLContainer
import io.iohk.atala.agent.walletapi.service.MockManagedDIDService
@@ -8,7 +8,8 @@ import io.iohk.atala.iam.authentication.Authenticator
import io.iohk.atala.pollux.credentialschema.*
import io.iohk.atala.pollux.credentialschema.controller.CredentialSchemaController
import sttp.client3.ziojson.*
-import sttp.client3.{DeserializationException, basicRequest}
+import sttp.client3.DeserializationException
+import sttp.client3.basicRequest
import sttp.model.StatusCode
import zio.*
import zio.test.*
diff --git a/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/CredentialSchemaLookupAndPaginationSpec.scala b/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/schema/CredentialSchemaLookupAndPaginationSpec.scala
similarity index 97%
rename from prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/CredentialSchemaLookupAndPaginationSpec.scala
rename to prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/schema/CredentialSchemaLookupAndPaginationSpec.scala
index 10c739ac5c..82f8adb3fd 100644
--- a/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/CredentialSchemaLookupAndPaginationSpec.scala
+++ b/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/schema/CredentialSchemaLookupAndPaginationSpec.scala
@@ -1,4 +1,4 @@
-package io.iohk.atala.pollux
+package io.iohk.atala.pollux.schema
import com.dimafeng.testcontainers.PostgreSQLContainer
import io.iohk.atala.container.util.MigrationAspects.migrate
@@ -10,8 +10,7 @@ import io.iohk.atala.pollux.credentialschema.http.{
CredentialSchemaResponse,
CredentialSchemaResponsePage
}
-import io.iohk.atala.shared.models.WalletAccessContext
-import io.iohk.atala.shared.models.WalletId
+import io.iohk.atala.shared.models.{WalletAccessContext, WalletId}
import sttp.client3.ziojson.*
import sttp.client3.{DeserializationException, Response, UriContext, basicRequest}
import sttp.model.{StatusCode, Uri}
diff --git a/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/CredentialSchemaMultiTenancySpec.scala b/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/schema/CredentialSchemaMultiTenancySpec.scala
similarity index 99%
rename from prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/CredentialSchemaMultiTenancySpec.scala
rename to prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/schema/CredentialSchemaMultiTenancySpec.scala
index be2a2b48f4..65fe4017b1 100644
--- a/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/CredentialSchemaMultiTenancySpec.scala
+++ b/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/schema/CredentialSchemaMultiTenancySpec.scala
@@ -1,4 +1,4 @@
-package io.iohk.atala.pollux
+package io.iohk.atala.pollux.schema
import com.dimafeng.testcontainers.PostgreSQLContainer
import io.iohk.atala.agent.walletapi.model.Entity
diff --git a/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/CredentialSchemaTestTools.scala b/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/schema/CredentialSchemaTestTools.scala
similarity index 99%
rename from prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/CredentialSchemaTestTools.scala
rename to prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/schema/CredentialSchemaTestTools.scala
index 0739f6a664..ee95147210 100644
--- a/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/CredentialSchemaTestTools.scala
+++ b/prism-agent/service/server/src/test/scala/io/iohk/atala/pollux/schema/CredentialSchemaTestTools.scala
@@ -1,9 +1,11 @@
-package io.iohk.atala.pollux
+package io.iohk.atala.pollux.schema
+import com.dimafeng.testcontainers.PostgreSQLContainer
import io.iohk.atala.agent.walletapi.model.{ManagedDIDState, PublicationState}
import io.iohk.atala.agent.walletapi.service.{ManagedDIDService, MockManagedDIDService}
import io.iohk.atala.api.http.ErrorResponse
import io.iohk.atala.castor.core.model.did.PrismDIDOperation
+import io.iohk.atala.iam.authentication.{Authenticator, DefaultEntityAuthenticator}
import io.iohk.atala.pollux.core.model.schema.`type`.CredentialJsonSchemaType
import io.iohk.atala.pollux.core.repository.CredentialSchemaRepository
import io.iohk.atala.pollux.core.service.{CredentialSchemaService, CredentialSchemaServiceImpl}
@@ -32,8 +34,6 @@ import zio.mock.Expectation
import zio.test.{Assertion, Gen, ZIOSpecDefault}
import java.time.OffsetDateTime
-import com.dimafeng.testcontainers.PostgreSQLContainer
-import io.iohk.atala.iam.authentication.{Authenticator, DefaultEntityAuthenticator}
trait CredentialSchemaTestTools extends PostgresTestContainerSupport {
self: ZIOSpecDefault =>
diff --git a/prism-agent/service/wallet-api/src/main/scala/io/iohk/atala/agent/walletapi/vault/VaultDIDSecretStorage.scala b/prism-agent/service/wallet-api/src/main/scala/io/iohk/atala/agent/walletapi/vault/VaultDIDSecretStorage.scala
index 61ca82c52d..71ff17960e 100644
--- a/prism-agent/service/wallet-api/src/main/scala/io/iohk/atala/agent/walletapi/vault/VaultDIDSecretStorage.scala
+++ b/prism-agent/service/wallet-api/src/main/scala/io/iohk/atala/agent/walletapi/vault/VaultDIDSecretStorage.scala
@@ -17,7 +17,7 @@ class VaultDIDSecretStorage(vaultKV: VaultKVClient) extends DIDSecretStorage {
_ <- vaultKV
.set[DIDSecret](path, didSecret)
.when(!alreadyExist)
- .someOrFail(Exception(s"Secret on path $path alraedy exists."))
+ .someOrFail(Exception(s"Secret on path $path already exists."))
} yield 1
}
diff --git a/tests/performance-tests/atala-performance-tests-k6/package.json b/tests/performance-tests/atala-performance-tests-k6/package.json
index a52f8980fc..8b8e498d7e 100644
--- a/tests/performance-tests/atala-performance-tests-k6/package.json
+++ b/tests/performance-tests/atala-performance-tests-k6/package.json
@@ -6,26 +6,26 @@
"author": "Simon Aronsson ",
"license": "MIT",
"devDependencies": {
- "@babel/core": "7.13.16",
- "@babel/plugin-proposal-class-properties": "7.13.0",
- "@babel/plugin-proposal-object-rest-spread": "7.13.8",
- "@babel/preset-env": "7.13.15",
- "@babel/preset-typescript": "7.13.0",
- "@types/k6": "~0.41.0",
- "@types/webpack": "5.28.0",
- "babel-loader": "8.2.2",
- "clean-webpack-plugin": "4.0.0-alpha.0",
- "copy-webpack-plugin": "^9.0.1",
- "typescript": "4.2.4",
- "webpack": "5.35.1",
- "webpack-cli": "4.6.0",
+ "@babel/core": "7.22.11",
+ "@babel/plugin-proposal-class-properties": "7.18.6",
+ "@babel/plugin-proposal-object-rest-spread": "7.20.7",
+ "@babel/preset-env": "7.22.14",
+ "@babel/preset-typescript": "7.22.11",
+ "@types/k6": "~0.46.2",
+ "@types/webpack": "5.28.2",
+ "babel-loader": "9.1.3",
+ "clean-webpack-plugin": "4.0.0",
+ "copy-webpack-plugin": "^11.0.0",
+ "typescript": "5.2.2",
+ "webpack": "5.88.2",
+ "webpack-cli": "5.1.4",
"webpack-glob-entries": "^1.0.1"
},
"scripts": {
"start": "webpack"
},
"dependencies": {
- "@input-output-hk/prism-typescript-client": "^1.9.2",
+ "@input-output-hk/prism-typescript-client": "^1.12.0",
"uuid": "^9.0.0"
}
}
diff --git a/tests/performance-tests/atala-performance-tests-k6/yarn.lock b/tests/performance-tests/atala-performance-tests-k6/yarn.lock
index cee3019755..81ef0af7bf 100644
--- a/tests/performance-tests/atala-performance-tests-k6/yarn.lock
+++ b/tests/performance-tests/atala-performance-tests-k6/yarn.lock
@@ -2,45 +2,54 @@
# yarn lockfile v1
-"@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658"
- integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==
+"@ampproject/remapping@^2.2.0":
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630"
+ integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==
dependencies:
- "@babel/highlight" "^7.22.5"
+ "@jridgewell/gen-mapping" "^0.3.0"
+ "@jridgewell/trace-mapping" "^0.3.9"
-"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.13.15", "@babel/compat-data@^7.13.8", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.5.tgz#b1f6c86a02d85d2dd3368a2b67c09add8cd0c255"
- integrity sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==
-
-"@babel/core@7.13.16":
- version "7.13.16"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.13.16.tgz#7756ab24396cc9675f1c3fcd5b79fcce192ea96a"
- integrity sha512-sXHpixBiWWFti0AV2Zq7avpTasr6sIAu7Y396c608541qAU2ui4a193m0KSQmfPSKFZLnQ3cvlKDOm3XkuXm3Q==
- dependencies:
- "@babel/code-frame" "^7.12.13"
- "@babel/generator" "^7.13.16"
- "@babel/helper-compilation-targets" "^7.13.16"
- "@babel/helper-module-transforms" "^7.13.14"
- "@babel/helpers" "^7.13.16"
- "@babel/parser" "^7.13.16"
- "@babel/template" "^7.12.13"
- "@babel/traverse" "^7.13.15"
- "@babel/types" "^7.13.16"
+"@babel/code-frame@^7.22.10", "@babel/code-frame@^7.22.5":
+ version "7.22.13"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e"
+ integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==
+ dependencies:
+ "@babel/highlight" "^7.22.13"
+ chalk "^2.4.2"
+
+"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9":
+ version "7.22.9"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730"
+ integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==
+
+"@babel/core@7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.11.tgz#8033acaa2aa24c3f814edaaa057f3ce0ba559c24"
+ integrity sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==
+ dependencies:
+ "@ampproject/remapping" "^2.2.0"
+ "@babel/code-frame" "^7.22.10"
+ "@babel/generator" "^7.22.10"
+ "@babel/helper-compilation-targets" "^7.22.10"
+ "@babel/helper-module-transforms" "^7.22.9"
+ "@babel/helpers" "^7.22.11"
+ "@babel/parser" "^7.22.11"
+ "@babel/template" "^7.22.5"
+ "@babel/traverse" "^7.22.11"
+ "@babel/types" "^7.22.11"
convert-source-map "^1.7.0"
debug "^4.1.0"
gensync "^1.0.0-beta.2"
- json5 "^2.1.2"
- semver "^6.3.0"
- source-map "^0.5.0"
+ json5 "^2.2.3"
+ semver "^6.3.1"
-"@babel/generator@^7.13.16", "@babel/generator@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.5.tgz#1e7bf768688acfb05cf30b2369ef855e82d984f7"
- integrity sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==
+"@babel/generator@^7.22.10":
+ version "7.22.10"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.10.tgz#c92254361f398e160645ac58831069707382b722"
+ integrity sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==
dependencies:
- "@babel/types" "^7.22.5"
+ "@babel/types" "^7.22.10"
"@jridgewell/gen-mapping" "^0.3.2"
"@jridgewell/trace-mapping" "^0.3.17"
jsesc "^2.5.1"
@@ -53,62 +62,59 @@
"@babel/types" "^7.22.5"
"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz#a3f4758efdd0190d8927fcffd261755937c71878"
- integrity sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==
+ version "7.22.10"
+ resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.10.tgz#573e735937e99ea75ea30788b57eb52fab7468c9"
+ integrity sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ==
dependencies:
- "@babel/types" "^7.22.5"
+ "@babel/types" "^7.22.10"
-"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.13", "@babel/helper-compilation-targets@^7.13.16", "@babel/helper-compilation-targets@^7.13.8", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz#fc7319fc54c5e2fa14b2909cf3c5fd3046813e02"
- integrity sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==
+"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.10", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6":
+ version "7.22.10"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz#01d648bbc25dd88f513d862ee0df27b7d4e67024"
+ integrity sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==
dependencies:
- "@babel/compat-data" "^7.22.5"
+ "@babel/compat-data" "^7.22.9"
"@babel/helper-validator-option" "^7.22.5"
- browserslist "^4.21.3"
+ browserslist "^4.21.9"
lru-cache "^5.1.1"
- semver "^6.3.0"
+ semver "^6.3.1"
-"@babel/helper-create-class-features-plugin@^7.13.0", "@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.5.tgz#2192a1970ece4685fbff85b48da2c32fcb130b7c"
- integrity sha512-xkb58MyOYIslxu3gKmVXmjTtUPvBU4odYzbiIQbWwLKIHCsx6UGZGX6F1IznMFVnDdirseUZopzN+ZRt8Xb33Q==
+"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.5":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.11.tgz#4078686740459eeb4af3494a273ac09148dfb213"
+ integrity sha512-y1grdYL4WzmUDBRGK0pDbIoFd7UZKoDurDzWEoNMYoj1EL+foGRQNyPWDcC+YyegN5y1DUsFFmzjGijB3nSVAQ==
dependencies:
"@babel/helper-annotate-as-pure" "^7.22.5"
"@babel/helper-environment-visitor" "^7.22.5"
"@babel/helper-function-name" "^7.22.5"
"@babel/helper-member-expression-to-functions" "^7.22.5"
"@babel/helper-optimise-call-expression" "^7.22.5"
- "@babel/helper-replace-supers" "^7.22.5"
+ "@babel/helper-replace-supers" "^7.22.9"
"@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
- "@babel/helper-split-export-declaration" "^7.22.5"
- semver "^6.3.0"
+ "@babel/helper-split-export-declaration" "^7.22.6"
+ semver "^6.3.1"
"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.5.tgz#bb2bf0debfe39b831986a4efbf4066586819c6e4"
- integrity sha512-1VpEFOIbMRaXyDeUwUfmTIxExLwQ+zkW+Bh5zXpApA3oQedBx9v/updixWxnx/bZpKw7u8VxWjb/qWpIcmPq8A==
+ version "7.22.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz#9d8e61a8d9366fe66198f57c40565663de0825f6"
+ integrity sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==
dependencies:
"@babel/helper-annotate-as-pure" "^7.22.5"
regexpu-core "^5.3.1"
- semver "^6.3.0"
+ semver "^6.3.1"
-"@babel/helper-define-polyfill-provider@^0.2.2", "@babel/helper-define-polyfill-provider@^0.2.4":
- version "0.2.4"
- resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.4.tgz#8867aed79d3ea6cade40f801efb7ac5c66916b10"
- integrity sha512-OrpPZ97s+aPi6h2n1OXzdhVis1SGSsMU2aMHgLcOKfsp4/v1NWpx3CWT3lBj5eeBq9cDkPkh+YCfdF7O12uNDQ==
+"@babel/helper-define-polyfill-provider@^0.4.2":
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz#82c825cadeeeee7aad237618ebbe8fa1710015d7"
+ integrity sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==
dependencies:
- "@babel/helper-compilation-targets" "^7.13.0"
- "@babel/helper-module-imports" "^7.12.13"
- "@babel/helper-plugin-utils" "^7.13.0"
- "@babel/traverse" "^7.13.0"
+ "@babel/helper-compilation-targets" "^7.22.6"
+ "@babel/helper-plugin-utils" "^7.22.5"
debug "^4.1.1"
lodash.debounce "^4.0.8"
resolve "^1.14.2"
- semver "^6.1.2"
-"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.5":
+"@babel/helper-environment-visitor@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98"
integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==
@@ -135,26 +141,23 @@
dependencies:
"@babel/types" "^7.22.5"
-"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.22.5":
+"@babel/helper-module-imports@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c"
integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==
dependencies:
"@babel/types" "^7.22.5"
-"@babel/helper-module-transforms@^7.13.14", "@babel/helper-module-transforms@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz#0f65daa0716961b6e96b164034e737f60a80d2ef"
- integrity sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==
+"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9":
+ version "7.22.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz#92dfcb1fbbb2bc62529024f72d942a8c97142129"
+ integrity sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==
dependencies:
"@babel/helper-environment-visitor" "^7.22.5"
"@babel/helper-module-imports" "^7.22.5"
"@babel/helper-simple-access" "^7.22.5"
- "@babel/helper-split-export-declaration" "^7.22.5"
+ "@babel/helper-split-export-declaration" "^7.22.6"
"@babel/helper-validator-identifier" "^7.22.5"
- "@babel/template" "^7.22.5"
- "@babel/traverse" "^7.22.5"
- "@babel/types" "^7.22.5"
"@babel/helper-optimise-call-expression@^7.22.5":
version "7.22.5"
@@ -163,32 +166,28 @@
dependencies:
"@babel/types" "^7.22.5"
-"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
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-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.5.tgz#14a38141a7bf2165ad38da61d61cf27b43015da2"
- integrity sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g==
+"@babel/helper-remap-async-to-generator@^7.22.5", "@babel/helper-remap-async-to-generator@^7.22.9":
+ version "7.22.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz#53a25b7484e722d7efb9c350c75c032d4628de82"
+ integrity sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==
dependencies:
"@babel/helper-annotate-as-pure" "^7.22.5"
"@babel/helper-environment-visitor" "^7.22.5"
- "@babel/helper-wrap-function" "^7.22.5"
- "@babel/types" "^7.22.5"
+ "@babel/helper-wrap-function" "^7.22.9"
-"@babel/helper-replace-supers@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz#71bc5fb348856dea9fdc4eafd7e2e49f585145dc"
- integrity sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg==
+"@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9":
+ version "7.22.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz#cbdc27d6d8d18cd22c81ae4293765a5d9afd0779"
+ integrity sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==
dependencies:
"@babel/helper-environment-visitor" "^7.22.5"
"@babel/helper-member-expression-to-functions" "^7.22.5"
"@babel/helper-optimise-call-expression" "^7.22.5"
- "@babel/template" "^7.22.5"
- "@babel/traverse" "^7.22.5"
- "@babel/types" "^7.22.5"
"@babel/helper-simple-access@^7.22.5":
version "7.22.5"
@@ -197,17 +196,17 @@
dependencies:
"@babel/types" "^7.22.5"
-"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5":
+"@babel/helper-skip-transparent-expression-wrappers@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847"
integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==
dependencies:
"@babel/types" "^7.22.5"
-"@babel/helper-split-export-declaration@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz#88cf11050edb95ed08d596f7a044462189127a08"
- integrity sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==
+"@babel/helper-split-export-declaration@^7.22.6":
+ version "7.22.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c"
+ integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==
dependencies:
"@babel/types" "^7.22.5"
@@ -221,45 +220,51 @@
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193"
integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==
-"@babel/helper-validator-option@^7.12.17", "@babel/helper-validator-option@^7.22.5":
+"@babel/helper-validator-option@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac"
integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==
-"@babel/helper-wrap-function@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.5.tgz#44d205af19ed8d872b4eefb0d2fa65f45eb34f06"
- integrity sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw==
+"@babel/helper-wrap-function@^7.22.9":
+ version "7.22.10"
+ resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz#d845e043880ed0b8c18bd194a12005cb16d2f614"
+ integrity sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==
dependencies:
"@babel/helper-function-name" "^7.22.5"
"@babel/template" "^7.22.5"
- "@babel/traverse" "^7.22.5"
- "@babel/types" "^7.22.5"
+ "@babel/types" "^7.22.10"
-"@babel/helpers@^7.13.16":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.5.tgz#74bb4373eb390d1ceed74a15ef97767e63120820"
- integrity sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==
+"@babel/helpers@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.11.tgz#b02f5d5f2d7abc21ab59eeed80de410ba70b056a"
+ integrity sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==
dependencies:
"@babel/template" "^7.22.5"
- "@babel/traverse" "^7.22.5"
- "@babel/types" "^7.22.5"
+ "@babel/traverse" "^7.22.11"
+ "@babel/types" "^7.22.11"
-"@babel/highlight@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031"
- integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==
+"@babel/highlight@^7.22.13":
+ version "7.22.13"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.13.tgz#9cda839e5d3be9ca9e8c26b6dd69e7548f0cbf16"
+ integrity sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==
dependencies:
"@babel/helper-validator-identifier" "^7.22.5"
- chalk "^2.0.0"
+ chalk "^2.4.2"
js-tokens "^4.0.0"
-"@babel/parser@^7.13.16", "@babel/parser@^7.22.5":
+"@babel/parser@^7.22.11", "@babel/parser@^7.22.5":
+ version "7.22.14"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.14.tgz#c7de58e8de106e88efca42ce17f0033209dfd245"
+ integrity sha512-1KucTHgOvaw/LzCVrEOAyXkr9rQlp0A1HiHRYnSUE9dmb8PvPW7o5sscg+5169r54n3vGlbx6GevTE/Iw/P3AQ==
+
+"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5":
version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.5.tgz#721fd042f3ce1896238cf1b341c77eb7dee7dbea"
- integrity sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz#87245a21cd69a73b0b81bcda98d443d6df08f05e"
+ integrity sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.13.12":
+"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz#fef09f9499b1f1c930da8a0c419db42167d792ca"
integrity sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==
@@ -268,25 +273,7 @@
"@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
"@babel/plugin-transform-optional-chaining" "^7.22.5"
-"@babel/plugin-proposal-async-generator-functions@^7.13.15":
- version "7.20.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326"
- integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==
- dependencies:
- "@babel/helper-environment-visitor" "^7.18.9"
- "@babel/helper-plugin-utils" "^7.20.2"
- "@babel/helper-remap-async-to-generator" "^7.18.9"
- "@babel/plugin-syntax-async-generators" "^7.8.4"
-
-"@babel/plugin-proposal-class-properties@7.13.0":
- version "7.13.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz#146376000b94efd001e57a40a88a525afaab9f37"
- integrity sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==
- dependencies:
- "@babel/helper-create-class-features-plugin" "^7.13.0"
- "@babel/helper-plugin-utils" "^7.13.0"
-
-"@babel/plugin-proposal-class-properties@^7.13.0":
+"@babel/plugin-proposal-class-properties@7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3"
integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==
@@ -294,66 +281,7 @@
"@babel/helper-create-class-features-plugin" "^7.18.6"
"@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-proposal-dynamic-import@^7.13.8":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94"
- integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.6"
- "@babel/plugin-syntax-dynamic-import" "^7.8.3"
-
-"@babel/plugin-proposal-export-namespace-from@^7.12.13":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203"
- integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.9"
- "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
-
-"@babel/plugin-proposal-json-strings@^7.13.8":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b"
- integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.6"
- "@babel/plugin-syntax-json-strings" "^7.8.3"
-
-"@babel/plugin-proposal-logical-assignment-operators@^7.13.8":
- version "7.20.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83"
- integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==
- dependencies:
- "@babel/helper-plugin-utils" "^7.20.2"
- "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
-
-"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1"
- integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.6"
- "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
-
-"@babel/plugin-proposal-numeric-separator@^7.12.13":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75"
- integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.6"
- "@babel/plugin-syntax-numeric-separator" "^7.10.4"
-
-"@babel/plugin-proposal-object-rest-spread@7.13.8":
- version "7.13.8"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz#5d210a4d727d6ce3b18f9de82cc99a3964eed60a"
- integrity sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==
- dependencies:
- "@babel/compat-data" "^7.13.8"
- "@babel/helper-compilation-targets" "^7.13.8"
- "@babel/helper-plugin-utils" "^7.13.0"
- "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
- "@babel/plugin-transform-parameters" "^7.13.0"
-
-"@babel/plugin-proposal-object-rest-spread@^7.13.8":
+"@babel/plugin-proposal-object-rest-spread@7.20.7":
version "7.20.7"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a"
integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==
@@ -364,38 +292,10 @@
"@babel/plugin-syntax-object-rest-spread" "^7.8.3"
"@babel/plugin-transform-parameters" "^7.20.7"
-"@babel/plugin-proposal-optional-catch-binding@^7.13.8":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb"
- integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.6"
- "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
-
-"@babel/plugin-proposal-optional-chaining@^7.13.12":
- version "7.21.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea"
- integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.20.2"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0"
- "@babel/plugin-syntax-optional-chaining" "^7.8.3"
-
-"@babel/plugin-proposal-private-methods@^7.13.0":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea"
- integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==
- dependencies:
- "@babel/helper-create-class-features-plugin" "^7.18.6"
- "@babel/helper-plugin-utils" "^7.18.6"
-
-"@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e"
- integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==
- dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.18.6"
- "@babel/helper-plugin-utils" "^7.18.6"
+"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2":
+ version "7.21.0-placeholder-for-preset-env.2"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703"
+ integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==
"@babel/plugin-syntax-async-generators@^7.8.4":
version "7.8.4"
@@ -411,6 +311,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.12.13"
+"@babel/plugin-syntax-class-static-block@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406"
+ integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
"@babel/plugin-syntax-dynamic-import@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
@@ -425,6 +332,27 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
+"@babel/plugin-syntax-import-assertions@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98"
+ integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-syntax-import-attributes@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz#ab840248d834410b829f569f5262b9e517555ecb"
+ integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-syntax-import-meta@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51"
+ integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
"@babel/plugin-syntax-json-strings@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
@@ -432,6 +360,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
+"@babel/plugin-syntax-jsx@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918"
+ integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
"@babel/plugin-syntax-logical-assignment-operators@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
@@ -474,7 +409,14 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
-"@babel/plugin-syntax-top-level-await@^7.12.13":
+"@babel/plugin-syntax-private-property-in-object@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad"
+ integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-top-level-await@^7.14.5":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c"
integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==
@@ -488,14 +430,32 @@
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-arrow-functions@^7.13.0":
+"@babel/plugin-syntax-unicode-sets-regex@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357"
+ integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-arrow-functions@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958"
integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-async-to-generator@^7.13.0":
+"@babel/plugin-transform-async-generator-functions@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.11.tgz#dbe3b1ff5a52e2e5edc4b19a60d325a675ed2649"
+ integrity sha512-0pAlmeRJn6wU84zzZsEOx1JV1Jf8fqO9ok7wofIJwUnplYo247dcd24P+cMJht7ts9xkzdtB0EPHmOb7F+KzXw==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-remap-async-to-generator" "^7.22.9"
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
+
+"@babel/plugin-transform-async-to-generator@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775"
integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==
@@ -504,36 +464,53 @@
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/helper-remap-async-to-generator" "^7.22.5"
-"@babel/plugin-transform-block-scoped-functions@^7.12.13":
+"@babel/plugin-transform-block-scoped-functions@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024"
integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-block-scoping@^7.12.13":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz#8bfc793b3a4b2742c0983fadc1480d843ecea31b"
- integrity sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==
+"@babel/plugin-transform-block-scoping@^7.22.10":
+ version "7.22.10"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz#88a1dccc3383899eb5e660534a76a22ecee64faa"
+ integrity sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-classes@^7.13.0":
+"@babel/plugin-transform-class-properties@^7.22.5":
version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.5.tgz#635d4e98da741fad814984639f4c0149eb0135e1"
- integrity sha512-2edQhLfibpWpsVBx2n/GKOz6JdGQvLruZQfGr9l1qes2KQaWswjBzhQF7UDUZMNaMMQeYnQzxwOMPsbYF7wqPQ==
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz#97a56e31ad8c9dc06a0b3710ce7803d5a48cca77"
+ integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-class-static-block@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz#dc8cc6e498f55692ac6b4b89e56d87cec766c974"
+ integrity sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.22.11"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-class-static-block" "^7.14.5"
+
+"@babel/plugin-transform-classes@^7.22.6":
+ version "7.22.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz#e04d7d804ed5b8501311293d1a0e6d43e94c3363"
+ integrity sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==
dependencies:
"@babel/helper-annotate-as-pure" "^7.22.5"
- "@babel/helper-compilation-targets" "^7.22.5"
+ "@babel/helper-compilation-targets" "^7.22.6"
"@babel/helper-environment-visitor" "^7.22.5"
"@babel/helper-function-name" "^7.22.5"
"@babel/helper-optimise-call-expression" "^7.22.5"
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/helper-replace-supers" "^7.22.5"
- "@babel/helper-split-export-declaration" "^7.22.5"
+ "@babel/helper-split-export-declaration" "^7.22.6"
globals "^11.1.0"
-"@babel/plugin-transform-computed-properties@^7.13.0":
+"@babel/plugin-transform-computed-properties@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869"
integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==
@@ -541,14 +518,14 @@
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/template" "^7.22.5"
-"@babel/plugin-transform-destructuring@^7.13.0":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz#d3aca7438f6c26c78cdd0b0ba920a336001b27cc"
- integrity sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==
+"@babel/plugin-transform-destructuring@^7.22.10":
+ version "7.22.10"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz#38e2273814a58c810b6c34ea293be4973c4eb5e2"
+ integrity sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.4.4":
+"@babel/plugin-transform-dotall-regex@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165"
integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==
@@ -556,14 +533,22 @@
"@babel/helper-create-regexp-features-plugin" "^7.22.5"
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-duplicate-keys@^7.12.13":
+"@babel/plugin-transform-duplicate-keys@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz#b6e6428d9416f5f0bba19c70d1e6e7e0b88ab285"
integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-exponentiation-operator@^7.12.13":
+"@babel/plugin-transform-dynamic-import@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz#2c7722d2a5c01839eaf31518c6ff96d408e447aa"
+ integrity sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+
+"@babel/plugin-transform-exponentiation-operator@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz#402432ad544a1f9a480da865fda26be653e48f6a"
integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==
@@ -571,14 +556,22 @@
"@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5"
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-for-of@^7.13.0":
+"@babel/plugin-transform-export-namespace-from@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz#b3c84c8f19880b6c7440108f8929caf6056db26c"
+ integrity sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+
+"@babel/plugin-transform-for-of@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz#ab1b8a200a8f990137aff9a084f8de4099ab173f"
integrity sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-function-name@^7.12.13":
+"@babel/plugin-transform-function-name@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143"
integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==
@@ -587,21 +580,37 @@
"@babel/helper-function-name" "^7.22.5"
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-literals@^7.12.13":
+"@babel/plugin-transform-json-strings@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz#689a34e1eed1928a40954e37f74509f48af67835"
+ integrity sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
+
+"@babel/plugin-transform-literals@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920"
integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-member-expression-literals@^7.12.13":
+"@babel/plugin-transform-logical-assignment-operators@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz#24c522a61688bde045b7d9bc3c2597a4d948fc9c"
+ integrity sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+
+"@babel/plugin-transform-member-expression-literals@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def"
integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-modules-amd@^7.13.0":
+"@babel/plugin-transform-modules-amd@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz#4e045f55dcf98afd00f85691a68fc0780704f526"
integrity sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==
@@ -609,26 +618,26 @@
"@babel/helper-module-transforms" "^7.22.5"
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-modules-commonjs@^7.13.8":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz#7d9875908d19b8c0536085af7b053fd5bd651bfa"
- integrity sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==
+"@babel/plugin-transform-modules-commonjs@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.11.tgz#d7991d3abad199c03b68ee66a64f216c47ffdfae"
+ integrity sha512-o2+bg7GDS60cJMgz9jWqRUsWkMzLCxp+jFDeDUT5sjRlAxcJWZ2ylNdI7QQ2+CH5hWu7OnN+Cv3htt7AkSf96g==
dependencies:
- "@babel/helper-module-transforms" "^7.22.5"
+ "@babel/helper-module-transforms" "^7.22.9"
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/helper-simple-access" "^7.22.5"
-"@babel/plugin-transform-modules-systemjs@^7.13.8":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz#18c31410b5e579a0092638f95c896c2a98a5d496"
- integrity sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==
+"@babel/plugin-transform-modules-systemjs@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz#3386be5875d316493b517207e8f1931d93154bb1"
+ integrity sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==
dependencies:
"@babel/helper-hoist-variables" "^7.22.5"
- "@babel/helper-module-transforms" "^7.22.5"
+ "@babel/helper-module-transforms" "^7.22.9"
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/helper-validator-identifier" "^7.22.5"
-"@babel/plugin-transform-modules-umd@^7.13.0":
+"@babel/plugin-transform-modules-umd@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz#4694ae40a87b1745e3775b6a7fe96400315d4f98"
integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==
@@ -636,7 +645,7 @@
"@babel/helper-module-transforms" "^7.22.5"
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-named-capturing-groups-regex@^7.12.13":
+"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f"
integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==
@@ -644,14 +653,41 @@
"@babel/helper-create-regexp-features-plugin" "^7.22.5"
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-new-target@^7.12.13":
+"@babel/plugin-transform-new-target@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz#1b248acea54ce44ea06dfd37247ba089fcf9758d"
integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-object-super@^7.12.13":
+"@babel/plugin-transform-nullish-coalescing-operator@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz#debef6c8ba795f5ac67cd861a81b744c5d38d9fc"
+ integrity sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+
+"@babel/plugin-transform-numeric-separator@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz#498d77dc45a6c6db74bb829c02a01c1d719cbfbd"
+ integrity sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+
+"@babel/plugin-transform-object-rest-spread@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.11.tgz#dbbb06ce783cd994a8f430d8cefa553e9b42ca62"
+ integrity sha512-nX8cPFa6+UmbepISvlf5jhQyaC7ASs/7UxHmMkuJ/k5xSHvDPPaibMo+v3TXwU/Pjqhep/nFNpd3zn4YR59pnw==
+ dependencies:
+ "@babel/compat-data" "^7.22.9"
+ "@babel/helper-compilation-targets" "^7.22.10"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+ "@babel/plugin-transform-parameters" "^7.22.5"
+
+"@babel/plugin-transform-object-super@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c"
integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==
@@ -659,52 +695,78 @@
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/helper-replace-supers" "^7.22.5"
-"@babel/plugin-transform-optional-chaining@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.5.tgz#1003762b9c14295501beb41be72426736bedd1e0"
- integrity sha512-AconbMKOMkyG+xCng2JogMCDcqW8wedQAqpVIL4cOSescZ7+iW8utC6YDZLMCSUIReEA733gzRSaOSXMAt/4WQ==
+"@babel/plugin-transform-optional-catch-binding@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz#461cc4f578a127bb055527b3e77404cad38c08e0"
+ integrity sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+
+"@babel/plugin-transform-optional-chaining@^7.22.12", "@babel/plugin-transform-optional-chaining@^7.22.5":
+ version "7.22.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.12.tgz#d7ebf6a88cd2f4d307b0e000ab630acd8124b333"
+ integrity sha512-7XXCVqZtyFWqjDsYDY4T45w4mlx1rf7aOgkc/Ww76xkgBiOlmjPkx36PBLHa1k1rwWvVgYMPsbuVnIamx2ZQJw==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
"@babel/plugin-syntax-optional-chaining" "^7.8.3"
-"@babel/plugin-transform-parameters@^7.13.0", "@babel/plugin-transform-parameters@^7.20.7":
+"@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz#c3542dd3c39b42c8069936e48717a8d179d63a18"
integrity sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-property-literals@^7.12.13":
+"@babel/plugin-transform-private-methods@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz#21c8af791f76674420a147ae62e9935d790f8722"
+ integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-private-property-in-object@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz#ad45c4fc440e9cb84c718ed0906d96cf40f9a4e1"
+ integrity sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.22.5"
+ "@babel/helper-create-class-features-plugin" "^7.22.11"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+
+"@babel/plugin-transform-property-literals@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766"
integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-regenerator@^7.13.15":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz#cd8a68b228a5f75fa01420e8cc2fc400f0fc32aa"
- integrity sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==
+"@babel/plugin-transform-regenerator@^7.22.10":
+ version "7.22.10"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz#8ceef3bd7375c4db7652878b0241b2be5d0c3cca"
+ integrity sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
- regenerator-transform "^0.15.1"
+ regenerator-transform "^0.15.2"
-"@babel/plugin-transform-reserved-words@^7.12.13":
+"@babel/plugin-transform-reserved-words@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz#832cd35b81c287c4bcd09ce03e22199641f964fb"
integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-shorthand-properties@^7.12.13":
+"@babel/plugin-transform-shorthand-properties@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624"
integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-spread@^7.13.0":
+"@babel/plugin-transform-spread@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b"
integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==
@@ -712,45 +774,53 @@
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
-"@babel/plugin-transform-sticky-regex@^7.12.13":
+"@babel/plugin-transform-sticky-regex@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa"
integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-template-literals@^7.13.0":
+"@babel/plugin-transform-template-literals@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff"
integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-typeof-symbol@^7.12.13":
+"@babel/plugin-transform-typeof-symbol@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz#5e2ba478da4b603af8673ff7c54f75a97b716b34"
integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-typescript@^7.13.0":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.5.tgz#5c0f7adfc1b5f38c4dbc8f79b1f0f8074134bd7d"
- integrity sha512-SMubA9S7Cb5sGSFFUlqxyClTA9zWJ8qGQrppNUm05LtFuN1ELRFNndkix4zUJrC9F+YivWwa1dHMSyo0e0N9dA==
+"@babel/plugin-transform-typescript@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.11.tgz#9f27fb5e51585729374bb767ab6a6d9005a23329"
+ integrity sha512-0E4/L+7gfvHub7wsbTv03oRtD69X31LByy44fGmFzbZScpupFByMcgCJ0VbBTkzyjSJKuRoGN8tcijOWKTmqOA==
dependencies:
"@babel/helper-annotate-as-pure" "^7.22.5"
- "@babel/helper-create-class-features-plugin" "^7.22.5"
+ "@babel/helper-create-class-features-plugin" "^7.22.11"
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/plugin-syntax-typescript" "^7.22.5"
-"@babel/plugin-transform-unicode-escapes@^7.12.13":
+"@babel/plugin-transform-unicode-escapes@^7.22.10":
+ version "7.22.10"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz#c723f380f40a2b2f57a62df24c9005834c8616d9"
+ integrity sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-unicode-property-regex@^7.22.5":
version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz#ce0c248522b1cb22c7c992d88301a5ead70e806c"
- integrity sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz#098898f74d5c1e86660dc112057b2d11227f1c81"
+ integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==
dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.22.5"
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-unicode-regex@^7.12.13":
+"@babel/plugin-transform-unicode-regex@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183"
integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==
@@ -758,33 +828,34 @@
"@babel/helper-create-regexp-features-plugin" "^7.22.5"
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/preset-env@7.13.15":
- version "7.13.15"
- resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.13.15.tgz#c8a6eb584f96ecba183d3d414a83553a599f478f"
- integrity sha512-D4JAPMXcxk69PKe81jRJ21/fP/uYdcTZ3hJDF5QX2HSI9bBxxYw/dumdR6dGumhjxlprHPE4XWoPaqzZUVy2MA==
- dependencies:
- "@babel/compat-data" "^7.13.15"
- "@babel/helper-compilation-targets" "^7.13.13"
- "@babel/helper-plugin-utils" "^7.13.0"
- "@babel/helper-validator-option" "^7.12.17"
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.13.12"
- "@babel/plugin-proposal-async-generator-functions" "^7.13.15"
- "@babel/plugin-proposal-class-properties" "^7.13.0"
- "@babel/plugin-proposal-dynamic-import" "^7.13.8"
- "@babel/plugin-proposal-export-namespace-from" "^7.12.13"
- "@babel/plugin-proposal-json-strings" "^7.13.8"
- "@babel/plugin-proposal-logical-assignment-operators" "^7.13.8"
- "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8"
- "@babel/plugin-proposal-numeric-separator" "^7.12.13"
- "@babel/plugin-proposal-object-rest-spread" "^7.13.8"
- "@babel/plugin-proposal-optional-catch-binding" "^7.13.8"
- "@babel/plugin-proposal-optional-chaining" "^7.13.12"
- "@babel/plugin-proposal-private-methods" "^7.13.0"
- "@babel/plugin-proposal-unicode-property-regex" "^7.12.13"
+"@babel/plugin-transform-unicode-sets-regex@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz#77788060e511b708ffc7d42fdfbc5b37c3004e91"
+ integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/preset-env@7.22.14":
+ version "7.22.14"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.14.tgz#1cbb468d899f64fa71c53446f13b7ff8c0005cc1"
+ integrity sha512-daodMIoVo+ol/g+//c/AH+szBkFj4STQUikvBijRGL72Ph+w+AMTSh55DUETe8KJlPlDT1k/mp7NBfOuiWmoig==
+ dependencies:
+ "@babel/compat-data" "^7.22.9"
+ "@babel/helper-compilation-targets" "^7.22.10"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-validator-option" "^7.22.5"
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.5"
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.5"
+ "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2"
"@babel/plugin-syntax-async-generators" "^7.8.4"
"@babel/plugin-syntax-class-properties" "^7.12.13"
+ "@babel/plugin-syntax-class-static-block" "^7.14.5"
"@babel/plugin-syntax-dynamic-import" "^7.8.3"
"@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+ "@babel/plugin-syntax-import-assertions" "^7.22.5"
+ "@babel/plugin-syntax-import-attributes" "^7.22.5"
+ "@babel/plugin-syntax-import-meta" "^7.10.4"
"@babel/plugin-syntax-json-strings" "^7.8.3"
"@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
"@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
@@ -792,66 +863,84 @@
"@babel/plugin-syntax-object-rest-spread" "^7.8.3"
"@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
"@babel/plugin-syntax-optional-chaining" "^7.8.3"
- "@babel/plugin-syntax-top-level-await" "^7.12.13"
- "@babel/plugin-transform-arrow-functions" "^7.13.0"
- "@babel/plugin-transform-async-to-generator" "^7.13.0"
- "@babel/plugin-transform-block-scoped-functions" "^7.12.13"
- "@babel/plugin-transform-block-scoping" "^7.12.13"
- "@babel/plugin-transform-classes" "^7.13.0"
- "@babel/plugin-transform-computed-properties" "^7.13.0"
- "@babel/plugin-transform-destructuring" "^7.13.0"
- "@babel/plugin-transform-dotall-regex" "^7.12.13"
- "@babel/plugin-transform-duplicate-keys" "^7.12.13"
- "@babel/plugin-transform-exponentiation-operator" "^7.12.13"
- "@babel/plugin-transform-for-of" "^7.13.0"
- "@babel/plugin-transform-function-name" "^7.12.13"
- "@babel/plugin-transform-literals" "^7.12.13"
- "@babel/plugin-transform-member-expression-literals" "^7.12.13"
- "@babel/plugin-transform-modules-amd" "^7.13.0"
- "@babel/plugin-transform-modules-commonjs" "^7.13.8"
- "@babel/plugin-transform-modules-systemjs" "^7.13.8"
- "@babel/plugin-transform-modules-umd" "^7.13.0"
- "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13"
- "@babel/plugin-transform-new-target" "^7.12.13"
- "@babel/plugin-transform-object-super" "^7.12.13"
- "@babel/plugin-transform-parameters" "^7.13.0"
- "@babel/plugin-transform-property-literals" "^7.12.13"
- "@babel/plugin-transform-regenerator" "^7.13.15"
- "@babel/plugin-transform-reserved-words" "^7.12.13"
- "@babel/plugin-transform-shorthand-properties" "^7.12.13"
- "@babel/plugin-transform-spread" "^7.13.0"
- "@babel/plugin-transform-sticky-regex" "^7.12.13"
- "@babel/plugin-transform-template-literals" "^7.13.0"
- "@babel/plugin-transform-typeof-symbol" "^7.12.13"
- "@babel/plugin-transform-unicode-escapes" "^7.12.13"
- "@babel/plugin-transform-unicode-regex" "^7.12.13"
- "@babel/preset-modules" "^0.1.4"
- "@babel/types" "^7.13.14"
- babel-plugin-polyfill-corejs2 "^0.2.0"
- babel-plugin-polyfill-corejs3 "^0.2.0"
- babel-plugin-polyfill-regenerator "^0.2.0"
- core-js-compat "^3.9.0"
- semver "^6.3.0"
-
-"@babel/preset-modules@^0.1.4":
- version "0.1.5"
- resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9"
- integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==
+ "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+ "@babel/plugin-syntax-top-level-await" "^7.14.5"
+ "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6"
+ "@babel/plugin-transform-arrow-functions" "^7.22.5"
+ "@babel/plugin-transform-async-generator-functions" "^7.22.11"
+ "@babel/plugin-transform-async-to-generator" "^7.22.5"
+ "@babel/plugin-transform-block-scoped-functions" "^7.22.5"
+ "@babel/plugin-transform-block-scoping" "^7.22.10"
+ "@babel/plugin-transform-class-properties" "^7.22.5"
+ "@babel/plugin-transform-class-static-block" "^7.22.11"
+ "@babel/plugin-transform-classes" "^7.22.6"
+ "@babel/plugin-transform-computed-properties" "^7.22.5"
+ "@babel/plugin-transform-destructuring" "^7.22.10"
+ "@babel/plugin-transform-dotall-regex" "^7.22.5"
+ "@babel/plugin-transform-duplicate-keys" "^7.22.5"
+ "@babel/plugin-transform-dynamic-import" "^7.22.11"
+ "@babel/plugin-transform-exponentiation-operator" "^7.22.5"
+ "@babel/plugin-transform-export-namespace-from" "^7.22.11"
+ "@babel/plugin-transform-for-of" "^7.22.5"
+ "@babel/plugin-transform-function-name" "^7.22.5"
+ "@babel/plugin-transform-json-strings" "^7.22.11"
+ "@babel/plugin-transform-literals" "^7.22.5"
+ "@babel/plugin-transform-logical-assignment-operators" "^7.22.11"
+ "@babel/plugin-transform-member-expression-literals" "^7.22.5"
+ "@babel/plugin-transform-modules-amd" "^7.22.5"
+ "@babel/plugin-transform-modules-commonjs" "^7.22.11"
+ "@babel/plugin-transform-modules-systemjs" "^7.22.11"
+ "@babel/plugin-transform-modules-umd" "^7.22.5"
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5"
+ "@babel/plugin-transform-new-target" "^7.22.5"
+ "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.11"
+ "@babel/plugin-transform-numeric-separator" "^7.22.11"
+ "@babel/plugin-transform-object-rest-spread" "^7.22.11"
+ "@babel/plugin-transform-object-super" "^7.22.5"
+ "@babel/plugin-transform-optional-catch-binding" "^7.22.11"
+ "@babel/plugin-transform-optional-chaining" "^7.22.12"
+ "@babel/plugin-transform-parameters" "^7.22.5"
+ "@babel/plugin-transform-private-methods" "^7.22.5"
+ "@babel/plugin-transform-private-property-in-object" "^7.22.11"
+ "@babel/plugin-transform-property-literals" "^7.22.5"
+ "@babel/plugin-transform-regenerator" "^7.22.10"
+ "@babel/plugin-transform-reserved-words" "^7.22.5"
+ "@babel/plugin-transform-shorthand-properties" "^7.22.5"
+ "@babel/plugin-transform-spread" "^7.22.5"
+ "@babel/plugin-transform-sticky-regex" "^7.22.5"
+ "@babel/plugin-transform-template-literals" "^7.22.5"
+ "@babel/plugin-transform-typeof-symbol" "^7.22.5"
+ "@babel/plugin-transform-unicode-escapes" "^7.22.10"
+ "@babel/plugin-transform-unicode-property-regex" "^7.22.5"
+ "@babel/plugin-transform-unicode-regex" "^7.22.5"
+ "@babel/plugin-transform-unicode-sets-regex" "^7.22.5"
+ "@babel/preset-modules" "0.1.6-no-external-plugins"
+ "@babel/types" "^7.22.11"
+ babel-plugin-polyfill-corejs2 "^0.4.5"
+ babel-plugin-polyfill-corejs3 "^0.8.3"
+ babel-plugin-polyfill-regenerator "^0.5.2"
+ core-js-compat "^3.31.0"
+ semver "^6.3.1"
+
+"@babel/preset-modules@0.1.6-no-external-plugins":
+ version "0.1.6-no-external-plugins"
+ resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a"
+ integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
- "@babel/plugin-proposal-unicode-property-regex" "^7.4.4"
- "@babel/plugin-transform-dotall-regex" "^7.4.4"
"@babel/types" "^7.4.4"
esutils "^2.0.2"
-"@babel/preset-typescript@7.13.0":
- version "7.13.0"
- resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.13.0.tgz#ab107e5f050609d806fbb039bec553b33462c60a"
- integrity sha512-LXJwxrHy0N3f6gIJlYbLta1D9BDtHpQeqwzM0LIfjDlr6UE/D5Mc7W4iDiQzaE+ks0sTjT26ArcHWnJVt0QiHw==
+"@babel/preset-typescript@7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.22.11.tgz#f218cd0345524ac888aa3dc32f029de5b064b575"
+ integrity sha512-tWY5wyCZYBGY7IlalfKI1rLiGlIfnwsRHZqlky0HVv8qviwQ1Uo/05M6+s+TcTCVa6Bmoo2uJW5TMFX6Wa4qVg==
dependencies:
- "@babel/helper-plugin-utils" "^7.13.0"
- "@babel/helper-validator-option" "^7.12.17"
- "@babel/plugin-transform-typescript" "^7.13.0"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-validator-option" "^7.22.5"
+ "@babel/plugin-syntax-jsx" "^7.22.5"
+ "@babel/plugin-transform-modules-commonjs" "^7.22.11"
+ "@babel/plugin-transform-typescript" "^7.22.11"
"@babel/regjsgen@^0.8.0":
version "0.8.0"
@@ -859,13 +948,13 @@
integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==
"@babel/runtime@^7.8.4":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.5.tgz#8564dd588182ce0047d55d7a75e93921107b57ec"
- integrity sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.11.tgz#7a9ba3bbe406ad6f9e8dd4da2ece453eb23a77a4"
+ integrity sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==
dependencies:
- regenerator-runtime "^0.13.11"
+ regenerator-runtime "^0.14.0"
-"@babel/template@^7.12.13", "@babel/template@^7.22.5":
+"@babel/template@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec"
integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==
@@ -874,26 +963,26 @@
"@babel/parser" "^7.22.5"
"@babel/types" "^7.22.5"
-"@babel/traverse@^7.13.0", "@babel/traverse@^7.13.15", "@babel/traverse@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.5.tgz#44bd276690db6f4940fdb84e1cb4abd2f729ccd1"
- integrity sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==
+"@babel/traverse@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.11.tgz#71ebb3af7a05ff97280b83f05f8865ac94b2027c"
+ integrity sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==
dependencies:
- "@babel/code-frame" "^7.22.5"
- "@babel/generator" "^7.22.5"
+ "@babel/code-frame" "^7.22.10"
+ "@babel/generator" "^7.22.10"
"@babel/helper-environment-visitor" "^7.22.5"
"@babel/helper-function-name" "^7.22.5"
"@babel/helper-hoist-variables" "^7.22.5"
- "@babel/helper-split-export-declaration" "^7.22.5"
- "@babel/parser" "^7.22.5"
- "@babel/types" "^7.22.5"
+ "@babel/helper-split-export-declaration" "^7.22.6"
+ "@babel/parser" "^7.22.11"
+ "@babel/types" "^7.22.11"
debug "^4.1.0"
globals "^11.1.0"
-"@babel/types@^7.13.14", "@babel/types@^7.13.16", "@babel/types@^7.22.5", "@babel/types@^7.4.4":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe"
- integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==
+"@babel/types@^7.22.10", "@babel/types@^7.22.11", "@babel/types@^7.22.5", "@babel/types@^7.4.4":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.11.tgz#0e65a6a1d4d9cbaa892b2213f6159485fe632ea2"
+ integrity sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==
dependencies:
"@babel/helper-string-parser" "^7.22.5"
"@babel/helper-validator-identifier" "^7.22.5"
@@ -904,16 +993,16 @@
resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70"
integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==
-"@input-output-hk/prism-typescript-client@^1.9.2":
- version "1.9.2"
- resolved "https://npm.pkg.github.com/download/@input-output-hk/prism-typescript-client/1.9.2/7b9441a4d27327afb1de0969473a16128cfab3f0#7b9441a4d27327afb1de0969473a16128cfab3f0"
- integrity sha512-53mqcgXX6RCqYnBzEb8E/9JUMr29Jmcq2o+0G8Ik+uVpzeG8a72V5Whz3gqFLjG8JBHzUs2ePt++/lKRnIxujQ==
+"@input-output-hk/prism-typescript-client@^1.12.0":
+ version "1.12.0"
+ resolved "https://npm.pkg.github.com/download/@input-output-hk/prism-typescript-client/1.12.0/b327649cf9be1a2f6c41ac2cdac7467523165cfe#b327649cf9be1a2f6c41ac2cdac7467523165cfe"
+ integrity sha512-0YAR+Rhu7WA0Y2jAv8eH0i4VG0G4AOWysc+T+G7sCsCI0PjmgiG9CvUz10tupEnO7n8fwvVGSA7lu2SD5NKEyw==
dependencies:
es6-promise "^4.2.4"
url-parse "^1.4.3"
whatwg-fetch "^3.0.0"
-"@jridgewell/gen-mapping@^0.3.2":
+"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2":
version "0.3.3"
resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098"
integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==
@@ -922,10 +1011,10 @@
"@jridgewell/sourcemap-codec" "^1.4.10"
"@jridgewell/trace-mapping" "^0.3.9"
-"@jridgewell/resolve-uri@3.1.0":
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78"
- integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
+"@jridgewell/resolve-uri@^3.1.0":
+ 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/set-array@^1.0.1":
version "1.1.2"
@@ -933,27 +1022,25 @@
integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
"@jridgewell/source-map@^0.3.3":
- version "0.3.4"
- resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.4.tgz#856a142864530d4059dda415659b48d37db2d556"
- integrity sha512-KE/SxsDqNs3rrWwFHcRh15ZLVFrI0YoZtgAdIyIq9k5hUNmiWRXXThPomIxHuL20sLdgzbDFyvkUMna14bvtrw==
-
-"@jridgewell/sourcemap-codec@1.4.14":
- version "1.4.14"
- resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
- integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91"
+ integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.0"
+ "@jridgewell/trace-mapping" "^0.3.9"
-"@jridgewell/sourcemap-codec@^1.4.10":
+"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14":
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.17", "@jridgewell/trace-mapping@^0.3.9":
- version "0.3.18"
- resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6"
- integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==
+ version "0.3.19"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811"
+ integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==
dependencies:
- "@jridgewell/resolve-uri" "3.1.0"
- "@jridgewell/sourcemap-codec" "1.4.14"
+ "@jridgewell/resolve-uri" "^3.1.0"
+ "@jridgewell/sourcemap-codec" "^1.4.14"
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
@@ -976,7 +1063,7 @@
"@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0"
-"@types/eslint-scope@^3.7.0", "@types/eslint-scope@^3.7.3":
+"@types/eslint-scope@^3.7.3":
version "3.7.4"
resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16"
integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==
@@ -985,9 +1072,9 @@
"@types/estree" "*"
"@types/eslint@*":
- version "8.40.2"
- resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.40.2.tgz#2833bc112d809677864a4b0e7d1de4f04d7dac2d"
- integrity sha512-PRVjQ4Eh9z9pmmtaq8nTjZjQwKFk7YIHIud3lRoKRBgUQjgjRmoGxxGEPXQkF+lH7QkHJRNr5F4aBgYCW0lqpQ==
+ version "8.44.2"
+ resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.2.tgz#0d21c505f98a89b8dd4d37fa162b09da6089199a"
+ integrity sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==
dependencies:
"@types/estree" "*"
"@types/json-schema" "*"
@@ -997,11 +1084,6 @@
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194"
integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==
-"@types/estree@^0.0.47":
- version "0.0.47"
- resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.47.tgz#d7a51db20f0650efec24cd04994f523d93172ed4"
- integrity sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg==
-
"@types/glob@^7.1.1":
version "7.2.0"
resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb"
@@ -1010,15 +1092,15 @@
"@types/minimatch" "*"
"@types/node" "*"
-"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8":
+"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9":
version "7.0.12"
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb"
integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==
-"@types/k6@~0.41.0":
- version "0.41.0"
- resolved "https://registry.yarnpkg.com/@types/k6/-/k6-0.41.0.tgz#de023a75eadf33b87f50a9261f40bd7eb5736e50"
- integrity sha512-Zvu9Hhu2Q8CYHFQi3P0whFnK9UnO8apJxRimhAMxbEeAVjCgyWGWb0vgJqy0cxGmmy2yJ2Ee3JhfHZC645o7fA==
+"@types/k6@~0.46.2":
+ version "0.46.2"
+ resolved "https://registry.yarnpkg.com/@types/k6/-/k6-0.46.2.tgz#5b27de2aba666f0bbdc37f8812a64b2a9deb1535"
+ integrity sha512-T1LU04YzrmcsTVOtFFL0wn0TPzvX08XNbmUJAIziR0J+4HO3IwN4t/X20y16+qZY7Aac141lYWje6QIIrbmmKg==
"@types/minimatch@*":
version "5.1.2"
@@ -1026,27 +1108,19 @@
integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==
"@types/node@*":
- version "20.3.2"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.2.tgz#fa6a90f2600e052a03c18b8cb3fd83dd4e599898"
- integrity sha512-vOBLVQeCQfIcF/2Y7eKFTqrMnizK5lRNQ7ykML/5RuwVXVWxYkgwS7xbt4B6fKCUPgbSL5FSsjHQpaGQP/dQmw==
+ version "20.5.7"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.7.tgz#4b8ecac87fbefbc92f431d09c30e176fc0a7c377"
+ integrity sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==
-"@types/webpack@5.28.0":
- version "5.28.0"
- resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-5.28.0.tgz#78dde06212f038d77e54116cfe69e88ae9ed2c03"
- integrity sha512-8cP0CzcxUiFuA9xGJkfeVpqmWTk9nx6CWwamRGCj95ph1SmlRRk9KlCZ6avhCbZd4L68LvYT6l1kpdEnQXrF8w==
+"@types/webpack@5.28.2":
+ version "5.28.2"
+ resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-5.28.2.tgz#a4db514f30b1b593278fbae6d6f9654c3d53c4c8"
+ integrity sha512-7tcxyrIOd7WGimZIcWU6pDsNh2edGGnwYExOvd3l/nMvuxqwVPrFXnnTbYCnplqV9BJoU7Mo2mfFtiH8CNFvYw==
dependencies:
"@types/node" "*"
tapable "^2.2.0"
webpack "^5"
-"@webassemblyjs/ast@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.0.tgz#a5aa679efdc9e51707a4207139da57920555961f"
- integrity sha512-kX2W49LWsbthrmIRMbQZuQDhGtjyqXfEmmHyEi4XWnSZtPmxY0+3anPIzsnRb45VH/J55zlOfWvZuY47aJZTJg==
- dependencies:
- "@webassemblyjs/helper-numbers" "1.11.0"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.0"
-
"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5":
version "1.11.6"
resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24"
@@ -1055,45 +1129,21 @@
"@webassemblyjs/helper-numbers" "1.11.6"
"@webassemblyjs/helper-wasm-bytecode" "1.11.6"
-"@webassemblyjs/floating-point-hex-parser@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.0.tgz#34d62052f453cd43101d72eab4966a022587947c"
- integrity sha512-Q/aVYs/VnPDVYvsCBL/gSgwmfjeCb4LW8+TMrO3cSzJImgv8lxxEPM2JA5jMrivE7LSz3V+PFqtMbls3m1exDA==
-
"@webassemblyjs/floating-point-hex-parser@1.11.6":
version "1.11.6"
resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431"
integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==
-"@webassemblyjs/helper-api-error@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.0.tgz#aaea8fb3b923f4aaa9b512ff541b013ffb68d2d4"
- integrity sha512-baT/va95eXiXb2QflSx95QGT5ClzWpGaa8L7JnJbgzoYeaA27FCvuBXU758l+KXWRndEmUXjP0Q5fibhavIn8w==
-
"@webassemblyjs/helper-api-error@1.11.6":
version "1.11.6"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768"
integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==
-"@webassemblyjs/helper-buffer@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.0.tgz#d026c25d175e388a7dbda9694e91e743cbe9b642"
- integrity sha512-u9HPBEl4DS+vA8qLQdEQ6N/eJQ7gT7aNvMIo8AAWvAl/xMrcOSiI2M0MAnMCy3jIFke7bEee/JwdX1nUpCtdyA==
-
"@webassemblyjs/helper-buffer@1.11.6":
version "1.11.6"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093"
integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==
-"@webassemblyjs/helper-numbers@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.0.tgz#7ab04172d54e312cc6ea4286d7d9fa27c88cd4f9"
- integrity sha512-DhRQKelIj01s5IgdsOJMKLppI+4zpmcMQ3XboFPLwCpSNH6Hqo1ritgHgD0nqHeSYqofA6aBN/NmXuGjM1jEfQ==
- dependencies:
- "@webassemblyjs/floating-point-hex-parser" "1.11.0"
- "@webassemblyjs/helper-api-error" "1.11.0"
- "@xtuc/long" "4.2.2"
-
"@webassemblyjs/helper-numbers@1.11.6":
version "1.11.6"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5"
@@ -1103,26 +1153,11 @@
"@webassemblyjs/helper-api-error" "1.11.6"
"@xtuc/long" "4.2.2"
-"@webassemblyjs/helper-wasm-bytecode@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.0.tgz#85fdcda4129902fe86f81abf7e7236953ec5a4e1"
- integrity sha512-MbmhvxXExm542tWREgSFnOVo07fDpsBJg3sIl6fSp9xuu75eGz5lz31q7wTLffwL3Za7XNRCMZy210+tnsUSEA==
-
"@webassemblyjs/helper-wasm-bytecode@1.11.6":
version "1.11.6"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9"
integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==
-"@webassemblyjs/helper-wasm-section@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.0.tgz#9ce2cc89300262509c801b4af113d1ca25c1a75b"
- integrity sha512-3Eb88hcbfY/FCukrg6i3EH8H2UsD7x8Vy47iVJrP967A9JGqgBVL9aH71SETPx1JrGsOUVLo0c7vMCN22ytJew==
- dependencies:
- "@webassemblyjs/ast" "1.11.0"
- "@webassemblyjs/helper-buffer" "1.11.0"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.0"
- "@webassemblyjs/wasm-gen" "1.11.0"
-
"@webassemblyjs/helper-wasm-section@1.11.6":
version "1.11.6"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577"
@@ -1133,13 +1168,6 @@
"@webassemblyjs/helper-wasm-bytecode" "1.11.6"
"@webassemblyjs/wasm-gen" "1.11.6"
-"@webassemblyjs/ieee754@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.0.tgz#46975d583f9828f5d094ac210e219441c4e6f5cf"
- integrity sha512-KXzOqpcYQwAfeQ6WbF6HXo+0udBNmw0iXDmEK5sFlmQdmND+tr773Ti8/5T/M6Tl/413ArSJErATd8In3B+WBA==
- dependencies:
- "@xtuc/ieee754" "^1.2.0"
-
"@webassemblyjs/ieee754@1.11.6":
version "1.11.6"
resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a"
@@ -1147,13 +1175,6 @@
dependencies:
"@xtuc/ieee754" "^1.2.0"
-"@webassemblyjs/leb128@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.0.tgz#f7353de1df38aa201cba9fb88b43f41f75ff403b"
- integrity sha512-aqbsHa1mSQAbeeNcl38un6qVY++hh8OpCOzxhixSYgbRfNWcxJNJQwe2rezK9XEcssJbbWIkblaJRwGMS9zp+g==
- dependencies:
- "@xtuc/long" "4.2.2"
-
"@webassemblyjs/leb128@1.11.6":
version "1.11.6"
resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7"
@@ -1161,30 +1182,11 @@
dependencies:
"@xtuc/long" "4.2.2"
-"@webassemblyjs/utf8@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.0.tgz#86e48f959cf49e0e5091f069a709b862f5a2cadf"
- integrity sha512-A/lclGxH6SpSLSyFowMzO/+aDEPU4hvEiooCMXQPcQFPPJaYcPQNKGOCLUySJsYJ4trbpr+Fs08n4jelkVTGVw==
-
"@webassemblyjs/utf8@1.11.6":
version "1.11.6"
resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a"
integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==
-"@webassemblyjs/wasm-edit@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.0.tgz#ee4a5c9f677046a210542ae63897094c2027cb78"
- integrity sha512-JHQ0damXy0G6J9ucyKVXO2j08JVJ2ntkdJlq1UTiUrIgfGMmA7Ik5VdC/L8hBK46kVJgujkBIoMtT8yVr+yVOQ==
- dependencies:
- "@webassemblyjs/ast" "1.11.0"
- "@webassemblyjs/helper-buffer" "1.11.0"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.0"
- "@webassemblyjs/helper-wasm-section" "1.11.0"
- "@webassemblyjs/wasm-gen" "1.11.0"
- "@webassemblyjs/wasm-opt" "1.11.0"
- "@webassemblyjs/wasm-parser" "1.11.0"
- "@webassemblyjs/wast-printer" "1.11.0"
-
"@webassemblyjs/wasm-edit@^1.11.5":
version "1.11.6"
resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab"
@@ -1199,17 +1201,6 @@
"@webassemblyjs/wasm-parser" "1.11.6"
"@webassemblyjs/wast-printer" "1.11.6"
-"@webassemblyjs/wasm-gen@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.0.tgz#3cdb35e70082d42a35166988dda64f24ceb97abe"
- integrity sha512-BEUv1aj0WptCZ9kIS30th5ILASUnAPEvE3tVMTrItnZRT9tXCLW2LEXT8ezLw59rqPP9klh9LPmpU+WmRQmCPQ==
- dependencies:
- "@webassemblyjs/ast" "1.11.0"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.0"
- "@webassemblyjs/ieee754" "1.11.0"
- "@webassemblyjs/leb128" "1.11.0"
- "@webassemblyjs/utf8" "1.11.0"
-
"@webassemblyjs/wasm-gen@1.11.6":
version "1.11.6"
resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268"
@@ -1221,16 +1212,6 @@
"@webassemblyjs/leb128" "1.11.6"
"@webassemblyjs/utf8" "1.11.6"
-"@webassemblyjs/wasm-opt@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.0.tgz#1638ae188137f4bb031f568a413cd24d32f92978"
- integrity sha512-tHUSP5F4ywyh3hZ0+fDQuWxKx3mJiPeFufg+9gwTpYp324mPCQgnuVKwzLTZVqj0duRDovnPaZqDwoyhIO8kYg==
- dependencies:
- "@webassemblyjs/ast" "1.11.0"
- "@webassemblyjs/helper-buffer" "1.11.0"
- "@webassemblyjs/wasm-gen" "1.11.0"
- "@webassemblyjs/wasm-parser" "1.11.0"
-
"@webassemblyjs/wasm-opt@1.11.6":
version "1.11.6"
resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2"
@@ -1241,18 +1222,6 @@
"@webassemblyjs/wasm-gen" "1.11.6"
"@webassemblyjs/wasm-parser" "1.11.6"
-"@webassemblyjs/wasm-parser@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.0.tgz#3e680b8830d5b13d1ec86cc42f38f3d4a7700754"
- integrity sha512-6L285Sgu9gphrcpDXINvm0M9BskznnzJTE7gYkjDbxET28shDqp27wpruyx3C2S/dvEwiigBwLA1cz7lNUi0kw==
- dependencies:
- "@webassemblyjs/ast" "1.11.0"
- "@webassemblyjs/helper-api-error" "1.11.0"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.0"
- "@webassemblyjs/ieee754" "1.11.0"
- "@webassemblyjs/leb128" "1.11.0"
- "@webassemblyjs/utf8" "1.11.0"
-
"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5":
version "1.11.6"
resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1"
@@ -1265,14 +1234,6 @@
"@webassemblyjs/leb128" "1.11.6"
"@webassemblyjs/utf8" "1.11.6"
-"@webassemblyjs/wast-printer@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.0.tgz#680d1f6a5365d6d401974a8e949e05474e1fab7e"
- integrity sha512-Fg5OX46pRdTgB7rKIUojkh9vXaVN6sGYCnEiJN1GYkb0RPwShZXp6KTDqmoMdQPKhcroOXh3fEzmkWmCYaKYhQ==
- dependencies:
- "@webassemblyjs/ast" "1.11.0"
- "@xtuc/long" "4.2.2"
-
"@webassemblyjs/wast-printer@1.11.6":
version "1.11.6"
resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20"
@@ -1281,22 +1242,20 @@
"@webassemblyjs/ast" "1.11.6"
"@xtuc/long" "4.2.2"
-"@webpack-cli/configtest@^1.0.2":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz#7b20ce1c12533912c3b217ea68262365fa29a6f5"
- integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==
+"@webpack-cli/configtest@^2.1.1":
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-2.1.1.tgz#3b2f852e91dac6e3b85fb2a314fb8bef46d94646"
+ integrity sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==
-"@webpack-cli/info@^1.2.3":
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1"
- integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==
- dependencies:
- envinfo "^7.7.3"
+"@webpack-cli/info@^2.0.2":
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-2.0.2.tgz#cc3fbf22efeb88ff62310cf885c5b09f44ae0fdd"
+ integrity sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==
-"@webpack-cli/serve@^1.3.1":
- version "1.7.0"
- resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1"
- integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==
+"@webpack-cli/serve@^2.0.5":
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.5.tgz#325db42395cd49fe6c14057f9a900e427df8810e"
+ integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==
"@xtuc/ieee754@^1.2.0":
version "1.2.0"
@@ -1313,17 +1272,31 @@ acorn-import-assertions@^1.9.0:
resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac"
integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==
-acorn@^8.0.4, acorn@^8.7.1, acorn@^8.8.2:
- version "8.9.0"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.9.0.tgz#78a16e3b2bcc198c10822786fa6679e245db5b59"
- integrity sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==
+acorn@^8.7.1, acorn@^8.8.2:
+ version "8.10.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5"
+ integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==
+
+ajv-formats@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520"
+ integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==
+ dependencies:
+ ajv "^8.0.0"
ajv-keywords@^3.5.2:
version "3.5.2"
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
-ajv@^6.12.4, ajv@^6.12.5:
+ajv-keywords@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16"
+ integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==
+ dependencies:
+ fast-deep-equal "^3.1.3"
+
+ajv@^6.12.5:
version "6.12.6"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
@@ -1333,10 +1306,15 @@ ajv@^6.12.4, ajv@^6.12.5:
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==
+ajv@^8.0.0, ajv@^8.9.0:
+ version "8.12.0"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1"
+ integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ json-schema-traverse "^1.0.0"
+ require-from-string "^2.0.2"
+ uri-js "^4.2.2"
ansi-styles@^3.2.1:
version "3.2.1"
@@ -1352,60 +1330,48 @@ array-union@^1.0.1:
dependencies:
array-uniq "^1.0.1"
-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.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==
-babel-loader@8.2.2:
- version "8.2.2"
- resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81"
- integrity sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==
+babel-loader@9.1.3:
+ version "9.1.3"
+ resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.1.3.tgz#3d0e01b4e69760cc694ee306fe16d358aa1c6f9a"
+ integrity sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==
dependencies:
- find-cache-dir "^3.3.1"
- loader-utils "^1.4.0"
- make-dir "^3.1.0"
- schema-utils "^2.6.5"
+ find-cache-dir "^4.0.0"
+ schema-utils "^4.0.0"
-babel-plugin-polyfill-corejs2@^0.2.0:
- version "0.2.3"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.3.tgz#6ed8e30981b062f8fe6aca8873a37ebcc8cc1c0f"
- integrity sha512-NDZ0auNRzmAfE1oDDPW2JhzIMXUk+FFe2ICejmt5T4ocKgiQx3e0VCRx9NCAidcMtL2RUZaWtXnmjTCkx0tcbA==
+babel-plugin-polyfill-corejs2@^0.4.5:
+ version "0.4.5"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz#8097b4cb4af5b64a1d11332b6fb72ef5e64a054c"
+ integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==
dependencies:
- "@babel/compat-data" "^7.13.11"
- "@babel/helper-define-polyfill-provider" "^0.2.4"
- semver "^6.1.1"
+ "@babel/compat-data" "^7.22.6"
+ "@babel/helper-define-polyfill-provider" "^0.4.2"
+ semver "^6.3.1"
-babel-plugin-polyfill-corejs3@^0.2.0:
- version "0.2.5"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz#2779846a16a1652244ae268b1e906ada107faf92"
- integrity sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==
+babel-plugin-polyfill-corejs3@^0.8.3:
+ version "0.8.3"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz#b4f719d0ad9bb8e0c23e3e630c0c8ec6dd7a1c52"
+ integrity sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==
dependencies:
- "@babel/helper-define-polyfill-provider" "^0.2.2"
- core-js-compat "^3.16.2"
+ "@babel/helper-define-polyfill-provider" "^0.4.2"
+ core-js-compat "^3.31.0"
-babel-plugin-polyfill-regenerator@^0.2.0:
- version "0.2.3"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.3.tgz#2e9808f5027c4336c994992b48a4262580cb8d6d"
- integrity sha512-JVE78oRZPKFIeUqFGrSORNzQnrDwZR16oiWeGM8ZyjBn2XAT5OjP+wXx5ESuo33nUsFUEJYjtklnsKbxW5L+7g==
+babel-plugin-polyfill-regenerator@^0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz#80d0f3e1098c080c8b5a65f41e9427af692dc326"
+ integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==
dependencies:
- "@babel/helper-define-polyfill-provider" "^0.2.4"
+ "@babel/helper-define-polyfill-provider" "^0.4.2"
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==
-big.js@^5.2.2:
- version "5.2.2"
- resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
- integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
-
brace-expansion@^1.1.7:
version "1.1.11"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
@@ -1421,14 +1387,14 @@ braces@^3.0.2:
dependencies:
fill-range "^7.0.1"
-browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.5:
- version "4.21.9"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635"
- integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==
+browserslist@^4.14.5, browserslist@^4.21.10, browserslist@^4.21.9:
+ version "4.21.10"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0"
+ integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==
dependencies:
- caniuse-lite "^1.0.30001503"
- electron-to-chromium "^1.4.431"
- node-releases "^2.0.12"
+ caniuse-lite "^1.0.30001517"
+ electron-to-chromium "^1.4.477"
+ node-releases "^2.0.13"
update-browserslist-db "^1.0.11"
buffer-from@^1.0.0:
@@ -1436,12 +1402,12 @@ buffer-from@^1.0.0:
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
-caniuse-lite@^1.0.30001503:
- version "1.0.30001509"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001509.tgz#2b7ad5265392d6d2de25cd8776d1ab3899570d14"
- integrity sha512-2uDDk+TRiTX5hMcUYT/7CSyzMZxjfGu0vAUjS2g0LSD8UoXOv0LtpH4LxGMemsiPq6LCVIUjNwVM0erkOkGCDA==
+caniuse-lite@^1.0.30001517:
+ version "1.0.30001525"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001525.tgz#d2e8fdec6116ffa36284ca2c33ef6d53612fe1c8"
+ integrity sha512-/3z+wB4icFt3r0USMwxujAqRvaD/B7rvGTsKhbhSQErVrJvkZCLhgNLJxU8MevahQVH6hCU9FsHdNUFbiwmE7Q==
-chalk@^2.0.0:
+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==
@@ -1455,10 +1421,10 @@ chrome-trace-event@^1.0.2:
resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac"
integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==
-clean-webpack-plugin@4.0.0-alpha.0:
- version "4.0.0-alpha.0"
- resolved "https://registry.yarnpkg.com/clean-webpack-plugin/-/clean-webpack-plugin-4.0.0-alpha.0.tgz#2aef48dfe7565360d128f5caa0904097d969d053"
- integrity sha512-+X6mASBbGSVyw8L9/1rhQ+vS4uaQMopf194kX7Aes8qfezgCFL+qv5W0nwP3a0Tud5kUckARk8tFcoyOSKEjhg==
+clean-webpack-plugin@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/clean-webpack-plugin/-/clean-webpack-plugin-4.0.0.tgz#72947d4403d452f38ed61a9ff0ada8122aacd729"
+ integrity sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==
dependencies:
del "^4.1.1"
@@ -1483,25 +1449,25 @@ color-name@1.1.3:
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
-colorette@^1.2.1:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40"
- integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==
+colorette@^2.0.14:
+ version "2.0.20"
+ resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a"
+ integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==
+
+commander@^10.0.1:
+ version "10.0.1"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06"
+ integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==
commander@^2.20.0:
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==
-commander@^7.0.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==
-
-commondir@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
- integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==
+common-path-prefix@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0"
+ integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==
concat-map@0.0.1:
version "0.0.1"
@@ -1513,24 +1479,24 @@ convert-source-map@^1.7.0:
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f"
integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==
-copy-webpack-plugin@^9.0.1:
- version "9.1.0"
- resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz#2d2c460c4c4695ec0a58afb2801a1205256c4e6b"
- integrity sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA==
+copy-webpack-plugin@^11.0.0:
+ version "11.0.0"
+ resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz#96d4dbdb5f73d02dd72d0528d1958721ab72e04a"
+ integrity sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==
dependencies:
- fast-glob "^3.2.7"
+ fast-glob "^3.2.11"
glob-parent "^6.0.1"
- globby "^11.0.3"
+ globby "^13.1.1"
normalize-path "^3.0.0"
- schema-utils "^3.1.1"
+ schema-utils "^4.0.0"
serialize-javascript "^6.0.0"
-core-js-compat@^3.16.2, core-js-compat@^3.9.0:
- version "3.31.0"
- resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.31.0.tgz#4030847c0766cc0e803dcdfb30055d7ef2064bf1"
- integrity sha512-hM7YCu1cU6Opx7MXNu0NuumM0ezNeAeRKadixyiQELWY3vT3De9S4J5ZBMraWV2vZnrE1Cirl0GtFtDtMUXzPw==
+core-js-compat@^3.31.0:
+ version "3.32.1"
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.32.1.tgz#55f9a7d297c0761a8eb1d31b593e0f5b6ffae964"
+ integrity sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA==
dependencies:
- browserslist "^4.21.5"
+ browserslist "^4.21.10"
cross-spawn@^7.0.3:
version "7.0.3"
@@ -1568,17 +1534,12 @@ dir-glob@^3.0.1:
dependencies:
path-type "^4.0.0"
-electron-to-chromium@^1.4.431:
- version "1.4.446"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.446.tgz#c23fbc7884bfe43088d5eb908a858dbb35ab190b"
- integrity sha512-4Gnw7ztEQ/E0eOt5JWfPn9jjeupfUlKoeW5ETKP9nLdWj+4spFoS3Stj19fqlKIaX28UQs0fNX+uKEyoLCBnkw==
+electron-to-chromium@^1.4.477:
+ version "1.4.506"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.506.tgz#59f64a211102db4c3ebae2f39cc0e8e1b12b3a07"
+ integrity sha512-xxGct4GPAKSRlrLBtJxJFYy74W11zX6PO9GyHgl/U+2s3Dp0ZEwAklDfNHXOWcvH7zWMpsmgbR0ggEuaYAVvHA==
-emojis-list@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
- integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
-
-enhanced-resolve@^5.15.0, enhanced-resolve@^5.8.0:
+enhanced-resolve@^5.15.0:
version "5.15.0"
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35"
integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==
@@ -1586,23 +1547,11 @@ enhanced-resolve@^5.15.0, enhanced-resolve@^5.8.0:
graceful-fs "^4.2.4"
tapable "^2.2.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==
- dependencies:
- ansi-colors "^4.1.1"
-
envinfo@^7.7.3:
version "7.10.0"
resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.10.0.tgz#55146e3909cc5fe63c22da63fb15b05aeac35b13"
integrity sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==
-es-module-lexer@^0.4.0:
- version "0.4.1"
- resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.4.1.tgz#dda8c6a14d8f340a24e34331e0fab0cb50438e0e"
- integrity sha512-ooYciCUtfw6/d2w56UVeqHPcoCFAiJdz5XOkYpv/Txl1HMUozpXjz/2RIQgqwKdXNDPSF1W7mJCFse3G+HDyAA==
-
es-module-lexer@^1.2.1:
version "1.3.0"
resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.0.tgz#6be9c9e0b4543a60cd166ff6f8b4e9dae0b0c16f"
@@ -1623,7 +1572,7 @@ escape-string-regexp@^1.0.5:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
-eslint-scope@5.1.1, eslint-scope@^5.1.1:
+eslint-scope@5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
@@ -1658,30 +1607,15 @@ events@^3.2.0:
resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
-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"
-
-fast-deep-equal@^3.1.1:
+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-glob@^3.2.7, fast-glob@^3.2.9:
- version "3.2.12"
- resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80"
- integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==
+fast-glob@^3.2.11, fast-glob@^3.3.0:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4"
+ integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==
dependencies:
"@nodelib/fs.stat" "^2.0.2"
"@nodelib/fs.walk" "^1.2.3"
@@ -1713,14 +1647,13 @@ fill-range@^7.0.1:
dependencies:
to-regex-range "^5.0.1"
-find-cache-dir@^3.3.1:
- version "3.3.2"
- resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b"
- integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==
+find-cache-dir@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-4.0.0.tgz#a30ee0448f81a3990708f6453633c733e2f6eec2"
+ integrity sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==
dependencies:
- commondir "^1.0.1"
- make-dir "^3.0.2"
- pkg-dir "^4.1.0"
+ common-path-prefix "^3.0.0"
+ pkg-dir "^7.0.0"
find-up@^4.0.0:
version "4.1.0"
@@ -1730,6 +1663,14 @@ find-up@^4.0.0:
locate-path "^5.0.0"
path-exists "^4.0.0"
+find-up@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790"
+ integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==
+ dependencies:
+ locate-path "^7.1.0"
+ path-exists "^5.0.0"
+
fs.realpath@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
@@ -1745,11 +1686,6 @@ gensync@^1.0.0-beta.2:
resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
-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==
-
glob-parent@^5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
@@ -1797,17 +1733,16 @@ globals@^11.1.0:
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
-globby@^11.0.3:
- version "11.1.0"
- resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
- integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
+globby@^13.1.1:
+ version "13.2.2"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592"
+ integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==
dependencies:
- array-union "^2.1.0"
dir-glob "^3.0.1"
- fast-glob "^3.2.9"
- ignore "^5.2.0"
+ fast-glob "^3.3.0"
+ ignore "^5.2.4"
merge2 "^1.4.1"
- slash "^3.0.0"
+ slash "^4.0.0"
globby@^6.1.0:
version "6.1.0"
@@ -1842,12 +1777,7 @@ has@^1.0.3:
dependencies:
function-bind "^1.1.1"
-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==
-
-ignore@^5.2.0:
+ignore@^5.2.4:
version "5.2.4"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324"
integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==
@@ -1873,15 +1803,15 @@ inherits@2:
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
-interpret@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9"
- integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
+interpret@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4"
+ integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==
-is-core-module@^2.11.0:
- version "2.12.1"
- resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd"
- integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==
+is-core-module@^2.13.0:
+ version "2.13.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db"
+ integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==
dependencies:
has "^1.0.3"
@@ -1928,11 +1858,6 @@ is-plain-object@^2.0.4:
dependencies:
isobject "^3.0.1"
-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==
-
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
@@ -1967,11 +1892,6 @@ jsesc@~0.5.0:
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==
-json-parse-better-errors@^1.0.2:
- 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.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
@@ -1982,14 +1902,12 @@ json-schema-traverse@^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==
-json5@^1.0.1:
- 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"
+json-schema-traverse@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
+ integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
-json5@^2.1.2:
+json5@^2.2.3:
version "2.2.3"
resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
@@ -2004,15 +1922,6 @@ loader-runner@^4.2.0:
resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1"
integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==
-loader-utils@^1.4.0:
- version "1.4.2"
- resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3"
- integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==
- dependencies:
- big.js "^5.2.2"
- emojis-list "^3.0.0"
- json5 "^1.0.1"
-
locate-path@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
@@ -2020,6 +1929,13 @@ locate-path@^5.0.0:
dependencies:
p-locate "^4.1.0"
+locate-path@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a"
+ integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==
+ dependencies:
+ p-locate "^6.0.0"
+
lodash.debounce@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
@@ -2032,13 +1948,6 @@ lru-cache@^5.1.1:
dependencies:
yallist "^3.0.2"
-make-dir@^3.0.2, make-dir@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
- integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
- dependencies:
- semver "^6.0.0"
-
merge-stream@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
@@ -2069,11 +1978,6 @@ mime-types@^2.1.27:
dependencies:
mime-db "1.52.0"
-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@2 || 3", minimatch@^3.1.1:
version "3.1.2"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
@@ -2081,11 +1985,6 @@ mimic-fn@^2.1.0:
dependencies:
brace-expansion "^1.1.7"
-minimist@^1.2.0:
- version "1.2.8"
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
- integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
-
ms@2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
@@ -2096,23 +1995,16 @@ neo-async@^2.6.2:
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
-node-releases@^2.0.12:
- version "2.0.12"
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039"
- integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==
+node-releases@^2.0.13:
+ version "2.0.13"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d"
+ integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==
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-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.0.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
@@ -2125,13 +2017,6 @@ once@^1.3.0:
dependencies:
wrappy "1"
-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"
-
p-limit@^2.2.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
@@ -2139,6 +2024,13 @@ p-limit@^2.2.0:
dependencies:
p-try "^2.0.0"
+p-limit@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644"
+ integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==
+ dependencies:
+ yocto-queue "^1.0.0"
+
p-locate@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
@@ -2146,6 +2038,13 @@ p-locate@^4.1.0:
dependencies:
p-limit "^2.2.0"
+p-locate@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f"
+ integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==
+ dependencies:
+ p-limit "^4.0.0"
+
p-map@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175"
@@ -2161,6 +2060,11 @@ path-exists@^4.0.0:
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+path-exists@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7"
+ integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==
+
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"
@@ -2171,7 +2075,7 @@ path-is-inside@^1.0.2:
resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==
-path-key@^3.0.0, path-key@^3.1.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==
@@ -2218,13 +2122,20 @@ pinkie@^2.0.0:
resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==
-pkg-dir@^4.1.0, pkg-dir@^4.2.0:
+pkg-dir@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
dependencies:
find-up "^4.0.0"
+pkg-dir@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-7.0.0.tgz#8f0c08d6df4476756c5ff29b3282d0bab7517d11"
+ integrity sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==
+ dependencies:
+ find-up "^6.3.0"
+
punycode@^2.1.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f"
@@ -2247,12 +2158,12 @@ randombytes@^2.1.0:
dependencies:
safe-buffer "^5.1.0"
-rechoir@^0.7.0:
- version "0.7.1"
- resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686"
- integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==
+rechoir@^0.8.0:
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22"
+ integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==
dependencies:
- resolve "^1.9.0"
+ resolve "^1.20.0"
regenerate-unicode-properties@^10.1.0:
version "10.1.0"
@@ -2266,15 +2177,15 @@ regenerate@^1.4.2:
resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a"
integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==
-regenerator-runtime@^0.13.11:
- version "0.13.11"
- resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9"
- integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==
+regenerator-runtime@^0.14.0:
+ version "0.14.0"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45"
+ integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==
-regenerator-transform@^0.15.1:
- version "0.15.1"
- resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56"
- integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==
+regenerator-transform@^0.15.2:
+ version "0.15.2"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4"
+ integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==
dependencies:
"@babel/runtime" "^7.8.4"
@@ -2297,6 +2208,11 @@ regjsparser@^0.9.1:
dependencies:
jsesc "~0.5.0"
+require-from-string@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
+ integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
+
requires-port@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
@@ -2314,12 +2230,12 @@ resolve-from@^5.0.0:
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
-resolve@^1.14.2, resolve@^1.9.0:
- version "1.22.2"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f"
- integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==
+resolve@^1.14.2, resolve@^1.20.0:
+ version "1.22.4"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34"
+ integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==
dependencies:
- is-core-module "^2.11.0"
+ is-core-module "^2.13.0"
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
@@ -2347,16 +2263,7 @@ safe-buffer@^5.1.0:
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
-schema-utils@^2.6.5:
- version "2.7.1"
- resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7"
- integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==
- dependencies:
- "@types/json-schema" "^7.0.5"
- ajv "^6.12.4"
- ajv-keywords "^3.5.2"
-
-schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0:
+schema-utils@^3.1.1, schema-utils@^3.2.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe"
integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==
@@ -2365,10 +2272,20 @@ schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0:
ajv "^6.12.5"
ajv-keywords "^3.5.2"
-semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, 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==
+schema-utils@^4.0.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b"
+ integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==
+ dependencies:
+ "@types/json-schema" "^7.0.9"
+ ajv "^8.9.0"
+ ajv-formats "^2.1.1"
+ ajv-keywords "^5.1.0"
+
+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==
serialize-javascript@^6.0.0, serialize-javascript@^6.0.1:
version "6.0.1"
@@ -2396,20 +2313,10 @@ shebang-regex@^3.0.0:
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
-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==
-
-slash@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
- integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
-
-source-list-map@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
- integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
+slash@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7"
+ integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==
source-map-support@~0.5.20:
version "0.5.21"
@@ -2419,21 +2326,11 @@ source-map-support@~0.5.20:
buffer-from "^1.0.0"
source-map "^0.6.0"
-source-map@^0.5.0:
- version "0.5.7"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
- integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
-
-source-map@^0.6.0, source-map@^0.6.1:
+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==
-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==
-
supports-color@^5.3.0:
version "5.5.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
@@ -2458,7 +2355,7 @@ tapable@^2.1.1, tapable@^2.2.0:
resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
-terser-webpack-plugin@^5.1.1, terser-webpack-plugin@^5.3.7:
+terser-webpack-plugin@^5.3.7:
version "5.3.9"
resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz#832536999c51b46d468067f9e37662a3b96adfe1"
integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==
@@ -2470,9 +2367,9 @@ terser-webpack-plugin@^5.1.1, terser-webpack-plugin@^5.3.7:
terser "^5.16.8"
terser@^5.16.8:
- version "5.18.2"
- resolved "https://registry.yarnpkg.com/terser/-/terser-5.18.2.tgz#ff3072a0faf21ffd38f99acc9a0ddf7b5f07b948"
- integrity sha512-Ah19JS86ypbJzTzvUCX7KOsEIhDaRONungA4aYBjEP3JZRf4ocuDzTg4QWZnPn9DEMiMYGJPiSOy7aykoCc70w==
+ version "5.19.3"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.3.tgz#359baeba615aef13db4b8c4d77a2aa0d8814aa9e"
+ integrity sha512-pQzJ9UJzM0IgmT4FAtYI6+VqFf0lj/to58AV0Xfgg0Up37RyPG7Al+1cepC6/BVuAxR9oNb41/DL4DEoHJvTdg==
dependencies:
"@jridgewell/source-map" "^0.3.3"
acorn "^8.8.2"
@@ -2491,10 +2388,10 @@ to-regex-range@^5.0.1:
dependencies:
is-number "^7.0.0"
-typescript@4.2.4:
- version "4.2.4"
- resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.4.tgz#8610b59747de028fda898a8aef0e103f156d0961"
- integrity sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==
+typescript@5.2.2:
+ version "5.2.2"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78"
+ integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==
unicode-canonical-property-names-ecmascript@^2.0.0:
version "2.0.0"
@@ -2547,12 +2444,7 @@ uuid@^9.0.0:
resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5"
integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==
-v8-compile-cache@^2.2.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
- integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
-
-watchpack@^2.0.0, watchpack@^2.4.0:
+watchpack@^2.4.0:
version "2.4.0"
resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d"
integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==
@@ -2560,24 +2452,23 @@ watchpack@^2.0.0, watchpack@^2.4.0:
glob-to-regexp "^0.4.1"
graceful-fs "^4.1.2"
-webpack-cli@4.6.0:
- version "4.6.0"
- resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.6.0.tgz#27ae86bfaec0cf393fcfd58abdc5a229ad32fd16"
- integrity sha512-9YV+qTcGMjQFiY7Nb1kmnupvb1x40lfpj8pwdO/bom+sQiP4OBMKjHq29YQrlDWDPZO9r/qWaRRywKaRDKqBTA==
+webpack-cli@5.1.4:
+ version "5.1.4"
+ resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-5.1.4.tgz#c8e046ba7eaae4911d7e71e2b25b776fcc35759b"
+ integrity sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==
dependencies:
"@discoveryjs/json-ext" "^0.5.0"
- "@webpack-cli/configtest" "^1.0.2"
- "@webpack-cli/info" "^1.2.3"
- "@webpack-cli/serve" "^1.3.1"
- colorette "^1.2.1"
- commander "^7.0.0"
- enquirer "^2.3.6"
- execa "^5.0.0"
+ "@webpack-cli/configtest" "^2.1.1"
+ "@webpack-cli/info" "^2.0.2"
+ "@webpack-cli/serve" "^2.0.5"
+ colorette "^2.0.14"
+ commander "^10.0.1"
+ cross-spawn "^7.0.3"
+ envinfo "^7.7.3"
fastest-levenshtein "^1.0.12"
import-local "^3.0.2"
- interpret "^2.2.0"
- rechoir "^0.7.0"
- v8-compile-cache "^2.2.0"
+ interpret "^3.1.1"
+ rechoir "^0.8.0"
webpack-merge "^5.7.3"
webpack-glob-entries@^1.0.1:
@@ -2595,52 +2486,15 @@ webpack-merge@^5.7.3:
clone-deep "^4.0.1"
wildcard "^2.0.0"
-webpack-sources@^2.1.1:
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-2.3.1.tgz#570de0af163949fe272233c2cefe1b56f74511fd"
- integrity sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==
- dependencies:
- source-list-map "^2.0.1"
- source-map "^0.6.1"
-
webpack-sources@^3.2.3:
version "3.2.3"
resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde"
integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
-webpack@5.35.1:
- version "5.35.1"
- resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.35.1.tgz#857670799465c8a5cbb94c4c175d60ac42d18ba3"
- integrity sha512-uWKYStqJ23+N6/EnMEwUjPSSKUG1tFmcuKhALEh/QXoUxwN8eb3ATNIZB38A+fO6QZ0xfc7Cu7KNV9LXNhDCsw==
- dependencies:
- "@types/eslint-scope" "^3.7.0"
- "@types/estree" "^0.0.47"
- "@webassemblyjs/ast" "1.11.0"
- "@webassemblyjs/wasm-edit" "1.11.0"
- "@webassemblyjs/wasm-parser" "1.11.0"
- acorn "^8.0.4"
- browserslist "^4.14.5"
- chrome-trace-event "^1.0.2"
- enhanced-resolve "^5.8.0"
- es-module-lexer "^0.4.0"
- eslint-scope "^5.1.1"
- events "^3.2.0"
- glob-to-regexp "^0.4.1"
- graceful-fs "^4.2.4"
- json-parse-better-errors "^1.0.2"
- loader-runner "^4.2.0"
- mime-types "^2.1.27"
- neo-async "^2.6.2"
- schema-utils "^3.0.0"
- tapable "^2.1.1"
- terser-webpack-plugin "^5.1.1"
- watchpack "^2.0.0"
- webpack-sources "^2.1.1"
-
-webpack@^5:
- version "5.88.1"
- resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.88.1.tgz#21eba01e81bd5edff1968aea726e2fbfd557d3f8"
- integrity sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ==
+webpack@5.88.2, webpack@^5:
+ version "5.88.2"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.88.2.tgz#f62b4b842f1c6ff580f3fcb2ed4f0b579f4c210e"
+ integrity sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==
dependencies:
"@types/eslint-scope" "^3.7.3"
"@types/estree" "^1.0.0"
@@ -2668,9 +2522,9 @@ webpack@^5:
webpack-sources "^3.2.3"
whatwg-fetch@^3.0.0:
- version "3.6.17"
- resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.17.tgz#009bbbfc122b227b74ba1ff31536b3a1a0e0e212"
- integrity sha512-c4ghIvG6th0eudYwKZY5keb81wtFz9/WeAHAoy8+r18kcWlitUIrmGFQ2rWEl4UCKUilD3zCLHOIPheHx5ypRQ==
+ version "3.6.18"
+ resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.18.tgz#2f640cdee315abced7daeaed2309abd1e44e62d4"
+ integrity sha512-ltN7j66EneWn5TFDO4L9inYC1D+Czsxlrw2SalgjMmEMkLfA5SIZxEFdE6QtHFiiM6Q7WL32c7AkI3w6yxM84Q==
which@^2.0.1:
version "2.0.2"
@@ -2693,3 +2547,8 @@ yallist@^3.0.2:
version "3.1.1"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yocto-queue@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251"
+ integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==
diff --git a/version.sbt b/version.sbt
index 02f02bf787..0c0088e824 100644
--- a/version.sbt
+++ b/version.sbt
@@ -1 +1 @@
-ThisBuild / version := "1.11.0-SNAPSHOT"
+ThisBuild / version := "1.12.0-SNAPSHOT"