@futpib/parser 1.0.2 → 1.0.4

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 (311) 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 +1 -1
  7. package/build/allSettledStream.test.js +2 -2
  8. package/build/androidPackageParser.d.ts +1 -1
  9. package/build/androidPackageParser.js +5 -3
  10. package/build/androidPackageParser.test.js +7 -7
  11. package/build/androidPackageUnparser.d.ts +2 -2
  12. package/build/androidPackageUnparser.js +18 -14
  13. package/build/androidPackageUnparser.test.js +7 -7
  14. package/build/arbitrarilySlicedAsyncInterator.js +2 -1
  15. package/build/arbitraryDalvikBytecode.d.ts +4 -0
  16. package/build/arbitraryDalvikBytecode.js +640 -0
  17. package/build/arbitraryDalvikExecutable.d.ts +3 -0
  18. package/build/arbitraryDalvikExecutable.js +282 -0
  19. package/build/arbitraryDosDateTime.js +1 -0
  20. package/build/arbitraryZipStream.js +1 -1
  21. package/build/arrayParser.js +2 -2
  22. package/build/arrayUnparser.d.ts +1 -1
  23. package/build/backsmali.d.ts +3 -1
  24. package/build/backsmali.js +31 -3
  25. package/build/bash.d.ts +84 -0
  26. package/build/bash.js +1 -0
  27. package/build/bashParser.d.ts +6 -0
  28. package/build/bashParser.js +294 -0
  29. package/build/bashParser.test.d.ts +1 -0
  30. package/build/bashParser.test.js +181 -0
  31. package/build/customInvariant.d.ts +2 -1
  32. package/build/customInvariant.js +4 -6
  33. package/build/dalvikBytecodeParser/formatParsers.d.ts +76 -2
  34. package/build/dalvikBytecodeParser/formatParsers.js +146 -11
  35. package/build/dalvikBytecodeParser/formatSizes.d.ts +34 -0
  36. package/build/dalvikBytecodeParser/formatSizes.js +34 -0
  37. package/build/dalvikBytecodeParser/operationFormats.d.ts +225 -0
  38. package/build/dalvikBytecodeParser/operationFormats.js +225 -0
  39. package/build/dalvikBytecodeParser.d.ts +1105 -5
  40. package/build/dalvikBytecodeParser.js +658 -205
  41. package/build/dalvikBytecodeUnparser/formatUnparsers.d.ts +152 -0
  42. package/build/dalvikBytecodeUnparser/formatUnparsers.js +225 -0
  43. package/build/dalvikBytecodeUnparser.d.ts +3 -0
  44. package/build/dalvikBytecodeUnparser.js +642 -0
  45. package/build/dalvikBytecodeUnparser.test.d.ts +1 -0
  46. package/build/dalvikBytecodeUnparser.test.js +25 -0
  47. package/build/dalvikExecutable.d.ts +65 -8
  48. package/build/dalvikExecutable.js +36 -0
  49. package/build/dalvikExecutableParser/stringSyntaxParser.d.ts +1 -1
  50. package/build/dalvikExecutableParser/stringSyntaxParser.js +17 -17
  51. package/build/dalvikExecutableParser/typeParsers.d.ts +2 -1
  52. package/build/dalvikExecutableParser/typeParsers.js +16 -11
  53. package/build/dalvikExecutableParser/typedNumbers.d.ts +85 -69
  54. package/build/dalvikExecutableParser/typedNumbers.js +0 -1
  55. package/build/dalvikExecutableParser.d.ts +2 -2
  56. package/build/dalvikExecutableParser.js +655 -337
  57. package/build/dalvikExecutableParser.test.js +24 -22
  58. package/build/dalvikExecutableParserAgainstSmaliParser.test.js +223 -246
  59. package/build/dalvikExecutableUnparser/annotationUnparsers.d.ts +14 -0
  60. package/build/dalvikExecutableUnparser/annotationUnparsers.js +97 -0
  61. package/build/dalvikExecutableUnparser/poolBuilders.d.ts +49 -0
  62. package/build/dalvikExecutableUnparser/poolBuilders.js +140 -0
  63. package/build/dalvikExecutableUnparser/poolScanners.d.ts +4 -0
  64. package/build/dalvikExecutableUnparser/poolScanners.js +220 -0
  65. package/build/dalvikExecutableUnparser/sectionUnparsers.d.ts +25 -0
  66. package/build/dalvikExecutableUnparser/sectionUnparsers.js +581 -0
  67. package/build/dalvikExecutableUnparser/utils.d.ts +10 -0
  68. package/build/dalvikExecutableUnparser/utils.js +108 -0
  69. package/build/dalvikExecutableUnparser.d.ts +4 -0
  70. package/build/dalvikExecutableUnparser.js +406 -0
  71. package/build/dalvikExecutableUnparser.test.d.ts +1 -0
  72. package/build/dalvikExecutableUnparser.test.js +31 -0
  73. package/build/debugLogInputParser.js +1 -1
  74. package/build/disjunctionParser.d.ts +2 -2
  75. package/build/disjunctionParser.js +2 -2
  76. package/build/elementTerminatedArrayParser.d.ts +2 -2
  77. package/build/elementTerminatedArrayParser.js +1 -1
  78. package/build/elementTerminatedArrayParser.test.js +5 -5
  79. package/build/elementTerminatedSequenceArrayParser.d.ts +2 -2
  80. package/build/elementTerminatedSequenceArrayParser.js +1 -1
  81. package/build/elementTerminatedSequenceArrayParser.test.js +2 -2
  82. package/build/elementTerminatedSequenceParser.d.ts +2 -2
  83. package/build/elementTerminatedSequenceParser.js +1 -1
  84. package/build/elementTerminatedSequenceParser.test.js +2 -2
  85. package/build/endOfInputParser.d.ts +1 -1
  86. package/build/exactElementSwitchParser.d.ts +3 -0
  87. package/build/exactElementSwitchParser.js +22 -0
  88. package/build/fetchCid.js +2 -6
  89. package/build/fetchCid.test.d.ts +1 -0
  90. package/build/fetchCid.test.js +16 -0
  91. package/build/fixedLengthSequenceParser.test.js +2 -2
  92. package/build/hasExecutable.js +2 -2
  93. package/build/highResolutionTimer.js +1 -1
  94. package/build/index.d.ts +24 -2
  95. package/build/index.js +22 -1
  96. package/build/inputReader.d.ts +1 -1
  97. package/build/inputReader.test.js +33 -45
  98. package/build/javaKeyStoreParser.test.js +6 -6
  99. package/build/jsonParser.js +8 -8
  100. package/build/lazyMessageError.d.ts +48 -0
  101. package/build/lazyMessageError.js +53 -0
  102. package/build/lazyMessageError.test.d.ts +1 -0
  103. package/build/lazyMessageError.test.js +15 -0
  104. package/build/leb128Parser.d.ts +1 -1
  105. package/build/leb128Parser.js +10 -10
  106. package/build/leb128Parser.test.js +7 -7
  107. package/build/negativeLookaheadParser.js +2 -2
  108. package/build/negativeLookaheadParser.test.js +4 -4
  109. package/build/noStackCaptureOverheadError.d.ts +4 -0
  110. package/build/noStackCaptureOverheadError.js +9 -0
  111. package/build/noStackCaptureOverheadError.test.d.ts +1 -0
  112. package/build/noStackCaptureOverheadError.test.js +15 -0
  113. package/build/nonEmptyArrayParser.js +2 -2
  114. package/build/nonEmptyArrayParser.test.js +2 -1
  115. package/build/optionalParser.js +2 -2
  116. package/build/parser.d.ts +2 -1
  117. package/build/parser.js +23 -8
  118. package/build/parser.test.js +78 -29
  119. package/build/parserConsumedSequenceParser.d.ts +1 -1
  120. package/build/parserConsumedSequenceParser.js +2 -2
  121. package/build/parserContext.d.ts +8 -6
  122. package/build/parserContext.js +60 -33
  123. package/build/parserContext.test.js +7 -3
  124. package/build/parserError.d.ts +603 -44
  125. package/build/parserError.js +98 -53
  126. package/build/parserImplementationInvariant.d.ts +1 -1
  127. package/build/parserImplementationInvariant.js +2 -2
  128. package/build/parserInputCompanion.js +2 -2
  129. package/build/promiseCompose.js +1 -2
  130. package/build/regexpParser.d.ts +2 -0
  131. package/build/regexpParser.js +71 -0
  132. package/build/regexpParser.test.d.ts +1 -0
  133. package/build/regexpParser.test.js +83 -0
  134. package/build/regularExpression.d.ts +63 -0
  135. package/build/regularExpression.js +1 -0
  136. package/build/regularExpressionParser.d.ts +3 -0
  137. package/build/regularExpressionParser.js +580 -0
  138. package/build/regularExpressionParser.test.d.ts +1 -0
  139. package/build/regularExpressionParser.test.js +89 -0
  140. package/build/separatedArrayParser.js +2 -2
  141. package/build/separatedNonEmptyArrayParser.d.ts +2 -0
  142. package/build/separatedNonEmptyArrayParser.js +40 -0
  143. package/build/separatedNonEmptyArrayParser.test.d.ts +1 -0
  144. package/build/separatedNonEmptyArrayParser.test.js +66 -0
  145. package/build/sequenceBuffer.js +1 -1
  146. package/build/sequenceTerminatedSequenceParser.d.ts +2 -2
  147. package/build/sequenceTerminatedSequenceParser.js +3 -3
  148. package/build/sequenceTerminatedSequenceParser.test.js +1 -1
  149. package/build/sequenceUnparser.d.ts +1 -1
  150. package/build/skipToParser.d.ts +1 -1
  151. package/build/skipToParser.js +2 -2
  152. package/build/sliceBoundedParser.test.js +4 -9
  153. package/build/smali.d.ts +1 -1
  154. package/build/smali.js +6 -2
  155. package/build/smaliParser.d.ts +62 -6
  156. package/build/smaliParser.js +1721 -296
  157. package/build/smaliParser.test.js +338 -43
  158. package/build/stringFromAsyncIterable.d.ts +1 -0
  159. package/build/stringFromAsyncIterable.js +7 -0
  160. package/build/terminatedArrayParser.js +4 -4
  161. package/build/terminatedArrayParser.test.js +7 -7
  162. package/build/toAsyncIterator.js +4 -4
  163. package/build/unionParser.d.ts +1 -1
  164. package/build/unionParser.js +2 -2
  165. package/build/unionParser.test.js +3 -3
  166. package/build/unparser.d.ts +3 -3
  167. package/build/unparser.js +6 -4
  168. package/build/unparser.test.js +7 -19
  169. package/build/unparserContext.d.ts +2 -2
  170. package/build/unparserContext.js +2 -3
  171. package/build/unparserError.d.ts +2 -1
  172. package/build/unparserError.js +2 -1
  173. package/build/unparserImplementationInvariant.d.ts +1 -1
  174. package/build/unparserOutputCompanion.d.ts +1 -1
  175. package/build/unparserOutputCompanion.js +1 -1
  176. package/build/zipParser.js +1 -1
  177. package/build/zipUnparser.d.ts +3 -3
  178. package/build/zipUnparser.js +9 -19
  179. package/build/zipUnparser.test.js +1 -1
  180. package/package.json +20 -26
  181. package/src/allSettledStream.test.ts +2 -2
  182. package/src/allSettledStream.ts +3 -3
  183. package/src/androidPackageParser.test.ts +17 -19
  184. package/src/androidPackageParser.ts +129 -171
  185. package/src/androidPackageUnparser.test.ts +19 -21
  186. package/src/androidPackageUnparser.ts +23 -17
  187. package/src/arbitrarilySlicedAsyncInterable.ts +1 -1
  188. package/src/arbitrarilySlicedAsyncInterator.ts +4 -4
  189. package/src/arbitraryDalvikBytecode.ts +992 -0
  190. package/src/arbitraryDalvikExecutable.ts +434 -0
  191. package/src/arbitraryDosDateTime.ts +1 -0
  192. package/src/arbitraryZipStream.ts +1 -1
  193. package/src/arrayParser.ts +2 -2
  194. package/src/arrayUnparser.ts +2 -2
  195. package/src/backsmali.ts +48 -4
  196. package/src/bash.ts +120 -0
  197. package/src/bashParser.test.ts +332 -0
  198. package/src/bashParser.ts +461 -0
  199. package/src/bsonParser.test.ts +12 -14
  200. package/src/customInvariant.ts +8 -12
  201. package/src/dalvikBytecodeParser/formatParsers.ts +376 -17
  202. package/src/dalvikBytecodeParser/formatSizes.ts +35 -0
  203. package/src/dalvikBytecodeParser/operationFormats.ts +226 -0
  204. package/src/dalvikBytecodeParser.ts +1042 -243
  205. package/src/dalvikBytecodeUnparser/formatUnparsers.ts +442 -0
  206. package/src/dalvikBytecodeUnparser.test.ts +44 -0
  207. package/src/dalvikBytecodeUnparser.ts +758 -0
  208. package/src/dalvikExecutable.ts +110 -48
  209. package/src/dalvikExecutableParser/stringSyntaxParser.ts +33 -33
  210. package/src/dalvikExecutableParser/typeParsers.ts +23 -14
  211. package/src/dalvikExecutableParser/typedNumbers.ts +19 -19
  212. package/src/dalvikExecutableParser.test.ts +60 -60
  213. package/src/dalvikExecutableParser.test.ts.md +6 -6
  214. package/src/dalvikExecutableParser.test.ts.snap +0 -0
  215. package/src/dalvikExecutableParser.ts +911 -434
  216. package/src/dalvikExecutableParserAgainstSmaliParser.test.ts +256 -239
  217. package/src/dalvikExecutableUnparser/annotationUnparsers.ts +135 -0
  218. package/src/dalvikExecutableUnparser/poolBuilders.ts +189 -0
  219. package/src/dalvikExecutableUnparser/poolScanners.ts +297 -0
  220. package/src/dalvikExecutableUnparser/sectionUnparsers.ts +683 -0
  221. package/src/dalvikExecutableUnparser/utils.ts +149 -0
  222. package/src/dalvikExecutableUnparser.test.ts +57 -0
  223. package/src/dalvikExecutableUnparser.ts +581 -0
  224. package/src/debugLogInputParser.ts +1 -1
  225. package/src/disjunctionParser.ts +5 -5
  226. package/src/elementTerminatedArrayParser.test.ts +8 -8
  227. package/src/elementTerminatedArrayParser.ts +2 -2
  228. package/src/elementTerminatedSequenceArrayParser.test.ts +4 -6
  229. package/src/elementTerminatedSequenceArrayParser.ts +2 -2
  230. package/src/elementTerminatedSequenceParser.test.ts +4 -6
  231. package/src/elementTerminatedSequenceParser.ts +2 -2
  232. package/src/endOfInputParser.ts +1 -1
  233. package/src/exactElementSwitchParser.ts +41 -0
  234. package/src/fetchCid.test.ts +20 -0
  235. package/src/fetchCid.ts +3 -7
  236. package/src/fixedLengthSequenceParser.test.ts +10 -12
  237. package/src/hasExecutable.ts +2 -2
  238. package/src/highResolutionTimer.ts +1 -1
  239. package/src/index.ts +113 -2
  240. package/src/inputReader.test.ts +39 -52
  241. package/src/inputReader.ts +2 -4
  242. package/src/inputReaderState.ts +1 -1
  243. package/src/inspect.ts +1 -1
  244. package/src/javaKeyStoreParser.test.ts +12 -14
  245. package/src/javaKeyStoreParser.ts +2 -6
  246. package/src/jsonParser.test.ts +2 -4
  247. package/src/jsonParser.ts +34 -38
  248. package/src/lazyMessageError.test.ts +21 -0
  249. package/src/lazyMessageError.ts +88 -0
  250. package/src/leb128Parser.test.ts +25 -23
  251. package/src/leb128Parser.ts +19 -19
  252. package/src/negativeLookaheadParser.test.ts +7 -11
  253. package/src/negativeLookaheadParser.ts +2 -2
  254. package/src/noStackCaptureOverheadError.test.ts +17 -0
  255. package/src/noStackCaptureOverheadError.ts +12 -0
  256. package/src/nonEmptyArrayParser.test.ts +3 -2
  257. package/src/nonEmptyArrayParser.ts +2 -2
  258. package/src/optionalParser.ts +2 -2
  259. package/src/parser.test.ts +96 -43
  260. package/src/parser.test.ts.md +13 -6
  261. package/src/parser.test.ts.snap +0 -0
  262. package/src/parser.ts +35 -12
  263. package/src/parserAccessorParser.ts +1 -1
  264. package/src/parserConsumedSequenceParser.ts +3 -3
  265. package/src/parserContext.test.ts +7 -3
  266. package/src/parserContext.ts +82 -48
  267. package/src/parserError.ts +143 -63
  268. package/src/parserImplementationInvariant.ts +3 -3
  269. package/src/parserInputCompanion.ts +2 -2
  270. package/src/promiseCompose.ts +2 -2
  271. package/src/regexpParser.test.ts +186 -0
  272. package/src/regexpParser.ts +94 -0
  273. package/src/regularExpression.ts +24 -0
  274. package/src/regularExpressionParser.test.ts +102 -0
  275. package/src/regularExpressionParser.ts +921 -0
  276. package/src/separatedArrayParser.ts +3 -3
  277. package/src/separatedNonEmptyArrayParser.test.ts +117 -0
  278. package/src/separatedNonEmptyArrayParser.ts +61 -0
  279. package/src/sequenceBuffer.test.ts +9 -9
  280. package/src/sequenceBuffer.ts +4 -4
  281. package/src/sequenceTerminatedSequenceParser.test.ts +3 -5
  282. package/src/sequenceTerminatedSequenceParser.ts +4 -4
  283. package/src/sequenceUnparser.ts +2 -2
  284. package/src/skipToParser.ts +2 -2
  285. package/src/sliceBoundedParser.test.ts +4 -12
  286. package/src/sliceBoundedParser.ts +2 -2
  287. package/src/smali.ts +8 -3
  288. package/src/smaliParser.test.ts +377 -66
  289. package/src/smaliParser.test.ts.md +1635 -48
  290. package/src/smaliParser.test.ts.snap +0 -0
  291. package/src/smaliParser.ts +2751 -569
  292. package/src/stringFromAsyncIterable.ts +9 -0
  293. package/src/terminatedArrayParser.test.ts +11 -11
  294. package/src/terminatedArrayParser.ts +5 -7
  295. package/src/toAsyncIterator.ts +8 -8
  296. package/src/uint8Array.ts +2 -3
  297. package/src/unionParser.test.ts +22 -23
  298. package/src/unionParser.ts +6 -8
  299. package/src/unparser.test.ts +18 -34
  300. package/src/unparser.ts +13 -9
  301. package/src/unparserContext.ts +9 -13
  302. package/src/unparserError.ts +2 -1
  303. package/src/unparserImplementationInvariant.ts +1 -1
  304. package/src/unparserOutputCompanion.ts +1 -1
  305. package/src/zip.ts +2 -6
  306. package/src/zipParser.ts +10 -18
  307. package/src/zipUnparser.test.ts +1 -1
  308. package/src/zipUnparser.ts +52 -64
  309. package/tsconfig.json +7 -1
  310. package/xo.config.ts +15 -0
  311. package/.yarn/releases/yarn-4.5.3.cjs +0 -934
