read-excel-file 9.3.3 → 9.3.5

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 (255) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +32 -2
  3. package/browser/index.cjs +3 -0
  4. package/browser/index.d.ts +16 -0
  5. package/browser/index.js +4 -1
  6. package/bundle/read-excel-file.min.js +1 -1
  7. package/bundle/read-excel-file.min.js.map +1 -1
  8. package/commonjs/export/convertInputToNodeStream.js +0 -12
  9. package/commonjs/export/convertInputToNodeStream.js.map +1 -1
  10. package/commonjs/export/parseSheet.js +14 -7
  11. package/commonjs/export/parseSheet.js.map +1 -1
  12. package/commonjs/export/readSheetBrowser.js +3 -6
  13. package/commonjs/export/readSheetBrowser.js.map +1 -1
  14. package/commonjs/export/readSheetNode.js +3 -6
  15. package/commonjs/export/readSheetNode.js.map +1 -1
  16. package/commonjs/export/readSheetUniversal.js +2 -2
  17. package/commonjs/export/readSheetUniversal.js.map +1 -1
  18. package/commonjs/export/readSheetWebWorker.js +5 -5
  19. package/commonjs/export/readSheetWebWorker.js.map +1 -1
  20. package/commonjs/export/readXlsxFileBrowser.js +3 -6
  21. package/commonjs/export/readXlsxFileBrowser.js.map +1 -1
  22. package/commonjs/export/readXlsxFileNode.js +3 -6
  23. package/commonjs/export/readXlsxFileNode.js.map +1 -1
  24. package/commonjs/export/readXlsxFileUniversal.js +2 -2
  25. package/commonjs/export/readXlsxFileUniversal.js.map +1 -1
  26. package/commonjs/export/readXlsxFileWebWorker.js +5 -5
  27. package/commonjs/export/readXlsxFileWebWorker.js.map +1 -1
  28. package/commonjs/export/unpackXlsxFileBrowser.js +15 -4
  29. package/commonjs/export/unpackXlsxFileBrowser.js.map +1 -1
  30. package/commonjs/export/unpackXlsxFileBrowser.test.js.map +1 -0
  31. package/commonjs/export/unpackXlsxFileNode.js +32 -5
  32. package/commonjs/export/unpackXlsxFileNode.js.map +1 -1
  33. package/commonjs/export/unpackXlsxFileNode.test.js.map +1 -0
  34. package/commonjs/export/unpackXlsxFileUniversal.js +14 -3
  35. package/commonjs/export/unpackXlsxFileUniversal.js.map +1 -1
  36. package/commonjs/export/unpackXlsxFileUniversal.test.js.map +1 -0
  37. package/commonjs/parseSheetData/parseSheetData.js +9 -6
  38. package/commonjs/parseSheetData/parseSheetData.js.map +1 -1
  39. package/commonjs/saxen/parser.js +1 -1
  40. package/commonjs/saxen/parser.js.map +1 -1
  41. package/commonjs/utility/convertValuesFromUint8ArraysToStrings.js +100 -0
  42. package/commonjs/utility/convertValuesFromUint8ArraysToStrings.js.map +1 -0
  43. package/commonjs/xlsx/InvalidSpreadsheetError.js +55 -0
  44. package/commonjs/xlsx/InvalidSpreadsheetError.js.map +1 -0
  45. package/commonjs/xlsx/SheetNotFoundError.js +55 -0
  46. package/commonjs/xlsx/SheetNotFoundError.js.map +1 -0
  47. package/commonjs/xlsx/file/InputValidationStream.js +101 -0
  48. package/commonjs/xlsx/file/InputValidationStream.js.map +1 -0
  49. package/commonjs/xlsx/file/InputValidationStream.test.js.map +1 -0
  50. package/commonjs/xlsx/file/InvalidInputError.js +105 -0
  51. package/commonjs/xlsx/file/InvalidInputError.js.map +1 -0
  52. package/commonjs/xlsx/file/createFileTypeDetector.js +70 -0
  53. package/commonjs/xlsx/file/createFileTypeDetector.js.map +1 -0
  54. package/commonjs/xlsx/file/createFileTypeDetector.test.js.map +1 -0
  55. package/commonjs/xlsx/file/validateLeadingBytes.js +47 -0
  56. package/commonjs/xlsx/file/validateLeadingBytes.js.map +1 -0
  57. package/commonjs/xlsx/file/validateLeadingBytes.test.js.map +1 -0
  58. package/commonjs/xlsx/isDateFormat.js +32 -27
  59. package/commonjs/xlsx/isDateFormat.js.map +1 -1
  60. package/commonjs/xlsx/isDateFormatStyle.js +19 -21
  61. package/commonjs/xlsx/isDateFormatStyle.js.map +1 -1
  62. package/commonjs/xlsx/parseCell.js +252 -115
  63. package/commonjs/xlsx/parseCell.js.map +1 -1
  64. package/commonjs/xlsx/parseCellAddress.js +22 -18
  65. package/commonjs/xlsx/parseCellAddress.js.map +1 -1
  66. package/commonjs/xlsx/parseExcelDate.js +4 -124
  67. package/commonjs/xlsx/parseExcelDate.js.map +1 -1
  68. package/commonjs/xlsx/parseExcelDate.test.js.map +1 -1
  69. package/commonjs/xlsx/parseExcelTimestamp.js +139 -0
  70. package/commonjs/xlsx/parseExcelTimestamp.js.map +1 -0
  71. package/commonjs/xlsx/parseFilePaths.js +48 -47
  72. package/commonjs/xlsx/parseFilePaths.js.map +1 -1
  73. package/commonjs/xlsx/parseSharedStrings.js +91 -36
  74. package/commonjs/xlsx/parseSharedStrings.js.map +1 -1
  75. package/commonjs/xlsx/parseSheet.js +527 -69
  76. package/commonjs/xlsx/parseSheet.js.map +1 -1
  77. package/commonjs/xlsx/parseSpreadsheetContents.js +154 -83
  78. package/commonjs/xlsx/parseSpreadsheetContents.js.map +1 -1
  79. package/commonjs/xlsx/parseSpreadsheetInfo.js +60 -59
  80. package/commonjs/xlsx/parseSpreadsheetInfo.js.map +1 -1
  81. package/commonjs/xlsx/parseStyles.js +75 -75
  82. package/commonjs/xlsx/parseStyles.js.map +1 -1
  83. package/commonjs/xml/parseXml.js +112 -0
  84. package/commonjs/xml/parseXml.js.map +1 -0
  85. package/commonjs/xml/parseXml.test.js.map +1 -0
  86. package/commonjs/xml/parseXmlStream.js.map +1 -1
  87. package/commonjs/xml/parseXmlStream.sax.js +69 -28
  88. package/commonjs/xml/parseXmlStream.sax.js.map +1 -1
  89. package/commonjs/xml/parseXmlStream.saxen.js +66 -40
  90. package/commonjs/xml/parseXmlStream.saxen.js.map +1 -1
  91. package/commonjs/zip/UnzipError.js +55 -0
  92. package/commonjs/zip/UnzipError.js.map +1 -0
  93. package/commonjs/zip/unzipFromArrayBuffer.js +21 -1
  94. package/commonjs/zip/unzipFromArrayBuffer.js.map +1 -1
  95. package/commonjs/zip/unzipFromArrayBuffer.test.js.map +1 -0
  96. package/commonjs/zip/unzipFromStream.fflate.js +43 -35
  97. package/commonjs/zip/unzipFromStream.fflate.js.map +1 -1
  98. package/commonjs/zip/unzipFromStream.js +188 -6
  99. package/commonjs/zip/unzipFromStream.js.map +1 -1
  100. package/commonjs/zip/unzipFromStream.unzipper.js +19 -34
  101. package/commonjs/zip/unzipFromStream.unzipper.js.map +1 -1
  102. package/modules/export/convertInputToNodeStream.js +0 -12
  103. package/modules/export/convertInputToNodeStream.js.map +1 -1
  104. package/modules/export/parseSheet.js +13 -6
  105. package/modules/export/parseSheet.js.map +1 -1
  106. package/modules/export/readSheetBrowser.js +3 -5
  107. package/modules/export/readSheetBrowser.js.map +1 -1
  108. package/modules/export/readSheetNode.js +3 -5
  109. package/modules/export/readSheetNode.js.map +1 -1
  110. package/modules/export/readSheetUniversal.js +2 -2
  111. package/modules/export/readSheetUniversal.js.map +1 -1
  112. package/modules/export/readSheetWebWorker.js +7 -8
  113. package/modules/export/readSheetWebWorker.js.map +1 -1
  114. package/modules/export/readXlsxFileBrowser.js +3 -5
  115. package/modules/export/readXlsxFileBrowser.js.map +1 -1
  116. package/modules/export/readXlsxFileNode.js +3 -5
  117. package/modules/export/readXlsxFileNode.js.map +1 -1
  118. package/modules/export/readXlsxFileUniversal.js +2 -2
  119. package/modules/export/readXlsxFileUniversal.js.map +1 -1
  120. package/modules/export/readXlsxFileWebWorker.js +7 -8
  121. package/modules/export/readXlsxFileWebWorker.js.map +1 -1
  122. package/modules/export/unpackXlsxFileBrowser.js +15 -4
  123. package/modules/export/unpackXlsxFileBrowser.js.map +1 -1
  124. package/modules/export/unpackXlsxFileBrowser.test.js.map +1 -0
  125. package/modules/export/unpackXlsxFileNode.js +32 -5
  126. package/modules/export/unpackXlsxFileNode.js.map +1 -1
  127. package/modules/export/unpackXlsxFileNode.test.js.map +1 -0
  128. package/modules/export/unpackXlsxFileUniversal.js +14 -3
  129. package/modules/export/unpackXlsxFileUniversal.js.map +1 -1
  130. package/modules/export/unpackXlsxFileUniversal.test.js.map +1 -0
  131. package/modules/parseSheetData/parseSheetData.js +9 -6
  132. package/modules/parseSheetData/parseSheetData.js.map +1 -1
  133. package/modules/saxen/parser.js +1 -1
  134. package/modules/saxen/parser.js.map +1 -1
  135. package/modules/utility/convertValuesFromUint8ArraysToStrings.js +92 -0
  136. package/modules/utility/convertValuesFromUint8ArraysToStrings.js.map +1 -0
  137. package/modules/xlsx/InvalidSpreadsheetError.js +50 -0
  138. package/modules/xlsx/InvalidSpreadsheetError.js.map +1 -0
  139. package/modules/xlsx/SheetNotFoundError.js +50 -0
  140. package/modules/xlsx/SheetNotFoundError.js.map +1 -0
  141. package/modules/xlsx/file/InputValidationStream.js +96 -0
  142. package/modules/xlsx/file/InputValidationStream.js.map +1 -0
  143. package/modules/xlsx/file/InputValidationStream.test.js.map +1 -0
  144. package/modules/xlsx/file/InvalidInputError.js +100 -0
  145. package/modules/xlsx/file/InvalidInputError.js.map +1 -0
  146. package/modules/xlsx/file/createFileTypeDetector.js +63 -0
  147. package/modules/xlsx/file/createFileTypeDetector.js.map +1 -0
  148. package/modules/xlsx/file/createFileTypeDetector.test.js.map +1 -0
  149. package/modules/xlsx/file/validateLeadingBytes.js +37 -0
  150. package/modules/xlsx/file/validateLeadingBytes.js.map +1 -0
  151. package/modules/xlsx/file/validateLeadingBytes.test.js.map +1 -0
  152. package/modules/xlsx/isDateFormat.js +31 -27
  153. package/modules/xlsx/isDateFormat.js.map +1 -1
  154. package/modules/xlsx/isDateFormatStyle.js +18 -21
  155. package/modules/xlsx/isDateFormatStyle.js.map +1 -1
  156. package/modules/xlsx/parseCell.js +251 -111
  157. package/modules/xlsx/parseCell.js.map +1 -1
  158. package/modules/xlsx/parseCellAddress.js +21 -18
  159. package/modules/xlsx/parseCellAddress.js.map +1 -1
  160. package/modules/xlsx/parseExcelDate.js +4 -124
  161. package/modules/xlsx/parseExcelDate.js.map +1 -1
  162. package/modules/xlsx/parseExcelDate.test.js.map +1 -1
  163. package/modules/xlsx/parseExcelTimestamp.js +133 -0
  164. package/modules/xlsx/parseExcelTimestamp.js.map +1 -0
  165. package/modules/xlsx/parseFilePaths.js +48 -47
  166. package/modules/xlsx/parseFilePaths.js.map +1 -1
  167. package/modules/xlsx/parseSharedStrings.js +91 -37
  168. package/modules/xlsx/parseSharedStrings.js.map +1 -1
  169. package/modules/xlsx/parseSheet.js +526 -68
  170. package/modules/xlsx/parseSheet.js.map +1 -1
  171. package/modules/xlsx/parseSpreadsheetContents.js +153 -81
  172. package/modules/xlsx/parseSpreadsheetContents.js.map +1 -1
  173. package/modules/xlsx/parseSpreadsheetInfo.js +60 -59
  174. package/modules/xlsx/parseSpreadsheetInfo.js.map +1 -1
  175. package/modules/xlsx/parseStyles.js +75 -75
  176. package/modules/xlsx/parseStyles.js.map +1 -1
  177. package/modules/xml/parseXml.js +106 -0
  178. package/modules/xml/parseXml.js.map +1 -0
  179. package/modules/xml/parseXml.test.js.map +1 -0
  180. package/modules/xml/parseXmlStream.js +2 -0
  181. package/modules/xml/parseXmlStream.js.map +1 -1
  182. package/modules/xml/parseXmlStream.sax.js +69 -28
  183. package/modules/xml/parseXmlStream.sax.js.map +1 -1
  184. package/modules/xml/parseXmlStream.saxen.js +67 -40
  185. package/modules/xml/parseXmlStream.saxen.js.map +1 -1
  186. package/modules/zip/UnzipError.js +49 -0
  187. package/modules/zip/UnzipError.js.map +1 -0
  188. package/modules/zip/unzipFromArrayBuffer.js +21 -1
  189. package/modules/zip/unzipFromArrayBuffer.js.map +1 -1
  190. package/modules/zip/unzipFromArrayBuffer.test.js.map +1 -0
  191. package/modules/zip/unzipFromStream.fflate.js +41 -35
  192. package/modules/zip/unzipFromStream.fflate.js.map +1 -1
  193. package/modules/zip/unzipFromStream.js +124 -1
  194. package/modules/zip/unzipFromStream.js.map +1 -1
  195. package/modules/zip/unzipFromStream.unzipper.js +19 -35
  196. package/modules/zip/unzipFromStream.unzipper.js.map +1 -1
  197. package/node/index.cjs +3 -0
  198. package/node/index.d.ts +16 -0
  199. package/node/index.js +3 -0
  200. package/package.json +5 -3
  201. package/types/InvalidInputError.d.ts +16 -0
  202. package/types/InvalidSpreadsheetError.d.ts +4 -0
  203. package/types/SheetNotFoundError.d.ts +4 -0
  204. package/universal/index.cjs +3 -0
  205. package/universal/index.d.ts +16 -0
  206. package/universal/index.js +3 -0
  207. package/web-worker/index.cjs +3 -0
  208. package/web-worker/index.d.ts +16 -0
  209. package/web-worker/index.js +3 -0
  210. package/commonjs/export/convertValuesFromUint8ArraysToStrings.js +0 -23
  211. package/commonjs/export/convertValuesFromUint8ArraysToStrings.js.map +0 -1
  212. package/commonjs/xlsx/convertCellsToData2dArray.js +0 -84
  213. package/commonjs/xlsx/convertCellsToData2dArray.js.map +0 -1
  214. package/commonjs/xlsx/dropEmptyColumns.js +0 -40
  215. package/commonjs/xlsx/dropEmptyColumns.js.map +0 -1
  216. package/commonjs/xlsx/dropEmptyColumns.test.js.map +0 -1
  217. package/commonjs/xlsx/dropEmptyRows.js +0 -43
  218. package/commonjs/xlsx/dropEmptyRows.js.map +0 -1
  219. package/commonjs/xlsx/dropEmptyRows.test.js.map +0 -1
  220. package/commonjs/xlsx/parseCellValue.js +0 -186
  221. package/commonjs/xlsx/parseCellValue.js.map +0 -1
  222. package/commonjs/xlsx/parseNumber.js +0 -20
  223. package/commonjs/xlsx/parseNumber.js.map +0 -1
  224. package/commonjs/xlsx/parseSharedString.js +0 -64
  225. package/commonjs/xlsx/parseSharedString.js.map +0 -1
  226. package/commonjs/xlsx/parseSheetData.js +0 -68
  227. package/commonjs/xlsx/parseSheetData.js.map +0 -1
  228. package/commonjs/xlsx/reconstructSheetDimensionsFromSheetCells.js +0 -29
  229. package/commonjs/xlsx/reconstructSheetDimensionsFromSheetCells.js.map +0 -1
  230. package/commonjs/xml/parseXmlStream.saxen.code.js +0 -953
  231. package/commonjs/xml/parseXmlStream.saxen.code.js.map +0 -1
  232. package/commonjs/xml/parseXmlStream.test.js.map +0 -1
  233. package/modules/export/convertValuesFromUint8ArraysToStrings.js +0 -17
  234. package/modules/export/convertValuesFromUint8ArraysToStrings.js.map +0 -1
  235. package/modules/xlsx/convertCellsToData2dArray.js +0 -77
  236. package/modules/xlsx/convertCellsToData2dArray.js.map +0 -1
  237. package/modules/xlsx/dropEmptyColumns.js +0 -34
  238. package/modules/xlsx/dropEmptyColumns.js.map +0 -1
  239. package/modules/xlsx/dropEmptyColumns.test.js.map +0 -1
  240. package/modules/xlsx/dropEmptyRows.js +0 -37
  241. package/modules/xlsx/dropEmptyRows.js.map +0 -1
  242. package/modules/xlsx/dropEmptyRows.test.js.map +0 -1
  243. package/modules/xlsx/parseCellValue.js +0 -180
  244. package/modules/xlsx/parseCellValue.js.map +0 -1
  245. package/modules/xlsx/parseNumber.js +0 -14
  246. package/modules/xlsx/parseNumber.js.map +0 -1
  247. package/modules/xlsx/parseSharedString.js +0 -55
  248. package/modules/xlsx/parseSharedString.js.map +0 -1
  249. package/modules/xlsx/parseSheetData.js +0 -55
  250. package/modules/xlsx/parseSheetData.js.map +0 -1
  251. package/modules/xlsx/reconstructSheetDimensionsFromSheetCells.js +0 -23
  252. package/modules/xlsx/reconstructSheetDimensionsFromSheetCells.js.map +0 -1
  253. package/modules/xml/parseXmlStream.saxen.code.js +0 -947
  254. package/modules/xml/parseXmlStream.saxen.code.js.map +0 -1
  255. package/modules/xml/parseXmlStream.test.js.map +0 -1
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = parseXml;
7
+ var _parseXmlStream = _interopRequireDefault(require("./parseXmlStream.js"));
8
+ var _InvalidSpreadsheetError = _interopRequireDefault(require("../xlsx/InvalidSpreadsheetError.js"));
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
10
+ /**
11
+ * Parses XML markup by calling the supplied callback functions.
12
+ * @param {string} xml
13
+ * @param {any} state — The initial `state`. This `state` will supposedly be modified by the callback functions as the XML is being parsed.
14
+ * @param {function} [onOpenTag]
15
+ * @param {function} [onCloseTag]
16
+ * @param {function} [onText]
17
+ * @param {function} [onProgress] — If defined, will be called every time it finishes parsing yet another chunk of XML.
18
+ * @returns {Promise<void>} Returns a `Promise` that resolves to nothing. Inspect the passed `state` argument for changes.
19
+ */
20
+ function parseXml(xml, state, onOpenTag, onCloseTag, onText, onProgress) {
21
+ var parser = (0, _parseXmlStream["default"])(state, onOpenTag, onCloseTag, onText);
22
+ if (onProgress) {
23
+ parseXmlInChunks(parser, xml, onProgress);
24
+ } else {
25
+ // Parse XML "all at once"
26
+ parser.write(xml);
27
+ parser.end();
28
+ }
29
+ return parser.promise.then(function (result) {
30
+ return result;
31
+ }, function (error) {
32
+ // If the error is not re-thrown here, the parser will simply keep parsing,
33
+ // i.e. it doesn't halt after encountering an error and doesn't require manual resuming.
34
+ // So it must re-throw the error here in order for the parser to stop.
35
+ // Because the error is thrown inside a `new Promise()` constructor,
36
+ // the promise will reject automatically.
37
+ var spreadsheetError = new _InvalidSpreadsheetError["default"](error.message);
38
+ spreadsheetError.stack = error.stack;
39
+ spreadsheetError.cause = error;
40
+ throw spreadsheetError;
41
+ });
42
+
43
+ // This function is placed here inside the wrapper function body
44
+ // in order to not to hav `worker-f`
45
+ /**
46
+ * Parses XML in chunks.
47
+ * @param {object} parser — An object returned from `parseXmlStream()` function.
48
+ * @param {string} xml
49
+ * @param {function} [onProgress] — Will be called after yet another chunk of XML has been parsed.
50
+ * @param {boolean} [nonBlocking] — If `true` is passed then it won't block the current thread while parsing. Otherwise, it will block the current thread until all the XML is parsed.
51
+ */
52
+ function parseXmlInChunks(parser, xml, onProgress, nonBlocking) {
53
+ var MAX_CHUNK_PROCESSING_TIME = 7; // 16 ms — 60 fps, 7 ms — 144 fps
54
+ var INITIAL_CHUNK_SIZE = 64 * 1024; // 64 KB
55
+
56
+ var chunksCount = 0;
57
+ var chunkSize = INITIAL_CHUNK_SIZE;
58
+
59
+ /**
60
+ * Parses next chunk of XML.
61
+ * @returns {boolean} Returns `true` if there're more chunks to write.
62
+ */
63
+ var parseNextChunk = function parseNextChunk() {
64
+ chunksCount++;
65
+ var startedAt = Date.now();
66
+ if (xml.length > chunkSize) {
67
+ parser.write(xml.slice(0, chunkSize));
68
+ if (onProgress) {
69
+ onProgress(false);
70
+ }
71
+ xml = xml.slice(chunkSize);
72
+ var chunkProcessingTime = Date.now() - startedAt;
73
+ if (chunkProcessingTime < MAX_CHUNK_PROCESSING_TIME * 0.5) {
74
+ chunkSize *= 2;
75
+ } else if (chunkProcessingTime > MAX_CHUNK_PROCESSING_TIME) {
76
+ chunkSize /= 2;
77
+ }
78
+ return true;
79
+ } else {
80
+ parser.write(xml);
81
+ parser.end();
82
+ if (onProgress) {
83
+ onProgress(true);
84
+ }
85
+ return false;
86
+ }
87
+ };
88
+
89
+ /**
90
+ * Parses next chunk of XML and then repeats.
91
+ */
92
+ var loop = function loop() {
93
+ if (parseNextChunk()) {
94
+ if (nonBlocking) {
95
+ if (typeof setImmediate !== 'undefined') {
96
+ setImmediate(loop);
97
+ } else {
98
+ setTimeout(loop, 0);
99
+ }
100
+ } else {
101
+ loop();
102
+ }
103
+ } else {
104
+ // Finished
105
+ // console.log('* chunk size', chunkSize)
106
+ // console.log('* chunks count', chunksCount)
107
+ }
108
+ };
109
+ loop();
110
+ }
111
+ }
112
+ //# sourceMappingURL=parseXml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseXml.js","names":["_parseXmlStream","_interopRequireDefault","require","_InvalidSpreadsheetError","obj","__esModule","parseXml","xml","state","onOpenTag","onCloseTag","onText","onProgress","parser","parseXmlStream","parseXmlInChunks","write","end","promise","then","result","error","spreadsheetError","InvalidSpreadsheetError","message","stack","cause","nonBlocking","MAX_CHUNK_PROCESSING_TIME","INITIAL_CHUNK_SIZE","chunksCount","chunkSize","parseNextChunk","startedAt","Date","now","length","slice","chunkProcessingTime","loop","setImmediate","setTimeout"],"sources":["../../source/xml/parseXml.js"],"sourcesContent":["import parseXmlStream from './parseXmlStream.js'\r\n\r\nimport InvalidSpreadsheetError from '../xlsx/InvalidSpreadsheetError.js'\r\n\r\n/**\r\n * Parses XML markup by calling the supplied callback functions.\r\n * @param {string} xml\r\n * @param {any} state — The initial `state`. This `state` will supposedly be modified by the callback functions as the XML is being parsed.\r\n * @param {function} [onOpenTag]\r\n * @param {function} [onCloseTag]\r\n * @param {function} [onText]\r\n * @param {function} [onProgress] — If defined, will be called every time it finishes parsing yet another chunk of XML.\r\n * @returns {Promise<void>} Returns a `Promise` that resolves to nothing. Inspect the passed `state` argument for changes.\r\n */\r\nexport default function parseXml(xml, state, onOpenTag, onCloseTag, onText, onProgress) {\r\n\tconst parser = parseXmlStream(state, onOpenTag, onCloseTag, onText)\r\n\r\n\tif (onProgress) {\r\n\t\tparseXmlInChunks(parser, xml, onProgress)\r\n\t} else {\r\n\t\t// Parse XML \"all at once\"\r\n\t\tparser.write(xml)\r\n\t\tparser.end()\r\n\t}\r\n\r\n\treturn parser.promise.then(\r\n\t\tresult => result,\r\n\t\t(error) => {\r\n\t\t\t// If the error is not re-thrown here, the parser will simply keep parsing,\r\n\t\t\t// i.e. it doesn't halt after encountering an error and doesn't require manual resuming.\r\n\t\t\t// So it must re-throw the error here in order for the parser to stop.\r\n\t\t\t// Because the error is thrown inside a `new Promise()` constructor,\r\n\t\t\t// the promise will reject automatically.\r\n\t\t\tconst spreadsheetError = new InvalidSpreadsheetError(error.message)\r\n\t\t\tspreadsheetError.stack = error.stack\r\n\t\t\tspreadsheetError.cause = error\r\n\t\t\tthrow spreadsheetError\r\n\t\t}\r\n\t)\r\n\r\n\t// This function is placed here inside the wrapper function body\r\n\t// in order to not to hav `worker-f`\r\n\t/**\r\n\t * Parses XML in chunks.\r\n\t * @param {object} parser — An object returned from `parseXmlStream()` function.\r\n\t * @param {string} xml\r\n\t * @param {function} [onProgress] — Will be called after yet another chunk of XML has been parsed.\r\n\t * @param {boolean} [nonBlocking] — If `true` is passed then it won't block the current thread while parsing. Otherwise, it will block the current thread until all the XML is parsed.\r\n\t */\r\n\tfunction parseXmlInChunks(parser, xml, onProgress, nonBlocking) {\r\n\t\tconst MAX_CHUNK_PROCESSING_TIME = 7 // 16 ms — 60 fps, 7 ms — 144 fps\r\n\t\tconst INITIAL_CHUNK_SIZE = 64 * 1024 // 64 KB\r\n\r\n\t\tlet chunksCount = 0\r\n\t\tlet chunkSize = INITIAL_CHUNK_SIZE\r\n\r\n\t\t/**\r\n\t\t * Parses next chunk of XML.\r\n\t\t * @returns {boolean} Returns `true` if there're more chunks to write.\r\n\t\t */\r\n\t\tconst parseNextChunk = () => {\r\n\t\t\tchunksCount++\r\n\t\t\tconst startedAt = Date.now()\r\n\t\t\tif (xml.length > chunkSize) {\r\n\t\t\t\tparser.write(xml.slice(0, chunkSize))\r\n\t\t\t\tif (onProgress) {\r\n\t\t\t\t\tonProgress(false)\r\n\t\t\t\t}\r\n\t\t\t\txml = xml.slice(chunkSize)\r\n\t\t\t\tconst chunkProcessingTime = Date.now() - startedAt\r\n\t\t\t\tif (chunkProcessingTime < MAX_CHUNK_PROCESSING_TIME * 0.5) {\r\n\t\t\t\t\tchunkSize *= 2\r\n\t\t\t\t} else if (chunkProcessingTime > MAX_CHUNK_PROCESSING_TIME) {\r\n\t\t\t\t\tchunkSize /= 2\r\n\t\t\t\t}\r\n\t\t\t\treturn true\r\n\t\t\t} else {\r\n\t\t\t\tparser.write(xml)\r\n\t\t\t\tparser.end()\r\n\t\t\t\tif (onProgress) {\r\n\t\t\t\t\tonProgress(true)\r\n\t\t\t\t}\r\n\t\t\t\treturn false\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * Parses next chunk of XML and then repeats.\r\n\t\t */\r\n\t\tconst loop = () => {\r\n\t\t\tif (parseNextChunk()) {\r\n\t\t\t\tif (nonBlocking) {\r\n\t\t\t\t\tif (typeof setImmediate !== 'undefined') {\r\n\t\t\t\t\t\tsetImmediate(loop)\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsetTimeout(loop, 0)\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tloop()\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\t// Finished\r\n\t\t\t\t// console.log('* chunk size', chunkSize)\r\n\t\t\t\t// console.log('* chunks count', chunksCount)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tloop()\r\n\t}\r\n}"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseXml.test.js","names":["_mocha","require","_chai","_parseXml","_interopRequireDefault","obj","__esModule","_regeneratorRuntime","e","t","r","Object","prototype","n","hasOwnProperty","o","defineProperty","value","i","Symbol","a","iterator","c","asyncIterator","u","toStringTag","define","enumerable","configurable","writable","wrap","Generator","create","Context","makeInvokeMethod","tryCatch","type","arg","call","h","l","f","s","y","GeneratorFunction","GeneratorFunctionPrototype","p","d","getPrototypeOf","v","values","g","defineIteratorMethods","forEach","_invoke","AsyncIterator","invoke","_typeof","resolve","__await","then","callInvokeWithMethodAndArg","Error","done","method","delegate","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","TypeError","resultName","next","nextLoc","pushTryEntry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","isNaN","length","displayName","isGeneratorFunction","constructor","name","mark","setPrototypeOf","__proto__","awrap","async","Promise","keys","reverse","pop","prev","charAt","slice","stop","rval","handle","complete","finish","_catch","delegateYield","asyncGeneratorStep","gen","reject","_next","_throw","key","info","error","_asyncToGenerator","fn","self","args","arguments","apply","err","undefined","describe","it","_callee","_callee$","_context","t0","expect","parseXmlTextContent","t1","to","equal","_callee2","_callee2$","_context2","_callee3","_callee3$","_context3","_callee4","state","onOpenTag","_callee4$","_context4","names","tagName","attributes","parseXml","deep","xml","text","onText"],"sources":["../../source/xml/parseXml.test.js"],"sourcesContent":["import { describe, it } from 'mocha'\r\nimport { expect } from 'chai'\r\n\r\nimport parseXml from './parseXml.js'\r\n\r\ndescribe('parseXmlStream', () => {\r\n\tit('should decode numeric character references in text', async () => {\r\n\t\t// Some tools (e.g. `openpyxl`) escape non-ASCII characters when writing XML.\r\n\t\texpect(await parseXmlTextContent('<r><t>Caf&#233; &#xE9;t&#xE9;</t></r>')).to.equal('Café été')\r\n\t})\r\n\r\n\tit('should decode predefined XML entities in text', async () => {\r\n\t\texpect(await parseXmlTextContent('<r><t>&lt;a&gt; &amp; &quot;b&quot; &apos;c&apos;</t></r>')).to.equal('<a> & \"b\" \\'c\\'')\r\n\t})\r\n\r\n\tit('should pass text without character references through unchanged', async () => {\r\n\t\texpect(await parseXmlTextContent('<r><t>abc</t></r>')).to.equal('abc')\r\n\t})\r\n\r\n\tit('should decode character references in attribute values', async () => {\r\n\t\t// Sheet names are read from the `name` attribute\r\n\t\t// in `xl/workbook.xml` file: `<sheet name=\"P&amp;L\"/>`.\r\n\t\tconst state = { names: [] }\r\n\t\tconst onOpenTag = (tagName, attributes, state) => {\r\n\t\t\tif (tagName === 'sheet') {\r\n\t\t\t\tstate.names.push(attributes.name)\r\n\t\t\t}\r\n\t\t}\r\n\t\tawait parseXml(\r\n\t\t\t'<sheets><sheet name=\"P&amp;L &#233;t&#xE9;\"/></sheets>',\r\n\t\t\tstate,\r\n\t\t\tonOpenTag,\r\n\t\t\tnull,\r\n\t\t\tnull\r\n\t\t)\r\n\t\texpect(state.names).to.deep.equal(['P&L été'])\r\n\t})\r\n})\r\n\r\nfunction parseXmlTextContent(xml) {\r\n\tconst state = { text: '' }\r\n\tconst onText = (text, state) => {\r\n\t\tstate.text += text\r\n\t}\r\n\treturn parseXml(\r\n\t\txml,\r\n\t\tstate,\r\n\t\tnull,\r\n\t\tnull,\r\n\t\tonText\r\n\t).then(() => state.text)\r\n}\r\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"parseXmlStream.js","names":["_parseXmlStreamSaxen","_interopRequireDefault","require","obj","__esModule"],"sources":["../../source/xml/parseXmlStream.js"],"sourcesContent":["// Currently there're 2 XML stream parser implementations:\r\n// * `sax` — The \"classic\" one. Supports Node.js streams.\r\n// * `saxen` — The small and fast one.\r\n//\r\n// `sax` has been around for a long time, and is written by a well-known developer,\r\n// but it performance is very subpar compared to `saxen`: reading a `10 MB` `.xlsx` file\r\n// with `sax` is about `1.4` secs while with `saxen` it's about `0.3` secs,\r\n// meaning that `saxen` is light-years ahead of `sax` in terms of performance.\r\n//\r\n// `sax` has an advantage of parsing XML from a Node.js stream rather than from just a `string`,\r\n// but the weird part is that when enabled, \"streaming\" mode results in significantly slower parsing:\r\n// about `3.1` secs. in \"streaming\" mode vs about `1.4` secs. in non-\"streaming\" mode.\r\n//\r\n// `sax` \"bundled\" size is `22.5 kB` (`8.1 kB` gzipped).\r\n// `saxen` \"bundled\" size is `6.15 kB` (`2.7 kB` gzipped).\r\n//\r\nexport { default as default } from './parseXmlStream.saxen.js'"],"mappings":";;;;;;;;;;;AAgBA,IAAAA,oBAAA,GAAAC,sBAAA,CAAAC,OAAA;AAA8D,SAAAD,uBAAAE,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,gBAAAA,GAAA"}
1
+ {"version":3,"file":"parseXmlStream.js","names":["_parseXmlStreamSaxen","_interopRequireDefault","require","obj","__esModule"],"sources":["../../source/xml/parseXmlStream.js"],"sourcesContent":["// Currently there're 2 XML stream parser implementations:\r\n// * `sax` — The \"classic\" one. Supports Node.js streams.\r\n// * `saxen` — The small and fast one.\r\n//\r\n// `sax` has been around for a long time, and is written by a well-known developer,\r\n// but it performance is very subpar compared to `saxen`: reading a `10 MB` `.xlsx` file\r\n// with `sax` is about `1.4` secs while with `saxen` it's about `0.3` secs,\r\n// meaning that `saxen` is light-years ahead of `sax` in terms of performance.\r\n//\r\n// `sax` has an advantage of parsing XML from a Node.js stream rather than from just a `string`,\r\n// but the weird part is that when enabled, \"streaming\" mode results in significantly slower parsing:\r\n// about `3.1` secs. in \"streaming\" mode vs about `1.4` secs. in non-\"streaming\" mode.\r\n//\r\n// `saxen` has a PR open that adds \"streaming\" functionality: https://github.com/nikku/saxen/pull/27\r\n//\r\n// `sax` \"bundled\" size is `22.5 kB` (`8.1 kB` gzipped).\r\n// `saxen` \"bundled\" size is `6.15 kB` (`2.7 kB` gzipped).\r\n//\r\nexport { default as default } from './parseXmlStream.saxen.js'"],"mappings":";;;;;;;;;;;AAkBA,IAAAA,oBAAA,GAAAC,sBAAA,CAAAC,OAAA;AAA8D,SAAAD,uBAAAE,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,gBAAAA,GAAA"}
@@ -7,34 +7,69 @@ exports["default"] = parseXmlStream;
7
7
  var _nodeStream = require("node:stream");
