diff --git a/.github/actions/build-documentation/action.yml b/.github/actions/build-documentation/action.yml
new file mode 100644
index 00000000..357049cb
--- /dev/null
+++ b/.github/actions/build-documentation/action.yml
@@ -0,0 +1,48 @@
+name: "Build Documentation"
+description: "Build Astro Starlight documentation using hatch"
+inputs:
+ node-version:
+ description: "Node.js version"
+ required: false
+ default: "22.x"
+ upload-pages-artifact:
+ description: "Upload docs/dist as a GitHub Pages artifact"
+ required: false
+ default: "true"
+
+runs:
+ using: "composite"
+ steps:
+ - name: Set up Python 3.12
+ uses: actions/setup-python@v5
+ with:
+ python-version: "3.12"
+ cache: "pip"
+
+ - name: Install hatch
+ shell: bash
+ run: pip install hatch
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: ${{ inputs.node-version }}
+
+ - name: Setup pnpm
+ uses: pnpm/action-setup@v4
+ with:
+ package_json_file: docs/package.json
+
+ - name: Install docs dependencies
+ shell: bash
+ run: pnpm install --frozen-lockfile --dir docs
+
+ - name: Build docs
+ shell: bash
+ run: hatch run docs:build
+
+ - name: Upload Pages artifact
+ if: inputs.upload-pages-artifact == 'true'
+ uses: actions/upload-pages-artifact@v3
+ with:
+ path: docs/dist
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index ae275f04..b4b0380c 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -22,6 +22,19 @@ jobs:
- name: Install hatch
run: pip install hatch
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: "22.x"
+
+ - name: Setup pnpm
+ uses: pnpm/action-setup@v4
+ with:
+ package_json_file: docs/package.json
+
+ - name: Install docs dependencies
+ run: pnpm install --frozen-lockfile --dir docs
+
- name: Start LocalNet
run: pipx install algokit && algokit localnet start
@@ -37,8 +50,8 @@ jobs:
- name: Check wheels can be built
run: hatch build
- - name: Check doctests
- run: hatch run docs:test
+ - name: Build docs
+ run: hatch run docs:build
test-python-matrix:
runs-on: "ubuntu-latest"
diff --git a/.github/workflows/gh-pages.yaml b/.github/workflows/gh-pages.yaml
index d79af5d1..56f1a8e1 100644
--- a/.github/workflows/gh-pages.yaml
+++ b/.github/workflows/gh-pages.yaml
@@ -1,11 +1,11 @@
-name: "Sphinx: Render + publish docs"
+name: Publish docs to GitHub Pages
on:
workflow_call:
workflow_dispatch:
jobs:
- build:
+ build-and-publish-docs:
runs-on: ubuntu-latest
permissions:
contents: read
@@ -15,25 +15,11 @@ jobs:
- name: Checkout source code
uses: actions/checkout@v4
- - name: Install hatch
- run: pipx install hatch
-
- - name: Set up Python 3.12
- uses: actions/setup-python@v5
- with:
- python-version: "3.12"
- cache: "pip"
-
- - name: Test doctests
- run: hatch run docs:test
-
- - name: Build doc
- run: hatch run docs:build
-
- - name: Upload to GitHub pages
- uses: actions/upload-pages-artifact@v3
+ - name: Build and upload docs artifact
+ uses: ./.github/actions/build-documentation
with:
- path: docs/_build
+ node-version: 22.x
+ upload-pages-artifact: 'true'
- name: Deploy to GitHub Pages
uses: actions/deploy-pages@v4
diff --git a/.github/workflows/publish-devportal-docs.yml b/.github/workflows/publish-devportal-docs.yml
new file mode 100644
index 00000000..21142f46
--- /dev/null
+++ b/.github/workflows/publish-devportal-docs.yml
@@ -0,0 +1,39 @@
+name: Publish DevPortal Docs
+
+on:
+ workflow_dispatch:
+ push:
+ tags: ['v*']
+
+permissions:
+ contents: write
+
+jobs:
+ publish-docs:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v6
+
+ - uses: actions/setup-node@v6
+ with:
+ node-version: 22
+
+ - uses: pnpm/action-setup@v4
+ with:
+ package_json_file: docs/package.json
+
+ - uses: actions/setup-python@v5
+ with:
+ python-version: '3.12'
+ cache: pip
+
+ - name: Install hatch
+ run: pip install hatch
+
+ - name: Generate API docs
+ run: hatch run docs:api
+
+ - name: Publish DevPortal Docs
+ uses: algorandfoundation/devportal/.github/actions/publish-devportal-docs@ci/update-publish-devportal-docs-workflow
+ with:
+ docs-dir: docs
diff --git a/.gitignore b/.gitignore
index 29ae6eff..b7558e87 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,3 +18,6 @@ coverage.xml
.cursorignore
*.puya.map
+
+# AI Agents
+.codex
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 77857ba7..3e5d0c65 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,23 +1,24 @@
# CHANGELOG
+
## v1.2.0-beta.11 (2026-04-14)
## v1.2.0-beta.10 (2026-04-14)
### Features
-* support native-typed fields in arc4.Struct ([`6ec0127`](https://github.com/algorandfoundation/algorand-python-testing/commit/6ec0127d096f4c2972a6ce844d8a196c384828f6))
+- support native-typed fields in arc4.Struct ([`6ec0127`](https://github.com/algorandfoundation/algorand-python-testing/commit/6ec0127d096f4c2972a6ce844d8a196c384828f6))
- This unblocks `arc4.encode`/`arc4.decode` of structs with mixed field annotations and lets the AVM parity test invoke the contract directly in-process alongside the AVM check, exercising `test_native_struct` on both paths instead of AVM only.
+ This unblocks `arc4.encode`/`arc4.decode` of structs with mixed field annotations and lets the AVM parity test invoke the contract directly in-process alongside the AVM check, exercising `test_native_struct` on both paths instead of AVM only.
-* add support for arc4.encode and arc4.decode functions ([`032b2a8`](https://github.com/algorandfoundation/algorand-python-testing/commit/032b2a826338bc3ff92bca774f3361b39e3afc6e))
+- add support for arc4.encode and arc4.decode functions ([`032b2a8`](https://github.com/algorandfoundation/algorand-python-testing/commit/032b2a826338bc3ff92bca774f3361b39e3afc6e))
- also migrate `UInt64Backed` serializer off the deprecated `.native` accessor
+ also migrate `UInt64Backed` serializer off the deprecated `.native` accessor
## v1.2.0-beta.9 (2026-04-10)
### Features
-* add arguments to logicsig ([`74ac11e`](https://github.com/algorandfoundation/algorand-python-testing/commit/74ac11e74af79cf50c9b64de74221ef8f8d5bae4))
+- add arguments to logicsig ([`74ac11e`](https://github.com/algorandfoundation/algorand-python-testing/commit/74ac11e74af79cf50c9b64de74221ef8f8d5bae4))
## v1.2.0-beta.8 (2026-04-09)
@@ -27,25 +28,25 @@
### Features
-* add arc65 support: loggedErr() and loggedAssert() functions, to log a formatted error string before failing ([`5ac27a5`](https://github.com/algorandfoundation/algorand-python-testing/commit/5ac27a5f96d075224c47dc7c8b6ceba65db0e5e3))
+- add arc65 support: loggedErr() and loggedAssert() functions, to log a formatted error string before failing ([`5ac27a5`](https://github.com/algorandfoundation/algorand-python-testing/commit/5ac27a5f96d075224c47dc7c8b6ceba65db0e5e3))
## v1.2.0-beta.5 (2026-04-01)
### Features
-* add LocalMap ([`447cd47`](https://github.com/algorandfoundation/algorand-python-testing/commit/447cd479a24b8a1fc0c91b51a97b222ba1ea27f8))
+- add LocalMap ([`447cd47`](https://github.com/algorandfoundation/algorand-python-testing/commit/447cd479a24b8a1fc0c91b51a97b222ba1ea27f8))
-* add GlobalMap ([`8d75a3b`](https://github.com/algorandfoundation/algorand-python-testing/commit/8d75a3b65a083b6f1484de44a660a58c8abfd2ef))
+- add GlobalMap ([`8d75a3b`](https://github.com/algorandfoundation/algorand-python-testing/commit/8d75a3b65a083b6f1484de44a660a58c8abfd2ef))
### Bug fixes
-* do not count GlobalMap and LocalMap in stateTotals ([`d7da98a`](https://github.com/algorandfoundation/algorand-python-testing/commit/d7da98a5802e7a6f172c63a8fad5c7bec292b9bc))
+- do not count GlobalMap and LocalMap in stateTotals ([`d7da98a`](https://github.com/algorandfoundation/algorand-python-testing/commit/d7da98a5802e7a6f172c63a8fad5c7bec292b9bc))
-* state totals now correctly handle direct tuple storage ([`8e7d214`](https://github.com/algorandfoundation/algorand-python-testing/commit/8e7d21481de91767c25c1311c4b4ee6363af83b9))
+- state totals now correctly handle direct tuple storage ([`8e7d214`](https://github.com/algorandfoundation/algorand-python-testing/commit/8e7d21481de91767c25c1311c4b4ee6363af83b9))
### Documentation
-* add GlobalMap and LocalMap to state-management guide ([`e8ca7f8`](https://github.com/algorandfoundation/algorand-python-testing/commit/e8ca7f835f66ac0ae1bc6d953d8bdd43cef7e1f5))
+- add GlobalMap and LocalMap to state-management guide ([`e8ca7f8`](https://github.com/algorandfoundation/algorand-python-testing/commit/e8ca7f835f66ac0ae1bc6d953d8bdd43cef7e1f5))
## v1.2.0-beta.4 (2026-03-16)
@@ -53,19 +54,19 @@
### Features
-* add stage and submit_staged functions to support submitting dynamic number of inner transactions in a group ([`84ad031`](https://github.com/algorandfoundation/algorand-python-testing/commit/84ad03166442dadc10c7c1fe70e4cd07a63600cc))
+- add stage and submit_staged functions to support submitting dynamic number of inner transactions in a group ([`84ad031`](https://github.com/algorandfoundation/algorand-python-testing/commit/84ad03166442dadc10c7c1fe70e4cd07a63600cc))
## v1.2.0-beta.2 (2025-12-08)
### Features
-* add algopy.public alias for algopy.arc4.abimethod decorator ([`32a2787`](https://github.com/algorandfoundation/algorand-python-testing/commit/32a27877a30f03e5330aa1bdb7a4fadbea543529))
+- add algopy.public alias for algopy.arc4.abimethod decorator ([`32a2787`](https://github.com/algorandfoundation/algorand-python-testing/commit/32a27877a30f03e5330aa1bdb7a4fadbea543529))
## v1.2.0-beta.1 (2025-12-05)
### Features
-* add fixed size variant of bytes as a separate `FixedBytes` type ([`9a2ab8e`](https://github.com/algorandfoundation/algorand-python-testing/commit/9a2ab8e3f94e9e7a2a416a94a54cf51b57599089))
+- add fixed size variant of bytes as a separate `FixedBytes` type ([`9a2ab8e`](https://github.com/algorandfoundation/algorand-python-testing/commit/9a2ab8e3f94e9e7a2a416a94a54cf51b57599089))
## v1.1.0 (2025-10-20)
@@ -73,13 +74,13 @@
### Features
-* add mock implementations for validation functionality ([`ccde074`](https://github.com/algorandfoundation/algorand-python-testing/commit/ccde0740889bd68ef0fba418182d71ac0fc9f76a))
+- add mock implementations for validation functionality ([`ccde074`](https://github.com/algorandfoundation/algorand-python-testing/commit/ccde0740889bd68ef0fba418182d71ac0fc9f76a))
### Documentation
-* add note about data validation in the testing library ([`bc47a68`](https://github.com/algorandfoundation/algorand-python-testing/commit/bc47a6838cf00907f2a718ddb8cb45fe97947d77))
+- add note about data validation in the testing library ([`bc47a68`](https://github.com/algorandfoundation/algorand-python-testing/commit/bc47a6838cf00907f2a718ddb8cb45fe97947d77))
-* add missing native types in coverage table ([`a95116c`](https://github.com/algorandfoundation/algorand-python-testing/commit/a95116c567dc77cfcf4f7ec517df60bb3d9d1eb5))
+- add missing native types in coverage table ([`a95116c`](https://github.com/algorandfoundation/algorand-python-testing/commit/a95116c567dc77cfcf4f7ec517df60bb3d9d1eb5))
## v1.0.0 (2025-10-06)
@@ -87,21 +88,21 @@
### Documentation
-* fix typos and broken links ([`f221910`](https://github.com/algorandfoundation/algorand-python-testing/commit/f221910b54a2cdc76aa99b8883d75d4ddae78ee3))
+- fix typos and broken links ([`f221910`](https://github.com/algorandfoundation/algorand-python-testing/commit/f221910b54a2cdc76aa99b8883d75d4ddae78ee3))
## v1.0.0-beta.7 (2025-09-26)
### Bug fixes
-* bump puyapy dependencies ([`8b2064d`](https://github.com/algorandfoundation/algorand-python-testing/commit/8b2064dc8bd94b0dadf6f283e8d639543241eadc))
+- bump puyapy dependencies ([`8b2064d`](https://github.com/algorandfoundation/algorand-python-testing/commit/8b2064dc8bd94b0dadf6f283e8d639543241eadc))
- Update to latest release candidates, so dependencies projects using both puyapy, language server and algorand python testing can resolve to a consistent version
+ Update to latest release candidates, so dependencies projects using both puyapy, language server and algorand python testing can resolve to a consistent version
## v1.0.0-beta.6 (2025-09-18)
### Features
-* update langspec to 4.3.0 ([`c05bdc0`](https://github.com/algorandfoundation/algorand-python-testing/commit/c05bdc053f4b6aa52206cbeeaddb40609688b052))
+- update langspec to 4.3.0 ([`c05bdc0`](https://github.com/algorandfoundation/algorand-python-testing/commit/c05bdc053f4b6aa52206cbeeaddb40609688b052))
## v1.0.0-beta.5 (2025-09-16)
@@ -109,93 +110,93 @@
### Features
-* make BoxRef methods directly accessible on Box class ([`38e12f6`](https://github.com/algorandfoundation/algorand-python-testing/commit/38e12f6d595c204eb6f7dcd74c393c46f166e3d4))
+- make BoxRef methods directly accessible on Box class ([`38e12f6`](https://github.com/algorandfoundation/algorand-python-testing/commit/38e12f6d595c204eb6f7dcd74c393c46f166e3d4))
## v1.0.0-beta.3 (2025-09-08)
### Features
-* add .as_uint64 and .as_biguint methods to replace native property ([`0f9c6c0`](https://github.com/algorandfoundation/algorand-python-testing/commit/0f9c6c06b6e1b986c4e512cbbe0098aea32615b7))
+- add .as_uint64 and .as_biguint methods to replace native property ([`0f9c6c0`](https://github.com/algorandfoundation/algorand-python-testing/commit/0f9c6c06b6e1b986c4e512cbbe0098aea32615b7))
## v1.0.0-beta.2 (2025-09-03)
### Features
-* add stub implementations of array types ([`b7b831d`](https://github.com/algorandfoundation/algorand-python-testing/commit/b7b831da7570367494e823485910bc7191376e48))
+- add stub implementations of array types ([`b7b831d`](https://github.com/algorandfoundation/algorand-python-testing/commit/b7b831da7570367494e823485910bc7191376e48))
## v1.0.0-beta.1 (2025-07-16)
### Features
-* support storing tuples in state ([`911cd3c`](https://github.com/algorandfoundation/algorand-python-testing/commit/911cd3cb54f69f8fdded5c677f32c1969e8827bf))
+- support storing tuples in state ([`911cd3c`](https://github.com/algorandfoundation/algorand-python-testing/commit/911cd3cb54f69f8fdded5c677f32c1969e8827bf))
## v0.6.0-beta.3 (2025-05-16)
### Bug fixes
-* fixes type checking of tuples with primitive types ([`e971ad6`](https://github.com/algorandfoundation/algorand-python-testing/commit/e971ad6b125f269cd0874c09d58d8962f7622f8d))
+- fixes type checking of tuples with primitive types ([`e971ad6`](https://github.com/algorandfoundation/algorand-python-testing/commit/e971ad6b125f269cd0874c09d58d8962f7622f8d))
- Adds checks to ensure that type validation applies to classes only.
+ Adds checks to ensure that type validation applies to classes only.
## v0.6.0-beta.2 (2025-05-15)
### Features
-* add stubs for box create function ([`1fe6fe5`](https://github.com/algorandfoundation/algorand-python-testing/commit/1fe6fe55358630a6abea2f69406821cb6031a4d5))
+- add stubs for box create function ([`1fe6fe5`](https://github.com/algorandfoundation/algorand-python-testing/commit/1fe6fe55358630a6abea2f69406821cb6031a4d5))
## v0.6.0-beta.1 (2025-05-09)
### Features
-* add stub implementation of algopy.size_of function for calculating static storage size of types ([`98e6816`](https://github.com/algorandfoundation/algorand-python-testing/commit/98e6816a48f1cff206f2c99d1384af1855d352c2))
+- add stub implementation of algopy.size_of function for calculating static storage size of types ([`98e6816`](https://github.com/algorandfoundation/algorand-python-testing/commit/98e6816a48f1cff206f2c99d1384af1855d352c2))
### Bug fixes
-* ensure size_of is exported from algopy module ([`01c055a`](https://github.com/algorandfoundation/algorand-python-testing/commit/01c055a4d2bd1fe17324bd91f7a83810900baa4e))
+- ensure size_of is exported from algopy module ([`01c055a`](https://github.com/algorandfoundation/algorand-python-testing/commit/01c055a4d2bd1fe17324bd91f7a83810900baa4e))
### Documentation
-* include size_of in coverage doc ([`2c73646`](https://github.com/algorandfoundation/algorand-python-testing/commit/2c7364626357844437fd80b6039c112a87b277bb))
+- include size_of in coverage doc ([`2c73646`](https://github.com/algorandfoundation/algorand-python-testing/commit/2c7364626357844437fd80b6039c112a87b277bb))
## v0.5.0 (2025-02-20)
### Features
-* accept abi method reference as a parameter to arc4_signature method ([`a1cb365`](https://github.com/algorandfoundation/algorand-python-testing/commit/a1cb365f2be1eb1965d9b86a5193498772131412))
+- accept abi method reference as a parameter to arc4_signature method ([`a1cb365`](https://github.com/algorandfoundation/algorand-python-testing/commit/a1cb365f2be1eb1965d9b86a5193498772131412))
## v0.5.0-beta.1 (2025-02-19)
### Features
-* support `algopy.Array` and `algopy.ImmutableArray` from algorand-python 2.7 ([`fd8d19f`](https://github.com/algorandfoundation/algorand-python-testing/commit/fd8d19f25b9f8e0a48f58ae8f45e4d546b965f83))
+- support `algopy.Array` and `algopy.ImmutableArray` from algorand-python 2.7 ([`fd8d19f`](https://github.com/algorandfoundation/algorand-python-testing/commit/fd8d19f25b9f8e0a48f58ae8f45e4d546b965f83))
-* support mocking new `algopy.op` functions `falcon_verify`, `mimc`, `online_stake`, `sumhash512` and `VoterParamsGet` ([`83ddcbb`](https://github.com/algorandfoundation/algorand-python-testing/commit/83ddcbb8f83f72a5e0bc247c14e250c55496febf))
+- support mocking new `algopy.op` functions `falcon_verify`, `mimc`, `online_stake`, `sumhash512` and `VoterParamsGet` ([`83ddcbb`](https://github.com/algorandfoundation/algorand-python-testing/commit/83ddcbb8f83f72a5e0bc247c14e250c55496febf))
-* update `algopy.op.Block` with fields added in AVM 11 ([`90d857d`](https://github.com/algorandfoundation/algorand-python-testing/commit/90d857d248d7b1b5a4b3791ccb0e10c20c478325))
+- update `algopy.op.Block` with fields added in AVM 11 ([`90d857d`](https://github.com/algorandfoundation/algorand-python-testing/commit/90d857d248d7b1b5a4b3791ccb0e10c20c478325))
-* update `algopy.op.AcctParamsGet` with fields added in AVM 11 ([`059b669`](https://github.com/algorandfoundation/algorand-python-testing/commit/059b6690441e99a709fc47691bcb0e4f2453cd26))
+- update `algopy.op.AcctParamsGet` with fields added in AVM 11 ([`059b669`](https://github.com/algorandfoundation/algorand-python-testing/commit/059b6690441e99a709fc47691bcb0e4f2453cd26))
-* add `avm_version` to `algopy.Contract` class options ([`fc53b0f`](https://github.com/algorandfoundation/algorand-python-testing/commit/fc53b0fda5f0d22b6dbb99abf1ba024284fa52a4))
+- add `avm_version` to `algopy.Contract` class options ([`fc53b0f`](https://github.com/algorandfoundation/algorand-python-testing/commit/fc53b0fda5f0d22b6dbb99abf1ba024284fa52a4))
-* update `algopy.op.Global` with fields added in AVM 11 ([`0cc9807`](https://github.com/algorandfoundation/algorand-python-testing/commit/0cc9807bbfc7084d54425c40889065ae2fd7d856))
+- update `algopy.op.Global` with fields added in AVM 11 ([`0cc9807`](https://github.com/algorandfoundation/algorand-python-testing/commit/0cc9807bbfc7084d54425c40889065ae2fd7d856))
-* add `algopy.arc4.Struct._replace` introduced in algorand-python 2.5.0 ([`75d6847`](https://github.com/algorandfoundation/algorand-python-testing/commit/75d6847b80498d637c7f0b0e3915afd7af6f132c))
+- add `algopy.arc4.Struct._replace` introduced in algorand-python 2.5.0 ([`75d6847`](https://github.com/algorandfoundation/algorand-python-testing/commit/75d6847b80498d637c7f0b0e3915afd7af6f132c))
-* add inline option to subroutine decorator ([`2cc15b3`](https://github.com/algorandfoundation/algorand-python-testing/commit/2cc15b3dc706eb8585b9658bf67b38da215e2e38))
+- add inline option to subroutine decorator ([`2cc15b3`](https://github.com/algorandfoundation/algorand-python-testing/commit/2cc15b3dc706eb8585b9658bf67b38da215e2e38))
### Bug fixes
-* add missing mappings for `algopy.op.Txn` members ([`fddfe6f`](https://github.com/algorandfoundation/algorand-python-testing/commit/fddfe6f7ff9d6d4e0434f65e19dd0b0cf2aef6bd))
+- add missing mappings for `algopy.op.Txn` members ([`fddfe6f`](https://github.com/algorandfoundation/algorand-python-testing/commit/fddfe6f7ff9d6d4e0434f65e19dd0b0cf2aef6bd))
-* include `ARC4Contract` in `algopy.arc4` namespace ([`f19d46f`](https://github.com/algorandfoundation/algorand-python-testing/commit/f19d46f5663c9fbe4e9b2e8c3bd1e2f7ddc89c3a))
+- include `ARC4Contract` in `algopy.arc4` namespace ([`f19d46f`](https://github.com/algorandfoundation/algorand-python-testing/commit/f19d46f5663c9fbe4e9b2e8c3bd1e2f7ddc89c3a))
-* update `algopy.CompiledContract` and `algopy.CompiledLogicSig` to be NamedTuples ([`84be408`](https://github.com/algorandfoundation/algorand-python-testing/commit/84be4082348e3d89b40a65a69b599594a5531828))
+- update `algopy.CompiledContract` and `algopy.CompiledLogicSig` to be NamedTuples ([`84be408`](https://github.com/algorandfoundation/algorand-python-testing/commit/84be4082348e3d89b40a65a69b599594a5531828))
-* added missing __contains__ implementation for `algopy.Bytes` ([`8b2efa2`](https://github.com/algorandfoundation/algorand-python-testing/commit/8b2efa20b37e3043ac6a228d6706da4203373a7e))
+- added missing **contains** implementation for `algopy.Bytes` ([`8b2efa2`](https://github.com/algorandfoundation/algorand-python-testing/commit/8b2efa20b37e3043ac6a228d6706da4203373a7e))
### Documentation
-* fix doctest example for `algopy.EllipticCurve` ([`7d0bb0d`](https://github.com/algorandfoundation/algorand-python-testing/commit/7d0bb0dfe9a5ea2d67b130fa300fb80cef52fda5))
+- fix doctest example for `algopy.EllipticCurve` ([`7d0bb0d`](https://github.com/algorandfoundation/algorand-python-testing/commit/7d0bb0dfe9a5ea2d67b130fa300fb80cef52fda5))
## v0.4.1 (2024-09-03)
@@ -203,9 +204,9 @@
### Bug fixes
-* ability to pass kw_only flag to dataclass when defining struct subclass ([`24bcf9d`](https://github.com/algorandfoundation/algorand-python-testing/commit/24bcf9d8af34eb2675ddf85ce9d71802f82f2d6a))
+- ability to pass kw_only flag to dataclass when defining struct subclass ([`24bcf9d`](https://github.com/algorandfoundation/algorand-python-testing/commit/24bcf9d8af34eb2675ddf85ce9d71802f82f2d6a))
-* ability to pass kw_only flag to dataclass when defining struct subclass ([`24bcf9d`](https://github.com/algorandfoundation/algorand-python-testing/commit/24bcf9d8af34eb2675ddf85ce9d71802f82f2d6a))
+- ability to pass kw_only flag to dataclass when defining struct subclass ([`24bcf9d`](https://github.com/algorandfoundation/algorand-python-testing/commit/24bcf9d8af34eb2675ddf85ce9d71802f82f2d6a))
## v0.4.0 (2024-08-27)
@@ -215,31 +216,31 @@
### Features
-* add support for frozen on asset holdings, including a new ledger function `update_asset_holdings` for setting asset holding balances and frozen states ([`d777ca0`](https://github.com/algorandfoundation/algorand-python-testing/commit/d777ca0a318a8ade7a20363c9ce77fe8a8bf5d68))
+- add support for frozen on asset holdings, including a new ledger function `update_asset_holdings` for setting asset holding balances and frozen states ([`d777ca0`](https://github.com/algorandfoundation/algorand-python-testing/commit/d777ca0a318a8ade7a20363c9ce77fe8a8bf5d68))
-* expand accepted types when interacting with accounts, applications and assets ([`f448a97`](https://github.com/algorandfoundation/algorand-python-testing/commit/f448a97cb154c9f90ecf42c599b240f12928af20))
+- expand accepted types when interacting with accounts, applications and assets ([`f448a97`](https://github.com/algorandfoundation/algorand-python-testing/commit/f448a97cb154c9f90ecf42c599b240f12928af20))
- wip
+ wip
-* replaced `account_exists` with `account_is_funded` as the later is more useful ([`4d08690`](https://github.com/algorandfoundation/algorand-python-testing/commit/4d086903eb93a70ce1d485cdd7b12d8472ef16db))
+- replaced `account_exists` with `account_is_funded` as the later is more useful ([`4d08690`](https://github.com/algorandfoundation/algorand-python-testing/commit/4d086903eb93a70ce1d485cdd7b12d8472ef16db))
### Bug fixes
-* use correct type for Globals.caller_application_id ([`a30d85a`](https://github.com/algorandfoundation/algorand-python-testing/commit/a30d85a4416dfc2c5d901f3ace2265384ef60c01))
+- use correct type for Globals.caller_application_id ([`a30d85a`](https://github.com/algorandfoundation/algorand-python-testing/commit/a30d85a4416dfc2c5d901f3ace2265384ef60c01))
-* do not allow specifying `address` for applications, it is derived from the app_id ([`00fe1bc`](https://github.com/algorandfoundation/algorand-python-testing/commit/00fe1bc8ea247dcc36b01154db36b984b151e396))
+- do not allow specifying `address` for applications, it is derived from the app_id ([`00fe1bc`](https://github.com/algorandfoundation/algorand-python-testing/commit/00fe1bc8ea247dcc36b01154db36b984b151e396))
-* do not treat asset and application ids as possible foreign array indexes ([`94a989f`](https://github.com/algorandfoundation/algorand-python-testing/commit/94a989f77169da2ae437c629cd5f4d8a872263f6))
+- do not treat asset and application ids as possible foreign array indexes ([`94a989f`](https://github.com/algorandfoundation/algorand-python-testing/commit/94a989f77169da2ae437c629cd5f4d8a872263f6))
-* removed incorrect deduction in `algopy.op.balance` ([`76e67c5`](https://github.com/algorandfoundation/algorand-python-testing/commit/76e67c5e3dd1cda388a2a948d452ba89805add6a))
+- removed incorrect deduction in `algopy.op.balance` ([`76e67c5`](https://github.com/algorandfoundation/algorand-python-testing/commit/76e67c5e3dd1cda388a2a948d452ba89805add6a))
-* ensure all comparable types return `NotImplemented` when a comparison is not possible ([`b055fa6`](https://github.com/algorandfoundation/algorand-python-testing/commit/b055fa68531e0b7923773ec10c2097a3d64b9dbe))
+- ensure all comparable types return `NotImplemented` when a comparison is not possible ([`b055fa6`](https://github.com/algorandfoundation/algorand-python-testing/commit/b055fa68531e0b7923773ec10c2097a3d64b9dbe))
-* `arc4_prefix` annotated to also accept `algopy.Bytes` ([`40328ca`](https://github.com/algorandfoundation/algorand-python-testing/commit/40328ca3701b3e255193e206e8a7b1bdb441a346))
+- `arc4_prefix` annotated to also accept `algopy.Bytes` ([`40328ca`](https://github.com/algorandfoundation/algorand-python-testing/commit/40328ca3701b3e255193e206e8a7b1bdb441a346))
### Documentation
-* include usage of `algopy_testing_context` in README.md quick start ([`4702f60`](https://github.com/algorandfoundation/algorand-python-testing/commit/4702f60cfe7d09956a5ae6dbdcd72da29fdda808))
+- include usage of `algopy_testing_context` in README.md quick start ([`4702f60`](https://github.com/algorandfoundation/algorand-python-testing/commit/4702f60cfe7d09956a5ae6dbdcd72da29fdda808))
## v0.3.0 (2024-08-22)
@@ -247,23 +248,23 @@
### Documentation
-* refining docs ([`b714783`](https://github.com/algorandfoundation/algorand-python-testing/commit/b714783b4cf15d31f91dc1c776d304bd2eb9a154))
+- refining docs ([`b714783`](https://github.com/algorandfoundation/algorand-python-testing/commit/b714783b4cf15d31f91dc1c776d304bd2eb9a154))
-* note on future refinement ([`b714783`](https://github.com/algorandfoundation/algorand-python-testing/commit/b714783b4cf15d31f91dc1c776d304bd2eb9a154))
+- note on future refinement ([`b714783`](https://github.com/algorandfoundation/algorand-python-testing/commit/b714783b4cf15d31f91dc1c776d304bd2eb9a154))
-* further refining the api section ([`b714783`](https://github.com/algorandfoundation/algorand-python-testing/commit/b714783b4cf15d31f91dc1c776d304bd2eb9a154))
+- further refining the api section ([`b714783`](https://github.com/algorandfoundation/algorand-python-testing/commit/b714783b4cf15d31f91dc1c776d304bd2eb9a154))
## v0.3.0-beta.9 (2024-08-22)
### Bug fixes
-* Make Global.latest_timestamp constant for a transaction ([`51c2817`](https://github.com/algorandfoundation/algorand-python-testing/commit/51c2817c262d686996e2aa4d639d259409dc8d43))
+- Make Global.latest_timestamp constant for a transaction ([`51c2817`](https://github.com/algorandfoundation/algorand-python-testing/commit/51c2817c262d686996e2aa4d639d259409dc8d43))
## v0.3.0-beta.8 (2024-08-22)
### Features
-* include ARC4 results in log, and handle > 15 ARC4 arguments ([`fd83ee8`](https://github.com/algorandfoundation/algorand-python-testing/commit/fd83ee8525a393d4a1a66f20acdb661906d84b51))
+- include ARC4 results in log, and handle > 15 ARC4 arguments ([`fd83ee8`](https://github.com/algorandfoundation/algorand-python-testing/commit/fd83ee8525a393d4a1a66f20acdb661906d84b51))
## v0.3.0-beta.7 (2024-08-21)
@@ -271,55 +272,55 @@
### Documentation
-* documentation for initial stable release of `algorand-python-testing` ([`9d97d0d`](https://github.com/algorandfoundation/algorand-python-testing/commit/9d97d0de5ff9897e642ec3f11a186f2fb95375bb))
+- documentation for initial stable release of `algorand-python-testing` ([`9d97d0d`](https://github.com/algorandfoundation/algorand-python-testing/commit/9d97d0de5ff9897e642ec3f11a186f2fb95375bb))
- docs: wip
+ docs: wip
-* refining docs (wip) ([`9d97d0d`](https://github.com/algorandfoundation/algorand-python-testing/commit/9d97d0de5ff9897e642ec3f11a186f2fb95375bb))
+- refining docs (wip) ([`9d97d0d`](https://github.com/algorandfoundation/algorand-python-testing/commit/9d97d0de5ff9897e642ec3f11a186f2fb95375bb))
-* revamping docs with latest features ([`9d97d0d`](https://github.com/algorandfoundation/algorand-python-testing/commit/9d97d0de5ff9897e642ec3f11a186f2fb95375bb))
+- revamping docs with latest features ([`9d97d0d`](https://github.com/algorandfoundation/algorand-python-testing/commit/9d97d0de5ff9897e642ec3f11a186f2fb95375bb))
-* minor consistency with main readme; patching doctests ([`9d97d0d`](https://github.com/algorandfoundation/algorand-python-testing/commit/9d97d0de5ff9897e642ec3f11a186f2fb95375bb))
+- minor consistency with main readme; patching doctests ([`9d97d0d`](https://github.com/algorandfoundation/algorand-python-testing/commit/9d97d0de5ff9897e642ec3f11a186f2fb95375bb))
-* removing the box from examples ([`9d97d0d`](https://github.com/algorandfoundation/algorand-python-testing/commit/9d97d0de5ff9897e642ec3f11a186f2fb95375bb))
+- removing the box from examples ([`9d97d0d`](https://github.com/algorandfoundation/algorand-python-testing/commit/9d97d0de5ff9897e642ec3f11a186f2fb95375bb))
-* refine op codes section ([`9d97d0d`](https://github.com/algorandfoundation/algorand-python-testing/commit/9d97d0de5ff9897e642ec3f11a186f2fb95375bb))
+- refine op codes section ([`9d97d0d`](https://github.com/algorandfoundation/algorand-python-testing/commit/9d97d0de5ff9897e642ec3f11a186f2fb95375bb))
-* addressing docs pr comments ([`9d97d0d`](https://github.com/algorandfoundation/algorand-python-testing/commit/9d97d0de5ff9897e642ec3f11a186f2fb95375bb))
+- addressing docs pr comments ([`9d97d0d`](https://github.com/algorandfoundation/algorand-python-testing/commit/9d97d0de5ff9897e642ec3f11a186f2fb95375bb))
## v0.3.0-beta.5 (2024-08-21)
### Features
-* add __str__ and __repr__ implementations for ARC4 types ([`1f1f2ea`](https://github.com/algorandfoundation/algorand-python-testing/commit/1f1f2ea43a2f4f906cbcd5709b8e86b5c1f2bc63))
+- add **str** and **repr** implementations for ARC4 types ([`1f1f2ea`](https://github.com/algorandfoundation/algorand-python-testing/commit/1f1f2ea43a2f4f906cbcd5709b8e86b5c1f2bc63))
### Bug fixes
-* ensure mutable types (ARC4 tuple, array and structs) have their changes propagated back to container-like types (global/local state, boxes, ARC4 mutable types) ([`1f1f2ea`](https://github.com/algorandfoundation/algorand-python-testing/commit/1f1f2ea43a2f4f906cbcd5709b8e86b5c1f2bc63))
+- ensure mutable types (ARC4 tuple, array and structs) have their changes propagated back to container-like types (global/local state, boxes, ARC4 mutable types) ([`1f1f2ea`](https://github.com/algorandfoundation/algorand-python-testing/commit/1f1f2ea43a2f4f906cbcd5709b8e86b5c1f2bc63))
-* add default __eq__ implementation for ARC4 types ([`1f1f2ea`](https://github.com/algorandfoundation/algorand-python-testing/commit/1f1f2ea43a2f4f906cbcd5709b8e86b5c1f2bc63))
+- add default **eq** implementation for ARC4 types ([`1f1f2ea`](https://github.com/algorandfoundation/algorand-python-testing/commit/1f1f2ea43a2f4f906cbcd5709b8e86b5c1f2bc63))
-* ensure mutable types (ARC4 tuple, array and structs) have their changes propagated back to container-like types (global/local state, boxes, ARC4 mutable types) ([`1f1f2ea`](https://github.com/algorandfoundation/algorand-python-testing/commit/1f1f2ea43a2f4f906cbcd5709b8e86b5c1f2bc63))
+- ensure mutable types (ARC4 tuple, array and structs) have their changes propagated back to container-like types (global/local state, boxes, ARC4 mutable types) ([`1f1f2ea`](https://github.com/algorandfoundation/algorand-python-testing/commit/1f1f2ea43a2f4f906cbcd5709b8e86b5c1f2bc63))
## v0.3.0-beta.4 (2024-08-21)
### Features
-* rename txn_op_fields to active_txn_overrides to better reflect purpose, add additional checks to ensure crate_group parameters are used correctly ([`973fc28`](https://github.com/algorandfoundation/algorand-python-testing/commit/973fc288836d09ba4657642c980ca9f916d38823))
+- rename txn_op_fields to active_txn_overrides to better reflect purpose, add additional checks to ensure crate_group parameters are used correctly ([`973fc28`](https://github.com/algorandfoundation/algorand-python-testing/commit/973fc288836d09ba4657642c980ca9f916d38823))
### Bug fixes
-* fix equality implementation for Account, to allow comparison with arc4.Address ([`6ec2dd4`](https://github.com/algorandfoundation/algorand-python-testing/commit/6ec2dd4f2b4119987a5ea7c3c670bdd554c4fe30))
+- fix equality implementation for Account, to allow comparison with arc4.Address ([`6ec2dd4`](https://github.com/algorandfoundation/algorand-python-testing/commit/6ec2dd4f2b4119987a5ea7c3c670bdd554c4fe30))
-* ensure new Account's have field defaults populated ([`54432b0`](https://github.com/algorandfoundation/algorand-python-testing/commit/54432b03cef13008b16fab84dcc250824e2e2da1))
+- ensure new Account's have field defaults populated ([`54432b0`](https://github.com/algorandfoundation/algorand-python-testing/commit/54432b03cef13008b16fab84dcc250824e2e2da1))
-* ensure Global.current_application* properties match AVM ([`ae84ae2`](https://github.com/algorandfoundation/algorand-python-testing/commit/ae84ae27e49ef977babe7abb10d8994446d6b5f7))
+- ensure Global.current_application\* properties match AVM ([`ae84ae2`](https://github.com/algorandfoundation/algorand-python-testing/commit/ae84ae27e49ef977babe7abb10d8994446d6b5f7))
-* when generating app/asset id's skip any that might already be reserved ([`0bb5eba`](https://github.com/algorandfoundation/algorand-python-testing/commit/0bb5eba3ec75ffdb16cfbac5b3c4837f64f8a58a))
+- when generating app/asset id's skip any that might already be reserved ([`0bb5eba`](https://github.com/algorandfoundation/algorand-python-testing/commit/0bb5eba3ec75ffdb16cfbac5b3c4837f64f8a58a))
### Documentation
-* integrating pydoclint; formatting docs; removing docs from stub implementation ([`d729bf9`](https://github.com/algorandfoundation/algorand-python-testing/commit/d729bf9b70ef885cd1b2ef705c4f5e2582d853ab))
+- integrating pydoclint; formatting docs; removing docs from stub implementation ([`d729bf9`](https://github.com/algorandfoundation/algorand-python-testing/commit/d729bf9b70ef885cd1b2ef705c4f5e2582d853ab))
## v0.3.0-beta.3 (2024-08-16)
@@ -327,45 +328,45 @@
### Features
-* implement gaid op ([`71801f0`](https://github.com/algorandfoundation/algorand-python-testing/commit/71801f01e49b683d81fa46d2ddb1c8aaf38b89f2))
+- implement gaid op ([`71801f0`](https://github.com/algorandfoundation/algorand-python-testing/commit/71801f01e49b683d81fa46d2ddb1c8aaf38b89f2))
### Bug fixes
-* added mock implementations for new algopy functions, add util for raising consistent mockable method errors ([`71801f0`](https://github.com/algorandfoundation/algorand-python-testing/commit/71801f01e49b683d81fa46d2ddb1c8aaf38b89f2))
+- added mock implementations for new algopy functions, add util for raising consistent mockable method errors ([`71801f0`](https://github.com/algorandfoundation/algorand-python-testing/commit/71801f01e49b683d81fa46d2ddb1c8aaf38b89f2))
## v0.3.0-beta.1 (2024-08-14)
### Features
-* deferred app calls, modular test context, refined access to value generators, numerous fixes/improvements ([`85dd58a`](https://github.com/algorandfoundation/algorand-python-testing/commit/85dd58a60f56a0737de84dcb549c01ca5a7a2851))
+- deferred app calls, modular test context, refined access to value generators, numerous fixes/improvements ([`85dd58a`](https://github.com/algorandfoundation/algorand-python-testing/commit/85dd58a60f56a0737de84dcb549c01ca5a7a2851))
-* work in progress on asset, application related state ops ([`85dd58a`](https://github.com/algorandfoundation/algorand-python-testing/commit/85dd58a60f56a0737de84dcb549c01ca5a7a2851))
+- work in progress on asset, application related state ops ([`85dd58a`](https://github.com/algorandfoundation/algorand-python-testing/commit/85dd58a60f56a0737de84dcb549c01ca5a7a2851))
-* extra tests and implementation wrappers around AppLocal ([`85dd58a`](https://github.com/algorandfoundation/algorand-python-testing/commit/85dd58a60f56a0737de84dcb549c01ca5a7a2851))
+- extra tests and implementation wrappers around AppLocal ([`85dd58a`](https://github.com/algorandfoundation/algorand-python-testing/commit/85dd58a60f56a0737de84dcb549c01ca5a7a2851))
- chore: wip
+ chore: wip
-* adding acctparamsget; extra tests; pr comments ([`85dd58a`](https://github.com/algorandfoundation/algorand-python-testing/commit/85dd58a60f56a0737de84dcb549c01ca5a7a2851))
+- adding acctparamsget; extra tests; pr comments ([`85dd58a`](https://github.com/algorandfoundation/algorand-python-testing/commit/85dd58a60f56a0737de84dcb549c01ca5a7a2851))
-* add arc4factory ([`85dd58a`](https://github.com/algorandfoundation/algorand-python-testing/commit/85dd58a60f56a0737de84dcb549c01ca5a7a2851))
+- add arc4factory ([`85dd58a`](https://github.com/algorandfoundation/algorand-python-testing/commit/85dd58a60f56a0737de84dcb549c01ca5a7a2851))
-* continue with txn_group_for and add a test ([`85dd58a`](https://github.com/algorandfoundation/algorand-python-testing/commit/85dd58a60f56a0737de84dcb549c01ca5a7a2851))
+- continue with txn_group_for and add a test ([`85dd58a`](https://github.com/algorandfoundation/algorand-python-testing/commit/85dd58a60f56a0737de84dcb549c01ca5a7a2851))
### Bug fixes
-* handle populating foreign arrays correctly for abi method calls ([`85dd58a`](https://github.com/algorandfoundation/algorand-python-testing/commit/85dd58a60f56a0737de84dcb549c01ca5a7a2851))
+- handle populating foreign arrays correctly for abi method calls ([`85dd58a`](https://github.com/algorandfoundation/algorand-python-testing/commit/85dd58a60f56a0737de84dcb549c01ca5a7a2851))
### Documentation
-* adding pep257 formatter; using reST docstrings style for context.py ([`85dd58a`](https://github.com/algorandfoundation/algorand-python-testing/commit/85dd58a60f56a0737de84dcb549c01ca5a7a2851))
+- adding pep257 formatter; using reST docstrings style for context.py ([`85dd58a`](https://github.com/algorandfoundation/algorand-python-testing/commit/85dd58a60f56a0737de84dcb549c01ca5a7a2851))
## v0.2.2-beta.5 (2024-07-30)
### Documentation
-* patch urls in README.md ([`eddf612`](https://github.com/algorandfoundation/algorand-python-testing/commit/eddf612b177a2acddf15d58be3f375e99fb6564b))
+- patch urls in README.md ([`eddf612`](https://github.com/algorandfoundation/algorand-python-testing/commit/eddf612b177a2acddf15d58be3f375e99fb6564b))
-* patching old namespace name in readme ([`eddf612`](https://github.com/algorandfoundation/algorand-python-testing/commit/eddf612b177a2acddf15d58be3f375e99fb6564b))
+- patching old namespace name in readme ([`eddf612`](https://github.com/algorandfoundation/algorand-python-testing/commit/eddf612b177a2acddf15d58be3f375e99fb6564b))
## v0.2.2-beta.4 (2024-07-25)
@@ -379,4 +380,4 @@
### Bug fixes
-* patching helper scripts; adding pre-commit; bumping compiler version ([`8d43492`](https://github.com/algorandfoundation/algorand-python-testing/commit/8d43492adfeb53fd2824f0ea812a9c30bf6bb339))
+- patching helper scripts; adding pre-commit; bumping compiler version ([`8d43492`](https://github.com/algorandfoundation/algorand-python-testing/commit/8d43492adfeb53fd2824f0ea812a9c30bf6bb339))
diff --git a/docs/.gitignore b/docs/.gitignore
new file mode 100644
index 00000000..9c93f5af
--- /dev/null
+++ b/docs/.gitignore
@@ -0,0 +1,5 @@
+.astro/
+dist/
+node_modules/
+src/content/docs/api/
+src/content/docs/examples/
diff --git a/docs/Makefile b/docs/Makefile
deleted file mode 100644
index d4bb2cbb..00000000
--- a/docs/Makefile
+++ /dev/null
@@ -1,20 +0,0 @@
-# Minimal makefile for Sphinx documentation
-#
-
-# You can set these variables from the command line, and also
-# from the environment for the first two.
-SPHINXOPTS ?=
-SPHINXBUILD ?= sphinx-build
-SOURCEDIR = .
-BUILDDIR = _build
-
-# Put it first so that "make" without argument is like "make help".
-help:
- @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
-
-.PHONY: help Makefile
-
-# Catch-all target: route all unknown targets to Sphinx using the new
-# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
-%: Makefile
- @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
diff --git a/docs/__init__.py b/docs/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/docs/_static/custom.css b/docs/_static/custom.css
deleted file mode 100644
index 7fddf0aa..00000000
--- a/docs/_static/custom.css
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- Hide the first element of attribute like items as algopy stubs are more like interfaces and as such
- should not indicate a specific "value" for variables
- */
-.py.data,
-.py.attribute {
- dd p:first-child {
- display: none;
- }
-}
-
-.py.class {
- margin-top: 3rem;
-}
diff --git a/docs/api.md b/docs/api.md
deleted file mode 100644
index e8488388..00000000
--- a/docs/api.md
+++ /dev/null
@@ -1,41 +0,0 @@
-# API Reference
-
-An overview of the `algopy_testing` module in `algorand-python-testing` library - covering the main classes and functions.
-
-```{hint}
-Spotted a typo in the documentation? This project is open source; please submit an issue or a PR on [GitHub](https://github.com/algorandfoundation/algorand-python-testing).
-```
-
-```{warning}
-Note: Auto-generated class documentation may reference `_algopy_testing`; these should be interpreted as the `algopy_testing` namespace. The naming discrepancy will be fixed in a future update.
-```
-
-## Contexts
-
-```{autodoc2-summary}
-algopy_testing.AlgopyTestContext
-algopy_testing.LedgerContext
-algopy_testing.TransactionContext
-```
-
-## Value Generators
-
-```{autodoc2-summary}
-algopy_testing.AVMValueGenerator
-algopy_testing.ARC4ValueGenerator
-algopy_testing.TxnValueGenerator
-```
-
-## Inner transaction loaders
-
-```{autodoc2-summary}
-algopy_testing.ITxnGroupLoader
-algopy_testing.ITxnLoader
-```
-
-## Utils
-
-```{autodoc2-summary}
-algopy_testing.algopy_testing_context
-algopy_testing.arc4_prefix
-```
diff --git a/docs/api_build.py b/docs/api_build.py
new file mode 100644
index 00000000..2e422e19
--- /dev/null
+++ b/docs/api_build.py
@@ -0,0 +1,512 @@
+#!/usr/bin/env python3
+"""Generate API reference markdown from Python source using Sphinx + autoapi,
+then post-process the output for Starlight consumption.
+"""
+
+from __future__ import annotations
+
+import re
+import shutil
+import subprocess
+import sys
+from pathlib import Path
+
+DOCS_DIR = Path(__file__).resolve().parent
+REPO_ROOT = DOCS_DIR.parent
+API_OUT = DOCS_DIR / "src" / "content" / "docs" / "api"
+
+SOURCE_PACKAGE = "_algopy_testing"
+PUBLIC_PACKAGE = "algopy_testing"
+PACKAGES = (PUBLIC_PACKAGE,)
+_PACKAGES_ALT = "|".join(re.escape(p) for p in PACKAGES)
+
+_HEADING_RE = re.compile(r"^#{3,4}\s")
+_LINKED_QUALIFIED_RE = re.compile(
+ rf"\[\\?(?:{_PACKAGES_ALT}|typing_extensions|collections\.abc)" r"(?:\.\w+)*\.(\w+)\]"
+)
+_PLAIN_QUALIFIED_RE = re.compile(
+ rf"(? None:
+ print("==> Cleaning previous API output...")
+ if API_OUT.exists():
+ shutil.rmtree(API_OUT)
+ API_OUT.mkdir(parents=True, exist_ok=True)
+
+
+def _run_sphinx_build() -> None:
+ print("==> Running Sphinx markdown build...")
+ result = subprocess.run(
+ ["sphinx-build", "-b", "markdown", "docs/sphinx", str(API_OUT), "-q"],
+ cwd=str(REPO_ROOT),
+ capture_output=True,
+ text=True,
+ check=False,
+ )
+ if result.returncode != 0:
+ print(f"ERROR: Sphinx build failed (exit code {result.returncode})", file=sys.stderr)
+ if result.stderr:
+ print(result.stderr, file=sys.stderr)
+ if result.stdout:
+ print(result.stdout, file=sys.stderr)
+ sys.exit(1)
+
+
+def _remove_sphinx_artifacts() -> None:
+ print("==> Removing Sphinx artifacts...")
+ buildinfo = API_OUT / ".buildinfo"
+ if buildinfo.exists():
+ buildinfo.unlink()
+
+ doctrees = API_OUT / ".doctrees"
+ if doctrees.exists():
+ shutil.rmtree(doctrees)
+
+ index_md = API_OUT / "index.md"
+ if index_md.exists():
+ index_md.unlink()
+
+
+def _flatten_autoapi() -> None:
+ """Move autoapi/_algopy_testing/ → algopy_testing/ — rename private impl
+ package to its public name so docs never expose the leading-underscore."""
+ print("==> Flattening autoapi directory structure...")
+ autoapi_dir = API_OUT / "autoapi"
+
+ source = autoapi_dir / SOURCE_PACKAGE
+ target = API_OUT / PUBLIC_PACKAGE
+
+ if not source.is_dir():
+ print(
+ f"ERROR: Expected autoapi output directory not found: {source}\n"
+ "This likely means the Sphinx autoapi configuration or"
+ " package structure has changed.\n"
+ "Check that 'autoapi_dirs' in docs/sphinx/conf.py points to"
+ " the correct source directories.",
+ file=sys.stderr,
+ )
+ sys.exit(1)
+
+ if target.exists():
+ shutil.rmtree(target)
+ shutil.move(str(source), str(target))
+
+ if autoapi_dir.exists():
+ shutil.rmtree(autoapi_dir)
+
+
+def _rename_source_package_in_content() -> None:
+ """Rewrite `_algopy_testing` → `algopy_testing` inside generated markdown.
+ Drops markdown's `\\_` escape (no longer needed for a non-underscore prefix)."""
+ print(f"==> Rewriting {SOURCE_PACKAGE} → {PUBLIC_PACKAGE} in content...")
+ escaped = "\\" + SOURCE_PACKAGE
+ for md_file in API_OUT.rglob("*.md"):
+ content = md_file.read_text(encoding="utf-8")
+ updated = content.replace(escaped, PUBLIC_PACKAGE).replace(SOURCE_PACKAGE, PUBLIC_PACKAGE)
+ if updated != content:
+ md_file.write_text(updated, encoding="utf-8")
+
+
+def _extract_title(file_path: Path) -> str:
+ with file_path.open(encoding="utf-8") as f:
+ for line in f:
+ if line.startswith("# "):
+ return re.sub(r"\\(?=\w)", "", line[2:].strip())
+ return file_path.stem
+
+
+def _inject_frontmatter() -> None:
+ print("==> Injecting Starlight frontmatter into API docs...")
+ for md_file in sorted(API_OUT.rglob("*.md")):
+ title = _extract_title(md_file)
+ escaped_title = title.replace('"', '\\"')
+
+ content = md_file.read_text(encoding="utf-8")
+ content = re.sub(r"^# [^\n]*\n+", "", content)
+ md_file.write_text(
+ f'---\ntitle: "{escaped_title}"\n---\n\n'
+ f'
\n\n{content}\n\n
\n',
+ encoding="utf-8",
+ )
+
+
+def _fix_internal_links() -> None:
+ print("==> Fixing internal links for Starlight...")
+ for md_file in sorted(API_OUT.rglob("*.md")):
+ content = md_file.read_text(encoding="utf-8")
+ updated = _INDEX_MD_RE.sub("/", content)
+ if updated != content:
+ md_file.write_text(updated, encoding="utf-8")
+
+
+def _compute_starlight_anchor(heading_text: str) -> str:
+ """Reproduce Sphinx-markdown-builder's slug for a heading, used to recognise
+ the legacy autoapi-style anchors that summary tables emit before rewriting."""
+ text = re.sub(r"\*([^*]+)\*", r"\1", heading_text)
+ text = re.sub(r"`([^`]+)`", r"\1", text)
+ text = re.sub(r"\\.", "", text)
+ text = text.lower()
+ text = re.sub(r"[^a-z0-9-]+", " ", text)
+ return "-".join(text.split())
+
+
+def _github_slug(heading_text: str) -> str:
+ """Reproduce github-slugger's slug (the algorithm rehype-slug uses inside
+ Starlight) so we can rewrite anchors to match the heading IDs Starlight
+ actually emits.
+
+ Differs from `_compute_starlight_anchor` by preserving underscores and not
+ collapsing runs of removed punctuation — `\\* | \\*` becomes `--` here but
+ `-` under the Sphinx algorithm.
+ """
+ text = re.sub(r"\*([^*]+)\*", r"\1", heading_text)
+ text = re.sub(r"`([^`]+)`", r"\1", text)
+ text = re.sub(r"\\(.)", r"\1", text)
+ text = re.sub(r"\[([^\]]+)\]\([^)]*\)", r"\1", text)
+ text = text.lower()
+ text = re.sub(r"[^a-z0-9 _-]", "", text)
+ text = text.replace(" ", "-")
+ return text.strip("-")
+
+
+def _simplify_class_headings() -> None:
+ print("==> Simplifying class heading signatures...")
+ for md_file in sorted(API_OUT.rglob("*.md")):
+ content = md_file.read_text(encoding="utf-8")
+ updated = _CLASS_ARGS_RE.sub(r"\1", content)
+ if updated != content:
+ md_file.write_text(updated, encoding="utf-8")
+
+
+_H2_HEADING_RE = re.compile(r"^## (.+?)\s*$", re.MULTILINE)
+_SUMMARY_RENAME = {"Attributes": "Data", "Classes": "Classes", "Functions": "Functions"}
+_SUMMARY_ORDER = ("Classes", "Functions", "Attributes") # puya order: Classes, Functions, Data
+
+_SIG_DOUBLE_COMMA_RE = re.compile(r",\s*(?:,\s*)+")
+_SIG_TRAILING_COMMA_RE = re.compile(r",\s*\)")
+_SIG_LEADING_COMMA_RE = re.compile(r"\(\s*,\s*")
+_SIGNATURE_HEADING_RE = re.compile(r"^(#{3,4} [^\n]*\([^\n)]*\)[^\n]*)$", re.MULTILINE)
+
+
+def _clean_signature_separators(line: str) -> str:
+ """Collapse stray separator artifacts left when autoapi drops `/` and `*`
+ parameter markers but leaves the surrounding commas (e.g. ``a, , b`` or
+ ``a, , , b``)."""
+ cleaned = _SIG_DOUBLE_COMMA_RE.sub(", ", line)
+ cleaned = _SIG_TRAILING_COMMA_RE.sub(")", cleaned)
+ cleaned = _SIG_LEADING_COMMA_RE.sub("(", cleaned)
+ return cleaned
+
+
+def _clean_signature_artifacts() -> None:
+ """Repair signature artifacts in heading lines only (avoid touching prose)."""
+ print("==> Cleaning signature comma artifacts...")
+ for md_file in sorted(API_OUT.rglob("*.md")):
+ content = md_file.read_text(encoding="utf-8")
+ updated = _SIGNATURE_HEADING_RE.sub(
+ lambda m: _clean_signature_separators(m.group(1)), content
+ )
+ if updated != content:
+ md_file.write_text(updated, encoding="utf-8")
+
+
+def _restructure_top_sections() -> None:
+ """Nest `Attributes/Classes/Functions` summary tables under the existing
+ `## Module Contents` H2 (and demote them to H3, renaming Attributes → Data)
+ so the page reads as a single grouped section rather than four sibling H2s."""
+ print("==> Restructuring module summaries under Module Contents...")
+ for md_file in sorted(API_OUT.rglob("*.md")):
+ content = md_file.read_text(encoding="utf-8")
+ h2_matches = list(_H2_HEADING_RE.finditer(content))
+ if not h2_matches:
+ continue
+
+ sections: dict[str, tuple[int, int]] = {}
+ for i, m in enumerate(h2_matches):
+ name = m.group(1).strip()
+ end = h2_matches[i + 1].start() if i + 1 < len(h2_matches) else len(content)
+ sections[name] = (m.start(), end)
+
+ if "Module Contents" not in sections or not (set(_SUMMARY_RENAME) & set(sections)):
+ continue
+
+ summary_blocks: dict[str, str] = {}
+ for name in _SUMMARY_RENAME:
+ if name not in sections:
+ continue
+ start, end = sections[name]
+ block = content[start:end].rstrip() + "\n\n"
+ new_name = _SUMMARY_RENAME[name]
+ summary_blocks[name] = re.sub(r"^## .+", f"### {new_name}", block, count=1)
+
+ ranges = sorted((sections[n] for n in summary_blocks), key=lambda r: r[0], reverse=True)
+ new_content = content
+ for start, end in ranges:
+ new_content = new_content[:start] + new_content[end:]
+
+ mc_match = re.search(r"^## Module Contents[ \t]*$", new_content, re.MULTILINE)
+ if not mc_match:
+ continue
+ injection = "\n\n" + "".join(
+ summary_blocks[n] for n in _SUMMARY_ORDER if n in summary_blocks
+ )
+ insert_at = mc_match.end()
+ tail = new_content[insert_at:].lstrip("\n")
+ new_content = new_content[:insert_at] + injection + tail
+ new_content = re.sub(r"\n{3,}", "\n\n", new_content)
+
+ if new_content != content:
+ md_file.write_text(new_content, encoding="utf-8")
+
+
+def _dedupe_class_headings() -> None:
+ """Drop adjacent duplicate class headings produced when @typing.overload
+ spawns multiple signatures that collapse after argument stripping."""
+ print("==> Deduplicating adjacent class headings...")
+ for md_file in sorted(API_OUT.rglob("*.md")):
+ lines = md_file.read_text(encoding="utf-8").splitlines(keepends=True)
+ out: list[str] = []
+ prev_class: str | None = None
+ changed = False
+ for line in lines:
+ s = line.rstrip()
+ if _CLASS_HEADING_RE.match(s):
+ if s == prev_class:
+ changed = True
+ continue
+ prev_class = s
+ elif s:
+ prev_class = None
+ out.append(line)
+ if changed:
+ md_file.write_text("".join(out), encoding="utf-8")
+
+
+def _fix_qualified_anchors() -> None:
+ print("==> Fixing qualified name anchors...")
+ file_maps: dict[str, dict[str, str]] = {}
+ for md_file in sorted(API_OUT.rglob("*.md")):
+ anchor_map: dict[str, str] = {}
+ content = md_file.read_text(encoding="utf-8")
+ for m in _H3_TEXT_RE.finditer(content):
+ heading_text = m.group(1)
+ key_m = re.match(r"(?:\*\w+\*\s+)?(\w+)", heading_text)
+ if key_m:
+ symbol = key_m.group(1)
+ anchor_map[symbol] = _github_slug(heading_text)
+ file_maps[str(md_file)] = anchor_map
+
+ for md_file in sorted(API_OUT.rglob("*.md")):
+ content = md_file.read_text(encoding="utf-8")
+
+ def fix_anchor(m: re.Match, _file: Path = md_file) -> str:
+ path_part, symbol = m.group(1), m.group(2)
+ if path_part:
+ target_md = (_file.parent / path_part).resolve() / "index.md"
+ else:
+ target_md = _file
+ anchor = file_maps.get(str(target_md), {}).get(symbol, symbol.lower())
+ return f"({path_part}#{anchor})"
+
+ updated = _QUALIFIED_ANCHOR_RE.sub(fix_anchor, content)
+ if updated != content:
+ md_file.write_text(updated, encoding="utf-8")
+
+
+_SAME_PAGE_ANCHOR_RE = re.compile(r"\(#([^)]+)\)")
+
+
+def _fix_member_index_anchors() -> None:
+ """Rewrite same-page anchors that Sphinx pre-slugified to the slug Starlight
+ actually generates.
+
+ Sphinx-markdown-builder writes summary-table links such as
+ ``[arc4_signature](#arc4-signature-signature-str-callable-p-r-algopy-bytes)``
+ using its own slug algorithm, but Starlight assigns heading IDs via
+ github-slugger, which produces a different slug for the same heading text
+ (preserves underscores, doesn't collapse removed punctuation). For each H3
+ heading we map the Sphinx slug onto the github-slugger slug and rewrite
+ every ``(#anchor)`` reference on the same page.
+ """
+ print("==> Fixing member-index anchor slugs (sphinx → github-slugger)...")
+ for md_file in sorted(API_OUT.rglob("*.md")):
+ content = md_file.read_text(encoding="utf-8")
+ slug_map: dict[str, str] = {}
+ for m in _H3_TEXT_RE.finditer(content):
+ heading_text = m.group(1)
+ old_slug = _compute_starlight_anchor(heading_text)
+ new_slug = _github_slug(heading_text)
+ if old_slug and old_slug != new_slug:
+ slug_map[old_slug] = new_slug
+
+ if not slug_map:
+ continue
+
+ def fix_anchor(m: re.Match, _slug_map: dict[str, str] = slug_map) -> str:
+ anchor = m.group(1)
+ return f"(#{_slug_map.get(anchor, anchor)})"
+
+ updated = _SAME_PAGE_ANCHOR_RE.sub(fix_anchor, content)
+ if updated != content:
+ md_file.write_text(updated, encoding="utf-8")
+
+
+_HEADING_ESCAPE_RE = re.compile(r"\\(?=\w)")
+
+
+_ADMONITION_HEADING_RE = re.compile(
+ r"^#### (NOTE|WARNING|TIP|IMPORTANT|CAUTION|DANGER|HINT|ATTENTION|SEEALSO)\s*$"
+)
+_STARLIGHT_ADMONITION = {
+ "note": "note",
+ "hint": "tip",
+ "tip": "tip",
+ "warning": "caution",
+ "caution": "caution",
+ "attention": "caution",
+ "important": "danger",
+ "danger": "danger",
+ "seealso": "note",
+}
+
+
+def _convert_admonitions() -> None:
+ """Rewrite sphinx admonition headings as Starlight aside directives.
+
+ sphinx-markdown-builder renders ``.. note::`` (and friends) as ``#### NOTE``
+ followed by the body until the next heading. Starlight uses container
+ directives (``:::note ... :::``), so collect each admonition block and
+ re-emit it.
+ """
+ print("==> Converting rST admonitions to Starlight asides...")
+ for md_file in sorted(API_OUT.rglob("*.md")):
+ content = md_file.read_text(encoding="utf-8")
+ lines = content.splitlines()
+ out: list[str] = []
+ i = 0
+ n = len(lines)
+ changed = False
+ while i < n:
+ m = _ADMONITION_HEADING_RE.match(lines[i])
+ if not m:
+ out.append(lines[i])
+ i += 1
+ continue
+ changed = True
+ kind = _STARLIGHT_ADMONITION.get(m.group(1).lower(), "note")
+ i += 1
+ body: list[str] = []
+ while i < n and not lines[i].lstrip().startswith("#"):
+ body.append(lines[i])
+ i += 1
+ while body and body[-1].strip() == "":
+ body.pop()
+ while body and body[0].strip() == "":
+ body.pop(0)
+ out.append(f":::{kind}")
+ out.extend(body)
+ out.append(":::")
+ out.append("")
+ if changed:
+ new_content = "\n".join(out) + ("\n" if content.endswith("\n") else "")
+ md_file.write_text(new_content, encoding="utf-8")
+
+
+_PARAM_BULLET_RE = re.compile(r"^(\s{4,})\\\*(\s)", re.MULTILINE)
+
+
+def _fix_param_bullet_escapes() -> None:
+ """Unescape ``\\*`` sub-bullets that appear inside Parameter blocks.
+
+ Sphinx already renders ``:param:`` field lists into a Parameters bullet
+ structure, but ``*`` characters used by docstring authors as nested bullets
+ are emitted as ``\\*`` and stay as literal text. They sit at 4-space indent
+ inside the parameter item, which is exactly the depth a real nested bullet
+ needs — so dropping the backslash turns them into proper nested bullets.
+ """
+ print("==> Fixing escaped sub-bullets in Parameter blocks...")
+ for md_file in sorted(API_OUT.rglob("*.md")):
+ content = md_file.read_text(encoding="utf-8")
+ updated = _PARAM_BULLET_RE.sub(r"\1*\2", content)
+ if updated != content:
+ md_file.write_text(updated, encoding="utf-8")
+
+
+_DEFAULT_FENCE_RE = re.compile(r"^```default\s*$", re.MULTILINE)
+
+
+def _strip_default_language() -> None:
+ """Remove the ``default`` language tag from fenced code blocks.
+
+ sphinx-markdown-builder writes ``.. code-block::`` (no argument) as
+ ``` ```default ```; Starlight's expressive-code highlighter doesn't know
+ that language and falls back to plain text. Drop the tag so the block
+ renders as plain text without the synthetic language annotation.
+ """
+ print("==> Stripping `default` language tag from code fences...")
+ for md_file in sorted(API_OUT.rglob("*.md")):
+ content = md_file.read_text(encoding="utf-8")
+ updated = _DEFAULT_FENCE_RE.sub("```", content)
+ if updated != content:
+ md_file.write_text(updated, encoding="utf-8")
+
+
+def _shorten_qualified_names() -> None:
+ print("==> Shortening qualified names in headings...")
+ for md_file in sorted(API_OUT.rglob("*.md")):
+ lines = md_file.read_text(encoding="utf-8").splitlines(keepends=True)
+ changed = False
+ for i, line in enumerate(lines):
+ if not _HEADING_RE.match(line):
+ continue
+ new_line = _LINKED_QUALIFIED_RE.sub(r"[\1]", line)
+ new_line = _PLAIN_QUALIFIED_RE.sub(r"\1", new_line)
+ new_line = _HEADING_ESCAPE_RE.sub("", new_line)
+ if new_line != line:
+ lines[i] = new_line
+ changed = True
+ if changed:
+ md_file.write_text("".join(lines), encoding="utf-8")
+
+
+def main() -> None:
+ _clean_api_output()
+ _run_sphinx_build()
+ _remove_sphinx_artifacts()
+ _flatten_autoapi()
+ _rename_source_package_in_content()
+ _inject_frontmatter()
+ _convert_admonitions()
+ _fix_param_bullet_escapes()
+ _strip_default_language()
+ _restructure_top_sections()
+ _fix_internal_links()
+ _shorten_qualified_names()
+ _simplify_class_headings()
+ _clean_signature_artifacts()
+ _dedupe_class_headings()
+ _fix_qualified_anchors()
+ _fix_member_index_anchors()
+
+ file_count = sum(1 for _ in API_OUT.rglob("*.md"))
+ print(f"==> API docs generated at: {API_OUT}")
+ print(f" {file_count} markdown files")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs
new file mode 100644
index 00000000..524403e5
--- /dev/null
+++ b/docs/astro.config.mjs
@@ -0,0 +1,52 @@
+// @ts-check
+import { defineConfig } from 'astro/config'
+import starlight from '@astrojs/starlight'
+import remarkGithubAlerts from 'remark-github-alerts'
+import sidebar from './sidebar.config.json'
+
+export default defineConfig({
+ site: 'https://algorandfoundation.github.io',
+ base: '/algorand-python-testing/',
+ trailingSlash: 'always',
+ redirects: {
+ '/testing-guide/': '/algorand-python-testing/concepts/overview/',
+ '/testing-guide/concepts/': '/algorand-python-testing/concepts/test-context/',
+ '/testing-guide/avm-types/': '/algorand-python-testing/concepts/avm-types/',
+ '/testing-guide/arc4-types/': '/algorand-python-testing/concepts/arc4-types/',
+ '/testing-guide/opcodes/': '/algorand-python-testing/concepts/opcodes/',
+ '/testing-guide/contract-testing/': '/algorand-python-testing/guide/contract-testing/',
+ '/testing-guide/signature-testing/': '/algorand-python-testing/guide/signature-testing/',
+ '/testing-guide/state-management/': '/algorand-python-testing/guide/state-management/',
+ '/testing-guide/subroutines/': '/algorand-python-testing/guide/subroutines/',
+ '/testing-guide/transactions/': '/algorand-python-testing/guide/transactions/',
+ '/coverage/': '/algorand-python-testing/reference/coverage/',
+ '/faq/': '/algorand-python-testing/reference/faq/',
+ '/algopy/': '/algorand-python-testing/concepts/algopy/',
+ '/api/': '/algorand-python-testing/api/algopy_testing/',
+ },
+ markdown: {
+ remarkPlugins: [remarkGithubAlerts],
+ },
+ integrations: [
+ starlight({
+ title: 'Algorand Python Testing',
+ favicon: '/algokit_logo.png',
+ tableOfContents: { minHeadingLevel: 2, maxHeadingLevel: 4 },
+ customCss: [
+ './src/styles/api-reference.css',
+ 'remark-github-alerts/styles/github-colors-light.css',
+ 'remark-github-alerts/styles/github-colors-dark-media.css',
+ 'remark-github-alerts/styles/github-base.css',
+ ],
+ social: [
+ {
+ icon: 'github',
+ label: 'GitHub',
+ href: 'https://github.com/algorandfoundation/algorand-python-testing',
+ },
+ { icon: 'discord', label: 'Discord', href: 'https://discord.gg/algorand' },
+ ],
+ sidebar,
+ }),
+ ],
+})
diff --git a/docs/conf.py b/docs/conf.py
deleted file mode 100644
index ae56dad1..00000000
--- a/docs/conf.py
+++ /dev/null
@@ -1,96 +0,0 @@
-# ruff: noqa
-# Configuration file for the Sphinx documentation builder.
-#
-# For the full list of built-in configuration values, see the documentation:
-# https://www.sphinx-doc.org/en/master/usage/configuration.html
-
-# -- Project information -----------------------------------------------------
-# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
-
-project = "Algorand Python Testing"
-copyright = "2024, Algorand Foundation" # noqa: A001
-author = "Algorand Foundation"
-
-
-# -- General configuration ---------------------------------------------------
-# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
-
-extensions = [
- "sphinx.ext.githubpages",
- "sphinx.ext.intersphinx",
- "sphinx_copybutton",
- "myst_parser",
- "autodoc2",
- "sphinx.ext.doctest",
- "sphinxmermaid",
-]
-
-templates_path = ["_templates"]
-exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"]
-
-intersphinx_mapping = {
- "python": ("https://docs.python.org/3", None),
-}
-
-# warning exclusions
-suppress_warnings = [
- "myst.xref_missing",
- "autodoc2.dup_item",
-]
-nitpick_ignore = [
- ("py:class", "algopy.arc4.AllowedOnCompletes"),
-]
-nitpick_ignore_regex = [
- ("py:class", r"algopy.*\._.*"),
-]
-
-# -- Options for HTML output -------------------------------------------------
-# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
-html_theme = "furo"
-html_static_path = ["_static"]
-html_css_files = [
- "custom.css",
-]
-
-python_maximum_signature_line_length = 80
-
-# -- Options for myst ---
-myst_enable_extensions = ["colon_fence", "fieldlist"]
-
-# -- Options for autodoc2
-autodoc2_packages = [
- {
- "path": "../src/algopy_testing",
- "auto_mode": True,
- },
- {
- "path": "../src/_algopy_testing",
- "auto_mode": True,
- },
-]
-autodoc2_render_plugin = "myst"
-autodoc2_hidden_objects = [
- "dunder",
- "private",
- "undoc",
-]
-add_module_names = False
-autodoc2_index_template = None
-
-# -- Options for doctest --
-doctest_test_doctest_blocks = "default"
-
-# -- Options for mermaid --
-sphinxmermaid_mermaid_init = {
- "theme": "dark",
-}
-
-# Ignore specific warning types
-# TODO : remove upon refining autodoc2 (or finding alternative to sphinx)
-suppress_warnings = [
- "myst.xref_missing",
- "autodoc2.dup_item",
- "ref.python", # Ignore Python reference warnings
- "ref.class", # Ignore class reference warnings
- "ref.obj", # Ignore object reference warnings
-]
diff --git a/docs/index.md b/docs/index.md
deleted file mode 100644
index 9c5df25d..00000000
--- a/docs/index.md
+++ /dev/null
@@ -1,182 +0,0 @@
-# Algorand Python Testing
-
-[](https://github.com/algorandfoundation/algorand-python-testing/)
-[](https://developer.algorand.org/algokit/)
-[](https://github.com/algorandfoundation/algorand-python-testing)
-[](https://developer.algorand.org/algokit/)
-
-`algorand-python-testing` is a companion package to [Algorand Python](https://github.com/algorandfoundation/puya) that enables efficient unit testing of Algorand Python smart contracts in an offline environment. This package emulates key AVM behaviours without requiring a network connection, offering fast and reliable testing capabilities with a familiar Pythonic interface.
-
-The `algorand-python-testing` package provides:
-
-- A simple interface for fast and reliable unit testing
-- An offline testing environment that simulates core AVM functionality
-- A familiar Pythonic experience, compatible with testing frameworks like [pytest](https://docs.pytest.org/en/latest/), [unittest](https://docs.python.org/3/library/unittest.html), and [hypothesis](https://hypothesis.readthedocs.io/en/latest/)
-
-## Quick Start
-
-`algopy` is a prerequisite for `algorand-python-testing`, providing stubs and type annotations for Algorand Python syntax. It enhances code completion and type checking when writing smart contracts. Note that this code isn't directly executable in standard Python interpreters; it's compiled by `puya` into TEAL for Algorand Network deployment.
-
-Traditionally, testing Algorand smart contracts involved deployment on sandboxed networks and interacting with live instances. While robust, this approach can be inefficient and lacks versatility for testing Algorand Python code.
-
-Enter `algorand-python-testing`: it leverages Python's rich testing ecosystem for unit testing without network deployment. This enables rapid iteration and granular logic testing.
-
-> **NOTE**: While `algorand-python-testing` offers valuable unit testing capabilities, it's not a replacement for comprehensive testing. Use it alongside other test types, particularly those running against the actual Algorand Network, for thorough contract validation.
-
-### Prerequisites
-
-- Python 3.12 or later
-- [Algorand Python](https://github.com/algorandfoundation/puya)
-
-### Installation
-
-`algorand-python-testing` is distributed via [PyPI](https://pypi.org/project/algorand-python-testing/). Install the package using `pip`:
-
-```bash
-pip install algorand-python-testing
-```
-
-or using `poetry`:
-
-```bash
-poetry add algorand-python-testing
-```
-
-### Testing your first contract
-
-Let's write a simple contract and test it using the `algorand-python-testing` framework.
-
-#### Contract Definition
-
-```{testcode}
-import algopy
-from algopy import arc4
-
-class VotingContract(algopy.ARC4Contract):
- def __init__(self) -> None:
- self.topic = algopy.GlobalState(algopy.Bytes(b"default_topic"), key="topic", description="Voting topic")
- self.votes = algopy.GlobalState(
- algopy.UInt64(0),
- key="votes",
- description="Votes for the option",
- )
- self.voted = algopy.LocalState(algopy.UInt64, key="voted", description="Tracks if an account has voted")
-
- @algopy.public
- def set_topic(self, topic: arc4.String) -> None:
- self.topic.value = topic.bytes
-
- @arc4.abimethod
- def vote(self, pay: algopy.gtxn.PaymentTransaction) -> arc4.Bool:
- assert algopy.op.Global.group_size == algopy.UInt64(2), "Expected 2 transactions"
- assert pay.amount == algopy.UInt64(10_000), "Incorrect payment amount"
- assert pay.sender == algopy.Txn.sender, "Payment sender must match transaction sender"
-
- _value, exists = self.voted.maybe(algopy.Txn.sender)
- if exists:
- return arc4.Bool(False) # Already voted
- self.votes.value += algopy.UInt64(1)
- self.voted[algopy.Txn.sender] = algopy.UInt64(1)
- return arc4.Bool(True)
-
- @algopy.public(readonly=True)
- def get_votes(self) -> arc4.UInt64:
- return arc4.UInt64(self.votes.value)
-
- def clear_state_program(self) -> bool:
- return True
-```
-
-#### Test Definition
-
-```{testcode}
-from collections.abc import Generator
-import pytest
-from algopy_testing import AlgopyTestContext, algopy_testing_context
-from algopy import arc4
-
-# Create a test context
-with algopy_testing_context() as context:
-
- # Initialize the contract
- contract = VotingContract()
-
- # Test vote function
- voter = context.default_sender
- payment = context.any.txn.payment(
- sender=voter,
- amount=algopy.UInt64(10_000),
- )
-
- result = contract.vote(payment)
- print(f"Vote result: {result.native}")
- print(f"Total votes: {contract.votes.value}")
- print(f"Voter {voter} voted: {contract.voted[voter]}")
-
- # Test set_topic function
- new_topic = context.any.arc4.string(10)
- contract.set_topic(new_topic)
- print(f"New topic: {new_topic.native}")
- print(f"Contract topic: {contract.topic.value}")
-
- # Test get_votes function
- contract.votes.value = algopy.UInt64(5)
- votes = contract.get_votes()
- print(f"Current votes: {votes.native}")
-```
-
-```{testoutput}
-:hide:
-
-Vote result: True
-Total votes: 1
-Voter ... voted: 1
-New topic: ...
-Contract topic: ...
-Current votes: 5
-```
-
-This example demonstrates key aspects of testing with `algorand-python-testing` for ARC4-based contracts:
-
-1. ARC4 Contract Features:
-
- - Use of `algopy.ARC4Contract` as the base class for the contract.
- - ABI methods defined using the `@arc4.abimethod`, or its alias `@algopy.public`, decorator.
- - Use of ARC4-specific types like `arc4.String`, `arc4.Bool`, and `arc4.UInt64`.
- - Readonly method annotation with `@arc4.abimethod(readonly=True)` or `@algopy.public(readonly=True)` .
-
-2. Testing ARC4 Contracts:
-
- - Creation of an `ARC4Contract` instance within the test context.
- - Use of `context.any.arc4` for generating ARC4-specific random test data.
- - Direct invocation of ABI methods on the contract instance.
-
-3. Transaction Handling:
-
- - Use of `context.any.txn` to create test transactions.
- - Passing transaction objects as parameters to contract methods.
-
-4. State Verification:
- - Checking global and local state changes after method execution.
- - Verifying return values from ABI methods using ARC4-specific types.
-
-> **NOTE**: Thorough testing is crucial in smart contract development due to their immutable nature post-deployment. Comprehensive unit and integration tests ensure contract validity and reliability. Optimising for efficiency can significantly improve user experience by reducing transaction fees and simplifying interactions. Investing in robust testing and optimisation practices is crucial and offers many benefits in the long run.
-
-### Next steps
-
-To dig deeper into the capabilities of `algorand-python-testing`, continue with the following sections.
-
-```{toctree}
----
-maxdepth: 2
-caption: Contents
-hidden: true
----
-
-testing-guide/index
-examples
-coverage
-faq
-api
-algopy
-```
diff --git a/docs/legacy-routes.json b/docs/legacy-routes.json
new file mode 100644
index 00000000..c1cf119f
--- /dev/null
+++ b/docs/legacy-routes.json
@@ -0,0 +1,28 @@
+{
+ "basePath": "/algorand-python-testing/",
+ "routes": [
+ { "from": "examples.html", "to": "examples/" },
+ { "from": "coverage.html", "to": "reference/coverage/" },
+ { "from": "faq.html", "to": "reference/faq/" },
+ { "from": "algopy.html", "to": "concepts/algopy/" },
+ { "from": "api.html", "to": "api/algopy_testing/" },
+ { "from": "testing-guide.html", "to": "concepts/overview/" },
+ { "from": "testing-guide/index.html", "to": "concepts/overview/" },
+ { "from": "testing-guide/concepts.html", "to": "concepts/test-context/" },
+ { "from": "testing-guide/avm-types.html", "to": "concepts/avm-types/" },
+ { "from": "testing-guide/arc4-types.html", "to": "concepts/arc4-types/" },
+ { "from": "testing-guide/opcodes.html", "to": "concepts/opcodes/" },
+ { "from": "testing-guide/contract-testing.html", "to": "guide/contract-testing/" },
+ { "from": "testing-guide/signature-testing.html", "to": "guide/signature-testing/" },
+ { "from": "testing-guide/state-management.html", "to": "guide/state-management/" },
+ { "from": "testing-guide/subroutines.html", "to": "guide/subroutines/" },
+ { "from": "testing-guide/transactions.html", "to": "guide/transactions/" }
+ ],
+ "families": [
+ {
+ "fromPrefix": "apidocs/",
+ "toPrefix": "api/",
+ "fromExtension": ".html"
+ }
+ ]
+}
diff --git a/docs/make.bat b/docs/make.bat
deleted file mode 100644
index 954237b9..00000000
--- a/docs/make.bat
+++ /dev/null
@@ -1,35 +0,0 @@
-@ECHO OFF
-
-pushd %~dp0
-
-REM Command file for Sphinx documentation
-
-if "%SPHINXBUILD%" == "" (
- set SPHINXBUILD=sphinx-build
-)
-set SOURCEDIR=.
-set BUILDDIR=_build
-
-%SPHINXBUILD% >NUL 2>NUL
-if errorlevel 9009 (
- echo.
- echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
- echo.installed, then set the SPHINXBUILD environment variable to point
- echo.to the full path of the 'sphinx-build' executable. Alternatively you
- echo.may add the Sphinx directory to PATH.
- echo.
- echo.If you don't have Sphinx installed, grab it from
- echo.https://www.sphinx-doc.org/
- exit /b 1
-)
-
-if "%1" == "" goto help
-
-%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
-goto end
-
-:help
-%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
-
-:end
-popd
diff --git a/docs/package.json b/docs/package.json
new file mode 100644
index 00000000..84ddf091
--- /dev/null
+++ b/docs/package.json
@@ -0,0 +1,29 @@
+{
+ "name": "@algorandfoundation/algorand-python-testing-docs",
+ "private": true,
+ "type": "module",
+ "version": "0.0.1",
+ "packageManager": "pnpm@10.30.3",
+ "scripts": {
+ "generate:examples": "tsx scripts/generate-examples-mdx.ts",
+ "predev": "tsx scripts/generate-examples-mdx.ts",
+ "build": "astro build",
+ "prebuild": "tsx scripts/generate-examples-mdx.ts",
+ "dev": "astro dev",
+ "preview": "astro preview",
+ "astro": "astro"
+ },
+ "dependencies": {
+ "@astrojs/starlight": "^0.37.6",
+ "astro": "^5.6.1",
+ "remark-github-alerts": "^0.1.1",
+ "sharp": "^0.34.2"
+ },
+ "devDependencies": {
+ "@types/node": "^22.19.15",
+ "tsx": "^4.21.0"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+}
diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml
new file mode 100644
index 00000000..1f4c7282
--- /dev/null
+++ b/docs/pnpm-lock.yaml
@@ -0,0 +1,4453 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ dependencies:
+ '@astrojs/starlight':
+ specifier: ^0.37.6
+ version: 0.37.7(astro@5.18.1(@types/node@22.19.15)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3))
+ astro:
+ specifier: ^5.6.1
+ version: 5.18.1(@types/node@22.19.15)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)
+ remark-github-alerts:
+ specifier: ^0.1.1
+ version: 0.1.1(@types/mdast@4.0.4)(unified@11.0.5)
+ sharp:
+ specifier: ^0.34.2
+ version: 0.34.5
+ devDependencies:
+ '@types/node':
+ specifier: ^22.19.15
+ version: 22.19.15
+ tsx:
+ specifier: ^4.21.0
+ version: 4.21.0
+
+packages:
+
+ '@astrojs/compiler@2.13.1':
+ resolution: {integrity: sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==}
+
+ '@astrojs/internal-helpers@0.7.6':
+ resolution: {integrity: sha512-GOle7smBWKfMSP8osUIGOlB5kaHdQLV3foCsf+5Q9Wsuu+C6Fs3Ez/ttXmhjZ1HkSgsogcM1RXSjjOVieHq16Q==}
+
+ '@astrojs/markdown-remark@6.3.11':
+ resolution: {integrity: sha512-hcaxX/5aC6lQgHeGh1i+aauvSwIT6cfyFjKWvExYSxUhZZBBdvCliOtu06gbQyhbe0pGJNoNmqNlQZ5zYUuIyQ==}
+
+ '@astrojs/mdx@4.3.14':
+ resolution: {integrity: sha512-FBrqJQORVm+rkRa2TS5CjU9PBA6hkhrwLVBSS9A77gN2+iehvjq1w6yya/d0YKC7osiVorKkr3Qd9wNbl0ZkGA==}
+ engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0}
+ peerDependencies:
+ astro: ^5.0.0
+
+ '@astrojs/prism@3.3.0':
+ resolution: {integrity: sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==}
+ engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0}
+
+ '@astrojs/sitemap@3.7.1':
+ resolution: {integrity: sha512-IzQqdTeskaMX+QDZCzMuJIp8A8C1vgzMBp/NmHNnadepHYNHcxQdGLQZYfkbd2EbRXUfOS+UDIKx8sKg0oWVdw==}
+
+ '@astrojs/starlight@0.37.7':
+ resolution: {integrity: sha512-KyBnou8aKIlPJUSNx6a1SN7XyH22oj/VAvTGC+Edld4Bnei1A//pmCRTBvSrSeoGrdUjK0ErFUfaEhhO1bPfDg==}
+ peerDependencies:
+ astro: ^5.5.0
+
+ '@astrojs/telemetry@3.3.0':
+ resolution: {integrity: sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==}
+ engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0}
+
+ '@babel/helper-string-parser@7.27.1':
+ resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.28.5':
+ resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/parser@7.29.2':
+ resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/runtime@7.29.2':
+ resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.29.0':
+ resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==}
+ engines: {node: '>=6.9.0'}
+
+ '@capsizecss/unpack@4.0.0':
+ resolution: {integrity: sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==}
+ engines: {node: '>=18'}
+
+ '@ctrl/tinycolor@4.2.0':
+ resolution: {integrity: sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==}
+ engines: {node: '>=14'}
+
+ '@emnapi/runtime@1.9.0':
+ resolution: {integrity: sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==}
+
+ '@esbuild/aix-ppc64@0.25.12':
+ resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/aix-ppc64@0.27.4':
+ resolution: {integrity: sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/android-arm64@0.25.12':
+ resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm64@0.27.4':
+ resolution: {integrity: sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm@0.25.12':
+ resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-arm@0.27.4':
+ resolution: {integrity: sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-x64@0.25.12':
+ resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/android-x64@0.27.4':
+ resolution: {integrity: sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/darwin-arm64@0.25.12':
+ resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-arm64@0.27.4':
+ resolution: {integrity: sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.25.12':
+ resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.27.4':
+ resolution: {integrity: sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/freebsd-arm64@0.25.12':
+ resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-arm64@0.27.4':
+ resolution: {integrity: sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.25.12':
+ resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.27.4':
+ resolution: {integrity: sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/linux-arm64@0.25.12':
+ resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm64@0.27.4':
+ resolution: {integrity: sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.25.12':
+ resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.27.4':
+ resolution: {integrity: sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.25.12':
+ resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.27.4':
+ resolution: {integrity: sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.25.12':
+ resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.27.4':
+ resolution: {integrity: sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.25.12':
+ resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.27.4':
+ resolution: {integrity: sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.25.12':
+ resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.27.4':
+ resolution: {integrity: sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.25.12':
+ resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.27.4':
+ resolution: {integrity: sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.25.12':
+ resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.27.4':
+ resolution: {integrity: sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.25.12':
+ resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.27.4':
+ resolution: {integrity: sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/netbsd-arm64@0.25.12':
+ resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-arm64@0.27.4':
+ resolution: {integrity: sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.25.12':
+ resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.27.4':
+ resolution: {integrity: sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/openbsd-arm64@0.25.12':
+ resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-arm64@0.27.4':
+ resolution: {integrity: sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.25.12':
+ resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.27.4':
+ resolution: {integrity: sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/openharmony-arm64@0.25.12':
+ resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@esbuild/openharmony-arm64@0.27.4':
+ resolution: {integrity: sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@esbuild/sunos-x64@0.25.12':
+ resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/sunos-x64@0.27.4':
+ resolution: {integrity: sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/win32-arm64@0.25.12':
+ resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-arm64@0.27.4':
+ resolution: {integrity: sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.25.12':
+ resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.27.4':
+ resolution: {integrity: sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.25.12':
+ resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.27.4':
+ resolution: {integrity: sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
+ '@expressive-code/core@0.41.7':
+ resolution: {integrity: sha512-ck92uZYZ9Wba2zxkiZLsZGi9N54pMSAVdrI9uW3Oo9AtLglD5RmrdTwbYPCT2S/jC36JGB2i+pnQtBm/Ib2+dg==}
+
+ '@expressive-code/plugin-frames@0.41.7':
+ resolution: {integrity: sha512-diKtxjQw/979cTglRFaMCY/sR6hWF0kSMg8jsKLXaZBSfGS0I/Hoe7Qds3vVEgeoW+GHHQzMcwvgx/MOIXhrTA==}
+
+ '@expressive-code/plugin-shiki@0.41.7':
+ resolution: {integrity: sha512-DL605bLrUOgqTdZ0Ot5MlTaWzppRkzzqzeGEu7ODnHF39IkEBbFdsC7pbl3LbUQ1DFtnfx6rD54k/cdofbW6KQ==}
+
+ '@expressive-code/plugin-text-markers@0.41.7':
+ resolution: {integrity: sha512-Ewpwuc5t6eFdZmWlFyeuy3e1PTQC0jFvw2Q+2bpcWXbOZhPLsT7+h8lsSIJxb5mS7wZko7cKyQ2RLYDyK6Fpmw==}
+
+ '@img/colour@1.1.0':
+ resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==}
+ engines: {node: '>=18'}
+
+ '@img/sharp-darwin-arm64@0.34.5':
+ resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@img/sharp-darwin-x64@0.34.5':
+ resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [darwin]
+
+ '@img/sharp-libvips-darwin-arm64@1.2.4':
+ resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@img/sharp-libvips-darwin-x64@1.2.4':
+ resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@img/sharp-libvips-linux-arm64@1.2.4':
+ resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-libvips-linux-arm@1.2.4':
+ resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==}
+ cpu: [arm]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-libvips-linux-ppc64@1.2.4':
+ resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-libvips-linux-riscv64@1.2.4':
+ resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-libvips-linux-s390x@1.2.4':
+ resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-libvips-linux-x64@1.2.4':
+ resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
+ resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@img/sharp-libvips-linuxmusl-x64@1.2.4':
+ resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@img/sharp-linux-arm64@0.34.5':
+ resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-linux-arm@0.34.5':
+ resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-linux-ppc64@0.34.5':
+ resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-linux-riscv64@0.34.5':
+ resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-linux-s390x@0.34.5':
+ resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-linux-x64@0.34.5':
+ resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-linuxmusl-arm64@0.34.5':
+ resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@img/sharp-linuxmusl-x64@0.34.5':
+ resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@img/sharp-wasm32@0.34.5':
+ resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [wasm32]
+
+ '@img/sharp-win32-arm64@0.34.5':
+ resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [win32]
+
+ '@img/sharp-win32-ia32@0.34.5':
+ resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [ia32]
+ os: [win32]
+
+ '@img/sharp-win32-x64@0.34.5':
+ resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [win32]
+
+ '@jridgewell/sourcemap-codec@1.5.5':
+ resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
+
+ '@mdx-js/mdx@3.1.1':
+ resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==}
+
+ '@oslojs/encoding@1.1.0':
+ resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==}
+
+ '@pagefind/darwin-arm64@1.4.0':
+ resolution: {integrity: sha512-2vMqkbv3lbx1Awea90gTaBsvpzgRs7MuSgKDxW0m9oV1GPZCZbZBJg/qL83GIUEN2BFlY46dtUZi54pwH+/pTQ==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@pagefind/darwin-x64@1.4.0':
+ resolution: {integrity: sha512-e7JPIS6L9/cJfow+/IAqknsGqEPjJnVXGjpGm25bnq+NPdoD3c/7fAwr1OXkG4Ocjx6ZGSCijXEV4ryMcH2E3A==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@pagefind/default-ui@1.4.0':
+ resolution: {integrity: sha512-wie82VWn3cnGEdIjh4YwNESyS1G6vRHwL6cNjy9CFgNnWW/PGRjsLq300xjVH5sfPFK3iK36UxvIBymtQIEiSQ==}
+
+ '@pagefind/freebsd-x64@1.4.0':
+ resolution: {integrity: sha512-WcJVypXSZ+9HpiqZjFXMUobfFfZZ6NzIYtkhQ9eOhZrQpeY5uQFqNWLCk7w9RkMUwBv1HAMDW3YJQl/8OqsV0Q==}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@pagefind/linux-arm64@1.4.0':
+ resolution: {integrity: sha512-PIt8dkqt4W06KGmQjONw7EZbhDF+uXI7i0XtRLN1vjCUxM9vGPdtJc2mUyVPevjomrGz5M86M8bqTr6cgDp1Uw==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@pagefind/linux-x64@1.4.0':
+ resolution: {integrity: sha512-z4oddcWwQ0UHrTHR8psLnVlz6USGJ/eOlDPTDYZ4cI8TK8PgwRUPQZp9D2iJPNIPcS6Qx/E4TebjuGJOyK8Mmg==}
+ cpu: [x64]
+ os: [linux]
+
+ '@pagefind/windows-x64@1.4.0':
+ resolution: {integrity: sha512-NkT+YAdgS2FPCn8mIA9bQhiBs+xmniMGq1LFPDhcFn0+2yIUEiIG06t7bsZlhdjknEQRTSdT7YitP6fC5qwP0g==}
+ cpu: [x64]
+ os: [win32]
+
+ '@rollup/pluginutils@5.3.0':
+ resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+
+ '@rollup/rollup-android-arm-eabi@4.59.0':
+ resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==}
+ cpu: [arm]
+ os: [android]
+
+ '@rollup/rollup-android-arm64@4.59.0':
+ resolution: {integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==}
+ cpu: [arm64]
+ os: [android]
+
+ '@rollup/rollup-darwin-arm64@4.59.0':
+ resolution: {integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@rollup/rollup-darwin-x64@4.59.0':
+ resolution: {integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rollup/rollup-freebsd-arm64@4.59.0':
+ resolution: {integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@rollup/rollup-freebsd-x64@4.59.0':
+ resolution: {integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.59.0':
+ resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==}
+ cpu: [arm]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-arm-musleabihf@4.59.0':
+ resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==}
+ cpu: [arm]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-linux-arm64-gnu@4.59.0':
+ resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-arm64-musl@4.59.0':
+ resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-linux-loong64-gnu@4.59.0':
+ resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==}
+ cpu: [loong64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-loong64-musl@4.59.0':
+ resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==}
+ cpu: [loong64]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-linux-ppc64-gnu@4.59.0':
+ resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-ppc64-musl@4.59.0':
+ resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-linux-riscv64-gnu@4.59.0':
+ resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-riscv64-musl@4.59.0':
+ resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-linux-s390x-gnu@4.59.0':
+ resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-x64-gnu@4.59.0':
+ resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-x64-musl@4.59.0':
+ resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-openbsd-x64@4.59.0':
+ resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@rollup/rollup-openharmony-arm64@4.59.0':
+ resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@rollup/rollup-win32-arm64-msvc@4.59.0':
+ resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rollup/rollup-win32-ia32-msvc@4.59.0':
+ resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==}
+ cpu: [ia32]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-gnu@4.59.0':
+ resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==}
+ cpu: [x64]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-msvc@4.59.0':
+ resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==}
+ cpu: [x64]
+ os: [win32]
+
+ '@shikijs/core@3.23.0':
+ resolution: {integrity: sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==}
+
+ '@shikijs/engine-javascript@3.23.0':
+ resolution: {integrity: sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==}
+
+ '@shikijs/engine-oniguruma@3.23.0':
+ resolution: {integrity: sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==}
+
+ '@shikijs/langs@3.23.0':
+ resolution: {integrity: sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==}
+
+ '@shikijs/themes@3.23.0':
+ resolution: {integrity: sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==}
+
+ '@shikijs/types@3.23.0':
+ resolution: {integrity: sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==}
+
+ '@shikijs/vscode-textmate@10.0.2':
+ resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==}
+
+ '@types/debug@4.1.12':
+ resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
+
+ '@types/estree-jsx@1.0.5':
+ resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==}
+
+ '@types/estree@1.0.8':
+ resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
+
+ '@types/hast@3.0.4':
+ resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
+
+ '@types/js-yaml@4.0.9':
+ resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==}
+
+ '@types/mdast@4.0.4':
+ resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
+
+ '@types/mdx@2.0.13':
+ resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==}
+
+ '@types/ms@2.1.0':
+ resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
+
+ '@types/nlcst@2.0.3':
+ resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==}
+
+ '@types/node@22.19.15':
+ resolution: {integrity: sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==}
+
+ '@types/node@24.12.0':
+ resolution: {integrity: sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==}
+
+ '@types/sax@1.2.7':
+ resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==}
+
+ '@types/unist@2.0.11':
+ resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==}
+
+ '@types/unist@3.0.3':
+ resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
+
+ '@ungap/structured-clone@1.3.0':
+ resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
+
+ acorn-jsx@5.3.2:
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+ acorn@8.16.0:
+ resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ ansi-align@3.0.1:
+ resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==}
+
+ ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+
+ ansi-regex@6.2.2:
+ resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==}
+ engines: {node: '>=12'}
+
+ ansi-styles@6.2.3:
+ resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==}
+ engines: {node: '>=12'}
+
+ anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+
+ arg@5.0.2:
+ resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
+
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+ aria-query@5.3.2:
+ resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
+ engines: {node: '>= 0.4'}
+
+ array-iterate@2.0.1:
+ resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==}
+
+ astring@1.9.0:
+ resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==}
+ hasBin: true
+
+ astro-expressive-code@0.41.7:
+ resolution: {integrity: sha512-hUpogGc6DdAd+I7pPXsctyYPRBJDK7Q7d06s4cyP0Vz3OcbziP3FNzN0jZci1BpCvLn9675DvS7B9ctKKX64JQ==}
+ peerDependencies:
+ astro: ^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta
+
+ astro@5.18.1:
+ resolution: {integrity: sha512-m4VWilWZ+Xt6NPoYzC4CgGZim/zQUO7WFL0RHCH0AiEavF1153iC3+me2atDvXpf/yX4PyGUeD8wZLq1cirT3g==}
+ engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'}
+ hasBin: true
+
+ axobject-query@4.1.0:
+ resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==}
+ engines: {node: '>= 0.4'}
+
+ bail@2.0.2:
+ resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
+
+ base-64@1.0.0:
+ resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==}
+
+ bcp-47-match@2.0.3:
+ resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==}
+
+ bcp-47@2.1.0:
+ resolution: {integrity: sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==}
+
+ boolbase@1.0.0:
+ resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+
+ boxen@8.0.1:
+ resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==}
+ engines: {node: '>=18'}
+
+ camelcase@8.0.0:
+ resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==}
+ engines: {node: '>=16'}
+
+ ccount@2.0.1:
+ resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
+
+ chalk@5.6.2:
+ resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==}
+ engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+
+ character-entities-html4@2.1.0:
+ resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==}
+
+ character-entities-legacy@3.0.0:
+ resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==}
+
+ character-entities@2.0.2:
+ resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
+
+ character-reference-invalid@2.0.1:
+ resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==}
+
+ chokidar@5.0.0:
+ resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==}
+ engines: {node: '>= 20.19.0'}
+
+ ci-info@4.4.0:
+ resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==}
+ engines: {node: '>=8'}
+
+ cli-boxes@3.0.0:
+ resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==}
+ engines: {node: '>=10'}
+
+ clsx@2.1.1:
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
+ engines: {node: '>=6'}
+
+ collapse-white-space@2.1.0:
+ resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==}
+
+ comma-separated-tokens@2.0.3:
+ resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
+
+ commander@11.1.0:
+ resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==}
+ engines: {node: '>=16'}
+
+ common-ancestor-path@1.0.1:
+ resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==}
+
+ cookie-es@1.2.2:
+ resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==}
+
+ cookie@1.1.1:
+ resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==}
+ engines: {node: '>=18'}
+
+ crossws@0.3.5:
+ resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==}
+
+ css-select@5.2.2:
+ resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==}
+
+ css-selector-parser@3.3.0:
+ resolution: {integrity: sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==}
+
+ css-tree@2.2.1:
+ resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
+
+ css-tree@3.2.1:
+ resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
+
+ css-what@6.2.2:
+ resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==}
+ engines: {node: '>= 6'}
+
+ cssesc@3.0.0:
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ csso@5.0.5:
+ resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
+
+ debug@4.4.3:
+ resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ decode-named-character-reference@1.3.0:
+ resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==}
+
+ defu@6.1.4:
+ resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
+
+ dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
+
+ destr@2.0.5:
+ resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==}
+
+ detect-libc@2.1.2:
+ resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
+ engines: {node: '>=8'}
+
+ deterministic-object-hash@2.0.2:
+ resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==}
+ engines: {node: '>=18'}
+
+ devalue@5.6.4:
+ resolution: {integrity: sha512-Gp6rDldRsFh/7XuouDbxMH3Mx8GMCcgzIb1pDTvNyn8pZGQ22u+Wa+lGV9dQCltFQ7uVw0MhRyb8XDskNFOReA==}
+
+ devlop@1.1.0:
+ resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
+
+ diff@8.0.3:
+ resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==}
+ engines: {node: '>=0.3.1'}
+
+ direction@2.0.1:
+ resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==}
+ hasBin: true
+
+ dlv@1.1.3:
+ resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
+
+ dom-serializer@2.0.0:
+ resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
+
+ domelementtype@2.3.0:
+ resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+
+ domhandler@5.0.3:
+ resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
+ engines: {node: '>= 4'}
+
+ domutils@3.2.2:
+ resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==}
+
+ dset@3.1.4:
+ resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==}
+ engines: {node: '>=4'}
+
+ emoji-regex@10.6.0:
+ resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==}
+
+ emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+ entities@4.5.0:
+ resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+ engines: {node: '>=0.12'}
+
+ entities@6.0.1:
+ resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==}
+ engines: {node: '>=0.12'}
+
+ es-module-lexer@1.7.0:
+ resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==}
+
+ esast-util-from-estree@2.0.0:
+ resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==}
+
+ esast-util-from-js@2.0.1:
+ resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==}
+
+ esbuild@0.25.12:
+ resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ esbuild@0.27.4:
+ resolution: {integrity: sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ escape-string-regexp@5.0.0:
+ resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
+ engines: {node: '>=12'}
+
+ estree-util-attach-comments@3.0.0:
+ resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==}
+
+ estree-util-build-jsx@3.0.1:
+ resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==}
+
+ estree-util-is-identifier-name@3.0.0:
+ resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==}
+
+ estree-util-scope@1.0.0:
+ resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==}
+
+ estree-util-to-js@2.0.0:
+ resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==}
+
+ estree-util-visit@2.0.0:
+ resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==}
+
+ estree-walker@2.0.2:
+ resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
+ estree-walker@3.0.3:
+ resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+
+ eventemitter3@5.0.4:
+ resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==}
+
+ expressive-code@0.41.7:
+ resolution: {integrity: sha512-2wZjC8OQ3TaVEMcBtYY4Va3lo6J+Ai9jf3d4dbhURMJcU4Pbqe6EcHe424MIZI0VHUA1bR6xdpoHYi3yxokWqA==}
+
+ extend@3.0.2:
+ resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+
+ fdir@6.5.0:
+ resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
+
+ flattie@1.1.1:
+ resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==}
+ engines: {node: '>=8'}
+
+ fontace@0.4.1:
+ resolution: {integrity: sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==}
+
+ fontkitten@1.0.3:
+ resolution: {integrity: sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==}
+ engines: {node: '>=20'}
+
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ get-east-asian-width@1.5.0:
+ resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==}
+ engines: {node: '>=18'}
+
+ get-tsconfig@4.13.6:
+ resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==}
+
+ github-slugger@2.0.0:
+ resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==}
+
+ h3@1.15.6:
+ resolution: {integrity: sha512-oi15ESLW5LRthZ+qPCi5GNasY/gvynSKUQxgiovrY63bPAtG59wtM+LSrlcwvOHAXzGrXVLnI97brbkdPF9WoQ==}
+
+ hast-util-embedded@3.0.0:
+ resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==}
+
+ hast-util-format@1.1.0:
+ resolution: {integrity: sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==}
+
+ hast-util-from-html@2.0.3:
+ resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==}
+
+ hast-util-from-parse5@8.0.3:
+ resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==}
+
+ hast-util-has-property@3.0.0:
+ resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==}
+
+ hast-util-is-body-ok-link@3.0.1:
+ resolution: {integrity: sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==}
+
+ hast-util-is-element@3.0.0:
+ resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==}
+
+ hast-util-minify-whitespace@1.0.1:
+ resolution: {integrity: sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==}
+
+ hast-util-parse-selector@4.0.0:
+ resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==}
+
+ hast-util-phrasing@3.0.1:
+ resolution: {integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==}
+
+ hast-util-raw@9.1.0:
+ resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==}
+
+ hast-util-select@6.0.4:
+ resolution: {integrity: sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==}
+
+ hast-util-to-estree@3.1.3:
+ resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==}
+
+ hast-util-to-html@9.0.5:
+ resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==}
+
+ hast-util-to-jsx-runtime@2.3.6:
+ resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==}
+
+ hast-util-to-parse5@8.0.1:
+ resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==}
+
+ hast-util-to-string@3.0.1:
+ resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==}
+
+ hast-util-to-text@4.0.2:
+ resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==}
+
+ hast-util-whitespace@3.0.0:
+ resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
+
+ hastscript@9.0.1:
+ resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==}
+
+ html-escaper@3.0.3:
+ resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==}
+
+ html-void-elements@3.0.0:
+ resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
+
+ html-whitespace-sensitive-tag-names@3.0.1:
+ resolution: {integrity: sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==}
+
+ http-cache-semantics@4.2.0:
+ resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==}
+
+ i18next@23.16.8:
+ resolution: {integrity: sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==}
+
+ import-meta-resolve@4.2.0:
+ resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==}
+
+ inline-style-parser@0.2.7:
+ resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==}
+
+ iron-webcrypto@1.2.1:
+ resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==}
+
+ is-alphabetical@2.0.1:
+ resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==}
+
+ is-alphanumerical@2.0.1:
+ resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==}
+
+ is-decimal@2.0.1:
+ resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==}
+
+ is-docker@3.0.0:
+ resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ hasBin: true
+
+ is-fullwidth-code-point@3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+
+ is-hexadecimal@2.0.1:
+ resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==}
+
+ is-inside-container@1.0.0:
+ resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==}
+ engines: {node: '>=14.16'}
+ hasBin: true
+
+ is-plain-obj@4.1.0:
+ resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
+ engines: {node: '>=12'}
+
+ is-wsl@3.1.1:
+ resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==}
+ engines: {node: '>=16'}
+
+ js-yaml@4.1.1:
+ resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==}
+ hasBin: true
+
+ kleur@3.0.3:
+ resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
+ engines: {node: '>=6'}
+
+ klona@2.0.6:
+ resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==}
+ engines: {node: '>= 8'}
+
+ longest-streak@3.1.0:
+ resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==}
+
+ lru-cache@11.2.7:
+ resolution: {integrity: sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==}
+ engines: {node: 20 || >=22}
+
+ magic-string@0.30.21:
+ resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
+
+ magicast@0.5.2:
+ resolution: {integrity: sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==}
+
+ markdown-extensions@2.0.0:
+ resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==}
+ engines: {node: '>=16'}
+
+ markdown-table@3.0.4:
+ resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==}
+
+ mdast-util-definitions@6.0.0:
+ resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==}
+
+ mdast-util-directive@3.1.0:
+ resolution: {integrity: sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==}
+
+ mdast-util-find-and-replace@3.0.2:
+ resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==}
+
+ mdast-util-from-markdown@2.0.3:
+ resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==}
+
+ mdast-util-gfm-autolink-literal@2.0.1:
+ resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==}
+
+ mdast-util-gfm-footnote@2.1.0:
+ resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==}
+
+ mdast-util-gfm-strikethrough@2.0.0:
+ resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==}
+
+ mdast-util-gfm-table@2.0.0:
+ resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==}
+
+ mdast-util-gfm-task-list-item@2.0.0:
+ resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==}
+
+ mdast-util-gfm@3.1.0:
+ resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==}
+
+ mdast-util-mdx-expression@2.0.1:
+ resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==}
+
+ mdast-util-mdx-jsx@3.2.0:
+ resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==}
+
+ mdast-util-mdx@3.0.0:
+ resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==}
+
+ mdast-util-mdxjs-esm@2.0.1:
+ resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==}
+
+ mdast-util-phrasing@4.1.0:
+ resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==}
+
+ mdast-util-to-hast@13.2.1:
+ resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==}
+
+ mdast-util-to-markdown@2.1.2:
+ resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==}
+
+ mdast-util-to-string@4.0.0:
+ resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==}
+
+ mdn-data@2.0.28:
+ resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==}
+
+ mdn-data@2.27.1:
+ resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==}
+
+ micromark-core-commonmark@2.0.3:
+ resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==}
+
+ micromark-extension-directive@3.0.2:
+ resolution: {integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==}
+
+ micromark-extension-gfm-autolink-literal@2.1.0:
+ resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==}
+
+ micromark-extension-gfm-footnote@2.1.0:
+ resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==}
+
+ micromark-extension-gfm-strikethrough@2.1.0:
+ resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==}
+
+ micromark-extension-gfm-table@2.1.1:
+ resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==}
+
+ micromark-extension-gfm-tagfilter@2.0.0:
+ resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==}
+
+ micromark-extension-gfm-task-list-item@2.1.0:
+ resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==}
+
+ micromark-extension-gfm@3.0.0:
+ resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==}
+
+ micromark-extension-mdx-expression@3.0.1:
+ resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==}
+
+ micromark-extension-mdx-jsx@3.0.2:
+ resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==}
+
+ micromark-extension-mdx-md@2.0.0:
+ resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==}
+
+ micromark-extension-mdxjs-esm@3.0.0:
+ resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==}
+
+ micromark-extension-mdxjs@3.0.0:
+ resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==}
+
+ micromark-factory-destination@2.0.1:
+ resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==}
+
+ micromark-factory-label@2.0.1:
+ resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==}
+
+ micromark-factory-mdx-expression@2.0.3:
+ resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==}
+
+ micromark-factory-space@2.0.1:
+ resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==}
+
+ micromark-factory-title@2.0.1:
+ resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==}
+
+ micromark-factory-whitespace@2.0.1:
+ resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==}
+
+ micromark-util-character@2.1.1:
+ resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==}
+
+ micromark-util-chunked@2.0.1:
+ resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==}
+
+ micromark-util-classify-character@2.0.1:
+ resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==}
+
+ micromark-util-combine-extensions@2.0.1:
+ resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==}
+
+ micromark-util-decode-numeric-character-reference@2.0.2:
+ resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==}
+
+ micromark-util-decode-string@2.0.1:
+ resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==}
+
+ micromark-util-encode@2.0.1:
+ resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==}
+
+ micromark-util-events-to-acorn@2.0.3:
+ resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==}
+
+ micromark-util-html-tag-name@2.0.1:
+ resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==}
+
+ micromark-util-normalize-identifier@2.0.1:
+ resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==}
+
+ micromark-util-resolve-all@2.0.1:
+ resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==}
+
+ micromark-util-sanitize-uri@2.0.1:
+ resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==}
+
+ micromark-util-subtokenize@2.1.0:
+ resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==}
+
+ micromark-util-symbol@2.0.1:
+ resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==}
+
+ micromark-util-types@2.0.2:
+ resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==}
+
+ micromark@4.0.2:
+ resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==}
+
+ mrmime@2.0.1:
+ resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==}
+ engines: {node: '>=10'}
+
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ nanoid@3.3.11:
+ resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ neotraverse@0.6.18:
+ resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==}
+ engines: {node: '>= 10'}
+
+ nlcst-to-string@4.0.0:
+ resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==}
+
+ node-fetch-native@1.6.7:
+ resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==}
+
+ node-mock-http@1.0.4:
+ resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==}
+
+ normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+
+ nth-check@2.1.1:
+ resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+
+ ofetch@1.5.1:
+ resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==}
+
+ ohash@2.0.11:
+ resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==}
+
+ oniguruma-parser@0.12.1:
+ resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==}
+
+ oniguruma-to-es@4.3.5:
+ resolution: {integrity: sha512-Zjygswjpsewa0NLTsiizVuMQZbp0MDyM6lIt66OxsF21npUDlzpHi1Mgb/qhQdkb+dWFTzJmFbEWdvZgRho8eQ==}
+
+ p-limit@6.2.0:
+ resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==}
+ engines: {node: '>=18'}
+
+ p-queue@8.1.1:
+ resolution: {integrity: sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==}
+ engines: {node: '>=18'}
+
+ p-timeout@6.1.4:
+ resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==}
+ engines: {node: '>=14.16'}
+
+ package-manager-detector@1.6.0:
+ resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==}
+
+ pagefind@1.4.0:
+ resolution: {integrity: sha512-z2kY1mQlL4J8q5EIsQkLzQjilovKzfNVhX8De6oyE6uHpfFtyBaqUpcl/XzJC/4fjD8vBDyh1zolimIcVrCn9g==}
+ hasBin: true
+
+ parse-entities@4.0.2:
+ resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==}
+
+ parse-latin@7.0.0:
+ resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==}
+
+ parse5@7.3.0:
+ resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==}
+
+ piccolore@0.1.3:
+ resolution: {integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==}
+
+ picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+ picomatch@2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+
+ picomatch@4.0.3:
+ resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
+ engines: {node: '>=12'}
+
+ postcss-nested@6.2.0:
+ resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==}
+ engines: {node: '>=12.0'}
+ peerDependencies:
+ postcss: ^8.2.14
+
+ postcss-selector-parser@6.1.2:
+ resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
+ engines: {node: '>=4'}
+
+ postcss@8.5.8:
+ resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ prismjs@1.30.0:
+ resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==}
+ engines: {node: '>=6'}
+
+ prompts@2.4.2:
+ resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
+ engines: {node: '>= 6'}
+
+ property-information@7.1.0:
+ resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==}
+
+ radix3@1.1.2:
+ resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==}
+
+ readdirp@5.0.0:
+ resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==}
+ engines: {node: '>= 20.19.0'}
+
+ recma-build-jsx@1.0.0:
+ resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==}
+
+ recma-jsx@1.0.1:
+ resolution: {integrity: sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+ recma-parse@1.0.0:
+ resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==}
+
+ recma-stringify@1.0.0:
+ resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==}
+
+ regex-recursion@6.0.2:
+ resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==}
+
+ regex-utilities@2.3.0:
+ resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==}
+
+ regex@6.1.0:
+ resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==}
+
+ rehype-expressive-code@0.41.7:
+ resolution: {integrity: sha512-25f8ZMSF1d9CMscX7Cft0TSQIqdwjce2gDOvQ+d/w0FovsMwrSt3ODP4P3Z7wO1jsIJ4eYyaDRnIR/27bd/EMQ==}
+
+ rehype-format@5.0.1:
+ resolution: {integrity: sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==}
+
+ rehype-parse@9.0.1:
+ resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==}
+
+ rehype-raw@7.0.0:
+ resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==}
+
+ rehype-recma@1.0.0:
+ resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==}
+
+ rehype-stringify@10.0.1:
+ resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==}
+
+ rehype@13.0.2:
+ resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==}
+
+ remark-directive@3.0.1:
+ resolution: {integrity: sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==}
+
+ remark-gfm@4.0.1:
+ resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==}
+
+ remark-github-alerts@0.1.1:
+ resolution: {integrity: sha512-A0NLfeAuu76ymiGIoEoBcHmqlPcdLFq+FoCGiWlzu8vkyhscyDv+pAkMA9paGr+OHpzpFflZKnsqOCvMESG/Uw==}
+ peerDependencies:
+ '@types/mdast': ^4.0.0
+ unified: ^11.0.0
+
+ remark-mdx@3.1.1:
+ resolution: {integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==}
+
+ remark-parse@11.0.0:
+ resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==}
+
+ remark-rehype@11.1.2:
+ resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==}
+
+ remark-smartypants@3.0.2:
+ resolution: {integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==}
+ engines: {node: '>=16.0.0'}
+
+ remark-stringify@11.0.0:
+ resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==}
+
+ resolve-pkg-maps@1.0.0:
+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+
+ retext-latin@4.0.0:
+ resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==}
+
+ retext-smartypants@6.2.0:
+ resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==}
+
+ retext-stringify@4.0.0:
+ resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==}
+
+ retext@9.0.0:
+ resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==}
+
+ rollup@4.59.0:
+ resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+
+ sax@1.6.0:
+ resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==}
+ engines: {node: '>=11.0.0'}
+
+ semver@7.7.4:
+ resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ sharp@0.34.5:
+ resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+
+ shiki@3.23.0:
+ resolution: {integrity: sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==}
+
+ sisteransi@1.0.5:
+ resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
+
+ sitemap@9.0.1:
+ resolution: {integrity: sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ==}
+ engines: {node: '>=20.19.5', npm: '>=10.8.2'}
+ hasBin: true
+
+ smol-toml@1.6.0:
+ resolution: {integrity: sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==}
+ engines: {node: '>= 18'}
+
+ source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ engines: {node: '>=0.10.0'}
+
+ source-map@0.7.6:
+ resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==}
+ engines: {node: '>= 12'}
+
+ space-separated-tokens@2.0.2:
+ resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
+
+ stream-replace-string@2.0.0:
+ resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==}
+
+ string-width@4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+
+ string-width@7.2.0:
+ resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
+ engines: {node: '>=18'}
+
+ stringify-entities@4.0.4:
+ resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==}
+
+ strip-ansi@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+
+ strip-ansi@7.2.0:
+ resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==}
+ engines: {node: '>=12'}
+
+ style-to-js@1.1.21:
+ resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==}
+
+ style-to-object@1.0.14:
+ resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==}
+
+ svgo@4.0.1:
+ resolution: {integrity: sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==}
+ engines: {node: '>=16'}
+ hasBin: true
+
+ tiny-inflate@1.0.3:
+ resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==}
+
+ tinyexec@1.0.4:
+ resolution: {integrity: sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==}
+ engines: {node: '>=18'}
+
+ tinyglobby@0.2.15:
+ resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
+ engines: {node: '>=12.0.0'}
+
+ trim-lines@3.0.1:
+ resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
+
+ trough@2.2.0:
+ resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
+
+ tsconfck@3.1.6:
+ resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==}
+ engines: {node: ^18 || >=20}
+ hasBin: true
+ peerDependencies:
+ typescript: ^5.0.0
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+ tsx@4.21.0:
+ resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==}
+ engines: {node: '>=18.0.0'}
+ hasBin: true
+
+ type-fest@4.41.0:
+ resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==}
+ engines: {node: '>=16'}
+
+ typescript@5.9.3:
+ resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ ufo@1.6.3:
+ resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==}
+
+ ultrahtml@1.6.0:
+ resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==}
+
+ uncrypto@0.1.3:
+ resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==}
+
+ undici-types@6.21.0:
+ resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
+
+ undici-types@7.16.0:
+ resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
+
+ unified@11.0.5:
+ resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
+
+ unifont@0.7.4:
+ resolution: {integrity: sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg==}
+
+ unist-util-find-after@5.0.0:
+ resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==}
+
+ unist-util-is@6.0.1:
+ resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==}
+
+ unist-util-modify-children@4.0.0:
+ resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==}
+
+ unist-util-position-from-estree@2.0.0:
+ resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==}
+
+ unist-util-position@5.0.0:
+ resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==}
+
+ unist-util-remove-position@5.0.0:
+ resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==}
+
+ unist-util-stringify-position@4.0.0:
+ resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
+
+ unist-util-visit-children@3.0.0:
+ resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==}
+
+ unist-util-visit-parents@6.0.2:
+ resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==}
+
+ unist-util-visit@5.1.0:
+ resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==}
+
+ unstorage@1.17.4:
+ resolution: {integrity: sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==}
+ peerDependencies:
+ '@azure/app-configuration': ^1.8.0
+ '@azure/cosmos': ^4.2.0
+ '@azure/data-tables': ^13.3.0
+ '@azure/identity': ^4.6.0
+ '@azure/keyvault-secrets': ^4.9.0
+ '@azure/storage-blob': ^12.26.0
+ '@capacitor/preferences': ^6 || ^7 || ^8
+ '@deno/kv': '>=0.9.0'
+ '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0
+ '@planetscale/database': ^1.19.0
+ '@upstash/redis': ^1.34.3
+ '@vercel/blob': '>=0.27.1'
+ '@vercel/functions': ^2.2.12 || ^3.0.0
+ '@vercel/kv': ^1 || ^2 || ^3
+ aws4fetch: ^1.0.20
+ db0: '>=0.2.1'
+ idb-keyval: ^6.2.1
+ ioredis: ^5.4.2
+ uploadthing: ^7.4.4
+ peerDependenciesMeta:
+ '@azure/app-configuration':
+ optional: true
+ '@azure/cosmos':
+ optional: true
+ '@azure/data-tables':
+ optional: true
+ '@azure/identity':
+ optional: true
+ '@azure/keyvault-secrets':
+ optional: true
+ '@azure/storage-blob':
+ optional: true
+ '@capacitor/preferences':
+ optional: true
+ '@deno/kv':
+ optional: true
+ '@netlify/blobs':
+ optional: true
+ '@planetscale/database':
+ optional: true
+ '@upstash/redis':
+ optional: true
+ '@vercel/blob':
+ optional: true
+ '@vercel/functions':
+ optional: true
+ '@vercel/kv':
+ optional: true
+ aws4fetch:
+ optional: true
+ db0:
+ optional: true
+ idb-keyval:
+ optional: true
+ ioredis:
+ optional: true
+ uploadthing:
+ optional: true
+
+ util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+ vfile-location@5.0.3:
+ resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==}
+
+ vfile-message@4.0.3:
+ resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==}
+
+ vfile@6.0.3:
+ resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
+
+ vite@6.4.1:
+ resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==}
+ engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
+ jiti: '>=1.21.0'
+ less: '*'
+ lightningcss: ^1.21.0
+ sass: '*'
+ sass-embedded: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.16.0
+ tsx: ^4.8.1
+ yaml: ^2.4.2
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ jiti:
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ tsx:
+ optional: true
+ yaml:
+ optional: true
+
+ vitefu@1.1.2:
+ resolution: {integrity: sha512-zpKATdUbzbsycPFBN71nS2uzBUQiVnFoOrr2rvqv34S1lcAgMKKkjWleLGeiJlZ8lwCXvtWaRn7R3ZC16SYRuw==}
+ peerDependencies:
+ vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-beta.0
+ peerDependenciesMeta:
+ vite:
+ optional: true
+
+ web-namespaces@2.0.1:
+ resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==}
+
+ which-pm-runs@1.1.0:
+ resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==}
+ engines: {node: '>=4'}
+
+ widest-line@5.0.0:
+ resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==}
+ engines: {node: '>=18'}
+
+ wrap-ansi@9.0.2:
+ resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==}
+ engines: {node: '>=18'}
+
+ xxhash-wasm@1.1.0:
+ resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==}
+
+ yargs-parser@21.1.1:
+ resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+ engines: {node: '>=12'}
+
+ yocto-queue@1.2.2:
+ resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==}
+ engines: {node: '>=12.20'}
+
+ yocto-spinner@0.2.3:
+ resolution: {integrity: sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==}
+ engines: {node: '>=18.19'}
+
+ yoctocolors@2.1.2:
+ resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==}
+ engines: {node: '>=18'}
+
+ zod-to-json-schema@3.25.1:
+ resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==}
+ peerDependencies:
+ zod: ^3.25 || ^4
+
+ zod-to-ts@1.2.0:
+ resolution: {integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==}
+ peerDependencies:
+ typescript: ^4.9.4 || ^5.0.2
+ zod: ^3
+
+ zod@3.25.76:
+ resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==}
+
+ zod@4.3.6:
+ resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==}
+
+ zwitch@2.0.4:
+ resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
+
+snapshots:
+
+ '@astrojs/compiler@2.13.1': {}
+
+ '@astrojs/internal-helpers@0.7.6': {}
+
+ '@astrojs/markdown-remark@6.3.11':
+ dependencies:
+ '@astrojs/internal-helpers': 0.7.6
+ '@astrojs/prism': 3.3.0
+ github-slugger: 2.0.0
+ hast-util-from-html: 2.0.3
+ hast-util-to-text: 4.0.2
+ import-meta-resolve: 4.2.0
+ js-yaml: 4.1.1
+ mdast-util-definitions: 6.0.0
+ rehype-raw: 7.0.0
+ rehype-stringify: 10.0.1
+ remark-gfm: 4.0.1
+ remark-parse: 11.0.0
+ remark-rehype: 11.1.2
+ remark-smartypants: 3.0.2
+ shiki: 3.23.0
+ smol-toml: 1.6.0
+ unified: 11.0.5
+ unist-util-remove-position: 5.0.0
+ unist-util-visit: 5.1.0
+ unist-util-visit-parents: 6.0.2
+ vfile: 6.0.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@astrojs/mdx@4.3.14(astro@5.18.1(@types/node@22.19.15)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3))':
+ dependencies:
+ '@astrojs/markdown-remark': 6.3.11
+ '@mdx-js/mdx': 3.1.1
+ acorn: 8.16.0
+ astro: 5.18.1(@types/node@22.19.15)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)
+ es-module-lexer: 1.7.0
+ estree-util-visit: 2.0.0
+ hast-util-to-html: 9.0.5
+ piccolore: 0.1.3
+ rehype-raw: 7.0.0
+ remark-gfm: 4.0.1
+ remark-smartypants: 3.0.2
+ source-map: 0.7.6
+ unist-util-visit: 5.1.0
+ vfile: 6.0.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@astrojs/prism@3.3.0':
+ dependencies:
+ prismjs: 1.30.0
+
+ '@astrojs/sitemap@3.7.1':
+ dependencies:
+ sitemap: 9.0.1
+ stream-replace-string: 2.0.0
+ zod: 4.3.6
+
+ '@astrojs/starlight@0.37.7(astro@5.18.1(@types/node@22.19.15)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3))':
+ dependencies:
+ '@astrojs/markdown-remark': 6.3.11
+ '@astrojs/mdx': 4.3.14(astro@5.18.1(@types/node@22.19.15)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3))
+ '@astrojs/sitemap': 3.7.1
+ '@pagefind/default-ui': 1.4.0
+ '@types/hast': 3.0.4
+ '@types/js-yaml': 4.0.9
+ '@types/mdast': 4.0.4
+ astro: 5.18.1(@types/node@22.19.15)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)
+ astro-expressive-code: 0.41.7(astro@5.18.1(@types/node@22.19.15)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3))
+ bcp-47: 2.1.0
+ hast-util-from-html: 2.0.3
+ hast-util-select: 6.0.4
+ hast-util-to-string: 3.0.1
+ hastscript: 9.0.1
+ i18next: 23.16.8
+ js-yaml: 4.1.1
+ klona: 2.0.6
+ magic-string: 0.30.21
+ mdast-util-directive: 3.1.0
+ mdast-util-to-markdown: 2.1.2
+ mdast-util-to-string: 4.0.0
+ pagefind: 1.4.0
+ rehype: 13.0.2
+ rehype-format: 5.0.1
+ remark-directive: 3.0.1
+ ultrahtml: 1.6.0
+ unified: 11.0.5
+ unist-util-visit: 5.1.0
+ vfile: 6.0.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@astrojs/telemetry@3.3.0':
+ dependencies:
+ ci-info: 4.4.0
+ debug: 4.4.3
+ dlv: 1.1.3
+ dset: 3.1.4
+ is-docker: 3.0.0
+ is-wsl: 3.1.1
+ which-pm-runs: 1.1.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-string-parser@7.27.1': {}
+
+ '@babel/helper-validator-identifier@7.28.5': {}
+
+ '@babel/parser@7.29.2':
+ dependencies:
+ '@babel/types': 7.29.0
+
+ '@babel/runtime@7.29.2': {}
+
+ '@babel/types@7.29.0':
+ dependencies:
+ '@babel/helper-string-parser': 7.27.1
+ '@babel/helper-validator-identifier': 7.28.5
+
+ '@capsizecss/unpack@4.0.0':
+ dependencies:
+ fontkitten: 1.0.3
+
+ '@ctrl/tinycolor@4.2.0': {}
+
+ '@emnapi/runtime@1.9.0':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@esbuild/aix-ppc64@0.25.12':
+ optional: true
+
+ '@esbuild/aix-ppc64@0.27.4':
+ optional: true
+
+ '@esbuild/android-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/android-arm64@0.27.4':
+ optional: true
+
+ '@esbuild/android-arm@0.25.12':
+ optional: true
+
+ '@esbuild/android-arm@0.27.4':
+ optional: true
+
+ '@esbuild/android-x64@0.25.12':
+ optional: true
+
+ '@esbuild/android-x64@0.27.4':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.27.4':
+ optional: true
+
+ '@esbuild/darwin-x64@0.25.12':
+ optional: true
+
+ '@esbuild/darwin-x64@0.27.4':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.27.4':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.25.12':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.27.4':
+ optional: true
+
+ '@esbuild/linux-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-arm64@0.27.4':
+ optional: true
+
+ '@esbuild/linux-arm@0.25.12':
+ optional: true
+
+ '@esbuild/linux-arm@0.27.4':
+ optional: true
+
+ '@esbuild/linux-ia32@0.25.12':
+ optional: true
+
+ '@esbuild/linux-ia32@0.27.4':
+ optional: true
+
+ '@esbuild/linux-loong64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-loong64@0.27.4':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.25.12':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.27.4':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.27.4':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.27.4':
+ optional: true
+
+ '@esbuild/linux-s390x@0.25.12':
+ optional: true
+
+ '@esbuild/linux-s390x@0.27.4':
+ optional: true
+
+ '@esbuild/linux-x64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-x64@0.27.4':
+ optional: true
+
+ '@esbuild/netbsd-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/netbsd-arm64@0.27.4':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.25.12':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.27.4':
+ optional: true
+
+ '@esbuild/openbsd-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/openbsd-arm64@0.27.4':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.25.12':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.27.4':
+ optional: true
+
+ '@esbuild/openharmony-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/openharmony-arm64@0.27.4':
+ optional: true
+
+ '@esbuild/sunos-x64@0.25.12':
+ optional: true
+
+ '@esbuild/sunos-x64@0.27.4':
+ optional: true
+
+ '@esbuild/win32-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/win32-arm64@0.27.4':
+ optional: true
+
+ '@esbuild/win32-ia32@0.25.12':
+ optional: true
+
+ '@esbuild/win32-ia32@0.27.4':
+ optional: true
+
+ '@esbuild/win32-x64@0.25.12':
+ optional: true
+
+ '@esbuild/win32-x64@0.27.4':
+ optional: true
+
+ '@expressive-code/core@0.41.7':
+ dependencies:
+ '@ctrl/tinycolor': 4.2.0
+ hast-util-select: 6.0.4
+ hast-util-to-html: 9.0.5
+ hast-util-to-text: 4.0.2
+ hastscript: 9.0.1
+ postcss: 8.5.8
+ postcss-nested: 6.2.0(postcss@8.5.8)
+ unist-util-visit: 5.1.0
+ unist-util-visit-parents: 6.0.2
+
+ '@expressive-code/plugin-frames@0.41.7':
+ dependencies:
+ '@expressive-code/core': 0.41.7
+
+ '@expressive-code/plugin-shiki@0.41.7':
+ dependencies:
+ '@expressive-code/core': 0.41.7
+ shiki: 3.23.0
+
+ '@expressive-code/plugin-text-markers@0.41.7':
+ dependencies:
+ '@expressive-code/core': 0.41.7
+
+ '@img/colour@1.1.0': {}
+
+ '@img/sharp-darwin-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-arm64': 1.2.4
+ optional: true
+
+ '@img/sharp-darwin-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-x64': 1.2.4
+ optional: true
+
+ '@img/sharp-libvips-darwin-arm64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-darwin-x64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-ppc64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-riscv64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-s390x@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-x64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-x64@1.2.4':
+ optional: true
+
+ '@img/sharp-linux-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm64': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-arm@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-ppc64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-ppc64': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-riscv64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-riscv64': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-s390x@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-s390x': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-x64': 1.2.4
+ optional: true
+
+ '@img/sharp-linuxmusl-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-arm64': 1.2.4
+ optional: true
+
+ '@img/sharp-linuxmusl-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-x64': 1.2.4
+ optional: true
+
+ '@img/sharp-wasm32@0.34.5':
+ dependencies:
+ '@emnapi/runtime': 1.9.0
+ optional: true
+
+ '@img/sharp-win32-arm64@0.34.5':
+ optional: true
+
+ '@img/sharp-win32-ia32@0.34.5':
+ optional: true
+
+ '@img/sharp-win32-x64@0.34.5':
+ optional: true
+
+ '@jridgewell/sourcemap-codec@1.5.5': {}
+
+ '@mdx-js/mdx@3.1.1':
+ dependencies:
+ '@types/estree': 1.0.8
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdx': 2.0.13
+ acorn: 8.16.0
+ collapse-white-space: 2.1.0
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ estree-util-scope: 1.0.0
+ estree-walker: 3.0.3
+ hast-util-to-jsx-runtime: 2.3.6
+ markdown-extensions: 2.0.0
+ recma-build-jsx: 1.0.0
+ recma-jsx: 1.0.1(acorn@8.16.0)
+ recma-stringify: 1.0.0
+ rehype-recma: 1.0.0
+ remark-mdx: 3.1.1
+ remark-parse: 11.0.0
+ remark-rehype: 11.1.2
+ source-map: 0.7.6
+ unified: 11.0.5
+ unist-util-position-from-estree: 2.0.0
+ unist-util-stringify-position: 4.0.0
+ unist-util-visit: 5.1.0
+ vfile: 6.0.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@oslojs/encoding@1.1.0': {}
+
+ '@pagefind/darwin-arm64@1.4.0':
+ optional: true
+
+ '@pagefind/darwin-x64@1.4.0':
+ optional: true
+
+ '@pagefind/default-ui@1.4.0': {}
+
+ '@pagefind/freebsd-x64@1.4.0':
+ optional: true
+
+ '@pagefind/linux-arm64@1.4.0':
+ optional: true
+
+ '@pagefind/linux-x64@1.4.0':
+ optional: true
+
+ '@pagefind/windows-x64@1.4.0':
+ optional: true
+
+ '@rollup/pluginutils@5.3.0(rollup@4.59.0)':
+ dependencies:
+ '@types/estree': 1.0.8
+ estree-walker: 2.0.2
+ picomatch: 4.0.3
+ optionalDependencies:
+ rollup: 4.59.0
+
+ '@rollup/rollup-android-arm-eabi@4.59.0':
+ optional: true
+
+ '@rollup/rollup-android-arm64@4.59.0':
+ optional: true
+
+ '@rollup/rollup-darwin-arm64@4.59.0':
+ optional: true
+
+ '@rollup/rollup-darwin-x64@4.59.0':
+ optional: true
+
+ '@rollup/rollup-freebsd-arm64@4.59.0':
+ optional: true
+
+ '@rollup/rollup-freebsd-x64@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-arm-musleabihf@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-gnu@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-musl@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-loong64-gnu@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-loong64-musl@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-ppc64-gnu@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-ppc64-musl@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-gnu@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-musl@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-s390x-gnu@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-x64-gnu@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-x64-musl@4.59.0':
+ optional: true
+
+ '@rollup/rollup-openbsd-x64@4.59.0':
+ optional: true
+
+ '@rollup/rollup-openharmony-arm64@4.59.0':
+ optional: true
+
+ '@rollup/rollup-win32-arm64-msvc@4.59.0':
+ optional: true
+
+ '@rollup/rollup-win32-ia32-msvc@4.59.0':
+ optional: true
+
+ '@rollup/rollup-win32-x64-gnu@4.59.0':
+ optional: true
+
+ '@rollup/rollup-win32-x64-msvc@4.59.0':
+ optional: true
+
+ '@shikijs/core@3.23.0':
+ dependencies:
+ '@shikijs/types': 3.23.0
+ '@shikijs/vscode-textmate': 10.0.2
+ '@types/hast': 3.0.4
+ hast-util-to-html: 9.0.5
+
+ '@shikijs/engine-javascript@3.23.0':
+ dependencies:
+ '@shikijs/types': 3.23.0
+ '@shikijs/vscode-textmate': 10.0.2
+ oniguruma-to-es: 4.3.5
+
+ '@shikijs/engine-oniguruma@3.23.0':
+ dependencies:
+ '@shikijs/types': 3.23.0
+ '@shikijs/vscode-textmate': 10.0.2
+
+ '@shikijs/langs@3.23.0':
+ dependencies:
+ '@shikijs/types': 3.23.0
+
+ '@shikijs/themes@3.23.0':
+ dependencies:
+ '@shikijs/types': 3.23.0
+
+ '@shikijs/types@3.23.0':
+ dependencies:
+ '@shikijs/vscode-textmate': 10.0.2
+ '@types/hast': 3.0.4
+
+ '@shikijs/vscode-textmate@10.0.2': {}
+
+ '@types/debug@4.1.12':
+ dependencies:
+ '@types/ms': 2.1.0
+
+ '@types/estree-jsx@1.0.5':
+ dependencies:
+ '@types/estree': 1.0.8
+
+ '@types/estree@1.0.8': {}
+
+ '@types/hast@3.0.4':
+ dependencies:
+ '@types/unist': 3.0.3
+
+ '@types/js-yaml@4.0.9': {}
+
+ '@types/mdast@4.0.4':
+ dependencies:
+ '@types/unist': 3.0.3
+
+ '@types/mdx@2.0.13': {}
+
+ '@types/ms@2.1.0': {}
+
+ '@types/nlcst@2.0.3':
+ dependencies:
+ '@types/unist': 3.0.3
+
+ '@types/node@22.19.15':
+ dependencies:
+ undici-types: 6.21.0
+
+ '@types/node@24.12.0':
+ dependencies:
+ undici-types: 7.16.0
+
+ '@types/sax@1.2.7':
+ dependencies:
+ '@types/node': 22.19.15
+
+ '@types/unist@2.0.11': {}
+
+ '@types/unist@3.0.3': {}
+
+ '@ungap/structured-clone@1.3.0': {}
+
+ acorn-jsx@5.3.2(acorn@8.16.0):
+ dependencies:
+ acorn: 8.16.0
+
+ acorn@8.16.0: {}
+
+ ansi-align@3.0.1:
+ dependencies:
+ string-width: 4.2.3
+
+ ansi-regex@5.0.1: {}
+
+ ansi-regex@6.2.2: {}
+
+ ansi-styles@6.2.3: {}
+
+ anymatch@3.1.3:
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
+
+ arg@5.0.2: {}
+
+ argparse@2.0.1: {}
+
+ aria-query@5.3.2: {}
+
+ array-iterate@2.0.1: {}
+
+ astring@1.9.0: {}
+
+ astro-expressive-code@0.41.7(astro@5.18.1(@types/node@22.19.15)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)):
+ dependencies:
+ astro: 5.18.1(@types/node@22.19.15)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)
+ rehype-expressive-code: 0.41.7
+
+ astro@5.18.1(@types/node@22.19.15)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3):
+ dependencies:
+ '@astrojs/compiler': 2.13.1
+ '@astrojs/internal-helpers': 0.7.6
+ '@astrojs/markdown-remark': 6.3.11
+ '@astrojs/telemetry': 3.3.0
+ '@capsizecss/unpack': 4.0.0
+ '@oslojs/encoding': 1.1.0
+ '@rollup/pluginutils': 5.3.0(rollup@4.59.0)
+ acorn: 8.16.0
+ aria-query: 5.3.2
+ axobject-query: 4.1.0
+ boxen: 8.0.1
+ ci-info: 4.4.0
+ clsx: 2.1.1
+ common-ancestor-path: 1.0.1
+ cookie: 1.1.1
+ cssesc: 3.0.0
+ debug: 4.4.3
+ deterministic-object-hash: 2.0.2
+ devalue: 5.6.4
+ diff: 8.0.3
+ dlv: 1.1.3
+ dset: 3.1.4
+ es-module-lexer: 1.7.0
+ esbuild: 0.27.4
+ estree-walker: 3.0.3
+ flattie: 1.1.1
+ fontace: 0.4.1
+ github-slugger: 2.0.0
+ html-escaper: 3.0.3
+ http-cache-semantics: 4.2.0
+ import-meta-resolve: 4.2.0
+ js-yaml: 4.1.1
+ magic-string: 0.30.21
+ magicast: 0.5.2
+ mrmime: 2.0.1
+ neotraverse: 0.6.18
+ p-limit: 6.2.0
+ p-queue: 8.1.1
+ package-manager-detector: 1.6.0
+ piccolore: 0.1.3
+ picomatch: 4.0.3
+ prompts: 2.4.2
+ rehype: 13.0.2
+ semver: 7.7.4
+ shiki: 3.23.0
+ smol-toml: 1.6.0
+ svgo: 4.0.1
+ tinyexec: 1.0.4
+ tinyglobby: 0.2.15
+ tsconfck: 3.1.6(typescript@5.9.3)
+ ultrahtml: 1.6.0
+ unifont: 0.7.4
+ unist-util-visit: 5.1.0
+ unstorage: 1.17.4
+ vfile: 6.0.3
+ vite: 6.4.1(@types/node@22.19.15)(tsx@4.21.0)
+ vitefu: 1.1.2(vite@6.4.1(@types/node@22.19.15)(tsx@4.21.0))
+ xxhash-wasm: 1.1.0
+ yargs-parser: 21.1.1
+ yocto-spinner: 0.2.3
+ zod: 3.25.76
+ zod-to-json-schema: 3.25.1(zod@3.25.76)
+ zod-to-ts: 1.2.0(typescript@5.9.3)(zod@3.25.76)
+ optionalDependencies:
+ sharp: 0.34.5
+ transitivePeerDependencies:
+ - '@azure/app-configuration'
+ - '@azure/cosmos'
+ - '@azure/data-tables'
+ - '@azure/identity'
+ - '@azure/keyvault-secrets'
+ - '@azure/storage-blob'
+ - '@capacitor/preferences'
+ - '@deno/kv'
+ - '@netlify/blobs'
+ - '@planetscale/database'
+ - '@types/node'
+ - '@upstash/redis'
+ - '@vercel/blob'
+ - '@vercel/functions'
+ - '@vercel/kv'
+ - aws4fetch
+ - db0
+ - idb-keyval
+ - ioredis
+ - jiti
+ - less
+ - lightningcss
+ - rollup
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ - tsx
+ - typescript
+ - uploadthing
+ - yaml
+
+ axobject-query@4.1.0: {}
+
+ bail@2.0.2: {}
+
+ base-64@1.0.0: {}
+
+ bcp-47-match@2.0.3: {}
+
+ bcp-47@2.1.0:
+ dependencies:
+ is-alphabetical: 2.0.1
+ is-alphanumerical: 2.0.1
+ is-decimal: 2.0.1
+
+ boolbase@1.0.0: {}
+
+ boxen@8.0.1:
+ dependencies:
+ ansi-align: 3.0.1
+ camelcase: 8.0.0
+ chalk: 5.6.2
+ cli-boxes: 3.0.0
+ string-width: 7.2.0
+ type-fest: 4.41.0
+ widest-line: 5.0.0
+ wrap-ansi: 9.0.2
+
+ camelcase@8.0.0: {}
+
+ ccount@2.0.1: {}
+
+ chalk@5.6.2: {}
+
+ character-entities-html4@2.1.0: {}
+
+ character-entities-legacy@3.0.0: {}
+
+ character-entities@2.0.2: {}
+
+ character-reference-invalid@2.0.1: {}
+
+ chokidar@5.0.0:
+ dependencies:
+ readdirp: 5.0.0
+
+ ci-info@4.4.0: {}
+
+ cli-boxes@3.0.0: {}
+
+ clsx@2.1.1: {}
+
+ collapse-white-space@2.1.0: {}
+
+ comma-separated-tokens@2.0.3: {}
+
+ commander@11.1.0: {}
+
+ common-ancestor-path@1.0.1: {}
+
+ cookie-es@1.2.2: {}
+
+ cookie@1.1.1: {}
+
+ crossws@0.3.5:
+ dependencies:
+ uncrypto: 0.1.3
+
+ css-select@5.2.2:
+ dependencies:
+ boolbase: 1.0.0
+ css-what: 6.2.2
+ domhandler: 5.0.3
+ domutils: 3.2.2
+ nth-check: 2.1.1
+
+ css-selector-parser@3.3.0: {}
+
+ css-tree@2.2.1:
+ dependencies:
+ mdn-data: 2.0.28
+ source-map-js: 1.2.1
+
+ css-tree@3.2.1:
+ dependencies:
+ mdn-data: 2.27.1
+ source-map-js: 1.2.1
+
+ css-what@6.2.2: {}
+
+ cssesc@3.0.0: {}
+
+ csso@5.0.5:
+ dependencies:
+ css-tree: 2.2.1
+
+ debug@4.4.3:
+ dependencies:
+ ms: 2.1.3
+
+ decode-named-character-reference@1.3.0:
+ dependencies:
+ character-entities: 2.0.2
+
+ defu@6.1.4: {}
+
+ dequal@2.0.3: {}
+
+ destr@2.0.5: {}
+
+ detect-libc@2.1.2: {}
+
+ deterministic-object-hash@2.0.2:
+ dependencies:
+ base-64: 1.0.0
+
+ devalue@5.6.4: {}
+
+ devlop@1.1.0:
+ dependencies:
+ dequal: 2.0.3
+
+ diff@8.0.3: {}
+
+ direction@2.0.1: {}
+
+ dlv@1.1.3: {}
+
+ dom-serializer@2.0.0:
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ entities: 4.5.0
+
+ domelementtype@2.3.0: {}
+
+ domhandler@5.0.3:
+ dependencies:
+ domelementtype: 2.3.0
+
+ domutils@3.2.2:
+ dependencies:
+ dom-serializer: 2.0.0
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+
+ dset@3.1.4: {}
+
+ emoji-regex@10.6.0: {}
+
+ emoji-regex@8.0.0: {}
+
+ entities@4.5.0: {}
+
+ entities@6.0.1: {}
+
+ es-module-lexer@1.7.0: {}
+
+ esast-util-from-estree@2.0.0:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ devlop: 1.1.0
+ estree-util-visit: 2.0.0
+ unist-util-position-from-estree: 2.0.0
+
+ esast-util-from-js@2.0.1:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ acorn: 8.16.0
+ esast-util-from-estree: 2.0.0
+ vfile-message: 4.0.3
+
+ esbuild@0.25.12:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.25.12
+ '@esbuild/android-arm': 0.25.12
+ '@esbuild/android-arm64': 0.25.12
+ '@esbuild/android-x64': 0.25.12
+ '@esbuild/darwin-arm64': 0.25.12
+ '@esbuild/darwin-x64': 0.25.12
+ '@esbuild/freebsd-arm64': 0.25.12
+ '@esbuild/freebsd-x64': 0.25.12
+ '@esbuild/linux-arm': 0.25.12
+ '@esbuild/linux-arm64': 0.25.12
+ '@esbuild/linux-ia32': 0.25.12
+ '@esbuild/linux-loong64': 0.25.12
+ '@esbuild/linux-mips64el': 0.25.12
+ '@esbuild/linux-ppc64': 0.25.12
+ '@esbuild/linux-riscv64': 0.25.12
+ '@esbuild/linux-s390x': 0.25.12
+ '@esbuild/linux-x64': 0.25.12
+ '@esbuild/netbsd-arm64': 0.25.12
+ '@esbuild/netbsd-x64': 0.25.12
+ '@esbuild/openbsd-arm64': 0.25.12
+ '@esbuild/openbsd-x64': 0.25.12
+ '@esbuild/openharmony-arm64': 0.25.12
+ '@esbuild/sunos-x64': 0.25.12
+ '@esbuild/win32-arm64': 0.25.12
+ '@esbuild/win32-ia32': 0.25.12
+ '@esbuild/win32-x64': 0.25.12
+
+ esbuild@0.27.4:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.27.4
+ '@esbuild/android-arm': 0.27.4
+ '@esbuild/android-arm64': 0.27.4
+ '@esbuild/android-x64': 0.27.4
+ '@esbuild/darwin-arm64': 0.27.4
+ '@esbuild/darwin-x64': 0.27.4
+ '@esbuild/freebsd-arm64': 0.27.4
+ '@esbuild/freebsd-x64': 0.27.4
+ '@esbuild/linux-arm': 0.27.4
+ '@esbuild/linux-arm64': 0.27.4
+ '@esbuild/linux-ia32': 0.27.4
+ '@esbuild/linux-loong64': 0.27.4
+ '@esbuild/linux-mips64el': 0.27.4
+ '@esbuild/linux-ppc64': 0.27.4
+ '@esbuild/linux-riscv64': 0.27.4
+ '@esbuild/linux-s390x': 0.27.4
+ '@esbuild/linux-x64': 0.27.4
+ '@esbuild/netbsd-arm64': 0.27.4
+ '@esbuild/netbsd-x64': 0.27.4
+ '@esbuild/openbsd-arm64': 0.27.4
+ '@esbuild/openbsd-x64': 0.27.4
+ '@esbuild/openharmony-arm64': 0.27.4
+ '@esbuild/sunos-x64': 0.27.4
+ '@esbuild/win32-arm64': 0.27.4
+ '@esbuild/win32-ia32': 0.27.4
+ '@esbuild/win32-x64': 0.27.4
+
+ escape-string-regexp@5.0.0: {}
+
+ estree-util-attach-comments@3.0.0:
+ dependencies:
+ '@types/estree': 1.0.8
+
+ estree-util-build-jsx@3.0.1:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ estree-walker: 3.0.3
+
+ estree-util-is-identifier-name@3.0.0: {}
+
+ estree-util-scope@1.0.0:
+ dependencies:
+ '@types/estree': 1.0.8
+ devlop: 1.1.0
+
+ estree-util-to-js@2.0.0:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ astring: 1.9.0
+ source-map: 0.7.6
+
+ estree-util-visit@2.0.0:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/unist': 3.0.3
+
+ estree-walker@2.0.2: {}
+
+ estree-walker@3.0.3:
+ dependencies:
+ '@types/estree': 1.0.8
+
+ eventemitter3@5.0.4: {}
+
+ expressive-code@0.41.7:
+ dependencies:
+ '@expressive-code/core': 0.41.7
+ '@expressive-code/plugin-frames': 0.41.7
+ '@expressive-code/plugin-shiki': 0.41.7
+ '@expressive-code/plugin-text-markers': 0.41.7
+
+ extend@3.0.2: {}
+
+ fdir@6.5.0(picomatch@4.0.3):
+ optionalDependencies:
+ picomatch: 4.0.3
+
+ flattie@1.1.1: {}
+
+ fontace@0.4.1:
+ dependencies:
+ fontkitten: 1.0.3
+
+ fontkitten@1.0.3:
+ dependencies:
+ tiny-inflate: 1.0.3
+
+ fsevents@2.3.3:
+ optional: true
+
+ get-east-asian-width@1.5.0: {}
+
+ get-tsconfig@4.13.6:
+ dependencies:
+ resolve-pkg-maps: 1.0.0
+
+ github-slugger@2.0.0: {}
+
+ h3@1.15.6:
+ dependencies:
+ cookie-es: 1.2.2
+ crossws: 0.3.5
+ defu: 6.1.4
+ destr: 2.0.5
+ iron-webcrypto: 1.2.1
+ node-mock-http: 1.0.4
+ radix3: 1.1.2
+ ufo: 1.6.3
+ uncrypto: 0.1.3
+
+ hast-util-embedded@3.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-is-element: 3.0.0
+
+ hast-util-format@1.1.0:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-embedded: 3.0.0
+ hast-util-minify-whitespace: 1.0.1
+ hast-util-phrasing: 3.0.1
+ hast-util-whitespace: 3.0.0
+ html-whitespace-sensitive-tag-names: 3.0.1
+ unist-util-visit-parents: 6.0.2
+
+ hast-util-from-html@2.0.3:
+ dependencies:
+ '@types/hast': 3.0.4
+ devlop: 1.1.0
+ hast-util-from-parse5: 8.0.3
+ parse5: 7.3.0
+ vfile: 6.0.3
+ vfile-message: 4.0.3
+
+ hast-util-from-parse5@8.0.3:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ devlop: 1.1.0
+ hastscript: 9.0.1
+ property-information: 7.1.0
+ vfile: 6.0.3
+ vfile-location: 5.0.3
+ web-namespaces: 2.0.1
+
+ hast-util-has-property@3.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+
+ hast-util-is-body-ok-link@3.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+
+ hast-util-is-element@3.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+
+ hast-util-minify-whitespace@1.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-embedded: 3.0.0
+ hast-util-is-element: 3.0.0
+ hast-util-whitespace: 3.0.0
+ unist-util-is: 6.0.1
+
+ hast-util-parse-selector@4.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+
+ hast-util-phrasing@3.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-embedded: 3.0.0
+ hast-util-has-property: 3.0.0
+ hast-util-is-body-ok-link: 3.0.1
+ hast-util-is-element: 3.0.0
+
+ hast-util-raw@9.1.0:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ '@ungap/structured-clone': 1.3.0
+ hast-util-from-parse5: 8.0.3
+ hast-util-to-parse5: 8.0.1
+ html-void-elements: 3.0.0
+ mdast-util-to-hast: 13.2.1
+ parse5: 7.3.0
+ unist-util-position: 5.0.0
+ unist-util-visit: 5.1.0
+ vfile: 6.0.3
+ web-namespaces: 2.0.1
+ zwitch: 2.0.4
+
+ hast-util-select@6.0.4:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ bcp-47-match: 2.0.3
+ comma-separated-tokens: 2.0.3
+ css-selector-parser: 3.3.0
+ devlop: 1.1.0
+ direction: 2.0.1
+ hast-util-has-property: 3.0.0
+ hast-util-to-string: 3.0.1
+ hast-util-whitespace: 3.0.0
+ nth-check: 2.1.1
+ property-information: 7.1.0
+ space-separated-tokens: 2.0.2
+ unist-util-visit: 5.1.0
+ zwitch: 2.0.4
+
+ hast-util-to-estree@3.1.3:
+ dependencies:
+ '@types/estree': 1.0.8
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ comma-separated-tokens: 2.0.3
+ devlop: 1.1.0
+ estree-util-attach-comments: 3.0.0
+ estree-util-is-identifier-name: 3.0.0
+ hast-util-whitespace: 3.0.0
+ mdast-util-mdx-expression: 2.0.1
+ mdast-util-mdx-jsx: 3.2.0
+ mdast-util-mdxjs-esm: 2.0.1
+ property-information: 7.1.0
+ space-separated-tokens: 2.0.2
+ style-to-js: 1.1.21
+ unist-util-position: 5.0.0
+ zwitch: 2.0.4
+ transitivePeerDependencies:
+ - supports-color
+
+ hast-util-to-html@9.0.5:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ ccount: 2.0.1
+ comma-separated-tokens: 2.0.3
+ hast-util-whitespace: 3.0.0
+ html-void-elements: 3.0.0
+ mdast-util-to-hast: 13.2.1
+ property-information: 7.1.0
+ space-separated-tokens: 2.0.2
+ stringify-entities: 4.0.4
+ zwitch: 2.0.4
+
+ hast-util-to-jsx-runtime@2.3.6:
+ dependencies:
+ '@types/estree': 1.0.8
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ comma-separated-tokens: 2.0.3
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ hast-util-whitespace: 3.0.0
+ mdast-util-mdx-expression: 2.0.1
+ mdast-util-mdx-jsx: 3.2.0
+ mdast-util-mdxjs-esm: 2.0.1
+ property-information: 7.1.0
+ space-separated-tokens: 2.0.2
+ style-to-js: 1.1.21
+ unist-util-position: 5.0.0
+ vfile-message: 4.0.3
+ transitivePeerDependencies:
+ - supports-color
+
+ hast-util-to-parse5@8.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ comma-separated-tokens: 2.0.3
+ devlop: 1.1.0
+ property-information: 7.1.0
+ space-separated-tokens: 2.0.2
+ web-namespaces: 2.0.1
+ zwitch: 2.0.4
+
+ hast-util-to-string@3.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+
+ hast-util-to-text@4.0.2:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ hast-util-is-element: 3.0.0
+ unist-util-find-after: 5.0.0
+
+ hast-util-whitespace@3.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+
+ hastscript@9.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ comma-separated-tokens: 2.0.3
+ hast-util-parse-selector: 4.0.0
+ property-information: 7.1.0
+ space-separated-tokens: 2.0.2
+
+ html-escaper@3.0.3: {}
+
+ html-void-elements@3.0.0: {}
+
+ html-whitespace-sensitive-tag-names@3.0.1: {}
+
+ http-cache-semantics@4.2.0: {}
+
+ i18next@23.16.8:
+ dependencies:
+ '@babel/runtime': 7.29.2
+
+ import-meta-resolve@4.2.0: {}
+
+ inline-style-parser@0.2.7: {}
+
+ iron-webcrypto@1.2.1: {}
+
+ is-alphabetical@2.0.1: {}
+
+ is-alphanumerical@2.0.1:
+ dependencies:
+ is-alphabetical: 2.0.1
+ is-decimal: 2.0.1
+
+ is-decimal@2.0.1: {}
+
+ is-docker@3.0.0: {}
+
+ is-fullwidth-code-point@3.0.0: {}
+
+ is-hexadecimal@2.0.1: {}
+
+ is-inside-container@1.0.0:
+ dependencies:
+ is-docker: 3.0.0
+
+ is-plain-obj@4.1.0: {}
+
+ is-wsl@3.1.1:
+ dependencies:
+ is-inside-container: 1.0.0
+
+ js-yaml@4.1.1:
+ dependencies:
+ argparse: 2.0.1
+
+ kleur@3.0.3: {}
+
+ klona@2.0.6: {}
+
+ longest-streak@3.1.0: {}
+
+ lru-cache@11.2.7: {}
+
+ magic-string@0.30.21:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ magicast@0.5.2:
+ dependencies:
+ '@babel/parser': 7.29.2
+ '@babel/types': 7.29.0
+ source-map-js: 1.2.1
+
+ markdown-extensions@2.0.0: {}
+
+ markdown-table@3.0.4: {}
+
+ mdast-util-definitions@6.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ unist-util-visit: 5.1.0
+
+ mdast-util-directive@3.1.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ ccount: 2.0.1
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-to-markdown: 2.1.2
+ parse-entities: 4.0.2
+ stringify-entities: 4.0.4
+ unist-util-visit-parents: 6.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-find-and-replace@3.0.2:
+ dependencies:
+ '@types/mdast': 4.0.4
+ escape-string-regexp: 5.0.0
+ unist-util-is: 6.0.1
+ unist-util-visit-parents: 6.0.2
+
+ mdast-util-from-markdown@2.0.3:
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ decode-named-character-reference: 1.3.0
+ devlop: 1.1.0
+ mdast-util-to-string: 4.0.0
+ micromark: 4.0.2
+ micromark-util-decode-numeric-character-reference: 2.0.2
+ micromark-util-decode-string: 2.0.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ unist-util-stringify-position: 4.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-autolink-literal@2.0.1:
+ dependencies:
+ '@types/mdast': 4.0.4
+ ccount: 2.0.1
+ devlop: 1.1.0
+ mdast-util-find-and-replace: 3.0.2
+ micromark-util-character: 2.1.1
+
+ mdast-util-gfm-footnote@2.1.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-to-markdown: 2.1.2
+ micromark-util-normalize-identifier: 2.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-strikethrough@2.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-table@2.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ markdown-table: 3.0.4
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-task-list-item@2.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm@3.1.0:
+ dependencies:
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-gfm-autolink-literal: 2.0.1
+ mdast-util-gfm-footnote: 2.1.0
+ mdast-util-gfm-strikethrough: 2.0.0
+ mdast-util-gfm-table: 2.0.0
+ mdast-util-gfm-task-list-item: 2.0.0
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-mdx-expression@2.0.1:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-mdx-jsx@3.2.0:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ ccount: 2.0.1
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-to-markdown: 2.1.2
+ parse-entities: 4.0.2
+ stringify-entities: 4.0.4
+ unist-util-stringify-position: 4.0.0
+ vfile-message: 4.0.3
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-mdx@3.0.0:
+ dependencies:
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-mdx-expression: 2.0.1
+ mdast-util-mdx-jsx: 3.2.0
+ mdast-util-mdxjs-esm: 2.0.1
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-mdxjs-esm@2.0.1:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-phrasing@4.1.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ unist-util-is: 6.0.1
+
+ mdast-util-to-hast@13.2.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ '@ungap/structured-clone': 1.3.0
+ devlop: 1.1.0
+ micromark-util-sanitize-uri: 2.0.1
+ trim-lines: 3.0.1
+ unist-util-position: 5.0.0
+ unist-util-visit: 5.1.0
+ vfile: 6.0.3
+
+ mdast-util-to-markdown@2.1.2:
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ longest-streak: 3.1.0
+ mdast-util-phrasing: 4.1.0
+ mdast-util-to-string: 4.0.0
+ micromark-util-classify-character: 2.0.1
+ micromark-util-decode-string: 2.0.1
+ unist-util-visit: 5.1.0
+ zwitch: 2.0.4
+
+ mdast-util-to-string@4.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+
+ mdn-data@2.0.28: {}
+
+ mdn-data@2.27.1: {}
+
+ micromark-core-commonmark@2.0.3:
+ dependencies:
+ decode-named-character-reference: 1.3.0
+ devlop: 1.1.0
+ micromark-factory-destination: 2.0.1
+ micromark-factory-label: 2.0.1
+ micromark-factory-space: 2.0.1
+ micromark-factory-title: 2.0.1
+ micromark-factory-whitespace: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-chunked: 2.0.1
+ micromark-util-classify-character: 2.0.1
+ micromark-util-html-tag-name: 2.0.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-resolve-all: 2.0.1
+ micromark-util-subtokenize: 2.1.0
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-directive@3.0.2:
+ dependencies:
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.1
+ micromark-factory-whitespace: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ parse-entities: 4.0.2
+
+ micromark-extension-gfm-autolink-literal@2.1.0:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-sanitize-uri: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-footnote@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.3
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-sanitize-uri: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-strikethrough@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-chunked: 2.0.1
+ micromark-util-classify-character: 2.0.1
+ micromark-util-resolve-all: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-table@2.1.1:
+ dependencies:
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-tagfilter@2.0.0:
+ dependencies:
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-task-list-item@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm@3.0.0:
+ dependencies:
+ micromark-extension-gfm-autolink-literal: 2.1.0
+ micromark-extension-gfm-footnote: 2.1.0
+ micromark-extension-gfm-strikethrough: 2.1.0
+ micromark-extension-gfm-table: 2.1.1
+ micromark-extension-gfm-tagfilter: 2.0.0
+ micromark-extension-gfm-task-list-item: 2.1.0
+ micromark-util-combine-extensions: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-mdx-expression@3.0.1:
+ dependencies:
+ '@types/estree': 1.0.8
+ devlop: 1.1.0
+ micromark-factory-mdx-expression: 2.0.3
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-events-to-acorn: 2.0.3
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-mdx-jsx@3.0.2:
+ dependencies:
+ '@types/estree': 1.0.8
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ micromark-factory-mdx-expression: 2.0.3
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-events-to-acorn: 2.0.3
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ vfile-message: 4.0.3
+
+ micromark-extension-mdx-md@2.0.0:
+ dependencies:
+ micromark-util-types: 2.0.2
+
+ micromark-extension-mdxjs-esm@3.0.0:
+ dependencies:
+ '@types/estree': 1.0.8
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.3
+ micromark-util-character: 2.1.1
+ micromark-util-events-to-acorn: 2.0.3
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ unist-util-position-from-estree: 2.0.0
+ vfile-message: 4.0.3
+
+ micromark-extension-mdxjs@3.0.0:
+ dependencies:
+ acorn: 8.16.0
+ acorn-jsx: 5.3.2(acorn@8.16.0)
+ micromark-extension-mdx-expression: 3.0.1
+ micromark-extension-mdx-jsx: 3.0.2
+ micromark-extension-mdx-md: 2.0.0
+ micromark-extension-mdxjs-esm: 3.0.0
+ micromark-util-combine-extensions: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-factory-destination@2.0.1:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-factory-label@2.0.1:
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-factory-mdx-expression@2.0.3:
+ dependencies:
+ '@types/estree': 1.0.8
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-events-to-acorn: 2.0.3
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ unist-util-position-from-estree: 2.0.0
+ vfile-message: 4.0.3
+
+ micromark-factory-space@2.0.1:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-types: 2.0.2
+
+ micromark-factory-title@2.0.1:
+ dependencies:
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-factory-whitespace@2.0.1:
+ dependencies:
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-util-character@2.1.1:
+ dependencies:
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-util-chunked@2.0.1:
+ dependencies:
+ micromark-util-symbol: 2.0.1
+
+ micromark-util-classify-character@2.0.1:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-util-combine-extensions@2.0.1:
+ dependencies:
+ micromark-util-chunked: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-util-decode-numeric-character-reference@2.0.2:
+ dependencies:
+ micromark-util-symbol: 2.0.1
+
+ micromark-util-decode-string@2.0.1:
+ dependencies:
+ decode-named-character-reference: 1.3.0
+ micromark-util-character: 2.1.1
+ micromark-util-decode-numeric-character-reference: 2.0.2
+ micromark-util-symbol: 2.0.1
+
+ micromark-util-encode@2.0.1: {}
+
+ micromark-util-events-to-acorn@2.0.3:
+ dependencies:
+ '@types/estree': 1.0.8
+ '@types/unist': 3.0.3
+ devlop: 1.1.0
+ estree-util-visit: 2.0.0
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ vfile-message: 4.0.3
+
+ micromark-util-html-tag-name@2.0.1: {}
+
+ micromark-util-normalize-identifier@2.0.1:
+ dependencies:
+ micromark-util-symbol: 2.0.1
+
+ micromark-util-resolve-all@2.0.1:
+ dependencies:
+ micromark-util-types: 2.0.2
+
+ micromark-util-sanitize-uri@2.0.1:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-encode: 2.0.1
+ micromark-util-symbol: 2.0.1
+
+ micromark-util-subtokenize@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-chunked: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-util-symbol@2.0.1: {}
+
+ micromark-util-types@2.0.2: {}
+
+ micromark@4.0.2:
+ dependencies:
+ '@types/debug': 4.1.12
+ debug: 4.4.3
+ decode-named-character-reference: 1.3.0
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.3
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-chunked: 2.0.1
+ micromark-util-combine-extensions: 2.0.1
+ micromark-util-decode-numeric-character-reference: 2.0.2
+ micromark-util-encode: 2.0.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-resolve-all: 2.0.1
+ micromark-util-sanitize-uri: 2.0.1
+ micromark-util-subtokenize: 2.1.0
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mrmime@2.0.1: {}
+
+ ms@2.1.3: {}
+
+ nanoid@3.3.11: {}
+
+ neotraverse@0.6.18: {}
+
+ nlcst-to-string@4.0.0:
+ dependencies:
+ '@types/nlcst': 2.0.3
+
+ node-fetch-native@1.6.7: {}
+
+ node-mock-http@1.0.4: {}
+
+ normalize-path@3.0.0: {}
+
+ nth-check@2.1.1:
+ dependencies:
+ boolbase: 1.0.0
+
+ ofetch@1.5.1:
+ dependencies:
+ destr: 2.0.5
+ node-fetch-native: 1.6.7
+ ufo: 1.6.3
+
+ ohash@2.0.11: {}
+
+ oniguruma-parser@0.12.1: {}
+
+ oniguruma-to-es@4.3.5:
+ dependencies:
+ oniguruma-parser: 0.12.1
+ regex: 6.1.0
+ regex-recursion: 6.0.2
+
+ p-limit@6.2.0:
+ dependencies:
+ yocto-queue: 1.2.2
+
+ p-queue@8.1.1:
+ dependencies:
+ eventemitter3: 5.0.4
+ p-timeout: 6.1.4
+
+ p-timeout@6.1.4: {}
+
+ package-manager-detector@1.6.0: {}
+
+ pagefind@1.4.0:
+ optionalDependencies:
+ '@pagefind/darwin-arm64': 1.4.0
+ '@pagefind/darwin-x64': 1.4.0
+ '@pagefind/freebsd-x64': 1.4.0
+ '@pagefind/linux-arm64': 1.4.0
+ '@pagefind/linux-x64': 1.4.0
+ '@pagefind/windows-x64': 1.4.0
+
+ parse-entities@4.0.2:
+ dependencies:
+ '@types/unist': 2.0.11
+ character-entities-legacy: 3.0.0
+ character-reference-invalid: 2.0.1
+ decode-named-character-reference: 1.3.0
+ is-alphanumerical: 2.0.1
+ is-decimal: 2.0.1
+ is-hexadecimal: 2.0.1
+
+ parse-latin@7.0.0:
+ dependencies:
+ '@types/nlcst': 2.0.3
+ '@types/unist': 3.0.3
+ nlcst-to-string: 4.0.0
+ unist-util-modify-children: 4.0.0
+ unist-util-visit-children: 3.0.0
+ vfile: 6.0.3
+
+ parse5@7.3.0:
+ dependencies:
+ entities: 6.0.1
+
+ piccolore@0.1.3: {}
+
+ picocolors@1.1.1: {}
+
+ picomatch@2.3.1: {}
+
+ picomatch@4.0.3: {}
+
+ postcss-nested@6.2.0(postcss@8.5.8):
+ dependencies:
+ postcss: 8.5.8
+ postcss-selector-parser: 6.1.2
+
+ postcss-selector-parser@6.1.2:
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+
+ postcss@8.5.8:
+ dependencies:
+ nanoid: 3.3.11
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ prismjs@1.30.0: {}
+
+ prompts@2.4.2:
+ dependencies:
+ kleur: 3.0.3
+ sisteransi: 1.0.5
+
+ property-information@7.1.0: {}
+
+ radix3@1.1.2: {}
+
+ readdirp@5.0.0: {}
+
+ recma-build-jsx@1.0.0:
+ dependencies:
+ '@types/estree': 1.0.8
+ estree-util-build-jsx: 3.0.1
+ vfile: 6.0.3
+
+ recma-jsx@1.0.1(acorn@8.16.0):
+ dependencies:
+ acorn: 8.16.0
+ acorn-jsx: 5.3.2(acorn@8.16.0)
+ estree-util-to-js: 2.0.0
+ recma-parse: 1.0.0
+ recma-stringify: 1.0.0
+ unified: 11.0.5
+
+ recma-parse@1.0.0:
+ dependencies:
+ '@types/estree': 1.0.8
+ esast-util-from-js: 2.0.1
+ unified: 11.0.5
+ vfile: 6.0.3
+
+ recma-stringify@1.0.0:
+ dependencies:
+ '@types/estree': 1.0.8
+ estree-util-to-js: 2.0.0
+ unified: 11.0.5
+ vfile: 6.0.3
+
+ regex-recursion@6.0.2:
+ dependencies:
+ regex-utilities: 2.3.0
+
+ regex-utilities@2.3.0: {}
+
+ regex@6.1.0:
+ dependencies:
+ regex-utilities: 2.3.0
+
+ rehype-expressive-code@0.41.7:
+ dependencies:
+ expressive-code: 0.41.7
+
+ rehype-format@5.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-format: 1.1.0
+
+ rehype-parse@9.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-from-html: 2.0.3
+ unified: 11.0.5
+
+ rehype-raw@7.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-raw: 9.1.0
+ vfile: 6.0.3
+
+ rehype-recma@1.0.0:
+ dependencies:
+ '@types/estree': 1.0.8
+ '@types/hast': 3.0.4
+ hast-util-to-estree: 3.1.3
+ transitivePeerDependencies:
+ - supports-color
+
+ rehype-stringify@10.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-to-html: 9.0.5
+ unified: 11.0.5
+
+ rehype@13.0.2:
+ dependencies:
+ '@types/hast': 3.0.4
+ rehype-parse: 9.0.1
+ rehype-stringify: 10.0.1
+ unified: 11.0.5
+
+ remark-directive@3.0.1:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-directive: 3.1.0
+ micromark-extension-directive: 3.0.2
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+
+ remark-gfm@4.0.1:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-gfm: 3.1.0
+ micromark-extension-gfm: 3.0.0
+ remark-parse: 11.0.0
+ remark-stringify: 11.0.0
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+
+ remark-github-alerts@0.1.1(@types/mdast@4.0.4)(unified@11.0.5):
+ dependencies:
+ '@types/mdast': 4.0.4
+ unified: 11.0.5
+ unist-util-visit: 5.1.0
+
+ remark-mdx@3.1.1:
+ dependencies:
+ mdast-util-mdx: 3.0.0
+ micromark-extension-mdxjs: 3.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ remark-parse@11.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-from-markdown: 2.0.3
+ micromark-util-types: 2.0.2
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+
+ remark-rehype@11.1.2:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ mdast-util-to-hast: 13.2.1
+ unified: 11.0.5
+ vfile: 6.0.3
+
+ remark-smartypants@3.0.2:
+ dependencies:
+ retext: 9.0.0
+ retext-smartypants: 6.2.0
+ unified: 11.0.5
+ unist-util-visit: 5.1.0
+
+ remark-stringify@11.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-to-markdown: 2.1.2
+ unified: 11.0.5
+
+ resolve-pkg-maps@1.0.0: {}
+
+ retext-latin@4.0.0:
+ dependencies:
+ '@types/nlcst': 2.0.3
+ parse-latin: 7.0.0
+ unified: 11.0.5
+
+ retext-smartypants@6.2.0:
+ dependencies:
+ '@types/nlcst': 2.0.3
+ nlcst-to-string: 4.0.0
+ unist-util-visit: 5.1.0
+
+ retext-stringify@4.0.0:
+ dependencies:
+ '@types/nlcst': 2.0.3
+ nlcst-to-string: 4.0.0
+ unified: 11.0.5
+
+ retext@9.0.0:
+ dependencies:
+ '@types/nlcst': 2.0.3
+ retext-latin: 4.0.0
+ retext-stringify: 4.0.0
+ unified: 11.0.5
+
+ rollup@4.59.0:
+ dependencies:
+ '@types/estree': 1.0.8
+ optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.59.0
+ '@rollup/rollup-android-arm64': 4.59.0
+ '@rollup/rollup-darwin-arm64': 4.59.0
+ '@rollup/rollup-darwin-x64': 4.59.0
+ '@rollup/rollup-freebsd-arm64': 4.59.0
+ '@rollup/rollup-freebsd-x64': 4.59.0
+ '@rollup/rollup-linux-arm-gnueabihf': 4.59.0
+ '@rollup/rollup-linux-arm-musleabihf': 4.59.0
+ '@rollup/rollup-linux-arm64-gnu': 4.59.0
+ '@rollup/rollup-linux-arm64-musl': 4.59.0
+ '@rollup/rollup-linux-loong64-gnu': 4.59.0
+ '@rollup/rollup-linux-loong64-musl': 4.59.0
+ '@rollup/rollup-linux-ppc64-gnu': 4.59.0
+ '@rollup/rollup-linux-ppc64-musl': 4.59.0
+ '@rollup/rollup-linux-riscv64-gnu': 4.59.0
+ '@rollup/rollup-linux-riscv64-musl': 4.59.0
+ '@rollup/rollup-linux-s390x-gnu': 4.59.0
+ '@rollup/rollup-linux-x64-gnu': 4.59.0
+ '@rollup/rollup-linux-x64-musl': 4.59.0
+ '@rollup/rollup-openbsd-x64': 4.59.0
+ '@rollup/rollup-openharmony-arm64': 4.59.0
+ '@rollup/rollup-win32-arm64-msvc': 4.59.0
+ '@rollup/rollup-win32-ia32-msvc': 4.59.0
+ '@rollup/rollup-win32-x64-gnu': 4.59.0
+ '@rollup/rollup-win32-x64-msvc': 4.59.0
+ fsevents: 2.3.3
+
+ sax@1.6.0: {}
+
+ semver@7.7.4: {}
+
+ sharp@0.34.5:
+ dependencies:
+ '@img/colour': 1.1.0
+ detect-libc: 2.1.2
+ semver: 7.7.4
+ optionalDependencies:
+ '@img/sharp-darwin-arm64': 0.34.5
+ '@img/sharp-darwin-x64': 0.34.5
+ '@img/sharp-libvips-darwin-arm64': 1.2.4
+ '@img/sharp-libvips-darwin-x64': 1.2.4
+ '@img/sharp-libvips-linux-arm': 1.2.4
+ '@img/sharp-libvips-linux-arm64': 1.2.4
+ '@img/sharp-libvips-linux-ppc64': 1.2.4
+ '@img/sharp-libvips-linux-riscv64': 1.2.4
+ '@img/sharp-libvips-linux-s390x': 1.2.4
+ '@img/sharp-libvips-linux-x64': 1.2.4
+ '@img/sharp-libvips-linuxmusl-arm64': 1.2.4
+ '@img/sharp-libvips-linuxmusl-x64': 1.2.4
+ '@img/sharp-linux-arm': 0.34.5
+ '@img/sharp-linux-arm64': 0.34.5
+ '@img/sharp-linux-ppc64': 0.34.5
+ '@img/sharp-linux-riscv64': 0.34.5
+ '@img/sharp-linux-s390x': 0.34.5
+ '@img/sharp-linux-x64': 0.34.5
+ '@img/sharp-linuxmusl-arm64': 0.34.5
+ '@img/sharp-linuxmusl-x64': 0.34.5
+ '@img/sharp-wasm32': 0.34.5
+ '@img/sharp-win32-arm64': 0.34.5
+ '@img/sharp-win32-ia32': 0.34.5
+ '@img/sharp-win32-x64': 0.34.5
+
+ shiki@3.23.0:
+ dependencies:
+ '@shikijs/core': 3.23.0
+ '@shikijs/engine-javascript': 3.23.0
+ '@shikijs/engine-oniguruma': 3.23.0
+ '@shikijs/langs': 3.23.0
+ '@shikijs/themes': 3.23.0
+ '@shikijs/types': 3.23.0
+ '@shikijs/vscode-textmate': 10.0.2
+ '@types/hast': 3.0.4
+
+ sisteransi@1.0.5: {}
+
+ sitemap@9.0.1:
+ dependencies:
+ '@types/node': 24.12.0
+ '@types/sax': 1.2.7
+ arg: 5.0.2
+ sax: 1.6.0
+
+ smol-toml@1.6.0: {}
+
+ source-map-js@1.2.1: {}
+
+ source-map@0.7.6: {}
+
+ space-separated-tokens@2.0.2: {}
+
+ stream-replace-string@2.0.0: {}
+
+ string-width@4.2.3:
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+
+ string-width@7.2.0:
+ dependencies:
+ emoji-regex: 10.6.0
+ get-east-asian-width: 1.5.0
+ strip-ansi: 7.2.0
+
+ stringify-entities@4.0.4:
+ dependencies:
+ character-entities-html4: 2.1.0
+ character-entities-legacy: 3.0.0
+
+ strip-ansi@6.0.1:
+ dependencies:
+ ansi-regex: 5.0.1
+
+ strip-ansi@7.2.0:
+ dependencies:
+ ansi-regex: 6.2.2
+
+ style-to-js@1.1.21:
+ dependencies:
+ style-to-object: 1.0.14
+
+ style-to-object@1.0.14:
+ dependencies:
+ inline-style-parser: 0.2.7
+
+ svgo@4.0.1:
+ dependencies:
+ commander: 11.1.0
+ css-select: 5.2.2
+ css-tree: 3.2.1
+ css-what: 6.2.2
+ csso: 5.0.5
+ picocolors: 1.1.1
+ sax: 1.6.0
+
+ tiny-inflate@1.0.3: {}
+
+ tinyexec@1.0.4: {}
+
+ tinyglobby@0.2.15:
+ dependencies:
+ fdir: 6.5.0(picomatch@4.0.3)
+ picomatch: 4.0.3
+
+ trim-lines@3.0.1: {}
+
+ trough@2.2.0: {}
+
+ tsconfck@3.1.6(typescript@5.9.3):
+ optionalDependencies:
+ typescript: 5.9.3
+
+ tslib@2.8.1:
+ optional: true
+
+ tsx@4.21.0:
+ dependencies:
+ esbuild: 0.27.4
+ get-tsconfig: 4.13.6
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ type-fest@4.41.0: {}
+
+ typescript@5.9.3: {}
+
+ ufo@1.6.3: {}
+
+ ultrahtml@1.6.0: {}
+
+ uncrypto@0.1.3: {}
+
+ undici-types@6.21.0: {}
+
+ undici-types@7.16.0: {}
+
+ unified@11.0.5:
+ dependencies:
+ '@types/unist': 3.0.3
+ bail: 2.0.2
+ devlop: 1.1.0
+ extend: 3.0.2
+ is-plain-obj: 4.1.0
+ trough: 2.2.0
+ vfile: 6.0.3
+
+ unifont@0.7.4:
+ dependencies:
+ css-tree: 3.2.1
+ ofetch: 1.5.1
+ ohash: 2.0.11
+
+ unist-util-find-after@5.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.1
+
+ unist-util-is@6.0.1:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-modify-children@4.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+ array-iterate: 2.0.1
+
+ unist-util-position-from-estree@2.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-position@5.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-remove-position@5.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-visit: 5.1.0
+
+ unist-util-stringify-position@4.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-visit-children@3.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-visit-parents@6.0.2:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.1
+
+ unist-util-visit@5.1.0:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.1
+ unist-util-visit-parents: 6.0.2
+
+ unstorage@1.17.4:
+ dependencies:
+ anymatch: 3.1.3
+ chokidar: 5.0.0
+ destr: 2.0.5
+ h3: 1.15.6
+ lru-cache: 11.2.7
+ node-fetch-native: 1.6.7
+ ofetch: 1.5.1
+ ufo: 1.6.3
+
+ util-deprecate@1.0.2: {}
+
+ vfile-location@5.0.3:
+ dependencies:
+ '@types/unist': 3.0.3
+ vfile: 6.0.3
+
+ vfile-message@4.0.3:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-stringify-position: 4.0.0
+
+ vfile@6.0.3:
+ dependencies:
+ '@types/unist': 3.0.3
+ vfile-message: 4.0.3
+
+ vite@6.4.1(@types/node@22.19.15)(tsx@4.21.0):
+ dependencies:
+ esbuild: 0.25.12
+ fdir: 6.5.0(picomatch@4.0.3)
+ picomatch: 4.0.3
+ postcss: 8.5.8
+ rollup: 4.59.0
+ tinyglobby: 0.2.15
+ optionalDependencies:
+ '@types/node': 22.19.15
+ fsevents: 2.3.3
+ tsx: 4.21.0
+
+ vitefu@1.1.2(vite@6.4.1(@types/node@22.19.15)(tsx@4.21.0)):
+ optionalDependencies:
+ vite: 6.4.1(@types/node@22.19.15)(tsx@4.21.0)
+
+ web-namespaces@2.0.1: {}
+
+ which-pm-runs@1.1.0: {}
+
+ widest-line@5.0.0:
+ dependencies:
+ string-width: 7.2.0
+
+ wrap-ansi@9.0.2:
+ dependencies:
+ ansi-styles: 6.2.3
+ string-width: 7.2.0
+ strip-ansi: 7.2.0
+
+ xxhash-wasm@1.1.0: {}
+
+ yargs-parser@21.1.1: {}
+
+ yocto-queue@1.2.2: {}
+
+ yocto-spinner@0.2.3:
+ dependencies:
+ yoctocolors: 2.1.2
+
+ yoctocolors@2.1.2: {}
+
+ zod-to-json-schema@3.25.1(zod@3.25.76):
+ dependencies:
+ zod: 3.25.76
+
+ zod-to-ts@1.2.0(typescript@5.9.3)(zod@3.25.76):
+ dependencies:
+ typescript: 5.9.3
+ zod: 3.25.76
+
+ zod@3.25.76: {}
+
+ zod@4.3.6: {}
+
+ zwitch@2.0.4: {}
diff --git a/docs/public/images/txn-value-generator.svg b/docs/public/images/txn-value-generator.svg
new file mode 100644
index 00000000..f2aebb41
--- /dev/null
+++ b/docs/public/images/txn-value-generator.svg
@@ -0,0 +1,34 @@
+
diff --git a/docs/scripts/generate-examples-mdx.ts b/docs/scripts/generate-examples-mdx.ts
new file mode 100644
index 00000000..b9e81ad6
--- /dev/null
+++ b/docs/scripts/generate-examples-mdx.ts
@@ -0,0 +1,136 @@
+import fs from 'node:fs'
+import path from 'node:path'
+import { fileURLToPath } from 'node:url'
+
+const docsRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..')
+const repoRoot = path.resolve(docsRoot, '..')
+const examplesRoot = path.join(repoRoot, 'examples')
+const outputDir = path.join(docsRoot, 'src', 'content', 'docs', 'examples')
+const repoUrl = 'https://github.com/algorandfoundation/algorand-python-testing/blob/main'
+
+type ExamplePage = {
+ slug: string
+ title: string
+ summary: string
+ sourcePath: string
+ testPath: string | null
+}
+
+const ensureDir = (dir: string) => fs.mkdirSync(dir, { recursive: true })
+
+const toTitle = (value: string) =>
+ value
+ .split(/[-_]/g)
+ .filter(Boolean)
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
+ .join(' ')
+
+const firstModuleDocstring = (content: string): string | null => {
+ const cleaned = content.replace(/^\s*#.*\n/gm, '').trimStart()
+ const match = cleaned.match(/^(?:"""([\s\S]*?)"""|'''([\s\S]*?)''')/)
+ if (!match) return null
+
+ const raw = (match[1] ?? match[2] ?? '').trim()
+ if (!raw) return null
+ return raw.split(/\n\s*\n/)[0]?.replace(/\s+/g, ' ').trim() ?? null
+}
+
+const getMainModuleFile = (exampleDir: string): string | null => {
+ const preferred = ['contract.py', 'signature.py', 'main.py']
+ for (const name of preferred) {
+ const candidate = path.join(exampleDir, name)
+ if (fs.existsSync(candidate)) return candidate
+ }
+
+ const pythonFiles = fs
+ .readdirSync(exampleDir)
+ .filter((name) => name.endsWith('.py') && !name.startsWith('test_') && name !== '__init__.py')
+ .sort()
+
+ if (pythonFiles.length === 0) return null
+ return path.join(exampleDir, pythonFiles[0])
+}
+
+const buildExamplePages = (): ExamplePage[] => {
+ if (!fs.existsSync(examplesRoot)) return []
+
+ const dirs = fs
+ .readdirSync(examplesRoot, { withFileTypes: true })
+ .filter((entry) => entry.isDirectory() && !entry.name.startsWith('__'))
+ .map((entry) => entry.name)
+ .sort()
+
+ return dirs.map((dirName) => {
+ const exampleDir = path.join(examplesRoot, dirName)
+ const slug = dirName.replace(/_/g, '-')
+ const title = toTitle(dirName)
+
+ const moduleFile = getMainModuleFile(exampleDir)
+ const sourcePath = moduleFile
+ ? path.relative(repoRoot, moduleFile).replace(/\\/g, '/')
+ : `examples/${dirName}`
+
+ const testFile = fs
+ .readdirSync(exampleDir)
+ .filter((name) => /^test_.*\.py$/.test(name))
+ .sort()[0]
+ const testPath = testFile ? path.posix.join('examples', dirName, testFile) : null
+
+ let summary = 'Example source and tests for this contract are available in the repository.'
+ if (moduleFile) {
+ const docstring = firstModuleDocstring(fs.readFileSync(moduleFile, 'utf8'))
+ if (docstring) summary = docstring
+ }
+
+ return {
+ slug,
+ title,
+ summary,
+ sourcePath,
+ testPath,
+ }
+ })
+}
+
+const renderExamplePage = (example: ExamplePage): string => {
+ const testLink = example.testPath
+ ? `- [Test file](${repoUrl}/${example.testPath})`
+ : '- Test file not detected in this example directory.'
+
+ return `---
+title: ${example.title}
+description: ${example.summary}
+---
+
+${example.summary}
+
+## Repository links
+
+- [Source file](${repoUrl}/${example.sourcePath})
+${testLink}
+`
+}
+
+const cleanOutput = () => {
+ if (!fs.existsSync(outputDir)) return
+
+ for (const entry of fs.readdirSync(outputDir)) {
+ if (entry.startsWith('index.')) continue
+ fs.rmSync(path.join(outputDir, entry), { recursive: true, force: true })
+ }
+}
+
+const main = () => {
+ ensureDir(outputDir)
+ cleanOutput()
+
+ const examples = buildExamplePages()
+
+ for (const example of examples) {
+ fs.writeFileSync(path.join(outputDir, `${example.slug}.mdx`), renderExamplePage(example))
+ }
+
+ process.stdout.write(`Generated ${examples.length} example page(s) in ${outputDir}\n`)
+}
+
+main()
diff --git a/docs/scripts/generate-legacy-redirects.mjs b/docs/scripts/generate-legacy-redirects.mjs
new file mode 100644
index 00000000..7d880006
--- /dev/null
+++ b/docs/scripts/generate-legacy-redirects.mjs
@@ -0,0 +1,82 @@
+import fs from 'node:fs'
+import path from 'node:path'
+import { fileURLToPath } from 'node:url'
+
+const docsRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..')
+const distRoot = path.join(docsRoot, 'dist')
+const configPath = path.join(docsRoot, 'legacy-routes.json')
+
+const config = JSON.parse(fs.readFileSync(configPath, 'utf8'))
+
+const ensureDir = (filePath) => fs.mkdirSync(path.dirname(filePath), { recursive: true })
+
+const renderRedirectHtml = (target) => `
+
+
+
+
+ Redirecting...
+
+
+
+
+ Redirecting to ${target}.
+
+
+
+`
+
+const writeRedirect = (fromRelativePath, toRelativePath) => {
+ const normalizedTo = toRelativePath.startsWith('/') ? toRelativePath.slice(1) : toRelativePath
+ const target = `${config.basePath}${normalizedTo}`.replace(/\/\/+/g, '/')
+ const targetHtml = renderRedirectHtml(target)
+ const outPath = path.join(distRoot, fromRelativePath)
+ ensureDir(outPath)
+ fs.writeFileSync(outPath, targetHtml)
+}
+
+const walkFiles = (dir, acc = []) => {
+ if (!fs.existsSync(dir)) return acc
+
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
+ const entryPath = path.join(dir, entry.name)
+ if (entry.isDirectory()) {
+ walkFiles(entryPath, acc)
+ continue
+ }
+ acc.push(entryPath)
+ }
+ return acc
+}
+
+for (const route of config.routes) {
+ writeRedirect(route.from, route.to)
+}
+
+for (const family of config.families) {
+ const familyTargetRoot = path.join(distRoot, family.toPrefix)
+ const canonicalFiles = walkFiles(familyTargetRoot).filter((file) => file.endsWith(path.join('', 'index.html')))
+
+ for (const canonicalFile of canonicalFiles) {
+ const relativeToFamily = path
+ .relative(familyTargetRoot, path.dirname(canonicalFile))
+ .split(path.sep)
+ .join('/')
+
+ const fromRelativePath = relativeToFamily
+ ? `${family.fromPrefix}${relativeToFamily}${family.fromExtension}`
+ : `${family.fromPrefix}index${family.fromExtension}`
+
+ const toRelativePath = relativeToFamily
+ ? `${family.toPrefix}${relativeToFamily}/`
+ : `${family.toPrefix}`
+
+ if (fromRelativePath === `${family.toPrefix}index.html`) {
+ continue
+ }
+
+ writeRedirect(fromRelativePath, toRelativePath)
+ }
+}
+
+process.stdout.write('Generated legacy redirect shims\n')
diff --git a/docs/sidebar.config.json b/docs/sidebar.config.json
new file mode 100644
index 00000000..1b7562bd
--- /dev/null
+++ b/docs/sidebar.config.json
@@ -0,0 +1,45 @@
+[
+ { "label": "Home", "link": "/" },
+ {
+ "label": "Getting Started",
+ "items": [{ "slug": "tutorials/quick-start" }]
+ },
+ {
+ "label": "Guides",
+ "items": [
+ { "slug": "guide/contract-testing" },
+ { "slug": "guide/signature-testing" },
+ { "slug": "guide/state-management" },
+ { "slug": "guide/subroutines" },
+ { "slug": "guide/transactions" }
+ ]
+ },
+ {
+ "label": "Concepts",
+ "items": [
+ { "slug": "concepts/overview" },
+ { "slug": "concepts/test-context" },
+ { "slug": "concepts/value-generators" },
+ { "slug": "concepts/avm-types" },
+ { "slug": "concepts/arc4-types" },
+ { "slug": "concepts/opcodes" },
+ { "slug": "concepts/algopy" }
+ ]
+ },
+ {
+ "label": "Examples",
+ "autogenerate": { "directory": "examples" }
+ },
+ {
+ "label": "Reference",
+ "items": [
+ { "slug": "reference/coverage" },
+ { "slug": "reference/faq" }
+ ]
+ },
+ {
+ "label": "API Reference",
+ "collapsed": true,
+ "autogenerate": { "directory": "api/algopy_testing" }
+ }
+]
diff --git a/docs/sphinx/conf.py b/docs/sphinx/conf.py
new file mode 100644
index 00000000..eb9e7188
--- /dev/null
+++ b/docs/sphinx/conf.py
@@ -0,0 +1,103 @@
+# Isolated Sphinx configuration for API-only markdown generation.
+# This config is used by docs/api_build.py to generate API reference
+# markdown that is consumed by Starlight. It intentionally omits HTML
+# themes and other presentation-layer extensions.
+
+from docutils import nodes
+
+project = "Algorand Python Testing API"
+author = "Algorand Foundation"
+copyright = "2026, Algorand Foundation" # noqa: A001
+
+extensions = ["autoapi.extension"]
+
+templates_path = []
+exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"]
+
+autoapi_dirs = [
+ "../../src/_algopy_testing",
+]
+autoapi_options = [
+ "members",
+ "undoc-members",
+ "show-inheritance",
+ "show-module-summary",
+]
+
+autoapi_ignore = [
+ "*_algopy_testing/op/txn.py",
+ "*_algopy_testing/op/itxn.py",
+ "*_algopy_testing/op/constants.py",
+]
+
+
+def _process_docstring(_app, _what, _name, _obj, _options, lines):
+ # TypedDict subclasses without their own docstring inherit dict.__doc__,
+ # which contains `dict(**kwargs)` — Sphinx parses `**` as inline emphasis
+ # and the markdown builder emits an orphan fenced `**` block. Drop it.
+ if lines and lines[0].startswith("dict() -> new empty dictionary"):
+ lines[:] = []
+
+
+def _skip_member(_app, _what, name, _obj, skip, _options):
+ # Allow the top-level package itself even though its name starts with `_`;
+ # without this, autoapi treats the entire package as private and renders
+ # nothing.
+ if name == "_algopy_testing":
+ return False
+ short = name.rsplit(".", 1)[-1]
+ if short.startswith("_") and not (short.startswith("__") and short.endswith("__")):
+ return True
+ return skip
+
+
+def _strip_pycon_prompts(text: str) -> str:
+ """Return text with leading REPL prompts (>>>/...) stripped from each line."""
+ cleaned_lines: list[str] = []
+ for line in text.splitlines():
+ if line.startswith(">>> "):
+ cleaned_lines.append(line[4:])
+ continue
+ if line.startswith(">>>"):
+ cleaned_lines.append(line[3:].lstrip())
+ continue
+ if line.startswith("... "):
+ cleaned_lines.append(line[4:])
+ continue
+ if line.startswith("..."):
+ cleaned_lines.append(line[3:].lstrip())
+ continue
+ cleaned_lines.append(line)
+ return "\n".join(cleaned_lines)
+
+
+def _convert_pycon_blocks_to_python(app, doctree, _docname):
+ """Convert pycon/doctest code blocks to python and strip prompts.
+
+ Starlight's Expressive Code highlighter doesn't recognise the ``pycon``
+ lexer that inherited stdlib docstrings (e.g. ``enum.Enum``) emit, so
+ rewrite them to plain Python with the REPL prompts stripped.
+ """
+ if app.builder.name != "markdown":
+ return
+
+ for node in list(doctree.traverse(nodes.literal_block)):
+ if node.get("language") in {"pycon", "doctest"}:
+ text = node.astext()
+ node["language"] = "python"
+ node.children = [nodes.Text(_strip_pycon_prompts(text))]
+
+ doctest_block = getattr(nodes, "doctest_block", None)
+ if doctest_block is not None:
+ for node in list(doctree.traverse(doctest_block)):
+ text = node.astext()
+ code_text = _strip_pycon_prompts(text)
+ replacement = nodes.literal_block(code_text, code_text)
+ replacement["language"] = "python"
+ node.replace_self(replacement)
+
+
+def setup(app):
+ app.connect("autoapi-skip-member", _skip_member)
+ app.connect("autodoc-process-docstring", _process_docstring)
+ app.connect("doctree-resolved", _convert_pycon_blocks_to_python)
diff --git a/docs/sphinx/index.rst b/docs/sphinx/index.rst
new file mode 100644
index 00000000..def1fb40
--- /dev/null
+++ b/docs/sphinx/index.rst
@@ -0,0 +1,7 @@
+API Reference
+=============
+
+.. toctree::
+ :glob:
+
+ autoapi/index
diff --git a/docs/src/content.config.ts b/docs/src/content.config.ts
new file mode 100644
index 00000000..9cfdab09
--- /dev/null
+++ b/docs/src/content.config.ts
@@ -0,0 +1,7 @@
+import { defineCollection } from 'astro:content'
+import { docsLoader } from '@astrojs/starlight/loaders'
+import { docsSchema } from '@astrojs/starlight/schema'
+
+export const collections = {
+ docs: defineCollection({ loader: docsLoader(), schema: docsSchema() }),
+}
diff --git a/docs/algopy.md b/docs/src/content/docs/concepts/algopy.md
similarity index 70%
rename from docs/algopy.md
rename to docs/src/content/docs/concepts/algopy.md
index c30f1922..42a066e4 100644
--- a/docs/algopy.md
+++ b/docs/src/content/docs/concepts/algopy.md
@@ -1,4 +1,7 @@
-# Algorand Python
+---
+title: Algorand Python
+description: Algorand Python is a partial implementation of the Python programming language that runs on the AVM. It includes a statically typed framework for developing Algorand smart contracts and logic signatures, with Pythonic interfaces to underlying AVM functionality that work with standard Python tooling.
+---
Algorand Python is a partial implementation of the Python programming language that runs on the AVM. It includes a statically typed framework for developing Algorand smart contracts and logic signatures, with Pythonic interfaces to underlying AVM functionality that work with standard Python tooling.
diff --git a/docs/testing-guide/arc4-types.md b/docs/src/content/docs/concepts/arc4-types.md
similarity index 73%
rename from docs/testing-guide/arc4-types.md
rename to docs/src/content/docs/concepts/arc4-types.md
index b1d6ca0d..2472824c 100644
--- a/docs/testing-guide/arc4-types.md
+++ b/docs/src/content/docs/concepts/arc4-types.md
@@ -1,16 +1,17 @@
-# ARC4 Types
+---
+title: ARC4 Types
+description: These types are available under the `algopy.arc4` namespace. Refer to the [ARC4 specification](https://dev.algorand.co/arc-standards/arc-0004/) for more details on the spec.
+---
These types are available under the `algopy.arc4` namespace. Refer to the [ARC4 specification](https://dev.algorand.co/arc-standards/arc-0004/) for more details on the spec.
-```{hint}
-The test context manager provides _value generators_ for ARC4 types. To access the _value generators_, use `{context_instance}.any.arc4` property. See more examples below.
-```
+> [!TIP]
+> The test context manager provides _value generators_ for ARC4 types. To access the _value generators_, use `{context_instance}.any.arc4` property. See more examples below.
-```{note}
-For all `algopy.arc4` types with and without respective _value generator_, instantiation can be performed directly. If you have a suggestion for a new _value generator_ implementation, please open an issue in the [`algorand-python-testing`](https://github.com/algorandfoundation/algorand-python-testing) repository or contribute by following the [contribution guide](https://github.com/algorandfoundation/algorand-python-testing/blob/main/CONTRIBUTING.md).
-```
+> [!NOTE]
+> For all `algopy.arc4` types with and without respective _value generator_, instantiation can be performed directly. If you have a suggestion for a new _value generator_ implementation, please open an issue in the [`algorand-python-testing`](https://github.com/algorandfoundation/algorand-python-testing) repository or contribute by following the [contribution guide](https://github.com/algorandfoundation/algorand-python-testing/blob/main/CONTRIBUTING.md).
-```{testsetup}
+```python
import algopy
from algopy_testing import algopy_testing_context
@@ -23,7 +24,7 @@ context = ctx_manager.__enter__()
## Unsigned Integers
-```{testcode}
+```python
from algopy import arc4
# Integer types
@@ -54,7 +55,7 @@ biguint512_custom = context.any.arc4.biguint512(min_value=1000000000000000000000
## Address
-```{testcode}
+```python
from algopy import arc4
# Address type
@@ -69,7 +70,7 @@ native = random_address.native
## Dynamic Bytes
-```{testcode}
+```python
from algopy import arc4
# Dynamic byte string
@@ -81,7 +82,7 @@ random_dynamic_bytes = context.any.arc4.dynamic_bytes(n=123) # n is the number o
## String
-```{testcode}
+```python
from algopy import arc4
# UTF-8 encoded string
@@ -91,6 +92,6 @@ string_value = arc4.String("Hello, Algorand!")
random_string = context.any.arc4.string(n=12) # n is the number of bits in the ARC4 string
```
-```{testcleanup}
+```python
ctx_manager.__exit__(None, None, None)
```
diff --git a/docs/testing-guide/avm-types.md b/docs/src/content/docs/concepts/avm-types.md
similarity index 89%
rename from docs/testing-guide/avm-types.md
rename to docs/src/content/docs/concepts/avm-types.md
index 110ac7a8..29c9fc1b 100644
--- a/docs/testing-guide/avm-types.md
+++ b/docs/src/content/docs/concepts/avm-types.md
@@ -1,12 +1,14 @@
-# AVM Types
+---
+title: AVM Types
+description: "These types are available directly under the `algopy` namespace. They represent the basic AVM primitive types and can be instantiated directly or via _value generators_:"
+---
These types are available directly under the `algopy` namespace. They represent the basic AVM primitive types and can be instantiated directly or via _value generators_:
-```{note}
-For primitive `algopy` types such as `Account`, `Application`, `Asset`, `UInt64`, `BigUint`, `Bytes`, and `String`, instantiation can be performed directly, with or without a corresponding _value generator_. If you have a suggestion for a new _value generator_ implementation, please open an issue in the [`algorand-python-testing`](https://github.com/algorandfoundation/algorand-python-testing) repository or contribute by following the [contribution guide](https://github.com/algorandfoundation/algorand-python-testing/blob/main/CONTRIBUTING.md).
-```
+> [!NOTE]
+> For primitive `algopy` types such as `Account`, `Application`, `Asset`, `UInt64`, `BigUint`, `Bytes`, and `String`, instantiation can be performed directly, with or without a corresponding _value generator_. If you have a suggestion for a new _value generator_ implementation, please open an issue in the [`algorand-python-testing`](https://github.com/algorandfoundation/algorand-python-testing) repository or contribute by following the [contribution guide](https://github.com/algorandfoundation/algorand-python-testing/blob/main/CONTRIBUTING.md).
-```{testsetup}
+```python
import algopy
from algopy_testing import algopy_testing_context
@@ -19,7 +21,7 @@ context = ctx_manager.__enter__()
## UInt64
-```{testcode}
+```python
# Direct instantiation
uint64_value = algopy.UInt64(100)
@@ -35,7 +37,7 @@ random_uint64 = context.any.uint64(min_value=1000, max_value=9999)
## Bytes
-```{testcode}
+```python
# Direct instantiation
bytes_value = algopy.Bytes(b"Hello, Algorand!")
@@ -52,7 +54,7 @@ random_bytes = context.any.bytes(length=32)
## FixedBytes
-```{testcode}
+```python
import typing
# Direct instantiation
@@ -68,7 +70,7 @@ random_bytes = context.any.fixed_bytes(algopy.FixedBytes[typing.Literal[32]])
## String
-```{testcode}
+```python
# Direct instantiation
string_value = algopy.String("Hello, Algorand!")
@@ -81,7 +83,7 @@ random_string = context.any.string(length=16)
## BigUInt
-```{testcode}
+```python
# Direct instantiation
biguint_value = algopy.BigUInt(100)
@@ -91,7 +93,7 @@ random_biguint = context.any.biguint()
## Asset
-```{testcode}
+```python
# Direct instantiation
asset = algopy.Asset(asset_id=1001)
@@ -135,7 +137,7 @@ context.ledger.update_asset(
## Account
-```{testcode}
+```python
# Direct instantiation
raw_address = 'PUYAGEGVCOEBP57LUKPNOCSMRWHZJSU4S62RGC2AONDUEIHC6P7FOPJQ4I'
account = algopy.Account(raw_address) # zero address by default
@@ -188,7 +190,7 @@ opted_in = account.is_opted_in(mock_asset)
## Application
-```{testcode}
+```python
# Direct instantiation
application = algopy.Application()
@@ -234,6 +236,6 @@ contract = MyContract()
active_app = context.ledger.get_app(contract)
```
-```{testcleanup}
+```python
ctx_manager.__exit__(None, None, None)
```
diff --git a/docs/testing-guide/opcodes.md b/docs/src/content/docs/concepts/opcodes.md
similarity index 93%
rename from docs/testing-guide/opcodes.md
rename to docs/src/content/docs/concepts/opcodes.md
index aa935a6d..c78772c1 100644
--- a/docs/testing-guide/opcodes.md
+++ b/docs/src/content/docs/concepts/opcodes.md
@@ -1,10 +1,13 @@
-# AVM Opcodes
+---
+title: AVM Opcodes
+description: Overview of key opcodes and opcode types in algorand-python-testing.
+---
-The [coverage](../coverage.md) file provides a comprehensive list of all opcodes and their respective types, categorized as _Mockable_, _Emulated_, or _Native_ within the `algorand-python-testing` package. This section highlights a **subset** of opcodes and types that typically require interaction with the test context manager.
+The [coverage](/algorand-python-testing/reference/coverage/) file provides a comprehensive list of all opcodes and their respective types, categorized as _Mockable_, _Emulated_, or _Native_ within the `algorand-python-testing` package. This section highlights a **subset** of opcodes and types that typically require interaction with the test context manager.
`Native` opcodes are assumed to function as they do in the Algorand Virtual Machine, given their stateless nature. If you encounter issues with any `Native` opcodes, please raise an issue in the [`algorand-python-testing` repo](https://github.com/algorandfoundation/algorand-python-testing/issues/new/choose) or contribute a PR following the [Contributing](https://github.com/algorandfoundation/algorand-python-testing/blob/main/CONTRIBUTING.md) guide.
-```{testsetup}
+```python
import algopy
from algopy_testing import algopy_testing_context
@@ -27,7 +30,7 @@ The following opcodes are demonstrated:
- `op.keccak256`
- `op.ecdsa_verify`
-```{testcode}
+```python
from algopy import op
# SHA256 hash
@@ -57,7 +60,7 @@ The following opcodes are demonstrated:
- `op.getbit`
- `op.setbit_uint64`
-```{testcode}
+```python
from algopy import op
# Addition with carry
@@ -70,7 +73,7 @@ is_bit_set = op.getbit(value, 3)
new_value = op.setbit_uint64(value, 2, 1)
```
-For a comprehensive list of all opcodes and types, refer to the [coverage](../coverage.md) page.
+For a comprehensive list of all opcodes and types, refer to the [coverage](/algorand-python-testing/reference/coverage/) page.
## Emulated Types Requiring Transaction Context
@@ -78,7 +81,7 @@ These types necessitate interaction with the transaction context:
### algopy.op.Global
-```{testcode}
+```python
from algopy import op
class MyContract(algopy.ARC4Contract):
@@ -100,7 +103,7 @@ assert result == algopy.UInt64(101000)
### algopy.op.Txn
-```{testcode}
+```python
from algopy import op
class MyContract(algopy.ARC4Contract):
@@ -119,7 +122,7 @@ assert result == custom_sender
### algopy.op.AssetHoldingGet
-```{testcode}
+```python
from algopy import op
class AssetContract(algopy.ARC4Contract):
@@ -139,7 +142,7 @@ assert result == algopy.UInt64(5000)
### algopy.op.AppGlobal
-```{testcode}
+```python
from algopy import op
class StateContract(algopy.ARC4Contract):
@@ -160,7 +163,7 @@ assert stored_value == 42
### algopy.op.Block
-```{testcode}
+```python
from algopy import op
class BlockInfoContract(algopy.ARC4Contract):
@@ -178,7 +181,7 @@ assert seed == algopy.op.itob(123456)
### algopy.op.AcctParamsGet
-```{testcode}
+```python
from algopy import op
class AccountParamsContract(algopy.ARC4Contract):
@@ -198,7 +201,7 @@ assert balance == algopy.UInt64(1000000)
### algopy.op.AppParamsGet
-```{testcode}
+```python
class AppParamsContract(algopy.ARC4Contract):
@algopy.arc4.abimethod
def get_app_creator(self, app_id: algopy.Application) -> algopy.arc4.Address:
@@ -216,7 +219,7 @@ assert creator == context.default_sender
### algopy.op.AssetParamsGet
-```{testcode}
+```python
from algopy import op
class AssetParamsContract(algopy.ARC4Contract):
@@ -236,7 +239,7 @@ assert total == algopy.UInt64(1000000)
### algopy.op.Box
-```{testcode}
+```python
from algopy import op
class BoxStorageContract(algopy.ARC4Contract):
@@ -263,7 +266,7 @@ These opcodes are mockable in `algorand-python-testing`, allowing for controlled
### algopy.compile_contract
-```{testcode}
+```python
from unittest.mock import patch, MagicMock
import algopy
@@ -290,7 +293,7 @@ with patch('algopy.compile_contract', return_value=mocked_response):
### algopy.arc4.abi_call
-```{testcode}
+```python
import unittest
from unittest.mock import patch, MagicMock
import algopy
@@ -323,7 +326,7 @@ assert result == 11
### algopy.op.vrf_verify
-```{testcode}
+```python
from unittest.mock import patch, MagicMock
import algopy
@@ -349,7 +352,7 @@ test_mock_vrf_verify()
### algopy.op.EllipticCurve
-```{testcode}
+```python
from unittest.mock import patch, MagicMock
import algopy
@@ -379,6 +382,6 @@ Mocking these opcodes allows you to:
2. Test edge cases and error conditions.
3. Isolate contract logic from external dependencies.
-```{testcleanup}
+```python
ctx_manager.__exit__(None, None, None)
```
diff --git a/docs/testing-guide/index.md b/docs/src/content/docs/concepts/overview.md
similarity index 71%
rename from docs/testing-guide/index.md
rename to docs/src/content/docs/concepts/overview.md
index e3ce24d1..c0136a21 100644
--- a/docs/testing-guide/index.md
+++ b/docs/src/content/docs/concepts/overview.md
@@ -1,27 +1,14 @@
-# Testing Guide
+---
+title: Testing Guide
+description: The Algorand Python Testing framework provides powerful tools for testing Algorand Python smart contracts within a Python interpreter. This guide covers the main features and concepts of the framework, helping you write effective tests for your Algorand applications.
+---
The Algorand Python Testing framework provides powerful tools for testing Algorand Python smart contracts within a Python interpreter. This guide covers the main features and concepts of the framework, helping you write effective tests for your Algorand applications.
-```{note}
-For all code examples in the _Testing Guide_ section, assume `context` is an instance of `AlgopyTestContext` obtained using the `algopy_testing_context()` context manager. All subsequent code is executed within this context.
-```
-
-```{mermaid}
-graph TD
- subgraph GA["Your Development Environment"]
- A["algopy (type stubs)"]
- B["algopy_testing (testing framework)
(You are here 📍)"]
- C["puya (compiler)"]
- end
+> [!NOTE]
+> For all code examples in the _Testing Guide_ section, assume `context` is an instance of `AlgopyTestContext` obtained using the `algopy_testing_context()` context manager. All subsequent code is executed within this context.
- subgraph GB["Your Algorand Project"]
- D[Your Algorand Python contract]
- end
-
- D -->|type hints inferred from| A
- D -->|compiled using| C
- D -->|tested via| B
-```
+
> _High-level overview of the relationship between your smart contracts project, Algorand Python Testing framework, Algorand Python type stubs, and the compiler_
@@ -47,21 +34,3 @@ Key features of the framework include:
- Opcode Simulation: Implementations of AVM opcodes for accurate smart contract behaviour testing
The framework is designed to work seamlessly with Algorand Python smart contracts, allowing developers to write comprehensive unit tests that closely mimic the behaviour of contracts on the Algorand blockchain.
-
-## Table of Contents
-
-```{toctree}
----
-maxdepth: 3
----
-
-concepts
-avm-types
-arc4-types
-transactions
-contract-testing
-signature-testing
-state-management
-subroutines
-opcodes
-```
diff --git a/docs/testing-guide/concepts.md b/docs/src/content/docs/concepts/test-context.md
similarity index 50%
rename from docs/testing-guide/concepts.md
rename to docs/src/content/docs/concepts/test-context.md
index eeade243..a6ca7105 100644
--- a/docs/testing-guide/concepts.md
+++ b/docs/src/content/docs/concepts/test-context.md
@@ -1,10 +1,9 @@
-# Concepts
+---
+title: Test Context
+description: The test context manager creates an emulated Algorand environment that mimics AVM behaviour for offline unit testing of smart contracts.
+---
-The following sections provide an overview of key concepts and features in the Algorand Python Testing framework.
-
-## Test Context
-
-The main abstraction for interacting with the testing framework is the [`AlgopyTestContext`](#_algopy_testing.context.AlgopyTestContext). It creates an emulated Algorand environment that closely mimics AVM behaviour relevant to unit testing contracts and provides a Pythonic interface for interacting with the emulated environment.
+The main abstraction for interacting with the testing framework is the [`AlgopyTestContext`](/algorand-python-testing/api/algopy_testing/context/). It creates an emulated Algorand environment that closely mimics AVM behaviour relevant to unit testing contracts and provides a Pythonic interface for interacting with the emulated environment.
```python
from algopy_testing import algopy_testing_context
@@ -21,35 +20,19 @@ The context manager interface exposes three main properties:
1. `ledger`: An instance of `LedgerContext` for interacting with and querying the emulated Algorand ledger state.
2. `txn`: An instance of `TransactionContext` for creating and managing transaction groups, submitting transactions, and accessing transaction results.
-3. `any`: An instance of `AlgopyValueGenerator` for generating randomized test data.
+3. `any`: An instance of `AlgopyValueGenerator` for generating randomized test data — covered in detail under [Value Generators](/algorand-python-testing/concepts/value-generators/).
For detailed method signatures, parameters, and return types, refer to the following API sections:
-- [`algopy_testing.LedgerContext`](#_algopy_testing.context_helpers.ledger_context.LedgerContext)
-- [`algopy_testing.TransactionContext`](#_algopy_testing.context_helpers.txn_context.TransactionContext)
-- [`algopy_testing.AVMValueGenerator`](#_algopy_testing.value_generators.avm.AVMValueGenerator)
-- [`algopy_testing.TxnValueGenerator`](#_algopy_testing.value_generators.txn.TxnValueGenerator)
-- [`algopy_testing.ARC4ValueGenerator`](#_algopy_testing.value_generators.arc4.ARC4ValueGenerator)
-
-The `any` property provides access to different value generators:
-
-- `AVMValueGenerator`: Base abstractions for AVM types. All methods are available directly on the instance returned from `any`.
-- `TxnValueGenerator`: Accessible via `any.txn`, for transaction-related data.
-- `ARC4ValueGenerator`: Accessible via `any.arc4`, for ARC4 type data.
-
-These generators allow creation of constrained random values for various AVM entities (accounts, assets, applications, etc.) when specific values are not required.
-
-```{hint}
-Value generators are powerful tools for generating test data for specified AVM types. They allow further constraints on random value generation via arguments, making it easier to generate test data when exact values are not necessary.
-
-When used with the 'Arrange, Act, Assert' pattern, value generators can be especially useful in setting up clear and concise test data in arrange steps.
-
-They can also serve as a base building block that can be integrated/reused with popular Python property-based testing frameworks like [`hypothesis`](https://hypothesis.readthedocs.io/en/latest/).
-```
+- [`algopy_testing.LedgerContext`](/algorand-python-testing/api/algopy_testing/context_helpers/ledger_context/)
+- [`algopy_testing.TransactionContext`](/algorand-python-testing/api/algopy_testing/context_helpers/txn_context/)
+- [`algopy_testing.AVMValueGenerator`](/algorand-python-testing/api/algopy_testing/value_generators/avm/)
+- [`algopy_testing.TxnValueGenerator`](/algorand-python-testing/api/algopy_testing/value_generators/txn/)
+- [`algopy_testing.ARC4ValueGenerator`](/algorand-python-testing/api/algopy_testing/value_generators/arc4/)
## Types of `algopy` stub implementations
-As explained in the [introduction](index.md), `algorand-python-testing` _injects_ test implementations for stubs available in the `algorand-python` package. However, not all of the stubs are implemented in the same manner:
+As explained in the [introduction](/algorand-python-testing/), `algorand-python-testing` _injects_ test implementations for stubs available in the `algorand-python` package. However, not all of the stubs are implemented in the same manner:
1. **Native**: Fully matches AVM computation in Python. For example, `algopy.op.sha256` and other cryptographic operations behave identically in AVM and unit tests. This implies that the majority of opcodes that are 'pure' functions in AVM also have a native Python implementation provided by this package. These abstractions and opcodes can be used within and outside of the testing context.
@@ -57,7 +40,7 @@ As explained in the [introduction](index.md), `algorand-python-testing` _injects
3. **Mockable**: Not implemented, but can be mocked or patched. For example, `algopy.abi_call` can be mocked to return specific values or behaviours; otherwise, it raises a `NotImplementedError`. This category covers cases where native or emulated implementation in a unit test context is impractical or overly complex.
-For a full list of all public `algopy` types and their corresponding implementation category, refer to the [Coverage](../coverage.md) section.
+For a full list of all public `algopy` types and their corresponding implementation category, refer to the [Coverage](/algorand-python-testing/reference/coverage/) section.
## Data Validation
diff --git a/docs/src/content/docs/concepts/value-generators.md b/docs/src/content/docs/concepts/value-generators.md
new file mode 100644
index 00000000..d4faebab
--- /dev/null
+++ b/docs/src/content/docs/concepts/value-generators.md
@@ -0,0 +1,34 @@
+---
+title: Value Generators
+description: Value generators produce constrained random values for AVM, transaction, and ARC4 types — handy for setting up test data without hand-crafting every field.
+---
+
+The [`AlgopyTestContext`](/algorand-python-testing/concepts/test-context/) exposes value generators via its `any` property. They produce randomized but constrained values for AVM entities (accounts, assets, applications, transactions, ARC4 types) so tests can focus on behaviour rather than fixture plumbing.
+
+```python
+with algopy_testing_context() as ctx:
+ sender = ctx.any.account()
+ payment = ctx.any.txn.payment(sender=sender, amount=algopy.UInt64(10_000))
+ arc4_string = ctx.any.arc4.string(length=10)
+```
+
+## Generator namespaces
+
+The `any` property exposes three generator surfaces:
+
+- `AVMValueGenerator`: Base abstractions for AVM types. All methods are available directly on the instance returned from `any` (e.g. `any.account()`, `any.asset()`, `any.uint64()`).
+- `TxnValueGenerator`: Accessible via `any.txn`, for transaction-related data (e.g. `any.txn.payment(...)`, `any.txn.application_call(...)`).
+- `ARC4ValueGenerator`: Accessible via `any.arc4`, for ARC4 type data (e.g. `any.arc4.string(...)`, `any.arc4.uint64(...)`).
+
+For full method signatures, see the API reference:
+
+- [`algopy_testing.AVMValueGenerator`](/algorand-python-testing/api/algopy_testing/value_generators/avm/)
+- [`algopy_testing.TxnValueGenerator`](/algorand-python-testing/api/algopy_testing/value_generators/txn/)
+- [`algopy_testing.ARC4ValueGenerator`](/algorand-python-testing/api/algopy_testing/value_generators/arc4/)
+
+> [!TIP]
+> Value generators are powerful tools for generating test data for specified AVM types. They allow further constraints on random value generation via arguments, making it easier to generate test data when exact values are not necessary.
+>
+> When used with the 'Arrange, Act, Assert' pattern, value generators can be especially useful in setting up clear and concise test data in arrange steps.
+>
+> They can also serve as a base building block that can be integrated/reused with popular Python property-based testing frameworks like [`hypothesis`](https://hypothesis.readthedocs.io/en/latest/).
diff --git a/docs/examples.md b/docs/src/content/docs/examples/index.md
similarity index 93%
rename from docs/examples.md
rename to docs/src/content/docs/examples/index.md
index 423421c4..57864fbc 100644
--- a/docs/examples.md
+++ b/docs/src/content/docs/examples/index.md
@@ -1,7 +1,12 @@
-# Examples
+---
+title: Examples
+description: Below is a showcase of various examples of unit testing real and sample Algorand Python smart contracts using `algorand-python-testing`.
+---
Below is a showcase of various examples of unit testing real and sample Algorand Python smart contracts using `algorand-python-testing`.
+Detailed per-example pages are generated from the repository `examples/` folders and available in this section's sidebar.
+
| Contract Name | Test File | Key Features Demonstrated | Test versions of Algopy Abstractions used |
| ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- |
| Auction | [test_contract.py](https://github.com/algorandfoundation/algorand-python-testing/blob/main/examples/auction/test_contract.py) | - Use of algopy_testing_context
- Mocking of global state and transaction fields
- Testing of ARC4 contract methods
- Emulation of asset creation and transfers
- Verification of inner transactions | - **ARC4Contract**
- **Global**
- **Txn**
- **Asset**
- **Account**
- **LocalState** |
diff --git a/docs/testing-guide/contract-testing.md b/docs/src/content/docs/guide/contract-testing.md
similarity index 91%
rename from docs/testing-guide/contract-testing.md
rename to docs/src/content/docs/guide/contract-testing.md
index df057dad..01fe2d9e 100644
--- a/docs/testing-guide/contract-testing.md
+++ b/docs/src/content/docs/guide/contract-testing.md
@@ -1,14 +1,16 @@
-# Smart Contract Testing
+---
+title: Smart Contract Testing
+description: This guide provides an overview of how to test smart contracts using the Algorand Python SDK (`algopy`). It covers the basics of testing `ARC4Contract` and `Contract` classes, focusing on the `baremethod`, `abimethod` and `public` (an alias of `abimethod`) decorators.
+---
This guide provides an overview of how to test smart contracts using the Algorand Python SDK (`algopy`). It covers the basics of testing `ARC4Contract` and `Contract` classes, focusing on the `baremethod`, `abimethod` and `public` (an alias of `abimethod`) decorators.

-```{note}
-The code snippets showcasing the contract testing capabilities are using [pytest](https://docs.pytest.org/en/latest/) as the test framework. However, note that the `algorand-python-testing` package can be used with any other test framework that supports Python. `pytest` is used for demonstration purposes in this documentation.
-```
+> [!NOTE]
+> The code snippets showcasing the contract testing capabilities are using [pytest](https://docs.pytest.org/en/latest/) as the test framework. However, note that the `algorand-python-testing` package can be used with any other test framework that supports Python. `pytest` is used for demonstration purposes in this documentation.
-```{testsetup}
+```python
import algopy
import algopy_testing
from algopy_testing import algopy_testing_context
@@ -24,9 +26,9 @@ context = ctx_manager.__enter__()
Subclasses of `algopy.ARC4Contract` are **required** to be instantiated with an active test context. As part of instantiation, the test context will automatically create a matching `algopy.Application` object instance.
-Within the class implementation, methods decorated with `algopy.arc4.abimethod` (or its alias, `algopy.public`) and `algopy.arc4.baremethod` will automatically assemble an `algopy.gtxn.ApplicationCallTransaction` to emulate the AVM application call. This behaviour can be overridden by setting the transaction group manually as part of test setup; this is done via implicit invocation of the `algopy_testing.context.any_application()` _value generator_ (refer to the [API](../api.md) for more details).
+Within the class implementation, methods decorated with `algopy.arc4.abimethod` (or its alias, `algopy.public`) and `algopy.arc4.baremethod` will automatically assemble an `algopy.gtxn.ApplicationCallTransaction` to emulate the AVM application call. This behaviour can be overridden by setting the transaction group manually as part of test setup; this is done via implicit invocation of the `algopy_testing.context.any_application()` _value generator_ (refer to the [API](/algorand-python-testing/api/algopy_testing/) for more details).
-```{testcode}
+```python
class SimpleVotingContract(algopy.ARC4Contract):
def __init__(self) -> None:
self.topic = algopy.GlobalState(algopy.Bytes(b"default_topic"), key="topic", description="Voting topic")
@@ -99,10 +101,9 @@ votes = contract.get_votes()
# Assert - Check votes
assert votes == algopy.UInt64(0)
-
```
-For more examples of tests using `algopy.ARC4Contract`, see the [examples](../examples.md) section.
+For more examples of tests using `algopy.ARC4Contract`, see the [examples](/algorand-python-testing/examples/) section.
## `algopy.Contract`
@@ -112,7 +113,7 @@ Unlike `algopy.ARC4Contract`, `algopy.Contract` requires manual setup of the tra
Here's an updated example demonstrating how to test a `Contract` class:
-```{testcode}
+```python
import algopy
import pytest
from algopy_testing import AlgopyTestContext, algopy_testing_context
@@ -220,6 +221,6 @@ def test_deferred_call(context):
A deferred application call prepares the application call transaction without immediately executing it. The call can be executed later by invoking the `.submit()` method on the deferred application call instance. As demonstrated in the example, you can also include the deferred call in a transaction group creation context manager to execute it as part of a larger transaction group. When `.submit()` is called, only the specific method passed to `defer_app_call()` will be executed.
-```{testcleanup}
+```python
ctx_manager.__exit__(None, None, None)
```
diff --git a/docs/testing-guide/signature-testing.md b/docs/src/content/docs/guide/signature-testing.md
similarity index 82%
rename from docs/testing-guide/signature-testing.md
rename to docs/src/content/docs/guide/signature-testing.md
index 8c260d37..2b303738 100644
--- a/docs/testing-guide/signature-testing.md
+++ b/docs/src/content/docs/guide/signature-testing.md
@@ -1,8 +1,11 @@
-# Smart Signature Testing
+---
+title: Smart Signature Testing
+description: Test Algorand smart signatures (LogicSigs) with ease using the Algorand Python Testing framework.
+---
Test Algorand smart signatures (LogicSigs) with ease using the Algorand Python Testing framework.
-```{testsetup}
+```python
import algopy
from algopy_testing import algopy_testing_context
@@ -17,7 +20,7 @@ context = ctx_manager.__enter__()
Use the `@logicsig` decorator to create a LogicSig:
-```{testcode}
+```python
from algopy import logicsig, Account, Txn, Global, UInt64, Bytes
@logicsig
@@ -30,7 +33,7 @@ def hashed_time_locked_lsig() -> bool:
Use `AlgopyTestContext.execute_logicsig()` to run and verify LogicSigs:
-```{testcode}
+```python
with context.txn.create_group([
context.any.txn.payment(),
]):
@@ -48,13 +51,13 @@ assert result is True
Provide arguments to LogicSigs using `execute_logicsig()`:
-```{testcode}
+```python
result = context.execute_logicsig(hashed_time_locked_lsig, algopy.Bytes(b"secret"))
```
Access arguments in the LogicSig with `algopy.op.arg()` opcode:
-```{testcode}
+```python
@logicsig
def hashed_time_locked_lsig() -> bool:
secret = algopy.op.arg(0)
@@ -66,8 +69,8 @@ secret = algopy.Bytes(b"secret")
assert context.execute_logicsig(hashed_time_locked_lsig, secret)
```
-For more details on available operations, see the [coverage](../coverage.md).
+For more details on available operations, see the [coverage](/algorand-python-testing/reference/coverage/).
-```{testcleanup}
+```python
ctx_manager.__exit__(None, None, None)
```
diff --git a/docs/testing-guide/state-management.md b/docs/src/content/docs/guide/state-management.md
similarity index 95%
rename from docs/testing-guide/state-management.md
rename to docs/src/content/docs/guide/state-management.md
index 2fd0f992..42f20fdd 100644
--- a/docs/testing-guide/state-management.md
+++ b/docs/src/content/docs/guide/state-management.md
@@ -1,8 +1,11 @@
-# State Management
+---
+title: State Management
+description: import algopy
+---
`algorand-python-testing` provides tools to test state-related abstractions in Algorand smart contracts. This guide covers global state, local state, boxes, and scratch space management.
-```{testsetup}
+```python
import algopy
from algopy_testing import algopy_testing_context
@@ -17,7 +20,7 @@ context = ctx_manager.__enter__()
Global state is represented as instance attributes on `algopy.Contract` and `algopy.ARC4Contract` classes.
-```{testcode}
+```python
class MyContract(algopy.ARC4Contract):
def __init__(self):
self.state_a = algopy.GlobalState(algopy.UInt64, key="global_uint64")
@@ -69,7 +72,7 @@ assert algopy.Bytes(b"item_a") not in contract.scores
Local state is defined similarly to global state, but accessed using account addresses as keys.
-```{testcode}
+```python
class MyContract(algopy.ARC4Contract):
def __init__(self):
self.local_state_a = algopy.LocalState(algopy.UInt64, key="state_a")
@@ -125,7 +128,7 @@ assert contract.balances[account2, algopy.Bytes(b"item_a")] == algopy.arc4.UInt6
The framework supports various Box abstractions available in `algorand-python`.
-```{testcode}
+```python
class MyContract(algopy.ARC4Contract):
def __init__(self):
self.box_map = algopy.BoxMap(algopy.Bytes, algopy.UInt64)
@@ -158,7 +161,7 @@ with context.txn.create_group():
Scratch space is represented as a list of 256 slots for each transaction.
-```{testcode}
+```python
class MyContract(algopy.Contract, scratch_slots=(1, 2, algopy.urange(3, 20))):
def approval_program(self):
algopy.op.Scratch.store(1, algopy.UInt64(5))
@@ -174,8 +177,8 @@ scratch_space = context.txn.last_group.get_scratch_space()
assert scratch_space[1] == algopy.UInt64(5)
```
-For more detailed information, explore the example contracts in the `examples/` directory, the [coverage](../coverage.md) page, and the [API documentation](../api.md).
+For more detailed information, explore the example contracts in the `examples/` directory, the [coverage](/algorand-python-testing/reference/coverage/) page, and the [API documentation](/algorand-python-testing/api/algopy_testing/).
-```{testcleanup}
+```python
ctx_manager.__exit__(None, None, None)
```
diff --git a/docs/testing-guide/subroutines.md b/docs/src/content/docs/guide/subroutines.md
similarity index 87%
rename from docs/testing-guide/subroutines.md
rename to docs/src/content/docs/guide/subroutines.md
index 2dc13383..3371f24e 100644
--- a/docs/testing-guide/subroutines.md
+++ b/docs/src/content/docs/guide/subroutines.md
@@ -1,8 +1,11 @@
-# Subroutines
+---
+title: Subroutines
+description: Subroutines allow direct testing of internal contract logic without full application calls.
+---
Subroutines allow direct testing of internal contract logic without full application calls.
-```{testsetup}
+```python
import algopy
import algopy_testing
from algopy_testing import algopy_testing_context
@@ -24,7 +27,7 @@ The `@algopy.subroutine` decorator exposes contract methods for isolated testing
1. Decorate internal methods with `@algopy.subroutine`:
-```{testcode}
+```python
from algopy import subroutine, UInt64
class MyContract:
@@ -35,7 +38,7 @@ class MyContract:
2. Test the subroutine directly:
-```{testcode}
+```python
def test_calculate_value(context: algopy_testing.AlgopyTestContext):
contract = MyContract()
result = contract.calculate_value(UInt64(5))
@@ -57,8 +60,8 @@ def test_calculate_value(context: algopy_testing.AlgopyTestContext):
## Example
-For a complete example, see the `simple_voting` contract in the [examples](../examples.md) section.
+For a complete example, see the `simple_voting` contract in the [examples](/algorand-python-testing/examples/) section.
-```{testcleanup}
+```python
ctx_manager.__exit__(None, None, None)
```
diff --git a/docs/testing-guide/transactions.md b/docs/src/content/docs/guide/transactions.md
similarity index 89%
rename from docs/testing-guide/transactions.md
rename to docs/src/content/docs/guide/transactions.md
index 73701d1d..f5999dcc 100644
--- a/docs/testing-guide/transactions.md
+++ b/docs/src/content/docs/guide/transactions.md
@@ -1,8 +1,11 @@
-# Transactions
+---
+title: Transactions
+description: The testing framework follows the Transaction definitions described in [`algorand-python` docs](https://algorandfoundation.github.io/puya/lg-transactions.html). This section focuses on _value generators_ and interactions with inner transactions, it also explains how the framework identifies _active_ transaction group during contract method/subroutine/logicsig invocation.
+---
The testing framework follows the Transaction definitions described in [`algorand-python` docs](https://algorandfoundation.github.io/puya/lg-transactions.html). This section focuses on _value generators_ and interactions with inner transactions, it also explains how the framework identifies _active_ transaction group during contract method/subroutine/logicsig invocation.
-```{testsetup}
+```python
import algopy
import algopy_testing
from algopy_testing import algopy_testing_context
@@ -16,20 +19,11 @@ context = ctx_manager.__enter__()
## Group Transactions
-Refers to test implementation of transaction stubs available under `algopy.gtxn.*` namespace. Available under [`algopy.TxnValueGenerator`](#_algopy_testing.value_generators.txn.TxnValueGenerator) instance accessible via `context.any.txn` property:
-
-```{mermaid}
-graph TD
- A[TxnValueGenerator] --> B[payment]
- A --> C[asset_transfer]
- A --> D[application_call]
- A --> E[asset_config]
- A --> F[key_registration]
- A --> G[asset_freeze]
- A --> H[transaction]
-```
+Refers to test implementation of transaction stubs available under `algopy.gtxn.*` namespace. Available under [`algopy.TxnValueGenerator`](/algorand-python-testing/api/algopy_testing/value_generators/txn/) instance accessible via `context.any.txn` property:
+
+
-```{testcode}
+```python
... # instantiate test context
# Generate a random payment transaction
@@ -107,9 +101,9 @@ generic_txn = context.any.txn.transaction(
When a smart contract instance (application) is interacted with on the Algorand network, it must be performed in relation to a specific transaction or transaction group where one or many transactions are application calls to target smart contract instances.
-To emulate this behaviour, the `create_group` context manager is available on [`algopy.TransactionContext`](#_algopy_testing.context_helpers.txn_context.TransactionContext) instance that allows setting temporary transaction fields within a specific scope, passing in emulated transaction objects and identifying the active transaction index within the transaction group
+To emulate this behaviour, the `create_group` context manager is available on [`algopy.TransactionContext`](/algorand-python-testing/api/algopy_testing/context_helpers/txn_context/) instance that allows setting temporary transaction fields within a specific scope, passing in emulated transaction objects and identifying the active transaction index within the transaction group
-```{testcode}
+```python
import algopy
from algopy_testing import AlgopyTestContext, algopy_testing_context
@@ -141,7 +135,7 @@ Inner transactions are AVM transactions that are signed and executed by AVM appl
When testing smart contracts, to stay consistent with AVM, the framework _does not allow you to submit inner transactions outside of contract/subroutine invocation_, but you can interact with and manage inner transactions using the test context manager as follows:
-```{testcode}
+```python
class MyContract(algopy.ARC4Contract):
@algopy.public
def pay_via_itxn(self, asset: algopy.Asset) -> None:
@@ -196,7 +190,7 @@ These methods provide type validation and will raise an error if the requested t
The following example demonstrates how to test this functionality using the `algorand-python-testing` package.
-```{testcode}
+```python
from algopy import Application, ARC4Contract, Array, Global, arc4, gtxn, itxn, TransactionType, Txn, UInt64, urange
class DynamicItxnGroup(ARC4Contract):
@@ -261,9 +255,9 @@ assert itxns.asset_config(4).asset_name == b"abc"
## References
-- [API](../api.md) for more details on the test context manager and inner transactions related methods that perform implicit inner transaction type validation.
-- [Examples](../examples.md) for more examples of smart contracts and associated tests that interact with inner transactions.
+- [API](/algorand-python-testing/api/algopy_testing/) for more details on the test context manager and inner transactions related methods that perform implicit inner transaction type validation.
+- [Examples](/algorand-python-testing/examples/) for more examples of smart contracts and associated tests that interact with inner transactions.
-```{testcleanup}
+```python
ctx_manager.__exit__(None, None, None)
```
diff --git a/docs/src/content/docs/index.mdx b/docs/src/content/docs/index.mdx
new file mode 100644
index 00000000..12dd18af
--- /dev/null
+++ b/docs/src/content/docs/index.mdx
@@ -0,0 +1,80 @@
+---
+title: Algorand Python Testing
+description: Offline unit testing toolkit for Algorand Python smart contracts.
+template: splash
+hero:
+ title: Algorand Python Testing
+ tagline: Offline unit testing for Algorand Python smart contracts — fast, Pythonic, network-free.
+ actions:
+ - text: Get Started
+ link: tutorials/quick-start/
+ icon: right-arrow
+ - text: API Reference
+ link: api/algopy_testing/
+ variant: minimal
+---
+
+import { Card, CardGrid, Tabs, TabItem } from "@astrojs/starlight/components";
+
+## Installation
+
+`algorand-python-testing` is a companion to [Algorand Python](https://github.com/algorandfoundation/puya) and requires Python 3.12+.
+
+
+
+ ```bash
+ pip install algorand-python-testing
+ ```
+
+
+ ```bash
+ poetry add algorand-python-testing
+ ```
+
+
+ ```bash
+ uv add algorand-python-testing
+ ```
+
+
+
+## Quick Example
+
+```python
+import algopy
+from algopy_testing import algopy_testing_context
+
+class Counter(algopy.ARC4Contract):
+ def __init__(self) -> None:
+ self.count = algopy.GlobalState(algopy.UInt64(0))
+
+ @algopy.arc4.abimethod
+ def increment(self) -> algopy.arc4.UInt64:
+ self.count.value += algopy.UInt64(1)
+ return algopy.arc4.UInt64(self.count.value)
+
+with algopy_testing_context() as ctx:
+ contract = Counter()
+ result = contract.increment()
+ assert result.native == 1
+ assert contract.count.value == 1
+```
+
+See the [Quick Start tutorial](/algorand-python-testing/tutorials/quick-start/) for a richer walkthrough.
+
+## Features
+
+
+
+ Emulate AVM behaviour in pure Python — no sandbox, no network, no waiting.
+
+
+ First-class testing for `ARC4Contract` classes, ABI methods, and ARC4 types.
+
+
+ Build transaction groups, manage global/local/box state, and inspect inner txns.
+
+
+ Plain Python tests — works with pytest, unittest, and hypothesis out of the box.
+
+
diff --git a/docs/coverage.md b/docs/src/content/docs/reference/coverage.md
similarity index 95%
rename from docs/coverage.md
rename to docs/src/content/docs/reference/coverage.md
index b2dacd19..4a97962f 100644
--- a/docs/coverage.md
+++ b/docs/src/content/docs/reference/coverage.md
@@ -1,6 +1,9 @@
-# Coverage
+---
+title: Coverage
+description: Coverage of algorand-python stubs implemented by algorand-python-testing.
+---
-See which `algorand-python` stubs are implemented by the `algorand-python-testing` library. See the [Concepts](testing-guide/concepts.md#types-of-algopy-stub-implementations) section for more details on the implementation categories. Refer to the [`algorand-python` stubs API](api.md) for the full list of stubs for which the `algorand-python-testing` library provides implementations referenced in the table below.
+See which `algorand-python` stubs are implemented by the `algorand-python-testing` library. See the [Test Context concept page](/algorand-python-testing/concepts/test-context/#types-of-algopy-stub-implementations) for more details on the implementation categories. Refer to the [`algorand-python` stubs API](/algorand-python-testing/api/algopy_testing/) for the full list of stubs for which the `algorand-python-testing` library provides implementations referenced in the table below.
| Name | Implementation type |
| ------------------------------------------- | ------------------- |
diff --git a/docs/faq.md b/docs/src/content/docs/reference/faq.md
similarity index 87%
rename from docs/faq.md
rename to docs/src/content/docs/reference/faq.md
index 335eb5df..4eaed139 100644
--- a/docs/faq.md
+++ b/docs/src/content/docs/reference/faq.md
@@ -1,8 +1,11 @@
-# FAQ
+---
+title: FAQ
+description: Frequently asked questions about using Algorand Python Testing.
+---
## What is a Test Context?
-A Test Context is a context manager that provides a simulated Algorand environment for testing Python smart contracts. It allows developers to create and manipulate a virtual Algorand ecosystem for testing purposes. For more details, see the [Test Context section](testing-guide/concepts.md#test-context) in our documentation.
+A Test Context is a context manager that provides a simulated Algorand environment for testing Python smart contracts. It allows developers to create and manipulate a virtual Algorand ecosystem for testing purposes. For more details, see the [Test Context section](/algorand-python-testing/concepts/test-context/) in our documentation.
## What is the Algorand Virtual Machine (AVM)?
@@ -14,7 +17,7 @@ Operational Codes, or opcodes, are AVM instructions that are executed directly b
## What are Value Generators?
-Value Generators are helper methods that produce randomized values for testing when the exact value of a type isn't important. In Algorand Python testing these generators are exposed as properties on the test context manager and accessed via `any.*` (for example, `any.arc4.*` and `any.txn.*` for ARC4 types). To learn more, see the [Value Generators section](testing-guide/concepts.md#value-generators).
+Value Generators are helper methods that produce randomized values for testing when the exact value of a type isn't important. In Algorand Python testing these generators are exposed as properties on the test context manager and accessed via `any.*` (for example, `any.arc4.*` and `any.txn.*` for ARC4 types). To learn more, see the [Value Generators section](/algorand-python-testing/concepts/value-generators/).
## What are the limitations of the Algorand Python Testing framework?
@@ -42,7 +45,7 @@ The framework does not implement a strict opcode budget system. For scenarios wh
## Are all cryptographic operations fully implemented?
-Some cryptographic operations are mocked or simplified in the framework. For a detailed list of which operations are mocked, refer to the _mockable_ types under the [coverage](./coverage.md) section.
+Some cryptographic operations are mocked or simplified in the framework. For a detailed list of which operations are mocked, refer to the _mockable_ types under the [coverage](/algorand-python-testing/reference/coverage/) section.
## Can I use this framework for security-critical validations?
@@ -52,9 +55,8 @@ While this framework is useful for unit testing and local development, it should
Yes, the `algokit-python-template`, accessible via `algokit init`, provides a working example of how to structure `algorand-python-testing` along with regular integration tests against localnet.
-```{hint}
-The `algokit-python-template`, accessible via `algokit init -t python`, provides a comprehensive and customizable working example of how to structure `algorand-python-testing` along with regular integration tests against localnet.
-```
+> [!TIP]
+> The `algokit-python-template`, accessible via `algokit init -t python`, provides a comprehensive and customizable working example of how to structure `algorand-python-testing` along with regular integration tests against localnet.
## Is it compatible with `pytest`?
diff --git a/docs/src/content/docs/tutorials/quick-start.md b/docs/src/content/docs/tutorials/quick-start.md
new file mode 100644
index 00000000..508d2f0d
--- /dev/null
+++ b/docs/src/content/docs/tutorials/quick-start.md
@@ -0,0 +1,107 @@
+---
+title: Quick Start
+description: Install algorand-python-testing and write your first contract test in minutes.
+---
+
+This tutorial walks through installing `algorand-python-testing`, writing a small ARC4 contract, and exercising it inside a test context.
+
+## Install
+
+`algorand-python-testing` is distributed via [PyPI](https://pypi.org/project/algorand-python-testing/) and requires Python 3.12+. [Algorand Python (`algopy`)](https://github.com/algorandfoundation/puya) is a peer dependency that ships the type stubs your contract code targets.
+
+```bash
+pip install algorand-python-testing
+```
+
+> [!NOTE]
+> While `algorand-python-testing` offers valuable unit testing capabilities, it's not a replacement for comprehensive testing. Use it alongside other test types — particularly those running against the actual Algorand Network — for thorough contract validation.
+
+## Write a contract
+
+A small voting contract demonstrates ARC4 methods, payment-transaction guards, and global/local state:
+
+```python
+import algopy
+from algopy import arc4
+
+class VotingContract(algopy.ARC4Contract):
+ def __init__(self) -> None:
+ self.topic = algopy.GlobalState(algopy.Bytes(b"default_topic"), key="topic", description="Voting topic")
+ self.votes = algopy.GlobalState(
+ algopy.UInt64(0),
+ key="votes",
+ description="Votes for the option",
+ )
+ self.voted = algopy.LocalState(algopy.UInt64, key="voted", description="Tracks if an account has voted")
+
+ @algopy.arc4.abimethod
+ def set_topic(self, topic: arc4.String) -> None:
+ self.topic.value = topic.bytes
+
+ @arc4.abimethod
+ def vote(self, pay: algopy.gtxn.PaymentTransaction) -> arc4.Bool:
+ assert algopy.op.Global.group_size == algopy.UInt64(2), "Expected 2 transactions"
+ assert pay.amount == algopy.UInt64(10_000), "Incorrect payment amount"
+ assert pay.sender == algopy.Txn.sender, "Payment sender must match transaction sender"
+
+ _value, exists = self.voted.maybe(algopy.Txn.sender)
+ if exists:
+ return arc4.Bool(False) # Already voted
+ self.votes.value += algopy.UInt64(1)
+ self.voted[algopy.Txn.sender] = algopy.UInt64(1)
+ return arc4.Bool(True)
+
+ @algopy.arc4.abimethod(readonly=True)
+ def get_votes(self) -> arc4.UInt64:
+ return arc4.UInt64(self.votes.value)
+
+ def clear_state_program(self) -> bool:
+ return True
+```
+
+## Test it
+
+Drive the contract with `algopy_testing_context()`. The context manager exposes value generators (`any`), an emulated ledger, and transaction-group helpers — enough to invoke ABI methods directly and assert against state changes.
+
+```python
+from algopy_testing import algopy_testing_context
+from algopy import arc4
+
+with algopy_testing_context() as context:
+ contract = VotingContract()
+
+ # Vote with a payment transaction
+ voter = context.default_sender
+ payment = context.any.txn.payment(
+ sender=voter,
+ amount=algopy.UInt64(10_000),
+ )
+ result = contract.vote(payment)
+ assert result.native is True
+ assert contract.votes.value == 1
+ assert contract.voted[voter] == 1
+
+ # Update the topic
+ new_topic = context.any.arc4.string(10)
+ contract.set_topic(new_topic)
+ assert contract.topic.value == new_topic.bytes
+
+ # Read votes back
+ contract.votes.value = algopy.UInt64(5)
+ assert contract.get_votes().native == 5
+```
+
+This example exercises every layer of the framework:
+
+1. **ARC4 contracts**: `algopy.ARC4Contract` base class, `@arc4.abimethod` (and its `@algopy.arc4.abimethod` alias), and ARC4 types like `arc4.String`, `arc4.Bool`, `arc4.UInt64`.
+2. **Test data**: `context.any.txn` for transactions, `context.any.arc4` for ARC4 values.
+3. **Direct invocation**: ABI methods are called directly on the contract instance — no deployment.
+4. **State verification**: assert against `self.votes.value`, `self.voted[...]`, etc.
+
+## Next steps
+
+- [Concepts → Test Context](/algorand-python-testing/concepts/test-context/) — deeper dive into the context manager
+- [Concepts → Value Generators](/algorand-python-testing/concepts/value-generators/) — `any.*` generator surface
+- [Guide → Contract Testing](/algorand-python-testing/guide/contract-testing/) — patterns for `ARC4Contract` and `Contract`
+- [Examples](/algorand-python-testing/examples/) — full contracts with tests
+- [API Reference](/algorand-python-testing/api/algopy_testing/) — complete module docs
diff --git a/docs/src/styles/api-reference.css b/docs/src/styles/api-reference.css
new file mode 100644
index 00000000..ff948c1b
--- /dev/null
+++ b/docs/src/styles/api-reference.css
@@ -0,0 +1,75 @@
+/*
+ * API Reference styling for auto-generated sphinx-autoapi docs.
+ *
+ * Modelled after the Python/Furo theme:
+ * - Class/type definitions (H3 with ) get a subtle rounded box
+ * - Module-level functions (H3 without ) are inline, no box
+ * - Attributes, methods, properties (H4) are compact inline declarations
+ */
+
+.api-ref {
+ --api-border-color: color-mix(in srgb, var(--sl-color-gray-3) 60%, transparent);
+}
+
+/* ── Base H3 — monospace, reduced size, no box ── */
+.api-ref h3 {
+ font-family: var(--sl-font-mono, ui-monospace, monospace);
+ font-size: var(--sl-text-base, 1rem);
+ font-weight: 400;
+ margin-top: 2rem;
+ padding: 0.25rem 0;
+ border-bottom: 1px solid var(--sl-color-gray-6, #343841);
+}
+
+/* ── Class/type definitions (H3 with ) — boxed like Furo ── */
+.api-ref h3:has(> em) {
+ padding: 0.5rem 0.75rem;
+ background: var(--sl-color-gray-7, #23262f);
+ border-left: 3px solid var(--sl-color-accent, #6366f1);
+ border-bottom: none;
+ border-radius: 0.25rem;
+}
+
+/* Keyword styling: class, type, property in blue italic */
+.api-ref h3 em {
+ color: var(--sl-color-blue, #60a5fa);
+ font-style: italic;
+}
+
+/* ── Attributes, methods, properties (H4) — compact field style ── */
+.api-ref h4 {
+ font-family: var(--sl-font-mono, ui-monospace, monospace);
+ font-size: var(--sl-text-sm, 0.875rem);
+ font-weight: 600;
+ margin-top: 1.25rem;
+ margin-bottom: 0.25rem;
+ padding: 0.25rem 0;
+ border-bottom: 1px solid var(--sl-color-gray-6, #343841);
+}
+
+/* Type annotations and keywords in H4 — subdued */
+.api-ref h4 em {
+ font-weight: 400;
+ color: var(--sl-color-gray-3, #9ca3af);
+ font-style: normal;
+}
+
+/* Override Starlight's em-based inline-end padding with rem so the hover anchor icon sits beside the text, not over it. */
+.api-ref .sl-heading-wrapper > h3,
+.api-ref .sl-heading-wrapper > h4 {
+ padding-inline-end: 1.5rem;
+}
+
+/* ── Generated API tables (sphinx docutils) — keep readable ── */
+.api-ref table.docutils {
+ display: table;
+ width: 100%;
+ border-collapse: collapse;
+}
+
+.api-ref table.docutils th,
+.api-ref table.docutils td {
+ border: 1px solid var(--api-border-color);
+ padding: 0.5rem 0.75rem;
+ vertical-align: top;
+}
diff --git a/docs/tsconfig.json b/docs/tsconfig.json
new file mode 100644
index 00000000..70887920
--- /dev/null
+++ b/docs/tsconfig.json
@@ -0,0 +1,8 @@
+{
+ "extends": "astro/tsconfigs/strict",
+ "compilerOptions": {
+ "types": ["node"]
+ },
+ "include": [".astro/types.d.ts", "**/*"],
+ "exclude": ["dist"]
+}
diff --git a/pyproject.toml b/pyproject.toml
index 25c5209e..7ca57816 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -25,7 +25,7 @@ dependencies = [
"ecdsa>=0.17.0",
"coincurve>=19.0.1",
"algorand-python>=3",
- "algokit-utils>=5.0.0b1",
+ "algokit-utils>=5.0.0b3",
]
[project.urls]
@@ -73,7 +73,7 @@ check = [
"hatch run examples:check",
]
# type checks algorand-python-testing code
-mypy_testing = "mypy . --exclude examples"
+mypy_testing = "mypy . --exclude examples --exclude docs"
tests = "pytest --cov=src --cov-report xml {args}"
tests_cov = [
"pytest --cov=src --cov-report=html",
@@ -139,13 +139,9 @@ path = ".venv.docs"
type = "virtual"
python = "3.12"
dependencies = [
- "sphinx>=7.2.6",
- "furo>=2024.1.29",
- "myst-parser>=2.0.0",
- "sphinx-autodoc2>=0.5.0",
- "sphinx-copybutton>=0.5.2",
- "sphinx-autobuild>=2024.4.16",
- "sphinx-mermaid",
+ "sphinx>=8.0.0,<9",
+ "sphinx-autoapi>=3.4.0,<4",
+ "sphinx-markdown-builder>=0.6.8",
"ipykernel",
"pytest",
]
@@ -158,10 +154,14 @@ post-install-commands = [
]
[tool.hatch.envs.docs.scripts]
-test = "sphinx-build -b doctest docs docs/_build -W --keep-going -n -E"
-clear = "rm -rf docs/_build"
-build = "hatch run docs:clear && sphinx-build docs docs/_build -W --keep-going -n -E"
-dev = "hatch run docs:test && sphinx-autobuild docs docs/_build"
+api = "python docs/api_build.py"
+clear = "rm -rf docs/dist docs/src/content/docs/api docs/src/content/docs/examples"
+build = [
+ "hatch run docs:api",
+ "pnpm --dir docs run build",
+ "node docs/scripts/generate-legacy-redirects.mjs",
+]
+dev = "hatch run docs:api && pnpm --dir docs run dev"
# Examples environment
[tool.hatch.envs.examples]
@@ -288,6 +288,16 @@ unfixable = [
"scripts/**/*.py" = ["T201"]
"scripts/refresh_test_artifacts.py" = ["S603"]
"scripts/validate_examples.py" = ["S603"]
+"docs/**/*.py" = [
+ "T201", # print is fine for build scripts
+ "S603", # internal subprocess usage
+ "S607", # internal subprocess usage
+ "EXE001", # shebang harmless
+ "INP001", # sphinx conf is intentionally not a package
+ "ANN001", # sphinx callback signatures
+ "ANN202", # sphinx callback signatures
+ "ISC001", # split regex literals are intentional
+]
[tool.ruff.lint.flake8-annotations]
allow-star-arg-any = true
diff --git a/src/_algopy_testing/arc4.py b/src/_algopy_testing/arc4.py
index be60bf9a..2fefea6e 100644
--- a/src/_algopy_testing/arc4.py
+++ b/src/_algopy_testing/arc4.py
@@ -1161,8 +1161,8 @@ def _is_arc4_type(field_type: typing.Any) -> bool:
def _arc4_type_for_field(field_type: typing.Any) -> type[_ABIEncoded]:
"""Resolve a struct field's declared type to its ARC-4 equivalent.
- Fields annotated with ARC-4 types are returned as-is; native/algopy types
- are mapped via the serializer registry so `arc4.Struct` accepts either.
+ Fields annotated with ARC-4 types are returned as-is; native/algopy types are mapped
+ via the serializer registry so `arc4.Struct` accepts either.
"""
if _is_arc4_type(field_type):
return field_type # type: ignore[no-any-return]
diff --git a/src/_algopy_testing/primitives/fixed_bytes.py b/src/_algopy_testing/primitives/fixed_bytes.py
index ecde74e2..13ea7bd0 100644
--- a/src/_algopy_testing/primitives/fixed_bytes.py
+++ b/src/_algopy_testing/primitives/fixed_bytes.py
@@ -106,7 +106,6 @@ def __len__(self) -> int:
def __eq__(self, other: FixedBytes[_TBytesLength_Arg] | Bytes | bytes) -> bool: # type: ignore[override]
"""FixedBytes can be compared using the `==` operator with another FixedBytes,
Bytes or bytes."""
-
if isinstance(other, FixedBytes) and other.length != self.length:
return False
diff --git a/src/_algopy_testing/primitives/uint64.py b/src/_algopy_testing/primitives/uint64.py
index a19b95b1..9989672c 100644
--- a/src/_algopy_testing/primitives/uint64.py
+++ b/src/_algopy_testing/primitives/uint64.py
@@ -185,7 +185,6 @@ def __hash__(self) -> int:
def _as_maybe_uint64(value: object) -> int | None:
"""Returns int value if `value` is an int or UInt64, otherwise None."""
-
match value:
case int(int_value):
return as_int64(int_value)
diff --git a/src/_algopy_testing/state/box.py b/src/_algopy_testing/state/box.py
index c95aca8c..4cd811a7 100644
--- a/src/_algopy_testing/state/box.py
+++ b/src/_algopy_testing/state/box.py
@@ -121,16 +121,19 @@ def extract(
return _BoxRef(key=self.key).extract(start_index, length)
def resize(self, new_size: algopy.UInt64 | int) -> None:
- """Resizes the box the specified `new_size`. Truncating existing data if the new
- value is shorter or padding with zero bytes if it is longer.
+ """Resizes the box the specified `new_size`.
+
+ Truncating existing data if the new value is shorter or padding with zero bytes
+ if it is longer.
:arg new_size: The new size of the box
"""
return _BoxRef(key=self.key).resize(new_size)
def replace(self, start_index: algopy.UInt64 | int, value: algopy.Bytes | bytes) -> None:
- """Write `value` to the box starting at `start_index`. Fails if the box does not
- exist, or if `start_index + len(value) > len(box)`
+ """Write `value` to the box starting at `start_index`.
+
+ Fails if the box does not exist, or if `start_index + len(value) > len(box)`
:arg start_index: The offset to start writing bytes from
:arg value: The bytes to be written
@@ -147,9 +150,9 @@ def splice(
`bytes`, followed by the original bytes of the box that began at index
`start_index + length`
- **Important: This op does not resize the box**
- If the new value is longer than the box size, it will be truncated.
- If the new value is shorter than the box size, it will be padded with zero bytes
+ **Important: This op does not resize the box** If the new value is longer than
+ the box size, it will be truncated. If the new value is shorter than the box
+ size, it will be padded with zero bytes
:arg start_index: The index to start inserting `value`
:arg length: The number of bytes after `start_index` to omit from the new value
@@ -327,8 +330,8 @@ class BoxMap(typing.Generic[_TKey, _TValue]):
"""BoxMap abstracts the reading and writing of a set of boxes using a common key and
content type.
- Each composite key (prefix + key) still needs to be made available to the application via the
- `boxes` property of the Transaction.
+ Each composite key (prefix + key) still needs to be made available to the
+ application via the `boxes` property of the Transaction.
"""
def __init__(
diff --git a/src/_algopy_testing/utilities/log.py b/src/_algopy_testing/utilities/log.py
index 9680f34e..00409519 100644
--- a/src/_algopy_testing/utilities/log.py
+++ b/src/_algopy_testing/utilities/log.py
@@ -14,8 +14,8 @@ def log(
) -> None:
"""Concatenates and logs supplied args as a single bytes value.
- UInt64 args are converted to bytes and each argument is separated by `sep`.
- Literal `str` values will be encoded as UTF8.
+ UInt64 args are converted to bytes and each argument is separated by `sep`. Literal
+ `str` values will be encoded as UTF8.
"""
logs: list[bytes] = []
@@ -55,14 +55,16 @@ def logged_assert(
failing if the condition is false.
The logged output follows the format ``{prefix}:{error_code}`` or
- ``{prefix}:{error_code}:{error_message}`` and is compatible with ARC-56 and ARC-32 clients.
+ ``{prefix}:{error_code}:{error_message}`` and is compatible with ARC-56 and ARC-32
+ clients.
- Note this increases the generated bytecode, so keeping ``error_code`` and ``error_message``
- short is recommended.
+ Note this increases the generated bytecode, so keeping ``error_code`` and
+ ``error_message`` short is recommended.
:arg condition: The condition to assert; if false, logs an error and fails.
:arg error_code: An alphanumeric error code. Must not contain ``:``.
- :arg error_message: Optional message appended after the code. Must not contain ``:``.
+ :arg error_message: Optional message appended after the code. Must not contain
+ ``:``.
:arg prefix: Error prefix, either ``"AER"`` or ``"ERR"``.
"""
if condition:
@@ -79,15 +81,17 @@ def logged_err(
) -> None:
"""Logs a formatted error message and immediately fails the transaction.
- Note this is equivalent to ``logged_assert(False, error_code, error_message, prefix)``.
- This function increases the generated bytecode, so keeping ``error_code`` and ``error_message``
- short is recommended.
+ Note this is equivalent to ``logged_assert(False, error_code, error_message,
+ prefix)``. This function increases the generated bytecode, so keeping ``error_code``
+ and ``error_message`` short is recommended.
The logged output follows the ARC-65 format ``{prefix}:{error_code}`` or
- ``{prefix}:{error_code}:{error_message}`` and is compatible with ARC-56 and ARC-32 clients.
+ ``{prefix}:{error_code}:{error_message}`` and is compatible with ARC-56 and ARC-32
+ clients.
:arg error_code: An alphanumeric error code. Must not contain ``:``.
- :arg error_message: Optional message appended after the code. Must not contain ``:``.
+ :arg error_message: Optional message appended after the code. Must not contain
+ ``:``.
:arg prefix: Error prefix, either ``"AER"`` or ``"ERR"``.
"""
msg = _resolve_error_message(error_code, error_message, prefix)
diff --git a/src/_algopy_testing/value_generators/arc4.py b/src/_algopy_testing/value_generators/arc4.py
index 6b2cd7cc..28a75928 100644
--- a/src/_algopy_testing/value_generators/arc4.py
+++ b/src/_algopy_testing/value_generators/arc4.py
@@ -20,7 +20,6 @@ def address(self) -> algopy.arc4.Address:
:returns: A new, random Algorand address.
"""
-
address = generate_random_account().addr
return arc4.Address(address)
@@ -94,8 +93,8 @@ def biguint512(self, min_value: int = 0, max_value: int = MAX_UINT512) -> algopy
def dynamic_bytes(self, n: int) -> algopy.arc4.DynamicBytes:
"""Generate a random dynamic bytes of size `n` bits.
- :param n: The number of bits for the dynamic bytes. Must be a multiple of 8, otherwise
- the last byte will be truncated.
+ :param n: The number of bits for the dynamic bytes. Must be a multiple of 8,
+ otherwise the last byte will be truncated.
:returns: A new, random dynamic bytes of size `n` bits.
"""
# rounding up
diff --git a/src/_algopy_testing/value_generators/avm.py b/src/_algopy_testing/value_generators/avm.py
index ad3227ac..aa736616 100644
--- a/src/_algopy_testing/value_generators/avm.py
+++ b/src/_algopy_testing/value_generators/avm.py
@@ -36,7 +36,8 @@ def uint64(self, min_value: int = 0, max_value: int = MAX_UINT64) -> algopy.UInt
:param min_value: Minimum value. Defaults to 0.
:param max_value: Maximum value. Defaults to MAX_UINT64.
:returns: The randomly generated UInt64 value.
- :raises ValueError: If `max_value` exceeds MAX_UINT64 or `min_value` exceeds `max_value`.
+ :raises ValueError: If `max_value` exceeds MAX_UINT64 or `min_value` exceeds
+ `max_value`.
"""
if max_value > MAX_UINT64:
raise ValueError("max_value must be less than or equal to MAX_UINT64")
@@ -146,7 +147,6 @@ def application(
**application_fields: typing.Unpack[ApplicationFields],
) -> algopy.Application:
r"""Generate and add a new application with a unique ID."""
-
new_app_id = id if id is not None else lazy_context.ledger._get_next_app_id()
if new_app_id in lazy_context.ledger._app_data:
diff --git a/tests/artifacts/AVM12/data/Contract.arc56.json b/tests/artifacts/AVM12/data/Contract.arc56.json
index 9b51d978..6495f04e 100644
--- a/tests/artifacts/AVM12/data/Contract.arc56.json
+++ b/tests/artifacts/AVM12/data/Contract.arc56.json
@@ -10,9 +10,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -26,19 +24,14 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
"recommendations": {}
}
],
- "arcs": [
- 22,
- 28
- ],
+ "arcs": [22, 28],
"networks": {},
"state": {
"schema": {
@@ -63,31 +56,22 @@
}
},
"bareActions": {
- "create": [
- "NoOp"
- ],
+ "create": ["NoOp"],
"call": []
},
"sourceInfo": {
"approval": {
"sourceInfo": [
{
- "pc": [
- 138,
- 226
- ],
+ "pc": [138, 226],
"errorMessage": "application exists"
},
{
- "pc": [
- 140
- ],
+ "pc": [140],
"errorMessage": "should be version 0"
},
{
- "pc": [
- 229
- ],
+ "pc": [229],
"errorMessage": "should be version 1"
}
],
@@ -116,4 +100,4 @@
},
"events": [],
"templateVariables": {}
-}
\ No newline at end of file
+}
diff --git a/tests/artifacts/AVM12/data/ContractV0.arc56.json b/tests/artifacts/AVM12/data/ContractV0.arc56.json
index 2037d1c7..cedc5e07 100644
--- a/tests/artifacts/AVM12/data/ContractV0.arc56.json
+++ b/tests/artifacts/AVM12/data/ContractV0.arc56.json
@@ -10,19 +10,14 @@
},
"actions": {
"create": [],
- "call": [
- "UpdateApplication"
- ]
+ "call": ["UpdateApplication"]
},
"readonly": false,
"events": [],
"recommendations": {}
}
],
- "arcs": [
- 22,
- 28
- ],
+ "arcs": [22, 28],
"networks": {},
"state": {
"schema": {
@@ -47,18 +42,14 @@
}
},
"bareActions": {
- "create": [
- "NoOp"
- ],
+ "create": ["NoOp"],
"call": []
},
"sourceInfo": {
"approval": {
"sourceInfo": [
{
- "pc": [
- 45
- ],
+ "pc": [45],
"errorMessage": "can only update if caller expects this to be currently be v0"
}
],
@@ -87,4 +78,4 @@
},
"events": [],
"templateVariables": {}
-}
\ No newline at end of file
+}
diff --git a/tests/artifacts/AVM12/data/ContractV1.arc56.json b/tests/artifacts/AVM12/data/ContractV1.arc56.json
index fba7a565..8616c9b3 100644
--- a/tests/artifacts/AVM12/data/ContractV1.arc56.json
+++ b/tests/artifacts/AVM12/data/ContractV1.arc56.json
@@ -10,19 +10,14 @@
},
"actions": {
"create": [],
- "call": [
- "DeleteApplication"
- ]
+ "call": ["DeleteApplication"]
},
"readonly": false,
"events": [],
"recommendations": {}
}
],
- "arcs": [
- 22,
- 28
- ],
+ "arcs": [22, 28],
"networks": {},
"state": {
"schema": {
@@ -47,18 +42,14 @@
}
},
"bareActions": {
- "create": [
- "NoOp"
- ],
+ "create": ["NoOp"],
"call": []
},
"sourceInfo": {
"approval": {
"sourceInfo": [
{
- "pc": [
- 45
- ],
+ "pc": [45],
"errorMessage": "can only update if caller expects this to be currently be v1"
}
],
@@ -87,4 +78,4 @@
},
"events": [],
"templateVariables": {}
-}
\ No newline at end of file
+}
diff --git a/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.arc56.json b/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.arc56.json
index e20e041f..8f277fa0 100644
--- a/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.arc56.json
+++ b/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.arc56.json
@@ -38,9 +38,7 @@
"type": "void"
},
"actions": {
- "create": [
- "NoOp"
- ],
+ "create": ["NoOp"],
"call": []
},
"readonly": false,
@@ -68,9 +66,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -93,9 +89,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -122,9 +116,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -151,9 +143,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -184,9 +174,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -213,9 +201,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -247,9 +233,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -276,9 +260,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -305,19 +287,14 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
"recommendations": {}
}
],
- "arcs": [
- 22,
- 28
- ],
+ "arcs": [22, 28],
"networks": {},
"state": {
"schema": {
@@ -349,122 +326,79 @@
"approval": {
"sourceInfo": [
{
- "pc": [
- 348,
- 353,
- 547,
- 552
- ],
+ "pc": [348, 353, 547, 552],
"errorMessage": "account funded"
},
{
- "pc": [
- 284
- ],
+ "pc": [284],
"errorMessage": "application exists"
},
{
- "pc": [
- 242
- ],
+ "pc": [242],
"errorMessage": "asset exists"
},
{
- "pc": [
- 639
- ],
+ "pc": [639],
"errorMessage": "expected account to be passed by index"
},
{
- "pc": [
- 693
- ],
+ "pc": [693],
"errorMessage": "expected account to be passed by value"
},
{
- "pc": [
- 280
- ],
+ "pc": [280],
"errorMessage": "expected app id to match provided app id"
},
{
- "pc": [
- 629
- ],
+ "pc": [629],
"errorMessage": "expected application to be passed by index"
},
{
- "pc": [
- 687
- ],
+ "pc": [687],
"errorMessage": "expected application to be passed by value"
},
{
- "pc": [
- 619
- ],
+ "pc": [619],
"errorMessage": "expected asset to be passed by index"
},
{
- "pc": [
- 679
- ],
+ "pc": [679],
"errorMessage": "expected asset to be passed by value"
},
{
- "pc": [
- 138
- ],
+ "pc": [138],
"errorMessage": "expected global to have app address"
},
{
- "pc": [
- 132
- ],
+ "pc": [132],
"errorMessage": "expected global to have app id"
},
{
- "pc": [
- 288
- ],
+ "pc": [288],
"errorMessage": "expected other app to have same creator"
},
{
- "pc": [
- 143,
- 147
- ],
+ "pc": [143, 147],
"errorMessage": "expected txn to have 0"
},
{
- "pc": [
- 392
- ],
+ "pc": [392],
"errorMessage": "invalid array length header"
},
{
- "pc": [
- 671
- ],
+ "pc": [671],
"errorMessage": "invalid number of bytes for account"
},
{
- "pc": [
- 400
- ],
+ "pc": [400],
"errorMessage": "invalid number of bytes for arc4.dynamic_array"
},
{
- "pc": [
- 129,
- 294
- ],
+ "pc": [129, 294],
"errorMessage": "transaction type is appl"
},
{
- "pc": [
- 190
- ],
+ "pc": [190],
"errorMessage": "transaction type is pay"
}
],
@@ -493,4 +427,4 @@
},
"events": [],
"templateVariables": {}
-}
\ No newline at end of file
+}
diff --git a/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.arc56.json b/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.arc56.json
index 8961cdef..84382e57 100644
--- a/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.arc56.json
+++ b/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.arc56.json
@@ -15,19 +15,14 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
"recommendations": {}
}
],
- "arcs": [
- 22,
- 28
- ],
+ "arcs": [22, 28],
"networks": {},
"state": {
"schema": {
@@ -52,9 +47,7 @@
}
},
"bareActions": {
- "create": [
- "NoOp"
- ],
+ "create": ["NoOp"],
"call": []
},
"sourceInfo": {
@@ -85,4 +78,4 @@
},
"events": [],
"templateVariables": {}
-}
\ No newline at end of file
+}
diff --git a/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.arc56.json b/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.arc56.json
index 2124d246..7673cb37 100644
--- a/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.arc56.json
+++ b/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.arc56.json
@@ -19,9 +19,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -44,9 +42,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -69,9 +65,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -94,9 +88,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -119,9 +111,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -144,9 +134,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -169,9 +157,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -194,9 +180,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -219,9 +203,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -244,9 +226,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -269,9 +249,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -294,9 +272,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -319,9 +295,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -344,9 +318,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -369,9 +341,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -394,9 +364,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -419,9 +387,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -444,9 +410,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -469,9 +433,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -494,9 +456,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -519,9 +479,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -544,9 +502,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -569,9 +525,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -594,9 +548,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -615,9 +567,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -636,9 +586,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -657,9 +605,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -678,9 +624,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -699,9 +643,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -720,9 +662,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -741,9 +681,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -762,9 +700,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -783,9 +719,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -804,9 +738,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -825,9 +757,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -846,9 +776,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -867,9 +795,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -888,9 +814,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -909,9 +833,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -930,9 +852,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -951,9 +871,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -976,9 +894,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -1001,9 +917,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -1022,9 +936,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -1043,9 +955,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -1064,9 +974,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -1085,9 +993,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -1106,9 +1012,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -1127,9 +1031,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -1208,9 +1110,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [
@@ -1331,19 +1231,14 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
"recommendations": {}
}
],
- "arcs": [
- 22,
- 28
- ],
+ "arcs": [22, 28],
"networks": {},
"state": {
"schema": {
@@ -1368,90 +1263,28 @@
}
},
"bareActions": {
- "create": [
- "NoOp"
- ],
+ "create": ["NoOp"],
"call": []
},
"sourceInfo": {
"approval": {
"sourceInfo": [
{
- "pc": [
- 1584,
- 1603,
- 1791,
- 1810,
- 1942,
- 1990
- ],
+ "pc": [1584, 1603, 1791, 1810, 1942, 1990],
"errorMessage": "application log value is not the result of an ABI return"
},
{
- "pc": [
- 1863
- ],
+ "pc": [1863],
"errorMessage": "invalid array length header"
},
{
"pc": [
- 420,
- 433,
- 466,
- 477,
- 512,
- 523,
- 558,
- 571,
- 604,
- 617,
- 650,
- 661,
- 696,
- 707,
- 742,
- 755,
- 788,
- 801,
- 834,
- 845,
- 880,
- 891,
- 926,
- 939,
- 972,
- 985,
- 1018,
- 1029,
- 1064,
- 1075,
- 1110,
- 1123,
- 1156,
- 1169,
- 1202,
- 1213,
- 1248,
- 1259,
- 1294,
- 1307,
- 1340,
- 1353,
- 1386,
- 1397,
- 1432,
- 1443,
- 1478,
- 1491,
- 1518,
- 1540,
- 1624,
- 1633,
- 1657,
- 1666,
- 1686,
- 1706,
- 1714
+ 420, 433, 466, 477, 512, 523, 558, 571, 604, 617, 650,
+ 661, 696, 707, 742, 755, 788, 801, 834, 845, 880, 891,
+ 926, 939, 972, 985, 1018, 1029, 1064, 1075, 1110, 1123,
+ 1156, 1169, 1202, 1213, 1248, 1259, 1294, 1307, 1340,
+ 1353, 1386, 1397, 1432, 1443, 1478, 1491, 1518, 1540,
+ 1624, 1633, 1657, 1666, 1686, 1706, 1714
],
"errorMessage": "overflow"
}
@@ -1588,4 +1421,4 @@
}
],
"templateVariables": {}
-}
\ No newline at end of file
+}
diff --git a/tests/artifacts/Arrays/data/Contract.arc56.json b/tests/artifacts/Arrays/data/Contract.arc56.json
index 0f69efd6..b09e3301 100644
--- a/tests/artifacts/Arrays/data/Contract.arc56.json
+++ b/tests/artifacts/Arrays/data/Contract.arc56.json
@@ -10,9 +10,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -26,9 +24,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -42,9 +38,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -58,9 +52,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -74,9 +66,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -90,9 +80,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -106,9 +94,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -122,9 +108,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -143,9 +127,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -159,9 +141,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -175,9 +155,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -191,19 +169,14 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
"recommendations": {}
}
],
- "arcs": [
- 22,
- 28
- ],
+ "arcs": [22, 28],
"networks": {},
"state": {
"schema": {
@@ -228,118 +201,63 @@
}
},
"bareActions": {
- "create": [
- "NoOp"
- ],
+ "create": ["NoOp"],
"call": []
},
"sourceInfo": {
"approval": {
"sourceInfo": [
{
- "pc": [
- 888
- ],
+ "pc": [888],
"errorMessage": "array is expected length"
},
{
- "pc": [
- 1311,
- 1390,
- 1606
- ],
+ "pc": [1311, 1390, 1606],
"errorMessage": "array is not sorted"
},
{
- "pc": [
- 552
- ],
+ "pc": [552],
"errorMessage": "cannot pop from empty array"
},
{
- "pc": [
- 966,
- 996,
- 1004,
- 1011,
- 1016
- ],
+ "pc": [966, 996, 1004, 1011, 1016],
"errorMessage": "expected 4"
},
{
- "pc": [
- 944
- ],
+ "pc": [944],
"errorMessage": "expected 5"
},
{
- "pc": [
- 1560
- ],
+ "pc": [1560],
"errorMessage": "expected array of length 32"
},
{
- "pc": [
- 1282
- ],
+ "pc": [1282],
"errorMessage": "expected array of length 5"
},
{
- "pc": [
- 1353
- ],
+ "pc": [1353],
"errorMessage": "incorrect array value"
},
{
"pc": [
- 314,
- 323,
- 326,
- 329,
- 717,
- 1112,
- 1129,
- 1187,
- 1641,
- 1660
+ 314, 323, 326, 329, 717, 1112, 1129, 1187, 1641, 1660
],
"errorMessage": "index access is out of bounds"
},
{
- "pc": [
- 1474
- ],
+ "pc": [1474],
"errorMessage": "invalid array length header"
},
{
"pc": [
- 416,
- 465,
- 489,
- 618,
- 680,
- 705,
- 709,
- 804,
- 833,
- 837,
- 841,
- 869,
- 892,
- 909,
- 924,
- 967,
- 1043,
- 1262,
- 1440,
- 1540
+ 416, 465, 489, 618, 680, 705, 709, 804, 833, 837, 841,
+ 869, 892, 909, 924, 967, 1043, 1262, 1440, 1540
],
"errorMessage": "max array length exceeded"
},
{
- "pc": [
- 1685
- ],
+ "pc": [1685],
"errorMessage": "no available slots"
}
],
@@ -368,4 +286,4 @@
},
"events": [],
"templateVariables": {}
-}
\ No newline at end of file
+}
diff --git a/tests/artifacts/Arrays/data/DynamicArrayInitContract.arc56.json b/tests/artifacts/Arrays/data/DynamicArrayInitContract.arc56.json
index 920d815b..8d19b7dc 100644
--- a/tests/artifacts/Arrays/data/DynamicArrayInitContract.arc56.json
+++ b/tests/artifacts/Arrays/data/DynamicArrayInitContract.arc56.json
@@ -10,9 +10,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -26,9 +24,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -42,9 +38,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -58,19 +52,14 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
"recommendations": {}
}
],
- "arcs": [
- 22,
- 28
- ],
+ "arcs": [22, 28],
"networks": {},
"state": {
"schema": {
@@ -95,9 +84,7 @@
}
},
"bareActions": {
- "create": [
- "NoOp"
- ],
+ "create": ["NoOp"],
"call": []
},
"sourceInfo": {
@@ -128,4 +115,4 @@
},
"events": [],
"templateVariables": {}
-}
\ No newline at end of file
+}
diff --git a/tests/artifacts/Arrays/data/ImmutableArrayContract.arc56.json b/tests/artifacts/Arrays/data/ImmutableArrayContract.arc56.json
index c6450869..92393d69 100644
--- a/tests/artifacts/Arrays/data/ImmutableArrayContract.arc56.json
+++ b/tests/artifacts/Arrays/data/ImmutableArrayContract.arc56.json
@@ -10,9 +10,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -26,9 +24,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -47,9 +43,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -63,9 +57,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -79,9 +71,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -95,9 +85,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -111,9 +99,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -132,9 +118,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -153,9 +137,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [
@@ -188,9 +170,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -204,9 +184,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -237,9 +215,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -258,9 +234,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -279,9 +253,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -300,9 +272,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -321,9 +291,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -346,9 +314,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -367,9 +333,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -388,9 +352,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -409,9 +371,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -430,9 +390,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -455,9 +413,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -476,9 +432,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -492,19 +446,14 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
"recommendations": {}
}
],
- "arcs": [
- 22,
- 28
- ],
+ "arcs": [22, 28],
"networks": {},
"state": {
"schema": {
@@ -585,187 +534,102 @@
}
},
"bareActions": {
- "create": [
- "NoOp"
- ],
+ "create": ["NoOp"],
"call": []
},
"sourceInfo": {
"approval": {
"sourceInfo": [
{
- "pc": [
- 3798
- ],
+ "pc": [3798],
"errorMessage": "check self.imm_fixed_arr exists"
},
{
- "pc": [
- 2109,
- 2320
- ],
+ "pc": [2109, 2320],
"errorMessage": "expected 1, 0"
},
{
- "pc": [
- 2051,
- 2261
- ],
+ "pc": [2051, 2261],
"errorMessage": "expected 1st element to be correct"
},
{
- "pc": [
- 2057,
- 2270
- ],
+ "pc": [2057, 2270],
"errorMessage": "expected 2nd element to be correct"
},
{
- "pc": [
- 2147,
- 2359
- ],
+ "pc": [2147, 2359],
"errorMessage": "expected 4, 3"
},
{
- "pc": [
- 3682
- ],
+ "pc": [3682],
"errorMessage": "expected arrays to be different"
},
{
- "pc": [
- 3716
- ],
+ "pc": [3716],
"errorMessage": "expected arrays to be the same"
},
{
- "pc": [
- 1562
- ],
+ "pc": [1562],
"errorMessage": "expected element 0 to be False"
},
{
- "pc": [
- 1581
- ],
+ "pc": [1581],
"errorMessage": "expected element 1 to be False"
},
{
- "pc": [
- 1599
- ],
+ "pc": [1599],
"errorMessage": "expected element 2 to be True"
},
{
- "pc": [
- 3743
- ],
+ "pc": [3743],
"errorMessage": "expected items on iteration to be the same"
},
{
- "pc": [
- 1625
- ],
+ "pc": [1625],
"errorMessage": "expected last element to be False"
},
{
- "pc": [
- 3629
- ],
+ "pc": [3629],
"errorMessage": "expected non empty array"
},
{
- "pc": [
- 3113
- ],
+ "pc": [3113],
"errorMessage": "expected string length to match index"
},
{
- "pc": [
- 3793
- ],
+ "pc": [3793],
"errorMessage": "expected sum to be 10"
},
{
- "pc": [
- 3766
- ],
+ "pc": [3766],
"errorMessage": "expected sum to be 15"
},
{
"pc": [
- 870,
- 1176,
- 1238,
- 1304,
- 1362,
- 1470,
- 1762,
- 1824,
- 3000,
- 3644,
- 3701,
- 3739,
- 3785
+ 870, 1176, 1238, 1304, 1362, 1470, 1762, 1824, 3000,
+ 3644, 3701, 3739, 3785
],
"errorMessage": "index access is out of bounds"
},
{
- "pc": [
- 1555,
- 1574,
- 1593,
- 1616
- ],
+ "pc": [1555, 1574, 1593, 1616],
"errorMessage": "index out of bounds"
},
{
"pc": [
- 987,
- 1029,
- 1084,
- 1111,
- 1152,
- 1180,
- 1221,
- 1284,
- 1342,
- 1452,
- 1539,
- 1667,
- 1724,
- 1786,
- 1911,
- 2002,
- 2070,
- 2212,
- 2283,
- 2479,
- 2520,
- 2798,
- 2807,
- 2816,
- 2825,
- 2893,
- 2930,
- 2974,
- 3055,
- 3612,
- 3627
+ 987, 1029, 1084, 1111, 1152, 1180, 1221, 1284, 1342,
+ 1452, 1539, 1667, 1724, 1786, 1911, 2002, 2070, 2212,
+ 2283, 2479, 2520, 2798, 2807, 2816, 2825, 2893, 2930,
+ 2974, 3055, 3612, 3627
],
"errorMessage": "invalid array length header"
},
{
- "pc": [
- 3483
- ],
+ "pc": [3483],
"errorMessage": "max array length exceeded"
},
{
- "pc": [
- 1322
- ],
+ "pc": [1322],
"errorMessage": "overflow"
}
],
@@ -804,4 +668,4 @@
}
],
"templateVariables": {}
-}
\ No newline at end of file
+}
diff --git a/tests/artifacts/Arrays/data/StaticSizeContract.arc56.json b/tests/artifacts/Arrays/data/StaticSizeContract.arc56.json
index 30a59248..8a2d0c85 100644
--- a/tests/artifacts/Arrays/data/StaticSizeContract.arc56.json
+++ b/tests/artifacts/Arrays/data/StaticSizeContract.arc56.json
@@ -27,9 +27,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -48,9 +46,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -69,9 +65,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -90,9 +84,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -111,9 +103,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -132,9 +122,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -148,19 +136,14 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
"recommendations": {}
}
],
- "arcs": [
- 22,
- 28
- ],
+ "arcs": [22, 28],
"networks": {},
"state": {
"schema": {
@@ -191,110 +174,61 @@
}
},
"bareActions": {
- "create": [
- "NoOp"
- ],
+ "create": ["NoOp"],
"call": []
},
"sourceInfo": {
"approval": {
"sourceInfo": [
{
- "pc": [
- 1187,
- 1204,
- 1214
- ],
+ "pc": [1187, 1204, 1214],
"errorMessage": "check self.count exists"
},
{
- "pc": [
- 1032
- ],
+ "pc": [1032],
"errorMessage": "expected 3 bytes"
},
{
- "pc": [
- 750,
- 761,
- 861,
- 1025,
- 1114
- ],
+ "pc": [750, 761, 861, 1025, 1114],
"errorMessage": "expected correct length"
},
{
- "pc": [
- 1052,
- 1127
- ],
+ "pc": [1052, 1127],
"errorMessage": "expected correct value at 0"
},
{
- "pc": [
- 1072,
- 1140
- ],
+ "pc": [1072, 1140],
"errorMessage": "expected correct value at 1"
},
{
- "pc": [
- 1153
- ],
+ "pc": [1153],
"errorMessage": "expected correct value at 2"
},
{
- "pc": [
- 1165
- ],
+ "pc": [1165],
"errorMessage": "expected correct value at 3"
},
{
"pc": [
- 403,
- 478,
- 517,
- 637,
- 665,
- 784,
- 883,
- 1116,
- 1129,
- 1142,
+ 403, 478, 517, 637, 665, 784, 883, 1116, 1129, 1142,
1154
],
"errorMessage": "index access is out of bounds"
},
{
- "pc": [
- 1034,
- 1055
- ],
+ "pc": [1034, 1055],
"errorMessage": "index out of bounds"
},
{
- "pc": [
- 653,
- 1017
- ],
+ "pc": [653, 1017],
"errorMessage": "invalid array length header"
},
{
- "pc": [
- 729,
- 753,
- 840,
- 998,
- 1097
- ],
+ "pc": [729, 753, 840, 998, 1097],
"errorMessage": "max array length exceeded"
},
{
- "pc": [
- 283,
- 342,
- 377
- ],
+ "pc": [283, 342, 377],
"errorMessage": "overflow"
}
],
@@ -323,4 +257,4 @@
},
"events": [],
"templateVariables": {}
-}
\ No newline at end of file
+}
diff --git a/tests/artifacts/BoxContract/data/BoxContract.arc56.json b/tests/artifacts/BoxContract/data/BoxContract.arc56.json
index 8d2145b3..d3a070a8 100644
--- a/tests/artifacts/BoxContract/data/BoxContract.arc56.json
+++ b/tests/artifacts/BoxContract/data/BoxContract.arc56.json
@@ -77,9 +77,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -93,9 +91,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -122,9 +118,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -138,9 +132,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -154,9 +146,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -170,9 +160,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -186,9 +174,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -202,9 +188,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -218,9 +202,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -234,9 +216,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -250,9 +230,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -275,9 +253,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -291,9 +267,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -307,9 +281,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -329,9 +301,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -354,9 +324,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -383,9 +351,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -399,9 +365,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -424,9 +388,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -445,9 +407,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -461,9 +421,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -486,9 +444,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -507,9 +463,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -528,9 +482,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -549,19 +501,14 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
"recommendations": {}
}
],
- "arcs": [
- 22,
- 28
- ],
+ "arcs": [22, 28],
"networks": {},
"state": {
"schema": {
@@ -643,120 +590,67 @@
}
},
"bareActions": {
- "create": [
- "NoOp"
- ],
+ "create": ["NoOp"],
"call": []
},
"sourceInfo": {
"approval": {
"sourceInfo": [
{
- "pc": [
- 842
- ],
+ "pc": [842],
"errorMessage": "check Box exists"
},
{
- "pc": [
- 486
- ],
+ "pc": [486],
"errorMessage": "check self.box_a exists"
},
{
- "pc": [
- 851
- ],
+ "pc": [851],
"errorMessage": "check self.box_b exists"
},
{
- "pc": [
- 514,
- 857
- ],
+ "pc": [514, 857],
"errorMessage": "check self.box_c exists"
},
{
- "pc": [
- 1875
- ],
+ "pc": [1875],
"errorMessage": "check self.box_map entry exists"
},
{
- "pc": [
- 1128
- ],
+ "pc": [1128],
"errorMessage": "check self.many_ints exists"
},
{
- "pc": [
- 378
- ],
+ "pc": [378],
"errorMessage": "check self.oca exists"
},
{
- "pc": [
- 1745
- ],
+ "pc": [1745],
"errorMessage": "check self.too_many_bools exists"
},
{
- "pc": [
- 390
- ],
+ "pc": [390],
"errorMessage": "check self.txn exists"
},
{
- "pc": [
- 1723
- ],
+ "pc": [1723],
"errorMessage": "index access is out of bounds"
},
{
"pc": [
- 468,
- 862,
- 913,
- 923,
- 1081,
- 1150,
- 1322,
- 1333,
- 1348,
- 1375,
- 1390,
- 1403,
- 1416,
- 1442,
- 1467,
- 1489,
- 1499,
- 1518,
- 1525,
- 1537,
- 1564,
- 1575,
- 1582,
- 1589,
- 1610,
- 1635,
- 1660,
- 1671,
- 1732,
- 1768
+ 468, 862, 913, 923, 1081, 1150, 1322, 1333, 1348, 1375,
+ 1390, 1403, 1416, 1442, 1467, 1489, 1499, 1518, 1525,
+ 1537, 1564, 1575, 1582, 1589, 1610, 1635, 1660, 1671,
+ 1732, 1768
],
"errorMessage": "index out of bounds"
},
{
- "pc": [
- 1178
- ],
+ "pc": [1178],
"errorMessage": "no data"
},
{
- "pc": [
- 1279
- ],
+ "pc": [1279],
"errorMessage": "struct.a is truthy"
}
],
@@ -785,4 +679,4 @@
},
"events": [],
"templateVariables": {}
-}
\ No newline at end of file
+}
diff --git a/tests/artifacts/CreatedAppAsset/data/AppCall.arc56.json b/tests/artifacts/CreatedAppAsset/data/AppCall.arc56.json
index ff8fa8d2..a59b5e34 100644
--- a/tests/artifacts/CreatedAppAsset/data/AppCall.arc56.json
+++ b/tests/artifacts/CreatedAppAsset/data/AppCall.arc56.json
@@ -10,19 +10,14 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
"recommendations": {}
}
],
- "arcs": [
- 22,
- 28
- ],
+ "arcs": [22, 28],
"networks": {},
"state": {
"schema": {
@@ -47,9 +42,7 @@
}
},
"bareActions": {
- "create": [
- "NoOp"
- ],
+ "create": ["NoOp"],
"call": []
},
"sourceInfo": {
@@ -80,4 +73,4 @@
},
"events": [],
"templateVariables": {}
-}
\ No newline at end of file
+}
diff --git a/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.arc56.json b/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.arc56.json
index c2d11580..2fe879cf 100644
--- a/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.arc56.json
+++ b/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.arc56.json
@@ -19,9 +19,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -40,19 +38,14 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
"recommendations": {}
}
],
- "arcs": [
- 22,
- 28
- ],
+ "arcs": [22, 28],
"networks": {},
"state": {
"schema": {
@@ -77,67 +70,46 @@
}
},
"bareActions": {
- "create": [
- "NoOp"
- ],
+ "create": ["NoOp"],
"call": []
},
"sourceInfo": {
"approval": {
"sourceInfo": [
{
- "pc": [
- 155
- ],
+ "pc": [155],
"errorMessage": "application log value is not the result of an ABI return"
},
{
- "pc": [
- 96
- ],
+ "pc": [96],
"errorMessage": "expected app created"
},
{
- "pc": [
- 81
- ],
+ "pc": [81],
"errorMessage": "expected asset created"
},
{
- "pc": [
- 105
- ],
+ "pc": [105],
"errorMessage": "expected correct app id"
},
{
- "pc": [
- 90
- ],
+ "pc": [90],
"errorMessage": "expected correct asset id"
},
{
- "pc": [
- 139
- ],
+ "pc": [139],
"errorMessage": "expected correct method called"
},
{
- "pc": [
- 145
- ],
+ "pc": [145],
"errorMessage": "expected logs"
},
{
- "pc": [
- 65
- ],
+ "pc": [65],
"errorMessage": "transaction type is acfg"
},
{
- "pc": [
- 75,
- 126
- ],
+ "pc": [75, 126],
"errorMessage": "transaction type is appl"
}
],
@@ -166,4 +138,4 @@
},
"events": [],
"templateVariables": {}
-}
\ No newline at end of file
+}
diff --git a/tests/artifacts/CryptoOps/data/CryptoOpsContract.arc56.json b/tests/artifacts/CryptoOps/data/CryptoOpsContract.arc56.json
index ed1fe79e..7ffce5db 100644
--- a/tests/artifacts/CryptoOps/data/CryptoOpsContract.arc56.json
+++ b/tests/artifacts/CryptoOps/data/CryptoOpsContract.arc56.json
@@ -19,9 +19,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -44,9 +42,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -69,9 +65,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -94,9 +88,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -123,9 +115,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -152,9 +142,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -189,9 +177,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -226,9 +212,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -259,9 +243,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -292,9 +274,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"desc": "Must fail, AVM does not support Secp256r1 for recover",
@@ -314,9 +294,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -335,9 +313,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -364,19 +340,14 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
"recommendations": {}
}
],
- "arcs": [
- 22,
- 28
- ],
+ "arcs": [22, 28],
"networks": {},
"state": {
"schema": {
@@ -401,9 +372,7 @@
}
},
"bareActions": {
- "create": [
- "NoOp"
- ],
+ "create": ["NoOp"],
"call": []
},
"sourceInfo": {
@@ -434,4 +403,4 @@
},
"events": [],
"templateVariables": {}
-}
\ No newline at end of file
+}
diff --git a/tests/artifacts/DynamicITxnGroup/data/DynamicItxnGroup.arc56.json b/tests/artifacts/DynamicITxnGroup/data/DynamicItxnGroup.arc56.json
index ffb82194..420d8cd3 100644
--- a/tests/artifacts/DynamicITxnGroup/data/DynamicItxnGroup.arc56.json
+++ b/tests/artifacts/DynamicITxnGroup/data/DynamicItxnGroup.arc56.json
@@ -23,9 +23,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -52,19 +50,14 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
"recommendations": {}
}
],
- "arcs": [
- 22,
- 28
- ],
+ "arcs": [22, 28],
"networks": {},
"state": {
"schema": {
@@ -89,47 +82,30 @@
}
},
"bareActions": {
- "create": [
- "NoOp"
- ],
+ "create": ["NoOp"],
"call": []
},
"sourceInfo": {
"approval": {
"sourceInfo": [
{
- "pc": [
- 85,
- 217
- ],
+ "pc": [85, 217],
"errorMessage": "Funds must be sent to app"
},
{
- "pc": [
- 141,
- 250
- ],
+ "pc": [141, 250],
"errorMessage": "index access is out of bounds"
},
{
- "pc": [
- 89,
- 220
- ],
+ "pc": [89, 220],
"errorMessage": "invalid array length header"
},
{
- "pc": [
- 94,
- 225
- ],
+ "pc": [94, 225],
"errorMessage": "must provide some accounts"
},
{
- "pc": [
- 72,
- 204
- ],
+ "pc": [72, 204],
"errorMessage": "transaction type is pay"
}
],
@@ -158,4 +134,4 @@
},
"events": [],
"templateVariables": {}
-}
\ No newline at end of file
+}
diff --git a/tests/artifacts/DynamicITxnGroup/data/VerifierContract.arc56.json b/tests/artifacts/DynamicITxnGroup/data/VerifierContract.arc56.json
index 27acecd9..f4306e94 100644
--- a/tests/artifacts/DynamicITxnGroup/data/VerifierContract.arc56.json
+++ b/tests/artifacts/DynamicITxnGroup/data/VerifierContract.arc56.json
@@ -10,19 +10,14 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
"recommendations": {}
}
],
- "arcs": [
- 22,
- 28
- ],
+ "arcs": [22, 28],
"networks": {},
"state": {
"schema": {
@@ -47,18 +42,14 @@
}
},
"bareActions": {
- "create": [
- "NoOp"
- ],
+ "create": ["NoOp"],
"call": []
},
"sourceInfo": {
"approval": {
"sourceInfo": [
{
- "pc": [
- 56
- ],
+ "pc": [56],
"errorMessage": "Txn must be pay"
}
],
@@ -87,4 +78,4 @@
},
"events": [],
"templateVariables": {}
-}
\ No newline at end of file
+}
diff --git a/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.arc56.json b/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.arc56.json
index 50024ec5..b2bc0ded 100644
--- a/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.arc56.json
+++ b/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.arc56.json
@@ -19,19 +19,14 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
"recommendations": {}
}
],
- "arcs": [
- 22,
- 28
- ],
+ "arcs": [22, 28],
"networks": {},
"state": {
"schema": {
@@ -56,18 +51,14 @@
}
},
"bareActions": {
- "create": [
- "NoOp"
- ],
+ "create": ["NoOp"],
"call": []
},
"sourceInfo": {
"approval": {
"sourceInfo": [
{
- "pc": [
- 72
- ],
+ "pc": [72],
"errorMessage": "transaction type is appl"
}
],
@@ -96,4 +87,4 @@
},
"events": [],
"templateVariables": {}
-}
\ No newline at end of file
+}
diff --git a/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.arc56.json b/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.arc56.json
index 9c65234b..91d30cd2 100644
--- a/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.arc56.json
+++ b/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.arc56.json
@@ -19,9 +19,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -40,9 +38,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -61,9 +57,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -86,9 +80,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -107,9 +99,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -128,9 +118,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -149,9 +137,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -170,9 +156,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -203,9 +187,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -236,9 +218,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -265,9 +245,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -281,9 +259,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -306,9 +282,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -331,9 +305,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -360,9 +332,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -381,9 +351,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -406,9 +374,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -431,9 +397,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -456,9 +420,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -481,9 +443,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -506,9 +466,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -531,9 +489,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -552,9 +508,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -577,9 +531,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -606,9 +558,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -635,9 +585,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -664,9 +612,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -693,9 +639,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -722,9 +666,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -751,9 +693,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -776,9 +716,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -801,9 +739,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -822,9 +758,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -851,9 +785,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -876,9 +808,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -901,9 +831,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -926,19 +854,14 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
"recommendations": {}
}
],
- "arcs": [
- 22,
- 28
- ],
+ "arcs": [22, 28],
"networks": {},
"state": {
"schema": {
@@ -963,9 +886,7 @@
}
},
"bareActions": {
- "create": [
- "NoOp"
- ],
+ "create": ["NoOp"],
"call": []
},
"sourceInfo": {
@@ -996,4 +917,4 @@
},
"events": [],
"templateVariables": {}
-}
\ No newline at end of file
+}
diff --git a/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.arc56.json b/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.arc56.json
index 31082440..495008e6 100644
--- a/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.arc56.json
+++ b/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.arc56.json
@@ -15,9 +15,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -40,9 +38,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -65,9 +61,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -90,9 +84,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -115,9 +107,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -140,9 +130,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -165,9 +153,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -190,9 +176,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -215,9 +199,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -236,9 +218,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -261,9 +241,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -286,9 +264,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -311,9 +287,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -336,9 +310,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -361,9 +333,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -386,9 +356,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -411,9 +379,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -436,9 +402,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -461,9 +425,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -482,9 +444,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -515,9 +475,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -540,9 +498,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -565,9 +521,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -590,9 +544,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -615,9 +567,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -640,9 +590,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -665,9 +613,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -690,9 +636,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -715,9 +659,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -740,9 +682,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -765,9 +705,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -790,9 +728,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -815,9 +751,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -840,9 +774,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -865,9 +797,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -890,9 +820,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -915,9 +843,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -940,9 +866,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -965,9 +889,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -990,9 +912,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -1015,9 +935,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -1040,9 +958,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -1065,9 +981,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -1090,9 +1004,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -1115,9 +1027,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -1140,9 +1050,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -1165,9 +1073,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -1190,9 +1096,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -1215,9 +1119,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -1240,9 +1142,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -1265,9 +1165,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -1290,9 +1188,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -1315,9 +1211,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -1340,9 +1234,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -1365,9 +1257,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -1386,9 +1276,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -1411,9 +1299,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -1436,9 +1322,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -1461,9 +1345,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -1534,9 +1416,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -1555,19 +1435,14 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
"recommendations": {}
}
],
- "arcs": [
- 22,
- 28
- ],
+ "arcs": [22, 28],
"networks": {},
"state": {
"schema": {
@@ -1592,60 +1467,42 @@
}
},
"bareActions": {
- "create": [
- "NoOp"
- ],
+ "create": ["NoOp"],
"call": []
},
"sourceInfo": {
"approval": {
"sourceInfo": [
{
- "pc": [
- 2086
- ],
+ "pc": [2086],
"errorMessage": "AER:arg03"
},
{
- "pc": [
- 2115
- ],
+ "pc": [2115],
"errorMessage": "AER:arg04:arg is 4"
},
{
- "pc": [
- 2182
- ],
+ "pc": [2182],
"errorMessage": "AER:arg07"
},
{
- "pc": [
- 2220
- ],
+ "pc": [2220],
"errorMessage": "AER:arg08:arg is eight (08)"
},
{
- "pc": [
- 2035
- ],
+ "pc": [2035],
"errorMessage": "ERR:01"
},
{
- "pc": [
- 2162
- ],
+ "pc": [2162],
"errorMessage": "ERR:06:arg was 6"
},
{
- "pc": [
- 2066
- ],
+ "pc": [2066],
"errorMessage": "ERR:arg02:arg is two"
},
{
- "pc": [
- 2135
- ],
+ "pc": [2135],
"errorMessage": "ERR:arg05"
}
],
@@ -1674,4 +1531,4 @@
},
"events": [],
"templateVariables": {}
-}
\ No newline at end of file
+}
diff --git a/tests/artifacts/StateMutations/data/StateMutations.arc56.json b/tests/artifacts/StateMutations/data/StateMutations.arc56.json
index 05096ca3..7820096c 100644
--- a/tests/artifacts/StateMutations/data/StateMutations.arc56.json
+++ b/tests/artifacts/StateMutations/data/StateMutations.arc56.json
@@ -10,9 +10,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -26,9 +24,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -42,19 +38,14 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
"recommendations": {}
}
],
- "arcs": [
- 22,
- 28
- ],
+ "arcs": [22, 28],
"networks": {},
"state": {
"schema": {
@@ -119,106 +110,62 @@
}
},
"bareActions": {
- "create": [
- "NoOp"
- ],
- "call": [
- "OptIn"
- ]
+ "create": ["NoOp"],
+ "call": ["OptIn"]
},
"sourceInfo": {
"approval": {
"sourceInfo": [
{
- "pc": [
- 562,
- 719,
- 827
- ],
+ "pc": [562, 719, 827],
"errorMessage": "check self.box exists"
},
{
- "pc": [
- 533,
- 666,
- 817
- ],
+ "pc": [533, 666, 817],
"errorMessage": "check self.glob exists"
},
{
- "pc": [
- 505,
- 614,
- 812
- ],
+ "pc": [505, 614, 812],
"errorMessage": "check self.glob_assign exists"
},
{
- "pc": [
- 601,
- 782,
- 843
- ],
+ "pc": [601, 782, 843],
"errorMessage": "check self.global_map entry exists"
},
{
- "pc": [
- 550,
- 695,
- 824
- ],
+ "pc": [550, 695, 824],
"errorMessage": "check self.loc exists for account"
},
{
- "pc": [
- 581,
- 750,
- 834
- ],
+ "pc": [581, 750, 834],
"errorMessage": "check self.map entry exists"
},
{
- "pc": [
- 519,
- 640,
- 807
- ],
+ "pc": [519, 640, 807],
"errorMessage": "check self.no_proxy exists"
},
{
- "pc": [
- 867
- ],
+ "pc": [867],
"errorMessage": "expected box == no_proxy"
},
{
- "pc": [
- 855
- ],
+ "pc": [855],
"errorMessage": "expected global == no_proxy"
},
{
- "pc": [
- 849
- ],
+ "pc": [849],
"errorMessage": "expected global assign == no_proxy"
},
{
- "pc": [
- 877
- ],
+ "pc": [877],
"errorMessage": "expected global_map == no_proxy"
},
{
- "pc": [
- 861
- ],
+ "pc": [861],
"errorMessage": "expected local == no_proxy"
},
{
- "pc": [
- 873
- ],
+ "pc": [873],
"errorMessage": "expected map == no_proxy"
}
],
@@ -247,4 +194,4 @@
},
"events": [],
"templateVariables": {}
-}
\ No newline at end of file
+}
diff --git a/tests/artifacts/StateOps/data/GlobalStateContract.arc56.json b/tests/artifacts/StateOps/data/GlobalStateContract.arc56.json
index d63da4a3..696e13d4 100644
--- a/tests/artifacts/StateOps/data/GlobalStateContract.arc56.json
+++ b/tests/artifacts/StateOps/data/GlobalStateContract.arc56.json
@@ -10,9 +10,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -26,9 +24,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -42,9 +38,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -58,9 +52,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -74,9 +66,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -90,9 +80,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -106,9 +94,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -122,9 +108,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -138,9 +122,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -154,9 +136,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -170,9 +150,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -186,9 +164,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -202,9 +178,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -218,9 +192,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -234,9 +206,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -255,9 +225,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -276,9 +244,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -297,9 +263,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -318,9 +282,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -339,9 +301,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -360,9 +320,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -381,9 +339,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -402,9 +358,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -423,9 +377,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -444,9 +396,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -465,9 +415,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -486,9 +434,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -507,9 +453,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -528,9 +472,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -549,19 +491,14 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
"recommendations": {}
}
],
- "arcs": [
- 22,
- 28
- ],
+ "arcs": [22, 28],
"networks": {},
"state": {
"schema": {
@@ -662,102 +599,70 @@
}
},
"bareActions": {
- "create": [
- "NoOp"
- ],
+ "create": ["NoOp"],
"call": []
},
"sourceInfo": {
"approval": {
"sourceInfo": [
{
- "pc": [
- 906
- ],
+ "pc": [906],
"errorMessage": "check self.arc4_address exists"
},
{
- "pc": [
- 895
- ],
+ "pc": [895],
"errorMessage": "check self.arc4_bool exists"
},
{
- "pc": [
- 884
- ],
+ "pc": [884],
"errorMessage": "check self.arc4_byte exists"
},
{
- "pc": [
- 928
- ],
+ "pc": [928],
"errorMessage": "check self.arc4_dynamic_bytes exists"
},
{
- "pc": [
- 873
- ],
+ "pc": [873],
"errorMessage": "check self.arc4_string exists"
},
{
- "pc": [
- 862
- ],
+ "pc": [862],
"errorMessage": "check self.arc4_uint exists"
},
{
- "pc": [
- 917
- ],
+ "pc": [917],
"errorMessage": "check self.arc4_uint128 exists"
},
{
- "pc": [
- 818
- ],
+ "pc": [818],
"errorMessage": "check self.implicit_key_arc4_address exists"
},
{
- "pc": [
- 807
- ],
+ "pc": [807],
"errorMessage": "check self.implicit_key_arc4_bool exists"
},
{
- "pc": [
- 796
- ],
+ "pc": [796],
"errorMessage": "check self.implicit_key_arc4_byte exists"
},
{
- "pc": [
- 840
- ],
+ "pc": [840],
"errorMessage": "check self.implicit_key_arc4_dynamic_bytes exists"
},
{
- "pc": [
- 786
- ],
+ "pc": [786],
"errorMessage": "check self.implicit_key_arc4_string exists"
},
{
- "pc": [
- 776
- ],
+ "pc": [776],
"errorMessage": "check self.implicit_key_arc4_uint exists"
},
{
- "pc": [
- 829
- ],
+ "pc": [829],
"errorMessage": "check self.implicit_key_arc4_uint128 exists"
},
{
- "pc": [
- 851
- ],
+ "pc": [851],
"errorMessage": "check self.implicit_key_tuple exists"
}
],
@@ -786,4 +691,4 @@
},
"events": [],
"templateVariables": {}
-}
\ No newline at end of file
+}
diff --git a/tests/artifacts/StateOps/data/ITxnOpsContract.arc56.json b/tests/artifacts/StateOps/data/ITxnOpsContract.arc56.json
index 57de48c6..18f0d71b 100644
--- a/tests/artifacts/StateOps/data/ITxnOpsContract.arc56.json
+++ b/tests/artifacts/StateOps/data/ITxnOpsContract.arc56.json
@@ -10,19 +10,14 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
"recommendations": {}
}
],
- "arcs": [
- 22,
- 28
- ],
+ "arcs": [22, 28],
"networks": {},
"state": {
"schema": {
@@ -47,9 +42,7 @@
}
},
"bareActions": {
- "create": [
- "NoOp"
- ],
+ "create": ["NoOp"],
"call": []
},
"sourceInfo": {
@@ -80,4 +73,4 @@
},
"events": [],
"templateVariables": {}
-}
\ No newline at end of file
+}
diff --git a/tests/artifacts/StateOps/data/LocalStateContract.arc56.json b/tests/artifacts/StateOps/data/LocalStateContract.arc56.json
index ad115577..27bf57b3 100644
--- a/tests/artifacts/StateOps/data/LocalStateContract.arc56.json
+++ b/tests/artifacts/StateOps/data/LocalStateContract.arc56.json
@@ -10,9 +10,7 @@
},
"actions": {
"create": [],
- "call": [
- "OptIn"
- ]
+ "call": ["OptIn"]
},
"readonly": false,
"events": [],
@@ -31,9 +29,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -52,9 +48,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -73,9 +67,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -94,9 +86,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -115,9 +105,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -136,9 +124,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -157,9 +143,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -178,9 +162,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -199,9 +181,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -220,9 +200,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -241,9 +219,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -262,9 +238,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -283,9 +257,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -304,9 +276,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -325,19 +295,14 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
"recommendations": {}
}
],
- "arcs": [
- 22,
- 28
- ],
+ "arcs": [22, 28],
"networks": {},
"state": {
"schema": {
@@ -438,102 +403,70 @@
}
},
"bareActions": {
- "create": [
- "NoOp"
- ],
+ "create": ["NoOp"],
"call": []
},
"sourceInfo": {
"approval": {
"sourceInfo": [
{
- "pc": [
- 891
- ],
+ "pc": [891],
"errorMessage": "check self.arc4_address exists for account"
},
{
- "pc": [
- 877
- ],
+ "pc": [877],
"errorMessage": "check self.arc4_bool exists for account"
},
{
- "pc": [
- 863
- ],
+ "pc": [863],
"errorMessage": "check self.arc4_byte exists for account"
},
{
- "pc": [
- 919
- ],
+ "pc": [919],
"errorMessage": "check self.arc4_dynamic_bytes exists for account"
},
{
- "pc": [
- 849
- ],
+ "pc": [849],
"errorMessage": "check self.arc4_string exists for account"
},
{
- "pc": [
- 835
- ],
+ "pc": [835],
"errorMessage": "check self.arc4_uint exists for account"
},
{
- "pc": [
- 905
- ],
+ "pc": [905],
"errorMessage": "check self.arc4_uint128 exists for account"
},
{
- "pc": [
- 779
- ],
+ "pc": [779],
"errorMessage": "check self.implicit_key_arc4_address exists for account"
},
{
- "pc": [
- 765
- ],
+ "pc": [765],
"errorMessage": "check self.implicit_key_arc4_bool exists for account"
},
{
- "pc": [
- 751
- ],
+ "pc": [751],
"errorMessage": "check self.implicit_key_arc4_byte exists for account"
},
{
- "pc": [
- 807
- ],
+ "pc": [807],
"errorMessage": "check self.implicit_key_arc4_dynamic_bytes exists for account"
},
{
- "pc": [
- 737
- ],
+ "pc": [737],
"errorMessage": "check self.implicit_key_arc4_string exists for account"
},
{
- "pc": [
- 724
- ],
+ "pc": [724],
"errorMessage": "check self.implicit_key_arc4_uint exists for account"
},
{
- "pc": [
- 793
- ],
+ "pc": [793],
"errorMessage": "check self.implicit_key_arc4_uint128 exists for account"
},
{
- "pc": [
- 821
- ],
+ "pc": [821],
"errorMessage": "check self.implicit_key_tuple exists for account"
}
],
@@ -562,4 +495,4 @@
},
"events": [],
"templateVariables": {}
-}
\ No newline at end of file
+}
diff --git a/tests/artifacts/StateOps/data/StateAcctParamsGetContract.arc56.json b/tests/artifacts/StateOps/data/StateAcctParamsGetContract.arc56.json
index 3e9ad24b..1f977b4e 100644
--- a/tests/artifacts/StateOps/data/StateAcctParamsGetContract.arc56.json
+++ b/tests/artifacts/StateOps/data/StateAcctParamsGetContract.arc56.json
@@ -15,9 +15,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -36,9 +34,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -57,9 +53,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -78,9 +72,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -99,9 +91,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -120,9 +110,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -141,9 +129,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -162,9 +148,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -183,9 +167,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -204,9 +186,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -225,9 +205,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -246,9 +224,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -267,9 +243,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -288,9 +262,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -309,19 +281,14 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
"recommendations": {}
}
],
- "arcs": [
- 22,
- 28
- ],
+ "arcs": [22, 28],
"networks": {},
"state": {
"schema": {
@@ -346,94 +313,51 @@
}
},
"bareActions": {
- "create": [
- "NoOp"
- ],
+ "create": ["NoOp"],
"call": []
},
"sourceInfo": {
"approval": {
"sourceInfo": [
{
- "pc": [
- 171,
- 225
- ],
+ "pc": [171, 225],
"errorMessage": "account funded"
},
{
- "pc": [
- 175
- ],
+ "pc": [175],
"errorMessage": "expected Account balance to match"
},
{
- "pc": [
- 229
- ],
+ "pc": [229],
"errorMessage": "expected Account min_balance to match"
},
{
"pc": [
- 166,
- 220,
- 273,
- 301,
- 330,
- 359,
- 388,
- 417,
- 446,
- 475,
- 504,
- 533,
- 562,
- 598,
- 627
+ 166, 220, 273, 301, 330, 359, 388, 417, 446, 475, 504,
+ 533, 562, 598, 627
],
"errorMessage": "expected funded by index to match"
},
{
- "pc": [
- 190
- ],
+ "pc": [190],
"errorMessage": "expected op.balance by index to match"
},
{
- "pc": [
- 181
- ],
+ "pc": [181],
"errorMessage": "expected op.balance to match"
},
{
- "pc": [
- 244
- ],
+ "pc": [244],
"errorMessage": "expected op.min_balance by index to match"
},
{
- "pc": [
- 235
- ],
+ "pc": [235],
"errorMessage": "expected op.min_balance to match"
},
{
"pc": [
- 164,
- 218,
- 271,
- 299,
- 328,
- 357,
- 386,
- 415,
- 444,
- 473,
- 502,
- 531,
- 560,
- 596,
- 625
+ 164, 218, 271, 299, 328, 357, 386, 415, 444, 473, 502,
+ 531, 560, 596, 625
],
"errorMessage": "expected value by index to match"
}
@@ -463,4 +387,4 @@
},
"events": [],
"templateVariables": {}
-}
\ No newline at end of file
+}
diff --git a/tests/artifacts/StateOps/data/StateAppGlobalContract.arc56.json b/tests/artifacts/StateOps/data/StateAppGlobalContract.arc56.json
index b0d23bc9..51ee210e 100644
--- a/tests/artifacts/StateOps/data/StateAppGlobalContract.arc56.json
+++ b/tests/artifacts/StateOps/data/StateAppGlobalContract.arc56.json
@@ -15,9 +15,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -36,9 +34,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -61,9 +57,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -86,9 +80,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -107,9 +99,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -132,9 +122,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -157,19 +145,14 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
"recommendations": {}
}
],
- "arcs": [
- 22,
- 28
- ],
+ "arcs": [22, 28],
"networks": {},
"state": {
"schema": {
@@ -205,9 +188,7 @@
}
},
"bareActions": {
- "create": [
- "NoOp"
- ],
+ "create": ["NoOp"],
"call": []
},
"sourceInfo": {
@@ -238,4 +219,4 @@
},
"events": [],
"templateVariables": {}
-}
\ No newline at end of file
+}
diff --git a/tests/artifacts/StateOps/data/StateAppGlobalExContract.arc56.json b/tests/artifacts/StateOps/data/StateAppGlobalExContract.arc56.json
index eff4cbf3..da1ec7d3 100644
--- a/tests/artifacts/StateOps/data/StateAppGlobalExContract.arc56.json
+++ b/tests/artifacts/StateOps/data/StateAppGlobalExContract.arc56.json
@@ -2,10 +2,7 @@
"name": "StateAppGlobalExContract",
"structs": {},
"methods": [],
- "arcs": [
- 22,
- 28
- ],
+ "arcs": [22, 28],
"networks": {},
"state": {
"schema": {
@@ -66,9 +63,7 @@
}
},
"bareActions": {
- "create": [
- "NoOp"
- ],
+ "create": ["NoOp"],
"call": []
},
"sourceInfo": {
@@ -99,4 +94,4 @@
},
"events": [],
"templateVariables": {}
-}
\ No newline at end of file
+}
diff --git a/tests/artifacts/StateOps/data/StateAppLocalContract.arc56.json b/tests/artifacts/StateOps/data/StateAppLocalContract.arc56.json
index 754f2b48..bd2bbd76 100644
--- a/tests/artifacts/StateOps/data/StateAppLocalContract.arc56.json
+++ b/tests/artifacts/StateOps/data/StateAppLocalContract.arc56.json
@@ -10,9 +10,7 @@
},
"actions": {
"create": [],
- "call": [
- "OptIn"
- ]
+ "call": ["OptIn"]
},
"readonly": false,
"events": [],
@@ -35,9 +33,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -60,9 +56,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -89,9 +83,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -118,9 +110,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -143,9 +133,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -168,9 +156,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -197,9 +183,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -226,19 +210,14 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
"recommendations": {}
}
],
- "arcs": [
- 22,
- 28
- ],
+ "arcs": [22, 28],
"networks": {},
"state": {
"schema": {
@@ -274,9 +253,7 @@
}
},
"bareActions": {
- "create": [
- "NoOp"
- ],
+ "create": ["NoOp"],
"call": []
},
"sourceInfo": {
@@ -307,4 +284,4 @@
},
"events": [],
"templateVariables": {}
-}
\ No newline at end of file
+}
diff --git a/tests/artifacts/StateOps/data/StateAppLocalExContract.arc56.json b/tests/artifacts/StateOps/data/StateAppLocalExContract.arc56.json
index e33ff391..42e5a1dc 100644
--- a/tests/artifacts/StateOps/data/StateAppLocalExContract.arc56.json
+++ b/tests/artifacts/StateOps/data/StateAppLocalExContract.arc56.json
@@ -10,19 +10,14 @@
},
"actions": {
"create": [],
- "call": [
- "OptIn"
- ]
+ "call": ["OptIn"]
},
"readonly": false,
"events": [],
"recommendations": {}
}
],
- "arcs": [
- 22,
- 28
- ],
+ "arcs": [22, 28],
"networks": {},
"state": {
"schema": {
@@ -63,9 +58,7 @@
}
},
"bareActions": {
- "create": [
- "NoOp"
- ],
+ "create": ["NoOp"],
"call": []
},
"sourceInfo": {
@@ -96,4 +89,4 @@
},
"events": [],
"templateVariables": {}
-}
\ No newline at end of file
+}
diff --git a/tests/artifacts/StateOps/data/StateAppParamsContract.arc56.json b/tests/artifacts/StateOps/data/StateAppParamsContract.arc56.json
index 49389d23..2272ea80 100644
--- a/tests/artifacts/StateOps/data/StateAppParamsContract.arc56.json
+++ b/tests/artifacts/StateOps/data/StateAppParamsContract.arc56.json
@@ -15,9 +15,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -36,9 +34,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -57,9 +53,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -78,9 +72,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -99,9 +91,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -120,9 +110,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -141,9 +129,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -162,9 +148,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -183,19 +167,14 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
"recommendations": {}
}
],
- "arcs": [
- 22,
- 28
- ],
+ "arcs": [22, 28],
"networks": {},
"state": {
"schema": {
@@ -220,40 +199,18 @@
}
},
"bareActions": {
- "create": [
- "NoOp"
- ],
+ "create": ["NoOp"],
"call": []
},
"sourceInfo": {
"approval": {
"sourceInfo": [
{
- "pc": [
- 121,
- 155,
- 189,
- 216,
- 243,
- 270,
- 297,
- 324,
- 350
- ],
+ "pc": [121, 155, 189, 216, 243, 270, 297, 324, 350],
"errorMessage": "expected exists by index to match"
},
{
- "pc": [
- 119,
- 153,
- 187,
- 214,
- 241,
- 268,
- 295,
- 322,
- 348
- ],
+ "pc": [119, 153, 187, 214, 241, 268, 295, 322, 348],
"errorMessage": "expected value by index to match"
}
],
@@ -282,4 +239,4 @@
},
"events": [],
"templateVariables": {}
-}
\ No newline at end of file
+}
diff --git a/tests/artifacts/StateOps/data/StateAssetHoldingContract.arc56.json b/tests/artifacts/StateOps/data/StateAssetHoldingContract.arc56.json
index 598e8a2c..78ecb882 100644
--- a/tests/artifacts/StateOps/data/StateAssetHoldingContract.arc56.json
+++ b/tests/artifacts/StateOps/data/StateAssetHoldingContract.arc56.json
@@ -19,9 +19,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -44,19 +42,14 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
"recommendations": {}
}
],
- "arcs": [
- 22,
- 28
- ],
+ "arcs": [22, 28],
"networks": {},
"state": {
"schema": {
@@ -81,9 +74,7 @@
}
},
"bareActions": {
- "create": [
- "NoOp"
- ],
+ "create": ["NoOp"],
"call": []
},
"sourceInfo": {
@@ -114,4 +105,4 @@
},
"events": [],
"templateVariables": {}
-}
\ No newline at end of file
+}
diff --git a/tests/artifacts/StateOps/data/StateAssetParamsContract.arc56.json b/tests/artifacts/StateOps/data/StateAssetParamsContract.arc56.json
index 0836e5de..07b57098 100644
--- a/tests/artifacts/StateOps/data/StateAssetParamsContract.arc56.json
+++ b/tests/artifacts/StateOps/data/StateAssetParamsContract.arc56.json
@@ -15,9 +15,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -36,9 +34,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -57,9 +53,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -78,9 +72,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -99,9 +91,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -120,9 +110,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -141,9 +129,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -162,9 +148,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -183,9 +167,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -204,9 +186,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -225,9 +205,7 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
@@ -246,19 +224,14 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
"recommendations": {}
}
],
- "arcs": [
- 22,
- 28
- ],
+ "arcs": [22, 28],
"networks": {},
"state": {
"schema": {
@@ -283,9 +256,7 @@
}
},
"bareActions": {
- "create": [
- "NoOp"
- ],
+ "create": ["NoOp"],
"call": []
},
"sourceInfo": {
@@ -293,34 +264,14 @@
"sourceInfo": [
{
"pc": [
- 142,
- 169,
- 196,
- 230,
- 264,
- 298,
- 332,
- 366,
- 392,
- 418,
- 444,
+ 142, 169, 196, 230, 264, 298, 332, 366, 392, 418, 444,
470
],
"errorMessage": "expected exists by index to match"
},
{
"pc": [
- 140,
- 167,
- 194,
- 228,
- 262,
- 296,
- 330,
- 364,
- 390,
- 416,
- 442,
+ 140, 167, 194, 228, 262, 296, 330, 364, 390, 416, 442,
468
],
"errorMessage": "expected value by index to match"
@@ -351,4 +302,4 @@
},
"events": [],
"templateVariables": {}
-}
\ No newline at end of file
+}
diff --git a/tests/artifacts/Tuples/data/TuplesContract.arc56.json b/tests/artifacts/Tuples/data/TuplesContract.arc56.json
index e428fe72..5baae747 100644
--- a/tests/artifacts/Tuples/data/TuplesContract.arc56.json
+++ b/tests/artifacts/Tuples/data/TuplesContract.arc56.json
@@ -10,19 +10,14 @@
},
"actions": {
"create": [],
- "call": [
- "NoOp"
- ]
+ "call": ["NoOp"]
},
"readonly": false,
"events": [],
"recommendations": {}
}
],
- "arcs": [
- 22,
- 28
- ],
+ "arcs": [22, 28],
"networks": {},
"state": {
"schema": {
@@ -47,9 +42,7 @@
}
},
"bareActions": {
- "create": [
- "NoOp"
- ],
+ "create": ["NoOp"],
"call": []
},
"sourceInfo": {
@@ -80,4 +73,4 @@
},
"events": [],
"templateVariables": {}
-}
\ No newline at end of file
+}