bitspire/apps/machine/package.json
Patrick Mulligan 84d746a0da feat(machine): NFC Bolt Card reader driver + IPC (main process)
Main-process driver over nfc-pcsc (PC/SC). On tap it reads the NTAG424
Type-4 NDEF file via ISO7816 APDUs (select NDEF app D2760000850101 →
select file → ReadBinary NLEN + message) and extracts the lnurlw voucher
(fresh SUN p/c per tap), forwarding it to the renderer on `nfc:card-tapped`
(+ `nfc:status`). Lazy, guarded import — a missing reader/pcscd just
reports 'unavailable', never breaking the cash-out QR path. Preload
removeAllListeners guards against a double payment-trigger on renderer reload.

- electron/nfc-service.ts: startNfcReader() + readNdefLnurlw()/extractLnurlw().
- electron/nfc-service.test.ts: 7 tests (NDEF URI extraction, Type-4 read
  sequence incl. AID select, empty-file + select-fail handling).
- main.ts start + IPC forward; preload + electron.d.ts listeners.
- add nfc-pcsc dep (native @pokusew/pcsclite; nix build handling next).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-05 04:42:07 +02:00

81 lines
2.4 KiB
JSON

{
"name": "@bitSpire/machine",
"version": "0.1.0",
"description": "Electron ATM kiosk application with Vue 3 UI",
"author": {
"name": "AIO Labs",
"email": "dev@aiolabs.dev"
},
"homepage": "https://aiolabs.dev",
"license": "AGPL-3.0",
"type": "module",
"main": "dist-electron/main.js",
"scripts": {
"dev": "concurrently -n vite,electron \"vite\" \"pnpm run electron:dev\"",
"dev:vite": "vite",
"electron:dev": "tsc -p electron/tsconfig.json && tsc -p electron/tsconfig.preload.json && electron dist-electron/main.js",
"build": "vue-tsc --noEmit && vite build && tsc -p electron/tsconfig.json && tsc -p electron/tsconfig.preload.json && npx esbuild electron/fund-atm.ts --bundle --platform=node --format=cjs --external:better-sqlite3 --outfile=dist-electron/fund-atm.bundle.cjs",
"build:electron": "pnpm build && electron-builder",
"preview": "vite preview",
"typecheck": "vue-tsc --noEmit",
"lint": "eslint src/",
"test": "vitest run",
"test:watch": "vitest"
},
"dependencies": {
"@bitSpire/clink": "workspace:*",
"@bitSpire/hal": "workspace:*",
"@bitSpire/lnbits": "workspace:*",
"@bitSpire/nostr-client": "workspace:*",
"@bitSpire/state-machine": "workspace:*",
"@tanstack/vue-table": "^8.21.3",
"@vueuse/core": "^14.1.0",
"better-sqlite3": "^11.0.0",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"lucide-vue-next": "^0.563.0",
"marked": "^17.0.5",
"nfc-pcsc": "^0.8.1",
"nostr-tools": "^2.10.0",
"pinia": "^2.2.0",
"qr": "^0.6.0",
"qrcode.vue": "^3.6.0",
"reka-ui": "^2.7.0",
"tailwind-merge": "^3.4.0",
"vue": "^3.5.0",
"vue-router": "^4.4.0"
},
"devDependencies": {
"@tailwindcss/vite": "^4.0.0",
"@types/better-sqlite3": "^7.0.0",
"@types/node": "^22.0.0",
"@vitejs/plugin-vue": "^5.2.0",
"concurrently": "^9.0.0",
"electron": "^33.0.0",
"electron-builder": "^25.0.0",
"esbuild": "^0.27.4",
"tailwindcss": "^4.0.0",
"tw-animate-css": "^1.4.0",
"typescript": "^5.7.0",
"vite": "^6.0.0",
"vitest": "^2.1.9",
"vue-tsc": "^2.1.0"
},
"build": {
"appId": "dev.bitSpire.atm",
"productName": "bitSpire",
"directories": {
"output": "release"
},
"files": [
"dist/**/*",
"dist-electron/**/*"
],
"linux": {
"target": [
"AppImage"
],
"category": "Finance"
}
}
}