@harbour-enterprises/superdoc 0.23.0-next.14 → 0.23.0-next.15

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.
Files changed (36) hide show
  1. package/dist/chunks/{PdfViewer-D3cgkd9j.cjs → PdfViewer-1MZFKzXW.cjs} +1 -1
  2. package/dist/chunks/{PdfViewer-BaaVD5bX.es.js → PdfViewer-NEyAcxt7.es.js} +1 -1
  3. package/dist/chunks/{eventemitter3-CR2eBWft.es.js → eventemitter3-BWEnUdTY.es.js} +1 -1
  4. package/dist/chunks/{eventemitter3-DSRogsNq.cjs → eventemitter3-DkXkH2rT.cjs} +1 -1
  5. package/dist/chunks/{index-CAHkANZY.cjs → index-CGtSnLpQ.cjs} +160 -465
  6. package/dist/chunks/{index-CESuSQe2.es.js → index-DAT3_wPu.es.js} +27 -332
  7. package/dist/chunks/{super-editor.es-BYutUrPg.cjs → super-editor.es-C7TgrpFl.cjs} +616 -116
  8. package/dist/chunks/{super-editor.es-BKb7p4fi.es.js → super-editor.es-Ctq_imo8.es.js} +616 -116
  9. package/dist/chunks/{xml-js-CWV8R-ek.cjs → xml-js-D_ZIzxu0.cjs} +1 -1
  10. package/dist/chunks/xml-js-Dx4FIjnp.es.js +2 -0
  11. package/dist/core/types/index.d.ts +19 -1
  12. package/dist/core/types/index.d.ts.map +1 -1
  13. package/dist/super-editor/ai-writer.es.js +2 -2
  14. package/dist/super-editor/chunks/{converter-DD7uNz2k.js → converter-vEmAnrOg.js} +665 -249
  15. package/dist/super-editor/chunks/{docx-zipper-DraPR30Z.js → docx-zipper-DA00N7eN.js} +1 -1
  16. package/dist/super-editor/chunks/{editor-xzhKWRFZ.js → editor-Das_uwlq.js} +94 -10
  17. package/dist/super-editor/chunks/{toolbar-D6SJTVWT.js → toolbar-CKugkxNQ.js} +2 -2
  18. package/dist/super-editor/converter.es.js +1 -1
  19. package/dist/super-editor/docx-zipper.es.js +2 -2
  20. package/dist/super-editor/editor.es.js +3 -3
  21. package/dist/super-editor/file-zipper.es.js +1 -1
  22. package/dist/super-editor/src/core/Editor.d.ts +57 -3
  23. package/dist/super-editor/src/core/super-converter/SuperConverter.d.ts +58 -2
  24. package/dist/super-editor/src/core/super-converter/exporter-docx-defs.d.ts +28 -39
  25. package/dist/super-editor/super-editor.es.js +6 -6
  26. package/dist/super-editor/toolbar.es.js +2 -2
  27. package/dist/super-editor.cjs +1 -1
  28. package/dist/super-editor.es.js +1 -1
  29. package/dist/superdoc.cjs +2 -3
  30. package/dist/superdoc.es.js +2 -3
  31. package/dist/superdoc.umd.js +641 -446
  32. package/dist/superdoc.umd.js.map +1 -1
  33. package/package.json +1 -1
  34. package/dist/chunks/xml-js-Bbc0NeKa.es.js +0 -2
  35. package/dist/chunks/{jszip-DAXEPCUv.es.js → jszip-BDk3JBqp.es.js} +3 -3
  36. package/dist/chunks/{jszip-B4LDL19y.cjs → jszip-u4dvXAKa.cjs} +3 -3
@@ -27,11 +27,7 @@ var __publicField$2 = (obj, key2, value) => __defNormalProp$2(obj, typeof key2 !
27
27
  var __accessCheck$2 = (obj, member, msg2) => member.has(obj) || __typeError$2("Cannot " + msg2);
28
28
  var __privateAdd$2 = (obj, member, value) => member.has(obj) ? __typeError$2("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
29
29
  var __privateMethod$2 = (obj, member, method) => (__accessCheck$2(obj, member, "access private method"), method);
30
- var _a, _DocxExporter_instances, generate_xml_as_list_fn, replaceSpecialCharacters_fn, generateXml_fn, _SuperConverter_instances, exportNumberingFile_fn, prepareCommentsXmlFilesForExport_fn, exportProcessHeadersFooters_fn, exportProcessNewRelationships_fn, exportProcessMediaFiles_fn;
31
- var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof vue.global !== "undefined" ? vue.global : typeof self !== "undefined" ? self : {};
32
- function getDefaultExportFromCjs$1(x) {
33
- return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
34
- }
30
+ var _a, _DocxExporter_instances, generate_xml_as_list_fn, replaceSpecialCharacters_fn, generateXml_fn, _SuperConverter_instances, generateDocumentHash_fn, exportNumberingFile_fn, prepareCommentsXmlFilesForExport_fn, exportProcessHeadersFooters_fn, exportProcessNewRelationships_fn, exportProcessMediaFiles_fn;
35
31
  var buffer = {};
36
32
  var base64Js = {};
37
33
  base64Js.byteLength = byteLength;
@@ -1798,6 +1794,10 @@ ieee754.write = function(buffer2, value, offset2, isLE, mLen, nBytes) {
1798
1794
  }
1799
1795
  })(buffer);
1800
1796
  const Buffer2 = buffer.Buffer;
1797
+ var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof vue.global !== "undefined" ? vue.global : typeof self !== "undefined" ? self : {};
1798
+ function getDefaultExportFromCjs$2(x) {
1799
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
1800
+ }
1801
1801
  var sax = {};
1802
1802
  var events$1 = { exports: {} };
1803
1803
  var hasRequiredEvents;
@@ -2200,7 +2200,7 @@ function requireInherits_browser() {
2200
2200
  }
2201
2201
  return inherits_browser.exports;
2202
2202
  }
