From 1c6c7123aada6b9e6787d052b580b779dea3c14a Mon Sep 17 00:00:00 2001 From: Marco Walz Date: Mon, 16 Feb 2026 18:14:12 +0100 Subject: [PATCH 01/11] chore: migrate build tooling from dfx to icp-cli --- .github/workflows/e2e-test-nodejs.yml | 24 ++-- .gitignore | 3 +- dfx.json | 130 ------------------ examples/clock/clock.did | 3 + examples/clock/src/main.mo | 4 +- examples/clock/tests/src/clock.spec.ts | 7 +- examples/counter/counter.did | 6 + examples/counter/src/main.mo | 2 +- examples/counter/tests/src/counter.spec.ts | 7 +- examples/google_search/google_search.did | 20 +++ examples/google_search/src/main.mo | 4 +- .../tests/src/google-search.spec.ts | 7 +- examples/http/tests/src/http.spec.ts | 7 +- .../tests/src/icp-features.spec.ts | 7 +- .../multicanister/interfaces/phonebook.mo | 13 ++ .../multicanister/interfaces/superheroes.mo | 12 ++ examples/multicanister/multicanister.did | 26 ++++ examples/multicanister/phonebook.did | 9 ++ examples/multicanister/src/main.mo | 4 +- examples/multicanister/src/phonebook.mo | 10 +- examples/multicanister/src/superheroes.mo | 22 +-- examples/multicanister/superheroes.did | 9 ++ .../tests/src/multicanister.spec.ts | 25 ++-- .../nns_proxy/tests/src/nns-proxy.spec.ts | 7 +- examples/todo/tests/src/todo.spec.ts | 7 +- icp.yaml | 99 +++++++++++++ mops.toml | 5 + package.json | 31 +++-- .../test-canister/declarations/index.d.ts | 50 ------- .../tests/test-canister/declarations/index.js | 42 ------ .../declarations/test_canister.did.d.ts | 16 ++- .../declarations/test_canister.did.js | 14 +- packages/pic/tests/test-canister/main.mo | 2 +- .../pic/tests/test-canister/test_canister.did | 5 + .../tests/test-canister/test_canister.wasm.gz | Bin 57928 -> 97652 bytes pnpm-lock.yaml | 20 ++- 36 files changed, 341 insertions(+), 318 deletions(-) delete mode 100644 dfx.json create mode 100644 examples/clock/clock.did create mode 100644 examples/counter/counter.did create mode 100644 examples/google_search/google_search.did create mode 100644 examples/multicanister/interfaces/phonebook.mo create mode 100644 examples/multicanister/interfaces/superheroes.mo create mode 100644 examples/multicanister/multicanister.did create mode 100644 examples/multicanister/phonebook.did create mode 100644 examples/multicanister/superheroes.did create mode 100644 icp.yaml create mode 100644 mops.toml delete mode 100644 packages/pic/tests/test-canister/declarations/index.d.ts delete mode 100644 packages/pic/tests/test-canister/declarations/index.js create mode 100644 packages/pic/tests/test-canister/test_canister.did diff --git a/.github/workflows/e2e-test-nodejs.yml b/.github/workflows/e2e-test-nodejs.yml index 735068d..9beb792 100644 --- a/.github/workflows/e2e-test-nodejs.yml +++ b/.github/workflows/e2e-test-nodejs.yml @@ -31,10 +31,14 @@ jobs: - name: Setup PNPM uses: dfinity/ci-tools/actions/setup-pnpm@main - - name: Setup DFX - uses: dfinity/setup-dfx@main - with: - dfx-version: 'auto' + - name: Install ICP CLI tools + run: pnpm add -g @icp-sdk/icp-cli @icp-sdk/ic-wasm ic-mops + + - name: Install Motoko toolchain + run: mops toolchain init + + - name: Add wasm32 Rust target + run: rustup target add wasm32-unknown-unknown - name: Build run: pnpm run build @@ -64,10 +68,14 @@ jobs: shell: bash run: bun i --frozen-lockfile - - name: Setup DFX - uses: dfinity/setup-dfx@main - with: - dfx-version: 'auto' + - name: Install ICP CLI tools + run: bun add -g @icp-sdk/icp-cli @icp-sdk/ic-wasm ic-mops + + - name: Install Motoko toolchain + run: mops toolchain init + + - name: Add wasm32 Rust target + run: rustup target add wasm32-unknown-unknown - name: Build run: bun run build diff --git a/.gitignore b/.gitignore index 17c7ff5..752995a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ -/.dfx/ +/.icp/cache/ +/.mops/ /node_modules/ /target/ diff --git a/dfx.json b/dfx.json deleted file mode 100644 index 9ca6052..0000000 --- a/dfx.json +++ /dev/null @@ -1,130 +0,0 @@ -{ - "version": 1, - "dfx": "0.30.2", - "output_env_file": ".env", - "networks": { - "local": { - "bind": "127.0.0.1:8080", - "type": "ephemeral" - } - }, - "canisters": { - "test_canister": { - "type": "motoko", - "main": "packages/pic/tests/test-canister/main.mo", - "declarations": { - "bindings": ["js", "ts"], - "output": "packages/pic/tests/test-canister/declarations" - }, - "gzip": true, - "optimize": "cycles" - }, - "clock": { - "type": "motoko", - "main": "examples/clock/src/main.mo", - "declarations": { - "bindings": ["js", "ts"], - "output": "examples/clock/declarations" - }, - "gzip": true, - "optimize": "cycles" - }, - "counter": { - "type": "motoko", - "main": "examples/counter/src/main.mo", - "init_arg": "'(42)'", - "declarations": { - "bindings": ["js", "ts"], - "output": "examples/counter/declarations" - }, - "gzip": true, - "optimize": "cycles" - }, - "google_search": { - "type": "motoko", - "main": "examples/google_search/src/main.mo", - "declarations": { - "bindings": ["js", "ts"], - "output": "examples/google_search/declarations" - }, - "gzip": true, - "optimize": "cycles" - }, - "icp_features": { - "type": "rust", - "candid": "examples/icp_features/icp_features.did", - "package": "icp_features", - "declarations": { - "bindings": ["js", "ts"], - "output": "examples/icp_features/declarations" - }, - "gzip": true, - "optimize": "cycles" - }, - "multicanister": { - "type": "motoko", - "main": "examples/multicanister/src/main.mo", - "dependencies": ["phonebook", "superheroes"], - "declarations": { - "bindings": ["js", "ts"], - "output": "examples/multicanister/declarations/multicanister" - }, - "gzip": true, - "optimize": "cycles" - }, - "nns_proxy": { - "type": "rust", - "candid": "examples/nns_proxy/nns_proxy.did", - "package": "nns_proxy", - "declarations": { - "bindings": ["js", "ts"], - "output": "examples/nns_proxy/declarations" - }, - "gzip": true, - "optimize": "cycles" - }, - "todo": { - "type": "rust", - "candid": "examples/todo/todo.did", - "package": "todo", - "declarations": { - "bindings": ["js", "ts"], - "output": "examples/todo/declarations" - }, - "gzip": true, - "optimize": "cycles" - }, - "phonebook": { - "type": "motoko", - "main": "examples/multicanister/src/phonebook.mo", - "declarations": { - "bindings": ["mo"], - "output": "examples/multicanister/declarations/phonebook" - }, - "gzip": true, - "optimize": "cycles" - }, - "superheroes": { - "type": "motoko", - "main": "examples/multicanister/src/superheroes.mo", - "declarations": { - "bindings": ["mo"], - "output": "examples/multicanister/declarations/superheroes" - }, - "gzip": true, - "optimize": "cycles" - }, - "http": { - "type": "rust", - "candid": "examples/http/http.did", - "package": "http-canister", - "frontend": {}, - "declarations": { - "bindings": ["js", "ts"], - "output": "examples/http/declarations" - }, - "gzip": true, - "optimize": "cycles" - } - } -} diff --git a/examples/clock/clock.did b/examples/clock/clock.did new file mode 100644 index 0000000..a0bdb94 --- /dev/null +++ b/examples/clock/clock.did @@ -0,0 +1,3 @@ +service : { + get : () -> (int) query; +} diff --git a/examples/clock/src/main.mo b/examples/clock/src/main.mo index 76c04cb..4a42cd8 100644 --- a/examples/clock/src/main.mo +++ b/examples/clock/src/main.mo @@ -1,5 +1,5 @@ -import Time "mo:base/Time"; -import { setTimer; recurringTimer } = "mo:base/Timer"; +import Time "mo:core/Time"; +import { setTimer; recurringTimer } = "mo:core/Timer"; persistent actor Clock { private type Time = Time.Time; diff --git a/examples/clock/tests/src/clock.spec.ts b/examples/clock/tests/src/clock.spec.ts index 90188be..66e3f47 100644 --- a/examples/clock/tests/src/clock.spec.ts +++ b/examples/clock/tests/src/clock.spec.ts @@ -11,11 +11,10 @@ const WASM_PATH = resolve( '..', '..', '..', - '.dfx', - 'local', - 'canisters', + '.icp', + 'cache', + 'artifacts', 'clock', - 'clock.wasm.gz', ); describe('Clock', () => { diff --git a/examples/counter/counter.did b/examples/counter/counter.did new file mode 100644 index 0000000..5080bce --- /dev/null +++ b/examples/counter/counter.did @@ -0,0 +1,6 @@ +service : (nat) -> { + get : () -> (nat) query; + set : (nat) -> (); + inc : () -> (); + dec : () -> (); +} diff --git a/examples/counter/src/main.mo b/examples/counter/src/main.mo index 0fc76c3..fd5f672 100644 --- a/examples/counter/src/main.mo +++ b/examples/counter/src/main.mo @@ -1,4 +1,4 @@ -import Nat "mo:base/Nat"; +import Nat "mo:core/Nat"; persistent actor class Counter(initial_count : Nat) { private var counter = initial_count; diff --git a/examples/counter/tests/src/counter.spec.ts b/examples/counter/tests/src/counter.spec.ts index a90ad4f..83ec0a1 100644 --- a/examples/counter/tests/src/counter.spec.ts +++ b/examples/counter/tests/src/counter.spec.ts @@ -12,11 +12,10 @@ const WASM_PATH = resolve( '..', '..', '..', - '.dfx', - 'local', - 'canisters', + '.icp', + 'cache', + 'artifacts', 'counter', - 'counter.wasm.gz', ); describe('Counter', () => { diff --git a/examples/google_search/google_search.did b/examples/google_search/google_search.did new file mode 100644 index 0000000..299bd88 --- /dev/null +++ b/examples/google_search/google_search.did @@ -0,0 +1,20 @@ +type HttpHeader = record { + name : text; + value : text; +}; + +type CanisterHttpResponsePayload = record { + status : nat; + headers : vec HttpHeader; + body : vec nat8; +}; + +type TransformArgs = record { + response : CanisterHttpResponsePayload; + context : blob; +}; + +service : { + google_search : () -> (text); + transform : (TransformArgs) -> (CanisterHttpResponsePayload) query; +} diff --git a/examples/google_search/src/main.mo b/examples/google_search/src/main.mo index c4b0a9f..6ca29f7 100644 --- a/examples/google_search/src/main.mo +++ b/examples/google_search/src/main.mo @@ -1,5 +1,5 @@ -import Blob "mo:base/Blob"; -import Text "mo:base/Text"; +import Blob "mo:core/Blob"; +import Text "mo:core/Text"; import Types "types"; persistent actor { diff --git a/examples/google_search/tests/src/google-search.spec.ts b/examples/google_search/tests/src/google-search.spec.ts index f35e117..0cd2fa4 100644 --- a/examples/google_search/tests/src/google-search.spec.ts +++ b/examples/google_search/tests/src/google-search.spec.ts @@ -10,11 +10,10 @@ const WASM_PATH = resolve( '..', '..', '..', - '.dfx', - 'local', - 'canisters', + '.icp', + 'cache', + 'artifacts', 'google_search', - 'google_search.wasm.gz', ); describe('GoogleSearch', () => { diff --git a/examples/http/tests/src/http.spec.ts b/examples/http/tests/src/http.spec.ts index 2bd9de2..84136c3 100644 --- a/examples/http/tests/src/http.spec.ts +++ b/examples/http/tests/src/http.spec.ts @@ -9,11 +9,10 @@ const WASM_PATH = resolve( '..', '..', '..', - '.dfx', - 'local', - 'canisters', + '.icp', + 'cache', + 'artifacts', 'http', - 'http.wasm.gz', ); describe('HTTP', () => { diff --git a/examples/icp_features/tests/src/icp-features.spec.ts b/examples/icp_features/tests/src/icp-features.spec.ts index dd70792..1f98de8 100644 --- a/examples/icp_features/tests/src/icp-features.spec.ts +++ b/examples/icp_features/tests/src/icp-features.spec.ts @@ -9,11 +9,10 @@ const WASM_PATH = resolve( '..', '..', '..', - '.dfx', - 'local', - 'canisters', + '.icp', + 'cache', + 'artifacts', 'icp_features', - 'icp_features.wasm.gz', ); const E8S_PER_ICP = 100_000_000; diff --git a/examples/multicanister/interfaces/phonebook.mo b/examples/multicanister/interfaces/phonebook.mo new file mode 100644 index 0000000..c92ad90 --- /dev/null +++ b/examples/multicanister/interfaces/phonebook.mo @@ -0,0 +1,13 @@ +module { + public type ContactName = Text; + public type PhoneNumber = Text; + public type PhoneBookEntry = { + phone : PhoneNumber; + description : Text; + }; + + public type Self = actor { + insert : shared (ContactName, PhoneBookEntry) -> async (); + lookup : shared query (ContactName) -> async ?PhoneBookEntry; + }; +} diff --git a/examples/multicanister/interfaces/superheroes.mo b/examples/multicanister/interfaces/superheroes.mo new file mode 100644 index 0000000..ec92c90 --- /dev/null +++ b/examples/multicanister/interfaces/superheroes.mo @@ -0,0 +1,12 @@ +module { + public type SuperHeroId = Nat32; + public type SuperHero = { + name : Text; + superpowers : [Text]; + }; + + public type Self = actor { + insert : shared (SuperHero) -> async SuperHeroId; + lookup : shared query (SuperHeroId) -> async ?SuperHero; + }; +} diff --git a/examples/multicanister/multicanister.did b/examples/multicanister/multicanister.did new file mode 100644 index 0000000..70c6b38 --- /dev/null +++ b/examples/multicanister/multicanister.did @@ -0,0 +1,26 @@ +type PhoneBookEntry = record { + phone : text; + description : text; +}; + +type SuperHero = record { + name : text; + superpowers : vec text; +}; + +type PhoneBookService = service { + insert : (text, PhoneBookEntry) -> (); + lookup : (text) -> (opt PhoneBookEntry) query; +}; + +type SuperHeroesService = service { + insert : (SuperHero) -> (nat32); + lookup : (nat32) -> (opt SuperHero) query; +}; + +service : (PhoneBookService, SuperHeroesService) -> { + insert_phone_book_entry : (text, PhoneBookEntry) -> (); + lookup_phone_book_entry : (text) -> (opt PhoneBookEntry) composite_query; + insert_super_hero : (SuperHero) -> (nat32); + lookup_super_hero : (nat32) -> (opt SuperHero); +} diff --git a/examples/multicanister/phonebook.did b/examples/multicanister/phonebook.did new file mode 100644 index 0000000..ea659c9 --- /dev/null +++ b/examples/multicanister/phonebook.did @@ -0,0 +1,9 @@ +type PhoneBookEntry = record { + phone : text; + description : text; +}; + +service : { + insert : (text, PhoneBookEntry) -> (); + lookup : (text) -> (opt PhoneBookEntry) query; +} diff --git a/examples/multicanister/src/main.mo b/examples/multicanister/src/main.mo index 89ae481..20e6fff 100644 --- a/examples/multicanister/src/main.mo +++ b/examples/multicanister/src/main.mo @@ -1,5 +1,5 @@ -import PhoneBook "../declarations/phonebook/phonebook"; -import SuperHeroes "../declarations/superheroes/superheroes"; +import PhoneBook "../interfaces/phonebook"; +import SuperHeroes "../interfaces/superheroes"; persistent actor class KeyValue(phonebook : PhoneBook.Self, superheroes : SuperHeroes.Self) { public func insert_phone_book_entry(name : Text, entry : PhoneBook.PhoneBookEntry) : async () { diff --git a/examples/multicanister/src/phonebook.mo b/examples/multicanister/src/phonebook.mo index 1c3c3ed..7f9f248 100644 --- a/examples/multicanister/src/phonebook.mo +++ b/examples/multicanister/src/phonebook.mo @@ -1,5 +1,5 @@ -import Map "mo:base/HashMap"; -import Text "mo:base/Text"; +import Map "mo:core/Map"; +import Text "mo:core/Text"; persistent actor PhoneBook { public type ContactName = Text; @@ -9,13 +9,13 @@ persistent actor PhoneBook { description : Text; }; - transient let phonebook = Map.HashMap(0, Text.equal, Text.hash); + let phonebook = Map.empty(); public func insert(name : ContactName, entry : PhoneBookEntry) : async () { - phonebook.put(name, entry); + Map.add(phonebook, Text.compare, name, entry); }; public query func lookup(name : ContactName) : async ?PhoneBookEntry { - phonebook.get(name); + Map.get(phonebook, Text.compare, name); }; }; diff --git a/examples/multicanister/src/superheroes.mo b/examples/multicanister/src/superheroes.mo index 7119c82..773c001 100644 --- a/examples/multicanister/src/superheroes.mo +++ b/examples/multicanister/src/superheroes.mo @@ -1,36 +1,26 @@ -import List "mo:base/List"; -import Trie "mo:base/Trie"; -import Nat32 "mo:base/Nat32"; +import Map "mo:core/Map"; +import Nat32 "mo:core/Nat32"; persistent actor SuperHeroes { public type SuperHeroId = Nat32; public type SuperHero = { name : Text; - superpowers : List.List; + superpowers : [Text]; }; private var next : SuperHeroId = 0; - private var superheroes : Trie.Trie = Trie.empty(); + let superheroes = Map.empty(); public func insert(superhero : SuperHero) : async SuperHeroId { let superheroId = next; next += 1; - superheroes := Trie.replace( - superheroes, - key(superheroId), - Nat32.equal, - ?superhero, - ).0; + Map.add(superheroes, Nat32.compare, superheroId, superhero); return superheroId; }; public query func lookup(superheroId : SuperHeroId) : async ?SuperHero { - return Trie.find(superheroes, key(superheroId), Nat32.equal); - }; - - private func key(x : SuperHeroId) : Trie.Key { - return { hash = x; key = x }; + return Map.get(superheroes, Nat32.compare, superheroId); }; }; diff --git a/examples/multicanister/superheroes.did b/examples/multicanister/superheroes.did new file mode 100644 index 0000000..1781279 --- /dev/null +++ b/examples/multicanister/superheroes.did @@ -0,0 +1,9 @@ +type SuperHero = record { + name : text; + superpowers : vec text; +}; + +service : { + insert : (SuperHero) -> (nat32); + lookup : (nat32) -> (opt SuperHero) query; +} diff --git a/examples/multicanister/tests/src/multicanister.spec.ts b/examples/multicanister/tests/src/multicanister.spec.ts index 6cd28a7..3ba2093 100644 --- a/examples/multicanister/tests/src/multicanister.spec.ts +++ b/examples/multicanister/tests/src/multicanister.spec.ts @@ -8,7 +8,7 @@ import { _SERVICE, idlFactory, init, -} from '../../declarations/multicanister/multicanister.did'; +} from '../../declarations/multicanister.did'; const MAIN_WASM_PATH = resolve( __dirname, @@ -16,11 +16,10 @@ const MAIN_WASM_PATH = resolve( '..', '..', '..', - '.dfx', - 'local', - 'canisters', + '.icp', + 'cache', + 'artifacts', 'multicanister', - 'multicanister.wasm.gz', ); const PHONEBOOK_WASM_PATH = resolve( @@ -29,11 +28,10 @@ const PHONEBOOK_WASM_PATH = resolve( '..', '..', '..', - '.dfx', - 'local', - 'canisters', + '.icp', + 'cache', + 'artifacts', 'phonebook', - 'phonebook.wasm.gz', ); const SUPERHEROES_WASM_PATH = resolve( @@ -42,11 +40,10 @@ const SUPERHEROES_WASM_PATH = resolve( '..', '..', '..', - '.dfx', - 'local', - 'canisters', + '.icp', + 'cache', + 'artifacts', 'superheroes', - 'superheroes.wasm.gz', ); describe('Multicanister', () => { @@ -116,7 +113,7 @@ describe('Multicanister', () => { const name = 'Superman'; const superHero: SuperHero = { name, - superpowers: [['flight', [['super strength', [['heat vision', []]]]]]], + superpowers: ['flight', 'super strength', 'heat vision'], }; const id = await actor.insert_super_hero(superHero); diff --git a/examples/nns_proxy/tests/src/nns-proxy.spec.ts b/examples/nns_proxy/tests/src/nns-proxy.spec.ts index eb0a91c..0de5afc 100644 --- a/examples/nns_proxy/tests/src/nns-proxy.spec.ts +++ b/examples/nns_proxy/tests/src/nns-proxy.spec.ts @@ -15,11 +15,10 @@ const WASM_PATH = resolve( '..', '..', '..', - '.dfx', - 'local', - 'canisters', + '.icp', + 'cache', + 'artifacts', 'nns_proxy', - 'nns_proxy.wasm.gz', ); const NNS_STATE_PATH = resolve(__dirname, '..', 'state', 'nns_state'); diff --git a/examples/todo/tests/src/todo.spec.ts b/examples/todo/tests/src/todo.spec.ts index e979cbb..622c37e 100644 --- a/examples/todo/tests/src/todo.spec.ts +++ b/examples/todo/tests/src/todo.spec.ts @@ -10,11 +10,10 @@ const WASM_PATH = resolve( '..', '..', '..', - '.dfx', - 'local', - 'canisters', + '.icp', + 'cache', + 'artifacts', 'todo', - 'todo.wasm.gz', ); describe('Todo', () => { diff --git a/icp.yaml b/icp.yaml new file mode 100644 index 0000000..ecc8fad --- /dev/null +++ b/icp.yaml @@ -0,0 +1,99 @@ +# yaml-language-server: $schema=https://github.com/dfinity/icp-cli/raw/refs/tags/v0.1.0/docs/schemas/icp-yaml-schema.json + +canisters: + # Motoko canisters + - name: test_canister + recipe: + type: "@dfinity/motoko@v4.0.0" + configuration: + main: packages/pic/tests/test-canister/main.mo + candid: packages/pic/tests/test-canister/test_canister.did + args: "" + compress: true + + - name: counter + recipe: + type: "@dfinity/motoko@v4.0.0" + configuration: + main: examples/counter/src/main.mo + candid: examples/counter/counter.did + args: "" + compress: true + + - name: clock + recipe: + type: "@dfinity/motoko@v4.0.0" + configuration: + main: examples/clock/src/main.mo + candid: examples/clock/clock.did + args: "" + compress: true + + - name: google_search + recipe: + type: "@dfinity/motoko@v4.0.0" + configuration: + main: examples/google_search/src/main.mo + candid: examples/google_search/google_search.did + args: "" + compress: true + + - name: phonebook + recipe: + type: "@dfinity/motoko@v4.0.0" + configuration: + main: examples/multicanister/src/phonebook.mo + candid: examples/multicanister/phonebook.did + args: "" + compress: true + + - name: superheroes + recipe: + type: "@dfinity/motoko@v4.0.0" + configuration: + main: examples/multicanister/src/superheroes.mo + candid: examples/multicanister/superheroes.did + args: "" + compress: true + + - name: multicanister + recipe: + type: "@dfinity/motoko@v4.0.0" + configuration: + main: examples/multicanister/src/main.mo + candid: examples/multicanister/multicanister.did + args: "" + compress: true + + # Rust canisters + - name: todo + recipe: + type: "@dfinity/rust@v3.0.0" + configuration: + package: todo + candid: examples/todo/todo.did + compress: true + + - name: icp_features + recipe: + type: "@dfinity/rust@v3.0.0" + configuration: + package: icp_features + candid: examples/icp_features/icp_features.did + compress: true + + - name: nns_proxy + recipe: + type: "@dfinity/rust@v3.0.0" + configuration: + package: nns_proxy + candid: examples/nns_proxy/nns_proxy.did + compress: true + + - name: http + recipe: + type: "@dfinity/rust@v3.0.0" + configuration: + package: http-canister + candid: examples/http/http.did + compress: true diff --git a/mops.toml b/mops.toml new file mode 100644 index 0000000..3df1706 --- /dev/null +++ b/mops.toml @@ -0,0 +1,5 @@ +[dependencies] +core = "2.0.0" + +[toolchain] +moc = "1.2.0" diff --git a/package.json b/package.json index 4e11533..872553f 100644 --- a/package.json +++ b/package.json @@ -27,28 +27,39 @@ "build": "run-p build:pic", "build:pic": "tsc -p ./packages/pic/tsconfig.json", "test:pic": "jest -c ./packages/pic/jest.config.ts", - "build:test-canister": "dfx generate test_canister && dfx build test_canister --check && mv .dfx/local/canisters/test_canister/test_canister.wasm.gz packages/pic/tests/test-canister", - "build:examples": "dfx generate phonebook && dfx generate superheroes && dfx generate && dfx build --all --check", + "build:test-canister": "icp build test_canister && cp .icp/cache/artifacts/test_canister packages/pic/tests/test-canister/test_canister.wasm.gz && pnpm run generate:test-canister", + "generate:test-canister": "icp-bindgen --did-file packages/pic/tests/test-canister/test_canister.did --out-dir packages/pic/tests/test-canister --actor-disabled --force", + "build:examples": "icp build && pnpm run generate:bindings", + "generate:bindings": "run-p generate:clock generate:counter generate:google-search generate:http generate:icp-features generate:multicanister generate:nns-proxy generate:todo", + "generate:clock": "icp-bindgen --did-file examples/clock/clock.did --out-dir examples/clock --actor-disabled --force", + "generate:counter": "icp-bindgen --did-file examples/counter/counter.did --out-dir examples/counter --actor-disabled --force", + "generate:google-search": "icp-bindgen --did-file examples/google_search/google_search.did --out-dir examples/google_search --actor-disabled --force", + "generate:http": "icp-bindgen --did-file examples/http/http.did --out-dir examples/http --actor-disabled --force", + "generate:icp-features": "icp-bindgen --did-file examples/icp_features/icp_features.did --out-dir examples/icp_features --actor-disabled --force", + "generate:multicanister": "icp-bindgen --did-file examples/multicanister/multicanister.did --out-dir examples/multicanister --actor-disabled --force", + "generate:nns-proxy": "icp-bindgen --did-file examples/nns_proxy/nns_proxy.did --out-dir examples/nns_proxy --actor-disabled --force", + "generate:todo": "icp-bindgen --did-file examples/todo/todo.did --out-dir examples/todo --actor-disabled --force", "test:examples": "run-p test:clock test:counter test:google-search test:icp-features test:multicanister test:nns-proxy test:todo test:http", - "build:clock": "dfx generate clock && dfx build clock --check", + "build:clock": "icp build clock && pnpm run generate:clock", "test:clock": "jest -c ./examples/clock/tests/jest.config.ts", - "build:counter": "dfx generate counter && dfx build counter --check", + "build:counter": "icp build counter && pnpm run generate:counter", "test:counter": "vitest run -c ./examples/counter/tests/vitest.config.ts", - "build:google-search": "dfx generate google_search && dfx build google_search --check", + "build:google-search": "icp build google_search && pnpm run generate:google-search", "test:google-search": "jest -c ./examples/google_search/tests/jest.config.ts", - "build:icp-features": "dfx generate icp_features && dfx build icp_features --check", + "build:icp-features": "icp build icp_features && pnpm run generate:icp-features", "test:icp-features": "jest -c ./examples/icp_features/tests/jest.config.ts", - "build:multicanister": "dfx generate multicanister && dfx build multicanister --check", + "build:multicanister": "icp build phonebook superheroes multicanister && pnpm run generate:multicanister", "test:multicanister": "jest -c ./examples/multicanister/tests/jest.config.ts", - "build:nns-proxy": "dfx generate nns_proxy && dfx build nns_proxy --check", + "build:nns-proxy": "icp build nns_proxy && pnpm run generate:nns-proxy", "test:nns-proxy": "jest -c ./examples/nns_proxy/tests/jest.config.ts", - "build:todo": "dfx generate todo && dfx build todo --check", + "build:todo": "icp build todo && pnpm run generate:todo", "test:todo": "jest -c ./examples/todo/tests/jest.config.ts", - "build:http": "dfx generate http && dfx build http --check", + "build:http": "icp build http && pnpm run generate:http", "test:http": "vitest run -c ./examples/http/tests/vitest.config.ts", "postinstall": "tar -xvf examples/nns_proxy/tests/state/nns_state.tar.xz -C examples/nns_proxy/tests/state" }, "devDependencies": { + "@icp-sdk/bindgen": "^0.2.1", "@icp-sdk/core": "^5.0.0", "@swc/core": "^1.15.3", "@swc/jest": "^0.2.39", diff --git a/packages/pic/tests/test-canister/declarations/index.d.ts b/packages/pic/tests/test-canister/declarations/index.d.ts deleted file mode 100644 index fd1b65a..0000000 --- a/packages/pic/tests/test-canister/declarations/index.d.ts +++ /dev/null @@ -1,50 +0,0 @@ -import type { - ActorSubclass, - HttpAgentOptions, - ActorConfig, - Agent, -} from "@dfinity/agent"; -import type { Principal } from "@dfinity/principal"; -import type { IDL } from "@dfinity/candid"; - -import { _SERVICE } from './test_canister.did'; - -export declare const idlFactory: IDL.InterfaceFactory; -export declare const canisterId: string; - -export declare interface CreateActorOptions { - /** - * @see {@link Agent} - */ - agent?: Agent; - /** - * @see {@link HttpAgentOptions} - */ - agentOptions?: HttpAgentOptions; - /** - * @see {@link ActorConfig} - */ - actorOptions?: ActorConfig; -} - -/** - * Intializes an {@link ActorSubclass}, configured with the provided SERVICE interface of a canister. - * @constructs {@link ActorSubClass} - * @param {string | Principal} canisterId - ID of the canister the {@link Actor} will talk to - * @param {CreateActorOptions} options - see {@link CreateActorOptions} - * @param {CreateActorOptions["agent"]} options.agent - a pre-configured agent you'd like to use. Supercedes agentOptions - * @param {CreateActorOptions["agentOptions"]} options.agentOptions - options to set up a new agent - * @see {@link HttpAgentOptions} - * @param {CreateActorOptions["actorOptions"]} options.actorOptions - options for the Actor - * @see {@link ActorConfig} - */ -export declare const createActor: ( - canisterId: string | Principal, - options?: CreateActorOptions -) => ActorSubclass<_SERVICE>; - -/** - * Intialized Actor using default settings, ready to talk to a canister using its candid interface - * @constructs {@link ActorSubClass} - */ -export declare const test_canister: ActorSubclass<_SERVICE>; diff --git a/packages/pic/tests/test-canister/declarations/index.js b/packages/pic/tests/test-canister/declarations/index.js deleted file mode 100644 index beab293..0000000 --- a/packages/pic/tests/test-canister/declarations/index.js +++ /dev/null @@ -1,42 +0,0 @@ -import { Actor, HttpAgent } from "@dfinity/agent"; - -// Imports and re-exports candid interface -import { idlFactory } from "./test_canister.did.js"; -export { idlFactory } from "./test_canister.did.js"; - -/* CANISTER_ID is replaced by webpack based on node environment - * Note: canister environment variable will be standardized as - * process.env.CANISTER_ID_ - * beginning in dfx 0.15.0 - */ -export const canisterId = - process.env.CANISTER_ID_TEST_CANISTER; - -export const createActor = (canisterId, options = {}) => { - const agent = options.agent || new HttpAgent({ ...options.agentOptions }); - - if (options.agent && options.agentOptions) { - console.warn( - "Detected both agent and agentOptions passed to createActor. Ignoring agentOptions and proceeding with the provided agent." - ); - } - - // Fetch root key for certificate validation during development - if (process.env.DFX_NETWORK !== "ic") { - agent.fetchRootKey().catch((err) => { - console.warn( - "Unable to fetch root key. Check to ensure that your local replica is running" - ); - console.error(err); - }); - } - - // Creates an actor with using the candid interface and the HttpAgent - return Actor.createActor(idlFactory, { - agent, - canisterId, - ...options.actorOptions, - }); -}; - -export const test_canister = canisterId ? createActor(canisterId) : undefined; diff --git a/packages/pic/tests/test-canister/declarations/test_canister.did.d.ts b/packages/pic/tests/test-canister/declarations/test_canister.did.d.ts index 2097688..ed3d861 100644 --- a/packages/pic/tests/test-canister/declarations/test_canister.did.d.ts +++ b/packages/pic/tests/test-canister/declarations/test_canister.did.d.ts @@ -1,8 +1,16 @@ -import type { Principal } from '@dfinity/principal'; -import type { ActorMethod } from '@dfinity/agent'; -import type { IDL } from '@dfinity/candid'; +/* eslint-disable */ + +// @ts-nocheck + +// This file was automatically generated by @icp-sdk/bindgen@0.2.1. +// You should NOT make any changes in this file as it will be overwritten. +// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. + +import type { ActorMethod } from '@icp-sdk/core/agent'; +import type { IDL } from '@icp-sdk/core/candid'; +import type { Principal } from '@icp-sdk/core/principal'; export type Time = bigint; export interface _SERVICE { 'get_time' : ActorMethod<[], Time> } export declare const idlFactory: IDL.InterfaceFactory; -export declare const init: (args: { IDL: typeof IDL }) => IDL.Type[]; +export declare const init: (args: { IDL: typeof IDL }) => IDL.Type[]; \ No newline at end of file diff --git a/packages/pic/tests/test-canister/declarations/test_canister.did.js b/packages/pic/tests/test-canister/declarations/test_canister.did.js index 11d120e..08229ee 100644 --- a/packages/pic/tests/test-canister/declarations/test_canister.did.js +++ b/packages/pic/tests/test-canister/declarations/test_canister.did.js @@ -1,5 +1,17 @@ +/* eslint-disable */ + +// @ts-nocheck + +// This file was automatically generated by @icp-sdk/bindgen@0.2.1. +// You should NOT make any changes in this file as it will be overwritten. +// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. + +import { IDL } from '@icp-sdk/core/candid'; + export const idlFactory = ({ IDL }) => { const Time = IDL.Int; + return IDL.Service({ 'get_time' : IDL.Func([], [Time], ['query']) }); }; -export const init = ({ IDL }) => { return []; }; + +export const init = ({ IDL }) => { return []; }; \ No newline at end of file diff --git a/packages/pic/tests/test-canister/main.mo b/packages/pic/tests/test-canister/main.mo index d081914..5fa458e 100644 --- a/packages/pic/tests/test-canister/main.mo +++ b/packages/pic/tests/test-canister/main.mo @@ -1,4 +1,4 @@ -import Time "mo:base/Time"; +import Time "mo:core/Time"; persistent actor TestCanister { public query func get_time() : async Time.Time { diff --git a/packages/pic/tests/test-canister/test_canister.did b/packages/pic/tests/test-canister/test_canister.did new file mode 100644 index 0000000..6cab63b --- /dev/null +++ b/packages/pic/tests/test-canister/test_canister.did @@ -0,0 +1,5 @@ +type Time = int; + +service : { + get_time : () -> (Time) query; +} diff --git a/packages/pic/tests/test-canister/test_canister.wasm.gz b/packages/pic/tests/test-canister/test_canister.wasm.gz index 0d397bd20bf0ad71d47ccdbd9c9e3d227755a115..a8fc2e62e48249d158c52ed3c57ddbf9cfa0f899 100644 GIT binary patch literal 97652 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℘K-o&Az7YP=M!xP2f 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'} + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} + engines: {node: '>=20'} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -1555,11 +1566,12 @@ packages: glob@10.5.0: resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} @@ -3021,6 +3033,10 @@ snapshots: '@shikijs/types': 3.12.2 '@shikijs/vscode-textmate': 10.0.2 + '@icp-sdk/bindgen@0.2.1': + dependencies: + commander: 14.0.3 + '@icp-sdk/core@5.0.0': dependencies: '@dfinity/cbor': 0.2.2 @@ -3870,6 +3886,8 @@ snapshots: commander@14.0.1: {} + commander@14.0.3: {} + concat-map@0.0.1: {} convert-source-map@2.0.0: {} From f6890b03461d58641f81e2ba41249a7f52fe1c4f Mon Sep 17 00:00:00 2001 From: Marco Walz Date: Tue, 17 Feb 2026 10:34:32 +0100 Subject: [PATCH 02/11] fix: formatting --- icp.yaml | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/icp.yaml b/icp.yaml index ecc8fad..e20745a 100644 --- a/icp.yaml +++ b/icp.yaml @@ -4,71 +4,71 @@ canisters: # Motoko canisters - name: test_canister recipe: - type: "@dfinity/motoko@v4.0.0" + type: '@dfinity/motoko@v4.0.0' configuration: main: packages/pic/tests/test-canister/main.mo candid: packages/pic/tests/test-canister/test_canister.did - args: "" + args: '' compress: true - name: counter recipe: - type: "@dfinity/motoko@v4.0.0" + type: '@dfinity/motoko@v4.0.0' configuration: main: examples/counter/src/main.mo candid: examples/counter/counter.did - args: "" + args: '' compress: true - name: clock recipe: - type: "@dfinity/motoko@v4.0.0" + type: '@dfinity/motoko@v4.0.0' configuration: main: examples/clock/src/main.mo candid: examples/clock/clock.did - args: "" + args: '' compress: true - name: google_search recipe: - type: "@dfinity/motoko@v4.0.0" + type: '@dfinity/motoko@v4.0.0' configuration: main: examples/google_search/src/main.mo candid: examples/google_search/google_search.did - args: "" + args: '' compress: true - name: phonebook recipe: - type: "@dfinity/motoko@v4.0.0" + type: '@dfinity/motoko@v4.0.0' configuration: main: examples/multicanister/src/phonebook.mo candid: examples/multicanister/phonebook.did - args: "" + args: '' compress: true - name: superheroes recipe: - type: "@dfinity/motoko@v4.0.0" + type: '@dfinity/motoko@v4.0.0' configuration: main: examples/multicanister/src/superheroes.mo candid: examples/multicanister/superheroes.did - args: "" + args: '' compress: true - name: multicanister recipe: - type: "@dfinity/motoko@v4.0.0" + type: '@dfinity/motoko@v4.0.0' configuration: main: examples/multicanister/src/main.mo candid: examples/multicanister/multicanister.did - args: "" + args: '' compress: true # Rust canisters - name: todo recipe: - type: "@dfinity/rust@v3.0.0" + type: '@dfinity/rust@v3.0.0' configuration: package: todo candid: examples/todo/todo.did @@ -76,7 +76,7 @@ canisters: - name: icp_features recipe: - type: "@dfinity/rust@v3.0.0" + type: '@dfinity/rust@v3.0.0' configuration: package: icp_features candid: examples/icp_features/icp_features.did @@ -84,7 +84,7 @@ canisters: - name: nns_proxy recipe: - type: "@dfinity/rust@v3.0.0" + type: '@dfinity/rust@v3.0.0' configuration: package: nns_proxy candid: examples/nns_proxy/nns_proxy.did From 06380df803a76b5a53f4b0805fbb29eee05c43f3 Mon Sep 17 00:00:00 2001 From: Marco Walz Date: Tue, 17 Feb 2026 10:35:25 +0100 Subject: [PATCH 03/11] fix: attempt to avoid potential rate limit for downloading moc --- .github/workflows/e2e-test-nodejs.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/e2e-test-nodejs.yml b/.github/workflows/e2e-test-nodejs.yml index 9beb792..ca2a759 100644 --- a/.github/workflows/e2e-test-nodejs.yml +++ b/.github/workflows/e2e-test-nodejs.yml @@ -36,6 +36,8 @@ jobs: - name: Install Motoko toolchain run: mops toolchain init + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Add wasm32 Rust target run: rustup target add wasm32-unknown-unknown @@ -73,6 +75,8 @@ jobs: - name: Install Motoko toolchain run: mops toolchain init + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Add wasm32 Rust target run: rustup target add wasm32-unknown-unknown From f5755b75195cb9461aa9f8f4a624d41af0c79bde Mon Sep 17 00:00:00 2001 From: Marco Walz Date: Tue, 17 Feb 2026 10:38:30 +0100 Subject: [PATCH 04/11] fix: bun.lock file --- bun.lock | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/bun.lock b/bun.lock index 5994225..41ac7ed 100644 --- a/bun.lock +++ b/bun.lock @@ -5,6 +5,7 @@ "": { "name": "pic-js", "devDependencies": { + "@icp-sdk/bindgen": "^0.2.1", "@icp-sdk/core": "^5.0.0", "@swc/core": "^1.15.3", "@swc/jest": "^0.2.39", @@ -47,12 +48,6 @@ "@dfinity/pic": "workspace:*", }, }, - "examples/http/tests": { - "name": "http-tests", - "devDependencies": { - "@dfinity/pic": "workspace:*", - }, - }, "examples/icp_features/tests": { "name": "icp-features-tests", "devDependencies": { @@ -237,6 +232,8 @@ "@gerrit0/mini-shiki": ["@gerrit0/mini-shiki@3.19.0", "", { "dependencies": { "@shikijs/engine-oniguruma": "^3.19.0", "@shikijs/langs": "^3.19.0", "@shikijs/themes": "^3.19.0", "@shikijs/types": "^3.19.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-ZSlWfLvr8Nl0T4iA3FF/8VH8HivYF82xQts2DY0tJxZd4wtXJ8AA0nmdW9lmO4hlrh3f9xNwEPtOgqETPqKwDA=="], + "@icp-sdk/bindgen": ["@icp-sdk/bindgen@0.2.1", "", { "dependencies": { "commander": "^14.0.2" }, "bin": { "icp-bindgen": "dist/esm/cli/icp-bindgen.js" } }, "sha512-/YXJcYdqb4Qi+c33NVU8BgY4O/ZVqOQy+eYH4fSu5asT5/eAQl5NNgsjMTkhbGknRbxm8N9/ZopzAf2GX0n5lg=="], + "@icp-sdk/core": ["@icp-sdk/core@5.0.0", "", { "dependencies": { "@dfinity/cbor": "^0.2.2", "@noble/curves": "^1.9.2", "@noble/hashes": "^1.8.0", "@scure/bip32": "^1.7.0", "@scure/bip39": "^1.6.0", "asn1js": "^3.0.5" } }, "sha512-t6iRbdylHG57MicWRpR1uMTFXRW7GCzec6KAg55CBwDHbHLQDKikQ252lmlcEa80DrKa3LPvMKYZEUYjEq5XUQ=="], "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], @@ -737,8 +734,6 @@ "html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="], - "http-tests": ["http-tests@workspace:examples/http/tests"], - "human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="], "icp-features-tests": ["icp-features-tests@workspace:examples/icp_features/tests"], From 3b3b222e1268f60dc4fc819621c4c4b9b4ced45e Mon Sep 17 00:00:00 2001 From: Marco Walz Date: Tue, 17 Feb 2026 12:18:31 +0100 Subject: [PATCH 05/11] fix: use Rust recipe which should work with gzip --- icp.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/icp.yaml b/icp.yaml index e20745a..5e28a23 100644 --- a/icp.yaml +++ b/icp.yaml @@ -68,7 +68,7 @@ canisters: # Rust canisters - name: todo recipe: - type: '@dfinity/rust@v3.0.0' + type: 'https://raw.githubusercontent.com/dfinity/icp-cli-recipes/e0830170ad900528e6b47ca2a881121187c2244b/recipes/rust/recipe.hbs' configuration: package: todo candid: examples/todo/todo.did @@ -76,7 +76,7 @@ canisters: - name: icp_features recipe: - type: '@dfinity/rust@v3.0.0' + type: 'https://raw.githubusercontent.com/dfinity/icp-cli-recipes/e0830170ad900528e6b47ca2a881121187c2244b/recipes/rust/recipe.hbs' configuration: package: icp_features candid: examples/icp_features/icp_features.did @@ -84,7 +84,7 @@ canisters: - name: nns_proxy recipe: - type: '@dfinity/rust@v3.0.0' + type: 'https://raw.githubusercontent.com/dfinity/icp-cli-recipes/e0830170ad900528e6b47ca2a881121187c2244b/recipes/rust/recipe.hbs' configuration: package: nns_proxy candid: examples/nns_proxy/nns_proxy.did From c4cae6dbf8b76b368be7b74974af8ba3388fa78e Mon Sep 17 00:00:00 2001 From: Marco Walz Date: Tue, 17 Feb 2026 12:19:13 +0100 Subject: [PATCH 06/11] fix: attempt to fix moc errors by using mops install --- .github/workflows/e2e-test-nodejs.yml | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/.github/workflows/e2e-test-nodejs.yml b/.github/workflows/e2e-test-nodejs.yml index ca2a759..98718a7 100644 --- a/.github/workflows/e2e-test-nodejs.yml +++ b/.github/workflows/e2e-test-nodejs.yml @@ -34,10 +34,8 @@ jobs: - name: Install ICP CLI tools run: pnpm add -g @icp-sdk/icp-cli @icp-sdk/ic-wasm ic-mops - - name: Install Motoko toolchain - run: mops toolchain init - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Install Motoko toolchain and packages + run: mops install - name: Add wasm32 Rust target run: rustup target add wasm32-unknown-unknown @@ -73,10 +71,8 @@ jobs: - name: Install ICP CLI tools run: bun add -g @icp-sdk/icp-cli @icp-sdk/ic-wasm ic-mops - - name: Install Motoko toolchain - run: mops toolchain init - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Install Motoko toolchain and packages + run: mops install - name: Add wasm32 Rust target run: rustup target add wasm32-unknown-unknown From 645eefa840aef3491d0773e46ceec9a91971b738 Mon Sep 17 00:00:00 2001 From: Marco Walz Date: Tue, 17 Feb 2026 12:41:26 +0100 Subject: [PATCH 07/11] chore(ci): add Mops and Cargo caching, group Motoko setup --- .github/workflows/e2e-test-nodejs.yml | 50 +++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/.github/workflows/e2e-test-nodejs.yml b/.github/workflows/e2e-test-nodejs.yml index 98718a7..1ab091b 100644 --- a/.github/workflows/e2e-test-nodejs.yml +++ b/.github/workflows/e2e-test-nodejs.yml @@ -32,10 +32,29 @@ jobs: uses: dfinity/ci-tools/actions/setup-pnpm@main - name: Install ICP CLI tools - run: pnpm add -g @icp-sdk/icp-cli @icp-sdk/ic-wasm ic-mops + run: pnpm add -g @icp-sdk/icp-cli @icp-sdk/ic-wasm - - name: Install Motoko toolchain and packages - run: mops install + - name: Cache Mops + uses: actions/cache@v4 + with: + path: | + ~/.cache/mops + ~/Library/Caches/mops + .mops + key: mops-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('mops.toml') }} + + - name: Setup Motoko toolchain + run: | + pnpm add -g ic-mops + mops install + + - name: Cache Cargo + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry + target + key: cargo-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('**/Cargo.lock') }} - name: Add wasm32 Rust target run: rustup target add wasm32-unknown-unknown @@ -69,10 +88,29 @@ jobs: run: bun i --frozen-lockfile - name: Install ICP CLI tools - run: bun add -g @icp-sdk/icp-cli @icp-sdk/ic-wasm ic-mops + run: bun add -g @icp-sdk/icp-cli @icp-sdk/ic-wasm - - name: Install Motoko toolchain and packages - run: mops install + - name: Cache Mops + uses: actions/cache@v4 + with: + path: | + ~/.cache/mops + ~/Library/Caches/mops + .mops + key: mops-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('mops.toml') }} + + - name: Setup Motoko toolchain + run: | + bun add -g ic-mops + mops install + + - name: Cache Cargo + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry + target + key: cargo-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('**/Cargo.lock') }} - name: Add wasm32 Rust target run: rustup target add wasm32-unknown-unknown From efc4904c8a29575436555e3c292f1b2af8a30b9b Mon Sep 17 00:00:00 2001 From: Marco Walz Date: Tue, 3 Mar 2026 09:43:40 +0100 Subject: [PATCH 08/11] chore: update recipes to Motoko v4.1.0 and Rust v3.2.0, add .dfx to gitignore --- .gitignore | 1 + bun.lock | 8 +++++++ examples/todo/tests/src/live-todo.spec.ts | 7 +++--- icp.yaml | 29 +++++++++-------------- 4 files changed, 23 insertions(+), 22 deletions(-) diff --git a/.gitignore b/.gitignore index 752995a..7c3d8e7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +/.dfx/ /.icp/cache/ /.mops/ /node_modules/ diff --git a/bun.lock b/bun.lock index 41ac7ed..cc17b1d 100644 --- a/bun.lock +++ b/bun.lock @@ -48,6 +48,12 @@ "@dfinity/pic": "workspace:*", }, }, + "examples/http/tests": { + "name": "http-tests", + "devDependencies": { + "@dfinity/pic": "workspace:*", + }, + }, "examples/icp_features/tests": { "name": "icp-features-tests", "devDependencies": { @@ -734,6 +740,8 @@ "html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="], + "http-tests": ["http-tests@workspace:examples/http/tests"], + "human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="], "icp-features-tests": ["icp-features-tests@workspace:examples/icp_features/tests"], diff --git a/examples/todo/tests/src/live-todo.spec.ts b/examples/todo/tests/src/live-todo.spec.ts index 899d2d5..1c730f6 100644 --- a/examples/todo/tests/src/live-todo.spec.ts +++ b/examples/todo/tests/src/live-todo.spec.ts @@ -9,11 +9,10 @@ const WASM_PATH = resolve( '..', '..', '..', - '.dfx', - 'local', - 'canisters', + '.icp', + 'cache', + 'artifacts', 'todo', - 'todo.wasm.gz', ); describe('Live Todo', () => { diff --git a/icp.yaml b/icp.yaml index 5e28a23..b2c9a9b 100644 --- a/icp.yaml +++ b/icp.yaml @@ -4,71 +4,64 @@ canisters: # Motoko canisters - name: test_canister recipe: - type: '@dfinity/motoko@v4.0.0' + type: '@dfinity/motoko@v4.1.0' configuration: main: packages/pic/tests/test-canister/main.mo candid: packages/pic/tests/test-canister/test_canister.did - args: '' compress: true - name: counter recipe: - type: '@dfinity/motoko@v4.0.0' + type: '@dfinity/motoko@v4.1.0' configuration: main: examples/counter/src/main.mo candid: examples/counter/counter.did - args: '' compress: true - name: clock recipe: - type: '@dfinity/motoko@v4.0.0' + type: '@dfinity/motoko@v4.1.0' configuration: main: examples/clock/src/main.mo candid: examples/clock/clock.did - args: '' compress: true - name: google_search recipe: - type: '@dfinity/motoko@v4.0.0' + type: '@dfinity/motoko@v4.1.0' configuration: main: examples/google_search/src/main.mo candid: examples/google_search/google_search.did - args: '' compress: true - name: phonebook recipe: - type: '@dfinity/motoko@v4.0.0' + type: '@dfinity/motoko@v4.1.0' configuration: main: examples/multicanister/src/phonebook.mo candid: examples/multicanister/phonebook.did - args: '' compress: true - name: superheroes recipe: - type: '@dfinity/motoko@v4.0.0' + type: '@dfinity/motoko@v4.1.0' configuration: main: examples/multicanister/src/superheroes.mo candid: examples/multicanister/superheroes.did - args: '' compress: true - name: multicanister recipe: - type: '@dfinity/motoko@v4.0.0' + type: '@dfinity/motoko@v4.1.0' configuration: main: examples/multicanister/src/main.mo candid: examples/multicanister/multicanister.did - args: '' compress: true # Rust canisters - name: todo recipe: - type: 'https://raw.githubusercontent.com/dfinity/icp-cli-recipes/e0830170ad900528e6b47ca2a881121187c2244b/recipes/rust/recipe.hbs' + type: '@dfinity/rust@v3.2.0' configuration: package: todo candid: examples/todo/todo.did @@ -76,7 +69,7 @@ canisters: - name: icp_features recipe: - type: 'https://raw.githubusercontent.com/dfinity/icp-cli-recipes/e0830170ad900528e6b47ca2a881121187c2244b/recipes/rust/recipe.hbs' + type: '@dfinity/rust@v3.2.0' configuration: package: icp_features candid: examples/icp_features/icp_features.did @@ -84,7 +77,7 @@ canisters: - name: nns_proxy recipe: - type: 'https://raw.githubusercontent.com/dfinity/icp-cli-recipes/e0830170ad900528e6b47ca2a881121187c2244b/recipes/rust/recipe.hbs' + type: '@dfinity/rust@v3.2.0' configuration: package: nns_proxy candid: examples/nns_proxy/nns_proxy.did @@ -92,7 +85,7 @@ canisters: - name: http recipe: - type: "@dfinity/rust@v3.0.0" + type: '@dfinity/rust@v3.2.0' configuration: package: http-canister candid: examples/http/http.did From fbbe8bd2ea747a128422c8d8fd9ddc570f14cfad Mon Sep 17 00:00:00 2001 From: Marco Walz Date: Wed, 4 Mar 2026 14:44:54 +0100 Subject: [PATCH 09/11] chore: consolidate scripts, decentralize canister configs, improve docs - Extract shared CI toolchain setup into composite action - Replace individual build/generate/test scripts with shell scripts (scripts/build-example.sh, scripts/test-example.sh) - Move canister configs into per-directory canister.yaml files, use glob patterns in icp.yaml - Restructure multicanister example (phonebook/superheroes into subdirectories) - Update all example READMEs with new commands, add missing icp_features entry, fix google_search title --- .../setup-canister-toolchain/action.yml | 41 +++++++++ .github/workflows/e2e-test-nodejs.yml | 58 ++---------- examples/README.md | 25 ++++- examples/clock/README.md | 8 +- examples/clock/canister.yaml | 7 ++ examples/counter/README.md | 8 +- examples/counter/canister.yaml | 7 ++ examples/google_search/README.md | 10 +- examples/google_search/canister.yaml | 7 ++ examples/http/README.md | 8 +- examples/http/canister.yaml | 7 ++ examples/icp_features/README.md | 12 +++ examples/icp_features/canister.yaml | 7 ++ examples/multicanister/README.md | 18 +++- examples/multicanister/canister.yaml | 7 ++ .../multicanister/phonebook/canister.yaml | 7 ++ .../{ => phonebook}/phonebook.did | 0 .../{src => phonebook}/phonebook.mo | 0 .../multicanister/superheroes/canister.yaml | 7 ++ .../{ => superheroes}/superheroes.did | 0 .../{src => superheroes}/superheroes.mo | 0 examples/nns_proxy/README.md | 12 +++ examples/nns_proxy/canister.yaml | 7 ++ examples/todo/README.md | 8 +- examples/todo/canister.yaml | 7 ++ icp.yaml | 92 +------------------ package.json | 29 +----- .../pic/tests/test-canister/canister.yaml | 7 ++ scripts/build-example.sh | 32 +++++++ scripts/test-example.sh | 38 ++++++++ 30 files changed, 281 insertions(+), 195 deletions(-) create mode 100644 .github/actions/setup-canister-toolchain/action.yml create mode 100644 examples/clock/canister.yaml create mode 100644 examples/counter/canister.yaml create mode 100644 examples/google_search/canister.yaml create mode 100644 examples/http/canister.yaml create mode 100644 examples/icp_features/canister.yaml create mode 100644 examples/multicanister/canister.yaml create mode 100644 examples/multicanister/phonebook/canister.yaml rename examples/multicanister/{ => phonebook}/phonebook.did (100%) rename examples/multicanister/{src => phonebook}/phonebook.mo (100%) create mode 100644 examples/multicanister/superheroes/canister.yaml rename examples/multicanister/{ => superheroes}/superheroes.did (100%) rename examples/multicanister/{src => superheroes}/superheroes.mo (100%) create mode 100644 examples/nns_proxy/canister.yaml create mode 100644 examples/todo/canister.yaml create mode 100644 packages/pic/tests/test-canister/canister.yaml create mode 100755 scripts/build-example.sh create mode 100755 scripts/test-example.sh diff --git a/.github/actions/setup-canister-toolchain/action.yml b/.github/actions/setup-canister-toolchain/action.yml new file mode 100644 index 0000000..7c2d1b4 --- /dev/null +++ b/.github/actions/setup-canister-toolchain/action.yml @@ -0,0 +1,41 @@ +name: Setup Canister Toolchain +description: Install ICP CLI, Motoko toolchain, Rust wasm32 target, and configure caching + +inputs: + package-manager: + description: 'Package manager to use (pnpm or bun)' + required: true + +runs: + using: composite + steps: + - name: Install ICP CLI tools + shell: bash + run: ${{ inputs.package-manager }} add -g @icp-sdk/icp-cli @icp-sdk/ic-wasm + + - name: Cache Mops + uses: actions/cache@v4 + with: + path: | + ~/.cache/mops + ~/Library/Caches/mops + .mops + key: mops-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('mops.toml') }} + + - name: Setup Motoko toolchain + shell: bash + run: | + ${{ inputs.package-manager }} add -g ic-mops + mops install + + - name: Cache Cargo + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry + target + key: cargo-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('**/Cargo.lock') }} + + - name: Add wasm32 Rust target + shell: bash + run: rustup target add wasm32-unknown-unknown diff --git a/.github/workflows/e2e-test-nodejs.yml b/.github/workflows/e2e-test-nodejs.yml index 1ab091b..125d1c1 100644 --- a/.github/workflows/e2e-test-nodejs.yml +++ b/.github/workflows/e2e-test-nodejs.yml @@ -31,33 +31,10 @@ jobs: - name: Setup PNPM uses: dfinity/ci-tools/actions/setup-pnpm@main - - name: Install ICP CLI tools - run: pnpm add -g @icp-sdk/icp-cli @icp-sdk/ic-wasm - - - name: Cache Mops - uses: actions/cache@v4 - with: - path: | - ~/.cache/mops - ~/Library/Caches/mops - .mops - key: mops-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('mops.toml') }} - - - name: Setup Motoko toolchain - run: | - pnpm add -g ic-mops - mops install - - - name: Cache Cargo - uses: actions/cache@v4 + - name: Setup Canister Toolchain + uses: ./.github/actions/setup-canister-toolchain with: - path: | - ~/.cargo/registry - target - key: cargo-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('**/Cargo.lock') }} - - - name: Add wasm32 Rust target - run: rustup target add wasm32-unknown-unknown + package-manager: pnpm - name: Build run: pnpm run build @@ -87,33 +64,10 @@ jobs: shell: bash run: bun i --frozen-lockfile - - name: Install ICP CLI tools - run: bun add -g @icp-sdk/icp-cli @icp-sdk/ic-wasm - - - name: Cache Mops - uses: actions/cache@v4 - with: - path: | - ~/.cache/mops - ~/Library/Caches/mops - .mops - key: mops-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('mops.toml') }} - - - name: Setup Motoko toolchain - run: | - bun add -g ic-mops - mops install - - - name: Cache Cargo - uses: actions/cache@v4 + - name: Setup Canister Toolchain + uses: ./.github/actions/setup-canister-toolchain with: - path: | - ~/.cargo/registry - target - key: cargo-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('**/Cargo.lock') }} - - - name: Add wasm32 Rust target - run: rustup target add wasm32-unknown-unknown + package-manager: bun - name: Build run: bun run build diff --git a/examples/README.md b/examples/README.md index 90fdd4b..5a1215c 100644 --- a/examples/README.md +++ b/examples/README.md @@ -1,6 +1,6 @@ # Examples -All examples are written in [TypeScript](https://www.typescriptlang.org/) with [Jest](https://jestjs.io/) as the test runner, +All examples are written in [TypeScript](https://www.typescriptlang.org/) with [Jest](https://jestjs.io/) or [Vitest](https://vitest.dev/) as the test runner, but `@dfinity/pic` can be used with JavaScript and any other testing runner, such as [NodeJS](https://nodejs.org/dist/latest-v20.x/docs/api/test.html), [bun](https://bun.sh/docs/cli/test) or [Mocha](https://mochajs.org/). ## Setup @@ -13,6 +13,27 @@ but `@dfinity/pic` can be used with JavaScript and any other testing runner, suc bun i ``` +- Build all examples: + + ```bash + bun build:examples + ``` + +- Test all examples: + + ```bash + bun test:examples + ``` + +- Build or test a single example: + + ```bash + bun build:examples -- counter + bun test:examples -- counter + ``` + +## Examples + - [Counter](./counter/README.md) This example demonstrates how to work with a simple canister as well as init arguments, canister upgrades and WASM reinstallation. - [Clock](./clock/README.md) @@ -21,6 +42,8 @@ but `@dfinity/pic` can be used with JavaScript and any other testing runner, suc This example demonstrates how to work with more complex canisters, identities, canister upgrades, and stable memory management. It also shows how to use "live" mode with agent-js (in contrast to the pic-js actor). - [Multicanister](./multicanister/README.md) This example demonstrates how to work with multiple canisters and multiple subnets. +- [ICP Features](./icp_features/README.md) + This example demonstrates how to enable ICP features when creating a PocketIC instance. - [NNS Proxy](./nns_proxy/README.md) This example demonstrates how to work with an NNS state directory. - [Google Search](./google_search/README.md) diff --git a/examples/clock/README.md b/examples/clock/README.md index 8165d74..d3f5382 100644 --- a/examples/clock/README.md +++ b/examples/clock/README.md @@ -2,14 +2,14 @@ This example demonstrates how to work with the replica's system time, canister timers as well as checking for canister existence and cycle management. -Build the counter canister: +Build the canister: ```shell -bun build:clock +bun build:examples -- clock ``` -Run the counter tests: +Run the tests: ```shell -bun test:clock +bun test:examples -- clock ``` diff --git a/examples/clock/canister.yaml b/examples/clock/canister.yaml new file mode 100644 index 0000000..0fd245d --- /dev/null +++ b/examples/clock/canister.yaml @@ -0,0 +1,7 @@ +name: clock +recipe: + type: '@dfinity/motoko@v4.1.0' + configuration: + main: src/main.mo + candid: clock.did + compress: true diff --git a/examples/counter/README.md b/examples/counter/README.md index a669c7d..e02bb10 100644 --- a/examples/counter/README.md +++ b/examples/counter/README.md @@ -2,14 +2,14 @@ This example demonstrates how to work with a simple canister as well as init arguments, canister upgrades and WASM reinstallation. -Build the counter canister: +Build the canister: ```shell -bun build:counter +bun build:examples -- counter ``` -Run the counter tests: +Run the tests: ```shell -bun test:counter +bun test:examples -- counter ``` diff --git a/examples/counter/canister.yaml b/examples/counter/canister.yaml new file mode 100644 index 0000000..71ba8c9 --- /dev/null +++ b/examples/counter/canister.yaml @@ -0,0 +1,7 @@ +name: counter +recipe: + type: '@dfinity/motoko@v4.1.0' + configuration: + main: src/main.mo + candid: counter.did + compress: true diff --git a/examples/google_search/README.md b/examples/google_search/README.md index c1c264e..292dce1 100644 --- a/examples/google_search/README.md +++ b/examples/google_search/README.md @@ -1,15 +1,15 @@ -# Multi canister +# Google Search -This example demonstrates how to test HTTPS Outcalls in canisters. +This example demonstrates how to mock HTTPS Outcalls in canisters. -Build the canisters: +Build the canister: ```shell -bun build:google_search +bun build:examples -- google_search ``` Run the tests: ```shell -bun test:google_search +bun test:examples -- google_search ``` diff --git a/examples/google_search/canister.yaml b/examples/google_search/canister.yaml new file mode 100644 index 0000000..f47f9d1 --- /dev/null +++ b/examples/google_search/canister.yaml @@ -0,0 +1,7 @@ +name: google_search +recipe: + type: '@dfinity/motoko@v4.1.0' + configuration: + main: src/main.mo + candid: google_search.did + compress: true diff --git a/examples/http/README.md b/examples/http/README.md index be2a298..3d16158 100644 --- a/examples/http/README.md +++ b/examples/http/README.md @@ -2,14 +2,14 @@ This example demonstrates how to use "live" mode with an HTTP canister. -Build the HTTP canister: +Build the canister: ```shell -bun build:http +bun build:examples -- http ``` -Run the HTTP tests: +Run the tests: ```shell -bun test:http +bun test:examples -- http ``` diff --git a/examples/http/canister.yaml b/examples/http/canister.yaml new file mode 100644 index 0000000..d7c07c4 --- /dev/null +++ b/examples/http/canister.yaml @@ -0,0 +1,7 @@ +name: http +recipe: + type: '@dfinity/rust@v3.2.0' + configuration: + package: http-canister + candid: http.did + compress: true diff --git a/examples/icp_features/README.md b/examples/icp_features/README.md index b45626d..72358b8 100644 --- a/examples/icp_features/README.md +++ b/examples/icp_features/README.md @@ -1,3 +1,15 @@ # ICP Features This example demonstrates how to enable ICP features when creating a PocketIC instance. + +Build the canister: + +```shell +bun build:examples -- icp_features +``` + +Run the tests: + +```shell +bun test:examples -- icp_features +``` diff --git a/examples/icp_features/canister.yaml b/examples/icp_features/canister.yaml new file mode 100644 index 0000000..5451229 --- /dev/null +++ b/examples/icp_features/canister.yaml @@ -0,0 +1,7 @@ +name: icp_features +recipe: + type: '@dfinity/rust@v3.2.0' + configuration: + package: icp_features + candid: icp_features.did + compress: true diff --git a/examples/multicanister/README.md b/examples/multicanister/README.md index c9a5bf4..17efb06 100644 --- a/examples/multicanister/README.md +++ b/examples/multicanister/README.md @@ -1,15 +1,23 @@ -# Multi canister +# Multicanister -This example demonstrates how to work with multiple canisters. It shows how to create and deploy three canisters, two on the same subnet and a third on a different subnet, using init args to inform the main canister of the other canisters' IDs. +This example demonstrates inter-canister calls across multiple subnets. It deploys three canisters across two application subnets: -Build the canisters: +| Canister | Subnet | Description | +| --- | --- | --- | +| **phonebook** | A | A simple contact storage canister | +| **multicanister** | A | Calls phonebook and superheroes via inter-canister calls | +| **superheroes** | B | A superhero registry canister | + +The multicanister canister receives the other canisters' IDs as init args, demonstrating cross-subnet inter-canister communication. + +Build all three canisters: ```shell -bun build:multicanister +bun build:examples -- phonebook superheroes multicanister ``` Run the tests: ```shell -bun test:multicanister +bun test:examples -- multicanister ``` diff --git a/examples/multicanister/canister.yaml b/examples/multicanister/canister.yaml new file mode 100644 index 0000000..11bdc59 --- /dev/null +++ b/examples/multicanister/canister.yaml @@ -0,0 +1,7 @@ +name: multicanister +recipe: + type: '@dfinity/motoko@v4.1.0' + configuration: + main: src/main.mo + candid: multicanister.did + compress: true diff --git a/examples/multicanister/phonebook/canister.yaml b/examples/multicanister/phonebook/canister.yaml new file mode 100644 index 0000000..1fc0da9 --- /dev/null +++ b/examples/multicanister/phonebook/canister.yaml @@ -0,0 +1,7 @@ +name: phonebook +recipe: + type: '@dfinity/motoko@v4.1.0' + configuration: + main: phonebook.mo + candid: phonebook.did + compress: true diff --git a/examples/multicanister/phonebook.did b/examples/multicanister/phonebook/phonebook.did similarity index 100% rename from examples/multicanister/phonebook.did rename to examples/multicanister/phonebook/phonebook.did diff --git a/examples/multicanister/src/phonebook.mo b/examples/multicanister/phonebook/phonebook.mo similarity index 100% rename from examples/multicanister/src/phonebook.mo rename to examples/multicanister/phonebook/phonebook.mo diff --git a/examples/multicanister/superheroes/canister.yaml b/examples/multicanister/superheroes/canister.yaml new file mode 100644 index 0000000..f239707 --- /dev/null +++ b/examples/multicanister/superheroes/canister.yaml @@ -0,0 +1,7 @@ +name: superheroes +recipe: + type: '@dfinity/motoko@v4.1.0' + configuration: + main: superheroes.mo + candid: superheroes.did + compress: true diff --git a/examples/multicanister/superheroes.did b/examples/multicanister/superheroes/superheroes.did similarity index 100% rename from examples/multicanister/superheroes.did rename to examples/multicanister/superheroes/superheroes.did diff --git a/examples/multicanister/src/superheroes.mo b/examples/multicanister/superheroes/superheroes.mo similarity index 100% rename from examples/multicanister/src/superheroes.mo rename to examples/multicanister/superheroes/superheroes.mo diff --git a/examples/nns_proxy/README.md b/examples/nns_proxy/README.md index 0e99f45..71dc5d3 100644 --- a/examples/nns_proxy/README.md +++ b/examples/nns_proxy/README.md @@ -1,5 +1,17 @@ # NNS Proxy +Build the canister: + +```shell +bun build:examples -- nns_proxy +``` + +Run the tests: + +```shell +bun test:examples -- nns_proxy +``` + ## NNS State Directory This example project leverages an NNS state directory to provide the initial state for the NNS subnet. To learn more about how this state directory was created, check out the guide on [working with the NNS](https://js.icp.build/pic-js/latest/guides/working-with-the-nns). diff --git a/examples/nns_proxy/canister.yaml b/examples/nns_proxy/canister.yaml new file mode 100644 index 0000000..ddedc37 --- /dev/null +++ b/examples/nns_proxy/canister.yaml @@ -0,0 +1,7 @@ +name: nns_proxy +recipe: + type: '@dfinity/rust@v3.2.0' + configuration: + package: nns_proxy + candid: nns_proxy.did + compress: true diff --git a/examples/todo/README.md b/examples/todo/README.md index dfacfb3..ba4c541 100644 --- a/examples/todo/README.md +++ b/examples/todo/README.md @@ -2,14 +2,14 @@ This example demonstrates how to work with more complex canisters, identities, canister upgrades, and stable memory management. It also shows how to use "live" mode with agent-js (in contrast to the pic-js actor). -Build the counter canister: +Build the canister: ```shell -bun build:todo +bun build:examples -- todo ``` -Run the counter tests: +Run the tests: ```shell -bun test:todo +bun test:examples -- todo ``` diff --git a/examples/todo/canister.yaml b/examples/todo/canister.yaml new file mode 100644 index 0000000..704d04b --- /dev/null +++ b/examples/todo/canister.yaml @@ -0,0 +1,7 @@ +name: todo +recipe: + type: '@dfinity/rust@v3.2.0' + configuration: + package: todo + candid: todo.did + compress: true diff --git a/icp.yaml b/icp.yaml index b2c9a9b..6b46f66 100644 --- a/icp.yaml +++ b/icp.yaml @@ -1,92 +1,6 @@ # yaml-language-server: $schema=https://github.com/dfinity/icp-cli/raw/refs/tags/v0.1.0/docs/schemas/icp-yaml-schema.json canisters: - # Motoko canisters - - name: test_canister - recipe: - type: '@dfinity/motoko@v4.1.0' - configuration: - main: packages/pic/tests/test-canister/main.mo - candid: packages/pic/tests/test-canister/test_canister.did - compress: true - - - name: counter - recipe: - type: '@dfinity/motoko@v4.1.0' - configuration: - main: examples/counter/src/main.mo - candid: examples/counter/counter.did - compress: true - - - name: clock - recipe: - type: '@dfinity/motoko@v4.1.0' - configuration: - main: examples/clock/src/main.mo - candid: examples/clock/clock.did - compress: true - - - name: google_search - recipe: - type: '@dfinity/motoko@v4.1.0' - configuration: - main: examples/google_search/src/main.mo - candid: examples/google_search/google_search.did - compress: true - - - name: phonebook - recipe: - type: '@dfinity/motoko@v4.1.0' - configuration: - main: examples/multicanister/src/phonebook.mo - candid: examples/multicanister/phonebook.did - compress: true - - - name: superheroes - recipe: - type: '@dfinity/motoko@v4.1.0' - configuration: - main: examples/multicanister/src/superheroes.mo - candid: examples/multicanister/superheroes.did - compress: true - - - name: multicanister - recipe: - type: '@dfinity/motoko@v4.1.0' - configuration: - main: examples/multicanister/src/main.mo - candid: examples/multicanister/multicanister.did - compress: true - - # Rust canisters - - name: todo - recipe: - type: '@dfinity/rust@v3.2.0' - configuration: - package: todo - candid: examples/todo/todo.did - compress: true - - - name: icp_features - recipe: - type: '@dfinity/rust@v3.2.0' - configuration: - package: icp_features - candid: examples/icp_features/icp_features.did - compress: true - - - name: nns_proxy - recipe: - type: '@dfinity/rust@v3.2.0' - configuration: - package: nns_proxy - candid: examples/nns_proxy/nns_proxy.did - compress: true - - - name: http - recipe: - type: '@dfinity/rust@v3.2.0' - configuration: - package: http-canister - candid: examples/http/http.did - compress: true + - packages/pic/tests/test-canister + - examples/* + - examples/multicanister/* diff --git a/package.json b/package.json index 872553f..7d5577a 100644 --- a/package.json +++ b/package.json @@ -29,33 +29,8 @@ "test:pic": "jest -c ./packages/pic/jest.config.ts", "build:test-canister": "icp build test_canister && cp .icp/cache/artifacts/test_canister packages/pic/tests/test-canister/test_canister.wasm.gz && pnpm run generate:test-canister", "generate:test-canister": "icp-bindgen --did-file packages/pic/tests/test-canister/test_canister.did --out-dir packages/pic/tests/test-canister --actor-disabled --force", - "build:examples": "icp build && pnpm run generate:bindings", - "generate:bindings": "run-p generate:clock generate:counter generate:google-search generate:http generate:icp-features generate:multicanister generate:nns-proxy generate:todo", - "generate:clock": "icp-bindgen --did-file examples/clock/clock.did --out-dir examples/clock --actor-disabled --force", - "generate:counter": "icp-bindgen --did-file examples/counter/counter.did --out-dir examples/counter --actor-disabled --force", - "generate:google-search": "icp-bindgen --did-file examples/google_search/google_search.did --out-dir examples/google_search --actor-disabled --force", - "generate:http": "icp-bindgen --did-file examples/http/http.did --out-dir examples/http --actor-disabled --force", - "generate:icp-features": "icp-bindgen --did-file examples/icp_features/icp_features.did --out-dir examples/icp_features --actor-disabled --force", - "generate:multicanister": "icp-bindgen --did-file examples/multicanister/multicanister.did --out-dir examples/multicanister --actor-disabled --force", - "generate:nns-proxy": "icp-bindgen --did-file examples/nns_proxy/nns_proxy.did --out-dir examples/nns_proxy --actor-disabled --force", - "generate:todo": "icp-bindgen --did-file examples/todo/todo.did --out-dir examples/todo --actor-disabled --force", - "test:examples": "run-p test:clock test:counter test:google-search test:icp-features test:multicanister test:nns-proxy test:todo test:http", - "build:clock": "icp build clock && pnpm run generate:clock", - "test:clock": "jest -c ./examples/clock/tests/jest.config.ts", - "build:counter": "icp build counter && pnpm run generate:counter", - "test:counter": "vitest run -c ./examples/counter/tests/vitest.config.ts", - "build:google-search": "icp build google_search && pnpm run generate:google-search", - "test:google-search": "jest -c ./examples/google_search/tests/jest.config.ts", - "build:icp-features": "icp build icp_features && pnpm run generate:icp-features", - "test:icp-features": "jest -c ./examples/icp_features/tests/jest.config.ts", - "build:multicanister": "icp build phonebook superheroes multicanister && pnpm run generate:multicanister", - "test:multicanister": "jest -c ./examples/multicanister/tests/jest.config.ts", - "build:nns-proxy": "icp build nns_proxy && pnpm run generate:nns-proxy", - "test:nns-proxy": "jest -c ./examples/nns_proxy/tests/jest.config.ts", - "build:todo": "icp build todo && pnpm run generate:todo", - "test:todo": "jest -c ./examples/todo/tests/jest.config.ts", - "build:http": "icp build http && pnpm run generate:http", - "test:http": "vitest run -c ./examples/http/tests/vitest.config.ts", + "build:examples": "./scripts/build-example.sh", + "test:examples": "./scripts/test-example.sh", "postinstall": "tar -xvf examples/nns_proxy/tests/state/nns_state.tar.xz -C examples/nns_proxy/tests/state" }, "devDependencies": { diff --git a/packages/pic/tests/test-canister/canister.yaml b/packages/pic/tests/test-canister/canister.yaml new file mode 100644 index 0000000..830fd17 --- /dev/null +++ b/packages/pic/tests/test-canister/canister.yaml @@ -0,0 +1,7 @@ +name: test_canister +recipe: + type: '@dfinity/motoko@v4.1.0' + configuration: + main: main.mo + candid: test_canister.did + compress: true diff --git a/scripts/build-example.sh b/scripts/build-example.sh new file mode 100755 index 0000000..11811cb --- /dev/null +++ b/scripts/build-example.sh @@ -0,0 +1,32 @@ +#!/bin/bash +# Build canisters and generate TypeScript bindings for examples. +# Usage: ./scripts/build-example.sh [name ...] +# If no names are provided, builds all canisters and generates all bindings. + +set -euo pipefail + +# Filter out "--" passed by pnpm when forwarding arguments +args=() +for arg in "$@"; do + [ "$arg" != "--" ] && args+=("$arg") +done + +ALL_EXAMPLES=(clock counter google_search http icp_features multicanister nns_proxy todo) + +if [ ${#args[@]} -eq 0 ]; then + icp build + examples=("${ALL_EXAMPLES[@]}") +else + icp build "${args[@]}" + examples=("${args[@]}") +fi + +for name in "${examples[@]}"; do + icp-bindgen \ + --did-file "examples/$name/$name.did" \ + --out-dir "examples/$name" \ + --actor-disabled \ + --force & +done + +wait diff --git a/scripts/test-example.sh b/scripts/test-example.sh new file mode 100755 index 0000000..328fb54 --- /dev/null +++ b/scripts/test-example.sh @@ -0,0 +1,38 @@ +#!/bin/bash +# Run tests for examples. +# Usage: ./scripts/test-example.sh [name ...] +# If no names are provided, runs tests for all examples. + +set -euo pipefail + +# Filter out "--" passed by pnpm when forwarding arguments +args=() +for arg in "$@"; do + [ "$arg" != "--" ] && args+=("$arg") +done + +ALL_EXAMPLES=(clock counter google_search http icp_features multicanister nns_proxy todo) + +if [ ${#args[@]} -eq 0 ]; then + examples=("${ALL_EXAMPLES[@]}") +else + examples=("${args[@]}") +fi + +pids=() +for name in "${examples[@]}"; do + dir="examples/$name/tests" + if [ -f "$dir/vitest.config.ts" ]; then + vitest run -c "./$dir/vitest.config.ts" & + elif [ -f "$dir/jest.config.ts" ]; then + jest -c "./$dir/jest.config.ts" & + else + echo "No test config found for $name" >&2 + exit 1 + fi + pids+=($!) +done + +for pid in "${pids[@]}"; do + wait "$pid" || exit 1 +done From 207ef72d494b465b1cc08b28d3d46616cd8d6998 Mon Sep 17 00:00:00 2001 From: Marco Walz Date: Wed, 4 Mar 2026 14:47:42 +0100 Subject: [PATCH 10/11] style: fix prettier formatting in multicanister README --- examples/multicanister/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/multicanister/README.md b/examples/multicanister/README.md index 17efb06..b922b7d 100644 --- a/examples/multicanister/README.md +++ b/examples/multicanister/README.md @@ -2,11 +2,11 @@ This example demonstrates inter-canister calls across multiple subnets. It deploys three canisters across two application subnets: -| Canister | Subnet | Description | -| --- | --- | --- | -| **phonebook** | A | A simple contact storage canister | -| **multicanister** | A | Calls phonebook and superheroes via inter-canister calls | -| **superheroes** | B | A superhero registry canister | +| Canister | Subnet | Description | +| ----------------- | ------ | -------------------------------------------------------- | +| **phonebook** | A | A simple contact storage canister | +| **multicanister** | A | Calls phonebook and superheroes via inter-canister calls | +| **superheroes** | B | A superhero registry canister | The multicanister canister receives the other canisters' IDs as init args, demonstrating cross-subnet inter-canister communication. From c6ab0fb6fa2b549094109b26b5c7db2f47fc61e9 Mon Sep 17 00:00:00 2001 From: Marco Walz Date: Wed, 4 Mar 2026 15:06:54 +0100 Subject: [PATCH 11/11] chore: rename scripts to plural, run tests sequentially MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rename build-example.sh → build-examples.sh and test-example.sh → test-examples.sh. Run example tests sequentially instead of in parallel to avoid resource contention on macOS CI runners. --- package.json | 4 ++-- scripts/{build-example.sh => build-examples.sh} | 2 +- scripts/{test-example.sh => test-examples.sh} | 12 +++--------- 3 files changed, 6 insertions(+), 12 deletions(-) rename scripts/{build-example.sh => build-examples.sh} (93%) rename scripts/{test-example.sh => test-examples.sh} (75%) diff --git a/package.json b/package.json index 7d5577a..a6ce038 100644 --- a/package.json +++ b/package.json @@ -29,8 +29,8 @@ "test:pic": "jest -c ./packages/pic/jest.config.ts", "build:test-canister": "icp build test_canister && cp .icp/cache/artifacts/test_canister packages/pic/tests/test-canister/test_canister.wasm.gz && pnpm run generate:test-canister", "generate:test-canister": "icp-bindgen --did-file packages/pic/tests/test-canister/test_canister.did --out-dir packages/pic/tests/test-canister --actor-disabled --force", - "build:examples": "./scripts/build-example.sh", - "test:examples": "./scripts/test-example.sh", + "build:examples": "./scripts/build-examples.sh", + "test:examples": "./scripts/test-examples.sh", "postinstall": "tar -xvf examples/nns_proxy/tests/state/nns_state.tar.xz -C examples/nns_proxy/tests/state" }, "devDependencies": { diff --git a/scripts/build-example.sh b/scripts/build-examples.sh similarity index 93% rename from scripts/build-example.sh rename to scripts/build-examples.sh index 11811cb..56ed642 100755 --- a/scripts/build-example.sh +++ b/scripts/build-examples.sh @@ -1,6 +1,6 @@ #!/bin/bash # Build canisters and generate TypeScript bindings for examples. -# Usage: ./scripts/build-example.sh [name ...] +# Usage: ./scripts/build-examples.sh [name ...] # If no names are provided, builds all canisters and generates all bindings. set -euo pipefail diff --git a/scripts/test-example.sh b/scripts/test-examples.sh similarity index 75% rename from scripts/test-example.sh rename to scripts/test-examples.sh index 328fb54..b539ff8 100755 --- a/scripts/test-example.sh +++ b/scripts/test-examples.sh @@ -1,6 +1,6 @@ #!/bin/bash # Run tests for examples. -# Usage: ./scripts/test-example.sh [name ...] +# Usage: ./scripts/test-examples.sh [name ...] # If no names are provided, runs tests for all examples. set -euo pipefail @@ -19,20 +19,14 @@ else examples=("${args[@]}") fi -pids=() for name in "${examples[@]}"; do dir="examples/$name/tests" if [ -f "$dir/vitest.config.ts" ]; then - vitest run -c "./$dir/vitest.config.ts" & + vitest run -c "./$dir/vitest.config.ts" elif [ -f "$dir/jest.config.ts" ]; then - jest -c "./$dir/jest.config.ts" & + jest -c "./$dir/jest.config.ts" else echo "No test config found for $name" >&2 exit 1 fi - pids+=($!) -done - -for pid in "${pids[@]}"; do - wait "$pid" || exit 1 done