@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
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,410 @@
1
+ import test from 'ava';
2
+ import { stringParserInputCompanion } from './parserInputCompanion.js';
3
+ import { getParserName, runParser } from './parser.js';
4
+ import { fetchCid } from './fetchCid.js';
5
+ import { smaliAnnotationParser, smaliCodeOperationParser, smaliCodeParameterParser, smaliCommentParser, smaliFieldParser, smaliMethodParser, smaliParser, } from './smaliParser.js';
6
+ import { hasExecutable } from './hasExecutable.js';
7
+ import { baksmaliClass } from './backsmali.js';
8
+ const hasBaksmaliPromise = hasExecutable('baksmali');
9
+ const stringParserTestSnapshot = Symbol('stringParserTestSnapshot');
10
+ const stringParserTestIgnore = Symbol('stringParserTestIgnore');
11
+ function stringParserTest(parser, examples) {
12
+ const parserName = getParserName(parser);
13
+ for (const [input, expected] of examples) {
14
+ test(parserName + ' ' + JSON.stringify(input), async (t) => {
15
+ const actual = await runParser(parser, input, stringParserInputCompanion, {
16
+ errorJoinMode: 'all',
17
+ });
18
+ if (expected === stringParserTestIgnore) {
19
+ t.pass('skipping test because expected is stringParserTestIgnore');
20
+ }
21
+ else if (expected === stringParserTestSnapshot) {
22
+ t.snapshot(actual);
23
+ }
24
+ else {
25
+ t.deepEqual(actual, expected);
26
+ }
27
+ });
28
+ }
29
+ }
30
+ stringParserTest(smaliCommentParser, [
31
+ [
32
+ '# this is a comment \n',
33
+ ' this is a comment ',
34
+ ],
35
+ ]);
36
+ stringParserTest(smaliCodeParameterParser, [
37
+ [
38
+ ' .param p1\n',
39
+ {
40
+ register: {
41
+ index: 1,
42
+ prefix: 'p',
43
+ },
44
+ name: undefined,
45
+ annotation: undefined,
46
+ },
47
+ ],
48
+ [
49
+ ' .param p1, "savedInstanceState" # Landroid/os/Bundle;\n',
50
+ {
51
+ register: {
52
+ index: 1,
53
+ prefix: 'p',
54
+ },
55
+ name: 'savedInstanceState',
56
+ annotation: undefined,
57
+ },
58
+ ],
59
+ [
60
+ ` .param p1 # Ljava/lang/ClassLoader;
61
+ .annotation build Landroid/annotation/NonNull;
62
+ .end annotation
63
+ .end param\n`,
64
+ {
65
+ register: {
66
+ index: 1,
67
+ prefix: 'p',
68
+ },
69
+ name: undefined,
70
+ annotation: {
71
+ visibility: 'build',
72
+ type: 'Landroid/annotation/NonNull;',
73
+ elements: [],
74
+ },
75
+ },
76
+ ],
77
+ ]);
78
+ stringParserTest(smaliFieldParser, [
79
+ [
80
+ '.field private barcodeScannerView:Lcom/journeyapps/barcodescanner/DecoratedBarcodeView;\n',
81
+ {
82
+ field: {
83
+ accessFlags: {
84
+ abstract: false,
85
+ annotation: false,
86
+ bridge: false,
87
+ constructor: false,
88
+ declaredSynchronized: false,
89
+ enum: false,
90
+ final: false,
91
+ interface: false,
92
+ native: false,
93
+ private: true,
94
+ protected: false,
95
+ public: false,
96
+ static: false,
97
+ strict: false,
98
+ synchronized: false,
99
+ synthetic: false,
100
+ transient: false,
101
+ varargs: false,
102
+ volatile: false,
103
+ },
104
+ field: {
105
+ class: 'FILLED_LATER',
106
+ name: 'barcodeScannerView',
107
+ type: 'Lcom/journeyapps/barcodescanner/DecoratedBarcodeView;',
108
+ },
109
+ },
110
+ annotations: [],
111
+ },
112
+ ],
113
+ [
114
+ `.field public final g:Lo/b;
115
+ .annotation system Ldalvik/annotation/Signature;
116
+ value = {
117
+ "Lo/b<",
118
+ "Ljava/lang/Float;",
119
+ "Lo/i;",
120
+ ">;"
121
+ }
122
+ .end annotation
123
+ .end field
124
+ `,
125
+ {
126
+ field: {
127
+ accessFlags: {
128
+ abstract: false,
129
+ annotation: false,
130
+ bridge: false,
131
+ constructor: false,
132
+ declaredSynchronized: false,
133
+ enum: false,
134
+ final: true,
135
+ interface: false,
136
+ native: false,
137
+ private: false,
138
+ protected: false,
139
+ public: true,
140
+ static: false,
141
+ strict: false,
142
+ synchronized: false,
143
+ synthetic: false,
144
+ transient: false,
145
+ varargs: false,
146
+ volatile: false,
147
+ },
148
+ field: {
149
+ class: 'FILLED_LATER',
150
+ name: 'g',
151
+ type: 'Lo/b;',
152
+ },
153
+ },
154
+ annotations: [
155
+ {
156
+ visibility: 'system',
157
+ type: 'Ldalvik/annotation/Signature;',
158
+ elements: [
159
+ {
160
+ name: 'value',
161
+ value: {
162
+ kind: 'string',
163
+ value: [
164
+ 'Lo/b<',
165
+ 'Ljava/lang/Float;',
166
+ 'Lo/i;',
167
+ '>;',
168
+ ],
169
+ },
170
+ },
171
+ ],
172
+ },
173
+ ],
174
+ },
175
+ ],
176
+ ]);
177
+ stringParserTest(smaliAnnotationParser, [
178
+ [
179
+ ` .annotation system Ldalvik/annotation/Signature;
180
+ value = {
181
+ "<T:",
182
+ "Landroid/view/View;",
183
+ ">(I)TT;"
184
+ }
185
+ .end annotation
186
+ `,
187
+ {
188
+ visibility: 'system',
189
+ type: 'Ldalvik/annotation/Signature;',
190
+ elements: [
191
+ {
192
+ name: 'value',
193
+ value: {
194
+ kind: 'string',
195
+ value: [
196
+ '<T:',
197
+ 'Landroid/view/View;',
198
+ '>(I)TT;',
199
+ ],
200
+ },
201
+ },
202
+ ],
203
+ },
204
+ ],
205
+ [
206
+ ` .annotation build Landroid/annotation/NonNull;
207
+ .end annotation
208
+ `,
209
+ {
210
+ visibility: 'build',
211
+ type: 'Landroid/annotation/NonNull;',
212
+ elements: [],
213
+ },
214
+ ],
215
+ [
216
+ ` .annotation system Ldalvik/annotation/Signature;
217
+ value = {
218
+ "Lo/b<",
219
+ "Ljava/lang/Float;",
220
+ "Lo/i;",
221
+ ">;"
222
+ }
223
+ .end annotation
224
+ `,
225
+ {
226
+ visibility: 'system',
227
+ type: 'Ldalvik/annotation/Signature;',
228
+ elements: [
229
+ {
230
+ name: 'value',
231
+ value: {
232
+ kind: 'string',
233
+ value: [
234
+ 'Lo/b<',
235
+ 'Ljava/lang/Float;',
236
+ 'Lo/i;',
237
+ '>;',
238
+ ],
239
+ },
240
+ },
241
+ ],
242
+ },
243
+ ],
244
+ ]);
245
+ stringParserTest(smaliMethodParser, [
246
+ [
247
+ `.method public native synthetic instantiateActivity(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/app/Activity;
248
+ .param p1 # Ljava/lang/ClassLoader;
249
+ .annotation build Landroid/annotation/NonNull;
250
+ .end annotation
251
+ .end param
252
+ .end method
253
+ `,
254
+ stringParserTestSnapshot,
255
+ ],
256
+ [
257
+ `.method public native synthetic instantiateActivity(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/app/Activity;
258
+ .param p1 # Ljava/lang/ClassLoader;
259
+ .annotation build Landroid/annotation/NonNull;
260
+ .end annotation
261
+ .end param
262
+ .param p2 # Ljava/lang/String;
263
+ .annotation build Landroid/annotation/NonNull;
264
+ .end annotation
265
+ .end param
266
+ .annotation build Landroid/annotation/NonNull;
267
+ .end annotation
268
+
269
+ .annotation system Ldalvik/annotation/Throws;
270
+ value = {
271
+ Ljava/lang/ClassNotFoundException;,
272
+ Ljava/lang/IllegalAccessException;,
273
+ Ljava/lang/InstantiationException;
274
+ }
275
+ .end annotation
276
+ .end method
277
+ `,
278
+ stringParserTestSnapshot,
279
+ ],
280
+ ]);
281
+ stringParserTest(smaliCodeOperationParser, [
282
+ [
283
+ ` invoke-static {}, Le4/k;->c()Le4/k;
284
+ `,
285
+ {
286
+ operation: 'invoke-static',
287
+ registers: [],
288
+ method: {
289
+ class: 'Le4/k;',
290
+ name: 'c',
291
+ prototype: {
292
+ parameters: [],
293
+ returnType: 'Le4/k;',
294
+ shorty: 'L',
295
+ },
296
+ },
297
+ },
298
+ ],
299
+ [
300
+ ` .packed-switch 0x0
301
+ :pswitch_5
302
+ .end packed-switch
303
+ `,
304
+ stringParserTestSnapshot,
305
+ ],
306
+ ]);
307
+ stringParserTest(smaliCodeOperationParser, [
308
+ [
309
+ ` .sparse-switch
310
+ -0x7073f927 -> :sswitch_47
311
+ -0x3465cce -> :sswitch_3e
312
+ 0x388694fe -> :sswitch_33
313
+ 0x3cbf870b -> :sswitch_28
314
+ .end sparse-switch
315
+ `,
316
+ stringParserTestSnapshot,
317
+ ],
318
+ ]);
319
+ stringParserTest(smaliCodeOperationParser, [
320
+ [
321
+ ` .array-data 4
322
+ 0x10100a7
323
+ 0x101009e
324
+ .end array-data
325
+ `,
326
+ stringParserTestSnapshot,
327
+ ],
328
+ ]);
329
+ stringParserTest(smaliMethodParser, [
330
+ [
331
+ `.method public final a()Landroid/os/Bundle;
332
+ .registers 2
333
+
334
+ iget v0, p0, Landroidx/lifecycle/b0;->a:I
335
+
336
+ packed-switch v0, :pswitch_data_c
337
+
338
+ :pswitch_5
339
+ iget-object v0, p0, Landroidx/lifecycle/b0;->b:Landroidx/lifecycle/c0;
340
+
341
+ invoke-static {v0}, Landroidx/lifecycle/c0;->a(Landroidx/lifecycle/c0;)Landroid/os/Bundle;
342
+
343
+ move-result-object v0
344
+
345
+ return-object v0
346
+
347
+ :pswitch_data_c
348
+ .packed-switch 0x0
349
+ :pswitch_5
350
+ .end packed-switch
351
+ .end method
352
+ `,
353
+ stringParserTestSnapshot,
354
+ ],
355
+ ]);
356
+ const smaliFromDexMacro = test.macro({
357
+ title: (providedTitle, dexCid, smaliFilePath) => providedTitle ?? `smali from dex ${dexCid} ${smaliFilePath}`,
358
+ async exec(t, dexCid, smaliFilePath, shouldSnapshot) {
359
+ const hasBaksmali = await hasBaksmaliPromise;
360
+ if (!hasBaksmali) {
361
+ t.pass('skipping test because baksmali is not available');
362
+ return;
363
+ }
364
+ const dexStream = await fetchCid(dexCid);
365
+ const smali = await baksmaliClass(dexStream, smaliFilePath);
366
+ const actual = await runParser(smaliParser, smali, stringParserInputCompanion, {
367
+ errorJoinMode: 'all',
368
+ });
369
+ // Console.dir(actual, { depth: null });
370
+ if (shouldSnapshot) {
371
+ t.snapshot(actual);
372
+ }
373
+ else {
374
+ // Console.dir(actual, { depth: null });
375
+ t.pass();
376
+ }
377
+ },
378
+ });
379
+ test.serial(smaliFromDexMacro, 'bafkreibb4gsprc3fvmnyqx6obswvm7e7wngnfj64gz65ey72r7xgyzymt4', 'pl/czak/minimal/MainActivity', true);
380
+ test.serial(smaliFromDexMacro, 'bafybeiebe27ylo53trgitu6fqfbmba43c4ivxj3nt4kumsilkucpbdxtqq', 'd/m', true);
381
+ test.serial(smaliFromDexMacro, 'bafybeibbupm7uzhuq4pa674rb2amxsenbdaoijigmaf4onaodaql4mh7yy', 'com/journeyapps/barcodescanner/CaptureActivity', true);
382
+ test.serial.skip(smaliFromDexMacro, 'bafybeicb3qajmwy6li7hche2nkucvytaxcyxhwhphmi73tgydjzmyoqoda', '', false);
383
+ // Minimal failing test case reproducing the a0/n parsing issue
384
+ test('parse smali with virtual method after direct methods (a0/n issue)', async (t) => {
385
+ const smali = `.class public final La0/n;
386
+ .super Landroid/view/View;
387
+ .source "SourceFile"
388
+
389
+ # direct methods
390
+ .method public static constructor <clinit>()V
391
+ .registers 1
392
+
393
+ return-void
394
+ .end method
395
+
396
+ # virtual methods
397
+ .method public final b(Lr/o;ZJIJFLa0/a;)V
398
+ .registers 21
399
+
400
+ invoke-virtual/range {v0 .. v6}, La0/n;->e(JIJF)V
401
+
402
+ return-void
403
+ .end method
404
+ `;
405
+ const actual = await runParser(smaliParser, smali, stringParserInputCompanion, {
406
+ errorJoinMode: 'all',
407
+ });
408
+ t.truthy(actual);
409
+ t.is(actual.classData?.virtualMethods.length, 1);
410
+ });
@@ -0,0 +1 @@
1
+ export declare function stringFromAsyncIterable(asyncIterable: AsyncIterable<string>): Promise<string>;
@@ -0,0 +1,7 @@
1
+ export async function stringFromAsyncIterable(asyncIterable) {
2
+ let string = '';
3
+ for await (const chunk of asyncIterable) {
4
+ string += chunk;
5
+ }
6
+ return string;
7
+ }
@@ -1,2 +1,4 @@
1
1
  import { type Parser } from './parser.js';
