@futpib/parser 1.0.3 → 1.0.6
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/.claude/settings.local.json +24 -0
- package/.github/workflows/main.yml +1 -0
- package/build/androidPackageParser.js +30 -32
- package/build/arbitraryDalvikBytecode.d.ts +3 -3
- package/build/arbitraryDalvikBytecode.js +33 -27
- package/build/arbitraryDalvikExecutable.js +55 -17
- package/build/arbitraryJava.d.ts +31 -0
- package/build/arbitraryJava.js +532 -0
- package/build/arbitraryJavaScript.d.ts +3 -0
- package/build/arbitraryJavaScript.js +263 -0
- package/build/arbitraryJavascript.d.ts +3 -0
- package/build/arbitraryJavascript.js +263 -0
- package/build/arbitraryZig.d.ts +3 -0
- package/build/arbitraryZig.js +240 -0
- package/build/arbitraryZipStream.d.ts +1 -1
- package/build/arrayParser.js +72 -13
- package/build/backsmali.d.ts +4 -3
- package/build/backsmali.js +26 -6
- package/build/bash.d.ts +89 -0
- package/build/bash.js +1 -0
- package/build/bashParser.d.ts +6 -0
- package/build/bashParser.js +335 -0
- package/build/bashParser.test.d.ts +1 -0
- package/build/bashParser.test.js +343 -0
- package/build/bashParserEdgeCases.test.d.ts +1 -0
- package/build/bashParserEdgeCases.test.js +117 -0
- package/build/dalvikBytecodeParser/addressConversion.d.ts +110 -0
- package/build/dalvikBytecodeParser/addressConversion.js +334 -0
- package/build/dalvikBytecodeParser/formatParsers.d.ts +7 -6
- package/build/dalvikBytecodeParser/formatParsers.js +13 -14
- package/build/dalvikBytecodeParser.d.ts +60 -31
- package/build/dalvikBytecodeParser.js +92 -35
- package/build/dalvikBytecodeParser.test-d.d.ts +1 -0
- package/build/dalvikBytecodeParser.test-d.js +268 -0
- package/build/dalvikBytecodeUnparser/formatUnparsers.d.ts +9 -8
- package/build/dalvikBytecodeUnparser/formatUnparsers.js +13 -12
- package/build/dalvikBytecodeUnparser.d.ts +2 -2
- package/build/dalvikBytecodeUnparser.js +23 -23
- package/build/dalvikBytecodeUnparser.test.js +7 -7
- package/build/dalvikExecutable.d.ts +3 -3
- package/build/dalvikExecutable.test-d.d.ts +1 -0
- package/build/dalvikExecutable.test-d.js +59 -0
- package/build/dalvikExecutableParser/typedNumbers.d.ts +18 -0
- package/build/dalvikExecutableParser/typedNumbers.js +3 -0
- package/build/dalvikExecutableParser.d.ts +2 -1
- package/build/dalvikExecutableParser.js +96 -77
- package/build/dalvikExecutableParser.test.js +24 -3
- package/build/dalvikExecutableParserAgainstSmaliParser.test.js +3 -0
- package/build/dalvikExecutableUnparser/poolScanners.d.ts +2 -2
- package/build/dalvikExecutableUnparser/sectionUnparsers.d.ts +3 -3
- package/build/dalvikExecutableUnparser/sectionUnparsers.js +26 -11
- package/build/dalvikExecutableUnparser.d.ts +2 -2
- package/build/dalvikExecutableUnparser.test.js +2 -1
- package/build/disjunctionParser.d.ts +5 -3
- package/build/disjunctionParser.js +79 -17
- package/build/disjunctionParser.test-d.d.ts +1 -0
- package/build/disjunctionParser.test-d.js +72 -0
- package/build/elementSwitchParser.d.ts +4 -0
- package/build/{exactElementSwitchParser.js → elementSwitchParser.js} +3 -4
- package/build/elementSwitchParser.test-d.d.ts +1 -0
- package/build/elementSwitchParser.test-d.js +44 -0
- package/build/exactSequenceParser.d.ts +4 -2
- package/build/exactSequenceParser.test-d.d.ts +1 -0
- package/build/exactSequenceParser.test-d.js +36 -0
- package/build/fetchCid.js +2 -66
- package/build/index.d.ts +25 -2
- package/build/index.js +23 -1
- package/build/index.test.js +16 -1
- package/build/inputReader.d.ts +10 -0
- package/build/inputReader.js +36 -0
- package/build/java.d.ts +502 -0
- package/build/java.js +2 -0
- package/build/javaKeyStoreParser.js +14 -17
- package/build/javaParser.d.ts +51 -0
- package/build/javaParser.js +1538 -0
- package/build/javaParser.test.d.ts +1 -0
- package/build/javaParser.test.js +1287 -0
- package/build/javaScript.d.ts +35 -0
- package/build/javaScript.js +1 -0
- package/build/javaScriptParser.d.ts +9 -0
- package/build/javaScriptParser.js +34 -0
- package/build/javaScriptUnparser.d.ts +3 -0
- package/build/javaScriptUnparser.js +4 -0
- package/build/javaScriptUnparser.test.d.ts +1 -0
- package/build/javaScriptUnparser.test.js +24 -0
- package/build/javaUnparser.d.ts +2 -0
- package/build/javaUnparser.js +519 -0
- package/build/javaUnparser.test.d.ts +1 -0
- package/build/javaUnparser.test.js +24 -0
- package/build/javascript.d.ts +35 -0
- package/build/javascript.js +1 -0
- package/build/javascriptParser.d.ts +9 -0
- package/build/javascriptParser.js +34 -0
- package/build/javascriptUnparser.d.ts +3 -0
- package/build/javascriptUnparser.js +4 -0
- package/build/javascriptUnparser.test.d.ts +1 -0
- package/build/javascriptUnparser.test.js +24 -0
- package/build/jsonParser.js +2 -12
- package/build/lazyMessageError.d.ts +3 -0
- package/build/lookaheadParser.js +60 -3
- package/build/negativeLookaheadParser.js +70 -11
- package/build/nonEmptyArrayParser.js +72 -13
- package/build/objectParser.d.ts +12 -0
- package/build/objectParser.js +31 -0
- package/build/objectParser.test-d.d.ts +1 -0
- package/build/objectParser.test-d.js +112 -0
- package/build/objectParser.test.d.ts +1 -0
- package/build/objectParser.test.js +55 -0
- package/build/optionalParser.js +69 -10
- package/build/parser.d.ts +4 -0
- package/build/parser.js +3 -1
- package/build/parser.test.js +114 -1
- package/build/parserConsumedSequenceParser.js +66 -7
- package/build/parserContext.d.ts +6 -0
- package/build/parserContext.js +20 -11
- package/build/parserError.d.ts +119 -27
- package/build/parserError.js +16 -8
- package/build/regexpParser.d.ts +2 -0
- package/build/regexpParser.js +101 -0
- package/build/regexpParser.test.d.ts +1 -0
- package/build/regexpParser.test.js +114 -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 +600 -0
- package/build/regularExpressionParser.test.d.ts +1 -0
- package/build/regularExpressionParser.test.js +89 -0
- package/build/separatedArrayParser.js +73 -14
- package/build/separatedNonEmptyArrayParser.js +73 -14
- package/build/sliceBoundedParser.js +62 -5
- package/build/smaliParser.d.ts +7 -7
- package/build/smaliParser.js +185 -268
- package/build/smaliParser.test.js +58 -0
- package/build/stringEscapes.d.ts +5 -0
- package/build/stringEscapes.js +244 -0
- package/build/symbolicExpression.d.ts +29 -0
- package/build/symbolicExpression.js +1 -0
- package/build/symbolicExpressionParser.d.ts +4 -0
- package/build/symbolicExpressionParser.js +123 -0
- package/build/symbolicExpressionParser.test.d.ts +1 -0
- package/build/symbolicExpressionParser.test.js +289 -0
- package/build/terminatedArrayParser.js +113 -38
- package/build/terminatedArrayParser.test.js +4 -2
- package/build/tupleParser.d.ts +7 -15
- package/build/tupleParser.js +1 -0
- package/build/unionParser.d.ts +5 -3
- package/build/unionParser.js +7 -2
- package/build/unionParser.test-d.d.ts +1 -0
- package/build/unionParser.test-d.js +72 -0
- package/build/unionParser.test.js +10 -11
- package/build/zig.d.ts +280 -0
- package/build/zig.js +2 -0
- package/build/zigParser.d.ts +3 -0
- package/build/zigParser.js +1119 -0
- package/build/zigParser.test.d.ts +1 -0
- package/build/zigParser.test.js +1590 -0
- package/build/zigUnparser.d.ts +2 -0
- package/build/zigUnparser.js +460 -0
- package/build/zigUnparser.test.d.ts +1 -0
- package/build/zigUnparser.test.js +24 -0
- package/build/zipParser.js +19 -32
- package/build/zipUnparser.js +19 -7
- package/build/zipUnparser.test.js +1 -1
- package/node_modules-@types/s-expression/index.d.ts +5 -0
- package/package.json +25 -6
- package/src/androidPackageParser.ts +33 -60
- package/src/arbitraryDalvikBytecode.ts +39 -31
- package/src/arbitraryDalvikExecutable.ts +65 -20
- package/src/arbitraryJava.ts +804 -0
- package/src/arbitraryJavaScript.ts +410 -0
- package/src/arbitraryZig.ts +380 -0
- package/src/arrayParser.ts +1 -3
- package/src/backsmali.ts +35 -4
- package/src/bash.ts +127 -0
- package/src/bashParser.test.ts +590 -0
- package/src/bashParser.ts +498 -0
- package/src/dalvikBytecodeParser/addressConversion.ts +496 -0
- package/src/dalvikBytecodeParser/formatParsers.ts +19 -29
- package/src/dalvikBytecodeParser.test-d.ts +310 -0
- package/src/dalvikBytecodeParser.ts +194 -69
- package/src/dalvikBytecodeUnparser/formatUnparsers.ts +27 -26
- package/src/dalvikBytecodeUnparser.test.ts +7 -7
- package/src/dalvikBytecodeUnparser.ts +31 -30
- package/src/dalvikExecutable.test-d.ts +132 -0
- package/src/dalvikExecutable.ts +3 -3
- package/src/dalvikExecutableParser/typedNumbers.ts +11 -0
- package/src/dalvikExecutableParser.test.ts +37 -3
- package/src/dalvikExecutableParser.test.ts.md +163 -2
- package/src/dalvikExecutableParser.test.ts.snap +0 -0
- package/src/dalvikExecutableParser.ts +121 -139
- package/src/dalvikExecutableParserAgainstSmaliParser.test.ts +4 -0
- package/src/dalvikExecutableUnparser/poolScanners.ts +6 -6
- package/src/dalvikExecutableUnparser/sectionUnparsers.ts +38 -14
- package/src/dalvikExecutableUnparser.test.ts +3 -2
- package/src/dalvikExecutableUnparser.ts +4 -4
- package/src/disjunctionParser.test-d.ts +105 -0
- package/src/disjunctionParser.ts +18 -15
- package/src/elementSwitchParser.test-d.ts +74 -0
- package/src/elementSwitchParser.ts +51 -0
- package/src/exactSequenceParser.test-d.ts +43 -0
- package/src/exactSequenceParser.ts +13 -8
- package/src/fetchCid.ts +2 -76
- package/src/index.test.ts +22 -1
- package/src/index.ts +119 -2
- package/src/inputReader.ts +53 -0
- package/src/java.ts +708 -0
- package/src/javaKeyStoreParser.ts +18 -32
- package/src/javaParser.test.ts +1592 -0
- package/src/javaParser.ts +2640 -0
- package/src/javaScript.ts +36 -0
- package/src/javaScriptParser.ts +57 -0
- package/src/javaScriptUnparser.test.ts +37 -0
- package/src/javaScriptUnparser.ts +7 -0
- package/src/javaUnparser.test.ts +37 -0
- package/src/javaUnparser.ts +640 -0
- package/src/jsonParser.ts +6 -27
- package/src/lookaheadParser.ts +2 -6
- package/src/negativeLookaheadParser.ts +1 -3
- package/src/nonEmptyArrayParser.ts +1 -3
- package/src/objectParser.test-d.ts +152 -0
- package/src/objectParser.test.ts +71 -0
- package/src/objectParser.ts +69 -0
- package/src/optionalParser.ts +1 -3
- package/src/parser.test.ts +151 -4
- package/src/parser.ts +11 -1
- package/src/parserConsumedSequenceParser.ts +2 -4
- package/src/parserContext.ts +26 -11
- package/src/parserError.ts +17 -3
- package/src/regexpParser.test.ts +264 -0
- package/src/regexpParser.ts +126 -0
- package/src/regularExpression.ts +24 -0
- package/src/regularExpressionParser.test.ts +102 -0
- package/src/regularExpressionParser.ts +920 -0
- package/src/separatedArrayParser.ts +1 -3
- package/src/separatedNonEmptyArrayParser.ts +1 -3
- package/src/sliceBoundedParser.test.ts +2 -2
- package/src/sliceBoundedParser.ts +15 -19
- package/src/smaliParser.test.ts +64 -0
- package/src/smaliParser.test.ts.md +12 -12
- package/src/smaliParser.test.ts.snap +0 -0
- package/src/smaliParser.ts +246 -534
- package/src/stringEscapes.ts +253 -0
- package/src/symbolicExpression.ts +17 -0
- package/src/symbolicExpressionParser.test.ts +466 -0
- package/src/symbolicExpressionParser.ts +190 -0
- package/src/terminatedArrayParser.test.ts +9 -6
- package/src/terminatedArrayParser.ts +25 -29
- package/src/tupleParser.ts +21 -18
- package/src/unionParser.test-d.ts +105 -0
- package/src/unionParser.test.ts +18 -17
- package/src/unionParser.ts +28 -16
- package/src/zig.ts +411 -0
- package/src/zigParser.test.ts +1693 -0
- package/src/zigParser.ts +1745 -0
- package/src/zigUnparser.test.ts +37 -0
- package/src/zigUnparser.ts +615 -0
- package/src/zipParser.ts +20 -56
- package/src/zipUnparser.test.ts +1 -1
- package/src/zipUnparser.ts +22 -7
- package/tsconfig.json +2 -2
- package/build/exactElementSwitchParser.d.ts +0 -3
- package/src/exactElementSwitchParser.ts +0 -41
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type * as estree from 'estree';
|
|
2
|
+
import { type StripMeta } from './javascriptParser.js';
|
|
3
|
+
export type JavaScriptProgram = StripMeta<estree.Program>;
|
|
4
|
+
export type JavaScriptStatement = StripMeta<estree.Statement>;
|
|
5
|
+
export type JavaScriptExpression = StripMeta<estree.Expression>;
|
|
6
|
+
export type JavaScriptIdentifier = StripMeta<estree.Identifier>;
|
|
7
|
+
export type JavaScriptLiteral = StripMeta<estree.Literal>;
|
|
8
|
+
export type JavaScriptBlockStatement = StripMeta<estree.BlockStatement>;
|
|
9
|
+
export type JavaScriptExpressionStatement = StripMeta<estree.ExpressionStatement>;
|
|
10
|
+
export type JavaScriptVariableDeclaration = StripMeta<estree.VariableDeclaration>;
|
|
11
|
+
export type JavaScriptVariableDeclarator = StripMeta<estree.VariableDeclarator>;
|
|
12
|
+
export type JavaScriptIfStatement = StripMeta<estree.IfStatement>;
|
|
13
|
+
export type JavaScriptWhileStatement = StripMeta<estree.WhileStatement>;
|
|
14
|
+
export type JavaScriptForStatement = StripMeta<estree.ForStatement>;
|
|
15
|
+
export type JavaScriptReturnStatement = StripMeta<estree.ReturnStatement>;
|
|
16
|
+
export type JavaScriptThrowStatement = StripMeta<estree.ThrowStatement>;
|
|
17
|
+
export type JavaScriptTryStatement = StripMeta<estree.TryStatement>;
|
|
18
|
+
export type JavaScriptCatchClause = StripMeta<estree.CatchClause>;
|
|
19
|
+
export type JavaScriptEmptyStatement = StripMeta<estree.EmptyStatement>;
|
|
20
|
+
export type JavaScriptFunctionDeclaration = StripMeta<estree.FunctionDeclaration>;
|
|
21
|
+
export type JavaScriptFunctionExpression = StripMeta<estree.FunctionExpression>;
|
|
22
|
+
export type JavaScriptArrowFunctionExpression = StripMeta<estree.ArrowFunctionExpression>;
|
|
23
|
+
export type JavaScriptBinaryExpression = StripMeta<estree.BinaryExpression>;
|
|
24
|
+
export type JavaScriptLogicalExpression = StripMeta<estree.LogicalExpression>;
|
|
25
|
+
export type JavaScriptUnaryExpression = StripMeta<estree.UnaryExpression>;
|
|
26
|
+
export type JavaScriptUpdateExpression = StripMeta<estree.UpdateExpression>;
|
|
27
|
+
export type JavaScriptAssignmentExpression = StripMeta<estree.AssignmentExpression>;
|
|
28
|
+
export type JavaScriptConditionalExpression = StripMeta<estree.ConditionalExpression>;
|
|
29
|
+
export type JavaScriptCallExpression = StripMeta<estree.SimpleCallExpression>;
|
|
30
|
+
export type JavaScriptNewExpression = StripMeta<estree.NewExpression>;
|
|
31
|
+
export type JavaScriptMemberExpression = StripMeta<estree.MemberExpression>;
|
|
32
|
+
export type JavaScriptArrayExpression = StripMeta<estree.ArrayExpression>;
|
|
33
|
+
export type JavaScriptObjectExpression = StripMeta<estree.ObjectExpression>;
|
|
34
|
+
export type JavaScriptProperty = StripMeta<estree.Property>;
|
|
35
|
+
export type JavaScriptThisExpression = StripMeta<estree.ThisExpression>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type * as estree from 'estree';
|
|
2
|
+
import { type Parser } from './parser.js';
|
|
3
|
+
type PositionalFields = 'loc' | 'range' | 'start' | 'end' | 'leadingComments' | 'trailingComments' | 'comments' | 'innerComments';
|
|
4
|
+
export type StripMeta<T> = T extends Array<infer U> ? Array<StripMeta<U>> : T extends object ? {
|
|
5
|
+
[K in Exclude<keyof T, PositionalFields>]: StripMeta<T[K]>;
|
|
6
|
+
} : T;
|
|
7
|
+
export type JavaScriptProgram = StripMeta<estree.Program>;
|
|
8
|
+
export declare const javascriptProgramParser: Parser<JavaScriptProgram, string>;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import * as acorn from 'acorn';
|
|
2
|
+
import { promiseCompose } from './promiseCompose.js';
|
|
3
|
+
import { createRegExpParser } from './regexpParser.js';
|
|
4
|
+
function stripMeta(node) {
|
|
5
|
+
if (node === null || node === undefined) {
|
|
6
|
+
return node;
|
|
7
|
+
}
|
|
8
|
+
if (typeof node !== 'object') {
|
|
9
|
+
return node;
|
|
10
|
+
}
|
|
11
|
+
if (Array.isArray(node)) {
|
|
12
|
+
return node.map(element => stripMeta(element));
|
|
13
|
+
}
|
|
14
|
+
const result = {};
|
|
15
|
+
for (const [key, value] of Object.entries(node)) {
|
|
16
|
+
if (key === 'loc'
|
|
17
|
+
|| key === 'range'
|
|
18
|
+
|| key === 'start'
|
|
19
|
+
|| key === 'end'
|
|
20
|
+
|| key === 'raw'
|
|
21
|
+
|| key === 'leadingComments'
|
|
22
|
+
|| key === 'trailingComments'
|
|
23
|
+
|| key === 'comments'
|
|
24
|
+
|| key === 'innerComments') {
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
result[key] = stripMeta(value);
|
|
28
|
+
}
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
export const javascriptProgramParser = promiseCompose(createRegExpParser(/[\s\S]*/), match => {
|
|
32
|
+
const ast = acorn.parse(match[0], { ecmaVersion: 'latest', sourceType: 'script' });
|
|
33
|
+
return stripMeta(ast);
|
|
34
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { testProp } from '@fast-check/ava';
|
|
2
|
+
import { arbitraryJavascriptProgram } from './arbitraryJavascript.js';
|
|
3
|
+
import { javascriptProgramUnparser } from './javascriptUnparser.js';
|
|
4
|
+
import { javascriptProgramParser } from './javascriptParser.js';
|
|
5
|
+
import { runParser } from './parser.js';
|
|
6
|
+
import { runUnparser } from './unparser.js';
|
|
7
|
+
import { stringParserInputCompanion } from './parserInputCompanion.js';
|
|
8
|
+
import { stringUnparserOutputCompanion } from './unparserOutputCompanion.js';
|
|
9
|
+
const seed = process.env.SEED ? Number(process.env.SEED) : undefined;
|
|
10
|
+
async function collectString(asyncIterable) {
|
|
11
|
+
let result = '';
|
|
12
|
+
for await (const chunk of asyncIterable) {
|
|
13
|
+
result += chunk;
|
|
14
|
+
}
|
|
15
|
+
return result;
|
|
16
|
+
}
|
|
17
|
+
testProp('javascript roundtrip', [arbitraryJavascriptProgram], async (t, program) => {
|
|
18
|
+
const source = await collectString(runUnparser(javascriptProgramUnparser, program, stringUnparserOutputCompanion));
|
|
19
|
+
const reparsed = await runParser(javascriptProgramParser, source, stringParserInputCompanion);
|
|
20
|
+
t.deepEqual(reparsed, program);
|
|
21
|
+
}, {
|
|
22
|
+
verbose: true,
|
|
23
|
+
seed,
|
|
24
|
+
});
|
package/build/jsonParser.js
CHANGED
|
@@ -11,6 +11,7 @@ import { createParserAccessorParser } from './parserAccessorParser.js';
|
|
|
11
11
|
import { createElementParser } from './elementParser.js';
|
|
12
12
|
import { parserCreatorCompose } from './parserCreatorCompose.js';
|
|
13
13
|
import { createSeparatedArrayParser } from './separatedArrayParser.js';
|
|
14
|
+
import { createRegExpParser } from './regexpParser.js';
|
|
14
15
|
const whitespaceParser = createArrayParser(createUnionParser([
|
|
15
16
|
createExactSequenceParser(' '),
|
|
16
17
|
createExactSequenceParser('\t'),
|
|
@@ -52,18 +53,7 @@ export const jsonStringParser = promiseCompose(createTupleParser([
|
|
|
52
53
|
createExactSequenceParser('"'),
|
|
53
54
|
promiseCompose(createTerminatedArrayParser(jsonStringCharacterParser, createExactSequenceParser('"')), ([characters]) => characters.join('')),
|
|
54
55
|
]), ([, string]) => string);
|
|
55
|
-
export const jsonNumberParser =
|
|
56
|
-
parserContext.invariant((character === '-'
|
|
57
|
-
|| (character >= '0' && character <= '9')
|
|
58
|
-
|| character === '.'
|
|
59
|
-
|| character === 'e'
|
|
60
|
-
|| character === 'E'
|
|
61
|
-
|| character === '+'), 'Expected "-", "0" to "9", ".", "e", "E", "+", got "%s"', character);
|
|
62
|
-
return character;
|
|
63
|
-
})()), characters => async (parserContext) => {
|
|
64
|
-
parserContext.invariant(characters.length > 0, 'Expected at least one character');
|
|
65
|
-
return Number(characters.join(''));
|
|
66
|
-
})();
|
|
56
|
+
export const jsonNumberParser = promiseCompose(createRegExpParser(/-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/), match => Number(match[0]));
|
|
67
57
|
const jsonTrueParser = promiseCompose(createExactSequenceParser('true'), () => true);
|
|
68
58
|
setParserName(jsonTrueParser, 'jsonTrueParser');
|
|
69
59
|
const jsonFalseParser = promiseCompose(createExactSequenceParser('false'), () => false);
|
|
@@ -14,6 +14,7 @@ export declare function createLazyMessageErrorClass(BaseError: typeof NoStackCap
|
|
|
14
14
|
stack?: string;
|
|
15
15
|
cause?: unknown;
|
|
16
16
|
};
|
|
17
|
+
isError(error: unknown): error is Error;
|
|
17
18
|
captureStackTrace(targetObject: object, constructorOpt?: Function): void;
|
|
18
19
|
prepareStackTrace(err: Error, stackTraces: NodeJS.CallSite[]): any;
|
|
19
20
|
stackTraceLimit: number;
|
|
@@ -27,6 +28,7 @@ export declare const NormalLazyMessageError: {
|
|
|
27
28
|
stack?: string;
|
|
28
29
|
cause?: unknown;
|
|
29
30
|
};
|
|
31
|
+
isError(error: unknown): error is Error;
|
|
30
32
|
captureStackTrace(targetObject: object, constructorOpt?: Function): void;
|
|
31
33
|
prepareStackTrace(err: Error, stackTraces: NodeJS.CallSite[]): any;
|
|
32
34
|
stackTraceLimit: number;
|
|
@@ -40,6 +42,7 @@ export declare const NoStackCaptureOverheadLazyMessageError: {
|
|
|
40
42
|
stack?: string;
|
|
41
43
|
cause?: unknown;
|
|
42
44
|
};
|
|
45
|
+
isError(error: unknown): error is Error;
|
|
43
46
|
captureStackTrace(targetObject: object, constructorOpt?: Function): void;
|
|
44
47
|
prepareStackTrace(err: Error, stackTraces: NodeJS.CallSite[]): any;
|
|
45
48
|
stackTraceLimit: number;
|
package/build/lookaheadParser.js
CHANGED
|
@@ -1,12 +1,69 @@
|
|
|
1
|
+
var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
|
|
2
|
+
if (value !== null && value !== void 0) {
|
|
3
|
+
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
4
|
+
var dispose, inner;
|
|
5
|
+
if (async) {
|
|
6
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
7
|
+
dispose = value[Symbol.asyncDispose];
|
|
8
|
+
}
|
|
9
|
+
if (dispose === void 0) {
|
|
10
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
11
|
+
dispose = value[Symbol.dispose];
|
|
12
|
+
if (async) inner = dispose;
|
|
13
|
+
}
|
|
14
|
+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
15
|
+
if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
|
|
16
|
+
env.stack.push({ value: value, dispose: dispose, async: async });
|
|
17
|
+
}
|
|
18
|
+
else if (async) {
|
|
19
|
+
env.stack.push({ async: true });
|
|
20
|
+
}
|
|
21
|
+
return value;
|
|
22
|
+
};
|
|
23
|
+
var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
|
|
24
|
+
return function (env) {
|
|
25
|
+
function fail(e) {
|
|
26
|
+
env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
27
|
+
env.hasError = true;
|
|
28
|
+
}
|
|
29
|
+
var r, s = 0;
|
|
30
|
+
function next() {
|
|
31
|
+
while (r = env.stack.pop()) {
|
|
32
|
+
try {
|
|
33
|
+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
34
|
+
if (r.dispose) {
|
|
35
|
+
var result = r.dispose.call(r.value);
|
|
36
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
|
|
37
|
+
}
|
|
38
|
+
else s |= 1;
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
fail(e);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
45
|
+
if (env.hasError) throw env.error;
|
|
46
|
+
}
|
|
47
|
+
return next();
|
|
48
|
+
};
|
|
49
|
+
})(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
50
|
+
var e = new Error(message);
|
|
51
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
52
|
+
});
|
|
1
53
|
import { getParserName, setParserName } from './parser.js';
|
|
2
54
|
export const createLookaheadParser = (childParser) => {
|
|
3
55
|
const lookaheadParser = async (parserContext) => {
|
|
4
|
-
const
|
|
56
|
+
const env_1 = { stack: [], error: void 0, hasError: false };
|
|
5
57
|
try {
|
|
6
|
-
|
|
58
|
+
const childParserContext = __addDisposableResource(env_1, parserContext.lookahead(), false);
|
|
59
|
+
return childParser(childParserContext);
|
|
60
|
+
}
|
|
61
|
+
catch (e_1) {
|
|
62
|
+
env_1.error = e_1;
|
|
63
|
+
env_1.hasError = true;
|
|
7
64
|
}
|
|
8
65
|
finally {
|
|
9
|
-
|
|
66
|
+
__disposeResources(env_1);
|
|
10
67
|
}
|
|
11
68
|
};
|
|
12
69
|
setParserName(lookaheadParser, `(?=${getParserName(childParser)})`);
|
|
@@ -1,23 +1,82 @@
|
|
|
1
|
+
var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
|
|
2
|
+
if (value !== null && value !== void 0) {
|
|
3
|
+
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
4
|
+
var dispose, inner;
|
|
5
|
+
if (async) {
|
|
6
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
7
|
+
dispose = value[Symbol.asyncDispose];
|
|
8
|
+
}
|
|
9
|
+
if (dispose === void 0) {
|
|
10
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
11
|
+
dispose = value[Symbol.dispose];
|
|
12
|
+
if (async) inner = dispose;
|
|
13
|
+
}
|
|
14
|
+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
15
|
+
if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
|
|
16
|
+
env.stack.push({ value: value, dispose: dispose, async: async });
|
|
17
|
+
}
|
|
18
|
+
else if (async) {
|
|
19
|
+
env.stack.push({ async: true });
|
|
20
|
+
}
|
|
21
|
+
return value;
|
|
22
|
+
};
|
|
23
|
+
var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
|
|
24
|
+
return function (env) {
|
|
25
|
+
function fail(e) {
|
|
26
|
+
env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
27
|
+
env.hasError = true;
|
|
28
|
+
}
|
|
29
|
+
var r, s = 0;
|
|
30
|
+
function next() {
|
|
31
|
+
while (r = env.stack.pop()) {
|
|
32
|
+
try {
|
|
33
|
+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
34
|
+
if (r.dispose) {
|
|
35
|
+
var result = r.dispose.call(r.value);
|
|
36
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
|
|
37
|
+
}
|
|
38
|
+
else s |= 1;
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
fail(e);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
45
|
+
if (env.hasError) throw env.error;
|
|
46
|
+
}
|
|
47
|
+
return next();
|
|
48
|
+
};
|
|
49
|
+
})(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
50
|
+
var e = new Error(message);
|
|
51
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
52
|
+
});
|
|
1
53
|
import { getParserName, setParserName } from './parser.js';
|
|
2
54
|
import { isParserParsingFailedError } from './parserError.js';
|
|
3
55
|
export const createNegativeLookaheadParser = (childParser) => {
|
|
4
56
|
const negativeLookaheadParser = async (parserContext) => {
|
|
5
|
-
const
|
|
6
|
-
let childParserSuccess;
|
|
57
|
+
const env_1 = { stack: [], error: void 0, hasError: false };
|
|
7
58
|
try {
|
|
8
|
-
|
|
9
|
-
childParserSuccess
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
throw error;
|
|
59
|
+
const childParserContext = __addDisposableResource(env_1, parserContext.lookahead(), false);
|
|
60
|
+
let childParserSuccess;
|
|
61
|
+
try {
|
|
62
|
+
await childParser(childParserContext);
|
|
63
|
+
childParserSuccess = true;
|
|
14
64
|
}
|
|
15
|
-
|
|
65
|
+
catch (error) {
|
|
66
|
+
if (!isParserParsingFailedError(error)) {
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
childParserSuccess = false;
|
|
70
|
+
}
|
|
71
|
+
parserContext.invariant(!childParserSuccess, 'Negative lookahead assertion failed for child parser %s.', getParserName(childParser));
|
|
72
|
+
}
|
|
73
|
+
catch (e_1) {
|
|
74
|
+
env_1.error = e_1;
|
|
75
|
+
env_1.hasError = true;
|
|
16
76
|
}
|
|
17
77
|
finally {
|
|
18
|
-
|
|
78
|
+
__disposeResources(env_1);
|
|
19
79
|
}
|
|
20
|
-
parserContext.invariant(!childParserSuccess, 'Negative lookahead assertion failed for child parser %s.', getParserName(childParser));
|
|
21
80
|
};
|
|
22
81
|
setParserName(negativeLookaheadParser, `(?!${getParserName(childParser)})`);
|
|
23
82
|
return negativeLookaheadParser;
|
|
@@ -1,27 +1,86 @@
|
|
|
1
|
+
var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
|
|
2
|
+
if (value !== null && value !== void 0) {
|
|
3
|
+
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
4
|
+
var dispose, inner;
|
|
5
|
+
if (async) {
|
|
6
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
7
|
+
dispose = value[Symbol.asyncDispose];
|
|
8
|
+
}
|
|
9
|
+
if (dispose === void 0) {
|
|
10
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
11
|
+
dispose = value[Symbol.dispose];
|
|
12
|
+
if (async) inner = dispose;
|
|
13
|
+
}
|
|
14
|
+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
15
|
+
if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
|
|
16
|
+
env.stack.push({ value: value, dispose: dispose, async: async });
|
|
17
|
+
}
|
|
18
|
+
else if (async) {
|
|
19
|
+
env.stack.push({ async: true });
|
|
20
|
+
}
|
|
21
|
+
return value;
|
|
22
|
+
};
|
|
23
|
+
var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
|
|
24
|
+
return function (env) {
|
|
25
|
+
function fail(e) {
|
|
26
|
+
env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
27
|
+
env.hasError = true;
|
|
28
|
+
}
|
|
29
|
+
var r, s = 0;
|
|
30
|
+
function next() {
|
|
31
|
+
while (r = env.stack.pop()) {
|
|
32
|
+
try {
|
|
33
|
+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
34
|
+
if (r.dispose) {
|
|
35
|
+
var result = r.dispose.call(r.value);
|
|
36
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
|
|
37
|
+
}
|
|
38
|
+
else s |= 1;
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
fail(e);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
45
|
+
if (env.hasError) throw env.error;
|
|
46
|
+
}
|
|
47
|
+
return next();
|
|
48
|
+
};
|
|
49
|
+
})(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
50
|
+
var e = new Error(message);
|
|
51
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
52
|
+
});
|
|
1
53
|
import { getParserName, setParserName } from './parser.js';
|
|
2
54
|
import { isParserParsingFailedError } from './parserError.js';
|
|
3
55
|
export const createNonEmptyArrayParser = (elementParser) => {
|
|
4
56
|
const nonEmptyArrayParser = async (parserContext) => {
|
|
5
57
|
const elements = [];
|
|
6
58
|
while (true) {
|
|
7
|
-
const
|
|
8
|
-
const initialPosition = elementParserContext.position;
|
|
59
|
+
const env_1 = { stack: [], error: void 0, hasError: false };
|
|
9
60
|
try {
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
61
|
+
const elementParserContext = __addDisposableResource(env_1, parserContext.lookahead(), false);
|
|
62
|
+
const initialPosition = elementParserContext.position;
|
|
63
|
+
try {
|
|
64
|
+
const element = await elementParser(elementParserContext);
|
|
65
|
+
if (elementParserContext.position === initialPosition) {
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
elements.push(element);
|
|
69
|
+
elementParserContext.unlookahead();
|
|
13
70
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
break;
|
|
71
|
+
catch (error) {
|
|
72
|
+
if (isParserParsingFailedError(error)) {
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
throw error;
|
|
20
76
|
}
|
|
21
|
-
|
|
77
|
+
}
|
|
78
|
+
catch (e_1) {
|
|
79
|
+
env_1.error = e_1;
|
|
80
|
+
env_1.hasError = true;
|
|
22
81
|
}
|
|
23
82
|
finally {
|
|
24
|
-
|
|
83
|
+
__disposeResources(env_1);
|
|
25
84
|
}
|
|
26
85
|
}
|
|
27
86
|
parserContext.invariant(elements.length > 0, 'Expected elementParser (%s) to match at least once', getParserName(elementParser, 'anonymousNonEmptyArrayChild'));
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type Parser, type ParserOutput, type ParserSequence } from './parser.js';
|
|
2
|
+
type ExtractParsers<T> = T[keyof T] & Parser<any, any, any>;
|
|
3
|
+
type InferSequenceFromParsers<T> = ParserSequence<ExtractParsers<T>>;
|
|
4
|
+
type ExtractOutputOrLiteral<P> = P extends Parser<any, any, any> ? ParserOutput<P> : P;
|
|
5
|
+
type OmitUnderscoreKeys<T> = {
|
|
6
|
+
[K in keyof T as K extends `_${string}` ? never : K]: T[K];
|
|
7
|
+
};
|
|
8
|
+
type ObjectParserOutput<Parsers extends Record<string, unknown>> = OmitUnderscoreKeys<{
|
|
9
|
+
[K in keyof Parsers]: ExtractOutputOrLiteral<Parsers[K]>;
|
|
10
|
+
}>;
|
|
11
|
+
export declare function createObjectParser<const Parsers extends Record<string, Parser<any, any, any> | unknown>>(parsers: Parsers): Parser<ObjectParserOutput<Parsers>, InferSequenceFromParsers<Parsers>>;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { getParserName, setParserName } from './parser.js';
|
|
2
|
+
export function createObjectParser(parsers) {
|
|
3
|
+
const objectParser = async (parserContext) => {
|
|
4
|
+
const result = {};
|
|
5
|
+
for (const [key, parserOrLiteral] of Object.entries(parsers)) {
|
|
6
|
+
let value;
|
|
7
|
+
if (typeof parserOrLiteral === 'function') {
|
|
8
|
+
// It's a parser - execute it
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
10
|
+
value = await parserOrLiteral(parserContext);
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
// It's a literal - use directly
|
|
14
|
+
value = parserOrLiteral;
|
|
15
|
+
}
|
|
16
|
+
if (!key.startsWith('_')) {
|
|
17
|
+
result[key] = value;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return result;
|
|
21
|
+
};
|
|
22
|
+
setParserName(objectParser, '{' + Object.keys(parsers).map(k => {
|
|
23
|
+
const v = parsers[k];
|
|
24
|
+
if (typeof v === 'function') {
|
|
25
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
26
|
+
return k.startsWith('_') ? k : getParserName(v, k);
|
|
27
|
+
}
|
|
28
|
+
return `${k}: ${JSON.stringify(v)}`;
|
|
29
|
+
}).join(', ') + '}');
|
|
30
|
+
return objectParser;
|
|
31
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { expectAssignable, expectNotAssignable, expectType } from 'tsd';
|
|
2
|
+
import { createObjectParser } from './objectParser.js';
|
|
3
|
+
import { createExactSequenceParser } from './exactSequenceParser.js';
|
|
4
|
+
import { createFixedLengthSequenceParser } from './fixedLengthSequenceParser.js';
|
|
5
|
+
// Test: parsers only - extracts output types
|
|
6
|
+
{
|
|
7
|
+
const parser = createObjectParser({
|
|
8
|
+
first: createFixedLengthSequenceParser(3),
|
|
9
|
+
second: createFixedLengthSequenceParser(3),
|
|
10
|
+
});
|
|
11
|
+
// Output should be assignable to and from expected type
|
|
12
|
+
expectAssignable(null);
|
|
13
|
+
expectAssignable(null);
|
|
14
|
+
}
|
|
15
|
+
// Test: literal types are preserved
|
|
16
|
+
{
|
|
17
|
+
const parser = createObjectParser({
|
|
18
|
+
type: 'block',
|
|
19
|
+
name: createFixedLengthSequenceParser(3),
|
|
20
|
+
});
|
|
21
|
+
// 'block' literal should be preserved
|
|
22
|
+
expectAssignable(null);
|
|
23
|
+
expectType(null);
|
|
24
|
+
}
|
|
25
|
+
// Test: underscore keys excluded from result type
|
|
26
|
+
{
|
|
27
|
+
const parser = createObjectParser({
|
|
28
|
+
first: createFixedLengthSequenceParser(3),
|
|
29
|
+
_sep: createExactSequenceParser(':'),
|
|
30
|
+
second: createFixedLengthSequenceParser(3),
|
|
31
|
+
});
|
|
32
|
+
// Should have first and second but not _sep
|
|
33
|
+
expectAssignable(null);
|
|
34
|
+
// _sep should NOT be a key in Output
|
|
35
|
+
expectNotAssignable(null);
|
|
36
|
+
}
|
|
37
|
+
// Test: mixed literals and parsers with underscore keys
|
|
38
|
+
{
|
|
39
|
+
const parser = createObjectParser({
|
|
40
|
+
type: 'assignment',
|
|
41
|
+
_open: createExactSequenceParser('('),
|
|
42
|
+
name: createFixedLengthSequenceParser(1),
|
|
43
|
+
_eq: createExactSequenceParser('='),
|
|
44
|
+
value: createFixedLengthSequenceParser(1),
|
|
45
|
+
_close: createExactSequenceParser(')'),
|
|
46
|
+
});
|
|
47
|
+
expectAssignable(null);
|
|
48
|
+
expectType(null);
|
|
49
|
+
// Underscore keys should not exist
|
|
50
|
+
expectNotAssignable(null);
|
|
51
|
+
expectNotAssignable(null);
|
|
52
|
+
expectNotAssignable(null);
|
|
53
|
+
}
|
|
54
|
+
// Test: number literal
|
|
55
|
+
{
|
|
56
|
+
const parser = createObjectParser({
|
|
57
|
+
code: 42,
|
|
58
|
+
data: createFixedLengthSequenceParser(2),
|
|
59
|
+
});
|
|
60
|
+
expectAssignable(null);
|
|
61
|
+
expectType(null);
|
|
62
|
+
}
|
|
63
|
+
// Test: all underscore keys results in empty object
|
|
64
|
+
{
|
|
65
|
+
const parser = createObjectParser({
|
|
66
|
+
_a: createExactSequenceParser('a'),
|
|
67
|
+
_b: createExactSequenceParser('b'),
|
|
68
|
+
});
|
|
69
|
+
// Should be assignable to empty object
|
|
70
|
+
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
71
|
+
expectAssignable(null);
|
|
72
|
+
// Should NOT have _a or _b
|
|
73
|
+
expectNotAssignable(null);
|
|
74
|
+
expectNotAssignable(null);
|
|
75
|
+
}
|
|
76
|
+
// Test: boolean literal
|
|
77
|
+
{
|
|
78
|
+
const parser = createObjectParser({
|
|
79
|
+
enabled: true,
|
|
80
|
+
name: createFixedLengthSequenceParser(3),
|
|
81
|
+
});
|
|
82
|
+
expectAssignable(null);
|
|
83
|
+
expectType(null);
|
|
84
|
+
}
|
|
85
|
+
// Test: null literal
|
|
86
|
+
{
|
|
87
|
+
const parser = createObjectParser({
|
|
88
|
+
value: null,
|
|
89
|
+
name: createFixedLengthSequenceParser(3),
|
|
90
|
+
});
|
|
91
|
+
expectAssignable(null);
|
|
92
|
+
expectType(null);
|
|
93
|
+
}
|
|
94
|
+
// Test: underscore-prefixed parsers still contribute to sequence type inference
|
|
95
|
+
{
|
|
96
|
+
const parser = createObjectParser({
|
|
97
|
+
_prefix: createExactSequenceParser(Buffer.from([0x00])),
|
|
98
|
+
operation: 'nop',
|
|
99
|
+
});
|
|
100
|
+
// Parser should be assignable to Parser<{ operation: 'nop' }, Uint8Array>
|
|
101
|
+
expectAssignable(parser);
|
|
102
|
+
}
|
|
103
|
+
// Test: sequence type inferred from underscore parser when no other parsers present
|
|
104
|
+
{
|
|
105
|
+
const parser = createObjectParser({
|
|
106
|
+
_marker: createExactSequenceParser('test'),
|
|
107
|
+
type: 'marker',
|
|
108
|
+
value: 42,
|
|
109
|
+
});
|
|
110
|
+
// Should infer string sequence from _marker parser
|
|
111
|
+
expectAssignable(parser);
|
|
112
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|