8
8
  var _sax = _interopRequireDefault(require("sax"));
9
9
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
10
- // For some strange reason, using "streaming" mode results in
10
+ // For some strange reason, enabling "streaming" mode results in
11
11
  // quite a dramatic drop in performance.
12
12
  // For example, reading a `10 MB` `.xlsx` file in "streaming" mode is about `3.1` secs.
13
13
  // while in non-"streaming" mode it's about `1.4` secs.
14
14
  // Because of such strange performance issue, "streaming" mode is turned off.
15
15
  var STREAMING_MODE = false;
16
- function parseXmlStream(xml, _ref) {
17
- var createInitialState = _ref.createInitialState,
18
- onOpenTag = _ref.onOpenTag,
19
- onCloseTag = _ref.onCloseTag,
20
- onText = _ref.onText;
21
- return new Promise(function (resolve, reject) {
22
- var errored = false;
23
- var strict = true;
24
- var xmlns = true;
16
+
17
+ /**
18
+ * Parses XML markup in a streaming fashion by calling the supplied callback functions as the XML markup is being input.
19
+ * @param {any} state — The initial `state`. This `state` will supposedly be modified by the callback functions as the XML is being parsed.
20
+ * @param {function} [onOpenTag]
21
+ * @param {function} [onCloseTag]
22
+ * @param {function} [onText]
23
+ * @returns {object} An object with properties: `promise`, `write(string)`, `end()`. The `promise` resolves with nothing.
24
+ */
25
+ function parseXmlStream(createInitialState, onOpenTag, onCloseTag, onText) {
26
+ // This `state` will be modified by the callback functions as the XML is being parsed.
27
+ var state = createInitialState();
28
+ var errored = false;
29
+ var mustNotHaveErrored = function mustNotHaveErrored() {
30
+ if (errored) {
31
+ // If this error is thrown then it means that there's a bug in the code
32
+ // because the code should not have got here if the XML parsing process
33
+ // has already errored.
34
+ throw new Error('Errored');
35
+ }
36
+ };
37
+ var strict = true;
38
+ var xmlns = true;
39
+ var parser = STREAMING_MODE ? undefined : _sax["default"].parser(strict, parserOptions);
40
+
41
+ // This `stream` could be `.pipe()`d to:
42
+ // `Readable.from(xml).pipe(parserStream)`
43
+ var parserStream = STREAMING_MODE ? _sax["default"].createStream(strict, parserOptions) : undefined;
44
+
45
+ // Inputs a chunk of XML.
46
+ var write = function write(xml) {
47
+ mustNotHaveErrored();
48
+ parser.write(xml);
49
+ };
50
+
51
+ // No more chunks of XMl will be input.
52
+ var end = function end() {
53
+ mustNotHaveErrored();
54
+ parser.close();
55
+ };
56
+
57
+ // This `promise` resolves with the final `state` when finished parsing.
58
+ var promise = new Promise(function (resolve, reject) {
25
59
  var parserOptions = {
26
60
  lowercase: true,
27
61
  xmlns: xmlns
28
62
  };
29
63
  var prefixedTagNameToUnprefixedTagName = {};
30
- var state = createInitialState();
31
64
 
32
- // an error happened.
65
+ // on XML parsing error
33
66
  var onerror = function onerror(error) {
34
67
  if (errored) {
35
68
  return;
36
69
  }
37
70
  errored = true;
71
+ // P.S. When the parser encounters an error, it halts until manually resumed.
72
+ // I.e. at this stage the parser is in halted state until manually resumed.
38
73
  reject(error);
39
74
  };
40
75
 
@@ -60,6 +95,11 @@ function parseXmlStream(xml, _ref) {
60
95
  if (onCloseTag) {
61
96
  var tagName = xmlns ? prefixedTagNameToUnprefixedTagName[name] : name;
62
97
  if (xmlns && !tagName) {
98
+ // I think that `sax` already validates closing tags internally,
99
+ // i.e. it's likely that it already emits an "error" event
100
+ // when it encounters an unclosed tag, in which case this error
101
+ // is not technically possible. And if it ever gets thrown
102
+ // then that would mean that there's a bug in the code.
63
103
  throw new Error("Unknown closing tag: ".concat(name));
64
104
  }
65
105
  onCloseTag(tagName, state);
@@ -80,25 +120,26 @@ function parseXmlStream(xml, _ref) {
80
120
  resolve(state);
81
121
  };
82
122
  if (STREAMING_MODE) {
83
- var parser = _sax["default"].createStream(strict, parserOptions);
84
- parser.on('error', onerror);
85
- parser.on('text', ontext);
86
- parser.on('opentag', onopentag);
87
- parser.on('closetag', onclosetag);
88
- parser.on('attribute', onattribute);
89
- parser.on('end', onend);
90
- _nodeStream.Readable.from(xml).pipe(parser);
123
+ parserStream.on('error', onerror);
124
+ parserStream.on('text', ontext);
125
+ parserStream.on('opentag', onopentag);
126
+ parserStream.on('closetag', onclosetag);
127
+ parserStream.on('attribute', onattribute);
128
+ parserStream.on('end', onend);
91
129
  } else {
92
- var _parser = _sax["default"].parser(strict, parserOptions);
93
- _parser.onerror = onerror;
94
- _parser.ontext = ontext;
95
- _parser.onopentag = onopentag;
96
- _parser.onclosetag = onclosetag;
97
- _parser.onattribute = onattribute;
98
- _parser.onend = onend;
99
- _parser.write(xml).end();
130
+ parser.onerror = onerror;
131
+ parser.ontext = ontext;
132
+ parser.onopentag = onopentag;
133
+ parser.onclosetag = onclosetag;
134
+ parser.onattribute = onattribute;
135
+ parser.onend = onend;
100
136
  }
101
137
  });
138
+ return {
139
+ promise: promise,
140
+ write: write,
141
+ end: end
142
+ };
102
143
  }
103
144
  function getAttributesWithoutXmlnsPrefixes(attributes) {
104
145
  return Object.keys(attributes).reduce(function (attributesWithoutPrefixes, nameWithPrefix) {
@@ -1 +1 @@
1
- {"version":3,"file":"parseXmlStream.sax.js","names":["_nodeStream","require","_sax","_interopRequireDefault","obj","__esModule","STREAMING_MODE","parseXmlStream","xml","_ref","createInitialState","onOpenTag","onCloseTag","onText","Promise","resolve","reject","errored","strict","xmlns","parserOptions","lowercase","prefixedTagNameToUnprefixedTagName","state","onerror","error","ontext","text","onopentag","node","name","local","getAttributesWithoutXmlnsPrefixes","attributes","onclosetag","tagName","Error","concat","onattribute","attribute","onend","parser","sax","createStream","on","Readable","from","pipe","write","end","Object","keys","reduce","attributesWithoutPrefixes","nameWithPrefix","value"],"sources":["../../source/xml/parseXmlStream.sax.js"],"sourcesContent":["import { Readable } from 'node:stream'\r\n\r\nimport sax from 'sax'\r\n\r\n// For some strange reason, using \"streaming\" mode results in\r\n// quite a dramatic drop in performance.\r\n// For example, reading a `10 MB` `.xlsx` file in \"streaming\" mode is about `3.1` secs.\r\n// while in non-\"streaming\" mode it's about `1.4` secs.\r\n// Because of such strange performance issue, \"streaming\" mode is turned off.\r\nconst STREAMING_MODE = false\r\n\r\nexport default function parseXmlStream(xml, {\r\n\tcreateInitialState,\r\n\tonOpenTag,\r\n\tonCloseTag,\r\n\tonText\r\n}) {\r\n\treturn new Promise((resolve, reject) => {\r\n\t\tlet errored = false\r\n\r\n\t\tconst strict = true\r\n\t\tconst xmlns = true\r\n\t\tconst parserOptions = { lowercase: true, xmlns }\r\n\r\n\t\tconst prefixedTagNameToUnprefixedTagName = {}\r\n\t\tconst state = createInitialState()\r\n\r\n\t\t// an error happened.\r\n\t\tconst onerror = (error) => {\r\n\t\t\tif (errored) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\t\t\terrored = true\r\n\t\t\treject(error)\r\n\t\t}\r\n\r\n\t\t// got some text. `text` is the string of text.\r\n\t\tconst ontext = (text) => {\r\n\t\t\tif (onText) {\r\n\t\t\t\tonText(text, state)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// opened a tag. `node` has \"name\" and \"attributes\"\r\n\t\tconst onopentag = (node) => {\r\n\t\t\tif (onOpenTag) {\r\n\t\t\t\tif (xmlns) {\r\n\t\t\t\t\tprefixedTagNameToUnprefixedTagName[node.name] = node.local\r\n\t\t\t\t}\r\n\t\t\t\tonOpenTag(\r\n\t\t\t\t\txmlns ? node.local : node.name,\r\n\t\t\t\t\txmlns ? getAttributesWithoutXmlnsPrefixes(node.attributes) : node.attributes,\r\n\t\t\t\t\tstate\r\n\t\t\t\t)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// closed a tag.\r\n\t\tconst onclosetag = (name) => {\r\n\t\t\tif (onCloseTag) {\r\n\t\t\t\tconst tagName = xmlns ? prefixedTagNameToUnprefixedTagName[name] : name\r\n\t\t\t\tif (xmlns && !tagName) {\r\n\t\t\t\t\tthrow new Error(`Unknown closing tag: ${name}`)\r\n\t\t\t\t}\r\n\t\t\t\tonCloseTag(tagName, state)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// an attribute. `attribute` has \"name\" and \"value\"\r\n\t\tconst onattribute = (attribute) => {\r\n\t\t\t// const name = xmlns ? attribute.local : attribute.name\r\n\t\t\t// const value = attribute.value\r\n\t\t}\r\n\r\n\t\t// parser stream is done, and ready to have more stuff written to it.\r\n\t\tconst onend = () => {\r\n\t\t\tif (errored) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\t\t\tresolve(state)\r\n\t\t}\r\n\r\n\t\tif (STREAMING_MODE) {\r\n\t\t\tconst parser = sax.createStream(strict, parserOptions)\r\n\t\t\tparser.on('error', onerror)\r\n\t\t\tparser.on('text', ontext)\r\n\t\t\tparser.on('opentag', onopentag)\r\n\t\t\tparser.on('closetag', onclosetag)\r\n\t\t\tparser.on('attribute', onattribute)\r\n\t\t\tparser.on('end', onend)\r\n\t\t\tReadable.from(xml).pipe(parser)\r\n\t\t} else {\r\n\t\t\tconst parser = sax.parser(strict, parserOptions)\r\n\t\t\tparser.onerror = onerror\r\n\t\t\tparser.ontext = ontext\r\n\t\t\tparser.onopentag = onopentag\r\n\t\t\tparser.onclosetag = onclosetag\r\n\t\t\tparser.onattribute = onattribute\r\n\t\t\tparser.onend = onend\r\n\t\t\tparser.write(xml).end()\r\n\t\t}\r\n\t})\r\n}\r\n\r\nfunction getAttributesWithoutXmlnsPrefixes(attributes) {\r\n return Object.keys(attributes).reduce((attributesWithoutPrefixes, nameWithPrefix) => {\r\n attributesWithoutPrefixes[attributes[nameWithPrefix].local] = attributes[nameWithPrefix].value\r\n return attributesWithoutPrefixes\r\n }, {})\r\n}"],"mappings":"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"}
1
+ {"version":3,"file":"parseXmlStream.sax.js","names":["_nodeStream","require","_sax","_interopRequireDefault","obj","__esModule","STREAMING_MODE","parseXmlStream","createInitialState","onOpenTag","onCloseTag","onText","state","errored","mustNotHaveErrored","Error","strict","xmlns","parser","undefined","sax","parserOptions","parserStream","createStream","write","xml","end","close","promise","Promise","resolve","reject","lowercase","prefixedTagNameToUnprefixedTagName","onerror","error","ontext","text","onopentag","node","name","local","getAttributesWithoutXmlnsPrefixes","attributes","onclosetag","tagName","concat","onattribute","attribute","onend","on","Object","keys","reduce","attributesWithoutPrefixes","nameWithPrefix","value"],"sources":["../../source/xml/parseXmlStream.sax.js"],"sourcesContent":["import { Readable } from 'node:stream'\r\n\r\nimport sax from 'sax'\r\n\r\n// For some strange reason, enabling \"streaming\" mode results in\r\n// quite a dramatic drop in performance.\r\n// For example, reading a `10 MB` `.xlsx` file in \"streaming\" mode is about `3.1` secs.\r\n// while in non-\"streaming\" mode it's about `1.4` secs.\r\n// Because of such strange performance issue, \"streaming\" mode is turned off.\r\nconst STREAMING_MODE = false\r\n\r\n/**\r\n * Parses XML markup in a streaming fashion by calling the supplied callback functions as the XML markup is being input.\r\n * @param {any} state — The initial `state`. This `state` will supposedly be modified by the callback functions as the XML is being parsed.\r\n * @param {function} [onOpenTag]\r\n * @param {function} [onCloseTag]\r\n * @param {function} [onText]\r\n * @returns {object} An object with properties: `promise`, `write(string)`, `end()`. The `promise` resolves with nothing.\r\n */\r\nexport default function parseXmlStream(\r\n\tcreateInitialState,\r\n\tonOpenTag,\r\n\tonCloseTag,\r\n\tonText\r\n) {\r\n\t// This `state` will be modified by the callback functions as the XML is being parsed.\r\n\tconst state = createInitialState()\r\n\r\n let errored = false\r\n\r\n const mustNotHaveErrored = () => {\r\n if (errored) {\r\n // If this error is thrown then it means that there's a bug in the code\r\n // because the code should not have got here if the XML parsing process\r\n // has already errored.\r\n throw new Error('Errored')\r\n }\r\n }\r\n\r\n\tconst strict = true\r\n\tconst xmlns = true\r\n\r\n\tconst parser = STREAMING_MODE ? undefined : sax.parser(strict, parserOptions)\r\n\r\n\t// This `stream` could be `.pipe()`d to:\r\n\t// `Readable.from(xml).pipe(parserStream)`\r\n\tconst parserStream = STREAMING_MODE ? sax.createStream(strict, parserOptions) : undefined\r\n\r\n\t// Inputs a chunk of XML.\r\n\tconst write = (xml) => {\r\n\t\tmustNotHaveErrored()\r\n\t\tparser.write(xml)\r\n\t}\r\n\r\n\t// No more chunks of XMl will be input.\r\n\tconst end = () => {\r\n\t\tmustNotHaveErrored()\r\n\t\tparser.close()\r\n\t}\r\n\r\n\t// This `promise` resolves with the final `state` when finished parsing.\r\n\tconst promise = new Promise((resolve, reject) => {\r\n\t\tconst parserOptions = { lowercase: true, xmlns }\r\n\r\n\t\tconst prefixedTagNameToUnprefixedTagName = {}\r\n\r\n\t\t// on XML parsing error\r\n\t\tconst onerror = (error) => {\r\n\t\t\tif (errored) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\t\t\terrored = true\r\n\t\t\t// P.S. When the parser encounters an error, it halts until manually resumed.\r\n\t\t\t// I.e. at this stage the parser is in halted state until manually resumed.\r\n\t\t\treject(error)\r\n\t\t}\r\n\r\n\t\t// got some text. `text` is the string of text.\r\n\t\tconst ontext = (text) => {\r\n\t\t\tif (onText) {\r\n\t\t\t\tonText(text, state)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// opened a tag. `node` has \"name\" and \"attributes\"\r\n\t\tconst onopentag = (node) => {\r\n\t\t\tif (onOpenTag) {\r\n\t\t\t\tif (xmlns) {\r\n\t\t\t\t\tprefixedTagNameToUnprefixedTagName[node.name] = node.local\r\n\t\t\t\t}\r\n\t\t\t\tonOpenTag(\r\n\t\t\t\t\txmlns ? node.local : node.name,\r\n\t\t\t\t\txmlns ? getAttributesWithoutXmlnsPrefixes(node.attributes) : node.attributes,\r\n\t\t\t\t\tstate\r\n\t\t\t\t)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// closed a tag.\r\n\t\tconst onclosetag = (name) => {\r\n\t\t\tif (onCloseTag) {\r\n\t\t\t\tconst tagName = xmlns ? prefixedTagNameToUnprefixedTagName[name] : name\r\n\t\t\t\tif (xmlns && !tagName) {\r\n\t\t\t\t\t// I think that `sax` already validates closing tags internally,\r\n\t\t\t\t\t// i.e. it's likely that it already emits an \"error\" event\r\n\t\t\t\t\t// when it encounters an unclosed tag, in which case this error\r\n\t\t\t\t\t// is not technically possible. And if it ever gets thrown\r\n\t\t\t\t\t// then that would mean that there's a bug in the code.\r\n\t\t\t\t\tthrow new Error(`Unknown closing tag: ${name}`)\r\n\t\t\t\t}\r\n\t\t\t\tonCloseTag(tagName, state)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// an attribute. `attribute` has \"name\" and \"value\"\r\n\t\tconst onattribute = (attribute) => {\r\n\t\t\t// const name = xmlns ? attribute.local : attribute.name\r\n\t\t\t// const value = attribute.value\r\n\t\t}\r\n\r\n\t\t// parser stream is done, and ready to have more stuff written to it.\r\n\t\tconst onend = () => {\r\n\t\t\tif (errored) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\t\t\tresolve(state)\r\n\t\t}\r\n\r\n\t\tif (STREAMING_MODE) {\r\n\t\t\tparserStream.on('error', onerror)\r\n\t\t\tparserStream.on('text', ontext)\r\n\t\t\tparserStream.on('opentag', onopentag)\r\n\t\t\tparserStream.on('closetag', onclosetag)\r\n\t\t\tparserStream.on('attribute', onattribute)\r\n\t\t\tparserStream.on('end', onend)\r\n\t\t} else {\r\n\t\t\tparser.onerror = onerror\r\n\t\t\tparser.ontext = ontext\r\n\t\t\tparser.onopentag = onopentag\r\n\t\t\tparser.onclosetag = onclosetag\r\n\t\t\tparser.onattribute = onattribute\r\n\t\t\tparser.onend = onend\r\n\t\t}\r\n\t})\r\n\r\n\treturn {\r\n\t\tpromise,\r\n\t\twrite,\r\n\t\tend\r\n\t}\r\n}\r\n\r\nfunction getAttributesWithoutXmlnsPrefixes(attributes) {\r\n return Object.keys(attributes).reduce((attributesWithoutPrefixes, nameWithPrefix) => {\r\n attributesWithoutPrefixes[attributes[nameWithPrefix].local] = attributes[nameWithPrefix].value\r\n return attributesWithoutPrefixes\r\n }, {})\r\n}"],"mappings":"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"}
@@ -11,32 +11,69 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "d
11
11
  // https://gitlab.com/catamphetamine/read-excel-file/-/work_items/115
12
12
  // Because of that, `saxen` source code had to be copy-pasted.
13
13
  //
14
+ // Not to mention that it would have to be copy-pasted anyway for compatiblity with `worker-f`
15
+ // because `Parser` is not a "self-contained" function.
16
+ //
14
17
  // import { Parser } from 'saxen'
15
18
 
16
- function parseXmlStream(xml, _ref) {
17
- var createInitialState = _ref.createInitialState,
18
- onOpenTag = _ref.onOpenTag,
19
- onCloseTag = _ref.onCloseTag,
20
- onText = _ref.onText;
21
- // This function was put inside the `parseXmlStream()` function body
22
- // in order to prevent it from becoming an "external dependency"
23
- // when using `worker-f` package to run this code in a worker.
24
- var TAG_NAME_PREFIX = /.+:/;
25
- function trimXmlnsPrefix(tagName) {
26
- return tagName.replace(TAG_NAME_PREFIX, '');
19
+ /**
20
+ * Parses XML markup in a streaming fashion by calling the supplied callback functions as the XML markup is being input.
21
+ * @param {any} state — The initial `state`. This `state` will supposedly be modified by the callback functions as the XML is being parsed.
22
+ * @param {function} [onOpenTag]
23
+ * @param {function} [onCloseTag]
24
+ * @param {function} [onText]
25
+ * @returns {object} An object with properties: `promise`, `write(string)`, `end()`. The `promise` resolves with nothing.
26
+ */
27
+ function parseXmlStream(state, onOpenTag, onCloseTag, onText) {
28
+ var errored = false;
29
+ var mustNotHaveErrored = function mustNotHaveErrored() {
30
+ if (errored) {
31
+ // If this error is thrown then it means that there's a bug in the code
32
+ // because the code should not have got here if the XML parsing process
33
+ // has already errored.
34
+ throw new Error('Errored');
35
+ }
36
+ };
37
+ var resolvePromise;
38
+ var xmlns = true;
39
+
40
+ // `proxy: true` option enables "proxy" mode.
41
+ //
42
+ // In "proxy" mode, `onopentag` and `onclosetag` receive slightly different arguments:
43
+ // * element name is replaced with element object
44
+ // * getAttribute() function is not passed
45
+ //
46
+ var parser = new _parser["default"]({
47
+ proxy: true
48
+ });
49
+
50
+ // Parse XML "namespaces" (`xmlns` stuff).
51
+ if (xmlns) {
52
+ parser.ns();
27
53
  }
28
- return new Promise(function (resolve, reject) {
29
- var errored = false;
30
- var xmlns = true;
31
- var state = createInitialState();
54
+ var write = function write(xml) {
55
+ mustNotHaveErrored();
56
+ parser.write(xml);
57
+ };
58
+ var end = function end() {
59
+ mustNotHaveErrored();
60
+ parser.end();
61
+ resolvePromise();
62
+ };
63
+
64
+ // This `promise` resolves with the final `state` when finished parsing.
65
+ var promise = new Promise(function (resolve, reject) {
66
+ resolvePromise = resolve;
32
67
 
33
- // an error happened.
68
+ // on XML parsing error
34
69
  var onerror = function onerror(error) {
35
- if (errored) {
36
- return;
37
- }
38
70
  errored = true;
39
- reject(error);
71
+ // If the error is not re-thrown here, the parser will simply keep parsing,
72
+ // i.e. it doesn't halt after encountering an error and doesn't require manual resuming.
73
+ // So it must re-throw the error here in order for the parser to stop.
74
+ // Because the error is thrown inside a `new Promise()` constructor,
75
+ // the promise will reject automatically.
76
+ throw error;
40
77
  };
41
78
 
42
79
  // got some text. `text` is the string of text.
@@ -72,30 +109,19 @@ function parseXmlStream(xml, _ref) {
72
109
  onCloseTag(tagName, state);
73
110
  }
74
111
  };
75
-
76
- // `proxy: true` option enables "proxy" mode.
77
- //
78
- // In "proxy" mode, `onopentag` and `onclosetag` receive slightly different arguments:
79
- // * element name is replaced with element object
80
- // * getAttribute() function is not passed
81
- //
82
- var parser = new _parser["default"]({
83
- proxy: true
84
- });
85
-
86
- // Parse XML "namespaces" (`xmlns` stuff).
87
- if (xmlns) {
88
- parser.ns();
89
- }
90
112
  parser.on('error', onerror);
91
113
  parser.on('text', ontext);
92
114
  parser.on('openTag', onopentag);
93
115
  parser.on('closeTag', onclosetag);
94
- parser.parse(xml);
95
- if (errored) {
96
- return;
97
- }
98
- resolve(state);
99
116
  });
117
+ return {
118
+ promise: promise,
119
+ write: write,
120
+ end: end
121
+ };
122
+ }
123
+ var TAG_NAME_PREFIX = /.+:/;
124
+ function trimXmlnsPrefix(tagName) {
125
+ return tagName.replace(TAG_NAME_PREFIX, '');
100
126
  }
101
127
  //# sourceMappingURL=parseXmlStream.saxen.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parseXmlStream.saxen.js","names":["_parser","_interopRequireDefault","require","obj","__esModule","parseXmlStream","xml","_ref","createInitialState","onOpenTag","onCloseTag","onText","TAG_NAME_PREFIX","trimXmlnsPrefix","tagName","replace","Promise","resolve","reject","errored","xmlns","state","onerror","error","ontext","text","decodeEntities","onopentag","element","selfClosing","getContext","attributes","attrs","name","originalName","onclosetag","parser","Parser","proxy","ns","on","parse"],"sources":["../../source/xml/parseXmlStream.saxen.js"],"sourcesContent":["// Starting from version `11.x`, `saxen` dropped CommonJS export.\r\n// CommonJS compatibility was requested by one of the users of this package:\r\n// https://gitlab.com/catamphetamine/read-excel-file/-/work_items/115\r\n// Because of that, `saxen` source code had to be copy-pasted.\r\n//\r\n// import { Parser } from 'saxen'\r\nimport Parser from '../saxen/parser.js'\r\n\r\nexport default function parseXmlStream(xml, {\r\n\tcreateInitialState,\r\n\tonOpenTag,\r\n\tonCloseTag,\r\n\tonText\r\n}) {\r\n\t// This function was put inside the `parseXmlStream()` function body\r\n\t// in order to prevent it from becoming an \"external dependency\"\r\n\t// when using `worker-f` package to run this code in a worker.\r\n\tconst TAG_NAME_PREFIX = /.+:/\r\n\tfunction trimXmlnsPrefix(tagName) {\r\n\t\treturn tagName.replace(TAG_NAME_PREFIX, '')\r\n\t}\r\n\r\n\treturn new Promise((resolve, reject) => {\r\n\t\tlet errored = false\r\n\r\n\t\tconst xmlns = true\r\n\r\n\t\tconst state = createInitialState()\r\n\r\n\t\t// an error happened.\r\n\t\tconst onerror = (error) => {\r\n\t\t\tif (errored) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\t\t\terrored = true\r\n\t\t\treject(error)\r\n\t\t}\r\n\r\n\t\t// got some text. `text` is the string of text.\r\n\t\tconst ontext = (text, decodeEntities) => {\r\n\t\t\tif (onText) {\r\n\t\t\t\t// `saxen` doesn't decode character references (`&#233;`, `&amp;`, etc) in text:\r\n\t\t\t\t// instead, it provides a `decodeEntities()` function for the consumer to call.\r\n\t\t\t\tonText(decodeEntities(text), state)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// opened a tag. `node` has \"name\" and \"attributes\"\r\n\t\tconst onopentag = (element, decodeEntities, selfClosing, getContext) => {\r\n\t\t\tif (onOpenTag) {\r\n\t\t\t\t// `saxen` doesn't decode character references (`&#233;`, `&amp;`, etc)\r\n\t\t\t\t// in attribute values either, so decode them here.\r\n\t\t\t\tconst attributes = element.attrs\r\n\t\t\t\tfor (const name in attributes) {\r\n\t\t\t\t\tattributes[name] = decodeEntities(attributes[name])\r\n\t\t\t\t}\r\n\t\t\t\t// * `element.originalName` — The tag name as written in the XML string, retaining the original prefix regardless of the list of pre-configured namespace mappings.\r\n\t\t\t\t// * `element.name` — The tag name with the namespace prefix resolved against the list of pre-configured namespace mappings. I.e. the namespace prefix will potentially be replaced with one from the pre-configured namespace map.\r\n\t\t\t\tonOpenTag(\r\n\t\t\t\t\txmlns ? trimXmlnsPrefix(element.originalName) : element.name,\r\n\t\t\t\t\tattributes,\r\n\t\t\t\t\tstate\r\n\t\t\t\t)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// closed a tag.\r\n\t\tconst onclosetag = (element) => {\r\n\t\t\tif (onCloseTag) {\r\n\t\t\t\t// * `element.originalName` — The tag name as written in the XML string, retaining the original prefix regardless of the list of pre-configured namespace mappings.\r\n\t\t\t\t// * `element.name` — The tag name with the namespace prefix resolved against the list of pre-configured namespace mappings. I.e. the namespace prefix will potentially be replaced with one from the pre-configured namespace map.\r\n\t\t\t\tconst tagName = xmlns ? trimXmlnsPrefix(element.originalName) : element.name\r\n\t\t\t\tonCloseTag(tagName, state)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// `proxy: true` option enables \"proxy\" mode.\r\n\t\t//\r\n\t\t// In \"proxy\" mode, `onopentag` and `onclosetag` receive slightly different arguments:\r\n\t\t// * element name is replaced with element object\r\n\t\t// * getAttribute() function is not passed\r\n\t\t//\r\n\t\tconst parser = new Parser({ proxy: true })\r\n\r\n\t\t// Parse XML \"namespaces\" (`xmlns` stuff).\r\n\t\tif (xmlns) {\r\n\t\t\tparser.ns()\r\n\t\t}\r\n\r\n\t\tparser.on('error', onerror)\r\n\t\tparser.on('text', ontext)\r\n\t\tparser.on('openTag', onopentag)\r\n\t\tparser.on('closeTag', onclosetag)\r\n\r\n\t\tparser.parse(xml)\r\n\r\n\t\tif (errored) {\r\n\t\t\treturn\r\n\t\t}\r\n\t\tresolve(state)\r\n\t})\r\n}"],"mappings":"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"}
1
+ {"version":3,"file":"parseXmlStream.saxen.js","names":["_parser","_interopRequireDefault","require","obj","__esModule","parseXmlStream","state","onOpenTag","onCloseTag","onText","errored","mustNotHaveErrored","Error","resolvePromise","xmlns","parser","Parser","proxy","ns","write","xml","end","promise","Promise","resolve","reject","onerror","error","ontext","text","decodeEntities","onopentag","element","selfClosing","getContext","attributes","attrs","name","trimXmlnsPrefix","originalName","onclosetag","tagName","on","TAG_NAME_PREFIX","replace"],"sources":["../../source/xml/parseXmlStream.saxen.js"],"sourcesContent":["// Starting from version `11.x`, `saxen` dropped CommonJS export.\r\n// CommonJS compatibility was requested by one of the users of this package:\r\n// https://gitlab.com/catamphetamine/read-excel-file/-/work_items/115\r\n// Because of that, `saxen` source code had to be copy-pasted.\r\n//\r\n// Not to mention that it would have to be copy-pasted anyway for compatiblity with `worker-f`\r\n// because `Parser` is not a \"self-contained\" function.\r\n//\r\n// import { Parser } from 'saxen'\r\nimport Parser from '../saxen/parser.js'\r\n\r\n/**\r\n * Parses XML markup in a streaming fashion by calling the supplied callback functions as the XML markup is being input.\r\n * @param {any} state — The initial `state`. This `state` will supposedly be modified by the callback functions as the XML is being parsed.\r\n * @param {function} [onOpenTag]\r\n * @param {function} [onCloseTag]\r\n * @param {function} [onText]\r\n * @returns {object} An object with properties: `promise`, `write(string)`, `end()`. The `promise` resolves with nothing.\r\n */\r\nexport default function parseXmlStream(\r\n state,\r\n onOpenTag,\r\n onCloseTag,\r\n onText\r\n) {\r\n let errored = false\r\n\r\n const mustNotHaveErrored = () => {\r\n if (errored) {\r\n // If this error is thrown then it means that there's a bug in the code\r\n // because the code should not have got here if the XML parsing process\r\n // has already errored.\r\n throw new Error('Errored')\r\n }\r\n }\r\n\r\n let resolvePromise\r\n\r\n const xmlns = true\r\n\r\n // `proxy: true` option enables \"proxy\" mode.\r\n //\r\n // In \"proxy\" mode, `onopentag` and `onclosetag` receive slightly different arguments:\r\n // * element name is replaced with element object\r\n // * getAttribute() function is not passed\r\n //\r\n const parser = new Parser({ proxy: true })\r\n\r\n // Parse XML \"namespaces\" (`xmlns` stuff).\r\n if (xmlns) {\r\n parser.ns()\r\n }\r\n\r\n const write = (xml) => {\r\n mustNotHaveErrored()\r\n parser.write(xml)\r\n }\r\n\r\n const end = () => {\r\n mustNotHaveErrored()\r\n parser.end()\r\n\t\tresolvePromise()\r\n }\r\n\r\n\t// This `promise` resolves with the final `state` when finished parsing.\r\n\tconst promise = new Promise((resolve, reject) => {\r\n resolvePromise = resolve\r\n\r\n // on XML parsing error\r\n const onerror = (error) => {\r\n errored = true\r\n // If the error is not re-thrown here, the parser will simply keep parsing,\r\n // i.e. it doesn't halt after encountering an error and doesn't require manual resuming.\r\n // So it must re-throw the error here in order for the parser to stop.\r\n // Because the error is thrown inside a `new Promise()` constructor,\r\n // the promise will reject automatically.\r\n throw error\r\n }\r\n\r\n // got some text. `text` is the string of text.\r\n const ontext = (text, decodeEntities) => {\r\n if (onText) {\r\n\t\t\t\t// `saxen` doesn't decode character references (`&#233;`, `&amp;`, etc) in text:\r\n\t\t\t\t// instead, it provides a `decodeEntities()` function for the consumer to call.\r\n\t\t\t\tonText(decodeEntities(text), state)\r\n }\r\n }\r\n\r\n // opened a tag. `node` has \"name\" and \"attributes\"\r\n const onopentag = (element, decodeEntities, selfClosing, getContext) => {\r\n if (onOpenTag) {\r\n\t\t\t\t// `saxen` doesn't decode character references (`&#233;`, `&amp;`, etc)\r\n\t\t\t\t// in attribute values either, so decode them here.\r\n\t\t\t\tconst attributes = element.attrs\r\n\t\t\t\tfor (const name in attributes) {\r\n\t\t\t\t\tattributes[name] = decodeEntities(attributes[name])\r\n\t\t\t\t}\r\n // * `element.originalName` — The tag name as written in the XML string, retaining the original prefix regardless of the list of pre-configured namespace mappings.\r\n // * `element.name` — The tag name with the namespace prefix resolved against the list of pre-configured namespace mappings. I.e. the namespace prefix will potentially be replaced with one from the pre-configured namespace map.\r\n onOpenTag(\r\n xmlns ? trimXmlnsPrefix(element.originalName) : element.name,\r\n\t\t\t\t\tattributes,\r\n state\r\n )\r\n }\r\n }\r\n\r\n // closed a tag.\r\n const onclosetag = (element) => {\r\n if (onCloseTag) {\r\n // * `element.originalName` — The tag name as written in the XML string, retaining the original prefix regardless of the list of pre-configured namespace mappings.\r\n // * `element.name` — The tag name with the namespace prefix resolved against the list of pre-configured namespace mappings. I.e. the namespace prefix will potentially be replaced with one from the pre-configured namespace map.\r\n const tagName = xmlns ? trimXmlnsPrefix(element.originalName) : element.name\r\n onCloseTag(tagName, state)\r\n }\r\n }\r\n\r\n parser.on('error', onerror)\r\n parser.on('text', ontext)\r\n parser.on('openTag', onopentag)\r\n parser.on('closeTag', onclosetag)\r\n })\r\n\r\n return { promise, write, end }\r\n}\r\n\r\nconst TAG_NAME_PREFIX = /.+:/\r\nfunction trimXmlnsPrefix(tagName) {\r\n return tagName.replace(TAG_NAME_PREFIX, '')\r\n}"],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+
3
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.createUnzipError = createUnzipError;
8
+ exports["default"] = void 0;
9
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
10
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
11
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
12
+ function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
13
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
14
+ function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
15
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
16
+ function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
17
+ function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
18
+ function _wrapNativeSuper(Class) { var _cache = typeof Map === "function" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== "function") { throw new TypeError("Super expression must either be null or a function"); } if (typeof _cache !== "undefined") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); }
19
+ function _construct(Parent, args, Class) { if (_isNativeReflectConstruct()) { _construct = Reflect.construct.bind(); } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); }
20
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
21
+ function _isNativeFunction(fn) { return Function.toString.call(fn).indexOf("[native code]") !== -1; }
22
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
23
+ function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
24
+ var UnzipError = exports["default"] = /*#__PURE__*/function (_Error) {
25
+ _inherits(UnzipError, _Error);
26
+ var _super = _createSuper(UnzipError);
27
+ function UnzipError() {
28
+ _classCallCheck(this, UnzipError);
29
+ return _super.apply(this, arguments);
30
+ }
31
+ return _createClass(UnzipError);
32
+ }( /*#__PURE__*/_wrapNativeSuper(Error));
33
+ function createUnzipError(error) {
34
+ var unzipError = new UnzipError(error.message);
35
+ // Keep original stack if it exists
36
+ if (error.stack) {
37
+ unzipError.stack = error.stack;
38
+ }
39
+ // Clean up stack trace a bit in Node.js/V8 environments
40
+ if (Error.captureStackTrace) {
41
+ Error.captureStackTrace(unzipError, createUnzipError);
42
+ }
43
+ // `Error.prototype.cause` property indicates the specific, original reason
44
+ // a given error occurred. Standardized in ES2022, it allows you to chain errors
45
+ // by catching a low-level exception and re-throwing a meaningful, high-level error
46
+ // without wiping out the diagnostic context or stack trace of the original failure.
47
+ //
48
+ // Adding a `.cause` property mimics modern error chaining for environments that support it
49
+ // while remaining completely harmless in older systems.
50
+ //
51
+ unzipError.cause = error;
52
+ // Return the error.
53
+ return unzipError;
54
+ }
55
+ //# sourceMappingURL=UnzipError.js.map