2203
- function getDefaultExportFromCjs(x) {
2203
+ function getDefaultExportFromCjs$1(x) {
2204
2204
  return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
2205
2205
  }
2206
2206
  var browser$1 = { exports: {} };
@@ -2361,7 +2361,7 @@ process$1.umask = function() {
2361
2361
  return 0;
2362
2362
  };
2363
2363
  var browserExports = browser$1.exports;
2364
- const process$1$1 = /* @__PURE__ */ getDefaultExportFromCjs(browserExports);
2364
+ const process$1$1 = /* @__PURE__ */ getDefaultExportFromCjs$1(browserExports);
2365
2365
  var streamBrowser;
2366
2366
  var hasRequiredStreamBrowser;
2367
2367
  function requireStreamBrowser() {
@@ -11346,7 +11346,7 @@ function requireLib() {
11346
11346
  return lib;
11347
11347
  }
11348
11348
  var libExports = requireLib();
11349
- const xmljs = /* @__PURE__ */ getDefaultExportFromCjs$1(libExports);
11349
+ const xmljs = /* @__PURE__ */ getDefaultExportFromCjs$2(libExports);
11350
11350
  var getRandomValues;
11351
11351
  var rnds8 = new Uint8Array(16);
11352
11352
  function rng() {
@@ -11381,6 +11381,306 @@ function v4(options, buf, offset2) {
11381
11381
  rnds[8] = rnds[8] & 63 | 128;
11382
11382
  return stringify(rnds);
11383
11383
  }
11384
+ function getDefaultExportFromCjs(x) {
11385
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
11386
+ }
11387
+ const CRC_TABLE = new Int32Array([
11388
+ 0,
11389
+ 1996959894,
11390
+ 3993919788,
11391
+ 2567524794,
11392
+ 124634137,
11393
+ 1886057615,
11394
+ 3915621685,
11395
+ 2657392035,
11396
+ 249268274,
11397
+ 2044508324,
11398
+ 3772115230,
11399
+ 2547177864,
11400
+ 162941995,
11401
+ 2125561021,
11402
+ 3887607047,
11403
+ 2428444049,
11404
+ 498536548,
11405
+ 1789927666,
11406
+ 4089016648,
11407
+ 2227061214,
11408
+ 450548861,
11409
+ 1843258603,
11410
+ 4107580753,
11411
+ 2211677639,
11412
+ 325883990,
11413
+ 1684777152,
11414
+ 4251122042,
11415
+ 2321926636,
11416
+ 335633487,
11417
+ 1661365465,
11418
+ 4195302755,
11419
+ 2366115317,
11420
+ 997073096,
11421
+ 1281953886,
11422
+ 3579855332,
11423
+ 2724688242,
11424
+ 1006888145,
11425
+ 1258607687,
11426
+ 3524101629,
11427
+ 2768942443,
11428
+ 901097722,
11429
+ 1119000684,
11430
+ 3686517206,
11431
+ 2898065728,
11432
+ 853044451,
11433
+ 1172266101,
11434
+ 3705015759,
11435
+ 2882616665,
11436
+ 651767980,
11437
+ 1373503546,
11438
+ 3369554304,
11439
+ 3218104598,
11440
+ 565507253,
11441
+ 1454621731,
11442
+ 3485111705,
11443
+ 3099436303,
11444
+ 671266974,
11445
+ 1594198024,
11446
+ 3322730930,
11447
+ 2970347812,
11448
+ 795835527,
11449
+ 1483230225,
11450
+ 3244367275,
11451
+ 3060149565,
11452
+ 1994146192,
11453
+ 31158534,
11454
+ 2563907772,
11455
+ 4023717930,
11456
+ 1907459465,
11457
+ 112637215,
11458
+ 2680153253,
11459
+ 3904427059,
11460
+ 2013776290,
11461
+ 251722036,
11462
+ 2517215374,
11463
+ 3775830040,
11464
+ 2137656763,
11465
+ 141376813,
11466
+ 2439277719,
11467
+ 3865271297,
11468
+ 1802195444,
11469
+ 476864866,
11470
+ 2238001368,
11471
+ 4066508878,
11472
+ 1812370925,
11473
+ 453092731,
11474
+ 2181625025,
11475
+ 4111451223,
11476
+ 1706088902,
11477
+ 314042704,
11478
+ 2344532202,
11479
+ 4240017532,
11480
+ 1658658271,
11481
+ 366619977,
11482
+ 2362670323,
11483
+ 4224994405,
11484
+ 1303535960,
11485
+ 984961486,
11486
+ 2747007092,
11487
+ 3569037538,
11488
+ 1256170817,
11489
+ 1037604311,
11490
+ 2765210733,
11491
+ 3554079995,
11492
+ 1131014506,
11493
+ 879679996,
11494
+ 2909243462,
11495
+ 3663771856,
11496
+ 1141124467,
11497
+ 855842277,
11498
+ 2852801631,
11499
+ 3708648649,
11500
+ 1342533948,
11501
+ 654459306,
11502
+ 3188396048,
11503
+ 3373015174,
11504
+ 1466479909,
11505
+ 544179635,
11506
+ 3110523913,
11507
+ 3462522015,
11508
+ 1591671054,
11509
+ 702138776,
11510
+ 2966460450,
11511
+ 3352799412,
11512
+ 1504918807,
11513
+ 783551873,
11514
+ 3082640443,
11515
+ 3233442989,
11516
+ 3988292384,
11517
+ 2596254646,
11518
+ 62317068,
11519
+ 1957810842,
11520
+ 3939845945,
11521
+ 2647816111,
11522
+ 81470997,
11523
+ 1943803523,
11524
+ 3814918930,
11525
+ 2489596804,
11526
+ 225274430,
11527
+ 2053790376,
11528
+ 3826175755,
11529
+ 2466906013,
11530
+ 167816743,
11531
+ 2097651377,
11532
+ 4027552580,
11533
+ 2265490386,
11534
+ 503444072,
11535
+ 1762050814,
11536
+ 4150417245,
11537
+ 2154129355,
11538
+ 426522225,
11539
+ 1852507879,
11540
+ 4275313526,
11541
+ 2312317920,
11542
+ 282753626,
11543
+ 1742555852,
11544
+ 4189708143,
11545
+ 2394877945,
11546
+ 397917763,
11547
+ 1622183637,
11548
+ 3604390888,
11549
+ 2714866558,
11550
+ 953729732,
11551
+ 1340076626,
11552
+ 3518719985,
11553
+ 2797360999,
11554
+ 1068828381,
11555
+ 1219638859,
11556
+ 3624741850,
11557
+ 2936675148,
11558
+ 906185462,
11559
+ 1090812512,
11560
+ 3747672003,
11561
+ 2825379669,
11562
+ 829329135,
11563
+ 1181335161,
11564
+ 3412177804,
11565
+ 3160834842,
11566
+ 628085408,
11567
+ 1382605366,
11568
+ 3423369109,
11569
+ 3138078467,
11570
+ 570562233,
11571
+ 1426400815,
11572
+ 3317316542,
11573
+ 2998733608,
11574
+ 733239954,
11575
+ 1555261956,
11576
+ 3268935591,
11577
+ 3050360625,
11578
+ 752459403,
11579
+ 1541320221,
11580
+ 2607071920,
11581
+ 3965973030,
11582
+ 1969922972,
11583
+ 40735498,
11584
+ 2617837225,
11585
+ 3943577151,
11586
+ 1913087877,
11587
+ 83908371,
11588
+ 2512341634,
11589
+ 3803740692,
11590
+ 2075208622,
11591
+ 213261112,
11592
+ 2463272603,
11593
+ 3855990285,
11594
+ 2094854071,
11595
+ 198958881,
11596
+ 2262029012,
11597
+ 4057260610,
11598
+ 1759359992,
11599
+ 534414190,
11600
+ 2176718541,
11601
+ 4139329115,
11602
+ 1873836001,
11603
+ 414664567,
11604
+ 2282248934,
11605
+ 4279200368,
11606
+ 1711684554,
11607
+ 285281116,
11608
+ 2405801727,
11609
+ 4167216745,
11610
+ 1634467795,
11611
+ 376229701,
11612
+ 2685067896,
11613
+ 3608007406,
11614
+ 1308918612,
11615
+ 956543938,
11616
+ 2808555105,
11617
+ 3495958263,
11618
+ 1231636301,
11619
+ 1047427035,
11620
+ 2932959818,
11621
+ 3654703836,
11622
+ 1088359270,
11623
+ 936918e3,
11624
+ 2847714899,
11625
+ 3736837829,
11626
+ 1202900863,
11627
+ 817233897,
11628
+ 3183342108,
11629
+ 3401237130,
11630
+ 1404277552,
11631
+ 615818150,
11632
+ 3134207493,
11633
+ 3453421203,
11634
+ 1423857449,
11635
+ 601450431,
11636
+ 3009837614,
11637
+ 3294710456,
11638
+ 1567103746,
11639
+ 711928724,
11640
+ 3020668471,
11641
+ 3272380065,
11642
+ 1510334235,
11643
+ 755167117
11644
+ ]);
11645
+ function ensureBuffer(input) {
11646
+ if (Buffer2.isBuffer(input)) {
11647
+ return input;
11648
+ }
11649
+ if (typeof input === "number") {
11650
+ return Buffer2.alloc(input);
11651
+ } else if (typeof input === "string") {
11652
+ return Buffer2.from(input);
11653
+ } else {
11654
+ throw new Error("input must be buffer, number, or string, received " + typeof input);
11655
+ }
11656
+ }
11657
+ function bufferizeInt(num) {
11658
+ const tmp = ensureBuffer(4);
11659
+ tmp.writeInt32BE(num, 0);
11660
+ return tmp;
11661
+ }
11662
+ function _crc32(buf, previous) {
11663
+ buf = ensureBuffer(buf);
11664
+ if (Buffer2.isBuffer(previous)) {
11665
+ previous = previous.readUInt32BE(0);
11666
+ }
11667
+ let crc = ~~previous ^ -1;
11668
+ for (var n = 0; n < buf.length; n++) {
11669
+ crc = CRC_TABLE[(crc ^ buf[n]) & 255] ^ crc >>> 8;
11670
+ }
11671
+ return crc ^ -1;
11672
+ }
11673
+ function crc32() {
11674
+ return bufferizeInt(_crc32.apply(null, arguments));
11675
+ }
11676
+ crc32.signed = function() {
11677
+ return _crc32.apply(null, arguments);
11678
+ };
11679
+ crc32.unsigned = function() {
11680
+ return _crc32.apply(null, arguments) >>> 0;
11681
+ };
11682
+ var bufferCrc32 = crc32;
11683
+ const index$2 = /* @__PURE__ */ getDefaultExportFromCjs(bufferCrc32);
11384
11684
  function callOrGet(value, context = null, ...props) {
11385
11685
  if (typeof value === "function") {
11386
11686
  if (context) return value.bind(context)(...props);
@@ -15062,18 +15362,6 @@ const DEFAULT_CUSTOM_XML = {
15062
15362
  }
15063
15363
  ]
15064
15364
  };
15065
- const SETTINGS_CUSTOM_XML = {
15066
- elements: [
15067
- {
15068
- type: "element",
15069
- name: "w:settings",
15070
- attributes: {
15071
- "xmlns:w": "http://schemas.openxmlformats.org/wordprocessingml/2006/main"
15072
- },
15073
- elements: []
15074
- }
15075
- ]
15076
- };
15077
15365
  const COMMENT_REF = {
15078
15366
  type: "element",
15079
15367
  name: "w:r",
@@ -17410,15 +17698,15 @@ function canSplit(doc2, pos, depth = 1, typesAfter) {
17410
17698
  if (base2 < 0 || $pos.parent.type.spec.isolating || !$pos.parent.canReplace($pos.index(), $pos.parent.childCount) || !innerType.type.validContent($pos.parent.content.cutByIndex($pos.index(), $pos.parent.childCount)))
17411
17699
  return false;
17412
17700
  for (let d2 = $pos.depth - 1, i = depth - 2; d2 > base2; d2--, i--) {
17413
- let node = $pos.node(d2), index22 = $pos.index(d2);
17701
+ let node = $pos.node(d2), index3 = $pos.index(d2);
17414
17702
  if (node.type.spec.isolating)
17415
17703
  return false;
17416
- let rest = node.content.cutByIndex(index22, node.childCount);
17704
+ let rest = node.content.cutByIndex(index3, node.childCount);
17417
17705
  let overrideChild = typesAfter && typesAfter[i + 1];
17418
17706
  if (overrideChild)
17419
17707
  rest = rest.replaceChild(0, overrideChild.type.create(overrideChild.attrs));
17420
17708
  let after = typesAfter && typesAfter[i] || node;
17421
- if (!node.canReplace(index22 + 1, node.childCount) || !after.type.validContent(rest))
17709
+ if (!node.canReplace(index3 + 1, node.childCount) || !after.type.validContent(rest))
17422
17710
  return false;
17423
17711
  }
17424
17712
  let index2 = $pos.indexAfter(base2);
@@ -30157,7 +30445,7 @@ function requireHe() {
30157
30445
  return he$2.exports;
30158
30446
  }
30159
30447
  var heExports = requireHe();
30160
- const he = /* @__PURE__ */ getDefaultExportFromCjs$1(heExports);
30448
+ const he = /* @__PURE__ */ getDefaultExportFromCjs$2(heExports);
30161
30449
  function translateFieldAnnotation(params2) {
30162
30450
  const { node, isFinalDoc, fieldsHighlightColor } = params2;
30163
30451
  const { attrs = {} } = node;
@@ -33322,7 +33610,7 @@ const createDocumentJson = (docx, converter, editor) => {
33322
33610
  fileType: filePath.split(".").pop()
33323
33611
  };
33324
33612
  });
33325
- converter.telemetry.trackFileStructure(
33613
+ const trackStructure = (documentIdentifier = null) => converter.telemetry.trackFileStructure(
33326
33614
  {
33327
33615
  totalFiles: files.length,
33328
33616
  maxDepth: Math.max(...files.map((f) => f.fileDepth)),
@@ -33330,9 +33618,20 @@ const createDocumentJson = (docx, converter, editor) => {
33330
33618
  files
33331
33619
  },
33332
33620
  converter.fileSource,
33333
- converter.documentId,
33621
+ converter.documentGuid ?? converter.documentId ?? null,
33622
+ documentIdentifier ?? converter.documentId ?? null,
33334
33623
  converter.documentInternalId
33335
33624
  );
33625
+ try {
33626
+ const identifierResult = converter.getDocumentIdentifier?.();
33627
+ if (identifierResult && typeof identifierResult.then === "function") {
33628
+ identifierResult.then(trackStructure).catch(() => trackStructure());
33629
+ } else {
33630
+ trackStructure(identifierResult);
33631
+ }
33632
+ } catch (error) {
33633
+ trackStructure();
33634
+ }
33336
33635
  }
33337
33636
  const nodeListHandler = defaultNodeListHandler();
33338
33637
  const bodyNode = json.elements[0].elements.find((el) => el.name === "w:body");
@@ -33883,6 +34182,9 @@ const _SuperConverter = class _SuperConverter2 {
33883
34182
  this.documentInternalId = null;
33884
34183
  this.fileSource = params2?.fileSource || null;
33885
34184
  this.documentId = params2?.documentId || null;
34185
+ this.documentGuid = null;
34186
+ this.documentHash = null;
34187
+ this.documentModified = false;
33886
34188
  if (this.docx.length || this.xml) this.parseFromXml();
33887
34189
  }
33888
34190
  static getFontTableEntry(docx, fontName) {
@@ -33930,50 +34232,177 @@ const _SuperConverter = class _SuperConverter2 {
33930
34232
  this.initialJSON = this.convertedXml["word/document.xml"];
33931
34233
  if (!this.initialJSON) this.initialJSON = this.parseXmlToJson(this.xml);
33932
34234
  this.declaration = this.initialJSON?.declaration;
34235
+ this.resolveDocumentGuid();
33933
34236
  }
33934
34237
  parseXmlToJson(xml) {
33935
34238
  const newXml = xml.replace(/(<w:t xml:space="preserve">)(\s+)(<\/w:t>)/g, "$1[[sdspace]]$2[[sdspace]]$3");
33936
34239
  return JSON.parse(xmljs.xml2json(newXml, null, 2));
33937
34240
  }
33938
- static getStoredSuperdocVersion(docx) {
34241
+ /**
34242
+ * Generic method to get a stored custom property from docx
34243
+ * @static
34244
+ * @param {Array} docx - Array of docx file objects
34245
+ * @param {string} propertyName - Name of the property to retrieve
34246
+ * @returns {string|null} The property value or null if not found
34247
+ */
34248
+ static getStoredCustomProperty(docx, propertyName) {
33939
34249
  try {
33940
34250
  const customXml = docx.find((doc2) => doc2.name === "docProps/custom.xml");
33941
- if (!customXml) return;
34251
+ if (!customXml) return null;
33942
34252
  const converter = new _SuperConverter2();
33943
34253
  const content = customXml.content;
33944
34254
  const contentJson = converter.parseXmlToJson(content);
33945
34255
  const properties = contentJson.elements.find((el) => el.name === "Properties");
33946
- if (!properties.elements) return;
33947
- const superdocVersion = properties.elements.find(
33948
- (el) => el.name === "property" && el.attributes.name === "SuperdocVersion"
33949
- );
33950
- if (!superdocVersion) return;
33951
- const version2 = superdocVersion.elements[0].elements[0].text;
33952
- return version2;
34256
+ if (!properties.elements) return null;
34257
+ const property2 = properties.elements.find((el) => el.name === "property" && el.attributes.name === propertyName);
34258
+ if (!property2) return null;
34259
+ return property2.elements[0].elements[0].text;
33953
34260
  } catch (e) {
33954
- console.warn("Error getting Superdoc version", e);
33955
- return;
34261
+ console.warn(`Error getting custom property ${propertyName}:`, e);
34262
+ return null;
33956
34263
  }
33957
34264
  }
33958
- static updateDocumentVersion(docx = this.convertedXml, version2 = "0.22.0") {
34265
+ /**
34266
+ * Generic method to set a stored custom property in docx
34267
+ * @static
34268
+ * @param {Object} docx - The docx object to store the property in
34269
+ * @param {string} propertyName - Name of the property
34270
+ * @param {string|Function} value - Value or function that returns the value
34271
+ * @param {boolean} preserveExisting - If true, won't overwrite existing values
34272
+ * @returns {string} The stored value
34273
+ */
34274
+ static setStoredCustomProperty(docx, propertyName, value, preserveExisting = false) {
33959
34275
  const customLocation = "docProps/custom.xml";
33960
- if (!docx[customLocation]) {
33961
- docx[customLocation] = generateCustomXml();
33962
- }
33963
- const customXml = docx["docProps/custom.xml"];
33964
- if (!customXml) return;
33965
- const properties = customXml.elements.find((el) => el.name === "Properties");
34276
+ if (!docx[customLocation]) docx[customLocation] = generateCustomXml();
34277
+ const customXml = docx[customLocation];
34278
+ const properties = customXml.elements?.find((el) => el.name === "Properties");
34279
+ if (!properties) return null;
33966
34280
  if (!properties.elements) properties.elements = [];
33967
- const superdocVersion = properties.elements.find(
33968
- (el) => el.name === "property" && el.attributes.name === "SuperdocVersion"
33969
- );
33970
- if (!superdocVersion) {
33971
- const newCustomXml = generateSuperdocVersion();
33972
- properties.elements.push(newCustomXml);
34281
+ let property2 = properties.elements.find((el) => el.name === "property" && el.attributes.name === propertyName);
34282
+ if (property2 && preserveExisting) {
34283
+ return property2.elements[0].elements[0].text;
34284
+ }
34285
+ const finalValue = typeof value === "function" ? value() : value;
34286
+ if (!property2) {
34287
+ const existingPids = properties.elements.filter((el) => el.attributes?.pid).map((el) => parseInt(el.attributes.pid, 10)).filter(Number.isInteger);
34288
+ const pid = existingPids.length > 0 ? Math.max(...existingPids) + 1 : 2;
34289
+ property2 = {
34290
+ type: "element",
34291
+ name: "property",
34292
+ attributes: {
34293
+ name: propertyName,
34294
+ fmtid: "{D5CDD505-2E9C-101B-9397-08002B2CF9AE}",
34295
+ pid
34296
+ },
34297
+ elements: [
34298
+ {
34299
+ type: "element",
34300
+ name: "vt:lpwstr",
34301
+ elements: [
34302
+ {
34303
+ type: "text",
34304
+ text: finalValue
34305
+ }
34306
+ ]
34307
+ }
34308
+ ]
34309
+ };
34310
+ properties.elements.push(property2);
33973
34311
  } else {
33974
- superdocVersion.elements[0].elements[0].elements[0].text = version2;
34312
+ property2.elements[0].elements[0].text = finalValue;
33975
34313
  }
33976
- return docx;
34314
+ return finalValue;
34315
+ }
34316
+ static getStoredSuperdocVersion(docx) {
34317
+ return _SuperConverter2.getStoredCustomProperty(docx, "SuperdocVersion");
34318
+ }
34319
+ static setStoredSuperdocVersion(docx = this.convertedXml, version2 = "0.22.0") {
34320
+ return _SuperConverter2.setStoredCustomProperty(docx, "SuperdocVersion", version2, false);
34321
+ }
34322
+ /**
34323
+ * Get document GUID from docx files (static method)
34324
+ * @static
34325
+ * @param {Array} docx - Array of docx file objects
34326
+ * @returns {string|null} The document GUID
34327
+ */
34328
+ static extractDocumentGuid(docx) {
34329
+ try {
34330
+ const settingsXml = docx.find((doc2) => doc2.name === "word/settings.xml");
34331
+ if (!settingsXml) return null;
34332
+ const converter = new _SuperConverter2();
34333
+ const settingsJson = converter.parseXmlToJson(settingsXml.content);
34334
+ const settings = settingsJson.elements?.[0];
34335
+ if (!settings) return null;
34336
+ const docIdElement = settings.elements?.find((el) => el.name === "w15:docId");
34337
+ if (docIdElement?.attributes?.["w15:val"]) {
34338
+ return docIdElement.attributes["w15:val"].replace(/[{}]/g, "");
34339
+ }
34340
+ } catch {
34341
+ }
34342
+ return _SuperConverter2.getStoredCustomProperty(docx, "DocumentGuid");
34343
+ }
34344
+ /**
34345
+ * Get the permanent document GUID
34346
+ * @returns {string|null} The document GUID (only for modified documents)
34347
+ */
34348
+ getDocumentGuid() {
34349
+ return this.documentGuid;
34350
+ }
34351
+ /**
34352
+ * Get the SuperDoc version for this converter instance
34353
+ * @returns {string|null} The SuperDoc version or null if not available
34354
+ */
34355
+ getSuperdocVersion() {
34356
+ if (this.docx) {
34357
+ return _SuperConverter2.getStoredSuperdocVersion(this.docx);
34358
+ }
34359
+ return null;
34360
+ }
34361
+ /**
34362
+ * Resolve existing document GUID (synchronous)
34363
+ */
34364
+ resolveDocumentGuid() {
34365
+ const microsoftGuid = this.getMicrosoftDocId();
34366
+ if (microsoftGuid) {
34367
+ this.documentGuid = microsoftGuid;
34368
+ return;
34369
+ }
34370
+ const customGuid = _SuperConverter2.getStoredCustomProperty(this.docx, "DocumentGuid");
34371
+ if (customGuid) {
34372
+ this.documentGuid = customGuid;
34373
+ }
34374
+ }
34375
+ /**
34376
+ * Get Microsoft's docId from settings.xml (READ ONLY)
34377
+ */
34378
+ getMicrosoftDocId() {
34379
+ this.getDocumentInternalId();
34380
+ if (this.documentInternalId) {
34381
+ return this.documentInternalId.replace(/[{}]/g, "");
34382
+ }
34383
+ return null;
34384
+ }
34385
+ /**
34386
+ * Get document identifier (GUID or hash) - async for lazy hash generation
34387
+ */
34388
+ async getDocumentIdentifier() {
34389
+ if (this.documentGuid) {
34390
+ return this.documentGuid;
34391
+ }
34392
+ if (!this.documentHash && this.fileSource) {
34393
+ this.documentHash = await __privateMethod$2(this, _SuperConverter_instances, generateDocumentHash_fn).call(this);
34394
+ }
34395
+ return this.documentHash;
34396
+ }
34397
+ /**
34398
+ * Promote from hash to GUID on first edit
34399
+ */
34400
+ promoteToGuid() {
34401
+ if (this.documentGuid) return this.documentGuid;
34402
+ this.documentGuid = this.getMicrosoftDocId() || v4();
34403
+ this.documentModified = true;
34404
+ this.documentHash = null;
34405
+ return this.documentGuid;
33977
34406
  }
33978
34407
  getDocumentDefaultStyles() {
33979
34408
  const styles = this.convertedXml["word/styles.xml"];
@@ -34062,20 +34491,14 @@ const _SuperConverter = class _SuperConverter2 {
34062
34491
  getDocumentInternalId() {
34063
34492
  const settingsLocation = "word/settings.xml";
34064
34493
  if (!this.convertedXml[settingsLocation]) {
34065
- this.convertedXml[settingsLocation] = SETTINGS_CUSTOM_XML;
34494
+ return;
34066
34495
  }
34067
- const settings = Object.assign({}, this.convertedXml[settingsLocation]);
34068
- if (!settings.elements[0]?.elements?.length) {
34069
- const idElement = this.createDocumentIdElement(settings);
34070
- settings.elements[0].elements = [idElement];
34071
- if (!settings.elements[0].attributes["xmlns:w15"]) {
34072
- settings.elements[0].attributes["xmlns:w15"] = "http://schemas.microsoft.com/office/word/2012/wordml";
34073
- }
34074
- this.convertedXml[settingsLocation] = settings;
34496
+ const settings = this.convertedXml[settingsLocation];
34497
+ if (!settings.elements?.[0]?.elements?.length) {
34075
34498
  return;
34076
34499
  }
34077
34500
  const w15DocId = settings.elements[0].elements.find((el) => el.name === "w15:docId");
34078
- this.documentInternalId = w15DocId?.attributes["w15:val"];
34501
+ this.documentInternalId = w15DocId?.attributes?.["w15:val"];
34079
34502
  }
34080
34503
  createDocumentIdElement() {
34081
34504
  const docId = v4().toUpperCase();
@@ -34164,7 +34587,13 @@ const _SuperConverter = class _SuperConverter2 {
34164
34587
  this.convertedXml = { ...this.convertedXml, ...updatedXml };
34165
34588
  const headFootRels = __privateMethod$2(this, _SuperConverter_instances, exportProcessHeadersFooters_fn).call(this, { isFinalDoc });
34166
34589
  __privateMethod$2(this, _SuperConverter_instances, exportProcessNewRelationships_fn).call(this, [...params2.relationships, ...commentsRels, ...headFootRels]);
34167
- storeSuperdocVersion(this.convertedXml);
34590
+ _SuperConverter2.setStoredSuperdocVersion(this.convertedXml);
34591
+ if (this.documentModified || this.documentGuid) {
34592
+ if (!this.documentGuid) {
34593
+ this.documentGuid = this.getMicrosoftDocId() || v4();
34594
+ }
34595
+ _SuperConverter2.setStoredCustomProperty(this.convertedXml, "DocumentGuid", this.documentGuid, true);
34596
+ }
34168
34597
  __privateMethod$2(this, _SuperConverter_instances, exportNumberingFile_fn).call(this, params2);
34169
34598
  return xml;
34170
34599
  }
@@ -34199,8 +34628,38 @@ const _SuperConverter = class _SuperConverter2 {
34199
34628
  });
34200
34629
  return { result, params: params2 };
34201
34630
  }
34631
+ // Deprecated methods for backward compatibility
34632
+ static getStoredSuperdocId(docx) {
34633
+ console.warn("getStoredSuperdocId is deprecated, use getDocumentGuid instead");
34634
+ return _SuperConverter2.extractDocumentGuid(docx);
34635
+ }
34636
+ static updateDocumentVersion(docx, version2) {
34637
+ console.warn("updateDocumentVersion is deprecated, use setStoredSuperdocVersion instead");
34638
+ return _SuperConverter2.setStoredSuperdocVersion(docx, version2);
34639
+ }
34202
34640
  };
34203
34641
  _SuperConverter_instances = /* @__PURE__ */ new WeakSet();
34642
+ generateDocumentHash_fn = async function() {
34643
+ if (!this.fileSource) return `HASH-${Date.now()}`;
34644
+ try {
34645
+ let buffer2;
34646
+ if (Buffer2.isBuffer(this.fileSource)) {
34647
+ buffer2 = this.fileSource;
34648
+ } else if (this.fileSource instanceof ArrayBuffer) {
34649
+ buffer2 = Buffer2.from(this.fileSource);
34650
+ } else if (this.fileSource instanceof Blob || this.fileSource instanceof File) {
34651
+ const arrayBuffer = await this.fileSource.arrayBuffer();
34652
+ buffer2 = Buffer2.from(arrayBuffer);
34653
+ } else {
34654
+ return `HASH-${Date.now()}`;
34655
+ }
34656
+ const hash2 = index$2(buffer2);
34657
+ return `HASH-${hash2.toString("hex").toUpperCase()}`;
34658
+ } catch (e) {
34659
+ console.warn("Could not generate document hash:", e);
34660
+ return `HASH-${Date.now()}`;
34661
+ }
34662
+ };
34204
34663
  exportNumberingFile_fn = function() {
34205
34664
  const numberingPath = "word/numbering.xml";
34206
34665
  let numberingXml = this.convertedXml[numberingPath];
@@ -34421,52 +34880,9 @@ __publicField$2(_SuperConverter, "propertyTypes", Object.freeze({
34421
34880
  }));
34422
34881
  __publicField$2(_SuperConverter, "elements", /* @__PURE__ */ new Set(["w:document", "w:body", "w:p", "w:r", "w:t", "w:delText"]));
34423
34882
  let SuperConverter = _SuperConverter;
34424
- function storeSuperdocVersion(docx) {
34425
- const customLocation = "docProps/custom.xml";
34426
- if (!docx[customLocation]) docx[customLocation] = generateCustomXml();
34427
- const customXml = docx[customLocation];
34428
- const properties = customXml.elements.find((el) => el.name === "Properties");
34429
- if (!properties.elements) properties.elements = [];
34430
- const elements = properties.elements;
34431
- const cleanProperties = elements.filter((prop) => typeof prop === "object" && prop !== null).filter((prop) => {
34432
- const { attributes } = prop;
34433
- return attributes.name !== "SuperdocVersion";
34434
- });
34435
- let pid = 2;
34436
- try {
34437
- pid = cleanProperties.length ? Math.max(...elements.map((el) => el.attributes.pid)) + 1 : 2;
34438
- } catch {
34439
- }
34440
- cleanProperties.push(generateSuperdocVersion(pid));
34441
- properties.elements = cleanProperties;
34442
- return docx;
34443
- }
34444
34883
  function generateCustomXml() {
34445
34884
  return DEFAULT_CUSTOM_XML;
34446
34885
  }
34447
- function generateSuperdocVersion(pid = 2, version2 = "0.22.0") {
34448
- return {
34449
- type: "element",
34450
- name: "property",
34451
- attributes: {
34452
- name: "SuperdocVersion",
34453
- fmtid: "{D5CDD505-2E9C-101B-9397-08002B2CF9AE}",
34454
- pid
34455
- },
34456
- elements: [
34457
- {
34458
- type: "element",
34459
- name: "vt:lpwstr",
34460
- elements: [
34461
- {
34462
- type: "text",
34463
- text: version2
34464
- }
34465
- ]
34466
- }
34467
- ]
34468
- };
34469
- }
34470
34886
  function commonjsRequire(path) {
34471
34887
  throw new Error('Could not dynamically require "' + path + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.');
34472
34888
  }
@@ -36782,7 +37198,7 @@ function requireJszip_min() {
36782
37198
  return jszip_min.exports;
36783
37199
  }
36784
37200
  var jszip_minExports = requireJszip_min();
36785
- const JSZip = /* @__PURE__ */ getDefaultExportFromCjs$1(jszip_minExports);
37201
+ const JSZip = /* @__PURE__ */ getDefaultExportFromCjs$2(jszip_minExports);
36786
37202
  const isXmlLike = (name) => /\.xml$|\.rels$/i.test(name);
36787
37203
  function sniffEncoding(u8) {
36788
37204
  if (u8.length >= 2) {
@@ -51542,19 +51958,34 @@ const _Editor = class _Editor2 extends EventEmitter$1 {
51542
51958
  * @returns {string} Document version
51543
51959
  */
51544
51960
  static getDocumentVersion(doc2) {
51545
- const version2 = SuperConverter.getStoredSuperdocVersion(doc2);
51546
- return version2;
51961
+ return SuperConverter.getStoredSuperdocVersion(doc2);
51547
51962
  }
51548
51963
  /**
51549
- * Update the document version
51964
+ * Set the document version
51550
51965
  * @static
51551
51966
  * @param {Object} doc - Document object
51552
51967
  * @param {string} version - New version
51553
- * @returns {Object}
51968
+ * @returns {string} The set version
51969
+ */
51970
+ static setDocumentVersion(doc2, version2) {
51971
+ return SuperConverter.setStoredSuperdocVersion(doc2, version2);
51972
+ }
51973
+ /**
51974
+ * Get the document GUID
51975
+ * @static
51976
+ * @param {Object} doc - Document object
51977
+ * @returns {string|null} Document GUID
51978
+ */
51979
+ static getDocumentGuid(doc2) {
51980
+ return SuperConverter.extractDocumentGuid(doc2);
51981
+ }
51982
+ // Deprecated
51983
+ /**
51984
+ * @deprecated use setDocumentVersion instead
51554
51985
  */
51555
51986
  static updateDocumentVersion(doc2, version2) {
51556
- const updatedContent = SuperConverter.updateDocumentVersion(doc2, version2);
51557
- return updatedContent;
51987
+ console.warn("updateDocumentVersion is deprecated, use setDocumentVersion instead");
51988
+ return _Editor2.setDocumentVersion(doc2, version2);
51558
51989
  }
51559
51990
  /**
51560
51991
  * Creates all node views.
@@ -51690,6 +52121,43 @@ const _Editor = class _Editor2 extends EventEmitter$1 {
51690
52121
  }
51691
52122
  window.addEventListener("resize", () => handleResize);
51692
52123
  }
52124
+ /**
52125
+ * Get document identifier for telemetry (async - may generate hash)
52126
+ * @returns {Promise<string>} GUID for modified docs, hash for unmodified
52127
+ */
52128
+ async getDocumentIdentifier() {
52129
+ return await this.converter?.getDocumentIdentifier() || null;
52130
+ }
52131
+ /**
52132
+ * Get permanent document GUID (sync - only for modified documents)
52133
+ * @returns {string|null} GUID or null if document hasn't been modified
52134
+ */
52135
+ getDocumentGuid() {
52136
+ return this.converter?.documentGuid || null;
52137
+ }
52138
+ /**
52139
+ * Check if document has been modified
52140
+ * @returns {boolean}
52141
+ */
52142
+ isDocumentModified() {
52143
+ return this.converter?.documentModified || false;
52144
+ }
52145
+ /**
52146
+ * Get telemetry data (async because of lazy hash generation)
52147
+ */
52148
+ async getTelemetryData() {
52149
+ return {
52150
+ documentId: await this.getDocumentIdentifier(),
52151
+ isModified: this.isDocumentModified(),
52152
+ isPermanentId: !!this.converter?.documentGuid,
52153
+ version: this.converter?.getSuperdocVersion()
52154
+ };
52155
+ }
52156
+ // Deprecated for backward compatibility
52157
+ getDocumentId() {
52158
+ console.warn("getDocumentId is deprecated, use getDocumentGuid instead");
52159
+ return this.getDocumentGuid();
52160
+ }
51693
52161
  /**
51694
52162
  * Get attrs of the currently selected node or mark.
51695
52163
  * @param {String} nameOrType
@@ -51721,6 +52189,21 @@ const _Editor = class _Editor2 extends EventEmitter$1 {
51721
52189
  getJSON() {
51722
52190
  return this.state.doc.toJSON();
51723
52191
  }
52192
+ /**
52193
+ * Get document metadata including GUID, modification status, and version
52194
+ * @returns {{
52195
+ * documentGuid: string | null,
52196
+ * isModified: boolean,
52197
+ * version: string | null
52198
+ * }} Document metadata
52199
+ */
52200
+ getMetadata() {
52201
+ return {
52202
+ documentGuid: this.converter?.documentGuid || null,
52203
+ isModified: this.isDocumentModified(),
52204
+ version: this.converter?.getSuperdocVersion() || null
52205
+ };
52206
+ }
51724
52207
  /**
51725
52208
  * Get the editor content as HTML
51726
52209
  * @param {Object} options - Options for the HTML serializer
@@ -51738,6 +52221,13 @@ const _Editor = class _Editor2 extends EventEmitter$1 {
51738
52221
  }
51739
52222
  return html;
51740
52223
  }
52224
+ /**
52225
+ * Get the document version from the converter
52226
+ * @returns {string|null} The SuperDoc version stored in the document
52227
+ */
52228
+ getDocumentVersion() {
52229
+ return this.converter?.getSuperdocVersion() || null;
52230
+ }
51741
52231
  /**
51742
52232
  * Create a child editor linked to this editor.
51743
52233
  * This is useful for creating header/footer editors that are linked to the main editor.
@@ -51820,7 +52310,8 @@ const _Editor = class _Editor2 extends EventEmitter$1 {
51820
52310
  if (exportXmlOnly || exportJsonOnly) return documentXml;
51821
52311
  const customXml = this.converter.schemaToXml(this.converter.convertedXml["docProps/custom.xml"].elements[0]);
51822
52312
  const styles = this.converter.schemaToXml(this.converter.convertedXml["word/styles.xml"].elements[0]);
51823
- const customSettings = this.converter.schemaToXml(this.converter.convertedXml["word/settings.xml"].elements[0]);
52313
+ const hasCustomSettings = !!this.converter.convertedXml["word/settings.xml"]?.elements?.length;
52314
+ const customSettings = hasCustomSettings ? this.converter.schemaToXml(this.converter.convertedXml["word/settings.xml"]?.elements?.[0]) : null;
51824
52315
  const rels = this.converter.schemaToXml(this.converter.convertedXml["word/_rels/document.xml.rels"].elements[0]);
51825
52316
  const media = this.converter.addedMedia;
51826
52317
  const updatedHeadersFooters = {};
@@ -51836,13 +52327,15 @@ const _Editor = class _Editor2 extends EventEmitter$1 {
51836
52327
  ...this.options.customUpdatedFiles,
51837
52328
  "word/document.xml": String(documentXml),
51838
52329
  "docProps/custom.xml": String(customXml),
51839
- "word/settings.xml": String(customSettings),
51840
52330
  "word/_rels/document.xml.rels": String(rels),
51841
52331
  "word/numbering.xml": String(numbering),
51842
52332
  // Replace & with &amp; in styles.xml as DOCX viewers can't handle it
51843
52333
  "word/styles.xml": String(styles).replace(/&/gi, "&amp;"),
51844
52334
  ...updatedHeadersFooters
51845
52335
  };
52336
+ if (hasCustomSettings) {
52337
+ updatedDocs["word/settings.xml"] = String(customSettings);
52338
+ }
51846
52339
  if (comments.length) {
51847
52340
  const commentsXml = this.converter.schemaToXml(this.converter.convertedXml["word/comments.xml"].elements[0]);
51848
52341
  const commentsExtendedXml = this.converter.schemaToXml(
@@ -52462,6 +52955,13 @@ dispatchTransaction_fn = function(transaction) {
52462
52955
  if (!transaction.docChanged) {
52463
52956
  return;
52464
52957
  }
52958
+ if (transaction.docChanged && this.converter) {
52959
+ if (!this.converter.documentGuid) {
52960
+ this.converter.promoteToGuid();
52961
+ console.debug("Document modified - assigned GUID:", this.converter.documentGuid);
52962
+ }
52963
+ this.converter.documentModified = true;
52964
+ }
52465
52965
  this.emit("update", {
52466
52966
  editor: this,
52467
52967
  transaction
@@ -82095,7 +82595,7 @@ function requireEventemitter3() {
82095
82595
  return eventemitter3.exports;
82096
82596
  }
82097
82597
  var eventemitter3Exports = requireEventemitter3();
82098
- const EventEmitter2 = /* @__PURE__ */ getDefaultExportFromCjs$1(eventemitter3Exports);
82598
+ const EventEmitter2 = /* @__PURE__ */ getDefaultExportFromCjs$2(eventemitter3Exports);
82099
82599
  const useToolbarItem = (options) => {
82100
82600
  const types2 = ["button", "options", "separator", "dropdown", "overflow"];
82101
82601
  if (!types2.includes(options.type)) {