2
- export declare const createTerminatedArrayParser: <ElementOutput, TerminatorOutput, Sequence>(elementParser: Parser<ElementOutput, Sequence>, terminatorParser: Parser<unknown, Sequence>) => Parser<[ElementOutput[], TerminatorOutput], Sequence>;
2
+ export declare const createTerminatedArrayParserNaive: <ElementOutput, TerminatorOutput, Sequence>(elementParser: Parser<ElementOutput, Sequence>, terminatorParser: Parser<TerminatorOutput, Sequence>) => Parser<[ElementOutput[], TerminatorOutput], Sequence>;
3
+ export declare const createTerminatedArrayParser: <ElementOutput, TerminatorOutput, Sequence>(elementParser: Parser<ElementOutput, Sequence>, terminatorParser: Parser<TerminatorOutput, Sequence>) => Parser<[ElementOutput[], TerminatorOutput], Sequence>;
4
+ export declare const createTerminatedArrayParserUnsafe: <ElementOutput, TerminatorOutput, Sequence>(elementParser: Parser<ElementOutput, Sequence>, terminatorParser: Parser<TerminatorOutput, Sequence>) => Parser<[ElementOutput[], TerminatorOutput], Sequence>;
@@ -1,4 +1,6 @@
1
1
  import { getParserName, setParserName } from './parser.js';
