@futpib/parser 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/copilot-instructions.md +149 -0
- package/.github/workflows/copilot-setup-steps.yml +18 -0
- package/.github/workflows/main.yml +29 -8
- package/.yarn/releases/yarn-4.9.4.cjs +942 -0
- package/.yarnrc.yml +1 -1
- package/build/allSettledStream.js +1 -1
- package/build/allSettledStream.test.js +2 -2
- package/build/androidPackageParser.d.ts +1 -1
- package/build/androidPackageParser.js +5 -3
- package/build/androidPackageParser.test.js +7 -7
- package/build/androidPackageUnparser.d.ts +2 -2
- package/build/androidPackageUnparser.js +18 -14
- package/build/androidPackageUnparser.test.js +7 -7
- package/build/arbitrarilySlicedAsyncInterator.js +2 -1
- package/build/arbitraryDalvikBytecode.d.ts +4 -0
- package/build/arbitraryDalvikBytecode.js +640 -0
- package/build/arbitraryDalvikExecutable.d.ts +3 -0
- package/build/arbitraryDalvikExecutable.js +282 -0
- package/build/arbitraryDosDateTime.js +1 -0
- package/build/arbitraryZipStream.js +1 -1
- package/build/arrayParser.js +2 -2
- package/build/arrayUnparser.d.ts +1 -1
- package/build/backsmali.d.ts +3 -1
- package/build/backsmali.js +31 -3
- package/build/bash.d.ts +84 -0
- package/build/bash.js +1 -0
- package/build/bashParser.d.ts +6 -0
- package/build/bashParser.js +294 -0
- package/build/bashParser.test.d.ts +1 -0
- package/build/bashParser.test.js +181 -0
- package/build/customInvariant.d.ts +2 -1
- package/build/customInvariant.js +4 -6
- package/build/dalvikBytecodeParser/formatParsers.d.ts +76 -2
- package/build/dalvikBytecodeParser/formatParsers.js +146 -11
- package/build/dalvikBytecodeParser/formatSizes.d.ts +34 -0
- package/build/dalvikBytecodeParser/formatSizes.js +34 -0
- package/build/dalvikBytecodeParser/operationFormats.d.ts +225 -0
- package/build/dalvikBytecodeParser/operationFormats.js +225 -0
- package/build/dalvikBytecodeParser.d.ts +1105 -5
- package/build/dalvikBytecodeParser.js +658 -205
- package/build/dalvikBytecodeUnparser/formatUnparsers.d.ts +152 -0
- package/build/dalvikBytecodeUnparser/formatUnparsers.js +225 -0
- package/build/dalvikBytecodeUnparser.d.ts +3 -0
- package/build/dalvikBytecodeUnparser.js +642 -0
- package/build/dalvikBytecodeUnparser.test.d.ts +1 -0
- package/build/dalvikBytecodeUnparser.test.js +25 -0
- package/build/dalvikExecutable.d.ts +65 -8
- package/build/dalvikExecutable.js +36 -0
- package/build/dalvikExecutableParser/stringSyntaxParser.d.ts +1 -1
- package/build/dalvikExecutableParser/stringSyntaxParser.js +17 -17
- package/build/dalvikExecutableParser/typeParsers.d.ts +2 -1
- package/build/dalvikExecutableParser/typeParsers.js +16 -11
- package/build/dalvikExecutableParser/typedNumbers.d.ts +85 -69
- package/build/dalvikExecutableParser/typedNumbers.js +0 -1
- package/build/dalvikExecutableParser.d.ts +2 -2
- package/build/dalvikExecutableParser.js +655 -337
- package/build/dalvikExecutableParser.test.js +24 -22
- package/build/dalvikExecutableParserAgainstSmaliParser.test.js +223 -246
- package/build/dalvikExecutableUnparser/annotationUnparsers.d.ts +14 -0
- package/build/dalvikExecutableUnparser/annotationUnparsers.js +97 -0
- package/build/dalvikExecutableUnparser/poolBuilders.d.ts +49 -0
- package/build/dalvikExecutableUnparser/poolBuilders.js +140 -0
- package/build/dalvikExecutableUnparser/poolScanners.d.ts +4 -0
- package/build/dalvikExecutableUnparser/poolScanners.js +220 -0
- package/build/dalvikExecutableUnparser/sectionUnparsers.d.ts +25 -0
- package/build/dalvikExecutableUnparser/sectionUnparsers.js +581 -0
- package/build/dalvikExecutableUnparser/utils.d.ts +10 -0
- package/build/dalvikExecutableUnparser/utils.js +108 -0
- package/build/dalvikExecutableUnparser.d.ts +4 -0
- package/build/dalvikExecutableUnparser.js +406 -0
- package/build/dalvikExecutableUnparser.test.d.ts +1 -0
- package/build/dalvikExecutableUnparser.test.js +31 -0
- package/build/debugLogInputParser.js +1 -1
- package/build/disjunctionParser.d.ts +2 -2
- package/build/disjunctionParser.js +2 -2
- package/build/elementTerminatedArrayParser.d.ts +2 -2
- package/build/elementTerminatedArrayParser.js +1 -1
- package/build/elementTerminatedArrayParser.test.js +5 -5
- package/build/elementTerminatedSequenceArrayParser.d.ts +2 -2
- package/build/elementTerminatedSequenceArrayParser.js +1 -1
- package/build/elementTerminatedSequenceArrayParser.test.js +2 -2
- package/build/elementTerminatedSequenceParser.d.ts +2 -2
- package/build/elementTerminatedSequenceParser.js +1 -1
- package/build/elementTerminatedSequenceParser.test.js +2 -2
- package/build/endOfInputParser.d.ts +1 -1
- package/build/exactElementSwitchParser.d.ts +3 -0
- package/build/exactElementSwitchParser.js +22 -0
- package/build/fetchCid.js +2 -6
- package/build/fetchCid.test.d.ts +1 -0
- package/build/fetchCid.test.js +16 -0
- package/build/fixedLengthSequenceParser.test.js +2 -2
- package/build/hasExecutable.js +2 -2
- package/build/highResolutionTimer.js +1 -1
- package/build/index.d.ts +24 -2
- package/build/index.js +22 -1
- package/build/inputReader.d.ts +1 -1
- package/build/inputReader.test.js +33 -45
- package/build/javaKeyStoreParser.test.js +6 -6
- package/build/jsonParser.js +8 -8
- package/build/lazyMessageError.d.ts +48 -0
- package/build/lazyMessageError.js +53 -0
- package/build/lazyMessageError.test.d.ts +1 -0
- package/build/lazyMessageError.test.js +15 -0
- package/build/leb128Parser.d.ts +1 -1
- package/build/leb128Parser.js +10 -10
- package/build/leb128Parser.test.js +7 -7
- package/build/negativeLookaheadParser.js +2 -2
- package/build/negativeLookaheadParser.test.js +4 -4
- package/build/noStackCaptureOverheadError.d.ts +4 -0
- package/build/noStackCaptureOverheadError.js +9 -0
- package/build/noStackCaptureOverheadError.test.d.ts +1 -0
- package/build/noStackCaptureOverheadError.test.js +15 -0
- package/build/nonEmptyArrayParser.js +2 -2
- package/build/nonEmptyArrayParser.test.js +2 -1
- package/build/optionalParser.js +2 -2
- package/build/parser.d.ts +2 -1
- package/build/parser.js +23 -8
- package/build/parser.test.js +78 -29
- package/build/parserConsumedSequenceParser.d.ts +1 -1
- package/build/parserConsumedSequenceParser.js +2 -2
- package/build/parserContext.d.ts +8 -6
- package/build/parserContext.js +60 -33
- package/build/parserContext.test.js +7 -3
- package/build/parserError.d.ts +603 -44
- package/build/parserError.js +98 -53
- package/build/parserImplementationInvariant.d.ts +1 -1
- package/build/parserImplementationInvariant.js +2 -2
- package/build/parserInputCompanion.js +2 -2
- package/build/promiseCompose.js +1 -2
- package/build/regexpParser.d.ts +2 -0
- package/build/regexpParser.js +71 -0
- package/build/regexpParser.test.d.ts +1 -0
- package/build/regexpParser.test.js +83 -0
- package/build/regularExpression.d.ts +63 -0
- package/build/regularExpression.js +1 -0
- package/build/regularExpressionParser.d.ts +3 -0
- package/build/regularExpressionParser.js +580 -0
- package/build/regularExpressionParser.test.d.ts +1 -0
- package/build/regularExpressionParser.test.js +89 -0
- package/build/separatedArrayParser.js +2 -2
- package/build/separatedNonEmptyArrayParser.d.ts +2 -0
- package/build/separatedNonEmptyArrayParser.js +40 -0
- package/build/separatedNonEmptyArrayParser.test.d.ts +1 -0
- package/build/separatedNonEmptyArrayParser.test.js +66 -0
- package/build/sequenceBuffer.js +1 -1
- package/build/sequenceTerminatedSequenceParser.d.ts +2 -2
- package/build/sequenceTerminatedSequenceParser.js +3 -3
- package/build/sequenceTerminatedSequenceParser.test.js +1 -1
- package/build/sequenceUnparser.d.ts +1 -1
- package/build/skipToParser.d.ts +1 -1
- package/build/skipToParser.js +2 -2
- package/build/sliceBoundedParser.test.js +4 -9
- package/build/smali.d.ts +1 -1
- package/build/smali.js +6 -2
- package/build/smaliParser.d.ts +62 -6
- package/build/smaliParser.js +1721 -296
- package/build/smaliParser.test.js +338 -43
- package/build/stringFromAsyncIterable.d.ts +1 -0
- package/build/stringFromAsyncIterable.js +7 -0
- package/build/terminatedArrayParser.js +4 -4
- package/build/terminatedArrayParser.test.js +7 -7
- package/build/toAsyncIterator.js +4 -4
- package/build/unionParser.d.ts +1 -1
- package/build/unionParser.js +2 -2
- package/build/unionParser.test.js +3 -3
- package/build/unparser.d.ts +3 -3
- package/build/unparser.js +6 -4
- package/build/unparser.test.js +7 -19
- package/build/unparserContext.d.ts +2 -2
- package/build/unparserContext.js +2 -3
- package/build/unparserError.d.ts +2 -1
- package/build/unparserError.js +2 -1
- package/build/unparserImplementationInvariant.d.ts +1 -1
- package/build/unparserOutputCompanion.d.ts +1 -1
- package/build/unparserOutputCompanion.js +1 -1
- package/build/zipParser.js +1 -1
- package/build/zipUnparser.d.ts +3 -3
- package/build/zipUnparser.js +9 -19
- package/build/zipUnparser.test.js +1 -1
- package/package.json +20 -26
- package/src/allSettledStream.test.ts +2 -2
- package/src/allSettledStream.ts +3 -3
- package/src/androidPackageParser.test.ts +17 -19
- package/src/androidPackageParser.ts +129 -171
- package/src/androidPackageUnparser.test.ts +19 -21
- package/src/androidPackageUnparser.ts +23 -17
- package/src/arbitrarilySlicedAsyncInterable.ts +1 -1
- package/src/arbitrarilySlicedAsyncInterator.ts +4 -4
- package/src/arbitraryDalvikBytecode.ts +992 -0
- package/src/arbitraryDalvikExecutable.ts +434 -0
- package/src/arbitraryDosDateTime.ts +1 -0
- package/src/arbitraryZipStream.ts +1 -1
- package/src/arrayParser.ts +2 -2
- package/src/arrayUnparser.ts +2 -2
- package/src/backsmali.ts +48 -4
- package/src/bash.ts +120 -0
- package/src/bashParser.test.ts +332 -0
- package/src/bashParser.ts +461 -0
- package/src/bsonParser.test.ts +12 -14
- package/src/customInvariant.ts +8 -12
- package/src/dalvikBytecodeParser/formatParsers.ts +376 -17
- package/src/dalvikBytecodeParser/formatSizes.ts +35 -0
- package/src/dalvikBytecodeParser/operationFormats.ts +226 -0
- package/src/dalvikBytecodeParser.ts +1042 -243
- package/src/dalvikBytecodeUnparser/formatUnparsers.ts +442 -0
- package/src/dalvikBytecodeUnparser.test.ts +44 -0
- package/src/dalvikBytecodeUnparser.ts +758 -0
- package/src/dalvikExecutable.ts +110 -48
- package/src/dalvikExecutableParser/stringSyntaxParser.ts +33 -33
- package/src/dalvikExecutableParser/typeParsers.ts +23 -14
- package/src/dalvikExecutableParser/typedNumbers.ts +19 -19
- package/src/dalvikExecutableParser.test.ts +60 -60
- package/src/dalvikExecutableParser.test.ts.md +6 -6
- package/src/dalvikExecutableParser.test.ts.snap +0 -0
- package/src/dalvikExecutableParser.ts +911 -434
- package/src/dalvikExecutableParserAgainstSmaliParser.test.ts +256 -239
- package/src/dalvikExecutableUnparser/annotationUnparsers.ts +135 -0
- package/src/dalvikExecutableUnparser/poolBuilders.ts +189 -0
- package/src/dalvikExecutableUnparser/poolScanners.ts +297 -0
- package/src/dalvikExecutableUnparser/sectionUnparsers.ts +683 -0
- package/src/dalvikExecutableUnparser/utils.ts +149 -0
- package/src/dalvikExecutableUnparser.test.ts +57 -0
- package/src/dalvikExecutableUnparser.ts +581 -0
- package/src/debugLogInputParser.ts +1 -1
- package/src/disjunctionParser.ts +5 -5
- package/src/elementTerminatedArrayParser.test.ts +8 -8
- package/src/elementTerminatedArrayParser.ts +2 -2
- package/src/elementTerminatedSequenceArrayParser.test.ts +4 -6
- package/src/elementTerminatedSequenceArrayParser.ts +2 -2
- package/src/elementTerminatedSequenceParser.test.ts +4 -6
- package/src/elementTerminatedSequenceParser.ts +2 -2
- package/src/endOfInputParser.ts +1 -1
- package/src/exactElementSwitchParser.ts +41 -0
- package/src/fetchCid.test.ts +20 -0
- package/src/fetchCid.ts +3 -7
- package/src/fixedLengthSequenceParser.test.ts +10 -12
- package/src/hasExecutable.ts +2 -2
- package/src/highResolutionTimer.ts +1 -1
- package/src/index.ts +113 -2
- package/src/inputReader.test.ts +39 -52
- package/src/inputReader.ts +2 -4
- package/src/inputReaderState.ts +1 -1
- package/src/inspect.ts +1 -1
- package/src/javaKeyStoreParser.test.ts +12 -14
- package/src/javaKeyStoreParser.ts +2 -6
- package/src/jsonParser.test.ts +2 -4
- package/src/jsonParser.ts +34 -38
- package/src/lazyMessageError.test.ts +21 -0
- package/src/lazyMessageError.ts +88 -0
- package/src/leb128Parser.test.ts +25 -23
- package/src/leb128Parser.ts +19 -19
- package/src/negativeLookaheadParser.test.ts +7 -11
- package/src/negativeLookaheadParser.ts +2 -2
- package/src/noStackCaptureOverheadError.test.ts +17 -0
- package/src/noStackCaptureOverheadError.ts +12 -0
- package/src/nonEmptyArrayParser.test.ts +3 -2
- package/src/nonEmptyArrayParser.ts +2 -2
- package/src/optionalParser.ts +2 -2
- package/src/parser.test.ts +96 -43
- package/src/parser.test.ts.md +13 -6
- package/src/parser.test.ts.snap +0 -0
- package/src/parser.ts +35 -12
- package/src/parserAccessorParser.ts +1 -1
- package/src/parserConsumedSequenceParser.ts +3 -3
- package/src/parserContext.test.ts +7 -3
- package/src/parserContext.ts +82 -48
- package/src/parserError.ts +143 -63
- package/src/parserImplementationInvariant.ts +3 -3
- package/src/parserInputCompanion.ts +2 -2
- package/src/promiseCompose.ts +2 -2
- package/src/regexpParser.test.ts +186 -0
- package/src/regexpParser.ts +94 -0
- package/src/regularExpression.ts +24 -0
- package/src/regularExpressionParser.test.ts +102 -0
- package/src/regularExpressionParser.ts +921 -0
- package/src/separatedArrayParser.ts +3 -3
- package/src/separatedNonEmptyArrayParser.test.ts +117 -0
- package/src/separatedNonEmptyArrayParser.ts +61 -0
- package/src/sequenceBuffer.test.ts +9 -9
- package/src/sequenceBuffer.ts +4 -4
- package/src/sequenceTerminatedSequenceParser.test.ts +3 -5
- package/src/sequenceTerminatedSequenceParser.ts +4 -4
- package/src/sequenceUnparser.ts +2 -2
- package/src/skipToParser.ts +2 -2
- package/src/sliceBoundedParser.test.ts +4 -12
- package/src/sliceBoundedParser.ts +2 -2
- package/src/smali.ts +8 -3
- package/src/smaliParser.test.ts +377 -66
- package/src/smaliParser.test.ts.md +1635 -48
- package/src/smaliParser.test.ts.snap +0 -0
- package/src/smaliParser.ts +2751 -569
- package/src/stringFromAsyncIterable.ts +9 -0
- package/src/terminatedArrayParser.test.ts +11 -11
- package/src/terminatedArrayParser.ts +5 -7
- package/src/toAsyncIterator.ts +8 -8
- package/src/uint8Array.ts +2 -3
- package/src/unionParser.test.ts +22 -23
- package/src/unionParser.ts +6 -8
- package/src/unparser.test.ts +18 -34
- package/src/unparser.ts +13 -9
- package/src/unparserContext.ts +9 -13
- package/src/unparserError.ts +2 -1
- package/src/unparserImplementationInvariant.ts +1 -1
- package/src/unparserOutputCompanion.ts +1 -1
- package/src/zip.ts +2 -6
- package/src/zipParser.ts +10 -18
- package/src/zipUnparser.test.ts +1 -1
- package/src/zipUnparser.ts +52 -64
- package/tsconfig.json +7 -1
- package/xo.config.ts +15 -0
- package/.yarn/releases/yarn-4.5.3.cjs +0 -934
package/build/parserError.js
CHANGED
|
@@ -1,61 +1,106 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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'));
|
|
5
10
|
}
|
|
6
|
-
export
|
|
7
|
-
|
|
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');
|
|
8
19
|
}
|
|
9
|
-
export
|
|
10
|
-
|
|
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)));
|
|
11
27
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
super(message);
|
|
18
|
-
this.depth = depth;
|
|
19
|
-
this.position = position;
|
|
28
|
+
function createParserErrorModule(BaseLazyMessageError) {
|
|
29
|
+
class ParserError extends BaseLazyMessageError {
|
|
30
|
+
name = 'ParserError';
|
|
31
|
+
position = undefined;
|
|
32
|
+
inputReaderSate = undefined;
|
|
20
33
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
name = 'ParserParsingJoinError';
|
|
24
|
-
childErrors = [];
|
|
25
|
-
}
|
|
26
|
-
export class ParserParsingJoinNoneError extends ParserParsingJoinError {
|
|
27
|
-
name = 'ParserParsingJoinNoneError';
|
|
28
|
-
}
|
|
29
|
-
export class ParserParsingJoinAllError extends ParserParsingJoinError {
|
|
30
|
-
childErrors;
|
|
31
|
-
name = 'ParserParsingJoinAllError';
|
|
32
|
-
constructor(message, depth, position, childErrors) {
|
|
33
|
-
super(message, depth, position);
|
|
34
|
-
this.childErrors = childErrors;
|
|
34
|
+
class ParserImplementationError extends ParserError {
|
|
35
|
+
name = 'ParserImplementationError';
|
|
35
36
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
childErrors;
|
|
39
|
-
name = 'ParserParsingJoinDeepestError';
|
|
40
|
-
constructor(message, depth, position, childErrors) {
|
|
41
|
-
super(message, depth, position);
|
|
42
|
-
this.childErrors = childErrors;
|
|
37
|
+
class ParserImplementationInvariantError extends ParserImplementationError {
|
|
38
|
+
name = 'ParserImplementationInvariantError';
|
|
43
39
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
+
}
|
|
51
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
|
+
};
|
|
52
104
|
}
|
|
53
|
-
export
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
export class ParserUnexpectedEndOfInputError extends ParserParsingFailedError {
|
|
57
|
-
name = 'ParserUnexpectedEndOfInputError';
|
|
58
|
-
}
|
|
59
|
-
export class ParserUnexpectedRemainingInputError extends ParserParsingFailedError {
|
|
60
|
-
name = 'ParserUnexpectedRemainingInputError';
|
|
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
|
}
|
|
@@ -57,8 +57,8 @@ export class Uint8ArrayParserInputCompanion {
|
|
|
57
57
|
if (sequenceA.length !== sequenceB.length) {
|
|
58
58
|
return false;
|
|
59
59
|
}
|
|
60
|
-
for (
|
|
61
|
-
if (
|
|
60
|
+
for (const [index, element] of sequenceA.entries()) {
|
|
61
|
+
if (element !== sequenceB[index]) {
|
|
62
62
|
return false;
|
|
63
63
|
}
|
|
64
64
|
}
|
package/build/promiseCompose.js
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
export function promiseCompose(f1, f2) {
|
|
2
|
-
function promiseComposed(a) {
|
|
2
|
+
async function promiseComposed(a) {
|
|
3
3
|
const bOrBPromise = f1(a);
|
|
4
4
|
if (bOrBPromise instanceof Promise) {
|
|
5
5
|
return bOrBPromise.then(f2);
|
|
6
6
|
}
|
|
7
7
|
return f2(bOrBPromise);
|
|
8
8
|
}
|
|
9
|
-
;
|
|
10
9
|
Object.defineProperty(promiseComposed, 'name', {
|
|
11
10
|
value: `promiseCompose(${f1.name}, ${f2.name})`,
|
|
12
11
|
});
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { setParserName } from './parser.js';
|
|
2
|
+
export const createRegExpParser = (regexp) => {
|
|
3
|
+
const regexpParser = async (parserContext) => {
|
|
4
|
+
let start = 0;
|
|
5
|
+
let window = 1;
|
|
6
|
+
let lastMatch;
|
|
7
|
+
let reachedEndOfInput = false;
|
|
8
|
+
while (true) {
|
|
9
|
+
const sequence = await parserContext.peekSequence(start, start + window);
|
|
10
|
+
if (sequence === undefined) {
|
|
11
|
+
reachedEndOfInput = true;
|
|
12
|
+
window = Math.floor(window / 2);
|
|
13
|
+
if (window === 0) {
|
|
14
|
+
// Get the full sequence we've accumulated to verify matches
|
|
15
|
+
const fullSequence = await parserContext.peekSequence(0, start);
|
|
16
|
+
// Verify any previous match is still valid with full context
|
|
17
|
+
// For lookahead/lookbehind assertions, additional input might invalidate a match
|
|
18
|
+
if (fullSequence !== undefined) {
|
|
19
|
+
const verifyMatch = regexp.exec(fullSequence);
|
|
20
|
+
if (verifyMatch !== null && verifyMatch.index === 0) {
|
|
21
|
+
parserContext.skip(verifyMatch[0].length);
|
|
22
|
+
return verifyMatch;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
else if (lastMatch !== undefined) {
|
|
26
|
+
// No full sequence available but we have a previous match
|
|
27
|
+
parserContext.skip(lastMatch[0].length);
|
|
28
|
+
return lastMatch;
|
|
29
|
+
}
|
|
30
|
+
// No previous match - try matching against empty string for zero-width patterns (e.g., /a*/, /[ \t]*/)
|
|
31
|
+
const emptyMatch = regexp.exec('');
|
|
32
|
+
if (emptyMatch !== null && emptyMatch.index === 0) {
|
|
33
|
+
return emptyMatch;
|
|
34
|
+
}
|
|
35
|
+
return parserContext.invariant(false, 'Unexpected end of input without regex match');
|
|
36
|
+
}
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
const fullSequence = await parserContext.peekSequence(0, start + window);
|
|
40
|
+
if (fullSequence === undefined) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
const match = regexp.exec(fullSequence);
|
|
44
|
+
if (match === null || match.index !== 0) {
|
|
45
|
+
if (lastMatch !== undefined) {
|
|
46
|
+
// Verify lastMatch is still valid with current full context
|
|
47
|
+
// For lookahead/lookbehind assertions, a match on shorter input might be
|
|
48
|
+
// invalidated by additional input (e.g., /\|(?!\|)/ matches '|' but not '||')
|
|
49
|
+
const verifyMatch = regexp.exec(fullSequence);
|
|
50
|
+
if (verifyMatch !== null && verifyMatch.index === 0) {
|
|
51
|
+
parserContext.skip(verifyMatch[0].length);
|
|
52
|
+
return verifyMatch;
|
|
53
|
+
}
|
|
54
|
+
// lastMatch was invalidated by additional context
|
|
55
|
+
lastMatch = undefined;
|
|
56
|
+
}
|
|
57
|
+
if (reachedEndOfInput) {
|
|
58
|
+
parserContext.invariant(false, 'Regex did not match at start of input');
|
|
59
|
+
}
|
|
60
|
+
start += window;
|
|
61
|
+
window *= 2;
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
lastMatch = match;
|
|
65
|
+
start += window;
|
|
66
|
+
window *= 2;
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
setParserName(regexpParser, regexp.toString());
|
|
70
|
+
return regexpParser;
|
|
71
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import * as fc from 'fast-check';
|
|
3
|
+
import { testProp } from '@fast-check/ava';
|
|
4
|
+
import { runParser, runParserWithRemainingInput } from './parser.js';
|
|
5
|
+
import { stringParserInputCompanion } from './parserInputCompanion.js';
|
|
6
|
+
import { createRegExpParser } from './regexpParser.js';
|
|
7
|
+
test('regexpParser matches digits', async (t) => {
|
|
8
|
+
const regexpParser = createRegExpParser(/\d+/);
|
|
9
|
+
const result = await runParser(regexpParser, '123', stringParserInputCompanion);
|
|
10
|
+
t.is(result[0], '123');
|
|
11
|
+
});
|
|
12
|
+
test('regexpParser matches at start only', async (t) => {
|
|
13
|
+
const regexpParser = createRegExpParser(/\d+/);
|
|
14
|
+
const { output, remainingInput } = await runParserWithRemainingInput(regexpParser, '123abc', stringParserInputCompanion);
|
|
15
|
+
t.is(output[0], '123');
|
|
16
|
+
t.truthy(remainingInput);
|
|
17
|
+
});
|
|
18
|
+
test('regexpParser fails when no match at start', async (t) => {
|
|
19
|
+
const regexpParser = createRegExpParser(/\d+/);
|
|
20
|
+
await t.throwsAsync(runParser(regexpParser, 'abc123', stringParserInputCompanion));
|
|
21
|
+
});
|
|
22
|
+
test('regexpParser with capture groups', async (t) => {
|
|
23
|
+
const regexpParser = createRegExpParser(/(\d+)-(\d+)/);
|
|
24
|
+
const result = await runParser(regexpParser, '123-456', stringParserInputCompanion);
|
|
25
|
+
t.is(result[0], '123-456');
|
|
26
|
+
t.is(result[1], '123');
|
|
27
|
+
t.is(result[2], '456');
|
|
28
|
+
});
|
|
29
|
+
test('regexpParser greedy matching', async (t) => {
|
|
30
|
+
const regexpParser = createRegExpParser(/a+/);
|
|
31
|
+
const { output } = await runParserWithRemainingInput(regexpParser, 'aaab', stringParserInputCompanion);
|
|
32
|
+
t.is(output[0], 'aaa');
|
|
33
|
+
});
|
|
34
|
+
test('regexpParser with anchored regexp', async (t) => {
|
|
35
|
+
const regexpParser = createRegExpParser(/^hello/);
|
|
36
|
+
const { output } = await runParserWithRemainingInput(regexpParser, 'hello world', stringParserInputCompanion);
|
|
37
|
+
t.is(output[0], 'hello');
|
|
38
|
+
});
|
|
39
|
+
testProp.serial('regexpParser matches word characters', [
|
|
40
|
+
fc.tuple(fc.stringMatching(/^\w+$/), fc.stringMatching(/^\W*$/)),
|
|
41
|
+
], async (t, [word, nonWord]) => {
|
|
42
|
+
const regexpParser = createRegExpParser(/\w+/);
|
|
43
|
+
const { output, position } = await runParserWithRemainingInput(regexpParser, word + nonWord, stringParserInputCompanion);
|
|
44
|
+
t.is(output[0], word);
|
|
45
|
+
t.is(position, word.length);
|
|
46
|
+
}, {
|
|
47
|
+
verbose: true,
|
|
48
|
+
});
|
|
49
|
+
// Tests for zero-width/optional patterns at end of input
|
|
50
|
+
test('regexpParser with star quantifier on empty input', async (t) => {
|
|
51
|
+
const regexpParser = createRegExpParser(/a*/);
|
|
52
|
+
const result = await runParser(regexpParser, '', stringParserInputCompanion);
|
|
53
|
+
t.is(result[0], '');
|
|
54
|
+
});
|
|
55
|
+
test('regexpParser with optional whitespace on empty input', async (t) => {
|
|
56
|
+
const regexpParser = createRegExpParser(/[ \t]*/);
|
|
57
|
+
const result = await runParser(regexpParser, '', stringParserInputCompanion);
|
|
58
|
+
t.is(result[0], '');
|
|
59
|
+
});
|
|
60
|
+
test('regexpParser with star quantifier at end of input (no match)', async (t) => {
|
|
61
|
+
const regexpParser = createRegExpParser(/a*/);
|
|
62
|
+
const { output } = await runParserWithRemainingInput(regexpParser, 'bbb', stringParserInputCompanion);
|
|
63
|
+
t.is(output[0], '');
|
|
64
|
+
});
|
|
65
|
+
test('regexpParser with optional group on empty input', async (t) => {
|
|
66
|
+
const regexpParser = createRegExpParser(/(?:foo)?/);
|
|
67
|
+
const result = await runParser(regexpParser, '', stringParserInputCompanion);
|
|
68
|
+
t.is(result[0], '');
|
|
69
|
+
});
|
|
70
|
+
// Tests for negative lookahead
|
|
71
|
+
test('regexpParser with negative lookahead should not match when followed by same char', async (t) => {
|
|
72
|
+
// This regex should NOT match anything in '||' - the | is followed by another |
|
|
73
|
+
const regexpParser = createRegExpParser(/\|(?!\|)/);
|
|
74
|
+
await t.throwsAsync(runParser(regexpParser, '||', stringParserInputCompanion));
|
|
75
|
+
});
|
|
76
|
+
test('regexpParser with negative lookahead should match single char', async (t) => {
|
|
77
|
+
// This regex should match single '|' when followed by something else
|
|
78
|
+
const regexpParser = createRegExpParser(/\|(?!\|)/);
|
|
79
|
+
const { output, position, remainingInput } = await runParserWithRemainingInput(regexpParser, '| ', stringParserInputCompanion);
|
|
80
|
+
t.is(output[0], '|');
|
|
81
|
+
t.is(position, 1); // Consumed 1 character
|
|
82
|
+
t.truthy(remainingInput); // There's remaining input (the space)
|
|
83
|
+
});
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export type CodePointRange = {
|
|
2
|
+
start: number;
|
|
3
|
+
end: number;
|
|
4
|
+
};
|
|
5
|
+
export type CharacterSet = {
|
|
6
|
+
type: 'empty';
|
|
7
|
+
} | {
|
|
8
|
+
type: 'node';
|
|
9
|
+
range: CodePointRange;
|
|
10
|
+
left: CharacterSet;
|
|
11
|
+
right: CharacterSet;
|
|
12
|
+
};
|
|
13
|
+
export type RepeatBounds = number | {
|
|
14
|
+
min: number;
|
|
15
|
+
max?: number;
|
|
16
|
+
} | {
|
|
17
|
+
min?: number;
|
|
18
|
+
max: number;
|
|
19
|
+
};
|
|
20
|
+
export type RegularExpression = {
|
|
21
|
+
type: 'epsilon';
|
|
22
|
+
} | {
|
|
23
|
+
type: 'literal';
|
|
24
|
+
charset: CharacterSet;
|
|
25
|
+
} | {
|
|
26
|
+
type: 'concat';
|
|
27
|
+
left: RegularExpression;
|
|
28
|
+
right: RegularExpression;
|
|
29
|
+
} | {
|
|
30
|
+
type: 'union';
|
|
31
|
+
left: RegularExpression;
|
|
32
|
+
right: RegularExpression;
|
|
33
|
+
} | {
|
|
34
|
+
type: 'star';
|
|
35
|
+
inner: RegularExpression;
|
|
36
|
+
} | {
|
|
37
|
+
type: 'plus';
|
|
38
|
+
inner: RegularExpression;
|
|
39
|
+
} | {
|
|
40
|
+
type: 'optional';
|
|
41
|
+
inner: RegularExpression;
|
|
42
|
+
} | {
|
|
43
|
+
type: 'repeat';
|
|
44
|
+
inner: RegularExpression;
|
|
45
|
+
bounds: RepeatBounds;
|
|
46
|
+
} | {
|
|
47
|
+
type: 'capture-group';
|
|
48
|
+
inner: RegularExpression;
|
|
49
|
+
name?: string;
|
|
50
|
+
} | {
|
|
51
|
+
type: 'lookahead';
|
|
52
|
+
isPositive: boolean;
|
|
53
|
+
inner: RegularExpression;
|
|
54
|
+
right: RegularExpression;
|
|
55
|
+
} | {
|
|
56
|
+
type: 'start-anchor';
|
|
57
|
+
left: RegularExpression;
|
|
58
|
+
right: RegularExpression;
|
|
59
|
+
} | {
|
|
60
|
+
type: 'end-anchor';
|
|
61
|
+
left: RegularExpression;
|
|
62
|
+
right: RegularExpression;
|
|
63
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|