# `taskset -c 0-11` caps cargo to 12 cores so the build does
# not saturate CI runners. Override empty to
# disable on machines without taskset (macOS, BSDs, sandboxes):
#   make TASKSET= build-debug
TASKSET ?= taskset -c 0-11

.PHONY: build build-rust build-debug build-release-opt check-fmt dev dev-build \
        internal-dev-install mark-pkg-private test test\:smoke test\:suite

build: build-rust mark-pkg-private

build-rust:
	$(TASKSET) wasm-pack build --scope nymproject --target web

build-debug:
	$(TASKSET) wasm-pack build --debug --scope nymproject --target web --features debug
	$(MAKE) mark-pkg-private

build-release-opt:
	$(TASKSET) wasm-pack build --scope nymproject --target web
	$(TASKSET) wasm-opt -Oz -o pkg/smolmix_wasm_bg.wasm pkg/smolmix_wasm_bg.wasm
	$(MAKE) mark-pkg-private

# smolmix-wasm is workspace-internal: its bytes are base64-inlined into
# @nymproject/mix-tunnel at build time, so it must never reach npm. wasm-pack
# does not write `"private": true` itself, so we patch the generated package.json
# in place. Guard against re-application so the target stays idempotent.
mark-pkg-private:
	@if [ -f pkg/package.json ]; then \
		jq '. + {private: true}' pkg/package.json > pkg/package.json.tmp \
			&& mv pkg/package.json.tmp pkg/package.json; \
	fi

check-fmt:
	cargo fmt --check
	cargo clippy --target wasm32-unknown-unknown -- -Dwarnings
	cargo clippy --target wasm32-unknown-unknown --features debug -- -Dwarnings

dev: build-debug
	cd internal-dev && ./node_modules/.bin/webpack serve --open

# Build the internal-dev webpack bundle for Playwright.
dev-build: build-debug
	cd internal-dev && ./node_modules/.bin/webpack --mode production

# One-time setup for internal-dev. Run this after fresh clone or when
# internal-dev/package.json changes. Standalone install (no workspace walk).
internal-dev-install:
	cd internal-dev && pnpm install --ignore-workspace

# Playwright tests (headless browser).
# Prereqs: make dev-build && cd tests && pnpm install && pnpm exec playwright install
# IPR_ADDRESS env var is optional; tests fall back to the default in
# internal-dev/index.html / internal-dev/headless.js when unset.
test\:smoke:
	cd tests && pnpm exec playwright test --project=smoke-chromium --project=smoke-firefox --project=smoke-webkit

test\:suite:
	cd tests && pnpm exec playwright test --project=suite-chromium --project=suite-firefox --project=suite-webkit

test:
	cd tests && pnpm exec playwright test
