@bilig/excel-import 0.14.14

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 (198) hide show
  1. package/LICENSE +1 -0
  2. package/README.md +165 -0
  3. package/dist/index.d.ts +31 -0
  4. package/dist/index.js +748 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/workbook-import-content-types.d.ts +10 -0
  7. package/dist/workbook-import-content-types.js +30 -0
  8. package/dist/workbook-import-content-types.js.map +1 -0
  9. package/dist/workbook-import-helpers.d.ts +21 -0
  10. package/dist/workbook-import-helpers.js +77 -0
  11. package/dist/workbook-import-helpers.js.map +1 -0
  12. package/dist/workbook-import-preview.d.ts +19 -0
  13. package/dist/workbook-import-preview.js +12 -0
  14. package/dist/workbook-import-preview.js.map +1 -0
  15. package/dist/xlsx-array-formulas.d.ts +6 -0
  16. package/dist/xlsx-array-formulas.js +186 -0
  17. package/dist/xlsx-array-formulas.js.map +1 -0
  18. package/dist/xlsx-axis-entries.d.ts +3 -0
  19. package/dist/xlsx-axis-entries.js +90 -0
  20. package/dist/xlsx-axis-entries.js.map +1 -0
  21. package/dist/xlsx-calculation-settings.d.ts +9 -0
  22. package/dist/xlsx-calculation-settings.js +198 -0
  23. package/dist/xlsx-calculation-settings.js.map +1 -0
  24. package/dist/xlsx-cell-insertion.d.ts +11 -0
  25. package/dist/xlsx-cell-insertion.js +164 -0
  26. package/dist/xlsx-cell-insertion.js.map +1 -0
  27. package/dist/xlsx-cell-metadata.d.ts +15 -0
  28. package/dist/xlsx-cell-metadata.js +380 -0
  29. package/dist/xlsx-cell-metadata.js.map +1 -0
  30. package/dist/xlsx-chart-artifacts.d.ts +7 -0
  31. package/dist/xlsx-chart-artifacts.js +327 -0
  32. package/dist/xlsx-chart-artifacts.js.map +1 -0
  33. package/dist/xlsx-charts.d.ts +4 -0
  34. package/dist/xlsx-charts.js +671 -0
  35. package/dist/xlsx-charts.js.map +1 -0
  36. package/dist/xlsx-comment-vml.d.ts +11 -0
  37. package/dist/xlsx-comment-vml.js +292 -0
  38. package/dist/xlsx-comment-vml.js.map +1 -0
  39. package/dist/xlsx-comments.d.ts +7 -0
  40. package/dist/xlsx-comments.js +120 -0
  41. package/dist/xlsx-comments.js.map +1 -0
  42. package/dist/xlsx-conditional-formats.d.ts +5 -0
  43. package/dist/xlsx-conditional-formats.js +513 -0
  44. package/dist/xlsx-conditional-formats.js.map +1 -0
  45. package/dist/xlsx-control-artifacts.d.ts +7 -0
  46. package/dist/xlsx-control-artifacts.js +404 -0
  47. package/dist/xlsx-control-artifacts.js.map +1 -0
  48. package/dist/xlsx-data-model-artifacts.d.ts +4 -0
  49. package/dist/xlsx-data-model-artifacts.js +240 -0
  50. package/dist/xlsx-data-model-artifacts.js.map +1 -0
  51. package/dist/xlsx-data-table-formulas.d.ts +4 -0
  52. package/dist/xlsx-data-table-formulas.js +138 -0
  53. package/dist/xlsx-data-table-formulas.js.map +1 -0
  54. package/dist/xlsx-defined-names.d.ts +7 -0
  55. package/dist/xlsx-defined-names.js +292 -0
  56. package/dist/xlsx-defined-names.js.map +1 -0
  57. package/dist/xlsx-dimensions.d.ts +4 -0
  58. package/dist/xlsx-dimensions.js +495 -0
  59. package/dist/xlsx-dimensions.js.map +1 -0
  60. package/dist/xlsx-drawing-artifacts.d.ts +7 -0
  61. package/dist/xlsx-drawing-artifacts.js +477 -0
  62. package/dist/xlsx-drawing-artifacts.js.map +1 -0
  63. package/dist/xlsx-escaped-text.d.ts +2 -0
  64. package/dist/xlsx-escaped-text.js +22 -0
  65. package/dist/xlsx-escaped-text.js.map +1 -0
  66. package/dist/xlsx-export-xml.d.ts +8 -0
  67. package/dist/xlsx-export-xml.js +99 -0
  68. package/dist/xlsx-export-xml.js.map +1 -0
  69. package/dist/xlsx-export.d.ts +2 -0
  70. package/dist/xlsx-export.js +800 -0
  71. package/dist/xlsx-export.js.map +1 -0
  72. package/dist/xlsx-external-link-artifacts.d.ts +4 -0
  73. package/dist/xlsx-external-link-artifacts.js +317 -0
  74. package/dist/xlsx-external-link-artifacts.js.map +1 -0
  75. package/dist/xlsx-external-references.d.ts +29 -0
  76. package/dist/xlsx-external-references.js +356 -0
  77. package/dist/xlsx-external-references.js.map +1 -0
  78. package/dist/xlsx-filters.d.ts +4 -0
  79. package/dist/xlsx-filters.js +273 -0
  80. package/dist/xlsx-filters.js.map +1 -0
  81. package/dist/xlsx-formula-translation.d.ts +10 -0
  82. package/dist/xlsx-formula-translation.js +391 -0
  83. package/dist/xlsx-formula-translation.js.map +1 -0
  84. package/dist/xlsx-formulas.d.ts +2 -0
  85. package/dist/xlsx-formulas.js +136 -0
  86. package/dist/xlsx-formulas.js.map +1 -0
  87. package/dist/xlsx-freeze-panes.d.ts +4 -0
  88. package/dist/xlsx-freeze-panes.js +206 -0
  89. package/dist/xlsx-freeze-panes.js.map +1 -0
  90. package/dist/xlsx-hyperlinks.d.ts +5 -0
  91. package/dist/xlsx-hyperlinks.js +64 -0
  92. package/dist/xlsx-hyperlinks.js.map +1 -0
  93. package/dist/xlsx-ignored-errors.d.ts +4 -0
  94. package/dist/xlsx-ignored-errors.js +106 -0
  95. package/dist/xlsx-ignored-errors.js.map +1 -0
  96. package/dist/xlsx-import-cell-styles.d.ts +8 -0
  97. package/dist/xlsx-import-cell-styles.js +255 -0
  98. package/dist/xlsx-import-cell-styles.js.map +1 -0
  99. package/dist/xlsx-import-sheet-metadata.d.ts +40 -0
  100. package/dist/xlsx-import-sheet-metadata.js +41 -0
  101. package/dist/xlsx-import-sheet-metadata.js.map +1 -0
  102. package/dist/xlsx-import-warnings.d.ts +8 -0
  103. package/dist/xlsx-import-warnings.js +44 -0
  104. package/dist/xlsx-import-warnings.js.map +1 -0
  105. package/dist/xlsx-import-workbook-metadata.d.ts +28 -0
  106. package/dist/xlsx-import-workbook-metadata.js +29 -0
  107. package/dist/xlsx-import-workbook-metadata.js.map +1 -0
  108. package/dist/xlsx-macros.d.ts +10 -0
  109. package/dist/xlsx-macros.js +63 -0
  110. package/dist/xlsx-macros.js.map +1 -0
  111. package/dist/xlsx-merge-entries.d.ts +3 -0
  112. package/dist/xlsx-merge-entries.js +17 -0
  113. package/dist/xlsx-merge-entries.js.map +1 -0
  114. package/dist/xlsx-number-formats.d.ts +7 -0
  115. package/dist/xlsx-number-formats.js +222 -0
  116. package/dist/xlsx-number-formats.js.map +1 -0
  117. package/dist/xlsx-pivot-artifacts.d.ts +29 -0
  118. package/dist/xlsx-pivot-artifacts.js +292 -0
  119. package/dist/xlsx-pivot-artifacts.js.map +1 -0
  120. package/dist/xlsx-pivots.d.ts +10 -0
  121. package/dist/xlsx-pivots.js +589 -0
  122. package/dist/xlsx-pivots.js.map +1 -0
  123. package/dist/xlsx-print-page-setup.d.ts +6 -0
  124. package/dist/xlsx-print-page-setup.js +224 -0
  125. package/dist/xlsx-print-page-setup.js.map +1 -0
  126. package/dist/xlsx-printer-settings.d.ts +4 -0
  127. package/dist/xlsx-printer-settings.js +279 -0
  128. package/dist/xlsx-printer-settings.js.map +1 -0
  129. package/dist/xlsx-protected-ranges.d.ts +4 -0
  130. package/dist/xlsx-protected-ranges.js +183 -0
  131. package/dist/xlsx-protected-ranges.js.map +1 -0
  132. package/dist/xlsx-rich-text-artifacts.d.ts +4 -0
  133. package/dist/xlsx-rich-text-artifacts.js +303 -0
  134. package/dist/xlsx-rich-text-artifacts.js.map +1 -0
  135. package/dist/xlsx-sheet-properties.d.ts +4 -0
  136. package/dist/xlsx-sheet-properties.js +89 -0
  137. package/dist/xlsx-sheet-properties.js.map +1 -0
  138. package/dist/xlsx-sheet-protection.d.ts +4 -0
  139. package/dist/xlsx-sheet-protection.js +153 -0
  140. package/dist/xlsx-sheet-protection.js.map +1 -0
  141. package/dist/xlsx-sheet-visibility.d.ts +4 -0
  142. package/dist/xlsx-sheet-visibility.js +53 -0
  143. package/dist/xlsx-sheet-visibility.js.map +1 -0
  144. package/dist/xlsx-slicer-connection-artifacts.d.ts +4 -0
  145. package/dist/xlsx-slicer-connection-artifacts.js +426 -0
  146. package/dist/xlsx-slicer-connection-artifacts.js.map +1 -0
  147. package/dist/xlsx-sorts.d.ts +5 -0
  148. package/dist/xlsx-sorts.js +216 -0
  149. package/dist/xlsx-sorts.js.map +1 -0
  150. package/dist/xlsx-sparklines.d.ts +4 -0
  151. package/dist/xlsx-sparklines.js +115 -0
  152. package/dist/xlsx-sparklines.js.map +1 -0
  153. package/dist/xlsx-style-only-blank-cells.d.ts +3 -0
  154. package/dist/xlsx-style-only-blank-cells.js +96 -0
  155. package/dist/xlsx-style-only-blank-cells.js.map +1 -0
  156. package/dist/xlsx-style-runs.d.ts +12 -0
  157. package/dist/xlsx-style-runs.js +35 -0
  158. package/dist/xlsx-style-runs.js.map +1 -0
  159. package/dist/xlsx-styles.d.ts +25 -0
  160. package/dist/xlsx-styles.js +857 -0
  161. package/dist/xlsx-styles.js.map +1 -0
  162. package/dist/xlsx-tab-colors.d.ts +4 -0
  163. package/dist/xlsx-tab-colors.js +166 -0
  164. package/dist/xlsx-tab-colors.js.map +1 -0
  165. package/dist/xlsx-tables.d.ts +4 -0
  166. package/dist/xlsx-tables.js +371 -0
  167. package/dist/xlsx-tables.js.map +1 -0
  168. package/dist/xlsx-theme-artifacts.d.ts +6 -0
  169. package/dist/xlsx-theme-artifacts.js +126 -0
  170. package/dist/xlsx-theme-artifacts.js.map +1 -0
  171. package/dist/xlsx-threaded-comment-artifacts.d.ts +8 -0
  172. package/dist/xlsx-threaded-comment-artifacts.js +329 -0
  173. package/dist/xlsx-threaded-comment-artifacts.js.map +1 -0
  174. package/dist/xlsx-validations.d.ts +4 -0
  175. package/dist/xlsx-validations.js +542 -0
  176. package/dist/xlsx-validations.js.map +1 -0
  177. package/dist/xlsx-view-state.d.ts +8 -0
  178. package/dist/xlsx-view-state.js +144 -0
  179. package/dist/xlsx-view-state.js.map +1 -0
  180. package/dist/xlsx-workbook-properties.d.ts +5 -0
  181. package/dist/xlsx-workbook-properties.js +388 -0
  182. package/dist/xlsx-workbook-properties.js.map +1 -0
  183. package/dist/xlsx-workbook-protection.d.ts +4 -0
  184. package/dist/xlsx-workbook-protection.js +147 -0
  185. package/dist/xlsx-workbook-protection.js.map +1 -0
  186. package/dist/xlsx-workbook-sheet-paths.d.ts +4 -0
  187. package/dist/xlsx-workbook-sheet-paths.js +96 -0
  188. package/dist/xlsx-workbook-sheet-paths.js.map +1 -0
  189. package/dist/xlsx-worksheet-cells.d.ts +16 -0
  190. package/dist/xlsx-worksheet-cells.js +104 -0
  191. package/dist/xlsx-worksheet-cells.js.map +1 -0
  192. package/dist/xlsx-worksheet-text-values.d.ts +2 -0
  193. package/dist/xlsx-worksheet-text-values.js +136 -0
  194. package/dist/xlsx-worksheet-text-values.js.map +1 -0
  195. package/dist/xlsx-zip.d.ts +6 -0
  196. package/dist/xlsx-zip.js +12 -0
  197. package/dist/xlsx-zip.js.map +1 -0
  198. package/package.json +56 -0
