Files
crewli/apps/app/package.json
bert.hausmans 5771a678ef chore: install ts-reset in both portal and app SPAs
Installs @total-typescript/ts-reset 0.6.1 as a dev-dependency in
apps/portal/ and apps/app/. Patches TypeScript's loosest default
types: Array.filter(Boolean) returns non-nullable, JSON.parse
returns unknown, fetch().json() returns unknown, Map.get() strict,
etc.

Configuration: src/reset.d.ts in each SPA imports the reset. Both
tsconfig.json files already include ./src/**/* so the .d.ts is
picked up automatically — no tsconfig edits needed.

Issues surfaced during install:
  - apps/app — 0 pre-install tsc errors in own code; install
    surfaced 2 errors in src/stores/useImpersonationStore.ts
    (both from JSON.parse on sessionStorage content returning
    unknown instead of any). Fixed inline at lines 19 + 123 via
    `as ImpersonationState` casts that make the existing
    trust-in-sessionStorage explicit. Backlog entry
    TECH-TS-IMPERSONATION tracks proper runtime shape validation.
  - apps/portal — 22 pre-existing tsc errors in own code (mostly
    tiptap editor components — tracked as TECH-TS-PORTAL-TSC,
    unrelated to ts-reset). Zero new errors in portal's own code.
    4 additional errors surfaced in tiptap's uncompiled node_modules
    .ts sources (third-party); left as-is.

Neither SPA achieves `tsc --noEmit` clean today — pre-existing
state unrelated to this work package. Build + vitest are the
actual working gates and both remain green:
  - apps/portal: vitest 113/113 passing; production build succeeds
  - apps/app:    (no vitest setup — tracked as TECH-APP-VITEST);
                 production build succeeds

Documentation: /dev-docs/FRONTEND-TOOLING.md added; CLAUDE.md
quality-gates updated.

Backlog: TECH-TS-IMPERSONATION (runtime validation of stored
impersonation state), TECH-TS-PORTAL-TSC (pre-existing portal tsc
errors), TECH-APP-VITEST (Vitest coverage for apps/app).

No production behavior change.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 03:58:11 +02:00

141 lines
4.3 KiB
JSON

