@futpib/parser 1.0.0 → 1.0.2

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 (380) hide show
  1. package/build/allSettledStream.js +32 -14
  2. package/build/allSettledStream.test.js +32 -0
  3. package/build/androidPackage.d.ts +39 -0
  4. package/build/androidPackageParser.d.ts +17 -0
  5. package/build/androidPackageParser.js +183 -0
  6. package/build/{apkParser.test.js → androidPackageParser.test.js} +7 -7
  7. package/build/androidPackageUnparser.d.ts +4 -0
  8. package/build/androidPackageUnparser.js +90 -0
  9. package/build/androidPackageUnparser.test.js +26 -0
  10. package/build/arbitrarilySlicedAsyncInterable.d.ts +3 -1
  11. package/build/arbitrarilySlicedAsyncInterable.js +3 -3
  12. package/build/arbitraryFileSystemEntry.js +1 -1
  13. package/build/arbitraryZip.d.ts +1 -1
  14. package/build/arbitraryZip.js +13 -19
  15. package/build/arbitraryZipPermissions.d.ts +1 -8
  16. package/build/arbitraryZipPermissions.js +1 -16
  17. package/build/arbitraryZipStream.d.ts +1 -1
  18. package/build/arbitraryZipStream.js +3 -3
  19. package/build/arrayParser.d.ts +1 -1
  20. package/build/arrayParser.js +2 -2
  21. package/build/arrayParser.test.js +4 -4
  22. package/build/arrayUnparser.d.ts +2 -0
  23. package/build/arrayUnparser.js +8 -0
  24. package/build/backsmali.d.ts +1 -0
  25. package/build/backsmali.js +22 -0
  26. package/build/bsonParser.js +6 -2
  27. package/build/bsonParser.test.js +2 -2
  28. package/build/{parserInvariant.d.ts → customInvariant.d.ts} +1 -1
  29. package/build/{parserInvariant.js → customInvariant.js} +1 -1
  30. package/build/dalvikBytecodeParser/formatParsers.d.ts +97 -0
  31. package/build/dalvikBytecodeParser/formatParsers.js +169 -0
  32. package/build/dalvikBytecodeParser.d.ts +107 -0
  33. package/build/dalvikBytecodeParser.js +836 -0
  34. package/build/dalvikExecutable.d.ts +158 -0
  35. package/build/dalvikExecutable.js +20 -0
  36. package/build/dalvikExecutableParser/stringSyntaxParser.d.ts +4 -0
  37. package/build/dalvikExecutableParser/stringSyntaxParser.js +76 -0
  38. package/build/dalvikExecutableParser/typeParsers.d.ts +10 -0
  39. package/build/dalvikExecutableParser/typeParsers.js +34 -0
  40. package/build/dalvikExecutableParser/typedNumbers.d.ts +90 -0
  41. package/build/dalvikExecutableParser/typedNumbers.js +19 -0
  42. package/build/dalvikExecutableParser.d.ts +5 -0
  43. package/build/dalvikExecutableParser.js +1439 -0
  44. package/build/dalvikExecutableParser.test.js +70 -0
  45. package/build/dalvikExecutableParserAgainstSmaliParser.test.js +298 -0
  46. package/build/debugLogInputParser.d.ts +4 -0
  47. package/build/debugLogInputParser.js +16 -0
  48. package/build/debugLogParser.d.ts +1 -1
  49. package/build/debugLogParser.js +15 -4
  50. package/build/disjunctionParser.d.ts +2 -1
  51. package/build/disjunctionParser.js +4 -2
  52. package/build/elementParser.d.ts +2 -2
  53. package/build/elementParser.js +1 -1
  54. package/build/elementTerminatedArrayParser.d.ts +3 -0
  55. package/build/elementTerminatedArrayParser.js +18 -0
  56. package/build/elementTerminatedArrayParser.test.js +52 -0
  57. package/build/elementTerminatedSequenceArrayParser.d.ts +3 -0
  58. package/build/elementTerminatedSequenceArrayParser.js +32 -0
  59. package/build/elementTerminatedSequenceArrayParser.test.js +34 -0
  60. package/build/elementTerminatedSequenceParser.d.ts +3 -0
  61. package/build/elementTerminatedSequenceParser.js +27 -0
  62. package/build/elementTerminatedSequenceParser.test.js +34 -0
  63. package/build/endOfInputParser.d.ts +2 -2
  64. package/build/exactElementParser.d.ts +1 -1
  65. package/build/exactElementParser.js +10 -5
  66. package/build/exactSequenceParser.d.ts +2 -1
  67. package/build/exactSequenceParser.js +12 -2
  68. package/build/fetchCid.d.ts +1 -0
  69. package/build/fetchCid.js +107 -0
  70. package/build/fixedLengthSequenceParser.d.ts +1 -0
  71. package/build/fixedLengthSequenceParser.js +18 -1
  72. package/build/fixedLengthSequenceParser.test.js +41 -0
  73. package/build/hasExecutable.d.ts +1 -0
  74. package/build/hasExecutable.js +8 -0
  75. package/build/highResolutionTimer.d.ts +16 -0
  76. package/build/highResolutionTimer.js +42 -0
  77. package/build/index.d.ts +5 -2
  78. package/build/index.js +3 -0
  79. package/build/inputReader.d.ts +14 -3
  80. package/build/inputReader.js +43 -6
  81. package/build/inputReader.test.js +172 -7
  82. package/build/inputReaderState.d.ts +10 -0
  83. package/build/inputReaderState.js +16 -0
  84. package/build/inspect.d.ts +1 -0
  85. package/build/inspect.js +7 -0
  86. package/build/javaKeyStoreParser.d.ts +2 -0
  87. package/build/javaKeyStoreParser.js +67 -0
  88. package/build/javaKeyStoreParser.test.d.ts +1 -0
  89. package/build/javaKeyStoreParser.test.js +16 -0
  90. package/build/jsonParser.d.ts +2 -0
  91. package/build/jsonParser.js +13 -15
  92. package/build/jsonParser.test.js +2 -2
  93. package/build/leb128Parser.d.ts +7 -0
  94. package/build/leb128Parser.js +82 -0
  95. package/build/leb128Parser.test.d.ts +1 -0
  96. package/build/leb128Parser.test.js +107 -0
  97. package/build/listParser.d.ts +1 -1
  98. package/build/listParser.js +5 -5
  99. package/build/lookaheadParser.d.ts +2 -0
  100. package/build/lookaheadParser.js +14 -0
  101. package/build/{negativeLookahead.d.ts → negativeLookaheadParser.d.ts} +1 -1
  102. package/build/negativeLookaheadParser.js +24 -0
  103. package/build/negativeLookaheadParser.test.d.ts +1 -0
  104. package/build/negativeLookaheadParser.test.js +30 -0
  105. package/build/nonEmptyArrayParser.d.ts +2 -0
  106. package/build/nonEmptyArrayParser.js +32 -0
  107. package/build/nonEmptyArrayParser.test.d.ts +1 -0
  108. package/build/nonEmptyArrayParser.test.js +16 -0
  109. package/build/optionalParser.d.ts +1 -1
  110. package/build/optionalParser.js +2 -2
  111. package/build/parser.d.ts +13 -4
  112. package/build/parser.js +67 -32
  113. package/build/parser.test.js +94 -27
  114. package/build/parserAccessorParser.d.ts +1 -1
  115. package/build/parserAccessorParser.js +9 -1
  116. package/build/parserConsumedSequenceParser.d.ts +2 -0
  117. package/build/parserConsumedSequenceParser.js +22 -0
  118. package/build/parserContext.d.ts +20 -6
  119. package/build/parserContext.js +70 -40
  120. package/build/parserContext.test.js +34 -7
  121. package/build/parserCreatorCompose.d.ts +4 -3
  122. package/build/parserCreatorCompose.js +9 -3
  123. package/build/parserError.d.ts +6 -0
  124. package/build/parserError.js +6 -6
  125. package/build/parserImplementationInvariant.d.ts +1 -1
  126. package/build/parserImplementationInvariant.js +2 -2
  127. package/build/parserInputCompanion.d.ts +35 -0
  128. package/build/parserInputCompanion.js +68 -0
  129. package/build/promiseCompose.d.ts +1 -1
  130. package/build/promiseCompose.js +12 -1
  131. package/build/promiseSettled.d.ts +1 -0
  132. package/build/promiseSettled.js +4 -0
  133. package/build/quantifierParser.d.ts +2 -0
  134. package/build/quantifierParser.js +17 -0
  135. package/build/separatedArrayParser.d.ts +2 -0
  136. package/build/separatedArrayParser.js +39 -0
  137. package/build/separatedArrayParser.test.d.ts +1 -0
  138. package/build/separatedArrayParser.test.js +21 -0
  139. package/build/sequenceBuffer.d.ts +13 -3
  140. package/build/sequenceBuffer.js +60 -8
  141. package/build/sequenceBuffer.test.js +59 -2
  142. package/build/sequenceTerminatedSequenceParser.d.ts +5 -0
  143. package/build/sequenceTerminatedSequenceParser.js +32 -0
  144. package/build/sequenceTerminatedSequenceParser.test.d.ts +1 -0
  145. package/build/sequenceTerminatedSequenceParser.test.js +37 -0
  146. package/build/sequenceUnparser.d.ts +2 -0
  147. package/build/sequenceUnparser.js +6 -0
  148. package/build/skipParser.d.ts +1 -1
  149. package/build/skipParser.js +4 -2
  150. package/build/skipToParser.d.ts +2 -0
  151. package/build/skipToParser.js +11 -0
  152. package/build/sliceBoundedParser.d.ts +2 -2
  153. package/build/sliceBoundedParser.js +8 -3
  154. package/build/sliceBoundedParser.test.js +37 -3
  155. package/build/smali.d.ts +1 -0
  156. package/build/smali.js +17 -0
  157. package/build/smaliParser.d.ts +12 -0
  158. package/build/smaliParser.js +656 -0
  159. package/build/smaliParser.test.d.ts +1 -0
  160. package/build/smaliParser.test.js +115 -0
  161. package/build/terminatedArrayParser.d.ts +4 -2
  162. package/build/terminatedArrayParser.js +82 -5
  163. package/build/terminatedArrayParser.test.d.ts +1 -0
  164. package/build/terminatedArrayParser.test.js +131 -0
  165. package/build/toAsyncIterable.d.ts +1 -0
  166. package/build/toAsyncIterable.js +7 -0
  167. package/build/toAsyncIterator.d.ts +1 -0
  168. package/build/toAsyncIterator.js +33 -0
  169. package/build/tupleParser.d.ts +4 -0
  170. package/build/tupleParser.js +1 -5
  171. package/build/uint8Array.d.ts +1 -0
  172. package/build/uint8Array.js +7 -0
  173. package/build/unionParser.d.ts +2 -1
  174. package/build/unionParser.js +27 -12
  175. package/build/unionParser.test.d.ts +1 -0
  176. package/build/unionParser.test.js +60 -0
  177. package/build/unparser.d.ts +8 -0
  178. package/build/unparser.js +104 -0
  179. package/build/unparser.test.d.ts +1 -0
  180. package/build/unparser.test.js +150 -0
  181. package/build/unparserContext.d.ts +31 -0
  182. package/build/unparserContext.js +74 -0
  183. package/build/unparserError.d.ts +9 -0
  184. package/build/unparserError.js +9 -0
  185. package/build/unparserImplementationInvariant.d.ts +2 -0
  186. package/build/unparserImplementationInvariant.js +5 -0
  187. package/build/unparserOutputCompanion.d.ts +15 -0
  188. package/build/unparserOutputCompanion.js +13 -0
  189. package/build/zip.d.ts +9 -17
  190. package/build/zipParser.d.ts +20 -12
  191. package/build/zipParser.js +83 -71
  192. package/build/zipParser.test.js +2 -7
  193. package/build/zipUnparser.d.ts +8 -0
  194. package/build/zipUnparser.js +200 -0
  195. package/build/zipUnparser.test.d.ts +1 -0
  196. package/build/zipUnparser.test.js +80 -0
  197. package/package.json +26 -8
  198. package/src/allSettledStream.test.ts +40 -0
  199. package/src/allSettledStream.ts +47 -15
  200. package/src/androidPackage.ts +48 -0
  201. package/src/{apkParser.test.ts → androidPackageParser.test.ts} +7 -8
  202. package/src/androidPackageParser.test.ts.md +271 -0
  203. package/src/androidPackageParser.test.ts.snap +0 -0
  204. package/src/androidPackageParser.ts +440 -0
  205. package/src/androidPackageUnparser.test.ts +36 -0
  206. package/src/androidPackageUnparser.ts +120 -0
  207. package/src/arbitrarilySlicedAsyncInterable.ts +7 -2
  208. package/src/arbitraryFileSystemEntry.ts +2 -4
  209. package/src/arbitraryZip.ts +20 -27
  210. package/src/arbitraryZipPermissions.ts +0 -25
  211. package/src/arbitraryZipStream.ts +4 -4
  212. package/src/arrayParser.test.ts +4 -4
  213. package/src/arrayParser.ts +3 -2
  214. package/src/arrayUnparser.ts +13 -0
  215. package/src/backsmali.ts +30 -0
  216. package/src/bsonParser.test.ts +2 -2
  217. package/src/bsonParser.ts +16 -5
  218. package/src/{parserInvariant.ts → customInvariant.ts} +2 -2
  219. package/src/dalvikBytecodeParser/formatParsers.ts +421 -0
  220. package/src/dalvikBytecodeParser.ts +2074 -0
  221. package/src/dalvikExecutable.ts +220 -0
  222. package/src/dalvikExecutableParser/stringSyntaxParser.ts +145 -0
  223. package/src/dalvikExecutableParser/typeParsers.ts +65 -0
  224. package/src/dalvikExecutableParser/typedNumbers.ts +57 -0
  225. package/src/dalvikExecutableParser.test.ts +89 -0
  226. package/src/dalvikExecutableParser.test.ts.md +634 -0
  227. package/src/dalvikExecutableParser.test.ts.snap +0 -0
  228. package/src/dalvikExecutableParser.ts +2768 -0
  229. package/src/dalvikExecutableParserAgainstSmaliParser.test.ts +346 -0
  230. package/src/debugLogInputParser.ts +28 -0
  231. package/src/debugLogParser.ts +20 -4
  232. package/src/disjunctionParser.ts +10 -5
  233. package/src/elementParser.ts +3 -3
  234. package/src/elementTerminatedArrayParser.test.ts +99 -0
  235. package/src/elementTerminatedArrayParser.ts +31 -0
  236. package/src/elementTerminatedSequenceArrayParser.test.ts +54 -0
  237. package/src/elementTerminatedSequenceArrayParser.ts +52 -0
  238. package/src/elementTerminatedSequenceParser.test.ts +54 -0
  239. package/src/elementTerminatedSequenceParser.ts +43 -0
  240. package/src/endOfInputParser.ts +4 -4
  241. package/src/exactElementParser.ts +18 -12
  242. package/src/exactSequenceParser.ts +24 -3
  243. package/src/fetchCid.ts +125 -0
  244. package/src/fixedLengthSequenceParser.test.ts +77 -0
  245. package/src/fixedLengthSequenceParser.ts +28 -1
  246. package/src/hasExecutable.ts +11 -0
  247. package/src/highResolutionTimer.ts +49 -0
  248. package/src/index.ts +15 -2
  249. package/src/inputReader.test.ts +216 -7
  250. package/src/inputReader.ts +80 -5
  251. package/src/inputReaderState.ts +33 -0
  252. package/src/inspect.ts +9 -0
  253. package/src/javaKeyStore.ts +0 -0
  254. package/src/javaKeyStoreParser.test.ts +22 -0
  255. package/src/javaKeyStoreParser.test.ts.md +103 -0
  256. package/src/javaKeyStoreParser.test.ts.snap +0 -0
  257. package/src/javaKeyStoreParser.ts +136 -0
  258. package/src/jsonParser.test.ts +2 -2
  259. package/src/jsonParser.ts +23 -34
  260. package/src/leb128Parser.test.ts +171 -0
  261. package/src/leb128Parser.ts +125 -0
  262. package/src/listParser.ts +6 -6
  263. package/src/lookaheadParser.ts +19 -0
  264. package/src/negativeLookaheadParser.test.ts +53 -0
  265. package/src/negativeLookaheadParser.ts +36 -0
  266. package/src/nonEmptyArrayParser.test.ts +20 -0
  267. package/src/nonEmptyArrayParser.ts +44 -0
  268. package/src/optionalParser.ts +4 -3
  269. package/src/parser.test.ts +148 -27
  270. package/src/parser.test.ts.md +21 -21
  271. package/src/parser.test.ts.snap +0 -0
  272. package/src/parser.ts +153 -49
  273. package/src/parserAccessorParser.ts +12 -2
  274. package/src/parserConsumedSequenceParser.ts +29 -0
  275. package/src/parserContext.test.ts +38 -7
  276. package/src/parserContext.ts +127 -51
  277. package/src/parserCreatorCompose.ts +25 -7
  278. package/src/parserError.ts +9 -6
  279. package/src/parserImplementationInvariant.ts +2 -2
  280. package/src/parserInputCompanion.ts +102 -0
  281. package/src/promiseCompose.ts +17 -3
  282. package/src/promiseSettled.ts +6 -0
  283. package/src/quantifierParser.ts +25 -0
  284. package/src/separatedArrayParser.test.ts +34 -0
  285. package/src/separatedArrayParser.ts +55 -0
  286. package/src/sequenceBuffer.test.ts +72 -2
  287. package/src/sequenceBuffer.ts +93 -7
  288. package/src/sequenceTerminatedSequenceParser.test.ts +60 -0
  289. package/src/sequenceTerminatedSequenceParser.ts +62 -0
  290. package/src/sequenceUnparser.ts +9 -0
  291. package/src/skipParser.ts +7 -5
  292. package/src/skipToParser.ts +16 -0
  293. package/src/sliceBoundedParser.test.ts +45 -3
  294. package/src/sliceBoundedParser.ts +21 -3
  295. package/src/smali.ts +24 -0
  296. package/src/smaliParser.test.ts +132 -0
  297. package/src/smaliParser.test.ts.md +2320 -0
  298. package/src/smaliParser.test.ts.snap +0 -0
  299. package/src/smaliParser.ts +1166 -0
  300. package/src/terminatedArrayParser.test.ts +258 -0
  301. package/src/terminatedArrayParser.ts +111 -6
  302. package/src/toAsyncIterable.ts +7 -0
  303. package/src/toAsyncIterator.ts +48 -0
  304. package/src/tupleParser.ts +8 -5
  305. package/src/uint8Array.ts +10 -0
  306. package/src/unionParser.test.ts +79 -0
  307. package/src/unionParser.ts +44 -16
  308. package/src/unparser.test.ts +221 -0
  309. package/src/unparser.ts +209 -0
  310. package/src/unparserContext.ts +127 -0
  311. package/src/unparserError.ts +12 -0
  312. package/src/unparserImplementationInvariant.ts +6 -0
  313. package/src/unparserOutputCompanion.ts +24 -0
  314. package/src/zip.ts +10 -22
  315. package/src/zipParser.test.ts +2 -8
  316. package/src/zipParser.ts +223 -146
  317. package/src/zipUnparser.test.ts +119 -0
  318. package/src/zipUnparser.ts +300 -0
  319. package/build/apk.d.ts +0 -13
  320. package/build/apkParser.d.ts +0 -3
  321. package/build/apkParser.js +0 -135
  322. package/build/arbitraryDosDate.d.ts +0 -2
  323. package/build/arbitraryDosDate.js +0 -8
  324. package/build/arbitraryZipEntry.d.ts +0 -3
  325. package/build/arbitraryZipEntry.js +0 -26
  326. package/build/createDisjunctionParser.d.ts +0 -2
  327. package/build/createDisjunctionParser.js +0 -47
  328. package/build/createExactParser.d.ts +0 -2
  329. package/build/createExactParser.js +0 -12
  330. package/build/createSequentialUnionParser.d.ts +0 -2
  331. package/build/createSequentialUnionParser.js +0 -69
  332. package/build/fixedLengthChunkParser.d.ts +0 -2
  333. package/build/fixedLengthChunkParser.js +0 -12
  334. package/build/fixedLengthParser.d.ts +0 -2
  335. package/build/fixedLengthParser.js +0 -12
  336. package/build/inputChunkBuffer.d.ts +0 -15
  337. package/build/inputChunkBuffer.js +0 -40
  338. package/build/inputChunkBuffer.test.js +0 -34
  339. package/build/inputCompanion.d.ts +0 -18
  340. package/build/inputCompanion.js +0 -28
  341. package/build/invariantDefined.d.ts +0 -1
  342. package/build/invariantDefined.js +0 -5
  343. package/build/invariantIdentity.d.ts +0 -3
  344. package/build/invariantIdentity.js +0 -5
  345. package/build/jsonParser2.d.ts +0 -3
  346. package/build/jsonParser2.js +0 -52
  347. package/build/jsonParser2.test.js +0 -22
  348. package/build/negativeLookahead.js +0 -20
  349. package/build/parserCompose.d.ts +0 -3
  350. package/build/parserCompose.js +0 -7
  351. package/build/parserImplementationInvariantInvariant.d.ts +0 -3
  352. package/build/parserImplementationInvariantInvariant.js +0 -15
  353. package/build/promiseFish.d.ts +0 -1
  354. package/build/promiseFish.js +0 -3
  355. package/build/sequenceParser.d.ts +0 -3
  356. package/build/sequenceParser.js +0 -10
  357. package/build/terminatedSequenceParser.d.ts +0 -2
  358. package/build/terminatedSequenceParser.js +0 -24
  359. package/build/zipEntry.d.ts +0 -28
  360. package/build/zipFile.d.ts +0 -32
  361. package/build/zipFileEntry.d.ts +0 -6
  362. package/src/apk.ts +0 -16
  363. package/src/apkParser.test.ts.md +0 -268
  364. package/src/apkParser.test.ts.snap +0 -0
  365. package/src/apkParser.ts +0 -327
  366. package/src/inputCompanion.ts +0 -43
  367. package/src/invariantDefined.ts +0 -6
  368. package/src/invariantIdentity.ts +0 -8
  369. package/src/negativeLookahead.ts +0 -26
  370. /package/build/{apk.js → androidPackage.js} +0 -0
  371. /package/build/{apkParser.test.d.ts → androidPackageParser.test.d.ts} +0 -0
  372. /package/build/{arbitraryDosPermissions.d.ts → androidPackageUnparser.test.d.ts} +0 -0
  373. /package/build/{arbitraryDosPermissions.js → dalvikExecutableParser.test.d.ts} +0 -0
  374. /package/build/{inputChunkBuffer.test.d.ts → dalvikExecutableParserAgainstSmaliParser.test.d.ts} +0 -0
  375. /package/build/{jsonParser2.test.d.ts → elementTerminatedArrayParser.test.d.ts} +0 -0
  376. /package/build/{parserParsingInvariant.d.ts → elementTerminatedSequenceArrayParser.test.d.ts} +0 -0
  377. /package/build/{parserParsingInvariant.js → elementTerminatedSequenceParser.test.d.ts} +0 -0
  378. /package/build/{zipEntry.js → fixedLengthSequenceParser.test.d.ts} +0 -0
  379. /package/build/{zipFile.js → javaKeyStore.d.ts} +0 -0
  380. /package/build/{zipFileEntry.js → javaKeyStore.js} +0 -0
