@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/build/parserError.js
CHANGED
|
@@ -1,61 +1,106 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { NormalLazyMessageError, NoStackCaptureOverheadLazyMessageError } from './lazyMessageError.js';
|
|
2
|
+
export function isParserError(value) {
|
|
3
|
+
return (typeof value === 'object'
|
|
4
|
+
&& value !== null
|
|
5
|
+
&& value instanceof Error
|
|
6
|
+
&& 'position' in value
|
|
7
|
+
&& (typeof value.position === 'number' || value.position === undefined)
|
|
8
|
+
&& 'inputReaderSate' in value
|
|
9
|
+
&& (value.inputReaderSate === undefined || typeof value.inputReaderSate === 'object'));
|
|
3
10
|
}
|
|
4
|
-
export
|
|
5
|
-
|
|
11
|
+
export function isParserParsingFailedError(value) {
|
|
12
|
+
return (typeof value === 'object'
|
|
13
|
+
&& value !== null
|
|
14
|
+
&& value instanceof Error
|
|
15
|
+
&& 'depth' in value
|
|
16
|
+
&& typeof value.depth === 'number'
|
|
17
|
+
&& 'position' in value
|
|
18
|
+
&& typeof value.position === 'number');
|
|
6
19
|
}
|
|
7
|
-
export
|
|
8
|
-
|
|
20
|
+
export function isParserParsingJoinError(value) {
|
|
21
|
+
return (typeof value === 'object'
|
|
22
|
+
&& value !== null
|
|
23
|
+
&& value instanceof Error
|
|
24
|
+
&& 'childErrors' in value
|
|
25
|
+
&& Array.isArray(value.childErrors)
|
|
26
|
+
&& value.childErrors.every((childError) => isParserParsingFailedError(childError)));
|
|
9
27
|
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
super([
|
|
16
|
-
'(position: ',
|
|
17
|
-
position,
|
|
18
|
-
') ',
|
|
19
|
-
message,
|
|
20
|
-
].join(''));
|
|
21
|
-
this.depth = depth;
|
|
22
|
-
this.position = position;
|
|
28
|
+
function createParserErrorModule(BaseLazyMessageError) {
|
|
29
|
+
class ParserError extends BaseLazyMessageError {
|
|
30
|
+
name = 'ParserError';
|
|
31
|
+
position = undefined;
|
|
32
|
+
inputReaderSate = undefined;
|
|
23
33
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
name = 'ParserParsingJoinError';
|
|
27
|
-
childErrors = [];
|
|
28
|
-
}
|
|
29
|
-
export class ParserParsingJoinNoneError extends ParserParsingJoinError {
|
|
30
|
-
name = 'ParserParsingJoinNoneError';
|
|
31
|
-
}
|
|
32
|
-
export class ParserParsingJoinAllError extends ParserParsingJoinError {
|
|
33
|
-
childErrors;
|
|
34
|
-
name = 'ParserParsingJoinAllError';
|
|
35
|
-
constructor(message, depth, position, childErrors) {
|
|
36
|
-
super(message, depth, position);
|
|
37
|
-
this.childErrors = childErrors;
|
|
34
|
+
class ParserImplementationError extends ParserError {
|
|
35
|
+
name = 'ParserImplementationError';
|
|
38
36
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
childErrors;
|
|
42
|
-
name = 'ParserParsingJoinDeepestError';
|
|
43
|
-
constructor(message, depth, position, childErrors) {
|
|
44
|
-
super(message, depth, position);
|
|
45
|
-
this.childErrors = childErrors;
|
|
37
|
+
class ParserImplementationInvariantError extends ParserImplementationError {
|
|
38
|
+
name = 'ParserImplementationInvariantError';
|
|
46
39
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
40
|
+
class ParserParsingFailedError extends ParserError {
|
|
41
|
+
depth;
|
|
42
|
+
position;
|
|
43
|
+
name = 'ParserParsingFailedError';
|
|
44
|
+
constructor(message, depth, position) {
|
|
45
|
+
super(message);
|
|
46
|
+
this.depth = depth;
|
|
47
|
+
this.position = position;
|
|
48
|
+
}
|
|
54
49
|
}
|
|
50
|
+
class ParserParsingJoinError extends ParserParsingFailedError {
|
|
51
|
+
name = 'ParserParsingJoinError';
|
|
52
|
+
childErrors = [];
|
|
53
|
+
}
|
|
54
|
+
class ParserParsingJoinNoneError extends ParserParsingJoinError {
|
|
55
|
+
name = 'ParserParsingJoinNoneError';
|
|
56
|
+
}
|
|
57
|
+
class ParserParsingJoinAllError extends ParserParsingJoinError {
|
|
58
|
+
childErrors;
|
|
59
|
+
name = 'ParserParsingJoinAllError';
|
|
60
|
+
constructor(message, depth, position, childErrors) {
|
|
61
|
+
super(message, depth, position);
|
|
62
|
+
this.childErrors = childErrors;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
class ParserParsingJoinDeepestError extends ParserParsingJoinError {
|
|
66
|
+
childErrors;
|
|
67
|
+
name = 'ParserParsingJoinDeepestError';
|
|
68
|
+
constructor(message, depth, position, childErrors) {
|
|
69
|
+
super(message, depth, position);
|
|
70
|
+
this.childErrors = childErrors;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
class ParserParsingJoinFurthestError extends ParserParsingJoinError {
|
|
74
|
+
childErrors;
|
|
75
|
+
name = 'ParserParsingJoinFurthestError';
|
|
76
|
+
constructor(message, depth, position, childErrors) {
|
|
77
|
+
super(message, depth, position);
|
|
78
|
+
this.childErrors = childErrors;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
class ParserParsingInvariantError extends ParserParsingFailedError {
|
|
82
|
+
name = 'ParserParsingInvariantError';
|
|
83
|
+
}
|
|
84
|
+
class ParserUnexpectedEndOfInputError extends ParserParsingFailedError {
|
|
85
|
+
name = 'ParserUnexpectedEndOfInputError';
|
|
86
|
+
}
|
|
87
|
+
class ParserUnexpectedRemainingInputError extends ParserParsingFailedError {
|
|
88
|
+
name = 'ParserUnexpectedRemainingInputError';
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
ParserError,
|
|
92
|
+
ParserImplementationError,
|
|
93
|
+
ParserImplementationInvariantError,
|
|
94
|
+
ParserParsingFailedError,
|
|
95
|
+
ParserParsingJoinError,
|
|
96
|
+
ParserParsingJoinNoneError,
|
|
97
|
+
ParserParsingJoinAllError,
|
|
98
|
+
ParserParsingJoinDeepestError,
|
|
99
|
+
ParserParsingJoinFurthestError,
|
|
100
|
+
ParserParsingInvariantError,
|
|
101
|
+
ParserUnexpectedEndOfInputError,
|
|
102
|
+
ParserUnexpectedRemainingInputError,
|
|
103
|
+
};
|
|
55
104
|
}
|
|
56
|
-
export
|
|
57
|
-
|
|
58
|
-
}
|
|
59
|
-
export class ParserUnexpectedEndOfInputError extends ParserParsingFailedError {
|
|
60
|
-
name = 'ParserUnexpectedEndOfInputError';
|
|
61
|
-
}
|
|
105
|
+
export const normalParserErrorModule = createParserErrorModule(NormalLazyMessageError);
|
|
106
|
+
export const noStackCaptureOverheadParserErrorModule = createParserErrorModule(NoStackCaptureOverheadLazyMessageError);
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { type Falsy, type ValueOrAccessor } from './customInvariant.js';
|
|
2
|
-
export declare function parserImplementationInvariant<T>(value: T, format: ValueOrAccessor<string | string[]>, ...formatArguments:
|
|
2
|
+
export declare function parserImplementationInvariant<T>(value: T, format: ValueOrAccessor<string | string[]>, ...formatArguments: unknown[]): Exclude<T, Falsy>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ParserImplementationInvariantError } from './parserError.js';
|
|
2
1
|
import { customInvariant } from './customInvariant.js';
|
|
2
|
+
import { normalParserErrorModule } from './parserError.js';
|
|
3
3
|
export function parserImplementationInvariant(value, format, ...formatArguments) {
|
|
4
|
-
return customInvariant(ParserImplementationInvariantError, value, format, ...formatArguments);
|
|
4
|
+
return customInvariant(normalParserErrorModule.ParserImplementationInvariantError, value, format, ...formatArguments);
|
|
5
5
|
}
|
|
@@ -1,20 +1,35 @@
|
|
|
1
1
|
export type ParserInputCompanion<Sequence, Element> = {
|
|
2
2
|
is(value: unknown): value is Sequence;
|
|
3
3
|
from(elements: Element[]): Sequence;
|
|
4
|
+
concat(sequences: Sequence[]): Sequence;
|
|
4
5
|
length(sequence: Sequence): number;
|
|
5
6
|
at(sequence: Sequence, index: number): Element | undefined;
|
|
7
|
+
subsequence(sequence: Sequence, start: number, end: number): Sequence;
|
|
8
|
+
indexOf(sequence: Sequence, element: Element, fromIndex?: number): number;
|
|
9
|
+
indexOfSubsequence(sequence: Sequence, subsequence: Sequence, fromIndex?: number): number;
|
|
10
|
+
equals(sequenceA: Sequence, sequenceB: Sequence): boolean;
|
|
6
11
|
};
|
|
7
12
|
export declare class StringParserInputCompanion implements ParserInputCompanion<string, string> {
|
|
8
13
|
is(value: unknown): value is string;
|
|
9
14
|
from(elements: string[]): string;
|
|
15
|
+
concat(sequences: string[]): string;
|
|
10
16
|
length(sequence: string): number;
|
|
11
17
|
at(sequence: string, index: number): string | undefined;
|
|
18
|
+
subsequence(sequence: string, start: number, end: number): string;
|
|
19
|
+
indexOf(sequence: string, element: string, fromIndex?: number): number;
|
|
20
|
+
indexOfSubsequence(sequence: string, subsequence: string, fromIndex?: number): number;
|
|
21
|
+
equals(sequenceA: string, sequenceB: string): boolean;
|
|
12
22
|
}
|
|
13
23
|
export declare const stringParserInputCompanion: StringParserInputCompanion;
|
|
14
24
|
export declare class Uint8ArrayParserInputCompanion implements ParserInputCompanion<Uint8Array, number> {
|
|
15
25
|
is(value: unknown): value is Uint8Array;
|
|
16
26
|
from(elements: number[]): Uint8Array;
|
|
27
|
+
concat(sequences: Uint8Array[]): Uint8Array;
|
|
17
28
|
length(sequence: Uint8Array): number;
|
|
18
29
|
at(sequence: Uint8Array, index: number): number | undefined;
|
|
30
|
+
subsequence(sequence: Uint8Array, start: number, end: number): Uint8Array;
|
|
31
|
+
indexOf(sequence: Uint8Array, element: number, fromIndex?: number): number;
|
|
32
|
+
indexOfSubsequence(sequence: Uint8Array, subsequence: Uint8Array, fromIndex?: number): number;
|
|
33
|
+
equals(sequenceA: Uint8Array, sequenceB: Uint8Array): boolean;
|
|
19
34
|
}
|
|
20
35
|
export declare const uint8ArrayParserInputCompanion: Uint8ArrayParserInputCompanion;
|
|
@@ -5,12 +5,27 @@ export class StringParserInputCompanion {
|
|
|
5
5
|
from(elements) {
|
|
6
6
|
return elements.join('');
|
|
7
7
|
}
|
|
8
|
+
concat(sequences) {
|
|
9
|
+
return sequences.join('');
|
|
10
|
+
}
|
|
8
11
|
length(sequence) {
|
|
9
12
|
return sequence.length;
|
|
10
13
|
}
|
|
11
14
|
at(sequence, index) {
|
|
12
15
|
return sequence.at(index);
|
|
13
16
|
}
|
|
17
|
+
subsequence(sequence, start, end) {
|
|
18
|
+
return sequence.slice(start, end);
|
|
19
|
+
}
|
|
20
|
+
indexOf(sequence, element, fromIndex) {
|
|
21
|
+
return sequence.indexOf(element, fromIndex);
|
|
22
|
+
}
|
|
23
|
+
indexOfSubsequence(sequence, subsequence, fromIndex) {
|
|
24
|
+
return sequence.indexOf(subsequence, fromIndex);
|
|
25
|
+
}
|
|
26
|
+
equals(sequenceA, sequenceB) {
|
|
27
|
+
return sequenceA === sequenceB;
|
|
28
|
+
}
|
|
14
29
|
}
|
|
15
30
|
export const stringParserInputCompanion = new StringParserInputCompanion();
|
|
16
31
|
export class Uint8ArrayParserInputCompanion {
|
|
@@ -20,11 +35,34 @@ export class Uint8ArrayParserInputCompanion {
|
|
|
20
35
|
from(elements) {
|
|
21
36
|
return new Uint8Array(elements);
|
|
22
37
|
}
|
|
38
|
+
concat(sequences) {
|
|
39
|
+
return new Uint8Array(Buffer.concat(sequences));
|
|
40
|
+
}
|
|
23
41
|
length(sequence) {
|
|
24
42
|
return sequence.length;
|
|
25
43
|
}
|
|
26
44
|
at(sequence, index) {
|
|
27
45
|
return sequence.at(index);
|
|
28
46
|
}
|
|
47
|
+
subsequence(sequence, start, end) {
|
|
48
|
+
return sequence.subarray(start, end);
|
|
49
|
+
}
|
|
50
|
+
indexOf(sequence, element, fromIndex) {
|
|
51
|
+
return sequence.indexOf(element, fromIndex);
|
|
52
|
+
}
|
|
53
|
+
indexOfSubsequence(sequence, subsequence, fromIndex) {
|
|
54
|
+
return Buffer.from(sequence).indexOf(Buffer.from(subsequence), fromIndex);
|
|
55
|
+
}
|
|
56
|
+
equals(sequenceA, sequenceB) {
|
|
57
|
+
if (sequenceA.length !== sequenceB.length) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
for (const [index, element] of sequenceA.entries()) {
|
|
61
|
+
if (element !== sequenceB[index]) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
29
67
|
}
|
|
30
68
|
export const uint8ArrayParserInputCompanion = new Uint8ArrayParserInputCompanion();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare function promiseCompose<A, B, C>(f1: (a: A) => Promise<B>, f2: (b: B) => C | Promise<C>): (a: A) => Promise<C>;
|
|
1
|
+
export declare function promiseCompose<A, B, C>(f1: (a: A) => B | Promise<B>, f2: (b: B) => C | Promise<C>): (a: A) => C | Promise<C>;
|
package/build/promiseCompose.js
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
1
1
|
export function promiseCompose(f1, f2) {
|
|
2
|
-
|
|
2
|
+
async function promiseComposed(a) {
|
|
3
|
+
const bOrBPromise = f1(a);
|
|
4
|
+
if (bOrBPromise instanceof Promise) {
|
|
5
|
+
return bOrBPromise.then(f2);
|
|
6
|
+
}
|
|
7
|
+
return f2(bOrBPromise);
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(promiseComposed, 'name', {
|
|
10
|
+
value: `promiseCompose(${f1.name}, ${f2.name})`,
|
|
11
|
+
});
|
|
12
|
+
return promiseComposed;
|
|
3
13
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function promiseSettled<T>(promise: Promise<T>): Promise<PromiseSettledResult<T>>;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { getParserName, setParserName } from './parser.js';
|
|
2
|
+
import { isParserParsingFailedError } from './parserError.js';
|
|
3
|
+
import { promiseCompose } from './promiseCompose.js';
|
|
4
|
+
import { createTupleParser } from './tupleParser.js';
|
|
5
|
+
export const createSeparatedArrayParser = (elementParser, separatorParser) => {
|
|
6
|
+
const separatorThenElementParser = promiseCompose(createTupleParser([
|
|
7
|
+
separatorParser,
|
|
8
|
+
elementParser,
|
|
9
|
+
]), ([, element]) => element);
|
|
10
|
+
const separatedArrayParser = async (parserContext) => {
|
|
11
|
+
let parser = elementParser;
|
|
12
|
+
const elements = [];
|
|
13
|
+
while (true) {
|
|
14
|
+
const elementParserContext = parserContext.lookahead();
|
|
15
|
+
const initialPosition = elementParserContext.position;
|
|
16
|
+
try {
|
|
17
|
+
const element = await parser(elementParserContext);
|
|
18
|
+
if (elementParserContext.position === initialPosition) {
|
|
19
|
+
break;
|
|
20
|
+
}
|
|
21
|
+
elements.push(element);
|
|
22
|
+
elementParserContext.unlookahead();
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
if (isParserParsingFailedError(error)) {
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
throw error;
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
elementParserContext.dispose();
|
|
32
|
+
}
|
|
33
|
+
parser = separatorThenElementParser;
|
|
34
|
+
}
|
|
35
|
+
return elements;
|
|
36
|
+
};
|
|
37
|
+
setParserName(separatedArrayParser, getParserName(elementParser, 'anonymousSeparatedArrayChild') + '*');
|
|
38
|
+
return separatedArrayParser;
|
|
39
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import { testProp, fc } from '@fast-check/ava';
|
|
3
|
+
import { createSeparatedArrayParser } from './separatedArrayParser.js';
|
|
4
|
+
import { runParser, runParserWithRemainingInput } from './parser.js';
|
|
5
|
+
import { stringParserInputCompanion } from './parserInputCompanion.js';
|
|
6
|
+
import { createExactSequenceParser } from './exactSequenceParser.js';
|
|
7
|
+
test('does not loop forever with a child parser that does not consume anything', async (t) => {
|
|
8
|
+
const parser = createSeparatedArrayParser(async () => undefined, () => undefined);
|
|
9
|
+
const { output } = await runParserWithRemainingInput(parser, 'foo', stringParserInputCompanion);
|
|
10
|
+
t.deepEqual(output, []);
|
|
11
|
+
});
|
|
12
|
+
testProp('separatedArray', [
|
|
13
|
+
fc.array(fc.constant('element')),
|
|
14
|
+
], async (t, elements) => {
|
|
15
|
+
const separatedArrayParser = createSeparatedArrayParser(createExactSequenceParser('element'), createExactSequenceParser('separator'));
|
|
16
|
+
const actual = await runParser(separatedArrayParser, elements.join('separator'), stringParserInputCompanion);
|
|
17
|
+
const expected = elements;
|
|
18
|
+
t.deepEqual(actual, expected);
|
|
19
|
+
}, {
|
|
20
|
+
verbose: true,
|
|
21
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { getParserName, setParserName } from './parser.js';
|
|
2
|
+
import { isParserParsingFailedError } from './parserError.js';
|
|
3
|
+
import { promiseCompose } from './promiseCompose.js';
|
|
4
|
+
import { createTupleParser } from './tupleParser.js';
|
|
5
|
+
export const createSeparatedNonEmptyArrayParser = (elementParser, separatorParser) => {
|
|
6
|
+
const separatorThenElementParser = promiseCompose(createTupleParser([
|
|
7
|
+
separatorParser,
|
|
8
|
+
elementParser,
|
|
9
|
+
]), ([, element]) => element);
|
|
10
|
+
const separatedNonEmptyArrayParser = async (parserContext) => {
|
|
11
|
+
let parser = elementParser;
|
|
12
|
+
const elements = [];
|
|
13
|
+
while (true) {
|
|
14
|
+
const elementParserContext = parserContext.lookahead();
|
|
15
|
+
const initialPosition = elementParserContext.position;
|
|
16
|
+
try {
|
|
17
|
+
const element = await parser(elementParserContext);
|
|
18
|
+
if (elementParserContext.position === initialPosition) {
|
|
19
|
+
break;
|
|
20
|
+
}
|
|
21
|
+
elements.push(element);
|
|
22
|
+
elementParserContext.unlookahead();
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
if (isParserParsingFailedError(error)) {
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
throw error;
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
elementParserContext.dispose();
|
|
32
|
+
}
|
|
33
|
+
parser = separatorThenElementParser;
|
|
34
|
+
}
|
|
35
|
+
parserContext.invariant(elements.length > 0, 'Expected elementParser (%s) to match at least once', getParserName(elementParser, 'anonymousSeparatedNonEmptyArrayChild'));
|
|
36
|
+
return elements;
|
|
37
|
+
};
|
|
38
|
+
setParserName(separatedNonEmptyArrayParser, getParserName(elementParser, 'anonymousSeparatedNonEmptyArrayChild') + '+');
|
|
39
|
+
return separatedNonEmptyArrayParser;
|
|
40
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import { testProp, fc } from '@fast-check/ava';
|
|
3
|
+
import { createSeparatedNonEmptyArrayParser } from './separatedNonEmptyArrayParser.js';
|
|
4
|
+
import { runParser, runParserWithRemainingInput } from './parser.js';
|
|
5
|
+
import { stringParserInputCompanion } from './parserInputCompanion.js';
|
|
6
|
+
import { createExactSequenceParser } from './exactSequenceParser.js';
|
|
7
|
+
import { stringFromAsyncIterable } from './stringFromAsyncIterable.js';
|
|
8
|
+
test('empty input throws error', async (t) => {
|
|
9
|
+
const parser = createSeparatedNonEmptyArrayParser(createExactSequenceParser('element'), createExactSequenceParser(','));
|
|
10
|
+
await t.throwsAsync(async () => runParser(parser, '', stringParserInputCompanion), {
|
|
11
|
+
any: true,
|
|
12
|
+
message: /Expected .* to match at least once/,
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
test('single element without separator matches', async (t) => {
|
|
16
|
+
const parser = createSeparatedNonEmptyArrayParser(createExactSequenceParser('element'), createExactSequenceParser(','));
|
|
17
|
+
const result = await runParser(parser, 'element', stringParserInputCompanion);
|
|
18
|
+
t.deepEqual(result, ['element']);
|
|
19
|
+
});
|
|
20
|
+
test('two elements with separator matches', async (t) => {
|
|
21
|
+
const parser = createSeparatedNonEmptyArrayParser(createExactSequenceParser('element'), createExactSequenceParser(','));
|
|
22
|
+
const result = await runParser(parser, 'element,element', stringParserInputCompanion);
|
|
23
|
+
t.deepEqual(result, ['element', 'element']);
|
|
24
|
+
});
|
|
25
|
+
test('multiple elements with separator matches', async (t) => {
|
|
26
|
+
const parser = createSeparatedNonEmptyArrayParser(createExactSequenceParser('a'), createExactSequenceParser(','));
|
|
27
|
+
const result = await runParser(parser, 'a,a,a,a', stringParserInputCompanion);
|
|
28
|
+
t.deepEqual(result, ['a', 'a', 'a', 'a']);
|
|
29
|
+
});
|
|
30
|
+
test('does not consume trailing separator', async (t) => {
|
|
31
|
+
const parser = createSeparatedNonEmptyArrayParser(createExactSequenceParser('element'), createExactSequenceParser(','));
|
|
32
|
+
const { output, remainingInput } = await runParserWithRemainingInput(parser, 'element,element,', stringParserInputCompanion);
|
|
33
|
+
t.deepEqual(output, ['element', 'element']);
|
|
34
|
+
t.is(await stringFromAsyncIterable(remainingInput), ',');
|
|
35
|
+
});
|
|
36
|
+
test('does not loop forever with a child parser that does not consume anything', async (t) => {
|
|
37
|
+
const parser = createSeparatedNonEmptyArrayParser(async () => undefined, () => undefined);
|
|
38
|
+
await t.throwsAsync(async () => runParser(parser, 'foo', stringParserInputCompanion), {
|
|
39
|
+
any: true,
|
|
40
|
+
message: /Expected .* to match at least once/,
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
test('partial match throws error', async (t) => {
|
|
44
|
+
const parser = createSeparatedNonEmptyArrayParser(createExactSequenceParser('element'), createExactSequenceParser(','));
|
|
45
|
+
await t.throwsAsync(async () => runParser(parser, 'elem', stringParserInputCompanion), {
|
|
46
|
+
any: true,
|
|
47
|
+
message: /Expected .* to match at least once/,
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
testProp('separatedNonEmptyArray with at least one element', [
|
|
51
|
+
fc.array(fc.constant('element'), { minLength: 1 }),
|
|
52
|
+
], async (t, elements) => {
|
|
53
|
+
const separatedNonEmptyArrayParser = createSeparatedNonEmptyArrayParser(createExactSequenceParser('element'), createExactSequenceParser('separator'));
|
|
54
|
+
const actual = await runParser(separatedNonEmptyArrayParser, elements.join('separator'), stringParserInputCompanion);
|
|
55
|
+
const expected = elements;
|
|
56
|
+
t.deepEqual(actual, expected);
|
|
57
|
+
}, {
|
|
58
|
+
verbose: true,
|
|
59
|
+
});
|
|
60
|
+
test('separatedNonEmptyArray throws on empty array', async (t) => {
|
|
61
|
+
const separatedNonEmptyArrayParser = createSeparatedNonEmptyArrayParser(createExactSequenceParser('element'), createExactSequenceParser('separator'));
|
|
62
|
+
await t.throwsAsync(async () => runParser(separatedNonEmptyArrayParser, '', stringParserInputCompanion), {
|
|
63
|
+
any: true,
|
|
64
|
+
message: /Expected .* to match at least once/,
|
|
65
|
+
});
|
|
66
|
+
});
|
|
@@ -1,15 +1,25 @@
|
|
|
1
1
|
import { type ParserInputCompanion } from './parserInputCompanion.js';
|
|
2
|
+
export type SequenceBufferState<Sequence> = {
|
|
3
|
+
consumedBufferedSequences: Sequence[];
|
|
4
|
+
unconsumedBufferedSequences: Sequence[];
|
|
5
|
+
};
|
|
2
6
|
export type SequenceBuffer<Sequence, Element> = {
|
|
3
7
|
push(sequence: Sequence): void;
|
|
4
8
|
peek(offset: number): Element | undefined;
|
|
9
|
+
peekSequence(start: number, end: number): Sequence | undefined;
|
|
5
10
|
skip(offset: number): void;
|
|
11
|
+
toSequenceBufferState(): SequenceBufferState<Sequence>;
|
|
6
12
|
};
|
|
7
13
|
export declare class SequenceBufferImplementation<Sequence, Element> implements SequenceBuffer<Sequence, Element> {
|
|
8
14
|
private readonly _parserInputCompanion;
|
|
9
15
|
private readonly _sequences;
|
|
10
16
|
private _indexInFirstSequence;
|
|
11
17
|
constructor(_parserInputCompanion: ParserInputCompanion<Sequence, Element>);
|
|
18
|
+
get length(): number;
|
|
19
|
+
private _shift;
|
|
12
20
|
push(sequence: Sequence): void;
|
|
13
21
|
peek(offset: number): Element | undefined;
|
|
22
|
+
peekSequence(start: number, end: number): Sequence | undefined;
|
|
14
23
|
skip(offset: number): void;
|
|
24
|
+
toSequenceBufferState(): SequenceBufferState<Sequence>;
|
|
15
25
|
}
|
package/build/sequenceBuffer.js
CHANGED
|
@@ -6,8 +6,10 @@ export class SequenceBufferImplementation {
|
|
|
6
6
|
constructor(_parserInputCompanion) {
|
|
7
7
|
this._parserInputCompanion = _parserInputCompanion;
|
|
8
8
|
}
|
|
9
|
-
|
|
10
|
-
this._sequences.
|
|
9
|
+
get length() {
|
|
10
|
+
return this._sequences.reduce((sequenceLength, sequence) => sequenceLength + this._parserInputCompanion.length(sequence), 0 - this._indexInFirstSequence);
|
|
11
|
+
}
|
|
12
|
+
_shift() {
|
|
11
13
|
while (this._sequences.length > 0) {
|
|
12
14
|
const firstSequence = this._sequences[0];
|
|
13
15
|
const firstSequenceLength = this._parserInputCompanion.length(firstSequence);
|
|
@@ -22,6 +24,10 @@ export class SequenceBufferImplementation {
|
|
|
22
24
|
this._indexInFirstSequence -= firstSequenceLength;
|
|
23
25
|
}
|
|
24
26
|
}
|
|
27
|
+
push(sequence) {
|
|
28
|
+
this._sequences.push(sequence);
|
|
29
|
+
this._shift();
|
|
30
|
+
}
|
|
25
31
|
peek(offset) {
|
|
26
32
|
invariant(offset >= 0, 'Offset must be non-negative.');
|
|
27
33
|
let index = this._indexInFirstSequence + offset;
|
|
@@ -34,7 +40,53 @@ export class SequenceBufferImplementation {
|
|
|
34
40
|
}
|
|
35
41
|
return undefined;
|
|
36
42
|
}
|
|
43
|
+
peekSequence(start, end) {
|
|
44
|
+
invariant(start >= 0, 'Start must be non-negative.');
|
|
45
|
+
invariant(end >= start, 'End must be greater than or equal to start.');
|
|
46
|
+
let startIndex = this._indexInFirstSequence + start;
|
|
47
|
+
let endIndex = this._indexInFirstSequence + end;
|
|
48
|
+
const sequences = [];
|
|
49
|
+
for (const sequence of this._sequences) {
|
|
50
|
+
const sequenceLength = this._parserInputCompanion.length(sequence);
|
|
51
|
+
if (startIndex < sequenceLength) {
|
|
52
|
+
const subsequence = this._parserInputCompanion.subsequence(sequence, Math.max(0, startIndex), Math.min(sequenceLength, endIndex));
|
|
53
|
+
sequences.push(subsequence);
|
|
54
|
+
}
|
|
55
|
+
startIndex -= sequenceLength;
|
|
56
|
+
endIndex -= sequenceLength;
|
|
57
|
+
if (endIndex <= 0) {
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return endIndex > 0 ? undefined : this._parserInputCompanion.concat(sequences);
|
|
62
|
+
}
|
|
37
63
|
skip(offset) {
|
|
38
64
|
this._indexInFirstSequence += offset;
|
|
65
|
+
this._shift();
|
|
66
|
+
}
|
|
67
|
+
toSequenceBufferState() {
|
|
68
|
+
if (this._sequences.length === 0) {
|
|
69
|
+
return {
|
|
70
|
+
consumedBufferedSequences: [],
|
|
71
|
+
unconsumedBufferedSequences: [],
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
if (this._indexInFirstSequence === 0) {
|
|
75
|
+
return {
|
|
76
|
+
consumedBufferedSequences: [],
|
|
77
|
+
unconsumedBufferedSequences: [...this._sequences],
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
const firstSequence = this._sequences[0];
|
|
81
|
+
const firstSequenceLength = this._parserInputCompanion.length(firstSequence);
|
|
82
|
+
const consumedFirstSequence = this._parserInputCompanion.subsequence(firstSequence, 0, this._indexInFirstSequence);
|
|
83
|
+
const unconsumedFirstSequence = this._parserInputCompanion.subsequence(firstSequence, this._indexInFirstSequence, firstSequenceLength);
|
|
84
|
+
const unconsumedFirstSequenceLength = this._parserInputCompanion.length(unconsumedFirstSequence);
|
|
85
|
+
return {
|
|
86
|
+
consumedBufferedSequences: [consumedFirstSequence],
|
|
87
|
+
unconsumedBufferedSequences: (unconsumedFirstSequenceLength === 0
|
|
88
|
+
? this._sequences.slice(1)
|
|
89
|
+
: [unconsumedFirstSequence, ...this._sequences.slice(1)]),
|
|
90
|
+
};
|
|
39
91
|
}
|
|
40
92
|
}
|