@@ -0,0 +1,153 @@
1
+ import { strFromU8, strToU8, unzipSync, zipSync } from 'fflate';
2
+ import { XMLParser } from 'fast-xml-parser';
3
+ import { escapeXmlAttribute } from './xlsx-export-xml.js';
4
+ import { readXlsxZipEntries } from './xlsx-zip.js';
5
+ const xmlParser = new XMLParser({
6
+ ignoreAttributes: false,
7
+ attributeNamePrefix: '',
8
+ parseAttributeValue: false,
9
+ removeNSPrefix: true,
10
+ });
11
+ const worksheetProtectionTailElements = [
12
+ 'protectedRanges',
13
+ 'scenarios',
14
+ 'autoFilter',
15
+ 'sortState',
16
+ 'dataConsolidate',
17
+ 'customSheetViews',
18
+ 'mergeCells',
19
+ 'conditionalFormatting',
20
+ 'dataValidations',
21
+ 'hyperlinks',
22
+ 'printOptions',
23
+ 'pageMargins',
24
+ 'pageSetup',
25
+ 'headerFooter',
26
+ 'drawing',
27
+ 'legacyDrawing',
28
+ 'tableParts',
29
+ 'pivotTableDefinition',
30
+ ];
31
+ function isRecord(value) {
32
+ return typeof value === 'object' && value !== null;
33
+ }
34
+ function recordChild(value, key) {
35
+ if (!isRecord(value)) {
36
+ return null;
37
+ }
38
+ const child = value[key];
39
+ return isRecord(child) ? child : null;
40
+ }
41
+ function normalizeZipPath(path) {
42
+ return path.replace(/^\/+/, '');
43
+ }
44
+ function getZipText(zip, path) {
45
+ const file = zip[normalizeZipPath(path)];
46
+ return file ? strFromU8(file) : null;
47
+ }
48
+ function setZipText(zip, path, text) {
49
+ zip[normalizeZipPath(path)] = strToU8(text);
50
+ }
51
+ function isFalseAttribute(value) {
52
+ return value === false || value === '0' || value === 'false';
53
+ }
54
+ const xmlNamePattern = /^[A-Za-z_:][\w:.-]*$/u;
55
+ const xmlNamedEntities = {
56
+ amp: '&',
57
+ apos: "'",
58
+ gt: '>',
59
+ lt: '<',
60
+ quot: '"',
61
+ };
62
+ function unescapeXmlAttribute(value) {
63
+ return value.replace(/&#x([0-9a-fA-F]+);|&#([0-9]+);|&(quot|apos|lt|gt|amp);/gu, (match, hex, decimal, named) => {
64
+ if (hex || decimal) {
65
+ const codePoint = Number.parseInt(hex ?? decimal ?? '', hex ? 16 : 10);
66
+ return Number.isSafeInteger(codePoint) && codePoint >= 0 && codePoint <= 0x10ffff ? String.fromCodePoint(codePoint) : match;
67
+ }
68
+ return named ? (xmlNamedEntities[named] ?? match) : match;
69
+ });
70
+ }
71
+ function readSheetProtectionXmlAttributes(sheetXml) {
72
+ const match = /<sheetProtection\b[^>]*(?:\/>|>[\s\S]*?<\/sheetProtection>)/u.exec(sheetXml);
73
+ if (!match) {
74
+ return undefined;
75
+ }
76
+ const attributes = [...match[0].matchAll(/\s([A-Za-z_:][\w:.-]*)=(?:"([^"]*)"|'([^']*)')/gu)].map((attributeMatch) => ({
77
+ name: attributeMatch[1] ?? '',
78
+ value: unescapeXmlAttribute(attributeMatch[2] ?? attributeMatch[3] ?? ''),
79
+ }));
80
+ if (attributes.length === 1 && attributes[0]?.name === 'sheet' && attributes[0].value === '1') {
81
+ return undefined;
82
+ }
83
+ return attributes.length > 0 ? attributes : undefined;
84
+ }
85
+ function buildWorksheetSheetProtectionXml(protection) {
86
+ const attributes = (protection.xmlAttributes ?? []).filter((attribute) => xmlNamePattern.test(attribute.name));
87
+ if (attributes.length === 0) {
88
+ return '<sheetProtection sheet="1"/>';
89
+ }
90
+ return `<sheetProtection${attributes.map((attribute) => ` ${attribute.name}="${escapeXmlAttribute(attribute.value)}"`).join('')}/>`;
91
+ }
92
+ function insertWorksheetSheetProtection(sheetXml, protection) {
93
+ const sheetProtection = buildWorksheetSheetProtectionXml(protection);
94
+ if (/<sheetProtection\b/u.test(sheetXml)) {
95
+ return sheetXml.replace(/<sheetProtection\b[^>]*(?:\/>|>[\s\S]*?<\/sheetProtection>)/u, sheetProtection);
96
+ }
97
+ let insertIndex = sheetXml.indexOf('</worksheet>');
98
+ for (const elementName of worksheetProtectionTailElements) {
99
+ const elementIndex = sheetXml.search(new RegExp(`<${elementName}\\b`, 'u'));
100
+ if (elementIndex >= 0 && (insertIndex < 0 || elementIndex < insertIndex)) {
101
+ insertIndex = elementIndex;
102
+ }
103
+ }
104
+ if (insertIndex < 0) {
105
+ return sheetXml;
106
+ }
107
+ return `${sheetXml.slice(0, insertIndex)}${sheetProtection}${sheetXml.slice(insertIndex)}`;
108
+ }
109
+ export function addExportSheetProtectionsToXlsxBytes(bytes, snapshot) {
110
+ if (!snapshot.sheets.some((sheet) => sheet.metadata?.sheetProtection?.sheetName === sheet.name)) {
111
+ return bytes;
112
+ }
113
+ const zip = unzipSync(bytes);
114
+ let changed = false;
115
+ snapshot.sheets
116
+ .toSorted((left, right) => left.order - right.order)
117
+ .forEach((sheet, sheetIndex) => {
118
+ if (sheet.metadata?.sheetProtection?.sheetName !== sheet.name) {
119
+ return;
120
+ }
121
+ const sheetProtection = sheet.metadata.sheetProtection;
122
+ const sheetPath = `xl/worksheets/sheet${String(sheetIndex + 1)}.xml`;
123
+ const sheetXml = getZipText(zip, sheetPath);
124
+ if (!sheetXml) {
125
+ return;
126
+ }
127
+ setZipText(zip, sheetPath, insertWorksheetSheetProtection(sheetXml, sheetProtection));
128
+ changed = true;
129
+ });
130
+ return changed ? zipSync(zip) : bytes;
131
+ }
132
+ export function readImportedWorkbookSheetProtections(source, sheetNames) {
133
+ const zip = readXlsxZipEntries(source);
134
+ const protectionsBySheet = new Map();
135
+ sheetNames.forEach((sheetName, sheetIndex) => {
136
+ const sheetXml = getZipText(zip, `xl/worksheets/sheet${String(sheetIndex + 1)}.xml`);
137
+ if (!sheetXml || !/<sheetProtection\b/u.test(sheetXml)) {
138
+ return;
139
+ }
140
+ const parsed = xmlParser.parse(sheetXml);
141
+ const sheetProtection = recordChild(recordChild(parsed, 'worksheet'), 'sheetProtection');
142
+ if (!sheetProtection || isFalseAttribute(sheetProtection['sheet'])) {
143
+ return;
144
+ }
145
+ const xmlAttributes = readSheetProtectionXmlAttributes(sheetXml);
146
+ protectionsBySheet.set(sheetName, {
147
+ sheetName,
148
+ ...(xmlAttributes ? { xmlAttributes } : {}),
149
+ });
150
+ });
151
+ return protectionsBySheet;
152
+ }
153
+ //# sourceMappingURL=xlsx-sheet-protection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xlsx-sheet-protection.js","sourceRoot":"","sources":["../src/xlsx-sheet-protection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAG3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,kBAAkB,EAAsB,MAAM,eAAe,CAAA;AAItE,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC;IAC9B,gBAAgB,EAAE,KAAK;IACvB,mBAAmB,EAAE,EAAE;IACvB,mBAAmB,EAAE,KAAK;IAC1B,cAAc,EAAE,IAAI;CACrB,CAAC,CAAA;AAEF,MAAM,+BAA+B,GAAG;IACtC,iBAAiB;IACjB,WAAW;IACX,YAAY;IACZ,WAAW;IACX,iBAAiB;IACjB,kBAAkB;IAClB,YAAY;IACZ,uBAAuB;IACvB,iBAAiB;IACjB,YAAY;IACZ,cAAc;IACd,aAAa;IACb,WAAW;IACX,cAAc;IACd,SAAS;IACT,eAAe;IACf,YAAY;IACZ,sBAAsB;CACd,CAAA;AAEV,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAA;AACpD,CAAC;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,GAAW;IAC9C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAA;IACxB,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;AACvC,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;AACjC,CAAC;AAED,SAAS,UAAU,CAAC,GAAe,EAAE,IAAY;IAC/C,MAAM,IAAI,GAAG,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAA;IACxC,OAAO,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AACtC,CAAC;AAED,SAAS,UAAU,CAAC,GAAe,EAAE,IAAY,EAAE,IAAY;IAC7D,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;AAC7C,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,OAAO,CAAA;AAC9D,CAAC;AAED,MAAM,cAAc,GAAG,uBAAuB,CAAA;AAC9C,MAAM,gBAAgB,GAAqC;IACzD,GAAG,EAAE,GAAG;IACR,IAAI,EAAE,GAAG;IACT,EAAE,EAAE,GAAG;IACP,EAAE,EAAE,GAAG;IACP,IAAI,EAAE,GAAG;CACV,CAAA;AAED,SAAS,oBAAoB,CAAC,KAAa;IACzC,OAAO,KAAK,CAAC,OAAO,CAClB,0DAA0D,EAC1D,CAAC,KAAK,EAAE,GAAuB,EAAE,OAA2B,EAAE,KAAyB,EAAE,EAAE;QACzF,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;YACnB,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,OAAO,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YACtE,OAAO,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC,IAAI,SAAS,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;QAC7H,CAAC;QACD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IAC3D,CAAC,CACF,CAAA;AACH,CAAC;AAED,SAAS,gCAAgC,CAAC,QAAgB;IACxD,MAAM,KAAK,GAAG,8DAA8D,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC3F,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,MAAM,UAAU,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,kDAAkD,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QACrH,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE;QAC7B,KAAK,EAAE,oBAAoB,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;KAC1E,CAAC,CAAC,CAAA;IACH,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,GAAG,EAAE,CAAC;QAC9F,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAA;AACvD,CAAC;AAED,SAAS,gCAAgC,CAAC,UAA2C;IACnF,MAAM,UAAU,GAAG,CAAC,UAAU,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;IAC9G,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,8BAA8B,CAAA;IACvC,CAAC;IACD,OAAO,mBAAmB,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,IAAI,KAAK,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAA;AACrI,CAAC;AAED,SAAS,8BAA8B,CAAC,QAAgB,EAAE,UAA2C;IACnG,MAAM,eAAe,GAAG,gCAAgC,CAAC,UAAU,CAAC,CAAA;IACpE,IAAI,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzC,OAAO,QAAQ,CAAC,OAAO,CAAC,8DAA8D,EAAE,eAAe,CAAC,CAAA;IAC1G,CAAC;IAED,IAAI,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;IAClD,KAAK,MAAM,WAAW,IAAI,+BAA+B,EAAE,CAAC;QAC1D,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,WAAW,KAAK,EAAE,GAAG,CAAC,CAAC,CAAA;QAC3E,IAAI,YAAY,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,YAAY,GAAG,WAAW,CAAC,EAAE,CAAC;YACzE,WAAW,GAAG,YAAY,CAAA;QAC5B,CAAC;IACH,CAAC;IACD,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,GAAG,eAAe,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAA;AAC5F,CAAC;AAED,MAAM,UAAU,oCAAoC,CAAC,KAAiB,EAAE,QAA0B;IAChG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,eAAe,EAAE,SAAS,KAAK,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAChG,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,CAAA;IAC5B,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,QAAQ,CAAC,MAAM;SACZ,QAAQ,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;SACnD,OAAO,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE;QAC7B,IAAI,KAAK,CAAC,QAAQ,EAAE,eAAe,EAAE,SAAS,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;YAC9D,OAAM;QACR,CAAC;QACD,MAAM,eAAe,GAAG,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAA;QACtD,MAAM,SAAS,GAAG,sBAAsB,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,MAAM,CAAA;QACpE,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;QAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAM;QACR,CAAC;QACD,UAAU,CAAC,GAAG,EAAE,SAAS,EAAE,8BAA8B,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAA;QACrF,OAAO,GAAG,IAAI,CAAA;IAChB,CAAC,CAAC,CAAA;IAEJ,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;AACvC,CAAC;AAED,MAAM,UAAU,oCAAoC,CAClD,MAAqB,EACrB,UAA6B;IAE7B,MAAM,GAAG,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAA;IACtC,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAA2C,CAAA;IAE7E,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,EAAE;QAC3C,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE,sBAAsB,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,CAAA;QACpF,IAAI,CAAC,QAAQ,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvD,OAAM;QACR,CAAC;QACD,MAAM,MAAM,GAAY,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;QACjD,MAAM,eAAe,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,iBAAiB,CAAC,CAAA;QACxF,IAAI,CAAC,eAAe,IAAI,gBAAgB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YACnE,OAAM;QACR,CAAC;QACD,MAAM,aAAa,GAAG,gCAAgC,CAAC,QAAQ,CAAC,CAAA;QAChE,kBAAkB,CAAC,GAAG,CAAC,SAAS,EAAE;YAChC,SAAS;YACT,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5C,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,OAAO,kBAAkB,CAAA;AAC3B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type * as XLSX from 'xlsx';
2
+ import type { WorkbookSheetVisibilitySnapshot, WorkbookSnapshot } from '@bilig/protocol';
3
+ export declare function readImportedWorkbookSheetVisibilities(workbook: XLSX.WorkBook, sheetNames: readonly string[]): Map<string, WorkbookSheetVisibilitySnapshot>;
4
+ export declare function applyExportSheetVisibilitiesToWorkbook(workbook: XLSX.WorkBook, snapshot: WorkbookSnapshot): void;
@@ -0,0 +1,53 @@
1
+ function importedSheetVisibility(value) {
2
+ if (value === 1 || value === '1') {
3
+ return 'hidden';
4
+ }
5
+ if (value === 2 || value === '2') {
6
+ return 'veryHidden';
7
+ }
8
+ return undefined;
9
+ }
10
+ function exportedSheetHidden(value) {
11
+ if (value === 'hidden') {
12
+ return 1;
13
+ }
14
+ if (value === 'veryHidden') {
15
+ return 2;
16
+ }
17
+ return undefined;
18
+ }
19
+ export function readImportedWorkbookSheetVisibilities(workbook, sheetNames) {
20
+ const sheetProps = workbook.Workbook?.Sheets ?? [];
21
+ const visibilitiesBySheet = new Map();
22
+ sheetNames.forEach((sheetName, sheetIndex) => {
23
+ const visibility = importedSheetVisibility(sheetProps[sheetIndex]?.Hidden);
24
+ if (visibility) {
25
+ visibilitiesBySheet.set(sheetName, visibility);
26
+ }
27
+ });
28
+ return visibilitiesBySheet;
29
+ }
30
+ export function applyExportSheetVisibilitiesToWorkbook(workbook, snapshot) {
31
+ const orderedSheets = snapshot.sheets.toSorted((left, right) => left.order - right.order);
32
+ if (!orderedSheets.some((sheet) => sheet.metadata?.visibility)) {
33
+ return;
34
+ }
35
+ const existingSheets = workbook.Workbook?.Sheets ?? [];
36
+ const sheets = workbook.SheetNames.map((sheetName, sheetIndex) => {
37
+ const hidden = exportedSheetHidden(orderedSheets[sheetIndex]?.metadata?.visibility);
38
+ const sheet = {
39
+ ...existingSheets[sheetIndex],
40
+ name: sheetName,
41
+ };
42
+ delete sheet.Hidden;
43
+ if (hidden !== undefined) {
44
+ sheet.Hidden = hidden;
45
+ }
46
+ return sheet;
47
+ });
48
+ workbook.Workbook = {
49
+ ...workbook.Workbook,
50
+ Sheets: sheets,
51
+ };
52
+ }
53
+ //# sourceMappingURL=xlsx-sheet-visibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xlsx-sheet-visibility.js","sourceRoot":"","sources":["../src/xlsx-sheet-visibility.ts"],"names":[],"mappings":"AAIA,SAAS,uBAAuB,CAAC,KAAc;IAC7C,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;QACjC,OAAO,YAAY,CAAA;IACrB,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAkD;IAC7E,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvB,OAAO,CAAC,CAAA;IACV,CAAC;IACD,IAAI,KAAK,KAAK,YAAY,EAAE,CAAC;QAC3B,OAAO,CAAC,CAAA;IACV,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,qCAAqC,CACnD,QAAuB,EACvB,UAA6B;IAE7B,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,CAAA;IAClD,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAA2C,CAAA;IAE9E,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,EAAE;QAC3C,MAAM,UAAU,GAAG,uBAAuB,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAA;QAC1E,IAAI,UAAU,EAAE,CAAC;YACf,mBAAmB,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;QAChD,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,mBAAmB,CAAA;AAC5B,CAAC;AAED,MAAM,UAAU,sCAAsC,CAAC,QAAuB,EAAE,QAA0B;IACxG,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAA;IACzF,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC;QAC/D,OAAM;IACR,CAAC;IAED,MAAM,cAAc,GAAG,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,CAAA;IACtD,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,EAAE;QAC/D,MAAM,MAAM,GAAG,mBAAmB,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;QACnF,MAAM,KAAK,GAAG;YACZ,GAAG,cAAc,CAAC,UAAU,CAAC;YAC7B,IAAI,EAAE,SAAS;SAChB,CAAA;QACD,OAAO,KAAK,CAAC,MAAM,CAAA;QACnB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,KAAK,CAAC,MAAM,GAAG,MAAM,CAAA;QACvB,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,QAAQ,GAAG;QAClB,GAAG,QAAQ,CAAC,QAAQ;QACpB,MAAM,EAAE,MAAM;KACf,CAAA;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { WorkbookSlicerConnectionArtifactsSnapshot, WorkbookSnapshot } from '@bilig/protocol';
2
+ import { type XlsxZipSource } from './xlsx-zip.js';
3
+ export declare function readImportedWorkbookSlicerConnectionArtifacts(source: XlsxZipSource, sheetNames: readonly string[]): WorkbookSlicerConnectionArtifactsSnapshot | undefined;
4
+ export declare function addExportSlicerConnectionArtifactsToXlsxBytes(bytes: Uint8Array, snapshot: WorkbookSnapshot): Uint8Array;
@@ -0,0 +1,426 @@
1
+ import { unzipSync, zipSync } from 'fflate';
2
+ import { getZipText, normalizeZipPath, readXlsxZipEntries } from './xlsx-zip.js';
3
+ import { buildRelationshipsXml, ensureRelationshipNamespace, escapeXml, nextRelationshipId, parseRelationships, resolveTargetPath, setZipText, } from './xlsx-pivot-artifacts.js';
4
+ const binaryChunkSize = 0x8000;
5
+ const workbookPath = 'xl/workbook.xml';
6
+ const workbookRelationshipsPath = 'xl/_rels/workbook.xml.rels';
7
+ const contentTypesPath = '[Content_Types].xml';
8
+ const connectionsRelationshipType = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/connections';
9
+ const slicerCacheRelationshipType = 'http://schemas.microsoft.com/office/2007/relationships/slicerCache';
10
+ const slicerRelationshipType = 'http://schemas.microsoft.com/office/2007/relationships/slicer';
11
+ const connectionsContentType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml';
12
+ const slicerCacheContentType = 'application/vnd.ms-excel.slicerCache+xml';
13
+ const slicerContentType = 'application/vnd.ms-excel.slicer+xml';
14
+ const extensionElementPattern = /<(?:[A-Za-z_][\w.-]*:)?ext\b[^>]*(?:\/>|>[\s\S]*?<\/(?:[A-Za-z_][\w.-]*:)?ext>)/gu;
15
+ const extLstClosingElementPattern = /<\/(?:[A-Za-z_][\w.-]*:)?extLst>/u;
16
+ const connectionsPartPathPattern = /^xl\/connections\.xml$/u;
17
+ const connectionsRelationshipPartPathPattern = /^xl\/_rels\/connections\.xml\.rels$/u;
18
+ const slicerCachePartPathPattern = /^xl\/slicerCaches\/slicerCache[1-9][0-9]*\.xml$/u;
19
+ const slicerCacheRelationshipPartPathPattern = /^xl\/slicerCaches\/_rels\/slicerCache[1-9][0-9]*\.xml\.rels$/u;
20
+ const slicerPartPathPattern = /^xl\/slicers\/slicer[1-9][0-9]*\.xml$/u;
21
+ const slicerRelationshipPartPathPattern = /^xl\/slicers\/_rels\/slicer[1-9][0-9]*\.xml\.rels$/u;
22
+ function encodeBinaryString(bytes) {
23
+ let binary = '';
24
+ for (let offset = 0; offset < bytes.length; offset += binaryChunkSize) {
25
+ binary += String.fromCharCode(...bytes.subarray(offset, offset + binaryChunkSize));
26
+ }
27
+ return binary;
28
+ }
29
+ function decodeBinaryString(binary) {
30
+ const bytes = new Uint8Array(binary.length);
31
+ for (let index = 0; index < binary.length; index += 1) {
32
+ bytes[index] = binary.charCodeAt(index);
33
+ }
34
+ return bytes;
35
+ }
36
+ function encodeBase64(bytes) {
37
+ const btoa = globalThis.btoa;
38
+ if (typeof btoa === 'function') {
39
+ return btoa(encodeBinaryString(bytes));
40
+ }
41
+ return Buffer.from(bytes).toString('base64');
42
+ }
43
+ function decodeBase64(dataBase64) {
44
+ const atob = globalThis.atob;
45
+ if (typeof atob === 'function') {
46
+ return decodeBinaryString(atob(dataBase64));
47
+ }
48
+ return new Uint8Array(Buffer.from(dataBase64, 'base64'));
49
+ }
50
+ function encodedPartSnapshot(path, bytes) {
51
+ return {
52
+ path,
53
+ storage: 'base64',
54
+ dataBase64: encodeBase64(bytes),
55
+ byteLength: bytes.byteLength,
56
+ };
57
+ }
58
+ function decodedPartBytes(part) {
59
+ if (part.storage !== 'base64') {
60
+ return undefined;
61
+ }
62
+ const bytes = decodeBase64(part.dataBase64);
63
+ return bytes.byteLength === part.byteLength ? bytes : undefined;
64
+ }
65
+ function readAttribute(xml, attributeName) {
66
+ const match = new RegExp(`\\s${attributeName}=("|')([\\s\\S]*?)\\1`, 'u').exec(xml);
67
+ return match?.[2] ?? null;
68
+ }
69
+ function escapeRegExp(value) {
70
+ return value.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&');
71
+ }
72
+ function extensionFromPath(path) {
73
+ const normalized = normalizeZipPath(path);
74
+ const fileName = normalized.slice(normalized.lastIndexOf('/') + 1);
75
+ const extensionIndex = fileName.lastIndexOf('.');
76
+ return extensionIndex >= 0 && extensionIndex < fileName.length - 1 ? fileName.slice(extensionIndex + 1).toLowerCase() : null;
77
+ }
78
+ function readContentTypeDefaults(contentTypesXml, partPaths) {
79
+ const neededExtensions = new Set(partPaths.map(extensionFromPath).filter((extension) => Boolean(extension)));
80
+ const defaultsByExtension = new Map();
81
+ for (const match of contentTypesXml.matchAll(/<Default\b([^>]*)\/?>/gu)) {
82
+ const attributes = match[1] ?? '';
83
+ const extension = readAttribute(attributes, 'Extension')?.toLowerCase();
84
+ const contentType = readAttribute(attributes, 'ContentType');
85
+ if (!extension || !contentType || !neededExtensions.has(extension)) {
86
+ continue;
87
+ }
88
+ defaultsByExtension.set(extension, { extension, contentType });
89
+ }
90
+ return [...defaultsByExtension.values()].toSorted((left, right) => left.extension.localeCompare(right.extension));
91
+ }
92
+ function readContentTypeOverrides(contentTypesXml, partPaths) {
93
+ const neededPartNames = new Set(partPaths.map((path) => `/${normalizeZipPath(path)}`));
94
+ const overridesByPartName = new Map();
95
+ for (const match of contentTypesXml.matchAll(/<Override\b([^>]*)\/?>/gu)) {
96
+ const attributes = match[1] ?? '';
97
+ const partName = readAttribute(attributes, 'PartName');
98
+ const contentType = readAttribute(attributes, 'ContentType');
99
+ if (!partName || !contentType || !neededPartNames.has(partName)) {
100
+ continue;
101
+ }
102
+ overridesByPartName.set(partName, { partName, contentType });
103
+ }
104
+ return [...overridesByPartName.values()].toSorted((left, right) => left.partName.localeCompare(right.partName));
105
+ }
106
+ function addContentTypeDefault(contentTypesXml, extension, contentType) {
107
+ const pattern = new RegExp(`<Default\\b[^>]*\\bExtension=("|')${escapeRegExp(extension)}\\1`, 'u');
108
+ if (pattern.test(contentTypesXml) || !contentTypesXml.includes('</Types>')) {
109
+ return contentTypesXml;
110
+ }
111
+ return contentTypesXml.replace('</Types>', `<Default Extension="${escapeXml(extension)}" ContentType="${escapeXml(contentType)}"/></Types>`);
112
+ }
113
+ function upsertContentTypeOverride(contentTypesXml, partName, contentType) {
114
+ if (!contentTypesXml.includes('</Types>')) {
115
+ return contentTypesXml;
116
+ }
117
+ const escapedPartName = escapeXml(partName);
118
+ const escapedContentType = escapeXml(contentType);
119
+ const overridePattern = /<Override\b([^>]*)\/?>/gu;
120
+ let replaced = false;
121
+ const nextXml = contentTypesXml.replace(overridePattern, (match, attributes) => {
122
+ if (readAttribute(attributes, 'PartName') !== partName) {
123
+ return match;
124
+ }
125
+ replaced = true;
126
+ return `<Override PartName="${escapedPartName}" ContentType="${escapedContentType}"/>`;
127
+ });
128
+ return replaced
129
+ ? nextXml
130
+ : nextXml.replace('</Types>', `<Override PartName="${escapedPartName}" ContentType="${escapedContentType}"/></Types>`);
131
+ }
132
+ function relationshipSnapshot(relationship) {
133
+ return {
134
+ id: relationship.id,
135
+ type: relationship.type,
136
+ target: relationship.target,
137
+ ...(relationship.targetMode ? { targetMode: relationship.targetMode } : {}),
138
+ };
139
+ }
140
+ function parsedRelationship(relationship) {
141
+ return {
142
+ id: relationship.id,
143
+ type: relationship.type,
144
+ target: relationship.target,
145
+ ...(relationship.targetMode ? { targetMode: relationship.targetMode } : {}),
146
+ };
147
+ }
148
+ function isWorkbookArtifactRelationship(relationship) {
149
+ return relationship.type === connectionsRelationshipType || relationship.type === slicerCacheRelationshipType;
150
+ }
151
+ function isSlicerRelationship(relationship) {
152
+ return relationship.type === slicerRelationshipType;
153
+ }
154
+ function relationshipPartPath(partPath) {
155
+ const normalized = normalizeZipPath(partPath);
156
+ const slashIndex = normalized.lastIndexOf('/');
157
+ const directory = slashIndex >= 0 ? normalized.slice(0, slashIndex) : '';
158
+ const fileName = slashIndex >= 0 ? normalized.slice(slashIndex + 1) : normalized;
159
+ return directory.length > 0 ? `${directory}/_rels/${fileName}.rels` : `_rels/${fileName}.rels`;
160
+ }
161
+ function isPreservedPackagePartPath(path) {
162
+ const normalized = normalizeZipPath(path);
163
+ return (connectionsPartPathPattern.test(normalized) ||
164
+ connectionsRelationshipPartPathPattern.test(normalized) ||
165
+ slicerCachePartPathPattern.test(normalized) ||
166
+ slicerCacheRelationshipPartPathPattern.test(normalized) ||
167
+ slicerPartPathPattern.test(normalized) ||
168
+ slicerRelationshipPartPathPattern.test(normalized));
169
+ }
170
+ function fallbackContentTypeForPath(path) {
171
+ const normalized = normalizeZipPath(path);
172
+ if (connectionsPartPathPattern.test(normalized)) {
173
+ return connectionsContentType;
174
+ }
175
+ if (slicerCachePartPathPattern.test(normalized)) {
176
+ return slicerCacheContentType;
177
+ }
178
+ if (slicerPartPathPattern.test(normalized)) {
179
+ return slicerContentType;
180
+ }
181
+ return null;
182
+ }
183
+ function extensionXmlWithChild(xml, childName) {
184
+ if (!xml) {
185
+ return undefined;
186
+ }
187
+ const childPattern = new RegExp(`<(?:[A-Za-z_][\\w.-]*:)?${childName}\\b`, 'u');
188
+ extensionElementPattern.lastIndex = 0;
189
+ return [...xml.matchAll(extensionElementPattern)].find((match) => childPattern.test(match[0]))?.[0];
190
+ }
191
+ function removeExtensionXmlWithChild(xml, childName) {
192
+ const childPattern = new RegExp(`<(?:[A-Za-z_][\\w.-]*:)?${childName}\\b`, 'u');
193
+ extensionElementPattern.lastIndex = 0;
194
+ return xml.replace(extensionElementPattern, (extensionXml) => (childPattern.test(extensionXml) ? '' : extensionXml));
195
+ }
196
+ function insertExtensionXml(xml, extensionXml, relationshipIds, childName, rootElementName) {
197
+ const nextExtensionXml = replaceRelationshipIds(extensionXml, relationshipIds);
198
+ const withoutExistingExtension = ensureRelationshipNamespace(removeExtensionXmlWithChild(xml, childName));
199
+ if (extLstClosingElementPattern.test(withoutExistingExtension)) {
200
+ return withoutExistingExtension.replace(extLstClosingElementPattern, `${nextExtensionXml}$&`);
201
+ }
202
+ return withoutExistingExtension.replace(new RegExp(`</(?:[A-Za-z_][\\w.-]*:)?${rootElementName}>`, 'u'), `<extLst>${nextExtensionXml}</extLst>$&`);
203
+ }
204
+ function readSheetArtifacts(zip, sheetNames) {
205
+ return sheetNames.flatMap((sheetName, sheetIndex) => {
206
+ const sheetPath = `xl/worksheets/sheet${String(sheetIndex + 1)}.xml`;
207
+ const relationshipsPath = `xl/worksheets/_rels/sheet${String(sheetIndex + 1)}.xml.rels`;
208
+ const sheetSlicerListExtXml = extensionXmlWithChild(getZipText(zip, sheetPath), 'slicerList');
209
+ const relationships = parseRelationships(getZipText(zip, relationshipsPath)).filter(isSlicerRelationship).map(relationshipSnapshot);
210
+ if (!sheetSlicerListExtXml && relationships.length === 0) {
211
+ return [];
212
+ }
213
+ return [
214
+ {
215
+ sheetName,
216
+ ...(sheetSlicerListExtXml ? { sheetSlicerListExtXml } : {}),
217
+ ...(relationships.length > 0 ? { relationships } : {}),
218
+ },
219
+ ];
220
+ });
221
+ }
222
+ function addRelationshipTargetPartPath(partPaths, zip, basePartPath, relationship) {
223
+ const targetPath = normalizeZipPath(resolveTargetPath(basePartPath, relationship.target));
224
+ if (isPreservedPackagePartPath(targetPath) && zip[targetPath]) {
225
+ partPaths.add(targetPath);
226
+ }
227
+ }
228
+ function readSlicerConnectionPartPaths(zip, sheetNames, workbookRelationships, sheetArtifacts) {
229
+ const partPaths = new Set();
230
+ for (const relationship of workbookRelationships) {
231
+ addRelationshipTargetPartPath(partPaths, zip, workbookPath, relationship);
232
+ }
233
+ for (const sheetArtifact of sheetArtifacts) {
234
+ const sheetIndex = sheetNames.indexOf(sheetArtifact.sheetName);
235
+ if (sheetIndex < 0) {
236
+ continue;
237
+ }
238
+ const sheetPath = `xl/worksheets/sheet${String(sheetIndex + 1)}.xml`;
239
+ for (const relationship of sheetArtifact.relationships ?? []) {
240
+ addRelationshipTargetPartPath(partPaths, zip, sheetPath, relationship);
241
+ }
242
+ }
243
+ for (const path of Object.keys(zip)) {
244
+ if (isPreservedPackagePartPath(path) && !path.includes('/_rels/')) {
245
+ partPaths.add(path);
246
+ }
247
+ }
248
+ const allPartPaths = new Set(partPaths);
249
+ for (const partPath of partPaths) {
250
+ const relsPath = relationshipPartPath(partPath);
251
+ if (zip[relsPath]) {
252
+ allPartPaths.add(relsPath);
253
+ }
254
+ }
255
+ return [...allPartPaths].toSorted();
256
+ }
257
+ function preservedPartsByPath(parts) {
258
+ const output = new Map();
259
+ for (const part of parts) {
260
+ if (!isPreservedPackagePartPath(part.path)) {
261
+ continue;
262
+ }
263
+ const bytes = decodedPartBytes(part);
264
+ if (bytes) {
265
+ output.set(normalizeZipPath(part.path), bytes);
266
+ }
267
+ }
268
+ return output;
269
+ }
270
+ function relationshipTargetExists(relationship, partsByPath, zip, basePartPath) {
271
+ const targetPath = normalizeZipPath(resolveTargetPath(basePartPath, relationship.target));
272
+ return isPreservedPackagePartPath(targetPath) && (partsByPath.has(targetPath) || Boolean(zip[targetPath]));
273
+ }
274
+ function addRelationshipsWithStableTargets(input) {
275
+ const idMap = new Map();
276
+ let changed = false;
277
+ for (const addition of input.additions ?? []) {
278
+ if (!input.includeRelationship(addition) || !relationshipTargetExists(addition, input.partsByPath, input.zip, input.basePartPath)) {
279
+ continue;
280
+ }
281
+ const existing = input.relationships.find((relationship) => relationship.type === addition.type && relationship.target === addition.target);
282
+ if (existing) {
283
+ idMap.set(addition.id, existing.id);
284
+ continue;
285
+ }
286
+ const idInUse = input.relationships.some((relationship) => relationship.id === addition.id);
287
+ const nextId = addition.id.length > 0 && !idInUse ? addition.id : nextRelationshipId(input.relationships);
288
+ input.relationships.push({ ...parsedRelationship(addition), id: nextId });
289
+ idMap.set(addition.id, nextId);
290
+ changed = true;
291
+ }
292
+ return { changed, idMap };
293
+ }
294
+ function replaceRelationshipIds(xml, relationshipIds) {
295
+ if (relationshipIds.size === 0) {
296
+ return xml;
297
+ }
298
+ return xml.replace(/\br:id=(["'])([\s\S]*?)\1/gu, (match, quote, id) => {
299
+ const nextId = relationshipIds.get(id);
300
+ return nextId ? match.replace(`${quote}${id}${quote}`, `${quote}${nextId}${quote}`) : match;
301
+ });
302
+ }
303
+ function addSlicerConnectionContentTypes(contentTypesXml, artifacts, copiedPartPaths) {
304
+ let output = contentTypesXml;
305
+ const copiedExtensions = new Set([...copiedPartPaths].map(extensionFromPath).filter((extension) => Boolean(extension)));
306
+ for (const defaultEntry of artifacts.contentTypeDefaults ?? []) {
307
+ if (copiedExtensions.has(defaultEntry.extension)) {
308
+ output = addContentTypeDefault(output, defaultEntry.extension, defaultEntry.contentType);
309
+ }
310
+ }
311
+ for (const overrideEntry of artifacts.contentTypeOverrides ?? []) {
312
+ const path = normalizeZipPath(overrideEntry.partName);
313
+ if (copiedPartPaths.has(path)) {
314
+ output = upsertContentTypeOverride(output, overrideEntry.partName, overrideEntry.contentType);
315
+ }
316
+ }
317
+ for (const path of copiedPartPaths) {
318
+ const contentType = fallbackContentTypeForPath(path);
319
+ if (contentType) {
320
+ output = upsertContentTypeOverride(output, `/${path}`, contentType);
321
+ }
322
+ }
323
+ return output;
324
+ }
325
+ export function readImportedWorkbookSlicerConnectionArtifacts(source, sheetNames) {
326
+ const zip = readXlsxZipEntries(source);
327
+ const workbookSlicerCachesExtXml = extensionXmlWithChild(getZipText(zip, workbookPath), 'slicerCaches');
328
+ const workbookRelationships = parseRelationships(getZipText(zip, workbookRelationshipsPath))
329
+ .filter(isWorkbookArtifactRelationship)
330
+ .map(relationshipSnapshot);
331
+ const sheetArtifacts = readSheetArtifacts(zip, sheetNames);
332
+ const partPaths = readSlicerConnectionPartPaths(zip, sheetNames, workbookRelationships, sheetArtifacts);
333
+ const parts = partPaths.flatMap((path) => {
334
+ const bytes = zip[path];
335
+ return bytes ? [encodedPartSnapshot(path, bytes)] : [];
336
+ });
337
+ if (parts.length === 0 && !workbookSlicerCachesExtXml && workbookRelationships.length === 0 && sheetArtifacts.length === 0) {
338
+ return undefined;
339
+ }
340
+ const contentTypesXml = getZipText(zip, contentTypesPath) ?? '';
341
+ const contentTypeDefaults = contentTypesXml ? readContentTypeDefaults(contentTypesXml, partPaths) : [];
342
+ const contentTypeOverrides = contentTypesXml ? readContentTypeOverrides(contentTypesXml, partPaths) : [];
343
+ return {
344
+ parts,
345
+ ...(workbookSlicerCachesExtXml ? { workbookSlicerCachesExtXml } : {}),
346
+ ...(workbookRelationships.length > 0 ? { workbookRelationships } : {}),
347
+ ...(sheetArtifacts.length > 0 ? { sheetArtifacts } : {}),
348
+ ...(contentTypeDefaults.length > 0 ? { contentTypeDefaults } : {}),
349
+ ...(contentTypeOverrides.length > 0 ? { contentTypeOverrides } : {}),
350
+ };
351
+ }
352
+ export function addExportSlicerConnectionArtifactsToXlsxBytes(bytes, snapshot) {
353
+ const artifacts = snapshot.workbook.metadata?.slicerConnectionArtifacts;
354
+ if (!artifacts || artifacts.parts.length === 0) {
355
+ return bytes;
356
+ }
357
+ const zip = unzipSync(bytes);
358
+ const partsByPath = preservedPartsByPath(artifacts.parts);
359
+ if (partsByPath.size === 0) {
360
+ return bytes;
361
+ }
362
+ let changed = false;
363
+ const copiedPartPaths = new Set();
364
+ for (const [path, partBytes] of partsByPath) {
365
+ zip[path] = partBytes;
366
+ copiedPartPaths.add(path);
367
+ changed = true;
368
+ }
369
+ const workbookRelationships = parseRelationships(getZipText(zip, workbookRelationshipsPath));
370
+ const workbookRelationshipResult = addRelationshipsWithStableTargets({
371
+ relationships: workbookRelationships,
372
+ additions: artifacts.workbookRelationships,
373
+ partsByPath,
374
+ zip,
375
+ basePartPath: workbookPath,
376
+ includeRelationship: isWorkbookArtifactRelationship,
377
+ });
378
+ if (workbookRelationshipResult.changed) {
379
+ setZipText(zip, workbookRelationshipsPath, buildRelationshipsXml(workbookRelationships));
380
+ changed = true;
381
+ }
382
+ const workbookXml = getZipText(zip, workbookPath);
383
+ if (workbookXml && artifacts.workbookSlicerCachesExtXml) {
384
+ setZipText(zip, workbookPath, insertExtensionXml(workbookXml, artifacts.workbookSlicerCachesExtXml, workbookRelationshipResult.idMap, 'slicerCaches', 'workbook'));
385
+ changed = true;
386
+ }
387
+ const sheetArtifactsByName = new Map((artifacts.sheetArtifacts ?? []).map((sheetArtifact) => [sheetArtifact.sheetName, sheetArtifact]));
388
+ snapshot.sheets
389
+ .toSorted((left, right) => left.order - right.order)
390
+ .forEach((sheet, sheetIndex) => {
391
+ const sheetArtifacts = sheetArtifactsByName.get(sheet.name);
392
+ if (!sheetArtifacts) {
393
+ return;
394
+ }
395
+ const sheetPath = `xl/worksheets/sheet${String(sheetIndex + 1)}.xml`;
396
+ const relationshipPath = `xl/worksheets/_rels/sheet${String(sheetIndex + 1)}.xml.rels`;
397
+ const relationships = parseRelationships(getZipText(zip, relationshipPath));
398
+ const relationshipResult = addRelationshipsWithStableTargets({
399
+ relationships,
400
+ additions: sheetArtifacts.relationships,
401
+ partsByPath,
402
+ zip,
403
+ basePartPath: sheetPath,
404
+ includeRelationship: isSlicerRelationship,
405
+ });
406
+ if (relationshipResult.changed) {
407
+ setZipText(zip, relationshipPath, buildRelationshipsXml(relationships));
408
+ changed = true;
409
+ }
410
+ const sheetXml = getZipText(zip, sheetPath);
411
+ if (sheetXml && sheetArtifacts.sheetSlicerListExtXml) {
412
+ setZipText(zip, sheetPath, insertExtensionXml(sheetXml, sheetArtifacts.sheetSlicerListExtXml, relationshipResult.idMap, 'slicerList', 'worksheet'));
413
+ changed = true;
414
+ }
415
+ });
416
+ const contentTypesXml = getZipText(zip, contentTypesPath) ?? '';
417
+ const nextContentTypesXml = contentTypesXml
418
+ ? addSlicerConnectionContentTypes(contentTypesXml, artifacts, copiedPartPaths)
419
+ : contentTypesXml;
420
+ if (nextContentTypesXml !== contentTypesXml) {
421
+ setZipText(zip, contentTypesPath, nextContentTypesXml);
422
+ changed = true;
423
+ }
424
+ return changed ? zipSync(zip) : bytes;
425
+ }
426
+ //# sourceMappingURL=xlsx-slicer-connection-artifacts.js.map