@@ -0,0 +1,220 @@
1
+
2
+ export type DalvikExecutableAccessFlags = {
3
+ public: boolean,
4
+ private: boolean,
5
+ protected: boolean,
6
+ static: boolean,
7
+ final: boolean,
8
+ synchronized: boolean,
9
+ volatile: boolean,
10
+ bridge: boolean,
11
+ transient: boolean,
12
+ varargs: boolean,
13
+ native: boolean,
14
+ interface: boolean,
15
+ abstract: boolean,
16
+ strict: boolean,
17
+ synthetic: boolean,
18
+ annotation: boolean,
19
+ enum: boolean,
20
+ constructor: boolean,
21
+ declaredSynchronized: boolean,
22
+ };
23
+
24
+ export type DalvikExecutableEncodedValue = number | DalvikExecutableEncodedValue[] | undefined;
25
+
26
+ type DalvikExecutableTry = {
27
+ startAddress: number;
28
+ instructionCount: number;
29
+ handler: DalvikExecutableEncodedCatchHandler;
30
+ };
31
+
32
+ type DalvikExecutableEncodedTypeAddressPair = {
33
+ type: string;
34
+ address: number;
35
+ };
36
+
37
+ type DalvikExecutableEncodedCatchHandler = {
38
+ handlers: DalvikExecutableEncodedTypeAddressPair[],
39
+ catchAllAddress: undefined | number,
40
+ };
41
+
42
+ export type DalvikExecutableCode<Instructions> = {
43
+ registersSize: number;
44
+ insSize: number;
45
+ outsSize: number;
46
+ debugInfo: undefined | DalvikExecutableDebugInfo;
47
+ instructions: Instructions;
48
+ tries: DalvikExecutableTry[];
49
+ };
50
+
51
+ type DalvikExecutableDebugByteCodeValue =
52
+ | {
53
+ type: 'advancePc';
54
+ addressDiff: number;
55
+ }
56
+ | {
57
+ type: 'advanceLine';
58
+ lineDiff: number;
59
+ }
60
+ | {
61
+ type: 'startLocal';
62
+ registerNum: number;
63
+ name: undefined | string;
64
+ type_: undefined | string;
65
+ }
66
+ | {
67
+ type: 'startLocalExtended';
68
+ registerNum: number;
69
+ name: undefined | string;
70
+ type_: undefined | string;
71
+ signature: undefined | string;
72
+ }
73
+ | {
74
+ type: 'endLocal';
75
+ registerNum: number;
76
+ }
77
+ | {
78
+ type: 'restartLocal';
79
+ registerNum: number;
80
+ }
81
+ | {
82
+ type: 'setPrologueEnd';
83
+ }
84
+ | {
85
+ type: 'setEpilogueBegin';
86
+ }
87
+ | {
88
+ type: 'setFile';
89
+ name: undefined | string;
90
+ }
91
+ | {
92
+ type: 'special';
93
+ value: number;
94
+ }
95
+ ;
96
+
97
+ type DalvikExecutableDebugByteCode = DalvikExecutableDebugByteCodeValue[];
98
+
99
+ export type DalvikExecutableDebugInfo = {
100
+ lineStart: number;
101
+ parameterNames: (undefined | string)[];
102
+ bytecode: DalvikExecutableDebugByteCode;
103
+ };
104
+
105
+ type DalvikExecutableAnnotationItemVisibility =
106
+ | 'build'
107
+ | 'runtime'
108
+ | 'system'
109
+ ;
110
+
111
+ type DalvikExecutableAnnotationElement = {
112
+ name: string;
113
+ value: DalvikExecutableEncodedValue;
114
+ };
115
+
116
+ export type DalvikExecutableAnnotation = {
117
+ visibility: DalvikExecutableAnnotationItemVisibility;
118
+ type: string;
119
+ elements: DalvikExecutableAnnotationElement[];
120
+ }
121
+
122
+ export type DalvikExecutablePrototype = {
123
+ shorty: string;
124
+ returnType: string;
125
+ parameters: string[];
126
+ };
127
+
128
+ export type DalvikExecutableField = {
129
+ class: string;
130
+ type: string;
131
+ name: string;
132
+ };
133
+
134
+ export function isDalvikExecutableField(x: unknown): x is DalvikExecutableField {
135
+ return (
136
+ x !== null
137
+ && typeof x === 'object'
138
+ && 'class' in x
139
+ && 'type' in x
140
+ && 'name' in x
141
+ && typeof (x as DalvikExecutableField).class === 'string'
142
+ && typeof (x as DalvikExecutableField).type === 'string'
143
+ && typeof (x as DalvikExecutableField).name === 'string'
144
+ );
145
+ }
146
+
147
+ export type DalvikExecutableFieldWithAccess = {
148
+ field: DalvikExecutableField;
149
+ accessFlags: DalvikExecutableAccessFlags;
150
+ };
151
+
152
+ export type DalvikExecutableMethod = {
153
+ class: string;
154
+ prototype: DalvikExecutablePrototype;
155
+ name: string;
156
+ };
157
+
158
+ export function isDalvikExecutableMethod(x: unknown): x is DalvikExecutableMethod {
159
+ return (
160
+ x !== null
161
+ && typeof x === 'object'
162
+ && 'class' in x
163
+ && 'prototype' in x
164
+ && 'name' in x
165
+ && typeof (x as DalvikExecutableMethod).class === 'string'
166
+ && typeof (x as DalvikExecutableMethod).prototype === 'object'
167
+ && typeof (x as DalvikExecutableMethod).name === 'string'
168
+ );
169
+ }
170
+
171
+ export type DalvikExecutableMethodWithAccess<Instructions> = {
172
+ method: DalvikExecutableMethod;
173
+ accessFlags: DalvikExecutableAccessFlags;
174
+ code: undefined | DalvikExecutableCode<Instructions>;
175
+ };
176
+
177
+ export type DalvikExecutableClassFieldAnnotation = {
178
+ field: DalvikExecutableField;
179
+ annotations: undefined | DalvikExecutableAnnotation[];
180
+ };
181
+
182
+ export type DalvikExecutableClassMethodAnnotation = {
183
+ method: DalvikExecutableMethod;
184
+ annotations: undefined | DalvikExecutableAnnotation[];
185
+ };
186
+
187
+ export type DalvikExecutableClassParameterAnnotation = {
188
+ method: DalvikExecutableMethod;
189
+ annotations: undefined | (undefined | DalvikExecutableAnnotation[])[];
190
+ };
191
+
192
+ export type DalvikExecutableClassAnnotations = {
193
+ classAnnotations: undefined | DalvikExecutableAnnotation[];
194
+ fieldAnnotations: DalvikExecutableClassFieldAnnotation[];
195
+ methodAnnotations: DalvikExecutableClassMethodAnnotation[];
196
+ parameterAnnotations: DalvikExecutableClassParameterAnnotation[];
197
+ };
198
+
199
+ export type DalvikExecutableClassData<Instructions> = {
200
+ staticFields: DalvikExecutableFieldWithAccess[];
201
+ instanceFields: DalvikExecutableFieldWithAccess[];
202
+ directMethods: DalvikExecutableMethodWithAccess<Instructions>[];
203
+ virtualMethods: DalvikExecutableMethodWithAccess<Instructions>[];
204
+ };
205
+
206
+ export type DalvikExecutableClassDefinition<Instructions> = {
207
+ class: string;
208
+ accessFlags: DalvikExecutableAccessFlags,
209
+ superclass: string;
210
+ interfaces: string[];
211
+ sourceFile: undefined | string;
212
+ annotations: undefined | DalvikExecutableClassAnnotations;
213
+ staticValues: DalvikExecutableEncodedValue[];
214
+ classData: undefined | DalvikExecutableClassData<Instructions>;
215
+ };
216
+
217
+ export type DalvikExecutable<Instructions> = {
218
+ classDefinitions: DalvikExecutableClassDefinition<Instructions>[];
219
+ link: undefined | Uint8Array,
220
+ };
@@ -0,0 +1,145 @@
1
+ import invariant from "invariant";
2
+ import { Parser, setParserName } from "../parser.js";
3
+ import { ParserContext } from "../parserContext.js";
4
+ import { promiseCompose } from "../promiseCompose.js";
5
+ import { createSeparatedArrayParser } from "../separatedArrayParser.js";
6
+ import { createExactSequenceParser } from "../exactSequenceParser.js";
7
+ import { createUnionParser } from "../unionParser.js";
8
+ import { createTupleParser } from "../tupleParser.js";
9
+ import { createArrayParser } from "../arrayParser.js";
10
+
11
+ export const smaliSimpleNameParser: Parser<string, string> = async (parserContext: ParserContext<string, string>) => {
12
+ const characters: string[] = [];
13
+
14
+ while (true) {
15
+ const character = await parserContext.peek(0);
16
+
17
+ parserContext.invariant(character !== undefined, 'Unexpected end of input');
18
+
19
+ invariant(character !== undefined, 'Unexpected end of input');
20
+
21
+ if (
22
+ (
23
+ character >= 'a' && character <= 'z'
24
+ )
25
+ || (
26
+ character >= 'A' && character <= 'Z'
27
+ )
28
+ || (
29
+ character >= '0' && character <= '9'
30
+ )
31
+ || (
32
+ character === ' '
33
+ )
34
+ || (
35
+ character === '$'
36
+ )
37
+ || (
38
+ character === '-'
39
+ )
40
+ || (
41
+ character === '_'
42
+ )
43
+ || (
44
+ character === '\u00a0'
45
+ )
46
+ || (
47
+ character >= '\u00a1' && character <= '\u1fff'
48
+ )
49
+ || (
50
+ character >= '\u2000' && character <= '\u200a'
51
+ )
52
+ || (
53
+ character >= '\u2010' && character <= '\u2027'
54
+ )
55
+ || (
56
+ character === '\u202f'
57
+ )
58
+ || (
59
+ character >= '\u2030' && character <= '\ud7ff'
60
+ )
61
+ || (
62
+ character >= '\ue000' && character <= '\uffef'
63
+ )
64
+ || (
65
+ character >= '\ud800' && character <= '\udbff'
66
+ )
67
+ ) {
68
+ parserContext.skip(1);
69
+
70
+ characters.push(character);
71
+
72
+ continue;
73
+ }
74
+
75
+ parserContext.invariant(characters.length > 0, 'Expected at least one character');
76
+
77
+ break;
78
+ }
79
+
80
+ return characters.join('');
81
+ };
82
+
83
+ setParserName(smaliSimpleNameParser, 'smaliSimpleNameParser');
84
+
85
+ export const smaliMemberNameParser: Parser<string, string> = createUnionParser([
86
+ smaliSimpleNameParser,
87
+ promiseCompose(
88
+ createTupleParser([
89
+ createExactSequenceParser('<'),
90
+ smaliSimpleNameParser,
91
+ createExactSequenceParser('>'),
92
+ ]),
93
+ (strings) => strings.join(''),
94
+ ),
95
+ ]);
96
+
97
+ setParserName(smaliMemberNameParser, 'smaliMemberNameParser');
98
+
99
+ const smaliFullClassNameParser: Parser<string, string> = promiseCompose(
100
+ createSeparatedArrayParser(
101
+ smaliMemberNameParser,
102
+ createExactSequenceParser('/'),
103
+ ),
104
+ (pathSegments) => pathSegments.join('/'),
105
+ );
106
+
107
+ setParserName(smaliFullClassNameParser, 'smaliFullClassNameParser');
108
+
109
+ const smaliNonArrayFieldTypeDescriptorParser: Parser<string, string> = createUnionParser([
110
+ createExactSequenceParser('Z'),
111
+ createExactSequenceParser('B'),
112
+ createExactSequenceParser('S'),
113
+ createExactSequenceParser('C'),
114
+ createExactSequenceParser('I'),
115
+ createExactSequenceParser('J'),
116
+ createExactSequenceParser('F'),
117
+ createExactSequenceParser('D'),
118
+ promiseCompose(
119
+ createTupleParser([
120
+ createExactSequenceParser('L'),
121
+ smaliFullClassNameParser,
122
+ createExactSequenceParser(';'),
123
+ ]),
124
+ strings => strings.join(''),
125
+ ),
126
+ ]);
127
+
128
+ setParserName(smaliNonArrayFieldTypeDescriptorParser, 'smaliNonArrayFieldTypeDescriptorParser');
129
+
130
+ const smaliFieldTypeDescriptorParser: Parser<string, string> = promiseCompose(
131
+ createTupleParser([
132
+ createArrayParser(createExactSequenceParser('[')),
133
+ smaliNonArrayFieldTypeDescriptorParser,
134
+ ]),
135
+ ([ strings, string ]) => strings.join('') + string,
136
+ );
137
+
138
+ setParserName(smaliFieldTypeDescriptorParser, 'smaliFieldTypeDescriptorParser');
139
+
140
+ export const smaliTypeDescriptorParser: Parser<string, string> = createUnionParser([
141
+ createExactSequenceParser('V'),
142
+ smaliFieldTypeDescriptorParser,
143
+ ]);
144
+
145
+ setParserName(smaliTypeDescriptorParser, 'smaliTypeDescriptorParser');
@@ -0,0 +1,65 @@
1
+ import { createElementParser } from "../elementParser.js";
2
+ import { createFixedLengthSequenceParser } from "../fixedLengthSequenceParser.js";
3
+ import { uleb128NumberParser } from "../leb128Parser.js";
4
+ import { Parser } from "../parser.js";
5
+ import { promiseCompose } from "../promiseCompose.js";
6
+
7
+ export const uleb128p1NumberParser: Parser<number, Uint8Array> = async (parserContext) => {
8
+ const value = await uleb128NumberParser(parserContext);
9
+ return value - 1;
10
+ }
11
+
12
+ export const ubyteParser: Parser<number, Uint8Array> = createElementParser();
13
+
14
+ export const byteParser: Parser<number, Uint8Array> = promiseCompose(
15
+ ubyteParser,
16
+ (ubyte) => ubyte > 127 ? ubyte - 256 : ubyte,
17
+ );
18
+
19
+ export const shortParser: Parser<number, Uint8Array> = promiseCompose(
20
+ createFixedLengthSequenceParser<Uint8Array>(2),
21
+ (uint8Array) => {
22
+ const buffer = Buffer.from(uint8Array);
23
+ return buffer.readInt16LE(0);
24
+ },
25
+ );
26
+
27
+ export const ushortParser: Parser<number, Uint8Array> = promiseCompose(
28
+ createFixedLengthSequenceParser<Uint8Array>(2),
29
+ (uint8Array) => {
30
+ const buffer = Buffer.from(uint8Array);
31
+ return buffer.readUInt16LE(0);
32
+ },
33
+ );
34
+
35
+ export const intParser: Parser<number, Uint8Array> = promiseCompose(
36
+ createFixedLengthSequenceParser<Uint8Array>(4),
37
+ (uint8Array) => {
38
+ const buffer = Buffer.from(uint8Array);
39
+ return buffer.readInt32LE(0);
40
+ },
41
+ );
42
+
43
+ export const uintParser: Parser<number, Uint8Array> = promiseCompose(
44
+ createFixedLengthSequenceParser<Uint8Array>(4),
45
+ (uint8Array) => {
46
+ const buffer = Buffer.from(uint8Array);
47
+ return buffer.readUInt32LE(0);
48
+ },
49
+ );
50
+
51
+ export const longParser: Parser<bigint, Uint8Array> = promiseCompose(
52
+ createFixedLengthSequenceParser<Uint8Array>(8),
53
+ (uint8Array) => {
54
+ const buffer = Buffer.from(uint8Array);
55
+ return buffer.readBigInt64LE(0);
56
+ },
57
+ );
58
+
59
+ export const ulongParser: Parser<bigint, Uint8Array> = promiseCompose(
60
+ createFixedLengthSequenceParser<Uint8Array>(8),
61
+ (uint8Array) => {
62
+ const buffer = Buffer.from(uint8Array);
63
+ return buffer.readBigUInt64LE(0);
64
+ },
65
+ );
@@ -0,0 +1,57 @@
1
+ import { Newtype, iso } from 'newtype-ts';
2
+
3
+ export interface IndexIntoStringIds extends Newtype<{ readonly IndexIntoStringIds: unique symbol }, number> {}
4
+ export const isoIndexIntoStringIds = iso<IndexIntoStringIds>();
5
+
6
+ export interface IndexIntoTypeIds extends Newtype<{ readonly IndexIntoTypeIds: unique symbol }, number> {}
7
+ export const isoIndexIntoTypeIds = iso<IndexIntoTypeIds>();
8
+
9
+ export interface IndexIntoPrototypeIds extends Newtype<{ readonly IndexIntoPrototypeIds: unique symbol }, number> {}
10
+ export const isoIndexIntoPrototypeIds = iso<IndexIntoPrototypeIds>();
11
+
12
+ export interface IndexIntoFieldIds extends Newtype<{ readonly IndexIntoFieldIds: unique symbol }, number> {}
13
+ export const isoIndexIntoFieldIds = iso<IndexIntoFieldIds>();
14
+
15
+ export interface IndexIntoMethodIds extends Newtype<{ readonly IndexIntoMethodIds: unique symbol }, number> {}
16
+ export const isoIndexIntoMethodIds = iso<IndexIntoMethodIds>();
17
+
18
+ export interface OffsetToStringDataItem extends Newtype<{ readonly OffsetToStringDataItem: unique symbol }, number> {}
19
+ export const isoOffsetToStringDataItem = iso<OffsetToStringDataItem>();
20
+
21
+ export interface OffsetToTypeList extends Newtype<{ readonly OffsetToTypeList: unique symbol }, number> {}
22
+ export const isoOffsetToTypeList = iso<OffsetToTypeList>();
23
+
24
+ export interface OffsetToAnnotationsDirectoryItem extends Newtype<{ readonly OffsetToAnnotationsDirectoryItem: unique symbol }, number> {}
25
+ export const isoOffsetToAnnotationsDirectoryItem = iso<OffsetToAnnotationsDirectoryItem>();
26
+
27
+ export interface OffsetToAnnotationSetItem extends Newtype<{ readonly OffsetToAnnotationSetItem: unique symbol }, number> {}
28
+ export const isoOffsetToAnnotationSetItem = iso<OffsetToAnnotationSetItem>();
29
+
30
+ export interface OffsetToAnnotationSetRefListItem extends Newtype<{ readonly OffsetToAnnotationSetRefListItem: unique symbol }, number> {}
31
+ export const isoOffsetToAnnotationSetRefListItem = iso<OffsetToAnnotationSetRefListItem>();
32
+
33
+ export interface OffsetToClassDataItem extends Newtype<{ readonly OffsetToClassDataItem: unique symbol }, number> {}
34
+ export const isoOffsetToClassDataItem = iso<OffsetToClassDataItem>();
35
+
36
+ export interface OffsetToEncodedArrayItem extends Newtype<{ readonly OffsetToEncodedArrayItem: unique symbol }, number> {}
37
+ export const isoOffsetToEncodedArrayItem = iso<OffsetToEncodedArrayItem>();
38
+
39
+ export interface OffsetToCodeItem extends Newtype<{ readonly OffsetToCodeItem: unique symbol }, number> {}
40
+ export const isoOffsetToCodeItem = iso<OffsetToCodeItem>();
41
+
42
+ export interface OffsetToDebugInfoItem extends Newtype<{ readonly OffsetToDebugInfoItem: unique symbol }, number> {}
43
+ export const isoOffsetToDebugInfoItem = iso<OffsetToDebugInfoItem>();
44
+
45
+ export interface OffsetToAnnotationItem extends Newtype<{ readonly OffsetToAnnotationItem: unique symbol }, number> {}
46
+ export const isoOffsetToAnnotationItem = iso<OffsetToAnnotationItem>();
47
+
48
+ export interface OffsetFromEncodedCatchHandlerListToEncodedCatchHandler extends Newtype<{ readonly OffsetFromEncodedCatchHandlerListToEncodedCatchHandler: unique symbol }, number> {}
49
+ export const isoOffsetFromEncodedCatchHandlerListToEncodedCatchHandler = iso<OffsetFromEncodedCatchHandlerListToEncodedCatchHandler>();
50
+
51
+ export interface TypedNumberArray<IndexType, ValueType> extends Newtype<{ readonly TypedNumberArray: unique symbol }, Array<ValueType>> {
52
+ get length(): number;
53
+ at(index: IndexType): undefined | ValueType;
54
+ map<NewValueType>(fn: (value: ValueType, index: IndexType) => NewValueType): TypedNumberArray<IndexType, NewValueType>;
55
+ [Symbol.iterator](): IterableIterator<ValueType>;
56
+ };
57
+ export const getIsoTypedNumberArray = <IndexType, ValueType>() => iso<TypedNumberArray<IndexType, ValueType>>();
@@ -0,0 +1,89 @@
1
+ import test from 'ava';
2
+ import { runParser } from './parser.js';
3
+ import { uint8ArrayParserInputCompanion } from './parserInputCompanion.js';
4
+ import { dalvikExecutableParser, dalvikExecutableWithRawInstructionsParser } from './dalvikExecutableParser.js';
5
+ import { fetchCid } from './fetchCid.js';
6
+
7
+ for (const [ dexCid, shouldSnapshot ] of [
8
+ [ 'bafkreibb4gsprc3fvmnyqx6obswvm7e7wngnfj64gz65ey72r7xgyzymt4', true ],
9
+ [ 'bafybeiebe27ylo53trgitu6fqfbmba43c4ivxj3nt4kumsilkucpbdxtqq', false ],
10
+ [ 'bafybeibbupm7uzhuq4pa674rb2amxsenbdaoijigmaf4onaodaql4mh7yy', false ],
11
+ [ 'bafybeicb3qajmwy6li7hche2nkucvytaxcyxhwhphmi73tgydjzmyoqoda', false ],
12
+ ] as const) {
13
+ test.serial(
14
+ 'dex (with instructions as bytes) ' + dexCid,
15
+ async t => {
16
+ const dexStream = await fetchCid(dexCid);
17
+
18
+ const actual = await runParser(dalvikExecutableWithRawInstructionsParser, dexStream, uint8ArrayParserInputCompanion, {
19
+ errorJoinMode: 'all',
20
+ });
21
+
22
+ if (shouldSnapshot) {
23
+ t.snapshot(actual);
24
+ } else {
25
+ //console.dir(actual, { depth: null });
26
+ t.pass();
27
+ }
28
+ },
29
+ );
30
+ }
31
+
32
+ type ObjectPath = (string | symbol | number)[];
33
+
34
+ function objectWalk(object: unknown, f: (path: ObjectPath, value: unknown) => void, initialPath: ObjectPath = []) {
35
+ f(initialPath, object);
36
+
37
+ if (
38
+ !object
39
+ || typeof object !== 'object'
40
+ ) {
41
+ return;
42
+ }
43
+
44
+ if (Array.isArray(object)) {
45
+ for (const [ index, value ] of object.entries()) {
46
+ objectWalk(value, f, [ ...initialPath, index ]);
47
+ }
48
+ } else {
49
+ for (const [ key, value ] of Object.entries(object)) {
50
+ objectWalk(value, f, [ ...initialPath, key ]);
51
+ }
52
+ }
53
+ }
54
+
55
+ for (const [ dexCid, shouldSnapshot ] of [
56
+ [ 'bafkreibb4gsprc3fvmnyqx6obswvm7e7wngnfj64gz65ey72r7xgyzymt4', true ],
57
+ // [ 'bafybeiebe27ylo53trgitu6fqfbmba43c4ivxj3nt4kumsilkucpbdxtqq', false ],
58
+ // [ 'bafybeibbupm7uzhuq4pa674rb2amxsenbdaoijigmaf4onaodaql4mh7yy', false ],
59
+ // [ 'bafybeicb3qajmwy6li7hche2nkucvytaxcyxhwhphmi73tgydjzmyoqoda', false ],
60
+ ] as const) {
61
+ test.serial(
62
+ 'dex (with parsed instructions) ' + dexCid,
63
+ async t => {
64
+ const dexStream = await fetchCid(dexCid);
65
+
66
+ const actual = await runParser(dalvikExecutableParser, dexStream, uint8ArrayParserInputCompanion, {
67
+ errorJoinMode: 'all',
68
+ });
69
+
70
+ objectWalk(actual, (path) => {
71
+ const key = path.at(-1);
72
+
73
+ if (typeof key !== 'string') {
74
+ return;
75
+ }
76
+
77
+ t.false(key.endsWith('Offset'), 'All offsets should be resolved: ' + path.join('.'));
78
+ t.false(key.endsWith('Index'), 'All indexes should be resolved: ' + path.join('.'));
79
+ });
80
+
81
+ if (shouldSnapshot) {
82
+ t.snapshot(actual);
83
+ } else {
84
+ //console.dir(actual, { depth: null });
85
+ t.pass();
86
+ }
87
+ },
88
+ );
89
+ }