diff --git a/.github/workflows/acvm-test-acvm-js.yml b/.github/workflows/acvm-test-acvm-js.yml index d5a9dc07239..8a469f6ff1e 100644 --- a/.github/workflows/acvm-test-acvm-js.yml +++ b/.github/workflows/acvm-test-acvm-js.yml @@ -51,7 +51,12 @@ jobs: uses: actions/download-artifact@v3 with: name: acvm-js - path: ./acvm-repo/result + path: ./result + + - name: Move build artifacts + run: | + mv ./result/acvm_js/nodejs ./acvm-repo/acvm_js/nodejs + mv ./result/acvm_js/web ./acvm-repo/acvm_js/web - name: Set up test environment uses: ./.github/actions/setup @@ -72,7 +77,12 @@ jobs: uses: actions/download-artifact@v3 with: name: acvm-js - path: ./acvm-repo/result + path: ./result + + - name: Move build artifacts + run: | + mv ./result/acvm_js/nodejs ./acvm-repo/acvm_js/nodejs + mv ./result/acvm_js/web ./acvm-repo/acvm_js/web - name: Set up test environment uses: ./.github/actions/setup diff --git a/.github/workflows/test-noir-js.yml b/.github/workflows/test-noir-js.yml new file mode 100644 index 00000000000..3a4868f4b1c --- /dev/null +++ b/.github/workflows/test-noir-js.yml @@ -0,0 +1,59 @@ +name: Noir JS + +on: + pull_request: + merge_group: + push: + branches: + - master + +jobs: + test: + runs-on: ubuntu-latest + timeout-minutes: 30 + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install Yarn dependencies + uses: ./.github/actions/setup + + - name: Setup toolchain + uses: dtolnay/rust-toolchain@1.66.0 + with: + targets: wasm32-unknown-unknown + + - uses: Swatinem/rust-cache@v2 + with: + key: wasm32-unknown-unknown-noir-js + cache-on-failure: true + save-if: ${{ github.event_name != 'merge_group' }} + + - name: Install jq + run: sudo apt-get install jq + + - name: Install wasm-bindgen-cli + uses: taiki-e/install-action@v2 + with: + tool: wasm-bindgen-cli@0.2.86 + + - name: Install toml2json + uses: taiki-e/install-action@v2 + with: + tool: toml2json@1.3.1 + + - name: Install wasm-opt + run: | + npm i wasm-opt -g + + - name: Build acvm_js + run: yarn workspace @noir-lang/acvm_js build + + - name: Build noirc_abi + run: yarn workspace @noir-lang/noirc_abi build + + - name: Run noir_js tests + run: | + yarn workspace @noir-lang/noir_js build + yarn workspace @noir-lang/noir_js test diff --git a/acvm-repo/acvm_js/.gitignore b/acvm-repo/acvm_js/.gitignore index d7d3d1dbe09..95efa89513e 100644 --- a/acvm-repo/acvm_js/.gitignore +++ b/acvm-repo/acvm_js/.gitignore @@ -1,14 +1,10 @@ /target -.DS_Store -examples/**/target/ -examples/9 -.vscode node_modules -pkg/ -lib/ + +# Build outputs result -.direnv -**/outputs +nodejs +web # Yarn .pnp.* @@ -17,4 +13,4 @@ result !.yarn/plugins !.yarn/releases !.yarn/sdks -!.yarn/versions \ No newline at end of file +!.yarn/versions diff --git a/acvm-repo/acvm_js/buildPhaseCargoCommand.sh b/acvm-repo/acvm_js/buildPhaseCargoCommand.sh index e61cca8bf1e..6c710bc938f 100755 --- a/acvm-repo/acvm_js/buildPhaseCargoCommand.sh +++ b/acvm-repo/acvm_js/buildPhaseCargoCommand.sh @@ -18,16 +18,19 @@ function run_if_available { export self_path=$(dirname "$(readlink -f "$0")") + +NODE_DIR=$self_path/nodejs/ +BROWSER_DIR=$self_path/web/ + # Clear out the existing build artifacts as these aren't automatically removed by wasm-pack. if [ -d ./pkg/ ]; then - rm -rf $self_path/pkg/ + rm -r $NODE_DIR + rm -r $BROWSER_DIR fi TARGET=wasm32-unknown-unknown WASM_BINARY=$CARGO_TARGET_DIR/$TARGET/release/${pname}.wasm -NODE_DIR=$self_path/pkg/nodejs/ -BROWSER_DIR=$self_path/pkg/web/ NODE_WASM=${NODE_DIR}/${pname}_bg.wasm BROWSER_WASM=${BROWSER_DIR}/${pname}_bg.wasm @@ -36,4 +39,4 @@ run_or_fail cargo build --lib --release --target $TARGET --package ${pname} run_or_fail wasm-bindgen $WASM_BINARY --out-dir $NODE_DIR --typescript --target nodejs run_or_fail wasm-bindgen $WASM_BINARY --out-dir $BROWSER_DIR --typescript --target web run_if_available wasm-opt $NODE_WASM -o $NODE_WASM -O -run_if_available wasm-opt $BROWSER_WASM -o $BROWSER_WASM -O \ No newline at end of file +run_if_available wasm-opt $BROWSER_WASM -o $BROWSER_WASM -O diff --git a/acvm-repo/acvm_js/installPhase.sh b/acvm-repo/acvm_js/installPhase.sh index 847ba2ed90a..34ddb8155e1 100755 --- a/acvm-repo/acvm_js/installPhase.sh +++ b/acvm-repo/acvm_js/installPhase.sh @@ -1,14 +1,10 @@ #!/usr/bin/env bash export self_path=$(dirname "$(readlink -f "$0")") -mkdir -p $out -cp $self_path/README.md $out/ -cp -r $self_path/pkg/* $out/ +export out_path=$out/acvm_js -# The main package.json contains several keys which are incorrect/unwanted when distributing. -cat $self_path/package.json \ -| jq 'del(.private, .devDependencies, .scripts, .packageManager)' \ -> $out/package.json - -# Cleanup temporary pkg directory -rm -r $self_path/pkg \ No newline at end of file +mkdir -p $out_path +cp $self_path/README.md $out_path/ +cp $self_path/package.json $out_path/ +cp -r $self_path/nodejs $out_path/ +cp -r $self_path/web $out_path/ diff --git a/acvm-repo/acvm_js/nix/wasm-bindgen-cli/default.nix b/acvm-repo/acvm_js/nix/wasm-bindgen-cli/default.nix deleted file mode 100644 index 67225f05666..00000000000 --- a/acvm-repo/acvm_js/nix/wasm-bindgen-cli/default.nix +++ /dev/null @@ -1,37 +0,0 @@ -{ lib -, rustPlatform -, fetchCrate -, nodejs -, pkg-config -, openssl -, stdenv -, curl -, darwin -, runCommand -}: - -rustPlatform.buildRustPackage rec { - pname = "wasm-bindgen-cli"; - version = "0.2.86"; - - src = fetchCrate { - inherit pname version; - sha256 = "sha256-0u9bl+FkXEK2b54n7/l9JOCtKo+pb42GF9E1EnAUQa0="; - }; - - cargoSha256 = "sha256-AsZBtE2qHJqQtuCt/wCAgOoxYMfvDh8IzBPAOkYSYko="; - - nativeBuildInputs = [ pkg-config ]; - - buildInputs = [ openssl ] ++ lib.optionals stdenv.isDarwin [ curl darwin.apple_sdk.frameworks.Security ]; - - doCheck = false; - - meta = with lib; { - homepage = "https://rustwasm.github.io/docs/wasm-bindgen/"; - license = with licenses; [ asl20 /* or */ mit ]; - description = "Facilitating high-level interactions between wasm modules and JavaScript"; - maintainers = with maintainers; [ nitsky rizary ]; - mainProgram = "wasm-bindgen"; - }; -} \ No newline at end of file diff --git a/acvm-repo/acvm_js/test/browser/execute_circuit.test.ts b/acvm-repo/acvm_js/test/browser/execute_circuit.test.ts index 280b08abed3..601deffc79e 100644 --- a/acvm-repo/acvm_js/test/browser/execute_circuit.test.ts +++ b/acvm-repo/acvm_js/test/browser/execute_circuit.test.ts @@ -7,7 +7,7 @@ import initACVM, { WitnessMap, initLogLevel, ForeignCallHandler, -} from "../../../result/"; +} from "@noir-lang/acvm_js"; beforeEach(async () => { await initACVM(); diff --git a/acvm-repo/acvm_js/test/browser/witness_conversion.test.ts b/acvm-repo/acvm_js/test/browser/witness_conversion.test.ts index 9fb04e86a2d..67c6c998923 100644 --- a/acvm-repo/acvm_js/test/browser/witness_conversion.test.ts +++ b/acvm-repo/acvm_js/test/browser/witness_conversion.test.ts @@ -1,5 +1,8 @@ import { expect } from "@esm-bundle/chai"; -import initACVM, { compressWitness, decompressWitness } from "../../../result/"; +import initACVM, { + compressWitness, + decompressWitness, +} from "@noir-lang/acvm_js"; import { expectedCompressedWitnessMap, expectedWitnessMap, diff --git a/acvm-repo/acvm_js/test/node/build_info.test.ts b/acvm-repo/acvm_js/test/node/build_info.test.ts index e2e3788887f..fcbdd9e45b7 100644 --- a/acvm-repo/acvm_js/test/node/build_info.test.ts +++ b/acvm-repo/acvm_js/test/node/build_info.test.ts @@ -1,5 +1,5 @@ import { expect } from "chai"; -import { BuildInfo, buildInfo } from "../../../result/"; +import { BuildInfo, buildInfo } from "@noir-lang/acvm_js"; import child_process from "child_process"; import pkg from "../../package.json"; diff --git a/acvm-repo/acvm_js/test/node/execute_circuit.test.ts b/acvm-repo/acvm_js/test/node/execute_circuit.test.ts index 0523d01b9ca..a9807b48aa7 100644 --- a/acvm-repo/acvm_js/test/node/execute_circuit.test.ts +++ b/acvm-repo/acvm_js/test/node/execute_circuit.test.ts @@ -6,7 +6,7 @@ import { WasmBlackBoxFunctionSolver, WitnessMap, ForeignCallHandler, -} from "../../../result/"; +} from "@noir-lang/acvm_js"; it("successfully executes circuit and extracts return value", async () => { const { bytecode, initialWitnessMap, resultWitness, expectedResult } = diff --git a/acvm-repo/acvm_js/test/node/witness_conversion.test.ts b/acvm-repo/acvm_js/test/node/witness_conversion.test.ts index 577fccfb1c0..86a716c6d70 100644 --- a/acvm-repo/acvm_js/test/node/witness_conversion.test.ts +++ b/acvm-repo/acvm_js/test/node/witness_conversion.test.ts @@ -1,5 +1,5 @@ import { expect } from "chai"; -import { compressWitness, decompressWitness } from "../../../result/"; +import { compressWitness, decompressWitness } from "@noir-lang/acvm_js"; import { expectedCompressedWitnessMap, expectedWitnessMap, diff --git a/acvm-repo/acvm_js/test/shared/addition.ts b/acvm-repo/acvm_js/test/shared/addition.ts index 790da506f6c..02b7d8457a8 100644 --- a/acvm-repo/acvm_js/test/shared/addition.ts +++ b/acvm-repo/acvm_js/test/shared/addition.ts @@ -1,4 +1,4 @@ -import { WitnessMap } from "../../../result/"; +import { WitnessMap } from "@noir-lang/acvm_js"; // See `addition_circuit` integration test in `acir/tests/test_program_serialization.rs`. export const bytecode = Uint8Array.from([ diff --git a/acvm-repo/acvm_js/test/shared/complex_foreign_call.ts b/acvm-repo/acvm_js/test/shared/complex_foreign_call.ts index 4d5a7f96e01..5fb6b2559e1 100644 --- a/acvm-repo/acvm_js/test/shared/complex_foreign_call.ts +++ b/acvm-repo/acvm_js/test/shared/complex_foreign_call.ts @@ -1,4 +1,4 @@ -import { WitnessMap } from "../../../result/"; +import { WitnessMap } from "@noir-lang/acvm_js"; // See `complex_brillig_foreign_call` integration test in `acir/tests/test_program_serialization.rs`. export const bytecode = Uint8Array.from([ diff --git a/acvm-repo/acvm_js/test/shared/foreign_call.ts b/acvm-repo/acvm_js/test/shared/foreign_call.ts index 038b64a5095..615f705f064 100644 --- a/acvm-repo/acvm_js/test/shared/foreign_call.ts +++ b/acvm-repo/acvm_js/test/shared/foreign_call.ts @@ -1,4 +1,4 @@ -import { WitnessMap } from "../../../result/"; +import { WitnessMap } from "@noir-lang/acvm_js"; // See `simple_brillig_foreign_call` integration test in `acir/tests/test_program_serialization.rs`. export const bytecode = Uint8Array.from([ diff --git a/tooling/noir_js/package.json b/tooling/noir_js/package.json index dbb6dccaf75..a1f3b52bd86 100644 --- a/tooling/noir_js/package.json +++ b/tooling/noir_js/package.json @@ -29,8 +29,8 @@ "dev": "tsc-multi --watch", "build": "tsc-multi", "test": "yarn test:node:esm && yarn test:node:cjs", - "test:node:esm": "mocha --timeout 25000 --config ./.mocharc.json", - "test:node:cjs": "mocha --timeout 25000 --config ./.mocharc.cjs.json", + "test:node:esm": "mocha --timeout 25000 --exit --config ./.mocharc.json", + "test:node:cjs": "mocha --timeout 25000 --exit --config ./.mocharc.cjs.json", "prettier": "prettier 'src/**/*.ts'", "prettier:fix": "prettier --write 'src/**/*.ts' 'test/**/*.ts'", "lint": "NODE_NO_WARNINGS=1 eslint . --ext .ts --ignore-path ./.eslintignore --max-warnings 0" diff --git a/tooling/noir_js/src/witness_generation.ts b/tooling/noir_js/src/witness_generation.ts index bce95ba0c5c..c117adcf087 100644 --- a/tooling/noir_js/src/witness_generation.ts +++ b/tooling/noir_js/src/witness_generation.ts @@ -1,11 +1,11 @@ import { abiEncode } from '@noir-lang/noirc_abi'; import { validateInputs } from './input_validation.js'; import { base64Decode } from './base64_decode.js'; -import { WitnessMap, executeCircuit } from '@noir-lang/acvm_js'; +import { executeCircuit } from '@noir-lang/acvm_js'; import { witnessMapToUint8Array } from './serialize.js'; // Generates the witnesses needed to feed into the chosen proving system -export async function generateWitness(compiledProgram, inputs): Promise { +export async function generateWitness(compiledProgram, inputs): Promise { // Validate inputs const { isValid, error } = validateInputs(inputs, compiledProgram.abi); if (!isValid) {