wendang 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +3 -0
- package/NOTICE.md +7 -0
- package/README.md +101 -2
- package/dist/cjs/document.js +19 -0
- package/dist/cjs/index.js +25 -0
- package/dist/cjs/mindmap.js +22 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/schema.js +11 -0
- package/dist/cjs/shared/anchor.js +201 -0
- package/dist/cjs/shared/callout.js +64 -0
- package/dist/cjs/shared/code-block.js +33 -0
- package/dist/cjs/shared/code-languages.js +51 -0
- package/dist/cjs/shared/doc-compatibility.js +23 -0
- package/dist/cjs/shared/doc-text.js +52 -0
- package/dist/cjs/shared/document-colors.js +61 -0
- package/dist/cjs/shared/inline-comments.js +179 -0
- package/dist/cjs/shared/mind-map-folding.js +14 -0
- package/dist/cjs/shared/mind-map-phase2.js +133 -0
- package/dist/cjs/shared/mind-map.js +445 -0
- package/dist/cjs/shared/mind-topic-text.js +57 -0
- package/dist/cjs/shared/node-catalog.js +62 -0
- package/dist/cjs/shared/presence.js +141 -0
- package/dist/cjs/shared/safe-href.js +36 -0
- package/dist/cjs/shared/table-cell-format.js +18 -0
- package/dist/cjs/shared/table-layout.js +28 -0
- package/dist/cjs/shared/types.js +2 -0
- package/dist/cjs/shared/video-embed.js +102 -0
- package/dist/cjs/shared/workbook.js +152 -0
- package/dist/cjs/spreadsheet.js +17 -0
- package/dist/cjs/types.js +17 -0
- package/dist/cjs/validation/callout.js +17 -0
- package/dist/cjs/validation/doc-node-whitelist.js +71 -0
- package/dist/cjs/validation/error.js +17 -0
- package/dist/cjs/validation/mind-map.js +129 -0
- package/dist/cjs/validation/schema-version.js +5 -0
- package/dist/cjs/validation/schema.js +376 -0
- package/dist/cjs/validation/video-embed.js +17 -0
- package/dist/cjs/validation/workbook.js +17 -0
- package/dist/esm/document.js +3 -0
- package/dist/esm/index.js +3 -0
- package/dist/esm/mindmap.js +4 -0
- package/dist/esm/schema.js +3 -0
- package/dist/esm/shared/anchor.js +192 -0
- package/dist/esm/shared/callout.js +56 -0
- package/dist/esm/shared/code-block.js +25 -0
- package/dist/esm/shared/code-languages.js +46 -0
- package/dist/esm/shared/doc-compatibility.js +20 -0
- package/dist/esm/shared/doc-text.js +48 -0
- package/dist/esm/shared/document-colors.js +56 -0
- package/dist/esm/shared/inline-comments.js +173 -0
- package/dist/esm/shared/mind-map-folding.js +10 -0
- package/dist/esm/shared/mind-map-phase2.js +121 -0
- package/dist/esm/shared/mind-map.js +427 -0
- package/dist/esm/shared/mind-topic-text.js +49 -0
- package/dist/esm/shared/node-catalog.js +57 -0
- package/dist/esm/shared/presence.js +130 -0
- package/dist/esm/shared/safe-href.js +32 -0
- package/dist/esm/shared/table-cell-format.js +14 -0
- package/dist/esm/shared/table-layout.js +23 -0
- package/dist/esm/shared/types.js +1 -0
- package/dist/esm/shared/video-embed.js +96 -0
- package/dist/esm/shared/workbook.js +144 -0
- package/dist/esm/spreadsheet.js +1 -0
- package/dist/esm/types.js +1 -0
- package/dist/esm/validation/callout.js +1 -0
- package/dist/esm/validation/doc-node-whitelist.js +68 -0
- package/dist/esm/validation/error.js +13 -0
- package/dist/esm/validation/mind-map.js +125 -0
- package/dist/esm/validation/schema-version.js +2 -0
- package/dist/esm/validation/schema.js +372 -0
- package/dist/esm/validation/video-embed.js +1 -0
- package/dist/esm/validation/workbook.js +1 -0
- package/dist/types/document.d.ts +4 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/mindmap.d.ts +4 -0
- package/dist/types/schema.d.ts +4 -0
- package/dist/types/shared/anchor.d.ts +87 -0
- package/dist/types/shared/callout.d.ts +27 -0
- package/dist/types/shared/code-block.d.ts +26 -0
- package/dist/types/shared/code-languages.d.ts +26 -0
- package/dist/types/shared/doc-compatibility.d.ts +1 -0
- package/dist/types/shared/doc-text.d.ts +21 -0
- package/dist/types/shared/document-colors.d.ts +106 -0
- package/dist/types/shared/inline-comments.d.ts +71 -0
- package/dist/types/shared/mind-map-folding.d.ts +5 -0
- package/dist/types/shared/mind-map-phase2.d.ts +19 -0
- package/dist/types/shared/mind-map.d.ts +134 -0
- package/dist/types/shared/mind-topic-text.d.ts +18 -0
- package/dist/types/shared/node-catalog.d.ts +30 -0
- package/dist/types/shared/presence.d.ts +69 -0
- package/dist/types/shared/safe-href.d.ts +3 -0
- package/dist/types/shared/table-cell-format.d.ts +24 -0
- package/dist/types/shared/table-layout.d.ts +7 -0
- package/dist/types/shared/types.d.ts +44 -0
- package/dist/types/shared/video-embed.d.ts +11 -0
- package/dist/types/shared/workbook.d.ts +56 -0
- package/dist/types/spreadsheet.d.ts +1 -0
- package/dist/types/types.d.ts +3 -0
- package/dist/types/validation/callout.d.ts +1 -0
- package/dist/types/validation/doc-node-whitelist.d.ts +21 -0
- package/dist/types/validation/error.d.ts +7 -0
- package/dist/types/validation/mind-map.d.ts +22 -0
- package/dist/types/validation/schema-version.d.ts +2 -0
- package/dist/types/validation/schema.d.ts +49 -0
- package/dist/types/validation/video-embed.d.ts +1 -0
- package/dist/types/validation/workbook.d.ts +1 -0
- package/package.json +87 -5
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/** Neutral workbook wire format. Keep in sync with web/src/shared/workbook.ts. */
|
|
2
|
+
export interface WorkbookCell {
|
|
3
|
+
v?: string | number | boolean | null;
|
|
4
|
+
f?: string;
|
|
5
|
+
t?: number;
|
|
6
|
+
s?: string | Record<string, unknown> | null;
|
|
7
|
+
p?: {
|
|
8
|
+
body?: {
|
|
9
|
+
dataStream?: string;
|
|
10
|
+
};
|
|
11
|
+
[key: string]: unknown;
|
|
12
|
+
};
|
|
13
|
+
[key: string]: unknown;
|
|
14
|
+
}
|
|
15
|
+
export interface WorkbookSheet {
|
|
16
|
+
id: string;
|
|
17
|
+
name: string;
|
|
18
|
+
rowCount: number;
|
|
19
|
+
columnCount: number;
|
|
20
|
+
cellData?: Record<string, Record<string, WorkbookCell | null>>;
|
|
21
|
+
mergeData?: Array<{
|
|
22
|
+
startRow: number;
|
|
23
|
+
endRow: number;
|
|
24
|
+
startColumn: number;
|
|
25
|
+
endColumn: number;
|
|
26
|
+
}>;
|
|
27
|
+
rowData?: Record<string, Record<string, unknown>>;
|
|
28
|
+
columnData?: Record<string, Record<string, unknown>>;
|
|
29
|
+
[key: string]: unknown;
|
|
30
|
+
}
|
|
31
|
+
export interface WorkbookSnapshot {
|
|
32
|
+
id: string;
|
|
33
|
+
name: string;
|
|
34
|
+
sheetOrder: string[];
|
|
35
|
+
sheets: Record<string, WorkbookSheet>;
|
|
36
|
+
styles?: Record<string, Record<string, unknown>>;
|
|
37
|
+
[key: string]: unknown;
|
|
38
|
+
}
|
|
39
|
+
export interface WorkbookDocument {
|
|
40
|
+
type: 'workbook';
|
|
41
|
+
formatVersion: 1;
|
|
42
|
+
workbook: WorkbookSnapshot;
|
|
43
|
+
}
|
|
44
|
+
export declare const WORKBOOK_LIMITS: {
|
|
45
|
+
readonly sheets: 20;
|
|
46
|
+
readonly rows: 10000;
|
|
47
|
+
readonly columns: 200;
|
|
48
|
+
readonly cells: 50000;
|
|
49
|
+
readonly bytes: number;
|
|
50
|
+
};
|
|
51
|
+
export declare function isWorkbookDocument(value: unknown): value is WorkbookDocument;
|
|
52
|
+
export declare function emptyWorkbook(id: string): WorkbookDocument;
|
|
53
|
+
/** Validate the complete snapshot without silently dropping supported engine attributes. */
|
|
54
|
+
export declare function validateWorkbook(raw: unknown): WorkbookDocument;
|
|
55
|
+
export declare function workbookCellText(cell: WorkbookCell | null | undefined): string;
|
|
56
|
+
export declare function workbookText(doc: WorkbookDocument): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './shared/workbook.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../shared/callout.js';
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 文档节点白名单(**纯数据,无依赖**)。
|
|
3
|
+
*
|
|
4
|
+
* 为什么单独成文件:白名单需要被三处引用——
|
|
5
|
+
* 1) 服务端校验(doc-schema.service.ts)
|
|
6
|
+
* 2) 一致性测试(与前端 node-catalog 交叉核对)
|
|
7
|
+
* 3) 导出序列化器的防漂移测试
|
|
8
|
+
* 若把它放在 doc-schema.service.ts 里,测试导入会连带加载 Nest 依赖,
|
|
9
|
+
* 导致 spec 在测试环境下加载失败(实测:整个测试文件被静默跳过)。
|
|
10
|
+
*
|
|
11
|
+
* 因此这里只放数据,不放逻辑,任何一方都能安全引用。
|
|
12
|
+
*
|
|
13
|
+
* 新增节点时必须同时更新:
|
|
14
|
+
* 1) 本文件
|
|
15
|
+
* 2) 前端 web/src/shared/node-catalog.ts
|
|
16
|
+
* 3) 导出序列化器 markdown-serializer.ts 的处理分支
|
|
17
|
+
* 三处一致性由测试自动核对(读取真实文件,而非维护测试内副本)。
|
|
18
|
+
*/
|
|
19
|
+
export declare const ALLOWED_NODES: Set<string>;
|
|
20
|
+
/** 允许的标记类型。 */
|
|
21
|
+
export declare const ALLOWED_MARKS: Set<string>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare class ContentValidationError extends Error {
|
|
2
|
+
code: string;
|
|
3
|
+
status: number;
|
|
4
|
+
details?: Record<string, unknown> | undefined;
|
|
5
|
+
constructor(code: string, message: string, status?: number, details?: Record<string, unknown> | undefined);
|
|
6
|
+
static validation(message: string): ContentValidationError;
|
|
7
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** Kept independent of Nest and of the editing engine: usable by validation and export. */
|
|
2
|
+
interface JsonNode {
|
|
3
|
+
type?: string;
|
|
4
|
+
attrs?: Record<string, unknown>;
|
|
5
|
+
text?: string;
|
|
6
|
+
content?: JsonNode[];
|
|
7
|
+
}
|
|
8
|
+
interface Topic {
|
|
9
|
+
id: string;
|
|
10
|
+
parentId: string;
|
|
11
|
+
order: number;
|
|
12
|
+
text: string;
|
|
13
|
+
description?: string;
|
|
14
|
+
note?: string;
|
|
15
|
+
attachmentId?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function validateMindMap(node: JsonNode): void;
|
|
18
|
+
/** Same deterministic tree projection as the reader; orphan/cycle conflicts never discard text. */
|
|
19
|
+
export declare function mindMapOutline(node: JsonNode): Array<Topic & {
|
|
20
|
+
depth: number;
|
|
21
|
+
}>;
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { ALLOWED_NODES } from './doc-node-whitelist.js';
|
|
2
|
+
export { ALLOWED_NODES };
|
|
3
|
+
/**
|
|
4
|
+
* 文档 schema 校验与派生提取(M0 定稿,见实施计划 4.1)。
|
|
5
|
+
*
|
|
6
|
+
* 职责:
|
|
7
|
+
* 1) 校验客户端提交的 ProseMirror JSON 是否只含白名单节点/标记 → 否则**拒绝写入**,
|
|
8
|
+
* 避免旧客户端遇到未知节点的文档时覆盖成空(对齐主方案第 3 节)。
|
|
9
|
+
* 2) 提取派生数据:正文引用的页面 ID(用于反向链接)、附件 ID。
|
|
10
|
+
*
|
|
11
|
+
* schemaVersion 升级策略:新增节点或旧客户端无法保留的持久属性时提升 SCHEMA_VERSION,并在此登记。
|
|
12
|
+
* 旧版本客户端读到更高版本文档时由前端拒编辑(本服务不影响读取)。
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* 正文格式版本。
|
|
16
|
+
*
|
|
17
|
+
* 变更记录:
|
|
18
|
+
* - 1:M0 初始版本(段落/标题/列表/引用/代码/表格/图片/页面引用/提及/公式)
|
|
19
|
+
* - 2:新增 `fileAttachment`(视频或文件卡片)与 `callout`(高亮块)
|
|
20
|
+
* - 3:新增块级格式属性 `textAlign`/`indent`(段落与标题)与行内样式标记
|
|
21
|
+
* `textStyle`(文字颜色)/`highlight`(背景高亮);同时补上此前遗漏的
|
|
22
|
+
* `paragraph` 属性条目与表格 `colwidth`(列宽)
|
|
23
|
+
* - 4:新增分栏节点 `columns`/`column`(等宽,无属性)
|
|
24
|
+
* - 5:新增平台视频节点 `videoEmbed`
|
|
25
|
+
* - 6:新增结构化思维导图 `mindMap` / `mindMapTopic`
|
|
26
|
+
* - 7:导图描述、备注、关系节点、受限主题样式与图片引用;标题支持行内标记
|
|
27
|
+
* - 8:思维导图分支方向 side,防止旧编辑器重写时丢失左右布局
|
|
28
|
+
* - 9:高亮块图标与独立文字、边框、填充颜色
|
|
29
|
+
* - 10:独立工作簿根格式 workbook(不进入 ProseMirror)
|
|
30
|
+
*
|
|
31
|
+
* 提升它的意义:客户端读到**更高版本**的文档时可以选择拒编辑(而非静默丢内容),
|
|
32
|
+
* 因此只要引入了新的节点类型就必须登记在此,不能只改白名单。
|
|
33
|
+
*/
|
|
34
|
+
export declare const SCHEMA_VERSION = 10;
|
|
35
|
+
export interface ValidatedDoc {
|
|
36
|
+
doc: Record<string, unknown>;
|
|
37
|
+
schemaVersion: number;
|
|
38
|
+
linkTargetIds: string[];
|
|
39
|
+
attachmentIds: string[];
|
|
40
|
+
/** 正文中 @ 提及的用户 ID(去重),用于通知扇出 */
|
|
41
|
+
mentionUserIds: string[];
|
|
42
|
+
}
|
|
43
|
+
export declare class ContentSchemaService {
|
|
44
|
+
validate(raw: unknown, schemaVersion: number): ValidatedDoc;
|
|
45
|
+
/** 仅允许 http/https/mailto 与站内相对链接,阻断 javascript: 等危险协议。 */
|
|
46
|
+
private isSafeHref;
|
|
47
|
+
/** 纯文本投影:供 M0 搜索与摘要使用(不含 HTML,避免 XSS 面)。 */
|
|
48
|
+
extractPlainText(doc: unknown): string;
|
|
49
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../shared/video-embed.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../shared/workbook.js';
|
package/package.json
CHANGED
|
@@ -1,14 +1,96 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wendang",
|
|
3
|
-
"version": "0.0
|
|
4
|
-
"description": "
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "文档、工作表和思维导图的内容协议与校验核心。",
|
|
5
|
+
"type": "module",
|
|
6
6
|
"license": "UNLICENSED",
|
|
7
|
+
"main": "./dist/cjs/index.js",
|
|
8
|
+
"module": "./dist/esm/index.js",
|
|
9
|
+
"types": "./dist/types/index.d.ts",
|
|
10
|
+
"typesVersions": {
|
|
11
|
+
"*": {
|
|
12
|
+
"internal/*": [
|
|
13
|
+
"dist/types/shared/*"
|
|
14
|
+
],
|
|
15
|
+
"validation/*": [
|
|
16
|
+
"dist/types/validation/*"
|
|
17
|
+
],
|
|
18
|
+
"*": [
|
|
19
|
+
"dist/types/*"
|
|
20
|
+
]
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"exports": {
|
|
24
|
+
".": {
|
|
25
|
+
"types": "./dist/types/index.d.ts",
|
|
26
|
+
"import": "./dist/esm/index.js",
|
|
27
|
+
"require": "./dist/cjs/index.js"
|
|
28
|
+
},
|
|
29
|
+
"./document": {
|
|
30
|
+
"types": "./dist/types/document.d.ts",
|
|
31
|
+
"import": "./dist/esm/document.js",
|
|
32
|
+
"require": "./dist/cjs/document.js"
|
|
33
|
+
},
|
|
34
|
+
"./spreadsheet": {
|
|
35
|
+
"types": "./dist/types/spreadsheet.d.ts",
|
|
36
|
+
"import": "./dist/esm/spreadsheet.js",
|
|
37
|
+
"require": "./dist/cjs/spreadsheet.js"
|
|
38
|
+
},
|
|
39
|
+
"./mindmap": {
|
|
40
|
+
"types": "./dist/types/mindmap.d.ts",
|
|
41
|
+
"import": "./dist/esm/mindmap.js",
|
|
42
|
+
"require": "./dist/cjs/mindmap.js"
|
|
43
|
+
},
|
|
44
|
+
"./schema": {
|
|
45
|
+
"types": "./dist/types/schema.d.ts",
|
|
46
|
+
"import": "./dist/esm/schema.js",
|
|
47
|
+
"require": "./dist/cjs/schema.js"
|
|
48
|
+
},
|
|
49
|
+
"./types": {
|
|
50
|
+
"types": "./dist/types/types.d.ts",
|
|
51
|
+
"import": "./dist/esm/types.js",
|
|
52
|
+
"require": "./dist/cjs/types.js"
|
|
53
|
+
},
|
|
54
|
+
"./internal/*": {
|
|
55
|
+
"types": "./dist/types/shared/*.d.ts",
|
|
56
|
+
"import": "./dist/esm/shared/*.js",
|
|
57
|
+
"require": "./dist/cjs/shared/*.js"
|
|
58
|
+
},
|
|
59
|
+
"./validation/*": {
|
|
60
|
+
"types": "./dist/types/validation/*.d.ts",
|
|
61
|
+
"import": "./dist/esm/validation/*.js",
|
|
62
|
+
"require": "./dist/cjs/validation/*.js"
|
|
63
|
+
},
|
|
64
|
+
"./package.json": "./package.json"
|
|
65
|
+
},
|
|
66
|
+
"sideEffects": false,
|
|
7
67
|
"files": [
|
|
8
|
-
"
|
|
68
|
+
"dist",
|
|
69
|
+
"README.md",
|
|
70
|
+
"LICENSE",
|
|
71
|
+
"NOTICE.md",
|
|
72
|
+
"third-party-notices"
|
|
9
73
|
],
|
|
74
|
+
"engines": {
|
|
75
|
+
"node": ">=20.19"
|
|
76
|
+
},
|
|
10
77
|
"publishConfig": {
|
|
11
78
|
"access": "public",
|
|
12
79
|
"registry": "https://registry.npmjs.org/"
|
|
80
|
+
},
|
|
81
|
+
"author": "ztes",
|
|
82
|
+
"repository": {
|
|
83
|
+
"type": "git",
|
|
84
|
+
"url": "git+https://gitee.com/ztes/wendang.git",
|
|
85
|
+
"directory": "packages/core"
|
|
86
|
+
},
|
|
87
|
+
"homepage": "https://gitee.com/ztes/wendang",
|
|
88
|
+
"bugs": {
|
|
89
|
+
"url": "https://gitee.com/ztes/wendang/issues"
|
|
90
|
+
},
|
|
91
|
+
"scripts": {
|
|
92
|
+
"build": "node ../../scripts/build-core.mjs",
|
|
93
|
+
"dev": "node ../../scripts/build-core.mjs --watch",
|
|
94
|
+
"typecheck": "tsc --noEmit"
|
|
13
95
|
}
|
|
14
|
-
}
|
|
96
|
+
}
|