Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add typescript types to bin #538

Merged
merged 14 commits into from
Aug 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .ncurc.cjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"use strict";

module.exports = {
"dep": ["prod", "dev", "packageManager"],
"reject": [
"chai", // Moved to es6
"@types/chai", // Should match chai
Expand Down
1 change: 1 addition & 0 deletions .npmignore
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,4 @@ tsconfig*.json
web-test/
yarn.lock
pnpm-workspace.yaml
bin/tsconfig.json
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ Released: TBD

### New features

- [#477](https://github.com/peggyjs/peggy/issues/477) Option to output .d.ts
files next to .js from CLI.
- [#530](https://github.com/peggyjs/peggy/issues/531) Allow es6 plugins from CLI
- [#532](https://github.com/peggyjs/peggy/issues/532) Allow es6 options files
from the CLI
Expand Down
200 changes: 200 additions & 0 deletions bin/generated_template.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,200 @@
/** Provides information pointing to a location within a source. */
export interface Location {
hildjj marked this conversation as resolved.
Show resolved Hide resolved
/** Line in the parsed source (1-based). */
readonly line: number;
/** Column in the parsed source (1-based). */
readonly column: number;
/** Offset in the parsed source (0-based). */
readonly offset: number;
}

/**
* Anything that can successfully be converted to a string with `String()`
* so that it can be used in error messages.
*
* The GrammarLocation class in Peggy is a good example.
*/
export interface GrammarSourceObject extends Stringable {
readonly toString: () => string;

/**
* If specified, allows the grammar source to be embedded in a larger file
* at some offset.
*/
readonly offset?: undefined | ((loc: Location) => Location);
}

/**
* Most often, you just use a string with the file name.
*/
export type GrammarSource = string | GrammarSourceObject;

/** The `start` and `end` position's of an object within the source. */
export interface LocationRange {
/**
* A string or object that was supplied to the `parse()` call as the
* `grammarSource` option.
*/
readonly source: GrammarSource;
/** Position at the beginning of the expression. */
readonly start: Location;
/** Position after the end of the expression. */
readonly end: Location;
}

/**
* Expected a literal string, like `"foo"i`.
*/
export interface LiteralExpectation {
readonly type: "literal";
readonly text: string;
readonly ignoreCase: boolean;
}

/**
* Range of characters, like `a-z`
*/
export type ClassRange = [
start: string,
end: string,
]

export interface ClassParts extends Array<string | ClassRange> {
}

/**
* Expected a class, such as `[^acd-gz]i`
*/
export interface ClassExpectation {
readonly type: "class";
readonly parts: ClassParts;
readonly inverted: boolean;
readonly ignoreCase: boolean;
}

/**
* Expected any character, with `.`
*/
export interface AnyExpectation {
readonly type: "any";
}

/**
* Expected the end of input.
*/
export interface EndExpectation {
readonly type: "end";
}

/**
* Expected some other input. These are specified with a rule's
* "human-readable name", or with the `expected(message, location)`
* function.
*/
export interface OtherExpectation {
readonly type: "other";
readonly description: string;
}

export type Expectation =
| AnyExpectation
| ClassExpectation
| EndExpectation
| LiteralExpectation
| OtherExpectation;

/**
* Pass an array of these into `SyntaxError.prototype.format()`
*/
export interface SourceText {
/**
* Identifier of an input that was used as a grammarSource in parse().
*/
readonly source: GrammarSource;
/** Source text of the input. */
readonly text: string;
}

export declare class SyntaxError extends Error {
/**
* Constructs the human-readable message from the machine representation.
*
* @param expected Array of expected items, generated by the parser
* @param found Any text that will appear as found in the input instead of
* expected
*/
static buildMessage(expected: Expectation[], found?: string | null | undefined): string;
readonly message: string;
readonly expected: Expectation[];
readonly found: string | null | undefined;
readonly location: LocationRange;
readonly name: string;
constructor(
message: string,
expected: Expectation[],
found: string | null,
location: LocationRange,
);

/**
* With good sources, generates a feature-rich error message pointing to the
* error in the input.
* @param sources List of {source, text} objects that map to the input.
*/
format(sources: SourceText[]): string;
}

/**
* Trace execution of the parser.
*/
export interface ParserTracer {
trace: (event: ParserTracerEvent) => void;
}

export type ParserTracerEvent
= {
readonly type: "rule.enter";
readonly rule: string;
readonly location: LocationRange
}
| {
readonly type: "rule.fail";
readonly rule: string;
readonly location: LocationRange
}
| {
readonly type: "rule.match";
readonly rule: string;
readonly location: LocationRange
/** Return value from the rule. */
readonly result: unknown;
};

export type StartRuleNames = $$$StartRules$$$;
export interface ParseOptions<T extends StartRuleNames = $$$DefaultStartRule$$$> {
/**
* String or object that will be attached to the each `LocationRange` object
* created by the parser. For example, this can be path to the parsed file
* or even the File object.
*/
readonly grammarSource?: GrammarSource;
readonly startRule?: T;
readonly tracer?: ParserTracer;

// Internal use only:
readonly peg$library?: boolean;
// Internal use only:
peg$currPos?: number;
// Internal use only:
peg$silentFails?: number;
// Internal use only:
peg$maxFailExpected?: Expectation[];
// Extra application-specific properties
[key: string]: unknown;
}

export declare const StartRules: StartRuleNames[];
export declare const SyntaxError: typeof _PeggySyntaxError;
export declare const parse: typeof ParseFunction;

// Overload of ParseFunction for each allowedStartRule
Loading