@futpib/parser 1.0.0
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/.editorconfig +12 -0
- package/.gitattributes +2 -0
- package/.github/workflows/main.yml +29 -0
- package/.yarn/releases/yarn-4.5.3.cjs +934 -0
- package/.yarnrc.yml +7 -0
- package/build/allSettledStream.d.ts +17 -0
- package/build/allSettledStream.js +21 -0
- package/build/allSettledStream.test.d.ts +1 -0
- package/build/allSettledStream.test.js +56 -0
- package/build/apk.d.ts +13 -0
- package/build/apk.js +1 -0
- package/build/apkParser.d.ts +3 -0
- package/build/apkParser.js +135 -0
- package/build/apkParser.test.d.ts +1 -0
- package/build/apkParser.test.js +22 -0
- package/build/arbitrarilySlicedAsyncInterable.d.ts +2 -0
- package/build/arbitrarilySlicedAsyncInterable.js +46 -0
- package/build/arbitrarilySlicedAsyncInterator.d.ts +2 -0
- package/build/arbitrarilySlicedAsyncInterator.js +17 -0
- package/build/arbitraryDosDate.d.ts +2 -0
- package/build/arbitraryDosDate.js +8 -0
- package/build/arbitraryDosDateTime.d.ts +2 -0
- package/build/arbitraryDosDateTime.js +9 -0
- package/build/arbitraryDosPermissions.d.ts +1 -0
- package/build/arbitraryDosPermissions.js +1 -0
- package/build/arbitraryFileSystemEntry.d.ts +14 -0
- package/build/arbitraryFileSystemEntry.js +12 -0
- package/build/arbitraryZip.d.ts +6 -0
- package/build/arbitraryZip.js +88 -0
- package/build/arbitraryZipEntry.d.ts +3 -0
- package/build/arbitraryZipEntry.js +26 -0
- package/build/arbitraryZipPermissions.d.ts +8 -0
- package/build/arbitraryZipPermissions.js +16 -0
- package/build/arbitraryZipStream.d.ts +5 -0
- package/build/arbitraryZipStream.js +50 -0
- package/build/arrayParser.d.ts +2 -0
- package/build/arrayParser.js +30 -0
- package/build/arrayParser.test.d.ts +1 -0
- package/build/arrayParser.test.js +9 -0
- package/build/bsonParser.d.ts +3 -0
- package/build/bsonParser.js +70 -0
- package/build/bsonParser.test.d.ts +1 -0
- package/build/bsonParser.test.js +24 -0
- package/build/createDisjunctionParser.d.ts +2 -0
- package/build/createDisjunctionParser.js +47 -0
- package/build/createExactParser.d.ts +2 -0
- package/build/createExactParser.js +12 -0
- package/build/createSequentialUnionParser.d.ts +2 -0
- package/build/createSequentialUnionParser.js +69 -0
- package/build/debugLogParser.d.ts +2 -0
- package/build/debugLogParser.js +23 -0
- package/build/disjunctionParser.d.ts +2 -0
- package/build/disjunctionParser.js +35 -0
- package/build/elementParser.d.ts +3 -0
- package/build/elementParser.js +1 -0
- package/build/endOfInputParser.d.ts +4 -0
- package/build/endOfInputParser.js +4 -0
- package/build/exactElementParser.d.ts +3 -0
- package/build/exactElementParser.js +6 -0
- package/build/exactSequenceParser.d.ts +2 -0
- package/build/exactSequenceParser.js +15 -0
- package/build/fixedLengthChunkParser.d.ts +2 -0
- package/build/fixedLengthChunkParser.js +12 -0
- package/build/fixedLengthParser.d.ts +2 -0
- package/build/fixedLengthParser.js +12 -0
- package/build/fixedLengthSequenceParser.d.ts +2 -0
- package/build/fixedLengthSequenceParser.js +16 -0
- package/build/index.d.ts +18 -0
- package/build/index.js +17 -0
- package/build/index.test.d.ts +1 -0
- package/build/index.test.js +2 -0
- package/build/inputChunkBuffer.d.ts +15 -0
- package/build/inputChunkBuffer.js +40 -0
- package/build/inputChunkBuffer.test.d.ts +1 -0
- package/build/inputChunkBuffer.test.js +34 -0
- package/build/inputCompanion.d.ts +18 -0
- package/build/inputCompanion.js +28 -0
- package/build/inputReader.d.ts +22 -0
- package/build/inputReader.js +105 -0
- package/build/inputReader.test.d.ts +1 -0
- package/build/inputReader.test.js +174 -0
- package/build/invariantDefined.d.ts +1 -0
- package/build/invariantDefined.js +5 -0
- package/build/invariantIdentity.d.ts +3 -0
- package/build/invariantIdentity.js +5 -0
- package/build/jsonParser.d.ts +3 -0
- package/build/jsonParser.js +133 -0
- package/build/jsonParser.test.d.ts +1 -0
- package/build/jsonParser.test.js +17 -0
- package/build/jsonParser2.d.ts +3 -0
- package/build/jsonParser2.js +52 -0
- package/build/jsonParser2.test.d.ts +1 -0
- package/build/jsonParser2.test.js +22 -0
- package/build/listParser.d.ts +2 -0
- package/build/listParser.js +34 -0
- package/build/negativeLookahead.d.ts +2 -0
- package/build/negativeLookahead.js +20 -0
- package/build/optionalParser.d.ts +2 -0
- package/build/optionalParser.js +23 -0
- package/build/parser.d.ts +10 -0
- package/build/parser.js +53 -0
- package/build/parser.test.d.ts +1 -0
- package/build/parser.test.js +126 -0
- package/build/parserAccessorParser.d.ts +2 -0
- package/build/parserAccessorParser.js +1 -0
- package/build/parserCompose.d.ts +3 -0
- package/build/parserCompose.js +7 -0
- package/build/parserContext.d.ts +48 -0
- package/build/parserContext.js +193 -0
- package/build/parserContext.test.d.ts +1 -0
- package/build/parserContext.test.js +115 -0
- package/build/parserCreatorCompose.d.ts +3 -0
- package/build/parserCreatorCompose.js +10 -0
- package/build/parserError.d.ts +43 -0
- package/build/parserError.js +61 -0
- package/build/parserImplementationInvariant.d.ts +2 -0
- package/build/parserImplementationInvariant.js +5 -0
- package/build/parserImplementationInvariantInvariant.d.ts +3 -0
- package/build/parserImplementationInvariantInvariant.js +15 -0
- package/build/parserInvariant.d.ts +4 -0
- package/build/parserInvariant.js +11 -0
- package/build/parserParsingInvariant.d.ts +1 -0
- package/build/parserParsingInvariant.js +1 -0
- package/build/promiseCompose.d.ts +1 -0
- package/build/promiseCompose.js +3 -0
- package/build/promiseFish.d.ts +1 -0
- package/build/promiseFish.js +3 -0
- package/build/sequence.d.ts +1 -0
- package/build/sequence.js +1 -0
- package/build/sequenceBuffer.d.ts +15 -0
- package/build/sequenceBuffer.js +40 -0
- package/build/sequenceBuffer.test.d.ts +1 -0
- package/build/sequenceBuffer.test.js +34 -0
- package/build/sequenceParser.d.ts +3 -0
- package/build/sequenceParser.js +10 -0
- package/build/skipParser.d.ts +2 -0
- package/build/skipParser.js +8 -0
- package/build/sliceBoundedParser.d.ts +2 -0
- package/build/sliceBoundedParser.js +24 -0
- package/build/sliceBoundedParser.test.d.ts +1 -0
- package/build/sliceBoundedParser.test.js +24 -0
- package/build/terminatedArrayParser.d.ts +2 -0
- package/build/terminatedArrayParser.js +27 -0
- package/build/terminatedSequenceParser.d.ts +2 -0
- package/build/terminatedSequenceParser.js +24 -0
- package/build/tupleParser.d.ts +11 -0
- package/build/tupleParser.js +17 -0
- package/build/unionParser.d.ts +2 -0
- package/build/unionParser.js +68 -0
- package/build/zip.d.ts +31 -0
- package/build/zip.js +1 -0
- package/build/zipEntry.d.ts +28 -0
- package/build/zipEntry.js +1 -0
- package/build/zipFile.d.ts +32 -0
- package/build/zipFile.js +1 -0
- package/build/zipFileEntry.d.ts +6 -0
- package/build/zipFileEntry.js +1 -0
- package/build/zipParser.d.ts +70 -0
- package/build/zipParser.js +255 -0
- package/build/zipParser.test.d.ts +1 -0
- package/build/zipParser.test.js +22 -0
- package/package.json +52 -0
- package/readme.md +17 -0
- package/renovate.json +6 -0
- package/src/allSettledStream.test.ts +59 -0
- package/src/allSettledStream.test.ts.md +52 -0
- package/src/allSettledStream.test.ts.snap +0 -0
- package/src/allSettledStream.ts +44 -0
- package/src/apk.ts +16 -0
- package/src/apkParser.test.ts +30 -0
- package/src/apkParser.test.ts.md +268 -0
- package/src/apkParser.test.ts.snap +0 -0
- package/src/apkParser.ts +327 -0
- package/src/arbitrarilySlicedAsyncInterable.ts +73 -0
- package/src/arbitrarilySlicedAsyncInterator.ts +25 -0
- package/src/arbitraryDosDateTime.ts +10 -0
- package/src/arbitraryFileSystemEntry.ts +36 -0
- package/src/arbitraryZip.ts +132 -0
- package/src/arbitraryZipPermissions.ts +25 -0
- package/src/arbitraryZipStream.ts +60 -0
- package/src/arrayParser.test.ts +11 -0
- package/src/arrayParser.ts +35 -0
- package/src/bsonParser.test.ts +37 -0
- package/src/bsonParser.ts +131 -0
- package/src/debugLogParser.ts +51 -0
- package/src/disjunctionParser.ts +55 -0
- package/src/elementParser.ts +4 -0
- package/src/endOfInputParser.ts +11 -0
- package/src/exactElementParser.ts +20 -0
- package/src/exactSequenceParser.ts +27 -0
- package/src/fixedLengthSequenceParser.ts +24 -0
- package/src/index.test.ts +3 -0
- package/src/index.ts +76 -0
- package/src/inputCompanion.ts +43 -0
- package/src/inputReader.test.ts +238 -0
- package/src/inputReader.ts +159 -0
- package/src/invariantDefined.ts +6 -0
- package/src/invariantIdentity.ts +8 -0
- package/src/jsonParser.test.ts +26 -0
- package/src/jsonParser.ts +225 -0
- package/src/listParser.ts +52 -0
- package/src/negativeLookahead.ts +26 -0
- package/src/optionalParser.ts +27 -0
- package/src/parser.test.ts +176 -0
- package/src/parser.test.ts.md +68 -0
- package/src/parser.test.ts.snap +0 -0
- package/src/parser.ts +103 -0
- package/src/parserAccessorParser.ts +3 -0
- package/src/parserContext.test.ts +154 -0
- package/src/parserContext.ts +316 -0
- package/src/parserCreatorCompose.ts +23 -0
- package/src/parserError.ts +85 -0
- package/src/parserImplementationInvariant.ts +6 -0
- package/src/parserInvariant.ts +26 -0
- package/src/promiseCompose.ts +7 -0
- package/src/sequence.ts +10 -0
- package/src/sequenceBuffer.test.ts +50 -0
- package/src/sequenceBuffer.ts +58 -0
- package/src/skipParser.ts +12 -0
- package/src/sliceBoundedParser.test.ts +28 -0
- package/src/sliceBoundedParser.ts +30 -0
- package/src/terminatedArrayParser.ts +40 -0
- package/src/tupleParser.ts +33 -0
- package/src/unionParser.ts +104 -0
- package/src/zip.ts +48 -0
- package/src/zipParser.test.ts +31 -0
- package/src/zipParser.ts +501 -0
- package/tsconfig.json +109 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export class ParserError extends Error {
|
|
2
|
+
name = 'ParserError';
|
|
3
|
+
}
|
|
4
|
+
export class ParserImplementationError extends ParserError {
|
|
5
|
+
name = 'ParserImplementationError';
|
|
6
|
+
}
|
|
7
|
+
export class ParserImplementationInvariantError extends ParserImplementationError {
|
|
8
|
+
name = 'ParserImplementationInvariantError';
|
|
9
|
+
}
|
|
10
|
+
export class ParserParsingFailedError extends ParserError {
|
|
11
|
+
depth;
|
|
12
|
+
position;
|
|
13
|
+
name = 'ParserParsingFailedError';
|
|
14
|
+
constructor(message, depth, position) {
|
|
15
|
+
super([
|
|
16
|
+
'(position: ',
|
|
17
|
+
position,
|
|
18
|
+
') ',
|
|
19
|
+
message,
|
|
20
|
+
].join(''));
|
|
21
|
+
this.depth = depth;
|
|
22
|
+
this.position = position;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export class ParserParsingJoinError extends ParserParsingFailedError {
|
|
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;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export class ParserParsingJoinDeepestError extends ParserParsingJoinError {
|
|
41
|
+
childErrors;
|
|
42
|
+
name = 'ParserParsingJoinDeepestError';
|
|
43
|
+
constructor(message, depth, position, childErrors) {
|
|
44
|
+
super(message, depth, position);
|
|
45
|
+
this.childErrors = childErrors;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export class ParserParsingJoinFurthestError extends ParserParsingJoinError {
|
|
49
|
+
childErrors;
|
|
50
|
+
name = 'ParserParsingJoinFurthestError';
|
|
51
|
+
constructor(message, depth, position, childErrors) {
|
|
52
|
+
super(message, depth, position);
|
|
53
|
+
this.childErrors = childErrors;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export class ParserParsingInvariantError extends ParserParsingFailedError {
|
|
57
|
+
name = 'ParserParsingInvariantError';
|
|
58
|
+
}
|
|
59
|
+
export class ParserUnexpectedEndOfInputError extends ParserParsingFailedError {
|
|
60
|
+
name = 'ParserUnexpectedEndOfInputError';
|
|
61
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { ParserImplementationInvariantError } from './parserError.js';
|
|
2
|
+
import { parserInvariant } from './parserInvariant.js';
|
|
3
|
+
export function parserImplementationInvariant(value, format, ...formatArguments) {
|
|
4
|
+
return parserInvariant(ParserImplementationInvariantError, value, format, ...formatArguments);
|
|
5
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import invariant from 'invariant';
|
|
2
|
+
import { ParserImplementationInvariantError } from './parserError.js';
|
|
3
|
+
export function parserImplementationInvariant(value, formatOrFormatLines, ...extra) {
|
|
4
|
+
const format = Array.isArray(formatOrFormatLines) ? formatOrFormatLines.join('\n') : formatOrFormatLines;
|
|
5
|
+
try {
|
|
6
|
+
invariant(value, format, ...extra);
|
|
7
|
+
return value;
|
|
8
|
+
}
|
|
9
|
+
catch (error) {
|
|
10
|
+
if (error instanceof Error) {
|
|
11
|
+
throw new ParserImplementationInvariantError(error.message);
|
|
12
|
+
}
|
|
13
|
+
throw error;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type Constructor } from 'type-fest';
|
|
2
|
+
export type Falsy = '' | 0 | false | undefined;
|
|
3
|
+
export type ValueOrAccessor<T> = T | (() => T);
|
|
4
|
+
export declare function parserInvariant<T>(ErrorConstructor: Constructor<Error, [message: string]> | ((message: string) => Error), value: T, formatOrFormatLines: ValueOrAccessor<string | string[]>, ...formatArguments: any[]): Exclude<T, Falsy>;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export function parserInvariant(ErrorConstructor, value, formatOrFormatLines, ...formatArguments) {
|
|
2
|
+
if (value) {
|
|
3
|
+
return value;
|
|
4
|
+
}
|
|
5
|
+
let format = typeof formatOrFormatLines === 'function' ? formatOrFormatLines() : formatOrFormatLines;
|
|
6
|
+
format = Array.isArray(format) ? format.join('\n') : format;
|
|
7
|
+
throw new ErrorConstructor(format.replaceAll('%s', () => {
|
|
8
|
+
const argumentOrAccessor = formatArguments.shift();
|
|
9
|
+
return typeof argumentOrAccessor === 'function' ? argumentOrAccessor() : argumentOrAccessor;
|
|
10
|
+
}));
|
|
11
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function promiseCompose<A, B, C>(f1: (a: A) => Promise<B>, f2: (b: B) => C | Promise<C>): (a: A) => Promise<C>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function promiseCompose<A, B, C>(f1: (a: A) => Promise<B>, f2: (b: B) => Promise<C>): (a: A) => Promise<C>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type DeriveSequenceElement<Sequence> = (Sequence extends string ? string : (Sequence extends Uint8Array ? number : never));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type InputCompanion } from './inputCompanion.js';
|
|
2
|
+
export type SequenceBuffer<Sequence, Element> = {
|
|
3
|
+
push(sequence: Sequence): void;
|
|
4
|
+
peek(offset: number): Element | undefined;
|
|
5
|
+
skip(offset: number): void;
|
|
6
|
+
};
|
|
7
|
+
export declare class SequenceBufferImplementation<Sequence, Element> implements SequenceBuffer<Sequence, Element> {
|
|
8
|
+
private readonly _inputCompanion;
|
|
9
|
+
private readonly _sequences;
|
|
10
|
+
private _indexInFirstSequence;
|
|
11
|
+
constructor(_inputCompanion: InputCompanion<Sequence, Element>);
|
|
12
|
+
push(sequence: Sequence): void;
|
|
13
|
+
peek(offset: number): Element | undefined;
|
|
14
|
+
skip(offset: number): void;
|
|
15
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import invariant from 'invariant';
|
|
2
|
+
export class SequenceBufferImplementation {
|
|
3
|
+
_inputCompanion;
|
|
4
|
+
_sequences = [];
|
|
5
|
+
_indexInFirstSequence = 0;
|
|
6
|
+
constructor(_inputCompanion) {
|
|
7
|
+
this._inputCompanion = _inputCompanion;
|
|
8
|
+
}
|
|
9
|
+
push(sequence) {
|
|
10
|
+
this._sequences.push(sequence);
|
|
11
|
+
while (this._sequences.length > 0) {
|
|
12
|
+
const firstSequence = this._sequences[0];
|
|
13
|
+
const firstSequenceLength = this._inputCompanion.length(firstSequence);
|
|
14
|
+
if (firstSequenceLength === 0) {
|
|
15
|
+
this._sequences.shift();
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
if (this._indexInFirstSequence < firstSequenceLength) {
|
|
19
|
+
break;
|
|
20
|
+
}
|
|
21
|
+
this._sequences.shift();
|
|
22
|
+
this._indexInFirstSequence -= firstSequenceLength;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
peek(offset) {
|
|
26
|
+
invariant(offset >= 0, 'Offset must be non-negative.');
|
|
27
|
+
let index = this._indexInFirstSequence + offset;
|
|
28
|
+
for (const sequence of this._sequences) {
|
|
29
|
+
const sequenceLength = this._inputCompanion.length(sequence);
|
|
30
|
+
if (index < sequenceLength) {
|
|
31
|
+
return this._inputCompanion.at(sequence, index);
|
|
32
|
+
}
|
|
33
|
+
index -= sequenceLength;
|
|
34
|
+
}
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
skip(offset) {
|
|
38
|
+
this._indexInFirstSequence += offset;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import { SequenceBufferImplementation } from './sequenceBuffer.js';
|
|
3
|
+
import { stringInputCompanion } from './inputCompanion.js';
|
|
4
|
+
test('sequenceBuffer', t => {
|
|
5
|
+
const sequenceBuffer = new SequenceBufferImplementation(stringInputCompanion);
|
|
6
|
+
t.is(sequenceBuffer.peek(0), undefined);
|
|
7
|
+
sequenceBuffer.push('');
|
|
8
|
+
t.is(sequenceBuffer.peek(0), undefined);
|
|
9
|
+
sequenceBuffer.push('abc');
|
|
10
|
+
t.is(sequenceBuffer.peek(0), 'a');
|
|
11
|
+
t.is(sequenceBuffer.peek(1), 'b');
|
|
12
|
+
t.is(sequenceBuffer.peek(2), 'c');
|
|
13
|
+
t.is(sequenceBuffer.peek(3), undefined);
|
|
14
|
+
sequenceBuffer.push('def');
|
|
15
|
+
t.is(sequenceBuffer.peek(0), 'a');
|
|
16
|
+
t.is(sequenceBuffer.peek(3), 'd');
|
|
17
|
+
t.is(sequenceBuffer.peek(6), undefined);
|
|
18
|
+
sequenceBuffer.push('');
|
|
19
|
+
t.is(sequenceBuffer.peek(0), 'a');
|
|
20
|
+
t.is(sequenceBuffer.peek(3), 'd');
|
|
21
|
+
t.is(sequenceBuffer.peek(6), undefined);
|
|
22
|
+
sequenceBuffer.skip(1);
|
|
23
|
+
t.is(sequenceBuffer.peek(0), 'b');
|
|
24
|
+
t.is(sequenceBuffer.peek(3), 'e');
|
|
25
|
+
t.is(sequenceBuffer.peek(5), undefined);
|
|
26
|
+
sequenceBuffer.skip(3);
|
|
27
|
+
t.is(sequenceBuffer.peek(0), 'e');
|
|
28
|
+
t.is(sequenceBuffer.peek(2), undefined);
|
|
29
|
+
sequenceBuffer.push('gh');
|
|
30
|
+
t.is(sequenceBuffer.peek(0), 'e');
|
|
31
|
+
t.is(sequenceBuffer.peek(2), 'g');
|
|
32
|
+
t.is(sequenceBuffer.peek(3), 'h');
|
|
33
|
+
t.is(sequenceBuffer.peek(4), undefined);
|
|
34
|
+
});
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { type Parser } from './parser.js';
|
|
2
|
+
export declare function createTupleParser<A, B, Sequence>([parserA, parserB]: [Parser<A, Sequence>, Parser<B, Sequence>]): Parser<[A, B], Sequence>;
|
|
3
|
+
export declare function createTupleParser<A, B, C, Sequence>([parserA, parserB, parserC]: [Parser<A, Sequence>, Parser<B, Sequence>, Parser<C, Sequence>]): Parser<[A, B, C], Sequence>;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { parserImplementationInvariant } from './parserImplementationInvariant.js';
|
|
2
|
+
export const createSkipParser = (length) => {
|
|
3
|
+
parserImplementationInvariant(length > 0, 'Length must be positive.');
|
|
4
|
+
return async (parserContext) => {
|
|
5
|
+
parserContext.skip(length);
|
|
6
|
+
return undefined;
|
|
7
|
+
};
|
|
8
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { getParserName, setParserName } from "./parser.js";
|
|
2
|
+
export const createSliceBoundedParser = (childParser, sliceEnd) => {
|
|
3
|
+
const sliceBoundedParser = async (parserContext) => {
|
|
4
|
+
const childParserContext = parserContext.lookahead({
|
|
5
|
+
sliceEnd: parserContext.position + sliceEnd,
|
|
6
|
+
});
|
|
7
|
+
try {
|
|
8
|
+
const value = await childParser(childParserContext);
|
|
9
|
+
childParserContext.unlookahead();
|
|
10
|
+
return value;
|
|
11
|
+
}
|
|
12
|
+
finally {
|
|
13
|
+
childParserContext.dispose();
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
setParserName(sliceBoundedParser, [
|
|
17
|
+
'sliceBounded(',
|
|
18
|
+
getParserName(childParser, 'anonymousSliceBoundedChild'),
|
|
19
|
+
',',
|
|
20
|
+
sliceEnd,
|
|
21
|
+
')',
|
|
22
|
+
].join(''));
|
|
23
|
+
return sliceBoundedParser;
|
|
24
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import { createArrayParser } from './arrayParser.js';
|
|
3
|
+
import { createElementParser } from './elementParser.js';
|
|
4
|
+
import { createTupleParser } from './tupleParser.js';
|
|
5
|
+
import { createSliceBoundedParser } from './sliceBoundedParser.js';
|
|
6
|
+
import { runParser } from './parser.js';
|
|
7
|
+
import { stringInputCompanion } from './inputCompanion.js';
|
|
8
|
+
const anythingParser = createArrayParser(createElementParser());
|
|
9
|
+
test('sliceBoundedParser', async (t) => {
|
|
10
|
+
const parser = createTupleParser([
|
|
11
|
+
createElementParser(),
|
|
12
|
+
createSliceBoundedParser(anythingParser, 2),
|
|
13
|
+
createElementParser(),
|
|
14
|
+
]);
|
|
15
|
+
const result = await runParser(parser, 'abba', stringInputCompanion);
|
|
16
|
+
t.deepEqual(result, [
|
|
17
|
+
'a',
|
|
18
|
+
[
|
|
19
|
+
'b',
|
|
20
|
+
'b',
|
|
21
|
+
],
|
|
22
|
+
'a',
|
|
23
|
+
]);
|
|
24
|
+
});
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { Parser } from "./parser.js";
|
|
2
|
+
export declare const createTerminatedArrayParser: <ElementOutput, TerminatorOutput, Sequence>(elementParser: Parser<ElementOutput, Sequence>, terminatorParser: Parser<unknown, Sequence>) => Parser<[ElementOutput[], TerminatorOutput], Sequence>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { getParserName, setParserName } from "./parser.js";
|
|
2
|
+
import { promiseCompose } from "./promiseCompose.js";
|
|
3
|
+
import { createUnionParser } from "./unionParser.js";
|
|
4
|
+
class Terminated {
|
|
5
|
+
value;
|
|
6
|
+
constructor(value) {
|
|
7
|
+
this.value = value;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export const createTerminatedArrayParser = (elementParser, terminatorParser) => {
|
|
11
|
+
const wrappedTerminatorParser = promiseCompose(terminatorParser, terminatorValue => new Terminated(terminatorValue));
|
|
12
|
+
setParserName(wrappedTerminatorParser, getParserName(terminatorParser, 'anonymousTerminator'));
|
|
13
|
+
const elementOrTerminatorParser = createUnionParser([
|
|
14
|
+
elementParser,
|
|
15
|
+
promiseCompose(terminatorParser, terminatorValue => new Terminated(terminatorValue)),
|
|
16
|
+
]);
|
|
17
|
+
return async (parserContext) => {
|
|
18
|
+
const elements = [];
|
|
19
|
+
while (true) {
|
|
20
|
+
const elementOrTerminator = await elementOrTerminatorParser(parserContext);
|
|
21
|
+
if (elementOrTerminator instanceof Terminated) {
|
|
22
|
+
return [elements, elementOrTerminator.value];
|
|
23
|
+
}
|
|
24
|
+
elements.push(elementOrTerminator);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { Parser } from "./parser.js";
|
|
2
|
+
export declare const createTerminatedArrayParser: <ElementOutput, TerminatorOutput, Sequence>(elementParser: Parser<ElementOutput, Sequence>, terminatorParser: Parser<unknown, Sequence>) => Parser<[ElementOutput[], TerminatorOutput], Sequence>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { promiseCompose } from "./promiseCompose.js";
|
|
2
|
+
import { createUnionParser } from "./unionParser.js";
|
|
3
|
+
class Terminated {
|
|
4
|
+
value;
|
|
5
|
+
constructor(value) {
|
|
6
|
+
this.value = value;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export const createTerminatedArrayParser = (elementParser, terminatorParser) => {
|
|
10
|
+
const elementOrTerminatorParser = createUnionParser([
|
|
11
|
+
elementParser,
|
|
12
|
+
promiseCompose(terminatorParser, terminatorValue => new Terminated(terminatorValue)),
|
|
13
|
+
]);
|
|
14
|
+
return async (parserContext) => {
|
|
15
|
+
const elements = [];
|
|
16
|
+
while (true) {
|
|
17
|
+
const elementOrTerminator = await elementOrTerminatorParser(parserContext);
|
|
18
|
+
if (elementOrTerminator instanceof Terminated) {
|
|
19
|
+
return [elements, elementOrTerminator.value];
|
|
20
|
+
}
|
|
21
|
+
elements.push(elementOrTerminator);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type Parser } from './parser.js';
|
|
2
|
+
export declare function createTupleParser<A, B, Sequence>([parserA, parserB]: [Parser<A, Sequence>, Parser<B, Sequence>]): Parser<[A, B], Sequence>;
|
|
3
|
+
export declare function createTupleParser<A, B, C, Sequence>([parserA, parserB, parserC]: [Parser<A, Sequence>, Parser<B, Sequence>, Parser<C, Sequence>]): Parser<[A, B, C], Sequence>;
|
|
4
|
+
export declare function createTupleParser<A, B, C, D, Sequence>([parserA, parserB, parserC, parserD]: [Parser<A, Sequence>, Parser<B, Sequence>, Parser<C, Sequence>, Parser<D, Sequence>]): Parser<[A, B, C, D], Sequence>;
|
|
5
|
+
export declare function createTupleParser<A, B, C, D, E, Sequence>([parserA, parserB, parserC, parserD, parserE]: [Parser<A, Sequence>, Parser<B, Sequence>, Parser<C, Sequence>, Parser<D, Sequence>, Parser<E, Sequence>]): Parser<[A, B, C, D, E], Sequence>;
|
|
6
|
+
export declare function createTupleParser<A, B, C, D, E, F, Sequence>([parserA, parserB, parserC, parserD, parserE, parserF]: [Parser<A, Sequence>, Parser<B, Sequence>, Parser<C, Sequence>, Parser<D, Sequence>, Parser<E, Sequence>, Parser<F, Sequence>]): Parser<[A, B, C, D, E, F], Sequence>;
|
|
7
|
+
export declare function createTupleParser<A, B, C, D, E, F, G, Sequence>([parserA, parserB, parserC, parserD, parserE, parserF, parserG]: [Parser<A, Sequence>, Parser<B, Sequence>, Parser<C, Sequence>, Parser<D, Sequence>, Parser<E, Sequence>, Parser<F, Sequence>, Parser<G, Sequence>]): Parser<[A, B, C, D, E, F, G], Sequence>;
|
|
8
|
+
export declare function createTupleParser<A, B, C, D, E, F, G, H, Sequence>([parserA, parserB, parserC, parserD, parserE, parserF, parserG, parserH]: [Parser<A, Sequence>, Parser<B, Sequence>, Parser<C, Sequence>, Parser<D, Sequence>, Parser<E, Sequence>, Parser<F, Sequence>, Parser<G, Sequence>, Parser<H, Sequence>]): Parser<[A, B, C, D, E, F, G, H], Sequence>;
|
|
9
|
+
export declare function createTupleParser<A, B, C, D, E, F, G, H, I, Sequence>([parserA, parserB, parserC, parserD, parserE, parserF, parserG, parserH, parserI]: [Parser<A, Sequence>, Parser<B, Sequence>, Parser<C, Sequence>, Parser<D, Sequence>, Parser<E, Sequence>, Parser<F, Sequence>, Parser<G, Sequence>, Parser<H, Sequence>, Parser<I, Sequence>]): Parser<[A, B, C, D, E, F, G, H, I], Sequence>;
|
|
10
|
+
export declare function createTupleParser<A, B, C, D, E, F, G, H, I, J, Sequence>([parserA, parserB, parserC, parserD, parserE, parserF, parserG, parserH, parserI, parserJ]: [Parser<A, Sequence>, Parser<B, Sequence>, Parser<C, Sequence>, Parser<D, Sequence>, Parser<E, Sequence>, Parser<F, Sequence>, Parser<G, Sequence>, Parser<H, Sequence>, Parser<I, Sequence>, Parser<J, Sequence>]): Parser<[A, B, C, D, E, F, G, H, I, J], Sequence>;
|
|
11
|
+
export declare function createTupleParser<A, B, C, D, E, F, G, H, I, J, K, Sequence>([parserA, parserB, parserC, parserD, parserE, parserF, parserG, parserH, parserI, parserJ, parserK]: [Parser<A, Sequence>, Parser<B, Sequence>, Parser<C, Sequence>, Parser<D, Sequence>, Parser<E, Sequence>, Parser<F, Sequence>, Parser<G, Sequence>, Parser<H, Sequence>, Parser<I, Sequence>, Parser<J, Sequence>, Parser<K, Sequence>]): Parser<[A, B, C, D, E, F, G, H, I, J, K], Sequence>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { getParserName, setParserName } from './parser.js';
|
|
2
|
+
export function createTupleParser(parsers) {
|
|
3
|
+
const tupleParser = async (parserContext) => {
|
|
4
|
+
const values = [];
|
|
5
|
+
for (const parser of parsers) {
|
|
6
|
+
const value = await parser(parserContext);
|
|
7
|
+
values.push(value);
|
|
8
|
+
}
|
|
9
|
+
return values;
|
|
10
|
+
};
|
|
11
|
+
setParserName(tupleParser, [
|
|
12
|
+
'[',
|
|
13
|
+
parsers.map(parser => getParserName(parser, 'anonymousTupleChild')).join(','),
|
|
14
|
+
']',
|
|
15
|
+
].join(''));
|
|
16
|
+
return tupleParser;
|
|
17
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { allSettledStream } from './allSettledStream.js';
|
|
2
|
+
import { getParserName, setParserName } from './parser.js';
|
|
3
|
+
import { ParserParsingFailedError } from './parserError.js';
|
|
4
|
+
import { parserImplementationInvariant } from './parserImplementationInvariant.js';
|
|
5
|
+
export const createUnionParser = (childParsers) => {
|
|
6
|
+
parserImplementationInvariant(childParsers.length > 0, 'Union parser must have at least one child parser.');
|
|
7
|
+
const unionParser = async (parserContext) => {
|
|
8
|
+
let runningChildParserContexts = [];
|
|
9
|
+
const childParserResults = allSettledStream(childParsers.map(childParser => {
|
|
10
|
+
const childParserContext = parserContext.lookahead({
|
|
11
|
+
debugName: getParserName(childParser, 'anonymousUnionChild'),
|
|
12
|
+
});
|
|
13
|
+
runningChildParserContexts.push(childParserContext);
|
|
14
|
+
const promise = childParser(childParserContext);
|
|
15
|
+
return {
|
|
16
|
+
promise,
|
|
17
|
+
context: childParserContext,
|
|
18
|
+
};
|
|
19
|
+
}));
|
|
20
|
+
const parserParsingFailedErrors = [];
|
|
21
|
+
const successfulParserOutputs = [];
|
|
22
|
+
const successfulParserContexts = [];
|
|
23
|
+
let didUnlookahead = false;
|
|
24
|
+
for await (const childParserResult of childParserResults) {
|
|
25
|
+
runningChildParserContexts = runningChildParserContexts.filter(runningChildParserContext => runningChildParserContext !== childParserResult.context);
|
|
26
|
+
if (childParserResult.status === 'fulfilled') {
|
|
27
|
+
successfulParserOutputs.push(childParserResult.value);
|
|
28
|
+
successfulParserContexts.push(childParserResult.context);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
const error = childParserResult.reason;
|
|
32
|
+
if (error instanceof ParserParsingFailedError) {
|
|
33
|
+
parserParsingFailedErrors.push(error);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (runningChildParserContexts.length === 1
|
|
40
|
+
&& successfulParserOutputs.length === 0) {
|
|
41
|
+
parserImplementationInvariant(!didUnlookahead, 'Union parser unlookaheaded multiple times.');
|
|
42
|
+
didUnlookahead = true;
|
|
43
|
+
const [runningChildParserContext] = runningChildParserContexts;
|
|
44
|
+
runningChildParserContext.unlookahead();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
parserImplementationInvariant(successfulParserOutputs.length <= 1, [
|
|
48
|
+
'Multiple union child parsers succeeded.',
|
|
49
|
+
'Successful parser outputs, indented, separated by newlines:',
|
|
50
|
+
'%s',
|
|
51
|
+
'End of successful parser outputs.',
|
|
52
|
+
], () => successfulParserOutputs.map(output => ' ' + JSON.stringify(output)).join('\n'));
|
|
53
|
+
parserContext.invariantJoin(successfulParserOutputs.length === 1, parserParsingFailedErrors, 'No union child parser succeeded.');
|
|
54
|
+
const [successfulParserContext] = successfulParserContexts;
|
|
55
|
+
if (!didUnlookahead) {
|
|
56
|
+
successfulParserContext.unlookahead();
|
|
57
|
+
}
|
|
58
|
+
successfulParserContext.dispose();
|
|
59
|
+
const [successfulParserOutput] = successfulParserOutputs;
|
|
60
|
+
return successfulParserOutput;
|
|
61
|
+
};
|
|
62
|
+
const name = [
|
|
63
|
+
'(',
|
|
64
|
+
...childParsers.map(childParser => getParserName(childParser, 'anonymousUnionChild')).join('|'),
|
|
65
|
+
')',
|
|
66
|
+
].join('');
|
|
67
|
+
return setParserName(unionParser, name);
|
|
68
|
+
};
|
package/build/zip.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export type ZipCompression = 'store' | 'deflate';
|
|
2
|
+
export type ZipUnixPermissions = {
|
|
3
|
+
type: 'unix';
|
|
4
|
+
unixPermissions: number;
|
|
5
|
+
};
|
|
6
|
+
export type ZipDosPermissions = {
|
|
7
|
+
type: 'dos';
|
|
8
|
+
dosPermissions: number;
|
|
9
|
+
};
|
|
10
|
+
export type ZipPermissions = ZipUnixPermissions | ZipDosPermissions;
|
|
11
|
+
export type ZipFileEntry = {
|
|
12
|
+
type: 'file';
|
|
13
|
+
path: string;
|
|
14
|
+
date: Date;
|
|
15
|
+
comment: string;
|
|
16
|
+
permissions: ZipPermissions;
|
|
17
|
+
compression: ZipCompression;
|
|
18
|
+
content: Uint8Array;
|
|
19
|
+
};
|
|
20
|
+
export type ZipDirectoryEntry = {
|
|
21
|
+
type: 'directory';
|
|
22
|
+
path: string;
|
|
23
|
+
date: Date;
|
|
24
|
+
comment: string;
|
|
25
|
+
permissions: ZipPermissions;
|
|
26
|
+
};
|
|
27
|
+
export type ZipEntry = ZipFileEntry | ZipDirectoryEntry;
|
|
28
|
+
export type Zip = {
|
|
29
|
+
comment: string;
|
|
30
|
+
entries: ZipEntry[];
|
|
31
|
+
};
|
package/build/zip.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export type ZipStoreCompression = {
|
|
2
|
+
type: 'store';
|
|
3
|
+
};
|
|
4
|
+
export type ZipDeflateCompression = {
|
|
5
|
+
type: 'deflate';
|
|
6
|
+
level: number;
|
|
7
|
+
};
|
|
8
|
+
export type ZipCompression = ZipStoreCompression | ZipDeflateCompression;
|
|
9
|
+
export type ZipFileEntry = {
|
|
10
|
+
type: 'file';
|
|
11
|
+
name: string;
|
|
12
|
+
date: Date;
|
|
13
|
+
comment: string;
|
|
14
|
+
unixPermissions: number;
|
|
15
|
+
dosPermissions: number;
|
|
16
|
+
compression: ZipCompression;
|
|
17
|
+
content: Uint8Array;
|
|
18
|
+
};
|
|
19
|
+
export type ZipDirectoryEntry = {
|
|
20
|
+
type: 'directory';
|
|
21
|
+
name: string;
|
|
22
|
+
date: Date;
|
|
23
|
+
comment: string;
|
|
24
|
+
unixPermissions: number;
|
|
25
|
+
dosPermissions: number;
|
|
26
|
+
entries: ZipEntry[];
|
|
27
|
+
};
|
|
28
|
+
export type ZipEntry = ZipFileEntry | ZipDirectoryEntry;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export type ZipStoreCompression = {
|
|
2
|
+
type: 'store';
|
|
3
|
+
};
|
|
4
|
+
export type ZipDeflateCompression = {
|
|
5
|
+
type: 'deflate';
|
|
6
|
+
level: number;
|
|
7
|
+
};
|
|
8
|
+
export type ZipCompression = ZipStoreCompression | ZipDeflateCompression;
|
|
9
|
+
export type ZipFileEntry = {
|
|
10
|
+
type: 'file';
|
|
11
|
+
name: string;
|
|
12
|
+
date: Date;
|
|
13
|
+
comment: Uint8Array;
|
|
14
|
+
unixPermissions: number;
|
|
15
|
+
dosPermissions: number;
|
|
16
|
+
compression: ZipCompression;
|
|
17
|
+
content: Uint8Array;
|
|
18
|
+
};
|
|
19
|
+
export type ZipDirectoryEntry = {
|
|
20
|
+
type: 'directory';
|
|
21
|
+
name: string;
|
|
22
|
+
date: Date;
|
|
23
|
+
comment: Uint8Array;
|
|
24
|
+
unixPermissions: number;
|
|
25
|
+
dosPermissions: number;
|
|
26
|
+
entries: ZipEntry[];
|
|
27
|
+
};
|
|
28
|
+
export type ZipEntry = ZipFileEntry | ZipDirectoryEntry;
|
|
29
|
+
export type ZipFile = {
|
|
30
|
+
root: ZipDirectoryEntry;
|
|
31
|
+
comment: Uint8Array;
|
|
32
|
+
};
|
package/build/zipFile.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|