Two real bugs surfaced auditing the Map page.
1. The "trusted-first" soft sort was silently dead for the default
config. filteredSpots ran a standalone .sort() to float trusted
content up, then IMMEDIATELY ran a second unconditional .sort() by
sortBy — which re-ordered everything and wiped the trust ordering.
For a logged-in user with ≥5 follows the smart default is
trustFilter='trusted' + sortBy='recent', so the documented
"sort trusted first, badge unverified" behaviour never actually
happened. Fixed by folding the trust tier into the MAIN comparator as
its primary key, with the chosen sortBy as the tiebreaker within each
tier. Strict modes (verified/following) still hard-filter as before.
2. MiniStashCard (gear pins in the map drawer) built its border colour
with an interpolated Tailwind class (`border-${colour}-500/40`) that
the JIT compiler can't see, so it was never generated — dead class
emitting an invalid string into the DOM. The inline
style={{ borderColor }} that actually worked was also applied
unconditionally, overriding the intended cyan border on WISHLIST
items with the rarity colour. Now: wishlist keeps its static cyan
border; gear uses the rarity colour via inline style only.
Geolocation (native vs web, denied/timeout/no-provider handling),
batched trust/status/comment/weather queries, and the layer plumbing
into SpotMap were all audited and are sound.
Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
141 lines
5.6 KiB
JSON
141 lines
5.6 KiB
JSON
{
|
|
"name": "skate-spots",
|
|
"private": true,
|
|
"version": "1.2.36",
|
|
"type": "module",
|
|
"homepage": "https://skate-spots.com",
|
|
"scripts": {
|
|
"dev": "npm i --silent && vite",
|
|
"build": "npm i --silent && vite build -l error && cp dist/index.html dist/404.html && echo 'Project built successfully!'",
|
|
"test": "npm i --silent && tsc --noEmit && eslint && vitest run --reporter=dot --silent && vite build -l error && cp dist/index.html dist/404.html && echo 'All tests passed!'",
|
|
"deploy": "npm i --silent && npm run build && npx -y nostr-deploy-cli deploy --skip-setup",
|
|
"android:init": "npm run android:build:apk && npx cap add android && npx cap sync android && node scripts/inject-amber-queries.mjs && node scripts/inject-main-activity.mjs",
|
|
"android:sync": "npm run android:build:apk && npx cap sync android && node scripts/sync-android-version.mjs && node scripts/inject-amber-queries.mjs && node scripts/inject-main-activity.mjs",
|
|
"android:open": "npx cap open android",
|
|
"android:version": "node scripts/sync-android-version.mjs",
|
|
"android:build": "npm run android:build:apk && npx cap sync android && node scripts/sync-android-version.mjs && node scripts/inject-amber-queries.mjs && node scripts/inject-main-activity.mjs && cd android && ./gradlew assembleRelease",
|
|
"android:build:apk": "CAPACITOR_BUILD=1 vite build && sed -i 's|<script type=\"module\" src=\"/shakespeare_tailwind[^\"]*\\.js\"></script>||g' dist/index.html && sed -i 's|<style type=\"text/tailwindcss\">|<style>|g' dist/index.html && cp dist/index.html dist/404.html"
|
|
},
|
|
"dependencies": {
|
|
"@bitcoinerlab/secp256k1": "^1.2.0",
|
|
"@capacitor/android": "^8.4.2",
|
|
"@capacitor/camera": "^8.2.1",
|
|
"@capacitor/core": "^8.4.2",
|
|
"@capacitor/geolocation": "^8.2.0",
|
|
"@cashu/cashu-ts": "2.8.1",
|
|
"@contextvm/sdk": "^0.12.0",
|
|
"@fontsource-variable/inter": "^5.2.6",
|
|
"@fontsource-variable/outfit": "^5.2.8",
|
|
"@fontsource/barlow-condensed": "^5.2.8",
|
|
"@fontsource/bebas-neue": "^5.2.7",
|
|
"@getalby/sdk": "^5.1.1",
|
|
"@hookform/resolvers": "^3.9.0",
|
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
"@noble/curves": "^2.0.1",
|
|
"@noble/hashes": "^2.0.1",
|
|
"@nostrify/nostrify": "^0.47.1",
|
|
"@nostrify/react": "^0.2.17",
|
|
"@radix-ui/react-accordion": "^1.2.0",
|
|
"@radix-ui/react-alert-dialog": "^1.1.1",
|
|
"@radix-ui/react-aspect-ratio": "^1.1.0",
|
|
"@radix-ui/react-avatar": "^1.1.0",
|
|
"@radix-ui/react-checkbox": "^1.1.1",
|
|
"@radix-ui/react-collapsible": "^1.1.0",
|
|
"@radix-ui/react-context-menu": "^2.2.1",
|
|
"@radix-ui/react-dialog": "^1.1.2",
|
|
"@radix-ui/react-dropdown-menu": "^2.1.1",
|
|
"@radix-ui/react-hover-card": "^1.1.1",
|
|
"@radix-ui/react-label": "^2.1.0",
|
|
"@radix-ui/react-menubar": "^1.1.1",
|
|
"@radix-ui/react-navigation-menu": "^1.2.0",
|
|
"@radix-ui/react-popover": "^1.1.1",
|
|
"@radix-ui/react-progress": "^1.1.0",
|
|
"@radix-ui/react-radio-group": "^1.2.0",
|
|
"@radix-ui/react-scroll-area": "^1.1.0",
|
|
"@radix-ui/react-select": "^2.1.1",
|
|
"@radix-ui/react-separator": "^1.1.0",
|
|
"@radix-ui/react-slider": "^1.2.0",
|
|
"@radix-ui/react-slot": "^1.1.0",
|
|
"@radix-ui/react-switch": "^1.1.0",
|
|
"@radix-ui/react-tabs": "^1.1.0",
|
|
"@radix-ui/react-toast": "^1.2.1",
|
|
"@radix-ui/react-toggle": "^1.1.0",
|
|
"@radix-ui/react-toggle-group": "^1.1.0",
|
|
"@radix-ui/react-tooltip": "^1.1.4",
|
|
"@scure/bip32": "^2.0.1",
|
|
"@scure/bip39": "1.6.0",
|
|
"@tanstack/react-query": "^5.56.2",
|
|
"@unhead/addons": "^2.0.10",
|
|
"@unhead/react": "^2.0.10",
|
|
"bitcoinjs-lib": "^7.0.0",
|
|
"buffer": "^6.0.3",
|
|
"class-variance-authority": "^0.7.1",
|
|
"clsx": "^2.1.1",
|
|
"cmdk": "^1.0.0",
|
|
"coco-cashu-core": "1.1.2-rc.30",
|
|
"coco-cashu-indexeddb": "1.1.2-rc.30",
|
|
"date-fns": "^4.1.0",
|
|
"dexie": "^4.0.8",
|
|
"dotenv": "^17.4.2",
|
|
"ecpair": "^3.0.0",
|
|
"embla-carousel-react": "^8.3.0",
|
|
"hls.js": "^1.6.15",
|
|
"html2canvas": "^1.4.1",
|
|
"html5-qrcode": "^2.3.8",
|
|
"idb": "^8.0.3",
|
|
"input-otp": "^1.2.4",
|
|
"leaflet": "^1.9.4",
|
|
"leaflet.markercluster": "^1.5.3",
|
|
"lucide-react": "^0.462.0",
|
|
"ngeohash": "^0.6.3",
|
|
"nostr-tools": "2.13.0",
|
|
"npubcash-sdk": "^0.2.0",
|
|
"qrcode": "^1.5.4",
|
|
"react": "^18.3.1",
|
|
"react-day-picker": "^8.10.1",
|
|
"react-dom": "^18.3.1",
|
|
"react-hook-form": "^7.53.0",
|
|
"react-intersection-observer": "^9.16.0",
|
|
"react-resizable-panels": "^2.1.3",
|
|
"react-router-dom": "^6.26.2",
|
|
"recharts": "^2.12.7",
|
|
"tailwind-merge": "^2.5.2",
|
|
"tailwindcss-animate": "^1.0.7",
|
|
"three": "^0.185.1",
|
|
"vaul": "^0.9.3",
|
|
"zod": "^3.25.71"
|
|
},
|
|
"devDependencies": {
|
|
"@capacitor/cli": "^8.4.2",
|
|
"@eslint/js": "^9.9.0",
|
|
"@html-eslint/eslint-plugin": "^0.41.0",
|
|
"@html-eslint/parser": "^0.41.0",
|
|
"@tailwindcss/typography": "^0.5.15",
|
|
"@testing-library/dom": "^10.4.1",
|
|
"@testing-library/jest-dom": "^6.6.3",
|
|
"@testing-library/react": "^16.3.0",
|
|
"@types/leaflet": "^1.9.21",
|
|
"@types/leaflet.markercluster": "^1.5.6",
|
|
"@types/ngeohash": "^0.6.8",
|
|
"@types/node": "^22.5.5",
|
|
"@types/qrcode": "^1.5.5",
|
|
"@types/react": "^18.3.1",
|
|
"@types/react-dom": "^18.3.1",
|
|
"@types/three": "^0.185.1",
|
|
"@vitejs/plugin-react-swc": "^3.5.0",
|
|
"@webbtc/webln-types": "^3.0.0",
|
|
"autoprefixer": "^10.4.20",
|
|
"eslint": "^9.9.0",
|
|
"eslint-plugin-react-hooks": "^5.1.0-rc.0",
|
|
"eslint-plugin-react-refresh": "^0.4.9",
|
|
"globals": "^15.9.0",
|
|
"jsdom": "^26.1.0",
|
|
"postcss": "^8.4.47",
|
|
"tailwindcss": "^3.4.11",
|
|
"tsx": "^4.22.4",
|
|
"typescript": "^5.5.3",
|
|
"typescript-eslint": "^8.0.1",
|
|
"vite": "^6.3.5",
|
|
"vitest": "^3.1.4"
|
|
}
|
|
}
|