Pulse/frontend-modern/package.json
rcourtman cc684ab689 Highlight Assistant code blocks once the turn settles (OpenCode parity)
OpenCode syntax-highlights code in the transcript; Pulse rendered
fenced blocks as flat text. Assistant answers are full of shell
commands, configs, and query output, so add highlight.js with an
infra grammar set (bash, json, yaml, ini, sql, dockerfile, nginx):

- Lazy-loaded into its own vendor-highlight chunk; the entry chunk
  stays clean and the chunk only downloads with the rest of the
  preloaded app shell.
- Highlighting runs over the sanitized DOM after the turn settles, so
  generated spans never pass through DOMPurify, streaming morphs are
  never fought, and the class allowlist stays closed to the model. The
  single carve-out is marked's fence-language hint, pattern-pinned to
  language-x on <code> only.
- Token palette maps hljs classes to theme colors readable on the
  dark prose-pre background both app themes share.

Per-block copy is intentionally not added: OpenCode has none, and the
answer-level copy already exists.
2026-06-11 20:58:17 +01:00

84 lines
3.1 KiB
JSON

{
"name": "pulse-modern",
"version": "1.0.0",
"description": "Modern type-safe frontend for Pulse monitoring",
"type": "module",
"author": "rcourtman",
"license": "MIT",
"repository": {
"type": "git",
"url": "https://github.com/rcourtman/Pulse.git"
},
"bugs": {
"url": "https://github.com/rcourtman/Pulse/issues"
},
"homepage": "https://github.com/rcourtman/Pulse",
"scripts": {
"dev": "npm --prefix .. run dev",
"dev:logs": "npm --prefix .. run dev:logs",
"dev:restart": "npm --prefix .. run dev:restart",
"dev:backend-restart": "npm --prefix .. run dev:backend-restart",
"dev:status": "npm --prefix .. run dev:status",
"dev:stop": "npm --prefix .. run dev:stop",
"dev:verify": "npm --prefix .. run dev:verify",
"dev:foreground": "npm --prefix .. run dev:foreground",
"dev:frontend-only": "vite",
"build": "node scripts/build-embed-assets.mjs",
"preview": "vite preview",
"generate-types": "cd ../scripts && go run generate-types.go",
"test": "vitest run",
"test:coverage": "vitest run --coverage --coverage.provider=v8 --coverage.include=src/**/*.ts --coverage.include=src/**/*.tsx --coverage.exclude=src/index.tsx",
"test:coverage:ai": "vitest run --coverage --coverage.provider=v8 --coverage.thresholds.100 --coverage.thresholds.perFile --coverage.include=src/components/AI/aiChatUtils.ts",
"type-check": "tsc --noEmit",
"lint": "npm run lint:eslint && npm run lint:theme && npm run lint:canonical-platforms",
"lint:canonical-platforms": "node scripts/canonical-platform-audit.mjs",
"lint:eslint": "eslint \"src/**/*.{ts,tsx}\"",
"lint:theme": "node scripts/theme-audit.mjs",
"lint:headers": "node scripts/header-audit.mjs",
"lint:fix": "eslint \"src/**/*.{ts,tsx}\" --fix",
"lint:cpd": "jscpd",
"format": "prettier --write \"src/**/*.{ts,tsx,css,json}\"",
"format:check": "prettier --check \"src/**/*.{ts,tsx,css,json}\"",
"check:bundlesize": "node scripts/check-bundle-size.mjs"
},
"dependencies": {
"@solidjs/router": "^0.10.10",
"dompurify": "^3.4.1",
"highlight.js": "^11.11.1",
"lucide-solid": "^0.545.0",
"marked": "^17.0.1",
"qrcode": "^1.5.4",
"solid-js": "^1.8.0"
},
"overrides": {
"seroval": "^1.4.1",
"seroval-plugins": "^1.4.1"
},
"devDependencies": {
"@eslint/js": "^9.39.2",
"@solidjs/testing-library": "^0.8.5",
"@tailwindcss/typography": "^0.5.19",
"@testing-library/jest-dom": "^6.5.0",
"@types/node": "^20.10.0",
"@types/qrcode": "^1.5.6",
"@typescript-eslint/eslint-plugin": "^8.24.0",
"@typescript-eslint/parser": "^8.24.0",
"@vitest/coverage-v8": "^3.2.4",
"autoprefixer": "^10.4.0",
"eslint": "^9.20.0",
"eslint-config-prettier": "^10.0.0",
"eslint-plugin-solid": "^0.14.5",
"globals": "^17.3.0",
"jscpd": "^4.0.8",
"jsdom": "^24.1.0",
"postcss": "^8.5.13",
"prettier": "^3.3.0",
"tailwindcss": "^3.4.18",
"typescript": "^5.3.0",
"typescript-eslint": "^8.54.0",
"vite": "^6.4.2",
"vite-plugin-solid": "^2.8.0",
"vite-plugin-sri-gen": "^1.3.2",
"vitest": "^3.2.4"
}
}