@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,61 +1,106 @@
1
- export class ParserError extends Error {
2
- name = 'ParserError';
1
+ import { NormalLazyMessageError, NoStackCaptureOverheadLazyMessageError } from './lazyMessageError.js';
2
+ export function isParserError(value) {
3
+ return (typeof value === 'object'
4
+ && value !== null
5
+ && value instanceof Error
6
+ && 'position' in value
7
+ && (typeof value.position === 'number' || value.position === undefined)
8
+ && 'inputReaderSate' in value
9
+ && (value.inputReaderSate === undefined || typeof value.inputReaderSate === 'object'));
3
10
  }
4
- export class ParserImplementationError extends ParserError {
5
- name = 'ParserImplementationError';
11
+ export function isParserParsingFailedError(value) {
12
+ return (typeof value === 'object'
13
+ && value !== null
14
+ && value instanceof Error
15
+ && 'depth' in value
16
+ && typeof value.depth === 'number'
17
+ && 'position' in value
18
+ && typeof value.position === 'number');
6
19
  }
7
- export class ParserImplementationInvariantError extends ParserImplementationError {
8
- name = 'ParserImplementationInvariantError';
20
+ export function isParserParsingJoinError(value) {
21
+ return (typeof value === 'object'
22
+ && value !== null
23
+ && value instanceof Error
24
+ && 'childErrors' in value
25
+ && Array.isArray(value.childErrors)
26
+ && value.childErrors.every((childError) => isParserParsingFailedError(childError)));
9
27
  }
10
- export class ParserParsingFailedError extends ParserError {
11
- depth;
12
- position;
13
- name = 'ParserParsingFailedError';
14
- constructor(message, depth, position) {
15
- super([
16
- '(position: ',
17
- position,
18
- ') ',
19
- message,
20
- ].join(''));
21
- this.depth = depth;
22
- this.position = position;
28
+ function createParserErrorModule(BaseLazyMessageError) {
29
+ class ParserError extends BaseLazyMessageError {
30
+ name = 'ParserError';
31
+ position = undefined;
32
+ inputReaderSate = undefined;
23
33
  }
24
- }
25
- export class ParserParsingJoinError extends ParserParsingFailedError {
26
- name = 'ParserParsingJoinError';
27
- childErrors = [];
28
- }
29
- export class ParserParsingJoinNoneError extends ParserParsingJoinError {
30
- name = 'ParserParsingJoinNoneError';
31
- }
32
- export class ParserParsingJoinAllError extends ParserParsingJoinError {
33
- childErrors;
34
- name = 'ParserParsingJoinAllError';
35
- constructor(message, depth, position, childErrors) {
36
- super(message, depth, position);
37
- this.childErrors = childErrors;
34
+ class ParserImplementationError extends ParserError {
35
+ name = 'ParserImplementationError';
38
36
  }
39
- }
40
- export class ParserParsingJoinDeepestError extends ParserParsingJoinError {
41
- childErrors;
42
- name = 'ParserParsingJoinDeepestError';
43
- constructor(message, depth, position, childErrors) {
44
- super(message, depth, position);
45
- this.childErrors = childErrors;
37
+ class ParserImplementationInvariantError extends ParserImplementationError {
38
+ name = 'ParserImplementationInvariantError';
46
39
  }
47
- }
48
- export class ParserParsingJoinFurthestError extends ParserParsingJoinError {
49
- childErrors;
50
- name = 'ParserParsingJoinFurthestError';
51
- constructor(message, depth, position, childErrors) {
52
- super(message, depth, position);
53
- this.childErrors = childErrors;
40
+ class ParserParsingFailedError extends ParserError {
41
+ depth;
42
+ position;
43
+ name = 'ParserParsingFailedError';
44
+ constructor(message, depth, position) {
45
+ super(message);
46
+ this.depth = depth;
47
+ this.position = position;
48
+ }
54
49
  }
50
+ class ParserParsingJoinError extends ParserParsingFailedError {
51
+ name = 'ParserParsingJoinError';
52
+ childErrors = [];
53
+ }
54
+ class ParserParsingJoinNoneError extends ParserParsingJoinError {
55
+ name = 'ParserParsingJoinNoneError';
56
+ }
57
+ class ParserParsingJoinAllError extends ParserParsingJoinError {
58
+ childErrors;
59
+ name = 'ParserParsingJoinAllError';
60
+ constructor(message, depth, position, childErrors) {
61
+ super(message, depth, position);
62
+ this.childErrors = childErrors;
63
+ }
64
+ }
65
+ class ParserParsingJoinDeepestError extends ParserParsingJoinError {
66
+ childErrors;
67
+ name = 'ParserParsingJoinDeepestError';
68
+ constructor(message, depth, position, childErrors) {
69
+ super(message, depth, position);
70
+ this.childErrors = childErrors;
71
+ }
72
+ }
73
+ class ParserParsingJoinFurthestError extends ParserParsingJoinError {
74
+ childErrors;
75
+ name = 'ParserParsingJoinFurthestError';
76
+ constructor(message, depth, position, childErrors) {
77
+ super(message, depth, position);
78
+ this.childErrors = childErrors;
79
+ }
80
+ }
81
+ class ParserParsingInvariantError extends ParserParsingFailedError {
82
+ name = 'ParserParsingInvariantError';
83
+ }
84
+ class ParserUnexpectedEndOfInputError extends ParserParsingFailedError {
85
+ name = 'ParserUnexpectedEndOfInputError';
86
+ }
87
+ class ParserUnexpectedRemainingInputError extends ParserParsingFailedError {
88
+ name = 'ParserUnexpectedRemainingInputError';
89
+ }
90
+ return {
91
+ ParserError,
92
+ ParserImplementationError,
93
+ ParserImplementationInvariantError,
94
+ ParserParsingFailedError,
95
+ ParserParsingJoinError,
96
+ ParserParsingJoinNoneError,
97
+ ParserParsingJoinAllError,
98
+ ParserParsingJoinDeepestError,
99
+ ParserParsingJoinFurthestError,
100
+ ParserParsingInvariantError,
101
+ ParserUnexpectedEndOfInputError,
102
+ ParserUnexpectedRemainingInputError,
103
+ };
55
104
  }
56
- export class ParserParsingInvariantError extends ParserParsingFailedError {
57
- name = 'ParserParsingInvariantError';
58
- }
59
- export class ParserUnexpectedEndOfInputError extends ParserParsingFailedError {
60
- name = 'ParserUnexpectedEndOfInputError';
61
- }
105
+ export const normalParserErrorModule = createParserErrorModule(NormalLazyMessageError);
106
+ export const noStackCaptureOverheadParserErrorModule = createParserErrorModule(NoStackCaptureOverheadLazyMessageError);
@@ -1,2 +1,2 @@
1
1
  import { type Falsy, type ValueOrAccessor } from './customInvariant.js';
2
- export declare function parserImplementationInvariant<T>(value: T, format: ValueOrAccessor<string | string[]>, ...formatArguments: any[]): Exclude<T, Falsy>;
2
+ export declare function parserImplementationInvariant<T>(value: T, format: ValueOrAccessor<string | string[]>, ...formatArguments: unknown[]): Exclude<T, Falsy>;
@@ -1,5 +1,5 @@
1
- import { ParserImplementationInvariantError } from './parserError.js';
2
1
  import { customInvariant } from './customInvariant.js';
2
+ import { normalParserErrorModule } from './parserError.js';
3
3
  export function parserImplementationInvariant(value, format, ...formatArguments) {
4
- return customInvariant(ParserImplementationInvariantError, value, format, ...formatArguments);
4
+ return customInvariant(normalParserErrorModule.ParserImplementationInvariantError, value, format, ...formatArguments);
5
5
  }
@@ -1,20 +1,35 @@
1
1
  export type ParserInputCompanion<Sequence, Element> = {
2
2
  is(value: unknown): value is Sequence;
3
3
  from(elements: Element[]): Sequence;
4
+ concat(sequences: Sequence[]): Sequence;
4
5
  length(sequence: Sequence): number;
5
6
  at(sequence: Sequence, index: number): Element | undefined;
7
+ subsequence(sequence: Sequence, start: number, end: number): Sequence;
8
+ indexOf(sequence: Sequence, element: Element, fromIndex?: number): number;
9
+ indexOfSubsequence(sequence: Sequence, subsequence: Sequence, fromIndex?: number): number;
10
+ equals(sequenceA: Sequence, sequenceB: Sequence): boolean;
6
11
  };
7
12
  export declare class StringParserInputCompanion implements ParserInputCompanion<string, string> {
8
13
  is(value: unknown): value is string;
9
14
  from(elements: string[]): string;
15
+ concat(sequences: string[]): string;
10
16
  length(sequence: string): number;
11
17
  at(sequence: string, index: number): string | undefined;
18
+ subsequence(sequence: string, start: number, end: number): string;
19
+ indexOf(sequence: string, element: string, fromIndex?: number): number;
20
+ indexOfSubsequence(sequence: string, subsequence: string, fromIndex?: number): number;
21
+ equals(sequenceA: string, sequenceB: string): boolean;
12
22
  }
13
23
  export declare const stringParserInputCompanion: StringParserInputCompanion;
14
24
  export declare class Uint8ArrayParserInputCompanion implements ParserInputCompanion<Uint8Array, number> {
15
25
  is(value: unknown): value is Uint8Array;
16
26
  from(elements: number[]): Uint8Array;
27
+ concat(sequences: Uint8Array[]): Uint8Array;
17
28
  length(sequence: Uint8Array): number;
18
29
  at(sequence: Uint8Array, index: number): number | undefined;
30
+ subsequence(sequence: Uint8Array, start: number, end: number): Uint8Array;
31
+ indexOf(sequence: Uint8Array, element: number, fromIndex?: number): number;
32
+ indexOfSubsequence(sequence: Uint8Array, subsequence: Uint8Array, fromIndex?: number): number;
33
+ equals(sequenceA: Uint8Array, sequenceB: Uint8Array): boolean;
19
34
  }
20
35
  export declare const uint8ArrayParserInputCompanion: Uint8ArrayParserInputCompanion;
@@ -5,12 +5,27 @@ export class StringParserInputCompanion {
5
5
  from(elements) {
6
6
  return elements.join('');
7
7
  }
8
+ concat(sequences) {
9
+ return sequences.join('');
10
+ }
8
11
  length(sequence) {
9
12
  return sequence.length;
10
13
  }
11
14
  at(sequence, index) {
12
15
  return sequence.at(index);
13
16
  }
17
+ subsequence(sequence, start, end) {
18
+ return sequence.slice(start, end);
19
+ }
20
+ indexOf(sequence, element, fromIndex) {
21
+ return sequence.indexOf(element, fromIndex);
22
+ }
23
+ indexOfSubsequence(sequence, subsequence, fromIndex) {
24
+ return sequence.indexOf(subsequence, fromIndex);
25
+ }
26
+ equals(sequenceA, sequenceB) {
27
+ return sequenceA === sequenceB;
28
+ }
14
29
  }
15
30
  export const stringParserInputCompanion = new StringParserInputCompanion();
16
31
  export class Uint8ArrayParserInputCompanion {
@@ -20,11 +35,34 @@ export class Uint8ArrayParserInputCompanion {
20
35
  from(elements) {
21
36
  return new Uint8Array(elements);
22
37
  }
38
+ concat(sequences) {
39
+ return new Uint8Array(Buffer.concat(sequences));
40
+ }
23
41
  length(sequence) {
24
42
  return sequence.length;
25
43
  }
26
44
  at(sequence, index) {
27
45
  return sequence.at(index);
28
46
  }
47
+ subsequence(sequence, start, end) {
48
+ return sequence.subarray(start, end);
49
+ }
50
+ indexOf(sequence, element, fromIndex) {
51
+ return sequence.indexOf(element, fromIndex);
52
+ }
53
+ indexOfSubsequence(sequence, subsequence, fromIndex) {
54
+ return Buffer.from(sequence).indexOf(Buffer.from(subsequence), fromIndex);
55
+ }
56
+ equals(sequenceA, sequenceB) {
57
+ if (sequenceA.length !== sequenceB.length) {
58
+ return false;
59
+ }
60
+ for (const [index, element] of sequenceA.entries()) {
61
+ if (element !== sequenceB[index]) {
62
+ return false;
63
+ }
64
+ }
65
+ return true;
66
+ }
29
67
  }
30
68
  export const uint8ArrayParserInputCompanion = new Uint8ArrayParserInputCompanion();
@@ -1 +1 @@
1
- export declare function promiseCompose<A, B, C>(f1: (a: A) => Promise<B>, f2: (b: B) => C | Promise<C>): (a: A) => Promise<C>;
1
+ export declare function promiseCompose<A, B, C>(f1: (a: A) => B | Promise<B>, f2: (b: B) => C | Promise<C>): (a: A) => C | Promise<C>;
@@ -1,3 +1,13 @@
1
1
  export function promiseCompose(f1, f2) {
2
- return async (a) => f1(a).then(f2);
2
+ async function promiseComposed(a) {
3
+ const bOrBPromise = f1(a);
4
+ if (bOrBPromise instanceof Promise) {
5
+ return bOrBPromise.then(f2);
6
+ }
7
+ return f2(bOrBPromise);
8
+ }
9
+ Object.defineProperty(promiseComposed, 'name', {
10
+ value: `promiseCompose(${f1.name}, ${f2.name})`,
11
+ });
12
+ return promiseComposed;
3
13
  }
@@ -0,0 +1 @@
1
+ export declare function promiseSettled<T>(promise: Promise<T>): Promise<PromiseSettledResult<T>>;
@@ -0,0 +1,4 @@
1
+ export async function promiseSettled(promise) {
2
+ const [promiseSettledResult] = await Promise.allSettled([promise]);
3
+ return promiseSettledResult;
4
+ }
@@ -0,0 +1,2 @@
1
+ import { type Parser } from './parser.js';
2
+ export declare const createSeparatedArrayParser: <ElementOutput, Sequence>(elementParser: Parser<ElementOutput, Sequence>, separatorParser: Parser<unknown, Sequence>) => Parser<ElementOutput[], Sequence>;
@@ -0,0 +1,39 @@
1
+ import { getParserName, setParserName } from './parser.js';
2
+ import { isParserParsingFailedError } from './parserError.js';
3
+ import { promiseCompose } from './promiseCompose.js';
4
+ import { createTupleParser } from './tupleParser.js';
5
+ export const createSeparatedArrayParser = (elementParser, separatorParser) => {
6
+ const separatorThenElementParser = promiseCompose(createTupleParser([
7
+ separatorParser,
8
+ elementParser,
9
+ ]), ([, element]) => element);
10
+ const separatedArrayParser = async (parserContext) => {
11
+ let parser = elementParser;
12
+ const elements = [];
13
+ while (true) {
14
+ const elementParserContext = parserContext.lookahead();
15
+ const initialPosition = elementParserContext.position;
16
+ try {
17
+ const element = await parser(elementParserContext);
18
+ if (elementParserContext.position === initialPosition) {
19
+ break;
20
+ }
21
+ elements.push(element);
22
+ elementParserContext.unlookahead();
23
+ }
24
+ catch (error) {
25
+ if (isParserParsingFailedError(error)) {
26
+ break;
27
+ }
28
+ throw error;
29
+ }
30
+ finally {
31
+ elementParserContext.dispose();
32
+ }
33
+ parser = separatorThenElementParser;
34
+ }
35
+ return elements;
36
+ };
37
+ setParserName(separatedArrayParser, getParserName(elementParser, 'anonymousSeparatedArrayChild') + '*');
38
+ return separatedArrayParser;
39
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,21 @@
1
+ import test from 'ava';
2
+ import { testProp, fc } from '@fast-check/ava';
3
+ import { createSeparatedArrayParser } from './separatedArrayParser.js';
4
+ import { runParser, runParserWithRemainingInput } from './parser.js';
5
+ import { stringParserInputCompanion } from './parserInputCompanion.js';
6
+ import { createExactSequenceParser } from './exactSequenceParser.js';
7
+ test('does not loop forever with a child parser that does not consume anything', async (t) => {
8
+ const parser = createSeparatedArrayParser(async () => undefined, () => undefined);
9
+ const { output } = await runParserWithRemainingInput(parser, 'foo', stringParserInputCompanion);
10
+ t.deepEqual(output, []);
11
+ });
12
+ testProp('separatedArray', [
13
+ fc.array(fc.constant('element')),
14
+ ], async (t, elements) => {
15
+ const separatedArrayParser = createSeparatedArrayParser(createExactSequenceParser('element'), createExactSequenceParser('separator'));
16
+ const actual = await runParser(separatedArrayParser, elements.join('separator'), stringParserInputCompanion);
17
+ const expected = elements;
18
+ t.deepEqual(actual, expected);
19
+ }, {
20
+ verbose: true,
21
+ });
@@ -0,0 +1,2 @@
1
+ import { type Parser } from './parser.js';
2
+ export declare const createSeparatedNonEmptyArrayParser: <ElementOutput, Sequence>(elementParser: Parser<ElementOutput, Sequence>, separatorParser: Parser<unknown, Sequence>) => Parser<ElementOutput[], Sequence>;
@@ -0,0 +1,40 @@
1
+ import { getParserName, setParserName } from './parser.js';
2
+ import { isParserParsingFailedError } from './parserError.js';
3
+ import { promiseCompose } from './promiseCompose.js';
4
+ import { createTupleParser } from './tupleParser.js';
5
+ export const createSeparatedNonEmptyArrayParser = (elementParser, separatorParser) => {
6
+ const separatorThenElementParser = promiseCompose(createTupleParser([
7
+ separatorParser,
8
+ elementParser,
9
+ ]), ([, element]) => element);
10
+ const separatedNonEmptyArrayParser = async (parserContext) => {
11
+ let parser = elementParser;
12
+ const elements = [];
13
+ while (true) {
14
+ const elementParserContext = parserContext.lookahead();
15
+ const initialPosition = elementParserContext.position;
16
+ try {
17
+ const element = await parser(elementParserContext);
18
+ if (elementParserContext.position === initialPosition) {
19
+ break;
20
+ }
21
+ elements.push(element);
22
+ elementParserContext.unlookahead();
23
+ }
24
+ catch (error) {
25
+ if (isParserParsingFailedError(error)) {
26
+ break;
27
+ }
28
+ throw error;
29
+ }
30
+ finally {
31
+ elementParserContext.dispose();
32
+ }
33
+ parser = separatorThenElementParser;
34
+ }
35
+ parserContext.invariant(elements.length > 0, 'Expected elementParser (%s) to match at least once', getParserName(elementParser, 'anonymousSeparatedNonEmptyArrayChild'));
36
+ return elements;
37
+ };
38
+ setParserName(separatedNonEmptyArrayParser, getParserName(elementParser, 'anonymousSeparatedNonEmptyArrayChild') + '+');
39
+ return separatedNonEmptyArrayParser;
40
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,66 @@
1
+ import test from 'ava';
2
+ import { testProp, fc } from '@fast-check/ava';
3
+ import { createSeparatedNonEmptyArrayParser } from './separatedNonEmptyArrayParser.js';
4
+ import { runParser, runParserWithRemainingInput } from './parser.js';
5
+ import { stringParserInputCompanion } from './parserInputCompanion.js';
6
+ import { createExactSequenceParser } from './exactSequenceParser.js';
7
+ import { stringFromAsyncIterable } from './stringFromAsyncIterable.js';
8
+ test('empty input throws error', async (t) => {
9
+ const parser = createSeparatedNonEmptyArrayParser(createExactSequenceParser('element'), createExactSequenceParser(','));
10
+ await t.throwsAsync(async () => runParser(parser, '', stringParserInputCompanion), {
11
+ any: true,
12
+ message: /Expected .* to match at least once/,
13
+ });
14
+ });
15
+ test('single element without separator matches', async (t) => {
16
+ const parser = createSeparatedNonEmptyArrayParser(createExactSequenceParser('element'), createExactSequenceParser(','));
17
+ const result = await runParser(parser, 'element', stringParserInputCompanion);
18
+ t.deepEqual(result, ['element']);
19
+ });
20
+ test('two elements with separator matches', async (t) => {
21
+ const parser = createSeparatedNonEmptyArrayParser(createExactSequenceParser('element'), createExactSequenceParser(','));
22
+ const result = await runParser(parser, 'element,element', stringParserInputCompanion);
23
+ t.deepEqual(result, ['element', 'element']);
24
+ });
25
+ test('multiple elements with separator matches', async (t) => {
26
+ const parser = createSeparatedNonEmptyArrayParser(createExactSequenceParser('a'), createExactSequenceParser(','));
27
+ const result = await runParser(parser, 'a,a,a,a', stringParserInputCompanion);
28
+ t.deepEqual(result, ['a', 'a', 'a', 'a']);
29
+ });
30
+ test('does not consume trailing separator', async (t) => {
31
+ const parser = createSeparatedNonEmptyArrayParser(createExactSequenceParser('element'), createExactSequenceParser(','));
32
+ const { output, remainingInput } = await runParserWithRemainingInput(parser, 'element,element,', stringParserInputCompanion);
33
+ t.deepEqual(output, ['element', 'element']);
34
+ t.is(await stringFromAsyncIterable(remainingInput), ',');
35
+ });
36
+ test('does not loop forever with a child parser that does not consume anything', async (t) => {
37
+ const parser = createSeparatedNonEmptyArrayParser(async () => undefined, () => undefined);
38
+ await t.throwsAsync(async () => runParser(parser, 'foo', stringParserInputCompanion), {
39
+ any: true,
40
+ message: /Expected .* to match at least once/,
41
+ });
42
+ });
43
+ test('partial match throws error', async (t) => {
44
+ const parser = createSeparatedNonEmptyArrayParser(createExactSequenceParser('element'), createExactSequenceParser(','));
45
+ await t.throwsAsync(async () => runParser(parser, 'elem', stringParserInputCompanion), {
46
+ any: true,
47
+ message: /Expected .* to match at least once/,
48
+ });
49
+ });
50
+ testProp('separatedNonEmptyArray with at least one element', [
51
+ fc.array(fc.constant('element'), { minLength: 1 }),
52
+ ], async (t, elements) => {
53
+ const separatedNonEmptyArrayParser = createSeparatedNonEmptyArrayParser(createExactSequenceParser('element'), createExactSequenceParser('separator'));
54
+ const actual = await runParser(separatedNonEmptyArrayParser, elements.join('separator'), stringParserInputCompanion);
55
+ const expected = elements;
56
+ t.deepEqual(actual, expected);
57
+ }, {
58
+ verbose: true,
59
+ });
60
+ test('separatedNonEmptyArray throws on empty array', async (t) => {
61
+ const separatedNonEmptyArrayParser = createSeparatedNonEmptyArrayParser(createExactSequenceParser('element'), createExactSequenceParser('separator'));
62
+ await t.throwsAsync(async () => runParser(separatedNonEmptyArrayParser, '', stringParserInputCompanion), {
63
+ any: true,
64
+ message: /Expected .* to match at least once/,
65
+ });
66
+ });
@@ -1,15 +1,25 @@
1
1
  import { type ParserInputCompanion } from './parserInputCompanion.js';
2
+ export type SequenceBufferState<Sequence> = {
3
+ consumedBufferedSequences: Sequence[];
4
+ unconsumedBufferedSequences: Sequence[];
5
+ };
2
6
  export type SequenceBuffer<Sequence, Element> = {
3
7
  push(sequence: Sequence): void;
4
8
  peek(offset: number): Element | undefined;
9
+ peekSequence(start: number, end: number): Sequence | undefined;
5
10
  skip(offset: number): void;
11
+ toSequenceBufferState(): SequenceBufferState<Sequence>;
6
12
  };
7
13
  export declare class SequenceBufferImplementation<Sequence, Element> implements SequenceBuffer<Sequence, Element> {
8
14
  private readonly _parserInputCompanion;
9
15
  private readonly _sequences;
10
16
  private _indexInFirstSequence;
11
17
  constructor(_parserInputCompanion: ParserInputCompanion<Sequence, Element>);
18
+ get length(): number;
19
+ private _shift;
12
20
  push(sequence: Sequence): void;
13
21
  peek(offset: number): Element | undefined;
22
+ peekSequence(start: number, end: number): Sequence | undefined;
14
23
  skip(offset: number): void;
24
+ toSequenceBufferState(): SequenceBufferState<Sequence>;
15
25
  }
@@ -6,8 +6,10 @@ export class SequenceBufferImplementation {
6
6
  constructor(_parserInputCompanion) {
7
7
  this._parserInputCompanion = _parserInputCompanion;
8
8
  }
9
- push(sequence) {
10
- this._sequences.push(sequence);
9
+ get length() {
10
+ return this._sequences.reduce((sequenceLength, sequence) => sequenceLength + this._parserInputCompanion.length(sequence), 0 - this._indexInFirstSequence);
11
+ }
12
+ _shift() {
11
13
  while (this._sequences.length > 0) {
12
14
  const firstSequence = this._sequences[0];
13
15
  const firstSequenceLength = this._parserInputCompanion.length(firstSequence);
@@ -22,6 +24,10 @@ export class SequenceBufferImplementation {
22
24
  this._indexInFirstSequence -= firstSequenceLength;
23
25
  }
24
26
  }
27
+ push(sequence) {
28
+ this._sequences.push(sequence);
29
+ this._shift();
30
+ }
25
31
  peek(offset) {
26
32
  invariant(offset >= 0, 'Offset must be non-negative.');
27
33
  let index = this._indexInFirstSequence + offset;
@@ -34,7 +40,53 @@ export class SequenceBufferImplementation {
34
40
  }
35
41
  return undefined;
36
42
  }
43
+ peekSequence(start, end) {
44
+ invariant(start >= 0, 'Start must be non-negative.');
45
+ invariant(end >= start, 'End must be greater than or equal to start.');
46
+ let startIndex = this._indexInFirstSequence + start;
47
+ let endIndex = this._indexInFirstSequence + end;
48
+ const sequences = [];
49
+ for (const sequence of this._sequences) {
50
+ const sequenceLength = this._parserInputCompanion.length(sequence);
51
+ if (startIndex < sequenceLength) {
52
+ const subsequence = this._parserInputCompanion.subsequence(sequence, Math.max(0, startIndex), Math.min(sequenceLength, endIndex));
53
+ sequences.push(subsequence);
54
+ }
55
+ startIndex -= sequenceLength;
56
+ endIndex -= sequenceLength;
57
+ if (endIndex <= 0) {
58
+ break;
59
+ }
60
+ }
61
+ return endIndex > 0 ? undefined : this._parserInputCompanion.concat(sequences);
62
+ }
37
63
  skip(offset) {
38
64
  this._indexInFirstSequence += offset;
65
+ this._shift();
66
+ }
67
+ toSequenceBufferState() {
68
+ if (this._sequences.length === 0) {
69
+ return {
70
+ consumedBufferedSequences: [],
71
+ unconsumedBufferedSequences: [],
72
+ };
73
+ }
74
+ if (this._indexInFirstSequence === 0) {
75
+ return {
76
+ consumedBufferedSequences: [],
77
+ unconsumedBufferedSequences: [...this._sequences],
78
+ };
79
+ }
80
+ const firstSequence = this._sequences[0];
81
+ const firstSequenceLength = this._parserInputCompanion.length(firstSequence);
82
+ const consumedFirstSequence = this._parserInputCompanion.subsequence(firstSequence, 0, this._indexInFirstSequence);
83
+ const unconsumedFirstSequence = this._parserInputCompanion.subsequence(firstSequence, this._indexInFirstSequence, firstSequenceLength);
84
+ const unconsumedFirstSequenceLength = this._parserInputCompanion.length(unconsumedFirstSequence);
85
+ return {
86
+ consumedBufferedSequences: [consumedFirstSequence],
87
+ unconsumedBufferedSequences: (unconsumedFirstSequenceLength === 0
88
+ ? this._sequences.slice(1)
89
+ : [unconsumedFirstSequence, ...this._sequences.slice(1)]),
90
+ };
39
91
  }
40
92
  }