y-mxgraph 0.8.2 → 0.8.3

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.
@@ -16,6 +16,8 @@ export interface FilePatch {
16
16
  [key: string]: {
17
17
  name?: string;
18
18
  previous?: string;
19
+ /** draw.io page viewState(如 background),与 diffPages 格式一致 */
20
+ view?: Record<string, string>;
19
21
  cells?: {
20
22
  [DIFF_REMOVE]?: string[];
21
23
  [DIFF_INSERT]?: Record<string, string>[];
@@ -1 +1 @@
1
- {"version":3,"file":"patch.d.ts","sourceRoot":"","sources":["../../src/binding/patch.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,QAAQ,EACd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAEL,KAAK,OAAO,EAEb,MAAM,kBAAkB,CAAC;AAO1B,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,QAAA,MAAM,WAAW,MAAM,CAAC;AACxB,QAAA,MAAM,WAAW,MAAM,CAAC;AACxB,QAAA,MAAM,WAAW,MAAM,CAAC;AAgDxB,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,CAAC,WAAW,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC;IAChC,CAAC,WAAW,CAAC,CAAC,EAAE;QACd,CAAC,GAAG,EAAE,MAAM,GAAG;YACb,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,KAAK,CAAC,EAAE;gBACN,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;gBACzB,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;gBACzC,CAAC,WAAW,CAAC,CAAC,EAAE;oBACd,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;iBACvC,CAAC;aACH,CAAC;SACH,CAAC;KACH,CAAC;CACH;AAED,wBAAgB,cAAc,CAC5B,GAAG,EAAE,CAAC,CAAC,GAAG,EACV,KAAK,EAAE,SAAS,EAChB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,QA8R/B;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,aAAa,UAAQ,QAyDhE;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,CAAC,CAAC,MAAM,CACd,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,OAAO,GAAG,QAAQ,CAC1E,EAAE,EACH,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,GAClB,SAAS,CAoSX"}
1
+ {"version":3,"file":"patch.d.ts","sourceRoot":"","sources":["../../src/binding/patch.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,QAAQ,EACd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAEL,KAAK,OAAO,EAEb,MAAM,kBAAkB,CAAC;AAa1B,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,QAAA,MAAM,WAAW,MAAM,CAAC;AACxB,QAAA,MAAM,WAAW,MAAM,CAAC;AACxB,QAAA,MAAM,WAAW,MAAM,CAAC;AAiDxB,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,CAAC,WAAW,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC;IAChC,CAAC,WAAW,CAAC,CAAC,EAAE;QACd,CAAC,GAAG,EAAE,MAAM,GAAG;YACb,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,4DAA4D;YAC5D,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC9B,KAAK,CAAC,EAAE;gBACN,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;gBACzB,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;gBACzC,CAAC,WAAW,CAAC,CAAC,EAAE;oBACd,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;iBACvC,CAAC;aACH,CAAC;SACH,CAAC;KACH,CAAC;CACH;AAmCD,wBAAgB,cAAc,CAC5B,GAAG,EAAE,CAAC,CAAC,GAAG,EACV,KAAK,EAAE,SAAS,EAChB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,QAkS/B;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,aAAa,UAAQ,QA2DhE;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,CAAC,CAAC,MAAM,CACd,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,OAAO,GAAG,QAAQ,CAC1E,EAAE,EACH,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,GAClB,SAAS,CAwUX"}
@@ -122,12 +122,14 @@ function serialize$2(xmlElement) {
122
122
  }
123
123
  const key$2 = "mxGraphModel";
124
124
  const mxCellOrderKey = key$3 + "Order";
125
+ const backgroundKey = "background";
125
126
  function parse$2(object, doc) {
127
+ var _a;
126
128
  const mxCells = (object.root[key$3] || []).map((cell) => {
127
- var _a;
129
+ var _a2;
128
130
  return {
129
131
  value: parse$3(cell),
130
- id: ((_a = cell._attributes) == null ? void 0 : _a.id) || ""
132
+ id: ((_a2 = cell._attributes) == null ? void 0 : _a2.id) || ""
131
133
  };
132
134
  });
133
135
  const mxGraphElement = (doc == null ? void 0 : doc.getMap(key$2)) || new Y.Map();
@@ -139,13 +141,20 @@ function parse$2(object, doc) {
139
141
  cellsOrder.push(mxCells.map((cell) => cell.id));
140
142
  mxGraphElement.set(key$3, cells);
141
143
  mxGraphElement.set(mxCellOrderKey, cellsOrder);
144
+ const bg = (_a = object._attributes) == null ? void 0 : _a.background;
145
+ if (bg != null && bg !== "") {
146
+ mxGraphElement.set(backgroundKey, String(bg));
147
+ }
142
148
  return mxGraphElement;
143
149
  }
144
150
  function serialize$1(map) {
145
151
  const cells = getMap(map, key$3);
146
152
  const cellsOrder = getArray(map, mxCellOrderKey);
153
+ const bg = map.get(backgroundKey);
154
+ const _attributes = {};
155
+ if (bg) _attributes.background = bg;
147
156
  return {
148
- _attributes: {},
157
+ _attributes,
149
158
  root: {
150
159
  [key$3]: cellsOrder.toArray().map((id) => serialize$2(cells.get(id)))
151
160
  }
@@ -247,17 +256,19 @@ function ydoc2xml(doc, spaces = 0) {
247
256
  return "";
248
257
  }
249
258
  export {
250
- key$1 as a,
251
- key$2 as b,
252
- key$3 as c,
259
+ key as a,
260
+ backgroundKey as b,
261
+ key$1 as c,
253
262
  diagramOrderKey as d,
254
- parse$1 as e,
255
- serializer$1 as f,
256
- key as k,
263
+ key$3 as e,
264
+ parse$1 as f,
265
+ getMap as g,
266
+ serializer$1 as h,
267
+ key$2 as k,
257
268
  mxCellOrderKey as m,
258
269
  parse$4 as p,
259
270
  serialize as s,
260
271
  xml2ydoc as x,
261
272
  ydoc2xml as y
262
273
  };
263
- //# sourceMappingURL=index-BtfQrQYT.js.map
274
+ //# sourceMappingURL=index-BhW4J2Zt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-BhW4J2Zt.js","sources":["../src/helper/xml.ts","../src/helper/yjs.ts","../src/models/mxCell.ts","../src/models/mxGraphModel.ts","../src/models/diagram.ts","../src/models/mxfile.ts","../src/transform/index.ts"],"sourcesContent":["import { xml2js, js2xml, type ElementCompact } from \"xml-js\";\n\nfunction deepProcess(node: unknown): void {\n if (node == null) return;\n\n if (Array.isArray(node)) {\n for (const item of node) {\n deepProcess(item);\n }\n return;\n }\n\n if (typeof node !== \"object\") return;\n\n const obj = node as Record<string, unknown>;\n const keys = Object.keys(obj);\n for (const key of keys) {\n if (key === \"_attributes\") continue;\n\n let value = obj[key];\n const keyLower = key.toLowerCase();\n\n if (\n (keyLower === \"diagram\" || keyLower === \"mxcell\") &&\n value !== undefined &&\n !Array.isArray(value)\n ) {\n obj[key] = [value];\n value = obj[key];\n }\n\n if (Array.isArray(value)) {\n for (const v of value) deepProcess(v);\n } else if (value && typeof value === \"object\") {\n deepProcess(value);\n }\n }\n}\n\nexport function parse(xml: string) {\n const result = xml2js(xml, { compact: true }) as Record<string, unknown>;\n deepProcess(result);\n return result;\n}\n\nexport function serializer(obj: ElementCompact, spaces = 2) {\n return js2xml(obj, {\n compact: true,\n spaces,\n });\n}\n","import * as Y from \"yjs\";\n\n/**\n * 从 Y.Map 中安全获取子 Map(格式固定,转型安全)\n */\nexport function getMap<T = unknown>(\n parent: Y.Map<unknown>,\n key: string,\n): Y.Map<T> | undefined {\n return parent.get(key) as Y.Map<T> | undefined;\n}\n\n/**\n * 从 Y.Map 中安全获取子 Array(格式固定,转型安全)\n */\nexport function getArray<T = unknown>(\n parent: Y.Map<unknown>,\n key: string,\n): Y.Array<T> | undefined {\n return parent.get(key) as Y.Array<T> | undefined;\n}\n","import * as Y from \"yjs\";\nimport { xml2js, js2xml } from \"xml-js\";\nimport type { ElementCompact } from \"xml-js\";\n\nexport const key = \"mxCell\";\n\nconst mxGeometryKey = \"mxGeometry\";\nconst mxGeometryAttributeKey = \"geometry\";\n\nexport interface MxCellModel extends ElementCompact {\n [mxGeometryKey]?: ElementCompact;\n}\n\nexport function parse(object: MxCellModel): Y.XmlElement {\n const xmlElement = new Y.XmlElement(\"mxCell\");\n\n for (const attribute of Object.keys(object._attributes || {})) {\n xmlElement.setAttribute(\n attribute,\n `${object._attributes?.[attribute] || \"\"}`,\n );\n }\n\n if (object[mxGeometryKey]) {\n const geometry = object[mxGeometryKey];\n const geometryString = js2xml(\n { [mxGeometryKey]: geometry },\n {\n compact: true,\n },\n );\n xmlElement.setAttribute(mxGeometryAttributeKey, geometryString);\n delete object[mxGeometryKey];\n }\n\n return xmlElement;\n}\n\nexport function serialize(xmlElement: Y.XmlElement) {\n const rawAttributes = {\n ...xmlElement.getAttributes(),\n };\n\n // 提取 mxGeometry(不需要转义,它本身就是 XML 字符串)\n let mxGeometry: ElementCompact | null = null;\n let mxGeometryString: string | undefined;\n\n if (mxGeometryAttributeKey in rawAttributes) {\n mxGeometryString = rawAttributes[mxGeometryAttributeKey];\n delete rawAttributes[mxGeometryAttributeKey];\n }\n\n // 转义其他属性值中的特殊字符\n const attributes: Record<string, string> = {};\n for (const [key, value] of Object.entries(rawAttributes)) {\n if (typeof value === \"string\") {\n attributes[key] = value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&apos;\");\n } else if (value != null) {\n attributes[key] = String(value);\n }\n }\n\n // 解析 mxGeometry\n if (mxGeometryString) {\n try {\n const parsed = xml2js(mxGeometryString, { compact: true }) as Record<\n string,\n ElementCompact\n >;\n mxGeometry = parsed[mxGeometryKey] ?? null;\n if (mxGeometry && mxGeometry._attributes) {\n mxGeometry._attributes[\"as\"] = \"geometry\";\n }\n } catch (e) {\n console.warn(\"[y-mxgraph] Failed to parse mxGeometry:\", e);\n }\n }\n\n const obj: Record<string, unknown> = {\n _attributes: attributes,\n };\n\n if (mxGeometry) {\n obj[mxGeometryKey] = mxGeometry;\n }\n\n return obj;\n}\n","import * as Y from \"yjs\";\nimport { getMap, getArray } from \"../helper/yjs\";\n\nimport {\n key as mxCellKey,\n parse as parseMxCell,\n serialize as serializeMxCell,\n type MxCellModel,\n} from \"./mxCell\";\nimport type { ElementCompact } from \"xml-js\";\n\nexport const key = \"mxGraphModel\";\nexport const mxCellOrderKey = mxCellKey + \"Order\";\n/** 协同同步的 mxGraphModel 属性:仅 background */\nexport const backgroundKey = \"background\";\n\nexport interface MxGraphModel extends ElementCompact {\n _attributes?: Record<string, string>;\n root: {\n mxCell: MxCellModel[];\n };\n}\n\nexport type YMxGraphModel = Y.Map<unknown>;\n\nexport function parse(object: MxGraphModel, doc?: Y.Doc) {\n const mxCells = (object.root[mxCellKey] || []).map((cell: MxCellModel) => {\n return {\n value: parseMxCell(cell),\n id: (cell._attributes?.id || \"\") as string,\n };\n });\n\n const mxGraphElement = doc?.getMap(key) || new Y.Map();\n\n const cells = new Y.Map<Y.XmlElement>();\n const cellsOrder = new Y.Array<string>();\n\n mxCells.forEach((cell) => {\n cells.set(cell.id, cell.value);\n });\n\n cellsOrder.push(mxCells.map((cell) => cell.id));\n\n mxGraphElement.set(mxCellKey, cells);\n mxGraphElement.set(mxCellOrderKey, cellsOrder);\n\n const bg = object._attributes?.background;\n if (bg != null && bg !== \"\") {\n mxGraphElement.set(backgroundKey, String(bg));\n }\n\n return mxGraphElement as YMxGraphModel;\n}\n\nexport function serialize(map: YMxGraphModel) {\n const cells = getMap<Y.XmlElement>(map, mxCellKey)!;\n const cellsOrder = getArray<string>(map, mxCellOrderKey)!;\n const bg = map.get(backgroundKey) as string | undefined;\n const _attributes: Record<string, string> = {};\n if (bg) _attributes.background = bg;\n return {\n _attributes,\n root: {\n [mxCellKey]: cellsOrder\n .toArray()\n .map((id) => serializeMxCell(cells!.get(id) as Y.XmlElement)),\n },\n };\n}\n","import * as Y from \"yjs\";\nimport { getMap } from \"../helper/yjs\";\nimport {\n parse as parseMxGraphModel,\n serialize as serializeMxGraphModel,\n key as mxGraphModelKey,\n type MxGraphModel,\n type YMxGraphModel,\n} from \"./mxGraphModel\";\nimport type { ElementCompact } from \"xml-js\";\n\nexport const key = \"diagram\";\n\nexport interface Diagram extends ElementCompact {\n mxGraphModel: MxGraphModel;\n}\n\nexport type YDiagram = Y.Map<unknown>;\n\nexport function parse(object: Diagram): YDiagram {\n const yDiagramElement = new Y.Map();\n yDiagramElement.set(\"name\", `${object._attributes?.name || \"\"}`);\n yDiagramElement.set(\"id\", `${object._attributes?.id || \"\"}`);\n\n const mxGraphModel = parseMxGraphModel(object[mxGraphModelKey]);\n\n yDiagramElement.set(mxGraphModelKey, mxGraphModel);\n return yDiagramElement as YDiagram;\n}\n\nexport function serialize(yDiagram: YDiagram) {\n const mxGraphModel = getMap(yDiagram, mxGraphModelKey);\n\n return {\n _attributes: {\n name: yDiagram.get(\"name\") as string,\n id: yDiagram.get(\"id\") as string,\n },\n [mxGraphModelKey]: mxGraphModel\n ? serializeMxGraphModel(mxGraphModel)\n : undefined,\n };\n}\n","import * as Y from \"yjs\";\nimport { getMap, getArray } from \"../helper/yjs\";\nimport {\n parse as parseDiagram,\n key as diagramKey,\n serialize as serializeDiagram,\n} from \"./diagram\";\nimport type { Diagram, YDiagram } from \"./diagram\";\nimport type { ElementCompact } from \"xml-js\";\n\nexport const key = \"mxfile\";\nexport const diagramOrderKey = diagramKey + \"Order\";\n\nexport type YMxFile = Y.Map<unknown>;\n\nexport interface MxFile extends ElementCompact {\n diagram: Diagram[];\n}\n\nexport function parse(object: MxFile, doc: Y.Doc) {\n const mxfile = doc.getMap(key);\n mxfile.set(\"pages\", (object._attributes?.pages || \"1\") + \"\");\n\n const diagramList = object.diagram.map((diagram) => ({\n value: parseDiagram(diagram),\n id: (diagram._attributes?.id || \"\") as string,\n }));\n const diagramMap = new Y.Map<YDiagram>();\n const diagramOrder = new Y.Array<string>();\n diagramList.forEach((diagram) => {\n diagramMap.set(diagram.id, diagram.value);\n });\n diagramOrder.push(diagramList.map((diagram) => diagram.id));\n\n mxfile.set(diagramKey, diagramMap);\n mxfile.set(diagramOrderKey, diagramOrder);\n return mxfile;\n}\n\nexport function serializer(yMxFile: YMxFile): ElementCompact {\n const diagrams = getMap<YDiagram>(yMxFile, diagramKey);\n const diagramOrder = getArray<string>(yMxFile, diagramOrderKey);\n\n const orderIds = diagramOrder ? diagramOrder.toArray() : [];\n // 如果 diagramOrder 为空但 diagram map 不为空,使用 diagram map 中的所有 ID\n const ids =\n orderIds.length > 0\n ? orderIds\n : diagrams\n ? Array.from(diagrams.keys())\n : [];\n\n const obj: Record<string, unknown> = {\n _attributes: {\n pages: (yMxFile.get(\"pages\") as string) || \"1\",\n },\n [diagramKey]: ids\n .map((id) => diagrams!.get(id) as YDiagram)\n .filter((d): d is YDiagram => !!d)\n .map((diagramElement) => serializeDiagram(diagramElement)),\n };\n\n return obj as ElementCompact;\n}\n","import * as Y from \"yjs\";\nimport { parse, serializer } from \"../helper/xml\";\nimport {\n parse as parseMxFile,\n key as mxfileKey,\n serializer as serializerMxFile,\n type YMxFile,\n} from \"../models/mxfile\";\nimport {\n parse as parseMxGraphModel,\n key as mxGraphModelKey,\n serialize as serializerMxGraphModel,\n type YMxGraphModel,\n} from \"../models/mxGraphModel\";\n\nexport function xml2ydoc(xml: string, doc: Y.Doc): Y.Doc {\n const object = parse(xml);\n\n const mxfile = (object as Record<string, unknown>).mxfile;\n const mxGraphModel = (object as Record<string, unknown>).mxGraphModel;\n if (mxfile) {\n doc.transact(() => {\n parseMxFile(mxfile as import(\"../models/mxfile\").MxFile, doc);\n });\n } else if (mxGraphModel) {\n doc.transact(() => {\n parseMxGraphModel(\n mxGraphModel as import(\"../models/mxGraphModel\").MxGraphModel,\n doc,\n );\n });\n } else {\n throw new Error(\"不支持的文件格式\");\n }\n\n return doc;\n}\n\nexport function ydoc2xml(doc: Y.Doc, spaces = 0): string {\n if (doc.share.has(mxfileKey)) {\n return serializer(\n {\n [mxfileKey]: serializerMxFile(doc.getMap(mxfileKey)),\n },\n spaces,\n );\n }\n if (doc.share.has(mxGraphModelKey)) {\n return serializer(\n {\n [mxGraphModelKey]: serializerMxGraphModel(doc.getMap(mxGraphModelKey)),\n },\n spaces,\n );\n }\n\n return \"\";\n}\n"],"names":["key","parse","serializer","serialize","mxCellKey","_a","parseMxCell","serializeMxCell","parseMxGraphModel","mxGraphModelKey","serializeMxGraphModel","diagramKey","parseDiagram","serializeDiagram","parseMxFile","mxfileKey","serializerMxFile","serializerMxGraphModel"],"mappings":"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"}
@@ -140,12 +140,14 @@ function serialize$2(xmlElement) {
140
140
  }
141
141
  const key$2 = "mxGraphModel";
142
142
  const mxCellOrderKey = key$3 + "Order";
143
+ const backgroundKey = "background";
143
144
  function parse$2(object, doc) {
145
+ var _a;
144
146
  const mxCells = (object.root[key$3] || []).map((cell) => {
145
- var _a;
147
+ var _a2;
146
148
  return {
147
149
  value: parse$3(cell),
148
- id: ((_a = cell._attributes) == null ? void 0 : _a.id) || ""
150
+ id: ((_a2 = cell._attributes) == null ? void 0 : _a2.id) || ""
149
151
  };
150
152
  });
151
153
  const mxGraphElement = (doc == null ? void 0 : doc.getMap(key$2)) || new Y__namespace.Map();
@@ -157,13 +159,20 @@ function parse$2(object, doc) {
157
159
  cellsOrder.push(mxCells.map((cell) => cell.id));
158
160
  mxGraphElement.set(key$3, cells);
159
161
  mxGraphElement.set(mxCellOrderKey, cellsOrder);
162
+ const bg = (_a = object._attributes) == null ? void 0 : _a.background;
163
+ if (bg != null && bg !== "") {
164
+ mxGraphElement.set(backgroundKey, String(bg));
165
+ }
160
166
  return mxGraphElement;
161
167
  }
162
168
  function serialize$1(map) {
163
169
  const cells = getMap(map, key$3);
164
170
  const cellsOrder = getArray(map, mxCellOrderKey);
171
+ const bg = map.get(backgroundKey);
172
+ const _attributes = {};
173
+ if (bg) _attributes.background = bg;
165
174
  return {
166
- _attributes: {},
175
+ _attributes,
167
176
  root: {
168
177
  [key$3]: cellsOrder.toArray().map((id) => serialize$2(cells.get(id)))
169
178
  }
@@ -264,10 +273,12 @@ function ydoc2xml(doc, spaces = 0) {
264
273
  }
265
274
  return "";
266
275
  }
276
+ exports.backgroundKey = backgroundKey;
267
277
  exports.diagramOrderKey = diagramOrderKey;
268
- exports.key = key;
269
- exports.key$1 = key$1;
270
- exports.key$2 = key$2;
278
+ exports.getMap = getMap;
279
+ exports.key = key$2;
280
+ exports.key$1 = key;
281
+ exports.key$2 = key$1;
271
282
  exports.key$3 = key$3;
272
283
  exports.mxCellOrderKey = mxCellOrderKey;
273
284
  exports.parse = parse$4;
@@ -276,4 +287,4 @@ exports.serialize = serialize;
276
287
  exports.serializer = serializer$1;
277
288
  exports.xml2ydoc = xml2ydoc;
278
289
  exports.ydoc2xml = ydoc2xml;
279
- //# sourceMappingURL=index-CaG-EdEK.cjs.map
290
+ //# sourceMappingURL=index-D3Hk2QcW.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-D3Hk2QcW.cjs","sources":["../src/helper/xml.ts","../src/helper/yjs.ts","../src/models/mxCell.ts","../src/models/mxGraphModel.ts","../src/models/diagram.ts","../src/models/mxfile.ts","../src/transform/index.ts"],"sourcesContent":["import { xml2js, js2xml, type ElementCompact } from \"xml-js\";\n\nfunction deepProcess(node: unknown): void {\n if (node == null) return;\n\n if (Array.isArray(node)) {\n for (const item of node) {\n deepProcess(item);\n }\n return;\n }\n\n if (typeof node !== \"object\") return;\n\n const obj = node as Record<string, unknown>;\n const keys = Object.keys(obj);\n for (const key of keys) {\n if (key === \"_attributes\") continue;\n\n let value = obj[key];\n const keyLower = key.toLowerCase();\n\n if (\n (keyLower === \"diagram\" || keyLower === \"mxcell\") &&\n value !== undefined &&\n !Array.isArray(value)\n ) {\n obj[key] = [value];\n value = obj[key];\n }\n\n if (Array.isArray(value)) {\n for (const v of value) deepProcess(v);\n } else if (value && typeof value === \"object\") {\n deepProcess(value);\n }\n }\n}\n\nexport function parse(xml: string) {\n const result = xml2js(xml, { compact: true }) as Record<string, unknown>;\n deepProcess(result);\n return result;\n}\n\nexport function serializer(obj: ElementCompact, spaces = 2) {\n return js2xml(obj, {\n compact: true,\n spaces,\n });\n}\n","import * as Y from \"yjs\";\n\n/**\n * 从 Y.Map 中安全获取子 Map(格式固定,转型安全)\n */\nexport function getMap<T = unknown>(\n parent: Y.Map<unknown>,\n key: string,\n): Y.Map<T> | undefined {\n return parent.get(key) as Y.Map<T> | undefined;\n}\n\n/**\n * 从 Y.Map 中安全获取子 Array(格式固定,转型安全)\n */\nexport function getArray<T = unknown>(\n parent: Y.Map<unknown>,\n key: string,\n): Y.Array<T> | undefined {\n return parent.get(key) as Y.Array<T> | undefined;\n}\n","import * as Y from \"yjs\";\nimport { xml2js, js2xml } from \"xml-js\";\nimport type { ElementCompact } from \"xml-js\";\n\nexport const key = \"mxCell\";\n\nconst mxGeometryKey = \"mxGeometry\";\nconst mxGeometryAttributeKey = \"geometry\";\n\nexport interface MxCellModel extends ElementCompact {\n [mxGeometryKey]?: ElementCompact;\n}\n\nexport function parse(object: MxCellModel): Y.XmlElement {\n const xmlElement = new Y.XmlElement(\"mxCell\");\n\n for (const attribute of Object.keys(object._attributes || {})) {\n xmlElement.setAttribute(\n attribute,\n `${object._attributes?.[attribute] || \"\"}`,\n );\n }\n\n if (object[mxGeometryKey]) {\n const geometry = object[mxGeometryKey];\n const geometryString = js2xml(\n { [mxGeometryKey]: geometry },\n {\n compact: true,\n },\n );\n xmlElement.setAttribute(mxGeometryAttributeKey, geometryString);\n delete object[mxGeometryKey];\n }\n\n return xmlElement;\n}\n\nexport function serialize(xmlElement: Y.XmlElement) {\n const rawAttributes = {\n ...xmlElement.getAttributes(),\n };\n\n // 提取 mxGeometry(不需要转义,它本身就是 XML 字符串)\n let mxGeometry: ElementCompact | null = null;\n let mxGeometryString: string | undefined;\n\n if (mxGeometryAttributeKey in rawAttributes) {\n mxGeometryString = rawAttributes[mxGeometryAttributeKey];\n delete rawAttributes[mxGeometryAttributeKey];\n }\n\n // 转义其他属性值中的特殊字符\n const attributes: Record<string, string> = {};\n for (const [key, value] of Object.entries(rawAttributes)) {\n if (typeof value === \"string\") {\n attributes[key] = value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&apos;\");\n } else if (value != null) {\n attributes[key] = String(value);\n }\n }\n\n // 解析 mxGeometry\n if (mxGeometryString) {\n try {\n const parsed = xml2js(mxGeometryString, { compact: true }) as Record<\n string,\n ElementCompact\n >;\n mxGeometry = parsed[mxGeometryKey] ?? null;\n if (mxGeometry && mxGeometry._attributes) {\n mxGeometry._attributes[\"as\"] = \"geometry\";\n }\n } catch (e) {\n console.warn(\"[y-mxgraph] Failed to parse mxGeometry:\", e);\n }\n }\n\n const obj: Record<string, unknown> = {\n _attributes: attributes,\n };\n\n if (mxGeometry) {\n obj[mxGeometryKey] = mxGeometry;\n }\n\n return obj;\n}\n","import * as Y from \"yjs\";\nimport { getMap, getArray } from \"../helper/yjs\";\n\nimport {\n key as mxCellKey,\n parse as parseMxCell,\n serialize as serializeMxCell,\n type MxCellModel,\n} from \"./mxCell\";\nimport type { ElementCompact } from \"xml-js\";\n\nexport const key = \"mxGraphModel\";\nexport const mxCellOrderKey = mxCellKey + \"Order\";\n/** 协同同步的 mxGraphModel 属性:仅 background */\nexport const backgroundKey = \"background\";\n\nexport interface MxGraphModel extends ElementCompact {\n _attributes?: Record<string, string>;\n root: {\n mxCell: MxCellModel[];\n };\n}\n\nexport type YMxGraphModel = Y.Map<unknown>;\n\nexport function parse(object: MxGraphModel, doc?: Y.Doc) {\n const mxCells = (object.root[mxCellKey] || []).map((cell: MxCellModel) => {\n return {\n value: parseMxCell(cell),\n id: (cell._attributes?.id || \"\") as string,\n };\n });\n\n const mxGraphElement = doc?.getMap(key) || new Y.Map();\n\n const cells = new Y.Map<Y.XmlElement>();\n const cellsOrder = new Y.Array<string>();\n\n mxCells.forEach((cell) => {\n cells.set(cell.id, cell.value);\n });\n\n cellsOrder.push(mxCells.map((cell) => cell.id));\n\n mxGraphElement.set(mxCellKey, cells);\n mxGraphElement.set(mxCellOrderKey, cellsOrder);\n\n const bg = object._attributes?.background;\n if (bg != null && bg !== \"\") {\n mxGraphElement.set(backgroundKey, String(bg));\n }\n\n return mxGraphElement as YMxGraphModel;\n}\n\nexport function serialize(map: YMxGraphModel) {\n const cells = getMap<Y.XmlElement>(map, mxCellKey)!;\n const cellsOrder = getArray<string>(map, mxCellOrderKey)!;\n const bg = map.get(backgroundKey) as string | undefined;\n const _attributes: Record<string, string> = {};\n if (bg) _attributes.background = bg;\n return {\n _attributes,\n root: {\n [mxCellKey]: cellsOrder\n .toArray()\n .map((id) => serializeMxCell(cells!.get(id) as Y.XmlElement)),\n },\n };\n}\n","import * as Y from \"yjs\";\nimport { getMap } from \"../helper/yjs\";\nimport {\n parse as parseMxGraphModel,\n serialize as serializeMxGraphModel,\n key as mxGraphModelKey,\n type MxGraphModel,\n type YMxGraphModel,\n} from \"./mxGraphModel\";\nimport type { ElementCompact } from \"xml-js\";\n\nexport const key = \"diagram\";\n\nexport interface Diagram extends ElementCompact {\n mxGraphModel: MxGraphModel;\n}\n\nexport type YDiagram = Y.Map<unknown>;\n\nexport function parse(object: Diagram): YDiagram {\n const yDiagramElement = new Y.Map();\n yDiagramElement.set(\"name\", `${object._attributes?.name || \"\"}`);\n yDiagramElement.set(\"id\", `${object._attributes?.id || \"\"}`);\n\n const mxGraphModel = parseMxGraphModel(object[mxGraphModelKey]);\n\n yDiagramElement.set(mxGraphModelKey, mxGraphModel);\n return yDiagramElement as YDiagram;\n}\n\nexport function serialize(yDiagram: YDiagram) {\n const mxGraphModel = getMap(yDiagram, mxGraphModelKey);\n\n return {\n _attributes: {\n name: yDiagram.get(\"name\") as string,\n id: yDiagram.get(\"id\") as string,\n },\n [mxGraphModelKey]: mxGraphModel\n ? serializeMxGraphModel(mxGraphModel)\n : undefined,\n };\n}\n","import * as Y from \"yjs\";\nimport { getMap, getArray } from \"../helper/yjs\";\nimport {\n parse as parseDiagram,\n key as diagramKey,\n serialize as serializeDiagram,\n} from \"./diagram\";\nimport type { Diagram, YDiagram } from \"./diagram\";\nimport type { ElementCompact } from \"xml-js\";\n\nexport const key = \"mxfile\";\nexport const diagramOrderKey = diagramKey + \"Order\";\n\nexport type YMxFile = Y.Map<unknown>;\n\nexport interface MxFile extends ElementCompact {\n diagram: Diagram[];\n}\n\nexport function parse(object: MxFile, doc: Y.Doc) {\n const mxfile = doc.getMap(key);\n mxfile.set(\"pages\", (object._attributes?.pages || \"1\") + \"\");\n\n const diagramList = object.diagram.map((diagram) => ({\n value: parseDiagram(diagram),\n id: (diagram._attributes?.id || \"\") as string,\n }));\n const diagramMap = new Y.Map<YDiagram>();\n const diagramOrder = new Y.Array<string>();\n diagramList.forEach((diagram) => {\n diagramMap.set(diagram.id, diagram.value);\n });\n diagramOrder.push(diagramList.map((diagram) => diagram.id));\n\n mxfile.set(diagramKey, diagramMap);\n mxfile.set(diagramOrderKey, diagramOrder);\n return mxfile;\n}\n\nexport function serializer(yMxFile: YMxFile): ElementCompact {\n const diagrams = getMap<YDiagram>(yMxFile, diagramKey);\n const diagramOrder = getArray<string>(yMxFile, diagramOrderKey);\n\n const orderIds = diagramOrder ? diagramOrder.toArray() : [];\n // 如果 diagramOrder 为空但 diagram map 不为空,使用 diagram map 中的所有 ID\n const ids =\n orderIds.length > 0\n ? orderIds\n : diagrams\n ? Array.from(diagrams.keys())\n : [];\n\n const obj: Record<string, unknown> = {\n _attributes: {\n pages: (yMxFile.get(\"pages\") as string) || \"1\",\n },\n [diagramKey]: ids\n .map((id) => diagrams!.get(id) as YDiagram)\n .filter((d): d is YDiagram => !!d)\n .map((diagramElement) => serializeDiagram(diagramElement)),\n };\n\n return obj as ElementCompact;\n}\n","import * as Y from \"yjs\";\nimport { parse, serializer } from \"../helper/xml\";\nimport {\n parse as parseMxFile,\n key as mxfileKey,\n serializer as serializerMxFile,\n type YMxFile,\n} from \"../models/mxfile\";\nimport {\n parse as parseMxGraphModel,\n key as mxGraphModelKey,\n serialize as serializerMxGraphModel,\n type YMxGraphModel,\n} from \"../models/mxGraphModel\";\n\nexport function xml2ydoc(xml: string, doc: Y.Doc): Y.Doc {\n const object = parse(xml);\n\n const mxfile = (object as Record<string, unknown>).mxfile;\n const mxGraphModel = (object as Record<string, unknown>).mxGraphModel;\n if (mxfile) {\n doc.transact(() => {\n parseMxFile(mxfile as import(\"../models/mxfile\").MxFile, doc);\n });\n } else if (mxGraphModel) {\n doc.transact(() => {\n parseMxGraphModel(\n mxGraphModel as import(\"../models/mxGraphModel\").MxGraphModel,\n doc,\n );\n });\n } else {\n throw new Error(\"不支持的文件格式\");\n }\n\n return doc;\n}\n\nexport function ydoc2xml(doc: Y.Doc, spaces = 0): string {\n if (doc.share.has(mxfileKey)) {\n return serializer(\n {\n [mxfileKey]: serializerMxFile(doc.getMap(mxfileKey)),\n },\n spaces,\n );\n }\n if (doc.share.has(mxGraphModelKey)) {\n return serializer(\n {\n [mxGraphModelKey]: serializerMxGraphModel(doc.getMap(mxGraphModelKey)),\n },\n spaces,\n );\n }\n\n return \"\";\n}\n"],"names":["key","parse","xml2js","serializer","js2xml","Y","serialize","mxCellKey","_a","parseMxCell","serializeMxCell","parseMxGraphModel","mxGraphModelKey","serializeMxGraphModel","diagramKey","parseDiagram","serializeDiagram","parseMxFile","mxfileKey","serializerMxFile","serializerMxGraphModel"],"mappings":"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"}
@@ -13,7 +13,7 @@ export declare function serialize(yDiagram: YDiagram): {
13
13
  id: string;
14
14
  };
15
15
  mxGraphModel: {
16
- _attributes: {};
16
+ _attributes: Record<string, string>;
17
17
  root: {
18
18
  mxCell: Record<string, unknown>[];
19
19
  };
@@ -3,7 +3,10 @@ import { type MxCellModel } from "./mxCell";
3
3
  import type { ElementCompact } from "xml-js";
4
4
  export declare const key = "mxGraphModel";
5
5
  export declare const mxCellOrderKey: string;
6
+ /** 协同同步的 mxGraphModel 属性:仅 background */
7
+ export declare const backgroundKey = "background";
6
8
  export interface MxGraphModel extends ElementCompact {
9
+ _attributes?: Record<string, string>;
7
10
  root: {
8
11
  mxCell: MxCellModel[];
9
12
  };
@@ -11,7 +14,7 @@ export interface MxGraphModel extends ElementCompact {
11
14
  export type YMxGraphModel = Y.Map<unknown>;
12
15
  export declare function parse(object: MxGraphModel, doc?: Y.Doc): YMxGraphModel;
13
16
  export declare function serialize(map: YMxGraphModel): {
14
- _attributes: {};
17
+ _attributes: Record<string, string>;
15
18
  root: {
16
19
  mxCell: Record<string, unknown>[];
17
20
  };
@@ -1 +1 @@
1
- {"version":3,"file":"mxGraphModel.d.ts","sourceRoot":"","sources":["../../src/models/mxGraphModel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAGzB,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAE7C,eAAO,MAAM,GAAG,iBAAiB,CAAC;AAClC,eAAO,MAAM,cAAc,QAAsB,CAAC;AAElD,MAAM,WAAW,YAAa,SAAQ,cAAc;IAClD,IAAI,EAAE;QACJ,MAAM,EAAE,WAAW,EAAE,CAAC;KACvB,CAAC;CACH;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAE3C,wBAAgB,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,GAsB5B,aAAa,CACvC;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,aAAa;;;;;EAW3C"}
1
+ {"version":3,"file":"mxGraphModel.d.ts","sourceRoot":"","sources":["../../src/models/mxGraphModel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAGzB,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAE7C,eAAO,MAAM,GAAG,iBAAiB,CAAC;AAClC,eAAO,MAAM,cAAc,QAAsB,CAAC;AAClD,yCAAyC;AACzC,eAAO,MAAM,aAAa,eAAe,CAAC;AAE1C,MAAM,WAAW,YAAa,SAAQ,cAAc;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,IAAI,EAAE;QACJ,MAAM,EAAE,WAAW,EAAE,CAAC;KACvB,CAAC;CACH;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAE3C,wBAAgB,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,GA2B5B,aAAa,CACvC;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,aAAa;;;;;EAc3C"}
@@ -0,0 +1,12 @@
1
+ import type { YDiagram } from "./diagram";
2
+ /** draw.io patch 里 view.background 的值 → XML 属性 */
3
+ export declare function patchValueToXmlAttr(value: string): string;
4
+ /** XML background → draw.io patch 用的 JSON 字符串 */
5
+ export declare function xmlAttrToPatchValue(value: string): string;
6
+ export declare function getBackground(diagram: YDiagram): string | undefined;
7
+ export declare function setBackground(diagram: YDiagram, background: string | undefined): void;
8
+ /** 生成 draw.io 可消费的 view patch(仅 background) */
9
+ export declare function diffBackgroundViewPatch(prev: string | undefined, curr: string | undefined): Record<string, string> | undefined;
10
+ /** 应用 draw.io diffPages 的 view 段(仅处理 background) */
11
+ export declare function applyViewPatch(diagram: YDiagram, viewPatch: Record<string, unknown>): void;
12
+ //# sourceMappingURL=view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../src/models/view.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE1C,kDAAkD;AAClD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQzD;AAED,iDAAiD;AACjD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAKnE;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,QAAQ,EACjB,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,IAAI,CAQN;AAED,+CAA+C;AAC/C,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,IAAI,EAAE,MAAM,GAAG,SAAS,GACvB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAOpC;AAED,oDAAoD;AACpD,wBAAgB,cAAc,CAC5B,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,IAAI,CAeN"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "y-mxgraph",
3
- "version": "0.8.2",
3
+ "version": "0.8.3",
4
4
  "description": "Yjs binding for draw.io (mxGraph) documents",
5
5
  "keywords": [
6
6
  "yjs",
package/transform.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const transform = require("./index-CaG-EdEK.cjs");
3
+ const transform = require("./index-D3Hk2QcW.cjs");
4
4
  exports.xml2ydoc = transform.xml2ydoc;
5
5
  exports.ydoc2xml = transform.ydoc2xml;
6
6
  //# sourceMappingURL=transform.cjs.map
package/transform.js CHANGED
@@ -1,4 +1,4 @@
1
- import { x, y } from "./index-BtfQrQYT.js";
1
+ import { x, y } from "./index-BhW4J2Zt.js";
2
2
  export {
3
3
  x as xml2ydoc,
4
4
  y as ydoc2xml
package/y-mxgraph.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const transform = require("./index-CaG-EdEK.cjs");
3
+ const transform = require("./index-D3Hk2QcW.cjs");
4
4
  const Y = require("yjs");
5
5
  const colord = require("colord");
6
6
  function _interopNamespaceDefault(e) {
@@ -20,6 +20,54 @@ function _interopNamespaceDefault(e) {
20
20
  return Object.freeze(n);
21
21
  }
22
22
  const Y__namespace = /* @__PURE__ */ _interopNamespaceDefault(Y);
23
+ function patchValueToXmlAttr(value) {
24
+ try {
25
+ const parsed = JSON.parse(value);
26
+ if (typeof parsed === "string") return parsed;
27
+ } catch (e) {
28
+ }
29
+ return value;
30
+ }
31
+ function xmlAttrToPatchValue(value) {
32
+ return JSON.stringify(value);
33
+ }
34
+ function getBackground(diagram) {
35
+ const gm = transform.getMap(diagram, transform.key);
36
+ if (!gm) return void 0;
37
+ const bg = gm.get(transform.backgroundKey);
38
+ return bg || void 0;
39
+ }
40
+ function setBackground(diagram, background) {
41
+ const gm = transform.getMap(diagram, transform.key);
42
+ if (!gm) return;
43
+ if (background != null && background !== "") {
44
+ gm.set(transform.backgroundKey, background);
45
+ } else {
46
+ gm.delete(transform.backgroundKey);
47
+ }
48
+ }
49
+ function diffBackgroundViewPatch(prev, curr) {
50
+ const pv = prev != null ? prev : "";
51
+ const cv = curr != null ? curr : "";
52
+ if (pv === cv) return void 0;
53
+ return {
54
+ background: cv === "" ? '""' : xmlAttrToPatchValue(cv)
55
+ };
56
+ }
57
+ function applyViewPatch(diagram, viewPatch) {
58
+ if (!("background" in viewPatch)) return;
59
+ const raw = viewPatch.background;
60
+ if (raw === null || raw === void 0) {
61
+ setBackground(diagram, void 0);
62
+ return;
63
+ }
64
+ const str = String(raw);
65
+ if (str === "" || str === '""' || str === "null") {
66
+ setBackground(diagram, void 0);
67
+ } else {
68
+ setBackground(diagram, patchValueToXmlAttr(str));
69
+ }
70
+ }
23
71
  var __defProp$1 = Object.defineProperty;
24
72
  var __defProps = Object.defineProperties;
25
73
  var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
@@ -72,11 +120,39 @@ function ensureUniqueOrder(orderArr) {
72
120
  dupIdx.sort((a, b) => b - a).forEach((idx) => orderArr.delete(idx, 1));
73
121
  }
74
122
  }
123
+ function pruneEmptyPatch(patch) {
124
+ var _a, _b;
125
+ if (!patch[DIFF_UPDATE]) return patch;
126
+ for (const id of Object.keys(patch[DIFF_UPDATE])) {
127
+ const u = patch[DIFF_UPDATE][id];
128
+ const cells = u.cells;
129
+ if (cells == null ? void 0 : cells[DIFF_UPDATE]) {
130
+ for (const cid of Object.keys(cells[DIFF_UPDATE])) {
131
+ if (Object.keys(cells[DIFF_UPDATE][cid]).length === 0) {
132
+ delete cells[DIFF_UPDATE][cid];
133
+ }
134
+ }
135
+ if (Object.keys(cells[DIFF_UPDATE]).length === 0) {
136
+ delete cells[DIFF_UPDATE];
137
+ }
138
+ }
139
+ if (cells && !((_a = cells[DIFF_REMOVE]) == null ? void 0 : _a.length) && !((_b = cells[DIFF_INSERT]) == null ? void 0 : _b.length) && (!cells[DIFF_UPDATE] || Object.keys(cells[DIFF_UPDATE]).length === 0)) {
140
+ delete u.cells;
141
+ }
142
+ if (Object.keys(u).length === 0) {
143
+ delete patch[DIFF_UPDATE][id];
144
+ }
145
+ }
146
+ if (Object.keys(patch[DIFF_UPDATE]).length === 0) {
147
+ delete patch[DIFF_UPDATE];
148
+ }
149
+ return patch;
150
+ }
75
151
  function applyFilePatch(doc, patch, options) {
76
152
  doc.transact(() => {
77
- const mxfile = doc.getMap(transform.key);
153
+ const mxfile = doc.getMap(transform.key$1);
78
154
  if (patch[DIFF_REMOVE]) {
79
- const diagramsMap = mxfile.get(transform.key$1);
155
+ const diagramsMap = mxfile.get(transform.key$2);
80
156
  const orderArr = mxfile.get(
81
157
  transform.diagramOrderKey
82
158
  );
@@ -90,7 +166,7 @@ function applyFilePatch(doc, patch, options) {
90
166
  }
91
167
  }
92
168
  if (patch[DIFF_INSERT]) {
93
- const diagramsMap = mxfile.get(transform.key$1);
169
+ const diagramsMap = mxfile.get(transform.key$2);
94
170
  const orderArr = mxfile.get(
95
171
  transform.diagramOrderKey
96
172
  );
@@ -161,7 +237,7 @@ function applyFilePatch(doc, patch, options) {
161
237
  if (patch[DIFF_UPDATE]) {
162
238
  Object.keys(patch[DIFF_UPDATE]).forEach((id) => {
163
239
  const diagramsMap = mxfile.get(
164
- transform.key$1
240
+ transform.key$2
165
241
  );
166
242
  const diagram = diagramsMap.get(id);
167
243
  if (diagram) {
@@ -172,8 +248,11 @@ function applyFilePatch(doc, patch, options) {
172
248
  update.name || ""
173
249
  );
174
250
  }
251
+ if (update.view && typeof update.view === "object") {
252
+ applyViewPatch(diagram, update.view);
253
+ }
175
254
  if (update.cells) {
176
- const yMxGraphModel = diagram.get(transform.key$2);
255
+ const yMxGraphModel = diagram.get(transform.key);
177
256
  if (!yMxGraphModel) return;
178
257
  const cellsMap = yMxGraphModel.get(transform.key$3);
179
258
  const orderArr = yMxGraphModel.get(transform.mxCellOrderKey);
@@ -308,8 +387,8 @@ function applyFilePatch(doc, patch, options) {
308
387
  }
309
388
  function initDocSnapshot(doc, resetSnapshot = false) {
310
389
  try {
311
- const mxfile = doc.getMap(transform.key);
312
- const diagramsMap = mxfile.get(transform.key$1);
390
+ const mxfile = doc.getMap(transform.key$1);
391
+ const diagramsMap = mxfile.get(transform.key$2);
313
392
  const orderArr = mxfile.get(transform.diagramOrderKey);
314
393
  const orderIds = orderArr ? orderArr.toArray() : [];
315
394
  const allDiagramIds = orderIds.length > 0 ? orderIds : diagramsMap ? Array.from(diagramsMap.keys()) : [];
@@ -317,13 +396,14 @@ function initDocSnapshot(doc, resetSnapshot = false) {
317
396
  const snap = {
318
397
  diagramOrder,
319
398
  cellsOrder: /* @__PURE__ */ new Map(),
320
- cellAttrs: /* @__PURE__ */ new Map()
399
+ cellAttrs: /* @__PURE__ */ new Map(),
400
+ diagramBackground: /* @__PURE__ */ new Map()
321
401
  };
322
402
  const diagrams = diagramOrder.map((id) => diagramsMap.get(id)).filter((d) => !!d);
323
403
  for (const d of diagrams) {
324
404
  const did = d.get("id") || "";
325
405
  if (!did) continue;
326
- const gm = d.get(transform.key$2);
406
+ const gm = d.get(transform.key);
327
407
  if (gm) {
328
408
  const order = gm.get(transform.mxCellOrderKey);
329
409
  const ids = order ? order.toArray().slice() : [];
@@ -346,6 +426,7 @@ function initDocSnapshot(doc, resetSnapshot = false) {
346
426
  snap.cellsOrder.set(did, []);
347
427
  snap.cellAttrs.set(did, /* @__PURE__ */ new Map());
348
428
  }
429
+ snap.diagramBackground.set(did, getBackground(d));
349
430
  }
350
431
  docSnapshots.set(doc, snap);
351
432
  } catch (e) {
@@ -358,21 +439,23 @@ function generatePatch(events, explicitDoc) {
358
439
  const doc = (_b = (_a = events[0]) == null ? void 0 : _a.transaction) == null ? void 0 : _b.doc;
359
440
  if (!doc) return patch;
360
441
  if (!events || events.length === 0) return patch;
361
- const mxfile = doc.getMap(transform.key);
362
- const diagramsMap = mxfile.get(transform.key$1);
442
+ const mxfile = doc.getMap(transform.key$1);
443
+ const diagramsMap = mxfile.get(transform.key$2);
363
444
  const orderArr = mxfile.get(transform.diagramOrderKey);
364
445
  let snap = docSnapshots.get(doc);
365
446
  if (!snap) {
366
447
  snap = {
367
448
  diagramOrder: null,
368
449
  cellsOrder: /* @__PURE__ */ new Map(),
369
- cellAttrs: /* @__PURE__ */ new Map()
450
+ cellAttrs: /* @__PURE__ */ new Map(),
451
+ diagramBackground: /* @__PURE__ */ new Map()
370
452
  };
371
453
  docSnapshots.set(doc, snap);
372
454
  }
373
455
  const prevDiagramOrder = snap.diagramOrder;
374
456
  const prevCellsOrder = snap.cellsOrder;
375
457
  const prevCellsAttrs = snap.cellAttrs;
458
+ const prevDiagramBackground = snap.diagramBackground;
376
459
  const ensureUpdate = (diagramId) => {
377
460
  patch[DIFF_UPDATE] = patch[DIFF_UPDATE] || {};
378
461
  patch[DIFF_UPDATE][diagramId] = patch[DIFF_UPDATE][diagramId] || {};
@@ -388,10 +471,12 @@ function generatePatch(events, explicitDoc) {
388
471
  const diagramsList = currDiagramOrder.map((id) => diagramsMap.get(id)).filter((d) => !!d);
389
472
  const currCellsOrder = /* @__PURE__ */ new Map();
390
473
  const cellAttrMap = /* @__PURE__ */ new Map();
474
+ const currDiagramBackground = /* @__PURE__ */ new Map();
391
475
  for (const d of diagramsList) {
392
476
  const did = d.get("id") || "";
477
+ currDiagramBackground.set(did, getBackground(d));
393
478
  const attrs = /* @__PURE__ */ new Map();
394
- const gm = d.get(transform.key$2);
479
+ const gm = d.get(transform.key);
395
480
  if (gm) {
396
481
  const cellsMap = gm.get(transform.key$3);
397
482
  const orderArr2 = gm.get(transform.mxCellOrderKey);
@@ -511,19 +596,35 @@ function generatePatch(events, explicitDoc) {
511
596
  if (!(target instanceof Y__namespace.Map)) continue;
512
597
  if (!diagramSet.has(target)) continue;
513
598
  const changed = ev.keysChanged || /* @__PURE__ */ new Set();
514
- if (!changed || !changed.has("name")) continue;
599
+ if (!(changed == null ? void 0 : changed.has("name"))) continue;
515
600
  const did = target.get("id") || "";
516
601
  if (!did || insertedDiagramIdGlobal.has(did)) continue;
517
- const u = ensureUpdate(did);
518
- u.name = target.get("name") || "";
602
+ ensureUpdate(did).name = target.get("name") || "";
519
603
  }
520
604
  }
521
605
  if (!prevDiagramOrder) {
522
606
  for (const d of diagramsList) {
523
607
  const did = d.get("id") || "";
524
608
  if (!did) continue;
525
- const u = ensureUpdate(did);
526
- u.name = d.get("name") || "";
609
+ ensureUpdate(did).name = d.get("name") || "";
610
+ }
611
+ }
612
+ for (const ev of events) {
613
+ const target = ev.target;
614
+ if (!(target instanceof Y__namespace.Map)) continue;
615
+ for (const d of diagramsList) {
616
+ const gm = d.get(transform.key);
617
+ if (gm !== target) continue;
618
+ const changed = ev.keysChanged || /* @__PURE__ */ new Set();
619
+ if (!changed.has(transform.backgroundKey)) continue;
620
+ const did = d.get("id") || "";
621
+ if (!did || insertedDiagramIdGlobal.has(did)) continue;
622
+ const viewDiff = diffBackgroundViewPatch(
623
+ prevDiagramBackground.get(did),
624
+ getBackground(d)
625
+ );
626
+ if (viewDiff) ensureUpdate(did).view = viewDiff;
627
+ break;
527
628
  }
528
629
  }
529
630
  for (const ev of events) {
@@ -552,6 +653,14 @@ function generatePatch(events, explicitDoc) {
552
653
  }
553
654
  }
554
655
  if (prevDiagramOrder) {
656
+ for (const [did, currBg] of currDiagramBackground.entries()) {
657
+ if (insertedDiagramIdGlobal.has(did)) continue;
658
+ const viewDiff = diffBackgroundViewPatch(
659
+ prevDiagramBackground.get(did),
660
+ currBg
661
+ );
662
+ if (viewDiff) ensureUpdate(did).view = viewDiff;
663
+ }
555
664
  for (const [did, currAttrsMap] of cellAttrMap.entries()) {
556
665
  const prevAttrsMap = prevCellsAttrs.get(did) || /* @__PURE__ */ new Map();
557
666
  const cellsPatch = ensureCellSection(did);
@@ -599,8 +708,12 @@ function generatePatch(events, explicitDoc) {
599
708
  }
600
709
  snap.cellsOrder = newCellsOrder;
601
710
  snap.cellAttrs = newCellsAttrs;
711
+ snap.diagramBackground = /* @__PURE__ */ new Map();
712
+ for (const [did, bg] of currDiagramBackground.entries()) {
713
+ snap.diagramBackground.set(did, bg);
714
+ }
602
715
  docSnapshots.set(doc, snap);
603
- return patch;
716
+ return pruneEmptyPatch(patch);
604
717
  }
605
718
  const LOCAL_ORIGIN = {};
606
719
  function createMxEventObject(name, props) {
@@ -1273,8 +1386,8 @@ function mergeFileIntoDoc(doc, fileXml, strategy) {
1273
1386
  );
1274
1387
  return false;
1275
1388
  }
1276
- const mxfileMap = doc.getMap(transform.key);
1277
- const diagramMap = mxfileMap.get(transform.key$1);
1389
+ const mxfileMap = doc.getMap(transform.key$1);
1390
+ const diagramMap = mxfileMap.get(transform.key$2);
1278
1391
  const diagramOrder = mxfileMap.get(transform.diagramOrderKey);
1279
1392
  if (!diagramMap || !diagramOrder) {
1280
1393
  console.warn("[y-mxgraph] 合并失败,doc 结构不完整,回退到 replace");
@@ -1301,7 +1414,7 @@ function mergeFileIntoDoc(doc, fileXml, strategy) {
1301
1414
  return true;
1302
1415
  }
1303
1416
  function reconcileInitialContent(doc, file, strategy, applyFileData) {
1304
- const mxfileMap = doc.getMap(transform.key);
1417
+ const mxfileMap = doc.getMap(transform.key$1);
1305
1418
  const docHasData = mxfileMap.size > 0;
1306
1419
  const fileHasAnyData = !!file.data;
1307
1420
  const fileHasDiagrams = fileHasAnyData && file.data.includes("<diagram");
@@ -1432,8 +1545,8 @@ class Binding {
1432
1545
  return;
1433
1546
  }
1434
1547
  if (this.shouldReplaceWhenDocHasData && !transaction.local) {
1435
- const mxfileMap = doc.getMap(transform.key);
1436
- const diagramMap = mxfileMap.get(transform.key$1);
1548
+ const mxfileMap = doc.getMap(transform.key$1);
1549
+ const diagramMap = mxfileMap.get(transform.key$2);
1437
1550
  if (diagramMap && diagramMap.size > 0) {
1438
1551
  const xml = transform.ydoc2xml(doc);
1439
1552
  if (xml && xml.includes("<diagram")) {
@@ -1465,7 +1578,7 @@ class Binding {
1465
1578
  this.suppressLocalApply = false;
1466
1579
  }
1467
1580
  };
1468
- doc.getMap(transform.key).observeDeep(this.docObserver);
1581
+ doc.getMap(transform.key$1).observeDeep(this.docObserver);
1469
1582
  if (awareness) {
1470
1583
  this.cleanupCollaborator = bindCollaborator(file, {
1471
1584
  awareness,
@@ -1500,7 +1613,7 @@ class Binding {
1500
1613
  destroy(deep = false) {
1501
1614
  var _a, _b;
1502
1615
  this.mxGraphModel.removeListener("change", this.mxListener);
1503
- this.doc.getMap(transform.key).unobserveDeep(this.docObserver);
1616
+ this.doc.getMap(transform.key$1).unobserveDeep(this.docObserver);
1504
1617
  if (deep) {
1505
1618
  (_a = this.cleanupCollaborator) == null ? void 0 : _a.call(this);
1506
1619
  (_b = this.cleanupUndoManager) == null ? void 0 : _b.call(this);