@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.
- 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/bash.d.ts +84 -0
- package/build/bash.js +1 -0
- package/build/bashParser.d.ts +6 -0
- package/build/bashParser.js +294 -0
- package/build/bashParser.test.d.ts +1 -0
- package/build/bashParser.test.js +181 -0
- 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/index.d.ts +24 -2
- package/build/index.js +22 -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/regexpParser.d.ts +2 -0
- package/build/regexpParser.js +71 -0
- package/build/regexpParser.test.d.ts +1 -0
- package/build/regexpParser.test.js +83 -0
- package/build/regularExpression.d.ts +63 -0
- package/build/regularExpression.js +1 -0
- package/build/regularExpressionParser.d.ts +3 -0
- package/build/regularExpressionParser.js +580 -0
- package/build/regularExpressionParser.test.d.ts +1 -0
- package/build/regularExpressionParser.test.js +89 -0
- 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 +20 -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/bash.ts +120 -0
- package/src/bashParser.test.ts +332 -0
- package/src/bashParser.ts +461 -0
- 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/index.ts +113 -2
- 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/regexpParser.test.ts +186 -0
- package/src/regexpParser.ts +94 -0
- package/src/regularExpression.ts +24 -0
- package/src/regularExpressionParser.test.ts +102 -0
- package/src/regularExpressionParser.ts +921 -0
- 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
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getParserName, setParserName } from './parser.js';
|
|
2
|
-
import {
|
|
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
|
|
25
|
+
if (isParserParsingFailedError(error)) {
|
|
26
26
|
break;
|
|
27
27
|
}
|
|
28
28
|
throw error;
|
|
@@ -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
|
+
});
|
package/build/sequenceBuffer.js
CHANGED
|
@@ -74,7 +74,7 @@ export class SequenceBufferImplementation {
|
|
|
74
74
|
if (this._indexInFirstSequence === 0) {
|
|
75
75
|
return {
|
|
76
76
|
consumedBufferedSequences: [],
|
|
77
|
-
unconsumedBufferedSequences: this._sequences
|
|
77
|
+
unconsumedBufferedSequences: [...this._sequences],
|
|
78
78
|
};
|
|
79
79
|
}
|
|
80
80
|
const firstSequence = this._sequences[0];
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Parser } from
|
|
2
|
-
import { DeriveSequenceElement } from
|
|
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
|
|
2
|
-
import { setParserName } from
|
|
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
|
|
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
|
|
1
|
+
import { type Unparser } from './unparser.js';
|
|
2
2
|
export declare const createSequenceUnparser: <Sequence>() => Unparser<Sequence, Sequence>;
|
package/build/skipToParser.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Parser } from
|
|
1
|
+
import { type Parser } from './parser.js';
|
|
2
2
|
export declare const createSkipToParser: (offset: number) => Parser<void, Uint8Array>;
|
package/build/skipToParser.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { setParserName } from
|
|
1
|
+
import { setParserName } from './parser.js';
|
|
2
2
|
import { parserImplementationInvariant } from './parserImplementationInvariant.js';
|
|
3
3
|
export const createSkipToParser = (offset) => {
|
|
4
|
-
const skipToParser =
|
|
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
|
-
|
|
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.
|
|
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<
|
|
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',
|
|
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);
|
package/build/smaliParser.d.ts
CHANGED
|
@@ -1,12 +1,68 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
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 {};
|