{ "name": "jam", "version": "2.0.0-beta.2", "private": true, "description": "Your sats. Your privacy. Your profit.", "repository": "git@github.com:joinmarket-webui/jam.git", "license": "MIT", "type": "module", "engines": { "node": ">=26.3.0", "npm": ">=11.16.0" }, "scripts": { "dev": "npm run dev:ng:native", "dev:ng:native": "JAM_BACKEND=joinmarket-ng JMOBWATCH_PORT=31800 VITE_JAM_DEV_MODE=true vite", "dev:ng:jam-standalone": "JAM_BACKEND=jam-standalone JAM_API_PORT=29080 VITE_JAM_DEV_MODE=true vite", "dev:clientserver:native": "JAM_BACKEND=joinmarket-clientserver JMWALLETD_API_PORT=30183 JMWALLETD_WEBSOCKET_PORT=30283 JMOBWATCH_PORT=30601 VITE_JAM_DEV_MODE=true vite", "dev:clientserver:jam-standalone": "JAM_BACKEND=jam-standalone JAM_API_PORT=31080 VITE_JAM_DEV_MODE=true vite", "build": "tsc -b && vite build", "lint": "npm run lint:check", "lint:check": "eslint .", "lint:fix": "eslint . --fix", "format:check": "prettier --check \"**/*.{js,jsx,ts,tsx,json,css,md}\"", "format:write": "prettier --write \"**/*.{js,jsx,ts,tsx,json,css,md}\"", "format": "npm run lint:fix && npm run format:write", "preview": "vite preview", "storybook": "npm run storybook:up", "storybook:up": "storybook dev -p 6006", "storybook:build": "storybook build --disable-telemetry", "storybook:build-gh-pages": "STORYBOOK_MSW_SERVICE_WORKER_URL=./mockServiceWorker.js npm run storybook:build", "storybook:serve-static": "cd storybook-static/ && python3 -m http.server", "test": "NODE_OPTIONS=--no-webstorage vitest run", "test:unit": "NODE_OPTIONS=--no-webstorage vitest run --project unit", "test:storybook": "NODE_OPTIONS=--no-webstorage vitest run --project storybook", "test:coverage": "npm test -- --coverage.enabled", "check": "npm run format && npm run test && npm run build", "regtest:build": "npm run regtest:clear && npm run regtest:pull && docker compose --env-file docker/regtest/.env.example --file docker/regtest/docker-compose.yml build --pull", "regtest:pull": "docker compose --env-file docker/regtest/.env.example --file docker/regtest/docker-compose.yml pull", "regtest:rebuild": "rm -rf docker/regtest/.tmp && npm run regtest:build -- --no-cache", "regtest:clear": "docker compose --env-file docker/regtest/.env.example --file docker/regtest/docker-compose.yml down --volumes --remove-orphans", "regtest:up": "./docker/regtest/prepare-setup.sh && docker compose --env-file docker/regtest/.env.generated --file docker/regtest/docker-compose.yml up --detach --wait --wait-timeout 120", "regtest:down": "docker compose --env-file docker/regtest/.env.example --file docker/regtest/docker-compose.yml down", "regtest:logs:all": "docker compose --env-file docker/regtest/.env.example --file docker/regtest/docker-compose.yml logs --follow", "regtest:logs": "npm run regtest:logs:ng:native:jmwalletd", "regtest:logs:obwatch": "npm run regtest:logs:ng:obwatch", "regtest:logs:directory_node": "npm run regtest:logs:ng:directory_node", "regtest:logs:ng:native:jmwalletd": "docker logs -f jm_regtest_joinmarket", "regtest:logs:ng:obwatch": "docker logs -f jm_regtest_joinmarket_ng_orderbook_watcher", "regtest:logs:ng:directory_node": "docker logs -f jm_regtest_joinmarket_ng_directory_node", "regtest:logs:clientserver:directory_node": "docker exec -t jm_regtest_joinmarket_clientserver_directory_node tail -f /var/log/jam/directory_node_stdout.log -n 200", "regtest:logs:clientserver:native:jmwalletd": "docker exec -t jm_regtest_joinmarket3 tail -f /var/log/jam/jmwalletd_stdout.log", "regtest:logs:clientserver:native:tor": "docker exec -t jm_regtest_joinmarket3 tail -f /var/log/jam/tor_stdout.log", "regtest:logs:clientserver:native:schedule": "docker exec -t jm_regtest_joinmarket3 tail -f /root/.joinmarket/logs/TUMBLE.schedule", "regtest:init": "./docker/regtest/init-setup.sh", "regtest:mine": "watch -n 11 ./docker/regtest/mine-block.sh", "regtest:listwallets": "docker exec -t jm_regtest_bitcoind bitcoin-cli -datadir=/home/bitcoin/data -regtest -rpcport=43782 listwallets" }, "lint-staged": { "*.{js,jsx,ts,tsx}": [ "eslint --fix", "prettier --write" ], "*.{json,css,md}": "prettier --write" }, "browserslist": { "production": [ "> 0.5%", "last 2 versions", "not dead", "not op_mini all" ] }, "dependencies": { "@hookform/resolvers": "5.5.7", "@joinmarket-webui/joinmarket-ng-api-ts": "1.0.0", "@noble/hashes": "2.2.0", "@radix-ui/react-accordion": "1.2.20", "@radix-ui/react-avatar": "1.2.6", "@radix-ui/react-checkbox": "1.3.11", "@radix-ui/react-dialog": "1.1.23", "@radix-ui/react-dropdown-menu": "2.1.24", "@radix-ui/react-label": "2.1.15", "@radix-ui/react-popover": "1.1.23", "@radix-ui/react-radio-group": "1.4.7", "@radix-ui/react-select": "2.3.7", "@radix-ui/react-separator": "1.1.15", "@radix-ui/react-slider": "1.4.7", "@radix-ui/react-slot": "1.3.3", "@radix-ui/react-switch": "1.3.7", "@radix-ui/react-tabs": "1.1.21", "@radix-ui/react-tooltip": "1.2.16", "@scure/bip32": "2.2.0", "@scure/bip39": "2.2.0", "@tailwindcss/vite": "4.3.3", "@tanstack/match-sorter-utils": "8.19.4", "@tanstack/react-query": "5.101.4", "@tanstack/react-table": "8.21.3", "bitcoin-address-validation": "3.0.0", "class-variance-authority": "0.7.1", "clsx": "2.1.1", "html5-qrcode": "2.3.8", "i18next-browser-languagedetector": "8.2.1", "lucide-react": "1.28.0", "next-themes": "0.4.6", "qrcode": "1.5.4", "radix-ui": "1.6.7", "react": "19.2.8", "react-dom": "19.2.8", "react-hook-form": "7.83.0", "react-i18next": "17.0.11", "react-router-dom": "7.18.2", "react-use-websocket": "4.13.0", "sonner": "2.0.7", "tailwind-merge": "3.6.0", "tailwindcss": "4.3.3", "tw-animate-css": "1.4.0", "yup": "1.7.1", "zustand": "5.0.14" }, "devDependencies": { "@chromatic-com/storybook": "5.2.1", "@eslint/js": "9.39.5", "@playwright/test": "1.62.0", "@storybook/addon-a11y": "10.5.5", "@storybook/addon-docs": "10.5.5", "@storybook/addon-vitest": "10.5.5", "@storybook/react-vite": "10.5.5", "@tanstack/eslint-plugin-query": "5.101.4", "@testing-library/jest-dom": "7.0.0", "@testing-library/react": "16.3.2", "@testing-library/user-event": "14.6.1", "@trivago/prettier-plugin-sort-imports": "6.0.2", "@types/node": "26.1.2", "@types/qrcode": "1.5.6", "@types/react": "19.2.17", "@types/react-dom": "19.2.3", "@vitejs/plugin-react": "6.0.5", "@vitest/browser": "4.1.10", "@vitest/browser-playwright": "4.1.10", "@vitest/coverage-v8": "4.1.10", "conventional-changelog": "8.1.0", "eslint": "9.39.5", "eslint-plugin-compat": "7.0.2", "eslint-plugin-react-hooks": "7.1.1", "eslint-plugin-react-refresh": "0.5.3", "eslint-plugin-storybook": "10.5.5", "eslint-plugin-unicorn": "65.0.1", "globals": "17.8.0", "husky": "9.1.7", "jsdom": "30.0.1", "lint-staged": "17.2.0", "msw": "2.15.0", "msw-storybook-addon": "3.0.0", "prettier": "3.9.6", "prettier-plugin-tailwindcss": "0.8.1", "storybook": "10.5.5", "typescript": "6.0.3", "typescript-eslint": "8.65.0", "vite": "8.2.0", "vitest": "4.1.10" }, "overrides": { "storybook": "$storybook", "@joinmarket-webui/joinmarket-ng-api-ts": { "@tanstack/react-query": "$@tanstack/react-query" } }, "msw": { "workerDirectory": [ "public" ] } }