@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.
- package/.github/copilot-instructions.md +149 -0
- package/.github/workflows/copilot-setup-steps.yml +18 -0
- package/.github/workflows/main.yml +29 -8
- package/.yarn/releases/yarn-4.9.4.cjs +942 -0
- package/.yarnrc.yml +1 -1
- package/build/allSettledStream.js +1 -1
- package/build/allSettledStream.test.js +2 -2
- package/build/androidPackageParser.d.ts +1 -1
- package/build/androidPackageParser.js +5 -3
- package/build/androidPackageParser.test.js +7 -7
- package/build/androidPackageUnparser.d.ts +2 -2
- package/build/androidPackageUnparser.js +18 -14
- package/build/androidPackageUnparser.test.js +7 -7
- package/build/arbitrarilySlicedAsyncInterator.js +2 -1
- package/build/arbitraryDalvikBytecode.d.ts +4 -0
- package/build/arbitraryDalvikBytecode.js +640 -0
- package/build/arbitraryDalvikExecutable.d.ts +3 -0
- package/build/arbitraryDalvikExecutable.js +282 -0
- package/build/arbitraryDosDateTime.js +1 -0
- package/build/arbitraryZipStream.js +1 -1
- package/build/arrayParser.js +2 -2
- package/build/arrayUnparser.d.ts +1 -1
- package/build/backsmali.d.ts +3 -1
- package/build/backsmali.js +31 -3
- package/build/customInvariant.d.ts +2 -1
- package/build/customInvariant.js +4 -6
- package/build/dalvikBytecodeParser/formatParsers.d.ts +76 -2
- package/build/dalvikBytecodeParser/formatParsers.js +146 -11
- package/build/dalvikBytecodeParser/formatSizes.d.ts +34 -0
- package/build/dalvikBytecodeParser/formatSizes.js +34 -0
- package/build/dalvikBytecodeParser/operationFormats.d.ts +225 -0
- package/build/dalvikBytecodeParser/operationFormats.js +225 -0
- package/build/dalvikBytecodeParser.d.ts +1105 -5
- package/build/dalvikBytecodeParser.js +658 -205
- package/build/dalvikBytecodeUnparser/formatUnparsers.d.ts +152 -0
- package/build/dalvikBytecodeUnparser/formatUnparsers.js +225 -0
- package/build/dalvikBytecodeUnparser.d.ts +3 -0
- package/build/dalvikBytecodeUnparser.js +642 -0
- package/build/dalvikBytecodeUnparser.test.d.ts +1 -0
- package/build/dalvikBytecodeUnparser.test.js +25 -0
- package/build/dalvikExecutable.d.ts +65 -8
- package/build/dalvikExecutable.js +36 -0
- package/build/dalvikExecutableParser/stringSyntaxParser.d.ts +1 -1
- package/build/dalvikExecutableParser/stringSyntaxParser.js +17 -17
- package/build/dalvikExecutableParser/typeParsers.d.ts +2 -1
- package/build/dalvikExecutableParser/typeParsers.js +16 -11
- package/build/dalvikExecutableParser/typedNumbers.d.ts +85 -69
- package/build/dalvikExecutableParser/typedNumbers.js +0 -1
- package/build/dalvikExecutableParser.d.ts +2 -2
- package/build/dalvikExecutableParser.js +655 -337
- package/build/dalvikExecutableParser.test.js +24 -22
- package/build/dalvikExecutableParserAgainstSmaliParser.test.js +223 -246
- package/build/dalvikExecutableUnparser/annotationUnparsers.d.ts +14 -0
- package/build/dalvikExecutableUnparser/annotationUnparsers.js +97 -0
- package/build/dalvikExecutableUnparser/poolBuilders.d.ts +49 -0
- package/build/dalvikExecutableUnparser/poolBuilders.js +140 -0
- package/build/dalvikExecutableUnparser/poolScanners.d.ts +4 -0
- package/build/dalvikExecutableUnparser/poolScanners.js +220 -0
- package/build/dalvikExecutableUnparser/sectionUnparsers.d.ts +25 -0
- package/build/dalvikExecutableUnparser/sectionUnparsers.js +581 -0
- package/build/dalvikExecutableUnparser/utils.d.ts +10 -0
- package/build/dalvikExecutableUnparser/utils.js +108 -0
- package/build/dalvikExecutableUnparser.d.ts +4 -0
- package/build/dalvikExecutableUnparser.js +406 -0
- package/build/dalvikExecutableUnparser.test.d.ts +1 -0
- package/build/dalvikExecutableUnparser.test.js +31 -0
- package/build/debugLogInputParser.js +1 -1
- package/build/disjunctionParser.d.ts +2 -2
- package/build/disjunctionParser.js +2 -2
- package/build/elementTerminatedArrayParser.d.ts +2 -2
- package/build/elementTerminatedArrayParser.js +1 -1
- package/build/elementTerminatedArrayParser.test.js +5 -5
- package/build/elementTerminatedSequenceArrayParser.d.ts +2 -2
- package/build/elementTerminatedSequenceArrayParser.js +1 -1
- package/build/elementTerminatedSequenceArrayParser.test.js +2 -2
- package/build/elementTerminatedSequenceParser.d.ts +2 -2
- package/build/elementTerminatedSequenceParser.js +1 -1
- package/build/elementTerminatedSequenceParser.test.js +2 -2
- package/build/endOfInputParser.d.ts +1 -1
- package/build/exactElementSwitchParser.d.ts +3 -0
- package/build/exactElementSwitchParser.js +22 -0
- package/build/fetchCid.js +2 -6
- package/build/fetchCid.test.d.ts +1 -0
- package/build/fetchCid.test.js +16 -0
- package/build/fixedLengthSequenceParser.test.js +2 -2
- package/build/hasExecutable.js +2 -2
- package/build/highResolutionTimer.js +1 -1
- package/build/inputReader.d.ts +1 -1
- package/build/inputReader.test.js +33 -45
- package/build/javaKeyStoreParser.test.js +6 -6
- package/build/jsonParser.js +8 -8
- package/build/lazyMessageError.d.ts +48 -0
- package/build/lazyMessageError.js +53 -0
- package/build/lazyMessageError.test.d.ts +1 -0
- package/build/lazyMessageError.test.js +15 -0
- package/build/leb128Parser.d.ts +1 -1
- package/build/leb128Parser.js +10 -10
- package/build/leb128Parser.test.js +7 -7
- package/build/negativeLookaheadParser.js +2 -2
- package/build/negativeLookaheadParser.test.js +4 -4
- package/build/noStackCaptureOverheadError.d.ts +4 -0
- package/build/noStackCaptureOverheadError.js +9 -0
- package/build/noStackCaptureOverheadError.test.d.ts +1 -0
- package/build/noStackCaptureOverheadError.test.js +15 -0
- package/build/nonEmptyArrayParser.js +2 -2
- package/build/nonEmptyArrayParser.test.js +2 -1
- package/build/optionalParser.js +2 -2
- package/build/parser.d.ts +2 -1
- package/build/parser.js +23 -8
- package/build/parser.test.js +78 -29
- package/build/parserConsumedSequenceParser.d.ts +1 -1
- package/build/parserConsumedSequenceParser.js +2 -2
- package/build/parserContext.d.ts +8 -6
- package/build/parserContext.js +60 -33
- package/build/parserContext.test.js +7 -3
- package/build/parserError.d.ts +603 -44
- package/build/parserError.js +98 -53
- package/build/parserImplementationInvariant.d.ts +1 -1
- package/build/parserImplementationInvariant.js +2 -2
- package/build/parserInputCompanion.js +2 -2
- package/build/promiseCompose.js +1 -2
- package/build/separatedArrayParser.js +2 -2
- package/build/separatedNonEmptyArrayParser.d.ts +2 -0
- package/build/separatedNonEmptyArrayParser.js +40 -0
- package/build/separatedNonEmptyArrayParser.test.d.ts +1 -0
- package/build/separatedNonEmptyArrayParser.test.js +66 -0
- package/build/sequenceBuffer.js +1 -1
- package/build/sequenceTerminatedSequenceParser.d.ts +2 -2
- package/build/sequenceTerminatedSequenceParser.js +3 -3
- package/build/sequenceTerminatedSequenceParser.test.js +1 -1
- package/build/sequenceUnparser.d.ts +1 -1
- package/build/skipToParser.d.ts +1 -1
- package/build/skipToParser.js +2 -2
- package/build/sliceBoundedParser.test.js +4 -9
- package/build/smali.d.ts +1 -1
- package/build/smali.js +6 -2
- package/build/smaliParser.d.ts +62 -6
- package/build/smaliParser.js +1721 -296
- package/build/smaliParser.test.js +338 -43
- package/build/stringFromAsyncIterable.d.ts +1 -0
- package/build/stringFromAsyncIterable.js +7 -0
- package/build/terminatedArrayParser.js +4 -4
- package/build/terminatedArrayParser.test.js +7 -7
- package/build/toAsyncIterator.js +4 -4
- package/build/unionParser.d.ts +1 -1
- package/build/unionParser.js +2 -2
- package/build/unionParser.test.js +3 -3
- package/build/unparser.d.ts +3 -3
- package/build/unparser.js +6 -4
- package/build/unparser.test.js +7 -19
- package/build/unparserContext.d.ts +2 -2
- package/build/unparserContext.js +2 -3
- package/build/unparserError.d.ts +2 -1
- package/build/unparserError.js +2 -1
- package/build/unparserImplementationInvariant.d.ts +1 -1
- package/build/unparserOutputCompanion.d.ts +1 -1
- package/build/unparserOutputCompanion.js +1 -1
- package/build/zipParser.js +1 -1
- package/build/zipUnparser.d.ts +3 -3
- package/build/zipUnparser.js +9 -19
- package/build/zipUnparser.test.js +1 -1
- package/package.json +19 -26
- package/src/allSettledStream.test.ts +2 -2
- package/src/allSettledStream.ts +3 -3
- package/src/androidPackageParser.test.ts +17 -19
- package/src/androidPackageParser.ts +129 -171
- package/src/androidPackageUnparser.test.ts +19 -21
- package/src/androidPackageUnparser.ts +23 -17
- package/src/arbitrarilySlicedAsyncInterable.ts +1 -1
- package/src/arbitrarilySlicedAsyncInterator.ts +4 -4
- package/src/arbitraryDalvikBytecode.ts +992 -0
- package/src/arbitraryDalvikExecutable.ts +434 -0
- package/src/arbitraryDosDateTime.ts +1 -0
- package/src/arbitraryZipStream.ts +1 -1
- package/src/arrayParser.ts +2 -2
- package/src/arrayUnparser.ts +2 -2
- package/src/backsmali.ts +48 -4
- package/src/bsonParser.test.ts +12 -14
- package/src/customInvariant.ts +8 -12
- package/src/dalvikBytecodeParser/formatParsers.ts +376 -17
- package/src/dalvikBytecodeParser/formatSizes.ts +35 -0
- package/src/dalvikBytecodeParser/operationFormats.ts +226 -0
- package/src/dalvikBytecodeParser.ts +1042 -243
- package/src/dalvikBytecodeUnparser/formatUnparsers.ts +442 -0
- package/src/dalvikBytecodeUnparser.test.ts +44 -0
- package/src/dalvikBytecodeUnparser.ts +758 -0
- package/src/dalvikExecutable.ts +110 -48
- package/src/dalvikExecutableParser/stringSyntaxParser.ts +33 -33
- package/src/dalvikExecutableParser/typeParsers.ts +23 -14
- package/src/dalvikExecutableParser/typedNumbers.ts +19 -19
- package/src/dalvikExecutableParser.test.ts +60 -60
- package/src/dalvikExecutableParser.test.ts.md +6 -6
- package/src/dalvikExecutableParser.test.ts.snap +0 -0
- package/src/dalvikExecutableParser.ts +911 -434
- package/src/dalvikExecutableParserAgainstSmaliParser.test.ts +256 -239
- package/src/dalvikExecutableUnparser/annotationUnparsers.ts +135 -0
- package/src/dalvikExecutableUnparser/poolBuilders.ts +189 -0
- package/src/dalvikExecutableUnparser/poolScanners.ts +297 -0
- package/src/dalvikExecutableUnparser/sectionUnparsers.ts +683 -0
- package/src/dalvikExecutableUnparser/utils.ts +149 -0
- package/src/dalvikExecutableUnparser.test.ts +57 -0
- package/src/dalvikExecutableUnparser.ts +581 -0
- package/src/debugLogInputParser.ts +1 -1
- package/src/disjunctionParser.ts +5 -5
- package/src/elementTerminatedArrayParser.test.ts +8 -8
- package/src/elementTerminatedArrayParser.ts +2 -2
- package/src/elementTerminatedSequenceArrayParser.test.ts +4 -6
- package/src/elementTerminatedSequenceArrayParser.ts +2 -2
- package/src/elementTerminatedSequenceParser.test.ts +4 -6
- package/src/elementTerminatedSequenceParser.ts +2 -2
- package/src/endOfInputParser.ts +1 -1
- package/src/exactElementSwitchParser.ts +41 -0
- package/src/fetchCid.test.ts +20 -0
- package/src/fetchCid.ts +3 -7
- package/src/fixedLengthSequenceParser.test.ts +10 -12
- package/src/hasExecutable.ts +2 -2
- package/src/highResolutionTimer.ts +1 -1
- package/src/inputReader.test.ts +39 -52
- package/src/inputReader.ts +2 -4
- package/src/inputReaderState.ts +1 -1
- package/src/inspect.ts +1 -1
- package/src/javaKeyStoreParser.test.ts +12 -14
- package/src/javaKeyStoreParser.ts +2 -6
- package/src/jsonParser.test.ts +2 -4
- package/src/jsonParser.ts +34 -38
- package/src/lazyMessageError.test.ts +21 -0
- package/src/lazyMessageError.ts +88 -0
- package/src/leb128Parser.test.ts +25 -23
- package/src/leb128Parser.ts +19 -19
- package/src/negativeLookaheadParser.test.ts +7 -11
- package/src/negativeLookaheadParser.ts +2 -2
- package/src/noStackCaptureOverheadError.test.ts +17 -0
- package/src/noStackCaptureOverheadError.ts +12 -0
- package/src/nonEmptyArrayParser.test.ts +3 -2
- package/src/nonEmptyArrayParser.ts +2 -2
- package/src/optionalParser.ts +2 -2
- package/src/parser.test.ts +96 -43
- package/src/parser.test.ts.md +13 -6
- package/src/parser.test.ts.snap +0 -0
- package/src/parser.ts +35 -12
- package/src/parserAccessorParser.ts +1 -1
- package/src/parserConsumedSequenceParser.ts +3 -3
- package/src/parserContext.test.ts +7 -3
- package/src/parserContext.ts +82 -48
- package/src/parserError.ts +143 -63
- package/src/parserImplementationInvariant.ts +3 -3
- package/src/parserInputCompanion.ts +2 -2
- package/src/promiseCompose.ts +2 -2
- package/src/separatedArrayParser.ts +3 -3
- package/src/separatedNonEmptyArrayParser.test.ts +117 -0
- package/src/separatedNonEmptyArrayParser.ts +61 -0
- package/src/sequenceBuffer.test.ts +9 -9
- package/src/sequenceBuffer.ts +4 -4
- package/src/sequenceTerminatedSequenceParser.test.ts +3 -5
- package/src/sequenceTerminatedSequenceParser.ts +4 -4
- package/src/sequenceUnparser.ts +2 -2
- package/src/skipToParser.ts +2 -2
- package/src/sliceBoundedParser.test.ts +4 -12
- package/src/sliceBoundedParser.ts +2 -2
- package/src/smali.ts +8 -3
- package/src/smaliParser.test.ts +377 -66
- package/src/smaliParser.test.ts.md +1635 -48
- package/src/smaliParser.test.ts.snap +0 -0
- package/src/smaliParser.ts +2751 -569
- package/src/stringFromAsyncIterable.ts +9 -0
- package/src/terminatedArrayParser.test.ts +11 -11
- package/src/terminatedArrayParser.ts +5 -7
- package/src/toAsyncIterator.ts +8 -8
- package/src/uint8Array.ts +2 -3
- package/src/unionParser.test.ts +22 -23
- package/src/unionParser.ts +6 -8
- package/src/unparser.test.ts +18 -34
- package/src/unparser.ts +13 -9
- package/src/unparserContext.ts +9 -13
- package/src/unparserError.ts +2 -1
- package/src/unparserImplementationInvariant.ts +1 -1
- package/src/unparserOutputCompanion.ts +1 -1
- package/src/zip.ts +2 -6
- package/src/zipParser.ts +10 -18
- package/src/zipUnparser.test.ts +1 -1
- package/src/zipUnparser.ts +52 -64
- package/tsconfig.json +7 -1
- package/xo.config.ts +15 -0
- 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
|
|
package/src/sequenceBuffer.ts
CHANGED
|
@@ -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
|
|
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
|
|
2
|
-
import { Parser, setParserName } from
|
|
3
|
-
import { DeriveSequenceElement } from
|
|
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
|
|
44
|
+
window *= 2;
|
|
45
45
|
|
|
46
46
|
continue;
|
|
47
47
|
}
|
package/src/sequenceUnparser.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Unparser } from
|
|
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
|
+
};
|
package/src/skipToParser.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { Parser, setParserName } from
|
|
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> =
|
|
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.
|
|
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
|
|
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
|
-
|
|
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',
|
|
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);
|