{
"name": "crewli-app",
"version": "9.5.0",
"private": true,
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview --port 5050",
"typecheck": "vue-tsc --noEmit",
"lint": "eslint . -c .eslintrc.cjs --fix --ext .ts,.js,.cjs,.vue,.tsx,.jsx",
"build:icons": "tsx src/plugins/iconify/build-icons.ts",
"msw:init": "msw init public/ --save",
"postinstall": "npm run build:icons && npm run msw:init"
},
"dependencies": {
"@casl/ability": "6.7.3",
"@casl/vue": "2.2.2",
"@floating-ui/dom": "1.6.8",
"@sindresorhus/is": "7.1.0",
"@tanstack/vue-query": "^5.95.2",
"@tiptap/extension-highlight": "^2.27.1",
"@tiptap/extension-image": "^2.27.1",
"@tiptap/extension-link": "^2.27.1",
"@tiptap/extension-text-align": "^2.27.1",
"@tiptap/pm": "^2.27.1",
"@tiptap/starter-kit": "^2.27.1",
"@tiptap/vue-3": "^2.27.1",
"@vee-validate/zod": "^4.15.1",
"@vueuse/core": "10.11.1",
"@vueuse/math": "10.11.1",
"apexcharts": "3.54.1",
"axios": "^1.15.0",
"chart.js": "4.5.1",
"cookie-es": "1.2.2",
"destr": "2.0.5",
"eslint-plugin-regexp": "2.10.0",
"jwt-decode": "4.0.0",
"mapbox-gl": "3.5.2",
"ofetch": "1.5.0",
"pinia": "3.0.3",
"prismjs": "1.30.0",
"qrcode": "^1.5.4",
"roboto-fontface": "0.10.0",
"shepherd.js": "13.0.3",
"ufo": "1.6.1",
"unplugin-vue-define-options": "1.5.5",
"vee-validate": "^4.15.1",
"vue": "3.5.22",
"vue-chartjs": "5.3.2",
"vue-flatpickr-component": "11.0.5",
"vue-i18n": "11.1.12",
"vue-prism-component": "2.0.0",
"vue-router": "4.5.1",
"vue3-apexcharts": "1.5.3",
"vue3-perfect-scrollbar": "2.0.0",
"vuedraggable": "^4.1.0",
"vuetify": "3.10.8",
"webfontloader": "1.6.28",
"zod": "3"
},
"devDependencies": {
"@antfu/eslint-config-vue": "0.43.1",
"@antfu/utils": "0.7.10",
"@fullcalendar/core": "6.1.19",
"@fullcalendar/daygrid": "6.1.19",
"@fullcalendar/interaction": "6.1.19",
"@fullcalendar/list": "6.1.19",
"@fullcalendar/timegrid": "6.1.19",
"@fullcalendar/vue3": "6.1.19",
"@iconify-json/fa": "1.2.2",
"@iconify-json/mdi": "1.2.3",
"@iconify-json/tabler": "1.2.23",
"@iconify/tools": "4.1.4",
"@iconify/types": "^2.0.0",
"@iconify/utils": "2.3.0",
"@iconify/vue": "4.1.2",
"@intlify/unplugin-vue-i18n": "11.0.1",
"@stylistic/stylelint-config": "1.0.1",
"@stylistic/stylelint-plugin": "2.1.3",
"@tiptap/extension-character-count": "^2.27.1",
"@tiptap/extension-placeholder": "^2.27.1",
"@tiptap/extension-subscript": "^2.27.1",
"@tiptap/extension-superscript": "^2.27.1",
"@tiptap/extension-underline": "^2.27.1",
"@total-typescript/ts-reset": "^0.6.1",
"@types/mapbox-gl": "3.4.1",
"@types/node": "24.9.2",
"@types/qrcode": "^1.5.6",
"@types/webfontloader": "1.6.38",
"@typescript-eslint/eslint-plugin": "7.18.0",
"@typescript-eslint/parser": "7.18.0",
"@vitejs/plugin-vue": "6.0.1",
"@vitejs/plugin-vue-jsx": "5.1.1",
"baseline-browser-mapping": "^2.10.16",
"eslint": "8.57.1",
"eslint-config-airbnb-base": "15.0.0",
"eslint-import-resolver-typescript": "3.10.1",
"eslint-plugin-case-police": "0.6.1",
"eslint-plugin-import": "2.32.0",
"eslint-plugin-promise": "6.6.0",
"eslint-plugin-regex": "1.10.0",
"eslint-plugin-sonarjs": "0.24.0",
"eslint-plugin-unicorn": "51.0.1",
"eslint-plugin-vue": "9.33.0",
"msw": "2.6.8",
"postcss-html": "1.8.0",
"postcss-scss": "4.0.9",
"sass": "1.76.0",
"shiki": "1.29.2",
"stylelint": "16.8.0",
"stylelint-config-idiomatic-order": "10.0.0",
"stylelint-config-standard-scss": "13.1.0",
"stylelint-use-logical-spec": "5.0.1",
"tsx": "4.20.6",
"type-fest": "5.1.0",
"typescript": "5.9.3",
"unplugin-auto-import": "0.18.6",
"unplugin-vue-components": "0.27.5",
"unplugin-vue-router": "0.8.8",
"vite": "7.1.12",
"vite-plugin-vue-devtools": "8.0.2",
"vite-plugin-vue-meta-layouts": "0.6.1",
"vite-plugin-vuetify": "2.1.2",
"vite-svg-loader": "5.1.0",
"vue-shepherd": "3.0.0",
"vue-tsc": "3.1.2"
},
"resolutions": {
"postcss": "^8",
"@tiptap/core": "^2"
},
"overrides": {
"postcss": "^8",
"@tiptap/core": "^2"
},
"msw": {
"workerDirectory": "public"
}
}