diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 33928abb3..b2a5681d8 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,6 +1,6 @@ { "name": "ICP Examples (Motoko + Rust)", - "image": "ghcr.io/dfinity/icp-dev-env-all:0.1.0", + "image": "ghcr.io/dfinity/icp-dev-env-all:0.3.1", "forwardPorts": [8000, 5173], "portsAttributes": { "8000": { diff --git a/.github/workflows/hello_world.yml b/.github/workflows/hello_world.yml index b2988c222..4cb0402c5 100644 --- a/.github/workflows/hello_world.yml +++ b/.github/workflows/hello_world.yml @@ -17,7 +17,7 @@ concurrency: jobs: motoko-hello_world: runs-on: ubuntu-24.04 - container: ghcr.io/dfinity/icp-dev-env-motoko:0.1.0 + container: ghcr.io/dfinity/icp-dev-env-motoko:0.3.1 steps: - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 - name: Deploy and test @@ -29,7 +29,7 @@ jobs: rust-hello_world: runs-on: ubuntu-24.04 - container: ghcr.io/dfinity/icp-dev-env-rust:0.1.0 + container: ghcr.io/dfinity/icp-dev-env-rust:0.3.1 steps: - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 - name: Deploy and test diff --git a/.github/workflows/vetkeys-basic-bls-signing.yml b/.github/workflows/vetkeys-basic-bls-signing.yml index 20b140f9e..a3e850047 100644 --- a/.github/workflows/vetkeys-basic-bls-signing.yml +++ b/.github/workflows/vetkeys-basic-bls-signing.yml @@ -16,7 +16,7 @@ concurrency: jobs: rust: runs-on: ubuntu-24.04 - container: ghcr.io/dfinity/icp-dev-env-rust:0.1.0 + container: ghcr.io/dfinity/icp-dev-env-rust:0.3.1 env: ICP_CLI_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: @@ -26,7 +26,7 @@ jobs: run: icp network start -d && icp deploy motoko: runs-on: ubuntu-24.04 - container: ghcr.io/dfinity/icp-dev-env-motoko:0.1.0 + container: ghcr.io/dfinity/icp-dev-env-motoko:0.3.1 env: ICP_CLI_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: diff --git a/.github/workflows/vetkeys-basic-ibe.yml b/.github/workflows/vetkeys-basic-ibe.yml index a64308380..da55075fe 100644 --- a/.github/workflows/vetkeys-basic-ibe.yml +++ b/.github/workflows/vetkeys-basic-ibe.yml @@ -16,7 +16,7 @@ concurrency: jobs: rust: runs-on: ubuntu-24.04 - container: ghcr.io/dfinity/icp-dev-env-rust:0.1.0 + container: ghcr.io/dfinity/icp-dev-env-rust:0.3.1 env: ICP_CLI_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: @@ -26,7 +26,7 @@ jobs: run: icp network start -d && icp deploy motoko: runs-on: ubuntu-24.04 - container: ghcr.io/dfinity/icp-dev-env-motoko:0.1.0 + container: ghcr.io/dfinity/icp-dev-env-motoko:0.3.1 env: ICP_CLI_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: diff --git a/.github/workflows/vetkeys-basic-timelock-ibe.yml b/.github/workflows/vetkeys-basic-timelock-ibe.yml index 941cd3606..16a419b15 100644 --- a/.github/workflows/vetkeys-basic-timelock-ibe.yml +++ b/.github/workflows/vetkeys-basic-timelock-ibe.yml @@ -16,7 +16,7 @@ concurrency: jobs: rust: runs-on: ubuntu-24.04 - container: ghcr.io/dfinity/icp-dev-env-rust:0.1.0 + container: ghcr.io/dfinity/icp-dev-env-rust:0.3.1 env: ICP_CLI_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: diff --git a/.github/workflows/vetkeys-encrypted-notes-app-vetkd.yml b/.github/workflows/vetkeys-encrypted-notes-app-vetkd.yml index 8751b25d9..ad8aded29 100644 --- a/.github/workflows/vetkeys-encrypted-notes-app-vetkd.yml +++ b/.github/workflows/vetkeys-encrypted-notes-app-vetkd.yml @@ -16,7 +16,7 @@ concurrency: jobs: rust: runs-on: ubuntu-24.04 - container: ghcr.io/dfinity/icp-dev-env-rust:0.1.0 + container: ghcr.io/dfinity/icp-dev-env-rust:0.3.1 env: ICP_CLI_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: @@ -26,7 +26,7 @@ jobs: run: icp network start -d && icp deploy motoko: runs-on: ubuntu-24.04 - container: ghcr.io/dfinity/icp-dev-env-motoko:0.1.0 + container: ghcr.io/dfinity/icp-dev-env-motoko:0.3.1 env: ICP_CLI_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: diff --git a/.github/workflows/vetkeys-password-manager-with-metadata.yml b/.github/workflows/vetkeys-password-manager-with-metadata.yml index 95dfa5679..c08a4713a 100644 --- a/.github/workflows/vetkeys-password-manager-with-metadata.yml +++ b/.github/workflows/vetkeys-password-manager-with-metadata.yml @@ -16,7 +16,7 @@ concurrency: jobs: rust: runs-on: ubuntu-24.04 - container: ghcr.io/dfinity/icp-dev-env-rust:0.1.0 + container: ghcr.io/dfinity/icp-dev-env-rust:0.3.1 env: ICP_CLI_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: @@ -26,7 +26,7 @@ jobs: run: icp network start -d && icp deploy motoko: runs-on: ubuntu-24.04 - container: ghcr.io/dfinity/icp-dev-env-motoko:0.1.0 + container: ghcr.io/dfinity/icp-dev-env-motoko:0.3.1 env: ICP_CLI_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: diff --git a/.github/workflows/vetkeys-password-manager.yml b/.github/workflows/vetkeys-password-manager.yml index 791677e07..19d88e0d7 100644 --- a/.github/workflows/vetkeys-password-manager.yml +++ b/.github/workflows/vetkeys-password-manager.yml @@ -16,7 +16,7 @@ concurrency: jobs: rust: runs-on: ubuntu-24.04 - container: ghcr.io/dfinity/icp-dev-env-rust:0.1.0 + container: ghcr.io/dfinity/icp-dev-env-rust:0.3.1 env: ICP_CLI_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: @@ -26,7 +26,7 @@ jobs: run: icp network start -d && icp deploy motoko: runs-on: ubuntu-24.04 - container: ghcr.io/dfinity/icp-dev-env-motoko:0.1.0 + container: ghcr.io/dfinity/icp-dev-env-motoko:0.3.1 env: ICP_CLI_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: diff --git a/.github/workflows/who_am_i.yml b/.github/workflows/who_am_i.yml index fbcfffe2e..ec3b0eb5a 100644 --- a/.github/workflows/who_am_i.yml +++ b/.github/workflows/who_am_i.yml @@ -17,7 +17,7 @@ concurrency: jobs: motoko-who_am_i: runs-on: ubuntu-24.04 - container: ghcr.io/dfinity/icp-dev-env-motoko:0.1.0 + container: ghcr.io/dfinity/icp-dev-env-motoko:0.3.1 steps: - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 - name: Deploy and test @@ -29,7 +29,7 @@ jobs: rust-who_am_i: runs-on: ubuntu-24.04 - container: ghcr.io/dfinity/icp-dev-env-rust:0.1.0 + container: ghcr.io/dfinity/icp-dev-env-rust:0.3.1 steps: - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 - name: Deploy and test diff --git a/AGENTS.md b/AGENTS.md index f3c8281e5..0501cb4c7 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -101,14 +101,11 @@ networks: # omit if no Internet Identity needed canisters: - name: backend recipe: - type: https://raw.githubusercontent.com/dfinity/icp-cli-recipes/bc9581d9258d2d7feb15ab4ae8d04baf923b985f/recipes/motoko/recipe.hbs - # TODO: replace with @dfinity/motoko@vX.Y.Z once https://github.com/dfinity/icp-cli-recipes/pull/26 merges - configuration: - name: backend # must match [canisters.backend] key in mops.toml + type: "@dfinity/motoko@v5.0.0" - name: frontend recipe: - type: "@dfinity/asset-canister@v2.1.0" + type: "@dfinity/asset-canister@v2.2.1" configuration: dir: frontend/dist build: @@ -129,7 +126,7 @@ canisters: - name: frontend recipe: - type: "@dfinity/asset-canister@v2.1.0" + type: "@dfinity/asset-canister@v2.2.1" configuration: dir: frontend/dist build: @@ -145,7 +142,7 @@ canisters: ```toml [toolchain] -moc = "1.8.2" +moc = "1.9.0" [dependencies] core = "2.5.0" @@ -161,7 +158,7 @@ main = "backend/app.mo" candid = "backend/backend.did" ``` -`[canisters.]` replaces the `main`, `candid`, and `args` fields that were previously in `icp.yaml`. The `name` key must match the `name` in the recipe configuration. `--default-persistent-actors` makes all actors persistent by default, so the `persistent` keyword is not needed in source files. +`[canisters.]` replaces the `main`, `candid`, and `args` fields that were previously in `icp.yaml`. The `@dfinity/motoko@v5.0.0` recipe reads this section directly, so the Motoko canister needs no `configuration:` block in `icp.yaml` — the `` must match the canister `name` in `icp.yaml`. `--default-persistent-actors` makes all actors persistent by default, so the `persistent` keyword is not needed in source files. --- @@ -314,23 +311,12 @@ Rust: `icp build backend && candid-extractor target/wasm32-unknown-unknown/relea ## Pending items (do not resolve prematurely) ### Container images -Images are published at `ghcr.io/dfinity/icp-dev-env-{motoko,rust,all}`. All devcontainer configs and CI workflows reference the pinned tag (e.g. `0.1.0`). When a new release is cut, update the tag in: +Images are published at `ghcr.io/dfinity/icp-dev-env-{motoko,rust,all}`. All devcontainer configs and CI workflows reference the pinned tag (e.g. `0.3.1`). When a new release is cut, update the tag in: - `.devcontainer/devcontainer.json` - `.github/workflows/*.yml` Source: https://github.com/dfinity/icp-dev-env -### Motoko recipe version -Both `motoko/who_am_i/icp.yaml` and `motoko/hello_world/icp.yaml` pin a specific commit SHA of the Motoko recipe to pick up `[moc] args` support from `mops.toml` before it ships in a stable release: - -```yaml -type: https://raw.githubusercontent.com/dfinity/icp-cli-recipes/bc9581d9258d2d7feb15ab4ae8d04baf923b985f/recipes/motoko/recipe.hbs -``` - -Tracked in: https://github.com/dfinity/icp-cli-recipes/pull/26 - -Once that PR merges and a new `@dfinity/motoko` version is released, replace the raw URL in both files with the versioned tag (e.g. `@dfinity/motoko@vX.Y.Z`). - --- ## dfx → icp-cli migration checklist diff --git a/motoko/hello_world/icp.yaml b/motoko/hello_world/icp.yaml index 3c1670447..bd053999d 100644 --- a/motoko/hello_world/icp.yaml +++ b/motoko/hello_world/icp.yaml @@ -1,13 +1,11 @@ canisters: - name: backend recipe: - type: https://raw.githubusercontent.com/dfinity/icp-cli-recipes/bc9581d9258d2d7feb15ab4ae8d04baf923b985f/recipes/motoko/recipe.hbs - configuration: - name: backend + type: "@dfinity/motoko@v5.0.0" - name: frontend recipe: - type: "@dfinity/asset-canister@v2.1.0" + type: "@dfinity/asset-canister@v2.2.1" configuration: dir: frontend/dist build: diff --git a/motoko/who_am_i/icp.yaml b/motoko/who_am_i/icp.yaml index 4cd8aef9c..cd3dcd481 100644 --- a/motoko/who_am_i/icp.yaml +++ b/motoko/who_am_i/icp.yaml @@ -6,13 +6,11 @@ networks: canisters: - name: backend recipe: - type: https://raw.githubusercontent.com/dfinity/icp-cli-recipes/bc9581d9258d2d7feb15ab4ae8d04baf923b985f/recipes/motoko/recipe.hbs - configuration: - name: backend + type: "@dfinity/motoko@v5.0.0" - name: frontend recipe: - type: "@dfinity/asset-canister@v2.1.0" + type: "@dfinity/asset-canister@v2.2.1" configuration: dir: src/frontend/dist build: diff --git a/rust/hello_world/icp.yaml b/rust/hello_world/icp.yaml index da0587413..4d63b8094 100644 --- a/rust/hello_world/icp.yaml +++ b/rust/hello_world/icp.yaml @@ -8,7 +8,7 @@ canisters: - name: frontend recipe: - type: "@dfinity/asset-canister@v2.1.0" + type: "@dfinity/asset-canister@v2.2.1" configuration: dir: frontend/dist build: diff --git a/rust/vetkeys/basic_bls_signing/motoko/icp.yaml b/rust/vetkeys/basic_bls_signing/motoko/icp.yaml index d2f7ab3b5..a68c4b5ea 100644 --- a/rust/vetkeys/basic_bls_signing/motoko/icp.yaml +++ b/rust/vetkeys/basic_bls_signing/motoko/icp.yaml @@ -1,16 +1,14 @@ canisters: - name: basic_bls_signing recipe: - type: "@dfinity/motoko@v4.1.0" - configuration: - main: backend/src/Main.mo + type: "@dfinity/motoko@v5.0.0" init_args: type: text value: "(\"test_key_1\")" - name: www recipe: - type: "@dfinity/asset-canister@v2.1.0" + type: "@dfinity/asset-canister@v2.2.1" configuration: dir: dist build: diff --git a/rust/vetkeys/basic_bls_signing/motoko/mops.toml b/rust/vetkeys/basic_bls_signing/motoko/mops.toml index 948e1d22e..a29d5213f 100644 --- a/rust/vetkeys/basic_bls_signing/motoko/mops.toml +++ b/rust/vetkeys/basic_bls_signing/motoko/mops.toml @@ -5,3 +5,6 @@ moc = "1.9.0" core = "2.5.0" ic-vetkeys = "0.5.0" sha2 = "0.1.14" + +[canisters.basic_bls_signing] +main = "backend/src/Main.mo" diff --git a/rust/vetkeys/basic_bls_signing/rust/icp.yaml b/rust/vetkeys/basic_bls_signing/rust/icp.yaml index c70b4d26a..11ca10756 100644 --- a/rust/vetkeys/basic_bls_signing/rust/icp.yaml +++ b/rust/vetkeys/basic_bls_signing/rust/icp.yaml @@ -11,7 +11,7 @@ canisters: - name: www recipe: - type: "@dfinity/asset-canister@v2.1.0" + type: "@dfinity/asset-canister@v2.2.1" configuration: dir: dist build: diff --git a/rust/vetkeys/basic_ibe/motoko/icp.yaml b/rust/vetkeys/basic_ibe/motoko/icp.yaml index f299d64ab..425afe996 100644 --- a/rust/vetkeys/basic_ibe/motoko/icp.yaml +++ b/rust/vetkeys/basic_ibe/motoko/icp.yaml @@ -1,16 +1,14 @@ canisters: - name: basic_ibe recipe: - type: "@dfinity/motoko@v4.1.0" - configuration: - main: backend/src/Main.mo + type: "@dfinity/motoko@v5.0.0" init_args: type: text value: "(\"test_key_1\")" - name: www recipe: - type: "@dfinity/asset-canister@v2.1.0" + type: "@dfinity/asset-canister@v2.2.1" configuration: dir: dist build: diff --git a/rust/vetkeys/basic_ibe/motoko/mops.toml b/rust/vetkeys/basic_ibe/motoko/mops.toml index 948e1d22e..c81b0cdc5 100644 --- a/rust/vetkeys/basic_ibe/motoko/mops.toml +++ b/rust/vetkeys/basic_ibe/motoko/mops.toml @@ -5,3 +5,6 @@ moc = "1.9.0" core = "2.5.0" ic-vetkeys = "0.5.0" sha2 = "0.1.14" + +[canisters.basic_ibe] +main = "backend/src/Main.mo" diff --git a/rust/vetkeys/basic_ibe/rust/icp.yaml b/rust/vetkeys/basic_ibe/rust/icp.yaml index 898769bf2..a0e57efd8 100644 --- a/rust/vetkeys/basic_ibe/rust/icp.yaml +++ b/rust/vetkeys/basic_ibe/rust/icp.yaml @@ -11,7 +11,7 @@ canisters: - name: www recipe: - type: "@dfinity/asset-canister@v2.1.0" + type: "@dfinity/asset-canister@v2.2.1" configuration: dir: dist build: diff --git a/rust/vetkeys/basic_timelock_ibe/icp.yaml b/rust/vetkeys/basic_timelock_ibe/icp.yaml index 405af4419..88178cb9f 100644 --- a/rust/vetkeys/basic_timelock_ibe/icp.yaml +++ b/rust/vetkeys/basic_timelock_ibe/icp.yaml @@ -11,7 +11,7 @@ canisters: - name: www recipe: - type: "@dfinity/asset-canister@v2.1.0" + type: "@dfinity/asset-canister@v2.2.1" configuration: dir: dist build: diff --git a/rust/vetkeys/encrypted_notes_app_vetkd/motoko/icp.yaml b/rust/vetkeys/encrypted_notes_app_vetkd/motoko/icp.yaml index 8b496303e..ef936cb21 100644 --- a/rust/vetkeys/encrypted_notes_app_vetkd/motoko/icp.yaml +++ b/rust/vetkeys/encrypted_notes_app_vetkd/motoko/icp.yaml @@ -1,16 +1,14 @@ canisters: - name: encrypted_notes recipe: - type: "@dfinity/motoko@v4.1.0" - configuration: - main: backend/main.mo + type: "@dfinity/motoko@v5.0.0" init_args: type: text value: "(\"test_key_1\")" - name: www recipe: - type: "@dfinity/asset-canister@v2.1.0" + type: "@dfinity/asset-canister@v2.2.1" configuration: dir: dist build: diff --git a/rust/vetkeys/encrypted_notes_app_vetkd/motoko/mops.toml b/rust/vetkeys/encrypted_notes_app_vetkd/motoko/mops.toml index 1172ef015..99f601ef1 100644 --- a/rust/vetkeys/encrypted_notes_app_vetkd/motoko/mops.toml +++ b/rust/vetkeys/encrypted_notes_app_vetkd/motoko/mops.toml @@ -3,3 +3,6 @@ moc = "1.9.0" [dependencies] core = "2.5.0" + +[canisters.encrypted_notes] +main = "backend/main.mo" diff --git a/rust/vetkeys/encrypted_notes_app_vetkd/rust/icp.yaml b/rust/vetkeys/encrypted_notes_app_vetkd/rust/icp.yaml index cf25e37b4..bd77e42f5 100644 --- a/rust/vetkeys/encrypted_notes_app_vetkd/rust/icp.yaml +++ b/rust/vetkeys/encrypted_notes_app_vetkd/rust/icp.yaml @@ -11,7 +11,7 @@ canisters: - name: www recipe: - type: "@dfinity/asset-canister@v2.1.0" + type: "@dfinity/asset-canister@v2.2.1" configuration: dir: dist build: diff --git a/rust/vetkeys/password_manager/motoko/icp.yaml b/rust/vetkeys/password_manager/motoko/icp.yaml index 6630f604d..457ba76c1 100644 --- a/rust/vetkeys/password_manager/motoko/icp.yaml +++ b/rust/vetkeys/password_manager/motoko/icp.yaml @@ -1,16 +1,14 @@ canisters: - name: ic_vetkeys_encrypted_maps_canister recipe: - type: "@dfinity/motoko@v4.1.0" - configuration: - main: backend/src/Main.mo + type: "@dfinity/motoko@v5.0.0" init_args: type: text value: "(\"test_key_1\")" - name: www recipe: - type: "@dfinity/asset-canister@v2.1.0" + type: "@dfinity/asset-canister@v2.2.1" configuration: dir: dist build: diff --git a/rust/vetkeys/password_manager/motoko/mops.toml b/rust/vetkeys/password_manager/motoko/mops.toml index 0d53ffde3..45b392e37 100644 --- a/rust/vetkeys/password_manager/motoko/mops.toml +++ b/rust/vetkeys/password_manager/motoko/mops.toml @@ -4,3 +4,6 @@ moc = "1.9.0" [dependencies] core = "2.5.0" ic-vetkeys = "0.5.0" + +[canisters.ic_vetkeys_encrypted_maps_canister] +main = "backend/src/Main.mo" diff --git a/rust/vetkeys/password_manager/rust/icp.yaml b/rust/vetkeys/password_manager/rust/icp.yaml index b9c298ad1..2f3c18726 100644 --- a/rust/vetkeys/password_manager/rust/icp.yaml +++ b/rust/vetkeys/password_manager/rust/icp.yaml @@ -11,7 +11,7 @@ canisters: - name: www recipe: - type: "@dfinity/asset-canister@v2.1.0" + type: "@dfinity/asset-canister@v2.2.1" configuration: dir: dist build: diff --git a/rust/vetkeys/password_manager_with_metadata/motoko/icp.yaml b/rust/vetkeys/password_manager_with_metadata/motoko/icp.yaml index c19cfbed6..09bb4252c 100644 --- a/rust/vetkeys/password_manager_with_metadata/motoko/icp.yaml +++ b/rust/vetkeys/password_manager_with_metadata/motoko/icp.yaml @@ -1,16 +1,14 @@ canisters: - name: password_manager_with_metadata recipe: - type: "@dfinity/motoko@v4.1.0" - configuration: - main: backend/src/Main.mo + type: "@dfinity/motoko@v5.0.0" init_args: type: text value: "(\"test_key_1\")" - name: www recipe: - type: "@dfinity/asset-canister@v2.1.0" + type: "@dfinity/asset-canister@v2.2.1" configuration: dir: dist build: diff --git a/rust/vetkeys/password_manager_with_metadata/motoko/mops.toml b/rust/vetkeys/password_manager_with_metadata/motoko/mops.toml index 670c65a28..dff61c875 100644 --- a/rust/vetkeys/password_manager_with_metadata/motoko/mops.toml +++ b/rust/vetkeys/password_manager_with_metadata/motoko/mops.toml @@ -3,4 +3,6 @@ moc = "1.9.0" [dependencies] core = "2.5.0" -ic-vetkeys = "0.5.0" \ No newline at end of file +ic-vetkeys = "0.5.0" +[canisters.password_manager_with_metadata] +main = "backend/src/Main.mo" diff --git a/rust/vetkeys/password_manager_with_metadata/rust/icp.yaml b/rust/vetkeys/password_manager_with_metadata/rust/icp.yaml index 9d753e1a4..332199d44 100644 --- a/rust/vetkeys/password_manager_with_metadata/rust/icp.yaml +++ b/rust/vetkeys/password_manager_with_metadata/rust/icp.yaml @@ -11,7 +11,7 @@ canisters: - name: www recipe: - type: "@dfinity/asset-canister@v2.1.0" + type: "@dfinity/asset-canister@v2.2.1" configuration: dir: dist build: diff --git a/rust/who_am_i/icp.yaml b/rust/who_am_i/icp.yaml index bae2f48bc..d856ac88f 100644 --- a/rust/who_am_i/icp.yaml +++ b/rust/who_am_i/icp.yaml @@ -13,7 +13,7 @@ canisters: - name: frontend recipe: - type: "@dfinity/asset-canister@v2.1.0" + type: "@dfinity/asset-canister@v2.2.1" configuration: dir: src/frontend/dist build: