@cj-tech-master/excelts 4.2.0 → 4.2.1-canary.20260111102127.f808a37

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 (241) hide show
  1. package/THIRD_PARTY_NOTICES.md +0 -31
  2. package/dist/browser/index.browser.d.ts +1 -0
  3. package/dist/browser/index.browser.js +12 -0
  4. package/dist/{types/modules/archive → browser/modules/archive/compression}/compress.base.d.ts +1 -0
  5. package/dist/browser/modules/archive/{compress.base.js → compression/compress.base.js} +2 -1
  6. package/dist/{types/modules/archive → browser/modules/archive/compression}/compress.browser.d.ts +10 -8
  7. package/dist/{esm/modules/archive → browser/modules/archive/compression}/compress.browser.js +18 -19
  8. package/dist/browser/modules/archive/{compress.d.ts → compression/compress.d.ts} +2 -2
  9. package/dist/browser/modules/archive/{compress.js → compression/compress.js} +1 -1
  10. package/dist/browser/modules/archive/{crc32.browser.d.ts → compression/crc32.browser.d.ts} +1 -1
  11. package/dist/browser/modules/archive/{crc32.d.ts → compression/crc32.d.ts} +1 -1
  12. package/dist/browser/modules/archive/{crc32.js → compression/crc32.js} +1 -1
  13. package/dist/browser/modules/archive/{deflate-fallback.js → compression/deflate-fallback.js} +1 -1
  14. package/dist/browser/modules/archive/{streaming-compress.browser.d.ts → compression/streaming-compress.browser.d.ts} +2 -2
  15. package/dist/browser/modules/archive/{streaming-compress.browser.js → compression/streaming-compress.browser.js} +3 -3
  16. package/dist/browser/modules/archive/{streaming-compress.d.ts → compression/streaming-compress.d.ts} +2 -2
  17. package/dist/browser/modules/archive/{streaming-compress.js → compression/streaming-compress.js} +2 -2
  18. package/dist/browser/modules/archive/defaults.d.ts +1 -0
  19. package/dist/browser/modules/archive/defaults.js +6 -3
  20. package/dist/browser/modules/archive/index.base.d.ts +4 -4
  21. package/dist/browser/modules/archive/index.base.js +3 -6
  22. package/dist/browser/modules/archive/index.browser.d.ts +3 -4
  23. package/dist/browser/modules/archive/index.browser.js +3 -7
  24. package/dist/browser/modules/archive/index.d.ts +3 -4
  25. package/dist/browser/modules/archive/index.js +3 -5
  26. package/dist/browser/modules/archive/internal/byte-queue.d.ts +33 -0
  27. package/dist/browser/modules/archive/internal/byte-queue.js +407 -0
  28. package/dist/browser/modules/archive/io/archive-sink.d.ts +9 -0
  29. package/dist/browser/modules/archive/io/archive-sink.js +77 -0
  30. package/dist/browser/modules/archive/io/archive-source.d.ts +8 -0
  31. package/dist/browser/modules/archive/io/archive-source.js +107 -0
  32. package/dist/browser/modules/archive/{extract.d.ts → unzip/extract.d.ts} +2 -2
  33. package/dist/browser/modules/archive/unzip/index.d.ts +40 -0
  34. package/dist/browser/modules/archive/unzip/index.js +164 -0
  35. package/dist/browser/modules/archive/{parse.base.d.ts → unzip/stream.base.d.ts} +58 -3
  36. package/dist/browser/modules/archive/unzip/stream.base.js +1022 -0
  37. package/dist/browser/modules/archive/{parse.browser.d.ts → unzip/stream.browser.d.ts} +1 -1
  38. package/dist/browser/modules/archive/{parse.browser.js → unzip/stream.browser.js} +376 -110
  39. package/dist/browser/modules/archive/{parse.d.ts → unzip/stream.d.ts} +2 -2
  40. package/dist/{esm/modules/archive/parse.js → browser/modules/archive/unzip/stream.js} +7 -6
  41. package/dist/{types/modules/archive → browser/modules/archive/unzip}/zip-parser.d.ts +1 -1
  42. package/dist/{esm/modules/archive → browser/modules/archive/unzip}/zip-parser.js +38 -24
  43. package/dist/browser/modules/archive/utils/async-queue.d.ts +7 -0
  44. package/dist/browser/modules/archive/utils/async-queue.js +103 -0
  45. package/dist/browser/modules/archive/utils/bytes.js +16 -16
  46. package/dist/browser/modules/archive/utils/compressibility.d.ts +10 -0
  47. package/dist/browser/modules/archive/utils/compressibility.js +57 -0
  48. package/dist/browser/modules/archive/utils/parse-buffer.js +21 -23
  49. package/dist/browser/modules/archive/utils/pattern-scanner.d.ts +21 -0
  50. package/dist/browser/modules/archive/utils/pattern-scanner.js +27 -0
  51. package/dist/browser/modules/archive/utils/timestamps.js +62 -1
  52. package/dist/browser/modules/archive/utils/zip-extra-fields.d.ts +1 -1
  53. package/dist/browser/modules/archive/utils/zip-extra-fields.js +26 -14
  54. package/dist/browser/modules/archive/zip/index.d.ts +42 -0
  55. package/dist/browser/modules/archive/zip/index.js +157 -0
  56. package/dist/browser/modules/archive/{streaming-zip.d.ts → zip/stream.d.ts} +28 -5
  57. package/dist/browser/modules/archive/{streaming-zip.js → zip/stream.js} +192 -48
  58. package/dist/browser/modules/archive/zip/zip-bytes.d.ts +73 -0
  59. package/dist/browser/modules/archive/zip/zip-bytes.js +239 -0
  60. package/dist/{esm/modules/archive → browser/modules/archive/zip}/zip-entry-metadata.js +3 -3
  61. package/dist/browser/modules/archive/{zip-records.d.ts → zip-spec/zip-records.d.ts} +20 -0
  62. package/dist/browser/modules/archive/zip-spec/zip-records.js +126 -0
  63. package/dist/browser/modules/excel/form-control.d.ts +2 -0
  64. package/dist/browser/modules/excel/form-control.js +54 -16
  65. package/dist/browser/modules/excel/stream/workbook-reader.browser.js +1 -1
  66. package/dist/browser/modules/excel/stream/workbook-writer.browser.d.ts +1 -1
  67. package/dist/browser/modules/excel/stream/workbook-writer.browser.js +1 -1
  68. package/dist/browser/modules/excel/xlsx/xform/sheet/worksheet-xform.js +17 -3
  69. package/dist/browser/modules/excel/xlsx/xlsx.browser.js +3 -6
  70. package/dist/browser/modules/excel/xlsx/xlsx.js +1 -1
  71. package/dist/browser/modules/stream/streams.browser.d.ts +28 -28
  72. package/dist/browser/modules/stream/streams.browser.js +850 -697
  73. package/dist/browser/modules/stream/streams.js +140 -58
  74. package/dist/cjs/modules/archive/{compress.base.js → compression/compress.base.js} +2 -1
  75. package/dist/cjs/modules/archive/{compress.browser.js → compression/compress.browser.js} +18 -19
  76. package/dist/cjs/modules/archive/{compress.js → compression/compress.js} +1 -1
  77. package/dist/cjs/modules/archive/{crc32.js → compression/crc32.js} +1 -1
  78. package/dist/cjs/modules/archive/{deflate-fallback.js → compression/deflate-fallback.js} +1 -1
  79. package/dist/cjs/modules/archive/{streaming-compress.browser.js → compression/streaming-compress.browser.js} +3 -3
  80. package/dist/cjs/modules/archive/{streaming-compress.js → compression/streaming-compress.js} +2 -2
  81. package/dist/cjs/modules/archive/defaults.js +7 -4
  82. package/dist/cjs/modules/archive/index.base.js +9 -19
  83. package/dist/cjs/modules/archive/index.browser.js +4 -10
  84. package/dist/cjs/modules/archive/index.js +4 -8
  85. package/dist/cjs/modules/archive/internal/byte-queue.js +411 -0
  86. package/dist/cjs/modules/archive/io/archive-sink.js +82 -0
  87. package/dist/cjs/modules/archive/io/archive-source.js +114 -0
  88. package/dist/cjs/modules/archive/unzip/index.js +170 -0
  89. package/dist/cjs/modules/archive/unzip/stream.base.js +1044 -0
  90. package/dist/cjs/modules/archive/{parse.browser.js → unzip/stream.browser.js} +377 -111
  91. package/dist/cjs/modules/archive/{parse.js → unzip/stream.js} +9 -8
  92. package/dist/cjs/modules/archive/{zip-parser.js → unzip/zip-parser.js} +47 -33
  93. package/dist/cjs/modules/archive/utils/async-queue.js +106 -0
  94. package/dist/cjs/modules/archive/utils/bytes.js +16 -16
  95. package/dist/cjs/modules/archive/utils/compressibility.js +60 -0
  96. package/dist/cjs/modules/archive/utils/parse-buffer.js +21 -23
  97. package/dist/cjs/modules/archive/utils/pattern-scanner.js +31 -0
  98. package/dist/cjs/modules/archive/utils/timestamps.js +64 -3
  99. package/dist/cjs/modules/archive/utils/zip-extra-fields.js +26 -14
  100. package/dist/cjs/modules/archive/zip/index.js +162 -0
  101. package/dist/cjs/modules/archive/{streaming-zip.js → zip/stream.js} +194 -50
  102. package/dist/cjs/modules/archive/zip/zip-bytes.js +242 -0
  103. package/dist/cjs/modules/archive/{zip-entry-metadata.js → zip/zip-entry-metadata.js} +5 -5
  104. package/dist/cjs/modules/archive/zip-spec/zip-records.js +136 -0
  105. package/dist/cjs/modules/excel/form-control.js +54 -16
  106. package/dist/cjs/modules/excel/stream/workbook-reader.browser.js +2 -2
  107. package/dist/cjs/modules/excel/stream/workbook-writer.browser.js +4 -4
  108. package/dist/cjs/modules/excel/xlsx/xform/sheet/worksheet-xform.js +17 -3
  109. package/dist/cjs/modules/excel/xlsx/xlsx.browser.js +6 -9
  110. package/dist/cjs/modules/excel/xlsx/xlsx.js +2 -2
  111. package/dist/cjs/modules/stream/streams.browser.js +850 -697
  112. package/dist/cjs/modules/stream/streams.js +140 -58
  113. package/dist/esm/index.browser.js +12 -0
  114. package/dist/esm/modules/archive/{compress.base.js → compression/compress.base.js} +2 -1
  115. package/dist/{browser/modules/archive → esm/modules/archive/compression}/compress.browser.js +18 -19
  116. package/dist/esm/modules/archive/{compress.js → compression/compress.js} +1 -1
  117. package/dist/esm/modules/archive/{crc32.js → compression/crc32.js} +1 -1
  118. package/dist/esm/modules/archive/{deflate-fallback.js → compression/deflate-fallback.js} +1 -1
  119. package/dist/esm/modules/archive/{streaming-compress.browser.js → compression/streaming-compress.browser.js} +3 -3
  120. package/dist/esm/modules/archive/{streaming-compress.js → compression/streaming-compress.js} +2 -2
  121. package/dist/esm/modules/archive/defaults.js +6 -3
  122. package/dist/esm/modules/archive/index.base.js +3 -6
  123. package/dist/esm/modules/archive/index.browser.js +3 -7
  124. package/dist/esm/modules/archive/index.js +3 -5
  125. package/dist/esm/modules/archive/internal/byte-queue.js +407 -0
  126. package/dist/esm/modules/archive/io/archive-sink.js +77 -0
  127. package/dist/esm/modules/archive/io/archive-source.js +107 -0
  128. package/dist/esm/modules/archive/unzip/index.js +164 -0
  129. package/dist/esm/modules/archive/unzip/stream.base.js +1022 -0
  130. package/dist/esm/modules/archive/{parse.browser.js → unzip/stream.browser.js} +376 -110
  131. package/dist/{browser/modules/archive/parse.js → esm/modules/archive/unzip/stream.js} +7 -6
  132. package/dist/{browser/modules/archive → esm/modules/archive/unzip}/zip-parser.js +38 -24
  133. package/dist/esm/modules/archive/utils/async-queue.js +103 -0
  134. package/dist/esm/modules/archive/utils/bytes.js +16 -16
  135. package/dist/esm/modules/archive/utils/compressibility.js +57 -0
  136. package/dist/esm/modules/archive/utils/parse-buffer.js +21 -23
  137. package/dist/esm/modules/archive/utils/pattern-scanner.js +27 -0
  138. package/dist/esm/modules/archive/utils/timestamps.js +62 -1
  139. package/dist/esm/modules/archive/utils/zip-extra-fields.js +26 -14
  140. package/dist/esm/modules/archive/zip/index.js +157 -0
  141. package/dist/esm/modules/archive/{streaming-zip.js → zip/stream.js} +192 -48
  142. package/dist/esm/modules/archive/zip/zip-bytes.js +239 -0
  143. package/dist/{browser/modules/archive → esm/modules/archive/zip}/zip-entry-metadata.js +3 -3
  144. package/dist/esm/modules/archive/zip-spec/zip-records.js +126 -0
  145. package/dist/esm/modules/excel/form-control.js +54 -16
  146. package/dist/esm/modules/excel/stream/workbook-reader.browser.js +1 -1
  147. package/dist/esm/modules/excel/stream/workbook-writer.browser.js +1 -1
  148. package/dist/esm/modules/excel/xlsx/xform/sheet/worksheet-xform.js +17 -3
  149. package/dist/esm/modules/excel/xlsx/xlsx.browser.js +3 -6
  150. package/dist/esm/modules/excel/xlsx/xlsx.js +1 -1
  151. package/dist/esm/modules/stream/streams.browser.js +850 -697
  152. package/dist/esm/modules/stream/streams.js +140 -58
  153. package/dist/iife/THIRD_PARTY_NOTICES.md +81 -0
  154. package/dist/iife/excelts.iife.js +4777 -2863
  155. package/dist/iife/excelts.iife.js.map +1 -1
  156. package/dist/iife/excelts.iife.min.js +103 -31
  157. package/dist/types/index.browser.d.ts +1 -0
  158. package/dist/{browser/modules/archive → types/modules/archive/compression}/compress.base.d.ts +1 -0
  159. package/dist/{browser/modules/archive → types/modules/archive/compression}/compress.browser.d.ts +10 -8
  160. package/dist/types/modules/archive/{streaming-compress.browser.d.ts → compression/streaming-compress.browser.d.ts} +1 -1
  161. package/dist/types/modules/archive/defaults.d.ts +1 -0
  162. package/dist/types/modules/archive/index.base.d.ts +4 -4
  163. package/dist/types/modules/archive/index.browser.d.ts +3 -4
  164. package/dist/types/modules/archive/index.d.ts +3 -4
  165. package/dist/types/modules/archive/internal/byte-queue.d.ts +33 -0
  166. package/dist/types/modules/archive/io/archive-sink.d.ts +9 -0
  167. package/dist/types/modules/archive/io/archive-source.d.ts +8 -0
  168. package/dist/types/modules/archive/unzip/index.d.ts +40 -0
  169. package/dist/types/modules/archive/{parse.base.d.ts → unzip/stream.base.d.ts} +60 -5
  170. package/dist/types/modules/archive/{parse.browser.d.ts → unzip/stream.browser.d.ts} +2 -2
  171. package/dist/types/modules/archive/{parse.d.ts → unzip/stream.d.ts} +3 -3
  172. package/dist/{browser/modules/archive → types/modules/archive/unzip}/zip-parser.d.ts +1 -1
  173. package/dist/types/modules/archive/utils/async-queue.d.ts +7 -0
  174. package/dist/types/modules/archive/utils/compressibility.d.ts +10 -0
  175. package/dist/types/modules/archive/utils/pattern-scanner.d.ts +21 -0
  176. package/dist/types/modules/archive/utils/zip-extra-fields.d.ts +1 -1
  177. package/dist/types/modules/archive/zip/index.d.ts +42 -0
  178. package/dist/types/modules/archive/{streaming-zip.d.ts → zip/stream.d.ts} +29 -6
  179. package/dist/types/modules/archive/zip/zip-bytes.d.ts +73 -0
  180. package/dist/types/modules/archive/{zip-entry-metadata.d.ts → zip/zip-entry-metadata.d.ts} +1 -1
  181. package/dist/types/modules/archive/{zip-records.d.ts → zip-spec/zip-records.d.ts} +20 -0
  182. package/dist/types/modules/excel/form-control.d.ts +2 -0
  183. package/dist/types/modules/excel/stream/workbook-writer.browser.d.ts +1 -1
  184. package/dist/types/modules/stream/streams.browser.d.ts +28 -28
  185. package/package.json +10 -6
  186. package/dist/browser/modules/archive/byte-queue.d.ts +0 -18
  187. package/dist/browser/modules/archive/byte-queue.js +0 -125
  188. package/dist/browser/modules/archive/parse.base.js +0 -610
  189. package/dist/browser/modules/archive/utils/zip-extra.d.ts +0 -18
  190. package/dist/browser/modules/archive/utils/zip-extra.js +0 -68
  191. package/dist/browser/modules/archive/zip-builder.d.ts +0 -117
  192. package/dist/browser/modules/archive/zip-builder.js +0 -292
  193. package/dist/browser/modules/archive/zip-constants.d.ts +0 -18
  194. package/dist/browser/modules/archive/zip-constants.js +0 -23
  195. package/dist/browser/modules/archive/zip-records.js +0 -84
  196. package/dist/cjs/modules/archive/byte-queue.js +0 -129
  197. package/dist/cjs/modules/archive/parse.base.js +0 -632
  198. package/dist/cjs/modules/archive/utils/zip-extra.js +0 -74
  199. package/dist/cjs/modules/archive/zip-builder.js +0 -297
  200. package/dist/cjs/modules/archive/zip-constants.js +0 -26
  201. package/dist/cjs/modules/archive/zip-records.js +0 -90
  202. package/dist/esm/modules/archive/byte-queue.js +0 -125
  203. package/dist/esm/modules/archive/parse.base.js +0 -610
  204. package/dist/esm/modules/archive/utils/zip-extra.js +0 -68
  205. package/dist/esm/modules/archive/zip-builder.js +0 -292
  206. package/dist/esm/modules/archive/zip-constants.js +0 -23
  207. package/dist/esm/modules/archive/zip-records.js +0 -84
  208. package/dist/types/modules/archive/byte-queue.d.ts +0 -18
  209. package/dist/types/modules/archive/utils/zip-extra.d.ts +0 -18
  210. package/dist/types/modules/archive/zip-builder.d.ts +0 -117
  211. package/dist/types/modules/archive/zip-constants.d.ts +0 -18
  212. /package/dist/browser/modules/archive/{crc32.base.d.ts → compression/crc32.base.d.ts} +0 -0
  213. /package/dist/browser/modules/archive/{crc32.base.js → compression/crc32.base.js} +0 -0
  214. /package/dist/browser/modules/archive/{crc32.browser.js → compression/crc32.browser.js} +0 -0
  215. /package/dist/browser/modules/archive/{deflate-fallback.d.ts → compression/deflate-fallback.d.ts} +0 -0
  216. /package/dist/browser/modules/archive/{streaming-compress.base.d.ts → compression/streaming-compress.base.d.ts} +0 -0
  217. /package/dist/browser/modules/archive/{streaming-compress.base.js → compression/streaming-compress.base.js} +0 -0
  218. /package/dist/browser/modules/archive/{extract.js → unzip/extract.js} +0 -0
  219. /package/dist/browser/modules/archive/{zip-entry-metadata.d.ts → zip/zip-entry-metadata.d.ts} +0 -0
  220. /package/dist/browser/modules/archive/{zip-entry-info.d.ts → zip-spec/zip-entry-info.d.ts} +0 -0
  221. /package/dist/browser/modules/archive/{zip-entry-info.js → zip-spec/zip-entry-info.js} +0 -0
  222. /package/dist/cjs/modules/archive/{crc32.base.js → compression/crc32.base.js} +0 -0
  223. /package/dist/cjs/modules/archive/{crc32.browser.js → compression/crc32.browser.js} +0 -0
  224. /package/dist/cjs/modules/archive/{streaming-compress.base.js → compression/streaming-compress.base.js} +0 -0
  225. /package/dist/cjs/modules/archive/{extract.js → unzip/extract.js} +0 -0
  226. /package/dist/cjs/modules/archive/{zip-entry-info.js → zip-spec/zip-entry-info.js} +0 -0
  227. /package/dist/esm/modules/archive/{crc32.base.js → compression/crc32.base.js} +0 -0
  228. /package/dist/esm/modules/archive/{crc32.browser.js → compression/crc32.browser.js} +0 -0
  229. /package/dist/esm/modules/archive/{streaming-compress.base.js → compression/streaming-compress.base.js} +0 -0
  230. /package/dist/esm/modules/archive/{extract.js → unzip/extract.js} +0 -0
  231. /package/dist/esm/modules/archive/{zip-entry-info.js → zip-spec/zip-entry-info.js} +0 -0
  232. /package/dist/{LICENSE → iife/LICENSE} +0 -0
  233. /package/dist/types/modules/archive/{compress.d.ts → compression/compress.d.ts} +0 -0
  234. /package/dist/types/modules/archive/{crc32.base.d.ts → compression/crc32.base.d.ts} +0 -0
  235. /package/dist/types/modules/archive/{crc32.browser.d.ts → compression/crc32.browser.d.ts} +0 -0
  236. /package/dist/types/modules/archive/{crc32.d.ts → compression/crc32.d.ts} +0 -0
  237. /package/dist/types/modules/archive/{deflate-fallback.d.ts → compression/deflate-fallback.d.ts} +0 -0
  238. /package/dist/types/modules/archive/{streaming-compress.base.d.ts → compression/streaming-compress.base.d.ts} +0 -0
  239. /package/dist/types/modules/archive/{streaming-compress.d.ts → compression/streaming-compress.d.ts} +0 -0
  240. /package/dist/types/modules/archive/{extract.d.ts → unzip/extract.d.ts} +0 -0
  241. /package/dist/types/modules/archive/{zip-entry-info.d.ts → zip-spec/zip-entry-info.d.ts} +0 -0
