@futpib/parser 1.0.1 → 1.0.3

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 (425) hide show
  1. package/.github/copilot-instructions.md +149 -0
  2. package/.github/workflows/copilot-setup-steps.yml +18 -0
  3. package/.github/workflows/main.yml +29 -8
  4. package/.yarn/releases/yarn-4.9.4.cjs +942 -0
  5. package/.yarnrc.yml +1 -1
  6. package/build/allSettledStream.js +32 -14
  7. package/build/allSettledStream.test.js +32 -0
  8. package/build/androidPackage.d.ts +39 -0
  9. package/build/androidPackageParser.d.ts +17 -0
  10. package/build/androidPackageParser.js +185 -0
  11. package/build/androidPackageParser.test.js +22 -0
  12. package/build/androidPackageUnparser.d.ts +4 -0
  13. package/build/androidPackageUnparser.js +94 -0
  14. package/build/androidPackageUnparser.test.js +26 -0
  15. package/build/arbitrarilySlicedAsyncInterable.d.ts +3 -1
  16. package/build/arbitrarilySlicedAsyncInterable.js +3 -3
  17. package/build/arbitrarilySlicedAsyncInterator.js +2 -1
  18. package/build/arbitraryDalvikBytecode.d.ts +4 -0
  19. package/build/arbitraryDalvikBytecode.js +640 -0
  20. package/build/arbitraryDalvikExecutable.d.ts +3 -0
  21. package/build/arbitraryDalvikExecutable.js +282 -0
  22. package/build/arbitraryDosDateTime.js +1 -0
  23. package/build/arbitraryZipStream.js +1 -1
  24. package/build/arrayParser.js +2 -2
  25. package/build/arrayParser.test.js +3 -3
  26. package/build/arrayUnparser.d.ts +1 -1
  27. package/build/backsmali.d.ts +3 -0
  28. package/build/backsmali.js +50 -0
  29. package/build/bsonParser.js +6 -2
  30. package/build/customInvariant.d.ts +2 -1
  31. package/build/customInvariant.js +4 -6
  32. package/build/dalvikBytecodeParser/formatParsers.d.ts +171 -0
  33. package/build/dalvikBytecodeParser/formatParsers.js +304 -0
  34. package/build/dalvikBytecodeParser/formatSizes.d.ts +34 -0
  35. package/build/dalvikBytecodeParser/formatSizes.js +34 -0
  36. package/build/dalvikBytecodeParser/operationFormats.d.ts +225 -0
  37. package/build/dalvikBytecodeParser/operationFormats.js +225 -0
  38. package/build/dalvikBytecodeParser.d.ts +1207 -0
  39. package/build/dalvikBytecodeParser.js +1289 -0
  40. package/build/dalvikBytecodeUnparser/formatUnparsers.d.ts +152 -0
  41. package/build/dalvikBytecodeUnparser/formatUnparsers.js +225 -0
  42. package/build/dalvikBytecodeUnparser.d.ts +3 -0
  43. package/build/dalvikBytecodeUnparser.js +642 -0
  44. package/build/dalvikBytecodeUnparser.test.js +25 -0
  45. package/build/dalvikExecutable.d.ts +215 -0
  46. package/build/dalvikExecutable.js +56 -0
  47. package/build/dalvikExecutableParser/stringSyntaxParser.d.ts +4 -0
  48. package/build/dalvikExecutableParser/stringSyntaxParser.js +76 -0
  49. package/build/dalvikExecutableParser/typeParsers.d.ts +11 -0
  50. package/build/dalvikExecutableParser/typeParsers.js +39 -0
  51. package/build/dalvikExecutableParser/typedNumbers.d.ts +106 -0
  52. package/build/dalvikExecutableParser/typedNumbers.js +18 -0
  53. package/build/dalvikExecutableParser.d.ts +5 -0
  54. package/build/dalvikExecutableParser.js +1757 -0
  55. package/build/dalvikExecutableParser.test.js +72 -0
  56. package/build/dalvikExecutableParserAgainstSmaliParser.test.js +275 -0
  57. package/build/dalvikExecutableUnparser/annotationUnparsers.d.ts +14 -0
  58. package/build/dalvikExecutableUnparser/annotationUnparsers.js +97 -0
  59. package/build/dalvikExecutableUnparser/poolBuilders.d.ts +49 -0
  60. package/build/dalvikExecutableUnparser/poolBuilders.js +140 -0
  61. package/build/dalvikExecutableUnparser/poolScanners.d.ts +4 -0
  62. package/build/dalvikExecutableUnparser/poolScanners.js +220 -0
  63. package/build/dalvikExecutableUnparser/sectionUnparsers.d.ts +25 -0
  64. package/build/dalvikExecutableUnparser/sectionUnparsers.js +581 -0
  65. package/build/dalvikExecutableUnparser/utils.d.ts +10 -0
  66. package/build/dalvikExecutableUnparser/utils.js +108 -0
  67. package/build/dalvikExecutableUnparser.d.ts +4 -0
  68. package/build/dalvikExecutableUnparser.js +406 -0
  69. package/build/dalvikExecutableUnparser.test.js +31 -0
  70. package/build/debugLogInputParser.d.ts +4 -0
  71. package/build/debugLogInputParser.js +16 -0
  72. package/build/debugLogParser.js +14 -3
  73. package/build/disjunctionParser.d.ts +2 -1
  74. package/build/disjunctionParser.js +6 -4
  75. package/build/elementTerminatedArrayParser.d.ts +3 -0
  76. package/build/elementTerminatedArrayParser.js +18 -0
  77. package/build/elementTerminatedArrayParser.test.js +52 -0
  78. package/build/elementTerminatedSequenceArrayParser.d.ts +3 -0
  79. package/build/elementTerminatedSequenceArrayParser.js +32 -0
  80. package/build/elementTerminatedSequenceArrayParser.test.js +34 -0
  81. package/build/elementTerminatedSequenceParser.d.ts +3 -0
  82. package/build/elementTerminatedSequenceParser.js +27 -0
  83. package/build/elementTerminatedSequenceParser.test.js +34 -0
  84. package/build/endOfInputParser.d.ts +1 -1
  85. package/build/exactElementParser.js +10 -5
  86. package/build/exactElementSwitchParser.d.ts +3 -0
  87. package/build/exactElementSwitchParser.js +22 -0
  88. package/build/exactSequenceParser.d.ts +2 -1
  89. package/build/exactSequenceParser.js +12 -2
  90. package/build/fetchCid.d.ts +1 -0
  91. package/build/fetchCid.js +103 -0
  92. package/build/fetchCid.test.js +16 -0
  93. package/build/fixedLengthSequenceParser.d.ts +1 -0
  94. package/build/fixedLengthSequenceParser.js +18 -1
  95. package/build/fixedLengthSequenceParser.test.js +41 -0
  96. package/build/hasExecutable.d.ts +1 -0
  97. package/build/hasExecutable.js +8 -0
  98. package/build/highResolutionTimer.d.ts +16 -0
  99. package/build/highResolutionTimer.js +42 -0
  100. package/build/inputReader.d.ts +11 -0
  101. package/build/inputReader.js +37 -0
  102. package/build/inputReader.test.js +161 -8
  103. package/build/inputReaderState.d.ts +10 -0
  104. package/build/inputReaderState.js +16 -0
  105. package/build/inspect.d.ts +1 -0
  106. package/build/inspect.js +7 -0
  107. package/build/javaKeyStoreParser.test.js +8 -8
  108. package/build/jsonParser.d.ts +2 -0
  109. package/build/jsonParser.js +19 -22
  110. package/build/lazyMessageError.d.ts +48 -0
  111. package/build/lazyMessageError.js +53 -0
  112. package/build/lazyMessageError.test.d.ts +1 -0
  113. package/build/lazyMessageError.test.js +15 -0
  114. package/build/leb128Parser.d.ts +7 -0
  115. package/build/leb128Parser.js +82 -0
  116. package/build/leb128Parser.test.d.ts +1 -0
  117. package/build/leb128Parser.test.js +107 -0
  118. package/build/lookaheadParser.d.ts +2 -0
  119. package/build/lookaheadParser.js +14 -0
  120. package/build/negativeLookaheadParser.js +22 -16
  121. package/build/negativeLookaheadParser.test.d.ts +1 -0
  122. package/build/negativeLookaheadParser.test.js +30 -0
  123. package/build/noStackCaptureOverheadError.d.ts +4 -0
  124. package/build/noStackCaptureOverheadError.js +9 -0
  125. package/build/noStackCaptureOverheadError.test.d.ts +1 -0
  126. package/build/noStackCaptureOverheadError.test.js +15 -0
  127. package/build/nonEmptyArrayParser.d.ts +2 -0
  128. package/build/nonEmptyArrayParser.js +32 -0
  129. package/build/nonEmptyArrayParser.test.d.ts +1 -0
  130. package/build/nonEmptyArrayParser.test.js +17 -0
  131. package/build/optionalParser.js +2 -2
  132. package/build/parser.d.ts +11 -1
  133. package/build/parser.js +82 -32
  134. package/build/parser.test.js +141 -25
  135. package/build/parserAccessorParser.js +9 -1
  136. package/build/parserConsumedSequenceParser.d.ts +1 -1
  137. package/build/parserConsumedSequenceParser.js +21 -16
  138. package/build/parserContext.d.ts +22 -6
  139. package/build/parserContext.js +113 -57
  140. package/build/parserContext.test.js +33 -2
  141. package/build/parserCreatorCompose.d.ts +1 -0
  142. package/build/parserCreatorCompose.js +8 -2
  143. package/build/parserError.d.ts +605 -40
  144. package/build/parserError.js +98 -53
  145. package/build/parserImplementationInvariant.d.ts +1 -1
  146. package/build/parserImplementationInvariant.js +2 -2
  147. package/build/parserInputCompanion.d.ts +15 -0
  148. package/build/parserInputCompanion.js +38 -0
  149. package/build/promiseCompose.d.ts +1 -1
  150. package/build/promiseCompose.js +11 -1
  151. package/build/promiseSettled.d.ts +1 -0
  152. package/build/promiseSettled.js +4 -0
  153. package/build/separatedArrayParser.d.ts +2 -0
  154. package/build/separatedArrayParser.js +39 -0
  155. package/build/separatedArrayParser.test.d.ts +1 -0
  156. package/build/separatedArrayParser.test.js +21 -0
  157. package/build/separatedNonEmptyArrayParser.d.ts +2 -0
  158. package/build/separatedNonEmptyArrayParser.js +40 -0
  159. package/build/separatedNonEmptyArrayParser.test.d.ts +1 -0
  160. package/build/separatedNonEmptyArrayParser.test.js +66 -0
  161. package/build/sequenceBuffer.d.ts +10 -0
  162. package/build/sequenceBuffer.js +54 -2
  163. package/build/sequenceBuffer.test.js +57 -0
  164. package/build/sequenceTerminatedSequenceParser.d.ts +5 -0
  165. package/build/sequenceTerminatedSequenceParser.js +32 -0
  166. package/build/sequenceTerminatedSequenceParser.test.d.ts +1 -0
  167. package/build/sequenceTerminatedSequenceParser.test.js +37 -0
  168. package/build/sequenceUnparser.d.ts +1 -1
  169. package/build/skipParser.d.ts +1 -1
  170. package/build/skipParser.js +4 -2
  171. package/build/skipToParser.d.ts +2 -0
  172. package/build/skipToParser.js +11 -0
  173. package/build/sliceBoundedParser.d.ts +1 -1
  174. package/build/sliceBoundedParser.js +7 -2
  175. package/build/sliceBoundedParser.test.js +30 -1
  176. package/build/smali.d.ts +1 -0
  177. package/build/smali.js +21 -0
  178. package/build/smaliParser.d.ts +68 -0
  179. package/build/smaliParser.js +2081 -0
  180. package/build/smaliParser.test.d.ts +1 -0
  181. package/build/smaliParser.test.js +410 -0
  182. package/build/stringFromAsyncIterable.d.ts +1 -0
  183. package/build/stringFromAsyncIterable.js +7 -0
  184. package/build/terminatedArrayParser.d.ts +3 -1
  185. package/build/terminatedArrayParser.js +79 -2
  186. package/build/terminatedArrayParser.test.d.ts +1 -0
  187. package/build/terminatedArrayParser.test.js +131 -0
  188. package/build/toAsyncIterable.d.ts +1 -0
  189. package/build/toAsyncIterable.js +7 -0
  190. package/build/toAsyncIterator.d.ts +1 -0
  191. package/build/toAsyncIterator.js +33 -0
  192. package/build/tupleParser.d.ts +4 -0
  193. package/build/tupleParser.js +1 -5
  194. package/build/unionParser.d.ts +2 -1
  195. package/build/unionParser.js +29 -14
  196. package/build/unionParser.test.d.ts +1 -0
  197. package/build/unionParser.test.js +60 -0
  198. package/build/unparser.d.ts +3 -3
  199. package/build/unparser.js +6 -4
  200. package/build/unparser.test.js +7 -19
  201. package/build/unparserContext.d.ts +2 -2
  202. package/build/unparserContext.js +2 -3
  203. package/build/unparserError.d.ts +2 -1
  204. package/build/unparserError.js +2 -1
  205. package/build/unparserImplementationInvariant.d.ts +1 -1
  206. package/build/unparserOutputCompanion.d.ts +1 -1
  207. package/build/unparserOutputCompanion.js +1 -1
  208. package/build/zipParser.d.ts +7 -2
  209. package/build/zipParser.js +36 -12
  210. package/build/zipUnparser.d.ts +7 -4
  211. package/build/zipUnparser.js +64 -45
  212. package/build/zipUnparser.test.js +15 -15
  213. package/package.json +33 -24
  214. package/src/allSettledStream.test.ts +40 -0
  215. package/src/allSettledStream.ts +47 -15
  216. package/src/androidPackage.ts +48 -0
  217. package/src/androidPackageParser.test.ts +27 -0
  218. package/src/{apkParser.test.ts.md → androidPackageParser.test.ts.md} +4 -4
  219. package/src/androidPackageParser.test.ts.snap +0 -0
  220. package/src/androidPackageParser.ts +398 -0
  221. package/src/androidPackageUnparser.test.ts +34 -0
  222. package/src/androidPackageUnparser.ts +126 -0
  223. package/src/arbitrarilySlicedAsyncInterable.ts +7 -2
  224. package/src/arbitrarilySlicedAsyncInterator.ts +4 -4
  225. package/src/arbitraryDalvikBytecode.ts +992 -0
  226. package/src/arbitraryDalvikExecutable.ts +434 -0
  227. package/src/arbitraryDosDateTime.ts +1 -0
  228. package/src/arbitraryZipStream.ts +1 -1
  229. package/src/arrayParser.test.ts +3 -3
  230. package/src/arrayParser.ts +2 -2
  231. package/src/arrayUnparser.ts +2 -2
  232. package/src/backsmali.ts +74 -0
  233. package/src/bsonParser.test.ts +12 -14
  234. package/src/bsonParser.ts +13 -2
  235. package/src/customInvariant.ts +8 -12
  236. package/src/dalvikBytecodeParser/formatParsers.ts +780 -0
  237. package/src/dalvikBytecodeParser/formatSizes.ts +35 -0
  238. package/src/dalvikBytecodeParser/operationFormats.ts +226 -0
  239. package/src/dalvikBytecodeParser.ts +2873 -0
  240. package/src/dalvikBytecodeUnparser/formatUnparsers.ts +442 -0
  241. package/src/dalvikBytecodeUnparser.test.ts +44 -0
  242. package/src/dalvikBytecodeUnparser.ts +758 -0
  243. package/src/dalvikExecutable.ts +282 -0
  244. package/src/dalvikExecutableParser/stringSyntaxParser.ts +145 -0
  245. package/src/dalvikExecutableParser/typeParsers.ts +74 -0
  246. package/src/dalvikExecutableParser/typedNumbers.ts +57 -0
  247. package/src/dalvikExecutableParser.test.ts +89 -0
  248. package/src/dalvikExecutableParser.test.ts.md +634 -0
  249. package/src/dalvikExecutableParser.test.ts.snap +0 -0
  250. package/src/dalvikExecutableParser.ts +3245 -0
  251. package/src/dalvikExecutableParserAgainstSmaliParser.test.ts +363 -0
  252. package/src/dalvikExecutableUnparser/annotationUnparsers.ts +135 -0
  253. package/src/dalvikExecutableUnparser/poolBuilders.ts +189 -0
  254. package/src/dalvikExecutableUnparser/poolScanners.ts +297 -0
  255. package/src/dalvikExecutableUnparser/sectionUnparsers.ts +683 -0
  256. package/src/dalvikExecutableUnparser/utils.ts +149 -0
  257. package/src/dalvikExecutableUnparser.test.ts +57 -0
  258. package/src/dalvikExecutableUnparser.ts +581 -0
  259. package/src/debugLogInputParser.ts +28 -0
  260. package/src/debugLogParser.ts +19 -3
  261. package/src/disjunctionParser.ts +12 -7
  262. package/src/elementTerminatedArrayParser.test.ts +99 -0
  263. package/src/elementTerminatedArrayParser.ts +31 -0
  264. package/src/elementTerminatedSequenceArrayParser.test.ts +52 -0
  265. package/src/elementTerminatedSequenceArrayParser.ts +52 -0
  266. package/src/elementTerminatedSequenceParser.test.ts +52 -0
  267. package/src/elementTerminatedSequenceParser.ts +43 -0
  268. package/src/endOfInputParser.ts +1 -1
  269. package/src/exactElementParser.ts +17 -11
  270. package/src/exactElementSwitchParser.ts +41 -0
  271. package/src/exactSequenceParser.ts +23 -2
  272. package/src/fetchCid.test.ts +20 -0
  273. package/src/fetchCid.ts +121 -0
  274. package/src/fixedLengthSequenceParser.test.ts +75 -0
  275. package/src/fixedLengthSequenceParser.ts +28 -1
  276. package/src/hasExecutable.ts +11 -0
  277. package/src/highResolutionTimer.ts +49 -0
  278. package/src/inputReader.test.ts +204 -8
  279. package/src/inputReader.ts +76 -3
  280. package/src/inputReaderState.ts +33 -0
  281. package/src/inspect.ts +9 -0
  282. package/src/javaKeyStoreParser.test.ts +12 -15
  283. package/src/javaKeyStoreParser.ts +2 -6
  284. package/src/jsonParser.test.ts +2 -4
  285. package/src/jsonParser.ts +46 -62
  286. package/src/lazyMessageError.test.ts +21 -0
  287. package/src/lazyMessageError.ts +88 -0
  288. package/src/leb128Parser.test.ts +173 -0
  289. package/src/leb128Parser.ts +125 -0
  290. package/src/lookaheadParser.ts +19 -0
  291. package/src/negativeLookaheadParser.test.ts +49 -0
  292. package/src/negativeLookaheadParser.ts +27 -15
  293. package/src/noStackCaptureOverheadError.test.ts +17 -0
  294. package/src/noStackCaptureOverheadError.ts +12 -0
  295. package/src/nonEmptyArrayParser.test.ts +21 -0
  296. package/src/nonEmptyArrayParser.ts +44 -0
  297. package/src/optionalParser.ts +3 -2
  298. package/src/parser.test.ts +203 -31
  299. package/src/parser.test.ts.md +34 -27
  300. package/src/parser.test.ts.snap +0 -0
  301. package/src/parser.ts +172 -45
  302. package/src/parserAccessorParser.ts +12 -2
  303. package/src/parserConsumedSequenceParser.ts +26 -17
  304. package/src/parserContext.test.ts +37 -2
  305. package/src/parserContext.ts +185 -79
  306. package/src/parserCreatorCompose.ts +20 -2
  307. package/src/parserError.ts +144 -61
  308. package/src/parserImplementationInvariant.ts +3 -3
  309. package/src/parserInputCompanion.ts +55 -0
  310. package/src/promiseCompose.ts +17 -3
  311. package/src/promiseSettled.ts +6 -0
  312. package/src/separatedArrayParser.test.ts +34 -0
  313. package/src/separatedArrayParser.ts +55 -0
  314. package/src/separatedNonEmptyArrayParser.test.ts +117 -0
  315. package/src/separatedNonEmptyArrayParser.ts +61 -0
  316. package/src/sequenceBuffer.test.ts +70 -0
  317. package/src/sequenceBuffer.ts +88 -2
  318. package/src/sequenceTerminatedSequenceParser.test.ts +58 -0
  319. package/src/sequenceTerminatedSequenceParser.ts +62 -0
  320. package/src/sequenceUnparser.ts +2 -2
  321. package/src/skipParser.ts +7 -5
  322. package/src/skipToParser.ts +16 -0
  323. package/src/sliceBoundedParser.test.ts +35 -1
  324. package/src/sliceBoundedParser.ts +19 -1
  325. package/src/smali.ts +29 -0
  326. package/src/smaliParser.test.ts +443 -0
  327. package/src/smaliParser.test.ts.md +3907 -0
  328. package/src/smaliParser.test.ts.snap +0 -0
  329. package/src/smaliParser.ts +3348 -0
  330. package/src/stringFromAsyncIterable.ts +9 -0
  331. package/src/terminatedArrayParser.test.ts +258 -0
  332. package/src/terminatedArrayParser.ts +109 -6
  333. package/src/toAsyncIterable.ts +7 -0
  334. package/src/toAsyncIterator.ts +48 -0
  335. package/src/tupleParser.ts +8 -5
  336. package/src/uint8Array.ts +2 -3
  337. package/src/unionParser.test.ts +78 -0
  338. package/src/unionParser.ts +47 -21
  339. package/src/unparser.test.ts +18 -34
  340. package/src/unparser.ts +13 -9
  341. package/src/unparserContext.ts +9 -13
  342. package/src/unparserError.ts +2 -1
  343. package/src/unparserImplementationInvariant.ts +1 -1
  344. package/src/unparserOutputCompanion.ts +1 -1
  345. package/src/zip.ts +2 -6
  346. package/src/zipParser.ts +71 -20
  347. package/src/zipUnparser.test.ts +19 -19
  348. package/src/zipUnparser.ts +139 -90
  349. package/tsconfig.json +7 -1
  350. package/xo.config.ts +15 -0
  351. package/.yarn/releases/yarn-4.5.3.cjs +0 -934
  352. package/build/apk.d.ts +0 -39
  353. package/build/apkParser.d.ts +0 -16
  354. package/build/apkParser.js +0 -164
  355. package/build/apkParser.test.js +0 -22
  356. package/build/apkUnparser.d.ts +0 -4
  357. package/build/apkUnparser.js +0 -90
  358. package/build/apkUnparser.test.js +0 -26
  359. package/build/arbitraryDosDate.d.ts +0 -2
  360. package/build/arbitraryDosDate.js +0 -8
  361. package/build/arbitraryZipEntry.d.ts +0 -3
  362. package/build/arbitraryZipEntry.js +0 -26
  363. package/build/createDisjunctionParser.d.ts +0 -2
  364. package/build/createDisjunctionParser.js +0 -47
  365. package/build/createExactParser.d.ts +0 -2
  366. package/build/createExactParser.js +0 -12
  367. package/build/createSequentialUnionParser.d.ts +0 -2
  368. package/build/createSequentialUnionParser.js +0 -69
  369. package/build/fixedLengthChunkParser.d.ts +0 -2
  370. package/build/fixedLengthChunkParser.js +0 -12
  371. package/build/fixedLengthParser.d.ts +0 -2
  372. package/build/fixedLengthParser.js +0 -12
  373. package/build/inputChunkBuffer.d.ts +0 -15
  374. package/build/inputChunkBuffer.js +0 -40
  375. package/build/inputChunkBuffer.test.js +0 -34
  376. package/build/inputCompanion.d.ts +0 -18
  377. package/build/inputCompanion.js +0 -28
  378. package/build/invariantDefined.d.ts +0 -1
  379. package/build/invariantDefined.js +0 -5
  380. package/build/invariantIdentity.d.ts +0 -3
  381. package/build/invariantIdentity.js +0 -5
  382. package/build/javaKeystoreParser.d.ts +0 -2
  383. package/build/javaKeystoreParser.js +0 -7
  384. package/build/jsonParser2.d.ts +0 -3
  385. package/build/jsonParser2.js +0 -52
  386. package/build/jsonParser2.test.js +0 -22
  387. package/build/negativeLookahead.d.ts +0 -2
  388. package/build/negativeLookahead.js +0 -18
  389. package/build/parserCompose.d.ts +0 -3
  390. package/build/parserCompose.js +0 -7
  391. package/build/parserImplementationInvariantInvariant.d.ts +0 -3
  392. package/build/parserImplementationInvariantInvariant.js +0 -15
  393. package/build/parserInvariant.d.ts +0 -4
  394. package/build/parserInvariant.js +0 -11
  395. package/build/promiseFish.d.ts +0 -1
  396. package/build/promiseFish.js +0 -3
  397. package/build/sequenceParser.d.ts +0 -3
  398. package/build/sequenceParser.js +0 -10
  399. package/build/terminatedSequenceParser.d.ts +0 -2
  400. package/build/terminatedSequenceParser.js +0 -24
  401. package/build/unparserInputCompanion.d.ts +0 -15
  402. package/build/unparserInputCompanion.js +0 -13
  403. package/build/zipEntry.d.ts +0 -28
  404. package/build/zipFile.d.ts +0 -32
  405. package/build/zipFileEntry.d.ts +0 -6
  406. package/src/apk.ts +0 -48
  407. package/src/apkParser.test.ts +0 -30
  408. package/src/apkParser.test.ts.snap +0 -0
  409. package/src/apkParser.ts +0 -392
  410. package/src/apkUnparser.test.ts +0 -37
  411. package/src/apkUnparser.ts +0 -120
  412. package/src/invariantDefined.ts +0 -6
  413. package/src/invariantIdentity.ts +0 -8
  414. /package/build/{apk.js → androidPackage.js} +0 -0
  415. /package/build/{apkParser.test.d.ts → androidPackageParser.test.d.ts} +0 -0
  416. /package/build/{apkUnparser.test.d.ts → androidPackageUnparser.test.d.ts} +0 -0
  417. /package/build/{arbitraryDosPermissions.d.ts → dalvikBytecodeUnparser.test.d.ts} +0 -0
  418. /package/build/{arbitraryDosPermissions.js → dalvikExecutableParser.test.d.ts} +0 -0
  419. /package/build/{inputChunkBuffer.test.d.ts → dalvikExecutableParserAgainstSmaliParser.test.d.ts} +0 -0
  420. /package/build/{jsonParser2.test.d.ts → dalvikExecutableUnparser.test.d.ts} +0 -0
  421. /package/build/{parserParsingInvariant.d.ts → elementTerminatedArrayParser.test.d.ts} +0 -0
  422. /package/build/{parserParsingInvariant.js → elementTerminatedSequenceArrayParser.test.d.ts} +0 -0
  423. /package/build/{zipEntry.js → elementTerminatedSequenceParser.test.d.ts} +0 -0
  424. /package/build/{zipFile.js → fetchCid.test.d.ts} +0 -0
  425. /package/build/{zipFileEntry.js → fixedLengthSequenceParser.test.d.ts} +0 -0