2
+ import { isParserParsingFailedError } from './parserError.js';
3
+ import { parserImplementationInvariant } from './parserImplementationInvariant.js';
2
4
  import { promiseCompose } from './promiseCompose.js';
3
5
  import { createUnionParser } from './unionParser.js';
4
6
  class Terminated {
@@ -7,14 +9,14 @@ class Terminated {
7
9
  this.value = value;
8
10
  }
9
11
  }
10
- export const createTerminatedArrayParser = (elementParser, terminatorParser) => {
12
+ export const createTerminatedArrayParserNaive = (elementParser, terminatorParser) => {
11
13
  const wrappedTerminatorParser = promiseCompose(terminatorParser, terminatorValue => new Terminated(terminatorValue));
12
14
  setParserName(wrappedTerminatorParser, getParserName(terminatorParser, 'anonymousTerminator'));
13
15
  const elementOrTerminatorParser = createUnionParser([
14
16
  elementParser,
15
17
  promiseCompose(terminatorParser, terminatorValue => new Terminated(terminatorValue)),
16
18
  ]);
17
- return async (parserContext) => {
19
+ const terminatedArrayParserNaive = async (parserContext) => {
18
20
  const elements = [];
19
21
  while (true) {
20
22
  const elementOrTerminator = await elementOrTerminatorParser(parserContext);
@@ -24,4 +26,79 @@ export const createTerminatedArrayParser = (elementParser, terminatorParser) =>
24
26
  elements.push(elementOrTerminator);
25
27
  }
26
28
  };
29
+ setParserName(terminatedArrayParserNaive, `${getParserName(elementParser, 'anonymousElement')}*?${getParserName(terminatorParser, 'anonymousTerminator')}`);
30
+ return terminatedArrayParserNaive;
31
+ };
32
+ export const createTerminatedArrayParser = (elementParser, terminatorParser) => {
33
+ const terminatedArrayParser = async (parserContext) => {
34
+ const elements = [];
35
+ while (true) {
36
+ const terminatorParserContext = parserContext.lookahead({
37
+ debugName: getParserName(terminatorParser, 'anonymousTerminator'),
38
+ });
39
+ try {
40
+ const terminatorValue = await terminatorParser(terminatorParserContext);
41
+ const elementParserContext = parserContext.lookahead({
42
+ debugName: getParserName(elementParser, 'anonymousElement'),
43
+ });
44
+ try {
45
+ await elementParser(elementParserContext);
46
+ parserImplementationInvariant(false, [
47
+ 'Both element and terminator parsers matched.',
48
+ 'Element parser: %s',
49
+ 'Terminator parser: %s',
50
+ ], getParserName(elementParser, 'anonymousElement'), getParserName(terminatorParser, 'anonymousTerminator'));
51
+ }
52
+ catch (error) {
53
+ if (!(isParserParsingFailedError(error))) {
54
+ throw error;
55
+ }
56
+ }
57
+ finally {
58
+ elementParserContext.dispose();
59
+ }
60
+ terminatorParserContext.unlookahead();
61
+ return [elements, terminatorValue];
62
+ }
63
+ catch (error) {
64
+ if (!(isParserParsingFailedError(error))) {
65
+ throw error;
66
+ }
67
+ }
68
+ finally {
69
+ terminatorParserContext.dispose();
70
+ }
71
+ const element = await elementParser(parserContext);
72
+ elements.push(element);
73
+ }
74
+ };
75
+ setParserName(terminatedArrayParser, `${getParserName(elementParser, 'anonymousElement')}*?${getParserName(terminatorParser, 'anonymousTerminator')}`);
76
+ return terminatedArrayParser;
77
+ };
78
+ export const createTerminatedArrayParserUnsafe = (elementParser, terminatorParser) => {
79
+ const terminatedArrayParserUnsafe = async (parserContext) => {
80
+ const elements = [];
81
+ while (true) {
82
+ const terminatorParserContext = parserContext.lookahead({
83
+ debugName: getParserName(terminatorParser, 'anonymousTerminator'),
84
+ });
85
+ try {
86
+ const terminatorValue = await terminatorParser(terminatorParserContext);
87
+ terminatorParserContext.unlookahead();
88
+ return [elements, terminatorValue];
89
+ }
90
+ catch (error) {
91
+ if (!(isParserParsingFailedError(error))) {
92
+ throw error;
93
+ }
94
+ }
95
+ finally {
96
+ terminatorParserContext.dispose();
97
+ }
98
+ const element = await elementParser(parserContext);
99
+ elements.push(element);
100
+ }
101
+ };
102
+ setParserName(terminatedArrayParserUnsafe, `${getParserName(elementParser, 'anonymousElement')}*?${getParserName(terminatorParser, 'anonymousTerminator')}`);
103
+ return terminatedArrayParserUnsafe;
27
104
  };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,131 @@
1
+ import test from 'ava';
2
+ import * as fc from 'fast-check';
3
+ import { testProp } from '@fast-check/ava';
4
+ import { createTerminatedArrayParser, createTerminatedArrayParserNaive, createTerminatedArrayParserUnsafe } from './terminatedArrayParser.js';
5
+ import { runParser } from './parser.js';
6
+ import { stringParserInputCompanion, uint8ArrayParserInputCompanion } from './parserInputCompanion.js';
7
+ import { HighResolutionTotalTimer } from './highResolutionTimer.js';
8
+ import { createElementParser } from './elementParser.js';
9
+ import { createExactSequenceParser } from './exactSequenceParser.js';
10
+ import { createTupleParser } from './tupleParser.js';
11
+ import { createNegativeLookaheadParser } from './negativeLookaheadParser.js';
12
+ import { promiseCompose } from './promiseCompose.js';
13
+ import { createUnionParser } from './unionParser.js';
14
+ import { createExactElementParser } from './exactElementParser.js';
15
+ test('terminatedArrayParser of union parsers', async (t) => {
16
+ const parser = createTerminatedArrayParser(createUnionParser([
17
+ createExactElementParser(1),
18
+ createExactElementParser(2),
19
+ ]), createExactElementParser(0));
20
+ const input = new Uint8Array([0]);
21
+ const result = await runParser(parser, input, uint8ArrayParserInputCompanion);
22
+ t.deepEqual(result, [[], 0]);
23
+ });
24
+ testProp('terminatedArrayParser both terminator and element matching', [
25
+ fc.string(),
26
+ ], async (t, string) => {
27
+ const terminatedArrayParserNaive = createTerminatedArrayParserNaive(createExactSequenceParser(string), createExactSequenceParser(string));
28
+ const terminatedArrayParser = createTerminatedArrayParser(createExactSequenceParser(string), createExactSequenceParser(string));
29
+ const [naiveResult, result,] = await Promise.allSettled([
30
+ runParser(terminatedArrayParserNaive, string, stringParserInputCompanion),
31
+ runParser(terminatedArrayParser, string, stringParserInputCompanion),
32
+ ]);
33
+ t.is(naiveResult.status, 'rejected');
34
+ if (result.status === 'rejected'
35
+ && naiveResult.status === 'rejected') {
36
+ result.reason.message = 'REDACTED';
37
+ naiveResult.reason.message = 'REDACTED';
38
+ }
39
+ t.deepEqual(result, naiveResult);
40
+ }, {
41
+ verbose: true,
42
+ });
43
+ const naiveTotalTimer = new HighResolutionTotalTimer();
44
+ const optimizedTotalTimer = new HighResolutionTotalTimer();
45
+ const unsafeTotalTimer = new HighResolutionTotalTimer();
46
+ testProp.serial('terminatedArrayParser', [
47
+ fc
48
+ .integer({
49
+ min: 1,
50
+ max: 2 ** 8,
51
+ })
52
+ .chain(terminatorLength => (fc
53
+ .string({
54
+ minLength: terminatorLength,
55
+ })
56
+ .map(string => ({
57
+ string,
58
+ terminator: string.slice(0 - terminatorLength),
59
+ }))
60
+ .filter(({ string, terminator }) => string.split(terminator).length === 2))),
61
+ ], async (t, { string, terminator }) => {
62
+ const terminatedArrayParserNaive = createTerminatedArrayParserNaive(promiseCompose(createTupleParser([
63
+ createNegativeLookaheadParser(createExactSequenceParser(terminator)),
64
+ createElementParser(),
65
+ ]), ([_, element]) => element), createExactSequenceParser(terminator));
66
+ const terminatedArrayParser = createTerminatedArrayParser(promiseCompose(createTupleParser([
67
+ createNegativeLookaheadParser(createExactSequenceParser(terminator)),
68
+ createElementParser(),
69
+ ]), ([_, element]) => element), createExactSequenceParser(terminator));
70
+ const createTestWrapperParser = (innerParser) => async (parserContext) => {
71
+ const [characters, terminator] = await innerParser(parserContext);
72
+ return {
73
+ string: characters.join(''),
74
+ terminator,
75
+ nextPeek: await parserContext.peek(0),
76
+ position: parserContext.position,
77
+ };
78
+ };
79
+ const actualNaive = await naiveTotalTimer.measureAsync(async () => runParser(createTestWrapperParser(terminatedArrayParserNaive), string, stringParserInputCompanion));
80
+ t.is(actualNaive.string.length + actualNaive.terminator.length, string.length);
81
+ const actual = await optimizedTotalTimer.measureAsync(async () => runParser(createTestWrapperParser(terminatedArrayParser), string, stringParserInputCompanion));
82
+ t.deepEqual(actual, actualNaive);
83
+ }, {
84
+ verbose: true,
85
+ });
86
+ test.serial('terminatedArrayParser performance', t => {
87
+ t.true(optimizedTotalTimer.time * 1n < naiveTotalTimer.time, `Naive: ${naiveTotalTimer.time / 1000000n}ms, Optimized: ${optimizedTotalTimer.time / 1000000n}ms`);
88
+ });
89
+ testProp.serial('terminatedArrayParserUnsafe', [
90
+ fc
91
+ .integer({
92
+ min: 1,
93
+ max: 2 ** 8,
94
+ })
95
+ .chain(terminatorLength => (fc
96
+ .string({
97
+ minLength: terminatorLength,
98
+ })
99
+ .map(string => ({
100
+ string,
101
+ terminator: string.slice(0 - terminatorLength),
102
+ }))
103
+ .filter(({ string, terminator }) => string.split(terminator).length === 2))),
104
+ ], async (t, { string, terminator }) => {
105
+ const terminatedArrayParserNaive = createTerminatedArrayParserNaive(promiseCompose(createTupleParser([
106
+ createNegativeLookaheadParser(createExactSequenceParser(terminator)),
107
+ createElementParser(),
108
+ ]), ([_, element]) => element), createExactSequenceParser(terminator));
109
+ const terminatedArrayParserUnsafe = createTerminatedArrayParserUnsafe(promiseCompose(createTupleParser([
110
+ createNegativeLookaheadParser(createExactSequenceParser(terminator)),
111
+ createElementParser(),
112
+ ]), ([_, element]) => element), createExactSequenceParser(terminator));
113
+ const createTestWrapperParser = (innerParser) => async (parserContext) => {
114
+ const [characters, terminator] = await innerParser(parserContext);
115
+ return {
116
+ string: characters.join(''),
117
+ terminator,
118
+ nextPeek: await parserContext.peek(0),
119
+ position: parserContext.position,
120
+ };
121
+ };
122
+ const actualNaive = await runParser(createTestWrapperParser(terminatedArrayParserNaive), string, stringParserInputCompanion);
123
+ t.is(actualNaive.string.length + actualNaive.terminator.length, string.length);
124
+ const actual = await unsafeTotalTimer.measureAsync(async () => runParser(createTestWrapperParser(terminatedArrayParserUnsafe), string, stringParserInputCompanion));
125
+ t.deepEqual(actual, actualNaive);
126
+ }, {
127
+ verbose: true,
128
+ });
129
+ test.serial('terminatedArrayParserUnsafe performance', t => {
130
+ t.true(unsafeTotalTimer.time * 1n < naiveTotalTimer.time, `Naive: ${naiveTotalTimer.time / 1000000n}ms, Unsafe: ${unsafeTotalTimer.time / 1000000n}ms`);
131
+ });
@@ -0,0 +1 @@
1
+ export declare function toAsyncIterable<T>(value: AsyncIterator<T>): AsyncIterable<T>;
@@ -0,0 +1,7 @@
1
+ export function toAsyncIterable(value) {
2
+ return {
3
+ [Symbol.asyncIterator]() {
4
+ return value;
5
+ },
6
+ };
7
+ }
@@ -0,0 +1 @@
1
+ export declare function toAsyncIterator<T>(value: AsyncIterator<T> | AsyncIterable<T> | Iterable<T> | T): AsyncIterator<T>;