@futpib/parser 1.0.2 → 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 (284) 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/customInvariant.d.ts +2 -1
  26. package/build/customInvariant.js +4 -6
  27. package/build/dalvikBytecodeParser/formatParsers.d.ts +76 -2
  28. package/build/dalvikBytecodeParser/formatParsers.js +146 -11
  29. package/build/dalvikBytecodeParser/formatSizes.d.ts +34 -0
  30. package/build/dalvikBytecodeParser/formatSizes.js +34 -0
  31. package/build/dalvikBytecodeParser/operationFormats.d.ts +225 -0
  32. package/build/dalvikBytecodeParser/operationFormats.js +225 -0
  33. package/build/dalvikBytecodeParser.d.ts +1105 -5
  34. package/build/dalvikBytecodeParser.js +658 -205
  35. package/build/dalvikBytecodeUnparser/formatUnparsers.d.ts +152 -0
  36. package/build/dalvikBytecodeUnparser/formatUnparsers.js +225 -0
  37. package/build/dalvikBytecodeUnparser.d.ts +3 -0
  38. package/build/dalvikBytecodeUnparser.js +642 -0
  39. package/build/dalvikBytecodeUnparser.test.d.ts +1 -0
  40. package/build/dalvikBytecodeUnparser.test.js +25 -0
  41. package/build/dalvikExecutable.d.ts +65 -8
  42. package/build/dalvikExecutable.js +36 -0
  43. package/build/dalvikExecutableParser/stringSyntaxParser.d.ts +1 -1
  44. package/build/dalvikExecutableParser/stringSyntaxParser.js +17 -17
  45. package/build/dalvikExecutableParser/typeParsers.d.ts +2 -1
  46. package/build/dalvikExecutableParser/typeParsers.js +16 -11
  47. package/build/dalvikExecutableParser/typedNumbers.d.ts +85 -69
  48. package/build/dalvikExecutableParser/typedNumbers.js +0 -1
  49. package/build/dalvikExecutableParser.d.ts +2 -2
  50. package/build/dalvikExecutableParser.js +655 -337
  51. package/build/dalvikExecutableParser.test.js +24 -22
  52. package/build/dalvikExecutableParserAgainstSmaliParser.test.js +223 -246
  53. package/build/dalvikExecutableUnparser/annotationUnparsers.d.ts +14 -0
  54. package/build/dalvikExecutableUnparser/annotationUnparsers.js +97 -0
  55. package/build/dalvikExecutableUnparser/poolBuilders.d.ts +49 -0
  56. package/build/dalvikExecutableUnparser/poolBuilders.js +140 -0
  57. package/build/dalvikExecutableUnparser/poolScanners.d.ts +4 -0
  58. package/build/dalvikExecutableUnparser/poolScanners.js +220 -0
  59. package/build/dalvikExecutableUnparser/sectionUnparsers.d.ts +25 -0
  60. package/build/dalvikExecutableUnparser/sectionUnparsers.js +581 -0
  61. package/build/dalvikExecutableUnparser/utils.d.ts +10 -0
  62. package/build/dalvikExecutableUnparser/utils.js +108 -0
  63. package/build/dalvikExecutableUnparser.d.ts +4 -0
  64. package/build/dalvikExecutableUnparser.js +406 -0
  65. package/build/dalvikExecutableUnparser.test.d.ts +1 -0
  66. package/build/dalvikExecutableUnparser.test.js +31 -0
  67. package/build/debugLogInputParser.js +1 -1
  68. package/build/disjunctionParser.d.ts +2 -2
  69. package/build/disjunctionParser.js +2 -2
  70. package/build/elementTerminatedArrayParser.d.ts +2 -2
  71. package/build/elementTerminatedArrayParser.js +1 -1
  72. package/build/elementTerminatedArrayParser.test.js +5 -5
  73. package/build/elementTerminatedSequenceArrayParser.d.ts +2 -2
  74. package/build/elementTerminatedSequenceArrayParser.js +1 -1
  75. package/build/elementTerminatedSequenceArrayParser.test.js +2 -2
  76. package/build/elementTerminatedSequenceParser.d.ts +2 -2
  77. package/build/elementTerminatedSequenceParser.js +1 -1
  78. package/build/elementTerminatedSequenceParser.test.js +2 -2
  79. package/build/endOfInputParser.d.ts +1 -1
  80. package/build/exactElementSwitchParser.d.ts +3 -0
  81. package/build/exactElementSwitchParser.js +22 -0
  82. package/build/fetchCid.js +2 -6
  83. package/build/fetchCid.test.d.ts +1 -0
  84. package/build/fetchCid.test.js +16 -0
  85. package/build/fixedLengthSequenceParser.test.js +2 -2
  86. package/build/hasExecutable.js +2 -2
  87. package/build/highResolutionTimer.js +1 -1
  88. package/build/inputReader.d.ts +1 -1
  89. package/build/inputReader.test.js +33 -45
  90. package/build/javaKeyStoreParser.test.js +6 -6
  91. package/build/jsonParser.js +8 -8
  92. package/build/lazyMessageError.d.ts +48 -0
  93. package/build/lazyMessageError.js +53 -0
  94. package/build/lazyMessageError.test.d.ts +1 -0
  95. package/build/lazyMessageError.test.js +15 -0
  96. package/build/leb128Parser.d.ts +1 -1
  97. package/build/leb128Parser.js +10 -10
  98. package/build/leb128Parser.test.js +7 -7
  99. package/build/negativeLookaheadParser.js +2 -2
  100. package/build/negativeLookaheadParser.test.js +4 -4
  101. package/build/noStackCaptureOverheadError.d.ts +4 -0
  102. package/build/noStackCaptureOverheadError.js +9 -0
  103. package/build/noStackCaptureOverheadError.test.d.ts +1 -0
  104. package/build/noStackCaptureOverheadError.test.js +15 -0
  105. package/build/nonEmptyArrayParser.js +2 -2
  106. package/build/nonEmptyArrayParser.test.js +2 -1
  107. package/build/optionalParser.js +2 -2
  108. package/build/parser.d.ts +2 -1
  109. package/build/parser.js +23 -8
  110. package/build/parser.test.js +78 -29
  111. package/build/parserConsumedSequenceParser.d.ts +1 -1
  112. package/build/parserConsumedSequenceParser.js +2 -2
  113. package/build/parserContext.d.ts +8 -6
  114. package/build/parserContext.js +60 -33
  115. package/build/parserContext.test.js +7 -3
  116. package/build/parserError.d.ts +603 -44
  117. package/build/parserError.js +98 -53
  118. package/build/parserImplementationInvariant.d.ts +1 -1
  119. package/build/parserImplementationInvariant.js +2 -2
  120. package/build/parserInputCompanion.js +2 -2
  121. package/build/promiseCompose.js +1 -2
  122. package/build/separatedArrayParser.js +2 -2
  123. package/build/separatedNonEmptyArrayParser.d.ts +2 -0
  124. package/build/separatedNonEmptyArrayParser.js +40 -0
  125. package/build/separatedNonEmptyArrayParser.test.d.ts +1 -0
  126. package/build/separatedNonEmptyArrayParser.test.js +66 -0
  127. package/build/sequenceBuffer.js +1 -1
  128. package/build/sequenceTerminatedSequenceParser.d.ts +2 -2
  129. package/build/sequenceTerminatedSequenceParser.js +3 -3
  130. package/build/sequenceTerminatedSequenceParser.test.js +1 -1
  131. package/build/sequenceUnparser.d.ts +1 -1
  132. package/build/skipToParser.d.ts +1 -1
  133. package/build/skipToParser.js +2 -2
  134. package/build/sliceBoundedParser.test.js +4 -9
  135. package/build/smali.d.ts +1 -1
  136. package/build/smali.js +6 -2
  137. package/build/smaliParser.d.ts +62 -6
  138. package/build/smaliParser.js +1721 -296
  139. package/build/smaliParser.test.js +338 -43
  140. package/build/stringFromAsyncIterable.d.ts +1 -0
  141. package/build/stringFromAsyncIterable.js +7 -0
  142. package/build/terminatedArrayParser.js +4 -4
  143. package/build/terminatedArrayParser.test.js +7 -7
  144. package/build/toAsyncIterator.js +4 -4
  145. package/build/unionParser.d.ts +1 -1
  146. package/build/unionParser.js +2 -2
  147. package/build/unionParser.test.js +3 -3
  148. package/build/unparser.d.ts +3 -3
  149. package/build/unparser.js +6 -4
  150. package/build/unparser.test.js +7 -19
  151. package/build/unparserContext.d.ts +2 -2
  152. package/build/unparserContext.js +2 -3
  153. package/build/unparserError.d.ts +2 -1
  154. package/build/unparserError.js +2 -1
  155. package/build/unparserImplementationInvariant.d.ts +1 -1
  156. package/build/unparserOutputCompanion.d.ts +1 -1
  157. package/build/unparserOutputCompanion.js +1 -1
  158. package/build/zipParser.js +1 -1
  159. package/build/zipUnparser.d.ts +3 -3
  160. package/build/zipUnparser.js +9 -19
  161. package/build/zipUnparser.test.js +1 -1
  162. package/package.json +19 -26
  163. package/src/allSettledStream.test.ts +2 -2
  164. package/src/allSettledStream.ts +3 -3
  165. package/src/androidPackageParser.test.ts +17 -19
  166. package/src/androidPackageParser.ts +129 -171
  167. package/src/androidPackageUnparser.test.ts +19 -21
  168. package/src/androidPackageUnparser.ts +23 -17
  169. package/src/arbitrarilySlicedAsyncInterable.ts +1 -1
  170. package/src/arbitrarilySlicedAsyncInterator.ts +4 -4
  171. package/src/arbitraryDalvikBytecode.ts +992 -0
  172. package/src/arbitraryDalvikExecutable.ts +434 -0
  173. package/src/arbitraryDosDateTime.ts +1 -0
  174. package/src/arbitraryZipStream.ts +1 -1
  175. package/src/arrayParser.ts +2 -2
  176. package/src/arrayUnparser.ts +2 -2
  177. package/src/backsmali.ts +48 -4
  178. package/src/bsonParser.test.ts +12 -14
  179. package/src/customInvariant.ts +8 -12
  180. package/src/dalvikBytecodeParser/formatParsers.ts +376 -17
  181. package/src/dalvikBytecodeParser/formatSizes.ts +35 -0
  182. package/src/dalvikBytecodeParser/operationFormats.ts +226 -0
  183. package/src/dalvikBytecodeParser.ts +1042 -243
  184. package/src/dalvikBytecodeUnparser/formatUnparsers.ts +442 -0
  185. package/src/dalvikBytecodeUnparser.test.ts +44 -0
  186. package/src/dalvikBytecodeUnparser.ts +758 -0
  187. package/src/dalvikExecutable.ts +110 -48
  188. package/src/dalvikExecutableParser/stringSyntaxParser.ts +33 -33
  189. package/src/dalvikExecutableParser/typeParsers.ts +23 -14
  190. package/src/dalvikExecutableParser/typedNumbers.ts +19 -19
  191. package/src/dalvikExecutableParser.test.ts +60 -60
  192. package/src/dalvikExecutableParser.test.ts.md +6 -6
  193. package/src/dalvikExecutableParser.test.ts.snap +0 -0
  194. package/src/dalvikExecutableParser.ts +911 -434
  195. package/src/dalvikExecutableParserAgainstSmaliParser.test.ts +256 -239
  196. package/src/dalvikExecutableUnparser/annotationUnparsers.ts +135 -0
  197. package/src/dalvikExecutableUnparser/poolBuilders.ts +189 -0
  198. package/src/dalvikExecutableUnparser/poolScanners.ts +297 -0
  199. package/src/dalvikExecutableUnparser/sectionUnparsers.ts +683 -0
  200. package/src/dalvikExecutableUnparser/utils.ts +149 -0
  201. package/src/dalvikExecutableUnparser.test.ts +57 -0
  202. package/src/dalvikExecutableUnparser.ts +581 -0
  203. package/src/debugLogInputParser.ts +1 -1
  204. package/src/disjunctionParser.ts +5 -5
  205. package/src/elementTerminatedArrayParser.test.ts +8 -8
  206. package/src/elementTerminatedArrayParser.ts +2 -2
  207. package/src/elementTerminatedSequenceArrayParser.test.ts +4 -6
  208. package/src/elementTerminatedSequenceArrayParser.ts +2 -2
  209. package/src/elementTerminatedSequenceParser.test.ts +4 -6
  210. package/src/elementTerminatedSequenceParser.ts +2 -2
  211. package/src/endOfInputParser.ts +1 -1
  212. package/src/exactElementSwitchParser.ts +41 -0
  213. package/src/fetchCid.test.ts +20 -0
  214. package/src/fetchCid.ts +3 -7
  215. package/src/fixedLengthSequenceParser.test.ts +10 -12
  216. package/src/hasExecutable.ts +2 -2
  217. package/src/highResolutionTimer.ts +1 -1
  218. package/src/inputReader.test.ts +39 -52
  219. package/src/inputReader.ts +2 -4
  220. package/src/inputReaderState.ts +1 -1
  221. package/src/inspect.ts +1 -1
  222. package/src/javaKeyStoreParser.test.ts +12 -14
  223. package/src/javaKeyStoreParser.ts +2 -6
  224. package/src/jsonParser.test.ts +2 -4
  225. package/src/jsonParser.ts +34 -38
  226. package/src/lazyMessageError.test.ts +21 -0
  227. package/src/lazyMessageError.ts +88 -0
  228. package/src/leb128Parser.test.ts +25 -23
  229. package/src/leb128Parser.ts +19 -19
  230. package/src/negativeLookaheadParser.test.ts +7 -11
  231. package/src/negativeLookaheadParser.ts +2 -2
  232. package/src/noStackCaptureOverheadError.test.ts +17 -0
  233. package/src/noStackCaptureOverheadError.ts +12 -0
  234. package/src/nonEmptyArrayParser.test.ts +3 -2
  235. package/src/nonEmptyArrayParser.ts +2 -2
  236. package/src/optionalParser.ts +2 -2
  237. package/src/parser.test.ts +96 -43
  238. package/src/parser.test.ts.md +13 -6
  239. package/src/parser.test.ts.snap +0 -0
  240. package/src/parser.ts +35 -12
  241. package/src/parserAccessorParser.ts +1 -1
  242. package/src/parserConsumedSequenceParser.ts +3 -3
  243. package/src/parserContext.test.ts +7 -3
  244. package/src/parserContext.ts +82 -48
  245. package/src/parserError.ts +143 -63
  246. package/src/parserImplementationInvariant.ts +3 -3
  247. package/src/parserInputCompanion.ts +2 -2
  248. package/src/promiseCompose.ts +2 -2
  249. package/src/separatedArrayParser.ts +3 -3
  250. package/src/separatedNonEmptyArrayParser.test.ts +117 -0
  251. package/src/separatedNonEmptyArrayParser.ts +61 -0
  252. package/src/sequenceBuffer.test.ts +9 -9
  253. package/src/sequenceBuffer.ts +4 -4
  254. package/src/sequenceTerminatedSequenceParser.test.ts +3 -5
  255. package/src/sequenceTerminatedSequenceParser.ts +4 -4
  256. package/src/sequenceUnparser.ts +2 -2
  257. package/src/skipToParser.ts +2 -2
  258. package/src/sliceBoundedParser.test.ts +4 -12
  259. package/src/sliceBoundedParser.ts +2 -2
  260. package/src/smali.ts +8 -3
  261. package/src/smaliParser.test.ts +377 -66
  262. package/src/smaliParser.test.ts.md +1635 -48
  263. package/src/smaliParser.test.ts.snap +0 -0
  264. package/src/smaliParser.ts +2751 -569
  265. package/src/stringFromAsyncIterable.ts +9 -0
  266. package/src/terminatedArrayParser.test.ts +11 -11
  267. package/src/terminatedArrayParser.ts +5 -7
  268. package/src/toAsyncIterator.ts +8 -8
  269. package/src/uint8Array.ts +2 -3
  270. package/src/unionParser.test.ts +22 -23
  271. package/src/unionParser.ts +6 -8
  272. package/src/unparser.test.ts +18 -34
  273. package/src/unparser.ts +13 -9
  274. package/src/unparserContext.ts +9 -13
  275. package/src/unparserError.ts +2 -1
  276. package/src/unparserImplementationInvariant.ts +1 -1
  277. package/src/unparserOutputCompanion.ts +1 -1
  278. package/src/zip.ts +2 -6
  279. package/src/zipParser.ts +10 -18
  280. package/src/zipUnparser.test.ts +1 -1
  281. package/src/zipUnparser.ts +52 -64
  282. package/tsconfig.json +7 -1
  283. package/xo.config.ts +15 -0
  284. package/.yarn/releases/yarn-4.5.3.cjs +0 -934
