{ "name": "jam", "version": "2.0.0-SNAPSHOT", "private": true, "description": "Your sats. Your privacy. Your profit.", "repository": "git@github.com:joinmarket-webui/jam.git", "license": "MIT", "type": "module", "engines": { "node": ">=24.11.1", "npm": ">=11.6.2" }, "scripts": { "dev": "VITE_JAM_DEV_MODE=true vite", "dev:secondary": "JAM_BACKEND=jam-standalone JAM_API_PORT=29080 npm run dev", "build": "tsc -b && vite build", "lint": "eslint .", "prettier": "prettier --write \"**/*.{js,jsx,ts,tsx,json,css,md}\"", "format": "npm run lint -- --fix && npm run prettier", "preview": "vite preview", "storybook:up": "storybook dev -p 6006", "storybook:build": "storybook build", "test": "vitest run", "test:unit": "vitest run --project unit", "test:storybook": "vitest run --project storybook", "check": "npm run format && npm run test && npm run build", "regtest:build": "npm run regtest:clear && docker compose --env-file docker/regtest/.env.example --file docker/regtest/docker-compose.yml build --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:logs": "docker compose --env-file docker/regtest/.env.example --file docker/regtest/docker-compose.yml logs --follow", "regtest:down": "docker compose --env-file docker/regtest/.env.example --file docker/regtest/docker-compose.yml down", "regtest:logs:jmwalletd": "docker exec -t jm_regtest_joinmarket tail -f /var/log/jam/jmwalletd_stdout.log", "regtest:logs:schedule": "docker exec -t jm_regtest_joinmarket tail -f /root/.joinmarket/logs/TUMBLE.schedule", "regtest:logs:directory_node": "docker exec -t jm_regtest_joinmarket_directory_node tail -f /var/log/jam/directory_node_stdout.log -n 200", "regtest:init": "./docker/regtest/init-setup.sh", "regtest:mine": "watch -n 11 ./docker/regtest/mine-block.sh" }, "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.2.2", "@joinmarket-webui/joinmarket-api-ts": "0.3.0", "@noble/hashes": "2.0.1", "@radix-ui/react-accordion": "1.2.12", "@radix-ui/react-avatar": "1.1.11", "@radix-ui/react-checkbox": "1.3.3", "@radix-ui/react-dialog": "1.1.15", "@radix-ui/react-dropdown-menu": "2.1.16", "@radix-ui/react-label": "2.1.8", "@radix-ui/react-popover": "1.1.15", "@radix-ui/react-radio-group": "1.3.8", "@radix-ui/react-select": "2.2.6", "@radix-ui/react-separator": "1.1.8", "@radix-ui/react-slot": "1.2.4", "@radix-ui/react-switch": "1.2.6", "@radix-ui/react-tabs": "1.1.13", "@radix-ui/react-tooltip": "1.2.8", "@scure/bip32": "2.0.1", "@scure/bip39": "2.0.1", "@tailwindcss/vite": "4.2.2", "@tanstack/match-sorter-utils": "8.19.4", "@tanstack/react-query": "5.96.2", "@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.7.0", "next-themes": "0.4.6", "qrcode": "1.5.4", "radix-ui": "1.4.3", "react": "19.2.5", "react-dom": "19.2.5", "react-hook-form": "7.72.1", "react-i18next": "17.0.2", "react-router-dom": "7.14.0", "react-use-websocket": "4.13.0", "sonner": "2.0.7", "tailwind-merge": "3.5.0", "tailwindcss": "4.2.2", "tw-animate-css": "1.4.0", "yup": "1.7.1", "zustand": "5.0.12" }, "devDependencies": { "@chromatic-com/storybook": "5.1.1", "@eslint/js": "9.39.4", "@playwright/test": "1.59.1", "@storybook/addon-a11y": "10.3.5", "@storybook/addon-docs": "10.3.5", "@storybook/addon-vitest": "10.3.5", "@storybook/react-vite": "10.3.5", "@tanstack/eslint-plugin-query": "5.96.2", "@testing-library/jest-dom": "6.9.1", "@testing-library/react": "16.3.2", "@testing-library/user-event": "14.6.1", "@trivago/prettier-plugin-sort-imports": "6.0.2", "@types/node": "24.10.15", "@types/qrcode": "1.5.6", "@types/react": "19.2.14", "@types/react-dom": "19.2.3", "@vitejs/plugin-react": "5.2.0", "@vitest/browser": "4.0.9", "@vitest/browser-playwright": "4.0.9", "@vitest/coverage-v8": "4.0.9", "conventional-changelog": "7.2.0", "eslint": "9.39.4", "eslint-plugin-compat": "7.0.1", "eslint-plugin-react-hooks": "7.0.1", "eslint-plugin-react-refresh": "0.5.2", "eslint-plugin-storybook": "10.3.5", "eslint-plugin-unicorn": "64.0.0", "globals": "17.4.0", "husky": "9.1.7", "jsdom": "29.0.2", "lint-staged": "16.4.0", "prettier": "3.8.1", "prettier-plugin-tailwindcss": "0.7.2", "storybook": "10.3.5", "typescript": "~5.9.3", "typescript-eslint": "8.58.1", "vite": "7.3.2", "vitest": "4.0.9" }, "overrides": { "storybook": "$storybook", "@joinmarket-webui/joinmarket-api-ts": { "@tanstack/react-query": "$@tanstack/react-query" } } }