@@ -1,52 +1,74 @@
1
1
  import { allSettledStream } from './allSettledStream.js';
2
2
  import { getParserName, setParserName, type Parser } from './parser.js';
3
3
  import { type ParserContext } from './parserContext.js';
4
- import { ParserParsingFailedError } from './parserError.js';
4
+ import { isParserParsingFailedError, ParserParsingFailedError } from './parserError.js';
5
5
  import { parserImplementationInvariant } from './parserImplementationInvariant.js';
6
+ import { type DeriveSequenceElement } from './sequence.js';
7
+
8
+ const bigintReplacer = (_key: string, value: unknown) => {
9
+ if (typeof value === 'bigint') {
10
+ return `${value}n`;
11
+ }
12
+
13
+ return value;
14
+ };
6
15
 
7
16
  export const createUnionParser = <
8
17
  Output,
9
18
  Sequence,
19
+ Element = DeriveSequenceElement<Sequence>,
10
20
  >(
11
- childParsers: Array<Parser<any, Sequence, any>>,
12
- ): Parser<Output, Sequence, unknown> => {
21
+ childParsers: Array<Parser<unknown, Sequence, Element>>,
22
+ ): Parser<Output, Sequence, Element> => {
13
23
  parserImplementationInvariant(childParsers.length > 0, 'Union parser must have at least one child parser.');
14
24
 
15
- const unionParser: Parser<Output, Sequence, unknown> = async parserContext => {
16
- let runningChildParserContexts: Array<ParserContext<unknown, unknown>> = [];
25
+ type TaskContext = {
26
+ childParser: Parser<unknown, Sequence, Element>;
27
+ childParserContext: ParserContext<Sequence, Element>;
28
+ };
29
+
30
+ const unionParser: Parser<Output, Sequence, Element> = async parserContext => {
31
+ let runningChildParserContexts: TaskContext[] = [];
17
32
 
18
- const childParserResults = allSettledStream(childParsers.map(childParser => {
33
+ const createChildParserTask = (childParser: Parser<unknown, Sequence, Element>) => {
19
34
  const childParserContext = parserContext.lookahead({
20
35
  debugName: getParserName(childParser, 'anonymousUnionChild'),
21
36
  });
22
37
 
23
- runningChildParserContexts.push(childParserContext);
38
+ const context: TaskContext = {
39
+ childParser,
40
+ childParserContext,
41
+ };
42
+
43
+ runningChildParserContexts.push(context);
44
+
45
+ const getChildParserPromise = (async () => childParser(childParserContext) as Promise<Output>);
24
46
 
25
- const promise = childParser(childParserContext);
47
+ const promise = getChildParserPromise();
26
48
 
27
49
  return {
28
50
  promise,
29
- context: childParserContext,
51
+ context,
30
52
  };
31
- }));
53
+ };
54
+
55
+ const childParserResults = allSettledStream<Output, TaskContext>(childParsers.map(createChildParserTask));
32
56
 
33
57
  const parserParsingFailedErrors: ParserParsingFailedError[] = [];
34
58
  const successfulParserOutputs: Output[] = [];
35
- const successfulParserContexts: Array<ParserContext<unknown, unknown>> = [];
59
+ const successfulTaskContexts: TaskContext[] = [];
36
60
  let didUnlookahead = false;
37
61
 
38
62
  for await (const childParserResult of childParserResults) {
39
- runningChildParserContexts = runningChildParserContexts.filter(
40
- runningChildParserContext => runningChildParserContext !== childParserResult.context,
41
- );
63
+ runningChildParserContexts = runningChildParserContexts.filter(runningChildParserContext => runningChildParserContext !== childParserResult.context);
42
64
 
43
65
  if (childParserResult.status === 'fulfilled') {
44
66
  successfulParserOutputs.push(childParserResult.value);
45
- successfulParserContexts.push(childParserResult.context);
67
+ successfulTaskContexts.push(childParserResult.context);
46
68
  } else {
47
69
  const error = childParserResult.reason;
48
70
 
49
- if (error instanceof ParserParsingFailedError) {
71
+ if (isParserParsingFailedError(error)) {
50
72
  parserParsingFailedErrors.push(error);
51
73
  } else {
52
74
  throw error;
@@ -60,7 +82,7 @@ export const createUnionParser = <
60
82
  parserImplementationInvariant(!didUnlookahead, 'Union parser unlookaheaded multiple times.');
61
83
  didUnlookahead = true;
62
84
  const [ runningChildParserContext ] = runningChildParserContexts;
63
- runningChildParserContext.unlookahead();
85
+ runningChildParserContext.childParserContext.unlookahead();
64
86
  }
65
87
  }
66
88
 
@@ -71,8 +93,12 @@ export const createUnionParser = <
71
93
  'Successful parser outputs, indented, separated by newlines:',
72
94
  '%s',
73
95
  'End of successful parser outputs.',
96
+ 'Successful parser names, indented, separated by newlines:',
97
+ '%s',
98
+ 'End of successful parser names.',
74
99
  ],
75
- () => successfulParserOutputs.map(output => ' ' + JSON.stringify(output)).join('\n'),
100
+ () => successfulParserOutputs.map(output => ' ' + JSON.stringify(output, bigintReplacer)).join('\n'),
101
+ () => successfulTaskContexts.map(taskContext => ' ' + getParserName(taskContext.childParser, 'anonymousUnionChild')).join('\n'),
76
102
  );
77
103
 
78
104
  parserContext.invariantJoin(
@@ -81,13 +107,13 @@ export const createUnionParser = <
81
107
  'No union child parser succeeded.',
82
108
  );
83
109
 
84
- const [ successfulParserContext ] = successfulParserContexts;
110
+ const [ successfulParserContext ] = successfulTaskContexts;
85
111
 
86
112
  if (!didUnlookahead) {
87
- successfulParserContext.unlookahead();
113
+ successfulParserContext.childParserContext.unlookahead();
88
114
  }
89
115
 
90
- successfulParserContext.dispose();
116
+ successfulParserContext.childParserContext.dispose();
91
117
 
92
118
  const [ successfulParserOutput ] = successfulParserOutputs;
93
119
 
@@ -1,8 +1,8 @@
1
1
  import test from 'ava';
2
2
  import * as fc from 'fast-check';
3
- import { runUnparser, Unparser } from './unparser.js';
4
- import { stringUnparserOutputCompanion } from './unparserOutputCompanion.js';
5
3
  import { testProp } from '@fast-check/ava';
4
+ import { runUnparser, type Unparser } from './unparser.js';
5
+ import { stringUnparserOutputCompanion } from './unparserOutputCompanion.js';
6
6
 
7
7
  test('writeLater', async t => {
8
8
  const stringToBeWrittenBefore = 'before writeLater\n';
@@ -16,7 +16,7 @@ test('writeLater', async t => {
16
16
  let actualPositionBFromWithinWriteLater: number | undefined;
17
17
 
18
18
  const unparser: Unparser<void, string> = async function * (_input, unparserContext) {
19
- yield stringToBeWrittenBefore
19
+ yield stringToBeWrittenBefore;
20
20
 
21
21
  expectedPositionA = unparserContext.position;
22
22
 
@@ -127,19 +127,13 @@ test('writeLater deep', async t => {
127
127
  testProp(
128
128
  'writeLater positions and lengths',
129
129
  [
130
- fc.array(
131
- fc.oneof(
132
- fc.array(
133
- fc.oneof(
134
- fc.array(
135
- fc.string(),
136
- ),
137
- fc.string(),
138
- ),
139
- ),
130
+ fc.array(fc.oneof(
131
+ fc.array(fc.oneof(
132
+ fc.array(fc.string()),
140
133
  fc.string(),
141
- ),
142
- ),
134
+ )),
135
+ fc.string(),
136
+ )),
143
137
  ],
144
138
  async (t, stringArray3) => {
145
139
  const numberUnparser: Unparser<number, string> = async function * (input, unparserContext) {
@@ -148,12 +142,10 @@ testProp(
148
142
 
149
143
  const createLengthPrefixedUnparser = <T>(
150
144
  unparser: Unparser<T, string>,
151
- ): Unparser<T, string> => {
152
- return async function * (input, unparserContext) {
153
- const length = yield * unparserContext.writeLater(8);
154
- yield * unparser(input, unparserContext);
155
- yield * unparserContext.writeEarlier(length, numberUnparser, unparserContext.position - length.positionEnd);
156
- };
145
+ ): Unparser<T, string> => async function * (input, unparserContext) {
146
+ const length = yield * unparserContext.writeLater(8);
147
+ yield * unparser(input, unparserContext);
148
+ yield * unparserContext.writeEarlier(length, numberUnparser, unparserContext.position - length.positionEnd);
157
149
  };
158
150
 
159
151
  const unparser0: Unparser<string, string> = createLengthPrefixedUnparser(async function * (input, unparserContext) {
@@ -166,23 +158,15 @@ testProp(
166
158
  }
167
159
  });
168
160
 
169
- const unparser2: Unparser<(string | string[])[], string> = createLengthPrefixedUnparser(async function * (input, unparserContext) {
161
+ const unparser2: Unparser<Array<string | string[]>, string> = createLengthPrefixedUnparser(async function * (input, unparserContext) {
170
162
  for (const stringArray2 of input) {
171
- if (typeof stringArray2 === 'string') {
172
- yield * unparser0(stringArray2, unparserContext);
173
- } else {
174
- yield * unparser1(stringArray2, unparserContext);
175
- }
163
+ yield * (typeof stringArray2 === 'string' ? unparser0(stringArray2, unparserContext) : unparser1(stringArray2, unparserContext));
176
164
  }
177
165
  });
178
166
 
179
- const unparser3: Unparser<(string | (string | string[])[])[], string> = createLengthPrefixedUnparser(async function * (input, unparserContext) {
167
+ const unparser3: Unparser<Array<string | Array<string | string[]>>, string> = createLengthPrefixedUnparser(async function * (input, unparserContext) {
180
168
  for (const stringArray3 of input) {
181
- if (typeof stringArray3 === 'string') {
182
- yield * unparser0(stringArray3, unparserContext);
183
- } else {
184
- yield * unparser2(stringArray3, unparserContext);
185
- }
169
+ yield * (typeof stringArray3 === 'string' ? unparser0(stringArray3, unparserContext) : unparser2(stringArray3, unparserContext));
186
170
  }
187
171
  });
188
172
 
@@ -196,7 +180,7 @@ testProp(
196
180
 
197
181
  const actualString = strings.join('');
198
182
 
199
- type DeepArray<T> = T | DeepArray<T>[];
183
+ type DeepArray<T> = T | Array<DeepArray<T>>;
200
184
 
201
185
  function getExpectedString(stringArray: DeepArray<string>): string {
202
186
  let expectedString = stringArray;
package/src/unparser.ts CHANGED
@@ -1,8 +1,10 @@
1
- import invariant from "invariant";
2
- import { DeriveSequenceElement } from "./sequence.js";
3
- import { UnparserContext, UnparserContextImplementation, WriteEarlier, WriteLater } from "./unparserContext.js";
4
- import { UnparserOutputCompanion } from "./unparserOutputCompanion.js";
5
- import { unparserImplementationInvariant } from "./unparserImplementationInvariant.js";
1
+ import invariant from 'invariant';
2
+ import { type DeriveSequenceElement } from './sequence.js';
3
+ import {
4
+ type UnparserContext, UnparserContextImplementation, WriteEarlier, WriteLater,
5
+ } from './unparserContext.js';
6
+ import { type UnparserOutputCompanion } from './unparserOutputCompanion.js';
7
+ import { unparserImplementationInvariant } from './unparserImplementationInvariant.js';
6
8
 
7
9
  type UnparserIterableValue<Sequence, Element> =
8
10
  | Sequence
@@ -49,7 +51,7 @@ async function * elementsToSequences<
49
51
  for await (const value of values) {
50
52
  if (
51
53
  value instanceof WriteLater
52
- || value instanceof WriteEarlier
54
+ || value instanceof WriteEarlier
53
55
  ) {
54
56
  if (elements.length > 0) {
55
57
  const sequence = unparserOutputCompanion.from(elements);
@@ -91,7 +93,9 @@ function wrapUnparserResult<Sequence, Element>(
91
93
  unparserResult,
92
94
  unparserOutputCompanion,
93
95
  ),
94
- value => unparserContext.handleYield(value),
96
+ value => {
97
+ unparserContext.handleYield(value);
98
+ },
95
99
  );
96
100
  }
97
101
 
@@ -119,7 +123,7 @@ export async function * runUnparser<
119
123
  type PushOutput = (value: Sequence | WriteLater<Sequence, Element>) => void;
120
124
  type FinishOutput = () => void;
121
125
 
122
- const iteratorStack: [ Iterator, PushOutput, FinishOutput ][] = [
126
+ const iteratorStack: Array<[ Iterator, PushOutput, FinishOutput ]> = [
123
127
  [
124
128
  valuesWithoutElements[Symbol.asyncIterator](),
125
129
  value => outputQueue.push(value),
@@ -130,7 +134,7 @@ export async function * runUnparser<
130
134
  while (true) {
131
135
  while (
132
136
  outputQueue.length > 0
133
- && !(outputQueue[0] instanceof WriteLater)
137
+ && !(outputQueue[0] instanceof WriteLater)
134
138
  ) {
135
139
  yield outputQueue.shift() as Sequence;
136
140
  }
@@ -1,9 +1,8 @@
1
- /* eslint-disable prefer-arrow-callback */
2
1
 
3
- import { Unparser, UnparserResult } from "./unparser.js";
4
- import { UnparserOutputCompanion } from "./unparserOutputCompanion.js";
5
- import { unparserImplementationInvariant } from "./unparserImplementationInvariant.js";
6
- import { parserImplementationInvariant } from "./parserImplementationInvariant.js";
2
+ import { type Unparser, type UnparserResult } from './unparser.js';
3
+ import { type UnparserOutputCompanion } from './unparserOutputCompanion.js';
4
+ import { unparserImplementationInvariant } from './unparserImplementationInvariant.js';
5
+ import { parserImplementationInvariant } from './parserImplementationInvariant.js';
7
6
 
8
7
  export type UnparserContext<Sequence, Element> = {
9
8
  get position(): number;
@@ -19,7 +18,7 @@ export type UnparserContext<Sequence, Element> = {
19
18
  export class WriteLater<Sequence, Element> extends Error {
20
19
  name = 'WriteLater';
21
20
 
22
- constructor (
21
+ constructor(
23
22
  private readonly _position: number,
24
23
  private readonly _length: number,
25
24
  ) {
@@ -105,13 +104,10 @@ export class UnparserContextImplementation<Sequence, Element> implements Unparse
105
104
  );
106
105
  }
107
106
 
108
- handleYield(
109
- value:
110
- | Sequence
111
- | WriteLater<Sequence, Element>
112
- | WriteEarlier<Sequence, Element>
113
- ,
114
- ) {
107
+ handleYield(value:
108
+ | Sequence
109
+ | WriteLater<Sequence, Element>
110
+ | WriteEarlier<Sequence, Element>) {
115
111
  if (value instanceof WriteEarlier) {
116
112
  return;
117
113
  }
@@ -1,5 +1,6 @@
1
+ import { NormalLazyMessageError } from "./lazyMessageError.js";
1
2
 
2
- export class UnparserError extends Error {
3
+ export class UnparserError extends NormalLazyMessageError {
3
4
  name = 'UnparserError';
4
5
  }
5
6
 
@@ -1,6 +1,6 @@
1
1
  import { UnparserImplementationInvariantError } from './unparserError.js';
2
2
  import { type Falsy, customInvariant, type ValueOrAccessor } from './customInvariant.js';
3
3
 
4
- export function unparserImplementationInvariant<T>(value: T, format: ValueOrAccessor<string | string[]>, ...formatArguments: any[]): Exclude<T, Falsy> {
4
+ export function unparserImplementationInvariant<T>(value: T, format: ValueOrAccessor<string | string[]>, ...formatArguments: unknown[]): Exclude<T, Falsy> {
5
5
  return customInvariant(UnparserImplementationInvariantError, value, format, ...formatArguments);
6
6
  }
@@ -1,4 +1,4 @@
1
- import { StringParserInputCompanion, Uint8ArrayParserInputCompanion } from "./parserInputCompanion.js";
1
+ import { StringParserInputCompanion, Uint8ArrayParserInputCompanion } from './parserInputCompanion.js';
2
2
 
3
3
  export type UnparserOutputCompanion<Sequence, Element> = {
4
4
  is(value: unknown): value is Sequence;
package/src/zip.ts CHANGED
@@ -1,9 +1,7 @@
1
1
 
2
2
  export type ZipCompression =
3
3
  | 'store'
4
- | 'deflate'
5
- ;
6
-
4
+ | 'deflate';
7
5
  export type ZipEntryAttributes = {
8
6
  };
9
7
 
@@ -27,9 +25,7 @@ export type ZipDirectoryEntry = ZipEntryCommon & {
27
25
 
28
26
  export type ZipEntry =
29
27
  | ZipFileEntry
30
- | ZipDirectoryEntry
31
- ;
32
-
28
+ | ZipDirectoryEntry;
33
29
  export type Zip = {
34
30
  comment: string;
35
31
  entries: ZipEntry[];
package/src/zipParser.ts CHANGED
@@ -18,6 +18,8 @@ import {
18
18
  type ZipFileEntry,
19
19
  } from './zip.js';
20
20
  import { uint8ArrayAsyncIterableToUint8Array } from './uint8Array.js';
21
+ import { createNegativeLookaheadParser } from './negativeLookaheadParser.js';
22
+ import { createSequenceTerminatedSequenceParser } from './sequenceTerminatedSequenceParser.js';
21
23
 
22
24
  // https://pkwaredownloads.blob.core.windows.net/pem/APPNOTE.txt
23
25
 
@@ -65,7 +67,7 @@ const zipCompressionMethodParser: Parser<ZipCompression, Uint8Array> = promiseCo
65
67
  },
66
68
  );
67
69
 
68
- type ZipLocalFileHeader = {
70
+ export type ZipLocalFileHeader = {
69
71
  versionNeededToExtract: number;
70
72
  generalPurposeBitFlag: number;
71
73
  compressionMethod: ZipCompression;
@@ -78,8 +80,10 @@ type ZipLocalFileHeader = {
78
80
  extraField: Uint8Array;
79
81
  };
80
82
 
83
+ const zipLocalFileHeaderSignatureParser = createExactSequenceParser<Uint8Array>(Buffer.from('504b0304', 'hex'));
84
+
81
85
  const zipLocalFileHeaderParser_ = createTupleParser([
82
- createExactSequenceParser<Uint8Array>(Buffer.from('504b0304', 'hex')),
86
+ zipLocalFileHeaderSignatureParser,
83
87
  uint16LEParser,
84
88
  uint16LEParser,
85
89
  zipCompressionMethodParser,
@@ -133,31 +137,76 @@ const zipEncryptionHeaderParser: Parser<unknown, Uint8Array> = async parserConte
133
137
  parserContext.invariant(false, 'Not implemented');
134
138
  };
135
139
 
136
- const zipDataDescriptorParser: Parser<unknown, Uint8Array> = createTupleParser([
137
- // FIXME: optional in spec
138
- // createOptionalParser(createExactSequenceParser<Uint8Array>(Buffer.from('504b0708', 'hex'))),
139
- createExactSequenceParser<Uint8Array>(Buffer.from('504b0708', 'hex')),
140
- uint32LEParser,
141
- uint32LEParser,
142
- uint32LEParser,
143
- ]);
140
+ type ZipDataDescriptor = {
141
+ crc32: number;
142
+ compressedSize: number;
143
+ uncompressedSize: number;
144
+ };
145
+
146
+ const zipDataDescriptorSignature: Uint8Array = Buffer.from('504b0708', 'hex');
147
+ const zipDataDescriptorSignatureParser = createExactSequenceParser<Uint8Array>(zipDataDescriptorSignature);
148
+
149
+ const zipDataDescriptorParser: Parser<ZipDataDescriptor, Uint8Array> = promiseCompose(
150
+ createTupleParser([
151
+ createNegativeLookaheadParser(zipLocalFileHeaderSignatureParser),
152
+ // FIXME: optional in spec
153
+ // createOptionalParser(zipDataDescriptorSignatureParser),
154
+ zipDataDescriptorSignatureParser,
155
+ uint32LEParser,
156
+ uint32LEParser,
157
+ uint32LEParser,
158
+ ]),
159
+ ([
160
+ _notZipLocalFileHeaderSignature,
161
+ _zipDataDescriptorSignature,
162
+ crc32,
163
+ compressedSize,
164
+ uncompressedSize,
165
+ ]) => ({
166
+ crc32,
167
+ compressedSize,
168
+ uncompressedSize,
169
+ }),
170
+ );
171
+
172
+ setParserName(zipDataDescriptorParser, 'zipDataDescriptorParser');
144
173
 
145
174
  export type ZipLocalFile = {
146
175
  zipLocalFileHeader: ZipLocalFileHeader;
147
176
  zipEncryptionHeader: unknown;
148
177
  compressedData: Uint8Array;
149
- zipDataDescriptor: unknown;
178
+ zipDataDescriptor: undefined | ZipDataDescriptor;
150
179
  };
151
180
 
152
181
  export const zipLocalFileParser: Parser<ZipLocalFile, Uint8Array> = promiseCompose(
153
182
  parserCreatorCompose(
154
183
  () => zipLocalFileHeaderParser,
155
- zipLocalFileHeader => createTupleParser([
156
- async () => zipLocalFileHeader,
157
- createOptionalParser(zipEncryptionHeaderParser),
158
- createFixedLengthSequenceParser(zipLocalFileHeader.compressedSize),
159
- createOptionalParser(zipDataDescriptorParser),
160
- ]),
184
+ zipLocalFileHeader => {
185
+ const sizeInDataDescriptor = Boolean(zipLocalFileHeader.generalPurposeBitFlag & 0b0000_0000_0000_1000
186
+ && zipLocalFileHeader.crc32 === 0
187
+ && zipLocalFileHeader.compressedSize === 0
188
+ && zipLocalFileHeader.uncompressedSize === 0);
189
+
190
+ return createTupleParser([
191
+ async () => zipLocalFileHeader,
192
+ createOptionalParser(zipEncryptionHeaderParser),
193
+ (
194
+ sizeInDataDescriptor
195
+ ? createSequenceTerminatedSequenceParser(
196
+ zipDataDescriptorSignature,
197
+ {
198
+ consumeTerminator: false,
199
+ },
200
+ )
201
+ : createFixedLengthSequenceParser(zipLocalFileHeader.compressedSize)
202
+ ),
203
+ (
204
+ sizeInDataDescriptor
205
+ ? (<T>(parser: T): T => parser)
206
+ : createOptionalParser
207
+ )(zipDataDescriptorParser),
208
+ ]);
209
+ },
161
210
  )(),
162
211
  ([
163
212
  zipLocalFileHeader,
@@ -200,7 +249,7 @@ const zipVersionMadeByParser: Parser<ZipVersionMadeBy, Uint8Array> = promiseComp
200
249
 
201
250
  type ZipExternalFileAttributes = {
202
251
  directory: boolean;
203
- }
252
+ };
204
253
 
205
254
  const dosExternalFileAttributesParser: Parser<ZipExternalFileAttributes, Uint8Array> = promiseCompose(
206
255
  uint32LEParser,
@@ -373,7 +422,7 @@ const zipEndOfCentralDirectoryRecordParser_ = createTupleParser([
373
422
  zipFileCommentParser,
374
423
  ]);
375
424
 
376
- setParserName(zipEndOfCentralDirectoryRecordParser_, 'endOfCentralDirectoryRecordParser_');
425
+ setParserName(zipEndOfCentralDirectoryRecordParser_, 'zipEndOfCentralDirectoryRecordParser_');
377
426
 
378
427
  export const zipEndOfCentralDirectoryRecordParser: Parser<ZipEndOfCentralDirectoryRecord, Uint8Array> = promiseCompose(
379
428
  zipEndOfCentralDirectoryRecordParser_,
@@ -397,6 +446,8 @@ export const zipEndOfCentralDirectoryRecordParser: Parser<ZipEndOfCentralDirecto
397
446
  }),
398
447
  );
399
448
 
449
+ setParserName(zipEndOfCentralDirectoryRecordParser, 'zipEndOfCentralDirectoryRecordParser');
450
+
400
451
  const zipParser_ = createTupleParser([
401
452
  createArrayParser(zipLocalFileParser),
402
453
  createOptionalParser(zipArchiveDecryptionHeaderParser),
@@ -440,7 +491,7 @@ export async function zipEntriesFromZipSegments({
440
491
 
441
492
  const isDirectory = (
442
493
  centralDirectoryHeader.externalFileAttributes.directory
443
- || commonFields.path.endsWith('/')
494
+ || commonFields.path.endsWith('/')
444
495
  );
445
496
 
446
497
  if (isDirectory) {
@@ -1,24 +1,15 @@
1
- import { testProp } from '@fast-check/ava';
1
+ import fsPromises from 'node:fs/promises';
2
+ import { fc, testProp } from '@fast-check/ava';
2
3
  import { temporaryFile } from 'tempy';
3
4
  import { execa } from 'execa';
4
- import fsPromises from 'node:fs/promises';
5
5
  import { runUnparser } from './unparser.js';
6
- import { zipUnparser } from './zipUnparser.js';
6
+ import { createZipUnparser } from './zipUnparser.js';
7
7
  import { uint8ArrayUnparserOutputCompanion } from './unparserOutputCompanion.js';
8
8
  import { runParser } from './parser.js';
9
9
  import { zipParser } from './zipParser.js';
10
10
  import { uint8ArrayParserInputCompanion } from './parserInputCompanion.js';
11
11
  import { arbitraryZip } from './arbitraryZip.js';
12
-
13
- async function hasExecutable(executable: string) {
14
- const hasExecutable = execa(executable).then(() => true, () => false);
15
-
16
- if (!hasExecutable) {
17
- console.warn(`Executable %o not found`, executable);
18
- }
19
-
20
- return hasExecutable;
21
- }
12
+ import { hasExecutable } from './hasExecutable.js';
22
13
 
23
14
  const hasZipinfoPromise = hasExecutable('zipinfo');
24
15
  const has7zPromise = hasExecutable('7z');
@@ -57,21 +48,30 @@ testProp(
57
48
  'zip',
58
49
  [
59
50
  arbitraryZip,
51
+ fc.record({
52
+ dataDescriptor: fc.boolean(),
53
+ }),
60
54
  ],
61
- async (t, zip) => {
62
- const actualStream = runUnparser(zipUnparser, zip, uint8ArrayUnparserOutputCompanion);
63
- const actual = await runParser(zipParser, actualStream, uint8ArrayParserInputCompanion);
55
+ async (t, zip, options) => {
56
+ const zipUnparser = createZipUnparser(options);
64
57
 
65
- const isDeepEqual = t.deepEqual(actual, zip);
58
+ {
59
+ const zipStream = runUnparser(zipUnparser, zip, uint8ArrayUnparserOutputCompanion);
66
60
 
67
- if (!isDeepEqual) {
68
- return;
61
+ await fsPromises.writeFile('/tmp/zip.zip', zipStream);
69
62
  }
70
63
 
64
+ const actualStream = runUnparser(zipUnparser, zip, uint8ArrayUnparserOutputCompanion);
65
+ const actual = await runParser(zipParser, actualStream, uint8ArrayParserInputCompanion);
66
+
67
+ t.deepEqual(actual, zip);
68
+
71
69
  const hasZipinfo = await hasZipinfoPromise;
72
70
  const has7z = await has7zPromise;
73
71
 
74
72
  if (!hasZipinfo && !has7z) {
73
+ t.pass('no zipinfo or 7z, skipping zipfile check');
74
+
75
75
  return;
76
76
  }
77
77