Files
5chan/package.json
T
Tommaso CasaburiandGitHub f5039285a7 fix(p2p stats): improve own-IP geolocation and world map accuracy (#1138)
* fix(p2p stats): improve own-IP geolocation and world map accuracy

Resolve the user's public endpoint when libp2p only advertises private listen addresses, look up an accurate country flag for "Your IP", snap peer markers to country centroids, and add leeching seeder link plus panel layout tweaks.

* fix(p2p stats): skip caching own-IP lookups cancelled by abort

When the P2P stats panel unmounts mid-request, its AbortSignal cancels
the in-flight fetchOwnPublicEndpoint / fetchOwnIpCountryCode calls. Those
empty results were still cached for 30-60s, so reopening the panel within
that window showed "Your IP" as unavailable or without a country flag even
though nothing had actually failed. Skip caching when the signal aborted so
a later open retries. Addresses Cursor Bugbot finding.
2026-05-23 22:47:41 +07:00

263 lines
12 KiB
JSON

{
"name": "5chan",
"version": "0.8.5",
"packageManager": "yarn@4.13.0",
"description": "A Bitsocial client with an imageboard UI",
"type": "module",
"author": "Bitsocial Forge",
"license": "GPL-3.0-or-later",
"private": true,
"dependencies": {
"@bbob/parser": "4.3.1",
"@bitsocial/bitsocial-react-hooks": "0.1.11",
"@capacitor/app": "7.0.1",
"@capacitor/browser": "7.0.5",
"@capacitor/status-bar": "7.0.1",
"@capawesome/capacitor-android-edge-to-edge-support": "7.2.2",
"@chenglou/pretext": "0.0.5",
"@floating-ui/react": "0.26.1",
"@pkcprotocol/pkc-js": "0.0.35",
"@react-spring/web": "10.0.3",
"@types/node": "20.19.37",
"@types/react": "18.2.25",
"@types/react-dom": "18.2.10",
"@use-gesture/react": "10.3.1",
"@vercel/analytics": "^1.6.1",
"ace-builds": "1.41.0",
"cross-env": "7.0.3",
"electron-context-menu": "3.3.0",
"electron-is-dev": "2.0.0",
"env-paths": "3.0.0",
"fs-extra": "11.3.0",
"http-proxy": "1.18.1",
"i18next": "25.10.9",
"i18next-browser-languagedetector": "7.1.0",
"i18next-http-backend": "3.0.5",
"json-stringify-pretty-compact": "4.0.0",
"lodash": "4.18.0",
"memoizee": "0.4.15",
"react": "19.1.2",
"react-ace": "14.0.1",
"react-dom": "19.1.2",
"react-i18next": "16.6.6",
"react-router-dom": "6.30.2",
"react-router-hash-link": "2.4.3",
"react-virtuoso": "4.18.5",
"tcp-port-used": "1.0.2",
"typescript": "6.0.2",
"workbox-core": "7.4.0",
"workbox-expiration": "7.4.0",
"workbox-precaching": "7.4.0",
"workbox-routing": "7.4.0",
"workbox-strategies": "7.4.0",
"zustand": "4.4.3"
},
"scripts": {
"generate:assets": "node scripts/generate-asset-manifest.js",
"llms:generate": "node scripts/generate-llms-files.mjs",
"map:generate": "node scripts/generate-world-map-dots.mjs",
"centroids:generate": "node scripts/generate-country-centroids.mjs",
"release:manifest": "node scripts/generate-release-manifest.mjs",
"release:manifest:keygen": "node scripts/generate-release-manifest-keypair.mjs",
"sync:directories": "node scripts/sync-directories.js",
"postinstall": "node scripts/patch-capacitor-cli-tar.cjs",
"prebuild": "corepack yarn sync:directories && corepack yarn generate:assets",
"prestart": "corepack yarn sync:directories && corepack yarn generate:assets",
"start": "node scripts/start-dev.js",
"start:android-usb": "node scripts/start-android-usb.mjs",
"build": "cross-env PUBLIC_URL=./ GENERATE_SOURCEMAP=false vite build",
"build:fdroid": "cross-env PUBLIC_URL=./ GENERATE_SOURCEMAP=false VITE_APP_DISTRIBUTION=fdroid vite build",
"build:preload": "vite build --config electron/vite.preload.config.js",
"build-vercel": "cross-env NODE_OPTIONS=\"--max_old_space_size=4096\" PUBLIC_URL=./ GENERATE_SOURCEMAP=true VITE_COMMIT_REF=$COMMIT_REF CI='' vite build",
"test": "vitest",
"test:leaks": "vitest run --detectAsyncLeaks",
"preview": "vite preview",
"analyze-bundle": "cross-env PUBLIC_URL=./ GENERATE_SOURCEMAP=true vite build && npx source-map-explorer 'dist/assets/*.js'",
"electron": "corepack yarn build:preload && corepack yarn electron:before && electron .",
"electron:no-delete-data": "corepack yarn build:preload && electron .",
"electron:start": "concurrently \"cross-env BROWSER=none PORTLESS=0 PORT=3000 corepack yarn start\" \"wait-on http://localhost:3000 && corepack yarn electron\"",
"electron:start:no-delete-data": "concurrently \"cross-env BROWSER=none PORTLESS=0 PORT=3000 corepack yarn start\" \"wait-on http://localhost:3000 && corepack yarn electron:no-delete-data\"",
"electron:rebuild-native": "electron-rebuild -f -o better-sqlite3",
"electron:verify-native": "node scripts/verify-electron-native-modules.js",
"electron:prepare-package": "corepack yarn electron:rebuild-native && corepack yarn electron:verify-native",
"electron:package": "corepack yarn build && corepack yarn build:preload && corepack yarn electron:prepare-package && electron-forge package",
"electron:build": "corepack yarn build && corepack yarn build:preload && corepack yarn electron:prepare-package && electron-forge make",
"electron:build:linux": "corepack yarn build && corepack yarn build:preload && corepack yarn electron:prepare-package && electron-forge make --platform=linux",
"electron:build:mac": "corepack yarn build && corepack yarn build:preload && corepack yarn electron:prepare-package && electron-forge make --platform=darwin",
"electron:build:windows": "corepack yarn build && corepack yarn build:preload && corepack yarn electron:prepare-package && electron-forge make --platform=win32",
"electron:build:linux:x64": "corepack yarn build && corepack yarn build:preload && corepack yarn electron:prepare-package && electron-forge make --platform=linux --arch=x64",
"electron:build:linux:arm64": "corepack yarn build && corepack yarn build:preload && corepack yarn electron:prepare-package && electron-forge make --platform=linux --arch=arm64",
"electron:build:mac:x64": "corepack yarn build && corepack yarn build:preload && corepack yarn electron:prepare-package && electron-forge make --platform=darwin --arch=x64",
"electron:build:mac:arm64": "corepack yarn build && corepack yarn build:preload && corepack yarn electron:prepare-package && electron-forge make --platform=darwin --arch=arm64",
"electron:before": "corepack yarn electron:before:delete-data",
"electron:before:delete-data": "node scripts/clear-local-pkc-data.mjs",
"test:update:e2e:electron": "node scripts/run-electron-app-update-e2e.mjs",
"test:thread-auto-update:e2e": "node scripts/run-thread-auto-update-e2e.mjs --start-dev",
"android:build:icons": "cordova-res android --skip-config --copy --resources /tmp/bitsocial-react-android-icons --icon-source ./android/icons/icon.png --splash-source ./android/icons/splash.png --icon-foreground-source ./android/icons/icon-foreground.png --icon-background-source '#ffffee'",
"knip": "knip --production --include dependencies,unlisted,binaries --no-progress",
"knip:full": "knip --no-progress --no-exit-code",
"lint": "oxlint src/**/*.{js,ts,tsx}",
"type-check": "tsgo --noEmit",
"prettier": "oxfmt src/**/*.{js,ts,tsx} electron/**/*.{js,mjs}",
"changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0",
"android:build": "corepack yarn build && corepack yarn cap sync android && corepack yarn cap run android --flavor github",
"i18n:update": "node scripts/update-translations.js",
"i18n:update:dry": "node scripts/update-translations.js --dry",
"doctor": "react-doctor . -y",
"doctor:score": "react-doctor . --score -y",
"doctor:verbose": "react-doctor . --verbose -y",
"doctor:badge": "node scripts/write-react-doctor-badge.mjs",
"contract:imgur": "cd android && ./gradlew :app:connectedDebugAndroidTest -Pandroid.experimental.androidTest.useUnifiedTestPlatform=false -Pandroid.testInstrumentationRunnerArguments.class=fivechan.android.MediaUploadAutomationRunnerTest",
"smoke:upload-selectors": "node scripts/smoke-upload-selectors.js",
"test:coverage": "vitest run --fileParallelism=false --coverage.enabled --coverage.provider=istanbul --coverage.reporter=text --coverage.reporter=json --coverage.reporter=json-summary --coverage.reportsDirectory=./coverage",
"test:coverage:changed": "vitest run --changed master --fileParallelism=false --coverage.enabled --coverage.provider=istanbul --coverage.reporter=text --coverage.reporter=json --coverage.reporter=json-summary --coverage.reportsDirectory=./coverage",
"retest:quality": "corepack yarn test && corepack yarn build && corepack yarn lint && corepack yarn type-check && corepack yarn doctor",
"blotter": "node scripts/update-blotter.js",
"blotter:check": "node scripts/update-blotter.js check",
"blotter:release": "node scripts/update-blotter.js release",
"blotter:manual": "node scripts/update-blotter.js manual",
"android:connectedTest": "cd android && ./gradlew :app:connectedDebugAndroidTest -Pandroid.experimental.androidTest.useUnifiedTestPlatform=false"
},
"browserslist": {
"production": [
"chrome >= 67",
"edge >= 79",
"firefox >= 68",
"opera >= 54",
"safari >= 14"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
},
"devDependencies": {
"@capacitor/android": "7.4.5",
"@capacitor/cli": "7.4.5",
"@capacitor/core": "7.4.5",
"@electron-forge/cli": "7.8.0",
"@electron-forge/maker-dmg": "7.8.0",
"@electron-forge/maker-squirrel": "7.8.0",
"@electron-forge/maker-zip": "7.8.0",
"@electron/rebuild": "3.7.2",
"@reforged/maker-appimage": "5.1.1",
"@types/lodash": "4.17.24",
"@types/memoizee": "0.4.9",
"@typescript/native-preview": "^7.0.0-dev.20251226.1",
"@vitejs/plugin-react": "6.0.0",
"@vitest/coverage-istanbul": "4.1.0",
"assert": "2.1.0",
"babel-plugin-react-compiler": "1.0.0",
"buffer": "6.0.3",
"concurrently": "8.0.1",
"conventional-changelog-cli": "4.1.0",
"cordova-res": "0.15.4",
"crypto-browserify": "3.12.1",
"cz-conventional-changelog": "3.3.0",
"decompress": "4.2.1",
"electron": "39.8.7",
"element-source": "0.0.4",
"husky": "4.3.8",
"isomorphic-fetch": "3.0.0",
"jsdom": "28.1.0",
"knip": "6.1.0",
"lint-staged": "12.3.8",
"node-fetch": "3.3.2",
"oxfmt": "0.20.0",
"oxlint": "1.35.0",
"playwright": "1.56.1",
"progress": "2.0.3",
"react-doctor": "0.1.4",
"react-grab": "0.1.32",
"react-scan": "0.5.3",
"stream-browserify": "3.0.0",
"vite": "8.0.5",
"vite-plugin-pwa": "1.2.0",
"vitest": "4.1.0",
"wait-on": "9.0.3",
"workbox-build": "7.4.0",
"workbox-window": "7.4.0"
},
"optionalDependencies": {
"portless": "0.11.1"
},
"resolutions": {
"follow-redirects": "1.16.0",
"@libp2p/kad-dht": "16.2.6",
"brace-expansion@npm:^5.0.2": "5.0.6",
"protobufjs": "7.5.8",
"@protobufjs/utf8": "1.1.1",
"@babel/plugin-transform-modules-systemjs": "7.29.4",
"axios": "1.15.2",
"js-yaml": "4.1.1",
"baseline-browser-mapping": "^2.9.11",
"vite": "8.0.5",
"qs": "6.15.0",
"mdast-util-to-hast": "12.3.0",
"node-forge": "1.4.0",
"glob": "10.5.0",
"tmp": "0.2.5",
"elliptic": "6.6.1",
"ws": "8.20.1",
"jose": "4.15.9",
"sharp": "0.34.5",
"cacache": "19.0.1",
"preact": "10.27.3",
"@remix-run/router": "1.23.2",
"undici": "7.24.0",
"diff": "^8.0.3",
"lodash": "4.18.0",
"@xmldom/xmldom": "0.8.13",
"ajv@npm:^8.6.0": "8.18.0",
"ajv@npm:^8.11.0": "8.18.0",
"fast-uri": "3.1.2",
"ip-address": "10.1.1",
"bn.js@npm:^4.0.0": "4.12.3",
"bn.js@npm:^4.1.0": "4.12.3",
"bn.js@npm:^4.11.9": "4.12.3",
"bn.js@npm:^5.2.1": "5.2.3",
"bn.js@npm:^5.2.2": "5.2.3",
"minimatch@npm:^3.0.5": "3.1.4",
"seroval": "1.4.1",
"smol-toml": "1.6.1",
"tar": "7.5.11",
"yauzl": "3.2.1",
"serialize-javascript": "7.0.5",
"@tootallnate/once": "3.0.1",
"rollup": "2.80.0",
"@electron/asar": "4.0.1",
"uuid@npm:^8.3.2": "14.0.0",
"uuid@npm:^11.0.0": "14.0.0",
"uuid@npm:11.1.0": "14.0.0",
"uuid@npm:13.0.0": "14.0.0",
"yaml@npm:^1.10.0": "1.10.3",
"yaml@npm:^1.10.2": "1.10.3",
"yaml@npm:^2.8.2": "2.8.3",
"use-sync-external-store": "1.6.0"
},
"main": "electron/main.js",
"lint-staged": {
"src/**/*.{js,ts,tsx}": [
"oxfmt --write"
],
"electron/**/*.{js,mjs}": [
"oxfmt --write"
]
},
"husky": {
"hooks": {
"prepare-commit-msg": "exec < /dev/tty && cz --hook || true",
"pre-commit": "lint-staged"
}
},
"config": {
"commitizen": {
"path": "./node_modules/cz-conventional-changelog"
}
},
"reactDoctor": {
"diff": false
}
}