@@ -1,5 +1,5 @@
1
1
  import { getParserName, setParserName } from './parser.js';
2
- import { ParserParsingFailedError } from './parserError.js';
2
+ import { isParserParsingFailedError } from './parserError.js';
3
3
  import { promiseCompose } from './promiseCompose.js';
4
4
  import { createTupleParser } from './tupleParser.js';
5
5
  export const createSeparatedArrayParser = (elementParser, separatorParser) => {
@@ -22,7 +22,7 @@ export const createSeparatedArrayParser = (elementParser, separatorParser) => {
22
22
  elementParserContext.unlookahead();
23
23
  }
24
24
  catch (error) {
25
- if (error instanceof ParserParsingFailedError) {
25
+ if (isParserParsingFailedError(error)) {
26
26
  break;
27
27
  }
28
28
  throw error;
@@ -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
+ });
@@ -74,7 +74,7 @@ export class SequenceBufferImplementation {
74
74
  if (this._indexInFirstSequence === 0) {
75
75
  return {
76
76
  consumedBufferedSequences: [],
77
- unconsumedBufferedSequences: this._sequences.slice(),
77
+ unconsumedBufferedSequences: [...this._sequences],
78
78
  };
79
79
  }
80
80
  const firstSequence = this._sequences[0];
@@ -1,5 +1,5 @@
1
- import { Parser } from "./parser.js";
2
- import { DeriveSequenceElement } from "./sequence.js";
1
+ import { type Parser } from './parser.js';
2
+ import { type DeriveSequenceElement } from './sequence.js';
3
3
  export declare const createSequenceTerminatedSequenceParser: <Sequence, Element = DeriveSequenceElement<Sequence>>(terminatorSequence: Sequence, { consumeTerminator, }?: {
4
4
  consumeTerminator?: boolean;
5
5
  }) => Parser<Sequence, Sequence, Element>;
@@ -1,5 +1,5 @@
1
- import { inspect } from "./inspect.js";
2
- import { setParserName } from "./parser.js";
1
+ import { inspect } from './inspect.js';
2
+ import { setParserName } from './parser.js';
3
3
  function clamp(x, min, max) {
4
4
  return Math.max(min, Math.min(x, max));
5
5
  }
@@ -17,7 +17,7 @@ export const createSequenceTerminatedSequenceParser = (terminatorSequence, { con
17
17
  nonEndOfInputWindow = Math.max(window, nonEndOfInputWindow);
18
18
  const terminatorIndex = parserContext.indexOfSubsequence(sequence, terminatorSequence);
19
19
  if (terminatorIndex === -1) {
20
- window = window * 2;
20
+ window *= 2;
21
21
  continue;
22
22
  }
23
23
  const sequence_ = await parserContext.readSequence(0, terminatorIndex);
@@ -15,7 +15,7 @@ testProp.serial('sequenceTerminatedSequenceParser', [
15
15
  string,
16
16
  terminator: string.slice(-terminatorLength),
17
17
  }))
18
- .filter(({ string, terminator }) => string.split(terminator).length === 2)
18
+ .filter(({ string, terminator }) => string.split(terminator).length === 2),
19
19
  ], async (t, { string, terminator }) => {
20
20
  const sequenceTerminatedSequenceParser = createSequenceTerminatedSequenceParser(terminator);
21
21
  const createTestWrapperParser = (innerParser) => async (parserContext) => {
@@ -1,2 +1,2 @@
1
- import { Unparser } from "./unparser.js";
1
+ import { type Unparser } from './unparser.js';
2
2
  export declare const createSequenceUnparser: <Sequence>() => Unparser<Sequence, Sequence>;
@@ -1,2 +1,2 @@
1
- import { Parser } from "./parser.js";
1
+ import { type Parser } from './parser.js';
2
2
  export declare const createSkipToParser: (offset: number) => Parser<void, Uint8Array>;
@@ -1,7 +1,7 @@
1
- import { setParserName } from "./parser.js";
1
+ import { setParserName } from './parser.js';
2
2
  import { parserImplementationInvariant } from './parserImplementationInvariant.js';
3
3
  export const createSkipToParser = (offset) => {
4
- const skipToParser = (parserContext) => {
4
+ const skipToParser = parserContext => {
5
5
  const length = offset - parserContext.position;
6
6
  parserImplementationInvariant(length >= 0, 'Skip length must be positive, got %s (position: %s)', length, parserContext.position);
7
7
  parserContext.skip(length);
@@ -6,13 +6,7 @@ import { createSliceBoundedParser } from './sliceBoundedParser.js';
6
6
  import { runParser, runParserWithRemainingInput } from './parser.js';
7
7
  import { stringParserInputCompanion } from './parserInputCompanion.js';
8
8
  import { createExactElementParser } from './exactElementParser.js';
9
- async function stringFromAsyncIterable(asyncIterable) {
10
- let string = '';
11
- for await (const chunk of asyncIterable) {
12
- string += chunk;
13
- }
14
- return string;
15
- }
9
+ import { stringFromAsyncIterable } from './stringFromAsyncIterable.js';
16
10
  const anythingParser = createArrayParser(createElementParser());
17
11
  test('sliceBoundedParser', async (t) => {
18
12
  const parser = createTupleParser([
@@ -36,7 +30,8 @@ test('sliceBoundedParser mustConsumeAll: true fail to cosume all', async (t) =>
36
30
  createSliceBoundedParser(createArrayParser(createExactElementParser('b')), 2),
37
31
  createElementParser(),
38
32
  ]);
39
- await t.throwsAsync(() => runParser(parser, 'abcd', stringParserInputCompanion), {
33
+ await t.throwsAsync(async () => runParser(parser, 'abcd', stringParserInputCompanion), {
34
+ any: true,
40
35
  message: /child parser must consume all input in the slice/,
41
36
  });
42
37
  });
@@ -54,5 +49,5 @@ test('sliceBoundedParser mustConsumeAll: false', async (t) => {
54
49
  ],
55
50
  'c',
56
51
  ]);
57
- t.deepEqual(await stringFromAsyncIterable(remainingInput), 'd');
52
+ t.is(await stringFromAsyncIterable(remainingInput), 'd');
58
53
  });
package/build/smali.d.ts CHANGED
@@ -1 +1 @@
1
- export declare function smaliClass(smaliStream: AsyncIterable<string>): Promise<Buffer<ArrayBufferLike>>;
1
+ export declare function smaliClass(smaliStream: string | AsyncIterable<string>): Promise<Uint8Array>;
package/build/smali.js CHANGED
@@ -5,11 +5,15 @@ export async function smaliClass(smaliStream) {
5
5
  const inputFilePath = temporaryFile();
6
6
  const outputFilePath = temporaryFile();
7
7
  await fs.writeFile(inputFilePath, smaliStream);
8
- await execa('smali', [
8
+ const smaliResult = await execa('smali', [
9
9
  'assemble',
10
- '--output', outputFilePath,
10
+ '--output',
11
+ outputFilePath,
11
12
  inputFilePath,
12
13
  ]);
14
+ if (smaliResult.stderr) {
15
+ throw new Error(`smali error: ${smaliResult.stderr}`);
16
+ }
13
17
  await fs.unlink(inputFilePath);
14
18
  const dex = await fs.readFile(outputFilePath);
15
19
  await fs.unlink(outputFilePath);
@@ -1,12 +1,68 @@
1
- import { DalvikBytecode } from "./dalvikBytecodeParser.js";
2
- import { DalvikExecutableClassDefinition, DalvikExecutableFieldWithAccess } from "./dalvikExecutable.js";
3
- import { Parser } from "./parser.js";
4
- export declare const smaliFieldParser: Parser<DalvikExecutableFieldWithAccess, string>;
5
- export declare const smaliAnnotationParser: Parser<unknown, string>;
1
+ import { type Simplify } from 'type-fest';
2
+ import { type DalvikBytecode, type DalvikBytecodeOperation } from './dalvikBytecodeParser.js';
3
+ import { type DalvikExecutableClassDefinition, type DalvikExecutableField, type DalvikExecutableFieldWithAccess, type DalvikExecutableMethod, type DalvikExecutableMethodWithAccess } from './dalvikExecutable.js';
4
+ import { type Parser } from './parser.js';
5
+ import { type IndexIntoMethodIds } from './dalvikExecutableParser/typedNumbers.js';
6
+ export declare const smaliCommentParser: Parser<string, string>;
7
+ type SmaliAnnotationElementValue = {
8
+ kind: 'type';
9
+ value: string | string[];
10
+ } | {
11
+ kind: 'string';
12
+ value: string | string[];
13
+ } | {
14
+ kind: 'enum';
15
+ value: DalvikExecutableField | DalvikExecutableField[];
16
+ } | {
17
+ kind: 'raw';
18
+ value: unknown;
19
+ };
20
+ type SmaliAnnotationElement = {
21
+ name: string;
22
+ value: SmaliAnnotationElementValue;
23
+ };
24
+ type SmaliAnnotation = {
25
+ type: string;
26
+ elements: SmaliAnnotationElement[];
27
+ visibility: 'build' | 'runtime' | 'system';
28
+ };
29
+ export declare const smaliAnnotationParser: Parser<SmaliAnnotation, string>;
30
+ type SmaliField = {
31
+ field: DalvikExecutableFieldWithAccess;
32
+ annotations: SmaliAnnotation[];
33
+ initialValue?: number | bigint | string | boolean | null;
34
+ };
35
+ export declare const smaliFieldParser: Parser<SmaliField, string>;
6
36
  type SmaliRegister = {
7
37
  prefix: 'v' | 'p';
8
38
  index: number;
9
39
  };
10
- export declare const smaliCodeParameterParser: Parser<SmaliRegister, string>;
40
+ type SmaliCodeParameter = {
41
+ register: SmaliRegister;
42
+ name: string | undefined;
43
+ annotation: SmaliAnnotation | undefined;
44
+ };
45
+ export declare const smaliCodeParameterParser: Parser<SmaliCodeParameter, string>;
46
+ type SmaliCodeOperationFromDalvikBytecodeOperation<T extends DalvikBytecodeOperation> = T extends {
47
+ branchOffsets: number[];
48
+ } ? Simplify<Omit<T, 'branchOffsets'> & {
49
+ branchOffsetIndices: number[];
50
+ }> : T extends {
51
+ branchOffset: number;
52
+ } ? Simplify<Omit<T, 'branchOffset'> & {
53
+ branchOffsetIndex: number;
54
+ }> : T extends {
55
+ methodIndex: IndexIntoMethodIds;
56
+ } ? Simplify<Omit<T, 'methodIndex'> & {
57
+ method: DalvikExecutableMethod;
58
+ }> : T;
59
+ type SmaliCodeOperation = SmaliCodeOperationFromDalvikBytecodeOperation<DalvikBytecodeOperation>;
60
+ export declare const smaliCodeOperationParser: Parser<SmaliCodeOperation, string>;
61
+ type SmaliMethod<DalvikBytecode> = {
62
+ dalvikExecutableMethodWithAccess: DalvikExecutableMethodWithAccess<DalvikBytecode>;
63
+ parameterAnnotations: SmaliCodeParameter[];
64
+ methodAnnotations: SmaliAnnotation[];
65
+ };
66
+ export declare const smaliMethodParser: Parser<SmaliMethod<DalvikBytecode>, string>;
11
67
  export declare const smaliParser: Parser<DalvikExecutableClassDefinition<DalvikBytecode>, string>;
12
68
  export {};