fix(dependencies): 富文本编辑器 - 统一 Tiptap 版本并修复 pnpm 启动失败
This commit is contained in:
@@ -5,6 +5,12 @@ description: 当前项目已实现功能的手工验证清单与未确认边界
|
||||
|
||||
# 待测试
|
||||
|
||||
## Tiptap 依赖版本对齐
|
||||
|
||||
- Tiptap 核心、React、扩展及间接依赖统一锁定为 `3.28.0`,同步 Bun 与 pnpm 锁文件;显式声明 `pm` 和 `extensions`,避免 pnpm 保留旧 peer 解析。此项不修改编辑器业务代码和 UI 样式。
|
||||
- [ ] 使用 `pnpm install --frozen-lockfile` 后启动 `pnpm dev`,打开画布文本编辑器与项目章节编辑页,确认没有依赖预打包缺失导出错误。
|
||||
- [ ] 验证正文编辑、标题、列表、颜色、高亮、撤销重做、保存后重新打开,以及明暗主题外观。
|
||||
|
||||
## 创作页面附件缩略图
|
||||
|
||||
- 聊天消息与分镜简报附件的放大图标样式排除 `.cached-resource-image-shell`,避免缓存图片容器被误设为透明和绝对定位;悬停与键盘聚焦仍显示放大图标。
|
||||
|
||||
52
web/bun.lock
52
web/bun.lock
@@ -22,14 +22,16 @@
|
||||
"@tanstack/react-query": "^5.101.2",
|
||||
"@tanstack/react-virtual": "^3.14.8",
|
||||
"@tiptap/core": "3.28.0",
|
||||
"@tiptap/extension-character-count": "^3.28.0",
|
||||
"@tiptap/extension-color": "^3.28.0",
|
||||
"@tiptap/extension-highlight": "^3.28.0",
|
||||
"@tiptap/extension-placeholder": "^3.28.0",
|
||||
"@tiptap/extension-text-align": "^3.28.0",
|
||||
"@tiptap/extension-text-style": "^3.28.0",
|
||||
"@tiptap/react": "^3.28.0",
|
||||
"@tiptap/starter-kit": "^3.28.0",
|
||||
"@tiptap/extension-character-count": "3.28.0",
|
||||
"@tiptap/extension-color": "3.28.0",
|
||||
"@tiptap/extension-highlight": "3.28.0",
|
||||
"@tiptap/extension-placeholder": "3.28.0",
|
||||
"@tiptap/extension-text-align": "3.28.0",
|
||||
"@tiptap/extension-text-style": "3.28.0",
|
||||
"@tiptap/extensions": "3.28.0",
|
||||
"@tiptap/pm": "3.28.0",
|
||||
"@tiptap/react": "3.28.0",
|
||||
"@tiptap/starter-kit": "3.28.0",
|
||||
"@uiw/react-codemirror": "^4.25.11",
|
||||
"@vidstack/react": "1.15.6",
|
||||
"antd": "^6.5.1",
|
||||
@@ -81,6 +83,40 @@
|
||||
},
|
||||
"overrides": {
|
||||
"@babel/core": "7.29.7",
|
||||
"@tiptap/core": "3.28.0",
|
||||
"@tiptap/extension-blockquote": "3.28.0",
|
||||
"@tiptap/extension-bold": "3.28.0",
|
||||
"@tiptap/extension-bubble-menu": "3.28.0",
|
||||
"@tiptap/extension-bullet-list": "3.28.0",
|
||||
"@tiptap/extension-character-count": "3.28.0",
|
||||
"@tiptap/extension-code": "3.28.0",
|
||||
"@tiptap/extension-code-block": "3.28.0",
|
||||
"@tiptap/extension-color": "3.28.0",
|
||||
"@tiptap/extension-document": "3.28.0",
|
||||
"@tiptap/extension-dropcursor": "3.28.0",
|
||||
"@tiptap/extension-floating-menu": "3.28.0",
|
||||
"@tiptap/extension-gapcursor": "3.28.0",
|
||||
"@tiptap/extension-hard-break": "3.28.0",
|
||||
"@tiptap/extension-heading": "3.28.0",
|
||||
"@tiptap/extension-highlight": "3.28.0",
|
||||
"@tiptap/extension-horizontal-rule": "3.28.0",
|
||||
"@tiptap/extension-italic": "3.28.0",
|
||||
"@tiptap/extension-link": "3.28.0",
|
||||
"@tiptap/extension-list": "3.28.0",
|
||||
"@tiptap/extension-list-item": "3.28.0",
|
||||
"@tiptap/extension-list-keymap": "3.28.0",
|
||||
"@tiptap/extension-ordered-list": "3.28.0",
|
||||
"@tiptap/extension-paragraph": "3.28.0",
|
||||
"@tiptap/extension-placeholder": "3.28.0",
|
||||
"@tiptap/extension-strike": "3.28.0",
|
||||
"@tiptap/extension-text": "3.28.0",
|
||||
"@tiptap/extension-text-align": "3.28.0",
|
||||
"@tiptap/extension-text-style": "3.28.0",
|
||||
"@tiptap/extension-underline": "3.28.0",
|
||||
"@tiptap/extensions": "3.28.0",
|
||||
"@tiptap/pm": "3.28.0",
|
||||
"@tiptap/react": "3.28.0",
|
||||
"@tiptap/starter-kit": "3.28.0",
|
||||
"form-data": "4.0.6",
|
||||
"hono": "4.12.30",
|
||||
"js-yaml": "4.3.0",
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
"build:bridge": "bun ../canvas-agent/scripts/build-comfy-bridge.ts",
|
||||
"dev": "vite --host 0.0.0.0 --port 3000",
|
||||
"build": "bun run build:bridge && tsc --noEmit && vite build",
|
||||
"pretest": "bun test test/admin-ui-regressions.test.ts test/announcement-prompt-regressions.test.ts test/password-reset.test.ts test/oss-settings.test.ts test/channel-model-editor-form.test.ts test/channel-model-price-tier-form.test.ts test/admin-logical-models.test.ts && bun test test/canvas-grid-viewport.test.tsx",
|
||||
"pretest": "bun test test/tiptap-dependency-versions.test.ts test/admin-ui-regressions.test.ts test/announcement-prompt-regressions.test.ts test/password-reset.test.ts test/oss-settings.test.ts test/channel-model-editor-form.test.ts test/channel-model-price-tier-form.test.ts test/admin-logical-models.test.ts && bun test test/canvas-grid-viewport.test.tsx",
|
||||
"typecheck": "tsc --noEmit",
|
||||
"test:canvas": "bun test test/canvas-media-performance.test.ts test/canvas-node-title-interaction.test.ts test/canvas-spatial-index.test.ts",
|
||||
"test": "bun test test/api-request.test.ts test/video-api-contracts.test.ts test/image-api-contracts.test.ts test/channel-model-catalog.test.ts test/model-pricing.test.ts test/model-protocols.test.ts test/model-capabilities.test.ts test/agent-prompt-cache.test.ts test/canvas-agent-context.test.ts test/canvas-batch-connection.test.ts test/canvas-character-reference.test.ts test/canvas-document.test.ts test/canvas-drawing-engine.test.ts test/canvas-emotion-edit-plan.test.ts test/canvas-extension-nodes.test.ts test/canvas-folder.test.ts test/canvas-generation-layout.test.ts test/canvas-generation-submission.test.ts test/canvas-image-batch-retry.test.ts test/canvas-keyboard.test.ts test/canvas-node-generation-mentions.test.ts test/canvas-node-search.test.ts test/canvas-leafer-viewport.test.ts test/canvas-media-download.test.ts test/canvas-local-runtime.test.ts test/canvas-model-policy.test.ts test/canvas-resource-mention-editor.test.ts test/canvas-resource-references.test.ts test/canvas-storyboard-assets.test.ts test/canvas-storyboard-references.test.ts test/canvas-node-config-reset.test.ts test/canvas-node-registry.test.ts test/canvas-video-frame.test.ts test/canvas-video-regeneration.test.ts test/canvas-video-timeline-segments.test.ts test/create-canvas-handoff.test.ts test/create-library-button.test.ts test/creation-references.test.ts test/director-transform-semantics.test.ts test/director-bone-precedence.test.ts test/director-gesture-transaction.test.ts test/director-transaction-lifecycle.test.ts test/director-session-authority.test.ts test/director-placement.test.ts test/director-resources.test.ts test/director-recovery.test.ts test/director-node-preview.test.ts test/generation-asset-repository.node.test.ts test/generation-storage-consistency.test.ts test/generation-task-durability.node.test.ts test/generation-task-local.test.ts test/generation-task-materializer.test.ts test/task-media-fallback.test.ts test/user-scoped-generation-persistence.test.ts test/local-channel-permission.test.ts test/local-channel-runtime-projection.node.test.mjs test/local-channel-task-center.node.test.mjs test/local-channel-ui.node.test.mjs test/local-cli-settings.test.ts test/local-dreamina-cli.test.ts test/local-dreamina-generation.test.ts test/local-dreamina-model-catalog.test.ts test/local-runtime-bootstrap.test.ts test/local-runtime-connection.test.ts test/local-runtime.test.ts test/client-id.test.ts test/grok-image-prompt-limit.test.ts test/image-resolution-tiers.test.ts test/gemini-image.test.ts test/libtv-import.test.ts test/timeline-to-ffmpeg.test.ts test/canvas-video-segment-args.test.ts test/tapnow-import.test.ts test/prompt-optimizer-drawer.test.ts test/director-save-coordinator.test.ts test/director-save-wiring.test.ts test/director-diagnostics.test.ts test/director-repro-runtime.test.ts test/director-diagnostics-recorder.test.ts test/director-keyframe-editing.test.ts test/director-shortcuts.test.ts test/director-keyframe-delete-wiring.test.ts test/director-templates.test.ts test/director-modes.test.ts test/director-template-mode-wiring.test.ts test/director-view-modes.test.ts && bun test test/local-dreamina-cross-runtime.test.ts",
|
||||
@@ -34,14 +34,16 @@
|
||||
"@tanstack/react-query": "^5.101.2",
|
||||
"@tanstack/react-virtual": "^3.14.8",
|
||||
"@tiptap/core": "3.28.0",
|
||||
"@tiptap/extension-character-count": "^3.28.0",
|
||||
"@tiptap/extension-color": "^3.28.0",
|
||||
"@tiptap/extension-highlight": "^3.28.0",
|
||||
"@tiptap/extension-placeholder": "^3.28.0",
|
||||
"@tiptap/extension-text-align": "^3.28.0",
|
||||
"@tiptap/extension-text-style": "^3.28.0",
|
||||
"@tiptap/react": "^3.28.0",
|
||||
"@tiptap/starter-kit": "^3.28.0",
|
||||
"@tiptap/extension-character-count": "3.28.0",
|
||||
"@tiptap/extension-color": "3.28.0",
|
||||
"@tiptap/extension-highlight": "3.28.0",
|
||||
"@tiptap/extension-placeholder": "3.28.0",
|
||||
"@tiptap/extension-text-align": "3.28.0",
|
||||
"@tiptap/extension-text-style": "3.28.0",
|
||||
"@tiptap/extensions": "3.28.0",
|
||||
"@tiptap/pm": "3.28.0",
|
||||
"@tiptap/react": "3.28.0",
|
||||
"@tiptap/starter-kit": "3.28.0",
|
||||
"@uiw/react-codemirror": "^4.25.11",
|
||||
"@vidstack/react": "1.15.6",
|
||||
"antd": "^6.5.1",
|
||||
@@ -95,6 +97,78 @@
|
||||
"hono": "4.12.30",
|
||||
"js-yaml": "4.3.0",
|
||||
"prismjs": "1.30.0",
|
||||
"qs": "6.15.3"
|
||||
"qs": "6.15.3",
|
||||
"@tiptap/core": "3.28.0",
|
||||
"@tiptap/extension-blockquote": "3.28.0",
|
||||
"@tiptap/extension-bold": "3.28.0",
|
||||
"@tiptap/extension-bubble-menu": "3.28.0",
|
||||
"@tiptap/extension-bullet-list": "3.28.0",
|
||||
"@tiptap/extension-character-count": "3.28.0",
|
||||
"@tiptap/extension-code": "3.28.0",
|
||||
"@tiptap/extension-code-block": "3.28.0",
|
||||
"@tiptap/extension-color": "3.28.0",
|
||||
"@tiptap/extension-document": "3.28.0",
|
||||
"@tiptap/extension-dropcursor": "3.28.0",
|
||||
"@tiptap/extension-floating-menu": "3.28.0",
|
||||
"@tiptap/extension-gapcursor": "3.28.0",
|
||||
"@tiptap/extension-hard-break": "3.28.0",
|
||||
"@tiptap/extension-heading": "3.28.0",
|
||||
"@tiptap/extension-highlight": "3.28.0",
|
||||
"@tiptap/extension-horizontal-rule": "3.28.0",
|
||||
"@tiptap/extension-italic": "3.28.0",
|
||||
"@tiptap/extension-link": "3.28.0",
|
||||
"@tiptap/extension-list": "3.28.0",
|
||||
"@tiptap/extension-list-item": "3.28.0",
|
||||
"@tiptap/extension-list-keymap": "3.28.0",
|
||||
"@tiptap/extension-ordered-list": "3.28.0",
|
||||
"@tiptap/extension-paragraph": "3.28.0",
|
||||
"@tiptap/extension-placeholder": "3.28.0",
|
||||
"@tiptap/extension-strike": "3.28.0",
|
||||
"@tiptap/extension-text": "3.28.0",
|
||||
"@tiptap/extension-text-align": "3.28.0",
|
||||
"@tiptap/extension-text-style": "3.28.0",
|
||||
"@tiptap/extension-underline": "3.28.0",
|
||||
"@tiptap/extensions": "3.28.0",
|
||||
"@tiptap/pm": "3.28.0",
|
||||
"@tiptap/react": "3.28.0",
|
||||
"@tiptap/starter-kit": "3.28.0"
|
||||
},
|
||||
"pnpm": {
|
||||
"overrides": {
|
||||
"@tiptap/core": "3.28.0",
|
||||
"@tiptap/extension-blockquote": "3.28.0",
|
||||
"@tiptap/extension-bold": "3.28.0",
|
||||
"@tiptap/extension-bubble-menu": "3.28.0",
|
||||
"@tiptap/extension-bullet-list": "3.28.0",
|
||||
"@tiptap/extension-character-count": "3.28.0",
|
||||
"@tiptap/extension-code": "3.28.0",
|
||||
"@tiptap/extension-code-block": "3.28.0",
|
||||
"@tiptap/extension-color": "3.28.0",
|
||||
"@tiptap/extension-document": "3.28.0",
|
||||
"@tiptap/extension-dropcursor": "3.28.0",
|
||||
"@tiptap/extension-floating-menu": "3.28.0",
|
||||
"@tiptap/extension-gapcursor": "3.28.0",
|
||||
"@tiptap/extension-hard-break": "3.28.0",
|
||||
"@tiptap/extension-heading": "3.28.0",
|
||||
"@tiptap/extension-highlight": "3.28.0",
|
||||
"@tiptap/extension-horizontal-rule": "3.28.0",
|
||||
"@tiptap/extension-italic": "3.28.0",
|
||||
"@tiptap/extension-link": "3.28.0",
|
||||
"@tiptap/extension-list": "3.28.0",
|
||||
"@tiptap/extension-list-item": "3.28.0",
|
||||
"@tiptap/extension-list-keymap": "3.28.0",
|
||||
"@tiptap/extension-ordered-list": "3.28.0",
|
||||
"@tiptap/extension-paragraph": "3.28.0",
|
||||
"@tiptap/extension-placeholder": "3.28.0",
|
||||
"@tiptap/extension-strike": "3.28.0",
|
||||
"@tiptap/extension-text": "3.28.0",
|
||||
"@tiptap/extension-text-align": "3.28.0",
|
||||
"@tiptap/extension-text-style": "3.28.0",
|
||||
"@tiptap/extension-underline": "3.28.0",
|
||||
"@tiptap/extensions": "3.28.0",
|
||||
"@tiptap/pm": "3.28.0",
|
||||
"@tiptap/react": "3.28.0",
|
||||
"@tiptap/starter-kit": "3.28.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
779
web/pnpm-lock.yaml
generated
779
web/pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
37
web/test/tiptap-dependency-versions.test.ts
Normal file
37
web/test/tiptap-dependency-versions.test.ts
Normal file
@@ -0,0 +1,37 @@
|
||||
import { describe, expect, test } from "bun:test";
|
||||
import { createRequire } from "node:module";
|
||||
import { readFileSync } from "node:fs";
|
||||
import { resolve } from "node:path";
|
||||
|
||||
const manifestPath = resolve(import.meta.dir, "../package.json");
|
||||
const manifest = JSON.parse(readFileSync(manifestPath, "utf8"));
|
||||
const version = manifest.dependencies["@tiptap/core"];
|
||||
const isTiptap = (name: string) => name.startsWith("@tiptap/");
|
||||
|
||||
describe("Tiptap dependency alignment", () => {
|
||||
test("pins direct dependencies and matching Bun/npm and pnpm overrides", () => {
|
||||
expect(version).toMatch(/^\d+\.\d+\.\d+$/);
|
||||
for (const [name, specifier] of Object.entries(manifest.dependencies)) {
|
||||
if (isTiptap(name)) expect(specifier).toBe(version);
|
||||
}
|
||||
const overrides = Object.fromEntries(Object.entries(manifest.overrides).filter(([name]) => isTiptap(name)));
|
||||
expect(manifest.pnpm.overrides).toEqual(overrides);
|
||||
for (const specifier of Object.values(overrides)) expect(specifier).toBe(version);
|
||||
});
|
||||
|
||||
test("resolves the entire installed Tiptap dependency graph to the core version", () => {
|
||||
const visited = new Set<string>();
|
||||
function check(parent: string, name: string) {
|
||||
const path = createRequire(parent).resolve(`${name}/package.json`);
|
||||
if (visited.has(path)) return;
|
||||
visited.add(path);
|
||||
const dependency = JSON.parse(readFileSync(path, "utf8"));
|
||||
expect(`${name}@${dependency.version}`).toBe(`${name}@${version}`);
|
||||
expect(manifest.overrides[name]).toBe(version);
|
||||
const children = { ...dependency.dependencies, ...dependency.peerDependencies, ...dependency.optionalDependencies };
|
||||
for (const child of Object.keys(children).filter(isTiptap)) check(path, child);
|
||||
}
|
||||
for (const name of Object.keys(manifest.dependencies).filter(isTiptap)) check(manifestPath, name);
|
||||
expect(visited.size).toBeGreaterThan(Object.keys(manifest.dependencies).filter(isTiptap).length);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user