y-mxgraph 0.8.6 → 0.9.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.
@@ -1 +0,0 @@
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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"}
@@ -1 +0,0 @@
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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"}