@@ -0,0 +1,61 @@
1
+ import { getParserName, type Parser, setParserName } from './parser.js';
2
+ import { isParserParsingFailedError, ParserParsingFailedError } from './parserError.js';
3
+ import { promiseCompose } from './promiseCompose.js';
4
+ import { createTupleParser } from './tupleParser.js';
5
+
6
+ export const createSeparatedNonEmptyArrayParser = <ElementOutput, Sequence>(
7
+ elementParser: Parser<ElementOutput, Sequence>,
8
+ separatorParser: Parser<unknown, Sequence>,
9
+ ): Parser<ElementOutput[], Sequence> => {
10
+ const separatorThenElementParser: Parser<ElementOutput, Sequence> = promiseCompose(
11
+ createTupleParser([
12
+ separatorParser,
13
+ elementParser,
14
+ ]),
15
+ ([ , element ]) => element,
16
+ );
17
+
18
+ const separatedNonEmptyArrayParser: Parser<ElementOutput[], Sequence> = async parserContext => {
19
+ let parser = elementParser;
20
+
21
+ const elements: ElementOutput[] = [];
22
+
23
+ while (true) {
24
+ const elementParserContext = parserContext.lookahead();
25
+ const initialPosition = elementParserContext.position;
26
+
27
+ try {
28
+ const element = await parser(elementParserContext);
29
+
30
+ if (elementParserContext.position === initialPosition) {
31
+ break;
32
+ }
33
+
34
+ elements.push(element);
35
+ elementParserContext.unlookahead();
36
+ } catch (error) {
37
+ if (isParserParsingFailedError(error)) {
38
+ break;
39
+ }
40
+
41
+ throw error;
42
+ } finally {
43
+ elementParserContext.dispose();
44
+ }
45
+
46
+ parser = separatorThenElementParser;
47
+ }
48
+
49
+ parserContext.invariant(
50
+ elements.length > 0,
51
+ 'Expected elementParser (%s) to match at least once',
52
+ getParserName(elementParser, 'anonymousSeparatedNonEmptyArrayChild'),
53
+ );
54
+
55
+ return elements;
56
+ };
57
+
58
+ setParserName(separatedNonEmptyArrayParser, getParserName(elementParser, 'anonymousSeparatedNonEmptyArrayChild') + '+');
59
+
60
+ return separatedNonEmptyArrayParser;
61
+ };
@@ -33,7 +33,7 @@ test('sequenceBuffer', t => {
33
33
 
34
34
  t.deepEqual(sequenceBuffer.toSequenceBufferState(), {
35
35
  consumedBufferedSequences: [],
36
- unconsumedBufferedSequences: ['abc'],
36
+ unconsumedBufferedSequences: [ 'abc' ],
37
37
  });
38
38
 
39
39
  sequenceBuffer.push('def');
@@ -50,7 +50,7 @@ test('sequenceBuffer', t => {
50
50
 
51
51
  t.deepEqual(sequenceBuffer.toSequenceBufferState(), {
52
52
  consumedBufferedSequences: [],
53
- unconsumedBufferedSequences: ['abc', 'def'],
53
+ unconsumedBufferedSequences: [ 'abc', 'def' ],
54
54
  });
55
55
 
56
56
  sequenceBuffer.push('');
@@ -62,7 +62,7 @@ test('sequenceBuffer', t => {
62
62
 
63
63
  t.deepEqual(sequenceBuffer.toSequenceBufferState(), {
64
64
  consumedBufferedSequences: [],
65
- unconsumedBufferedSequences: ['abc', 'def', ''],
65
+ unconsumedBufferedSequences: [ 'abc', 'def', '' ],
66
66
  });
67
67
 
68
68
  sequenceBuffer.skip(1);
@@ -73,8 +73,8 @@ test('sequenceBuffer', t => {
73
73
  t.is(sequenceBuffer.peek(5), undefined);
74
74
 
75
75
  t.deepEqual(sequenceBuffer.toSequenceBufferState(), {
76
- consumedBufferedSequences: ['a'],
77
- unconsumedBufferedSequences: ['bc', 'def', ''],
76
+ consumedBufferedSequences: [ 'a' ],
77
+ unconsumedBufferedSequences: [ 'bc', 'def', '' ],
78
78
  });
79
79
 
80
80
  sequenceBuffer.skip(3);
@@ -84,8 +84,8 @@ test('sequenceBuffer', t => {
84
84
  t.is(sequenceBuffer.peek(2), undefined);
85
85
 
86
86
  t.deepEqual(sequenceBuffer.toSequenceBufferState(), {
87
- consumedBufferedSequences: ['d'],
88
- unconsumedBufferedSequences: ['ef', ''],
87
+ consumedBufferedSequences: [ 'd' ],
88
+ unconsumedBufferedSequences: [ 'ef', '' ],
89
89
  });
90
90
 
91
91
  sequenceBuffer.push('gh');
@@ -101,8 +101,8 @@ test('sequenceBuffer', t => {
101
101
  t.is(sequenceBuffer.peekSequence(1, 5), undefined, 'fgh?');
102
102
 
103
103
  t.deepEqual(sequenceBuffer.toSequenceBufferState(), {
104
- consumedBufferedSequences: ['d'],
105
- unconsumedBufferedSequences: ['ef', '', 'gh'],
104
+ consumedBufferedSequences: [ 'd' ],
105
+ unconsumedBufferedSequences: [ 'ef', '', 'gh' ],
106
106
  });
107
107
  });
108
108
 
@@ -88,7 +88,7 @@ export class SequenceBufferImplementation<Sequence, Element> implements Sequence
88
88
  sequence,
89
89
  Math.max(0, startIndex),
90
90
  Math.min(sequenceLength, endIndex),
91
- )
91
+ );
92
92
  sequences.push(subsequence);
93
93
  }
94
94
 
@@ -120,7 +120,7 @@ export class SequenceBufferImplementation<Sequence, Element> implements Sequence
120
120
  if (this._indexInFirstSequence === 0) {
121
121
  return {
122
122
  consumedBufferedSequences: [],
123
- unconsumedBufferedSequences: this._sequences.slice(),
123
+ unconsumedBufferedSequences: [ ...this._sequences ],
124
124
  };
125
125
  }
126
126
 
@@ -133,11 +133,11 @@ export class SequenceBufferImplementation<Sequence, Element> implements Sequence
133
133
  const unconsumedFirstSequenceLength = this._parserInputCompanion.length(unconsumedFirstSequence);
134
134
 
135
135
  return {
136
- consumedBufferedSequences: [consumedFirstSequence],
136
+ consumedBufferedSequences: [ consumedFirstSequence ],
137
137
  unconsumedBufferedSequences: (
138
138
  unconsumedFirstSequenceLength === 0
139
139
  ? this._sequences.slice(1)
140
- : [unconsumedFirstSequence, ...this._sequences.slice(1)]
140
+ : [ unconsumedFirstSequence, ...this._sequences.slice(1) ]
141
141
  ),
142
142
  };
143
143
  }
@@ -1,6 +1,6 @@
1
1
  import * as fc from 'fast-check';
2
2
  import { testProp } from '@fast-check/ava';
3
- import { Parser, runParser } from './parser.js';
3
+ import { type Parser, runParser } from './parser.js';
4
4
  import { stringParserInputCompanion } from './parserInputCompanion.js';
5
5
  import { createSequenceTerminatedSequenceParser } from './sequenceTerminatedSequenceParser.js';
6
6
 
@@ -21,12 +21,10 @@ testProp.serial(
21
21
  string,
22
22
  terminator: string.slice(-terminatorLength),
23
23
  }))
24
- .filter(({ string, terminator }) => string.split(terminator).length === 2)
24
+ .filter(({ string, terminator }) => string.split(terminator).length === 2),
25
25
  ],
26
26
  async (t, { string, terminator }) => {
27
- const sequenceTerminatedSequenceParser = createSequenceTerminatedSequenceParser<string>(
28
- terminator,
29
- );
27
+ const sequenceTerminatedSequenceParser = createSequenceTerminatedSequenceParser<string>(terminator);
30
28
 
31
29
  const createTestWrapperParser = (innerParser: typeof sequenceTerminatedSequenceParser): Parser<{
32
30
  string: string;
@@ -1,6 +1,6 @@
1
- import { inspect } from "./inspect.js";
2
- import { Parser, setParserName } from "./parser.js";
3
- import { DeriveSequenceElement } from "./sequence.js";
1
+ import { inspect } from './inspect.js';
2
+ import { type Parser, setParserName } from './parser.js';
3
+ import { type DeriveSequenceElement } from './sequence.js';
4
4
 
5
5
  function clamp(x: number, min: number, max: number) {
6
6
  return Math.max(min, Math.min(x, max));
@@ -41,7 +41,7 @@ export const createSequenceTerminatedSequenceParser = <Sequence, Element = Deriv
41
41
  const terminatorIndex = parserContext.indexOfSubsequence(sequence, terminatorSequence);
42
42
 
43
43
  if (terminatorIndex === -1) {
44
- window = window * 2;
44
+ window *= 2;
45
45
 
46
46
  continue;
47
47
  }
@@ -1,4 +1,4 @@
1
- import { Unparser } from "./unparser.js";
1
+ import { type Unparser } from './unparser.js';
2
2
 
3
3
  export const createSequenceUnparser = <Sequence>(): Unparser<Sequence, Sequence> => {
4
4
  const sequenceUnparser: Unparser<Sequence, Sequence> = async function * (input) {
@@ -6,4 +6,4 @@ export const createSequenceUnparser = <Sequence>(): Unparser<Sequence, Sequence>
6
6
  };
7
7
 
8
8
  return sequenceUnparser;
9
- }
9
+ };
@@ -1,8 +1,8 @@
1
- import { Parser, setParserName } from "./parser.js";
1
+ import { type Parser, setParserName } from './parser.js';
2
2
  import { parserImplementationInvariant } from './parserImplementationInvariant.js';
3
3
 
4
4
  export const createSkipToParser = (offset: number): Parser<void, Uint8Array> => {
5
- const skipToParser: Parser<void, Uint8Array> = (parserContext) => {
5
+ const skipToParser: Parser<void, Uint8Array> = parserContext => {
6
6
  const length = offset - parserContext.position;
7
7
 
8
8
  parserImplementationInvariant(length >= 0, 'Skip length must be positive, got %s (position: %s)', length, parserContext.position);
@@ -6,16 +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
-
10
- async function stringFromAsyncIterable(asyncIterable: AsyncIterable<string>) {
11
- let string = '';
12
-
13
- for await (const chunk of asyncIterable) {
14
- string += chunk;
15
- }
16
-
17
- return string;
18
- }
9
+ import { stringFromAsyncIterable } from './stringFromAsyncIterable.js';
19
10
 
20
11
  const anythingParser = createArrayParser(createElementParser<string>());
21
12
 
@@ -45,7 +36,8 @@ test('sliceBoundedParser mustConsumeAll: true fail to cosume all', async t => {
45
36
  createElementParser(),
46
37
  ]);
47
38
 
48
- await t.throwsAsync(() => runParser(parser, 'abcd', stringParserInputCompanion), {
39
+ await t.throwsAsync(async () => runParser(parser, 'abcd', stringParserInputCompanion), {
40
+ any: true,
49
41
  message: /child parser must consume all input in the slice/,
50
42
  });
51
43
  });
@@ -66,5 +58,5 @@ test('sliceBoundedParser mustConsumeAll: false', async t => {
66
58
  ],
67
59
  'c',
68
60
  ]);
69
- t.deepEqual(await stringFromAsyncIterable(remainingInput!), 'd');
61
+ t.is(await stringFromAsyncIterable(remainingInput!), 'd');
70
62
  });
@@ -3,7 +3,7 @@ import { getParserName, type Parser, setParserName } from './parser.js';
3
3
  export const createSliceBoundedParser = <Output, Sequence>(
4
4
  childParser: Parser<Output, Sequence>,
5
5
  sliceEnd: number,
6
- mustConsumeAll: boolean = true,
6
+ mustConsumeAll = true,
7
7
  ): Parser<Output, Sequence> => {
8
8
  const sliceBoundedParser: typeof childParser = async parserContext => {
9
9
  const absoluteSliceEnd = parserContext.position + sliceEnd;
@@ -18,7 +18,7 @@ export const createSliceBoundedParser = <Output, Sequence>(
18
18
  childParserContext.invariant(
19
19
  (
20
20
  !mustConsumeAll
21
- || childParserContext.position === absoluteSliceEnd
21
+ || childParserContext.position === absoluteSliceEnd
22
22
  ),
23
23
  'child parser must consume all input in the slice (%s in total, up to position %s), instead consumed %s up to position %s',
24
24
  sliceEnd,
package/src/smali.ts CHANGED
@@ -2,18 +2,23 @@ import fs from 'node:fs/promises';
2
2
  import { execa } from 'execa';
3
3
  import { temporaryFile } from 'tempy';
4
4
 
5
- export async function smaliClass(smaliStream: AsyncIterable<string>) {
5
+ export async function smaliClass(smaliStream: string | AsyncIterable<string>): Promise<Uint8Array> {
6
6
  const inputFilePath = temporaryFile();
7
7
  const outputFilePath = temporaryFile();
8
8
 
9
9
  await fs.writeFile(inputFilePath, smaliStream);
10
10
 
11
- await execa('smali', [
11
+ const smaliResult = await execa('smali', [
12
12
  'assemble',
13
- '--output', outputFilePath,
13
+ '--output',
14
+ outputFilePath,
14
15
  inputFilePath,
15
16
  ]);
16
17
 
18
+ if (smaliResult.stderr) {
19
+ throw new Error(`smali error: ${smaliResult.stderr}`);
20
+ }
21
+
17
22
  await fs.unlink(inputFilePath);
18
23
 
19
24
  const dex = await fs.readFile(outputFilePath);