5d8083f8ff
Третий шаг #345: клиентская вставка markdown переезжает с marked-слоя editor-ext (не знал канона — ^[…], <!--img {…}-->, <!--subpages--> при вставке не распознавались) на канонический пакет. По завершении слой удалён целиком. closes #347 - Browser-entry пакета (инъекция DOM-парсера): jsdom только в Node-пути. dom-parser.ts — 2 слота инъекции (HtmlDocumentParser для HTML→Document, GenerateJsonFn для @tiptap/html), без импорта DOM. dom-parser.node.ts регистрирует jsdom + @tiptap/html/server; dom-parser.browser.ts — нативный DOMParser + @tiptap/html (browser), экспонирован через exports-условие "browser" + сабпас "./browser". markdown-to-prosemirror.ts: убраны статический импорт jsdom и module-level global.window-шим. Клиент ВСЕГДА импортирует явный сабпас /browser — не полагается на порядок условий. Node-потребители (mcp/ server) идут по "." → default → index.js → jsdom, не затронуты. - markdown-clipboard.ts: конвертация через browser-entry (markdownToProseMirror → PM-JSON → HTML через живую схему редактора DOMSerializer → НЕИЗМЕНЁННЫЙ downstream-шов normalizeTableColumnWidths→parseSlice→canonicalizePastedFootnotes →dispatch). Эвристики/fragment-insertion не тронуты. Конвертер async → handle Paste захватывает диапазон, забирает событие, диспатчит на резолве; и success, и fail-open ветки защищены guard'ом doc!==startDoc (не диспатчить по устаревшему диапазону). clipboardTextSerializer (copy PM→md) — через convertProseMirror ToMarkdown. - Удалён packages/editor-ext/src/lib/markdown/ целиком (+ marked из package.json). Мигрированы ВСЕ потребители markdownToHtml/htmlToMarkdown: ai-chat/utils/ markdown.ts (→ новый markdownToProseMirrorSync + DOMSerializer), use-generate- page-title.ts / page-header-menu.tsx (→ convertProseMirrorToMarkdown(getJSON)), серверный spec. Grep: осиротевших импортов нет, editor-ext = только схема/ расширения. Turndown ушёл из бандла (был в старом htmlToMarkdown). - AI-чат теперь рендерит markdown через схему редактора (li в <p>); добавлен .markdown li p{margin:0} (CSS-модуль, скоуп только чата) — визуально плотно. Проверка: pmd tsc + vitest 744; client build УСПЕШЕН, grep бандла на JSDOM/parse5/happy-dom/turndown — 0 (утечки нет); клиентский suite + paste-тесты зелёные (34); editor-ext 196; node-потребители (mcp/server/git-sync) зелёные. Юнит-тесты: dual-path parity (jsdom==DOMParser), канон-формы == серверный импорт, негативы ($5/==/[^1] не корёжатся), async-paste (claim→convert→dispatch, fail-open). Ручная paste-QA полного клиентского round-trip (footnote/callout/math/image-comment; вставка из VSCode/Obsidian/GitHub в список/таблицу/callout) и Docker-сборка клиента (#333-класс) — за пределами автостенда, оставлено на ручную проверку. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
107 lines
3.3 KiB
JSON
107 lines
3.3 KiB
JSON
{
|
|
"name": "client",
|
|
"private": true,
|
|
"version": "0.94.1",
|
|
"scripts": {
|
|
"dev": "node scripts/copy-vad-assets.mjs && vite",
|
|
"build": "node scripts/copy-vad-assets.mjs && tsc && vite build",
|
|
"lint": "eslint .",
|
|
"preview": "vite preview",
|
|
"format": "prettier --write \"src/**/*.tsx\" \"src/**/*.ts\"",
|
|
"test": "vitest run",
|
|
"test:watch": "vitest"
|
|
},
|
|
"dependencies": {
|
|
"@ai-sdk/react": "^3.0.208",
|
|
"@braintree/sanitize-url": "7.1.2",
|
|
"@atlaskit/pragmatic-drag-and-drop": "1.8.1",
|
|
"@atlaskit/pragmatic-drag-and-drop-auto-scroll": "2.1.5",
|
|
"@atlaskit/pragmatic-drag-and-drop-flourish": "2.0.15",
|
|
"@atlaskit/pragmatic-drag-and-drop-hitbox": "1.1.0",
|
|
"@atlaskit/pragmatic-drag-and-drop-live-region": "1.3.4",
|
|
"@casl/react": "5.0.1",
|
|
"@docmost/editor-ext": "workspace:*",
|
|
"@docmost/prosemirror-markdown": "workspace:*",
|
|
"@excalidraw/excalidraw": "0.18.0-3a5ef40",
|
|
"@mantine/core": "8.3.18",
|
|
"@mantine/dates": "8.3.18",
|
|
"@mantine/form": "8.3.18",
|
|
"@mantine/hooks": "8.3.18",
|
|
"@mantine/modals": "8.3.18",
|
|
"@mantine/notifications": "8.3.18",
|
|
"@mantine/spotlight": "8.3.18",
|
|
"@ricky0123/vad-web": "^0.0.30",
|
|
"@slidoapp/emoji-mart": "5.8.7",
|
|
"@slidoapp/emoji-mart-data": "1.2.4",
|
|
"@slidoapp/emoji-mart-react": "1.1.5",
|
|
"@tabler/icons-react": "3.40.0",
|
|
"@tanstack/react-query": "5.90.17",
|
|
"@tanstack/react-virtual": "3.13.24",
|
|
"ai": "6.0.207",
|
|
"alfaaz": "1.1.0",
|
|
"axios": "1.16.0",
|
|
"blueimp-load-image": "5.16.0",
|
|
"clsx": "2.1.1",
|
|
"diff": "8.0.3",
|
|
"dompurify": "3.4.1",
|
|
"file-saver": "2.0.5",
|
|
"highlightjs-sap-abap": "0.3.0",
|
|
"i18next": "25.10.1",
|
|
"i18next-http-backend": "3.0.6",
|
|
"jotai": "2.18.1",
|
|
"jotai-optics": "0.4.0",
|
|
"js-cookie": "3.0.7",
|
|
"jwt-decode": "4.0.0",
|
|
"katex": "0.16.40",
|
|
"lowlight": "3.3.0",
|
|
"mantine-form-zod-resolver": "1.3.0",
|
|
"mermaid": "11.15.0",
|
|
"mitt": "3.0.1",
|
|
"onnxruntime-web": "^1.27.0",
|
|
"posthog-js": "1.372.2",
|
|
"react": "18.3.1",
|
|
"react-clear-modal": "^2.0.18",
|
|
"react-dom": "^18.3.1",
|
|
"react-drawio": "1.0.7",
|
|
"web-vitals": "^5.1.0",
|
|
"react-error-boundary": "6.1.1",
|
|
"react-helmet-async": "3.0.0",
|
|
"react-i18next": "16.5.8",
|
|
"react-router-dom": "7.13.1",
|
|
"semver": "7.7.4",
|
|
"socket.io-client": "4.8.3",
|
|
"zod": "4.3.6"
|
|
},
|
|
"devDependencies": {
|
|
"@eslint/js": "9.28.0",
|
|
"@tanstack/eslint-plugin-query": "5.94.4",
|
|
"@testing-library/jest-dom": "6.6.0",
|
|
"@testing-library/react": "16.1.0",
|
|
"@types/blueimp-load-image": "5.16.6",
|
|
"@types/file-saver": "2.0.7",
|
|
"@types/js-cookie": "3.0.6",
|
|
"@types/katex": "0.16.8",
|
|
"@types/node": "22.19.1",
|
|
"@types/react": "18.3.12",
|
|
"@types/react-dom": "18.3.1",
|
|
"@vitejs/plugin-react": "6.0.1",
|
|
"@vitest/coverage-v8": "4.1.6",
|
|
"eslint": "9.28.0",
|
|
"eslint-plugin-react": "7.37.5",
|
|
"eslint-plugin-react-hooks": "7.0.1",
|
|
"eslint-plugin-react-refresh": "0.5.2",
|
|
"globals": "15.13.0",
|
|
"jsdom": "25.0.0",
|
|
"optics-ts": "2.4.1",
|
|
"postcss": "8.5.14",
|
|
"postcss-preset-mantine": "1.18.0",
|
|
"postcss-simple-vars": "7.0.1",
|
|
"prettier": "3.8.1",
|
|
"typescript": "5.9.3",
|
|
"typescript-eslint": "8.57.1",
|
|
"vite": "8.0.5",
|
|
"vite-plugin-compression2": "2.5.3",
|
|
"vitest": "4.1.6"
|
|
}
|
|
}
|