{
    "name": "marty-web-app",
    "version": "3.23.22",
    "private": true,
    "engines": {
        "node": ">=20"
    },
    "dependencies": {
        "@radix-ui/react-dropdown-menu": "^2.1.2",
        "@radix-ui/react-icons": "^1.3.2",
        "@robdobsn/raftjs": "^2.4.1",
        "@robotical/appv2-analytics-gatherer": "^1.2.17",
        "@robotical/appv2-analytics-types": "^1.2.17",
        "@robotical/appv2-warranty-service-lib": "^1.2.19",
        "@robotical/codewheel": "^0.1.10",
        "@robotical/cog-shooter-game": "^0.1.27",
        "@robotical/jumping-game": "^0.1.29",
        "@robotical/martyblocks": "^4.0.75",
        "@robotical/martyblocksjr": "^4.5.5",
        "@robotical/maze": "^0.1.22",
        "@robotical/rc-sequencer": "^1.1.15",
        "@robotical/ricjs-robotical-addons": "^1.2.8",
        "@robotical/robofly-game": "^0.1.25",
        "@robotical/roboticaljs": "^1.1.27",
        "@robotical/sensors-dashboard": "^2.2.3",
        "@robotical/skiing-game": "^0.1.29",
        "@robotical/space-shooter-game": "^0.1.15",
        "@sentry/react": "^8.55.2",
        "@yudiel/react-qr-scanner": "2.6.0",
        "aws-sdk": "^2.1394.0",
        "bowser": "^2.11.0",
        "core-js": "^3.6.5",
        "gaa": "^0.0.0",
        "http-server": "^14.1.0",
        "i18next": "^22.4.14",
        "local-devices": "^3.2.0",
        "react": "^18.2.0",
        "react-device-detect": "^2.2.3",
        "react-dom": "^18.2.0",
        "react-i18next": "^12.3.1",
        "react-icons": "^4.8.0",
        "react-rnd": "^10.4.1",
        "react-router-dom": "^6.2.2",
        "react-scripts": "^5.0.1",
        "react-toastify": "^9.0.8",
        "react-tooltip": "^4.2.21",
        "semver": "^7.3.7",
        "styled-components": "^5.3.3",
        "typescript": "^4.6.2",
        "web-vitals": "^2.1.4",
        "zxing-wasm": "3.1.1"
    },
    "scripts": {
        "copy-space-shooter-assets": "node copy-space-shooter-assets.js",
        "copy-qr-wasm": "shx rm -rf ./public/qr-scanner && shx mkdir -p ./public/qr-scanner && shx cp ./node_modules/zxing-wasm/dist/reader/zxing_reader.wasm ./public/qr-scanner/zxing_reader.wasm",
        "copy-mb": "shx rm -rf ./public/MartyBlocks && shx mkdir -p ./public/MartyBlocks && shx cp -r ./node_modules/@robotical/martyblocks/dist/. ./public/MartyBlocks/",
        "copy-mbjr": "shx rm -rf ./public/MartyBlocksJR && shx mkdir -p ./public/MartyBlocksJR && shx cp -r ./node_modules/@robotical/martyblocksjr/editions/free/src/. ./public/MartyBlocksJR/",
        "clean-mb": "shx rm -r ./node_modules/@robotical/martyblocks",
        "clean-mbjr": "shx rm -r ./node_modules/@robotical/martyblocksjr",
        "transpile-public-legacy": "node scripts/transpile-public-legacy.js",
        "postinstall": "patch-package",
        "prepare": "npm run copy-mb && npm run copy-mbjr && npm run copy-space-shooter-assets && npm run copy-qr-wasm && NODE_OPTIONS=\"--max-old-space-size=8192\" npm run transpile-public-legacy",
        "prestart": "npm run copy-qr-wasm",
        "start": "react-scripts start",
        "start-pwa": "http-server build -c-1 -p 3001 --directory build",
        "prebuild": "npm run copy-qr-wasm",
        "build": "react-scripts build",
        "prebuild:prod": "npm run copy-qr-wasm",
        "build:prod": "GENERATE_SOURCEMAP=false react-scripts build && tsc --project tsconfig.prod.json",
        "prebuild:sentry": "npm run copy-qr-wasm",
        "build:sentry": "GENERATE_SOURCEMAP=true react-scripts build && tsc --project tsconfig.prod.json",
        "sentry:upload-sourcemaps": "sentry-cli sourcemaps inject build/static/js && sentry-cli sourcemaps upload --release \"marty-web-app@$npm_package_version\" --validate --strict --wait build/static/js",
        "sentry:remove-sourcemaps": "find build/static/js -type f -name '*.map' -delete",
        "build:types": "tsc --project tsconfig.types.json",
        "test": "react-scripts test",
        "eject": "react-scripts eject",
        "test:e2e-legacy": "npm run prepare && node tests/e2e/legacy-bundles.e2e.js",
        "test:e2e-martyblocks-connection": "npm run transpile-public-legacy && node tests/e2e/martyblocks-connection.e2e.js",
        "test:e2e-martyblocks-connect": "npm run transpile-public-legacy && node tests/e2e/martyblocks-connection.e2e.js --scenario=connect",
        "test:e2e-martyblocks-load-autosave": "npm run transpile-public-legacy && node tests/e2e/martyblocks-connection.e2e.js --scenario=load-autosave",
        "test:e2e-martyblocks-decline-autosave": "npm run transpile-public-legacy && node tests/e2e/martyblocks-connection.e2e.js --scenario=decline-autosave",
        "test:e2e-martyblocks-local-save-load": "npm run transpile-public-legacy && node tests/e2e/martyblocks-connection.e2e.js --scenario=local-save-load",
        "test:e2e-martyblocks-cloud-save-load": "npm run transpile-public-legacy && node tests/e2e/martyblocks-connection.e2e.js --scenario=cloud-save-load",
        "test:e2e-martyblocks-portable-save-load": "npm run transpile-public-legacy && node tests/e2e/martyblocks-connection.e2e.js --scenario=portable-save-load",
        "test:e2e-martyblocks-machine-learning": "npm run copy-mb && npm run transpile-public-legacy && node tests/e2e/martyblocks-machine-learning.e2e.js",
        "test:e2e-martyblocks-save-load": "npm run transpile-public-legacy && node tests/e2e/martyblocks-save-load.e2e.js",
        "test:e2e-martyblocks-tutorials": "npm run transpile-public-legacy && node tests/e2e/martyblocks-tutorials.e2e.js",
        "test:e2e-martyblocks-real-device-tools": "npm run transpile-public-legacy && node tests/e2e/martyblocks-real-device-tools.e2e.js",
        "test:e2e-cog-connectivity-real-device": "node tests/e2e/cog-connectivity-real-device.e2e.js",
        "test:e2e-martyblocks-audio-streaming": "npm run transpile-public-legacy && COG_E2E_SCENARIOS=marty-blocks-audio-streaming node tests/e2e/cog-connectivity-real-device.e2e.js",
        "test:e2e-martyblocks-sensor-dashboard": "npm run transpile-public-legacy && node tests/e2e/martyblocks-sensor-dashboard.e2e.js",
        "test:e2e-sensor-dashboard": "node tests/e2e/sensor-dashboard.e2e.js",
        "test:e2e-accessibility": "node tests/e2e/accessibility-aa-audit.e2e.js",
        "test:accessibility-review": "node tests/e2e/accessibility-review.e2e.js",
        "test:accessibility-review:blocksjr": "npm run prepare && node tests/e2e/accessibility-review.e2e.js --batch=blocksjr",
        "test:visual-review": "npm run prepare && node tests/e2e/visual-review.e2e.js",
        "test:visual-review:non-bt-1-5": "node tests/e2e/visual-review.e2e.js --batch=non-bt-1-5",
        "test:visual-review:non-bt-5-10": "npm run prepare && node tests/e2e/visual-review.e2e.js --batch=non-bt-5-10",
        "test:visual-review:connection-flow": "npm run prepare && node tests/e2e/visual-review.e2e.js --batch=connection-flow",
        "test:visual-review:connection-flow:devices:auto": "node tests/e2e/visual-review.e2e.js --batch=connection-flow --devices --devices-only --auto-connect --no-auto-verify",
        "test:visual-review:blocksjr-sequence": "npm run prepare && node tests/e2e/visual-review.e2e.js --batch=blocksjr-sequence",
        "test:visual-review:blocksjr-click-through": "node tests/e2e/visual-review.e2e.js --batch=blocksjr-click-through",
        "test:visual-review:blocksjr-sequence:devices:auto": "npm run prepare && node tests/e2e/visual-review.e2e.js --batch=blocksjr-sequence --devices --devices-only --auto-connect --auto-verify",
        "test:visual-review:blocks-sequence": "node tests/e2e/visual-review.e2e.js --batch=blocks-sequence",
        "test:visual-review:blocks-sequence:devices:auto": "node tests/e2e/visual-review.e2e.js --batch=blocks-sequence --devices --devices-only --auto-connect --auto-verify",
        "test:visual-review:blocks-all-screens": "node tests/e2e/visual-review.e2e.js --batch=blocks-all-screens",
        "test:visual-review:blocks-all-screens:devices:auto": "node tests/e2e/visual-review.e2e.js --batch=blocks-all-screens --devices --devices-only --auto-connect --auto-verify",
        "test:visual-review:bt-1-2:auto": "node tests/e2e/visual-review.e2e.js --batch=bt-1-2 --devices --devices-only --auto-connect --auto-verify",
        "test:visual-review:bt-3-cog-games:auto": "node tests/e2e/visual-review.e2e.js --batch=bt-3-cog-games --devices --devices-only --auto-connect --auto-verify",
        "test:visual-review:bt-4-marty-settings:auto": "node tests/e2e/visual-review.e2e.js --batch=bt-4-marty-settings --devices --devices-only --auto-connect --auto-verify",
        "test:visual-review:devices": "npm run prepare && node tests/e2e/visual-review.e2e.js --devices",
        "test:visual-review:devices:auto": "npm run prepare && node tests/e2e/visual-review.e2e.js --devices --auto-connect --auto-verify",
        "test:visual-review:bluetooth:auto": "node tests/e2e/visual-review.e2e.js --devices-only --auto-connect --auto-verify",
        "lint:a11y:wave1": "node scripts/accessibility/lint-a11y.mjs",
        "lint:a11y": "node scripts/accessibility/lint-a11y-global.mjs",
        "a11y:contrast": "node scripts/accessibility/contrast-check.mjs",
        "a11y:structure": "node scripts/accessibility/non-semantic-check.mjs",
        "a11y:ci": "npm run lint:a11y && npm run a11y:contrast && npm run a11y:structure"
    },
    "eslintConfig": {
        "extends": [
            "react-app",
            "react-app/jest"
        ]
    },
    "browserslist": {
        "production": [
            ">0.2%",
            "not dead",
            "not op_mini all"
        ],
        "development": [
            "last 1 chrome version",
            "last 1 firefox version",
            "last 1 safari version"
        ]
    },
    "devDependencies": {
        "@babel/cli": "^7.25.7",
        "@babel/core": "^7.25.7",
        "@babel/preset-env": "^7.25.7",
        "@sentry/cli": "2.58.6",
        "@types/jest": "^27.4.1",
        "@types/node": "^16.18.3",
        "@types/react": "^18.0.25",
        "@types/react-dom": "^18.0.9",
        "@types/semver": "^7.3.9",
        "@types/styled-components": "^5.1.24",
        "@types/web-bluetooth": "^0.0.14",
        "axe-core": "^4.11.2",
        "csv-parse": "^5.6.0",
        "fs-extra": "^11.3.0",
        "patch-package": "^8.0.1",
        "puppeteer": "^24.42.0",
        "react-native": "file:./stubs/react-native",
        "react-native-ble-plx": "file:./stubs/react-native-ble-plx",
        "shx": "^0.3.4"
    },
    "overrides": {
        "react-refresh": "0.14.2"
    }
}
