@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
package/src/unionParser.ts
CHANGED
|
@@ -1,52 +1,74 @@
|
|
|
1
1
|
import { allSettledStream } from './allSettledStream.js';
|
|
2
2
|
import { getParserName, setParserName, type Parser } from './parser.js';
|
|
3
3
|
import { type ParserContext } from './parserContext.js';
|
|
4
|
-
import { ParserParsingFailedError } from './parserError.js';
|
|
4
|
+
import { isParserParsingFailedError, ParserParsingFailedError } from './parserError.js';
|
|
5
5
|
import { parserImplementationInvariant } from './parserImplementationInvariant.js';
|
|
6
|
+
import { type DeriveSequenceElement } from './sequence.js';
|
|
7
|
+
|
|
8
|
+
const bigintReplacer = (_key: string, value: unknown) => {
|
|
9
|
+
if (typeof value === 'bigint') {
|
|
10
|
+
return `${value}n`;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
return value;
|
|
14
|
+
};
|
|
6
15
|
|
|
7
16
|
export const createUnionParser = <
|
|
8
17
|
Output,
|
|
9
18
|
Sequence,
|
|
19
|
+
Element = DeriveSequenceElement<Sequence>,
|
|
10
20
|
>(
|
|
11
|
-
childParsers: Array<Parser<
|
|
12
|
-
): Parser<Output, Sequence,
|
|
21
|
+
childParsers: Array<Parser<unknown, Sequence, Element>>,
|
|
22
|
+
): Parser<Output, Sequence, Element> => {
|
|
13
23
|
parserImplementationInvariant(childParsers.length > 0, 'Union parser must have at least one child parser.');
|
|
14
24
|
|
|
15
|
-
|
|
16
|
-
|
|
25
|
+
type TaskContext = {
|
|
26
|
+
childParser: Parser<unknown, Sequence, Element>;
|
|
27
|
+
childParserContext: ParserContext<Sequence, Element>;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const unionParser: Parser<Output, Sequence, Element> = async parserContext => {
|
|
31
|
+
let runningChildParserContexts: TaskContext[] = [];
|
|
17
32
|
|
|
18
|
-
const
|
|
33
|
+
const createChildParserTask = (childParser: Parser<unknown, Sequence, Element>) => {
|
|
19
34
|
const childParserContext = parserContext.lookahead({
|
|
20
35
|
debugName: getParserName(childParser, 'anonymousUnionChild'),
|
|
21
36
|
});
|
|
22
37
|
|
|
23
|
-
|
|
38
|
+
const context: TaskContext = {
|
|
39
|
+
childParser,
|
|
40
|
+
childParserContext,
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
runningChildParserContexts.push(context);
|
|
44
|
+
|
|
45
|
+
const getChildParserPromise = (async () => childParser(childParserContext) as Promise<Output>);
|
|
24
46
|
|
|
25
|
-
const promise =
|
|
47
|
+
const promise = getChildParserPromise();
|
|
26
48
|
|
|
27
49
|
return {
|
|
28
50
|
promise,
|
|
29
|
-
context
|
|
51
|
+
context,
|
|
30
52
|
};
|
|
31
|
-
}
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
const childParserResults = allSettledStream<Output, TaskContext>(childParsers.map(createChildParserTask));
|
|
32
56
|
|
|
33
57
|
const parserParsingFailedErrors: ParserParsingFailedError[] = [];
|
|
34
58
|
const successfulParserOutputs: Output[] = [];
|
|
35
|
-
const
|
|
59
|
+
const successfulTaskContexts: TaskContext[] = [];
|
|
36
60
|
let didUnlookahead = false;
|
|
37
61
|
|
|
38
62
|
for await (const childParserResult of childParserResults) {
|
|
39
|
-
runningChildParserContexts = runningChildParserContexts.filter(
|
|
40
|
-
runningChildParserContext => runningChildParserContext !== childParserResult.context,
|
|
41
|
-
);
|
|
63
|
+
runningChildParserContexts = runningChildParserContexts.filter(runningChildParserContext => runningChildParserContext !== childParserResult.context);
|
|
42
64
|
|
|
43
65
|
if (childParserResult.status === 'fulfilled') {
|
|
44
66
|
successfulParserOutputs.push(childParserResult.value);
|
|
45
|
-
|
|
67
|
+
successfulTaskContexts.push(childParserResult.context);
|
|
46
68
|
} else {
|
|
47
69
|
const error = childParserResult.reason;
|
|
48
70
|
|
|
49
|
-
if (error
|
|
71
|
+
if (isParserParsingFailedError(error)) {
|
|
50
72
|
parserParsingFailedErrors.push(error);
|
|
51
73
|
} else {
|
|
52
74
|
throw error;
|
|
@@ -60,7 +82,7 @@ export const createUnionParser = <
|
|
|
60
82
|
parserImplementationInvariant(!didUnlookahead, 'Union parser unlookaheaded multiple times.');
|
|
61
83
|
didUnlookahead = true;
|
|
62
84
|
const [ runningChildParserContext ] = runningChildParserContexts;
|
|
63
|
-
runningChildParserContext.unlookahead();
|
|
85
|
+
runningChildParserContext.childParserContext.unlookahead();
|
|
64
86
|
}
|
|
65
87
|
}
|
|
66
88
|
|
|
@@ -71,8 +93,12 @@ export const createUnionParser = <
|
|
|
71
93
|
'Successful parser outputs, indented, separated by newlines:',
|
|
72
94
|
'%s',
|
|
73
95
|
'End of successful parser outputs.',
|
|
96
|
+
'Successful parser names, indented, separated by newlines:',
|
|
97
|
+
'%s',
|
|
98
|
+
'End of successful parser names.',
|
|
74
99
|
],
|
|
75
|
-
() => successfulParserOutputs.map(output => ' ' + JSON.stringify(output)).join('\n'),
|
|
100
|
+
() => successfulParserOutputs.map(output => ' ' + JSON.stringify(output, bigintReplacer)).join('\n'),
|
|
101
|
+
() => successfulTaskContexts.map(taskContext => ' ' + getParserName(taskContext.childParser, 'anonymousUnionChild')).join('\n'),
|
|
76
102
|
);
|
|
77
103
|
|
|
78
104
|
parserContext.invariantJoin(
|
|
@@ -81,13 +107,13 @@ export const createUnionParser = <
|
|
|
81
107
|
'No union child parser succeeded.',
|
|
82
108
|
);
|
|
83
109
|
|
|
84
|
-
const [ successfulParserContext ] =
|
|
110
|
+
const [ successfulParserContext ] = successfulTaskContexts;
|
|
85
111
|
|
|
86
112
|
if (!didUnlookahead) {
|
|
87
|
-
successfulParserContext.unlookahead();
|
|
113
|
+
successfulParserContext.childParserContext.unlookahead();
|
|
88
114
|
}
|
|
89
115
|
|
|
90
|
-
successfulParserContext.dispose();
|
|
116
|
+
successfulParserContext.childParserContext.dispose();
|
|
91
117
|
|
|
92
118
|
const [ successfulParserOutput ] = successfulParserOutputs;
|
|
93
119
|
|
package/src/unparser.test.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import test from 'ava';
|
|
2
2
|
import * as fc from 'fast-check';
|
|
3
|
-
import { runUnparser, Unparser } from './unparser.js';
|
|
4
|
-
import { stringUnparserOutputCompanion } from './unparserOutputCompanion.js';
|
|
5
3
|
import { testProp } from '@fast-check/ava';
|
|
4
|
+
import { runUnparser, type Unparser } from './unparser.js';
|
|
5
|
+
import { stringUnparserOutputCompanion } from './unparserOutputCompanion.js';
|
|
6
6
|
|
|
7
7
|
test('writeLater', async t => {
|
|
8
8
|
const stringToBeWrittenBefore = 'before writeLater\n';
|
|
@@ -16,7 +16,7 @@ test('writeLater', async t => {
|
|
|
16
16
|
let actualPositionBFromWithinWriteLater: number | undefined;
|
|
17
17
|
|
|
18
18
|
const unparser: Unparser<void, string> = async function * (_input, unparserContext) {
|
|
19
|
-
yield stringToBeWrittenBefore
|
|
19
|
+
yield stringToBeWrittenBefore;
|
|
20
20
|
|
|
21
21
|
expectedPositionA = unparserContext.position;
|
|
22
22
|
|
|
@@ -127,19 +127,13 @@ test('writeLater deep', async t => {
|
|
|
127
127
|
testProp(
|
|
128
128
|
'writeLater positions and lengths',
|
|
129
129
|
[
|
|
130
|
-
fc.array(
|
|
131
|
-
fc.oneof(
|
|
132
|
-
fc.array(
|
|
133
|
-
fc.oneof(
|
|
134
|
-
fc.array(
|
|
135
|
-
fc.string(),
|
|
136
|
-
),
|
|
137
|
-
fc.string(),
|
|
138
|
-
),
|
|
139
|
-
),
|
|
130
|
+
fc.array(fc.oneof(
|
|
131
|
+
fc.array(fc.oneof(
|
|
132
|
+
fc.array(fc.string()),
|
|
140
133
|
fc.string(),
|
|
141
|
-
),
|
|
142
|
-
|
|
134
|
+
)),
|
|
135
|
+
fc.string(),
|
|
136
|
+
)),
|
|
143
137
|
],
|
|
144
138
|
async (t, stringArray3) => {
|
|
145
139
|
const numberUnparser: Unparser<number, string> = async function * (input, unparserContext) {
|
|
@@ -148,12 +142,10 @@ testProp(
|
|
|
148
142
|
|
|
149
143
|
const createLengthPrefixedUnparser = <T>(
|
|
150
144
|
unparser: Unparser<T, string>,
|
|
151
|
-
): Unparser<T, string> => {
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
yield * unparserContext.writeEarlier(length, numberUnparser, unparserContext.position - length.positionEnd);
|
|
156
|
-
};
|
|
145
|
+
): Unparser<T, string> => async function * (input, unparserContext) {
|
|
146
|
+
const length = yield * unparserContext.writeLater(8);
|
|
147
|
+
yield * unparser(input, unparserContext);
|
|
148
|
+
yield * unparserContext.writeEarlier(length, numberUnparser, unparserContext.position - length.positionEnd);
|
|
157
149
|
};
|
|
158
150
|
|
|
159
151
|
const unparser0: Unparser<string, string> = createLengthPrefixedUnparser(async function * (input, unparserContext) {
|
|
@@ -166,23 +158,15 @@ testProp(
|
|
|
166
158
|
}
|
|
167
159
|
});
|
|
168
160
|
|
|
169
|
-
const unparser2: Unparser<
|
|
161
|
+
const unparser2: Unparser<Array<string | string[]>, string> = createLengthPrefixedUnparser(async function * (input, unparserContext) {
|
|
170
162
|
for (const stringArray2 of input) {
|
|
171
|
-
|
|
172
|
-
yield * unparser0(stringArray2, unparserContext);
|
|
173
|
-
} else {
|
|
174
|
-
yield * unparser1(stringArray2, unparserContext);
|
|
175
|
-
}
|
|
163
|
+
yield * (typeof stringArray2 === 'string' ? unparser0(stringArray2, unparserContext) : unparser1(stringArray2, unparserContext));
|
|
176
164
|
}
|
|
177
165
|
});
|
|
178
166
|
|
|
179
|
-
const unparser3: Unparser<
|
|
167
|
+
const unparser3: Unparser<Array<string | Array<string | string[]>>, string> = createLengthPrefixedUnparser(async function * (input, unparserContext) {
|
|
180
168
|
for (const stringArray3 of input) {
|
|
181
|
-
|
|
182
|
-
yield * unparser0(stringArray3, unparserContext);
|
|
183
|
-
} else {
|
|
184
|
-
yield * unparser2(stringArray3, unparserContext);
|
|
185
|
-
}
|
|
169
|
+
yield * (typeof stringArray3 === 'string' ? unparser0(stringArray3, unparserContext) : unparser2(stringArray3, unparserContext));
|
|
186
170
|
}
|
|
187
171
|
});
|
|
188
172
|
|
|
@@ -196,7 +180,7 @@ testProp(
|
|
|
196
180
|
|
|
197
181
|
const actualString = strings.join('');
|
|
198
182
|
|
|
199
|
-
type DeepArray<T> = T | DeepArray<T
|
|
183
|
+
type DeepArray<T> = T | Array<DeepArray<T>>;
|
|
200
184
|
|
|
201
185
|
function getExpectedString(stringArray: DeepArray<string>): string {
|
|
202
186
|
let expectedString = stringArray;
|
package/src/unparser.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import invariant from
|
|
2
|
-
import { DeriveSequenceElement } from
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import invariant from 'invariant';
|
|
2
|
+
import { type DeriveSequenceElement } from './sequence.js';
|
|
3
|
+
import {
|
|
4
|
+
type UnparserContext, UnparserContextImplementation, WriteEarlier, WriteLater,
|
|
5
|
+
} from './unparserContext.js';
|
|
6
|
+
import { type UnparserOutputCompanion } from './unparserOutputCompanion.js';
|
|
7
|
+
import { unparserImplementationInvariant } from './unparserImplementationInvariant.js';
|
|
6
8
|
|
|
7
9
|
type UnparserIterableValue<Sequence, Element> =
|
|
8
10
|
| Sequence
|
|
@@ -49,7 +51,7 @@ async function * elementsToSequences<
|
|
|
49
51
|
for await (const value of values) {
|
|
50
52
|
if (
|
|
51
53
|
value instanceof WriteLater
|
|
52
|
-
|
|
54
|
+
|| value instanceof WriteEarlier
|
|
53
55
|
) {
|
|
54
56
|
if (elements.length > 0) {
|
|
55
57
|
const sequence = unparserOutputCompanion.from(elements);
|
|
@@ -91,7 +93,9 @@ function wrapUnparserResult<Sequence, Element>(
|
|
|
91
93
|
unparserResult,
|
|
92
94
|
unparserOutputCompanion,
|
|
93
95
|
),
|
|
94
|
-
value =>
|
|
96
|
+
value => {
|
|
97
|
+
unparserContext.handleYield(value);
|
|
98
|
+
},
|
|
95
99
|
);
|
|
96
100
|
}
|
|
97
101
|
|
|
@@ -119,7 +123,7 @@ export async function * runUnparser<
|
|
|
119
123
|
type PushOutput = (value: Sequence | WriteLater<Sequence, Element>) => void;
|
|
120
124
|
type FinishOutput = () => void;
|
|
121
125
|
|
|
122
|
-
const iteratorStack: [ Iterator, PushOutput, FinishOutput ]
|
|
126
|
+
const iteratorStack: Array<[ Iterator, PushOutput, FinishOutput ]> = [
|
|
123
127
|
[
|
|
124
128
|
valuesWithoutElements[Symbol.asyncIterator](),
|
|
125
129
|
value => outputQueue.push(value),
|
|
@@ -130,7 +134,7 @@ export async function * runUnparser<
|
|
|
130
134
|
while (true) {
|
|
131
135
|
while (
|
|
132
136
|
outputQueue.length > 0
|
|
133
|
-
|
|
137
|
+
&& !(outputQueue[0] instanceof WriteLater)
|
|
134
138
|
) {
|
|
135
139
|
yield outputQueue.shift() as Sequence;
|
|
136
140
|
}
|
package/src/unparserContext.ts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
/* eslint-disable prefer-arrow-callback */
|
|
2
1
|
|
|
3
|
-
import { Unparser, UnparserResult } from
|
|
4
|
-
import { UnparserOutputCompanion } from
|
|
5
|
-
import { unparserImplementationInvariant } from
|
|
6
|
-
import { parserImplementationInvariant } from
|
|
2
|
+
import { type Unparser, type UnparserResult } from './unparser.js';
|
|
3
|
+
import { type UnparserOutputCompanion } from './unparserOutputCompanion.js';
|
|
4
|
+
import { unparserImplementationInvariant } from './unparserImplementationInvariant.js';
|
|
5
|
+
import { parserImplementationInvariant } from './parserImplementationInvariant.js';
|
|
7
6
|
|
|
8
7
|
export type UnparserContext<Sequence, Element> = {
|
|
9
8
|
get position(): number;
|
|
@@ -19,7 +18,7 @@ export type UnparserContext<Sequence, Element> = {
|
|
|
19
18
|
export class WriteLater<Sequence, Element> extends Error {
|
|
20
19
|
name = 'WriteLater';
|
|
21
20
|
|
|
22
|
-
constructor
|
|
21
|
+
constructor(
|
|
23
22
|
private readonly _position: number,
|
|
24
23
|
private readonly _length: number,
|
|
25
24
|
) {
|
|
@@ -105,13 +104,10 @@ export class UnparserContextImplementation<Sequence, Element> implements Unparse
|
|
|
105
104
|
);
|
|
106
105
|
}
|
|
107
106
|
|
|
108
|
-
handleYield(
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
| WriteEarlier<Sequence, Element>
|
|
113
|
-
,
|
|
114
|
-
) {
|
|
107
|
+
handleYield(value:
|
|
108
|
+
| Sequence
|
|
109
|
+
| WriteLater<Sequence, Element>
|
|
110
|
+
| WriteEarlier<Sequence, Element>) {
|
|
115
111
|
if (value instanceof WriteEarlier) {
|
|
116
112
|
return;
|
|
117
113
|
}
|
package/src/unparserError.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { UnparserImplementationInvariantError } from './unparserError.js';
|
|
2
2
|
import { type Falsy, customInvariant, type ValueOrAccessor } from './customInvariant.js';
|
|
3
3
|
|
|
4
|
-
export function unparserImplementationInvariant<T>(value: T, format: ValueOrAccessor<string | string[]>, ...formatArguments:
|
|
4
|
+
export function unparserImplementationInvariant<T>(value: T, format: ValueOrAccessor<string | string[]>, ...formatArguments: unknown[]): Exclude<T, Falsy> {
|
|
5
5
|
return customInvariant(UnparserImplementationInvariantError, value, format, ...formatArguments);
|
|
6
6
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { StringParserInputCompanion, Uint8ArrayParserInputCompanion } from
|
|
1
|
+
import { StringParserInputCompanion, Uint8ArrayParserInputCompanion } from './parserInputCompanion.js';
|
|
2
2
|
|
|
3
3
|
export type UnparserOutputCompanion<Sequence, Element> = {
|
|
4
4
|
is(value: unknown): value is Sequence;
|
package/src/zip.ts
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
|
|
2
2
|
export type ZipCompression =
|
|
3
3
|
| 'store'
|
|
4
|
-
| 'deflate'
|
|
5
|
-
;
|
|
6
|
-
|
|
4
|
+
| 'deflate';
|
|
7
5
|
export type ZipEntryAttributes = {
|
|
8
6
|
};
|
|
9
7
|
|
|
@@ -27,9 +25,7 @@ export type ZipDirectoryEntry = ZipEntryCommon & {
|
|
|
27
25
|
|
|
28
26
|
export type ZipEntry =
|
|
29
27
|
| ZipFileEntry
|
|
30
|
-
| ZipDirectoryEntry
|
|
31
|
-
;
|
|
32
|
-
|
|
28
|
+
| ZipDirectoryEntry;
|
|
33
29
|
export type Zip = {
|
|
34
30
|
comment: string;
|
|
35
31
|
entries: ZipEntry[];
|
package/src/zipParser.ts
CHANGED
|
@@ -18,6 +18,8 @@ import {
|
|
|
18
18
|
type ZipFileEntry,
|
|
19
19
|
} from './zip.js';
|
|
20
20
|
import { uint8ArrayAsyncIterableToUint8Array } from './uint8Array.js';
|
|
21
|
+
import { createNegativeLookaheadParser } from './negativeLookaheadParser.js';
|
|
22
|
+
import { createSequenceTerminatedSequenceParser } from './sequenceTerminatedSequenceParser.js';
|
|
21
23
|
|
|
22
24
|
// https://pkwaredownloads.blob.core.windows.net/pem/APPNOTE.txt
|
|
23
25
|
|
|
@@ -65,7 +67,7 @@ const zipCompressionMethodParser: Parser<ZipCompression, Uint8Array> = promiseCo
|
|
|
65
67
|
},
|
|
66
68
|
);
|
|
67
69
|
|
|
68
|
-
type ZipLocalFileHeader = {
|
|
70
|
+
export type ZipLocalFileHeader = {
|
|
69
71
|
versionNeededToExtract: number;
|
|
70
72
|
generalPurposeBitFlag: number;
|
|
71
73
|
compressionMethod: ZipCompression;
|
|
@@ -78,8 +80,10 @@ type ZipLocalFileHeader = {
|
|
|
78
80
|
extraField: Uint8Array;
|
|
79
81
|
};
|
|
80
82
|
|
|
83
|
+
const zipLocalFileHeaderSignatureParser = createExactSequenceParser<Uint8Array>(Buffer.from('504b0304', 'hex'));
|
|
84
|
+
|
|
81
85
|
const zipLocalFileHeaderParser_ = createTupleParser([
|
|
82
|
-
|
|
86
|
+
zipLocalFileHeaderSignatureParser,
|
|
83
87
|
uint16LEParser,
|
|
84
88
|
uint16LEParser,
|
|
85
89
|
zipCompressionMethodParser,
|
|
@@ -133,31 +137,76 @@ const zipEncryptionHeaderParser: Parser<unknown, Uint8Array> = async parserConte
|
|
|
133
137
|
parserContext.invariant(false, 'Not implemented');
|
|
134
138
|
};
|
|
135
139
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
140
|
+
type ZipDataDescriptor = {
|
|
141
|
+
crc32: number;
|
|
142
|
+
compressedSize: number;
|
|
143
|
+
uncompressedSize: number;
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
const zipDataDescriptorSignature: Uint8Array = Buffer.from('504b0708', 'hex');
|
|
147
|
+
const zipDataDescriptorSignatureParser = createExactSequenceParser<Uint8Array>(zipDataDescriptorSignature);
|
|
148
|
+
|
|
149
|
+
const zipDataDescriptorParser: Parser<ZipDataDescriptor, Uint8Array> = promiseCompose(
|
|
150
|
+
createTupleParser([
|
|
151
|
+
createNegativeLookaheadParser(zipLocalFileHeaderSignatureParser),
|
|
152
|
+
// FIXME: optional in spec
|
|
153
|
+
// createOptionalParser(zipDataDescriptorSignatureParser),
|
|
154
|
+
zipDataDescriptorSignatureParser,
|
|
155
|
+
uint32LEParser,
|
|
156
|
+
uint32LEParser,
|
|
157
|
+
uint32LEParser,
|
|
158
|
+
]),
|
|
159
|
+
([
|
|
160
|
+
_notZipLocalFileHeaderSignature,
|
|
161
|
+
_zipDataDescriptorSignature,
|
|
162
|
+
crc32,
|
|
163
|
+
compressedSize,
|
|
164
|
+
uncompressedSize,
|
|
165
|
+
]) => ({
|
|
166
|
+
crc32,
|
|
167
|
+
compressedSize,
|
|
168
|
+
uncompressedSize,
|
|
169
|
+
}),
|
|
170
|
+
);
|
|
171
|
+
|
|
172
|
+
setParserName(zipDataDescriptorParser, 'zipDataDescriptorParser');
|
|
144
173
|
|
|
145
174
|
export type ZipLocalFile = {
|
|
146
175
|
zipLocalFileHeader: ZipLocalFileHeader;
|
|
147
176
|
zipEncryptionHeader: unknown;
|
|
148
177
|
compressedData: Uint8Array;
|
|
149
|
-
zipDataDescriptor:
|
|
178
|
+
zipDataDescriptor: undefined | ZipDataDescriptor;
|
|
150
179
|
};
|
|
151
180
|
|
|
152
181
|
export const zipLocalFileParser: Parser<ZipLocalFile, Uint8Array> = promiseCompose(
|
|
153
182
|
parserCreatorCompose(
|
|
154
183
|
() => zipLocalFileHeaderParser,
|
|
155
|
-
zipLocalFileHeader =>
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
184
|
+
zipLocalFileHeader => {
|
|
185
|
+
const sizeInDataDescriptor = Boolean(zipLocalFileHeader.generalPurposeBitFlag & 0b0000_0000_0000_1000
|
|
186
|
+
&& zipLocalFileHeader.crc32 === 0
|
|
187
|
+
&& zipLocalFileHeader.compressedSize === 0
|
|
188
|
+
&& zipLocalFileHeader.uncompressedSize === 0);
|
|
189
|
+
|
|
190
|
+
return createTupleParser([
|
|
191
|
+
async () => zipLocalFileHeader,
|
|
192
|
+
createOptionalParser(zipEncryptionHeaderParser),
|
|
193
|
+
(
|
|
194
|
+
sizeInDataDescriptor
|
|
195
|
+
? createSequenceTerminatedSequenceParser(
|
|
196
|
+
zipDataDescriptorSignature,
|
|
197
|
+
{
|
|
198
|
+
consumeTerminator: false,
|
|
199
|
+
},
|
|
200
|
+
)
|
|
201
|
+
: createFixedLengthSequenceParser(zipLocalFileHeader.compressedSize)
|
|
202
|
+
),
|
|
203
|
+
(
|
|
204
|
+
sizeInDataDescriptor
|
|
205
|
+
? (<T>(parser: T): T => parser)
|
|
206
|
+
: createOptionalParser
|
|
207
|
+
)(zipDataDescriptorParser),
|
|
208
|
+
]);
|
|
209
|
+
},
|
|
161
210
|
)(),
|
|
162
211
|
([
|
|
163
212
|
zipLocalFileHeader,
|
|
@@ -200,7 +249,7 @@ const zipVersionMadeByParser: Parser<ZipVersionMadeBy, Uint8Array> = promiseComp
|
|
|
200
249
|
|
|
201
250
|
type ZipExternalFileAttributes = {
|
|
202
251
|
directory: boolean;
|
|
203
|
-
}
|
|
252
|
+
};
|
|
204
253
|
|
|
205
254
|
const dosExternalFileAttributesParser: Parser<ZipExternalFileAttributes, Uint8Array> = promiseCompose(
|
|
206
255
|
uint32LEParser,
|
|
@@ -373,7 +422,7 @@ const zipEndOfCentralDirectoryRecordParser_ = createTupleParser([
|
|
|
373
422
|
zipFileCommentParser,
|
|
374
423
|
]);
|
|
375
424
|
|
|
376
|
-
setParserName(zipEndOfCentralDirectoryRecordParser_, '
|
|
425
|
+
setParserName(zipEndOfCentralDirectoryRecordParser_, 'zipEndOfCentralDirectoryRecordParser_');
|
|
377
426
|
|
|
378
427
|
export const zipEndOfCentralDirectoryRecordParser: Parser<ZipEndOfCentralDirectoryRecord, Uint8Array> = promiseCompose(
|
|
379
428
|
zipEndOfCentralDirectoryRecordParser_,
|
|
@@ -397,6 +446,8 @@ export const zipEndOfCentralDirectoryRecordParser: Parser<ZipEndOfCentralDirecto
|
|
|
397
446
|
}),
|
|
398
447
|
);
|
|
399
448
|
|
|
449
|
+
setParserName(zipEndOfCentralDirectoryRecordParser, 'zipEndOfCentralDirectoryRecordParser');
|
|
450
|
+
|
|
400
451
|
const zipParser_ = createTupleParser([
|
|
401
452
|
createArrayParser(zipLocalFileParser),
|
|
402
453
|
createOptionalParser(zipArchiveDecryptionHeaderParser),
|
|
@@ -440,7 +491,7 @@ export async function zipEntriesFromZipSegments({
|
|
|
440
491
|
|
|
441
492
|
const isDirectory = (
|
|
442
493
|
centralDirectoryHeader.externalFileAttributes.directory
|
|
443
|
-
|
|
494
|
+
|| commonFields.path.endsWith('/')
|
|
444
495
|
);
|
|
445
496
|
|
|
446
497
|
if (isDirectory) {
|
package/src/zipUnparser.test.ts
CHANGED
|
@@ -1,24 +1,15 @@
|
|
|
1
|
-
import
|
|
1
|
+
import fsPromises from 'node:fs/promises';
|
|
2
|
+
import { fc, testProp } from '@fast-check/ava';
|
|
2
3
|
import { temporaryFile } from 'tempy';
|
|
3
4
|
import { execa } from 'execa';
|
|
4
|
-
import fsPromises from 'node:fs/promises';
|
|
5
5
|
import { runUnparser } from './unparser.js';
|
|
6
|
-
import {
|
|
6
|
+
import { createZipUnparser } from './zipUnparser.js';
|
|
7
7
|
import { uint8ArrayUnparserOutputCompanion } from './unparserOutputCompanion.js';
|
|
8
8
|
import { runParser } from './parser.js';
|
|
9
9
|
import { zipParser } from './zipParser.js';
|
|
10
10
|
import { uint8ArrayParserInputCompanion } from './parserInputCompanion.js';
|
|
11
11
|
import { arbitraryZip } from './arbitraryZip.js';
|
|
12
|
-
|
|
13
|
-
async function hasExecutable(executable: string) {
|
|
14
|
-
const hasExecutable = execa(executable).then(() => true, () => false);
|
|
15
|
-
|
|
16
|
-
if (!hasExecutable) {
|
|
17
|
-
console.warn(`Executable %o not found`, executable);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
return hasExecutable;
|
|
21
|
-
}
|
|
12
|
+
import { hasExecutable } from './hasExecutable.js';
|
|
22
13
|
|
|
23
14
|
const hasZipinfoPromise = hasExecutable('zipinfo');
|
|
24
15
|
const has7zPromise = hasExecutable('7z');
|
|
@@ -57,21 +48,30 @@ testProp(
|
|
|
57
48
|
'zip',
|
|
58
49
|
[
|
|
59
50
|
arbitraryZip,
|
|
51
|
+
fc.record({
|
|
52
|
+
dataDescriptor: fc.boolean(),
|
|
53
|
+
}),
|
|
60
54
|
],
|
|
61
|
-
async (t, zip) => {
|
|
62
|
-
const
|
|
63
|
-
const actual = await runParser(zipParser, actualStream, uint8ArrayParserInputCompanion);
|
|
55
|
+
async (t, zip, options) => {
|
|
56
|
+
const zipUnparser = createZipUnparser(options);
|
|
64
57
|
|
|
65
|
-
|
|
58
|
+
{
|
|
59
|
+
const zipStream = runUnparser(zipUnparser, zip, uint8ArrayUnparserOutputCompanion);
|
|
66
60
|
|
|
67
|
-
|
|
68
|
-
return;
|
|
61
|
+
await fsPromises.writeFile('/tmp/zip.zip', zipStream);
|
|
69
62
|
}
|
|
70
63
|
|
|
64
|
+
const actualStream = runUnparser(zipUnparser, zip, uint8ArrayUnparserOutputCompanion);
|
|
65
|
+
const actual = await runParser(zipParser, actualStream, uint8ArrayParserInputCompanion);
|
|
66
|
+
|
|
67
|
+
t.deepEqual(actual, zip);
|
|
68
|
+
|
|
71
69
|
const hasZipinfo = await hasZipinfoPromise;
|
|
72
70
|
const has7z = await has7zPromise;
|
|
73
71
|
|
|
74
72
|
if (!hasZipinfo && !has7z) {
|
|
73
|
+
t.pass('no zipinfo or 7z, skipping zipfile check');
|
|
74
|
+
|
|
75
75
|
return;
|
|
76
76
|
}
|
|
77
77
|
|