@@ -6,7 +6,7 @@
6
6
  * Uses the browser Duplex stream implementation for compatibility.
7
7
  */
8
8
  import { Duplex } from "@stream";
9
- import { type CrxHeader, type PullStreamPublicApi, type EntryProps, type EntryVars, type InflateFactory, type ParseOptions, type ZipEntry } from "@archive/parse.base";
9
+ import { type CrxHeader, type PullStreamPublicApi, type EntryProps, type EntryVars, type InflateFactory, type ParseOptions, type ZipEntry } from "@archive/unzip/stream.base";
10
10
  export type { CrxHeader, EntryProps, EntryVars, ParseOptions, ZipEntry };
11
11
  export type ParseStream = Duplex & {
12
12
  promise(): Promise<void>;
@@ -5,14 +5,13 @@
5
5
  * Falls back to pure JavaScript implementation for older browsers.
6
6
  * Uses the browser Duplex stream implementation for compatibility.
7
7
  */
8
- import { Duplex, PassThrough, concatUint8Arrays } from "../stream/index.browser.js";
9
- import { writeUint32LE } from "./utils/binary.js";
10
- import { indexOfUint8ArrayPattern } from "./utils/bytes.js";
11
- import { runParseLoop, streamUntilValidatedDataDescriptor } from "./parse.base.js";
12
- import { inflateRaw as fallbackInflateRaw } from "./deflate-fallback.js";
13
- import { ByteQueue } from "./byte-queue.js";
14
- import { DATA_DESCRIPTOR_SIG } from "./zip-constants.js";
15
- import { hasDeflateRawDecompressionStream } from "./compress.base.js";
8
+ import { Duplex, PassThrough, concatUint8Arrays } from "../../stream/index.browser.js";
9
+ import { DATA_DESCRIPTOR_SIGNATURE_BYTES, runParseLoop, streamUntilValidatedDataDescriptor } from "./stream.base.js";
10
+ import { PatternScanner } from "../utils/pattern-scanner.js";
11
+ import { inflateRaw as fallbackInflateRaw } from "../compression/deflate-fallback.js";
12
+ import { ByteQueue } from "../internal/byte-queue.js";
13
+ import { hasDeflateRawDecompressionStream } from "../compression/compress.base.js";
14
+ const DEFAULT_UNZIP_STREAM_HIGH_WATER_MARK = 256 * 1024;
16
15
  // =============================================================================
17
16
  // Browser InflateRaw using DecompressionStream
18
17
  // =============================================================================
@@ -29,6 +28,9 @@ class BrowserInflateRaw extends Duplex {
29
28
  // Pass write handler to Duplex so pipe() calls our write method
30
29
  // Also pass final handler to close the DecompressionStream when _writable ends
31
30
  super({
31
+ // Keep the internal buffer bounded; this stream is used in tight parse loops.
32
+ writableHighWaterMark: 512 * 1024,
33
+ readableHighWaterMark: 512 * 1024,
32
34
  write: (chunk, _encoding, callback) => {
33
35
  this._doWrite(chunk, callback);
34
36
  },
@@ -137,47 +139,6 @@ class BrowserInflateRaw extends Duplex {
137
139
  this.push(null);
138
140
  }
139
141
  }
140
- // Override write to feed data into DecompressionStream
141
- write(chunk, encodingOrCallback, callback) {
142
- // Handle overload
143
- let cb;
144
- if (typeof encodingOrCallback === "function") {
145
- cb = encodingOrCallback;
146
- }
147
- else {
148
- cb = callback;
149
- }
150
- this._doWrite(chunk, cb);
151
- return true;
152
- }
153
- // Override end to close the DecompressionStream writer
154
- end(chunkOrCallback, encodingOrCallback, callback) {
155
- // Handle overloads
156
- let chunk;
157
- let cb;
158
- if (typeof chunkOrCallback === "function") {
159
- cb = chunkOrCallback;
160
- }
161
- else if (chunkOrCallback !== undefined) {
162
- chunk = chunkOrCallback;
163
- if (typeof encodingOrCallback === "function") {
164
- cb = encodingOrCallback;
165
- }
166
- else {
167
- cb = callback;
168
- }
169
- }
170
- // Write final chunk if provided
171
- if (chunk) {
172
- this.write(chunk, () => {
173
- this._closeWriter(cb);
174
- });
175
- }
176
- else {
177
- this._closeWriter(cb);
178
- }
179
- return this;
180
- }
181
142
  _closeWriter(callback) {
182
143
  if (this.writeClosed) {
183
144
  this._readingDonePromise.then(() => {
@@ -205,7 +166,6 @@ class BrowserInflateRaw extends Duplex {
205
166
  if (callback) {
206
167
  callback();
207
168
  }
208
- this.emit("finish");
209
169
  });
210
170
  });
211
171
  }
@@ -218,6 +178,225 @@ class BrowserInflateRaw extends Duplex {
218
178
  }
219
179
  }
220
180
  // =============================================================================
181
+ // Worker-based InflateRaw (optional)
182
+ // =============================================================================
183
+ let _inflateWorkerUrl = null;
184
+ function getInflateWorkerUrl(customUrl) {
185
+ if (typeof customUrl === "string" && customUrl.length > 0) {
186
+ return customUrl;
187
+ }
188
+ if (_inflateWorkerUrl) {
189
+ return _inflateWorkerUrl;
190
+ }
191
+ // Inline worker to avoid bundler-specific worker loaders.
192
+ // It streams deflate-raw through DecompressionStream and posts decompressed chunks back.
193
+ const code = `
194
+ let ds;
195
+ let writer;
196
+ let reader;
197
+ let junkError = false;
198
+ let pendingWrites = 0;
199
+
200
+ function isJunkErrorMessage(msg) {
201
+ return typeof msg === 'string' && (msg.includes('Junk') || msg.includes('junk'));
202
+ }
203
+
204
+ async function ensureStarted() {
205
+ if (ds) return;
206
+ ds = new DecompressionStream('deflate-raw');
207
+ writer = ds.writable.getWriter();
208
+ reader = ds.readable.getReader();
209
+
210
+ (async () => {
211
+ try {
212
+ while (true) {
213
+ const r = await reader.read();
214
+ if (r.done) break;
215
+ const chunk = r.value;
216
+ postMessage({ t: 'data', chunk }, [chunk.buffer]);
217
+ }
218
+ postMessage({ t: 'end' });
219
+ } catch (e) {
220
+ const msg = e && e.message ? e.message : String(e);
221
+ if (isJunkErrorMessage(msg)) {
222
+ junkError = true;
223
+ postMessage({ t: 'end' });
224
+ } else {
225
+ postMessage({ t: 'error', message: msg });
226
+ }
227
+ }
228
+ })();
229
+ }
230
+
231
+ onmessage = async (ev) => {
232
+ const msg = ev.data;
233
+ try {
234
+ await ensureStarted();
235
+ if (msg.t === 'write') {
236
+ if (junkError) {
237
+ postMessage({ t: 'ack', id: msg.id });
238
+ return;
239
+ }
240
+ pendingWrites++;
241
+ await writer.write(msg.chunk);
242
+ pendingWrites--;
243
+ postMessage({ t: 'ack', id: msg.id });
244
+ return;
245
+ }
246
+ if (msg.t === 'close') {
247
+ // Wait for in-flight writes to finish (best-effort).
248
+ while (pendingWrites > 0) {
249
+ await new Promise(r => setTimeout(r, 0));
250
+ }
251
+ try { await writer.close(); } catch (_) {}
252
+ postMessage({ t: 'closed' });
253
+ return;
254
+ }
255
+ if (msg.t === 'abort') {
256
+ try { await writer.abort(); } catch (_) {}
257
+ postMessage({ t: 'aborted' });
258
+ return;
259
+ }
260
+ } catch (e) {
261
+ const m = e && e.message ? e.message : String(e);
262
+ postMessage({ t: 'error', message: m, id: msg && msg.id });
263
+ }
264
+ };
265
+ `;
266
+ const blob = new Blob([code], { type: "text/javascript" });
267
+ _inflateWorkerUrl = URL.createObjectURL(blob);
268
+ return _inflateWorkerUrl;
269
+ }
270
+ class WorkerInflateRaw extends Duplex {
271
+ constructor(workerUrl) {
272
+ super({
273
+ write: (chunk, _encoding, callback) => {
274
+ this._doWrite(chunk, callback);
275
+ },
276
+ final: (callback) => {
277
+ this._doClose(callback);
278
+ }
279
+ });
280
+ this._nextId = 1;
281
+ this._pendingAcks = new Map();
282
+ this._closed = false;
283
+ this._junkError = false;
284
+ this._terminated = false;
285
+ const url = getInflateWorkerUrl(workerUrl);
286
+ this.worker = new Worker(url);
287
+ this.worker.onmessage = (ev) => {
288
+ const msg = ev.data;
289
+ if (!msg || typeof msg.t !== "string") {
290
+ return;
291
+ }
292
+ if (msg.t === "data") {
293
+ const chunk = msg.chunk;
294
+ this.push(chunk);
295
+ return;
296
+ }
297
+ if (msg.t === "end") {
298
+ this.push(null);
299
+ this._terminateWorker();
300
+ return;
301
+ }
302
+ if (msg.t === "aborted") {
303
+ this._terminateWorker();
304
+ return;
305
+ }
306
+ if (msg.t === "ack") {
307
+ const id = msg.id;
308
+ const cb = this._pendingAcks.get(id);
309
+ if (cb) {
310
+ this._pendingAcks.delete(id);
311
+ cb();
312
+ }
313
+ return;
314
+ }
315
+ if (msg.t === "error") {
316
+ const message = typeof msg.message === "string" ? msg.message : "Worker inflate error";
317
+ if (message.includes("Junk") || message.includes("junk")) {
318
+ this._junkError = true;
319
+ // Treat as end-of-stream.
320
+ this.push(null);
321
+ this._terminateWorker();
322
+ // Resolve any pending writes.
323
+ for (const cb of this._pendingAcks.values()) {
324
+ cb();
325
+ }
326
+ this._pendingAcks.clear();
327
+ return;
328
+ }
329
+ const err = new Error(message);
330
+ // Fail any pending writes.
331
+ for (const cb of this._pendingAcks.values()) {
332
+ cb(err);
333
+ }
334
+ this._pendingAcks.clear();
335
+ this.emit("error", err);
336
+ this._terminateWorker();
337
+ return;
338
+ }
339
+ };
340
+ this.worker.onerror = (e) => {
341
+ const err = new Error(e.message || "Worker error");
342
+ for (const cb of this._pendingAcks.values()) {
343
+ cb(err);
344
+ }
345
+ this._pendingAcks.clear();
346
+ this.emit("error", err);
347
+ this._terminateWorker();
348
+ };
349
+ }
350
+ _terminateWorker() {
351
+ if (this._terminated) {
352
+ return;
353
+ }
354
+ this._terminated = true;
355
+ try {
356
+ this.worker.terminate();
357
+ }
358
+ catch {
359
+ // ignore
360
+ }
361
+ }
362
+ _doWrite(chunk, callback) {
363
+ if (this._closed || this._junkError) {
364
+ callback();
365
+ return;
366
+ }
367
+ const id = this._nextId++;
368
+ this._pendingAcks.set(id, callback);
369
+ // Transfer the underlying ArrayBuffer to reduce copies.
370
+ // If chunk is a view into a larger buffer, slice to avoid transferring unrelated bytes.
371
+ const transferable = chunk.byteOffset === 0 && chunk.byteLength === chunk.buffer.byteLength
372
+ ? chunk
373
+ : chunk.slice();
374
+ this.worker.postMessage({ t: "write", id, chunk: transferable }, [transferable.buffer]);
375
+ }
376
+ _doClose(callback) {
377
+ if (this._closed) {
378
+ callback();
379
+ return;
380
+ }
381
+ this._closed = true;
382
+ this.worker.postMessage({ t: "close" });
383
+ callback();
384
+ }
385
+ destroy(error) {
386
+ if (!this._closed) {
387
+ this._closed = true;
388
+ try {
389
+ this.worker.postMessage({ t: "abort" });
390
+ }
391
+ catch {
392
+ // ignore
393
+ }
394
+ }
395
+ this._terminateWorker();
396
+ return super.destroy(error);
397
+ }
398
+ }
399
+ // =============================================================================
221
400
  // Fallback InflateRaw for browsers without DecompressionStream
222
401
  // =============================================================================
223
402
  /**
@@ -277,7 +456,7 @@ function createInflateRaw() {
277
456
  // =============================================================================
278
457
  // Utilities
279
458
  // =============================================================================
280
- const dataDescriptorSignature = writeUint32LE(DATA_DESCRIPTOR_SIG);
459
+ const dataDescriptorSignature = DATA_DESCRIPTOR_SIGNATURE_BYTES;
281
460
  export function createParseClass(createInflateRawFn) {
282
461
  /**
283
462
  * ZIP Stream Parser for browsers.
@@ -291,11 +470,11 @@ export function createParseClass(createInflateRawFn) {
291
470
  super({
292
471
  objectMode: true,
293
472
  write: (chunk, _encoding, callback) => {
294
- this._handleWrite(chunk);
295
- callback();
473
+ this._handleWrite(chunk, callback);
296
474
  },
297
475
  final: (callback) => {
298
476
  this.finished = true;
477
+ this._maybeReleaseWriteCallback();
299
478
  this._wakeUp();
300
479
  this.emit("data-available");
301
480
  this.emit("chunk", false);
@@ -307,6 +486,12 @@ export function createParseClass(createInflateRawFn) {
307
486
  this._driverState = {};
308
487
  this._parsingDone = Promise.resolve();
309
488
  this._opts = opts;
489
+ // Default values are intentionally conservative to avoid memory spikes
490
+ // when parsing large archives under slow consumers.
491
+ const hi = Math.max(64 * 1024, opts.inputHighWaterMarkBytes ?? 2 * 1024 * 1024);
492
+ const lo = Math.max(32 * 1024, opts.inputLowWaterMarkBytes ?? Math.floor(hi / 4));
493
+ this._inputHighWaterMarkBytes = hi;
494
+ this._inputLowWaterMarkBytes = Math.min(lo, hi);
310
495
  const io = {
311
496
  pull: (length) => this.pull(length),
312
497
  pullUntil: (pattern, includeEof) => this.pullUntil(pattern, includeEof),
@@ -334,6 +519,12 @@ export function createParseClass(createInflateRawFn) {
334
519
  },
335
520
  emitError: (err) => {
336
521
  this.__emittedError = err;
522
+ // Ensure upstream writers don't hang waiting for a deferred write callback.
523
+ if (this._writeCb) {
524
+ const cb = this._writeCb;
525
+ this._writeCb = undefined;
526
+ cb(err);
527
+ }
337
528
  this.emit("error", err);
338
529
  },
339
530
  emitClose: () => {
@@ -341,7 +532,27 @@ export function createParseClass(createInflateRawFn) {
341
532
  }
342
533
  };
343
534
  queueMicrotask(() => {
344
- this._parsingDone = runParseLoop(this._opts, io, emitter, () => createInflateRawFn(), this._driverState);
535
+ // NOTE: We intentionally do NOT pass inflateRawSync to runParseLoop in browser.
536
+ // Browser's native DecompressionStream is faster than our pure-JS fallback,
537
+ // so we always use the streaming path for decompression in browsers.
538
+ const inflateFactory = () => {
539
+ if (this._opts.useWorkerInflate && typeof Worker !== "undefined") {
540
+ // Worker path requires DecompressionStream support.
541
+ if (hasDeflateRawDecompressionStream()) {
542
+ try {
543
+ return new WorkerInflateRaw(this._opts.workerInflateUrl);
544
+ }
545
+ catch {
546
+ // If Worker construction fails (e.g. CSP/CORS), fall back.
547
+ return createInflateRawFn();
548
+ }
549
+ }
550
+ }
551
+ return createInflateRawFn();
552
+ };
553
+ this._parsingDone = runParseLoop(this._opts, io, emitter, inflateFactory, this._driverState
554
+ // No inflateRawSync - always use streaming DecompressionStream in browser
555
+ );
345
556
  this._parsingDone.catch((e) => {
346
557
  if (!this.__emittedError || this.__emittedError !== e) {
347
558
  this.__emittedError = e;
@@ -351,8 +562,16 @@ export function createParseClass(createInflateRawFn) {
351
562
  });
352
563
  });
353
564
  }
354
- _handleWrite(chunk) {
565
+ _handleWrite(chunk, callback) {
355
566
  this._buffer.append(chunk);
567
+ // Apply writable backpressure by deferring the callback when the input buffer is large.
568
+ // The callback will be released once the parser drains the buffer.
569
+ if (this._buffer.length >= this._inputHighWaterMarkBytes) {
570
+ this._writeCb = callback;
571
+ }
572
+ else {
573
+ callback();
574
+ }
356
575
  this._wakeUp();
357
576
  this.emit("data-available");
358
577
  this.emit("chunk");
@@ -363,13 +582,6 @@ export function createParseClass(createInflateRawFn) {
363
582
  set buffer(value) {
364
583
  this._buffer.reset(value);
365
584
  }
366
- _maybeReleaseWriteCallback() {
367
- if (typeof this.cb === "function") {
368
- const callback = this.cb;
369
- this.cb = undefined;
370
- callback();
371
- }
372
- }
373
585
  _wakeUp() {
374
586
  if (this._pendingResolve) {
375
587
  const resolve = this._pendingResolve;
@@ -377,6 +589,17 @@ export function createParseClass(createInflateRawFn) {
377
589
  resolve();
378
590
  }
379
591
  }
592
+ _maybeReleaseWriteCallback() {
593
+ if (!this._writeCb) {
594
+ return;
595
+ }
596
+ if (this._buffer.length > this._inputLowWaterMarkBytes) {
597
+ return;
598
+ }
599
+ const cb = this._writeCb;
600
+ this._writeCb = undefined;
601
+ cb();
602
+ }
380
603
  _waitForData() {
381
604
  return new Promise(resolve => {
382
605
  this._pendingResolve = resolve;
@@ -390,60 +613,76 @@ export function createParseClass(createInflateRawFn) {
390
613
  if (this.finished) {
391
614
  if (this._buffer.length > 0) {
392
615
  const data = this._buffer.read(this._buffer.length);
616
+ this._maybeReleaseWriteCallback();
393
617
  return data;
394
618
  }
395
619
  throw new Error("FILE_ENDED");
396
620
  }
397
621
  await this._waitForData();
398
622
  }
399
- return this._buffer.read(length);
623
+ const out = this._buffer.read(length);
624
+ this._maybeReleaseWriteCallback();
625
+ return out;
400
626
  }
401
627
  async _pullUntilInternal(pattern, includeEof = false) {
402
628
  const chunks = [];
403
- let searchFrom = 0;
404
- const overlap = Math.max(0, pattern.length - 1);
629
+ const scanner = new PatternScanner(pattern);
405
630
  while (true) {
406
- const view = this._buffer.view();
407
- const match = indexOfUint8ArrayPattern(view, pattern, searchFrom);
631
+ const bufLen = this._buffer.length;
632
+ const match = scanner.find(this._buffer);
408
633
  if (match !== -1) {
409
634
  this.match = match;
410
635
  const toRead = match + (includeEof ? pattern.length : 0);
411
636
  if (toRead > 0) {
412
637
  chunks.push(this._buffer.read(toRead));
638
+ this._maybeReleaseWriteCallback();
413
639
  }
414
- return concatUint8Arrays(chunks);
640
+ return chunks.length === 1 ? chunks[0] : concatUint8Arrays(chunks);
415
641
  }
416
642
  // No match yet. Avoid rescanning bytes that can't start a match.
417
- searchFrom = Math.max(searchFrom, Math.max(0, view.length - overlap));
643
+ scanner.onNoMatch(bufLen);
418
644
  if (this.finished) {
419
645
  throw new Error("FILE_ENDED");
420
646
  }
421
647
  const safeLen = Math.max(0, this._buffer.length - pattern.length);
422
648
  if (safeLen > 0) {
423
649
  chunks.push(this._buffer.read(safeLen));
424
- searchFrom = Math.max(0, searchFrom - safeLen);
650
+ scanner.onConsume(safeLen);
651
+ this._maybeReleaseWriteCallback();
425
652
  }
426
653
  await this._waitForData();
427
654
  }
428
655
  }
429
656
  _streamFixedLength(length) {
430
- const output = new PassThrough();
657
+ const output = new PassThrough({ highWaterMark: DEFAULT_UNZIP_STREAM_HIGH_WATER_MARK });
431
658
  let remaining = length;
432
659
  let done = false;
660
+ let waitingDrain = false;
433
661
  const pull = () => {
434
662
  if (done) {
435
663
  return;
436
664
  }
665
+ if (waitingDrain) {
666
+ return;
667
+ }
437
668
  while (remaining > 0 && this._buffer.length > 0) {
438
669
  const toRead = Math.min(remaining, this._buffer.length);
439
670
  const chunk = this._buffer.read(toRead);
440
671
  remaining -= toRead;
441
- output.write(chunk);
672
+ const ok = output.write(chunk);
673
+ this._maybeReleaseWriteCallback();
674
+ if (!ok) {
675
+ waitingDrain = true;
676
+ output.once("drain", () => {
677
+ waitingDrain = false;
678
+ pull();
679
+ });
680
+ return;
681
+ }
442
682
  }
443
683
  if (remaining === 0) {
444
684
  done = true;
445
685
  this.removeListener("data-available", pull);
446
- this._maybeReleaseWriteCallback();
447
686
  output.end();
448
687
  }
449
688
  else if (this.finished) {
@@ -457,42 +696,69 @@ export function createParseClass(createInflateRawFn) {
457
696
  return output;
458
697
  }
459
698
  _streamUntilPattern(pattern, includeEof = false) {
460
- const output = new PassThrough();
699
+ const output = new PassThrough({ highWaterMark: DEFAULT_UNZIP_STREAM_HIGH_WATER_MARK });
461
700
  let done = false;
462
- let searchFrom = 0;
463
- const overlap = Math.max(0, pattern.length - 1);
701
+ const patternLen = pattern.length;
702
+ const scanner = new PatternScanner(pattern);
703
+ let waitingDrain = false;
464
704
  const pull = () => {
465
- if (done) {
705
+ if (done || waitingDrain) {
466
706
  return;
467
707
  }
468
- const view = this._buffer.view();
469
- const match = indexOfUint8ArrayPattern(view, pattern, searchFrom);
470
- if (match !== -1) {
471
- this.match = match;
472
- const endIndex = includeEof ? match + pattern.length : match;
473
- if (endIndex > 0) {
474
- output.write(this._buffer.read(endIndex));
708
+ while (true) {
709
+ if (this._buffer.length <= 0) {
710
+ break;
475
711
  }
476
- done = true;
477
- this.removeListener("data-available", pull);
478
- this._maybeReleaseWriteCallback();
479
- output.end();
480
- return;
481
- }
482
- // No match yet. Avoid rescanning bytes that can't start a match.
483
- searchFrom = Math.max(searchFrom, Math.max(0, view.length - overlap));
484
- if (this.finished) {
485
- done = true;
486
- this.removeListener("data-available", pull);
487
- this._maybeReleaseWriteCallback();
488
- output.destroy(new Error("FILE_ENDED"));
489
- return;
490
- }
491
- const safeLen = Math.max(0, this._buffer.length - pattern.length);
492
- if (safeLen > 0) {
493
- output.write(this._buffer.read(safeLen));
494
- searchFrom = Math.max(0, searchFrom - safeLen);
712
+ const bufLen = this._buffer.length;
713
+ const match = scanner.find(this._buffer);
714
+ if (match !== -1) {
715
+ this.match = match;
716
+ const endIndex = includeEof ? match + patternLen : match;
717
+ if (endIndex > 0) {
718
+ const ok = output.write(this._buffer.read(endIndex));
719
+ scanner.onConsume(endIndex);
720
+ this._maybeReleaseWriteCallback();
721
+ if (!ok) {
722
+ waitingDrain = true;
723
+ output.once("drain", () => {
724
+ waitingDrain = false;
725
+ pull();
726
+ });
727
+ return;
728
+ }
729
+ }
730
+ done = true;
731
+ this.removeListener("data-available", pull);
732
+ output.end();
733
+ return;
734
+ }
735
+ // No match yet. Avoid rescanning bytes that can't start a match.
736
+ scanner.onNoMatch(bufLen);
737
+ if (this.finished) {
738
+ done = true;
739
+ this.removeListener("data-available", pull);
740
+ output.destroy(new Error("FILE_ENDED"));
741
+ return;
742
+ }
743
+ const safeLen = bufLen - patternLen;
744
+ if (safeLen <= 0) {
745
+ // Keep enough bytes to detect a split signature.
746
+ if (this._buffer.length <= patternLen) {
747
+ this._maybeReleaseWriteCallback();
748
+ }
749
+ break;
750
+ }
751
+ const ok = output.write(this._buffer.read(safeLen));
752
+ scanner.onConsume(safeLen);
495
753
  this._maybeReleaseWriteCallback();
754
+ if (!ok) {
755
+ waitingDrain = true;
756
+ output.once("drain", () => {
757
+ waitingDrain = false;
758
+ pull();
759
+ });
760
+ return;
761
+ }
496
762
  }
497
763
  };
498
764
  this.on("data-available", pull);
@@ -515,11 +781,7 @@ export function createParseClass(createInflateRawFn) {
515
781
  return Promise.reject(new Error("FILE_ENDED"));
516
782
  }
517
783
  if (this._buffer.length >= eof) {
518
- const data = this._buffer.read(eof);
519
- if (this._buffer.length === 0) {
520
- this._maybeReleaseWriteCallback();
521
- }
522
- return Promise.resolve(data);
784
+ return Promise.resolve(this._buffer.read(eof));
523
785
  }
524
786
  return this._pullInternal(eof);
525
787
  }
@@ -535,14 +797,18 @@ export function createParseClass(createInflateRawFn) {
535
797
  _streamUntilDataDescriptor() {
536
798
  return streamUntilValidatedDataDescriptor({
537
799
  source: {
538
- getView: () => this._buffer.view(),
539
800
  getLength: () => this._buffer.length,
540
801
  read: (length) => this._buffer.read(length),
802
+ peekChunks: (length) => this._buffer.peekChunks(length),
803
+ discard: (length) => this._buffer.discard(length),
804
+ indexOfPattern: (pattern, startIndex) => this._buffer.indexOfPattern(pattern, startIndex),
805
+ peekUint32LE: (offset) => this._buffer.peekUint32LE(offset),
541
806
  isFinished: () => this.finished,
542
807
  onDataAvailable: (cb) => {
543
808
  this.on("data-available", cb);
544
809
  return () => this.removeListener("data-available", cb);
545
- }
810
+ },
811
+ maybeReleaseWriteCallback: () => this._maybeReleaseWriteCallback()
546
812
  },
547
813
  dataDescriptorSignature
548
814
  });
@@ -1,6 +1,6 @@
1
1
  import type { Duplex } from "@stream";
2
- import { type PullStreamPublicApi, type CrxHeader, type EntryProps, type EntryVars, type InflateFactory, type ParseOptions, type ZipEntry } from "@archive/parse.base";
3
- export type { CrxHeader } from "@archive/parse.base";
2
+ import { type PullStreamPublicApi, type CrxHeader, type EntryProps, type EntryVars, type InflateFactory, type ParseOptions, type ZipEntry } from "@archive/unzip/stream.base";
3
+ export type { CrxHeader } from "@archive/unzip/stream.base";
4
4
  export type { EntryProps, EntryVars, ParseOptions, ZipEntry };
5
5
  export type ParseStream = Duplex & {
6
6
  promise(): Promise<void>;