mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-10-19 05:26:47 +00:00
feef872776
Most features have a desktop view and a phone view, and until now each carried its own copy of the feature's logic, so a fix on one side drifted away from the other. With the logic moved into one shared hook per feature, scripts/feature-pairs.json names every feature with its hooks and the desktop and phone files that run on them. lint:pairs fails when a listed view stops importing one of its pair's hooks (a type only import does not count), when a listed file is gone, when a hook sits in a view layer rather than under components, hooks, utils or the folder of a page under pages/, and when a file under src/mobile/screens is in no pair and not under mobileOnly with the reason it has no twin. A new phone screen is so either wired to the desktop feature's hook or marked as phone only on purpose. lint:dup catches the copies that look alike; this one catches the copies written anew. The manifest starts with 120 features and 62 phone only screen files, each with the reason it stays on the phone alone. client/CLAUDE.md says how to change a feature, add one with both views and add a phone screen.
123 lines
4.2 KiB
JSON
123 lines
4.2 KiB
JSON
{
|
|
"name": "@trek/client",
|
|
"version": "4.3.3",
|
|
"engines": {
|
|
"node": "^22.22.2 || ^24.15.0 || >=26.0.0"
|
|
},
|
|
"private": true,
|
|
"type": "module",
|
|
"scripts": {
|
|
"dev": "vite",
|
|
"prebuild": "node scripts/patch-maplibre.mjs && node scripts/generate-icons.mjs",
|
|
"build": "vite build",
|
|
"build:analyze": "vite build --mode analyze",
|
|
"preview": "vite preview",
|
|
"typecheck": "tsc --noEmit",
|
|
"test": "vitest run",
|
|
"test:unit": "vitest run tests/unit",
|
|
"test:integration": "vitest run tests/integration src/**/*.test.{ts,tsx}",
|
|
"test:watch": "vitest",
|
|
"test:coverage": "vitest run --coverage",
|
|
"lint": "eslint .",
|
|
"lint:check": "eslint .",
|
|
"lint:warnings": "node scripts/eslint-ratchet.mjs",
|
|
"lint:pages": "node scripts/check-page-pattern.mjs",
|
|
"lint:rtl": "node scripts/rtl-lint.mjs",
|
|
"lint:size": "node scripts/size-lint.mjs",
|
|
"lint:format": "node scripts/format-lint.mjs",
|
|
"lint:layers": "node scripts/layer-lint.mjs",
|
|
"lint:offline": "node scripts/offline-lint.mjs",
|
|
"lint:dup": "node scripts/dup-lint.mjs",
|
|
"lint:pairs": "node scripts/pairs-lint.mjs",
|
|
"lint:skips": "node scripts/skip-lint.mjs",
|
|
"lint:i18n-keys": "node scripts/i18n-keys.mjs",
|
|
"check:gl-split": "node scripts/check-gl-split.mjs",
|
|
"theme:lint": "node scripts/theme-lint.mjs",
|
|
"theme:lint:strict": "node scripts/theme-lint.mjs --strict",
|
|
"e2e": "playwright test",
|
|
"shots": "playwright test --project=screenshots",
|
|
"help:media": "node e2e/help/run.mjs",
|
|
"help:media:promote": "node e2e/help/promote.mjs",
|
|
"shots:promote": "node e2e/screenshots/promote.mjs",
|
|
"e2e:report": "playwright show-report",
|
|
"format": "prettier --write \"src/**/*.tsx\" \"src/**/*.css\"",
|
|
"format:check": "prettier --check \"src/**/*.tsx\" \"src/**/*.css\"",
|
|
"postinstall": "node scripts/patch-maplibre.mjs",
|
|
"predev": "node scripts/patch-maplibre.mjs"
|
|
},
|
|
"dependencies": {
|
|
"@fontsource/bebas-neue": "^5.3.0",
|
|
"@fontsource/eb-garamond": "^5.3.0",
|
|
"@fontsource/geist-sans": "^5.3.0",
|
|
"@fontsource/inter": "^5.3.0",
|
|
"@fontsource/lora": "^5.3.0",
|
|
"@fontsource/museomoderno": "^5.3.0",
|
|
"@fontsource/playfair-display": "^5.3.0",
|
|
"@fontsource/poppins": "^5.3.0",
|
|
"@mapbox/mapbox-gl-rtl-text": "^0.4.0",
|
|
"@maplibre/maplibre-gl-leaflet": "0.1.4",
|
|
"@simplewebauthn/browser": "^13.3.0",
|
|
"@trek/shared": "*",
|
|
"axios": "^1.20.0",
|
|
"dexie": "^4.4.6",
|
|
"drag-drop-touch": "^1.3.1",
|
|
"heic-to": "^1.5.2",
|
|
"iso-3166-2": "^1.0.0",
|
|
"leaflet": "^1.9.4",
|
|
"lucide-react": "^0.577.0",
|
|
"mapbox-gl": "^3.31.0",
|
|
"maplibre-gl": "5.24.0",
|
|
"plyr": "^3.8.4",
|
|
"react": "^19.3.0",
|
|
"react-dom": "^19.3.0",
|
|
"react-dropzone": "^14.4.1",
|
|
"react-leaflet": "^5.0.0",
|
|
"react-leaflet-cluster": "^4.1.3",
|
|
"react-markdown": "^10.1.0",
|
|
"react-router": "^7.18.4",
|
|
"rehype-sanitize": "^6.0.0",
|
|
"remark-breaks": "^4.0.0",
|
|
"remark-gfm": "^4.0.1",
|
|
"tz-lookup": "^6.1.25",
|
|
"zod": "^4.6.5",
|
|
"zustand": "^5.0.15"
|
|
},
|
|
"devDependencies": {
|
|
"@eslint/js": "^10.0.1",
|
|
"@jscpd/core": "^4.2.5",
|
|
"@jscpd/tokenizer": "^4.2.6",
|
|
"@playwright/test": "^1.63.0",
|
|
"@testing-library/jest-dom": "^6.10.0",
|
|
"@testing-library/react": "^16.3.3",
|
|
"@testing-library/user-event": "^14.6.7",
|
|
"@trivago/prettier-plugin-sort-imports": "^6.0.2",
|
|
"@types/leaflet": "^1.9.22",
|
|
"@types/node": "^25.9.8",
|
|
"@types/react": "^19.3.0",
|
|
"@types/react-dom": "^19.3.0",
|
|
"@vitejs/plugin-react": "^6.1.1",
|
|
"@vitest/coverage-v8": "^4.1.11",
|
|
"autoprefixer": "^10.6.1",
|
|
"eslint": "^10.11.0",
|
|
"eslint-config-flat-gitignore": "^2.4.0",
|
|
"eslint-config-prettier": "^10.1.8",
|
|
"eslint-plugin-react-hooks": "^7.1.1",
|
|
"eslint-plugin-react-refresh": "^0.5.7",
|
|
"fake-indexeddb": "^6.2.5",
|
|
"jsdom": "^29.1.1",
|
|
"msw": "^2.15.0",
|
|
"postcss": "^8.5.28",
|
|
"prettier": "^3.9.8",
|
|
"prettier-plugin-organize-imports": "^4.3.0",
|
|
"prettier-plugin-tailwindcss": "^0.8.1",
|
|
"rollup-plugin-visualizer": "^7.1.1",
|
|
"sharp": "^0.35.4",
|
|
"tailwindcss": "^3.4.19",
|
|
"typescript": "^6.0.3",
|
|
"typescript-eslint": "^8.70.0",
|
|
"vite": "8.3.0",
|
|
"vite-plugin-pwa": "^1.3.0",
|
|
"vitest": "^4.1.11"
|
|
}
|
|
}
|