@futpib/parser 1.0.1 → 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 +32 -14
- package/build/allSettledStream.test.js +32 -0
- package/build/androidPackage.d.ts +39 -0
- package/build/androidPackageParser.d.ts +17 -0
- package/build/androidPackageParser.js +185 -0
- package/build/androidPackageParser.test.js +22 -0
- package/build/androidPackageUnparser.d.ts +4 -0
- package/build/androidPackageUnparser.js +94 -0
- package/build/androidPackageUnparser.test.js +26 -0
- package/build/arbitrarilySlicedAsyncInterable.d.ts +3 -1
- package/build/arbitrarilySlicedAsyncInterable.js +3 -3
- 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/arrayParser.test.js +3 -3
- package/build/arrayUnparser.d.ts +1 -1
- package/build/backsmali.d.ts +3 -0
- package/build/backsmali.js +50 -0
- package/build/bsonParser.js +6 -2
- package/build/customInvariant.d.ts +2 -1
- package/build/customInvariant.js +4 -6
- package/build/dalvikBytecodeParser/formatParsers.d.ts +171 -0
- package/build/dalvikBytecodeParser/formatParsers.js +304 -0
- 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 +1207 -0
- package/build/dalvikBytecodeParser.js +1289 -0
- 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.js +25 -0
- package/build/dalvikExecutable.d.ts +215 -0
- package/build/dalvikExecutable.js +56 -0
- package/build/dalvikExecutableParser/stringSyntaxParser.d.ts +4 -0
- package/build/dalvikExecutableParser/stringSyntaxParser.js +76 -0
- package/build/dalvikExecutableParser/typeParsers.d.ts +11 -0
- package/build/dalvikExecutableParser/typeParsers.js +39 -0
- package/build/dalvikExecutableParser/typedNumbers.d.ts +106 -0
- package/build/dalvikExecutableParser/typedNumbers.js +18 -0
- package/build/dalvikExecutableParser.d.ts +5 -0
- package/build/dalvikExecutableParser.js +1757 -0
- package/build/dalvikExecutableParser.test.js +72 -0
- package/build/dalvikExecutableParserAgainstSmaliParser.test.js +275 -0
- 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.js +31 -0
- package/build/debugLogInputParser.d.ts +4 -0
- package/build/debugLogInputParser.js +16 -0
- package/build/debugLogParser.js +14 -3
- package/build/disjunctionParser.d.ts +2 -1
- package/build/disjunctionParser.js +6 -4
- package/build/elementTerminatedArrayParser.d.ts +3 -0
- package/build/elementTerminatedArrayParser.js +18 -0
- package/build/elementTerminatedArrayParser.test.js +52 -0
- package/build/elementTerminatedSequenceArrayParser.d.ts +3 -0
- package/build/elementTerminatedSequenceArrayParser.js +32 -0
- package/build/elementTerminatedSequenceArrayParser.test.js +34 -0
- package/build/elementTerminatedSequenceParser.d.ts +3 -0
- package/build/elementTerminatedSequenceParser.js +27 -0
- package/build/elementTerminatedSequenceParser.test.js +34 -0
- package/build/endOfInputParser.d.ts +1 -1
- package/build/exactElementParser.js +10 -5
- package/build/exactElementSwitchParser.d.ts +3 -0
- package/build/exactElementSwitchParser.js +22 -0
- package/build/exactSequenceParser.d.ts +2 -1
- package/build/exactSequenceParser.js +12 -2
- package/build/fetchCid.d.ts +1 -0
- package/build/fetchCid.js +103 -0
- package/build/fetchCid.test.js +16 -0
- package/build/fixedLengthSequenceParser.d.ts +1 -0
- package/build/fixedLengthSequenceParser.js +18 -1
- package/build/fixedLengthSequenceParser.test.js +41 -0
- package/build/hasExecutable.d.ts +1 -0
- package/build/hasExecutable.js +8 -0
- package/build/highResolutionTimer.d.ts +16 -0
- package/build/highResolutionTimer.js +42 -0
- package/build/inputReader.d.ts +11 -0
- package/build/inputReader.js +37 -0
- package/build/inputReader.test.js +161 -8
- package/build/inputReaderState.d.ts +10 -0
- package/build/inputReaderState.js +16 -0
- package/build/inspect.d.ts +1 -0
- package/build/inspect.js +7 -0
- package/build/javaKeyStoreParser.test.js +8 -8
- package/build/jsonParser.d.ts +2 -0
- package/build/jsonParser.js +19 -22
- 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 +7 -0
- package/build/leb128Parser.js +82 -0
- package/build/leb128Parser.test.d.ts +1 -0
- package/build/leb128Parser.test.js +107 -0
- package/build/lookaheadParser.d.ts +2 -0
- package/build/lookaheadParser.js +14 -0
- package/build/negativeLookaheadParser.js +22 -16
- package/build/negativeLookaheadParser.test.d.ts +1 -0
- package/build/negativeLookaheadParser.test.js +30 -0
- 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.d.ts +2 -0
- package/build/nonEmptyArrayParser.js +32 -0
- package/build/nonEmptyArrayParser.test.d.ts +1 -0
- package/build/nonEmptyArrayParser.test.js +17 -0
- package/build/optionalParser.js +2 -2
- package/build/parser.d.ts +11 -1
- package/build/parser.js +82 -32
- package/build/parser.test.js +141 -25
- package/build/parserAccessorParser.js +9 -1
- package/build/parserConsumedSequenceParser.d.ts +1 -1
- package/build/parserConsumedSequenceParser.js +21 -16
- package/build/parserContext.d.ts +22 -6
- package/build/parserContext.js +113 -57
- package/build/parserContext.test.js +33 -2
- package/build/parserCreatorCompose.d.ts +1 -0
- package/build/parserCreatorCompose.js +8 -2
- package/build/parserError.d.ts +605 -40
- package/build/parserError.js +98 -53
- package/build/parserImplementationInvariant.d.ts +1 -1
- package/build/parserImplementationInvariant.js +2 -2
- package/build/parserInputCompanion.d.ts +15 -0
- package/build/parserInputCompanion.js +38 -0
- package/build/promiseCompose.d.ts +1 -1
- package/build/promiseCompose.js +11 -1
- package/build/promiseSettled.d.ts +1 -0
- package/build/promiseSettled.js +4 -0
- package/build/separatedArrayParser.d.ts +2 -0
- package/build/separatedArrayParser.js +39 -0
- package/build/separatedArrayParser.test.d.ts +1 -0
- package/build/separatedArrayParser.test.js +21 -0
- 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.d.ts +10 -0
- package/build/sequenceBuffer.js +54 -2
- package/build/sequenceBuffer.test.js +57 -0
- package/build/sequenceTerminatedSequenceParser.d.ts +5 -0
- package/build/sequenceTerminatedSequenceParser.js +32 -0
- package/build/sequenceTerminatedSequenceParser.test.d.ts +1 -0
- package/build/sequenceTerminatedSequenceParser.test.js +37 -0
- package/build/sequenceUnparser.d.ts +1 -1
- package/build/skipParser.d.ts +1 -1
- package/build/skipParser.js +4 -2
- package/build/skipToParser.d.ts +2 -0
- package/build/skipToParser.js +11 -0
- package/build/sliceBoundedParser.d.ts +1 -1
- package/build/sliceBoundedParser.js +7 -2
- package/build/sliceBoundedParser.test.js +30 -1
- package/build/smali.d.ts +1 -0
- package/build/smali.js +21 -0
- package/build/smaliParser.d.ts +68 -0
- package/build/smaliParser.js +2081 -0
- package/build/smaliParser.test.d.ts +1 -0
- package/build/smaliParser.test.js +410 -0
- package/build/stringFromAsyncIterable.d.ts +1 -0
- package/build/stringFromAsyncIterable.js +7 -0
- package/build/terminatedArrayParser.d.ts +3 -1
- package/build/terminatedArrayParser.js +79 -2
- package/build/terminatedArrayParser.test.d.ts +1 -0
- package/build/terminatedArrayParser.test.js +131 -0
- package/build/toAsyncIterable.d.ts +1 -0
- package/build/toAsyncIterable.js +7 -0
- package/build/toAsyncIterator.d.ts +1 -0
- package/build/toAsyncIterator.js +33 -0
- package/build/tupleParser.d.ts +4 -0
- package/build/tupleParser.js +1 -5
- package/build/unionParser.d.ts +2 -1
- package/build/unionParser.js +29 -14
- package/build/unionParser.test.d.ts +1 -0
- package/build/unionParser.test.js +60 -0
- 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.d.ts +7 -2
- package/build/zipParser.js +36 -12
- package/build/zipUnparser.d.ts +7 -4
- package/build/zipUnparser.js +64 -45
- package/build/zipUnparser.test.js +15 -15
- package/package.json +33 -24
- package/src/allSettledStream.test.ts +40 -0
- package/src/allSettledStream.ts +47 -15
- package/src/androidPackage.ts +48 -0
- package/src/androidPackageParser.test.ts +27 -0
- package/src/{apkParser.test.ts.md → androidPackageParser.test.ts.md} +4 -4
- package/src/androidPackageParser.test.ts.snap +0 -0
- package/src/androidPackageParser.ts +398 -0
- package/src/androidPackageUnparser.test.ts +34 -0
- package/src/androidPackageUnparser.ts +126 -0
- package/src/arbitrarilySlicedAsyncInterable.ts +7 -2
- 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.test.ts +3 -3
- package/src/arrayParser.ts +2 -2
- package/src/arrayUnparser.ts +2 -2
- package/src/backsmali.ts +74 -0
- package/src/bsonParser.test.ts +12 -14
- package/src/bsonParser.ts +13 -2
- package/src/customInvariant.ts +8 -12
- package/src/dalvikBytecodeParser/formatParsers.ts +780 -0
- package/src/dalvikBytecodeParser/formatSizes.ts +35 -0
- package/src/dalvikBytecodeParser/operationFormats.ts +226 -0
- package/src/dalvikBytecodeParser.ts +2873 -0
- package/src/dalvikBytecodeUnparser/formatUnparsers.ts +442 -0
- package/src/dalvikBytecodeUnparser.test.ts +44 -0
- package/src/dalvikBytecodeUnparser.ts +758 -0
- package/src/dalvikExecutable.ts +282 -0
- package/src/dalvikExecutableParser/stringSyntaxParser.ts +145 -0
- package/src/dalvikExecutableParser/typeParsers.ts +74 -0
- package/src/dalvikExecutableParser/typedNumbers.ts +57 -0
- package/src/dalvikExecutableParser.test.ts +89 -0
- package/src/dalvikExecutableParser.test.ts.md +634 -0
- package/src/dalvikExecutableParser.test.ts.snap +0 -0
- package/src/dalvikExecutableParser.ts +3245 -0
- package/src/dalvikExecutableParserAgainstSmaliParser.test.ts +363 -0
- 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 +28 -0
- package/src/debugLogParser.ts +19 -3
- package/src/disjunctionParser.ts +12 -7
- package/src/elementTerminatedArrayParser.test.ts +99 -0
- package/src/elementTerminatedArrayParser.ts +31 -0
- package/src/elementTerminatedSequenceArrayParser.test.ts +52 -0
- package/src/elementTerminatedSequenceArrayParser.ts +52 -0
- package/src/elementTerminatedSequenceParser.test.ts +52 -0
- package/src/elementTerminatedSequenceParser.ts +43 -0
- package/src/endOfInputParser.ts +1 -1
- package/src/exactElementParser.ts +17 -11
- package/src/exactElementSwitchParser.ts +41 -0
- package/src/exactSequenceParser.ts +23 -2
- package/src/fetchCid.test.ts +20 -0
- package/src/fetchCid.ts +121 -0
- package/src/fixedLengthSequenceParser.test.ts +75 -0
- package/src/fixedLengthSequenceParser.ts +28 -1
- package/src/hasExecutable.ts +11 -0
- package/src/highResolutionTimer.ts +49 -0
- package/src/inputReader.test.ts +204 -8
- package/src/inputReader.ts +76 -3
- package/src/inputReaderState.ts +33 -0
- package/src/inspect.ts +9 -0
- package/src/javaKeyStoreParser.test.ts +12 -15
- package/src/javaKeyStoreParser.ts +2 -6
- package/src/jsonParser.test.ts +2 -4
- package/src/jsonParser.ts +46 -62
- package/src/lazyMessageError.test.ts +21 -0
- package/src/lazyMessageError.ts +88 -0
- package/src/leb128Parser.test.ts +173 -0
- package/src/leb128Parser.ts +125 -0
- package/src/lookaheadParser.ts +19 -0
- package/src/negativeLookaheadParser.test.ts +49 -0
- package/src/negativeLookaheadParser.ts +27 -15
- package/src/noStackCaptureOverheadError.test.ts +17 -0
- package/src/noStackCaptureOverheadError.ts +12 -0
- package/src/nonEmptyArrayParser.test.ts +21 -0
- package/src/nonEmptyArrayParser.ts +44 -0
- package/src/optionalParser.ts +3 -2
- package/src/parser.test.ts +203 -31
- package/src/parser.test.ts.md +34 -27
- package/src/parser.test.ts.snap +0 -0
- package/src/parser.ts +172 -45
- package/src/parserAccessorParser.ts +12 -2
- package/src/parserConsumedSequenceParser.ts +26 -17
- package/src/parserContext.test.ts +37 -2
- package/src/parserContext.ts +185 -79
- package/src/parserCreatorCompose.ts +20 -2
- package/src/parserError.ts +144 -61
- package/src/parserImplementationInvariant.ts +3 -3
- package/src/parserInputCompanion.ts +55 -0
- package/src/promiseCompose.ts +17 -3
- package/src/promiseSettled.ts +6 -0
- package/src/separatedArrayParser.test.ts +34 -0
- package/src/separatedArrayParser.ts +55 -0
- package/src/separatedNonEmptyArrayParser.test.ts +117 -0
- package/src/separatedNonEmptyArrayParser.ts +61 -0
- package/src/sequenceBuffer.test.ts +70 -0
- package/src/sequenceBuffer.ts +88 -2
- package/src/sequenceTerminatedSequenceParser.test.ts +58 -0
- package/src/sequenceTerminatedSequenceParser.ts +62 -0
- package/src/sequenceUnparser.ts +2 -2
- package/src/skipParser.ts +7 -5
- package/src/skipToParser.ts +16 -0
- package/src/sliceBoundedParser.test.ts +35 -1
- package/src/sliceBoundedParser.ts +19 -1
- package/src/smali.ts +29 -0
- package/src/smaliParser.test.ts +443 -0
- package/src/smaliParser.test.ts.md +3907 -0
- package/src/smaliParser.test.ts.snap +0 -0
- package/src/smaliParser.ts +3348 -0
- package/src/stringFromAsyncIterable.ts +9 -0
- package/src/terminatedArrayParser.test.ts +258 -0
- package/src/terminatedArrayParser.ts +109 -6
- package/src/toAsyncIterable.ts +7 -0
- package/src/toAsyncIterator.ts +48 -0
- package/src/tupleParser.ts +8 -5
- package/src/uint8Array.ts +2 -3
- package/src/unionParser.test.ts +78 -0
- package/src/unionParser.ts +47 -21
- 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 +71 -20
- package/src/zipUnparser.test.ts +19 -19
- package/src/zipUnparser.ts +139 -90
- package/tsconfig.json +7 -1
- package/xo.config.ts +15 -0
- package/.yarn/releases/yarn-4.5.3.cjs +0 -934
- package/build/apk.d.ts +0 -39
- package/build/apkParser.d.ts +0 -16
- package/build/apkParser.js +0 -164
- package/build/apkParser.test.js +0 -22
- package/build/apkUnparser.d.ts +0 -4
- package/build/apkUnparser.js +0 -90
- package/build/apkUnparser.test.js +0 -26
- package/build/arbitraryDosDate.d.ts +0 -2
- package/build/arbitraryDosDate.js +0 -8
- package/build/arbitraryZipEntry.d.ts +0 -3
- package/build/arbitraryZipEntry.js +0 -26
- package/build/createDisjunctionParser.d.ts +0 -2
- package/build/createDisjunctionParser.js +0 -47
- package/build/createExactParser.d.ts +0 -2
- package/build/createExactParser.js +0 -12
- package/build/createSequentialUnionParser.d.ts +0 -2
- package/build/createSequentialUnionParser.js +0 -69
- package/build/fixedLengthChunkParser.d.ts +0 -2
- package/build/fixedLengthChunkParser.js +0 -12
- package/build/fixedLengthParser.d.ts +0 -2
- package/build/fixedLengthParser.js +0 -12
- package/build/inputChunkBuffer.d.ts +0 -15
- package/build/inputChunkBuffer.js +0 -40
- package/build/inputChunkBuffer.test.js +0 -34
- package/build/inputCompanion.d.ts +0 -18
- package/build/inputCompanion.js +0 -28
- package/build/invariantDefined.d.ts +0 -1
- package/build/invariantDefined.js +0 -5
- package/build/invariantIdentity.d.ts +0 -3
- package/build/invariantIdentity.js +0 -5
- package/build/javaKeystoreParser.d.ts +0 -2
- package/build/javaKeystoreParser.js +0 -7
- package/build/jsonParser2.d.ts +0 -3
- package/build/jsonParser2.js +0 -52
- package/build/jsonParser2.test.js +0 -22
- package/build/negativeLookahead.d.ts +0 -2
- package/build/negativeLookahead.js +0 -18
- package/build/parserCompose.d.ts +0 -3
- package/build/parserCompose.js +0 -7
- package/build/parserImplementationInvariantInvariant.d.ts +0 -3
- package/build/parserImplementationInvariantInvariant.js +0 -15
- package/build/parserInvariant.d.ts +0 -4
- package/build/parserInvariant.js +0 -11
- package/build/promiseFish.d.ts +0 -1
- package/build/promiseFish.js +0 -3
- package/build/sequenceParser.d.ts +0 -3
- package/build/sequenceParser.js +0 -10
- package/build/terminatedSequenceParser.d.ts +0 -2
- package/build/terminatedSequenceParser.js +0 -24
- package/build/unparserInputCompanion.d.ts +0 -15
- package/build/unparserInputCompanion.js +0 -13
- package/build/zipEntry.d.ts +0 -28
- package/build/zipFile.d.ts +0 -32
- package/build/zipFileEntry.d.ts +0 -6
- package/src/apk.ts +0 -48
- package/src/apkParser.test.ts +0 -30
- package/src/apkParser.test.ts.snap +0 -0
- package/src/apkParser.ts +0 -392
- package/src/apkUnparser.test.ts +0 -37
- package/src/apkUnparser.ts +0 -120
- package/src/invariantDefined.ts +0 -6
- package/src/invariantIdentity.ts +0 -8
- /package/build/{apk.js → androidPackage.js} +0 -0
- /package/build/{apkParser.test.d.ts → androidPackageParser.test.d.ts} +0 -0
- /package/build/{apkUnparser.test.d.ts → androidPackageUnparser.test.d.ts} +0 -0
- /package/build/{arbitraryDosPermissions.d.ts → dalvikBytecodeUnparser.test.d.ts} +0 -0
- /package/build/{arbitraryDosPermissions.js → dalvikExecutableParser.test.d.ts} +0 -0
- /package/build/{inputChunkBuffer.test.d.ts → dalvikExecutableParserAgainstSmaliParser.test.d.ts} +0 -0
- /package/build/{jsonParser2.test.d.ts → dalvikExecutableUnparser.test.d.ts} +0 -0
- /package/build/{parserParsingInvariant.d.ts → elementTerminatedArrayParser.test.d.ts} +0 -0
- /package/build/{parserParsingInvariant.js → elementTerminatedSequenceArrayParser.test.d.ts} +0 -0
- /package/build/{zipEntry.js → elementTerminatedSequenceParser.test.d.ts} +0 -0
- /package/build/{zipFile.js → fetchCid.test.d.ts} +0 -0
- /package/build/{zipFileEntry.js → fixedLengthSequenceParser.test.d.ts} +0 -0
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
|
|
2
|
+
export type DalvikExecutableAccessFlags = {
|
|
3
|
+
public: boolean;
|
|
4
|
+
private: boolean;
|
|
5
|
+
protected: boolean;
|
|
6
|
+
static: boolean;
|
|
7
|
+
final: boolean;
|
|
8
|
+
synchronized: boolean;
|
|
9
|
+
volatile: boolean;
|
|
10
|
+
bridge: boolean;
|
|
11
|
+
transient: boolean;
|
|
12
|
+
varargs: boolean;
|
|
13
|
+
native: boolean;
|
|
14
|
+
interface: boolean;
|
|
15
|
+
abstract: boolean;
|
|
16
|
+
strict: boolean;
|
|
17
|
+
synthetic: boolean;
|
|
18
|
+
annotation: boolean;
|
|
19
|
+
enum: boolean;
|
|
20
|
+
constructor: boolean;
|
|
21
|
+
declaredSynchronized: boolean;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export function dalvikExecutableAccessFlagsDefault(): DalvikExecutableAccessFlags {
|
|
25
|
+
return {
|
|
26
|
+
public: false,
|
|
27
|
+
private: false,
|
|
28
|
+
protected: false,
|
|
29
|
+
static: false,
|
|
30
|
+
final: false,
|
|
31
|
+
synchronized: false,
|
|
32
|
+
volatile: false,
|
|
33
|
+
bridge: false,
|
|
34
|
+
transient: false,
|
|
35
|
+
varargs: false,
|
|
36
|
+
native: false,
|
|
37
|
+
interface: false,
|
|
38
|
+
abstract: false,
|
|
39
|
+
strict: false,
|
|
40
|
+
synthetic: false,
|
|
41
|
+
annotation: false,
|
|
42
|
+
enum: false,
|
|
43
|
+
constructor: false,
|
|
44
|
+
declaredSynchronized: false,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export type DalvikExecutableEncodedValue =
|
|
49
|
+
| { type: 'byte'; value: number }
|
|
50
|
+
| { type: 'short'; value: number }
|
|
51
|
+
| { type: 'char'; value: number }
|
|
52
|
+
| { type: 'int'; value: number }
|
|
53
|
+
| { type: 'long'; value: bigint }
|
|
54
|
+
| { type: 'float'; value: number }
|
|
55
|
+
| { type: 'double'; value: number }
|
|
56
|
+
| { type: 'methodType'; value: DalvikExecutablePrototype }
|
|
57
|
+
| { type: 'methodHandle'; value: number }
|
|
58
|
+
| { type: 'string'; value: string }
|
|
59
|
+
| { type: 'type'; value: string }
|
|
60
|
+
| { type: 'field'; value: DalvikExecutableField }
|
|
61
|
+
| { type: 'method'; value: DalvikExecutableMethod }
|
|
62
|
+
| { type: 'enum'; value: DalvikExecutableField }
|
|
63
|
+
| { type: 'array'; value: DalvikExecutableEncodedValue[] }
|
|
64
|
+
| { type: 'annotation'; value: DalvikExecutableAnnotation }
|
|
65
|
+
// eslint-disable-next-line @typescript-eslint/no-restricted-types
|
|
66
|
+
| { type: 'null'; value: null }
|
|
67
|
+
| { type: 'boolean'; value: boolean };
|
|
68
|
+
|
|
69
|
+
type DalvikExecutableTry = {
|
|
70
|
+
startAddress: number;
|
|
71
|
+
instructionCount: number;
|
|
72
|
+
handler: DalvikExecutableEncodedCatchHandler;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
type DalvikExecutableEncodedTypeAddressPair = {
|
|
76
|
+
type: string;
|
|
77
|
+
address: number;
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
type DalvikExecutableEncodedCatchHandler = {
|
|
81
|
+
handlers: DalvikExecutableEncodedTypeAddressPair[];
|
|
82
|
+
catchAllAddress: undefined | number;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export type DalvikExecutableCode<Instructions> = {
|
|
86
|
+
registersSize: number;
|
|
87
|
+
insSize: number;
|
|
88
|
+
outsSize: number;
|
|
89
|
+
debugInfo: undefined | DalvikExecutableDebugInfo;
|
|
90
|
+
instructions: Instructions;
|
|
91
|
+
tries: DalvikExecutableTry[];
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
type DalvikExecutableDebugByteCodeValue =
|
|
95
|
+
| {
|
|
96
|
+
type: 'advancePc';
|
|
97
|
+
addressDiff: number;
|
|
98
|
+
}
|
|
99
|
+
| {
|
|
100
|
+
type: 'advanceLine';
|
|
101
|
+
lineDiff: number;
|
|
102
|
+
}
|
|
103
|
+
| {
|
|
104
|
+
type: 'startLocal';
|
|
105
|
+
registerNum: number;
|
|
106
|
+
name: undefined | string;
|
|
107
|
+
type_: undefined | string;
|
|
108
|
+
}
|
|
109
|
+
| {
|
|
110
|
+
type: 'startLocalExtended';
|
|
111
|
+
registerNum: number;
|
|
112
|
+
name: undefined | string;
|
|
113
|
+
type_: undefined | string;
|
|
114
|
+
signature: undefined | string;
|
|
115
|
+
}
|
|
116
|
+
| {
|
|
117
|
+
type: 'endLocal';
|
|
118
|
+
registerNum: number;
|
|
119
|
+
}
|
|
120
|
+
| {
|
|
121
|
+
type: 'restartLocal';
|
|
122
|
+
registerNum: number;
|
|
123
|
+
}
|
|
124
|
+
| {
|
|
125
|
+
type: 'setPrologueEnd';
|
|
126
|
+
}
|
|
127
|
+
| {
|
|
128
|
+
type: 'setEpilogueBegin';
|
|
129
|
+
}
|
|
130
|
+
| {
|
|
131
|
+
type: 'setFile';
|
|
132
|
+
name: undefined | string;
|
|
133
|
+
}
|
|
134
|
+
| {
|
|
135
|
+
type: 'special';
|
|
136
|
+
value: number;
|
|
137
|
+
}
|
|
138
|
+
;
|
|
139
|
+
|
|
140
|
+
type DalvikExecutableDebugByteCode = DalvikExecutableDebugByteCodeValue[];
|
|
141
|
+
|
|
142
|
+
export type DalvikExecutableDebugInfo = {
|
|
143
|
+
lineStart: number;
|
|
144
|
+
parameterNames: Array<undefined | string>;
|
|
145
|
+
bytecode: DalvikExecutableDebugByteCode;
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
type DalvikExecutableAnnotationItemVisibility =
|
|
149
|
+
| 'build'
|
|
150
|
+
| 'runtime'
|
|
151
|
+
| 'system'
|
|
152
|
+
;
|
|
153
|
+
|
|
154
|
+
type DalvikExecutableAnnotationElement = {
|
|
155
|
+
name: string;
|
|
156
|
+
value: DalvikExecutableEncodedValue;
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
export type DalvikExecutableAnnotation = {
|
|
160
|
+
visibility: DalvikExecutableAnnotationItemVisibility;
|
|
161
|
+
type: string;
|
|
162
|
+
elements: DalvikExecutableAnnotationElement[];
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
export type DalvikExecutablePrototype = {
|
|
166
|
+
shorty: string;
|
|
167
|
+
returnType: string;
|
|
168
|
+
parameters: string[];
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
export type DalvikExecutableField = {
|
|
172
|
+
class: string;
|
|
173
|
+
type: string;
|
|
174
|
+
name: string;
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
export function isDalvikExecutableField(x: unknown): x is DalvikExecutableField {
|
|
178
|
+
return (
|
|
179
|
+
x !== null
|
|
180
|
+
&& typeof x === 'object'
|
|
181
|
+
&& 'class' in x
|
|
182
|
+
&& 'type' in x
|
|
183
|
+
&& 'name' in x
|
|
184
|
+
&& typeof (x as DalvikExecutableField).class === 'string'
|
|
185
|
+
&& typeof (x as DalvikExecutableField).type === 'string'
|
|
186
|
+
&& typeof (x as DalvikExecutableField).name === 'string'
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export function dalvikExecutableFieldEquals(a: DalvikExecutableField, b: DalvikExecutableField): boolean {
|
|
191
|
+
return (
|
|
192
|
+
a.class === b.class
|
|
193
|
+
&& a.type === b.type
|
|
194
|
+
&& a.name === b.name
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export type DalvikExecutableFieldWithAccess = {
|
|
199
|
+
field: DalvikExecutableField;
|
|
200
|
+
accessFlags: DalvikExecutableAccessFlags;
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
export type DalvikExecutableMethod = {
|
|
204
|
+
class: string;
|
|
205
|
+
prototype: DalvikExecutablePrototype;
|
|
206
|
+
name: string;
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
export function isDalvikExecutableMethod(x: unknown): x is DalvikExecutableMethod {
|
|
210
|
+
return (
|
|
211
|
+
x !== null
|
|
212
|
+
&& typeof x === 'object'
|
|
213
|
+
&& 'class' in x
|
|
214
|
+
&& 'prototype' in x
|
|
215
|
+
&& 'name' in x
|
|
216
|
+
&& typeof (x as DalvikExecutableMethod).class === 'string'
|
|
217
|
+
&& typeof (x as DalvikExecutableMethod).prototype === 'object'
|
|
218
|
+
&& typeof (x as DalvikExecutableMethod).name === 'string'
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
export function dalvikExecutableMethodEquals(a: DalvikExecutableMethod, b: DalvikExecutableMethod): boolean {
|
|
223
|
+
return (
|
|
224
|
+
a.class === b.class
|
|
225
|
+
&& a.name === b.name
|
|
226
|
+
&& a.prototype.shorty === b.prototype.shorty
|
|
227
|
+
&& a.prototype.returnType === b.prototype.returnType
|
|
228
|
+
&& a.prototype.parameters.length === b.prototype.parameters.length
|
|
229
|
+
&& a.prototype.parameters.every((v, i) => v === b.prototype.parameters[i])
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
export type DalvikExecutableMethodWithAccess<Instructions> = {
|
|
234
|
+
method: DalvikExecutableMethod;
|
|
235
|
+
accessFlags: DalvikExecutableAccessFlags;
|
|
236
|
+
code: undefined | DalvikExecutableCode<Instructions>;
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
export type DalvikExecutableClassFieldAnnotation = {
|
|
240
|
+
field: DalvikExecutableField;
|
|
241
|
+
annotations: undefined | DalvikExecutableAnnotation[];
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
export type DalvikExecutableClassMethodAnnotation = {
|
|
245
|
+
method: DalvikExecutableMethod;
|
|
246
|
+
annotations: DalvikExecutableAnnotation[];
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
export type DalvikExecutableClassParameterAnnotation = {
|
|
250
|
+
method: DalvikExecutableMethod;
|
|
251
|
+
annotations: DalvikExecutableAnnotation[][];
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
export type DalvikExecutableClassAnnotations = {
|
|
255
|
+
classAnnotations: DalvikExecutableAnnotation[];
|
|
256
|
+
fieldAnnotations: DalvikExecutableClassFieldAnnotation[];
|
|
257
|
+
methodAnnotations: DalvikExecutableClassMethodAnnotation[];
|
|
258
|
+
parameterAnnotations: DalvikExecutableClassParameterAnnotation[];
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
export type DalvikExecutableClassData<Instructions> = {
|
|
262
|
+
staticFields: DalvikExecutableFieldWithAccess[];
|
|
263
|
+
instanceFields: DalvikExecutableFieldWithAccess[];
|
|
264
|
+
directMethods: Array<DalvikExecutableMethodWithAccess<Instructions>>;
|
|
265
|
+
virtualMethods: Array<DalvikExecutableMethodWithAccess<Instructions>>;
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
export type DalvikExecutableClassDefinition<Instructions> = {
|
|
269
|
+
class: string;
|
|
270
|
+
accessFlags: DalvikExecutableAccessFlags;
|
|
271
|
+
superclass: string;
|
|
272
|
+
interfaces: string[];
|
|
273
|
+
sourceFile: undefined | string;
|
|
274
|
+
annotations: undefined | DalvikExecutableClassAnnotations;
|
|
275
|
+
staticValues: DalvikExecutableEncodedValue[];
|
|
276
|
+
classData: undefined | DalvikExecutableClassData<Instructions>;
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
export type DalvikExecutable<Instructions> = {
|
|
280
|
+
classDefinitions: Array<DalvikExecutableClassDefinition<Instructions>>;
|
|
281
|
+
link: undefined | Uint8Array;
|
|
282
|
+
};
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import invariant from 'invariant';
|
|
2
|
+
import { type Parser, setParserName } from '../parser.js';
|
|
3
|
+
import { type ParserContext } from '../parserContext.js';
|
|
4
|
+
import { promiseCompose } from '../promiseCompose.js';
|
|
5
|
+
import { createSeparatedArrayParser } from '../separatedArrayParser.js';
|
|
6
|
+
import { createExactSequenceParser } from '../exactSequenceParser.js';
|
|
7
|
+
import { createUnionParser } from '../unionParser.js';
|
|
8
|
+
import { createTupleParser } from '../tupleParser.js';
|
|
9
|
+
import { createArrayParser } from '../arrayParser.js';
|
|
10
|
+
|
|
11
|
+
export const smaliSimpleNameParser: Parser<string, string> = async (parserContext: ParserContext<string, string>) => {
|
|
12
|
+
const characters: string[] = [];
|
|
13
|
+
|
|
14
|
+
while (true) {
|
|
15
|
+
const character = await parserContext.peek(0);
|
|
16
|
+
|
|
17
|
+
parserContext.invariant(character !== undefined, 'Unexpected end of input');
|
|
18
|
+
|
|
19
|
+
invariant(character !== undefined, 'Unexpected end of input');
|
|
20
|
+
|
|
21
|
+
if (
|
|
22
|
+
(
|
|
23
|
+
character >= 'a' && character <= 'z'
|
|
24
|
+
)
|
|
25
|
+
|| (
|
|
26
|
+
character >= 'A' && character <= 'Z'
|
|
27
|
+
)
|
|
28
|
+
|| (
|
|
29
|
+
character >= '0' && character <= '9'
|
|
30
|
+
)
|
|
31
|
+
|| (
|
|
32
|
+
character === ' '
|
|
33
|
+
)
|
|
34
|
+
|| (
|
|
35
|
+
character === '$'
|
|
36
|
+
)
|
|
37
|
+
|| (
|
|
38
|
+
character === '-'
|
|
39
|
+
)
|
|
40
|
+
|| (
|
|
41
|
+
character === '_'
|
|
42
|
+
)
|
|
43
|
+
|| (
|
|
44
|
+
character === '\u00A0'
|
|
45
|
+
)
|
|
46
|
+
|| (
|
|
47
|
+
character >= '\u00A1' && character <= '\u1FFF'
|
|
48
|
+
)
|
|
49
|
+
|| (
|
|
50
|
+
character >= '\u2000' && character <= '\u200A'
|
|
51
|
+
)
|
|
52
|
+
|| (
|
|
53
|
+
character >= '\u2010' && character <= '\u2027'
|
|
54
|
+
)
|
|
55
|
+
|| (
|
|
56
|
+
character === '\u202F'
|
|
57
|
+
)
|
|
58
|
+
|| (
|
|
59
|
+
character >= '\u2030' && character <= '\uD7FF'
|
|
60
|
+
)
|
|
61
|
+
|| (
|
|
62
|
+
character >= '\uE000' && character <= '\uFFEF'
|
|
63
|
+
)
|
|
64
|
+
|| (
|
|
65
|
+
character >= '\uD800' && character <= '\uDBFF'
|
|
66
|
+
)
|
|
67
|
+
) {
|
|
68
|
+
parserContext.skip(1);
|
|
69
|
+
|
|
70
|
+
characters.push(character);
|
|
71
|
+
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
parserContext.invariant(characters.length > 0, 'Expected at least one character');
|
|
76
|
+
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return characters.join('');
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
setParserName(smaliSimpleNameParser, 'smaliSimpleNameParser');
|
|
84
|
+
|
|
85
|
+
export const smaliMemberNameParser: Parser<string, string> = createUnionParser([
|
|
86
|
+
smaliSimpleNameParser,
|
|
87
|
+
promiseCompose(
|
|
88
|
+
createTupleParser([
|
|
89
|
+
createExactSequenceParser('<'),
|
|
90
|
+
smaliSimpleNameParser,
|
|
91
|
+
createExactSequenceParser('>'),
|
|
92
|
+
]),
|
|
93
|
+
strings => strings.join(''),
|
|
94
|
+
),
|
|
95
|
+
]);
|
|
96
|
+
|
|
97
|
+
setParserName(smaliMemberNameParser, 'smaliMemberNameParser');
|
|
98
|
+
|
|
99
|
+
const smaliFullClassNameParser: Parser<string, string> = promiseCompose(
|
|
100
|
+
createSeparatedArrayParser(
|
|
101
|
+
smaliMemberNameParser,
|
|
102
|
+
createExactSequenceParser('/'),
|
|
103
|
+
),
|
|
104
|
+
pathSegments => pathSegments.join('/'),
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
setParserName(smaliFullClassNameParser, 'smaliFullClassNameParser');
|
|
108
|
+
|
|
109
|
+
const smaliNonArrayFieldTypeDescriptorParser: Parser<string, string> = createUnionParser([
|
|
110
|
+
createExactSequenceParser('Z'),
|
|
111
|
+
createExactSequenceParser('B'),
|
|
112
|
+
createExactSequenceParser('S'),
|
|
113
|
+
createExactSequenceParser('C'),
|
|
114
|
+
createExactSequenceParser('I'),
|
|
115
|
+
createExactSequenceParser('J'),
|
|
116
|
+
createExactSequenceParser('F'),
|
|
117
|
+
createExactSequenceParser('D'),
|
|
118
|
+
promiseCompose(
|
|
119
|
+
createTupleParser([
|
|
120
|
+
createExactSequenceParser('L'),
|
|
121
|
+
smaliFullClassNameParser,
|
|
122
|
+
createExactSequenceParser(';'),
|
|
123
|
+
]),
|
|
124
|
+
strings => strings.join(''),
|
|
125
|
+
),
|
|
126
|
+
]);
|
|
127
|
+
|
|
128
|
+
setParserName(smaliNonArrayFieldTypeDescriptorParser, 'smaliNonArrayFieldTypeDescriptorParser');
|
|
129
|
+
|
|
130
|
+
const smaliFieldTypeDescriptorParser: Parser<string, string> = promiseCompose(
|
|
131
|
+
createTupleParser([
|
|
132
|
+
createArrayParser(createExactSequenceParser('[')),
|
|
133
|
+
smaliNonArrayFieldTypeDescriptorParser,
|
|
134
|
+
]),
|
|
135
|
+
([ strings, string ]) => strings.join('') + string,
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
setParserName(smaliFieldTypeDescriptorParser, 'smaliFieldTypeDescriptorParser');
|
|
139
|
+
|
|
140
|
+
export const smaliTypeDescriptorParser: Parser<string, string> = createUnionParser([
|
|
141
|
+
createExactSequenceParser('V'),
|
|
142
|
+
smaliFieldTypeDescriptorParser,
|
|
143
|
+
]);
|
|
144
|
+
|
|
145
|
+
setParserName(smaliTypeDescriptorParser, 'smaliTypeDescriptorParser');
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { createElementParser } from '../elementParser.js';
|
|
2
|
+
import { createFixedLengthSequenceParser } from '../fixedLengthSequenceParser.js';
|
|
3
|
+
import { uleb128NumberParser } from '../leb128Parser.js';
|
|
4
|
+
import { type Parser } from '../parser.js';
|
|
5
|
+
import { parserCreatorCompose } from '../parserCreatorCompose.js';
|
|
6
|
+
import { promiseCompose } from '../promiseCompose.js';
|
|
7
|
+
|
|
8
|
+
export const uleb128p1NumberParser: Parser<number, Uint8Array> = async parserContext => {
|
|
9
|
+
const value = await uleb128NumberParser(parserContext);
|
|
10
|
+
return value - 1;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export const ubyteParser: Parser<number, Uint8Array> = createElementParser();
|
|
14
|
+
|
|
15
|
+
export const byteParser: Parser<number, Uint8Array> = promiseCompose(
|
|
16
|
+
ubyteParser,
|
|
17
|
+
ubyte => ubyte > 127 ? ubyte - 256 : ubyte,
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
export const shortParser: Parser<number, Uint8Array> = promiseCompose(
|
|
21
|
+
createFixedLengthSequenceParser<Uint8Array>(2),
|
|
22
|
+
uint8Array => {
|
|
23
|
+
const buffer = Buffer.from(uint8Array);
|
|
24
|
+
return buffer.readInt16LE(0);
|
|
25
|
+
},
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
export const ushortParser: Parser<number, Uint8Array> = promiseCompose(
|
|
29
|
+
createFixedLengthSequenceParser<Uint8Array>(2),
|
|
30
|
+
uint8Array => {
|
|
31
|
+
const buffer = Buffer.from(uint8Array);
|
|
32
|
+
return buffer.readUInt16LE(0);
|
|
33
|
+
},
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
export const createExactUshortParser = (expectedValue: number): Parser<number, Uint8Array> => parserCreatorCompose(
|
|
37
|
+
() => ushortParser,
|
|
38
|
+
ushortValue => async parserContext => {
|
|
39
|
+
parserContext.invariant(ushortValue === expectedValue, `Expected ushort value ${expectedValue}, got ${ushortValue}`);
|
|
40
|
+
return ushortValue;
|
|
41
|
+
},
|
|
42
|
+
)();
|
|
43
|
+
|
|
44
|
+
export const intParser: Parser<number, Uint8Array> = promiseCompose(
|
|
45
|
+
createFixedLengthSequenceParser<Uint8Array>(4),
|
|
46
|
+
uint8Array => {
|
|
47
|
+
const buffer = Buffer.from(uint8Array);
|
|
48
|
+
return buffer.readInt32LE(0);
|
|
49
|
+
},
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
export const uintParser: Parser<number, Uint8Array> = promiseCompose(
|
|
53
|
+
createFixedLengthSequenceParser<Uint8Array>(4),
|
|
54
|
+
uint8Array => {
|
|
55
|
+
const buffer = Buffer.from(uint8Array);
|
|
56
|
+
return buffer.readUInt32LE(0);
|
|
57
|
+
},
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
export const longParser: Parser<bigint, Uint8Array> = promiseCompose(
|
|
61
|
+
createFixedLengthSequenceParser<Uint8Array>(8),
|
|
62
|
+
uint8Array => {
|
|
63
|
+
const buffer = Buffer.from(uint8Array);
|
|
64
|
+
return buffer.readBigInt64LE(0);
|
|
65
|
+
},
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
export const ulongParser: Parser<bigint, Uint8Array> = promiseCompose(
|
|
69
|
+
createFixedLengthSequenceParser<Uint8Array>(8),
|
|
70
|
+
uint8Array => {
|
|
71
|
+
const buffer = Buffer.from(uint8Array);
|
|
72
|
+
return buffer.readBigUInt64LE(0);
|
|
73
|
+
},
|
|
74
|
+
);
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { type Newtype, iso } from 'newtype-ts';
|
|
2
|
+
|
|
3
|
+
export type IndexIntoStringIds = {} & Newtype<{ readonly IndexIntoStringIds: unique symbol }, number>;
|
|
4
|
+
export const isoIndexIntoStringIds = iso<IndexIntoStringIds>();
|
|
5
|
+
|
|
6
|
+
export type IndexIntoTypeIds = {} & Newtype<{ readonly IndexIntoTypeIds: unique symbol }, number>;
|
|
7
|
+
export const isoIndexIntoTypeIds = iso<IndexIntoTypeIds>();
|
|
8
|
+
|
|
9
|
+
export type IndexIntoPrototypeIds = {} & Newtype<{ readonly IndexIntoPrototypeIds: unique symbol }, number>;
|
|
10
|
+
export const isoIndexIntoPrototypeIds = iso<IndexIntoPrototypeIds>();
|
|
11
|
+
|
|
12
|
+
export type IndexIntoFieldIds = {} & Newtype<{ readonly IndexIntoFieldIds: unique symbol }, number>;
|
|
13
|
+
export const isoIndexIntoFieldIds = iso<IndexIntoFieldIds>();
|
|
14
|
+
|
|
15
|
+
export type IndexIntoMethodIds = {} & Newtype<{ readonly IndexIntoMethodIds: unique symbol }, number>;
|
|
16
|
+
export const isoIndexIntoMethodIds = iso<IndexIntoMethodIds>();
|
|
17
|
+
|
|
18
|
+
export type OffsetToStringDataItem = {} & Newtype<{ readonly OffsetToStringDataItem: unique symbol }, number>;
|
|
19
|
+
export const isoOffsetToStringDataItem = iso<OffsetToStringDataItem>();
|
|
20
|
+
|
|
21
|
+
export type OffsetToTypeList = {} & Newtype<{ readonly OffsetToTypeList: unique symbol }, number>;
|
|
22
|
+
export const isoOffsetToTypeList = iso<OffsetToTypeList>();
|
|
23
|
+
|
|
24
|
+
export type OffsetToAnnotationsDirectoryItem = {} & Newtype<{ readonly OffsetToAnnotationsDirectoryItem: unique symbol }, number>;
|
|
25
|
+
export const isoOffsetToAnnotationsDirectoryItem = iso<OffsetToAnnotationsDirectoryItem>();
|
|
26
|
+
|
|
27
|
+
export type OffsetToAnnotationSetItem = {} & Newtype<{ readonly OffsetToAnnotationSetItem: unique symbol }, number>;
|
|
28
|
+
export const isoOffsetToAnnotationSetItem = iso<OffsetToAnnotationSetItem>();
|
|
29
|
+
|
|
30
|
+
export type OffsetToAnnotationSetRefListItem = {} & Newtype<{ readonly OffsetToAnnotationSetRefListItem: unique symbol }, number>;
|
|
31
|
+
export const isoOffsetToAnnotationSetRefListItem = iso<OffsetToAnnotationSetRefListItem>();
|
|
32
|
+
|
|
33
|
+
export type OffsetToClassDataItem = {} & Newtype<{ readonly OffsetToClassDataItem: unique symbol }, number>;
|
|
34
|
+
export const isoOffsetToClassDataItem = iso<OffsetToClassDataItem>();
|
|
35
|
+
|
|
36
|
+
export type OffsetToEncodedArrayItem = {} & Newtype<{ readonly OffsetToEncodedArrayItem: unique symbol }, number>;
|
|
37
|
+
export const isoOffsetToEncodedArrayItem = iso<OffsetToEncodedArrayItem>();
|
|
38
|
+
|
|
39
|
+
export type OffsetToCodeItem = {} & Newtype<{ readonly OffsetToCodeItem: unique symbol }, number>;
|
|
40
|
+
export const isoOffsetToCodeItem = iso<OffsetToCodeItem>();
|
|
41
|
+
|
|
42
|
+
export type OffsetToDebugInfoItem = {} & Newtype<{ readonly OffsetToDebugInfoItem: unique symbol }, number>;
|
|
43
|
+
export const isoOffsetToDebugInfoItem = iso<OffsetToDebugInfoItem>();
|
|
44
|
+
|
|
45
|
+
export type OffsetToAnnotationItem = {} & Newtype<{ readonly OffsetToAnnotationItem: unique symbol }, number>;
|
|
46
|
+
export const isoOffsetToAnnotationItem = iso<OffsetToAnnotationItem>();
|
|
47
|
+
|
|
48
|
+
export type OffsetFromEncodedCatchHandlerListToEncodedCatchHandler = {} & Newtype<{ readonly OffsetFromEncodedCatchHandlerListToEncodedCatchHandler: unique symbol }, number>;
|
|
49
|
+
export const isoOffsetFromEncodedCatchHandlerListToEncodedCatchHandler = iso<OffsetFromEncodedCatchHandlerListToEncodedCatchHandler>();
|
|
50
|
+
|
|
51
|
+
export type TypedNumberArray<IndexType, ValueType> = {
|
|
52
|
+
get length(): number;
|
|
53
|
+
at(index: IndexType): undefined | ValueType;
|
|
54
|
+
map<NewValueType>(fn: (value: ValueType, index: IndexType) => NewValueType): TypedNumberArray<IndexType, NewValueType>;
|
|
55
|
+
[Symbol.iterator](): IterableIterator<ValueType>;
|
|
56
|
+
} & Newtype<{ readonly TypedNumberArray: unique symbol }, ValueType[]>;
|
|
57
|
+
export const getIsoTypedNumberArray = <IndexType, ValueType>() => iso<TypedNumberArray<IndexType, ValueType>>();
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import { runParser } from './parser.js';
|
|
3
|
+
import { uint8ArrayParserInputCompanion } from './parserInputCompanion.js';
|
|
4
|
+
import { dalvikExecutableParser, dalvikExecutableWithRawInstructionsParser } from './dalvikExecutableParser.js';
|
|
5
|
+
import { fetchCid } from './fetchCid.js';
|
|
6
|
+
|
|
7
|
+
const dexWithRawInstructionsMacro = test.macro({
|
|
8
|
+
title: (providedTitle, dexCid: string) => providedTitle ?? `dex (with instructions as bytes) ${dexCid}`,
|
|
9
|
+
async exec(t, dexCid: string, shouldSnapshot: boolean) {
|
|
10
|
+
const dexStream = await fetchCid(dexCid);
|
|
11
|
+
|
|
12
|
+
const actual = await runParser(dalvikExecutableWithRawInstructionsParser, dexStream, uint8ArrayParserInputCompanion, {
|
|
13
|
+
errorJoinMode: 'all',
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
if (shouldSnapshot) {
|
|
17
|
+
t.snapshot(actual);
|
|
18
|
+
} else {
|
|
19
|
+
// Console.dir(actual, { depth: null });
|
|
20
|
+
t.pass();
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
test.serial(dexWithRawInstructionsMacro, 'bafkreibb4gsprc3fvmnyqx6obswvm7e7wngnfj64gz65ey72r7xgyzymt4', true);
|
|
26
|
+
test.serial(dexWithRawInstructionsMacro, 'bafybeiebe27ylo53trgitu6fqfbmba43c4ivxj3nt4kumsilkucpbdxtqq', false);
|
|
27
|
+
test.serial(dexWithRawInstructionsMacro, 'bafybeibbupm7uzhuq4pa674rb2amxsenbdaoijigmaf4onaodaql4mh7yy', false);
|
|
28
|
+
test.serial(dexWithRawInstructionsMacro, 'bafybeicb3qajmwy6li7hche2nkucvytaxcyxhwhphmi73tgydjzmyoqoda', false);
|
|
29
|
+
|
|
30
|
+
type ObjectPath = Array<string | symbol | number>;
|
|
31
|
+
|
|
32
|
+
function objectWalk(object: unknown, f: (path: ObjectPath, value: unknown) => void, initialPath: ObjectPath = []) {
|
|
33
|
+
f(initialPath, object);
|
|
34
|
+
|
|
35
|
+
if (
|
|
36
|
+
!object
|
|
37
|
+
|| typeof object !== 'object'
|
|
38
|
+
) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (Array.isArray(object)) {
|
|
43
|
+
for (const [ index, value ] of object.entries()) {
|
|
44
|
+
objectWalk(value, f, [ ...initialPath, index ]);
|
|
45
|
+
}
|
|
46
|
+
} else {
|
|
47
|
+
for (const [ key, value ] of Object.entries(object)) {
|
|
48
|
+
objectWalk(value, f, [ ...initialPath, key ]);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const dexWithParsedInstructionsMacro = test.macro({
|
|
54
|
+
title: (providedTitle, dexCid: string) => providedTitle ?? `dex (with parsed instructions) ${dexCid}`,
|
|
55
|
+
async exec(t, dexCid: string, shouldSnapshot: boolean) {
|
|
56
|
+
const dexStream = await fetchCid(dexCid);
|
|
57
|
+
|
|
58
|
+
debugger;
|
|
59
|
+
|
|
60
|
+
const actual = await runParser(dalvikExecutableParser, dexStream, uint8ArrayParserInputCompanion, {
|
|
61
|
+
errorJoinMode: 'all',
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
debugger;
|
|
65
|
+
|
|
66
|
+
objectWalk(actual, path => {
|
|
67
|
+
const key = path.at(-1);
|
|
68
|
+
|
|
69
|
+
if (typeof key !== 'string') {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
t.false(key.endsWith('Offset') && key !== 'branchOffset', 'All offsets should be resolved: ' + path.join('.'));
|
|
74
|
+
t.false(key.endsWith('Index'), 'All indexes should be resolved: ' + path.join('.'));
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
if (shouldSnapshot) {
|
|
78
|
+
t.snapshot(actual);
|
|
79
|
+
} else {
|
|
80
|
+
// Console.dir(actual, { depth: null });
|
|
81
|
+
t.pass();
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test.serial.only(dexWithParsedInstructionsMacro, 'bafkreibb4gsprc3fvmnyqx6obswvm7e7wngnfj64gz65ey72r7xgyzymt4', true);
|
|
87
|
+
test.serial.skip(dexWithParsedInstructionsMacro, 'bafybeiebe27ylo53trgitu6fqfbmba43c4ivxj3nt4kumsilkucpbdxtqq', false);
|
|
88
|
+
test.serial.skip(dexWithParsedInstructionsMacro, 'bafybeibbupm7uzhuq4pa674rb2amxsenbdaoijigmaf4onaodaql4mh7yy', false);
|
|
89
|
+
test.serial.skip(dexWithParsedInstructionsMacro, 'bafybeicb3qajmwy6li7hche2nkucvytaxcyxhwhphmi73tgydjzmyoqoda', false);
|