From ceb464427eebd0b7ee10252cedafa578a5f0c545 Mon Sep 17 00:00:00 2001 From: Takeshi Date: Tue, 7 Aug 2018 21:23:34 -0600 Subject: [PATCH 01/32] Breaking: WIP --- .eslintrc | 10 - .vscode/launch.json | 2 +- README.md | 2 + build/index.d.ts | 18 + build/index.js | 32 + build/src/CommentParser.d.ts | 9 + build/src/CommentParser.js | 80 + build/src/ParserFactory.d.ts | 8 + build/src/ParserFactory.js | 29 + build/src/interfaces/IComment.d.ts | 28 + build/src/interfaces/IComment.js | 3 + build/src/interfaces/IFile.d.ts | 5 + build/src/interfaces/IFile.js | 3 + build/src/interfaces/IParser.d.ts | 6 + build/src/interfaces/IParser.js | 8 + build/src/interfaces/IResult.d.ts | 6 + build/src/interfaces/IResult.js | 3 + build/src/lang/javascript/index.d.ts | 24 + build/src/lang/javascript/index.js | 93 + build/src/lang/typescript/index.d.ts | 23 + build/src/lang/typescript/index.js | 73 + example.js | 7 + gulpfile.js | 15 - index.js | 23 - index.js.map | 1 - index.ts | 52 +- package-lock.json | 5168 +++++--------------------- package.json | 30 +- src/CommentParser.ts | 95 + src/ParserFactory.ts | 31 + src/interface.js | 3 - src/interface.js.map | 1 - src/interface.ts | 36 - src/interfaces/IComment.ts | 25 + src/interfaces/IFile.ts | 5 + src/interfaces/IParser.ts | 9 + src/interfaces/IResult.ts | 7 + src/javascript/index.js | 107 - src/javascript/index.js.map | 1 - src/javascript/index.ts | 116 - src/lang/javascript/index.ts | 109 + src/lang/typescript/index.ts | 84 + test/fixtures/test.js | 6 - test/index.js | 18 - test/index.js.map | 1 - test/index.ts | 18 - tsconfig.json | 26 +- 47 files changed, 1800 insertions(+), 4659 deletions(-) delete mode 100644 .eslintrc create mode 100644 build/index.d.ts create mode 100644 build/index.js create mode 100644 build/src/CommentParser.d.ts create mode 100644 build/src/CommentParser.js create mode 100644 build/src/ParserFactory.d.ts create mode 100644 build/src/ParserFactory.js create mode 100644 build/src/interfaces/IComment.d.ts create mode 100644 build/src/interfaces/IComment.js create mode 100644 build/src/interfaces/IFile.d.ts create mode 100644 build/src/interfaces/IFile.js create mode 100644 build/src/interfaces/IParser.d.ts create mode 100644 build/src/interfaces/IParser.js create mode 100644 build/src/interfaces/IResult.d.ts create mode 100644 build/src/interfaces/IResult.js create mode 100644 build/src/lang/javascript/index.d.ts create mode 100644 build/src/lang/javascript/index.js create mode 100644 build/src/lang/typescript/index.d.ts create mode 100644 build/src/lang/typescript/index.js create mode 100644 example.js delete mode 100644 gulpfile.js delete mode 100644 index.js delete mode 100644 index.js.map create mode 100644 src/CommentParser.ts create mode 100644 src/ParserFactory.ts delete mode 100644 src/interface.js delete mode 100644 src/interface.js.map delete mode 100644 src/interface.ts create mode 100644 src/interfaces/IComment.ts create mode 100644 src/interfaces/IFile.ts create mode 100644 src/interfaces/IParser.ts create mode 100644 src/interfaces/IResult.ts delete mode 100644 src/javascript/index.js delete mode 100644 src/javascript/index.js.map delete mode 100644 src/javascript/index.ts create mode 100644 src/lang/javascript/index.ts create mode 100644 src/lang/typescript/index.ts delete mode 100644 test/fixtures/test.js delete mode 100644 test/index.js delete mode 100644 test/index.js.map delete mode 100644 test/index.ts diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index c5c2164..0000000 --- a/.eslintrc +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "airbnb", - "rules": { - "func-names": 0, - "strict": 0, - "prefer-arrow-callback": 0, - "prefer-rest-params": 0, - "no-plusplus": 0 - } -} diff --git a/.vscode/launch.json b/.vscode/launch.json index c785623..208db56 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -27,7 +27,7 @@ "type": "node", "request": "launch", "name": "Launch Program", - "program": "${workspaceFolder}/main.js" + "program": "${workspaceFolder}/build/index.js" } ] } \ No newline at end of file diff --git a/README.md b/README.md index c92bb37..e55abb2 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,8 @@ interface IParser { } ``` + + The output should be in the following format: ```typescript diff --git a/build/index.d.ts b/build/index.d.ts new file mode 100644 index 0000000..9f3ee88 --- /dev/null +++ b/build/index.d.ts @@ -0,0 +1,18 @@ +import IFile from './src/interfaces/IFile'; +import IResult from './src/interfaces/IResult'; +import IParser from './src/interfaces/IParser'; +/** + * A class that parses a source code and generates + * + * # API + * + * ``` + * @class Parser + * @implements IParser + * ``` + */ +export default class Parser implements IParser { + private parser; + constructor(file: IFile, options?: any); + parse: () => IResult; +} diff --git a/build/index.js b/build/index.js new file mode 100644 index 0000000..765d757 --- /dev/null +++ b/build/index.js @@ -0,0 +1,32 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const ParserFactory_1 = require("./src/ParserFactory"); +const FS = require("fs"); +/** + * A class that parses a source code and generates + * + * # API + * + * ``` + * @class Parser + * @implements IParser + * ``` + */ +class Parser { + constructor(file, options = {}) { + this.parse = () => { + return this.parser.parse(); + }; + this.parser = (new ParserFactory_1.default(file, options)).getParser(); + } +} +exports.default = Parser; +const result = new Parser({ + name: 'index.ts', + path: '../../', + text: FS.readFileSync(`${process.cwd()}/index.ts`, 'utf-8') +}, { + language: 'typescript' +}).parse(); +// console.log(JSON.stringify(result, null, 2)) +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLHVEQUFnRDtBQUVoRCx5QkFBeUI7QUFFekI7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBcUIsTUFBTTtJQUd6QixZQUFZLElBQVcsRUFBRSxVQUFlLEVBQUU7UUFHMUMsVUFBSyxHQUFHLEdBQVksRUFBRTtZQUNwQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDNUIsQ0FBQyxDQUFBO1FBSkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksdUJBQWEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMvRCxDQUFDO0NBSUY7QUFURCx5QkFTQztBQUVELE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDO0lBQ3hCLElBQUksRUFBRSxVQUFVO0lBQ2hCLElBQUksRUFBRSxRQUFRO0lBQ2QsSUFBSSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUM7Q0FDNUQsRUFBRTtJQUNELFFBQVEsRUFBRSxZQUFZO0NBQ3ZCLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUdYLCtDQUErQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBJRmlsZSBmcm9tICcuL3NyYy9pbnRlcmZhY2VzL0lGaWxlJztcbmltcG9ydCBJUmVzdWx0IGZyb20gJy4vc3JjL2ludGVyZmFjZXMvSVJlc3VsdCc7XG5pbXBvcnQgUGFyc2VyRmFjdG9yeSBmcm9tICcuL3NyYy9QYXJzZXJGYWN0b3J5JztcbmltcG9ydCBJUGFyc2VyIGZyb20gJy4vc3JjL2ludGVyZmFjZXMvSVBhcnNlcic7XG5pbXBvcnQgKiBhcyBGUyBmcm9tICdmcyc7XG5cbi8qKlxuICogQSBjbGFzcyB0aGF0IHBhcnNlcyBhIHNvdXJjZSBjb2RlIGFuZCBnZW5lcmF0ZXNcbiAqIFxuICogIyBBUElcbiAqIFxuICogYGBgXG4gKiBAY2xhc3MgUGFyc2VyXG4gKiBAaW1wbGVtZW50cyBJUGFyc2VyXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFyc2VyIGltcGxlbWVudHMgSVBhcnNlciB7XG5cbiAgcHJpdmF0ZSBwYXJzZXI6IElQYXJzZXI7XG4gIGNvbnN0cnVjdG9yKGZpbGU6IElGaWxlLCBvcHRpb25zOiBhbnkgPSB7fSkge1xuICAgIHRoaXMucGFyc2VyID0gKG5ldyBQYXJzZXJGYWN0b3J5KGZpbGUsIG9wdGlvbnMpKS5nZXRQYXJzZXIoKTtcbiAgfVxuICBwYXJzZSA9ICgpOiBJUmVzdWx0ID0+IHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIucGFyc2UoKVxuICB9XG59XG5cbmNvbnN0IHJlc3VsdCA9IG5ldyBQYXJzZXIoe1xuICBuYW1lOiAnaW5kZXgudHMnLFxuICBwYXRoOiAnLi4vLi4vJyxcbiAgdGV4dDogRlMucmVhZEZpbGVTeW5jKGAke3Byb2Nlc3MuY3dkKCl9L2luZGV4LnRzYCwgJ3V0Zi04Jylcbn0sIHtcbiAgbGFuZ3VhZ2U6ICd0eXBlc2NyaXB0J1xufSkucGFyc2UoKTtcblxuXG4vLyBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpKSJdfQ== \ No newline at end of file diff --git a/build/src/CommentParser.d.ts b/build/src/CommentParser.d.ts new file mode 100644 index 0000000..b31ccee --- /dev/null +++ b/build/src/CommentParser.d.ts @@ -0,0 +1,9 @@ +import IComment from "./interfaces/IComment"; +import * as Parser from 'tree-sitter'; +import { Location, Position } from './interfaces/IComment'; +export default class CommentParser { + static parse(node: Parser.SyntaxNode, source: string, offset?: { + location: Location; + position: Position; + }, comments?: IComment[]): IComment[]; +} diff --git a/build/src/CommentParser.js b/build/src/CommentParser.js new file mode 100644 index 0000000..62d4edf --- /dev/null +++ b/build/src/CommentParser.js @@ -0,0 +1,80 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const xdoc_parser_1 = require("xdoc-parser"); +/** + * Creates a position object. + * @param node: Parser.SyntaxNode + * @param offset: { + * location: Location, + * position: Position + * } + */ +function position(node, offset) { + return { + start: offset ? offset.position.start + node.startIndex : node.startIndex, + end: offset ? offset.position.end + node.endIndex : node.endIndex + }; +} +/** + * Creates a location object. + * @param node: Parser.SyntaxNode + * @param offset: { + * location: Location, + * position: Position + * } + * @return: { + * start: { + * row: number, + * column: number + * }, + * end: { + * row: number, + * column: number + * } + * } + */ +function location(node, offset) { + return { + start: { + row: offset ? offset.location.start.row + node.startPosition.row : node.startPosition.row, + column: offset ? offset.location.start.column + node.startPosition.column : node.startPosition.column + }, + end: { + row: offset ? offset.location.end.row + node.endPosition.row : node.endPosition.row, + column: offset ? offset.location.end.column + node.endPosition.column : node.endPosition.column + } + }; +} +class CommentParser { + static parse(node, source, offset, comments = []) { + // console.log(node.type) + if (node.type === "comment" && node.nextSibling) { + console.log(node.nextSibling.type); + // console.log(`${node.nextSibling.type} has a leading comment.`); + const next = node.nextSibling; + // console.log(source.substring(next.startIndex, next.endIndex)); + // console.log(''); + comments.push({ + position: position(node, offset), + location: location(node, offset), + markdown: (xdoc_parser_1.default(source.substring(node.startIndex, node.endIndex), { + visitor: { + showNodeText: true + } + })).parse(), + text: source.substring(node.startIndex, node.endIndex), + context: { + position: position(next, offset), + location: location(next, offset), + text: source.substring(next.startIndex, next.endIndex), + type: next.type, + children: [] + } + }); + } + node.children.forEach(child => CommentParser.parse(child, source, offset, comments)); + return comments; + } +} +exports.default = CommentParser; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tbWVudFBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Db21tZW50UGFyc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsNkNBQStCO0FBRy9COzs7Ozs7O0dBT0c7QUFDSCxTQUFTLFFBQVEsQ0FDZixJQUF1QixFQUN2QixNQUFtRDtJQUVuRCxPQUFPO1FBQ0wsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVU7UUFDekUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVE7S0FDbEUsQ0FBQTtBQUNILENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxTQUFTLFFBQVEsQ0FDZixJQUF1QixFQUN2QixNQUFrRDtJQUVsRCxPQUFPO1FBQ0wsS0FBSyxFQUFFO1lBQ0wsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUc7WUFDekYsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU07U0FDdEc7UUFDRCxHQUFHLEVBQUU7WUFDSCxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRztZQUNuRixNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTTtTQUNoRztLQUNGLENBQUE7QUFDSCxDQUFDO0FBRUQsTUFBcUIsYUFBYTtJQUNoQyxNQUFNLENBQUMsS0FBSyxDQUNWLElBQXVCLEVBQ3ZCLE1BQWMsRUFDZCxNQUFtRCxFQUNuRCxXQUF1QixFQUFFO1FBRXpCLHlCQUF5QjtRQUN6QixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDL0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ2xDLGtFQUFrRTtZQUNsRSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBRTlCLGlFQUFpRTtZQUNqRSxtQkFBbUI7WUFDbkIsUUFBUSxDQUFDLElBQUksQ0FBQztnQkFDWixRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUM7Z0JBQ2hDLFFBQVEsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQztnQkFDaEMsUUFBUSxFQUFFLENBQUMscUJBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFO29CQUNoRSxPQUFPLEVBQUU7d0JBQ1AsWUFBWSxFQUFFLElBQUk7cUJBQ25CO2lCQUNGLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRTtnQkFDWCxJQUFJLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ3RELE9BQU8sRUFBRTtvQkFDUCxRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUM7b0JBQ2hDLFFBQVEsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQztvQkFDaEMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO29CQUN0RCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7b0JBQ2YsUUFBUSxFQUFFLEVBQUU7aUJBQ2I7YUFDRixDQUFDLENBQUM7U0FDSjtRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3JGLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7Q0FDRjtBQXJDRCxnQ0FxQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgSUNvbW1lbnQgZnJvbSBcIi4vaW50ZXJmYWNlcy9JQ29tbWVudFwiO1xuaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcbmltcG9ydCB4ZG9jIGZyb20gJ3hkb2MtcGFyc2VyJztcbmltcG9ydCB7IExvY2F0aW9uLCBQb3NpdGlvbiB9IGZyb20gJy4vaW50ZXJmYWNlcy9JQ29tbWVudCc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHBvc2l0aW9uIG9iamVjdC5cbiAqIEBwYXJhbSBub2RlOiBQYXJzZXIuU3ludGF4Tm9kZVxuICogQHBhcmFtIG9mZnNldDoge1xuICogIGxvY2F0aW9uOiBMb2NhdGlvbixcbiAqICBwb3NpdGlvbjogUG9zaXRpb25cbiAqIH1cbiAqL1xuZnVuY3Rpb24gcG9zaXRpb24oXG4gIG5vZGU6IFBhcnNlci5TeW50YXhOb2RlLFxuICBvZmZzZXQ/OiB7IGxvY2F0aW9uOiBMb2NhdGlvbiwgcG9zaXRpb246IFBvc2l0aW9uIH1cbikge1xuICByZXR1cm4ge1xuICAgIHN0YXJ0OiBvZmZzZXQgPyBvZmZzZXQucG9zaXRpb24uc3RhcnQgKyBub2RlLnN0YXJ0SW5kZXggOiBub2RlLnN0YXJ0SW5kZXgsXG4gICAgZW5kOiBvZmZzZXQgPyBvZmZzZXQucG9zaXRpb24uZW5kICsgbm9kZS5lbmRJbmRleCA6IG5vZGUuZW5kSW5kZXhcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsb2NhdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0gbm9kZTogUGFyc2VyLlN5bnRheE5vZGVcbiAqIEBwYXJhbSBvZmZzZXQ6IHtcbiAqICBsb2NhdGlvbjogTG9jYXRpb24sXG4gKiAgcG9zaXRpb246IFBvc2l0aW9uXG4gKiB9XG4gKiBAcmV0dXJuOiB7XG4gKiAgc3RhcnQ6IHtcbiAqICAgIHJvdzogbnVtYmVyLFxuICogICAgY29sdW1uOiBudW1iZXJcbiAqICB9LFxuICogIGVuZDoge1xuICogICAgcm93OiBudW1iZXIsXG4gKiAgICBjb2x1bW46IG51bWJlclxuICogIH1cbiAqIH1cbiAqL1xuZnVuY3Rpb24gbG9jYXRpb24oXG4gIG5vZGU6IFBhcnNlci5TeW50YXhOb2RlLFxuICBvZmZzZXQ6IHsgbG9jYXRpb246IExvY2F0aW9uLCBwb3NpdGlvbjogUG9zaXRpb24gfVxuKSB7XG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IHtcbiAgICAgIHJvdzogb2Zmc2V0ID8gb2Zmc2V0LmxvY2F0aW9uLnN0YXJ0LnJvdyArIG5vZGUuc3RhcnRQb3NpdGlvbi5yb3cgOiBub2RlLnN0YXJ0UG9zaXRpb24ucm93LFxuICAgICAgY29sdW1uOiBvZmZzZXQgPyBvZmZzZXQubG9jYXRpb24uc3RhcnQuY29sdW1uICsgbm9kZS5zdGFydFBvc2l0aW9uLmNvbHVtbiA6IG5vZGUuc3RhcnRQb3NpdGlvbi5jb2x1bW5cbiAgICB9LFxuICAgIGVuZDoge1xuICAgICAgcm93OiBvZmZzZXQgPyBvZmZzZXQubG9jYXRpb24uZW5kLnJvdyArIG5vZGUuZW5kUG9zaXRpb24ucm93IDogbm9kZS5lbmRQb3NpdGlvbi5yb3csXG4gICAgICBjb2x1bW46IG9mZnNldCA/IG9mZnNldC5sb2NhdGlvbi5lbmQuY29sdW1uICsgbm9kZS5lbmRQb3NpdGlvbi5jb2x1bW4gOiBub2RlLmVuZFBvc2l0aW9uLmNvbHVtblxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb21tZW50UGFyc2VyIHtcbiAgc3RhdGljIHBhcnNlKFxuICAgIG5vZGU6IFBhcnNlci5TeW50YXhOb2RlLFxuICAgIHNvdXJjZTogc3RyaW5nLFxuICAgIG9mZnNldD86IHsgbG9jYXRpb246IExvY2F0aW9uLCBwb3NpdGlvbjogUG9zaXRpb24gfSxcbiAgICBjb21tZW50czogSUNvbW1lbnRbXSA9IFtdLFxuICApIHtcbiAgICAvLyBjb25zb2xlLmxvZyhub2RlLnR5cGUpXG4gICAgaWYgKG5vZGUudHlwZSA9PT0gXCJjb21tZW50XCIgJiYgbm9kZS5uZXh0U2libGluZykge1xuICAgICAgY29uc29sZS5sb2cobm9kZS5uZXh0U2libGluZy50eXBlKVxuICAgICAgLy8gY29uc29sZS5sb2coYCR7bm9kZS5uZXh0U2libGluZy50eXBlfSBoYXMgYSBsZWFkaW5nIGNvbW1lbnQuYCk7XG4gICAgICBjb25zdCBuZXh0ID0gbm9kZS5uZXh0U2libGluZztcblxuICAgICAgLy8gY29uc29sZS5sb2coc291cmNlLnN1YnN0cmluZyhuZXh0LnN0YXJ0SW5kZXgsIG5leHQuZW5kSW5kZXgpKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgIGNvbW1lbnRzLnB1c2goe1xuICAgICAgICBwb3NpdGlvbjogcG9zaXRpb24obm9kZSwgb2Zmc2V0KSxcbiAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uKG5vZGUsIG9mZnNldCksXG4gICAgICAgIG1hcmtkb3duOiAoeGRvYyhzb3VyY2Uuc3Vic3RyaW5nKG5vZGUuc3RhcnRJbmRleCwgbm9kZS5lbmRJbmRleCksIHtcbiAgICAgICAgICB2aXNpdG9yOiB7XG4gICAgICAgICAgICBzaG93Tm9kZVRleHQ6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pKS5wYXJzZSgpLFxuICAgICAgICB0ZXh0OiBzb3VyY2Uuc3Vic3RyaW5nKG5vZGUuc3RhcnRJbmRleCwgbm9kZS5lbmRJbmRleCksXG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBwb3NpdGlvbjogcG9zaXRpb24obmV4dCwgb2Zmc2V0KSxcbiAgICAgICAgICBsb2NhdGlvbjogbG9jYXRpb24obmV4dCwgb2Zmc2V0KSxcbiAgICAgICAgICB0ZXh0OiBzb3VyY2Uuc3Vic3RyaW5nKG5leHQuc3RhcnRJbmRleCwgbmV4dC5lbmRJbmRleCksXG4gICAgICAgICAgdHlwZTogbmV4dC50eXBlLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBub2RlLmNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4gQ29tbWVudFBhcnNlci5wYXJzZShjaGlsZCwgc291cmNlLCBvZmZzZXQsIGNvbW1lbnRzKSk7XG4gICAgcmV0dXJuIGNvbW1lbnRzO1xuICB9XG59Il19 \ No newline at end of file diff --git a/build/src/ParserFactory.d.ts b/build/src/ParserFactory.d.ts new file mode 100644 index 0000000..cc92b7b --- /dev/null +++ b/build/src/ParserFactory.d.ts @@ -0,0 +1,8 @@ +import IFile from "./interfaces/IFile"; +import IParser from "./interfaces/IParser"; +export default class ParserFactory { + private file; + private options; + constructor(file: IFile, options?: any); + getParser: () => IParser; +} diff --git a/build/src/ParserFactory.js b/build/src/ParserFactory.js new file mode 100644 index 0000000..1cdf9b7 --- /dev/null +++ b/build/src/ParserFactory.js @@ -0,0 +1,29 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const javascript_1 = require("./lang/javascript"); +const typescript_1 = require("./lang/typescript"); +class ParserFactory { + constructor(file, options = {}) { + this.options = { + language: 'JavaScript' + }; + this.getParser = () => { + switch (this.options.language.toLowerCase()) { + case 'js': + case 'javascript': + return new javascript_1.default(this.file, this.options); + break; + case 'ts': + case 'typescript': + return new typescript_1.default(this.file, this.options); + default: + console.log(`[mr-doc]: No parser for ${this.options.language} exists.`); + break; + } + }; + this.file = file; + Object.assign(this.options, options); + } +} +exports.default = ParserFactory; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFyc2VyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9QYXJzZXJGYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsa0RBQWlEO0FBQ2pELGtEQUFpRDtBQUVqRCxNQUFxQixhQUFhO0lBS2hDLFlBQVksSUFBVyxFQUFFLFVBQWUsRUFBRTtRQUhsQyxZQUFPLEdBQUc7WUFDaEIsUUFBUSxFQUFFLFlBQVk7U0FDdkIsQ0FBQTtRQU1ELGNBQVMsR0FBRyxHQUFZLEVBQUU7WUFDeEIsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDM0MsS0FBSyxJQUFJLENBQUM7Z0JBQ1YsS0FBSyxZQUFZO29CQUNmLE9BQU8sSUFBSSxvQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDckQsTUFBTTtnQkFDUixLQUFLLElBQUksQ0FBQztnQkFDVixLQUFLLFlBQVk7b0JBQ2YsT0FBTyxJQUFJLG9CQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN2RDtvQkFDQSxPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsVUFBVSxDQUFDLENBQUE7b0JBQ3JFLE1BQU07YUFDVDtRQUNILENBQUMsQ0FBQTtRQWpCQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDdEMsQ0FBQztDQWlCRjtBQXpCRCxnQ0F5QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgSUZpbGUgZnJvbSBcIi4vaW50ZXJmYWNlcy9JRmlsZVwiO1xuaW1wb3J0IElQYXJzZXIgZnJvbSBcIi4vaW50ZXJmYWNlcy9JUGFyc2VyXCI7XG5pbXBvcnQgSmF2YVNjcmlwdFBhcnNlciBmcm9tIFwiLi9sYW5nL2phdmFzY3JpcHRcIjtcbmltcG9ydCBUeXBlU2NyaXB0UGFyc2VyIGZyb20gJy4vbGFuZy90eXBlc2NyaXB0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFyc2VyRmFjdG9yeSB7XG4gIHByaXZhdGUgZmlsZTogSUZpbGVcbiAgcHJpdmF0ZSBvcHRpb25zID0ge1xuICAgIGxhbmd1YWdlOiAnSmF2YVNjcmlwdCdcbiAgfVxuICBjb25zdHJ1Y3RvcihmaWxlOiBJRmlsZSwgb3B0aW9uczogYW55ID0ge30pIHtcbiAgICB0aGlzLmZpbGUgPSBmaWxlO1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5vcHRpb25zLCBvcHRpb25zKVxuICB9XG5cbiAgZ2V0UGFyc2VyID0gKCk6IElQYXJzZXIgPT4ge1xuICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLmxhbmd1YWdlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNhc2UgJ2pzJzpcbiAgICAgIGNhc2UgJ2phdmFzY3JpcHQnOlxuICAgICAgICByZXR1cm4gbmV3IEphdmFTY3JpcHRQYXJzZXIodGhpcy5maWxlLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RzJzpcbiAgICAgIGNhc2UgJ3R5cGVzY3JpcHQnOlxuICAgICAgICByZXR1cm4gbmV3IFR5cGVTY3JpcHRQYXJzZXIodGhpcy5maWxlLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgIGNvbnNvbGUubG9nKGBbbXItZG9jXTogTm8gcGFyc2VyIGZvciAke3RoaXMub3B0aW9ucy5sYW5ndWFnZX0gZXhpc3RzLmApXG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG59Il19 \ No newline at end of file diff --git a/build/src/interfaces/IComment.d.ts b/build/src/interfaces/IComment.d.ts new file mode 100644 index 0000000..06ca3d5 --- /dev/null +++ b/build/src/interfaces/IComment.d.ts @@ -0,0 +1,28 @@ +import { RemarkNode } from 'xdoc-parser/src/XDocParser'; +export interface Position { + start: number; + end: number; +} +export interface Location { + start: { + row: number; + column: number; + }; + end: { + row: number; + column: number; + }; +} +export default interface IComment { + position: Position; + location: Location; + markdown: RemarkNode[]; + text: string; + context: { + position: Position; + location: Location; + text: string; + type: string; + children: IComment[] | undefined[]; + }; +} diff --git a/build/src/interfaces/IComment.js b/build/src/interfaces/IComment.js new file mode 100644 index 0000000..b44f217 --- /dev/null +++ b/build/src/interfaces/IComment.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSUNvbW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW50ZXJmYWNlcy9JQ29tbWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IElGaWxlIGZyb20gXCIuL0lGaWxlXCI7XG5pbXBvcnQgeyBSZW1hcmtOb2RlIH0gZnJvbSAneGRvYy1wYXJzZXIvc3JjL1hEb2NQYXJzZXInXG5leHBvcnQgaW50ZXJmYWNlIFBvc2l0aW9uIHtcbiAgc3RhcnQ6IG51bWJlcixcbiAgZW5kOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYXRpb24ge1xuICBzdGFydDogeyByb3c6IG51bWJlciwgY29sdW1uOiBudW1iZXIgfSxcbiAgZW5kOiB7IHJvdzogbnVtYmVyLCBjb2x1bW46IG51bWJlciB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGludGVyZmFjZSBJQ29tbWVudCB7XG4gIHBvc2l0aW9uOiBQb3NpdGlvbixcbiAgbG9jYXRpb246IExvY2F0aW9uLFxuICBtYXJrZG93bjogUmVtYXJrTm9kZVtdLFxuICB0ZXh0OiBzdHJpbmdcbiAgY29udGV4dDoge1xuICAgIHBvc2l0aW9uOiBQb3NpdGlvbixcbiAgICBsb2NhdGlvbjogTG9jYXRpb24sXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICBjaGlsZHJlbjogSUNvbW1lbnRbXSB8IHVuZGVmaW5lZFtdXG4gIH1cbn0iXX0= \ No newline at end of file diff --git a/build/src/interfaces/IFile.d.ts b/build/src/interfaces/IFile.d.ts new file mode 100644 index 0000000..c29d01f --- /dev/null +++ b/build/src/interfaces/IFile.d.ts @@ -0,0 +1,5 @@ +export default interface IFile { + name: string; + path: string; + text: string; +} diff --git a/build/src/interfaces/IFile.js b/build/src/interfaces/IFile.js new file mode 100644 index 0000000..d0508f0 --- /dev/null +++ b/build/src/interfaces/IFile.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSUZpbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW50ZXJmYWNlcy9JRmlsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgaW50ZXJmYWNlIElGaWxlIHtcbiAgbmFtZTogc3RyaW5nLFxuICBwYXRoOiBzdHJpbmcsXG4gIHRleHQ6IHN0cmluZ1xufSJdfQ== \ No newline at end of file diff --git a/build/src/interfaces/IParser.d.ts b/build/src/interfaces/IParser.d.ts new file mode 100644 index 0000000..96631f9 --- /dev/null +++ b/build/src/interfaces/IParser.d.ts @@ -0,0 +1,6 @@ +import IFile from "./IFile"; +import IResult from "./IResult"; +export default abstract class IParser { + constructor(file: IFile, options: any); + abstract parse(): IResult; +} diff --git a/build/src/interfaces/IParser.js b/build/src/interfaces/IParser.js new file mode 100644 index 0000000..416e800 --- /dev/null +++ b/build/src/interfaces/IParser.js @@ -0,0 +1,8 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class IParser { + constructor(file, options) { + } +} +exports.default = IParser; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSVBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbnRlcmZhY2VzL0lQYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxNQUE4QixPQUFPO0lBQ25DLFlBQVksSUFBVyxFQUFFLE9BQVk7SUFFckMsQ0FBQztDQUVGO0FBTEQsMEJBS0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgSUZpbGUgZnJvbSBcIi4vSUZpbGVcIjtcbmltcG9ydCBJUmVzdWx0IGZyb20gXCIuL0lSZXN1bHRcIjtcblxuZXhwb3J0IGRlZmF1bHQgYWJzdHJhY3QgY2xhc3MgSVBhcnNlciB7XG4gIGNvbnN0cnVjdG9yKGZpbGU6IElGaWxlLCBvcHRpb25zOiBhbnkpIHtcblxuICB9XG4gIGFic3RyYWN0IHBhcnNlKCk6IElSZXN1bHRcbn0iXX0= \ No newline at end of file diff --git a/build/src/interfaces/IResult.d.ts b/build/src/interfaces/IResult.d.ts new file mode 100644 index 0000000..14bc625 --- /dev/null +++ b/build/src/interfaces/IResult.d.ts @@ -0,0 +1,6 @@ +import IFile from "./IFile"; +import IComment from "./IComment"; +export default interface IResult { + file: IFile; + comments: IComment[]; +} diff --git a/build/src/interfaces/IResult.js b/build/src/interfaces/IResult.js new file mode 100644 index 0000000..7fda6e0 --- /dev/null +++ b/build/src/interfaces/IResult.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSVJlc3VsdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbnRlcmZhY2VzL0lSZXN1bHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBJRmlsZSBmcm9tIFwiLi9JRmlsZVwiO1xuaW1wb3J0IElDb21tZW50IGZyb20gXCIuL0lDb21tZW50XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGludGVyZmFjZSBJUmVzdWx0IHtcbiAgZmlsZTogSUZpbGUsXG4gIGNvbW1lbnRzOiBJQ29tbWVudFtdXG59Il19 \ No newline at end of file diff --git a/build/src/lang/javascript/index.d.ts b/build/src/lang/javascript/index.d.ts new file mode 100644 index 0000000..034dda4 --- /dev/null +++ b/build/src/lang/javascript/index.d.ts @@ -0,0 +1,24 @@ +import IParser from '../../interfaces/IParser'; +import IFile from '../../interfaces/IFile'; +import IResult from '../../interfaces/IResult'; +/** + * A class that parses JavaScript comments. + * + * # API + * + * ``` + * @class JavaScriptParser + * @implements IParser + * @export default + * ``` + */ +export default class JavaScriptParser implements IParser { + private file; + private options; + private parser; + constructor(file: IFile, options: any); + parse: () => IResult; + private filterType; + private checkType; + private parseChildren; +} diff --git a/build/src/lang/javascript/index.js b/build/src/lang/javascript/index.js new file mode 100644 index 0000000..2ddfd25 --- /dev/null +++ b/build/src/lang/javascript/index.js @@ -0,0 +1,93 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const Parser = require("tree-sitter"); +const JavaScript = require("tree-sitter-javascript"); +const CommentParser_1 = require("../../CommentParser"); +/** + * A class that parses JavaScript comments. + * + * # API + * + * ``` + * @class JavaScriptParser + * @implements IParser + * @export default + * ``` + */ +class JavaScriptParser { + constructor(file, options) { + this.parse = () => { + let tree = this.parser.parse(this.file.text); + // Get the first comment + let first_comment = tree.rootNode.children + .filter(node => node.type === "comment")[0]; + const first_comment_string = this.file.text + .substring(first_comment.startIndex, first_comment.endIndex); + // Remove any legal or unncessary comments + if (first_comment_string.includes("copyright") || + first_comment_string.includes("author") || + first_comment_string.includes("terms and conditions")) { + tree.edit({ + startIndex: first_comment.startIndex, + oldEndIndex: first_comment.endIndex, + newEndIndex: first_comment.endIndex, + startPosition: { row: 0, column: 0 }, + oldEndPosition: { row: 0, column: 0 }, + newEndPosition: { row: 0, column: 0 }, + }); + tree = this.parser.parse('', tree); + } + return { + file: this.file, + comments: CommentParser_1.default.parse(tree.rootNode, this.file.text) + .filter(this.filterType) + // .map(this.checkType) + .map(this.parseChildren) + }; + }; + this.filterType = (comment) => { + return (this.options.filter || + [ + 'function', + 'class', + 'variable_declaration' + ]).includes(comment.context.type); + }; + this.checkType = (comment) => { + const tree = this.parser.parse(comment.context.text); + switch (comment.context.type) { + case 'variable_declaration': + // Check whether we have an anonymous class + if (comment.context.text.includes("class")) { + // Drill down until we find the class body + const variable_declarator = tree.rootNode.children[0].children[1]; + const anonymous_class = variable_declarator.children + .filter(node => node.type === "anonymous_class")[0]; + const class_body = anonymous_class.children[1]; + comment.context.children = CommentParser_1.default.parse(class_body, comment.context.text, { location: comment.context.location, position: comment.context.position }); + } + break; + default: + break; + } + return comment; + }; + this.parseChildren = (comment) => { + switch (comment.context.type) { + case 'class': + const tree = this.parser.parse(comment.context.text); + comment.context.children = CommentParser_1.default.parse(tree.rootNode, comment.context.text, { location: comment.context.location, position: comment.context.position }).filter(child => child.context.type === 'method_definition'); + break; + default: + break; + } + return comment; + }; + this.file = file; + Object.assign(this.options = {}, options || {}); + this.parser = new Parser(); + this.parser.setLanguage(JavaScript); + } +} +exports.default = JavaScriptParser; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy9qYXZhc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNDO0FBQ3RDLHFEQUFxRDtBQUlyRCx1REFBZ0Q7QUFHaEQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQXFCLGdCQUFnQjtJQUluQyxZQUFZLElBQVcsRUFBRSxPQUFZO1FBTXJDLFVBQUssR0FBRyxHQUFZLEVBQUU7WUFDcEIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3Qyx3QkFBd0I7WUFDeEIsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRO2lCQUN2QyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO2lCQUMxQyxTQUFTLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFN0QsMENBQTBDO1lBQzFDLElBQUksb0JBQW9CLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztnQkFDNUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztnQkFDdkMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDLEVBQUU7Z0JBQ3ZELElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQ1IsVUFBVSxFQUFFLGFBQWEsQ0FBQyxVQUFVO29CQUNwQyxXQUFXLEVBQUUsYUFBYSxDQUFDLFFBQVE7b0JBQ25DLFdBQVcsRUFBRSxhQUFhLENBQUMsUUFBUTtvQkFDbkMsYUFBYSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFB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RSxRQUFRLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQzNFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsQ0FBQztvQkFDOUQsTUFBTTtnQkFDUjtvQkFDRSxNQUFNO2FBQ1Q7WUFDRCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDLENBQUE7UUFuRkMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Q0FnRkY7QUF6RkQsbUNBeUZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcbmltcG9ydCAqIGFzIEphdmFTY3JpcHQgZnJvbSAndHJlZS1zaXR0ZXItamF2YXNjcmlwdCc7XG5pbXBvcnQgSVBhcnNlciBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lQYXJzZXInO1xuaW1wb3J0IElGaWxlIGZyb20gJy4uLy4uL2ludGVyZmFjZXMvSUZpbGUnO1xuaW1wb3J0IElSZXN1bHQgZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9JUmVzdWx0JztcbmltcG9ydCBDb21tZW50UGFyc2VyIGZyb20gJy4uLy4uL0NvbW1lbnRQYXJzZXInO1xuaW1wb3J0IElDb21tZW50IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvSUNvbW1lbnQnO1xuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCBwYXJzZXMgSmF2YVNjcmlwdCBjb21tZW50cy5cbiAqIFxuICogIyBBUElcbiAqIFxuICogYGBgXG4gKiBAY2xhc3MgSmF2YVNjcmlwdFBhcnNlclxuICogQGltcGxlbWVudHMgSVBhcnNlclxuICogQGV4cG9ydCBkZWZhdWx0XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSmF2YVNjcmlwdFBhcnNlciBpbXBsZW1lbnRzIElQYXJzZXIge1xuICBwcml2YXRlIGZpbGU6IElGaWxlO1xuICBwcml2YXRlIG9wdGlvbnM6IGFueTtcbiAgcHJpdmF0ZSBwYXJzZXI6IFBhcnNlcjtcbiAgY29uc3RydWN0b3IoZmlsZTogSUZpbGUsIG9wdGlvbnM6IGFueSkge1xuICAgIHRoaXMuZmlsZSA9IGZpbGU7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdGlvbnMgPSB7fSwgb3B0aW9ucyB8fCB7fSk7XG4gICAgdGhpcy5wYXJzZXIgPSBuZXcgUGFyc2VyKCk7XG4gICAgdGhpcy5wYXJzZXIuc2V0TGFuZ3VhZ2UoSmF2YVNjcmlwdCk7XG4gIH1cbiAgcGFyc2UgPSAoKTogSVJlc3VsdCA9PiB7XG4gICAgbGV0IHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZSh0aGlzLmZpbGUudGV4dCk7XG4gICAgLy8gR2V0IHRoZSBmaXJzdCBjb21tZW50XG4gICAgbGV0IGZpcnN0X2NvbW1lbnQgPSB0cmVlLnJvb3ROb2RlLmNoaWxkcmVuXG4gICAgICAuZmlsdGVyKG5vZGUgPT4gbm9kZS50eXBlID09PSBcImNvbW1lbnRcIilbMF07XG4gICAgY29uc3QgZmlyc3RfY29tbWVudF9zdHJpbmcgPSB0aGlzLmZpbGUudGV4dFxuICAgIC5zdWJzdHJpbmcoZmlyc3RfY29tbWVudC5zdGFydEluZGV4LCBmaXJzdF9jb21tZW50LmVuZEluZGV4KTtcbiAgICBcbiAgICAvLyBSZW1vdmUgYW55IGxlZ2FsIG9yIHVubmNlc3NhcnkgY29tbWVudHNcbiAgICBpZiAoZmlyc3RfY29tbWVudF9zdHJpbmcuaW5jbHVkZXMoXCJjb3B5cmlnaHRcIikgfHxcbiAgICAgIGZpcnN0X2NvbW1lbnRfc3RyaW5nLmluY2x1ZGVzKFwiYXV0aG9yXCIpIHx8XG4gICAgICBmaXJzdF9jb21tZW50X3N0cmluZy5pbmNsdWRlcyhcInRlcm1zIGFuZCBjb25kaXRpb25zXCIpKSB7XG4gICAgICB0cmVlLmVkaXQoe1xuICAgICAgICBzdGFydEluZGV4OiBmaXJzdF9jb21tZW50LnN0YXJ0SW5kZXgsXG4gICAgICAgIG9sZEVuZEluZGV4OiBmaXJzdF9jb21tZW50LmVuZEluZGV4LFxuICAgICAgICBuZXdFbmRJbmRleDogZmlyc3RfY29tbWVudC5lbmRJbmRleCxcbiAgICAgICAgc3RhcnRQb3NpdGlvbjogeyByb3c6IDAsIGNvbHVtbjogMCB9LFxuICAgICAgICBvbGRFbmRQb3NpdGlvbjogeyByb3c6IDAsIGNvbHVtbjogMCB9LFxuICAgICAgICBuZXdFbmRQb3NpdGlvbjogeyByb3c6IDAsIGNvbHVtbjogMCB9LFxuICAgICAgfSk7XG4gICAgICB0cmVlID0gdGhpcy5wYXJzZXIucGFyc2UoJycsIHRyZWUpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZmlsZTogdGhpcy5maWxlLFxuICAgICAgY29tbWVudHM6IENvbW1lbnRQYXJzZXIucGFyc2UodHJlZS5yb290Tm9kZSwgdGhpcy5maWxlLnRleHQpXG4gICAgICAgIC5maWx0ZXIodGhpcy5maWx0ZXJUeXBlKVxuICAgICAgICAvLyAubWFwKHRoaXMuY2hlY2tUeXBlKVxuICAgICAgICAubWFwKHRoaXMucGFyc2VDaGlsZHJlbilcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZpbHRlclR5cGUgPSAoY29tbWVudDogSUNvbW1lbnQpOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gKHRoaXMub3B0aW9ucy5maWx0ZXIgfHxcbiAgICAgIFtcbiAgICAgICAgJ2Z1bmN0aW9uJyxcbiAgICAgICAgJ2NsYXNzJyxcbiAgICAgICAgJ3ZhcmlhYmxlX2RlY2xhcmF0aW9uJ1xuICAgICAgXSkuaW5jbHVkZXMoY29tbWVudC5jb250ZXh0LnR5cGUpXG4gIH1cblxuICBwcml2YXRlIGNoZWNrVHlwZSA9IChjb21tZW50OiBJQ29tbWVudCk6IElDb21tZW50ID0+IHtcbiAgICBjb25zdCB0cmVlID0gdGhpcy5wYXJzZXIucGFyc2UoY29tbWVudC5jb250ZXh0LnRleHQpO1xuICAgIHN3aXRjaCAoY29tbWVudC5jb250ZXh0LnR5cGUpIHtcbiAgICAgIGNhc2UgJ3ZhcmlhYmxlX2RlY2xhcmF0aW9uJzpcbiAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB3ZSBoYXZlIGFuIGFub255bW91cyBjbGFzc1xuICAgICAgICBpZiAoY29tbWVudC5jb250ZXh0LnRleHQuaW5jbHVkZXMoXCJjbGFzc1wiKSkge1xuICAgICAgICAgIC8vIERyaWxsIGRvd24gdW50aWwgd2UgZmluZCB0aGUgY2xhc3MgYm9keVxuICAgICAgICAgIGNvbnN0IHZhcmlhYmxlX2RlY2xhcmF0b3IgPSB0cmVlLnJvb3ROb2RlLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzFdO1xuICAgICAgICAgIGNvbnN0IGFub255bW91c19jbGFzcyA9IHZhcmlhYmxlX2RlY2xhcmF0b3IuY2hpbGRyZW5cbiAgICAgICAgICAgIC5maWx0ZXIobm9kZSA9PiBub2RlLnR5cGUgPT09IFwiYW5vbnltb3VzX2NsYXNzXCIpWzBdXG4gICAgICAgICAgY29uc3QgY2xhc3NfYm9keSA9IGFub255bW91c19jbGFzcy5jaGlsZHJlblsxXTtcbiAgICAgICAgICBjb21tZW50LmNvbnRleHQuY2hpbGRyZW4gPSBDb21tZW50UGFyc2VyLnBhcnNlKFxuICAgICAgICAgICAgY2xhc3NfYm9keSxcbiAgICAgICAgICAgIGNvbW1lbnQuY29udGV4dC50ZXh0LFxuICAgICAgICAgICAgeyBsb2NhdGlvbjogY29tbWVudC5jb250ZXh0LmxvY2F0aW9uLCBwb3NpdGlvbjogY29tbWVudC5jb250ZXh0LnBvc2l0aW9uIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBjb21tZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUNoaWxkcmVuID0gKGNvbW1lbnQ6IElDb21tZW50KTogSUNvbW1lbnQgPT4ge1xuICAgIHN3aXRjaCAoY29tbWVudC5jb250ZXh0LnR5cGUpIHtcbiAgICAgIGNhc2UgJ2NsYXNzJzpcbiAgICAgICAgY29uc3QgdHJlZSA9IHRoaXMucGFyc2VyLnBhcnNlKGNvbW1lbnQuY29udGV4dC50ZXh0KTtcbiAgICAgICAgY29tbWVudC5jb250ZXh0LmNoaWxkcmVuID0gQ29tbWVudFBhcnNlci5wYXJzZShcbiAgICAgICAgICB0cmVlLnJvb3ROb2RlLFxuICAgICAgICAgIGNvbW1lbnQuY29udGV4dC50ZXh0LFxuICAgICAgICAgIHsgbG9jYXRpb246IGNvbW1lbnQuY29udGV4dC5sb2NhdGlvbiwgcG9zaXRpb246IGNvbW1lbnQuY29udGV4dC5wb3NpdGlvbiB9XG4gICAgICAgICkuZmlsdGVyKGNoaWxkID0+IGNoaWxkLmNvbnRleHQudHlwZSA9PT0gJ21ldGhvZF9kZWZpbml0aW9uJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBjb21tZW50O1xuICB9XG59Il19 \ No newline at end of file diff --git a/build/src/lang/typescript/index.d.ts b/build/src/lang/typescript/index.d.ts new file mode 100644 index 0000000..57938ad --- /dev/null +++ b/build/src/lang/typescript/index.d.ts @@ -0,0 +1,23 @@ +import IParser from '../../interfaces/IParser'; +import IFile from '../../interfaces/IFile'; +import IResult from '../../interfaces/IResult'; +/** + * A class that parses JavaScript comments. + * + * # API + * + * ``` + * @class JavaScriptParser + * @implements IParser + * @export default + * ``` + */ +export default class TypeScriptParser implements IParser { + private file; + private options; + private parser; + constructor(file: IFile, options: any); + parse: () => IResult; + private filterType; + private parseChildren; +} diff --git a/build/src/lang/typescript/index.js b/build/src/lang/typescript/index.js new file mode 100644 index 0000000..c1e3b1f --- /dev/null +++ b/build/src/lang/typescript/index.js @@ -0,0 +1,73 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const Parser = require("tree-sitter"); +const TypeScript = require("tree-sitter-javascript"); +const CommentParser_1 = require("../../CommentParser"); +/** + * A class that parses JavaScript comments. + * + * # API + * + * ``` + * @class JavaScriptParser + * @implements IParser + * @export default + * ``` + */ +class TypeScriptParser { + constructor(file, options) { + this.parse = () => { + let tree = this.parser.parse(this.file.text); + // Get the first comment + let first_comment = tree.rootNode.children + .filter(node => node.type === "comment")[0]; + const first_comment_string = this.file.text + .substring(first_comment.startIndex, first_comment.endIndex); + // Remove any legal or unncessary comments + if (first_comment_string.includes("copyright") || + first_comment_string.includes("author") || + first_comment_string.includes("terms and conditions")) { + tree.edit({ + startIndex: first_comment.startIndex, + oldEndIndex: first_comment.endIndex, + newEndIndex: first_comment.endIndex, + startPosition: { row: 0, column: 0 }, + oldEndPosition: { row: 0, column: 0 }, + newEndPosition: { row: 0, column: 0 }, + }); + tree = this.parser.parse('', tree); + } + return { + file: this.file, + comments: CommentParser_1.default.parse(tree.rootNode, this.file.text) + .filter(this.filterType) + .map(this.parseChildren) + }; + }; + this.filterType = (comment) => { + return (this.options.filter || + [ + 'function', + 'class', + 'variable_declaration' + ]).includes(comment.context.type); + }; + this.parseChildren = (comment) => { + switch (comment.context.type) { + case 'class': + const tree = this.parser.parse(comment.context.text); + comment.context.children = CommentParser_1.default.parse(tree.rootNode, comment.context.text, { location: comment.context.location, position: comment.context.position }).filter(child => child.context.type === 'method_definition'); + break; + default: + break; + } + return comment; + }; + this.file = file; + Object.assign(this.options = {}, options || {}); + this.parser = new Parser(); + this.parser.setLanguage(TypeScript); + } +} +exports.default = TypeScriptParser; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy90eXBlc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNDO0FBQ3RDLHFEQUFxRDtBQUlyRCx1REFBZ0Q7QUFHaEQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQXFCLGdCQUFnQjtJQUluQyxZQUFZLElBQVcsRUFBRSxPQUFZO1FBTXJDLFVBQUssR0FBRyxHQUFZLEVBQUU7WUFDcEIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3Qyx3QkFBd0I7WUFDeEIsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRO2lCQUN2QyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO2lCQUMxQyxTQUFTLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFN0QsMENBQTBDO1lBQzFDLElBQUksb0JBQW9CLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztnQkFDNUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztnQkFDdkMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDLEVBQUU7Z0JBQ3ZELElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQ1IsVUFBVSxFQUFFLGFBQWEsQ0FBQyxVQUFVO29CQUNwQyxXQUFXLEVBQUUsYUFBYSxDQUFDLFFBQVE7b0JBQ25DLFdBQVcsRUFBRSxhQUFhLENBQUMsUUFBUTtvQkFDbkMsYUFBYSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFO29CQUNwQyxjQUFjLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUU7b0JBQ3JDLGNBQWMsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRTtpQkFDdEMsQ0FBQyxDQUFDO2dCQUNILElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDcEM7WUFDRCxPQUFPO2dCQUNMLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtnQkFDZixRQUFRLEVBQUUsdUJBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztxQkFDekQsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7cUJBQ3ZCLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO2FBQzNCLENBQUE7UUFDSCxDQUFDLENBQUE7UUFFTyxlQUFVLEdBQUcsQ0FBQyxPQUFpQixFQUFXLEVBQUU7WUFDbEQsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTTtnQkFDekI7b0JBQ0UsVUFBVTtvQkFDVixPQUFPO29CQUNQLHNCQUFzQjtpQkFDdkIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3JDLENBQUMsQ0FBQTtRQUVPLGtCQUFhLEdBQUcsQ0FBQyxPQUFpQixFQUFZLEVBQUU7WUFDdEQsUUFBUSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRTtnQkFDNUIsS0FBSyxPQUFPO29CQUNWLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3JELE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxHQUFHLHVCQUFhLENBQUMsS0FBSyxDQUM1QyxJQUFJLENBQUMsUUFBUSxFQUNiLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUNwQixFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FDM0UsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxDQUFDO29CQUM5RCxNQUFNO2dCQUNSO29CQUNFLE1BQU07YUFDVDtZQUNELE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUMsQ0FBQTtRQTFEQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdEMsQ0FBQztDQXVERjtBQWhFRCxtQ0FnRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBQYXJzZXIgZnJvbSAndHJlZS1zaXR0ZXInO1xuaW1wb3J0ICogYXMgVHlwZVNjcmlwdCBmcm9tICd0cmVlLXNpdHRlci1qYXZhc2NyaXB0JztcbmltcG9ydCBJUGFyc2VyIGZyb20gJy4uLy4uL2ludGVyZmFjZXMvSVBhcnNlcic7XG5pbXBvcnQgSUZpbGUgZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9JRmlsZSc7XG5pbXBvcnQgSVJlc3VsdCBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lSZXN1bHQnO1xuaW1wb3J0IENvbW1lbnRQYXJzZXIgZnJvbSAnLi4vLi4vQ29tbWVudFBhcnNlcic7XG5pbXBvcnQgSUNvbW1lbnQgZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9JQ29tbWVudCc7XG5cbi8qKlxuICogQSBjbGFzcyB0aGF0IHBhcnNlcyBKYXZhU2NyaXB0IGNvbW1lbnRzLlxuICogXG4gKiAjIEFQSVxuICogXG4gKiBgYGBcbiAqIEBjbGFzcyBKYXZhU2NyaXB0UGFyc2VyXG4gKiBAaW1wbGVtZW50cyBJUGFyc2VyXG4gKiBAZXhwb3J0IGRlZmF1bHRcbiAqIGBgYFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUeXBlU2NyaXB0UGFyc2VyIGltcGxlbWVudHMgSVBhcnNlciB7XG4gIHByaXZhdGUgZmlsZTogSUZpbGU7XG4gIHByaXZhdGUgb3B0aW9uczogYW55O1xuICBwcml2YXRlIHBhcnNlcjogUGFyc2VyO1xuICBjb25zdHJ1Y3RvcihmaWxlOiBJRmlsZSwgb3B0aW9uczogYW55KSB7XG4gICAgdGhpcy5maWxlID0gZmlsZTtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucyA9IHt9LCBvcHRpb25zIHx8IHt9KTtcbiAgICB0aGlzLnBhcnNlciA9IG5ldyBQYXJzZXIoKTtcbiAgICB0aGlzLnBhcnNlci5zZXRMYW5ndWFnZShUeXBlU2NyaXB0KTtcbiAgfVxuICBwYXJzZSA9ICgpOiBJUmVzdWx0ID0+IHtcbiAgICBsZXQgdHJlZSA9IHRoaXMucGFyc2VyLnBhcnNlKHRoaXMuZmlsZS50ZXh0KTtcbiAgICAvLyBHZXQgdGhlIGZpcnN0IGNvbW1lbnRcbiAgICBsZXQgZmlyc3RfY29tbWVudCA9IHRyZWUucm9vdE5vZGUuY2hpbGRyZW5cbiAgICAgIC5maWx0ZXIobm9kZSA9PiBub2RlLnR5cGUgPT09IFwiY29tbWVudFwiKVswXTtcbiAgICBjb25zdCBmaXJzdF9jb21tZW50X3N0cmluZyA9IHRoaXMuZmlsZS50ZXh0XG4gICAgLnN1YnN0cmluZyhmaXJzdF9jb21tZW50LnN0YXJ0SW5kZXgsIGZpcnN0X2NvbW1lbnQuZW5kSW5kZXgpO1xuICAgIFxuICAgIC8vIFJlbW92ZSBhbnkgbGVnYWwgb3IgdW5uY2Vzc2FyeSBjb21tZW50c1xuICAgIGlmIChmaXJzdF9jb21tZW50X3N0cmluZy5pbmNsdWRlcyhcImNvcHlyaWdodFwiKSB8fFxuICAgICAgZmlyc3RfY29tbWVudF9zdHJpbmcuaW5jbHVkZXMoXCJhdXRob3JcIikgfHxcbiAgICAgIGZpcnN0X2NvbW1lbnRfc3RyaW5nLmluY2x1ZGVzKFwidGVybXMgYW5kIGNvbmRpdGlvbnNcIikpIHtcbiAgICAgIHRyZWUuZWRpdCh7XG4gICAgICAgIHN0YXJ0SW5kZXg6IGZpcnN0X2NvbW1lbnQuc3RhcnRJbmRleCxcbiAgICAgICAgb2xkRW5kSW5kZXg6IGZpcnN0X2NvbW1lbnQuZW5kSW5kZXgsXG4gICAgICAgIG5ld0VuZEluZGV4OiBmaXJzdF9jb21tZW50LmVuZEluZGV4LFxuICAgICAgICBzdGFydFBvc2l0aW9uOiB7IHJvdzogMCwgY29sdW1uOiAwIH0sXG4gICAgICAgIG9sZEVuZFBvc2l0aW9uOiB7IHJvdzogMCwgY29sdW1uOiAwIH0sXG4gICAgICAgIG5ld0VuZFBvc2l0aW9uOiB7IHJvdzogMCwgY29sdW1uOiAwIH0sXG4gICAgICB9KTtcbiAgICAgIHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZSgnJywgdHJlZSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBmaWxlOiB0aGlzLmZpbGUsXG4gICAgICBjb21tZW50czogQ29tbWVudFBhcnNlci5wYXJzZSh0cmVlLnJvb3ROb2RlLCB0aGlzLmZpbGUudGV4dClcbiAgICAgICAgLmZpbHRlcih0aGlzLmZpbHRlclR5cGUpXG4gICAgICAgIC5tYXAodGhpcy5wYXJzZUNoaWxkcmVuKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmlsdGVyVHlwZSA9IChjb21tZW50OiBJQ29tbWVudCk6IGJvb2xlYW4gPT4ge1xuICAgIHJldHVybiAodGhpcy5vcHRpb25zLmZpbHRlciB8fFxuICAgICAgW1xuICAgICAgICAnZnVuY3Rpb24nLFxuICAgICAgICAnY2xhc3MnLFxuICAgICAgICAndmFyaWFibGVfZGVjbGFyYXRpb24nXG4gICAgICBdKS5pbmNsdWRlcyhjb21tZW50LmNvbnRleHQudHlwZSlcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VDaGlsZHJlbiA9IChjb21tZW50OiBJQ29tbWVudCk6IElDb21tZW50ID0+IHtcbiAgICBzd2l0Y2ggKGNvbW1lbnQuY29udGV4dC50eXBlKSB7XG4gICAgICBjYXNlICdjbGFzcyc6XG4gICAgICAgIGNvbnN0IHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZShjb21tZW50LmNvbnRleHQudGV4dCk7XG4gICAgICAgIGNvbW1lbnQuY29udGV4dC5jaGlsZHJlbiA9IENvbW1lbnRQYXJzZXIucGFyc2UoXG4gICAgICAgICAgdHJlZS5yb290Tm9kZSxcbiAgICAgICAgICBjb21tZW50LmNvbnRleHQudGV4dCxcbiAgICAgICAgICB7IGxvY2F0aW9uOiBjb21tZW50LmNvbnRleHQubG9jYXRpb24sIHBvc2l0aW9uOiBjb21tZW50LmNvbnRleHQucG9zaXRpb24gfVxuICAgICAgICApLmZpbHRlcihjaGlsZCA9PiBjaGlsZC5jb250ZXh0LnR5cGUgPT09ICdtZXRob2RfZGVmaW5pdGlvbicpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gY29tbWVudDtcbiAgfVxufSJdfQ== \ No newline at end of file diff --git a/example.js b/example.js new file mode 100644 index 0000000..df4e3d1 --- /dev/null +++ b/example.js @@ -0,0 +1,7 @@ +/** + * @author + */ + + function b() { + + } \ No newline at end of file diff --git a/gulpfile.js b/gulpfile.js deleted file mode 100644 index 223a76f..0000000 --- a/gulpfile.js +++ /dev/null @@ -1,15 +0,0 @@ -const gulp = require('gulp'); -const mocha = require('gulp-mocha'); -const eslint = require('gulp-eslint'); - -// gulp.task('eslint', () => gulp -// .src(['**/*.js', '!node_modules/**']) -// .pipe(eslint()) -// .pipe(eslint.format()) -// .pipe(eslint.failAfterError())); - -gulp.task('mocha', () => gulp - .src('test/*.js', { read: false }) - .pipe(mocha())); - -gulp.task('default', ['mocha']); diff --git a/index.js b/index.js deleted file mode 100644 index f4b999d..0000000 --- a/index.js +++ /dev/null @@ -1,23 +0,0 @@ -'use strict'; -Object.defineProperty(exports, "__esModule", { value: true }); -const index_1 = require("./src/javascript/index"); -class Parser { - constructor(options) { - this.options = options; - } - /** - * @param file: IFile - * @return IParseResult - */ - parse(file) { - switch (this.options.language) { - case 'js': - case 'javascript': - return (new index_1.default().parse(file)); - default: - return { type: '', file: { name: '', source: '' }, comments: [] }; - } - } -} -exports.default = Parser; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/index.js.map b/index.js.map deleted file mode 100644 index d4676ee..0000000 --- a/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AACb,kDAAgD;AAGhD;IAIE,YAAY,OAAY;QACtB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IACD;;;OAGG;IACH,KAAK,CAAC,IAAW;QACf,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC9B,KAAK,IAAI,CAAC;YACV,KAAK,YAAY;gBACf,MAAM,CAAC,CAAC,IAAI,eAAU,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACxC;gBACE,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QACtE,CAAC;IACH,CAAC;CACF;AApBD,yBAoBC"} \ No newline at end of file diff --git a/index.ts b/index.ts index 3d349c5..c93adb7 100644 --- a/index.ts +++ b/index.ts @@ -1,27 +1,37 @@ -'use strict'; -import JavaScript from './src/javascript/index'; -import { IParser, IParseResult, IFile } from './src/interface'; +import IFile from './src/interfaces/IFile'; +import IResult from './src/interfaces/IResult'; +import ParserFactory from './src/ParserFactory'; +import IParser from './src/interfaces/IParser'; +import * as FS from 'fs'; +/** + * A class that parses a source code and generates + * + * # API + * + * ``` + * @class Parser + * @implements IParser + * ``` + */ export default class Parser implements IParser { - private options: { - language: string, - } - constructor(options: any) { - this.options = options; + + private parser: IParser; + constructor(file: IFile, options: any = {}) { + this.parser = (new ParserFactory(file, options)).getParser(); } - /** - * @param file: IFile - * @return IParseResult - */ - parse(file: IFile): IParseResult { - switch (this.options.language) { - case 'js': - case 'javascript': - return (new JavaScript().parse(file)); - default: - return { type: '', file: { name: '', source: '' }, comments: [] }; - } + parse = (): IResult => { + return this.parser.parse() } } -export * from './src/interface'; \ No newline at end of file +const result = new Parser({ + name: 'index.ts', + path: '../../', + text: FS.readFileSync(`${process.cwd()}/index.ts`, 'utf-8') +}, { + language: 'typescript' +}).parse(); + + +// console.log(JSON.stringify(result, null, 2)) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 3d58d28..7c96a18 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,149 +5,72 @@ "requires": true, "dependencies": { "@types/babel-core": { - "version": "6.25.3", - "resolved": "https://registry.npmjs.org/@types/babel-core/-/babel-core-6.25.3.tgz", - "integrity": "sha512-OlUjfM+Qv+XwcaucEiekBIhfAYe4q4ruvQZZcCkOtQZ27Hykxm1LLY2s0mE6LtP9XQt6x+TUvS70KW2e8Mz0ZA==", + "version": "6.25.5", + "resolved": "https://registry.npmjs.org/@types/babel-core/-/babel-core-6.25.5.tgz", + "integrity": "sha512-pecvyMrc46zY0AFYXVZWNmm/gekr7f32OBYCd9baOiIpOTFtNN0ormeWpJaG7p+MEzncUvNtJdYql94dZYZGsw==", "requires": { - "@types/babel-generator": "6.25.1", - "@types/babel-template": "6.25.0", - "@types/babel-traverse": "6.25.3", - "@types/babel-types": "7.0.0", - "@types/babylon": "6.16.2" + "@types/babel-generator": "*", + "@types/babel-template": "*", + "@types/babel-traverse": "*", + "@types/babel-types": "*", + "@types/babylon": "*" } }, "@types/babel-generator": { - "version": "6.25.1", - "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz", - "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==", + "version": "6.25.2", + "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.2.tgz", + "integrity": "sha512-W7PQkeDlYOqJblfNeqZARwj4W8nO+ZhQQZksU8+wbaKuHeUdIVUAdREO/Qb0FfNr3CY5Sq1gNtqsyFeZfS3iSw==", "requires": { - "@types/babel-types": "7.0.0" + "@types/babel-types": "*" } }, "@types/babel-template": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/@types/babel-template/-/babel-template-6.25.0.tgz", - "integrity": "sha512-TtyfVlrprX92xSuKa8D//7vFz5kBJODBw5IQ1hQXehqO+me26vt1fyNxOZyXhUq2a7jRyT72V8p68IyH4NEZNA==", + "version": "6.25.1", + "resolved": "https://registry.npmjs.org/@types/babel-template/-/babel-template-6.25.1.tgz", + "integrity": "sha512-teJYxh35PbBaf9OY6YwLSQ7pRiWRnHCHmlqwfVSfexOsqHUf6hpNZ4FG9PfgnpBM1VRzRJVQF3SqqOtkcNrBZQ==", "requires": { - "@types/babel-types": "7.0.0", - "@types/babylon": "6.16.2" + "@types/babel-types": "*", + "@types/babylon": "*" } }, "@types/babel-traverse": { - "version": "6.25.3", - "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz", - "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==", + "version": "6.25.4", + "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.4.tgz", + "integrity": "sha512-+/670NaZE7qPvdh8EtGds32/2uHFKE5JeS+7ePH6nGwF8Wj8r671/RkTiJQP2k22nFntWEb9xQ11MFj7xEqI0g==", "requires": { - "@types/babel-types": "7.0.0" + "@types/babel-types": "*" } }, "@types/babel-types": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.0.tgz", - "integrity": "sha512-PyWcbX0W4r4GcgXLI0Vu4jyJ/Erueo3PwjgvQcOmWAOBW0ObhzBBciEX+sHvjkNE0umI6nqD192FDKvYZTL91A==" + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.4.tgz", + "integrity": "sha512-WiZhq3SVJHFRgRYLXvpf65XnV6ipVHhnNaNvE8yCimejrGglkg38kEj0JcizqwSHxmPSjcTlig/6JouxLGEhGw==" }, "@types/babylon": { - "version": "6.16.2", - "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz", - "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==", + "version": "6.16.3", + "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.3.tgz", + "integrity": "sha512-lyJ8sW1PbY3uwuvpOBZ9zMYKshMnQpXmeDHh8dj9j2nJm/xrW0FgB5gLSYOArj5X0IfaXnmhFoJnhS4KbqIMug==", "requires": { - "@types/babel-types": "7.0.0" + "@types/babel-types": "*" } }, "@types/lodash": { - "version": "4.14.91", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.91.tgz", - "integrity": "sha512-k+nc3moSlAaXacyvz4/c6D9lnUeI6AKsLvkXFuNzUEEqMw7sjDnLW2GqlJ4nyFgMX/p+QzvVG6zRoDo4lJIV5g==" + "version": "4.14.116", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.116.tgz", + "integrity": "sha512-lRnAtKnxMXcYYXqOiotTmJd74uawNWuPnsnPrrO7HiFuE3npE2iQhfABatbYDyxTNqZNuXzcKGhw37R7RjBFLg==" }, "@types/mocha": { - "version": "2.2.45", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.45.tgz", - "integrity": "sha512-tE1SYtNG3I3atRVPELSGN2FJJJtPg3O/G0tycYSyzeDqdAbdLPRH089LhpWYA5M/iHeWHkVZq/b0OVKngcK0Eg==", - "dev": true, - "requires": { - "@types/node": "8.5.5" - } - }, - "@types/node": { - "version": "8.5.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.5.5.tgz", - "integrity": "sha512-JRnfoh0Ll4ElmIXKxbUfcOodkGvcNHljct6mO1X9hE/mlrMzAx0hYCLAD7sgT53YAY1HdlpzUcV0CkmDqUqTuA==", - "dev": true - }, - "acorn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz", - "integrity": "sha512-Yej+zOJ1Dm/IMZzzj78OntP/r3zHEaKcyNoU2lAaxPtrseM6rF0xwqoz5Q5ysAiED9hTjI2hgtvLXitlCN1/Ug==", - "dev": true - }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, - "requires": { - "acorn": "3.3.0" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } - } - }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" - } - }, - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "version": "2.2.48", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", + "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==", "dev": true }, - "ansi-cyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", - "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-escapes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", + "@types/node": { + "version": "8.10.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.23.tgz", + "integrity": "sha512-aEp5ZTLr4mYhR9S85cJ+sEYkcsgFY10N1Si5m49iTAVzanZXOwp/pgw6ibFLKXxpflqm71aSWZCRtnTXXO56gA==", "dev": true }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -158,209 +81,94 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", - "dev": true, - "requires": { - "sprintf-js": "1.0.3" - } - }, - "aria-query": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-0.7.0.tgz", - "integrity": "sha512-/r2lHl09V3o74+2MLKEdewoj37YZqiQZnfen1O4iNlrOjUgeKuu1U2yF3iKh6HJxqF+OXkLMfQv65Z/cvxD6vA==", - "dev": true, - "requires": { - "ast-types-flow": "0.0.7" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true - }, - "array-includes": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", - "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", - "dev": true, - "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.10.0" - } + "antlr4ts": { + "version": "0.4.1-alpha.0", + "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.4.1-alpha.0.tgz", + "integrity": "sha1-rFcX8w8++jYXsATo/0+GC5x9TSA=" }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "requires": { - "array-uniq": "1.0.3" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true + "array-iterate": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.2.tgz", + "integrity": "sha512-1hWSHTIlG/8wtYD+PPX5AOBtKWngpDFjrsrHgZpe+JdgNGz0udYu6ZIkAa/xuenIUEqFv7DvE2Yr60jxweJSrQ==" }, "assertion-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", - "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", - "dev": true - }, - "atob": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz", - "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, - "axobject-query": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-0.1.0.tgz", - "integrity": "sha1-YvWdvFnJ+SQnWco0mWDnov48NsA=", - "dev": true, - "requires": { - "ast-types-flow": "0.0.7" - } - }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" } }, "babel-core": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", - "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.0", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.1", - "debug": "2.6.9", - "json5": "0.5.1", - "lodash": "4.17.4", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.8", - "slash": "1.0.0", - "source-map": "0.5.7" + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" } }, "babel-generator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", - "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", - "dev": true, + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.4", - "source-map": "0.5.7", - "trim-right": "1.0.1" + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" } }, "babel-helpers": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-messages": { @@ -368,22 +176,21 @@ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-register": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, "requires": { - "babel-core": "6.26.0", - "babel-runtime": "6.26.0", - "core-js": "2.5.3", - "home-or-tmp": "2.0.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" } }, "babel-runtime": { @@ -391,21 +198,20 @@ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { - "core-js": "2.5.3", - "regenerator-runtime": "0.11.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "babel-template": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.4" + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" } }, "babel-traverse": { @@ -413,15 +219,15 @@ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.2", - "lodash": "4.17.4" + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" } }, "babel-types": { @@ -429,10 +235,10 @@ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.4", - "to-fast-properties": "1.0.3" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" } }, "babylon": { @@ -440,105 +246,63 @@ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" }, + "bail": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.3.tgz", + "integrity": "sha512-1X8CnjFVQ+a+KW36uBNMTU5s8+v5FzeqrP7hTG5aTb4aPreSbZJlhwPon9VKMuEVgV++JM+SQrALY3kr7eswdg==" + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, + "bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.5", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.0", - "pascalcase": "0.1.1" + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" } }, - "beeper": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", - "dev": true - }, "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "braces": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.0.tgz", - "integrity": "sha512-P4O8UQRdGiMLWSizsApmXVQDBS6KCt7dSexgLKBmH5Hr1CZq7vsnscFh8oR1sP1ab1Zj0uCHCEzZeV6SfUf3rA==", - "dev": true, - "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "define-property": "1.0.0", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.2", - "snapdragon": "0.8.1", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.1" - } - }, "browser-stdout": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", "dev": true }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.2.1", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.0", - "to-object-path": "0.3.0", - "union-value": "1.0.0", - "unset-value": "1.0.0" + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" } }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "0.2.0" - } + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" + }, + "ccount": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.3.tgz", + "integrity": "sha512-Jt9tIBkRc9POUof7QA/VwWd+58fKkEEfI+/t1/eOlxKM7ZhrczNzMFefge7Ai+39y1pR/pP6cI19guHy3FSLmw==" }, "chai": { "version": "4.1.2", @@ -546,12 +310,12 @@ "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", "dev": true, "requires": { - "assertion-error": "1.0.2", - "check-error": "1.0.2", - "deep-eql": "3.0.1", - "get-func-name": "2.0.0", - "pathval": "1.1.0", - "type-detect": "4.0.5" + "assertion-error": "^1.0.1", + "check-error": "^1.0.1", + "deep-eql": "^3.0.0", + "get-func-name": "^2.0.0", + "pathval": "^1.0.0", + "type-detect": "^4.0.0" } }, "chalk": { @@ -559,18 +323,32 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true + "character-entities": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.2.tgz", + "integrity": "sha512-sMoHX6/nBiy3KKfC78dnEalnpn0Az0oSNvqUWYTtYrhRI5iUIYsROU48G+E+kMFQzqXaJ8kHJZ85n7y6/PHgwQ==" + }, + "character-entities-html4": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.2.tgz", + "integrity": "sha512-sIrXwyna2+5b0eB9W149izTPJk/KkJTg6mEzDGibwBUkyH1SbDa+nf515Ppdi3MaH35lW0JFJDWeq9Luzes1Iw==" + }, + "character-entities-legacy": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.2.tgz", + "integrity": "sha512-9NB2VbXtXYWdXzqrvAHykE/f0QJxzaKIpZ5QzNZrrgQ7Iyxr2vnfS8fCBNVW9nUEZE0lo57nxKRqnzY/dKrwlA==" + }, + "character-reference-invalid": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.2.tgz", + "integrity": "sha512-7I/xceXfKyUJmSAn/jw8ve/9DyOP7XxufNYLI9Px7CmsKgEUaZLUTax6nZxGQtaoiZCjpu6cHPj20xC/vqRReQ==" }, "check-error": { "version": "1.0.2", @@ -578,154 +356,20 @@ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true - }, - "class-utils": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.5.tgz", - "integrity": "sha1-F+eTEDdQ+WJ7IXbqNM/RtWWQPIA=", - "dev": true, - "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "lazy-cache": "2.0.2", - "static-extend": "0.1.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "2.0.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "clone": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz", - "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=", - "dev": true - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" - } - }, - "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", - "requires": { - "color-name": "1.1.3" - } + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true + "collapse-white-space": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.4.tgz", + "integrity": "sha512-YfQ1tAUZm561vpYD+5eyWN8+UsceQbSrqqlc/6zDY2gtAE+uZLSdkkovhnGpmCThsvKBFakq4EdY/FF93E8XIw==" }, "commander": { "version": "2.11.0", @@ -733,98 +377,30 @@ "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", "dev": true }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "typedarray": "0.0.6" - } + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "convert-source-map": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", - "dev": true - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=" }, "core-js": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", - "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=" + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", - "dev": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - } - } - }, - "damerau-levenshtein": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz", - "integrity": "sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ=", - "dev": true - }, - "dargs": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-5.1.0.tgz", - "integrity": "sha1-7H6lDHhWTNNsnV7Bj2Yyn63ieCk=", - "dev": true - }, - "dateformat": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", - "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "debug": { "version": "2.6.9", @@ -834,11 +410,13 @@ "ms": "2.0.0" } }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "^1.0.0" + } }, "deep-eql": { "version": "3.0.1", @@ -846,273 +424,350 @@ "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, "requires": { - "type-detect": "4.0.5" + "type-detect": "^4.0.0" } }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "requires": { - "clone": "1.0.3" - } + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" }, - "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", - "dev": true, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.11" + "repeating": "^2.0.0" } }, - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, + "diff": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.2" + "once": "^1.4.0" } }, - "deprecated": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", - "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", - "dev": true + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "expand-template": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-1.1.1.tgz", + "integrity": "sha512-cebqLtV8KOZfw0UI8TEFWxtczxxC1jvyUvx6H4fyp1K1FN7A4Q+uggVUlOsI1K8AGU0rwOGqP8nCapdrw8CYQg==" + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, - "detect-file": { + "fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "requires": { - "repeating": "2.0.1" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } }, - "diff": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", "dev": true }, - "doctrine": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.2.tgz", - "integrity": "sha512-y0tm5Pq6ywp3qSTZ1vPgVdAnbDEoeoc5wlOHXoY1c4Wug/a7JvqHIl7BTvwodaHmejWkK/9dSb3sCYfyo/om8A==", + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "esutils": "2.0.2" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "dev": true, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + }, + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "requires": { - "readable-stream": "1.1.14" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } + "ansi-regex": "^2.0.0" } }, - "emoji-regex": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.5.1.tgz", - "integrity": "sha512-PAHp6TxrCy7MGMFidro8uikr+zlJJKJ/Q6mm2ExZ7HwkyR9lSVFfE3kt36qcwa24BQL7y0G9axycGjK1A/0uNQ==", + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", "dev": true }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "dev": true, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "requires": { - "iconv-lite": "0.4.19" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" } }, - "end-of-stream": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", - "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "1.3.3" - }, - "dependencies": { - "once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - } + "once": "^1.3.0", + "wrappy": "1" } }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "requires": { - "is-arrayish": "0.2.1" + "loose-envify": "^1.0.0" } }, - "es-abstract": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.10.0.tgz", - "integrity": "sha512-/uh/DhdqIOSkAWifU+8nG78vlQxdLckUdI/sPgy0VhuXi2qJ7T8czBmqIYtLQVpCIFYafChnsRsB5pyb1JdmCQ==", - "dev": true, + "is-alphabetical": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.2.tgz", + "integrity": "sha512-V0xN4BYezDHcBSKb1QHUFMlR4as/XEuCZBzMJUU4n7+Cbt33SmUnSol+pnXFvLxSHNq2CemUXNdaXV6Flg7+xg==" + }, + "is-alphanumeric": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz", + "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=" + }, + "is-alphanumerical": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.2.tgz", + "integrity": "sha512-pyfU/0kHdISIgslFfZN9nfY1Gk3MquQgUm1mJTjdkEPpkAKNWuBTSqFwewOpR7N351VkErCiyV71zX7mlQQqsg==", "requires": { - "es-to-primitive": "1.1.1", - "function-bind": "1.1.1", - "has": "1.0.1", - "is-callable": "1.1.3", - "is-regex": "1.0.4" + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" } }, - "es-to-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", - "dev": true, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-decimal": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.2.tgz", + "integrity": "sha512-TRzl7mOCchnhchN+f3ICUCzYvL9ul7R+TYOsZ8xia++knyZAJfv/uA1FvQXsAnYIl1T3B2X5E/J7Wb1QXiIBXg==" + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "requires": { - "is-callable": "1.1.3", - "is-date-object": "1.0.1", - "is-symbol": "1.0.1" + "number-is-nan": "^1.0.0" } }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-hexadecimal": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.2.tgz", + "integrity": "sha512-but/G3sapV3MNyqiDBLrOi4x8uCIw0RY3o/Vb5GT0sMFHrVV7731wFSVy41T5FO1og7G0gXLJh0MkgPRouko/A==" + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-whitespace-character": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.2.tgz", + "integrity": "sha512-SzM+T5GKUCtLhlHFKt2SDAX2RFzfS6joT91F2/WSi9LxgFdsnhfPK/UIA+JhRR2xuyLdrCys2PiFDrtn1fU5hQ==" + }, + "is-word-character": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.2.tgz", + "integrity": "sha512-T3FlsX8rCHAH8e7RE7PfOPZVFQlcV3XRF9eOOBQ1uf70OxO7CjjSOjeImMPCADBdYWcStAbVbYvJ1m2D3tb+EA==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + }, + "longest-streak": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.2.tgz", + "integrity": "sha512-TmYTeEYxiAmSVdpbnQDXGtvYOIRsCMg89CVZzwzc2o7GFL1CjoiRPjH5ec0NFAVlAx3fVof9dX/t6KKRAo2OWA==" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "markdown-escapes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.2.tgz", + "integrity": "sha512-lbRZ2mE3Q9RtLjxZBZ9+IMl68DKIXaVAhwvwn9pmjnPLS0h/6kyBMgNhqi1xFJ/2yv6cSyv0jbiZavZv93JkkA==" + }, + "markdown-table": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.2.tgz", + "integrity": "sha512-NcWuJFHDA8V3wkDgR/j4+gZx+YQwstPgfQDV8ndUeWWzta3dnDTBxpVzqS9lkmJAuV5YX35lmyojl6HO5JXAgw==" + }, + "mdast-util-compact": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.1.tgz", + "integrity": "sha1-zbX4TitqLTEU3zO9BdnLMuPECDo=", + "requires": { + "unist-util-modify-children": "^1.0.0", + "unist-util-visit": "^1.1.0" + } + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } }, - "eslint": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.14.0.tgz", - "integrity": "sha512-Ul6CSGRjKscEyg0X/EeNs7o2XdnbTEOD1OM8cTjmx85RPcBJQrEhZLevhuJZNAE/vS2iVl5Uhgiqf3h5uLMCJQ==", + "mocha": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", + "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", "dev": true, "requires": { - "ajv": "5.5.2", - "babel-code-frame": "6.26.0", - "chalk": "2.3.0", - "concat-stream": "1.6.0", - "cross-spawn": "5.1.0", + "browser-stdout": "1.3.0", + "commander": "2.11.0", "debug": "3.1.0", - "doctrine": "2.0.2", - "eslint-scope": "3.7.1", - "eslint-visitor-keys": "1.0.0", - "espree": "3.5.2", - "esquery": "1.0.0", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "functional-red-black-tree": "1.0.1", + "diff": "3.3.1", + "escape-string-regexp": "1.0.5", "glob": "7.1.2", - "globals": "11.1.0", - "ignore": "3.3.7", - "imurmurhash": "0.1.4", - "inquirer": "3.3.0", - "is-resolvable": "1.0.1", - "js-yaml": "3.10.0", - "json-stable-stringify-without-jsonify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.4", - "minimatch": "3.0.4", + "growl": "1.10.3", + "he": "1.1.1", "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "7.0.0", - "progress": "2.0.0", - "require-uncached": "1.0.3", - "semver": "5.4.1", - "strip-ansi": "4.0.0", - "strip-json-comments": "2.0.1", - "table": "4.0.2", - "text-table": "0.2.0" + "supports-color": "4.4.0" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - } - }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -1122,2232 +777,102 @@ "ms": "2.0.0" } }, - "globals": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.1.0.tgz", - "integrity": "sha512-uEuWt9mqTlPDwSqi+sHjD4nWU/1N+q0fiWI9T1mZpD2UENqX20CFD5T/ziLZvztPaBKl7ZylUi1q6Qfm7E2CiQ==", + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", "dev": true }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - }, "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "^2.0.0" } } } }, - "eslint-config-airbnb": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-16.1.0.tgz", - "integrity": "sha512-zLyOhVWhzB/jwbz7IPSbkUuj7X2ox4PHXTcZkEmDqTvd0baJmJyuxlFPDlZOE/Y5bC+HQRaEkT3FoHo9wIdRiw==", + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "nan": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==" + }, + "node-abi": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.4.3.tgz", + "integrity": "sha512-b656V5C0628gOOA2kwcpNA/bxdlqYF9FvxJ+qqVX0ctdXNVZpS8J6xEUYir3WAKc7U0BH/NRlSpNbGsy+azjeg==", "requires": { - "eslint-config-airbnb-base": "12.1.0" + "semver": "^5.4.1" } }, - "eslint-config-airbnb-base": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-12.1.0.tgz", - "integrity": "sha512-/vjm0Px5ZCpmJqnjIzcFb9TKZrKWz0gnuG/7Gfkt0Db1ELJR51xkZth+t14rYdqWgX836XbuxtArbIHlVhbLBA==", + "noop-logger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", + "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "requires": { - "eslint-restricted-globals": "0.1.1" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, - "eslint-import-resolver-node": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.1.tgz", - "integrity": "sha512-yUtXS15gIcij68NmXmP9Ni77AQuCN0itXbCc/jWd8C6/yKZaSNXicpC8cgvjnxVdmfsosIXrjpzFq7GcDryb6A==", - "dev": true, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "debug": "2.6.9", - "resolve": "1.5.0" + "wrappy": "1" } }, - "eslint-module-utils": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", - "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==", - "dev": true, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "parse-entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.1.2.tgz", + "integrity": "sha512-5N9lmQ7tmxfXf+hO3X6KRG6w7uYO/HL9fHalSySTdyn63C3WNvTM/1R8tn1u1larNcEbo3Slcy2bsVDQqvEpUg==", "requires": { - "debug": "2.6.9", - "pkg-dir": "1.0.0" + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" } }, - "eslint-plugin-import": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz", - "integrity": "sha512-Rf7dfKJxZ16QuTgVv1OYNxkZcsu/hULFnC+e+w0Gzi6jMC3guQoWQgxYxc54IDRinlb6/0v5z/PxxIKmVctN+g==", - "dev": true, - "requires": { - "builtin-modules": "1.1.1", - "contains-path": "0.1.0", - "debug": "2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "0.3.1", - "eslint-module-utils": "2.1.1", - "has": "1.0.1", - "lodash.cond": "4.5.2", - "minimatch": "3.0.4", - "read-pkg-up": "2.0.0" - }, - "dependencies": { - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" - } - } - } - }, - "eslint-plugin-jsx-a11y": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.0.3.tgz", - "integrity": "sha1-VFg9GuRCSDFi4EDhPMMYZUZRAOU=", - "dev": true, - "requires": { - "aria-query": "0.7.0", - "array-includes": "3.0.3", - "ast-types-flow": "0.0.7", - "axobject-query": "0.1.0", - "damerau-levenshtein": "1.0.4", - "emoji-regex": "6.5.1", - "jsx-ast-utils": "2.0.1" - } - }, - "eslint-plugin-react": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.5.1.tgz", - "integrity": "sha512-YGSjB9Qu6QbVTroUZi66pYky3DfoIPLdHQ/wmrBGyBRnwxQsBXAov9j2rpXt/55i8nyMv6IRWJv2s4d4YnduzQ==", - "dev": true, - "requires": { - "doctrine": "2.0.2", - "has": "1.0.1", - "jsx-ast-utils": "2.0.1", - "prop-types": "15.6.0" - } - }, - "eslint-restricted-globals": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz", - "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=" - }, - "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", - "dev": true, - "requires": { - "esrecurse": "4.2.0", - "estraverse": "4.2.0" - } - }, - "eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", - "dev": true - }, - "espree": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz", - "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==", - "dev": true, - "requires": { - "acorn": "5.3.0", - "acorn-jsx": "3.0.1" - } - }, - "esquery": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", - "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", - "dev": true, - "requires": { - "estraverse": "4.2.0" - } - }, - "esrecurse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", - "dev": true, - "requires": { - "estraverse": "4.2.0", - "object-assign": "4.1.1" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "execa": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", - "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", - "dev": true, - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.0", - "snapdragon": "0.8.1", - "to-regex": "3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "1.0.1" - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "external-editor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", - "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", - "dev": true, - "requires": { - "chardet": "0.4.2", - "iconv-lite": "0.4.19", - "tmp": "0.0.33" - } - }, - "extglob": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.3.tgz", - "integrity": "sha512-AyptZexgu7qppEPq59DtN/XJGZDrLcVxSHai+4hdgMMS9EpF4GBvygcWWApno8lL9qSjVpYt7Raao28qzJX1ww==", - "dev": true, - "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.0", - "snapdragon": "0.8.1", - "to-regex": "3.0.1" - } - }, - "fancy-log": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", - "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=", - "dev": true, - "requires": { - "ansi-gray": "0.1.1", - "color-support": "1.1.3", - "time-stamp": "1.1.0" - } - }, - "fast-deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fbjs": { - "version": "0.8.16", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", - "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", - "dev": true, - "requires": { - "core-js": "1.2.7", - "isomorphic-fetch": "2.2.1", - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "promise": "7.3.1", - "setimmediate": "1.0.5", - "ua-parser-js": "0.7.17" - }, - "dependencies": { - "core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", - "dev": true - } - } - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "requires": { - "flat-cache": "1.3.0", - "object-assign": "4.1.1" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" - } - }, - "find-index": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", - "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", - "dev": true - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "requires": { - "detect-file": "1.0.0", - "is-glob": "3.1.0", - "micromatch": "3.1.4", - "resolve-dir": "1.0.1" - }, - "dependencies": { - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "2.1.1" - } - } - } - }, - "fined": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", - "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", - "dev": true, - "requires": { - "expand-tilde": "2.0.2", - "is-plain-object": "2.0.4", - "object.defaults": "1.1.0", - "object.pick": "1.3.0", - "parse-filepath": "1.0.2" - } - }, - "first-chunk-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", - "dev": true - }, - "flagged-respawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz", - "integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c=", - "dev": true - }, - "flat-cache": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", - "dev": true, - "requires": { - "circular-json": "0.3.3", - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "1.0.2" - } - }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "0.2.2" - } - }, - "fs-extra": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", - "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", - "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "4.0.0", - "universalify": "0.1.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "gaze": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", - "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", - "dev": true, - "requires": { - "globule": "0.1.0" - } - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "glob-stream": { - "version": "3.1.18", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", - "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", - "dev": true, - "requires": { - "glob": "4.5.3", - "glob2base": "0.0.12", - "minimatch": "2.0.10", - "ordered-read-streams": "0.1.0", - "through2": "0.6.5", - "unique-stream": "1.0.0" - }, - "dependencies": { - "glob": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", - "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", - "dev": true, - "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "2.0.10", - "once": "1.4.0" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", - "dev": true, - "requires": { - "brace-expansion": "1.1.8" - } - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" - } - } - } - }, - "glob-watcher": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", - "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", - "dev": true, - "requires": { - "gaze": "0.5.2" - } - }, - "glob2base": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", - "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", - "dev": true, - "requires": { - "find-index": "0.1.1" - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "1.0.2", - "is-windows": "1.0.1", - "resolve-dir": "1.0.1" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "2.0.2", - "homedir-polyfill": "1.0.1", - "ini": "1.3.5", - "is-windows": "1.0.1", - "which": "1.3.0" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" - }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "globule": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", - "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", - "dev": true, - "requires": { - "glob": "3.1.21", - "lodash": "1.0.2", - "minimatch": "0.2.14" - }, - "dependencies": { - "glob": { - "version": "3.1.21", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", - "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", - "dev": true, - "requires": { - "graceful-fs": "1.2.3", - "inherits": "1.0.2", - "minimatch": "0.2.14" - } - }, - "graceful-fs": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", - "dev": true - }, - "inherits": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", - "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", - "dev": true - }, - "lodash": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", - "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", - "dev": true - }, - "minimatch": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", - "dev": true, - "requires": { - "lru-cache": "2.7.3", - "sigmund": "1.0.1" - } - } - } - }, - "glogg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", - "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", - "dev": true, - "requires": { - "sparkles": "1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" - }, - "growl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", - "dev": true - }, - "gulp": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", - "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", - "dev": true, - "requires": { - "archy": "1.0.0", - "chalk": "1.1.3", - "deprecated": "0.0.1", - "gulp-util": "3.0.8", - "interpret": "1.1.0", - "liftoff": "2.5.0", - "minimist": "1.2.0", - "orchestrator": "0.3.8", - "pretty-hrtime": "1.0.3", - "semver": "4.3.6", - "tildify": "1.2.0", - "v8flags": "2.1.1", - "vinyl-fs": "0.3.14" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", - "dev": true - } - } - }, - "gulp-eslint": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/gulp-eslint/-/gulp-eslint-4.0.0.tgz", - "integrity": "sha512-+qsePo04v1O3JshpNvww9+bOgZEJ6Cc2/w3mEktfKz0NL0zsh1SWzjyIL2FIM2zzy6IYQYv+j8REZORF8dKX4g==", - "dev": true, - "requires": { - "eslint": "4.14.0", - "gulp-util": "3.0.8" - } - }, - "gulp-mocha": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/gulp-mocha/-/gulp-mocha-5.0.0.tgz", - "integrity": "sha512-NIjXZLqqcw9DXIEBcfm0sP1AUDlUJJeaK9EGCH2s6lSwo5NK/cEat0Vm7XelOkxZnWl0O5Za+aM6E4jyxWxTlw==", - "dev": true, - "requires": { - "dargs": "5.1.0", - "execa": "0.8.0", - "mocha": "4.1.0", - "npm-run-path": "2.0.2", - "plugin-error": "0.1.2", - "through2": "2.0.3" - } - }, - "gulp-util": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", - "dev": true, - "requires": { - "array-differ": "1.0.0", - "array-uniq": "1.0.3", - "beeper": "1.1.1", - "chalk": "1.1.3", - "dateformat": "2.2.0", - "fancy-log": "1.3.2", - "gulplog": "1.0.0", - "has-gulplog": "0.1.0", - "lodash._reescape": "3.0.0", - "lodash._reevaluate": "3.0.0", - "lodash._reinterpolate": "3.0.0", - "lodash.template": "3.6.2", - "minimist": "1.2.0", - "multipipe": "0.1.2", - "object-assign": "3.0.0", - "replace-ext": "0.0.1", - "through2": "2.0.3", - "vinyl": "0.5.3" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "dev": true, - "requires": { - "clone": "1.0.3", - "clone-stats": "0.0.1", - "replace-ext": "0.0.1" - } - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "1.0.0" - } - }, - "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", - "dev": true, - "requires": { - "function-bind": "1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", - "dev": true, - "requires": { - "sparkles": "1.0.0" - } - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "dev": true, - "requires": { - "parse-passwd": "1.0.0" - } - }, - "hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true - }, - "ignore": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", - "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "dev": true, - "requires": { - "ansi-escapes": "3.0.0", - "chalk": "2.3.0", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.1.0", - "figures": "2.0.0", - "lodash": "4.17.4", - "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rx-lite": "4.0.8", - "rx-lite-aggregates": "4.0.8", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true - }, - "invariant": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", - "requires": { - "loose-envify": "1.3.1" - } - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "requires": { - "is-relative": "1.0.0", - "is-windows": "1.0.1" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "1.1.1" - } - }, - "is-callable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", - "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", - "dev": true - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-odd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-1.0.0.tgz", - "integrity": "sha1-O4qTLrAos3dcObsJ6RdnrM22kIg=", - "dev": true, - "requires": { - "is-number": "3.0.0" - } - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", - "dev": true, - "requires": { - "is-path-inside": "1.0.1" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "1.0.2" - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "3.0.1" - } - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, - "requires": { - "has": "1.0.1" - } - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "requires": { - "is-unc-path": "1.0.0" - } - }, - "is-resolvable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.1.tgz", - "integrity": "sha512-y5CXYbzvB3jTnWAZH1Nl7ykUWb6T3BcTs56HUruwBf8MhF56n1HWqhDWnVFo8GHrUPDgvUUNVhrc2U8W7iqz5g==", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", - "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", - "dev": true - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "requires": { - "unc-path-regex": "0.1.2" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-windows": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.1.tgz", - "integrity": "sha1-MQ23D3QtJZoWo2kgK1GvhCMzENk=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isomorphic-fetch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", - "dev": true, - "requires": { - "node-fetch": "1.7.3", - "whatwg-fetch": "2.0.3" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - }, - "js-yaml": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", - "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", - "dev": true, - "requires": { - "argparse": "1.0.9", - "esprima": "4.0.0" - }, - "dependencies": { - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", - "dev": true - } - } - }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "4.1.11" - } - }, - "jsx-ast-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", - "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", - "dev": true, - "requires": { - "array-includes": "3.0.3" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "dev": true, - "requires": { - "set-getter": "0.1.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" - } - }, - "liftoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", - "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", - "dev": true, - "requires": { - "extend": "3.0.1", - "findup-sync": "2.0.0", - "fined": "1.1.0", - "flagged-respawn": "1.0.0", - "is-plain-object": "2.0.4", - "object.map": "1.0.1", - "rechoir": "0.6.2", - "resolve": "1.5.0" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } - }, - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", - "dev": true - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", - "dev": true - }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", - "dev": true - }, - "lodash.cond": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", - "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", - "dev": true - }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "dev": true, - "requires": { - "lodash._root": "3.0.1" - } - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" - } - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "dev": true, - "requires": { - "lodash._basecopy": "3.0.1", - "lodash._basetostring": "3.0.1", - "lodash._basevalues": "3.0.0", - "lodash._isiterateecall": "3.0.9", - "lodash._reinterpolate": "3.0.0", - "lodash.escape": "3.2.0", - "lodash.keys": "3.1.2", - "lodash.restparam": "3.6.1", - "lodash.templatesettings": "3.1.1" - } - }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "dev": true, - "requires": { - "lodash._reinterpolate": "3.0.0", - "lodash.escape": "3.2.0" - } - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "requires": { - "js-tokens": "3.0.2" - } - }, - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", - "dev": true - }, - "make-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.0.tgz", - "integrity": "sha1-V7713IXSOSO6I3ZzJNjo+PPZaUs=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "1.0.1" - } - }, - "micromatch": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.4.tgz", - "integrity": "sha512-kFRtviKYoAJT+t7HggMl0tBFGNAKLw/S7N+CO9qfEQyisob1Oy4pao+geRbkyeEd+V9aOkvZ4mhuyPvI/q9Sfg==", - "dev": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.0", - "define-property": "1.0.0", - "extend-shallow": "2.0.1", - "extglob": "2.0.3", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.6", - "object.pick": "1.3.0", - "regex-not": "1.0.0", - "snapdragon": "0.8.1", - "to-regex": "3.0.1" - } - }, - "mimic-fn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "1.1.8" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mixin-deep": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.0.tgz", - "integrity": "sha512-dgaCvoh6i1nosAUBKb0l0pfJ78K8+S9fluyIR2YvAeUD/QuMahnFnF3xYty5eYXMjhGSsB0DsW6A0uAZyetoAg==", - "dev": true, - "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "mocha": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", - "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.11.0", - "debug": "3.1.0", - "diff": "3.3.1", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.3", - "he": "1.1.1", - "mkdirp": "0.5.1", - "supports-color": "4.4.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "mr-doc-utils": { - "version": "git+https://github.com/mr-doc/mr-doc-utils.git#1f4966dc55a647b2b21ea956cbc18396e8636661", - "requires": { - "chalk": "2.3.0", - "eslint-config-airbnb": "16.1.0", - "fs-extra": "5.0.0", - "lodash": "4.17.4", - "sparkles": "1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "dev": true, - "requires": { - "duplexer2": "0.0.2" - } - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "nanomatch": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.6.tgz", - "integrity": "sha512-WJ6XTCbvWXUFPbi/bDwKcYkCeOGUHzaJj72KbuPqGn78Ba/F5Vu26Zlo6SuMQbCIst1RGKL1zfWBCOGAlbRLAg==", - "dev": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "1.0.0", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "is-odd": "1.0.0", - "kind-of": "5.1.0", - "object.pick": "1.3.0", - "regex-not": "1.0.0", - "snapdragon": "0.8.1", - "to-regex": "3.0.1" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "natives": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.1.tgz", - "integrity": "sha512-8eRaxn8u/4wN8tGkhlc2cgwwvOLMLUMUn4IYTexMgWd+LyUDfeXVkk2ygQR0hvIHbJQXgHujia3ieUUDwNGkEA==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "dev": true, - "requires": { - "encoding": "0.1.12", - "is-stream": "1.1.0" - } - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.4.1", - "validate-npm-package-license": "3.0.1" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "2.0.1" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "object-keys": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "3.0.1" - } - }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "requires": { - "array-each": "1.0.1", - "array-slice": "1.1.0", - "for-own": "1.0.0", - "isobject": "3.0.1" - } - }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "dev": true, - "requires": { - "for-own": "1.0.0", - "make-iterator": "1.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "3.0.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "1.1.0" - } - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, - "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" - } - }, - "orchestrator": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", - "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", - "dev": true, - "requires": { - "end-of-stream": "0.1.5", - "sequencify": "0.0.7", - "stream-consume": "0.1.0" - } - }, - "ordered-read-streams": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", - "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", - "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", - "dev": true - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "1.1.0" - } - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dev": true, - "requires": { - "is-absolute": "1.0.0", - "map-cache": "0.2.2", - "path-root": "0.1.1" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "1.3.1" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "requires": { - "path-root-regex": "0.1.2" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "2.3.0" - } + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "pathval": { "version": "1.1.0", @@ -3355,210 +880,84 @@ "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", "dev": true }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "dev": true, - "requires": { - "find-up": "1.1.2" - } - }, - "plugin-error": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", - "dev": true, - "requires": { - "ansi-cyan": "0.1.1", - "ansi-red": "0.1.1", - "arr-diff": "1.1.0", - "arr-union": "2.1.0", - "extend-shallow": "1.1.4" + "prebuild-install": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.0.0.tgz", + "integrity": "sha512-AvcPLFqNz/hDd6o7qLj8i9xB479P9jSjA/p6m4927CRfY3tsmPfyFmD7RKXtdp6I2d1BAIVBgJoj5mxRJDZL4w==", + "requires": { + "detect-libc": "^1.0.3", + "expand-template": "^1.0.2", + "github-from-package": "0.0.0", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "node-abi": "^2.2.0", + "noop-logger": "^0.1.1", + "npmlog": "^4.0.1", + "os-homedir": "^1.0.1", + "pump": "^2.0.1", + "rc": "^1.2.7", + "simple-get": "^2.7.0", + "tar-fs": "^1.13.0", + "tunnel-agent": "^0.6.0", + "which-pm-runs": "^1.0.0" }, "dependencies": { - "arr-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "dev": true, - "requires": { - "arr-flatten": "1.1.0", - "array-slice": "0.2.3" - } - }, - "arr-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", - "dev": true - }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - }, - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "dev": true, - "requires": { - "kind-of": "1.1.0" - } - }, - "kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", - "dev": true + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", - "dev": true - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true - }, "private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" }, "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "progress": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", - "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", - "dev": true - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "requires": { - "asap": "2.0.6" - } - }, - "prop-types": { - "version": "15.6.0", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", - "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", - "dev": true, - "requires": { - "fbjs": "0.8.16", - "loose-envify": "1.3.1", - "object-assign": "4.1.1" - } - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { - "resolve": "1.5.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "regenerator-runtime": { @@ -3566,542 +965,162 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" }, - "regex-not": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.0.tgz", - "integrity": "sha1-Qvg+OXcWIt+CawKvF2Ul1qXxV/k=", - "dev": true, + "remark": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/remark/-/remark-9.0.0.tgz", + "integrity": "sha512-amw8rGdD5lHbMEakiEsllmkdBP+/KpjW/PRK6NSGPZKCQowh0BT4IWXDAkRMyG3SB9dKPXWMviFjNusXzXNn3A==", "requires": { - "extend-shallow": "2.0.1" + "remark-parse": "^5.0.0", + "remark-stringify": "^5.0.0", + "unified": "^6.0.0" } }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true + "remark-parse": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-5.0.0.tgz", + "integrity": "sha512-b3iXszZLH1TLoyUzrATcTQUZrwNl1rE70rVdSruJFlDaJ9z5aMkhrG43Pp68OgfHndL/ADz6V69Zow8cTQu+JA==", + "requires": { + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^1.1.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^1.0.0", + "vfile-location": "^2.0.0", + "xtend": "^4.0.1" + } + }, + "remark-stringify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-5.0.0.tgz", + "integrity": "sha512-Ws5MdA69ftqQ/yhRF9XhVV29mhxbfGhbz0Rx5bQH+oJcNhhSM6nCu1EpLod+DjrFGrU0BMPs+czVmJZU7xiS7w==", + "requires": { + "ccount": "^1.0.0", + "is-alphanumeric": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "longest-streak": "^2.0.1", + "markdown-escapes": "^1.0.0", + "markdown-table": "^1.1.0", + "mdast-util-compact": "^1.0.0", + "parse-entities": "^1.0.2", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "stringify-entities": "^1.0.1", + "unherit": "^1.0.4", + "xtend": "^4.0.1" + } }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, "repeating": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, "requires": { - "is-finite": "1.0.2" + "is-finite": "^1.0.0" } }, "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" - } - }, - "resolve": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", - "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", - "dev": true, - "requires": { - "path-parse": "1.0.5" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "2.0.2", - "global-modules": "1.0.0" - } - }, - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "2.1.0" - } - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, - "requires": { - "rx-lite": "4.0.8" - } + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" }, "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", - "dev": true - }, - "sequencify": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", - "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=", - "dev": true - }, - "set-getter": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", - "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", - "dev": true, - "requires": { - "to-object-path": "0.3.0" - } + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" }, - "set-value": { + "set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", - "dev": true + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0" - } - }, - "snapdragon": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.1.tgz", - "integrity": "sha1-4StUh/re0+PeoKyR6UAL91tAE3A=", - "dev": true, - "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.1", - "use": "2.0.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", - "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", - "dev": true, - "requires": { - "atob": "2.0.3", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" - } - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "0.5.7" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, - "sparkles": { + "simple-concat": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=" - }, - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "dev": true, - "requires": { - "spdx-license-ids": "1.2.2" - } - }, - "spdx-expression-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", - "dev": true - }, - "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "2.0.4" - } - } + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" + }, + "simple-get": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", + "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", + "requires": { + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" } }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } + "source-map": "^0.5.6" } }, - "stream-consume": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz", - "integrity": "sha1-pB6tGm1ggc63n2WwYZAbbY89HQ8=", - "dev": true + "state-toggle": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.1.tgz", + "integrity": "sha512-Qe8QntFrrpWTnHwvwj2FZTgv+PKIsp0B9VxLzLLbSpPXWOgRgc5LVj/aTiSfK1RqIeF9jeC1UeOH8Q8y60A7og==" }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "stringify-entities": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.2.tgz", + "integrity": "sha512-nrBAQClJAPN2p+uGCVJRPIPakKeKWZ9GtBCmormE7pWOSlHat7+x5A8gx85M7HM5Dt0BP3pP5RhVW77WdbJJ3A==", "requires": { - "safe-buffer": "5.1.1" + "character-entities-html4": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-hexadecimal": "^1.0.0" } }, "strip-ansi": { @@ -4109,605 +1128,254 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" }, - "table": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", - "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", - "dev": true, + "tar-fs": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", + "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", "requires": { - "ajv": "5.5.2", - "ajv-keywords": "2.1.1", - "chalk": "2.3.0", - "lodash": "4.17.4", - "slice-ansi": "1.0.0", - "string-width": "2.1.1" + "chownr": "^1.0.1", + "mkdirp": "^0.5.1", + "pump": "^1.0.0", + "tar-stream": "^1.1.2" }, "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, + "pump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", + "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", "requires": { - "has-flag": "2.0.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } } } }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "requires": { - "readable-stream": "2.3.3", - "xtend": "4.0.1" - } - }, - "tildify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", - "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", - "dev": true, + "tar-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz", + "integrity": "sha512-IFLM5wp3QrJODQFPm6/to3LJZrONdBY/otxcvDIQzu217zKye6yVR3hhi9lAjrC2Z+m/j5oDxMPb1qcd8cIvpA==", "requires": { - "os-homedir": "1.0.2" + "bl": "^1.0.0", + "buffer-alloc": "^1.1.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.0", + "xtend": "^4.0.0" } }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "1.0.2" - } + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" }, "to-fast-properties": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, + "tree-sitter": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.13.5.tgz", + "integrity": "sha512-g3/V7jNzW/tHKAhj2RLs9JBPYlh4yyk6byqcJfR/P/D8EaWpNfijqW3Uaj+b2sMe6EBqGD1y4cQRt3UuCFvgBQ==", "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } + "nan": "^2.10.0", + "prebuild-install": "^5.0.0" } }, - "to-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.1.tgz", - "integrity": "sha1-FTWL7kosg712N3uh3ASdDxiDeq4=", - "dev": true, + "tree-sitter-javascript": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/tree-sitter-javascript/-/tree-sitter-javascript-0.13.3.tgz", + "integrity": "sha512-kwuLjPo2Shi8CvTAkhka2Z1Hq7VhWyexuG+lhj0qL9inWVN+qJVYQO37mSGuMszC7ThcK2RGlKM3f2nFc1Fi+w==", "requires": { - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "regex-not": "1.0.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } + "nan": "^2.4.0" } }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, + "tree-sitter-typescript": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/tree-sitter-typescript/-/tree-sitter-typescript-0.13.3.tgz", + "integrity": "sha512-PF/yDQNtjOU0pDHdy4QqYB8yPgfEeZz7PsG+IwYYC6xt3XQBRKJDIGyPPSHSvSZFE2ln4GBnJ7/EDneiNXqrlA==", "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" + "nan": "^2.10.0" } }, + "trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" + }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, + "trim-trailing-lines": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.1.tgz", + "integrity": "sha512-bWLv9BbWbbd7mlqqs2oQYnLD/U/ZqeJeJwbO0FG2zA1aTq+HTvxfHNKFa/HGCVyJpDiioUYaBhfiT6rgk+l4mg==" + }, + "trough": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.3.tgz", + "integrity": "sha512-fwkLWH+DimvA4YCy+/nvJd61nWQQ2liO/nF/RjkTpiOGi+zxZzVkhb1mvbHIIW4b/8nDsYI8uTmAlc0nNkRMOw==" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { - "prelude-ls": "1.1.2" + "safe-buffer": "^5.0.1" } }, "type-detect": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.5.tgz", - "integrity": "sha512-N9IvkQslUGYGC24RkJk1ba99foK6TkwC2FHAEBlQFBP0RxQZS8ZpJuAZcwiY/w9ZJHFQb1aOXBI60OdxhTrwEQ==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true + "unherit": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.1.tgz", + "integrity": "sha512-+XZuV691Cn4zHsK0vkKYwBEwB74T3IZIcxrgn2E4rKwTfFyI1zCh7X7grwh9Re08fdPlarIdyWgI8aVB3F5A5g==", + "requires": { + "inherits": "^2.0.1", + "xtend": "^4.0.1" + } }, - "ua-parser-js": { - "version": "0.7.17", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", - "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==", - "dev": true + "unified": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz", + "integrity": "sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==", + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^1.1.0", + "trough": "^1.0.0", + "vfile": "^2.0.0", + "x-is-string": "^0.1.0" + } }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true + "unist-util-is": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.2.tgz", + "integrity": "sha512-YkXBK/H9raAmG7KXck+UUpnKiNmUdB+aBGrknfQ4EreE1banuzrKABx3jP6Z5Z3fMSPMQQmeXBlKpCbMwBkxVw==" }, - "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "dev": true, + "unist-util-modify-children": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-1.1.2.tgz", + "integrity": "sha512-GRi04yhng1WqBf5RBzPkOtWAadcZS2gvuOgNn/cyJBYNxtTuyYqTKN0eg4rC1YJwGnzrqfRB3dSKm8cNCjNirg==", "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" - }, - "dependencies": { - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" - } - } + "array-iterate": "^1.0.0" } }, - "unique-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", - "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=", - "dev": true + "unist-util-remove-position": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.2.tgz", + "integrity": "sha512-XxoNOBvq1WXRKXxgnSYbtCF76TJrRoe5++pD4cCBsssSiWSnPEktyFrFLE8LTk3JW5mt9hB0Sk5zn4x/JeWY7Q==", + "requires": { + "unist-util-visit": "^1.1.0" + } }, - "universalify": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", - "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=" + "unist-util-stringify-position": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", + "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==" }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, + "unist-util-visit": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.0.tgz", + "integrity": "sha512-FiGu34ziNsZA3ZUteZxSFaczIjGmksfSgdKqBfOejrrfzyUy5b7YrlzT1Bcvi+djkYDituJDy2XB7tGTeBieKw==", "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } + "unist-util-visit-parents": "^2.0.0" } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "use": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/use/-/use-2.0.2.tgz", - "integrity": "sha1-riig1y+TvyJCKhii43mZMRLeyOg=", - "dev": true, + "unist-util-visit-parents": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.0.1.tgz", + "integrity": "sha512-6B0UTiMfdWql4cQ03gDTCSns+64Zkfo2OCbK31Ov0uMizEz+CJeAp0cgZVb5Fhmcd7Bct2iRNywejT0orpbqUA==", "requires": { - "define-property": "0.2.5", - "isobject": "3.0.1", - "lazy-cache": "2.0.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } + "unist-util-is": "^2.1.2" } }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "v8flags": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", - "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", - "dev": true, + "vfile": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz", + "integrity": "sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==", "requires": { - "user-home": "1.1.1" - }, - "dependencies": { - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true - } + "is-buffer": "^1.1.4", + "replace-ext": "1.0.0", + "unist-util-stringify-position": "^1.0.0", + "vfile-message": "^1.0.0" } }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true, - "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" - } + "vfile-location": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.3.tgz", + "integrity": "sha512-zM5/l4lfw1CBoPx3Jimxoc5RNDAHHpk6AM6LM0pTIkm5SUSsx8ZekZ0PVdf0WEZ7kjlhSt7ZlqbRL6Cd6dBs6A==" }, - "vinyl-fs": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", - "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", - "dev": true, + "vfile-message": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.0.1.tgz", + "integrity": "sha512-vSGCkhNvJzO6VcWC6AlJW4NtYOVtS+RgCaqFIYUjoGIlHnFL+i0LbtYvonDWOMcB97uTPT4PRsyYY7REWC9vug==", "requires": { - "defaults": "1.0.3", - "glob-stream": "3.1.18", - "glob-watcher": "0.0.6", - "graceful-fs": "3.0.11", - "mkdirp": "0.5.1", - "strip-bom": "1.0.0", - "through2": "0.6.5", - "vinyl": "0.4.6" - }, - "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true - }, - "graceful-fs": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", - "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", - "dev": true, - "requires": { - "natives": "1.1.1" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "strip-bom": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", - "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", - "dev": true, - "requires": { - "first-chunk-stream": "1.0.0", - "is-utf8": "0.2.1" - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" - } - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true, - "requires": { - "clone": "0.2.0", - "clone-stats": "0.0.1" - } - } + "unist-util-stringify-position": "^1.1.1" } }, - "whatwg-fetch": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", - "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=", - "dev": true + "which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" }, - "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "requires": { - "isexe": "2.0.0" + "string-width": "^1.0.2 || 2" } }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, + "x-is-string": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", + "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=" + }, + "xdoc-parser": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/xdoc-parser/-/xdoc-parser-2.1.6.tgz", + "integrity": "sha512-PqkQeiyf/E0NjwDq0RCu75o2bKG9mJbe0OGOGRsVTtrnK3cdrMkZd2jvj5WDnZumpnd7IXEj4iTlQDvUoe+vgA==", "requires": { - "mkdirp": "0.5.1" + "antlr4ts": "^0.4.1-alpha.0", + "lodash": "^4.17.10", + "remark": "^9.0.0" } }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" } } } diff --git a/package.json b/package.json index d1d0b0a..b528974 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "mr-doc-parser", "version": "1.0.0", "description": "The official parser for Mr. Doc", - "main": "index.js", + "main": "./build/index.js", "scripts": { "test": "gulp" }, @@ -17,27 +17,21 @@ }, "homepage": "https://github.com/mr-doc/parser#readme", "devDependencies": { - "@types/mocha": "^2.2.45", - "@types/node": "^8.5.5", + "@types/mocha": "^2.2.48", + "@types/node": "^8.10.23", "chai": "^4.1.2", - "eslint": "^4.14.0", - "eslint-config-airbnb": "^16.1.0", - "eslint-plugin-import": "^2.2.0", - "eslint-plugin-jsx-a11y": "^6.0.3", - "eslint-plugin-react": "^7.5.1", - "gulp": "^3.9.1", - "gulp-eslint": "^4.0.0", - "gulp-mocha": "^5.0.0", - "mocha": "^4.1.0", - "mr-doc-utils": "git+https://github.com/mr-doc/mr-doc-utils.git" + "mocha": "^4.1.0" }, "dependencies": { - "@types/babel-core": "^6.25.3", - "@types/lodash": "^4.14.91", + "@types/babel-core": "^6.25.5", + "@types/lodash": "^4.14.116", + "babel-core": "^6.26.3", "babel-traverse": "^6.7.6", - "babel-core": "^6.24.1", "babylon": "^6.7.0", - "lodash": "^4.11.1", - "mr-doc-utils": "git+https://github.com/mr-doc/mr-doc-utils.git" + "lodash": "^4.17.10", + "tree-sitter": "^0.13.4", + "tree-sitter-javascript": "^0.13.3", + "tree-sitter-typescript": "^0.13.3", + "xdoc-parser": "^2.1.6" } } diff --git a/src/CommentParser.ts b/src/CommentParser.ts new file mode 100644 index 0000000..37b86c2 --- /dev/null +++ b/src/CommentParser.ts @@ -0,0 +1,95 @@ +import IComment from "./interfaces/IComment"; +import * as Parser from 'tree-sitter'; +import xdoc from 'xdoc-parser'; +import { Location, Position } from './interfaces/IComment'; + +/** + * Creates a position object. + * @param node: Parser.SyntaxNode + * @param offset: { + * location: Location, + * position: Position + * } + */ +function position( + node: Parser.SyntaxNode, + offset?: { location: Location, position: Position } +) { + return { + start: offset ? offset.position.start + node.startIndex : node.startIndex, + end: offset ? offset.position.end + node.endIndex : node.endIndex + } +} + +/** + * Creates a location object. + * @param node: Parser.SyntaxNode + * @param offset: { + * location: Location, + * position: Position + * } + * @return: { + * start: { + * row: number, + * column: number + * }, + * end: { + * row: number, + * column: number + * } + * } + */ +function location( + node: Parser.SyntaxNode, + offset: { location: Location, position: Position } +) { + return { + start: { + row: offset ? offset.location.start.row + node.startPosition.row : node.startPosition.row, + column: offset ? offset.location.start.column + node.startPosition.column : node.startPosition.column + }, + end: { + row: offset ? offset.location.end.row + node.endPosition.row : node.endPosition.row, + column: offset ? offset.location.end.column + node.endPosition.column : node.endPosition.column + } + } +} + +export default class CommentParser { + static parse( + node: Parser.SyntaxNode, + source: string, + offset?: { location: Location, position: Position }, + comments: IComment[] = [], + ) { + // console.log(node.type) + if (node.type === "comment" && node.nextSibling) { + console.log(node.nextSibling.type) + // console.log(`${node.nextSibling.type} has a leading comment.`); + const next = node.nextSibling; + + // console.log(source.substring(next.startIndex, next.endIndex)); + // console.log(''); + comments.push({ + position: position(node, offset), + location: location(node, offset), + markdown: (xdoc(source.substring(node.startIndex, node.endIndex), { + visitor: { + showNodeText: true + } + })).parse(), + text: source.substring(node.startIndex, node.endIndex), + context: { + position: position(next, offset), + location: location(next, offset), + text: source.substring(next.startIndex, next.endIndex), + type: next.type, + children: [] + } + }); + } + + node.children.forEach(child => CommentParser.parse(child, source, offset, comments)); + return comments; + } +} \ No newline at end of file diff --git a/src/ParserFactory.ts b/src/ParserFactory.ts new file mode 100644 index 0000000..dc9aaa6 --- /dev/null +++ b/src/ParserFactory.ts @@ -0,0 +1,31 @@ +import IFile from "./interfaces/IFile"; +import IParser from "./interfaces/IParser"; +import JavaScriptParser from "./lang/javascript"; +import TypeScriptParser from './lang/typescript'; + +export default class ParserFactory { + private file: IFile + private options = { + language: 'JavaScript' + } + constructor(file: IFile, options: any = {}) { + this.file = file; + Object.assign(this.options, options) + } + + getParser = (): IParser => { + switch (this.options.language.toLowerCase()) { + case 'js': + case 'javascript': + return new JavaScriptParser(this.file, this.options); + break; + case 'ts': + case 'typescript': + return new TypeScriptParser(this.file, this.options); + default: + console.log(`[mr-doc]: No parser for ${this.options.language} exists.`) + break; + } + } + +} \ No newline at end of file diff --git a/src/interface.js b/src/interface.js deleted file mode 100644 index d549d1f..0000000 --- a/src/interface.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=interface.js.map \ No newline at end of file diff --git a/src/interface.js.map b/src/interface.js.map deleted file mode 100644 index 00726e0..0000000 --- a/src/interface.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"interface.js","sourceRoot":"","sources":["interface.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/src/interface.ts b/src/interface.ts deleted file mode 100644 index 21966d5..0000000 --- a/src/interface.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { SourceLocation } from "babel-types"; - -// export interface CommentContext { -// location: { start: number, end: number } -// } -export interface IFile { - name: string, - source: string, -} - - -export interface ICommentType { - type: 'leadingComments' | 'innerComments' | 'trailingComments' - context: boolean -} - -export interface ICommentContext { - location: SourceLocation, - code: string -} - -export interface IComment { - context: ICommentContext, - value: string - location: SourceLocation -} - -export interface IParseResult { - comments: IComment[], - type: string, - file: IFile -} - -export interface IParser { - parse: (file: IFile) => IParseResult -} \ No newline at end of file diff --git a/src/interfaces/IComment.ts b/src/interfaces/IComment.ts new file mode 100644 index 0000000..1f93d91 --- /dev/null +++ b/src/interfaces/IComment.ts @@ -0,0 +1,25 @@ +import IFile from "./IFile"; +import { RemarkNode } from 'xdoc-parser/src/XDocParser' +export interface Position { + start: number, + end: number; +} + +export interface Location { + start: { row: number, column: number }, + end: { row: number, column: number } +} + +export default interface IComment { + position: Position, + location: Location, + markdown: RemarkNode[], + text: string + context: { + position: Position, + location: Location, + text: string, + type: string, + children: IComment[] | undefined[] + } +} \ No newline at end of file diff --git a/src/interfaces/IFile.ts b/src/interfaces/IFile.ts new file mode 100644 index 0000000..517e5b8 --- /dev/null +++ b/src/interfaces/IFile.ts @@ -0,0 +1,5 @@ +export default interface IFile { + name: string, + path: string, + text: string +} \ No newline at end of file diff --git a/src/interfaces/IParser.ts b/src/interfaces/IParser.ts new file mode 100644 index 0000000..eaf0e0e --- /dev/null +++ b/src/interfaces/IParser.ts @@ -0,0 +1,9 @@ +import IFile from "./IFile"; +import IResult from "./IResult"; + +export default abstract class IParser { + constructor(file: IFile, options: any) { + + } + abstract parse(): IResult +} \ No newline at end of file diff --git a/src/interfaces/IResult.ts b/src/interfaces/IResult.ts new file mode 100644 index 0000000..7dbf5e1 --- /dev/null +++ b/src/interfaces/IResult.ts @@ -0,0 +1,7 @@ +import IFile from "./IFile"; +import IComment from "./IComment"; + +export default interface IResult { + file: IFile, + comments: IComment[] +} \ No newline at end of file diff --git a/src/javascript/index.js b/src/javascript/index.js deleted file mode 100644 index 8103514..0000000 --- a/src/javascript/index.js +++ /dev/null @@ -1,107 +0,0 @@ -'use strict'; -Object.defineProperty(exports, "__esModule", { value: true }); -const mr_doc_utils_1 = require("mr-doc-utils"); -const babylon_1 = require("babylon"); -const babel_core_1 = require("babel-core"); -const { Log } = mr_doc_utils_1.default; -const log = new Log(); -class JavaScript { - constructor() { - this.visited = new Map(); - this.comments = []; - this.docs = []; - } - /** - * Parse the file. - * @param {Object} - The file to parse. - */ - parse(file) { - this.file = file; - this.ast = babylon_1.parse(file.source, { - allowImportExportEverywhere: true, - sourceType: 'module', - plugins: [ - 'asyncGenerators', - 'classConstructorCall', - 'classProperties', - 'decorators', - 'doExpressions', - 'exportExtensions', - 'flow', - 'functionBind', - 'functionSent', - 'jsx', - 'objectRestSpread', - 'dynamicImport' - ] - }); - // DEBUG: AST - log.debug(Log.color.blue(`Parsing Javascript file: ${file.name}`)); - let types = [ - { type: 'leadingComments', context: true }, - { type: 'innerComments', context: false }, - { type: 'trailingComments', context: false }, - ]; - types.forEach(commentType => this.walk(commentType)); - return { type: 'module', file, comments: this.docs }; - } - /** - * Walk the comments. - * @param {Object} - The comment type and context to walk. - */ - walk(commentType) { - babel_core_1.traverse(this.ast, { - enter: path => { - let type = commentType.type; - const parseComment = (comment) => { - const result = this.addComment(path, comment, commentType.context); - if (result.context.code !== '') - this.docs.push(result); - }; - (path.node[type] || []).filter((comment) => { - return 'type' in comment && comment.type === 'CommentBlock'; - }).forEach(parseComment); - } - }); - } - addComment(path, comment, includeContext) { - let file = this.file; - let key = file.name + ':' + comment.loc.start.line + ':' + comment.loc.start.column; - let context = { - location: { - start: { line: 0, column: 0 }, - end: { line: 0, column: 0 }, - }, - code: '' - }; - if (!this.visited.get(key)) { - this.visited.set(key, true); - // Normalize the comments since bable strips - // the markers (/*, */, //) - switch (comment.type) { - case 'CommentBlock': - comment.value = `/*${comment.value}*/`; - break; - case 'CommentLine': comment.value = `//${comment.value}`; - } - context = { - location: path.node.loc, - code: '' - }; - if (includeContext) { - Object.defineProperty(context, 'ast', { - configurable: true, - enumerable: false, - value: path, - }); - } - if (path.parentPath && path.parentPath.node) { - let parentNode = path.parentPath.node; - context.code = this.file.source.substring(parentNode.start, parentNode.end); - } - } - return { context, value: comment.value, location: comment.loc }; - } -} -exports.default = JavaScript; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/src/javascript/index.js.map b/src/javascript/index.js.map deleted file mode 100644 index 8d1b292..0000000 --- a/src/javascript/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/javascript/index.ts b/src/javascript/index.ts deleted file mode 100644 index 12e993c..0000000 --- a/src/javascript/index.ts +++ /dev/null @@ -1,116 +0,0 @@ -'use strict'; -import * as _ from "lodash"; -import Util from 'mr-doc-utils'; -import { File, Comment, CommentBlock, CommentLine } from 'babel-types'; -import { parse } from 'babylon'; -import { traverse } from 'babel-core'; -import { IParser, IParseResult, ICommentType, ICommentContext, IComment } from '../interface'; -import { NodePath, Node } from "babel-traverse"; - -const { Log } = Util; -const log = new Log(); - -export default class JavaScript implements IParser { - private visited = new Map(); - private comments = []; - private docs: IComment[] = []; - private ast: File; - private file: { name: string, source: string }; - /** - * Parse the file. - * @param {Object} - The file to parse. - */ - parse(file: { name: string, source: string }): IParseResult { - this.file = file - this.ast = parse(file.source, { - allowImportExportEverywhere: true, - sourceType: 'module', - plugins: [ - 'asyncGenerators', - 'classConstructorCall', - 'classProperties', - 'decorators', - 'doExpressions', - 'exportExtensions', - 'flow', - 'functionBind', - 'functionSent', - 'jsx', - 'objectRestSpread', - 'dynamicImport' - ] - }); - // DEBUG: AST - log.debug(Log.color.blue(`Parsing Javascript file: ${file.name}`)); - let types: ICommentType[] = [ - { type: 'leadingComments', context: true }, - { type: 'innerComments', context: false }, - { type: 'trailingComments', context: false }, - ]; - types.forEach(commentType => this.walk(commentType)); - return { type: 'module', file, comments: this.docs }; - } - /** - * Walk the comments. - * @param {Object} - The comment type and context to walk. - */ - private walk(commentType: ICommentType) { - traverse(this.ast, { - enter: path => { - let type: (keyof Node) = commentType.type; - const parseComment = (comment: Comment) => { - const result = this.addComment(path, comment, commentType.context); - if (result.context.code !== '') - this.docs.push(result); - }; - - (path.node[type] || []).filter((comment: CommentBlock | CommentLine | Comment) => { - return 'type' in comment && (comment).type === 'CommentBlock'; - }).forEach(parseComment); - } - }); - } - - private addComment(path: NodePath, comment: CommentBlock | CommentLine | Comment, includeContext: boolean): IComment { - let file = this.file; - let key = file.name + ':' + comment.loc.start.line + ':' + comment.loc.start.column; - - let context: ICommentContext = { - location: { - start: { line: 0, column: 0 }, - end: { line: 0, column: 0 }, - }, - code: '' - }; - if (!this.visited.get(key)) { - this.visited.set(key, true); - - // Normalize the comments since bable strips - // the markers (/*, */, //) - switch((comment).type) { - case 'CommentBlock': comment.value = `/*${comment.value}*/`; - break; - case 'CommentLine': comment.value = `//${comment.value}`; - } - - context = { - location: path.node.loc, - code: '' - }; - - if (includeContext) { - Object.defineProperty(context, 'ast', { - configurable: true, - enumerable: false, - value: path, - }); - } - - if (path.parentPath && path.parentPath.node) { - let parentNode = path.parentPath.node; - context.code = this.file.source.substring(parentNode.start, parentNode.end); - } - } - return { context, value: comment.value, location: comment.loc }; - } -} \ No newline at end of file diff --git a/src/lang/javascript/index.ts b/src/lang/javascript/index.ts new file mode 100644 index 0000000..dc13a8b --- /dev/null +++ b/src/lang/javascript/index.ts @@ -0,0 +1,109 @@ +import * as Parser from 'tree-sitter'; +import * as JavaScript from 'tree-sitter-javascript'; +import IParser from '../../interfaces/IParser'; +import IFile from '../../interfaces/IFile'; +import IResult from '../../interfaces/IResult'; +import CommentParser from '../../CommentParser'; +import IComment from '../../interfaces/IComment'; + +/** + * A class that parses JavaScript comments. + * + * # API + * + * ``` + * @class JavaScriptParser + * @implements IParser + * @export default + * ``` + */ +export default class JavaScriptParser implements IParser { + private file: IFile; + private options: any; + private parser: Parser; + constructor(file: IFile, options: any) { + this.file = file; + Object.assign(this.options = {}, options || {}); + this.parser = new Parser(); + this.parser.setLanguage(JavaScript); + } + parse = (): IResult => { + let tree = this.parser.parse(this.file.text); + // Get the first comment + let first_comment = tree.rootNode.children + .filter(node => node.type === "comment")[0]; + const first_comment_string = this.file.text + .substring(first_comment.startIndex, first_comment.endIndex); + + // Remove any legal or unncessary comments + if (first_comment_string.includes("copyright") || + first_comment_string.includes("author") || + first_comment_string.includes("terms and conditions")) { + tree.edit({ + startIndex: first_comment.startIndex, + oldEndIndex: first_comment.endIndex, + newEndIndex: first_comment.endIndex, + startPosition: { row: 0, column: 0 }, + oldEndPosition: { row: 0, column: 0 }, + newEndPosition: { row: 0, column: 0 }, + }); + tree = this.parser.parse('', tree); + } + return { + file: this.file, + comments: CommentParser.parse(tree.rootNode, this.file.text) + .filter(this.filterType) + // .map(this.checkType) + .map(this.parseChildren) + } + } + + private filterType = (comment: IComment): boolean => { + return (this.options.filter || + [ + 'function', + 'class', + 'variable_declaration' + ]).includes(comment.context.type) + } + + private checkType = (comment: IComment): IComment => { + const tree = this.parser.parse(comment.context.text); + switch (comment.context.type) { + case 'variable_declaration': + // Check whether we have an anonymous class + if (comment.context.text.includes("class")) { + // Drill down until we find the class body + const variable_declarator = tree.rootNode.children[0].children[1]; + const anonymous_class = variable_declarator.children + .filter(node => node.type === "anonymous_class")[0] + const class_body = anonymous_class.children[1]; + comment.context.children = CommentParser.parse( + class_body, + comment.context.text, + { location: comment.context.location, position: comment.context.position } + ); + } + break; + default: + break; + } + return comment; + } + + private parseChildren = (comment: IComment): IComment => { + switch (comment.context.type) { + case 'class': + const tree = this.parser.parse(comment.context.text); + comment.context.children = CommentParser.parse( + tree.rootNode, + comment.context.text, + { location: comment.context.location, position: comment.context.position } + ).filter(child => child.context.type === 'method_definition'); + break; + default: + break; + } + return comment; + } +} \ No newline at end of file diff --git a/src/lang/typescript/index.ts b/src/lang/typescript/index.ts new file mode 100644 index 0000000..816bc85 --- /dev/null +++ b/src/lang/typescript/index.ts @@ -0,0 +1,84 @@ +import * as Parser from 'tree-sitter'; +import * as TypeScript from 'tree-sitter-javascript'; +import IParser from '../../interfaces/IParser'; +import IFile from '../../interfaces/IFile'; +import IResult from '../../interfaces/IResult'; +import CommentParser from '../../CommentParser'; +import IComment from '../../interfaces/IComment'; + +/** + * A class that parses JavaScript comments. + * + * # API + * + * ``` + * @class JavaScriptParser + * @implements IParser + * @export default + * ``` + */ +export default class TypeScriptParser implements IParser { + private file: IFile; + private options: any; + private parser: Parser; + constructor(file: IFile, options: any) { + this.file = file; + Object.assign(this.options = {}, options || {}); + this.parser = new Parser(); + this.parser.setLanguage(TypeScript); + } + parse = (): IResult => { + let tree = this.parser.parse(this.file.text); + // Get the first comment + let first_comment = tree.rootNode.children + .filter(node => node.type === "comment")[0]; + const first_comment_string = this.file.text + .substring(first_comment.startIndex, first_comment.endIndex); + + // Remove any legal or unncessary comments + if (first_comment_string.includes("copyright") || + first_comment_string.includes("author") || + first_comment_string.includes("terms and conditions")) { + tree.edit({ + startIndex: first_comment.startIndex, + oldEndIndex: first_comment.endIndex, + newEndIndex: first_comment.endIndex, + startPosition: { row: 0, column: 0 }, + oldEndPosition: { row: 0, column: 0 }, + newEndPosition: { row: 0, column: 0 }, + }); + tree = this.parser.parse('', tree); + } + return { + file: this.file, + comments: CommentParser.parse(tree.rootNode, this.file.text) + .filter(this.filterType) + .map(this.parseChildren) + } + } + + private filterType = (comment: IComment): boolean => { + return (this.options.filter || + [ + 'function', + 'class', + 'variable_declaration' + ]).includes(comment.context.type) + } + + private parseChildren = (comment: IComment): IComment => { + switch (comment.context.type) { + case 'class': + const tree = this.parser.parse(comment.context.text); + comment.context.children = CommentParser.parse( + tree.rootNode, + comment.context.text, + { location: comment.context.location, position: comment.context.position } + ).filter(child => child.context.type === 'method_definition'); + break; + default: + break; + } + return comment; + } +} \ No newline at end of file diff --git a/test/fixtures/test.js b/test/fixtures/test.js deleted file mode 100644 index ce11e42..0000000 --- a/test/fixtures/test.js +++ /dev/null @@ -1,6 +0,0 @@ -/** - * @desc blah - */ -function foo() { - return "" -} \ No newline at end of file diff --git a/test/index.js b/test/index.js deleted file mode 100644 index d12facb..0000000 --- a/test/index.js +++ /dev/null @@ -1,18 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const fs_1 = require("fs"); -const path_1 = require("path"); -/* eslint-env mocha */ -const assert = require('chai').assert; -const Parser = require('../').default; -describe('Parser', () => { - describe('JavaScript (Babel)', function () { - const source = fs_1.readFileSync(path_1.join(__dirname, 'fixtures') + '/test.js', 'utf8'); - it('should return an object containing the parsed comments', () => { - const result = new Parser({ language: 'js' }).parse({ name: 'index.js', source }); - assert.isObject(result); - assert.isTrue(result.comments.length === 1); - }); - }); -}); -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/test/index.js.map b/test/index.js.map deleted file mode 100644 index 7e09ee6..0000000 --- a/test/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;AAAA,2BAAkC;AAClC,+BAA4B;AAE5B,sBAAsB;AACtB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;AACtC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;AAEtC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IAEtB,QAAQ,CAAC,oBAAoB,EAAE;QAC7B,MAAM,MAAM,GAAG,iBAAY,CAAC,WAAI,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,UAAU,EAAE,MAAM,CAAC,CAAC;QAC9E,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;YAChE,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;YAClF,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACxB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/test/index.ts b/test/index.ts deleted file mode 100644 index 190e667..0000000 --- a/test/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { readFileSync } from 'fs'; -import { join } from 'path'; - -/* eslint-env mocha */ -const assert = require('chai').assert; -const Parser = require('../').default; - -describe('Parser', () => { - - describe('JavaScript (Babel)', function () { - const source = readFileSync(join(__dirname, 'fixtures') + '/test.js', 'utf8'); - it('should return an object containing the parsed comments', () => { - const result = new Parser({ language: 'js' }).parse({ name: 'index.js', source }); - assert.isObject(result); - assert.isTrue(result.comments.length === 1); - }); - }); -}); diff --git a/tsconfig.json b/tsconfig.json index 0981fce..26a5c69 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,16 +1,16 @@ { "compilerOptions": { /* Basic Options */ - "target": "esnext", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */ + "target": "es2016", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */ "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ // "lib": [], /* Specify library files to be included in the compilation: */ // "allowJs": true, /* Allow javascript files to be compiled. */ // "checkJs": true, /* Report errors in .js files. */ // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ - // "declaration": true, /* Generates corresponding '.d.ts' file. */ - "sourceMap": true, /* Generates corresponding '.map' file. */ + "declaration": true, /* Generates corresponding '.d.ts' file. */ + // "sourceMap": true, /* Generates corresponding '.map' file. */ // "outFile": "./", /* Concatenate and emit output to single file. */ - // "outDir": "./", /* Redirect output structure to the directory. */ + "outDir": "./build/", /* Redirect output structure to the directory. */ // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ // "removeComments": true, /* Do not emit comments to output. */ // "noEmit": true, /* Do not emit outputs. */ @@ -20,11 +20,11 @@ /* Strict Type-Checking Options */ "strict": true, /* Enable all strict type-checking options. */ - // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ - // "strictNullChecks": true, /* Enable strict null checks. */ + "noImplicitAny": false, /* Raise error on expressions and declarations with an implied 'any' type. */ + "strictNullChecks": false, /* Enable strict null checks. */ // "strictFunctionTypes": true, /* Enable strict checking of function types. */ - // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ - // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + "noImplicitThis": false, /* Raise error on 'this' expressions with an implied 'any' type. */ + "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ /* Additional Checks */ // "noUnusedLocals": true, /* Report errors on unused locals. */ @@ -34,7 +34,7 @@ /* Module Resolution Options */ "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ - // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "baseUrl": ".", /* Base directory to resolve non-absolute module names. */ // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ // "typeRoots": [], /* List of folders to include type definitions from. */ @@ -45,11 +45,11 @@ /* Source Map Options */ // "sourceRoot": "./", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ // "mapRoot": "./", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ - // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ /* Experimental Options */ - // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ - // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */, } } \ No newline at end of file From 383b47f9fe290a3d36168c46fc841e91a0768393 Mon Sep 17 00:00:00 2001 From: Takeshi Date: Thu, 9 Aug 2018 22:11:07 -0600 Subject: [PATCH 02/32] Update: WIP --- example.ts | 61 +++++++++++ index.ts | 2 +- package-lock.json | 12 +-- package.json | 4 +- src/CommentParser.ts | 2 +- src/lang/typescript/index.ts | 194 +++++++++++++++++++++++++++-------- src/utils/location.ts | 14 +++ 7 files changed, 237 insertions(+), 52 deletions(-) create mode 100644 example.ts create mode 100644 src/utils/location.ts diff --git a/example.ts b/example.ts new file mode 100644 index 0000000..59116fd --- /dev/null +++ b/example.ts @@ -0,0 +1,61 @@ +/** + * # API + * + * ``` + * @export + * @class A + * ``` + */ +export default class A { + constructor() { + + } +} + +// /** +// * # API +// * +// * ``` +// * @export +// * @class B +// * ``` +// */ +// export class B extends A { + +// } + +/** + * # API + * + * ``` + * @export + * @class C + * ``` + */ +export class C implements A { + /** + * ``` + * @method a + * ``` + */ + a() { + + } +} + +// /** +// * +// * # API +// * ``` +// * @interface B +// * +// * @property propertyA: any +// * @property propertyB: any +// * @property propertyC: any +// * ``` +// */ +// export interface D { +// propertyA +// propertyB +// propertyC +// } \ No newline at end of file diff --git a/index.ts b/index.ts index c93adb7..6a2cd40 100644 --- a/index.ts +++ b/index.ts @@ -28,7 +28,7 @@ export default class Parser implements IParser { const result = new Parser({ name: 'index.ts', path: '../../', - text: FS.readFileSync(`${process.cwd()}/index.ts`, 'utf-8') + text: FS.readFileSync(`${process.cwd()}/example.ts`, 'utf-8') }, { language: 'typescript' }).parse(); diff --git a/package-lock.json b/package-lock.json index 7c96a18..79c5af8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -66,9 +66,9 @@ "dev": true }, "@types/node": { - "version": "8.10.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.23.tgz", - "integrity": "sha512-aEp5ZTLr4mYhR9S85cJ+sEYkcsgFY10N1Si5m49iTAVzanZXOwp/pgw6ibFLKXxpflqm71aSWZCRtnTXXO56gA==", + "version": "8.10.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.24.tgz", + "integrity": "sha512-5YaBKa6oFuWy7ptIFMATyftIcpZTZtvgrzPThEbs+kl4Uu41oUxiRunG0k32QZjD6MXMELls//ry/epNxc11aQ==", "dev": true }, "ansi-regex": { @@ -1197,9 +1197,9 @@ } }, "tree-sitter-javascript": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/tree-sitter-javascript/-/tree-sitter-javascript-0.13.3.tgz", - "integrity": "sha512-kwuLjPo2Shi8CvTAkhka2Z1Hq7VhWyexuG+lhj0qL9inWVN+qJVYQO37mSGuMszC7ThcK2RGlKM3f2nFc1Fi+w==", + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/tree-sitter-javascript/-/tree-sitter-javascript-0.13.5.tgz", + "integrity": "sha512-80sUl2+kj0evGTueODpDmJksTNQbGtkG4EOxIygsjZ5Q6kFW/uBRHXHSlBtX5vkEIjljApZ8qse4C7cmG1CIFA==", "requires": { "nan": "^2.4.0" } diff --git a/package.json b/package.json index b528974..11169a2 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "homepage": "https://github.com/mr-doc/parser#readme", "devDependencies": { "@types/mocha": "^2.2.48", - "@types/node": "^8.10.23", + "@types/node": "^8.10.24", "chai": "^4.1.2", "mocha": "^4.1.0" }, @@ -30,7 +30,7 @@ "babylon": "^6.7.0", "lodash": "^4.17.10", "tree-sitter": "^0.13.4", - "tree-sitter-javascript": "^0.13.3", + "tree-sitter-javascript": "^0.13.5", "tree-sitter-typescript": "^0.13.3", "xdoc-parser": "^2.1.6" } diff --git a/src/CommentParser.ts b/src/CommentParser.ts index 37b86c2..e1ab710 100644 --- a/src/CommentParser.ts +++ b/src/CommentParser.ts @@ -64,7 +64,7 @@ export default class CommentParser { ) { // console.log(node.type) if (node.type === "comment" && node.nextSibling) { - console.log(node.nextSibling.type) + // console.log(node.nextSibling.type) // console.log(`${node.nextSibling.type} has a leading comment.`); const next = node.nextSibling; diff --git a/src/lang/typescript/index.ts b/src/lang/typescript/index.ts index 816bc85..f2f1a5f 100644 --- a/src/lang/typescript/index.ts +++ b/src/lang/typescript/index.ts @@ -1,10 +1,18 @@ import * as Parser from 'tree-sitter'; -import * as TypeScript from 'tree-sitter-javascript'; +import * as TypeScript from 'tree-sitter-typescript'; import IParser from '../../interfaces/IParser'; import IFile from '../../interfaces/IFile'; import IResult from '../../interfaces/IResult'; import CommentParser from '../../CommentParser'; import IComment from '../../interfaces/IComment'; +import location from '../../utils/location'; + +interface NodeProperties { + exports: { + export: boolean, + default: boolean + } +} /** * A class that parses JavaScript comments. @@ -28,57 +36,159 @@ export default class TypeScriptParser implements IParser { this.parser.setLanguage(TypeScript); } parse = (): IResult => { - let tree = this.parser.parse(this.file.text); - // Get the first comment - let first_comment = tree.rootNode.children - .filter(node => node.type === "comment")[0]; - const first_comment_string = this.file.text - .substring(first_comment.startIndex, first_comment.endIndex); - - // Remove any legal or unncessary comments - if (first_comment_string.includes("copyright") || - first_comment_string.includes("author") || - first_comment_string.includes("terms and conditions")) { - tree.edit({ - startIndex: first_comment.startIndex, - oldEndIndex: first_comment.endIndex, - newEndIndex: first_comment.endIndex, - startPosition: { row: 0, column: 0 }, - oldEndPosition: { row: 0, column: 0 }, - newEndPosition: { row: 0, column: 0 }, + const tree = this.parser.parse(this.file.text); + if (tree.rootNode.type === "program") { + this.visitProgram(tree.rootNode) + } + + return; + } + + /* Visitors */ + + private visitProgram = (node: Parser.SyntaxNode) => { + let children = node.children; + if (node.children.length > 0) { + if (this.isLegalComment(node.children[0])) { + // Remove the legal comment from ast + children = node.children.splice(1); + } + // Perf: O(n) + node.children.forEach(child => { + const nextSibling = child.nextSibling; + // Determine if the node is a c-style comment + if (child.type.match("comment") && this.isCStyleComment(child)) { + // Determine whether a comment has a sibling + if (nextSibling) { + // Visit the sibling + this.visitNode(nextSibling, child, { + exports: { + export: false, + default: false + } + }); + } + } }); - tree = this.parser.parse('', tree); } - return { - file: this.file, - comments: CommentParser.parse(tree.rootNode, this.file.text) - .filter(this.filterType) - .map(this.parseChildren) + } + + private visitExportStatement = ( + node: Parser.SyntaxNode, + leadingComment: Parser.SyntaxNode + ) => { + let isDefaultExport = false; + // Remove the 'export' node + let children = node.children.slice(1); + if (node.children[1].type.match("default")) { + isDefaultExport = true; + // Remove the 'default' node + children = children.slice(1); } + // Most likely, the first index will point to the exported type + const child = children[0]; + this.visitNode(child, leadingComment, { + exports: { + export: true, + default: isDefaultExport + } + }); } - private filterType = (comment: IComment): boolean => { - return (this.options.filter || - [ - 'function', - 'class', - 'variable_declaration' - ]).includes(comment.context.type) + private visitClass = ( + node: Parser.SyntaxNode, + leadingComment: Parser.SyntaxNode, + properties: Partial + ) => { + // console.log(node.children); + let children = node.children; + // Remove 'class' since we already know that + children = children.slice(1); + // Get the class/type identifier + const classIdentifier = this.getContext(children[0]); + // Remove the identifier + children = children.slice(1); + + const classProperties = Object.assign({ + implements: false, + extends: false, + }, properties); + + // Determine whether the class extends or implements + if (children[0].type.match("class_heritage")) { + if (this.getContext(children[0]).text.includes("implements")) { + classProperties.implements = true; + } else if (this.getContext(children[0]).text.includes("extends")) { + classProperties.extends = true; + } + // Remove the heritage node + children = children.slice(1); + } + + const classBody = children[0]; + + console.log(classBody.children); + + // return { + // class: { + // name: + // } + // } } - private parseChildren = (comment: IComment): IComment => { - switch (comment.context.type) { + + private visitNode = (node: Parser.SyntaxNode, leadingComment: Parser.SyntaxNode, properties: Partial) => { + const context = this.getContext(node); + switch (node.type) { + // Note: Export statemens may include + case 'export_statement': + this.visitExportStatement(node, leadingComment); + break; case 'class': - const tree = this.parser.parse(comment.context.text); - comment.context.children = CommentParser.parse( - tree.rootNode, - comment.context.text, - { location: comment.context.location, position: comment.context.position } - ).filter(child => child.context.type === 'method_definition'); + this.visitClass(node, leadingComment, properties); + break; + case 'interface_declaration': + break; + case 'ERROR': + console.error( + `[mr-doc::parser]: 'tree-sitter' was not able to parse at row ${context.location.row.start + 1}.` + ) break; default: + console.log(`[mr-doc::parser]: ${node.type} is not supported yet.`); + break; } - return comment; } -} \ No newline at end of file + /* Helpers */ + + private isCStyleComment(node: Parser.SyntaxNode) { + const comment = this.getContext(node).text; + // https://blog.ostermiller.org/find-comment + return comment.match(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/); + } + + private isLegalComment = (node: Parser.SyntaxNode) => { + const possibleTexts = [ + 'copyright', + 'terms and conditions', + 'license', + 'all rights reserved' + ]; + if (node.type.match("comment")) { + return possibleTexts.map(text => + this.file.text + .substring(node.startIndex, node.endIndex) + .toLowerCase() + .includes(text) + ).includes(true); + } + } + + private getContext(node: Parser.SyntaxNode) { + return { + ...location(node), + text: this.file.text.substring(node.startIndex, node.endIndex) + } + } +} diff --git a/src/utils/location.ts b/src/utils/location.ts new file mode 100644 index 0000000..75cad53 --- /dev/null +++ b/src/utils/location.ts @@ -0,0 +1,14 @@ +import * as Parser from 'tree-sitter'; + +export default function location(node: Parser.SyntaxNode) { + return { + position: { + start: node.startIndex, + end: node.endIndex + }, + location: { + row: { start: node.startPosition.row, end: node.endPosition.row }, + column: { start: node.startPosition.column, end: node.endPosition.column } + } + } +} \ No newline at end of file From b4feda0a377e60b8f08cca714dc1146eb97c46da Mon Sep 17 00:00:00 2001 From: Takeshi Date: Thu, 9 Aug 2018 23:40:34 -0600 Subject: [PATCH 03/32] Update: WIP --- example.ts | 8 ++-- src/lang/typescript/index.ts | 88 ++++++++++++++++++++++++++++++------ 2 files changed, 78 insertions(+), 18 deletions(-) diff --git a/example.ts b/example.ts index 59116fd..5a769c6 100644 --- a/example.ts +++ b/example.ts @@ -34,13 +34,13 @@ export default class A { */ export class C implements A { /** + * A property + * # API * ``` - * @method a + * @property: any * ``` */ - a() { - - } + property: any } // /** diff --git a/src/lang/typescript/index.ts b/src/lang/typescript/index.ts index f2f1a5f..c122a16 100644 --- a/src/lang/typescript/index.ts +++ b/src/lang/typescript/index.ts @@ -61,6 +61,7 @@ export default class TypeScriptParser implements IParser { // Determine whether a comment has a sibling if (nextSibling) { // Visit the sibling + // Perf: Possibly O(n^2) this.visitNode(nextSibling, child, { exports: { export: false, @@ -74,7 +75,7 @@ export default class TypeScriptParser implements IParser { } private visitExportStatement = ( - node: Parser.SyntaxNode, + node: Parser.SyntaxNode, leadingComment: Parser.SyntaxNode ) => { let isDefaultExport = false; @@ -96,8 +97,8 @@ export default class TypeScriptParser implements IParser { } private visitClass = ( - node: Parser.SyntaxNode, - leadingComment: Parser.SyntaxNode, + node: Parser.SyntaxNode, + leadingComment: Parser.SyntaxNode, properties: Partial ) => { // console.log(node.children); @@ -105,7 +106,7 @@ export default class TypeScriptParser implements IParser { // Remove 'class' since we already know that children = children.slice(1); // Get the class/type identifier - const classIdentifier = this.getContext(children[0]); + const classIdentifier = this.getNodeContext(children[0]); // Remove the identifier children = children.slice(1); @@ -116,19 +117,17 @@ export default class TypeScriptParser implements IParser { // Determine whether the class extends or implements if (children[0].type.match("class_heritage")) { - if (this.getContext(children[0]).text.includes("implements")) { + if (this.getNodeContext(children[0]).text.includes("implements")) { classProperties.implements = true; - } else if (this.getContext(children[0]).text.includes("extends")) { + } else if (this.getNodeContext(children[0]).text.includes("extends")) { classProperties.extends = true; } // Remove the heritage node children = children.slice(1); } - const classBody = children[0]; - - console.log(classBody.children); - + let classBody: any = children[0]; + classBody = this.visitClassBody(classBody); // return { // class: { // name: @@ -136,9 +135,63 @@ export default class TypeScriptParser implements IParser { // } } + private visitClassBody(node: Parser.SyntaxNode) { + const methods = []; + // Perf: O(n) + node.children.forEach(classChild => { + if (classChild.type.match("comment") && this.isCStyleComment(classChild)) { + const nextSibling = classChild.nextSibling; + if (nextSibling) { + switch (nextSibling.type) { + case 'method_definition': + methods.push(this.visitClassMethod(nextSibling, classChild)); + break; + default: + this.warnNotSupported(nextSibling); + + break; + } + } + } + }); + // console.log(JSON.stringify(methods[0], null, 2)); + + return { + methods, + } + } + + + private visitClassMethod = ( + node: Parser.SyntaxNode, + leadingComment: Parser.SyntaxNode + ) => { + let children = node.children; + let isProperty = false; + // Determine whether it is a property + if (children[0].type.match("get")) { + isProperty = true; + // Remove the 'get' node + children = children.slice(1); + } + // Get the formal parameters + const formal_parameters = children[1].children[0]; + const parameters = formal_parameters.children; + // console.log(parameters); + + return { + identifier: this.getNodeContext(children[0]), + // Note: parameters contains '(' ... ')' + parameters: parameters.map(this.getNodeContext.bind(this)), + comment: this.getNodeContext(leadingComment), + context: this.getNodeContext(node) + + } + } + private visitNode = (node: Parser.SyntaxNode, leadingComment: Parser.SyntaxNode, properties: Partial) => { - const context = this.getContext(node); + const context = this.getNodeContext(node); switch (node.type) { // Note: Export statemens may include case 'export_statement': @@ -149,13 +202,16 @@ export default class TypeScriptParser implements IParser { break; case 'interface_declaration': break; + case 'comment': + // noop + break; case 'ERROR': console.error( `[mr-doc::parser]: 'tree-sitter' was not able to parse at row ${context.location.row.start + 1}.` ) break; default: - console.log(`[mr-doc::parser]: ${node.type} is not supported yet.`); + this.warnNotSupported(node); break; } @@ -163,7 +219,7 @@ export default class TypeScriptParser implements IParser { /* Helpers */ private isCStyleComment(node: Parser.SyntaxNode) { - const comment = this.getContext(node).text; + const comment = this.getNodeContext(node).text; // https://blog.ostermiller.org/find-comment return comment.match(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/); } @@ -185,10 +241,14 @@ export default class TypeScriptParser implements IParser { } } - private getContext(node: Parser.SyntaxNode) { + private getNodeContext(node: Parser.SyntaxNode) { return { ...location(node), text: this.file.text.substring(node.startIndex, node.endIndex) } } + + private warnNotSupported = (node: Parser.SyntaxNode) => { + console.log(`[mr-doc::parser]: '${node.type.replace(/[_]/g, ' ')}' is not supported yet.`); + } } From 377a7b0f0df70944503455b00be10a5cda6e53c2 Mon Sep 17 00:00:00 2001 From: Takeshi Date: Fri, 10 Aug 2018 14:37:37 -0600 Subject: [PATCH 04/32] Update: WIP --- example.ts | 6 +- index.ts | 2 +- src/interfaces/IParser.ts | 2 +- src/lang/typescript/index.ts | 148 ++++++++++++++++++++++++----------- src/utils/location.ts | 13 ++- src/utils/match.ts | 5 ++ 6 files changed, 127 insertions(+), 49 deletions(-) create mode 100644 src/utils/match.ts diff --git a/example.ts b/example.ts index 5a769c6..aacce65 100644 --- a/example.ts +++ b/example.ts @@ -32,7 +32,7 @@ export default class A { * @class C * ``` */ -export class C implements A { +export class C extends A { /** * A property * # API @@ -40,7 +40,9 @@ export class C implements A { * @property: any * ``` */ - property: any + private a() { + + } } // /** diff --git a/index.ts b/index.ts index 6a2cd40..d9f7b9c 100644 --- a/index.ts +++ b/index.ts @@ -34,4 +34,4 @@ const result = new Parser({ }).parse(); -// console.log(JSON.stringify(result, null, 2)) \ No newline at end of file +console.log(JSON.stringify(result, null, 2)) \ No newline at end of file diff --git a/src/interfaces/IParser.ts b/src/interfaces/IParser.ts index eaf0e0e..550cb5f 100644 --- a/src/interfaces/IParser.ts +++ b/src/interfaces/IParser.ts @@ -5,5 +5,5 @@ export default abstract class IParser { constructor(file: IFile, options: any) { } - abstract parse(): IResult + abstract parse(): any } \ No newline at end of file diff --git a/src/lang/typescript/index.ts b/src/lang/typescript/index.ts index c122a16..883ea70 100644 --- a/src/lang/typescript/index.ts +++ b/src/lang/typescript/index.ts @@ -5,7 +5,8 @@ import IFile from '../../interfaces/IFile'; import IResult from '../../interfaces/IResult'; import CommentParser from '../../CommentParser'; import IComment from '../../interfaces/IComment'; -import location from '../../utils/location'; +import location, { Location } from '../../utils/location'; +import match from '../../utils/match'; interface NodeProperties { exports: { @@ -14,6 +15,40 @@ interface NodeProperties { } } +export interface NodeContext extends Location { + text: string +} + +export interface ClassNode { + class: { + comment: NodeContext, + context: NodeContext, + identifier: NodeContext, + heritage: NodeContext, + body: any[], + properties: Partial + } +} + +export interface ClassBodyNode { + methods: ClassMethodNode[], + properties: any[] +} + +export interface ClassMethodNode { + identifier: NodeContext, + // Note: parameters contains '(' ... ')' + parameters: NodeContext[], + comment: NodeContext, + context: NodeContext, + type: string, + async: boolean, + private: boolean +} + /** * A class that parses JavaScript comments. * @@ -35,13 +70,11 @@ export default class TypeScriptParser implements IParser { this.parser = new Parser(); this.parser.setLanguage(TypeScript); } - parse = (): IResult => { + parse = () => { const tree = this.parser.parse(this.file.text); if (tree.rootNode.type === "program") { - this.visitProgram(tree.rootNode) + return this.visitProgram(tree.rootNode) } - - return; } /* Visitors */ @@ -54,15 +87,15 @@ export default class TypeScriptParser implements IParser { children = node.children.splice(1); } // Perf: O(n) - node.children.forEach(child => { + return children.map(child => { const nextSibling = child.nextSibling; // Determine if the node is a c-style comment - if (child.type.match("comment") && this.isCStyleComment(child)) { + if (match(child, 'comment') && this.isCStyleComment(child)) { // Determine whether a comment has a sibling if (nextSibling) { // Visit the sibling // Perf: Possibly O(n^2) - this.visitNode(nextSibling, child, { + return this.visitNode(nextSibling, child, { exports: { export: false, default: false @@ -70,7 +103,7 @@ export default class TypeScriptParser implements IParser { }); } } - }); + }).filter(child => !!child); } } @@ -81,14 +114,14 @@ export default class TypeScriptParser implements IParser { let isDefaultExport = false; // Remove the 'export' node let children = node.children.slice(1); - if (node.children[1].type.match("default")) { + if (match(node.children[1], 'default')) { isDefaultExport = true; // Remove the 'default' node children = children.slice(1); } // Most likely, the first index will point to the exported type const child = children[0]; - this.visitNode(child, leadingComment, { + return this.visitNode(child, leadingComment, { exports: { export: true, default: isDefaultExport @@ -100,7 +133,7 @@ export default class TypeScriptParser implements IParser { node: Parser.SyntaxNode, leadingComment: Parser.SyntaxNode, properties: Partial - ) => { + ): ClassNode => { // console.log(node.children); let children = node.children; // Remove 'class' since we already know that @@ -114,78 +147,105 @@ export default class TypeScriptParser implements IParser { implements: false, extends: false, }, properties); - + let heritage = null; // Determine whether the class extends or implements - if (children[0].type.match("class_heritage")) { + if (match(children[0], 'class_heritage')) { if (this.getNodeContext(children[0]).text.includes("implements")) { classProperties.implements = true; } else if (this.getNodeContext(children[0]).text.includes("extends")) { classProperties.extends = true; } + // Store the heritage + heritage = this.getNodeContext(children[0].children[0]) // Remove the heritage node children = children.slice(1); } let classBody: any = children[0]; classBody = this.visitClassBody(classBody); - // return { - // class: { - // name: - // } - // } + return { + class: { + comment: this.getNodeContext(leadingComment), + context: this.getNodeContext(node), + identifier: classIdentifier, + heritage, + body: classBody, + properties: classProperties + } + } } - private visitClassBody(node: Parser.SyntaxNode) { + private visitClassBody = (node: Parser.SyntaxNode): ClassBodyNode => { const methods = []; + const properties = []; // Perf: O(n) node.children.forEach(classChild => { - if (classChild.type.match("comment") && this.isCStyleComment(classChild)) { + if (match(classChild, 'comment') && this.isCStyleComment(classChild)) { const nextSibling = classChild.nextSibling; if (nextSibling) { switch (nextSibling.type) { case 'method_definition': - methods.push(this.visitClassMethod(nextSibling, classChild)); + let method = this.visitClassMethod(nextSibling, classChild); + if (method.type === 'method') { + methods.push(method); + } else if (method.type === 'property') { + properties.push(method); + } break; default: this.warnNotSupported(nextSibling); - + break; } } } }); - // console.log(JSON.stringify(methods[0], null, 2)); - return { methods, + properties, } } - private visitClassMethod = ( node: Parser.SyntaxNode, leadingComment: Parser.SyntaxNode - ) => { + ): ClassMethodNode => { let children = node.children; - let isProperty = false; + let isPrivate = false, isProperty = false, isAsync = false; + + // Determine whether it is a private method + if (match(children[0], 'accessibility_modifier')) { + isPrivate = children[0].children[0].type === "private"; + // Remove 'private' + children = children.slice(1); + } + // Determine whether it is a property - if (children[0].type.match("get")) { + if (match(children[0], 'get')) { isProperty = true; // Remove the 'get' node children = children.slice(1); } + // Determine whether it is an async method + if (match(children[0], 'async')) { + isAsync = true; + children = children.slice(1); + } + // Get the formal parameters const formal_parameters = children[1].children[0]; const parameters = formal_parameters.children; // console.log(parameters); - + return { identifier: this.getNodeContext(children[0]), // Note: parameters contains '(' ... ')' parameters: parameters.map(this.getNodeContext.bind(this)), comment: this.getNodeContext(leadingComment), - context: this.getNodeContext(node) - + context: this.getNodeContext(node), + type: isProperty ? 'property' : 'method', + async: isAsync, + private: isPrivate } } @@ -195,16 +255,17 @@ export default class TypeScriptParser implements IParser { switch (node.type) { // Note: Export statemens may include case 'export_statement': - this.visitExportStatement(node, leadingComment); - break; + return this.visitExportStatement(node, leadingComment); case 'class': - this.visitClass(node, leadingComment, properties); - break; - case 'interface_declaration': - break; + return this.visitClass(node, leadingComment, properties); + // TODO: Complete interfaces and functions + // case 'interface_declaration': + // break; + // case 'function': + // break; case 'comment': - // noop - break; + // noop + break; case 'ERROR': console.error( `[mr-doc::parser]: 'tree-sitter' was not able to parse at row ${context.location.row.start + 1}.` @@ -212,7 +273,6 @@ export default class TypeScriptParser implements IParser { break; default: this.warnNotSupported(node); - break; } } @@ -231,7 +291,7 @@ export default class TypeScriptParser implements IParser { 'license', 'all rights reserved' ]; - if (node.type.match("comment")) { + if (match(node, 'comment')) { return possibleTexts.map(text => this.file.text .substring(node.startIndex, node.endIndex) @@ -241,7 +301,7 @@ export default class TypeScriptParser implements IParser { } } - private getNodeContext(node: Parser.SyntaxNode) { + private getNodeContext(node: Parser.SyntaxNode): NodeContext { return { ...location(node), text: this.file.text.substring(node.startIndex, node.endIndex) @@ -249,6 +309,6 @@ export default class TypeScriptParser implements IParser { } private warnNotSupported = (node: Parser.SyntaxNode) => { - console.log(`[mr-doc::parser]: '${node.type.replace(/[_]/g, ' ')}' is not supported yet.`); + console.log(`[mr-doc::parser]: warning - '${node.type.replace(/[_]/g, ' ')}' is not supported yet.`); } } diff --git a/src/utils/location.ts b/src/utils/location.ts index 75cad53..f3af591 100644 --- a/src/utils/location.ts +++ b/src/utils/location.ts @@ -1,6 +1,17 @@ import * as Parser from 'tree-sitter'; -export default function location(node: Parser.SyntaxNode) { +export interface Location { + position: { + start: number, + end: number, + } + location: { + row: { start: number, end: number }, + column: { start: number, end: number } + } +} + +export default function location(node: Parser.SyntaxNode): Location { return { position: { start: node.startIndex, diff --git a/src/utils/match.ts b/src/utils/match.ts new file mode 100644 index 0000000..4bd6e10 --- /dev/null +++ b/src/utils/match.ts @@ -0,0 +1,5 @@ +import { SyntaxNode } from "tree-sitter"; + +export default function match(node: SyntaxNode, type: string) { + return node.type === type; +} \ No newline at end of file From f88465b13f6fa7a4a961a98f94f84f59ed58ad31 Mon Sep 17 00:00:00 2001 From: Takeshi Date: Mon, 13 Aug 2018 08:47:09 -0600 Subject: [PATCH 05/32] Update: WIP --- example.ts | 64 +++++++------ src/interfaces/ILocation.ts | 10 ++ src/lang/typescript/Node.ts | 43 +++++++++ src/lang/typescript/index.ts | 172 +++++++++++++++++++++++++---------- src/utils/location.ts | 14 +-- 5 files changed, 213 insertions(+), 90 deletions(-) create mode 100644 src/interfaces/ILocation.ts create mode 100644 src/lang/typescript/Node.ts diff --git a/example.ts b/example.ts index aacce65..b4352bb 100644 --- a/example.ts +++ b/example.ts @@ -24,40 +24,46 @@ export default class A { // } +// /** +// * # API +// * +// * ``` +// * @export +// * @class C +// * +// * @property a: any - Description +// * @property b: any - Description +// * ``` +// */ +// export class C extends A { +// a: any +// b: any +// } + /** - * # API * + * # API * ``` - * @export - * @class C + * @interface B + * + * @property propertyA: any + * @property propertyB: any + * @property propertyC: any * ``` */ -export class C extends A { +export interface D { + propertyA + propertyB + propertyC /** - * A property - * # API - * ``` - * @property: any + * Description + * + * ```xdoc + * @method method + * @param x + * @param y + * @param z * ``` */ - private a() { - - } -} - -// /** -// * -// * # API -// * ``` -// * @interface B -// * -// * @property propertyA: any -// * @property propertyB: any -// * @property propertyC: any -// * ``` -// */ -// export interface D { -// propertyA -// propertyB -// propertyC -// } \ No newline at end of file + method(x, y, z?): Promise +} \ No newline at end of file diff --git a/src/interfaces/ILocation.ts b/src/interfaces/ILocation.ts new file mode 100644 index 0000000..ef5037b --- /dev/null +++ b/src/interfaces/ILocation.ts @@ -0,0 +1,10 @@ +export interface ILocation { + position: { + start: number, + end: number, + } + location: { + row: { start: number, end: number }, + column: { start: number, end: number } + } +} \ No newline at end of file diff --git a/src/lang/typescript/Node.ts b/src/lang/typescript/Node.ts new file mode 100644 index 0000000..0b6a76a --- /dev/null +++ b/src/lang/typescript/Node.ts @@ -0,0 +1,43 @@ +import { ILocation } from "../../interfaces/ILocation"; + +export interface NodeContext extends ILocation { + text: string +} + +export interface NodeProperties { + exports: { + export: boolean, + default: boolean + } + } + + + export interface ClassNode { + class: { + comment: NodeContext, + context: NodeContext, + identifier: NodeContext, + heritage: NodeContext, + body: any[], + properties: Partial + } + } + + export interface ClassBodyNode { + methods: ClassMethodNode[], + properties: any[] + } + + export interface ClassMethodNode { + identifier: NodeContext, + // Note: parameters contains '(' ... ')' + parameters: NodeContext[], + comment: NodeContext, + context: NodeContext, + type: string, + async: boolean, + private: boolean + } \ No newline at end of file diff --git a/src/lang/typescript/index.ts b/src/lang/typescript/index.ts index 883ea70..db20764 100644 --- a/src/lang/typescript/index.ts +++ b/src/lang/typescript/index.ts @@ -2,52 +2,10 @@ import * as Parser from 'tree-sitter'; import * as TypeScript from 'tree-sitter-typescript'; import IParser from '../../interfaces/IParser'; import IFile from '../../interfaces/IFile'; -import IResult from '../../interfaces/IResult'; -import CommentParser from '../../CommentParser'; -import IComment from '../../interfaces/IComment'; -import location, { Location } from '../../utils/location'; +import location from '../../utils/location'; import match from '../../utils/match'; +import { NodeProperties, ClassNode, ClassBodyNode, ClassMethodNode, NodeContext } from './Node'; -interface NodeProperties { - exports: { - export: boolean, - default: boolean - } -} - -export interface NodeContext extends Location { - text: string -} - -export interface ClassNode { - class: { - comment: NodeContext, - context: NodeContext, - identifier: NodeContext, - heritage: NodeContext, - body: any[], - properties: Partial - } -} - -export interface ClassBodyNode { - methods: ClassMethodNode[], - properties: any[] -} - -export interface ClassMethodNode { - identifier: NodeContext, - // Note: parameters contains '(' ... ')' - parameters: NodeContext[], - comment: NodeContext, - context: NodeContext, - type: string, - async: boolean, - private: boolean -} /** * A class that parses JavaScript comments. @@ -107,6 +65,8 @@ export default class TypeScriptParser implements IParser { } } + /* Export node */ + private visitExportStatement = ( node: Parser.SyntaxNode, leadingComment: Parser.SyntaxNode @@ -129,12 +89,12 @@ export default class TypeScriptParser implements IParser { }); } + /* Class Node */ private visitClass = ( node: Parser.SyntaxNode, leadingComment: Parser.SyntaxNode, properties: Partial ): ClassNode => { - // console.log(node.children); let children = node.children; // Remove 'class' since we already know that children = children.slice(1); @@ -249,8 +209,118 @@ export default class TypeScriptParser implements IParser { } } + /* Interface Node */ + + private visitInterfaceNode = (node: Parser.SyntaxNode, leadingComment: Parser.SyntaxNode, properties: Partial) => { + let children = node.children; + // Remove 'interface' since we already know that + children = children.slice(1); + // Get the interface identifier + const interfaceIdentifier = this.getNodeContext(children[0]); + // Remove the identifier + children = children.slice(1); + + const interfaceProperties = Object.assign({ + // For consistency, we'll keep 'implements' + implements: false, + extends: false + }, properties); + + let heritage = null; + + // Determine whether the class extends or implements + if (match(children[0], 'class_heritage')) { + if (this.getNodeContext(children[0]).text.includes("extends")) { + interfaceProperties.extends = true; + } + // Store the heritage + heritage = this.getNodeContext(children[0].children[0]) + // Remove the heritage node + children = children.slice(1); + } + // console.log(children[0].children); + let interfaceBody: any = children[0]; + interfaceBody = this.visitObjectTypeNode(interfaceBody); + return { + interface: { + comment: this.getNodeContext(leadingComment), + context: this.getNodeContext(node), + identifier: interfaceIdentifier, + heritage, + body: interfaceBody, + properties: interfaceProperties + } + } + } + - private visitNode = (node: Parser.SyntaxNode, leadingComment: Parser.SyntaxNode, properties: Partial) => { + private visitObjectTypeNode = (node: Parser.SyntaxNode) => { + const methods = []; + const properties = []; + + node.children.forEach(child => { + if (match(child, 'comment') && this.isCStyleComment(child)) { + const nextSibling = child.nextSibling; + if (nextSibling) { + switch (nextSibling.type) { + case 'method_signature': + methods.push(this.visitMethodSignature(nextSibling, child)); + break; + default: + this.warnNotSupported(nextSibling); + break; + } + } + } + }); + + return { + methods, + properties + } + } + + private visitMethodSignature = ( + node: Parser.SyntaxNode, + leadingComment: Parser.SyntaxNode + ) => { + const identifer = node.children[0]; + const call_signature = node.children[1]; + let call_signature_children = call_signature.children; + let type_parameters = []; + + // Determine whether generics are used, such as myfunc(...): T + if (call_signature_children[0].type === 'type_parameters') { + type_parameters = call_signature_children.map(this.getNodeContext.bind(this)); + call_signature_children = call_signature_children.slice(1); + } + + // Note: An interface can have required and optional parameters + // so we need to check later if a '?' exists + let parameters: any = call_signature_children[0].children + .map(this.getNodeContext.bind(this)); + // Remove parameters + call_signature_children = call_signature_children.slice(1); + + // Get the type annotation for the method signature + let type_annotation: any = call_signature_children[0]; + // Determine if it does exists + if (type_annotation && type_annotation.children[1]) { + type_annotation = this.getNodeContext(type_annotation.children[1]); + } + return { + identifier: this.getNodeContext(identifer), + parameters, + type_parameters, + type_annotation + } + } + + private visitNode = ( + node: Parser.SyntaxNode, + leadingComment: Parser.SyntaxNode, + properties: Partial + ) => { const context = this.getNodeContext(node); switch (node.type) { // Note: Export statemens may include @@ -259,10 +329,11 @@ export default class TypeScriptParser implements IParser { case 'class': return this.visitClass(node, leadingComment, properties); // TODO: Complete interfaces and functions - // case 'interface_declaration': - // break; + case 'interface_declaration': + return this.visitInterfaceNode(node, leadingComment, properties); + break; // case 'function': - // break; + // break; case 'comment': // noop break; @@ -276,6 +347,9 @@ export default class TypeScriptParser implements IParser { break; } } + + + /* Helpers */ private isCStyleComment(node: Parser.SyntaxNode) { diff --git a/src/utils/location.ts b/src/utils/location.ts index f3af591..aab7575 100644 --- a/src/utils/location.ts +++ b/src/utils/location.ts @@ -1,17 +1,7 @@ import * as Parser from 'tree-sitter'; +import { ILocation } from '../interfaces/ILocation'; -export interface Location { - position: { - start: number, - end: number, - } - location: { - row: { start: number, end: number }, - column: { start: number, end: number } - } -} - -export default function location(node: Parser.SyntaxNode): Location { +export default function location(node: Parser.SyntaxNode): ILocation { return { position: { start: node.startIndex, From be622e3628f376bc4a60ff1c08e56efebe078c88 Mon Sep 17 00:00:00 2001 From: Takeshi Date: Wed, 15 Aug 2018 21:48:22 -0600 Subject: [PATCH 06/32] Update: WIP --- example.ts | 85 +-- index.ts | 6 +- package-lock.json | 18 +- package.json | 6 +- src/CommentParser.ts | 95 --- src/interfaces/IComment.ts | 25 - src/interfaces/ILocation.ts | 10 - src/interfaces/IParser.ts | 2 +- src/interfaces/IResult.ts | 7 - src/interfaces/TextRange.ts | 47 ++ src/lang/javascript/index.ts | 153 +++-- src/lang/typescript/Node.ts | 97 +-- src/lang/typescript/index.ts | 573 +++++++----------- .../public_field_definition.visitor.ts | 25 + src/lang/typescript/visitors/class.visitor.ts | 94 +++ .../visitors/export_statement.visitor.ts | 27 + .../visitors/method_definition.visitor.ts | 5 + src/lang/typescript/visitors/node.visitor.ts | 37 ++ .../typescript/visitors/program.visitor.ts | 32 + src/lang/typescript/visitors/type.visitor.ts | 23 + .../visitors/type_parameters.visitor.ts | 12 + src/utils/comment.ts | 42 ++ src/utils/match.ts | 10 +- src/utils/{location.ts => range.ts} | 4 +- src/utils/text.ts | 13 + 25 files changed, 773 insertions(+), 675 deletions(-) delete mode 100644 src/CommentParser.ts delete mode 100644 src/interfaces/IComment.ts delete mode 100644 src/interfaces/ILocation.ts delete mode 100644 src/interfaces/IResult.ts create mode 100644 src/interfaces/TextRange.ts create mode 100644 src/lang/typescript/public_field_definition.visitor.ts create mode 100644 src/lang/typescript/visitors/class.visitor.ts create mode 100644 src/lang/typescript/visitors/export_statement.visitor.ts create mode 100644 src/lang/typescript/visitors/method_definition.visitor.ts create mode 100644 src/lang/typescript/visitors/node.visitor.ts create mode 100644 src/lang/typescript/visitors/program.visitor.ts create mode 100644 src/lang/typescript/visitors/type.visitor.ts create mode 100644 src/lang/typescript/visitors/type_parameters.visitor.ts create mode 100644 src/utils/comment.ts rename src/utils/{location.ts => range.ts} (71%) create mode 100644 src/utils/text.ts diff --git a/example.ts b/example.ts index b4352bb..6d201c5 100644 --- a/example.ts +++ b/example.ts @@ -1,69 +1,40 @@ -/** - * # API - * - * ``` - * @export - * @class A - * ``` - */ -export default class A { - constructor() { - - } +interface K { + /** + * @property prop1: string + */ + prop1: string + /** + * @property prop2: string + */ + prop2: string } -// /** -// * # API -// * -// * ``` -// * @export -// * @class B -// * ``` -// */ -// export class B extends A { +class A { -// } - -// /** -// * # API -// * -// * ``` -// * @export -// * @class C -// * -// * @property a: any - Description -// * @property b: any - Description -// * ``` -// */ -// export class C extends A { -// a: any -// b: any -// } +} +class Z { +} /** - * + * Description * # API - * ``` - * @interface B * - * @property propertyA: any - * @property propertyB: any - * @property propertyC: any + * ``` + * @export default + * @class B * ``` */ -export interface D { - propertyA - propertyB - propertyC +export default class B implements A, Z { /** - * Description + * @property prop: string - description + */ + private prop: (T & K) | T + /** + * Initialize the class * - * ```xdoc - * @method method - * @param x - * @param y - * @param z - * ``` */ - method(x, y, z?): Promise -} \ No newline at end of file + constructor() { + // super() + } +} + diff --git a/index.ts b/index.ts index d9f7b9c..63c4e72 100644 --- a/index.ts +++ b/index.ts @@ -1,5 +1,4 @@ import IFile from './src/interfaces/IFile'; -import IResult from './src/interfaces/IResult'; import ParserFactory from './src/ParserFactory'; import IParser from './src/interfaces/IParser'; import * as FS from 'fs'; @@ -20,7 +19,7 @@ export default class Parser implements IParser { constructor(file: IFile, options: any = {}) { this.parser = (new ParserFactory(file, options)).getParser(); } - parse = (): IResult => { + parse = () => { return this.parser.parse() } } @@ -34,4 +33,5 @@ const result = new Parser({ }).parse(); -console.log(JSON.stringify(result, null, 2)) \ No newline at end of file +// console.log(JSON.stringify(result, null, 2)) +// console.log(result); diff --git a/package-lock.json b/package-lock.json index 79c5af8..ba42fcf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -66,9 +66,9 @@ "dev": true }, "@types/node": { - "version": "8.10.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.24.tgz", - "integrity": "sha512-5YaBKa6oFuWy7ptIFMATyftIcpZTZtvgrzPThEbs+kl4Uu41oUxiRunG0k32QZjD6MXMELls//ry/epNxc11aQ==", + "version": "8.10.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.25.tgz", + "integrity": "sha512-WXvAXaknB0c2cJ7N44e1kUrVu5K90mSfPPaT5XxfuSMxEWva86EYIwxUZM3jNZ2P1CIC9e2z4WJqpAF69PQxeA==", "dev": true }, "ansi-regex": { @@ -1188,9 +1188,9 @@ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" }, "tree-sitter": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.13.5.tgz", - "integrity": "sha512-g3/V7jNzW/tHKAhj2RLs9JBPYlh4yyk6byqcJfR/P/D8EaWpNfijqW3Uaj+b2sMe6EBqGD1y4cQRt3UuCFvgBQ==", + "version": "0.13.6", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.13.6.tgz", + "integrity": "sha512-HU6wzU1KUVe56HQKU04rVhX51U6myG3tuc3cdKZHNztv9LihI33eIOxGExPPCTSpHfDoV+a0i6Az8YOopEj+5w==", "requires": { "nan": "^2.10.0", "prebuild-install": "^5.0.0" @@ -1363,9 +1363,9 @@ "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=" }, "xdoc-parser": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/xdoc-parser/-/xdoc-parser-2.1.6.tgz", - "integrity": "sha512-PqkQeiyf/E0NjwDq0RCu75o2bKG9mJbe0OGOGRsVTtrnK3cdrMkZd2jvj5WDnZumpnd7IXEj4iTlQDvUoe+vgA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/xdoc-parser/-/xdoc-parser-3.2.0.tgz", + "integrity": "sha512-nxVrhut5c4tFBUOdaUPq5nEAaGY69P2fvNBz8MYo+jfoPfo1fHvJy4GAgD06PZVfg3W57xjF1DQ0LTROlntQ6g==", "requires": { "antlr4ts": "^0.4.1-alpha.0", "lodash": "^4.17.10", diff --git a/package.json b/package.json index 11169a2..5cb3d1a 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "homepage": "https://github.com/mr-doc/parser#readme", "devDependencies": { "@types/mocha": "^2.2.48", - "@types/node": "^8.10.24", + "@types/node": "^8.10.25", "chai": "^4.1.2", "mocha": "^4.1.0" }, @@ -29,9 +29,9 @@ "babel-traverse": "^6.7.6", "babylon": "^6.7.0", "lodash": "^4.17.10", - "tree-sitter": "^0.13.4", + "tree-sitter": "^0.13.6", "tree-sitter-javascript": "^0.13.5", "tree-sitter-typescript": "^0.13.3", - "xdoc-parser": "^2.1.6" + "xdoc-parser": "^3.2.0" } } diff --git a/src/CommentParser.ts b/src/CommentParser.ts deleted file mode 100644 index e1ab710..0000000 --- a/src/CommentParser.ts +++ /dev/null @@ -1,95 +0,0 @@ -import IComment from "./interfaces/IComment"; -import * as Parser from 'tree-sitter'; -import xdoc from 'xdoc-parser'; -import { Location, Position } from './interfaces/IComment'; - -/** - * Creates a position object. - * @param node: Parser.SyntaxNode - * @param offset: { - * location: Location, - * position: Position - * } - */ -function position( - node: Parser.SyntaxNode, - offset?: { location: Location, position: Position } -) { - return { - start: offset ? offset.position.start + node.startIndex : node.startIndex, - end: offset ? offset.position.end + node.endIndex : node.endIndex - } -} - -/** - * Creates a location object. - * @param node: Parser.SyntaxNode - * @param offset: { - * location: Location, - * position: Position - * } - * @return: { - * start: { - * row: number, - * column: number - * }, - * end: { - * row: number, - * column: number - * } - * } - */ -function location( - node: Parser.SyntaxNode, - offset: { location: Location, position: Position } -) { - return { - start: { - row: offset ? offset.location.start.row + node.startPosition.row : node.startPosition.row, - column: offset ? offset.location.start.column + node.startPosition.column : node.startPosition.column - }, - end: { - row: offset ? offset.location.end.row + node.endPosition.row : node.endPosition.row, - column: offset ? offset.location.end.column + node.endPosition.column : node.endPosition.column - } - } -} - -export default class CommentParser { - static parse( - node: Parser.SyntaxNode, - source: string, - offset?: { location: Location, position: Position }, - comments: IComment[] = [], - ) { - // console.log(node.type) - if (node.type === "comment" && node.nextSibling) { - // console.log(node.nextSibling.type) - // console.log(`${node.nextSibling.type} has a leading comment.`); - const next = node.nextSibling; - - // console.log(source.substring(next.startIndex, next.endIndex)); - // console.log(''); - comments.push({ - position: position(node, offset), - location: location(node, offset), - markdown: (xdoc(source.substring(node.startIndex, node.endIndex), { - visitor: { - showNodeText: true - } - })).parse(), - text: source.substring(node.startIndex, node.endIndex), - context: { - position: position(next, offset), - location: location(next, offset), - text: source.substring(next.startIndex, next.endIndex), - type: next.type, - children: [] - } - }); - } - - node.children.forEach(child => CommentParser.parse(child, source, offset, comments)); - return comments; - } -} \ No newline at end of file diff --git a/src/interfaces/IComment.ts b/src/interfaces/IComment.ts deleted file mode 100644 index 1f93d91..0000000 --- a/src/interfaces/IComment.ts +++ /dev/null @@ -1,25 +0,0 @@ -import IFile from "./IFile"; -import { RemarkNode } from 'xdoc-parser/src/XDocParser' -export interface Position { - start: number, - end: number; -} - -export interface Location { - start: { row: number, column: number }, - end: { row: number, column: number } -} - -export default interface IComment { - position: Position, - location: Location, - markdown: RemarkNode[], - text: string - context: { - position: Position, - location: Location, - text: string, - type: string, - children: IComment[] | undefined[] - } -} \ No newline at end of file diff --git a/src/interfaces/ILocation.ts b/src/interfaces/ILocation.ts deleted file mode 100644 index ef5037b..0000000 --- a/src/interfaces/ILocation.ts +++ /dev/null @@ -1,10 +0,0 @@ -export interface ILocation { - position: { - start: number, - end: number, - } - location: { - row: { start: number, end: number }, - column: { start: number, end: number } - } -} \ No newline at end of file diff --git a/src/interfaces/IParser.ts b/src/interfaces/IParser.ts index 550cb5f..00ab809 100644 --- a/src/interfaces/IParser.ts +++ b/src/interfaces/IParser.ts @@ -1,5 +1,5 @@ import IFile from "./IFile"; -import IResult from "./IResult"; +// import IResult from "./IResult"; export default abstract class IParser { constructor(file: IFile, options: any) { diff --git a/src/interfaces/IResult.ts b/src/interfaces/IResult.ts deleted file mode 100644 index 7dbf5e1..0000000 --- a/src/interfaces/IResult.ts +++ /dev/null @@ -1,7 +0,0 @@ -import IFile from "./IFile"; -import IComment from "./IComment"; - -export default interface IResult { - file: IFile, - comments: IComment[] -} \ No newline at end of file diff --git a/src/interfaces/TextRange.ts b/src/interfaces/TextRange.ts new file mode 100644 index 0000000..36ab160 --- /dev/null +++ b/src/interfaces/TextRange.ts @@ -0,0 +1,47 @@ + +/** + * An interface that represents a range. + * + * ```xdoc + * @interface Range + * ``` + */ +export interface Range { + start: number, + end: number +} + +/** + * An interface that represents the positional + * and locational ranges of a source code. + * + * ```xdoc + * @interface TextRange + * ``` + */ +export default interface TextRange { + /** + * Represents a context's start and end position. + * ```xdoc + * @property position: { + * start: number, + * end: number + * } + * ``` + */ + position: Range + /** + * Represents a context's row and column location. + * + * ```xdoc + * @location: { + * row: Range, + * column: Range + * } + * ``` + */ + location: { + row: Range, + column: Range + } +} \ No newline at end of file diff --git a/src/lang/javascript/index.ts b/src/lang/javascript/index.ts index dc13a8b..d9acf3b 100644 --- a/src/lang/javascript/index.ts +++ b/src/lang/javascript/index.ts @@ -2,9 +2,8 @@ import * as Parser from 'tree-sitter'; import * as JavaScript from 'tree-sitter-javascript'; import IParser from '../../interfaces/IParser'; import IFile from '../../interfaces/IFile'; -import IResult from '../../interfaces/IResult'; -import CommentParser from '../../CommentParser'; -import IComment from '../../interfaces/IComment'; +// import IResult from '../../interfaces/IResult'; +// import IComment from '../../interfaces/IComment'; /** * A class that parses JavaScript comments. @@ -27,83 +26,83 @@ export default class JavaScriptParser implements IParser { this.parser = new Parser(); this.parser.setLanguage(JavaScript); } - parse = (): IResult => { - let tree = this.parser.parse(this.file.text); - // Get the first comment - let first_comment = tree.rootNode.children - .filter(node => node.type === "comment")[0]; - const first_comment_string = this.file.text - .substring(first_comment.startIndex, first_comment.endIndex); + parse = () => { + // let tree = this.parser.parse(this.file.text); + // // Get the first comment + // let first_comment = tree.rootNode.children + // .filter(node => node.type === "comment")[0]; + // const first_comment_string = this.file.text + // .substring(first_comment.startIndex, first_comment.endIndex); - // Remove any legal or unncessary comments - if (first_comment_string.includes("copyright") || - first_comment_string.includes("author") || - first_comment_string.includes("terms and conditions")) { - tree.edit({ - startIndex: first_comment.startIndex, - oldEndIndex: first_comment.endIndex, - newEndIndex: first_comment.endIndex, - startPosition: { row: 0, column: 0 }, - oldEndPosition: { row: 0, column: 0 }, - newEndPosition: { row: 0, column: 0 }, - }); - tree = this.parser.parse('', tree); - } - return { - file: this.file, - comments: CommentParser.parse(tree.rootNode, this.file.text) - .filter(this.filterType) - // .map(this.checkType) - .map(this.parseChildren) - } + // // Remove any legal or unncessary comments + // if (first_comment_string.includes("copyright") || + // first_comment_string.includes("author") || + // first_comment_string.includes("terms and conditions")) { + // tree.edit({ + // startIndex: first_comment.startIndex, + // oldEndIndex: first_comment.endIndex, + // newEndIndex: first_comment.endIndex, + // startPosition: { row: 0, column: 0 }, + // oldEndPosition: { row: 0, column: 0 }, + // newEndPosition: { row: 0, column: 0 }, + // }); + // tree = this.parser.parse('', tree); + // } + // return { + // file: this.file, + // comments: CommentParser.parse(tree.rootNode, this.file.text) + // .filter(this.filterType) + // // .map(this.checkType) + // .map(this.parseChildren) + // } } - private filterType = (comment: IComment): boolean => { - return (this.options.filter || - [ - 'function', - 'class', - 'variable_declaration' - ]).includes(comment.context.type) - } + // private filterType = (comment): boolean => { + // return (this.options.filter || + // [ + // 'function', + // 'class', + // 'variable_declaration' + // ]).includes(comment.context.type) + // } - private checkType = (comment: IComment): IComment => { - const tree = this.parser.parse(comment.context.text); - switch (comment.context.type) { - case 'variable_declaration': - // Check whether we have an anonymous class - if (comment.context.text.includes("class")) { - // Drill down until we find the class body - const variable_declarator = tree.rootNode.children[0].children[1]; - const anonymous_class = variable_declarator.children - .filter(node => node.type === "anonymous_class")[0] - const class_body = anonymous_class.children[1]; - comment.context.children = CommentParser.parse( - class_body, - comment.context.text, - { location: comment.context.location, position: comment.context.position } - ); - } - break; - default: - break; - } - return comment; - } + // private checkType = (comment) => { + // const tree = this.parser.parse(comment.context.text); + // switch (comment.context.type) { + // case 'variable_declaration': + // // Check whether we have an anonymous class + // if (comment.context.text.includes("class")) { + // // Drill down until we find the class body + // const variable_declarator = tree.rootNode.children[0].children[1]; + // const anonymous_class = variable_declarator.children + // .filter(node => node.type === "anonymous_class")[0] + // const class_body = anonymous_class.children[1]; + // comment.context.children = CommentParser.parse( + // class_body, + // comment.context.text, + // { location: comment.context.location, position: comment.context.position } + // ); + // } + // break; + // default: + // break; + // } + // return comment; + // } - private parseChildren = (comment: IComment): IComment => { - switch (comment.context.type) { - case 'class': - const tree = this.parser.parse(comment.context.text); - comment.context.children = CommentParser.parse( - tree.rootNode, - comment.context.text, - { location: comment.context.location, position: comment.context.position } - ).filter(child => child.context.type === 'method_definition'); - break; - default: - break; - } - return comment; - } + // private parseChildren = (comment) => { + // switch (comment.context.type) { + // case 'class': + // const tree = this.parser.parse(comment.context.text); + // comment.context.children = CommentParser.parse( + // tree.rootNode, + // comment.context.text, + // { location: comment.context.location, position: comment.context.position } + // ).filter(child => child.context.type === 'method_definition'); + // break; + // default: + // break; + // } + // return comment; + // } } \ No newline at end of file diff --git a/src/lang/typescript/Node.ts b/src/lang/typescript/Node.ts index 0b6a76a..ea64c6f 100644 --- a/src/lang/typescript/Node.ts +++ b/src/lang/typescript/Node.ts @@ -1,43 +1,62 @@ -import { ILocation } from "../../interfaces/ILocation"; +import TextRange from "../../interfaces/TextRange"; +import { SyntaxNode } from "tree-sitter"; +import range from "../../utils/range"; -export interface NodeContext extends ILocation { - text: string +export interface Node extends TextRange { + text: string, + properties?: Partial } -export interface NodeProperties { - exports: { - export: boolean, - default: boolean - } - } - - - export interface ClassNode { - class: { - comment: NodeContext, - context: NodeContext, - identifier: NodeContext, - heritage: NodeContext, - body: any[], - properties: Partial - } +export function createNode( + source: string, + node: SyntaxNode, + properties?: Partial +): Node { + return { + ...range(node), + text: source.substring(node.startIndex, node.endIndex), + properties } - - export interface ClassBodyNode { - methods: ClassMethodNode[], - properties: any[] - } - - export interface ClassMethodNode { - identifier: NodeContext, - // Note: parameters contains '(' ... ')' - parameters: NodeContext[], - comment: NodeContext, - context: NodeContext, - type: string, - async: boolean, - private: boolean - } \ No newline at end of file +} + + +export interface NodeProperties { + exports: Partial + inheritance: Partial +} + +export interface NodeExports { + export: boolean, + default: boolean +} + +export interface NodeInheritance { + extends: boolean, + implements: boolean +} + + // export interface ClassNode extends Node { + // class: { + // comment: Node, + // context: Node, + // identifier: Node, + // heritage: Node, + // body: any[] + // } + // } + + // export interface ClassBodyNode { + // methods: ClassMethodNode[], + // properties: any[] + // } + + // export interface ClassMethodNode { + // identifier: Node, + // // Note: parameters contains '(' ... ')' + // parameters: Node[], + // comment: Node, + // context: Node, + // type: string, + // async: boolean, + // private: boolean + // } \ No newline at end of file diff --git a/src/lang/typescript/index.ts b/src/lang/typescript/index.ts index db20764..4bb29ea 100644 --- a/src/lang/typescript/index.ts +++ b/src/lang/typescript/index.ts @@ -2,9 +2,7 @@ import * as Parser from 'tree-sitter'; import * as TypeScript from 'tree-sitter-typescript'; import IParser from '../../interfaces/IParser'; import IFile from '../../interfaces/IFile'; -import location from '../../utils/location'; -import match from '../../utils/match'; -import { NodeProperties, ClassNode, ClassBodyNode, ClassMethodNode, NodeContext } from './Node'; +import { visitProgram } from './visitors/program.visitor'; /** @@ -31,358 +29,241 @@ export default class TypeScriptParser implements IParser { parse = () => { const tree = this.parser.parse(this.file.text); if (tree.rootNode.type === "program") { - return this.visitProgram(tree.rootNode) + return visitProgram(this.source, tree.rootNode) } } - /* Visitors */ + /* Properties */ - private visitProgram = (node: Parser.SyntaxNode) => { - let children = node.children; - if (node.children.length > 0) { - if (this.isLegalComment(node.children[0])) { - // Remove the legal comment from ast - children = node.children.splice(1); - } - // Perf: O(n) - return children.map(child => { - const nextSibling = child.nextSibling; - // Determine if the node is a c-style comment - if (match(child, 'comment') && this.isCStyleComment(child)) { - // Determine whether a comment has a sibling - if (nextSibling) { - // Visit the sibling - // Perf: Possibly O(n^2) - return this.visitNode(nextSibling, child, { - exports: { - export: false, - default: false - } - }); - } - } - }).filter(child => !!child); - } + private get source(): string { + return this.file.text; } - /* Export node */ - - private visitExportStatement = ( - node: Parser.SyntaxNode, - leadingComment: Parser.SyntaxNode - ) => { - let isDefaultExport = false; - // Remove the 'export' node - let children = node.children.slice(1); - if (match(node.children[1], 'default')) { - isDefaultExport = true; - // Remove the 'default' node - children = children.slice(1); - } - // Most likely, the first index will point to the exported type - const child = children[0]; - return this.visitNode(child, leadingComment, { - exports: { - export: true, - default: isDefaultExport - } - }); - } + /* Visitors */ /* Class Node */ - private visitClass = ( - node: Parser.SyntaxNode, - leadingComment: Parser.SyntaxNode, - properties: Partial - ): ClassNode => { - let children = node.children; - // Remove 'class' since we already know that - children = children.slice(1); - // Get the class/type identifier - const classIdentifier = this.getNodeContext(children[0]); - // Remove the identifier - children = children.slice(1); - - const classProperties = Object.assign({ - implements: false, - extends: false, - }, properties); - let heritage = null; - // Determine whether the class extends or implements - if (match(children[0], 'class_heritage')) { - if (this.getNodeContext(children[0]).text.includes("implements")) { - classProperties.implements = true; - } else if (this.getNodeContext(children[0]).text.includes("extends")) { - classProperties.extends = true; - } - // Store the heritage - heritage = this.getNodeContext(children[0].children[0]) - // Remove the heritage node - children = children.slice(1); - } - - let classBody: any = children[0]; - classBody = this.visitClassBody(classBody); - return { - class: { - comment: this.getNodeContext(leadingComment), - context: this.getNodeContext(node), - identifier: classIdentifier, - heritage, - body: classBody, - properties: classProperties - } - } - } - - private visitClassBody = (node: Parser.SyntaxNode): ClassBodyNode => { - const methods = []; - const properties = []; - // Perf: O(n) - node.children.forEach(classChild => { - if (match(classChild, 'comment') && this.isCStyleComment(classChild)) { - const nextSibling = classChild.nextSibling; - if (nextSibling) { - switch (nextSibling.type) { - case 'method_definition': - let method = this.visitClassMethod(nextSibling, classChild); - if (method.type === 'method') { - methods.push(method); - } else if (method.type === 'property') { - properties.push(method); - } - break; - default: - this.warnNotSupported(nextSibling); - - break; - } - } - } - }); - return { - methods, - properties, - } - } - - private visitClassMethod = ( - node: Parser.SyntaxNode, - leadingComment: Parser.SyntaxNode - ): ClassMethodNode => { - let children = node.children; - let isPrivate = false, isProperty = false, isAsync = false; - - // Determine whether it is a private method - if (match(children[0], 'accessibility_modifier')) { - isPrivate = children[0].children[0].type === "private"; - // Remove 'private' - children = children.slice(1); - } - - // Determine whether it is a property - if (match(children[0], 'get')) { - isProperty = true; - // Remove the 'get' node - children = children.slice(1); - } - // Determine whether it is an async method - if (match(children[0], 'async')) { - isAsync = true; - children = children.slice(1); - } - - // Get the formal parameters - const formal_parameters = children[1].children[0]; - const parameters = formal_parameters.children; - // console.log(parameters); - - return { - identifier: this.getNodeContext(children[0]), - // Note: parameters contains '(' ... ')' - parameters: parameters.map(this.getNodeContext.bind(this)), - comment: this.getNodeContext(leadingComment), - context: this.getNodeContext(node), - type: isProperty ? 'property' : 'method', - async: isAsync, - private: isPrivate - } - } + // private visitClass = ( + // node: Parser.SyntaxNode, + // leadingComment: Parser.SyntaxNode, + // properties: Partial + // ): ClassNode => { + // let children = node.children; + // // Remove 'class' since we already know that + // children = children.slice(1); + // // Get the class/type identifier + // const classIdentifier = this.getNodeContext(children[0]); + // // Remove the identifier + // children = children.slice(1); + + // const classProperties = Object.assign({ + // implements: false, + // extends: false, + // }, properties); + // let heritage = null; + // // Determine whether the class extends or implements + // if (match(children[0], 'class_heritage')) { + // if (this.getNodeContext(children[0]).text.includes("implements")) { + // classProperties.implements = true; + // } else if (this.getNodeContext(children[0]).text.includes("extends")) { + // classProperties.extends = true; + // } + // // Store the heritage + // heritage = this.getNodeContext(children[0].children[0]) + // // Remove the heritage node + // children = children.slice(1); + // } + + // let classBody: any = children[0]; + // classBody = this.visitClassBody(classBody); + // return { + // class: { + // comment: this.getNodeContext(leadingComment), + // context: this.getNodeContext(node), + // identifier: classIdentifier, + // heritage, + // body: classBody, + // } + // } + // } + + // private visitClassBody = (node: Parser.SyntaxNode) => { + // const methods = []; + // const properties = []; + // // Perf: O(n) + // node.children.forEach(classChild => { + // if (match(classChild, 'comment') && this.isCStyleComment(classChild)) { + // const nextSibling = classChild.nextSibling; + // if (nextSibling) { + // switch (nextSibling.type) { + // case 'method_definition': + // let method = visitClassMethod(nextSibling, classChild); + // if (method.type === 'method') { + // methods.push(method); + // } else if (method.type === 'property') { + // properties.push(method); + // } + // break; + // default: + // this.warnNotSupported(nextSibling); + + // break; + // } + // } + // } + // }); + // return { + // methods, + // properties, + // } + // } + + // private visitClassMethod = ( + // node: Parser.SyntaxNode, + // leadingComment: Parser.SyntaxNode + // ): ClassMethodNode => { + // let children = node.children; + // let isPrivate = false, isProperty = false, isAsync = false; + + // // Determine whether it is a private method + // if (match(children[0], 'accessibility_modifier')) { + // isPrivate = children[0].children[0].type === "private"; + // // Remove 'private' + // children = children.slice(1); + // } + + // // Determine whether it is a property + // if (match(children[0], 'get')) { + // isProperty = true; + // // Remove the 'get' node + // children = children.slice(1); + // } + // // Determine whether it is an async method + // if (match(children[0], 'async')) { + // isAsync = true; + // children = children.slice(1); + // } + + // // Get the formal parameters + // const formal_parameters = children[1].children[0]; + // const parameters = formal_parameters.children; + // // console.log(parameters); + + // return { + // identifier: this.createNode(children[0]), + // // Note: parameters contains '(' ... ')' + // parameters: parameters.map(this.createNode.bind(this)), + // comment: this.createNode(leadingComment), + // context: this.createNode(node), + // type: isProperty ? 'property' : 'method', + // async: isAsync, + // private: isPrivate + // } + // } /* Interface Node */ - private visitInterfaceNode = (node: Parser.SyntaxNode, leadingComment: Parser.SyntaxNode, properties: Partial) => { - let children = node.children; - // Remove 'interface' since we already know that - children = children.slice(1); - // Get the interface identifier - const interfaceIdentifier = this.getNodeContext(children[0]); - // Remove the identifier - children = children.slice(1); - - const interfaceProperties = Object.assign({ - // For consistency, we'll keep 'implements' - implements: false, - extends: false - }, properties); - - let heritage = null; - - // Determine whether the class extends or implements - if (match(children[0], 'class_heritage')) { - if (this.getNodeContext(children[0]).text.includes("extends")) { - interfaceProperties.extends = true; - } - // Store the heritage - heritage = this.getNodeContext(children[0].children[0]) - // Remove the heritage node - children = children.slice(1); - } - // console.log(children[0].children); - let interfaceBody: any = children[0]; - interfaceBody = this.visitObjectTypeNode(interfaceBody); - return { - interface: { - comment: this.getNodeContext(leadingComment), - context: this.getNodeContext(node), - identifier: interfaceIdentifier, - heritage, - body: interfaceBody, - properties: interfaceProperties - } - } - } - - - private visitObjectTypeNode = (node: Parser.SyntaxNode) => { - const methods = []; - const properties = []; - - node.children.forEach(child => { - if (match(child, 'comment') && this.isCStyleComment(child)) { - const nextSibling = child.nextSibling; - if (nextSibling) { - switch (nextSibling.type) { - case 'method_signature': - methods.push(this.visitMethodSignature(nextSibling, child)); - break; - default: - this.warnNotSupported(nextSibling); - break; - } - } - } - }); - - return { - methods, - properties - } - } - - private visitMethodSignature = ( - node: Parser.SyntaxNode, - leadingComment: Parser.SyntaxNode - ) => { - const identifer = node.children[0]; - const call_signature = node.children[1]; - let call_signature_children = call_signature.children; - let type_parameters = []; - - // Determine whether generics are used, such as myfunc(...): T - if (call_signature_children[0].type === 'type_parameters') { - type_parameters = call_signature_children.map(this.getNodeContext.bind(this)); - call_signature_children = call_signature_children.slice(1); - } - - // Note: An interface can have required and optional parameters - // so we need to check later if a '?' exists - let parameters: any = call_signature_children[0].children - .map(this.getNodeContext.bind(this)); - // Remove parameters - call_signature_children = call_signature_children.slice(1); - - // Get the type annotation for the method signature - let type_annotation: any = call_signature_children[0]; - // Determine if it does exists - if (type_annotation && type_annotation.children[1]) { - type_annotation = this.getNodeContext(type_annotation.children[1]); - } - return { - identifier: this.getNodeContext(identifer), - parameters, - type_parameters, - type_annotation - } - } - - private visitNode = ( - node: Parser.SyntaxNode, - leadingComment: Parser.SyntaxNode, - properties: Partial - ) => { - const context = this.getNodeContext(node); - switch (node.type) { - // Note: Export statemens may include - case 'export_statement': - return this.visitExportStatement(node, leadingComment); - case 'class': - return this.visitClass(node, leadingComment, properties); - // TODO: Complete interfaces and functions - case 'interface_declaration': - return this.visitInterfaceNode(node, leadingComment, properties); - break; - // case 'function': - // break; - case 'comment': - // noop - break; - case 'ERROR': - console.error( - `[mr-doc::parser]: 'tree-sitter' was not able to parse at row ${context.location.row.start + 1}.` - ) - break; - default: - this.warnNotSupported(node); - break; - } - } - - - - /* Helpers */ - - private isCStyleComment(node: Parser.SyntaxNode) { - const comment = this.getNodeContext(node).text; - // https://blog.ostermiller.org/find-comment - return comment.match(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/); - } - - private isLegalComment = (node: Parser.SyntaxNode) => { - const possibleTexts = [ - 'copyright', - 'terms and conditions', - 'license', - 'all rights reserved' - ]; - if (match(node, 'comment')) { - return possibleTexts.map(text => - this.file.text - .substring(node.startIndex, node.endIndex) - .toLowerCase() - .includes(text) - ).includes(true); - } - } - - private getNodeContext(node: Parser.SyntaxNode): NodeContext { - return { - ...location(node), - text: this.file.text.substring(node.startIndex, node.endIndex) - } - } - - private warnNotSupported = (node: Parser.SyntaxNode) => { - console.log(`[mr-doc::parser]: warning - '${node.type.replace(/[_]/g, ' ')}' is not supported yet.`); - } + // private visitInterfaceNode = (node: Parser.SyntaxNode, leadingComment: Parser.SyntaxNode, properties: Partial) => { + // let children = node.children; + // // Remove 'interface' since we already know that + // children = children.slice(1); + // // Get the interface identifier + // const interfaceIdentifier = this.createNode(children[0]); + // // Remove the identifier + // children = children.slice(1); + + // const interfaceProperties = Object.assign({ + // // For consistency, we'll keep 'implements' + // implements: false, + // extends: false + // }, properties); + + // let heritage = null; + + // // Determine whether the class extends or implements + // if (match(children[0], 'class_heritage')) { + // if (this.createNode(children[0]).text.includes("extends")) { + // interfaceProperties.extends = true; + // } + // // Store the heritage + // heritage = this.createNode(children[0].children[0]) + // // Remove the heritage node + // children = children.slice(1); + // } + // // console.log(children[0].children); + // let interfaceBody: any = children[0]; + // interfaceBody = this.visitObjectTypeNode(interfaceBody); + // return { + // interface: { + // comment: this.createNode(leadingComment), + // context: this.createNode(node), + // identifier: interfaceIdentifier, + // heritage, + // body: interfaceBody, + // properties: interfaceProperties + // } + // } + // } + + + // private visitObjectTypeNode = (node: Parser.SyntaxNode) => { + // const methods = []; + // const properties = []; + + // node.children.forEach(child => { + // if (match(child, 'comment') && this.isCStyleComment(child)) { + // const nextSibling = child.nextSibling; + // if (nextSibling) { + // switch (nextSibling.type) { + // case 'method_signature': + // methods.push(this.visitMethodSignature(nextSibling, child)); + // break; + // default: + // this.warnNotSupported(nextSibling); + // break; + // } + // } + // } + // }); + + // return { + // methods, + // properties + // } + // } + + // private visitMethodSignature = ( + // node: Parser.SyntaxNode, + // leadingComment: Parser.SyntaxNode + // ) => { + // const identifer = node.children[0]; + // const call_signature = node.children[1]; + // let call_signature_children = call_signature.children; + // let type_parameters = []; + + // // Determine whether generics are used, such as myfunc(...): T + // if (call_signature_children[0].type === 'type_parameters') { + // type_parameters = call_signature_children.map(this.createNode.bind(this)); + // call_signature_children = call_signature_children.slice(1); + // } + + // // Note: An interface can have required and optional parameters + // // so we need to check later if a '?' exists + // let parameters: any = call_signature_children[0].children + // .map(this.createNode.bind(this)); + // // Remove parameters + // call_signature_children = call_signature_children.slice(1); + + // // Get the type annotation for the method signature + // let type_annotation: any = call_signature_children[0]; + // // Determine if it does exists + // if (type_annotation && type_annotation.children[1]) { + // type_annotation = this.createNode(type_annotation.children[1]); + // } + // return { + // identifier: this.createNode(identifer), + // parameters, + // type_parameters, + // type_annotation + // } + // } } diff --git a/src/lang/typescript/public_field_definition.visitor.ts b/src/lang/typescript/public_field_definition.visitor.ts new file mode 100644 index 0000000..86f4cbb --- /dev/null +++ b/src/lang/typescript/public_field_definition.visitor.ts @@ -0,0 +1,25 @@ +import { SyntaxNode } from "tree-sitter"; +import match from "../../utils/match"; +import { text } from "../../utils/text"; + +export function visitPublicFieldDefinition(source: string, node: SyntaxNode) { + let public_field_definition = node.children; + let accessibility = 'public', + identifier, + type_annotation; + + if (match(public_field_definition[0], 'accessibility_modifier')) { + accessibility = text(source, public_field_definition[0]); + public_field_definition.shift(); + } + + if (match(public_field_definition[0], 'property_identifier')) { + identifier = text(source, public_field_definition[0]); + public_field_definition.shift(); + } + + if (match(public_field_definition[0], 'type_annotation')) { + console.log(public_field_definition[0].children); + } + +} \ No newline at end of file diff --git a/src/lang/typescript/visitors/class.visitor.ts b/src/lang/typescript/visitors/class.visitor.ts new file mode 100644 index 0000000..d316009 --- /dev/null +++ b/src/lang/typescript/visitors/class.visitor.ts @@ -0,0 +1,94 @@ +import { SyntaxNode } from "tree-sitter"; +import { NodeProperties, createNode, NodeInheritance } from "../Node"; +import { text } from "../../../utils/text"; +import visitTypeParameters from "./type_parameters.visitor"; +import match from "../../../utils/match"; +import { isJavaDocComment } from "../../../utils/comment"; +import { visitMethodDefinition } from "./method_definition.visitor"; +import { visitPublicFieldDefinition } from "../public_field_definition.visitor"; + +export function visitClass( + source: string, + node: SyntaxNode, + comment: SyntaxNode, + properties?: Partial +) { + let children = node.children; + // Remove 'class' from the array + children.shift() + const identifier = createNode(source, children.shift()) + const visited = children.map(child => { + switch (child.type) { + case 'type_parameters': + return visitTypeParameters(source, child) + case 'class_heritage': + return visitClassHeritage(source, child) + case 'class_body': + return visitClassBody(source, child) + default: + console.log(`[mr-doc::parser]: warning - '${node.type.replace(/[_]/g, ' ')}' is not supported yet.`) + break; + } + }); + + const type_parameters = visited.filter(child => child.type === 'type_parameters').shift() + const heritage = visited.filter(child => child.type === 'class_heritage').shift() + const body = visited.filter(child => child.type === 'class_body').shift(); + + return { + type: 'class', + identifier, + type_parameters, + heritage, + body, + properties, + comment: createNode(source, comment), + context: createNode(source, node) + } +} + +export function visitClassHeritage(source: string, node: SyntaxNode) { + let heritage_clause = node.children.shift(); + let heritage_clause_children = heritage_clause.children; + // Remove the heritage type ('implements' or 'extends') + let heritage_type = heritage_clause_children.shift(); + + return { + type: 'class_heritage', + heritage_type: heritage_type.type, + context: createNode(source, node), + // A heritage is either 'implements' or 'extends' + identifiers: heritage_clause_children + .filter(child => child.type === 'type_identifier') + .map(child => ({ type: 'identifier', context: createNode(source, child) })) + } +} + +export function visitClassBody(source: string, node: SyntaxNode) { + + const methods = [] + const properties = [] + node.children + .filter(child => !child.type.match(/[{}]/)) + .forEach(child => { + const nextSibling = child.nextSibling; + if (match(child, 'comment') && isJavaDocComment(source, child)) { + if (nextSibling) { + switch (nextSibling.type) { + case 'method_definition': + return visitMethodDefinition(source, nextSibling); + case 'public_field_definition': + return visitPublicFieldDefinition(source, nextSibling); + default: + console.log(`[mr-doc::parser]: warning - '${nextSibling.type.replace(/[_]/g, ' ')}' is not supported yet.`) + break; + } + } + } + }) + + return { + type: 'class_body', + context: createNode(source, node), + } +} \ No newline at end of file diff --git a/src/lang/typescript/visitors/export_statement.visitor.ts b/src/lang/typescript/visitors/export_statement.visitor.ts new file mode 100644 index 0000000..0122022 --- /dev/null +++ b/src/lang/typescript/visitors/export_statement.visitor.ts @@ -0,0 +1,27 @@ +import { SyntaxNode } from "tree-sitter"; +import { NodeProperties } from "../Node"; +import { visitNode } from "./node.visitor"; +import match from "../../../utils/match"; + +export function visitExportStatement( + source: string, + node: SyntaxNode, + comment: SyntaxNode, +) { + let isDefaultExport = false; + // Remove the 'export' node + let children = node.children.slice(1); + if (match(node.children[1], 'default')) { + isDefaultExport = true; + // Remove the 'default' node + children = children.slice(1); + } + // Most likely, the first index will point to the exported type + const child = children[0]; + return visitNode(source, child, comment, { + exports: { + export: true, + default: isDefaultExport + } + }); +} \ No newline at end of file diff --git a/src/lang/typescript/visitors/method_definition.visitor.ts b/src/lang/typescript/visitors/method_definition.visitor.ts new file mode 100644 index 0000000..b445095 --- /dev/null +++ b/src/lang/typescript/visitors/method_definition.visitor.ts @@ -0,0 +1,5 @@ +import { SyntaxNode } from "tree-sitter"; + +export function visitMethodDefinition(source: string, node: SyntaxNode) { + +} \ No newline at end of file diff --git a/src/lang/typescript/visitors/node.visitor.ts b/src/lang/typescript/visitors/node.visitor.ts new file mode 100644 index 0000000..73eb96c --- /dev/null +++ b/src/lang/typescript/visitors/node.visitor.ts @@ -0,0 +1,37 @@ +import { SyntaxNode } from "tree-sitter"; +import { NodeProperties } from "../Node"; +import { visitClass } from "./class.visitor"; +import range from "../../../utils/range"; +import { visitExportStatement } from "./export_statement.visitor"; + +export function visitNode( + source: string, + node: SyntaxNode, + comment: SyntaxNode, + properties: Partial +) { + switch (node.type) { + // Note: Export statemens may include + case 'export_statement': + return visitExportStatement(source, node, comment); + case 'class': + return visitClass(source, node, comment, properties); + // TODO: Complete interfaces and functions + // case 'interface_declaration': + // return visitInterfaceDeclaration(node, comment, properties); + // case 'function': + // break; + case 'comment': + // noop + break; + case 'ERROR': + const location = range(node).location; + console.error( + `[mr-doc::parser]: 'tree-sitter' was not able to parse at (${location.row.start + 1}:${location.column.start}).` + ) + break; + default: + console.log(`[mr-doc::parser]: warning - '${node.type.replace(/[_]/g, ' ')}' is not supported yet.`); + break; + } +} \ No newline at end of file diff --git a/src/lang/typescript/visitors/program.visitor.ts b/src/lang/typescript/visitors/program.visitor.ts new file mode 100644 index 0000000..40691c9 --- /dev/null +++ b/src/lang/typescript/visitors/program.visitor.ts @@ -0,0 +1,32 @@ +import { SyntaxNode } from "tree-sitter"; +import match from "../../../utils/match"; +import { visitNode } from "./node.visitor"; +import { isJavaDocComment, isLegalComment } from "../../../utils/comment"; + +export function visitProgram(source: string, node: SyntaxNode) { + let children = node.children; + if (node.children.length > 0) { + if (isLegalComment(source, node.children[0])) { + // Remove the legal comment from ast + children = node.children.splice(1); + } + // Perf: O(n) + return children.map(child => { + const nextSibling = child.nextSibling; + // Determine if the node is a c-style comment + if (match(child, 'comment') && isJavaDocComment(source, child)) { + // Determine whether a comment has a sibling + if (nextSibling) { + // Visit the sibling + // Perf: Possibly O(n^2) + return visitNode(source, nextSibling, child, { + exports: { + export: false, + default: false + } + }); + } + } + }).filter(child => !!child); + } +} \ No newline at end of file diff --git a/src/lang/typescript/visitors/type.visitor.ts b/src/lang/typescript/visitors/type.visitor.ts new file mode 100644 index 0000000..74e3217 --- /dev/null +++ b/src/lang/typescript/visitors/type.visitor.ts @@ -0,0 +1,23 @@ +import { SyntaxNode } from "tree-sitter"; +import { createNode } from "../Node"; + +export function vistType(source:string, node: SyntaxNode) { + switch(node.type) { + case 'union_type': + return visitUnionType(source, node); + case 'intersection_type': + return visitIntersectionType(source, node); + } +} + +export function visitUnionType(source: string, node: SyntaxNode) { + return { + union: { + context: createNode(source, node) + } + } +} + +export function visitIntersectionType(source: string, node:SyntaxNode) { + +} \ No newline at end of file diff --git a/src/lang/typescript/visitors/type_parameters.visitor.ts b/src/lang/typescript/visitors/type_parameters.visitor.ts new file mode 100644 index 0000000..b05f6cf --- /dev/null +++ b/src/lang/typescript/visitors/type_parameters.visitor.ts @@ -0,0 +1,12 @@ +import { SyntaxNode } from "tree-sitter"; +import { createNode } from "../Node"; + +export default function visitTypeParameters(source: string, node: SyntaxNode) { + return { + type: 'type_parameters', + context: createNode(source, node), + parameters: node.children + .filter(child => !child.type.match(/[<>,]/)) + .map(child => ({ type: 'parameter', context: createNode(source, child) })) + } +} \ No newline at end of file diff --git a/src/utils/comment.ts b/src/utils/comment.ts new file mode 100644 index 0000000..3c42752 --- /dev/null +++ b/src/utils/comment.ts @@ -0,0 +1,42 @@ +import { SyntaxNode } from "tree-sitter"; +import match from "./match"; + +export const XDocRegex = /@(\w+)([^{[(\n]*)?([\{\[\(][\s\S]*[\}\]\)]([\s]*(=|-)>.*)?)?([\s]*-(.)*)?/gmi; + +export function isLegalComment (source: string, node: SyntaxNode) { + const possibleTexts = [ + 'copyright', + 'terms and conditions', + 'license', + 'all rights reserved' + ]; + if (match(node, 'comment')) { + return possibleTexts.map(text => + source + .substring(node.startIndex, node.endIndex) + .toLowerCase() + .includes(text) + ).includes(true); + } +} + +export function isJavaDocComment(source: string, node: SyntaxNode) { + const comment = source.substring(node.startIndex, node.endIndex); + // regexr.com/3ejvb + return /(\/\*\*)((\s*)(.*?)(\s))*(\*\/)/.test(comment) +} + +export function isXDocComment(source:string, node?: SyntaxNode) { + let comment = source; + if (node) comment = source.substring(node.startIndex, node.endIndex); + return XDocRegex.test(comment); +} + +export function isXDocCommentBlock(source: string, node: SyntaxNode) { + const comment = source.substring(node.startIndex, node.endIndex); + return /#API/.test(comment) || /\`\`\`xdoc/.test(comment) +} + +export function isXDocCommentFragment(source: string, node: SyntaxNode) { + return !isXDocCommentBlock(source, node) && isXDocComment(source, node); +} \ No newline at end of file diff --git a/src/utils/match.ts b/src/utils/match.ts index 4bd6e10..a3fce93 100644 --- a/src/utils/match.ts +++ b/src/utils/match.ts @@ -1,5 +1,13 @@ import { SyntaxNode } from "tree-sitter"; -export default function match(node: SyntaxNode, type: string) { +/** + * Determines whether a node is a certain type. + * ``` + * @param node: SyntaxNode - The node to compare. + * @param type: string - The node type to match. + * @return: boolean + * ``` + */ +export default function match(node: SyntaxNode, type: string): boolean { return node.type === type; } \ No newline at end of file diff --git a/src/utils/location.ts b/src/utils/range.ts similarity index 71% rename from src/utils/location.ts rename to src/utils/range.ts index aab7575..d4e1534 100644 --- a/src/utils/location.ts +++ b/src/utils/range.ts @@ -1,7 +1,7 @@ import * as Parser from 'tree-sitter'; -import { ILocation } from '../interfaces/ILocation'; +import TextRange from '../interfaces/TextRange'; -export default function location(node: Parser.SyntaxNode): ILocation { +export default function range(node: Parser.SyntaxNode): TextRange { return { position: { start: node.startIndex, diff --git a/src/utils/text.ts b/src/utils/text.ts new file mode 100644 index 0000000..1e67538 --- /dev/null +++ b/src/utils/text.ts @@ -0,0 +1,13 @@ +import { SyntaxNode } from "tree-sitter"; + +/** + * Returns the context string + * + * # API + * + * @param source: string - The source string. + * @param node: SyntaxNode - The syntax node. + */ +export function text(source: string, node: SyntaxNode) { + return source.substring(node.startIndex, node.endIndex); +} \ No newline at end of file From e5177d72ef3d531459f77c8c155248a0d998d919 Mon Sep 17 00:00:00 2001 From: Takeshi Date: Thu, 16 Aug 2018 21:36:15 -0600 Subject: [PATCH 07/32] Update: WIP --- example.ts | 6 --- package-lock.json | 12 ++--- package.json | 4 +- src/ParserFactory.ts | 1 - src/lang/typescript/Node.ts | 54 ++++++++----------- .../public_field_definition.visitor.ts | 16 ++++-- src/lang/typescript/visitors/class.visitor.ts | 17 +++--- .../visitors/method_definition.visitor.ts | 2 +- src/lang/typescript/visitors/type.visitor.ts | 48 ++++++++++++++--- 9 files changed, 95 insertions(+), 65 deletions(-) diff --git a/example.ts b/example.ts index 6d201c5..2bc3062 100644 --- a/example.ts +++ b/example.ts @@ -17,12 +17,6 @@ class Z { } /** * Description - * # API - * - * ``` - * @export default - * @class B - * ``` */ export default class B implements A, Z { /** diff --git a/package-lock.json b/package-lock.json index ba42fcf..5219e3c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -66,9 +66,9 @@ "dev": true }, "@types/node": { - "version": "8.10.25", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.25.tgz", - "integrity": "sha512-WXvAXaknB0c2cJ7N44e1kUrVu5K90mSfPPaT5XxfuSMxEWva86EYIwxUZM3jNZ2P1CIC9e2z4WJqpAF69PQxeA==", + "version": "8.10.26", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.26.tgz", + "integrity": "sha512-opk6bLLErLSwyVVJeSH5Ek7ZWOBSsN0JrvXTNVGLXLAXKB9xlTYajrplR44xVyMrmbut94H6uJ9jqzM/12jxkA==", "dev": true }, "ansi-regex": { @@ -1363,9 +1363,9 @@ "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=" }, "xdoc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/xdoc-parser/-/xdoc-parser-3.2.0.tgz", - "integrity": "sha512-nxVrhut5c4tFBUOdaUPq5nEAaGY69P2fvNBz8MYo+jfoPfo1fHvJy4GAgD06PZVfg3W57xjF1DQ0LTROlntQ6g==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/xdoc-parser/-/xdoc-parser-3.2.1.tgz", + "integrity": "sha512-fboTklKlbe27iE4Wsg+K/O9+uV3qBhQ351PgNvh2NR54fh79wQL921+qLpfQ1WN06vbEUVknNVLR0vxYxALg6w==", "requires": { "antlr4ts": "^0.4.1-alpha.0", "lodash": "^4.17.10", diff --git a/package.json b/package.json index 5cb3d1a..e8ad89b 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "homepage": "https://github.com/mr-doc/parser#readme", "devDependencies": { "@types/mocha": "^2.2.48", - "@types/node": "^8.10.25", + "@types/node": "^8.10.26", "chai": "^4.1.2", "mocha": "^4.1.0" }, @@ -32,6 +32,6 @@ "tree-sitter": "^0.13.6", "tree-sitter-javascript": "^0.13.5", "tree-sitter-typescript": "^0.13.3", - "xdoc-parser": "^3.2.0" + "xdoc-parser": "^3.2.1" } } diff --git a/src/ParserFactory.ts b/src/ParserFactory.ts index dc9aaa6..215826f 100644 --- a/src/ParserFactory.ts +++ b/src/ParserFactory.ts @@ -18,7 +18,6 @@ export default class ParserFactory { case 'js': case 'javascript': return new JavaScriptParser(this.file, this.options); - break; case 'ts': case 'typescript': return new TypeScriptParser(this.file, this.options); diff --git a/src/lang/typescript/Node.ts b/src/lang/typescript/Node.ts index ea64c6f..8a56105 100644 --- a/src/lang/typescript/Node.ts +++ b/src/lang/typescript/Node.ts @@ -1,25 +1,39 @@ import TextRange from "../../interfaces/TextRange"; import { SyntaxNode } from "tree-sitter"; import range from "../../utils/range"; +import xdoc from 'xdoc-parser'; +import { DocumentationNode } from 'xdoc-parser/src/XDocASTNode'; +import { RemarkNode } from 'xdoc-parser/src/XDocParser'; + export interface Node extends TextRange { text: string, properties?: Partial + xdoc?: { + markdown: RemarkNode, + documentation: Partial + } } export function createNode( source: string, node: SyntaxNode, - properties?: Partial + properties?: Partial, + document?: boolean, ): Node { - return { - ...range(node), - text: source.substring(node.startIndex, node.endIndex), - properties + + let node_ = { ...range(node), text: source.substring(node.startIndex, node.endIndex) } + + if (properties) { + node_ = Object.assign(node_, { properties }) } + + if (document) { + node_ = Object.assign(node_, { xdoc: xdoc(node_.text).parse() }) + } + return node_; } - export interface NodeProperties { exports: Partial inheritance: Partial @@ -33,30 +47,4 @@ export interface NodeExports { export interface NodeInheritance { extends: boolean, implements: boolean -} - - // export interface ClassNode extends Node { - // class: { - // comment: Node, - // context: Node, - // identifier: Node, - // heritage: Node, - // body: any[] - // } - // } - - // export interface ClassBodyNode { - // methods: ClassMethodNode[], - // properties: any[] - // } - - // export interface ClassMethodNode { - // identifier: Node, - // // Note: parameters contains '(' ... ')' - // parameters: Node[], - // comment: Node, - // context: Node, - // type: string, - // async: boolean, - // private: boolean - // } \ No newline at end of file +} \ No newline at end of file diff --git a/src/lang/typescript/public_field_definition.visitor.ts b/src/lang/typescript/public_field_definition.visitor.ts index 86f4cbb..2e8eee2 100644 --- a/src/lang/typescript/public_field_definition.visitor.ts +++ b/src/lang/typescript/public_field_definition.visitor.ts @@ -1,8 +1,10 @@ import { SyntaxNode } from "tree-sitter"; import match from "../../utils/match"; import { text } from "../../utils/text"; +import { visitType } from "./visitors/type.visitor"; +import { createNode } from "./Node"; -export function visitPublicFieldDefinition(source: string, node: SyntaxNode) { +export function visitPublicFieldDefinition(source: string, node: SyntaxNode, comment: SyntaxNode) { let public_field_definition = node.children; let accessibility = 'public', identifier, @@ -19,7 +21,15 @@ export function visitPublicFieldDefinition(source: string, node: SyntaxNode) { } if (match(public_field_definition[0], 'type_annotation')) { - console.log(public_field_definition[0].children); + let type = public_field_definition[0].children[1]; + type_annotation = visitType(source, type); + } + return { + type: 'property', + context: createNode(source, node), + comment: createNode(source, comment, null, true), + identifier, + accessibility, + type_annotation } - } \ No newline at end of file diff --git a/src/lang/typescript/visitors/class.visitor.ts b/src/lang/typescript/visitors/class.visitor.ts index d316009..473fbb6 100644 --- a/src/lang/typescript/visitors/class.visitor.ts +++ b/src/lang/typescript/visitors/class.visitor.ts @@ -6,6 +6,7 @@ import match from "../../../utils/match"; import { isJavaDocComment } from "../../../utils/comment"; import { visitMethodDefinition } from "./method_definition.visitor"; import { visitPublicFieldDefinition } from "../public_field_definition.visitor"; +import { visitTypeIdentifier } from "./type.visitor"; export function visitClass( source: string, @@ -42,7 +43,7 @@ export function visitClass( heritage, body, properties, - comment: createNode(source, comment), + comment: createNode(source, comment, null, true), context: createNode(source, node) } } @@ -58,9 +59,9 @@ export function visitClassHeritage(source: string, node: SyntaxNode) { heritage_type: heritage_type.type, context: createNode(source, node), // A heritage is either 'implements' or 'extends' - identifiers: heritage_clause_children + heritages: heritage_clause_children .filter(child => child.type === 'type_identifier') - .map(child => ({ type: 'identifier', context: createNode(source, child) })) + .map(child => visitTypeIdentifier(source, child)) } } @@ -76,19 +77,23 @@ export function visitClassBody(source: string, node: SyntaxNode) { if (nextSibling) { switch (nextSibling.type) { case 'method_definition': - return visitMethodDefinition(source, nextSibling); + methods.push(visitMethodDefinition(source, nextSibling, child)); + break; case 'public_field_definition': - return visitPublicFieldDefinition(source, nextSibling); + properties.push(visitPublicFieldDefinition(source, nextSibling, child)); + break; default: console.log(`[mr-doc::parser]: warning - '${nextSibling.type.replace(/[_]/g, ' ')}' is not supported yet.`) break; } } } - }) + }); return { type: 'class_body', context: createNode(source, node), + methods, + properties } } \ No newline at end of file diff --git a/src/lang/typescript/visitors/method_definition.visitor.ts b/src/lang/typescript/visitors/method_definition.visitor.ts index b445095..e5f646a 100644 --- a/src/lang/typescript/visitors/method_definition.visitor.ts +++ b/src/lang/typescript/visitors/method_definition.visitor.ts @@ -1,5 +1,5 @@ import { SyntaxNode } from "tree-sitter"; -export function visitMethodDefinition(source: string, node: SyntaxNode) { +export function visitMethodDefinition(source: string, node: SyntaxNode, comment: SyntaxNode) { } \ No newline at end of file diff --git a/src/lang/typescript/visitors/type.visitor.ts b/src/lang/typescript/visitors/type.visitor.ts index 74e3217..8174540 100644 --- a/src/lang/typescript/visitors/type.visitor.ts +++ b/src/lang/typescript/visitors/type.visitor.ts @@ -1,23 +1,57 @@ import { SyntaxNode } from "tree-sitter"; import { createNode } from "../Node"; -export function vistType(source:string, node: SyntaxNode) { - switch(node.type) { +export function visitTypeOrTypeIdentifier(source: string, node: SyntaxNode) { + if (node.type === 'type_identifier') { + return visitTypeIdentifier(source, node) + } + return visitType(source, node); +} + + +export function visitType(source: string, node: SyntaxNode) { + switch (node.type) { case 'union_type': return visitUnionType(source, node); case 'intersection_type': return visitIntersectionType(source, node); + case 'parenthesized_type': + return visitParenthesizedType(source, node); + + } +} + +export function visitTypeIdentifier(source: string, node: SyntaxNode) { + return { + type: 'type_identifier', + context: createNode(source, node) } } export function visitUnionType(source: string, node: SyntaxNode) { + const union = node.children; return { - union: { - context: createNode(source, node) - } + type: 'union_type', + context: createNode(source, node), + left: visitTypeOrTypeIdentifier(source, union[0]), + right: visitTypeOrTypeIdentifier(source, union[2]) } } -export function visitIntersectionType(source: string, node:SyntaxNode) { - +export function visitIntersectionType(source: string, node: SyntaxNode) { + const intersect = node.children; + return { + type: 'intersection_type', + context: createNode(source, node), + left: visitTypeOrTypeIdentifier(source, intersect[0]), + right: visitTypeOrTypeIdentifier(source, intersect[2]) + } +} + +export function visitParenthesizedType(source: string, node: SyntaxNode) { + return { + type: 'parenthesized_type', + context: createNode(source, node), + parenthesized: visitTypeOrTypeIdentifier(source, node.children[1]) + } } \ No newline at end of file From d66758f2b9cb7a607b864cdbc1317cb1e947988c Mon Sep 17 00:00:00 2001 From: Takeshi Date: Fri, 17 Aug 2018 18:30:51 -0600 Subject: [PATCH 08/32] Update: WIP --- example.ts | 35 ++------------ index.ts | 19 ++++++-- .../public_field_definition.visitor.ts | 8 ++-- .../visitors/formal_parameters.visitor.ts | 39 +++++++++++++++ .../visitors/method_definition.visitor.ts | 47 +++++++++++++++++++ .../visitors/type_parameters.visitor.ts | 4 +- src/utils/match.ts | 2 +- 7 files changed, 111 insertions(+), 43 deletions(-) create mode 100644 src/lang/typescript/visitors/formal_parameters.visitor.ts diff --git a/example.ts b/example.ts index 2bc3062..2996854 100644 --- a/example.ts +++ b/example.ts @@ -1,34 +1,9 @@ -interface K { - /** - * @property prop1: string - */ - prop1: string - /** - * @property prop2: string - */ - prop2: string -} - -class A { - -} -class Z { +interface A { } /** - * Description + * */ -export default class B implements A, Z { - /** - * @property prop: string - description - */ - private prop: (T & K) | T - /** - * Initialize the class - * - */ - constructor() { - // super() - } -} - +function a(params: K): T | K { + return +} \ No newline at end of file diff --git a/index.ts b/index.ts index 63c4e72..0249884 100644 --- a/index.ts +++ b/index.ts @@ -4,13 +4,22 @@ import IParser from './src/interfaces/IParser'; import * as FS from 'fs'; /** - * A class that parses a source code and generates + * A class that parses a source code and generates an AST. * - * # API - * - * ``` * @class Parser * @implements IParser + * + * # Example + * + * ```js + * const parser = new Parser({ + * name: '...', + * path: '....', + * text: '...' + * }, { language: 'typescript' }); + * + * const result = parser.parse(); + * * ``` */ export default class Parser implements IParser { @@ -34,4 +43,4 @@ const result = new Parser({ // console.log(JSON.stringify(result, null, 2)) -// console.log(result); +console.log(result); diff --git a/src/lang/typescript/public_field_definition.visitor.ts b/src/lang/typescript/public_field_definition.visitor.ts index 2e8eee2..433cb70 100644 --- a/src/lang/typescript/public_field_definition.visitor.ts +++ b/src/lang/typescript/public_field_definition.visitor.ts @@ -11,17 +11,15 @@ export function visitPublicFieldDefinition(source: string, node: SyntaxNode, com type_annotation; if (match(public_field_definition[0], 'accessibility_modifier')) { - accessibility = text(source, public_field_definition[0]); - public_field_definition.shift(); + accessibility = text(source, public_field_definition.shift()); } if (match(public_field_definition[0], 'property_identifier')) { - identifier = text(source, public_field_definition[0]); - public_field_definition.shift(); + identifier = createNode(source, public_field_definition.shift()); } if (match(public_field_definition[0], 'type_annotation')) { - let type = public_field_definition[0].children[1]; + let type = public_field_definition.shift().children[1]; type_annotation = visitType(source, type); } return { diff --git a/src/lang/typescript/visitors/formal_parameters.visitor.ts b/src/lang/typescript/visitors/formal_parameters.visitor.ts new file mode 100644 index 0000000..bcdd235 --- /dev/null +++ b/src/lang/typescript/visitors/formal_parameters.visitor.ts @@ -0,0 +1,39 @@ +import { SyntaxNode } from "tree-sitter"; +import { createNode } from "../Node"; +import match from "../../../utils/match"; +import { text } from "../../../utils/text"; +import { visitType } from "./type.visitor"; + +export function visitFormalParameters(source: string, node: SyntaxNode) { + return { + type: node.type, + context: createNode(source, node), + parameters: node.children + .filter(child => !child.type.match(/[(),]/)) + .map(child => visitRequiredParameter(source, child)) + } +} + + +export function visitRequiredParameter(source: string, node: SyntaxNode) { + let required_parameter = node.children, + identifier, + type_annotation; + + + if (match(required_parameter[0], 'identifier')) { + identifier = text(source, required_parameter.shift()); + } + + if(match(required_parameter[0], 'type_annotation')) { + let type = required_parameter.shift().children[1]; + type_annotation = visitType(source, type); + } + + return { + type: 'parameter', + context: createNode(source, node), + identifier, + type_annotation + } +} \ No newline at end of file diff --git a/src/lang/typescript/visitors/method_definition.visitor.ts b/src/lang/typescript/visitors/method_definition.visitor.ts index e5f646a..d6d7c42 100644 --- a/src/lang/typescript/visitors/method_definition.visitor.ts +++ b/src/lang/typescript/visitors/method_definition.visitor.ts @@ -1,5 +1,52 @@ import { SyntaxNode } from "tree-sitter"; +import match from "../../../utils/match"; +import { text } from "../../../utils/text"; +import { createNode } from "../Node"; +import visitTypeParameters from "./type_parameters.visitor"; +import { visitFormalParameters } from "./formal_parameters.visitor"; +import { visitType } from "./type.visitor"; export function visitMethodDefinition(source: string, node: SyntaxNode, comment: SyntaxNode) { + let method_definition = node.children; + let accessibility = 'public', + identifier, + type_parameters, + formal_parameters, + type_annotation; + + if (match(method_definition[0], 'accessibility_modifier')) { + accessibility = text(source, method_definition.shift()) + } + if (match(method_definition[0], 'property_identifier')) { + identifier = createNode(source, method_definition.shift()) + } + + if (match(method_definition[0], 'call_signature')) { + let call_signature = method_definition.shift().children; + + if (match(call_signature[0], 'type_parameters')) { + type_parameters = visitTypeParameters(source, call_signature.shift()); + } + + if (match(call_signature[0], 'formal_parameters')) { + formal_parameters = visitFormalParameters(source, call_signature.shift()); + } + + if (match(call_signature[0], 'type_annotation')) { + let type = call_signature.shift().children[1]; + type_annotation = visitType(source, type); + } + + } + return { + type: 'method', + context: createNode(source, node), + comment: createNode(source, node, null, true), + identifier, + accessibility, + type_parameters, + formal_parameters, + type_annotation + } } \ No newline at end of file diff --git a/src/lang/typescript/visitors/type_parameters.visitor.ts b/src/lang/typescript/visitors/type_parameters.visitor.ts index b05f6cf..e50921a 100644 --- a/src/lang/typescript/visitors/type_parameters.visitor.ts +++ b/src/lang/typescript/visitors/type_parameters.visitor.ts @@ -3,10 +3,10 @@ import { createNode } from "../Node"; export default function visitTypeParameters(source: string, node: SyntaxNode) { return { - type: 'type_parameters', + type: node.type, context: createNode(source, node), parameters: node.children .filter(child => !child.type.match(/[<>,]/)) - .map(child => ({ type: 'parameter', context: createNode(source, child) })) + .map(child => ({ type: child.type, context: createNode(source, child) })) } } \ No newline at end of file diff --git a/src/utils/match.ts b/src/utils/match.ts index a3fce93..bc8595a 100644 --- a/src/utils/match.ts +++ b/src/utils/match.ts @@ -9,5 +9,5 @@ import { SyntaxNode } from "tree-sitter"; * ``` */ export default function match(node: SyntaxNode, type: string): boolean { - return node.type === type; + return node && node.type === type; } \ No newline at end of file From 2bdfed84e87e036235b40770a168b8ad0bea9363 Mon Sep 17 00:00:00 2001 From: Takeshi Date: Fri, 17 Aug 2018 23:59:05 -0600 Subject: [PATCH 09/32] Update: WIP --- example.ts | 8 +- index.ts | 4 +- package-lock.json | 6 +- src/lang/typescript/index.ts | 236 +----------------- .../visitors/call_signature.visitor.ts | 29 +++ src/lang/typescript/visitors/class.visitor.ts | 7 +- .../visitors/export_statement.visitor.ts | 18 +- .../visitors/expression_statement.visitor.ts | 11 + .../typescript/visitors/function.visitor.ts | 51 ++++ .../visitors/method_definition.visitor.ts | 32 +-- src/lang/typescript/visitors/node.visitor.ts | 12 +- src/lang/typescript/visitors/type.visitor.ts | 37 ++- .../visitors/type_arguments.visitor.ts | 8 + 13 files changed, 170 insertions(+), 289 deletions(-) create mode 100644 src/lang/typescript/visitors/call_signature.visitor.ts create mode 100644 src/lang/typescript/visitors/expression_statement.visitor.ts create mode 100644 src/lang/typescript/visitors/function.visitor.ts create mode 100644 src/lang/typescript/visitors/type_arguments.visitor.ts diff --git a/example.ts b/example.ts index 2996854..7b5ded0 100644 --- a/example.ts +++ b/example.ts @@ -1,9 +1,5 @@ -interface A { -} /** - * + * Description */ -function a(params: K): T | K { - return -} \ No newline at end of file +export const REGEX = 2; diff --git a/index.ts b/index.ts index 0249884..5d60d76 100644 --- a/index.ts +++ b/index.ts @@ -42,5 +42,5 @@ const result = new Parser({ }).parse(); -// console.log(JSON.stringify(result, null, 2)) -console.log(result); +console.log(JSON.stringify(result, null, 2)) +// console.log(result); diff --git a/package-lock.json b/package-lock.json index 5219e3c..7fdbe5d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1042,9 +1042,9 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", + "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==" }, "set-blocking": { "version": "2.0.0", diff --git a/src/lang/typescript/index.ts b/src/lang/typescript/index.ts index 4bb29ea..23de202 100644 --- a/src/lang/typescript/index.ts +++ b/src/lang/typescript/index.ts @@ -29,241 +29,7 @@ export default class TypeScriptParser implements IParser { parse = () => { const tree = this.parser.parse(this.file.text); if (tree.rootNode.type === "program") { - return visitProgram(this.source, tree.rootNode) + return visitProgram(this.file.text, tree.rootNode) } } - - /* Properties */ - - private get source(): string { - return this.file.text; - } - - /* Visitors */ - - /* Class Node */ - // private visitClass = ( - // node: Parser.SyntaxNode, - // leadingComment: Parser.SyntaxNode, - // properties: Partial - // ): ClassNode => { - // let children = node.children; - // // Remove 'class' since we already know that - // children = children.slice(1); - // // Get the class/type identifier - // const classIdentifier = this.getNodeContext(children[0]); - // // Remove the identifier - // children = children.slice(1); - - // const classProperties = Object.assign({ - // implements: false, - // extends: false, - // }, properties); - // let heritage = null; - // // Determine whether the class extends or implements - // if (match(children[0], 'class_heritage')) { - // if (this.getNodeContext(children[0]).text.includes("implements")) { - // classProperties.implements = true; - // } else if (this.getNodeContext(children[0]).text.includes("extends")) { - // classProperties.extends = true; - // } - // // Store the heritage - // heritage = this.getNodeContext(children[0].children[0]) - // // Remove the heritage node - // children = children.slice(1); - // } - - // let classBody: any = children[0]; - // classBody = this.visitClassBody(classBody); - // return { - // class: { - // comment: this.getNodeContext(leadingComment), - // context: this.getNodeContext(node), - // identifier: classIdentifier, - // heritage, - // body: classBody, - // } - // } - // } - - // private visitClassBody = (node: Parser.SyntaxNode) => { - // const methods = []; - // const properties = []; - // // Perf: O(n) - // node.children.forEach(classChild => { - // if (match(classChild, 'comment') && this.isCStyleComment(classChild)) { - // const nextSibling = classChild.nextSibling; - // if (nextSibling) { - // switch (nextSibling.type) { - // case 'method_definition': - // let method = visitClassMethod(nextSibling, classChild); - // if (method.type === 'method') { - // methods.push(method); - // } else if (method.type === 'property') { - // properties.push(method); - // } - // break; - // default: - // this.warnNotSupported(nextSibling); - - // break; - // } - // } - // } - // }); - // return { - // methods, - // properties, - // } - // } - - // private visitClassMethod = ( - // node: Parser.SyntaxNode, - // leadingComment: Parser.SyntaxNode - // ): ClassMethodNode => { - // let children = node.children; - // let isPrivate = false, isProperty = false, isAsync = false; - - // // Determine whether it is a private method - // if (match(children[0], 'accessibility_modifier')) { - // isPrivate = children[0].children[0].type === "private"; - // // Remove 'private' - // children = children.slice(1); - // } - - // // Determine whether it is a property - // if (match(children[0], 'get')) { - // isProperty = true; - // // Remove the 'get' node - // children = children.slice(1); - // } - // // Determine whether it is an async method - // if (match(children[0], 'async')) { - // isAsync = true; - // children = children.slice(1); - // } - - // // Get the formal parameters - // const formal_parameters = children[1].children[0]; - // const parameters = formal_parameters.children; - // // console.log(parameters); - - // return { - // identifier: this.createNode(children[0]), - // // Note: parameters contains '(' ... ')' - // parameters: parameters.map(this.createNode.bind(this)), - // comment: this.createNode(leadingComment), - // context: this.createNode(node), - // type: isProperty ? 'property' : 'method', - // async: isAsync, - // private: isPrivate - // } - // } - - /* Interface Node */ - - // private visitInterfaceNode = (node: Parser.SyntaxNode, leadingComment: Parser.SyntaxNode, properties: Partial) => { - // let children = node.children; - // // Remove 'interface' since we already know that - // children = children.slice(1); - // // Get the interface identifier - // const interfaceIdentifier = this.createNode(children[0]); - // // Remove the identifier - // children = children.slice(1); - - // const interfaceProperties = Object.assign({ - // // For consistency, we'll keep 'implements' - // implements: false, - // extends: false - // }, properties); - - // let heritage = null; - - // // Determine whether the class extends or implements - // if (match(children[0], 'class_heritage')) { - // if (this.createNode(children[0]).text.includes("extends")) { - // interfaceProperties.extends = true; - // } - // // Store the heritage - // heritage = this.createNode(children[0].children[0]) - // // Remove the heritage node - // children = children.slice(1); - // } - // // console.log(children[0].children); - // let interfaceBody: any = children[0]; - // interfaceBody = this.visitObjectTypeNode(interfaceBody); - // return { - // interface: { - // comment: this.createNode(leadingComment), - // context: this.createNode(node), - // identifier: interfaceIdentifier, - // heritage, - // body: interfaceBody, - // properties: interfaceProperties - // } - // } - // } - - - // private visitObjectTypeNode = (node: Parser.SyntaxNode) => { - // const methods = []; - // const properties = []; - - // node.children.forEach(child => { - // if (match(child, 'comment') && this.isCStyleComment(child)) { - // const nextSibling = child.nextSibling; - // if (nextSibling) { - // switch (nextSibling.type) { - // case 'method_signature': - // methods.push(this.visitMethodSignature(nextSibling, child)); - // break; - // default: - // this.warnNotSupported(nextSibling); - // break; - // } - // } - // } - // }); - - // return { - // methods, - // properties - // } - // } - - // private visitMethodSignature = ( - // node: Parser.SyntaxNode, - // leadingComment: Parser.SyntaxNode - // ) => { - // const identifer = node.children[0]; - // const call_signature = node.children[1]; - // let call_signature_children = call_signature.children; - // let type_parameters = []; - - // // Determine whether generics are used, such as myfunc(...): T - // if (call_signature_children[0].type === 'type_parameters') { - // type_parameters = call_signature_children.map(this.createNode.bind(this)); - // call_signature_children = call_signature_children.slice(1); - // } - - // // Note: An interface can have required and optional parameters - // // so we need to check later if a '?' exists - // let parameters: any = call_signature_children[0].children - // .map(this.createNode.bind(this)); - // // Remove parameters - // call_signature_children = call_signature_children.slice(1); - - // // Get the type annotation for the method signature - // let type_annotation: any = call_signature_children[0]; - // // Determine if it does exists - // if (type_annotation && type_annotation.children[1]) { - // type_annotation = this.createNode(type_annotation.children[1]); - // } - // return { - // identifier: this.createNode(identifer), - // parameters, - // type_parameters, - // type_annotation - // } - // } } diff --git a/src/lang/typescript/visitors/call_signature.visitor.ts b/src/lang/typescript/visitors/call_signature.visitor.ts new file mode 100644 index 0000000..2bc2109 --- /dev/null +++ b/src/lang/typescript/visitors/call_signature.visitor.ts @@ -0,0 +1,29 @@ +import { SyntaxNode } from "tree-sitter"; +import match from "../../../utils/match"; +import visitTypeParameters from "./type_parameters.visitor"; +import { visitFormalParameters } from "./formal_parameters.visitor"; +import { visitType } from "./type.visitor"; + +export function visitCallSignature(source: string, node: SyntaxNode) { + + let call_signature = node.children, + type_parameters, + formal_parameters, + type_annotation; + + if (match(call_signature[0], 'type_parameters')) { + type_parameters = visitTypeParameters(source, call_signature.shift()); + } + + if (match(call_signature[0], 'formal_parameters')) { + formal_parameters = visitFormalParameters(source, call_signature.shift()); + } + + if (match(call_signature[0], 'type_annotation')) { + let type = call_signature.shift().children[1]; + type_annotation = visitType(source, type); + } + + return { type_parameters, formal_parameters, type_annotation } + +} \ No newline at end of file diff --git a/src/lang/typescript/visitors/class.visitor.ts b/src/lang/typescript/visitors/class.visitor.ts index 473fbb6..849843f 100644 --- a/src/lang/typescript/visitors/class.visitor.ts +++ b/src/lang/typescript/visitors/class.visitor.ts @@ -1,6 +1,5 @@ import { SyntaxNode } from "tree-sitter"; -import { NodeProperties, createNode, NodeInheritance } from "../Node"; -import { text } from "../../../utils/text"; +import { NodeProperties, createNode } from "../Node"; import visitTypeParameters from "./type_parameters.visitor"; import match from "../../../utils/match"; import { isJavaDocComment } from "../../../utils/comment"; @@ -27,7 +26,7 @@ export function visitClass( case 'class_body': return visitClassBody(source, child) default: - console.log(`[mr-doc::parser]: warning - '${node.type.replace(/[_]/g, ' ')}' is not supported yet.`) + console.log(`[mr-doc::parser]: info - '${node.type.replace(/[_]/g, ' ')}' is not supported yet.`) break; } }); @@ -83,7 +82,7 @@ export function visitClassBody(source: string, node: SyntaxNode) { properties.push(visitPublicFieldDefinition(source, nextSibling, child)); break; default: - console.log(`[mr-doc::parser]: warning - '${nextSibling.type.replace(/[_]/g, ' ')}' is not supported yet.`) + console.log(`[mr-doc::parser]: info - '${nextSibling.type.replace(/[_]/g, ' ')}' is not supported yet.`) break; } } diff --git a/src/lang/typescript/visitors/export_statement.visitor.ts b/src/lang/typescript/visitors/export_statement.visitor.ts index 0122022..d7ad76b 100644 --- a/src/lang/typescript/visitors/export_statement.visitor.ts +++ b/src/lang/typescript/visitors/export_statement.visitor.ts @@ -1,5 +1,4 @@ import { SyntaxNode } from "tree-sitter"; -import { NodeProperties } from "../Node"; import { visitNode } from "./node.visitor"; import match from "../../../utils/match"; @@ -8,17 +7,16 @@ export function visitExportStatement( node: SyntaxNode, comment: SyntaxNode, ) { - let isDefaultExport = false; - // Remove the 'export' node - let children = node.children.slice(1); - if (match(node.children[1], 'default')) { + let children = node.children, + isDefaultExport = false; + + if (children.length > 1 && match(children.shift(), 'export')) { + } + + if (children.length > 1 && match(children.shift(), 'default')) { isDefaultExport = true; - // Remove the 'default' node - children = children.slice(1); } - // Most likely, the first index will point to the exported type - const child = children[0]; - return visitNode(source, child, comment, { + return visitNode(source, children.shift(), comment, { exports: { export: true, default: isDefaultExport diff --git a/src/lang/typescript/visitors/expression_statement.visitor.ts b/src/lang/typescript/visitors/expression_statement.visitor.ts new file mode 100644 index 0000000..fb3227e --- /dev/null +++ b/src/lang/typescript/visitors/expression_statement.visitor.ts @@ -0,0 +1,11 @@ +import { SyntaxNode } from "tree-sitter"; +import { visitNode } from "./node.visitor"; +import { NodeProperties } from "../Node"; + +export function visitExpressionStatement( + source: string, node: SyntaxNode, + comment: SyntaxNode, + properties: Partial +) { + return visitNode(source, node.children.shift(), comment, properties); +} \ No newline at end of file diff --git a/src/lang/typescript/visitors/function.visitor.ts b/src/lang/typescript/visitors/function.visitor.ts new file mode 100644 index 0000000..3251998 --- /dev/null +++ b/src/lang/typescript/visitors/function.visitor.ts @@ -0,0 +1,51 @@ +import { SyntaxNode } from "tree-sitter"; +import { NodeProperties, createNode } from "../Node"; +import match from "../../../utils/match"; +import { visitCallSignature } from "./call_signature.visitor"; + +export function visitFunction( + source: string, + node: SyntaxNode, + comment: SyntaxNode, + properties: Partial +) { + let children = node.children; + let isAync = false, + identifier, + type_parameters, + formal_parameters, + type_annotation; + + if (match(children[0], 'async')) { + isAync = true; + children.shift(); + } + + if (match(children[0], 'function')) { + children.shift(); + } + + if (match(children[0], 'identifier')) { + identifier = createNode(source, children.shift()) + } + + if (match(children[0], 'call_signature')) { + let call_signature = visitCallSignature(source, children.shift()) + type_parameters = call_signature.type_parameters; + formal_parameters = call_signature.formal_parameters; + type_annotation = call_signature.type_annotation; + } + + return { + type: 'function', + context: createNode(source, node, properties), + comment: createNode(source, comment, null, true), + isAync, + identifier, + type_parameters, + formal_parameters, + type_annotation, + properties + } + +} \ No newline at end of file diff --git a/src/lang/typescript/visitors/method_definition.visitor.ts b/src/lang/typescript/visitors/method_definition.visitor.ts index d6d7c42..eaeeb47 100644 --- a/src/lang/typescript/visitors/method_definition.visitor.ts +++ b/src/lang/typescript/visitors/method_definition.visitor.ts @@ -2,17 +2,21 @@ import { SyntaxNode } from "tree-sitter"; import match from "../../../utils/match"; import { text } from "../../../utils/text"; import { createNode } from "../Node"; -import visitTypeParameters from "./type_parameters.visitor"; -import { visitFormalParameters } from "./formal_parameters.visitor"; -import { visitType } from "./type.visitor"; +import { visitCallSignature } from "./call_signature.visitor"; export function visitMethodDefinition(source: string, node: SyntaxNode, comment: SyntaxNode) { let method_definition = node.children; let accessibility = 'public', + isAsync = false, identifier, type_parameters, formal_parameters, type_annotation; + + if (match(method_definition[0], 'async')) { + isAsync = true; + method_definition.shift(); + } if (match(method_definition[0], 'accessibility_modifier')) { accessibility = text(source, method_definition.shift()) @@ -23,28 +27,18 @@ export function visitMethodDefinition(source: string, node: SyntaxNode, comment: } if (match(method_definition[0], 'call_signature')) { - let call_signature = method_definition.shift().children; - - if (match(call_signature[0], 'type_parameters')) { - type_parameters = visitTypeParameters(source, call_signature.shift()); - } - - if (match(call_signature[0], 'formal_parameters')) { - formal_parameters = visitFormalParameters(source, call_signature.shift()); - } - - if (match(call_signature[0], 'type_annotation')) { - let type = call_signature.shift().children[1]; - type_annotation = visitType(source, type); - } - + const call_signature = visitCallSignature(source, method_definition.shift()) + type_parameters = call_signature.type_parameters; + formal_parameters = call_signature.formal_parameters; + type_annotation = call_signature.type_annotation; } return { type: 'method', context: createNode(source, node), comment: createNode(source, node, null, true), - identifier, accessibility, + async: isAsync, + identifier, type_parameters, formal_parameters, type_annotation diff --git a/src/lang/typescript/visitors/node.visitor.ts b/src/lang/typescript/visitors/node.visitor.ts index 73eb96c..d2beaa3 100644 --- a/src/lang/typescript/visitors/node.visitor.ts +++ b/src/lang/typescript/visitors/node.visitor.ts @@ -3,6 +3,8 @@ import { NodeProperties } from "../Node"; import { visitClass } from "./class.visitor"; import range from "../../../utils/range"; import { visitExportStatement } from "./export_statement.visitor"; +import { visitFunction } from "./function.visitor"; +import { visitExpressionStatement } from "./expression_statement.visitor"; export function visitNode( source: string, @@ -11,16 +13,18 @@ export function visitNode( properties: Partial ) { switch (node.type) { - // Note: Export statemens may include + // Note: Export statements may include classes, functions, interfaces, etc. case 'export_statement': return visitExportStatement(source, node, comment); + case 'expression_statement': + return visitExpressionStatement(source, node, comment, properties) case 'class': return visitClass(source, node, comment, properties); // TODO: Complete interfaces and functions // case 'interface_declaration': // return visitInterfaceDeclaration(node, comment, properties); - // case 'function': - // break; + case 'function': + return visitFunction(source, node, comment, properties); case 'comment': // noop break; @@ -31,7 +35,7 @@ export function visitNode( ) break; default: - console.log(`[mr-doc::parser]: warning - '${node.type.replace(/[_]/g, ' ')}' is not supported yet.`); + console.log(`[mr-doc::parser]: info - '${node.type.replace(/[_]/g, ' ')}' is not supported yet.`); break; } } \ No newline at end of file diff --git a/src/lang/typescript/visitors/type.visitor.ts b/src/lang/typescript/visitors/type.visitor.ts index 8174540..7f816fc 100644 --- a/src/lang/typescript/visitors/type.visitor.ts +++ b/src/lang/typescript/visitors/type.visitor.ts @@ -1,5 +1,6 @@ import { SyntaxNode } from "tree-sitter"; import { createNode } from "../Node"; +import { visitTypeArguments } from "./type_arguments.visitor"; export function visitTypeOrTypeIdentifier(source: string, node: SyntaxNode) { if (node.type === 'type_identifier') { @@ -8,7 +9,6 @@ export function visitTypeOrTypeIdentifier(source: string, node: SyntaxNode) { return visitType(source, node); } - export function visitType(source: string, node: SyntaxNode) { switch (node.type) { case 'union_type': @@ -17,13 +17,21 @@ export function visitType(source: string, node: SyntaxNode) { return visitIntersectionType(source, node); case 'parenthesized_type': return visitParenthesizedType(source, node); - + case 'type_identifier': + return visitTypeIdentifier(source, node); + case 'generic_type': + return visitGenericType(source, node); + case 'predefined_type': + return visitPredefinedType(source, node); + default: + console.log(`[mr-doc::parser]: info - '${node.type.replace(/[_]/g, ' ')}' is not supported yet.`); + break; } } export function visitTypeIdentifier(source: string, node: SyntaxNode) { return { - type: 'type_identifier', + type: node.type, context: createNode(source, node) } } @@ -31,7 +39,7 @@ export function visitTypeIdentifier(source: string, node: SyntaxNode) { export function visitUnionType(source: string, node: SyntaxNode) { const union = node.children; return { - type: 'union_type', + type: node.type, context: createNode(source, node), left: visitTypeOrTypeIdentifier(source, union[0]), right: visitTypeOrTypeIdentifier(source, union[2]) @@ -41,7 +49,7 @@ export function visitUnionType(source: string, node: SyntaxNode) { export function visitIntersectionType(source: string, node: SyntaxNode) { const intersect = node.children; return { - type: 'intersection_type', + type: node.type, context: createNode(source, node), left: visitTypeOrTypeIdentifier(source, intersect[0]), right: visitTypeOrTypeIdentifier(source, intersect[2]) @@ -50,8 +58,25 @@ export function visitIntersectionType(source: string, node: SyntaxNode) { export function visitParenthesizedType(source: string, node: SyntaxNode) { return { - type: 'parenthesized_type', + type: node.type, context: createNode(source, node), parenthesized: visitTypeOrTypeIdentifier(source, node.children[1]) } +} + +export function visitGenericType(source: string, node: SyntaxNode) { + let children = node.children; + return { + type: node.type, + context: createNode(source, node), + generic: visitTypeIdentifier(source, children.shift()), + type_arguments: visitTypeArguments(source, children.shift()) + } +} + +export function visitPredefinedType(source: string, node: SyntaxNode) { + return { + type: node.type, + context: createNode(source, node.children.shift()), + } } \ No newline at end of file diff --git a/src/lang/typescript/visitors/type_arguments.visitor.ts b/src/lang/typescript/visitors/type_arguments.visitor.ts new file mode 100644 index 0000000..7be51a7 --- /dev/null +++ b/src/lang/typescript/visitors/type_arguments.visitor.ts @@ -0,0 +1,8 @@ +import { SyntaxNode } from "tree-sitter"; +import { visitType } from "./type.visitor"; + +export function visitTypeArguments(source: string, node: SyntaxNode) { + return node.children + .filter(child => !child.type.match(/[<>,]/)) + .map(child => visitType(source, child)) +} \ No newline at end of file From 98561dccb47f58e7a4aa3476ed3a8a91a9cc8c80 Mon Sep 17 00:00:00 2001 From: Takeshi Date: Mon, 20 Aug 2018 08:41:21 -0600 Subject: [PATCH 10/32] Update: WIP --- build/example.d.ts | 4 + build/example.js | 7 ++ build/index.d.ts | 20 ++-- build/index.js | 24 +++-- build/src/CommentParser.d.ts | 9 -- build/src/CommentParser.js | 80 --------------- build/src/ParserFactory.js | 3 +- build/src/interfaces/IComment.d.ts | 28 ------ build/src/interfaces/IComment.js | 3 - build/src/interfaces/IFile.js | 2 +- build/src/interfaces/IParser.d.ts | 3 +- build/src/interfaces/IParser.js | 3 +- build/src/interfaces/IResult.d.ts | 6 -- build/src/interfaces/IResult.js | 3 - build/src/interfaces/TextRange.d.ts | 45 +++++++++ build/src/interfaces/TextRange.js | 3 + build/src/lang/javascript/index.d.ts | 6 +- build/src/lang/javascript/index.js | 97 ++++++------------- build/src/lang/typescript/Node.d.ts | 26 +++++ build/src/lang/typescript/Node.js | 16 +++ build/src/lang/typescript/index.d.ts | 5 +- build/src/lang/typescript/index.js | 53 ++-------- .../public_field_definition.visitor.d.ts | 10 ++ .../public_field_definition.visitor.js | 30 ++++++ .../visitors/call_signature.visitor.d.ts | 7 ++ .../visitors/call_signature.visitor.js | 22 +++++ .../typescript/visitors/class.visitor.d.ts | 88 +++++++++++++++++ .../lang/typescript/visitors/class.visitor.js | 91 +++++++++++++++++ .../visitors/declaration.visitor.d.ts | 6 ++ .../visitors/declaration.visitor.js | 24 +++++ .../visitors/formal_parameters.visitor.d.ts | 18 ++++ .../visitors/formal_parameters.visitor.js | 34 +++++++ .../typescript/visitors/function.visitor.d.ts | 14 +++ .../typescript/visitors/function.visitor.js | 38 ++++++++ .../visitors/method_definition.visitor.d.ts | 13 +++ .../visitors/method_definition.visitor.js | 39 ++++++++ .../typescript/visitors/node.visitor.d.ts | 4 + .../lang/typescript/visitors/node.visitor.js | 32 ++++++ .../typescript/visitors/program.visitor.d.ts | 3 + .../typescript/visitors/program.visitor.js | 34 +++++++ .../visitors/statement.visitor.d.ts | 6 ++ .../typescript/visitors/statement.visitor.js | 37 +++++++ .../typescript/visitors/type.visitor.d.ts | 25 +++++ .../lang/typescript/visitors/type.visitor.js | 84 ++++++++++++++++ .../visitors/type_arguments.visitor.d.ts | 3 + .../visitors/type_arguments.visitor.js | 10 ++ .../visitors/type_parameters.visitor.d.ts | 10 ++ .../visitors/type_parameters.visitor.js | 14 +++ build/src/utils/comment.d.ts | 8 ++ build/src/utils/comment.js | 42 ++++++++ build/src/utils/log.d.ts | 12 +++ build/src/utils/log.js | 31 ++++++ build/src/utils/match.d.ts | 10 ++ build/src/utils/match.js | 15 +++ build/src/utils/range.d.ts | 3 + build/src/utils/range.js | 16 +++ build/src/utils/text.d.ts | 11 +++ build/src/utils/text.js | 15 +++ example.ts | 2 +- index.ts | 2 +- package-lock.json | 89 +++++++++++++++++ package.json | 1 + src/lang/typescript/Node.ts | 5 +- src/lang/typescript/index.ts | 2 +- .../visitors/call_signature.visitor.ts | 3 +- src/lang/typescript/visitors/class.visitor.ts | 12 ++- .../visitors/declaration.visitor.ts | 43 ++++++++ .../visitors/export_statement.visitor.ts | 25 ----- .../visitors/expression_statement.visitor.ts | 11 --- .../visitors/formal_parameters.visitor.ts | 9 +- .../typescript/visitors/function.visitor.ts | 3 +- .../visitors/method_definition.visitor.ts | 7 +- src/lang/typescript/visitors/node.visitor.ts | 32 +++--- .../typescript/visitors/program.visitor.ts | 7 +- .../public_field_definition.visitor.ts | 11 ++- .../typescript/visitors/statement.visitor.ts | 54 +++++++++++ src/lang/typescript/visitors/type.visitor.ts | 17 ++-- .../visitors/type_arguments.visitor.ts | 3 +- .../visitors/type_parameters.visitor.ts | 3 +- src/utils/comment.ts | 9 +- src/utils/log.ts | 32 ++++++ src/utils/text.ts | 7 +- 82 files changed, 1327 insertions(+), 367 deletions(-) create mode 100644 build/example.d.ts create mode 100644 build/example.js delete mode 100644 build/src/CommentParser.d.ts delete mode 100644 build/src/CommentParser.js delete mode 100644 build/src/interfaces/IComment.d.ts delete mode 100644 build/src/interfaces/IComment.js delete mode 100644 build/src/interfaces/IResult.d.ts delete mode 100644 build/src/interfaces/IResult.js create mode 100644 build/src/interfaces/TextRange.d.ts create mode 100644 build/src/interfaces/TextRange.js create mode 100644 build/src/lang/typescript/Node.d.ts create mode 100644 build/src/lang/typescript/Node.js create mode 100644 build/src/lang/typescript/public_field_definition.visitor.d.ts create mode 100644 build/src/lang/typescript/public_field_definition.visitor.js create mode 100644 build/src/lang/typescript/visitors/call_signature.visitor.d.ts create mode 100644 build/src/lang/typescript/visitors/call_signature.visitor.js create mode 100644 build/src/lang/typescript/visitors/class.visitor.d.ts create mode 100644 build/src/lang/typescript/visitors/class.visitor.js create mode 100644 build/src/lang/typescript/visitors/declaration.visitor.d.ts create mode 100644 build/src/lang/typescript/visitors/declaration.visitor.js create mode 100644 build/src/lang/typescript/visitors/formal_parameters.visitor.d.ts create mode 100644 build/src/lang/typescript/visitors/formal_parameters.visitor.js create mode 100644 build/src/lang/typescript/visitors/function.visitor.d.ts create mode 100644 build/src/lang/typescript/visitors/function.visitor.js create mode 100644 build/src/lang/typescript/visitors/method_definition.visitor.d.ts create mode 100644 build/src/lang/typescript/visitors/method_definition.visitor.js create mode 100644 build/src/lang/typescript/visitors/node.visitor.d.ts create mode 100644 build/src/lang/typescript/visitors/node.visitor.js create mode 100644 build/src/lang/typescript/visitors/program.visitor.d.ts create mode 100644 build/src/lang/typescript/visitors/program.visitor.js create mode 100644 build/src/lang/typescript/visitors/statement.visitor.d.ts create mode 100644 build/src/lang/typescript/visitors/statement.visitor.js create mode 100644 build/src/lang/typescript/visitors/type.visitor.d.ts create mode 100644 build/src/lang/typescript/visitors/type.visitor.js create mode 100644 build/src/lang/typescript/visitors/type_arguments.visitor.d.ts create mode 100644 build/src/lang/typescript/visitors/type_arguments.visitor.js create mode 100644 build/src/lang/typescript/visitors/type_parameters.visitor.d.ts create mode 100644 build/src/lang/typescript/visitors/type_parameters.visitor.js create mode 100644 build/src/utils/comment.d.ts create mode 100644 build/src/utils/comment.js create mode 100644 build/src/utils/log.d.ts create mode 100644 build/src/utils/log.js create mode 100644 build/src/utils/match.d.ts create mode 100644 build/src/utils/match.js create mode 100644 build/src/utils/range.d.ts create mode 100644 build/src/utils/range.js create mode 100644 build/src/utils/text.d.ts create mode 100644 build/src/utils/text.js create mode 100644 src/lang/typescript/visitors/declaration.visitor.ts delete mode 100644 src/lang/typescript/visitors/export_statement.visitor.ts delete mode 100644 src/lang/typescript/visitors/expression_statement.visitor.ts rename src/lang/typescript/{ => visitors}/public_field_definition.visitor.ts (71%) create mode 100644 src/lang/typescript/visitors/statement.visitor.ts create mode 100644 src/utils/log.ts diff --git a/build/example.d.ts b/build/example.d.ts new file mode 100644 index 0000000..fb9849f --- /dev/null +++ b/build/example.d.ts @@ -0,0 +1,4 @@ +/** + * Description + */ +export declare const REGEX = 2; diff --git a/build/example.js b/build/example.js new file mode 100644 index 0000000..da3329e --- /dev/null +++ b/build/example.js @@ -0,0 +1,7 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * Description + */ +exports.REGEX = 2; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhhbXBsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2V4YW1wbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQTs7R0FFRztBQUNVLFFBQUEsS0FBSyxHQUFHLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxyXG4vKipcclxuICogRGVzY3JpcHRpb25cclxuICovXHJcbmV4cG9ydCBjb25zdCBSRUdFWCA9IDI7Il19 \ No newline at end of file diff --git a/build/index.d.ts b/build/index.d.ts index 9f3ee88..e3906a2 100644 --- a/build/index.d.ts +++ b/build/index.d.ts @@ -1,18 +1,26 @@ import IFile from './src/interfaces/IFile'; -import IResult from './src/interfaces/IResult'; import IParser from './src/interfaces/IParser'; /** - * A class that parses a source code and generates + * A class that parses a source code and generates an AST. * - * # API - * - * ``` * @class Parser * @implements IParser + * + * # Example + * + * ```js + * const parser = new Parser({ + * name: '...', + * path: '....', + * text: '...' + * }, { language: 'typescript' }); + * + * const result = parser.parse(); + * * ``` */ export default class Parser implements IParser { private parser; constructor(file: IFile, options?: any); - parse: () => IResult; + parse: () => any; } diff --git a/build/index.js b/build/index.js index 765d757..4453a76 100644 --- a/build/index.js +++ b/build/index.js @@ -3,13 +3,22 @@ Object.defineProperty(exports, "__esModule", { value: true }); const ParserFactory_1 = require("./src/ParserFactory"); const FS = require("fs"); /** - * A class that parses a source code and generates + * A class that parses a source code and generates an AST. * - * # API - * - * ``` * @class Parser * @implements IParser + * + * # Example + * + * ```js + * const parser = new Parser({ + * name: '...', + * path: '....', + * text: '...' + * }, { language: 'typescript' }); + * + * const result = parser.parse(); + * * ``` */ class Parser { @@ -24,9 +33,10 @@ exports.default = Parser; const result = new Parser({ name: 'index.ts', path: '../../', - text: FS.readFileSync(`${process.cwd()}/index.ts`, 'utf-8') + text: FS.readFileSync(`${process.cwd()}/example.ts`, 'utf-8') }, { language: 'typescript' }).parse(); -// console.log(JSON.stringify(result, null, 2)) -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLHVEQUFnRDtBQUVoRCx5QkFBeUI7QUFFekI7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBcUIsTUFBTTtJQUd6QixZQUFZLElBQVcsRUFBRSxVQUFlLEVBQUU7UUFHMUMsVUFBSyxHQUFHLEdBQVksRUFBRTtZQUNwQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDNUIsQ0FBQyxDQUFBO1FBSkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksdUJBQWEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMvRCxDQUFDO0NBSUY7QUFURCx5QkFTQztBQUVELE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDO0lBQ3hCLElBQUksRUFBRSxVQUFVO0lBQ2hCLElBQUksRUFBRSxRQUFRO0lBQ2QsSUFBSSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUM7Q0FDNUQsRUFBRTtJQUNELFFBQVEsRUFBRSxZQUFZO0NBQ3ZCLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUdYLCtDQUErQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBJRmlsZSBmcm9tICcuL3NyYy9pbnRlcmZhY2VzL0lGaWxlJztcbmltcG9ydCBJUmVzdWx0IGZyb20gJy4vc3JjL2ludGVyZmFjZXMvSVJlc3VsdCc7XG5pbXBvcnQgUGFyc2VyRmFjdG9yeSBmcm9tICcuL3NyYy9QYXJzZXJGYWN0b3J5JztcbmltcG9ydCBJUGFyc2VyIGZyb20gJy4vc3JjL2ludGVyZmFjZXMvSVBhcnNlcic7XG5pbXBvcnQgKiBhcyBGUyBmcm9tICdmcyc7XG5cbi8qKlxuICogQSBjbGFzcyB0aGF0IHBhcnNlcyBhIHNvdXJjZSBjb2RlIGFuZCBnZW5lcmF0ZXNcbiAqIFxuICogIyBBUElcbiAqIFxuICogYGBgXG4gKiBAY2xhc3MgUGFyc2VyXG4gKiBAaW1wbGVtZW50cyBJUGFyc2VyXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFyc2VyIGltcGxlbWVudHMgSVBhcnNlciB7XG5cbiAgcHJpdmF0ZSBwYXJzZXI6IElQYXJzZXI7XG4gIGNvbnN0cnVjdG9yKGZpbGU6IElGaWxlLCBvcHRpb25zOiBhbnkgPSB7fSkge1xuICAgIHRoaXMucGFyc2VyID0gKG5ldyBQYXJzZXJGYWN0b3J5KGZpbGUsIG9wdGlvbnMpKS5nZXRQYXJzZXIoKTtcbiAgfVxuICBwYXJzZSA9ICgpOiBJUmVzdWx0ID0+IHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIucGFyc2UoKVxuICB9XG59XG5cbmNvbnN0IHJlc3VsdCA9IG5ldyBQYXJzZXIoe1xuICBuYW1lOiAnaW5kZXgudHMnLFxuICBwYXRoOiAnLi4vLi4vJyxcbiAgdGV4dDogRlMucmVhZEZpbGVTeW5jKGAke3Byb2Nlc3MuY3dkKCl9L2luZGV4LnRzYCwgJ3V0Zi04Jylcbn0sIHtcbiAgbGFuZ3VhZ2U6ICd0eXBlc2NyaXB0J1xufSkucGFyc2UoKTtcblxuXG4vLyBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpKSJdfQ== \ No newline at end of file +console.log(JSON.stringify(result, null, 2)); +// console.log(result); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLHVEQUFnRDtBQUVoRCx5QkFBeUI7QUFFekI7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQXFCLE1BQU07SUFHekIsWUFBWSxJQUFXLEVBQUUsVUFBZSxFQUFFO1FBRzFDLFVBQUssR0FBRyxHQUFHLEVBQUU7WUFDWCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDNUIsQ0FBQyxDQUFBO1FBSkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksdUJBQWEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMvRCxDQUFDO0NBSUY7QUFURCx5QkFTQztBQUVELE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDO0lBQ3hCLElBQUksRUFBRSxVQUFVO0lBQ2hCLElBQUksRUFBRSxRQUFRO0lBQ2QsSUFBSSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLGFBQWEsRUFBRSxPQUFPLENBQUM7Q0FDOUQsRUFBRTtJQUNELFFBQVEsRUFBRSxZQUFZO0NBQ3ZCLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUdYLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDNUMsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IElGaWxlIGZyb20gJy4vc3JjL2ludGVyZmFjZXMvSUZpbGUnO1xyXG5pbXBvcnQgUGFyc2VyRmFjdG9yeSBmcm9tICcuL3NyYy9QYXJzZXJGYWN0b3J5JztcclxuaW1wb3J0IElQYXJzZXIgZnJvbSAnLi9zcmMvaW50ZXJmYWNlcy9JUGFyc2VyJztcclxuaW1wb3J0ICogYXMgRlMgZnJvbSAnZnMnO1xyXG5cclxuLyoqXHJcbiAqIEEgY2xhc3MgdGhhdCBwYXJzZXMgYSBzb3VyY2UgY29kZSBhbmQgZ2VuZXJhdGVzIGFuIEFTVC5cclxuICogXHJcbiAqIEBjbGFzcyBQYXJzZXJcclxuICogQGltcGxlbWVudHMgSVBhcnNlclxyXG4gKiBcclxuICogIyBFeGFtcGxlXHJcbiAqIFxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKHtcclxuICogIG5hbWU6ICcuLi4nLFxyXG4gKiAgcGF0aDogJy4uLi4nLFxyXG4gKiAgdGV4dDogJy4uLidcclxuICogfSwgeyBsYW5ndWFnZTogJ3R5cGVzY3JpcHQnIH0pO1xyXG4gKiBcclxuICogY29uc3QgcmVzdWx0ID0gcGFyc2VyLnBhcnNlKCk7XHJcbiAqIFxyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhcnNlciBpbXBsZW1lbnRzIElQYXJzZXIge1xyXG5cclxuICBwcml2YXRlIHBhcnNlcjogSVBhcnNlcjtcclxuICBjb25zdHJ1Y3RvcihmaWxlOiBJRmlsZSwgb3B0aW9uczogYW55ID0ge30pIHtcclxuICAgIHRoaXMucGFyc2VyID0gKG5ldyBQYXJzZXJGYWN0b3J5KGZpbGUsIG9wdGlvbnMpKS5nZXRQYXJzZXIoKTtcclxuICB9XHJcbiAgcGFyc2UgPSAoKSA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIucGFyc2UoKVxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgcmVzdWx0ID0gbmV3IFBhcnNlcih7XHJcbiAgbmFtZTogJ2luZGV4LnRzJyxcclxuICBwYXRoOiAnLi4vLi4vJyxcclxuICB0ZXh0OiBGUy5yZWFkRmlsZVN5bmMoYCR7cHJvY2Vzcy5jd2QoKX0vZXhhbXBsZS50c2AsICd1dGYtOCcpXHJcbn0sIHtcclxuICBsYW5ndWFnZTogJ3R5cGVzY3JpcHQnXHJcbn0pLnBhcnNlKCk7XHJcblxyXG5cclxuY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSlcclxuLy8gY29uc29sZS5sb2cocmVzdWx0KTtcclxuIl19 \ No newline at end of file diff --git a/build/src/CommentParser.d.ts b/build/src/CommentParser.d.ts deleted file mode 100644 index b31ccee..0000000 --- a/build/src/CommentParser.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import IComment from "./interfaces/IComment"; -import * as Parser from 'tree-sitter'; -import { Location, Position } from './interfaces/IComment'; -export default class CommentParser { - static parse(node: Parser.SyntaxNode, source: string, offset?: { - location: Location; - position: Position; - }, comments?: IComment[]): IComment[]; -} diff --git a/build/src/CommentParser.js b/build/src/CommentParser.js deleted file mode 100644 index 62d4edf..0000000 --- a/build/src/CommentParser.js +++ /dev/null @@ -1,80 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const xdoc_parser_1 = require("xdoc-parser"); -/** - * Creates a position object. - * @param node: Parser.SyntaxNode - * @param offset: { - * location: Location, - * position: Position - * } - */ -function position(node, offset) { - return { - start: offset ? offset.position.start + node.startIndex : node.startIndex, - end: offset ? offset.position.end + node.endIndex : node.endIndex - }; -} -/** - * Creates a location object. - * @param node: Parser.SyntaxNode - * @param offset: { - * location: Location, - * position: Position - * } - * @return: { - * start: { - * row: number, - * column: number - * }, - * end: { - * row: number, - * column: number - * } - * } - */ -function location(node, offset) { - return { - start: { - row: offset ? offset.location.start.row + node.startPosition.row : node.startPosition.row, - column: offset ? offset.location.start.column + node.startPosition.column : node.startPosition.column - }, - end: { - row: offset ? offset.location.end.row + node.endPosition.row : node.endPosition.row, - column: offset ? offset.location.end.column + node.endPosition.column : node.endPosition.column - } - }; -} -class CommentParser { - static parse(node, source, offset, comments = []) { - // console.log(node.type) - if (node.type === "comment" && node.nextSibling) { - console.log(node.nextSibling.type); - // console.log(`${node.nextSibling.type} has a leading comment.`); - const next = node.nextSibling; - // console.log(source.substring(next.startIndex, next.endIndex)); - // console.log(''); - comments.push({ - position: position(node, offset), - location: location(node, offset), - markdown: (xdoc_parser_1.default(source.substring(node.startIndex, node.endIndex), { - visitor: { - showNodeText: true - } - })).parse(), - text: source.substring(node.startIndex, node.endIndex), - context: { - position: position(next, offset), - location: location(next, offset), - text: source.substring(next.startIndex, next.endIndex), - type: next.type, - children: [] - } - }); - } - node.children.forEach(child => CommentParser.parse(child, source, offset, comments)); - return comments; - } -} -exports.default = CommentParser; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tbWVudFBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Db21tZW50UGFyc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsNkNBQStCO0FBRy9COzs7Ozs7O0dBT0c7QUFDSCxTQUFTLFFBQVEsQ0FDZixJQUF1QixFQUN2QixNQUFtRDtJQUVuRCxPQUFPO1FBQ0wsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVU7UUFDekUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVE7S0FDbEUsQ0FBQTtBQUNILENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxTQUFTLFFBQVEsQ0FDZixJQUF1QixFQUN2QixNQUFrRDtJQUVsRCxPQUFPO1FBQ0wsS0FBSyxFQUFFO1lBQ0wsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUc7WUFDekYsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU07U0FDdEc7UUFDRCxHQUFHLEVBQUU7WUFDSCxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRztZQUNuRixNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTTtTQUNoRztLQUNGLENBQUE7QUFDSCxDQUFDO0FBRUQsTUFBcUIsYUFBYTtJQUNoQyxNQUFNLENBQUMsS0FBSyxDQUNWLElBQXVCLEVBQ3ZCLE1BQWMsRUFDZCxNQUFtRCxFQUNuRCxXQUF1QixFQUFFO1FBRXpCLHlCQUF5QjtRQUN6QixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDL0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ2xDLGtFQUFrRTtZQUNsRSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBRTlCLGlFQUFpRTtZQUNqRSxtQkFBbUI7WUFDbkIsUUFBUSxDQUFDLElBQUksQ0FBQztnQkFDWixRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUM7Z0JBQ2hDLFFBQVEsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQztnQkFDaEMsUUFBUSxFQUFFLENBQUMscUJBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFO29CQUNoRSxPQUFPLEVBQUU7d0JBQ1AsWUFBWSxFQUFFLElBQUk7cUJBQ25CO2lCQUNGLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRTtnQkFDWCxJQUFJLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ3RELE9BQU8sRUFBRTtvQkFDUCxRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUM7b0JBQ2hDLFFBQVEsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQztvQkFDaEMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO29CQUN0RCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7b0JBQ2YsUUFBUSxFQUFFLEVBQUU7aUJBQ2I7YUFDRixDQUFDLENBQUM7U0FDSjtRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3JGLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7Q0FDRjtBQXJDRCxnQ0FxQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgSUNvbW1lbnQgZnJvbSBcIi4vaW50ZXJmYWNlcy9JQ29tbWVudFwiO1xuaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcbmltcG9ydCB4ZG9jIGZyb20gJ3hkb2MtcGFyc2VyJztcbmltcG9ydCB7IExvY2F0aW9uLCBQb3NpdGlvbiB9IGZyb20gJy4vaW50ZXJmYWNlcy9JQ29tbWVudCc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHBvc2l0aW9uIG9iamVjdC5cbiAqIEBwYXJhbSBub2RlOiBQYXJzZXIuU3ludGF4Tm9kZVxuICogQHBhcmFtIG9mZnNldDoge1xuICogIGxvY2F0aW9uOiBMb2NhdGlvbixcbiAqICBwb3NpdGlvbjogUG9zaXRpb25cbiAqIH1cbiAqL1xuZnVuY3Rpb24gcG9zaXRpb24oXG4gIG5vZGU6IFBhcnNlci5TeW50YXhOb2RlLFxuICBvZmZzZXQ/OiB7IGxvY2F0aW9uOiBMb2NhdGlvbiwgcG9zaXRpb246IFBvc2l0aW9uIH1cbikge1xuICByZXR1cm4ge1xuICAgIHN0YXJ0OiBvZmZzZXQgPyBvZmZzZXQucG9zaXRpb24uc3RhcnQgKyBub2RlLnN0YXJ0SW5kZXggOiBub2RlLnN0YXJ0SW5kZXgsXG4gICAgZW5kOiBvZmZzZXQgPyBvZmZzZXQucG9zaXRpb24uZW5kICsgbm9kZS5lbmRJbmRleCA6IG5vZGUuZW5kSW5kZXhcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsb2NhdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0gbm9kZTogUGFyc2VyLlN5bnRheE5vZGVcbiAqIEBwYXJhbSBvZmZzZXQ6IHtcbiAqICBsb2NhdGlvbjogTG9jYXRpb24sXG4gKiAgcG9zaXRpb246IFBvc2l0aW9uXG4gKiB9XG4gKiBAcmV0dXJuOiB7XG4gKiAgc3RhcnQ6IHtcbiAqICAgIHJvdzogbnVtYmVyLFxuICogICAgY29sdW1uOiBudW1iZXJcbiAqICB9LFxuICogIGVuZDoge1xuICogICAgcm93OiBudW1iZXIsXG4gKiAgICBjb2x1bW46IG51bWJlclxuICogIH1cbiAqIH1cbiAqL1xuZnVuY3Rpb24gbG9jYXRpb24oXG4gIG5vZGU6IFBhcnNlci5TeW50YXhOb2RlLFxuICBvZmZzZXQ6IHsgbG9jYXRpb246IExvY2F0aW9uLCBwb3NpdGlvbjogUG9zaXRpb24gfVxuKSB7XG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IHtcbiAgICAgIHJvdzogb2Zmc2V0ID8gb2Zmc2V0LmxvY2F0aW9uLnN0YXJ0LnJvdyArIG5vZGUuc3RhcnRQb3NpdGlvbi5yb3cgOiBub2RlLnN0YXJ0UG9zaXRpb24ucm93LFxuICAgICAgY29sdW1uOiBvZmZzZXQgPyBvZmZzZXQubG9jYXRpb24uc3RhcnQuY29sdW1uICsgbm9kZS5zdGFydFBvc2l0aW9uLmNvbHVtbiA6IG5vZGUuc3RhcnRQb3NpdGlvbi5jb2x1bW5cbiAgICB9LFxuICAgIGVuZDoge1xuICAgICAgcm93OiBvZmZzZXQgPyBvZmZzZXQubG9jYXRpb24uZW5kLnJvdyArIG5vZGUuZW5kUG9zaXRpb24ucm93IDogbm9kZS5lbmRQb3NpdGlvbi5yb3csXG4gICAgICBjb2x1bW46IG9mZnNldCA/IG9mZnNldC5sb2NhdGlvbi5lbmQuY29sdW1uICsgbm9kZS5lbmRQb3NpdGlvbi5jb2x1bW4gOiBub2RlLmVuZFBvc2l0aW9uLmNvbHVtblxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb21tZW50UGFyc2VyIHtcbiAgc3RhdGljIHBhcnNlKFxuICAgIG5vZGU6IFBhcnNlci5TeW50YXhOb2RlLFxuICAgIHNvdXJjZTogc3RyaW5nLFxuICAgIG9mZnNldD86IHsgbG9jYXRpb246IExvY2F0aW9uLCBwb3NpdGlvbjogUG9zaXRpb24gfSxcbiAgICBjb21tZW50czogSUNvbW1lbnRbXSA9IFtdLFxuICApIHtcbiAgICAvLyBjb25zb2xlLmxvZyhub2RlLnR5cGUpXG4gICAgaWYgKG5vZGUudHlwZSA9PT0gXCJjb21tZW50XCIgJiYgbm9kZS5uZXh0U2libGluZykge1xuICAgICAgY29uc29sZS5sb2cobm9kZS5uZXh0U2libGluZy50eXBlKVxuICAgICAgLy8gY29uc29sZS5sb2coYCR7bm9kZS5uZXh0U2libGluZy50eXBlfSBoYXMgYSBsZWFkaW5nIGNvbW1lbnQuYCk7XG4gICAgICBjb25zdCBuZXh0ID0gbm9kZS5uZXh0U2libGluZztcblxuICAgICAgLy8gY29uc29sZS5sb2coc291cmNlLnN1YnN0cmluZyhuZXh0LnN0YXJ0SW5kZXgsIG5leHQuZW5kSW5kZXgpKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgIGNvbW1lbnRzLnB1c2goe1xuICAgICAgICBwb3NpdGlvbjogcG9zaXRpb24obm9kZSwgb2Zmc2V0KSxcbiAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uKG5vZGUsIG9mZnNldCksXG4gICAgICAgIG1hcmtkb3duOiAoeGRvYyhzb3VyY2Uuc3Vic3RyaW5nKG5vZGUuc3RhcnRJbmRleCwgbm9kZS5lbmRJbmRleCksIHtcbiAgICAgICAgICB2aXNpdG9yOiB7XG4gICAgICAgICAgICBzaG93Tm9kZVRleHQ6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pKS5wYXJzZSgpLFxuICAgICAgICB0ZXh0OiBzb3VyY2Uuc3Vic3RyaW5nKG5vZGUuc3RhcnRJbmRleCwgbm9kZS5lbmRJbmRleCksXG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBwb3NpdGlvbjogcG9zaXRpb24obmV4dCwgb2Zmc2V0KSxcbiAgICAgICAgICBsb2NhdGlvbjogbG9jYXRpb24obmV4dCwgb2Zmc2V0KSxcbiAgICAgICAgICB0ZXh0OiBzb3VyY2Uuc3Vic3RyaW5nKG5leHQuc3RhcnRJbmRleCwgbmV4dC5lbmRJbmRleCksXG4gICAgICAgICAgdHlwZTogbmV4dC50eXBlLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBub2RlLmNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4gQ29tbWVudFBhcnNlci5wYXJzZShjaGlsZCwgc291cmNlLCBvZmZzZXQsIGNvbW1lbnRzKSk7XG4gICAgcmV0dXJuIGNvbW1lbnRzO1xuICB9XG59Il19 \ No newline at end of file diff --git a/build/src/ParserFactory.js b/build/src/ParserFactory.js index 1cdf9b7..c43c38f 100644 --- a/build/src/ParserFactory.js +++ b/build/src/ParserFactory.js @@ -12,7 +12,6 @@ class ParserFactory { case 'js': case 'javascript': return new javascript_1.default(this.file, this.options); - break; case 'ts': case 'typescript': return new typescript_1.default(this.file, this.options); @@ -26,4 +25,4 @@ class ParserFactory { } } exports.default = ParserFactory; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFyc2VyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9QYXJzZXJGYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsa0RBQWlEO0FBQ2pELGtEQUFpRDtBQUVqRCxNQUFxQixhQUFhO0lBS2hDLFlBQVksSUFBVyxFQUFFLFVBQWUsRUFBRTtRQUhsQyxZQUFPLEdBQUc7WUFDaEIsUUFBUSxFQUFFLFlBQVk7U0FDdkIsQ0FBQTtRQU1ELGNBQVMsR0FBRyxHQUFZLEVBQUU7WUFDeEIsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDM0MsS0FBSyxJQUFJLENBQUM7Z0JBQ1YsS0FBSyxZQUFZO29CQUNmLE9BQU8sSUFBSSxvQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDckQsTUFBTTtnQkFDUixLQUFLLElBQUksQ0FBQztnQkFDVixLQUFLLFlBQVk7b0JBQ2YsT0FBTyxJQUFJLG9CQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN2RDtvQkFDQSxPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsVUFBVSxDQUFDLENBQUE7b0JBQ3JFLE1BQU07YUFDVDtRQUNILENBQUMsQ0FBQTtRQWpCQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDdEMsQ0FBQztDQWlCRjtBQXpCRCxnQ0F5QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgSUZpbGUgZnJvbSBcIi4vaW50ZXJmYWNlcy9JRmlsZVwiO1xuaW1wb3J0IElQYXJzZXIgZnJvbSBcIi4vaW50ZXJmYWNlcy9JUGFyc2VyXCI7XG5pbXBvcnQgSmF2YVNjcmlwdFBhcnNlciBmcm9tIFwiLi9sYW5nL2phdmFzY3JpcHRcIjtcbmltcG9ydCBUeXBlU2NyaXB0UGFyc2VyIGZyb20gJy4vbGFuZy90eXBlc2NyaXB0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFyc2VyRmFjdG9yeSB7XG4gIHByaXZhdGUgZmlsZTogSUZpbGVcbiAgcHJpdmF0ZSBvcHRpb25zID0ge1xuICAgIGxhbmd1YWdlOiAnSmF2YVNjcmlwdCdcbiAgfVxuICBjb25zdHJ1Y3RvcihmaWxlOiBJRmlsZSwgb3B0aW9uczogYW55ID0ge30pIHtcbiAgICB0aGlzLmZpbGUgPSBmaWxlO1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5vcHRpb25zLCBvcHRpb25zKVxuICB9XG5cbiAgZ2V0UGFyc2VyID0gKCk6IElQYXJzZXIgPT4ge1xuICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLmxhbmd1YWdlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNhc2UgJ2pzJzpcbiAgICAgIGNhc2UgJ2phdmFzY3JpcHQnOlxuICAgICAgICByZXR1cm4gbmV3IEphdmFTY3JpcHRQYXJzZXIodGhpcy5maWxlLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RzJzpcbiAgICAgIGNhc2UgJ3R5cGVzY3JpcHQnOlxuICAgICAgICByZXR1cm4gbmV3IFR5cGVTY3JpcHRQYXJzZXIodGhpcy5maWxlLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgIGNvbnNvbGUubG9nKGBbbXItZG9jXTogTm8gcGFyc2VyIGZvciAke3RoaXMub3B0aW9ucy5sYW5ndWFnZX0gZXhpc3RzLmApXG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFyc2VyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9QYXJzZXJGYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsa0RBQWlEO0FBQ2pELGtEQUFpRDtBQUVqRCxNQUFxQixhQUFhO0lBS2hDLFlBQVksSUFBVyxFQUFFLFVBQWUsRUFBRTtRQUhsQyxZQUFPLEdBQUc7WUFDaEIsUUFBUSxFQUFFLFlBQVk7U0FDdkIsQ0FBQTtRQU1ELGNBQVMsR0FBRyxHQUFZLEVBQUU7WUFDeEIsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDM0MsS0FBSyxJQUFJLENBQUM7Z0JBQ1YsS0FBSyxZQUFZO29CQUNmLE9BQU8sSUFBSSxvQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkQsS0FBSyxJQUFJLENBQUM7Z0JBQ1YsS0FBSyxZQUFZO29CQUNmLE9BQU8sSUFBSSxvQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkQ7b0JBQ0EsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLFVBQVUsQ0FBQyxDQUFBO29CQUNyRSxNQUFNO2FBQ1Q7UUFDSCxDQUFDLENBQUE7UUFoQkMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3RDLENBQUM7Q0FnQkY7QUF4QkQsZ0NBd0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IElGaWxlIGZyb20gXCIuL2ludGVyZmFjZXMvSUZpbGVcIjtcclxuaW1wb3J0IElQYXJzZXIgZnJvbSBcIi4vaW50ZXJmYWNlcy9JUGFyc2VyXCI7XHJcbmltcG9ydCBKYXZhU2NyaXB0UGFyc2VyIGZyb20gXCIuL2xhbmcvamF2YXNjcmlwdFwiO1xyXG5pbXBvcnQgVHlwZVNjcmlwdFBhcnNlciBmcm9tICcuL2xhbmcvdHlwZXNjcmlwdCc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYXJzZXJGYWN0b3J5IHtcclxuICBwcml2YXRlIGZpbGU6IElGaWxlXHJcbiAgcHJpdmF0ZSBvcHRpb25zID0ge1xyXG4gICAgbGFuZ3VhZ2U6ICdKYXZhU2NyaXB0J1xyXG4gIH1cclxuICBjb25zdHJ1Y3RvcihmaWxlOiBJRmlsZSwgb3B0aW9uczogYW55ID0ge30pIHtcclxuICAgIHRoaXMuZmlsZSA9IGZpbGU7XHJcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucywgb3B0aW9ucylcclxuICB9XHJcblxyXG4gIGdldFBhcnNlciA9ICgpOiBJUGFyc2VyID0+IHtcclxuICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLmxhbmd1YWdlLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgY2FzZSAnanMnOlxyXG4gICAgICBjYXNlICdqYXZhc2NyaXB0JzpcclxuICAgICAgICByZXR1cm4gbmV3IEphdmFTY3JpcHRQYXJzZXIodGhpcy5maWxlLCB0aGlzLm9wdGlvbnMpO1xyXG4gICAgICBjYXNlICd0cyc6XHJcbiAgICAgIGNhc2UgJ3R5cGVzY3JpcHQnOlxyXG4gICAgICAgIHJldHVybiBuZXcgVHlwZVNjcmlwdFBhcnNlcih0aGlzLmZpbGUsIHRoaXMub3B0aW9ucyk7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgIGNvbnNvbGUubG9nKGBbbXItZG9jXTogTm8gcGFyc2VyIGZvciAke3RoaXMub3B0aW9ucy5sYW5ndWFnZX0gZXhpc3RzLmApXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufSJdfQ== \ No newline at end of file diff --git a/build/src/interfaces/IComment.d.ts b/build/src/interfaces/IComment.d.ts deleted file mode 100644 index 06ca3d5..0000000 --- a/build/src/interfaces/IComment.d.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { RemarkNode } from 'xdoc-parser/src/XDocParser'; -export interface Position { - start: number; - end: number; -} -export interface Location { - start: { - row: number; - column: number; - }; - end: { - row: number; - column: number; - }; -} -export default interface IComment { - position: Position; - location: Location; - markdown: RemarkNode[]; - text: string; - context: { - position: Position; - location: Location; - text: string; - type: string; - children: IComment[] | undefined[]; - }; -} diff --git a/build/src/interfaces/IComment.js b/build/src/interfaces/IComment.js deleted file mode 100644 index b44f217..0000000 --- a/build/src/interfaces/IComment.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSUNvbW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW50ZXJmYWNlcy9JQ29tbWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IElGaWxlIGZyb20gXCIuL0lGaWxlXCI7XG5pbXBvcnQgeyBSZW1hcmtOb2RlIH0gZnJvbSAneGRvYy1wYXJzZXIvc3JjL1hEb2NQYXJzZXInXG5leHBvcnQgaW50ZXJmYWNlIFBvc2l0aW9uIHtcbiAgc3RhcnQ6IG51bWJlcixcbiAgZW5kOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYXRpb24ge1xuICBzdGFydDogeyByb3c6IG51bWJlciwgY29sdW1uOiBudW1iZXIgfSxcbiAgZW5kOiB7IHJvdzogbnVtYmVyLCBjb2x1bW46IG51bWJlciB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGludGVyZmFjZSBJQ29tbWVudCB7XG4gIHBvc2l0aW9uOiBQb3NpdGlvbixcbiAgbG9jYXRpb246IExvY2F0aW9uLFxuICBtYXJrZG93bjogUmVtYXJrTm9kZVtdLFxuICB0ZXh0OiBzdHJpbmdcbiAgY29udGV4dDoge1xuICAgIHBvc2l0aW9uOiBQb3NpdGlvbixcbiAgICBsb2NhdGlvbjogTG9jYXRpb24sXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICBjaGlsZHJlbjogSUNvbW1lbnRbXSB8IHVuZGVmaW5lZFtdXG4gIH1cbn0iXX0= \ No newline at end of file diff --git a/build/src/interfaces/IFile.js b/build/src/interfaces/IFile.js index d0508f0..a9ffe77 100644 --- a/build/src/interfaces/IFile.js +++ b/build/src/interfaces/IFile.js @@ -1,3 +1,3 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSUZpbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW50ZXJmYWNlcy9JRmlsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgaW50ZXJmYWNlIElGaWxlIHtcbiAgbmFtZTogc3RyaW5nLFxuICBwYXRoOiBzdHJpbmcsXG4gIHRleHQ6IHN0cmluZ1xufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSUZpbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW50ZXJmYWNlcy9JRmlsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgaW50ZXJmYWNlIElGaWxlIHtcclxuICBuYW1lOiBzdHJpbmcsXHJcbiAgcGF0aDogc3RyaW5nLFxyXG4gIHRleHQ6IHN0cmluZ1xyXG59Il19 \ No newline at end of file diff --git a/build/src/interfaces/IParser.d.ts b/build/src/interfaces/IParser.d.ts index 96631f9..ec5d74d 100644 --- a/build/src/interfaces/IParser.d.ts +++ b/build/src/interfaces/IParser.d.ts @@ -1,6 +1,5 @@ import IFile from "./IFile"; -import IResult from "./IResult"; export default abstract class IParser { constructor(file: IFile, options: any); - abstract parse(): IResult; + abstract parse(): any; } diff --git a/build/src/interfaces/IParser.js b/build/src/interfaces/IParser.js index 416e800..30cc3ca 100644 --- a/build/src/interfaces/IParser.js +++ b/build/src/interfaces/IParser.js @@ -1,8 +1,9 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); +// import IResult from "./IResult"; class IParser { constructor(file, options) { } } exports.default = IParser; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSVBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbnRlcmZhY2VzL0lQYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxNQUE4QixPQUFPO0lBQ25DLFlBQVksSUFBVyxFQUFFLE9BQVk7SUFFckMsQ0FBQztDQUVGO0FBTEQsMEJBS0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgSUZpbGUgZnJvbSBcIi4vSUZpbGVcIjtcbmltcG9ydCBJUmVzdWx0IGZyb20gXCIuL0lSZXN1bHRcIjtcblxuZXhwb3J0IGRlZmF1bHQgYWJzdHJhY3QgY2xhc3MgSVBhcnNlciB7XG4gIGNvbnN0cnVjdG9yKGZpbGU6IElGaWxlLCBvcHRpb25zOiBhbnkpIHtcblxuICB9XG4gIGFic3RyYWN0IHBhcnNlKCk6IElSZXN1bHRcbn0iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSVBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbnRlcmZhY2VzL0lQYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSxtQ0FBbUM7QUFFbkMsTUFBOEIsT0FBTztJQUNuQyxZQUFZLElBQVcsRUFBRSxPQUFZO0lBRXJDLENBQUM7Q0FFRjtBQUxELDBCQUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IElGaWxlIGZyb20gXCIuL0lGaWxlXCI7XHJcbi8vIGltcG9ydCBJUmVzdWx0IGZyb20gXCIuL0lSZXN1bHRcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGFic3RyYWN0IGNsYXNzIElQYXJzZXIge1xyXG4gIGNvbnN0cnVjdG9yKGZpbGU6IElGaWxlLCBvcHRpb25zOiBhbnkpIHtcclxuXHJcbiAgfVxyXG4gIGFic3RyYWN0IHBhcnNlKCk6IGFueVxyXG59Il19 \ No newline at end of file diff --git a/build/src/interfaces/IResult.d.ts b/build/src/interfaces/IResult.d.ts deleted file mode 100644 index 14bc625..0000000 --- a/build/src/interfaces/IResult.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import IFile from "./IFile"; -import IComment from "./IComment"; -export default interface IResult { - file: IFile; - comments: IComment[]; -} diff --git a/build/src/interfaces/IResult.js b/build/src/interfaces/IResult.js deleted file mode 100644 index 7fda6e0..0000000 --- a/build/src/interfaces/IResult.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSVJlc3VsdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbnRlcmZhY2VzL0lSZXN1bHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBJRmlsZSBmcm9tIFwiLi9JRmlsZVwiO1xuaW1wb3J0IElDb21tZW50IGZyb20gXCIuL0lDb21tZW50XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGludGVyZmFjZSBJUmVzdWx0IHtcbiAgZmlsZTogSUZpbGUsXG4gIGNvbW1lbnRzOiBJQ29tbWVudFtdXG59Il19 \ No newline at end of file diff --git a/build/src/interfaces/TextRange.d.ts b/build/src/interfaces/TextRange.d.ts new file mode 100644 index 0000000..548933a --- /dev/null +++ b/build/src/interfaces/TextRange.d.ts @@ -0,0 +1,45 @@ +/** + * An interface that represents a range. + * + * ```xdoc + * @interface Range + * ``` + */ +export interface Range { + start: number; + end: number; +} +/** + * An interface that represents the positional + * and locational ranges of a source code. + * + * ```xdoc + * @interface TextRange + * ``` + */ +export default interface TextRange { + /** + * Represents a context's start and end position. + * ```xdoc + * @property position: { + * start: number, + * end: number + * } + * ``` + */ + position: Range; + /** + * Represents a context's row and column location. + * + * ```xdoc + * @location: { + * row: Range, + * column: Range + * } + * ``` + */ + location: { + row: Range; + column: Range; + }; +} diff --git a/build/src/interfaces/TextRange.js b/build/src/interfaces/TextRange.js new file mode 100644 index 0000000..8d356dc --- /dev/null +++ b/build/src/interfaces/TextRange.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGV4dFJhbmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvVGV4dFJhbmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuLyoqXHJcbiAqIEFuIGludGVyZmFjZSB0aGF0IHJlcHJlc2VudHMgYSByYW5nZS5cclxuICogXHJcbiAqIGBgYHhkb2NcclxuICogQGludGVyZmFjZSBSYW5nZVxyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmFuZ2Uge1xyXG4gIHN0YXJ0OiBudW1iZXIsXHJcbiAgZW5kOiBudW1iZXJcclxufVxyXG5cclxuLyoqXHJcbiAqIEFuIGludGVyZmFjZSB0aGF0IHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uYWwgXHJcbiAqIGFuZCBsb2NhdGlvbmFsIHJhbmdlcyBvZiBhIHNvdXJjZSBjb2RlLlxyXG4gKiBcclxuICogYGBgeGRvY1xyXG4gKiBAaW50ZXJmYWNlIFRleHRSYW5nZVxyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGludGVyZmFjZSBUZXh0UmFuZ2Uge1xyXG4gIC8qKlxyXG4gICAqIFJlcHJlc2VudHMgYSBjb250ZXh0J3Mgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbi5cclxuICAgKiBgYGB4ZG9jXHJcbiAgICogQHByb3BlcnR5IHBvc2l0aW9uOiB7XHJcbiAgICogIHN0YXJ0OiBudW1iZXIsXHJcbiAgICogIGVuZDogbnVtYmVyXHJcbiAgICogfVxyXG4gICAqIGBgYFxyXG4gICAqL1xyXG4gIHBvc2l0aW9uOiBSYW5nZVxyXG4gIC8qKlxyXG4gICAqIFJlcHJlc2VudHMgYSBjb250ZXh0J3Mgcm93IGFuZCBjb2x1bW4gbG9jYXRpb24uXHJcbiAgICogXHJcbiAgICogYGBgeGRvY1xyXG4gICAqIEBsb2NhdGlvbjoge1xyXG4gICAqICByb3c6IFJhbmdlLFxyXG4gICAqICBjb2x1bW46IFJhbmdlXHJcbiAgICogfVxyXG4gICAqIGBgYFxyXG4gICAqL1xyXG4gIGxvY2F0aW9uOiB7XHJcbiAgICByb3c6IFJhbmdlLFxyXG4gICAgY29sdW1uOiBSYW5nZVxyXG4gIH1cclxufSJdfQ== \ No newline at end of file diff --git a/build/src/lang/javascript/index.d.ts b/build/src/lang/javascript/index.d.ts index 034dda4..8b50039 100644 --- a/build/src/lang/javascript/index.d.ts +++ b/build/src/lang/javascript/index.d.ts @@ -1,6 +1,5 @@ import IParser from '../../interfaces/IParser'; import IFile from '../../interfaces/IFile'; -import IResult from '../../interfaces/IResult'; /** * A class that parses JavaScript comments. * @@ -17,8 +16,5 @@ export default class JavaScriptParser implements IParser { private options; private parser; constructor(file: IFile, options: any); - parse: () => IResult; - private filterType; - private checkType; - private parseChildren; + parse: () => void; } diff --git a/build/src/lang/javascript/index.js b/build/src/lang/javascript/index.js index 2ddfd25..48643af 100644 --- a/build/src/lang/javascript/index.js +++ b/build/src/lang/javascript/index.js @@ -2,7 +2,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); const Parser = require("tree-sitter"); const JavaScript = require("tree-sitter-javascript"); -const CommentParser_1 = require("../../CommentParser"); +// import IResult from '../../interfaces/IResult'; +// import IComment from '../../interfaces/IComment'; /** * A class that parses JavaScript comments. * @@ -17,71 +18,33 @@ const CommentParser_1 = require("../../CommentParser"); class JavaScriptParser { constructor(file, options) { this.parse = () => { - let tree = this.parser.parse(this.file.text); - // Get the first comment - let first_comment = tree.rootNode.children - .filter(node => node.type === "comment")[0]; - const first_comment_string = this.file.text - .substring(first_comment.startIndex, first_comment.endIndex); - // Remove any legal or unncessary comments - if (first_comment_string.includes("copyright") || - first_comment_string.includes("author") || - first_comment_string.includes("terms and conditions")) { - tree.edit({ - startIndex: first_comment.startIndex, - oldEndIndex: first_comment.endIndex, - newEndIndex: first_comment.endIndex, - startPosition: { row: 0, column: 0 }, - oldEndPosition: { row: 0, column: 0 }, - newEndPosition: { row: 0, column: 0 }, - }); - tree = this.parser.parse('', tree); - } - return { - file: this.file, - comments: CommentParser_1.default.parse(tree.rootNode, this.file.text) - .filter(this.filterType) - // .map(this.checkType) - .map(this.parseChildren) - }; - }; - this.filterType = (comment) => { - return (this.options.filter || - [ - 'function', - 'class', - 'variable_declaration' - ]).includes(comment.context.type); - }; - this.checkType = (comment) => { - const tree = this.parser.parse(comment.context.text); - switch (comment.context.type) { - case 'variable_declaration': - // Check whether we have an anonymous class - if (comment.context.text.includes("class")) { - // Drill down until we find the class body - const variable_declarator = tree.rootNode.children[0].children[1]; - const anonymous_class = variable_declarator.children - .filter(node => node.type === "anonymous_class")[0]; - const class_body = anonymous_class.children[1]; - comment.context.children = CommentParser_1.default.parse(class_body, comment.context.text, { location: comment.context.location, position: comment.context.position }); - } - break; - default: - break; - } - return comment; - }; - this.parseChildren = (comment) => { - switch (comment.context.type) { - case 'class': - const tree = this.parser.parse(comment.context.text); - comment.context.children = CommentParser_1.default.parse(tree.rootNode, comment.context.text, { location: comment.context.location, position: comment.context.position }).filter(child => child.context.type === 'method_definition'); - break; - default: - break; - } - return comment; + // let tree = this.parser.parse(this.file.text); + // // Get the first comment + // let first_comment = tree.rootNode.children + // .filter(node => node.type === "comment")[0]; + // const first_comment_string = this.file.text + // .substring(first_comment.startIndex, first_comment.endIndex); + // // Remove any legal or unncessary comments + // if (first_comment_string.includes("copyright") || + // first_comment_string.includes("author") || + // first_comment_string.includes("terms and conditions")) { + // tree.edit({ + // startIndex: first_comment.startIndex, + // oldEndIndex: first_comment.endIndex, + // newEndIndex: first_comment.endIndex, + // startPosition: { row: 0, column: 0 }, + // oldEndPosition: { row: 0, column: 0 }, + // newEndPosition: { row: 0, column: 0 }, + // }); + // tree = this.parser.parse('', tree); + // } + // return { + // file: this.file, + // comments: CommentParser.parse(tree.rootNode, this.file.text) + // .filter(this.filterType) + // // .map(this.checkType) + // .map(this.parseChildren) + // } }; this.file = file; Object.assign(this.options = {}, options || {}); @@ -90,4 +53,4 @@ class JavaScriptParser { } } exports.default = JavaScriptParser; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy9qYXZhc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNDO0FBQ3RDLHFEQUFxRDtBQUlyRCx1REFBZ0Q7QUFHaEQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQXFCLGdCQUFnQjtJQUluQyxZQUFZLElBQVcsRUFBRSxPQUFZO1FBTXJDLFVBQUssR0FBRyxHQUFZLEVBQUU7WUFDcEIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3Qyx3QkFBd0I7WUFDeEIsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRO2lCQUN2QyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO2lCQUMxQyxTQUFTLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFN0QsMENBQTBDO1lBQzFDLElBQUksb0JBQW9CLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztnQkFDNUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztnQkFDdkMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDLEVBQUU7Z0JBQ3ZELElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQ1IsVUFBVSxFQUFFLGFBQWEsQ0FBQyxVQUFVO29CQUNwQyxXQUFXLEVBQUUsYUFBYSxDQUFDLFFBQVE7b0JBQ25DLFdBQVcsRUFBRSxhQUFhLENBQUMsUUFBUTtvQkFDbkMsYUFBYSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFB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RSxRQUFRLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQzNFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsQ0FBQztvQkFDOUQsTUFBTTtnQkFDUjtvQkFDRSxNQUFNO2FBQ1Q7WUFDRCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDLENBQUE7UUFuRkMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Q0FnRkY7QUF6RkQsbUNBeUZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcbmltcG9ydCAqIGFzIEphdmFTY3JpcHQgZnJvbSAndHJlZS1zaXR0ZXItamF2YXNjcmlwdCc7XG5pbXBvcnQgSVBhcnNlciBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lQYXJzZXInO1xuaW1wb3J0IElGaWxlIGZyb20gJy4uLy4uL2ludGVyZmFjZXMvSUZpbGUnO1xuaW1wb3J0IElSZXN1bHQgZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9JUmVzdWx0JztcbmltcG9ydCBDb21tZW50UGFyc2VyIGZyb20gJy4uLy4uL0NvbW1lbnRQYXJzZXInO1xuaW1wb3J0IElDb21tZW50IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvSUNvbW1lbnQnO1xuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCBwYXJzZXMgSmF2YVNjcmlwdCBjb21tZW50cy5cbiAqIFxuICogIyBBUElcbiAqIFxuICogYGBgXG4gKiBAY2xhc3MgSmF2YVNjcmlwdFBhcnNlclxuICogQGltcGxlbWVudHMgSVBhcnNlclxuICogQGV4cG9ydCBkZWZhdWx0XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSmF2YVNjcmlwdFBhcnNlciBpbXBsZW1lbnRzIElQYXJzZXIge1xuICBwcml2YXRlIGZpbGU6IElGaWxlO1xuICBwcml2YXRlIG9wdGlvbnM6IGFueTtcbiAgcHJpdmF0ZSBwYXJzZXI6IFBhcnNlcjtcbiAgY29uc3RydWN0b3IoZmlsZTogSUZpbGUsIG9wdGlvbnM6IGFueSkge1xuICAgIHRoaXMuZmlsZSA9IGZpbGU7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdGlvbnMgPSB7fSwgb3B0aW9ucyB8fCB7fSk7XG4gICAgdGhpcy5wYXJzZXIgPSBuZXcgUGFyc2VyKCk7XG4gICAgdGhpcy5wYXJzZXIuc2V0TGFuZ3VhZ2UoSmF2YVNjcmlwdCk7XG4gIH1cbiAgcGFyc2UgPSAoKTogSVJlc3VsdCA9PiB7XG4gICAgbGV0IHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZSh0aGlzLmZpbGUudGV4dCk7XG4gICAgLy8gR2V0IHRoZSBmaXJzdCBjb21tZW50XG4gICAgbGV0IGZpcnN0X2NvbW1lbnQgPSB0cmVlLnJvb3ROb2RlLmNoaWxkcmVuXG4gICAgICAuZmlsdGVyKG5vZGUgPT4gbm9kZS50eXBlID09PSBcImNvbW1lbnRcIilbMF07XG4gICAgY29uc3QgZmlyc3RfY29tbWVudF9zdHJpbmcgPSB0aGlzLmZpbGUudGV4dFxuICAgIC5zdWJzdHJpbmcoZmlyc3RfY29tbWVudC5zdGFydEluZGV4LCBmaXJzdF9jb21tZW50LmVuZEluZGV4KTtcbiAgICBcbiAgICAvLyBSZW1vdmUgYW55IGxlZ2FsIG9yIHVubmNlc3NhcnkgY29tbWVudHNcbiAgICBpZiAoZmlyc3RfY29tbWVudF9zdHJpbmcuaW5jbHVkZXMoXCJjb3B5cmlnaHRcIikgfHxcbiAgICAgIGZpcnN0X2NvbW1lbnRfc3RyaW5nLmluY2x1ZGVzKFwiYXV0aG9yXCIpIHx8XG4gICAgICBmaXJzdF9jb21tZW50X3N0cmluZy5pbmNsdWRlcyhcInRlcm1zIGFuZCBjb25kaXRpb25zXCIpKSB7XG4gICAgICB0cmVlLmVkaXQoe1xuICAgICAgICBzdGFydEluZGV4OiBmaXJzdF9jb21tZW50LnN0YXJ0SW5kZXgsXG4gICAgICAgIG9sZEVuZEluZGV4OiBmaXJzdF9jb21tZW50LmVuZEluZGV4LFxuICAgICAgICBuZXdFbmRJbmRleDogZmlyc3RfY29tbWVudC5lbmRJbmRleCxcbiAgICAgICAgc3RhcnRQb3NpdGlvbjogeyByb3c6IDAsIGNvbHVtbjogMCB9LFxuICAgICAgICBvbGRFbmRQb3NpdGlvbjogeyByb3c6IDAsIGNvbHVtbjogMCB9LFxuICAgICAgICBuZXdFbmRQb3NpdGlvbjogeyByb3c6IDAsIGNvbHVtbjogMCB9LFxuICAgICAgfSk7XG4gICAgICB0cmVlID0gdGhpcy5wYXJzZXIucGFyc2UoJycsIHRyZWUpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZmlsZTogdGhpcy5maWxlLFxuICAgICAgY29tbWVudHM6IENvbW1lbnRQYXJzZXIucGFyc2UodHJlZS5yb290Tm9kZSwgdGhpcy5maWxlLnRleHQpXG4gICAgICAgIC5maWx0ZXIodGhpcy5maWx0ZXJUeXBlKVxuICAgICAgICAvLyAubWFwKHRoaXMuY2hlY2tUeXBlKVxuICAgICAgICAubWFwKHRoaXMucGFyc2VDaGlsZHJlbilcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZpbHRlclR5cGUgPSAoY29tbWVudDogSUNvbW1lbnQpOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gKHRoaXMub3B0aW9ucy5maWx0ZXIgfHxcbiAgICAgIFtcbiAgICAgICAgJ2Z1bmN0aW9uJyxcbiAgICAgICAgJ2NsYXNzJyxcbiAgICAgICAgJ3ZhcmlhYmxlX2RlY2xhcmF0aW9uJ1xuICAgICAgXSkuaW5jbHVkZXMoY29tbWVudC5jb250ZXh0LnR5cGUpXG4gIH1cblxuICBwcml2YXRlIGNoZWNrVHlwZSA9IChjb21tZW50OiBJQ29tbWVudCk6IElDb21tZW50ID0+IHtcbiAgICBjb25zdCB0cmVlID0gdGhpcy5wYXJzZXIucGFyc2UoY29tbWVudC5jb250ZXh0LnRleHQpO1xuICAgIHN3aXRjaCAoY29tbWVudC5jb250ZXh0LnR5cGUpIHtcbiAgICAgIGNhc2UgJ3ZhcmlhYmxlX2RlY2xhcmF0aW9uJzpcbiAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB3ZSBoYXZlIGFuIGFub255bW91cyBjbGFzc1xuICAgICAgICBpZiAoY29tbWVudC5jb250ZXh0LnRleHQuaW5jbHVkZXMoXCJjbGFzc1wiKSkge1xuICAgICAgICAgIC8vIERyaWxsIGRvd24gdW50aWwgd2UgZmluZCB0aGUgY2xhc3MgYm9keVxuICAgICAgICAgIGNvbnN0IHZhcmlhYmxlX2RlY2xhcmF0b3IgPSB0cmVlLnJvb3ROb2RlLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzFdO1xuICAgICAgICAgIGNvbnN0IGFub255bW91c19jbGFzcyA9IHZhcmlhYmxlX2RlY2xhcmF0b3IuY2hpbGRyZW5cbiAgICAgICAgICAgIC5maWx0ZXIobm9kZSA9PiBub2RlLnR5cGUgPT09IFwiYW5vbnltb3VzX2NsYXNzXCIpWzBdXG4gICAgICAgICAgY29uc3QgY2xhc3NfYm9keSA9IGFub255bW91c19jbGFzcy5jaGlsZHJlblsxXTtcbiAgICAgICAgICBjb21tZW50LmNvbnRleHQuY2hpbGRyZW4gPSBDb21tZW50UGFyc2VyLnBhcnNlKFxuICAgICAgICAgICAgY2xhc3NfYm9keSxcbiAgICAgICAgICAgIGNvbW1lbnQuY29udGV4dC50ZXh0LFxuICAgICAgICAgICAgeyBsb2NhdGlvbjogY29tbWVudC5jb250ZXh0LmxvY2F0aW9uLCBwb3NpdGlvbjogY29tbWVudC5jb250ZXh0LnBvc2l0aW9uIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBjb21tZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUNoaWxkcmVuID0gKGNvbW1lbnQ6IElDb21tZW50KTogSUNvbW1lbnQgPT4ge1xuICAgIHN3aXRjaCAoY29tbWVudC5jb250ZXh0LnR5cGUpIHtcbiAgICAgIGNhc2UgJ2NsYXNzJzpcbiAgICAgICAgY29uc3QgdHJlZSA9IHRoaXMucGFyc2VyLnBhcnNlKGNvbW1lbnQuY29udGV4dC50ZXh0KTtcbiAgICAgICAgY29tbWVudC5jb250ZXh0LmNoaWxkcmVuID0gQ29tbWVudFBhcnNlci5wYXJzZShcbiAgICAgICAgICB0cmVlLnJvb3ROb2RlLFxuICAgICAgICAgIGNvbW1lbnQuY29udGV4dC50ZXh0LFxuICAgICAgICAgIHsgbG9jYXRpb246IGNvbW1lbnQuY29udGV4dC5sb2NhdGlvbiwgcG9zaXRpb246IGNvbW1lbnQuY29udGV4dC5wb3NpdGlvbiB9XG4gICAgICAgICkuZmlsdGVyKGNoaWxkID0+IGNoaWxkLmNvbnRleHQudHlwZSA9PT0gJ21ldGhvZF9kZWZpbml0aW9uJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBjb21tZW50O1xuICB9XG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy9qYXZhc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNDO0FBQ3RDLHFEQUFxRDtBQUdyRCxrREFBa0Q7QUFDbEQsb0RBQW9EO0FBRXBEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFxQixnQkFBZ0I7SUFJbkMsWUFBWSxJQUFXLEVBQUUsT0FBWTtRQU1yQyxVQUFLLEdBQUcsR0FBRyxFQUFFO1lBQ1gsZ0RBQWdEO1lBQ2hELDJCQUEyQjtZQUMzQiw2Q0FBNkM7WUFDN0MsaURBQWlEO1lBQ2pELDhDQUE4QztZQUM5QyxnRUFBZ0U7WUFFaEUsNkNBQTZDO1lBQzdDLG9EQUFvRDtZQUNwRCwrQ0FBK0M7WUFDL0MsNkRBQTZEO1lBQzdELGdCQUFnQjtZQUNoQiw0Q0FBNEM7WUFDNUMsMkNBQTJDO1lBQzNDLDJDQUEyQztZQUMzQyw0Q0FBNEM7WUFDNUMsNkNBQTZDO1lBQzdDLDZDQUE2QztZQUM3QyxRQUFRO1lBQ1Isd0NBQXdDO1lBQ3hDLElBQUk7WUFDSixXQUFXO1lBQ1gscUJBQXFCO1lBQ3JCLGlFQUFpRTtZQUNqRSwrQkFBK0I7WUFDL0IsOEJBQThCO1lBQzlCLCtCQUErQjtZQUMvQixJQUFJO1FBQ04sQ0FBQyxDQUFBO1FBbENDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN0QyxDQUFDO0NBZ0ZGO0FBekZELG1DQXlGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFBhcnNlciBmcm9tICd0cmVlLXNpdHRlcic7XHJcbmltcG9ydCAqIGFzIEphdmFTY3JpcHQgZnJvbSAndHJlZS1zaXR0ZXItamF2YXNjcmlwdCc7XHJcbmltcG9ydCBJUGFyc2VyIGZyb20gJy4uLy4uL2ludGVyZmFjZXMvSVBhcnNlcic7XHJcbmltcG9ydCBJRmlsZSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lGaWxlJztcclxuLy8gaW1wb3J0IElSZXN1bHQgZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9JUmVzdWx0JztcclxuLy8gaW1wb3J0IElDb21tZW50IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvSUNvbW1lbnQnO1xyXG5cclxuLyoqXHJcbiAqIEEgY2xhc3MgdGhhdCBwYXJzZXMgSmF2YVNjcmlwdCBjb21tZW50cy5cclxuICogXHJcbiAqICMgQVBJXHJcbiAqIFxyXG4gKiBgYGBcclxuICogQGNsYXNzIEphdmFTY3JpcHRQYXJzZXJcclxuICogQGltcGxlbWVudHMgSVBhcnNlclxyXG4gKiBAZXhwb3J0IGRlZmF1bHRcclxuICogYGBgXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBKYXZhU2NyaXB0UGFyc2VyIGltcGxlbWVudHMgSVBhcnNlciB7XHJcbiAgcHJpdmF0ZSBmaWxlOiBJRmlsZTtcclxuICBwcml2YXRlIG9wdGlvbnM6IGFueTtcclxuICBwcml2YXRlIHBhcnNlcjogUGFyc2VyO1xyXG4gIGNvbnN0cnVjdG9yKGZpbGU6IElGaWxlLCBvcHRpb25zOiBhbnkpIHtcclxuICAgIHRoaXMuZmlsZSA9IGZpbGU7XHJcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucyA9IHt9LCBvcHRpb25zIHx8IHt9KTtcclxuICAgIHRoaXMucGFyc2VyID0gbmV3IFBhcnNlcigpO1xyXG4gICAgdGhpcy5wYXJzZXIuc2V0TGFuZ3VhZ2UoSmF2YVNjcmlwdCk7XHJcbiAgfVxyXG4gIHBhcnNlID0gKCkgPT4ge1xyXG4gICAgLy8gbGV0IHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZSh0aGlzLmZpbGUudGV4dCk7XHJcbiAgICAvLyAvLyBHZXQgdGhlIGZpcnN0IGNvbW1lbnRcclxuICAgIC8vIGxldCBmaXJzdF9jb21tZW50ID0gdHJlZS5yb290Tm9kZS5jaGlsZHJlblxyXG4gICAgLy8gICAuZmlsdGVyKG5vZGUgPT4gbm9kZS50eXBlID09PSBcImNvbW1lbnRcIilbMF07XHJcbiAgICAvLyBjb25zdCBmaXJzdF9jb21tZW50X3N0cmluZyA9IHRoaXMuZmlsZS50ZXh0XHJcbiAgICAvLyAuc3Vic3RyaW5nKGZpcnN0X2NvbW1lbnQuc3RhcnRJbmRleCwgZmlyc3RfY29tbWVudC5lbmRJbmRleCk7XHJcbiAgICBcclxuICAgIC8vIC8vIFJlbW92ZSBhbnkgbGVnYWwgb3IgdW5uY2Vzc2FyeSBjb21tZW50c1xyXG4gICAgLy8gaWYgKGZpcnN0X2NvbW1lbnRfc3RyaW5nLmluY2x1ZGVzKFwiY29weXJpZ2h0XCIpIHx8XHJcbiAgICAvLyAgIGZpcnN0X2NvbW1lbnRfc3RyaW5nLmluY2x1ZGVzKFwiYXV0aG9yXCIpIHx8XHJcbiAgICAvLyAgIGZpcnN0X2NvbW1lbnRfc3RyaW5nLmluY2x1ZGVzKFwidGVybXMgYW5kIGNvbmRpdGlvbnNcIikpIHtcclxuICAgIC8vICAgdHJlZS5lZGl0KHtcclxuICAgIC8vICAgICBzdGFydEluZGV4OiBmaXJzdF9jb21tZW50LnN0YXJ0SW5kZXgsXHJcbiAgICAvLyAgICAgb2xkRW5kSW5kZXg6IGZpcnN0X2NvbW1lbnQuZW5kSW5kZXgsXHJcbiAgICAvLyAgICAgbmV3RW5kSW5kZXg6IGZpcnN0X2NvbW1lbnQuZW5kSW5kZXgsXHJcbiAgICAvLyAgICAgc3RhcnRQb3NpdGlvbjogeyByb3c6IDAsIGNvbHVtbjogMCB9LFxyXG4gICAgLy8gICAgIG9sZEVuZFBvc2l0aW9uOiB7IHJvdzogMCwgY29sdW1uOiAwIH0sXHJcbiAgICAvLyAgICAgbmV3RW5kUG9zaXRpb246IHsgcm93OiAwLCBjb2x1bW46IDAgfSxcclxuICAgIC8vICAgfSk7XHJcbiAgICAvLyAgIHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZSgnJywgdHJlZSk7XHJcbiAgICAvLyB9XHJcbiAgICAvLyByZXR1cm4ge1xyXG4gICAgLy8gICBmaWxlOiB0aGlzLmZpbGUsXHJcbiAgICAvLyAgIGNvbW1lbnRzOiBDb21tZW50UGFyc2VyLnBhcnNlKHRyZWUucm9vdE5vZGUsIHRoaXMuZmlsZS50ZXh0KVxyXG4gICAgLy8gICAgIC5maWx0ZXIodGhpcy5maWx0ZXJUeXBlKVxyXG4gICAgLy8gICAgIC8vIC5tYXAodGhpcy5jaGVja1R5cGUpXHJcbiAgICAvLyAgICAgLm1hcCh0aGlzLnBhcnNlQ2hpbGRyZW4pXHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICAvLyBwcml2YXRlIGZpbHRlclR5cGUgPSAoY29tbWVudCk6IGJvb2xlYW4gPT4ge1xyXG4gIC8vICAgcmV0dXJuICh0aGlzLm9wdGlvbnMuZmlsdGVyIHx8XHJcbiAgLy8gICAgIFtcclxuICAvLyAgICAgICAnZnVuY3Rpb24nLFxyXG4gIC8vICAgICAgICdjbGFzcycsXHJcbiAgLy8gICAgICAgJ3ZhcmlhYmxlX2RlY2xhcmF0aW9uJ1xyXG4gIC8vICAgICBdKS5pbmNsdWRlcyhjb21tZW50LmNvbnRleHQudHlwZSlcclxuICAvLyB9XHJcblxyXG4gIC8vIHByaXZhdGUgY2hlY2tUeXBlID0gKGNvbW1lbnQpID0+IHtcclxuICAvLyAgIGNvbnN0IHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZShjb21tZW50LmNvbnRleHQudGV4dCk7XHJcbiAgLy8gICBzd2l0Y2ggKGNvbW1lbnQuY29udGV4dC50eXBlKSB7XHJcbiAgLy8gICAgIGNhc2UgJ3ZhcmlhYmxlX2RlY2xhcmF0aW9uJzpcclxuICAvLyAgICAgICAvLyBDaGVjayB3aGV0aGVyIHdlIGhhdmUgYW4gYW5vbnltb3VzIGNsYXNzXHJcbiAgLy8gICAgICAgaWYgKGNvbW1lbnQuY29udGV4dC50ZXh0LmluY2x1ZGVzKFwiY2xhc3NcIikpIHtcclxuICAvLyAgICAgICAgIC8vIERyaWxsIGRvd24gdW50aWwgd2UgZmluZCB0aGUgY2xhc3MgYm9keVxyXG4gIC8vICAgICAgICAgY29uc3QgdmFyaWFibGVfZGVjbGFyYXRvciA9IHRyZWUucm9vdE5vZGUuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMV07XHJcbiAgLy8gICAgICAgICBjb25zdCBhbm9ueW1vdXNfY2xhc3MgPSB2YXJpYWJsZV9kZWNsYXJhdG9yLmNoaWxkcmVuXHJcbiAgLy8gICAgICAgICAgIC5maWx0ZXIobm9kZSA9PiBub2RlLnR5cGUgPT09IFwiYW5vbnltb3VzX2NsYXNzXCIpWzBdXHJcbiAgLy8gICAgICAgICBjb25zdCBjbGFzc19ib2R5ID0gYW5vbnltb3VzX2NsYXNzLmNoaWxkcmVuWzFdO1xyXG4gIC8vICAgICAgICAgY29tbWVudC5jb250ZXh0LmNoaWxkcmVuID0gQ29tbWVudFBhcnNlci5wYXJzZShcclxuICAvLyAgICAgICAgICAgY2xhc3NfYm9keSxcclxuICAvLyAgICAgICAgICAgY29tbWVudC5jb250ZXh0LnRleHQsXHJcbiAgLy8gICAgICAgICAgIHsgbG9jYXRpb246IGNvbW1lbnQuY29udGV4dC5sb2NhdGlvbiwgcG9zaXRpb246IGNvbW1lbnQuY29udGV4dC5wb3NpdGlvbiB9XHJcbiAgLy8gICAgICAgICApO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgZGVmYXVsdDpcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgIH1cclxuICAvLyAgIHJldHVybiBjb21tZW50O1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gcHJpdmF0ZSBwYXJzZUNoaWxkcmVuID0gKGNvbW1lbnQpID0+IHtcclxuICAvLyAgIHN3aXRjaCAoY29tbWVudC5jb250ZXh0LnR5cGUpIHtcclxuICAvLyAgICAgY2FzZSAnY2xhc3MnOlxyXG4gIC8vICAgICAgIGNvbnN0IHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZShjb21tZW50LmNvbnRleHQudGV4dCk7XHJcbiAgLy8gICAgICAgY29tbWVudC5jb250ZXh0LmNoaWxkcmVuID0gQ29tbWVudFBhcnNlci5wYXJzZShcclxuICAvLyAgICAgICAgIHRyZWUucm9vdE5vZGUsXHJcbiAgLy8gICAgICAgICBjb21tZW50LmNvbnRleHQudGV4dCxcclxuICAvLyAgICAgICAgIHsgbG9jYXRpb246IGNvbW1lbnQuY29udGV4dC5sb2NhdGlvbiwgcG9zaXRpb246IGNvbW1lbnQuY29udGV4dC5wb3NpdGlvbiB9XHJcbiAgLy8gICAgICAgKS5maWx0ZXIoY2hpbGQgPT4gY2hpbGQuY29udGV4dC50eXBlID09PSAnbWV0aG9kX2RlZmluaXRpb24nKTtcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgZGVmYXVsdDpcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgIH1cclxuICAvLyAgIHJldHVybiBjb21tZW50O1xyXG4gIC8vIH1cclxufSJdfQ== \ No newline at end of file diff --git a/build/src/lang/typescript/Node.d.ts b/build/src/lang/typescript/Node.d.ts new file mode 100644 index 0000000..d04ca42 --- /dev/null +++ b/build/src/lang/typescript/Node.d.ts @@ -0,0 +1,26 @@ +import TextRange from "../../interfaces/TextRange"; +import { SyntaxNode } from "tree-sitter"; +import { DocumentationNode } from 'xdoc-parser/src/XDocASTNode'; +import { RemarkNode } from 'xdoc-parser/src/XDocParser'; +import IFile from "../../interfaces/IFile"; +export interface Node extends TextRange { + text: string; + properties?: Partial; + xdoc?: { + markdown: RemarkNode; + documentation: Partial; + }; +} +export declare function createNode(file: IFile, node: SyntaxNode, properties?: Partial, document?: boolean): Node; +export interface NodeProperties { + exports: Partial; + inheritance: Partial; +} +export interface NodeExports { + export: boolean; + default: boolean; +} +export interface NodeInheritance { + extends: boolean; + implements: boolean; +} diff --git a/build/src/lang/typescript/Node.js b/build/src/lang/typescript/Node.js new file mode 100644 index 0000000..a134a03 --- /dev/null +++ b/build/src/lang/typescript/Node.js @@ -0,0 +1,16 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const range_1 = require("../../utils/range"); +const xdoc_parser_1 = require("xdoc-parser"); +function createNode(file, node, properties, document) { + let node_ = Object.assign({}, range_1.default(node), { text: file.text.substring(node.startIndex, node.endIndex) }); + if (properties) { + node_ = Object.assign(node_, { properties }); + } + if (document) { + node_ = Object.assign(node_, { xdoc: xdoc_parser_1.default(node_.text).parse() }); + } + return node_; +} +exports.createNode = createNode; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvTm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLDZDQUFzQztBQUN0Qyw2Q0FBK0I7QUFlL0IsU0FBZ0IsVUFBVSxDQUN4QixJQUFXLEVBQ1gsSUFBZ0IsRUFDaEIsVUFBb0MsRUFDcEMsUUFBa0I7SUFHbEIsSUFBSSxLQUFLLHFCQUFRLGVBQUssQ0FBQyxJQUFJLENBQUMsSUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUUsQ0FBQTtJQUV6RixJQUFJLFVBQVUsRUFBRTtRQUNkLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUE7S0FDN0M7SUFFRCxJQUFJLFFBQVEsRUFBRTtRQUNaLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxxQkFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7S0FDakU7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFqQkQsZ0NBaUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRleHRSYW5nZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9UZXh0UmFuZ2VcIjtcclxuaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5pbXBvcnQgcmFuZ2UgZnJvbSBcIi4uLy4uL3V0aWxzL3JhbmdlXCI7XHJcbmltcG9ydCB4ZG9jIGZyb20gJ3hkb2MtcGFyc2VyJztcclxuaW1wb3J0IHsgRG9jdW1lbnRhdGlvbk5vZGUgfSBmcm9tICd4ZG9jLXBhcnNlci9zcmMvWERvY0FTVE5vZGUnO1xyXG5pbXBvcnQgeyBSZW1hcmtOb2RlIH0gZnJvbSAneGRvYy1wYXJzZXIvc3JjL1hEb2NQYXJzZXInO1xyXG5pbXBvcnQgSUZpbGUgZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvSUZpbGVcIjtcclxuXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE5vZGUgZXh0ZW5kcyBUZXh0UmFuZ2Uge1xyXG4gIHRleHQ6IHN0cmluZyxcclxuICBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz5cclxuICB4ZG9jPzoge1xyXG4gICAgbWFya2Rvd246IFJlbWFya05vZGUsXHJcbiAgICBkb2N1bWVudGF0aW9uOiBQYXJ0aWFsPERvY3VtZW50YXRpb25Ob2RlPlxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU5vZGUoXHJcbiAgZmlsZTogSUZpbGUsIFxyXG4gIG5vZGU6IFN5bnRheE5vZGUsIFxyXG4gIHByb3BlcnRpZXM/OiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPixcclxuICBkb2N1bWVudD86IGJvb2xlYW4sXHJcbik6IE5vZGUge1xyXG5cclxuICBsZXQgbm9kZV8gPSB7IC4uLnJhbmdlKG5vZGUpLCB0ZXh0OiBmaWxlLnRleHQuc3Vic3RyaW5nKG5vZGUuc3RhcnRJbmRleCwgbm9kZS5lbmRJbmRleCkgfVxyXG5cclxuICBpZiAocHJvcGVydGllcykge1xyXG4gICAgbm9kZV8gPSBPYmplY3QuYXNzaWduKG5vZGVfLCB7IHByb3BlcnRpZXMgfSlcclxuICB9XHJcbiAgXHJcbiAgaWYgKGRvY3VtZW50KSB7XHJcbiAgICBub2RlXyA9IE9iamVjdC5hc3NpZ24obm9kZV8sIHsgeGRvYzogeGRvYyhub2RlXy50ZXh0KS5wYXJzZSgpIH0pXHJcbiAgfVxyXG4gIHJldHVybiBub2RlXztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBOb2RlUHJvcGVydGllcyB7XHJcbiAgZXhwb3J0czogUGFydGlhbDxOb2RlRXhwb3J0cz5cclxuICBpbmhlcml0YW5jZTogUGFydGlhbDxOb2RlSW5oZXJpdGFuY2U+XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTm9kZUV4cG9ydHMge1xyXG4gIGV4cG9ydDogYm9vbGVhbixcclxuICBkZWZhdWx0OiBib29sZWFuXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTm9kZUluaGVyaXRhbmNlIHtcclxuICBleHRlbmRzOiBib29sZWFuLFxyXG4gIGltcGxlbWVudHM6IGJvb2xlYW5cclxufSJdfQ== \ No newline at end of file diff --git a/build/src/lang/typescript/index.d.ts b/build/src/lang/typescript/index.d.ts index 57938ad..c13b5a6 100644 --- a/build/src/lang/typescript/index.d.ts +++ b/build/src/lang/typescript/index.d.ts @@ -1,6 +1,5 @@ import IParser from '../../interfaces/IParser'; import IFile from '../../interfaces/IFile'; -import IResult from '../../interfaces/IResult'; /** * A class that parses JavaScript comments. * @@ -17,7 +16,5 @@ export default class TypeScriptParser implements IParser { private options; private parser; constructor(file: IFile, options: any); - parse: () => IResult; - private filterType; - private parseChildren; + parse: () => any[]; } diff --git a/build/src/lang/typescript/index.js b/build/src/lang/typescript/index.js index c1e3b1f..18fed5f 100644 --- a/build/src/lang/typescript/index.js +++ b/build/src/lang/typescript/index.js @@ -1,8 +1,8 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const Parser = require("tree-sitter"); -const TypeScript = require("tree-sitter-javascript"); -const CommentParser_1 = require("../../CommentParser"); +const TypeScript = require("tree-sitter-typescript"); +const program_visitor_1 = require("./visitors/program.visitor"); /** * A class that parses JavaScript comments. * @@ -17,51 +17,10 @@ const CommentParser_1 = require("../../CommentParser"); class TypeScriptParser { constructor(file, options) { this.parse = () => { - let tree = this.parser.parse(this.file.text); - // Get the first comment - let first_comment = tree.rootNode.children - .filter(node => node.type === "comment")[0]; - const first_comment_string = this.file.text - .substring(first_comment.startIndex, first_comment.endIndex); - // Remove any legal or unncessary comments - if (first_comment_string.includes("copyright") || - first_comment_string.includes("author") || - first_comment_string.includes("terms and conditions")) { - tree.edit({ - startIndex: first_comment.startIndex, - oldEndIndex: first_comment.endIndex, - newEndIndex: first_comment.endIndex, - startPosition: { row: 0, column: 0 }, - oldEndPosition: { row: 0, column: 0 }, - newEndPosition: { row: 0, column: 0 }, - }); - tree = this.parser.parse('', tree); + const tree = this.parser.parse(this.file.text); + if (tree.rootNode.type === "program") { + return program_visitor_1.visitProgram(this.file, tree.rootNode); } - return { - file: this.file, - comments: CommentParser_1.default.parse(tree.rootNode, this.file.text) - .filter(this.filterType) - .map(this.parseChildren) - }; - }; - this.filterType = (comment) => { - return (this.options.filter || - [ - 'function', - 'class', - 'variable_declaration' - ]).includes(comment.context.type); - }; - this.parseChildren = (comment) => { - switch (comment.context.type) { - case 'class': - const tree = this.parser.parse(comment.context.text); - comment.context.children = CommentParser_1.default.parse(tree.rootNode, comment.context.text, { location: comment.context.location, position: comment.context.position }).filter(child => child.context.type === 'method_definition'); - break; - default: - break; - } - return comment; }; this.file = file; Object.assign(this.options = {}, options || {}); @@ -70,4 +29,4 @@ class TypeScriptParser { } } exports.default = TypeScriptParser; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy90eXBlc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNDO0FBQ3RDLHFEQUFxRDtBQUlyRCx1REFBZ0Q7QUFHaEQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQXFCLGdCQUFnQjtJQUluQyxZQUFZLElBQVcsRUFBRSxPQUFZO1FBTXJDLFVBQUssR0FBRyxHQUFZLEVBQUU7WUFDcEIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3Qyx3QkFBd0I7WUFDeEIsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRO2lCQUN2QyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO2lCQUMxQyxTQUFTLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFN0QsMENBQTBDO1lBQzFDLElBQUksb0JBQW9CLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztnQkFDNUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztnQkFDdkMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDLEVBQUU7Z0JBQ3ZELElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQ1IsVUFBVSxFQUFFLGFBQWEsQ0FBQyxVQUFVO29CQUNwQyxXQUFXLEVBQUUsYUFBYSxDQUFDLFFBQVE7b0JBQ25DLFdBQVcsRUFBRSxhQUFhLENBQUMsUUFBUTtvQkFDbkMsYUFBYSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFO29CQUNwQyxjQUFjLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUU7b0JBQ3JDLGNBQWMsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRTtpQkFDdEMsQ0FBQyxDQUFDO2dCQUNILElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDcEM7WUFDRCxPQUFPO2dCQUNMLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtnQkFDZixRQUFRLEVBQUUsdUJBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztxQkFDekQsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7cUJBQ3ZCLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO2FBQzNCLENBQUE7UUFDSCxDQUFDLENBQUE7UUFFTyxlQUFVLEdBQUcsQ0FBQyxPQUFpQixFQUFXLEVBQUU7WUFDbEQsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTTtnQkFDekI7b0JBQ0UsVUFBVTtvQkFDVixPQUFPO29CQUNQLHNCQUFzQjtpQkFDdkIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3JDLENBQUMsQ0FBQTtRQUVPLGtCQUFhLEdBQUcsQ0FBQyxPQUFpQixFQUFZLEVBQUU7WUFDdEQsUUFBUSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRTtnQkFDNUIsS0FBSyxPQUFPO29CQUNWLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3JELE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxHQUFHLHVCQUFhLENBQUMsS0FBSyxDQUM1QyxJQUFJLENBQUMsUUFBUSxFQUNiLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUNwQixFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FDM0UsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxDQUFDO29CQUM5RCxNQUFNO2dCQUNSO29CQUNFLE1BQU07YUFDVDtZQUNELE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUMsQ0FBQTtRQTFEQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdEMsQ0FBQztDQXVERjtBQWhFRCxtQ0FnRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBQYXJzZXIgZnJvbSAndHJlZS1zaXR0ZXInO1xuaW1wb3J0ICogYXMgVHlwZVNjcmlwdCBmcm9tICd0cmVlLXNpdHRlci1qYXZhc2NyaXB0JztcbmltcG9ydCBJUGFyc2VyIGZyb20gJy4uLy4uL2ludGVyZmFjZXMvSVBhcnNlcic7XG5pbXBvcnQgSUZpbGUgZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9JRmlsZSc7XG5pbXBvcnQgSVJlc3VsdCBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lSZXN1bHQnO1xuaW1wb3J0IENvbW1lbnRQYXJzZXIgZnJvbSAnLi4vLi4vQ29tbWVudFBhcnNlcic7XG5pbXBvcnQgSUNvbW1lbnQgZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9JQ29tbWVudCc7XG5cbi8qKlxuICogQSBjbGFzcyB0aGF0IHBhcnNlcyBKYXZhU2NyaXB0IGNvbW1lbnRzLlxuICogXG4gKiAjIEFQSVxuICogXG4gKiBgYGBcbiAqIEBjbGFzcyBKYXZhU2NyaXB0UGFyc2VyXG4gKiBAaW1wbGVtZW50cyBJUGFyc2VyXG4gKiBAZXhwb3J0IGRlZmF1bHRcbiAqIGBgYFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUeXBlU2NyaXB0UGFyc2VyIGltcGxlbWVudHMgSVBhcnNlciB7XG4gIHByaXZhdGUgZmlsZTogSUZpbGU7XG4gIHByaXZhdGUgb3B0aW9uczogYW55O1xuICBwcml2YXRlIHBhcnNlcjogUGFyc2VyO1xuICBjb25zdHJ1Y3RvcihmaWxlOiBJRmlsZSwgb3B0aW9uczogYW55KSB7XG4gICAgdGhpcy5maWxlID0gZmlsZTtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucyA9IHt9LCBvcHRpb25zIHx8IHt9KTtcbiAgICB0aGlzLnBhcnNlciA9IG5ldyBQYXJzZXIoKTtcbiAgICB0aGlzLnBhcnNlci5zZXRMYW5ndWFnZShUeXBlU2NyaXB0KTtcbiAgfVxuICBwYXJzZSA9ICgpOiBJUmVzdWx0ID0+IHtcbiAgICBsZXQgdHJlZSA9IHRoaXMucGFyc2VyLnBhcnNlKHRoaXMuZmlsZS50ZXh0KTtcbiAgICAvLyBHZXQgdGhlIGZpcnN0IGNvbW1lbnRcbiAgICBsZXQgZmlyc3RfY29tbWVudCA9IHRyZWUucm9vdE5vZGUuY2hpbGRyZW5cbiAgICAgIC5maWx0ZXIobm9kZSA9PiBub2RlLnR5cGUgPT09IFwiY29tbWVudFwiKVswXTtcbiAgICBjb25zdCBmaXJzdF9jb21tZW50X3N0cmluZyA9IHRoaXMuZmlsZS50ZXh0XG4gICAgLnN1YnN0cmluZyhmaXJzdF9jb21tZW50LnN0YXJ0SW5kZXgsIGZpcnN0X2NvbW1lbnQuZW5kSW5kZXgpO1xuICAgIFxuICAgIC8vIFJlbW92ZSBhbnkgbGVnYWwgb3IgdW5uY2Vzc2FyeSBjb21tZW50c1xuICAgIGlmIChmaXJzdF9jb21tZW50X3N0cmluZy5pbmNsdWRlcyhcImNvcHlyaWdodFwiKSB8fFxuICAgICAgZmlyc3RfY29tbWVudF9zdHJpbmcuaW5jbHVkZXMoXCJhdXRob3JcIikgfHxcbiAgICAgIGZpcnN0X2NvbW1lbnRfc3RyaW5nLmluY2x1ZGVzKFwidGVybXMgYW5kIGNvbmRpdGlvbnNcIikpIHtcbiAgICAgIHRyZWUuZWRpdCh7XG4gICAgICAgIHN0YXJ0SW5kZXg6IGZpcnN0X2NvbW1lbnQuc3RhcnRJbmRleCxcbiAgICAgICAgb2xkRW5kSW5kZXg6IGZpcnN0X2NvbW1lbnQuZW5kSW5kZXgsXG4gICAgICAgIG5ld0VuZEluZGV4OiBmaXJzdF9jb21tZW50LmVuZEluZGV4LFxuICAgICAgICBzdGFydFBvc2l0aW9uOiB7IHJvdzogMCwgY29sdW1uOiAwIH0sXG4gICAgICAgIG9sZEVuZFBvc2l0aW9uOiB7IHJvdzogMCwgY29sdW1uOiAwIH0sXG4gICAgICAgIG5ld0VuZFBvc2l0aW9uOiB7IHJvdzogMCwgY29sdW1uOiAwIH0sXG4gICAgICB9KTtcbiAgICAgIHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZSgnJywgdHJlZSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBmaWxlOiB0aGlzLmZpbGUsXG4gICAgICBjb21tZW50czogQ29tbWVudFBhcnNlci5wYXJzZSh0cmVlLnJvb3ROb2RlLCB0aGlzLmZpbGUudGV4dClcbiAgICAgICAgLmZpbHRlcih0aGlzLmZpbHRlclR5cGUpXG4gICAgICAgIC5tYXAodGhpcy5wYXJzZUNoaWxkcmVuKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmlsdGVyVHlwZSA9IChjb21tZW50OiBJQ29tbWVudCk6IGJvb2xlYW4gPT4ge1xuICAgIHJldHVybiAodGhpcy5vcHRpb25zLmZpbHRlciB8fFxuICAgICAgW1xuICAgICAgICAnZnVuY3Rpb24nLFxuICAgICAgICAnY2xhc3MnLFxuICAgICAgICAndmFyaWFibGVfZGVjbGFyYXRpb24nXG4gICAgICBdKS5pbmNsdWRlcyhjb21tZW50LmNvbnRleHQudHlwZSlcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VDaGlsZHJlbiA9IChjb21tZW50OiBJQ29tbWVudCk6IElDb21tZW50ID0+IHtcbiAgICBzd2l0Y2ggKGNvbW1lbnQuY29udGV4dC50eXBlKSB7XG4gICAgICBjYXNlICdjbGFzcyc6XG4gICAgICAgIGNvbnN0IHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZShjb21tZW50LmNvbnRleHQudGV4dCk7XG4gICAgICAgIGNvbW1lbnQuY29udGV4dC5jaGlsZHJlbiA9IENvbW1lbnRQYXJzZXIucGFyc2UoXG4gICAgICAgICAgdHJlZS5yb290Tm9kZSxcbiAgICAgICAgICBjb21tZW50LmNvbnRleHQudGV4dCxcbiAgICAgICAgICB7IGxvY2F0aW9uOiBjb21tZW50LmNvbnRleHQubG9jYXRpb24sIHBvc2l0aW9uOiBjb21tZW50LmNvbnRleHQucG9zaXRpb24gfVxuICAgICAgICApLmZpbHRlcihjaGlsZCA9PiBjaGlsZC5jb250ZXh0LnR5cGUgPT09ICdtZXRob2RfZGVmaW5pdGlvbicpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gY29tbWVudDtcbiAgfVxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy90eXBlc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNDO0FBQ3RDLHFEQUFxRDtBQUdyRCxnRUFBMEQ7QUFHMUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQXFCLGdCQUFnQjtJQUluQyxZQUFZLElBQVcsRUFBRSxPQUFZO1FBTXJDLFVBQUssR0FBRyxHQUFHLEVBQUU7WUFDWCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9DLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO2dCQUNwQyxPQUFPLDhCQUFZLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7YUFDOUM7UUFDSCxDQUFDLENBQUE7UUFWQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdEMsQ0FBQztDQU9GO0FBaEJELG1DQWdCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFBhcnNlciBmcm9tICd0cmVlLXNpdHRlcic7XHJcbmltcG9ydCAqIGFzIFR5cGVTY3JpcHQgZnJvbSAndHJlZS1zaXR0ZXItdHlwZXNjcmlwdCc7XHJcbmltcG9ydCBJUGFyc2VyIGZyb20gJy4uLy4uL2ludGVyZmFjZXMvSVBhcnNlcic7XHJcbmltcG9ydCBJRmlsZSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lGaWxlJztcclxuaW1wb3J0IHsgdmlzaXRQcm9ncmFtIH0gZnJvbSAnLi92aXNpdG9ycy9wcm9ncmFtLnZpc2l0b3InO1xyXG5cclxuXHJcbi8qKlxyXG4gKiBBIGNsYXNzIHRoYXQgcGFyc2VzIEphdmFTY3JpcHQgY29tbWVudHMuXHJcbiAqIFxyXG4gKiAjIEFQSVxyXG4gKiBcclxuICogYGBgXHJcbiAqIEBjbGFzcyBKYXZhU2NyaXB0UGFyc2VyXHJcbiAqIEBpbXBsZW1lbnRzIElQYXJzZXJcclxuICogQGV4cG9ydCBkZWZhdWx0XHJcbiAqIGBgYFxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVHlwZVNjcmlwdFBhcnNlciBpbXBsZW1lbnRzIElQYXJzZXIge1xyXG4gIHByaXZhdGUgZmlsZTogSUZpbGU7XHJcbiAgcHJpdmF0ZSBvcHRpb25zOiBhbnk7XHJcbiAgcHJpdmF0ZSBwYXJzZXI6IFBhcnNlcjtcclxuICBjb25zdHJ1Y3RvcihmaWxlOiBJRmlsZSwgb3B0aW9uczogYW55KSB7XHJcbiAgICB0aGlzLmZpbGUgPSBmaWxlO1xyXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdGlvbnMgPSB7fSwgb3B0aW9ucyB8fCB7fSk7XHJcbiAgICB0aGlzLnBhcnNlciA9IG5ldyBQYXJzZXIoKTtcclxuICAgIHRoaXMucGFyc2VyLnNldExhbmd1YWdlKFR5cGVTY3JpcHQpO1xyXG4gIH1cclxuICBwYXJzZSA9ICgpID0+IHtcclxuICAgIGNvbnN0IHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZSh0aGlzLmZpbGUudGV4dCk7XHJcbiAgICBpZiAodHJlZS5yb290Tm9kZS50eXBlID09PSBcInByb2dyYW1cIikge1xyXG4gICAgICByZXR1cm4gdmlzaXRQcm9ncmFtKHRoaXMuZmlsZSwgdHJlZS5yb290Tm9kZSlcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19 \ No newline at end of file diff --git a/build/src/lang/typescript/public_field_definition.visitor.d.ts b/build/src/lang/typescript/public_field_definition.visitor.d.ts new file mode 100644 index 0000000..ab5bf40 --- /dev/null +++ b/build/src/lang/typescript/public_field_definition.visitor.d.ts @@ -0,0 +1,10 @@ +import { SyntaxNode } from "tree-sitter"; +import IFile from "../../interfaces/IFile"; +export declare function visitPublicFieldDefinition(source: IFile, node: SyntaxNode, comment: SyntaxNode): { + type: string; + context: import("./Node").Node; + comment: import("./Node").Node; + identifier: any; + accessibility: string; + type_annotation: any; +}; diff --git a/build/src/lang/typescript/public_field_definition.visitor.js b/build/src/lang/typescript/public_field_definition.visitor.js new file mode 100644 index 0000000..4ace70a --- /dev/null +++ b/build/src/lang/typescript/public_field_definition.visitor.js @@ -0,0 +1,30 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const match_1 = require("../../utils/match"); +const text_1 = require("../../utils/text"); +const type_visitor_1 = require("./visitors/type.visitor"); +const Node_1 = require("./Node"); +function visitPublicFieldDefinition(source, node, comment) { + let public_field_definition = node.children; + let accessibility = 'public', identifier, type_annotation; + if (match_1.default(public_field_definition[0], 'accessibility_modifier')) { + accessibility = text_1.text(source, public_field_definition.shift()); + } + if (match_1.default(public_field_definition[0], 'property_identifier')) { + identifier = Node_1.createNode(source, public_field_definition.shift()); + } + if (match_1.default(public_field_definition[0], 'type_annotation')) { + let type = public_field_definition.shift().children[1]; + type_annotation = type_visitor_1.visitType(source, type); + } + return { + type: 'property', + context: Node_1.createNode(source, node), + comment: Node_1.createNode(source, comment, null, true), + identifier, + accessibility, + type_annotation + }; +} +exports.visitPublicFieldDefinition = visitPublicFieldDefinition; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2ZpZWxkX2RlZmluaXRpb24udmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvcHVibGljX2ZpZWxkX2RlZmluaXRpb24udmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLDZDQUFzQztBQUN0QywyQ0FBd0M7QUFDeEMsMERBQW9EO0FBQ3BELGlDQUFvQztBQUdwQyxTQUFnQiwwQkFBMEIsQ0FBQyxNQUFhLEVBQUUsSUFBZ0IsRUFBRSxPQUFtQjtJQUM3RixJQUFJLHVCQUF1QixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDNUMsSUFBSSxhQUFhLEdBQUcsUUFBUSxFQUMxQixVQUFVLEVBQ1YsZUFBZSxDQUFDO0lBRWxCLElBQUksZUFBSyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxFQUFFLHdCQUF3QixDQUFDLEVBQUU7UUFDL0QsYUFBYSxHQUFHLFdBQUksQ0FBQyxNQUFNLEVBQUUsdUJBQXVCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUMvRDtJQUVELElBQUksZUFBSyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxFQUFFLHFCQUFxQixDQUFDLEVBQUU7UUFDNUQsVUFBVSxHQUFHLGlCQUFVLENBQUMsTUFBTSxFQUFFLHVCQUF1QixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDbEU7SUFFRCxJQUFJLGVBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFO1FBQ3hELElBQUksSUFBSSxHQUFHLHVCQUF1QixDQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RCxlQUFlLEdBQUcsd0JBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDM0M7SUFDRCxPQUFPO1FBQ0wsSUFBSSxFQUFFLFVBQVU7UUFDaEIsT0FBTyxFQUFFLGlCQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztRQUNqQyxPQUFPLEVBQUUsaUJBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7UUFDaEQsVUFBVTtRQUNWLGFBQWE7UUFDYixlQUFlO0tBQ2hCLENBQUE7QUFDSCxDQUFDO0FBMUJELGdFQTBCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcclxuaW1wb3J0IG1hdGNoIGZyb20gXCIuLi8uLi91dGlscy9tYXRjaFwiO1xyXG5pbXBvcnQgeyB0ZXh0IH0gZnJvbSBcIi4uLy4uL3V0aWxzL3RleHRcIjtcclxuaW1wb3J0IHsgdmlzaXRUeXBlIH0gZnJvbSBcIi4vdmlzaXRvcnMvdHlwZS52aXNpdG9yXCI7XHJcbmltcG9ydCB7IGNyZWF0ZU5vZGUgfSBmcm9tIFwiLi9Ob2RlXCI7XHJcbmltcG9ydCBJRmlsZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9JRmlsZVwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHZpc2l0UHVibGljRmllbGREZWZpbml0aW9uKHNvdXJjZTogSUZpbGUsIG5vZGU6IFN5bnRheE5vZGUsIGNvbW1lbnQ6IFN5bnRheE5vZGUpIHtcclxuICBsZXQgcHVibGljX2ZpZWxkX2RlZmluaXRpb24gPSBub2RlLmNoaWxkcmVuO1xyXG4gIGxldCBhY2Nlc3NpYmlsaXR5ID0gJ3B1YmxpYycsXHJcbiAgICBpZGVudGlmaWVyLFxyXG4gICAgdHlwZV9hbm5vdGF0aW9uO1xyXG5cclxuICBpZiAobWF0Y2gocHVibGljX2ZpZWxkX2RlZmluaXRpb25bMF0sICdhY2Nlc3NpYmlsaXR5X21vZGlmaWVyJykpIHtcclxuICAgIGFjY2Vzc2liaWxpdHkgPSB0ZXh0KHNvdXJjZSwgcHVibGljX2ZpZWxkX2RlZmluaXRpb24uc2hpZnQoKSk7XHJcbiAgfVxyXG5cclxuICBpZiAobWF0Y2gocHVibGljX2ZpZWxkX2RlZmluaXRpb25bMF0sICdwcm9wZXJ0eV9pZGVudGlmaWVyJykpIHtcclxuICAgIGlkZW50aWZpZXIgPSBjcmVhdGVOb2RlKHNvdXJjZSwgcHVibGljX2ZpZWxkX2RlZmluaXRpb24uc2hpZnQoKSk7XHJcbiAgfVxyXG5cclxuICBpZiAobWF0Y2gocHVibGljX2ZpZWxkX2RlZmluaXRpb25bMF0sICd0eXBlX2Fubm90YXRpb24nKSkge1xyXG4gICAgbGV0IHR5cGUgPSBwdWJsaWNfZmllbGRfZGVmaW5pdGlvbi5zaGlmdCgpLmNoaWxkcmVuWzFdO1xyXG4gICAgdHlwZV9hbm5vdGF0aW9uID0gdmlzaXRUeXBlKHNvdXJjZSwgdHlwZSk7XHJcbiAgfVxyXG4gIHJldHVybiB7XHJcbiAgICB0eXBlOiAncHJvcGVydHknLFxyXG4gICAgY29udGV4dDogY3JlYXRlTm9kZShzb3VyY2UsIG5vZGUpLFxyXG4gICAgY29tbWVudDogY3JlYXRlTm9kZShzb3VyY2UsIGNvbW1lbnQsIG51bGwsIHRydWUpLFxyXG4gICAgaWRlbnRpZmllcixcclxuICAgIGFjY2Vzc2liaWxpdHksXHJcbiAgICB0eXBlX2Fubm90YXRpb25cclxuICB9XHJcbn0iXX0= \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/call_signature.visitor.d.ts b/build/src/lang/typescript/visitors/call_signature.visitor.d.ts new file mode 100644 index 0000000..7a69a90 --- /dev/null +++ b/build/src/lang/typescript/visitors/call_signature.visitor.d.ts @@ -0,0 +1,7 @@ +import { SyntaxNode } from "tree-sitter"; +import IFile from "../../../interfaces/IFile"; +export declare function visitCallSignature(source: IFile, node: SyntaxNode): { + type_parameters: any; + formal_parameters: any; + type_annotation: any; +}; diff --git a/build/src/lang/typescript/visitors/call_signature.visitor.js b/build/src/lang/typescript/visitors/call_signature.visitor.js new file mode 100644 index 0000000..faecbf0 --- /dev/null +++ b/build/src/lang/typescript/visitors/call_signature.visitor.js @@ -0,0 +1,22 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const match_1 = require("../../../utils/match"); +const type_parameters_visitor_1 = require("./type_parameters.visitor"); +const formal_parameters_visitor_1 = require("./formal_parameters.visitor"); +const type_visitor_1 = require("./type.visitor"); +function visitCallSignature(source, node) { + let call_signature = node.children, type_parameters, formal_parameters, type_annotation; + if (match_1.default(call_signature[0], 'type_parameters')) { + type_parameters = type_parameters_visitor_1.default(source, call_signature.shift()); + } + if (match_1.default(call_signature[0], 'formal_parameters')) { + formal_parameters = formal_parameters_visitor_1.visitFormalParameters(source, call_signature.shift()); + } + if (match_1.default(call_signature[0], 'type_annotation')) { + let type = call_signature.shift().children[1]; + type_annotation = type_visitor_1.visitType(source, type); + } + return { type_parameters, formal_parameters, type_annotation }; +} +exports.visitCallSignature = visitCallSignature; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsbF9zaWduYXR1cmUudmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvY2FsbF9zaWduYXR1cmUudmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLGdEQUF5QztBQUN6Qyx1RUFBNEQ7QUFDNUQsMkVBQW9FO0FBQ3BFLGlEQUEyQztBQUczQyxTQUFnQixrQkFBa0IsQ0FBQyxNQUFhLEVBQUUsSUFBZ0I7SUFFOUQsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFDbEMsZUFBZSxFQUNmLGlCQUFpQixFQUNqQixlQUFlLENBQUM7SUFFaEIsSUFBSSxlQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLEVBQUU7UUFDN0MsZUFBZSxHQUFHLGlDQUFtQixDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUN6RTtJQUVELElBQUksZUFBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxFQUFFO1FBQy9DLGlCQUFpQixHQUFHLGlEQUFxQixDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUM3RTtJQUVELElBQUksZUFBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFO1FBQzdDLElBQUksSUFBSSxHQUFHLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsZUFBZSxHQUFHLHdCQUFTLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQzdDO0lBRUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsQ0FBQTtBQUVsRSxDQUFDO0FBdEJELGdEQXNCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcclxuaW1wb3J0IG1hdGNoIGZyb20gXCIuLi8uLi8uLi91dGlscy9tYXRjaFwiO1xyXG5pbXBvcnQgdmlzaXRUeXBlUGFyYW1ldGVycyBmcm9tIFwiLi90eXBlX3BhcmFtZXRlcnMudmlzaXRvclwiO1xyXG5pbXBvcnQgeyB2aXNpdEZvcm1hbFBhcmFtZXRlcnMgfSBmcm9tIFwiLi9mb3JtYWxfcGFyYW1ldGVycy52aXNpdG9yXCI7XHJcbmltcG9ydCB7IHZpc2l0VHlwZSB9IGZyb20gXCIuL3R5cGUudmlzaXRvclwiO1xyXG5pbXBvcnQgSUZpbGUgZnJvbSBcIi4uLy4uLy4uL2ludGVyZmFjZXMvSUZpbGVcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB2aXNpdENhbGxTaWduYXR1cmUoc291cmNlOiBJRmlsZSwgbm9kZTogU3ludGF4Tm9kZSkge1xyXG5cclxuICAgIGxldCBjYWxsX3NpZ25hdHVyZSA9IG5vZGUuY2hpbGRyZW4sXHJcbiAgICB0eXBlX3BhcmFtZXRlcnMsXHJcbiAgICBmb3JtYWxfcGFyYW1ldGVycyxcclxuICAgIHR5cGVfYW5ub3RhdGlvbjtcclxuXHJcbiAgICBpZiAobWF0Y2goY2FsbF9zaWduYXR1cmVbMF0sICd0eXBlX3BhcmFtZXRlcnMnKSkge1xyXG4gICAgICAgIHR5cGVfcGFyYW1ldGVycyA9IHZpc2l0VHlwZVBhcmFtZXRlcnMoc291cmNlLCBjYWxsX3NpZ25hdHVyZS5zaGlmdCgpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobWF0Y2goY2FsbF9zaWduYXR1cmVbMF0sICdmb3JtYWxfcGFyYW1ldGVycycpKSB7XHJcbiAgICAgICAgZm9ybWFsX3BhcmFtZXRlcnMgPSB2aXNpdEZvcm1hbFBhcmFtZXRlcnMoc291cmNlLCBjYWxsX3NpZ25hdHVyZS5zaGlmdCgpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobWF0Y2goY2FsbF9zaWduYXR1cmVbMF0sICd0eXBlX2Fubm90YXRpb24nKSkge1xyXG4gICAgICAgIGxldCB0eXBlID0gY2FsbF9zaWduYXR1cmUuc2hpZnQoKS5jaGlsZHJlblsxXTtcclxuICAgICAgICB0eXBlX2Fubm90YXRpb24gPSB2aXNpdFR5cGUoc291cmNlLCB0eXBlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyB0eXBlX3BhcmFtZXRlcnMsIGZvcm1hbF9wYXJhbWV0ZXJzLCB0eXBlX2Fubm90YXRpb24gfVxyXG5cclxufSJdfQ== \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/class.visitor.d.ts b/build/src/lang/typescript/visitors/class.visitor.d.ts new file mode 100644 index 0000000..b560029 --- /dev/null +++ b/build/src/lang/typescript/visitors/class.visitor.d.ts @@ -0,0 +1,88 @@ +import { SyntaxNode } from "tree-sitter"; +import { NodeProperties } from "../Node"; +import IFile from "../../../interfaces/IFile"; +export declare function visitClass(source: IFile, node: SyntaxNode, comment: SyntaxNode, properties?: Partial): { + type: string; + identifier: import("../Node").Node; + type_parameters: { + type: string; + context: import("../Node").Node; + parameters: { + type: string; + context: import("../Node").Node; + }[]; + } | { + type: string; + heritage_type: string; + context: import("../Node").Node; + heritages: { + type: string; + context: import("../Node").Node; + }[]; + } | { + type: string; + context: import("../Node").Node; + methods: any[]; + properties: any[]; + }; + heritage: { + type: string; + context: import("../Node").Node; + parameters: { + type: string; + context: import("../Node").Node; + }[]; + } | { + type: string; + heritage_type: string; + context: import("../Node").Node; + heritages: { + type: string; + context: import("../Node").Node; + }[]; + } | { + type: string; + context: import("../Node").Node; + methods: any[]; + properties: any[]; + }; + body: { + type: string; + context: import("../Node").Node; + parameters: { + type: string; + context: import("../Node").Node; + }[]; + } | { + type: string; + heritage_type: string; + context: import("../Node").Node; + heritages: { + type: string; + context: import("../Node").Node; + }[]; + } | { + type: string; + context: import("../Node").Node; + methods: any[]; + properties: any[]; + }; + properties: Partial; + comment: import("../Node").Node; + context: import("../Node").Node; +}; +export declare function visitClassHeritage(source: IFile, node: SyntaxNode): { + type: string; + heritage_type: string; + context: import("../Node").Node; + heritages: { + type: string; + context: import("../Node").Node; + }[]; +}; +export declare function visitClassBody(source: IFile, node: SyntaxNode): { + type: string; + context: import("../Node").Node; + methods: any[]; + properties: any[]; +}; diff --git a/build/src/lang/typescript/visitors/class.visitor.js b/build/src/lang/typescript/visitors/class.visitor.js new file mode 100644 index 0000000..1a648c2 --- /dev/null +++ b/build/src/lang/typescript/visitors/class.visitor.js @@ -0,0 +1,91 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const Node_1 = require("../Node"); +const type_parameters_visitor_1 = require("./type_parameters.visitor"); +const match_1 = require("../../../utils/match"); +const comment_1 = require("../../../utils/comment"); +const method_definition_visitor_1 = require("./method_definition.visitor"); +const public_field_definition_visitor_1 = require("../public_field_definition.visitor"); +const type_visitor_1 = require("./type.visitor"); +const log_1 = require("../../../utils/log"); +function visitClass(source, node, comment, properties) { + let children = node.children; + // Remove 'class' from the array + children.shift(); + const identifier = Node_1.createNode(source, children.shift()); + const visited = children.map(child => { + switch (child.type) { + case 'type_parameters': + return type_parameters_visitor_1.default(source, child); + case 'class_heritage': + return visitClassHeritage(source, child); + case 'class_body': + return visitClassBody(source, child); + default: + console.log(`[mr-doc::parser]: info - '${node.type.replace(/[_]/g, ' ')}' is not supported yet.`); + break; + } + }); + const type_parameters = visited.filter(child => child.type === 'type_parameters').shift(); + const heritage = visited.filter(child => child.type === 'class_heritage').shift(); + const body = visited.filter(child => child.type === 'class_body').shift(); + return { + type: 'class', + identifier, + type_parameters, + heritage, + body, + properties, + comment: Node_1.createNode(source, comment, null, true), + context: Node_1.createNode(source, node) + }; +} +exports.visitClass = visitClass; +function visitClassHeritage(source, node) { + let heritage_clause = node.children.shift(); + let heritage_clause_children = heritage_clause.children; + // Remove the heritage type ('implements' or 'extends') + let heritage_type = heritage_clause_children.shift(); + return { + type: 'class_heritage', + heritage_type: heritage_type.type, + context: Node_1.createNode(source, node), + // A heritage is either 'implements' or 'extends' + heritages: heritage_clause_children + .filter(child => child.type === 'type_identifier') + .map(child => type_visitor_1.visitTypeIdentifier(source, child)) + }; +} +exports.visitClassHeritage = visitClassHeritage; +function visitClassBody(source, node) { + const methods = []; + const properties = []; + node.children + .filter(child => !child.type.match(/[{}]/)) + .forEach(child => { + const nextSibling = child.nextSibling; + if (match_1.default(child, 'comment') && comment_1.isJavaDocComment(source, child)) { + if (nextSibling) { + switch (nextSibling.type) { + case 'method_definition': + methods.push(method_definition_visitor_1.visitMethodDefinition(source, nextSibling, child)); + break; + case 'public_field_definition': + properties.push(public_field_definition_visitor_1.visitPublicFieldDefinition(source, nextSibling, child)); + break; + default: + log_1.default.report(source, nextSibling, log_1.ErrorType.NodeTypeNotSupported); + break; + } + } + } + }); + return { + type: 'class_body', + context: Node_1.createNode(source, node), + methods, + properties + }; +} +exports.visitClassBody = visitClassBody; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3MudmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvY2xhc3MudmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLGtDQUFxRDtBQUNyRCx1RUFBNEQ7QUFDNUQsZ0RBQXlDO0FBQ3pDLG9EQUEwRDtBQUMxRCwyRUFBb0U7QUFDcEUsd0ZBQWdGO0FBQ2hGLGlEQUFxRDtBQUVyRCw0Q0FBb0Q7QUFFcEQsU0FBZ0IsVUFBVSxDQUN4QixNQUFhLEVBQ2IsSUFBZ0IsRUFDaEIsT0FBbUIsRUFDbkIsVUFBb0M7SUFFcEMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUM3QixnQ0FBZ0M7SUFDaEMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQ2hCLE1BQU0sVUFBVSxHQUFHLGlCQUFVLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBQ3ZELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDbkMsUUFBUSxLQUFLLENBQUMsSUFBSSxFQUFFO1lBQ2xCLEtBQUssaUJBQWlCO2dCQUNwQixPQUFPLGlDQUFtQixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQTtZQUMzQyxLQUFLLGdCQUFnQjtnQkFDbkIsT0FBTyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUE7WUFDMUMsS0FBSyxZQUFZO2dCQUNmLE9BQU8sY0FBYyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQTtZQUN0QztnQkFDRSxPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLHlCQUF5QixDQUFDLENBQUE7Z0JBQ2pHLE1BQU07U0FDVDtJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssaUJBQWlCLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUN6RixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxnQkFBZ0IsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQ2pGLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBRTFFLE9BQU87UUFDTCxJQUFJLEVBQUUsT0FBTztRQUNiLFVBQVU7UUFDVixlQUFlO1FBQ2YsUUFBUTtRQUNSLElBQUk7UUFDSixVQUFVO1FBQ1YsT0FBTyxFQUFFLGlCQUFVLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO1FBQ2hELE9BQU8sRUFBRSxpQkFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7S0FDbEMsQ0FBQTtBQUNILENBQUM7QUF0Q0QsZ0NBc0NDO0FBRUQsU0FBZ0Isa0JBQWtCLENBQUMsTUFBYSxFQUFFLElBQWdCO0lBQ2hFLElBQUksZUFBZSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDNUMsSUFBSSx3QkFBd0IsR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDO0lBQ3hELHVEQUF1RDtJQUN2RCxJQUFJLGFBQWEsR0FBRyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUVyRCxPQUFPO1FBQ0wsSUFBSSxFQUFFLGdCQUFnQjtRQUN0QixhQUFhLEVBQUUsYUFBYSxDQUFDLElBQUk7UUFDakMsT0FBTyxFQUFFLGlCQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztRQUNqQyxpREFBaUQ7UUFDakQsU0FBUyxFQUFFLHdCQUF3QjthQUNoQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLGlCQUFpQixDQUFDO2FBQ2pELEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLGtDQUFtQixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztLQUNwRCxDQUFBO0FBQ0gsQ0FBQztBQWZELGdEQWVDO0FBRUQsU0FBZ0IsY0FBYyxDQUFDLE1BQWEsRUFBRSxJQUFnQjtJQUU1RCxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUE7SUFDbEIsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFBO0lBQ3JCLElBQUksQ0FBQyxRQUFRO1NBQ1YsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMxQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDZixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO1FBQ3RDLElBQUksZUFBSyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsSUFBSSwwQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDOUQsSUFBSSxXQUFXLEVBQUU7Z0JBQ2YsUUFBUSxXQUFXLENBQUMsSUFBSSxFQUFFO29CQUN4QixLQUFLLG1CQUFtQjt3QkFDdEIsT0FBTyxDQUFDLElBQUksQ0FBQyxpREFBcUIsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ2hFLE1BQU07b0JBQ1IsS0FBSyx5QkFBeUI7d0JBQzVCLFVBQVUsQ0FBQyxJQUFJLENBQUMsNERBQTBCLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUN4RSxNQUFNO29CQUNSO3dCQUNFLGFBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxlQUFTLENBQUMsb0JBQW9CLENBQUMsQ0FBQzt3QkFDaEUsTUFBTTtpQkFDVDthQUNGO1NBQ0Y7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVMLE9BQU87UUFDTCxJQUFJLEVBQUUsWUFBWTtRQUNsQixPQUFPLEVBQUUsaUJBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDO1FBQ2pDLE9BQU87UUFDUCxVQUFVO0tBQ1gsQ0FBQTtBQUNILENBQUM7QUEvQkQsd0NBK0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5pbXBvcnQgeyBOb2RlUHJvcGVydGllcywgY3JlYXRlTm9kZSB9IGZyb20gXCIuLi9Ob2RlXCI7XHJcbmltcG9ydCB2aXNpdFR5cGVQYXJhbWV0ZXJzIGZyb20gXCIuL3R5cGVfcGFyYW1ldGVycy52aXNpdG9yXCI7XHJcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbWF0Y2hcIjtcclxuaW1wb3J0IHsgaXNKYXZhRG9jQ29tbWVudCB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9jb21tZW50XCI7XHJcbmltcG9ydCB7IHZpc2l0TWV0aG9kRGVmaW5pdGlvbiB9IGZyb20gXCIuL21ldGhvZF9kZWZpbml0aW9uLnZpc2l0b3JcIjtcclxuaW1wb3J0IHsgdmlzaXRQdWJsaWNGaWVsZERlZmluaXRpb24gfSBmcm9tIFwiLi4vcHVibGljX2ZpZWxkX2RlZmluaXRpb24udmlzaXRvclwiO1xyXG5pbXBvcnQgeyB2aXNpdFR5cGVJZGVudGlmaWVyIH0gZnJvbSBcIi4vdHlwZS52aXNpdG9yXCI7XHJcbmltcG9ydCBJRmlsZSBmcm9tIFwiLi4vLi4vLi4vaW50ZXJmYWNlcy9JRmlsZVwiO1xyXG5pbXBvcnQgbG9nLCB7IEVycm9yVHlwZSB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9sb2dcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB2aXNpdENsYXNzKFxyXG4gIHNvdXJjZTogSUZpbGUsXHJcbiAgbm9kZTogU3ludGF4Tm9kZSxcclxuICBjb21tZW50OiBTeW50YXhOb2RlLFxyXG4gIHByb3BlcnRpZXM/OiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPlxyXG4pIHtcclxuICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xyXG4gIC8vIFJlbW92ZSAnY2xhc3MnIGZyb20gdGhlIGFycmF5XHJcbiAgY2hpbGRyZW4uc2hpZnQoKVxyXG4gIGNvbnN0IGlkZW50aWZpZXIgPSBjcmVhdGVOb2RlKHNvdXJjZSwgY2hpbGRyZW4uc2hpZnQoKSlcclxuICBjb25zdCB2aXNpdGVkID0gY2hpbGRyZW4ubWFwKGNoaWxkID0+IHtcclxuICAgIHN3aXRjaCAoY2hpbGQudHlwZSkge1xyXG4gICAgICBjYXNlICd0eXBlX3BhcmFtZXRlcnMnOlxyXG4gICAgICAgIHJldHVybiB2aXNpdFR5cGVQYXJhbWV0ZXJzKHNvdXJjZSwgY2hpbGQpXHJcbiAgICAgIGNhc2UgJ2NsYXNzX2hlcml0YWdlJzpcclxuICAgICAgICByZXR1cm4gdmlzaXRDbGFzc0hlcml0YWdlKHNvdXJjZSwgY2hpbGQpXHJcbiAgICAgIGNhc2UgJ2NsYXNzX2JvZHknOlxyXG4gICAgICAgIHJldHVybiB2aXNpdENsYXNzQm9keShzb3VyY2UsIGNoaWxkKVxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGNvbnNvbGUubG9nKGBbbXItZG9jOjpwYXJzZXJdOiBpbmZvIC0gJyR7bm9kZS50eXBlLnJlcGxhY2UoL1tfXS9nLCAnICcpfScgaXMgbm90IHN1cHBvcnRlZCB5ZXQuYClcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgY29uc3QgdHlwZV9wYXJhbWV0ZXJzID0gdmlzaXRlZC5maWx0ZXIoY2hpbGQgPT4gY2hpbGQudHlwZSA9PT0gJ3R5cGVfcGFyYW1ldGVycycpLnNoaWZ0KClcclxuICBjb25zdCBoZXJpdGFnZSA9IHZpc2l0ZWQuZmlsdGVyKGNoaWxkID0+IGNoaWxkLnR5cGUgPT09ICdjbGFzc19oZXJpdGFnZScpLnNoaWZ0KClcclxuICBjb25zdCBib2R5ID0gdmlzaXRlZC5maWx0ZXIoY2hpbGQgPT4gY2hpbGQudHlwZSA9PT0gJ2NsYXNzX2JvZHknKS5zaGlmdCgpO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgdHlwZTogJ2NsYXNzJyxcclxuICAgIGlkZW50aWZpZXIsXHJcbiAgICB0eXBlX3BhcmFtZXRlcnMsXHJcbiAgICBoZXJpdGFnZSxcclxuICAgIGJvZHksXHJcbiAgICBwcm9wZXJ0aWVzLFxyXG4gICAgY29tbWVudDogY3JlYXRlTm9kZShzb3VyY2UsIGNvbW1lbnQsIG51bGwsIHRydWUpLFxyXG4gICAgY29udGV4dDogY3JlYXRlTm9kZShzb3VyY2UsIG5vZGUpXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRDbGFzc0hlcml0YWdlKHNvdXJjZTogSUZpbGUsIG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICBsZXQgaGVyaXRhZ2VfY2xhdXNlID0gbm9kZS5jaGlsZHJlbi5zaGlmdCgpO1xyXG4gIGxldCBoZXJpdGFnZV9jbGF1c2VfY2hpbGRyZW4gPSBoZXJpdGFnZV9jbGF1c2UuY2hpbGRyZW47XHJcbiAgLy8gUmVtb3ZlIHRoZSBoZXJpdGFnZSB0eXBlICgnaW1wbGVtZW50cycgb3IgJ2V4dGVuZHMnKVxyXG4gIGxldCBoZXJpdGFnZV90eXBlID0gaGVyaXRhZ2VfY2xhdXNlX2NoaWxkcmVuLnNoaWZ0KCk7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICB0eXBlOiAnY2xhc3NfaGVyaXRhZ2UnLFxyXG4gICAgaGVyaXRhZ2VfdHlwZTogaGVyaXRhZ2VfdHlwZS50eXBlLFxyXG4gICAgY29udGV4dDogY3JlYXRlTm9kZShzb3VyY2UsIG5vZGUpLFxyXG4gICAgLy8gQSBoZXJpdGFnZSBpcyBlaXRoZXIgJ2ltcGxlbWVudHMnIG9yICdleHRlbmRzJ1xyXG4gICAgaGVyaXRhZ2VzOiBoZXJpdGFnZV9jbGF1c2VfY2hpbGRyZW5cclxuICAgICAgLmZpbHRlcihjaGlsZCA9PiBjaGlsZC50eXBlID09PSAndHlwZV9pZGVudGlmaWVyJylcclxuICAgICAgLm1hcChjaGlsZCA9PiB2aXNpdFR5cGVJZGVudGlmaWVyKHNvdXJjZSwgY2hpbGQpKVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHZpc2l0Q2xhc3NCb2R5KHNvdXJjZTogSUZpbGUsIG5vZGU6IFN5bnRheE5vZGUpIHtcclxuXHJcbiAgY29uc3QgbWV0aG9kcyA9IFtdXHJcbiAgY29uc3QgcHJvcGVydGllcyA9IFtdXHJcbiAgbm9kZS5jaGlsZHJlblxyXG4gICAgLmZpbHRlcihjaGlsZCA9PiAhY2hpbGQudHlwZS5tYXRjaCgvW3t9XS8pKVxyXG4gICAgLmZvckVhY2goY2hpbGQgPT4ge1xyXG4gICAgICBjb25zdCBuZXh0U2libGluZyA9IGNoaWxkLm5leHRTaWJsaW5nO1xyXG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdjb21tZW50JykgJiYgaXNKYXZhRG9jQ29tbWVudChzb3VyY2UsIGNoaWxkKSkge1xyXG4gICAgICAgIGlmIChuZXh0U2libGluZykge1xyXG4gICAgICAgICAgc3dpdGNoIChuZXh0U2libGluZy50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ21ldGhvZF9kZWZpbml0aW9uJzpcclxuICAgICAgICAgICAgICBtZXRob2RzLnB1c2godmlzaXRNZXRob2REZWZpbml0aW9uKHNvdXJjZSwgbmV4dFNpYmxpbmcsIGNoaWxkKSk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ3B1YmxpY19maWVsZF9kZWZpbml0aW9uJzpcclxuICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnB1c2godmlzaXRQdWJsaWNGaWVsZERlZmluaXRpb24oc291cmNlLCBuZXh0U2libGluZywgY2hpbGQpKTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICBsb2cucmVwb3J0KHNvdXJjZSwgbmV4dFNpYmxpbmcsIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFN1cHBvcnRlZCk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIHR5cGU6ICdjbGFzc19ib2R5JyxcclxuICAgIGNvbnRleHQ6IGNyZWF0ZU5vZGUoc291cmNlLCBub2RlKSxcclxuICAgIG1ldGhvZHMsXHJcbiAgICBwcm9wZXJ0aWVzXHJcbiAgfVxyXG59Il19 \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/declaration.visitor.d.ts b/build/src/lang/typescript/visitors/declaration.visitor.d.ts new file mode 100644 index 0000000..15bd6c4 --- /dev/null +++ b/build/src/lang/typescript/visitors/declaration.visitor.d.ts @@ -0,0 +1,6 @@ +import { SyntaxNode } from "tree-sitter"; +import { NodeProperties } from "../Node"; +import IFile from "../../../interfaces/IFile"; +export declare function visitDeclaration(source: IFile, node: SyntaxNode, comment: SyntaxNode, properties: Partial): void; +export declare function visitInterfaceDeclaration(source: IFile, node: SyntaxNode, comment: SyntaxNode, properties: Partial): void; +export declare function visitLexicalDeclaration(source: IFile, node: SyntaxNode, comment: SyntaxNode, properties: Partial): void; diff --git a/build/src/lang/typescript/visitors/declaration.visitor.js b/build/src/lang/typescript/visitors/declaration.visitor.js new file mode 100644 index 0000000..1640249 --- /dev/null +++ b/build/src/lang/typescript/visitors/declaration.visitor.js @@ -0,0 +1,24 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const log_1 = require("../../../utils/log"); +function visitDeclaration(source, node, comment, properties) { + switch (node.type) { + case 'interface_declaration': + return visitInterfaceDeclaration(source, node, comment, properties); + case 'lexical_declaration': + return visitLexicalDeclaration(source, node, comment, properties); + default: + log_1.default.report(source, node, log_1.ErrorType.NodeTypeNotSupported); + break; + } +} +exports.visitDeclaration = visitDeclaration; +function visitInterfaceDeclaration(source, node, comment, properties) { + console.log(node.children); +} +exports.visitInterfaceDeclaration = visitInterfaceDeclaration; +function visitLexicalDeclaration(source, node, comment, properties) { + console.log(node.children); +} +exports.visitLexicalDeclaration = visitLexicalDeclaration; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjbGFyYXRpb24udmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvZGVjbGFyYXRpb24udmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUdBLDRDQUFvRDtBQUlwRCxTQUFnQixnQkFBZ0IsQ0FDNUIsTUFBYSxFQUNiLElBQWdCLEVBQ2hCLE9BQW1CLEVBQ25CLFVBQW1DO0lBRW5DLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRTtRQUNmLEtBQUssdUJBQXVCO1lBQ3hCLE9BQU8seUJBQXlCLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDeEUsS0FBSyxxQkFBcUI7WUFDdEIsT0FBTyx1QkFBdUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN0RTtZQUNJLGFBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxlQUFTLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUN6RCxNQUFNO0tBQ2I7QUFDTCxDQUFDO0FBZkQsNENBZUM7QUFFRCxTQUFnQix5QkFBeUIsQ0FDckMsTUFBYSxFQUNiLElBQWdCLEVBQ2hCLE9BQW1CLEVBQ25CLFVBQW1DO0lBRW5DLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBRS9CLENBQUM7QUFSRCw4REFRQztBQUVELFNBQWdCLHVCQUF1QixDQUNuQyxNQUFhLEVBQ2IsSUFBZ0IsRUFDaEIsT0FBbUIsRUFDbkIsVUFBbUM7SUFFbkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7QUFFL0IsQ0FBQztBQVJELDBEQVFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5pbXBvcnQgeyBOb2RlUHJvcGVydGllcyB9IGZyb20gXCIuLi9Ob2RlXCI7XHJcbmltcG9ydCBJRmlsZSBmcm9tIFwiLi4vLi4vLi4vaW50ZXJmYWNlcy9JRmlsZVwiO1xyXG5pbXBvcnQgbG9nLCB7IEVycm9yVHlwZSB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9sb2dcIjtcclxuXHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHZpc2l0RGVjbGFyYXRpb24oXHJcbiAgICBzb3VyY2U6IElGaWxlLFxyXG4gICAgbm9kZTogU3ludGF4Tm9kZSxcclxuICAgIGNvbW1lbnQ6IFN5bnRheE5vZGUsXHJcbiAgICBwcm9wZXJ0aWVzOiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPlxyXG4pIHtcclxuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XHJcbiAgICAgICAgY2FzZSAnaW50ZXJmYWNlX2RlY2xhcmF0aW9uJzpcclxuICAgICAgICAgICAgcmV0dXJuIHZpc2l0SW50ZXJmYWNlRGVjbGFyYXRpb24oc291cmNlLCBub2RlLCBjb21tZW50LCBwcm9wZXJ0aWVzKTtcclxuICAgICAgICBjYXNlICdsZXhpY2FsX2RlY2xhcmF0aW9uJzpcclxuICAgICAgICAgICAgcmV0dXJuIHZpc2l0TGV4aWNhbERlY2xhcmF0aW9uKHNvdXJjZSwgbm9kZSwgY29tbWVudCwgcHJvcGVydGllcyk7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgbG9nLnJlcG9ydChzb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFN1cHBvcnRlZCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRJbnRlcmZhY2VEZWNsYXJhdGlvbihcclxuICAgIHNvdXJjZTogSUZpbGUsXHJcbiAgICBub2RlOiBTeW50YXhOb2RlLFxyXG4gICAgY29tbWVudDogU3ludGF4Tm9kZSxcclxuICAgIHByb3BlcnRpZXM6IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+XHJcbikge1xyXG4gICAgY29uc29sZS5sb2cobm9kZS5jaGlsZHJlbik7XHJcblxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRMZXhpY2FsRGVjbGFyYXRpb24oXHJcbiAgICBzb3VyY2U6IElGaWxlLFxyXG4gICAgbm9kZTogU3ludGF4Tm9kZSxcclxuICAgIGNvbW1lbnQ6IFN5bnRheE5vZGUsXHJcbiAgICBwcm9wZXJ0aWVzOiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPlxyXG4pIHtcclxuICAgIGNvbnNvbGUubG9nKG5vZGUuY2hpbGRyZW4pO1xyXG5cclxufSJdfQ== \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/formal_parameters.visitor.d.ts b/build/src/lang/typescript/visitors/formal_parameters.visitor.d.ts new file mode 100644 index 0000000..ecbdddb --- /dev/null +++ b/build/src/lang/typescript/visitors/formal_parameters.visitor.d.ts @@ -0,0 +1,18 @@ +import { SyntaxNode } from "tree-sitter"; +import IFile from "../../../interfaces/IFile"; +export declare function visitFormalParameters(source: IFile, node: SyntaxNode): { + type: string; + context: import("../Node").Node; + parameters: { + type: string; + context: import("../Node").Node; + identifier: any; + type_annotation: any; + }[]; +}; +export declare function visitRequiredParameter(source: IFile, node: SyntaxNode): { + type: string; + context: import("../Node").Node; + identifier: any; + type_annotation: any; +}; diff --git a/build/src/lang/typescript/visitors/formal_parameters.visitor.js b/build/src/lang/typescript/visitors/formal_parameters.visitor.js new file mode 100644 index 0000000..cd9a6b6 --- /dev/null +++ b/build/src/lang/typescript/visitors/formal_parameters.visitor.js @@ -0,0 +1,34 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const Node_1 = require("../Node"); +const text_1 = require("../../../utils/text"); +const type_visitor_1 = require("./type.visitor"); +const match_1 = require("../../../utils/match"); +function visitFormalParameters(source, node) { + return { + type: node.type, + context: Node_1.createNode(source, node), + parameters: node.children + .filter(child => !child.type.match(/[(),]/)) + .map(child => visitRequiredParameter(source, child)) + }; +} +exports.visitFormalParameters = visitFormalParameters; +function visitRequiredParameter(source, node) { + let required_parameter = node.children, identifier, type_annotation; + if (match_1.default(required_parameter[0], 'identifier')) { + identifier = text_1.text(source, required_parameter.shift()); + } + if (match_1.default(required_parameter[0], 'type_annotation')) { + let type = required_parameter.shift().children[1]; + type_annotation = type_visitor_1.visitType(source, type); + } + return { + type: 'parameter', + context: Node_1.createNode(source, node), + identifier, + type_annotation + }; +} +exports.visitRequiredParameter = visitRequiredParameter; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWFsX3BhcmFtZXRlcnMudmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvZm9ybWFsX3BhcmFtZXRlcnMudmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtDQUFxQztBQUVyQyw4Q0FBMkM7QUFDM0MsaURBQTJDO0FBRTNDLGdEQUF5QztBQUV6QyxTQUFnQixxQkFBcUIsQ0FBQyxNQUFhLEVBQUUsSUFBZ0I7SUFDbkUsT0FBTztRQUNMLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtRQUNmLE9BQU8sRUFBRSxpQkFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7UUFDakMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRO2FBQ3hCLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDM0MsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsc0JBQXNCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQ3JELENBQUE7QUFDSCxDQUFDO0FBUkQsc0RBUUM7QUFHRCxTQUFnQixzQkFBc0IsQ0FBQyxNQUFhLEVBQUUsSUFBZ0I7SUFDcEUsSUFBSSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUNwQyxVQUFVLEVBQ1YsZUFBZSxDQUFDO0lBR2xCLElBQUksZUFBSyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFO1FBQzlDLFVBQVUsR0FBRyxXQUFJLENBQUMsTUFBTSxFQUFFLGtCQUFrQixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDdkQ7SUFFRCxJQUFHLGVBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFO1FBQ2xELElBQUksSUFBSSxHQUFHLGtCQUFrQixDQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRCxlQUFlLEdBQUcsd0JBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDM0M7SUFFRCxPQUFPO1FBQ0wsSUFBSSxFQUFFLFdBQVc7UUFDakIsT0FBTyxFQUFFLGlCQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztRQUNqQyxVQUFVO1FBQ1YsZUFBZTtLQUNoQixDQUFBO0FBQ0gsQ0FBQztBQXJCRCx3REFxQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVOb2RlIH0gZnJvbSBcIi4uL05vZGVcIjtcclxuaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5pbXBvcnQgeyB0ZXh0IH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3RleHRcIjtcclxuaW1wb3J0IHsgdmlzaXRUeXBlIH0gZnJvbSBcIi4vdHlwZS52aXNpdG9yXCI7XHJcbmltcG9ydCBJRmlsZSBmcm9tIFwiLi4vLi4vLi4vaW50ZXJmYWNlcy9JRmlsZVwiO1xyXG5pbXBvcnQgbWF0Y2ggZnJvbSBcIi4uLy4uLy4uL3V0aWxzL21hdGNoXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRGb3JtYWxQYXJhbWV0ZXJzKHNvdXJjZTogSUZpbGUsIG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICByZXR1cm4ge1xyXG4gICAgdHlwZTogbm9kZS50eXBlLFxyXG4gICAgY29udGV4dDogY3JlYXRlTm9kZShzb3VyY2UsIG5vZGUpLFxyXG4gICAgcGFyYW1ldGVyczogbm9kZS5jaGlsZHJlblxyXG4gICAgLmZpbHRlcihjaGlsZCA9PiAhY2hpbGQudHlwZS5tYXRjaCgvWygpLF0vKSlcclxuICAgIC5tYXAoY2hpbGQgPT4gdmlzaXRSZXF1aXJlZFBhcmFtZXRlcihzb3VyY2UsIGNoaWxkKSlcclxuICB9XHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRSZXF1aXJlZFBhcmFtZXRlcihzb3VyY2U6IElGaWxlLCBub2RlOiBTeW50YXhOb2RlKSB7XHJcbiAgbGV0IHJlcXVpcmVkX3BhcmFtZXRlciA9IG5vZGUuY2hpbGRyZW4sXHJcbiAgICBpZGVudGlmaWVyLFxyXG4gICAgdHlwZV9hbm5vdGF0aW9uO1xyXG4gICAgXHJcblxyXG4gIGlmIChtYXRjaChyZXF1aXJlZF9wYXJhbWV0ZXJbMF0sICdpZGVudGlmaWVyJykpIHtcclxuICAgIGlkZW50aWZpZXIgPSB0ZXh0KHNvdXJjZSwgcmVxdWlyZWRfcGFyYW1ldGVyLnNoaWZ0KCkpO1xyXG4gIH1cclxuXHJcbiAgaWYobWF0Y2gocmVxdWlyZWRfcGFyYW1ldGVyWzBdLCAndHlwZV9hbm5vdGF0aW9uJykpIHtcclxuICAgIGxldCB0eXBlID0gcmVxdWlyZWRfcGFyYW1ldGVyLnNoaWZ0KCkuY2hpbGRyZW5bMV07XHJcbiAgICB0eXBlX2Fubm90YXRpb24gPSB2aXNpdFR5cGUoc291cmNlLCB0eXBlKTsgXHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgdHlwZTogJ3BhcmFtZXRlcicsXHJcbiAgICBjb250ZXh0OiBjcmVhdGVOb2RlKHNvdXJjZSwgbm9kZSksXHJcbiAgICBpZGVudGlmaWVyLFxyXG4gICAgdHlwZV9hbm5vdGF0aW9uXHJcbiAgfVxyXG59Il19 \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/function.visitor.d.ts b/build/src/lang/typescript/visitors/function.visitor.d.ts new file mode 100644 index 0000000..e9041fd --- /dev/null +++ b/build/src/lang/typescript/visitors/function.visitor.d.ts @@ -0,0 +1,14 @@ +import { SyntaxNode } from "tree-sitter"; +import { NodeProperties } from "../Node"; +import IFile from "../../../interfaces/IFile"; +export declare function visitFunction(source: IFile, node: SyntaxNode, comment: SyntaxNode, properties: Partial): { + type: string; + context: import("../Node").Node; + comment: import("../Node").Node; + isAync: boolean; + identifier: any; + type_parameters: any; + formal_parameters: any; + type_annotation: any; + properties: Partial; +}; diff --git a/build/src/lang/typescript/visitors/function.visitor.js b/build/src/lang/typescript/visitors/function.visitor.js new file mode 100644 index 0000000..7979203 --- /dev/null +++ b/build/src/lang/typescript/visitors/function.visitor.js @@ -0,0 +1,38 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const Node_1 = require("../Node"); +const match_1 = require("../../../utils/match"); +const call_signature_visitor_1 = require("./call_signature.visitor"); +function visitFunction(source, node, comment, properties) { + let children = node.children; + let isAync = false, identifier, type_parameters, formal_parameters, type_annotation; + if (match_1.default(children[0], 'async')) { + isAync = true; + children.shift(); + } + if (match_1.default(children[0], 'function')) { + children.shift(); + } + if (match_1.default(children[0], 'identifier')) { + identifier = Node_1.createNode(source, children.shift()); + } + if (match_1.default(children[0], 'call_signature')) { + let call_signature = call_signature_visitor_1.visitCallSignature(source, children.shift()); + type_parameters = call_signature.type_parameters; + formal_parameters = call_signature.formal_parameters; + type_annotation = call_signature.type_annotation; + } + return { + type: 'function', + context: Node_1.createNode(source, node, properties), + comment: Node_1.createNode(source, comment, null, true), + isAync, + identifier, + type_parameters, + formal_parameters, + type_annotation, + properties + }; +} +exports.visitFunction = visitFunction; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24udmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvZnVuY3Rpb24udmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLGtDQUFxRDtBQUNyRCxnREFBeUM7QUFDekMscUVBQThEO0FBRzlELFNBQWdCLGFBQWEsQ0FDekIsTUFBYSxFQUNiLElBQWdCLEVBQ2hCLE9BQW1CLEVBQ25CLFVBQW1DO0lBRW5DLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDN0IsSUFBSSxNQUFNLEdBQUcsS0FBSyxFQUNkLFVBQVUsRUFDVixlQUFlLEVBQ2YsaUJBQWlCLEVBQ2pCLGVBQWUsQ0FBQztJQUVwQixJQUFJLGVBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUU7UUFDN0IsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNkLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztLQUNwQjtJQUVELElBQUksZUFBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRTtRQUNoQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7S0FDcEI7SUFFRCxJQUFJLGVBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUU7UUFDbEMsVUFBVSxHQUFHLGlCQUFVLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO0tBQ3BEO0lBRUQsSUFBSSxlQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLEVBQUU7UUFDdEMsSUFBSSxjQUFjLEdBQUcsMkNBQWtCLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO1FBQ2pFLGVBQWUsR0FBRyxjQUFjLENBQUMsZUFBZSxDQUFDO1FBQ2pELGlCQUFpQixHQUFHLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQztRQUNyRCxlQUFlLEdBQUcsY0FBYyxDQUFDLGVBQWUsQ0FBQztLQUNwRDtJQUVELE9BQU87UUFDSCxJQUFJLEVBQUUsVUFBVTtRQUNoQixPQUFPLEVBQUUsaUJBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQztRQUM3QyxPQUFPLEVBQUUsaUJBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7UUFDaEQsTUFBTTtRQUNOLFVBQVU7UUFDVixlQUFlO1FBQ2YsaUJBQWlCO1FBQ2pCLGVBQWU7UUFDZixVQUFVO0tBQ2IsQ0FBQTtBQUVMLENBQUM7QUE3Q0Qsc0NBNkNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5pbXBvcnQgeyBOb2RlUHJvcGVydGllcywgY3JlYXRlTm9kZSB9IGZyb20gXCIuLi9Ob2RlXCI7XHJcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbWF0Y2hcIjtcclxuaW1wb3J0IHsgdmlzaXRDYWxsU2lnbmF0dXJlIH0gZnJvbSBcIi4vY2FsbF9zaWduYXR1cmUudmlzaXRvclwiO1xyXG5pbXBvcnQgSUZpbGUgZnJvbSBcIi4uLy4uLy4uL2ludGVyZmFjZXMvSUZpbGVcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB2aXNpdEZ1bmN0aW9uKFxyXG4gICAgc291cmNlOiBJRmlsZSxcclxuICAgIG5vZGU6IFN5bnRheE5vZGUsXHJcbiAgICBjb21tZW50OiBTeW50YXhOb2RlLFxyXG4gICAgcHJvcGVydGllczogUGFydGlhbDxOb2RlUHJvcGVydGllcz5cclxuKSB7XHJcbiAgICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xyXG4gICAgbGV0IGlzQXluYyA9IGZhbHNlLFxyXG4gICAgICAgIGlkZW50aWZpZXIsXHJcbiAgICAgICAgdHlwZV9wYXJhbWV0ZXJzLFxyXG4gICAgICAgIGZvcm1hbF9wYXJhbWV0ZXJzLFxyXG4gICAgICAgIHR5cGVfYW5ub3RhdGlvbjtcclxuXHJcbiAgICBpZiAobWF0Y2goY2hpbGRyZW5bMF0sICdhc3luYycpKSB7XHJcbiAgICAgICAgaXNBeW5jID0gdHJ1ZTtcclxuICAgICAgICBjaGlsZHJlbi5zaGlmdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChtYXRjaChjaGlsZHJlblswXSwgJ2Z1bmN0aW9uJykpIHtcclxuICAgICAgICBjaGlsZHJlbi5zaGlmdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChtYXRjaChjaGlsZHJlblswXSwgJ2lkZW50aWZpZXInKSkge1xyXG4gICAgICAgIGlkZW50aWZpZXIgPSBjcmVhdGVOb2RlKHNvdXJjZSwgY2hpbGRyZW4uc2hpZnQoKSlcclxuICAgIH1cclxuXHJcbiAgICBpZiAobWF0Y2goY2hpbGRyZW5bMF0sICdjYWxsX3NpZ25hdHVyZScpKSB7XHJcbiAgICAgICAgbGV0IGNhbGxfc2lnbmF0dXJlID0gdmlzaXRDYWxsU2lnbmF0dXJlKHNvdXJjZSwgY2hpbGRyZW4uc2hpZnQoKSlcclxuICAgICAgICB0eXBlX3BhcmFtZXRlcnMgPSBjYWxsX3NpZ25hdHVyZS50eXBlX3BhcmFtZXRlcnM7XHJcbiAgICAgICAgZm9ybWFsX3BhcmFtZXRlcnMgPSBjYWxsX3NpZ25hdHVyZS5mb3JtYWxfcGFyYW1ldGVycztcclxuICAgICAgICB0eXBlX2Fubm90YXRpb24gPSBjYWxsX3NpZ25hdHVyZS50eXBlX2Fubm90YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICB0eXBlOiAnZnVuY3Rpb24nLFxyXG4gICAgICAgIGNvbnRleHQ6IGNyZWF0ZU5vZGUoc291cmNlLCBub2RlLCBwcm9wZXJ0aWVzKSxcclxuICAgICAgICBjb21tZW50OiBjcmVhdGVOb2RlKHNvdXJjZSwgY29tbWVudCwgbnVsbCwgdHJ1ZSksXHJcbiAgICAgICAgaXNBeW5jLFxyXG4gICAgICAgIGlkZW50aWZpZXIsXHJcbiAgICAgICAgdHlwZV9wYXJhbWV0ZXJzLFxyXG4gICAgICAgIGZvcm1hbF9wYXJhbWV0ZXJzLFxyXG4gICAgICAgIHR5cGVfYW5ub3RhdGlvbixcclxuICAgICAgICBwcm9wZXJ0aWVzXHJcbiAgICB9XHJcblxyXG59Il19 \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/method_definition.visitor.d.ts b/build/src/lang/typescript/visitors/method_definition.visitor.d.ts new file mode 100644 index 0000000..63d9bfa --- /dev/null +++ b/build/src/lang/typescript/visitors/method_definition.visitor.d.ts @@ -0,0 +1,13 @@ +import { SyntaxNode } from "tree-sitter"; +import IFile from "../../../interfaces/IFile"; +export declare function visitMethodDefinition(source: IFile, node: SyntaxNode, comment: SyntaxNode): { + type: string; + context: import("../Node").Node; + comment: import("../Node").Node; + accessibility: string; + async: boolean; + identifier: any; + type_parameters: any; + formal_parameters: any; + type_annotation: any; +}; diff --git a/build/src/lang/typescript/visitors/method_definition.visitor.js b/build/src/lang/typescript/visitors/method_definition.visitor.js new file mode 100644 index 0000000..138ac46 --- /dev/null +++ b/build/src/lang/typescript/visitors/method_definition.visitor.js @@ -0,0 +1,39 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const Node_1 = require("../Node"); +const text_1 = require("../../../utils/text"); +const call_signature_visitor_1 = require("./call_signature.visitor"); +const match_1 = require("../../../utils/match"); +function visitMethodDefinition(source, node, comment) { + let method_definition = node.children; + let accessibility = 'public', isAsync = false, identifier, type_parameters, formal_parameters, type_annotation; + if (match_1.default(method_definition[0], 'async')) { + isAsync = true; + method_definition.shift(); + } + if (match_1.default(method_definition[0], 'accessibility_modifier')) { + accessibility = text_1.text(source, method_definition.shift()); + } + if (match_1.default(method_definition[0], 'property_identifier')) { + identifier = Node_1.createNode(source, method_definition.shift()); + } + if (match_1.default(method_definition[0], 'call_signature')) { + const call_signature = call_signature_visitor_1.visitCallSignature(source, method_definition.shift()); + type_parameters = call_signature.type_parameters; + formal_parameters = call_signature.formal_parameters; + type_annotation = call_signature.type_annotation; + } + return { + type: 'method', + context: Node_1.createNode(source, node), + comment: Node_1.createNode(source, node, null, true), + accessibility, + async: isAsync, + identifier, + type_parameters, + formal_parameters, + type_annotation + }; +} +exports.visitMethodDefinition = visitMethodDefinition; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0aG9kX2RlZmluaXRpb24udmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvbWV0aG9kX2RlZmluaXRpb24udmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtDQUFxQztBQUVyQyw4Q0FBMkM7QUFDM0MscUVBQThEO0FBRTlELGdEQUF5QztBQUV6QyxTQUFnQixxQkFBcUIsQ0FBQyxNQUFhLEVBQUUsSUFBZ0IsRUFBRSxPQUFtQjtJQUN4RixJQUFJLGlCQUFpQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdEMsSUFBSSxhQUFhLEdBQUcsUUFBUSxFQUMxQixPQUFPLEdBQUcsS0FBSyxFQUNmLFVBQVUsRUFDVixlQUFlLEVBQ2YsaUJBQWlCLEVBQ2pCLGVBQWUsQ0FBQztJQUVsQixJQUFJLGVBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRTtRQUN4QyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ2YsaUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUM7S0FDM0I7SUFFRCxJQUFJLGVBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRSx3QkFBd0IsQ0FBQyxFQUFFO1FBQ3pELGFBQWEsR0FBRyxXQUFJLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUE7S0FDeEQ7SUFFRCxJQUFJLGVBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxFQUFFO1FBQ3RELFVBQVUsR0FBRyxpQkFBVSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO0tBQzNEO0lBRUQsSUFBSSxlQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsRUFBRTtRQUNqRCxNQUFNLGNBQWMsR0FBRywyQ0FBa0IsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQTtRQUM1RSxlQUFlLEdBQUcsY0FBYyxDQUFDLGVBQWUsQ0FBQztRQUNqRCxpQkFBaUIsR0FBRyxjQUFjLENBQUMsaUJBQWlCLENBQUM7UUFDckQsZUFBZSxHQUFHLGNBQWMsQ0FBQyxlQUFlLENBQUM7S0FDbEQ7SUFDRCxPQUFPO1FBQ0wsSUFBSSxFQUFFLFFBQVE7UUFDZCxPQUFPLEVBQUUsaUJBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDO1FBQ2pDLE9BQU8sRUFBRSxpQkFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztRQUM3QyxhQUFhO1FBQ2IsS0FBSyxFQUFFLE9BQU87UUFDZCxVQUFVO1FBQ1YsZUFBZTtRQUNmLGlCQUFpQjtRQUNqQixlQUFlO0tBQ2hCLENBQUE7QUFDSCxDQUFDO0FBdkNELHNEQXVDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZU5vZGUgfSBmcm9tIFwiLi4vTm9kZVwiO1xyXG5pbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XHJcbmltcG9ydCB7IHRleHQgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvdGV4dFwiO1xyXG5pbXBvcnQgeyB2aXNpdENhbGxTaWduYXR1cmUgfSBmcm9tIFwiLi9jYWxsX3NpZ25hdHVyZS52aXNpdG9yXCI7XHJcbmltcG9ydCBJRmlsZSBmcm9tIFwiLi4vLi4vLi4vaW50ZXJmYWNlcy9JRmlsZVwiO1xyXG5pbXBvcnQgbWF0Y2ggZnJvbSBcIi4uLy4uLy4uL3V0aWxzL21hdGNoXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRNZXRob2REZWZpbml0aW9uKHNvdXJjZTogSUZpbGUsIG5vZGU6IFN5bnRheE5vZGUsIGNvbW1lbnQ6IFN5bnRheE5vZGUpIHtcclxuICBsZXQgbWV0aG9kX2RlZmluaXRpb24gPSBub2RlLmNoaWxkcmVuO1xyXG4gIGxldCBhY2Nlc3NpYmlsaXR5ID0gJ3B1YmxpYycsXHJcbiAgICBpc0FzeW5jID0gZmFsc2UsXHJcbiAgICBpZGVudGlmaWVyLFxyXG4gICAgdHlwZV9wYXJhbWV0ZXJzLFxyXG4gICAgZm9ybWFsX3BhcmFtZXRlcnMsXHJcbiAgICB0eXBlX2Fubm90YXRpb247XHJcblxyXG4gIGlmIChtYXRjaChtZXRob2RfZGVmaW5pdGlvblswXSwgJ2FzeW5jJykpIHtcclxuICAgIGlzQXN5bmMgPSB0cnVlO1xyXG4gICAgbWV0aG9kX2RlZmluaXRpb24uc2hpZnQoKTtcclxuICB9XHJcbiAgXHJcbiAgaWYgKG1hdGNoKG1ldGhvZF9kZWZpbml0aW9uWzBdLCAnYWNjZXNzaWJpbGl0eV9tb2RpZmllcicpKSB7XHJcbiAgICBhY2Nlc3NpYmlsaXR5ID0gdGV4dChzb3VyY2UsIG1ldGhvZF9kZWZpbml0aW9uLnNoaWZ0KCkpXHJcbiAgfVxyXG5cclxuICBpZiAobWF0Y2gobWV0aG9kX2RlZmluaXRpb25bMF0sICdwcm9wZXJ0eV9pZGVudGlmaWVyJykpIHtcclxuICAgIGlkZW50aWZpZXIgPSBjcmVhdGVOb2RlKHNvdXJjZSwgbWV0aG9kX2RlZmluaXRpb24uc2hpZnQoKSlcclxuICB9XHJcblxyXG4gIGlmIChtYXRjaChtZXRob2RfZGVmaW5pdGlvblswXSwgJ2NhbGxfc2lnbmF0dXJlJykpIHtcclxuICAgIGNvbnN0IGNhbGxfc2lnbmF0dXJlID0gdmlzaXRDYWxsU2lnbmF0dXJlKHNvdXJjZSwgbWV0aG9kX2RlZmluaXRpb24uc2hpZnQoKSlcclxuICAgIHR5cGVfcGFyYW1ldGVycyA9IGNhbGxfc2lnbmF0dXJlLnR5cGVfcGFyYW1ldGVycztcclxuICAgIGZvcm1hbF9wYXJhbWV0ZXJzID0gY2FsbF9zaWduYXR1cmUuZm9ybWFsX3BhcmFtZXRlcnM7XHJcbiAgICB0eXBlX2Fubm90YXRpb24gPSBjYWxsX3NpZ25hdHVyZS50eXBlX2Fubm90YXRpb247XHJcbiAgfVxyXG4gIHJldHVybiB7XHJcbiAgICB0eXBlOiAnbWV0aG9kJyxcclxuICAgIGNvbnRleHQ6IGNyZWF0ZU5vZGUoc291cmNlLCBub2RlKSxcclxuICAgIGNvbW1lbnQ6IGNyZWF0ZU5vZGUoc291cmNlLCBub2RlLCBudWxsLCB0cnVlKSxcclxuICAgIGFjY2Vzc2liaWxpdHksXHJcbiAgICBhc3luYzogaXNBc3luYywgXHJcbiAgICBpZGVudGlmaWVyLFxyXG4gICAgdHlwZV9wYXJhbWV0ZXJzLFxyXG4gICAgZm9ybWFsX3BhcmFtZXRlcnMsXHJcbiAgICB0eXBlX2Fubm90YXRpb25cclxuICB9XHJcbn0iXX0= \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/node.visitor.d.ts b/build/src/lang/typescript/visitors/node.visitor.d.ts new file mode 100644 index 0000000..654cfb1 --- /dev/null +++ b/build/src/lang/typescript/visitors/node.visitor.d.ts @@ -0,0 +1,4 @@ +import { SyntaxNode } from "tree-sitter"; +import { NodeProperties } from "../Node"; +import IFile from "../../../interfaces/IFile"; +export declare function visitNode(source: IFile, node: SyntaxNode, comment: SyntaxNode, properties: Partial): any; diff --git a/build/src/lang/typescript/visitors/node.visitor.js b/build/src/lang/typescript/visitors/node.visitor.js new file mode 100644 index 0000000..408a053 --- /dev/null +++ b/build/src/lang/typescript/visitors/node.visitor.js @@ -0,0 +1,32 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const class_visitor_1 = require("./class.visitor"); +const function_visitor_1 = require("./function.visitor"); +const log_1 = require("../../../utils/log"); +const declaration_visitor_1 = require("./declaration.visitor"); +const statement_visitor_1 = require("./statement.visitor"); +function visitNode(source, node, comment, properties) { + switch (node.type) { + case 'class': + return class_visitor_1.visitClass(source, node, comment, properties); + case 'function': + return function_visitor_1.visitFunction(source, node, comment, properties); + case 'comment': + // noop + break; + case 'ERROR': + log_1.default.report(source, node, log_1.ErrorType.TreeSitterParseError); + break; + default: + if (node.type.includes("statement")) { + return statement_visitor_1.visitStatement(source, node, comment, properties); + } + if (node.type.includes("declaration")) { + return declaration_visitor_1.visitDeclaration(source, node, comment, properties); + } + log_1.default.info(`${node.type.replace(/[_]/g, ' ')}' is not supported yet.`); + break; + } +} +exports.visitNode = visitNode; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS52aXNpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xhbmcvdHlwZXNjcmlwdC92aXNpdG9ycy9ub2RlLnZpc2l0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQSxtREFBNkM7QUFFN0MseURBQW1EO0FBQ25ELDRDQUFvRDtBQUVwRCwrREFBb0Y7QUFDcEYsMkRBQXFEO0FBR3JELFNBQWdCLFNBQVMsQ0FDdkIsTUFBYSxFQUNiLElBQWdCLEVBQ2hCLE9BQW1CLEVBQ25CLFVBQW1DO0lBRW5DLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRTtRQUNqQixLQUFLLE9BQU87WUFDVixPQUFPLDBCQUFVLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDdkQsS0FBSyxVQUFVO1lBQ2IsT0FBTyxnQ0FBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzFELEtBQUssU0FBUztZQUNaLE9BQU87WUFDUCxNQUFNO1FBQ1IsS0FBSyxPQUFPO1lBQ1YsYUFBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQ3pELE1BQU07UUFDUjtZQUNFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUU7Z0JBQ25DLE9BQU8sa0NBQWMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQzthQUMxRDtZQUVELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3JDLE9BQU8sc0NBQWdCLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7YUFDNUQ7WUFFRCxhQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1lBQ3JFLE1BQU07S0FDVDtBQUNILENBQUM7QUE3QkQsOEJBNkJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5pbXBvcnQgeyBOb2RlUHJvcGVydGllcyB9IGZyb20gXCIuLi9Ob2RlXCI7XHJcbmltcG9ydCB7IHZpc2l0Q2xhc3MgfSBmcm9tIFwiLi9jbGFzcy52aXNpdG9yXCI7XHJcbmltcG9ydCByYW5nZSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvcmFuZ2VcIjtcclxuaW1wb3J0IHsgdmlzaXRGdW5jdGlvbiB9IGZyb20gXCIuL2Z1bmN0aW9uLnZpc2l0b3JcIjtcclxuaW1wb3J0IGxvZywgeyBFcnJvclR5cGUgfSBmcm9tICcuLi8uLi8uLi91dGlscy9sb2cnO1xyXG5cclxuaW1wb3J0IHsgdmlzaXRJbnRlcmZhY2VEZWNsYXJhdGlvbiwgdmlzaXREZWNsYXJhdGlvbiB9IGZyb20gXCIuL2RlY2xhcmF0aW9uLnZpc2l0b3JcIjtcclxuaW1wb3J0IHsgdmlzaXRTdGF0ZW1lbnQgfSBmcm9tIFwiLi9zdGF0ZW1lbnQudmlzaXRvclwiO1xyXG5pbXBvcnQgSUZpbGUgZnJvbSBcIi4uLy4uLy4uL2ludGVyZmFjZXMvSUZpbGVcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB2aXNpdE5vZGUoXHJcbiAgc291cmNlOiBJRmlsZSxcclxuICBub2RlOiBTeW50YXhOb2RlLFxyXG4gIGNvbW1lbnQ6IFN5bnRheE5vZGUsXHJcbiAgcHJvcGVydGllczogUGFydGlhbDxOb2RlUHJvcGVydGllcz5cclxuKSB7XHJcbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcclxuICAgIGNhc2UgJ2NsYXNzJzpcclxuICAgICAgcmV0dXJuIHZpc2l0Q2xhc3Moc291cmNlLCBub2RlLCBjb21tZW50LCBwcm9wZXJ0aWVzKTtcclxuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcclxuICAgICAgcmV0dXJuIHZpc2l0RnVuY3Rpb24oc291cmNlLCBub2RlLCBjb21tZW50LCBwcm9wZXJ0aWVzKTtcclxuICAgIGNhc2UgJ2NvbW1lbnQnOlxyXG4gICAgICAvLyBub29wXHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSAnRVJST1InOlxyXG4gICAgICBsb2cucmVwb3J0KHNvdXJjZSwgbm9kZSwgRXJyb3JUeXBlLlRyZWVTaXR0ZXJQYXJzZUVycm9yKTtcclxuICAgICAgYnJlYWs7XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICBpZiAobm9kZS50eXBlLmluY2x1ZGVzKFwic3RhdGVtZW50XCIpKSB7XHJcbiAgICAgICAgcmV0dXJuIHZpc2l0U3RhdGVtZW50KHNvdXJjZSwgbm9kZSwgY29tbWVudCwgcHJvcGVydGllcyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChub2RlLnR5cGUuaW5jbHVkZXMoXCJkZWNsYXJhdGlvblwiKSkge1xyXG4gICAgICAgIHJldHVybiB2aXNpdERlY2xhcmF0aW9uKHNvdXJjZSwgbm9kZSwgY29tbWVudCwgcHJvcGVydGllcyk7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIGxvZy5pbmZvKGAke25vZGUudHlwZS5yZXBsYWNlKC9bX10vZywgJyAnKX0nIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LmApO1xyXG4gICAgICBicmVhaztcclxuICB9XHJcbn0iXX0= \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/program.visitor.d.ts b/build/src/lang/typescript/visitors/program.visitor.d.ts new file mode 100644 index 0000000..5f1fd91 --- /dev/null +++ b/build/src/lang/typescript/visitors/program.visitor.d.ts @@ -0,0 +1,3 @@ +import { SyntaxNode } from "tree-sitter"; +import IFile from "../../../interfaces/IFile"; +export declare function visitProgram(source: IFile, node: SyntaxNode): any[]; diff --git a/build/src/lang/typescript/visitors/program.visitor.js b/build/src/lang/typescript/visitors/program.visitor.js new file mode 100644 index 0000000..342035a --- /dev/null +++ b/build/src/lang/typescript/visitors/program.visitor.js @@ -0,0 +1,34 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const comment_1 = require("../../../utils/comment"); +const node_visitor_1 = require("./node.visitor"); +const match_1 = require("../../../utils/match"); +function visitProgram(source, node) { + let children = node.children; + if (node.children.length > 0) { + if (comment_1.isLegalComment(source, node.children[0])) { + // Remove the legal comment from ast + children = node.children.splice(1); + } + // Perf: O(n) + return children.map(child => { + const nextSibling = child.nextSibling; + // Determine if the node is a c-style comment + if (match_1.default(child, 'comment') && comment_1.isJavaDocComment(source, child)) { + // Determine whether a comment has a sibling + if (nextSibling) { + // Visit the sibling + // Perf: Possibly O(n^2) + return node_visitor_1.visitNode(source, nextSibling, child, { + exports: { + export: false, + default: false + } + }); + } + } + }).filter(child => !!child); + } +} +exports.visitProgram = visitProgram; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3JhbS52aXNpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xhbmcvdHlwZXNjcmlwdC92aXNpdG9ycy9wcm9ncmFtLnZpc2l0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxvREFBMEU7QUFFMUUsaURBQTJDO0FBRTNDLGdEQUF5QztBQUV6QyxTQUFnQixZQUFZLENBQUMsTUFBYSxFQUFFLElBQWdCO0lBQzFELElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDN0IsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDNUIsSUFBSSx3QkFBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDNUMsb0NBQW9DO1lBQ3BDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNwQztRQUNELGFBQWE7UUFDYixPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDMUIsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztZQUN0Qyw2Q0FBNkM7WUFDN0MsSUFBSSxlQUFLLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxJQUFJLDBCQUFnQixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRTtnQkFDOUQsNENBQTRDO2dCQUM1QyxJQUFJLFdBQVcsRUFBRTtvQkFDZixvQkFBb0I7b0JBQ3BCLHdCQUF3QjtvQkFDeEIsT0FBTyx3QkFBUyxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFO3dCQUMzQyxPQUFPLEVBQUU7NEJBQ1AsTUFBTSxFQUFFLEtBQUs7NEJBQ2IsT0FBTyxFQUFFLEtBQUs7eUJBQ2Y7cUJBQ0YsQ0FBQyxDQUFDO2lCQUNKO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDN0I7QUFDSCxDQUFDO0FBMUJELG9DQTBCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzSmF2YURvY0NvbW1lbnQsIGlzTGVnYWxDb21tZW50IH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2NvbW1lbnRcIjtcclxuaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5pbXBvcnQgeyB2aXNpdE5vZGUgfSBmcm9tIFwiLi9ub2RlLnZpc2l0b3JcIjtcclxuaW1wb3J0IElGaWxlIGZyb20gXCIuLi8uLi8uLi9pbnRlcmZhY2VzL0lGaWxlXCI7XHJcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbWF0Y2hcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB2aXNpdFByb2dyYW0oc291cmNlOiBJRmlsZSwgbm9kZTogU3ludGF4Tm9kZSkge1xyXG4gIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XHJcbiAgaWYgKG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xyXG4gICAgaWYgKGlzTGVnYWxDb21tZW50KHNvdXJjZSwgbm9kZS5jaGlsZHJlblswXSkpIHtcclxuICAgICAgLy8gUmVtb3ZlIHRoZSBsZWdhbCBjb21tZW50IGZyb20gYXN0XHJcbiAgICAgIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbi5zcGxpY2UoMSk7XHJcbiAgICB9XHJcbiAgICAvLyBQZXJmOiBPKG4pXHJcbiAgICByZXR1cm4gY2hpbGRyZW4ubWFwKGNoaWxkID0+IHtcclxuICAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSBjaGlsZC5uZXh0U2libGluZztcclxuICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBub2RlIGlzIGEgYy1zdHlsZSBjb21tZW50XHJcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ2NvbW1lbnQnKSAmJiBpc0phdmFEb2NDb21tZW50KHNvdXJjZSwgY2hpbGQpKSB7XHJcbiAgICAgICAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgYSBjb21tZW50IGhhcyBhIHNpYmxpbmdcclxuICAgICAgICBpZiAobmV4dFNpYmxpbmcpIHtcclxuICAgICAgICAgIC8vIFZpc2l0IHRoZSBzaWJsaW5nXHJcbiAgICAgICAgICAvLyBQZXJmOiBQb3NzaWJseSBPKG5eMilcclxuICAgICAgICAgIHJldHVybiB2aXNpdE5vZGUoc291cmNlLCBuZXh0U2libGluZywgY2hpbGQsIHtcclxuICAgICAgICAgICAgZXhwb3J0czoge1xyXG4gICAgICAgICAgICAgIGV4cG9ydDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgZGVmYXVsdDogZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KS5maWx0ZXIoY2hpbGQgPT4gISFjaGlsZCk7XHJcbiAgfVxyXG59Il19 \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/statement.visitor.d.ts b/build/src/lang/typescript/visitors/statement.visitor.d.ts new file mode 100644 index 0000000..0cc3db5 --- /dev/null +++ b/build/src/lang/typescript/visitors/statement.visitor.d.ts @@ -0,0 +1,6 @@ +import { SyntaxNode } from "tree-sitter"; +import { NodeProperties } from "../Node"; +import IFile from "../../../interfaces/IFile"; +export declare function visitStatement(source: IFile, node: SyntaxNode, comment: SyntaxNode, properties: Partial): any; +export declare function visitExpressionStatement(source: IFile, node: SyntaxNode, comment: SyntaxNode, properties: Partial): any; +export declare function visitExportStatement(source: IFile, node: SyntaxNode, comment: SyntaxNode): any; diff --git a/build/src/lang/typescript/visitors/statement.visitor.js b/build/src/lang/typescript/visitors/statement.visitor.js new file mode 100644 index 0000000..a8bebc6 --- /dev/null +++ b/build/src/lang/typescript/visitors/statement.visitor.js @@ -0,0 +1,37 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const node_visitor_1 = require("./node.visitor"); +const match_1 = require("../../../utils/match"); +const log_1 = require("../../../utils/log"); +function visitStatement(source, node, comment, properties) { + switch (node.type) { + case 'expression_statement': + return visitExpressionStatement(source, node, comment, properties); + case 'export_statement': + return visitExportStatement(source, node, comment); + default: + log_1.default.report(source, node, log_1.ErrorType.NodeTypeNotSupported); + break; + } +} +exports.visitStatement = visitStatement; +function visitExpressionStatement(source, node, comment, properties) { + return node_visitor_1.visitNode(source, node.children.shift(), comment, properties); +} +exports.visitExpressionStatement = visitExpressionStatement; +function visitExportStatement(source, node, comment) { + let children = node.children, isDefaultExport = false; + if (children.length > 1 && match_1.default(children.shift(), 'export')) { + } + if (children.length > 1 && match_1.default(children.shift(), 'default')) { + isDefaultExport = true; + } + return node_visitor_1.visitNode(source, children.shift(), comment, { + exports: { + export: true, + default: isDefaultExport + } + }); +} +exports.visitExportStatement = visitExportStatement; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGVtZW50LnZpc2l0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGFuZy90eXBlc2NyaXB0L3Zpc2l0b3JzL3N0YXRlbWVudC52aXNpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsaURBQTJDO0FBQzNDLGdEQUF5QztBQUV6Qyw0Q0FBb0Q7QUFHcEQsU0FBZ0IsY0FBYyxDQUM1QixNQUFhLEVBQ2IsSUFBZ0IsRUFDaEIsT0FBbUIsRUFDbkIsVUFBbUM7SUFFbkMsUUFBTyxJQUFJLENBQUMsSUFBSSxFQUFFO1FBQ2hCLEtBQUssc0JBQXNCO1lBQ3pCLE9BQU8sd0JBQXdCLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDckUsS0FBSyxrQkFBa0I7WUFDckIsT0FBTyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3JEO1lBQ0UsYUFBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQ3pELE1BQU07S0FDVDtBQUNILENBQUM7QUFmRCx3Q0FlQztBQUVELFNBQWdCLHdCQUF3QixDQUN0QyxNQUFhLEVBQ2IsSUFBZ0IsRUFDaEIsT0FBbUIsRUFDbkIsVUFBbUM7SUFFbkMsT0FBTyx3QkFBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBUEQsNERBT0M7QUFFRCxTQUFnQixvQkFBb0IsQ0FDbEMsTUFBYSxFQUNiLElBQWdCLEVBQ2hCLE9BQW1CO0lBRW5CLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQzFCLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFFMUIsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxlQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFO0tBQzdEO0lBRUQsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxlQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLFNBQVMsQ0FBQyxFQUFFO1FBQzdELGVBQWUsR0FBRyxJQUFJLENBQUM7S0FDeEI7SUFDRCxPQUFPLHdCQUFTLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUU7UUFDbEQsT0FBTyxFQUFFO1lBQ1AsTUFBTSxFQUFFLElBQUk7WUFDWixPQUFPLEVBQUUsZUFBZTtTQUN6QjtLQUNGLENBQUMsQ0FBQztBQUNMLENBQUM7QUFwQkQsb0RBb0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5pbXBvcnQgeyB2aXNpdE5vZGUgfSBmcm9tIFwiLi9ub2RlLnZpc2l0b3JcIjtcclxuaW1wb3J0IG1hdGNoIGZyb20gXCIuLi8uLi8uLi91dGlscy9tYXRjaFwiO1xyXG5pbXBvcnQgeyBOb2RlUHJvcGVydGllcyB9IGZyb20gXCIuLi9Ob2RlXCI7XHJcbmltcG9ydCBsb2csIHsgRXJyb3JUeXBlIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2xvZ1wiO1xyXG5pbXBvcnQgSUZpbGUgZnJvbSBcIi4uLy4uLy4uL2ludGVyZmFjZXMvSUZpbGVcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB2aXNpdFN0YXRlbWVudChcclxuICBzb3VyY2U6IElGaWxlLFxyXG4gIG5vZGU6IFN5bnRheE5vZGUsXHJcbiAgY29tbWVudDogU3ludGF4Tm9kZSxcclxuICBwcm9wZXJ0aWVzOiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPlxyXG4pIHtcclxuICBzd2l0Y2gobm9kZS50eXBlKSB7XHJcbiAgICBjYXNlICdleHByZXNzaW9uX3N0YXRlbWVudCc6XHJcbiAgICAgIHJldHVybiB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQoc291cmNlLCBub2RlLCBjb21tZW50LCBwcm9wZXJ0aWVzKTtcclxuICAgIGNhc2UgJ2V4cG9ydF9zdGF0ZW1lbnQnOlxyXG4gICAgICByZXR1cm4gdmlzaXRFeHBvcnRTdGF0ZW1lbnQoc291cmNlLCBub2RlLCBjb21tZW50KTtcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIGxvZy5yZXBvcnQoc291cmNlLCBub2RlLCBFcnJvclR5cGUuTm9kZVR5cGVOb3RTdXBwb3J0ZWQpO1xyXG4gICAgICBicmVhaztcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQoXHJcbiAgc291cmNlOiBJRmlsZSxcclxuICBub2RlOiBTeW50YXhOb2RlLFxyXG4gIGNvbW1lbnQ6IFN5bnRheE5vZGUsXHJcbiAgcHJvcGVydGllczogUGFydGlhbDxOb2RlUHJvcGVydGllcz5cclxuKSB7XHJcbiAgcmV0dXJuIHZpc2l0Tm9kZShzb3VyY2UsIG5vZGUuY2hpbGRyZW4uc2hpZnQoKSwgY29tbWVudCwgcHJvcGVydGllcyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB2aXNpdEV4cG9ydFN0YXRlbWVudChcclxuICBzb3VyY2U6IElGaWxlLFxyXG4gIG5vZGU6IFN5bnRheE5vZGUsXHJcbiAgY29tbWVudDogU3ludGF4Tm9kZSxcclxuKSB7XHJcbiAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbixcclxuICAgIGlzRGVmYXVsdEV4cG9ydCA9IGZhbHNlO1xyXG5cclxuICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMSAmJiBtYXRjaChjaGlsZHJlbi5zaGlmdCgpLCAnZXhwb3J0JykpIHtcclxuICB9XHJcblxyXG4gIGlmIChjaGlsZHJlbi5sZW5ndGggPiAxICYmIG1hdGNoKGNoaWxkcmVuLnNoaWZ0KCksICdkZWZhdWx0JykpIHtcclxuICAgIGlzRGVmYXVsdEV4cG9ydCA9IHRydWU7XHJcbiAgfVxyXG4gIHJldHVybiB2aXNpdE5vZGUoc291cmNlLCBjaGlsZHJlbi5zaGlmdCgpLCBjb21tZW50LCB7XHJcbiAgICBleHBvcnRzOiB7XHJcbiAgICAgIGV4cG9ydDogdHJ1ZSxcclxuICAgICAgZGVmYXVsdDogaXNEZWZhdWx0RXhwb3J0XHJcbiAgICB9XHJcbiAgfSk7XHJcbn0iXX0= \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/type.visitor.d.ts b/build/src/lang/typescript/visitors/type.visitor.d.ts new file mode 100644 index 0000000..f0cde52 --- /dev/null +++ b/build/src/lang/typescript/visitors/type.visitor.d.ts @@ -0,0 +1,25 @@ +import { SyntaxNode } from "tree-sitter"; +import IFile from "../../../interfaces/IFile"; +export declare function visitTypeOrTypeIdentifier(source: IFile, node: SyntaxNode): any; +export declare function visitType(source: IFile, node: SyntaxNode): any; +export declare function visitTypeIdentifier(source: IFile, node: SyntaxNode): { + type: string; + context: import("../Node").Node; +}; +export declare function visitUnionType(source: IFile, node: SyntaxNode): any; +export declare function visitIntersectionType(source: IFile, node: SyntaxNode): { + type: string; + context: import("../Node").Node; + left: any; + right: any; +}; +export declare function visitParenthesizedType(source: IFile, node: SyntaxNode): { + type: string; + context: import("../Node").Node; + parenthesized: any; +}; +export declare function visitGenericType(source: IFile, node: SyntaxNode): any; +export declare function visitPredefinedType(source: IFile, node: SyntaxNode): { + type: string; + context: import("../Node").Node; +}; diff --git a/build/src/lang/typescript/visitors/type.visitor.js b/build/src/lang/typescript/visitors/type.visitor.js new file mode 100644 index 0000000..c91686c --- /dev/null +++ b/build/src/lang/typescript/visitors/type.visitor.js @@ -0,0 +1,84 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const Node_1 = require("../Node"); +const type_arguments_visitor_1 = require("./type_arguments.visitor"); +function visitTypeOrTypeIdentifier(source, node) { + if (node.type === 'type_identifier') { + return visitTypeIdentifier(source, node); + } + return visitType(source, node); +} +exports.visitTypeOrTypeIdentifier = visitTypeOrTypeIdentifier; +function visitType(source, node) { + switch (node.type) { + case 'union_type': + return visitUnionType(source, node); + case 'intersection_type': + return visitIntersectionType(source, node); + case 'parenthesized_type': + return visitParenthesizedType(source, node); + case 'type_identifier': + return visitTypeIdentifier(source, node); + case 'generic_type': + return visitGenericType(source, node); + case 'predefined_type': + return visitPredefinedType(source, node); + default: + console.log(`[mr-doc::parser]: info - '${node.type.replace(/[_]/g, ' ')}' is not supported yet.`); + break; + } +} +exports.visitType = visitType; +function visitTypeIdentifier(source, node) { + return { + type: node.type, + context: Node_1.createNode(source, node) + }; +} +exports.visitTypeIdentifier = visitTypeIdentifier; +function visitUnionType(source, node) { + const union = node.children; + return { + type: node.type, + context: Node_1.createNode(source, node), + left: visitTypeOrTypeIdentifier(source, union[0]), + right: visitTypeOrTypeIdentifier(source, union[2]) + }; +} +exports.visitUnionType = visitUnionType; +function visitIntersectionType(source, node) { + const intersect = node.children; + return { + type: node.type, + context: Node_1.createNode(source, node), + left: visitTypeOrTypeIdentifier(source, intersect[0]), + right: visitTypeOrTypeIdentifier(source, intersect[2]) + }; +} +exports.visitIntersectionType = visitIntersectionType; +function visitParenthesizedType(source, node) { + return { + type: node.type, + context: Node_1.createNode(source, node), + parenthesized: visitTypeOrTypeIdentifier(source, node.children[1]) + }; +} +exports.visitParenthesizedType = visitParenthesizedType; +function visitGenericType(source, node) { + let children = node.children; + return { + type: node.type, + context: Node_1.createNode(source, node), + generic: visitTypeIdentifier(source, children.shift()), + type_arguments: type_arguments_visitor_1.visitTypeArguments(source, children.shift()) + }; +} +exports.visitGenericType = visitGenericType; +function visitPredefinedType(source, node) { + return { + type: node.type, + context: Node_1.createNode(source, node.children.shift()), + }; +} +exports.visitPredefinedType = visitPredefinedType; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS52aXNpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xhbmcvdHlwZXNjcmlwdC92aXNpdG9ycy90eXBlLnZpc2l0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSxrQ0FBcUM7QUFDckMscUVBQThEO0FBRzlELFNBQWdCLHlCQUF5QixDQUFDLE1BQWEsRUFBRSxJQUFnQjtJQUN2RSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssaUJBQWlCLEVBQUU7UUFDbkMsT0FBTyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUE7S0FDekM7SUFDRCxPQUFPLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUxELDhEQUtDO0FBRUQsU0FBZ0IsU0FBUyxDQUFDLE1BQWEsRUFBRSxJQUFnQjtJQUN2RCxRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUU7UUFDakIsS0FBSyxZQUFZO1lBQ2YsT0FBTyxjQUFjLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3RDLEtBQUssbUJBQW1CO1lBQ3RCLE9BQU8scUJBQXFCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdDLEtBQUssb0JBQW9CO1lBQ3ZCLE9BQU8sc0JBQXNCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzlDLEtBQUssaUJBQWlCO1lBQ3BCLE9BQU8sbUJBQW1CLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNDLEtBQUssY0FBYztZQUNqQixPQUFPLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN4QyxLQUFLLGlCQUFpQjtZQUNwQixPQUFPLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMzQztZQUNBLE9BQU8sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMseUJBQXlCLENBQUMsQ0FBQztZQUNsRyxNQUFNO0tBQ1A7QUFDSCxDQUFDO0FBbEJELDhCQWtCQztBQUVELFNBQWdCLG1CQUFtQixDQUFDLE1BQWEsRUFBRSxJQUFnQjtJQUNqRSxPQUFPO1FBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1FBQ2YsT0FBTyxFQUFFLGlCQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztLQUNsQyxDQUFBO0FBQ0gsQ0FBQztBQUxELGtEQUtDO0FBRUQsU0FBZ0IsY0FBYyxDQUFDLE1BQWEsRUFBRSxJQUFnQjtJQUM1RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQzVCLE9BQU87UUFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7UUFDZixPQUFPLEVBQUUsaUJBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDO1FBQ2pDLElBQUksRUFBRSx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pELEtBQUssRUFBRSx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ25ELENBQUE7QUFDSCxDQUFDO0FBUkQsd0NBUUM7QUFFRCxTQUFnQixxQkFBcUIsQ0FBQyxNQUFhLEVBQUUsSUFBZ0I7SUFDbkUsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUNoQyxPQUFPO1FBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1FBQ2YsT0FBTyxFQUFFLGlCQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztRQUNqQyxJQUFJLEVBQUUseUJBQXlCLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRCxLQUFLLEVBQUUseUJBQXlCLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN2RCxDQUFBO0FBQ0gsQ0FBQztBQVJELHNEQVFDO0FBRUQsU0FBZ0Isc0JBQXNCLENBQUMsTUFBYSxFQUFFLElBQWdCO0lBQ3BFLE9BQU87UUFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7UUFDZixPQUFPLEVBQUUsaUJBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDO1FBQ2pDLGFBQWEsRUFBRSx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNuRSxDQUFBO0FBQ0gsQ0FBQztBQU5ELHdEQU1DO0FBRUQsU0FBZ0IsZ0JBQWdCLENBQUMsTUFBYSxFQUFFLElBQWdCO0lBQzlELElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDN0IsT0FBTztRQUNMLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtRQUNmLE9BQU8sRUFBRSxpQkFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7UUFDakMsT0FBTyxFQUFFLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEQsY0FBYyxFQUFFLDJDQUFrQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7S0FDN0QsQ0FBQTtBQUNILENBQUM7QUFSRCw0Q0FRQztBQUVELFNBQWdCLG1CQUFtQixDQUFDLE1BQWEsRUFBRSxJQUFnQjtJQUNqRSxPQUFPO1FBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1FBQ2YsT0FBTyxFQUFFLGlCQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7S0FDbkQsQ0FBQTtBQUNILENBQUM7QUFMRCxrREFLQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcclxuaW1wb3J0IHsgY3JlYXRlTm9kZSB9IGZyb20gXCIuLi9Ob2RlXCI7XHJcbmltcG9ydCB7IHZpc2l0VHlwZUFyZ3VtZW50cyB9IGZyb20gXCIuL3R5cGVfYXJndW1lbnRzLnZpc2l0b3JcIjtcclxuaW1wb3J0IElGaWxlIGZyb20gXCIuLi8uLi8uLi9pbnRlcmZhY2VzL0lGaWxlXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRUeXBlT3JUeXBlSWRlbnRpZmllcihzb3VyY2U6IElGaWxlLCBub2RlOiBTeW50YXhOb2RlKSB7XHJcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ3R5cGVfaWRlbnRpZmllcicpIHtcclxuICAgIHJldHVybiB2aXNpdFR5cGVJZGVudGlmaWVyKHNvdXJjZSwgbm9kZSlcclxuICB9XHJcbiAgcmV0dXJuIHZpc2l0VHlwZShzb3VyY2UsIG5vZGUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRUeXBlKHNvdXJjZTogSUZpbGUsIG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xyXG4gICAgY2FzZSAndW5pb25fdHlwZSc6XHJcbiAgICAgIHJldHVybiB2aXNpdFVuaW9uVHlwZShzb3VyY2UsIG5vZGUpO1xyXG4gICAgY2FzZSAnaW50ZXJzZWN0aW9uX3R5cGUnOlxyXG4gICAgICByZXR1cm4gdmlzaXRJbnRlcnNlY3Rpb25UeXBlKHNvdXJjZSwgbm9kZSk7XHJcbiAgICBjYXNlICdwYXJlbnRoZXNpemVkX3R5cGUnOlxyXG4gICAgICByZXR1cm4gdmlzaXRQYXJlbnRoZXNpemVkVHlwZShzb3VyY2UsIG5vZGUpO1xyXG4gICAgY2FzZSAndHlwZV9pZGVudGlmaWVyJzpcclxuICAgICAgcmV0dXJuIHZpc2l0VHlwZUlkZW50aWZpZXIoc291cmNlLCBub2RlKTtcclxuICAgIGNhc2UgJ2dlbmVyaWNfdHlwZSc6XHJcbiAgICAgIHJldHVybiB2aXNpdEdlbmVyaWNUeXBlKHNvdXJjZSwgbm9kZSk7XHJcbiAgICBjYXNlICdwcmVkZWZpbmVkX3R5cGUnOlxyXG4gICAgICByZXR1cm4gdmlzaXRQcmVkZWZpbmVkVHlwZShzb3VyY2UsIG5vZGUpO1xyXG4gICAgZGVmYXVsdDpcclxuICAgIGNvbnNvbGUubG9nKGBbbXItZG9jOjpwYXJzZXJdOiBpbmZvIC0gJyR7bm9kZS50eXBlLnJlcGxhY2UoL1tfXS9nLCAnICcpfScgaXMgbm90IHN1cHBvcnRlZCB5ZXQuYCk7XHJcbiAgICBicmVhaztcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB2aXNpdFR5cGVJZGVudGlmaWVyKHNvdXJjZTogSUZpbGUsIG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICByZXR1cm4ge1xyXG4gICAgdHlwZTogbm9kZS50eXBlLFxyXG4gICAgY29udGV4dDogY3JlYXRlTm9kZShzb3VyY2UsIG5vZGUpXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRVbmlvblR5cGUoc291cmNlOiBJRmlsZSwgbm9kZTogU3ludGF4Tm9kZSkge1xyXG4gIGNvbnN0IHVuaW9uID0gbm9kZS5jaGlsZHJlbjtcclxuICByZXR1cm4ge1xyXG4gICAgdHlwZTogbm9kZS50eXBlLFxyXG4gICAgY29udGV4dDogY3JlYXRlTm9kZShzb3VyY2UsIG5vZGUpLFxyXG4gICAgbGVmdDogdmlzaXRUeXBlT3JUeXBlSWRlbnRpZmllcihzb3VyY2UsIHVuaW9uWzBdKSxcclxuICAgIHJpZ2h0OiB2aXNpdFR5cGVPclR5cGVJZGVudGlmaWVyKHNvdXJjZSwgdW5pb25bMl0pXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRJbnRlcnNlY3Rpb25UeXBlKHNvdXJjZTogSUZpbGUsIG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICBjb25zdCBpbnRlcnNlY3QgPSBub2RlLmNoaWxkcmVuO1xyXG4gIHJldHVybiB7XHJcbiAgICB0eXBlOiBub2RlLnR5cGUsXHJcbiAgICBjb250ZXh0OiBjcmVhdGVOb2RlKHNvdXJjZSwgbm9kZSksXHJcbiAgICBsZWZ0OiB2aXNpdFR5cGVPclR5cGVJZGVudGlmaWVyKHNvdXJjZSwgaW50ZXJzZWN0WzBdKSxcclxuICAgIHJpZ2h0OiB2aXNpdFR5cGVPclR5cGVJZGVudGlmaWVyKHNvdXJjZSwgaW50ZXJzZWN0WzJdKVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHZpc2l0UGFyZW50aGVzaXplZFR5cGUoc291cmNlOiBJRmlsZSwgbm9kZTogU3ludGF4Tm9kZSkge1xyXG4gIHJldHVybiB7XHJcbiAgICB0eXBlOiBub2RlLnR5cGUsXHJcbiAgICBjb250ZXh0OiBjcmVhdGVOb2RlKHNvdXJjZSwgbm9kZSksXHJcbiAgICBwYXJlbnRoZXNpemVkOiB2aXNpdFR5cGVPclR5cGVJZGVudGlmaWVyKHNvdXJjZSwgbm9kZS5jaGlsZHJlblsxXSlcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB2aXNpdEdlbmVyaWNUeXBlKHNvdXJjZTogSUZpbGUsIG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xyXG4gIHJldHVybiB7XHJcbiAgICB0eXBlOiBub2RlLnR5cGUsXHJcbiAgICBjb250ZXh0OiBjcmVhdGVOb2RlKHNvdXJjZSwgbm9kZSksXHJcbiAgICBnZW5lcmljOiB2aXNpdFR5cGVJZGVudGlmaWVyKHNvdXJjZSwgY2hpbGRyZW4uc2hpZnQoKSksXHJcbiAgICB0eXBlX2FyZ3VtZW50czogdmlzaXRUeXBlQXJndW1lbnRzKHNvdXJjZSwgY2hpbGRyZW4uc2hpZnQoKSlcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB2aXNpdFByZWRlZmluZWRUeXBlKHNvdXJjZTogSUZpbGUsIG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICByZXR1cm4ge1xyXG4gICAgdHlwZTogbm9kZS50eXBlLFxyXG4gICAgY29udGV4dDogY3JlYXRlTm9kZShzb3VyY2UsIG5vZGUuY2hpbGRyZW4uc2hpZnQoKSksXHJcbiAgfVxyXG59Il19 \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/type_arguments.visitor.d.ts b/build/src/lang/typescript/visitors/type_arguments.visitor.d.ts new file mode 100644 index 0000000..3e93754 --- /dev/null +++ b/build/src/lang/typescript/visitors/type_arguments.visitor.d.ts @@ -0,0 +1,3 @@ +import { SyntaxNode } from "tree-sitter"; +import IFile from "../../../interfaces/IFile"; +export declare function visitTypeArguments(source: IFile, node: SyntaxNode): any; diff --git a/build/src/lang/typescript/visitors/type_arguments.visitor.js b/build/src/lang/typescript/visitors/type_arguments.visitor.js new file mode 100644 index 0000000..35514f6 --- /dev/null +++ b/build/src/lang/typescript/visitors/type_arguments.visitor.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const type_visitor_1 = require("./type.visitor"); +function visitTypeArguments(source, node) { + return node.children + .filter(child => !child.type.match(/[<>,]/)) + .map(child => type_visitor_1.visitType(source, child)); +} +exports.visitTypeArguments = visitTypeArguments; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZV9hcmd1bWVudHMudmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvdHlwZV9hcmd1bWVudHMudmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLGlEQUEyQztBQUczQyxTQUFnQixrQkFBa0IsQ0FBQyxNQUFhLEVBQUUsSUFBZ0I7SUFDOUQsT0FBTyxJQUFJLENBQUMsUUFBUTtTQUNuQixNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzNDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLHdCQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7QUFDM0MsQ0FBQztBQUpELGdEQUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5pbXBvcnQgeyB2aXNpdFR5cGUgfSBmcm9tIFwiLi90eXBlLnZpc2l0b3JcIjtcclxuaW1wb3J0IElGaWxlIGZyb20gXCIuLi8uLi8uLi9pbnRlcmZhY2VzL0lGaWxlXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRUeXBlQXJndW1lbnRzKHNvdXJjZTogSUZpbGUsIG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICAgIHJldHVybiBub2RlLmNoaWxkcmVuXHJcbiAgICAuZmlsdGVyKGNoaWxkID0+ICFjaGlsZC50eXBlLm1hdGNoKC9bPD4sXS8pKVxyXG4gICAgLm1hcChjaGlsZCA9PiB2aXNpdFR5cGUoc291cmNlLCBjaGlsZCkpXHJcbn0iXX0= \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/type_parameters.visitor.d.ts b/build/src/lang/typescript/visitors/type_parameters.visitor.d.ts new file mode 100644 index 0000000..32be942 --- /dev/null +++ b/build/src/lang/typescript/visitors/type_parameters.visitor.d.ts @@ -0,0 +1,10 @@ +import { SyntaxNode } from "tree-sitter"; +import IFile from "../../../interfaces/IFile"; +export default function visitTypeParameters(source: IFile, node: SyntaxNode): { + type: string; + context: import("../Node").Node; + parameters: { + type: string; + context: import("../Node").Node; + }[]; +}; diff --git a/build/src/lang/typescript/visitors/type_parameters.visitor.js b/build/src/lang/typescript/visitors/type_parameters.visitor.js new file mode 100644 index 0000000..8f16626 --- /dev/null +++ b/build/src/lang/typescript/visitors/type_parameters.visitor.js @@ -0,0 +1,14 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const Node_1 = require("../Node"); +function visitTypeParameters(source, node) { + return { + type: node.type, + context: Node_1.createNode(source, node), + parameters: node.children + .filter(child => !child.type.match(/[<>,]/)) + .map(child => ({ type: child.type, context: Node_1.createNode(source, child) })) + }; +} +exports.default = visitTypeParameters; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZV9wYXJhbWV0ZXJzLnZpc2l0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGFuZy90eXBlc2NyaXB0L3Zpc2l0b3JzL3R5cGVfcGFyYW1ldGVycy52aXNpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0Esa0NBQXFDO0FBR3JDLFNBQXdCLG1CQUFtQixDQUFDLE1BQWEsRUFBRSxJQUFnQjtJQUN6RSxPQUFPO1FBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1FBQ2YsT0FBTyxFQUFFLGlCQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztRQUNqQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVE7YUFDdEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUMzQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLGlCQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUM1RSxDQUFBO0FBQ0gsQ0FBQztBQVJELHNDQVFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5pbXBvcnQgeyBjcmVhdGVOb2RlIH0gZnJvbSBcIi4uL05vZGVcIjtcclxuaW1wb3J0IElGaWxlIGZyb20gXCIuLi8uLi8uLi9pbnRlcmZhY2VzL0lGaWxlXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2aXNpdFR5cGVQYXJhbWV0ZXJzKHNvdXJjZTogSUZpbGUsIG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICByZXR1cm4ge1xyXG4gICAgdHlwZTogbm9kZS50eXBlLFxyXG4gICAgY29udGV4dDogY3JlYXRlTm9kZShzb3VyY2UsIG5vZGUpLFxyXG4gICAgcGFyYW1ldGVyczogbm9kZS5jaGlsZHJlblxyXG4gICAgICAuZmlsdGVyKGNoaWxkID0+ICFjaGlsZC50eXBlLm1hdGNoKC9bPD4sXS8pKVxyXG4gICAgICAubWFwKGNoaWxkID0+ICh7IHR5cGU6IGNoaWxkLnR5cGUsIGNvbnRleHQ6IGNyZWF0ZU5vZGUoc291cmNlLCBjaGlsZCkgfSkpXHJcbiAgfVxyXG59Il19 \ No newline at end of file diff --git a/build/src/utils/comment.d.ts b/build/src/utils/comment.d.ts new file mode 100644 index 0000000..0dc586e --- /dev/null +++ b/build/src/utils/comment.d.ts @@ -0,0 +1,8 @@ +import { SyntaxNode } from "tree-sitter"; +import IFile from "../interfaces/IFile"; +export declare const XDocRegex: RegExp; +export declare function isLegalComment(source: IFile, node: SyntaxNode): boolean; +export declare function isJavaDocComment(source: IFile, node: SyntaxNode): boolean; +export declare function isXDocComment(source: string, node?: SyntaxNode): boolean; +export declare function isXDocCommentBlock(source: string, node: SyntaxNode): boolean; +export declare function isXDocCommentFragment(source: string, node: SyntaxNode): boolean; diff --git a/build/src/utils/comment.js b/build/src/utils/comment.js new file mode 100644 index 0000000..96c256f --- /dev/null +++ b/build/src/utils/comment.js @@ -0,0 +1,42 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const match_1 = require("./match"); +exports.XDocRegex = /@(\w+)([^{[(\n]*)?([\{\[\(][\s\S]*[\}\]\)]([\s]*(=|-)>.*)?)?([\s]*-(.)*)?/gmi; +function isLegalComment(source, node) { + const possibleTexts = [ + 'copyright', + 'terms and conditions', + 'license', + 'all rights reserved' + ]; + if (match_1.default(node, 'comment')) { + return possibleTexts.map(text => source.text + .substring(node.startIndex, node.endIndex) + .toLowerCase() + .includes(text)).includes(true); + } +} +exports.isLegalComment = isLegalComment; +function isJavaDocComment(source, node) { + const comment = source.text.substring(node.startIndex, node.endIndex); + // regexr.com/3ejvb + return /(\/\*\*)((\s*)(.*?)(\s))*(\*\/)/.test(comment); +} +exports.isJavaDocComment = isJavaDocComment; +function isXDocComment(source, node) { + let comment = source; + if (node) + comment = source.substring(node.startIndex, node.endIndex); + return exports.XDocRegex.test(comment); +} +exports.isXDocComment = isXDocComment; +function isXDocCommentBlock(source, node) { + const comment = source.substring(node.startIndex, node.endIndex); + return /#API/.test(comment) || /\`\`\`xdoc/.test(comment); +} +exports.isXDocCommentBlock = isXDocCommentBlock; +function isXDocCommentFragment(source, node) { + return !isXDocCommentBlock(source, node) && isXDocComment(source, node); +} +exports.isXDocCommentFragment = isXDocCommentFragment; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9jb21tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsbUNBQTRCO0FBR2YsUUFBQSxTQUFTLEdBQUcsOEVBQThFLENBQUM7QUFFeEcsU0FBZ0IsY0FBYyxDQUFFLE1BQWEsRUFBRSxJQUFnQjtJQUM3RCxNQUFNLGFBQWEsR0FBRztRQUNwQixXQUFXO1FBQ1gsc0JBQXNCO1FBQ3RCLFNBQVM7UUFDVCxxQkFBcUI7S0FDdEIsQ0FBQztJQUNGLElBQUksZUFBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRTtRQUMxQixPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDOUIsTUFBTSxDQUFDLElBQUk7YUFDUixTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQ3pDLFdBQVcsRUFBRTthQUNiLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FDbEIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDbEI7QUFDSCxDQUFDO0FBZkQsd0NBZUM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBQyxNQUFhLEVBQUUsSUFBZ0I7SUFDOUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEUsbUJBQW1CO0lBQ25CLE9BQU8saUNBQWlDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQ3hELENBQUM7QUFKRCw0Q0FJQztBQUVELFNBQWdCLGFBQWEsQ0FBQyxNQUFhLEVBQUUsSUFBaUI7SUFDNUQsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQ3JCLElBQUksSUFBSTtRQUFFLE9BQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JFLE9BQU8saUJBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUpELHNDQUlDO0FBRUQsU0FBZ0Isa0JBQWtCLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQ2pFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDM0QsQ0FBQztBQUhELGdEQUdDO0FBRUQsU0FBZ0IscUJBQXFCLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQ3BFLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRkQsc0RBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XHJcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi9tYXRjaFwiO1xyXG5pbXBvcnQgSUZpbGUgZnJvbSBcIi4uL2ludGVyZmFjZXMvSUZpbGVcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBYRG9jUmVnZXggPSAvQChcXHcrKShbXntbKFxcbl0qKT8oW1xce1xcW1xcKF1bXFxzXFxTXSpbXFx9XFxdXFwpXShbXFxzXSooPXwtKT4uKik/KT8oW1xcc10qLSguKSopPy9nbWk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNMZWdhbENvbW1lbnQgKHNvdXJjZTogSUZpbGUsIG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICBjb25zdCBwb3NzaWJsZVRleHRzID0gW1xyXG4gICAgJ2NvcHlyaWdodCcsXHJcbiAgICAndGVybXMgYW5kIGNvbmRpdGlvbnMnLFxyXG4gICAgJ2xpY2Vuc2UnLFxyXG4gICAgJ2FsbCByaWdodHMgcmVzZXJ2ZWQnXHJcbiAgXTtcclxuICBpZiAobWF0Y2gobm9kZSwgJ2NvbW1lbnQnKSkge1xyXG4gICAgcmV0dXJuIHBvc3NpYmxlVGV4dHMubWFwKHRleHQgPT5cclxuICAgICAgc291cmNlLnRleHRcclxuICAgICAgICAuc3Vic3RyaW5nKG5vZGUuc3RhcnRJbmRleCwgbm9kZS5lbmRJbmRleClcclxuICAgICAgICAudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgIC5pbmNsdWRlcyh0ZXh0KVxyXG4gICAgKS5pbmNsdWRlcyh0cnVlKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0phdmFEb2NDb21tZW50KHNvdXJjZTogSUZpbGUsIG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICBjb25zdCBjb21tZW50ID0gc291cmNlLnRleHQuc3Vic3RyaW5nKG5vZGUuc3RhcnRJbmRleCwgbm9kZS5lbmRJbmRleCk7XHJcbiAgLy8gcmVnZXhyLmNvbS8zZWp2YlxyXG4gIHJldHVybiAvKFxcL1xcKlxcKikoKFxccyopKC4qPykoXFxzKSkqKFxcKlxcLykvLnRlc3QoY29tbWVudClcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzWERvY0NvbW1lbnQoc291cmNlOnN0cmluZywgbm9kZT86IFN5bnRheE5vZGUpIHtcclxuICBsZXQgY29tbWVudCA9IHNvdXJjZTtcclxuICBpZiAobm9kZSkgY29tbWVudCA9IHNvdXJjZS5zdWJzdHJpbmcobm9kZS5zdGFydEluZGV4LCBub2RlLmVuZEluZGV4KTtcclxuICByZXR1cm4gWERvY1JlZ2V4LnRlc3QoY29tbWVudCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1hEb2NDb21tZW50QmxvY2soc291cmNlOiBzdHJpbmcsIG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICBjb25zdCBjb21tZW50ID0gc291cmNlLnN1YnN0cmluZyhub2RlLnN0YXJ0SW5kZXgsIG5vZGUuZW5kSW5kZXgpO1xyXG4gIHJldHVybiAvI0FQSS8udGVzdChjb21tZW50KSB8fCAvXFxgXFxgXFxgeGRvYy8udGVzdChjb21tZW50KVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNYRG9jQ29tbWVudEZyYWdtZW50KHNvdXJjZTogc3RyaW5nLCBub2RlOiBTeW50YXhOb2RlKSB7XHJcbiAgcmV0dXJuICFpc1hEb2NDb21tZW50QmxvY2soc291cmNlLCBub2RlKSAmJiBpc1hEb2NDb21tZW50KHNvdXJjZSwgbm9kZSk7XHJcbn0iXX0= \ No newline at end of file diff --git a/build/src/utils/log.d.ts b/build/src/utils/log.d.ts new file mode 100644 index 0000000..3733072 --- /dev/null +++ b/build/src/utils/log.d.ts @@ -0,0 +1,12 @@ +import { Log } from 'mr-doc-utils'; +import IFile from '../interfaces/IFile'; +import { SyntaxNode } from 'tree-sitter'; +export declare enum ErrorType { + NodeTypeNotSupported = 0, + TreeSitterParseError = 1 +} +export declare class ParserLog extends Log { + report: (source: IFile, node: SyntaxNode, error: ErrorType) => void; +} +declare const log: ParserLog; +export default log; diff --git a/build/src/utils/log.js b/build/src/utils/log.js new file mode 100644 index 0000000..609b4d5 --- /dev/null +++ b/build/src/utils/log.js @@ -0,0 +1,31 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const mr_doc_utils_1 = require("mr-doc-utils"); +const range_1 = require("./range"); +var ErrorType; +(function (ErrorType) { + ErrorType[ErrorType["NodeTypeNotSupported"] = 0] = "NodeTypeNotSupported"; + ErrorType[ErrorType["TreeSitterParseError"] = 1] = "TreeSitterParseError"; +})(ErrorType = exports.ErrorType || (exports.ErrorType = {})); +class ParserLog extends mr_doc_utils_1.Log { + constructor() { + super(...arguments); + this.report = (source, node, error) => { + const location = range_1.default(node).location; + const culprit = `(${location.row.start + 1}:${location.column.start}) in ${source.name} from ${source.path}`; + switch (error) { + case ErrorType.NodeTypeNotSupported: + this.info(`'${node.type.replace(/[_]/g, ' ')}' is not supported yet:\n${culprit}`); + break; + case ErrorType.TreeSitterParseError: + this.error(`'tree-sitter' was not able to parse the program:\n${culprit}`); + default: + break; + } + }; + } +} +exports.ParserLog = ParserLog; +const log = new ParserLog('mr-doc::parser'); +exports.default = log; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtDQUFtQztBQUduQyxtQ0FBNEI7QUFFNUIsSUFBWSxTQUdYO0FBSEQsV0FBWSxTQUFTO0lBQ2pCLHlFQUFvQixDQUFBO0lBQ3BCLHlFQUFvQixDQUFBO0FBQ3hCLENBQUMsRUFIVyxTQUFTLEdBQVQsaUJBQVMsS0FBVCxpQkFBUyxRQUdwQjtBQUVELE1BQWEsU0FBVSxTQUFRLGtCQUFHO0lBQWxDOztRQUNJLFdBQU0sR0FBRyxDQUFDLE1BQWEsRUFBRSxJQUFnQixFQUFFLEtBQWdCLEVBQVEsRUFBRTtZQUNqRSxNQUFNLFFBQVEsR0FBRyxlQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ3RDLE1BQU0sT0FBTyxHQUFHLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxRQUFRLE1BQU0sQ0FBQyxJQUFJLFNBQVMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzdHLFFBQVEsS0FBSyxFQUFFO2dCQUNYLEtBQUssU0FBUyxDQUFDLG9CQUFvQjtvQkFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsNEJBQTRCLE9BQU8sRUFBRSxDQUFDLENBQUE7b0JBQ2xGLE1BQU07Z0JBQ1YsS0FBSyxTQUFTLENBQUMsb0JBQW9CO29CQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLHFEQUFxRCxPQUFPLEVBQUUsQ0FBQyxDQUFBO2dCQUM5RTtvQkFDSSxNQUFNO2FBQ2I7UUFDTCxDQUFDLENBQUE7SUFDTCxDQUFDO0NBQUE7QUFkRCw4QkFjQztBQUdELE1BQU0sR0FBRyxHQUFHLElBQUksU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFFNUMsa0JBQWUsR0FBRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTG9nIH0gZnJvbSAnbXItZG9jLXV0aWxzJztcclxuaW1wb3J0IElGaWxlIGZyb20gJy4uL2ludGVyZmFjZXMvSUZpbGUnO1xyXG5pbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSAndHJlZS1zaXR0ZXInO1xyXG5pbXBvcnQgcmFuZ2UgZnJvbSAnLi9yYW5nZSc7XHJcblxyXG5leHBvcnQgZW51bSBFcnJvclR5cGUge1xyXG4gICAgTm9kZVR5cGVOb3RTdXBwb3J0ZWQsXHJcbiAgICBUcmVlU2l0dGVyUGFyc2VFcnJvclxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUGFyc2VyTG9nIGV4dGVuZHMgTG9nIHtcclxuICAgIHJlcG9ydCA9IChzb3VyY2U6IElGaWxlLCBub2RlOiBTeW50YXhOb2RlLCBlcnJvcjogRXJyb3JUeXBlKTogdm9pZCA9PiB7XHJcbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSByYW5nZShub2RlKS5sb2NhdGlvbjtcclxuICAgICAgICBjb25zdCBjdWxwcml0ID0gYCgke2xvY2F0aW9uLnJvdy5zdGFydCArIDF9OiR7bG9jYXRpb24uY29sdW1uLnN0YXJ0fSkgaW4gJHtzb3VyY2UubmFtZX0gZnJvbSAke3NvdXJjZS5wYXRofWA7XHJcbiAgICAgICAgc3dpdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjYXNlIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFN1cHBvcnRlZDpcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5mbyhgJyR7bm9kZS50eXBlLnJlcGxhY2UoL1tfXS9nLCAnICcpfScgaXMgbm90IHN1cHBvcnRlZCB5ZXQ6XFxuJHtjdWxwcml0fWApXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBFcnJvclR5cGUuVHJlZVNpdHRlclBhcnNlRXJyb3I6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yKGAndHJlZS1zaXR0ZXInIHdhcyBub3QgYWJsZSB0byBwYXJzZSB0aGUgcHJvZ3JhbTpcXG4ke2N1bHByaXR9YClcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuXHJcbmNvbnN0IGxvZyA9IG5ldyBQYXJzZXJMb2coJ21yLWRvYzo6cGFyc2VyJyk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBsb2c7Il19 \ No newline at end of file diff --git a/build/src/utils/match.d.ts b/build/src/utils/match.d.ts new file mode 100644 index 0000000..bd8acd0 --- /dev/null +++ b/build/src/utils/match.d.ts @@ -0,0 +1,10 @@ +import { SyntaxNode } from "tree-sitter"; +/** + * Determines whether a node is a certain type. + * ``` + * @param node: SyntaxNode - The node to compare. + * @param type: string - The node type to match. + * @return: boolean + * ``` + */ +export default function match(node: SyntaxNode, type: string): boolean; diff --git a/build/src/utils/match.js b/build/src/utils/match.js new file mode 100644 index 0000000..e76e973 --- /dev/null +++ b/build/src/utils/match.js @@ -0,0 +1,15 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * Determines whether a node is a certain type. + * ``` + * @param node: SyntaxNode - The node to compare. + * @param type: string - The node type to match. + * @return: boolean + * ``` + */ +function match(node, type) { + return node && node.type === type; +} +exports.default = match; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvbWF0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQTs7Ozs7OztHQU9HO0FBQ0gsU0FBd0IsS0FBSyxDQUFDLElBQWdCLEVBQUUsSUFBWTtJQUMxRCxPQUFPLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQztBQUNwQyxDQUFDO0FBRkQsd0JBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XHJcblxyXG4vKipcclxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgbm9kZSBpcyBhIGNlcnRhaW4gdHlwZS5cclxuICogYGBgXHJcbiAqIEBwYXJhbSBub2RlOiBTeW50YXhOb2RlIC0gVGhlIG5vZGUgdG8gY29tcGFyZS5cclxuICogQHBhcmFtIHR5cGU6IHN0cmluZyAgLSBUaGUgbm9kZSB0eXBlIHRvIG1hdGNoLlxyXG4gKiBAcmV0dXJuOiBib29sZWFuXHJcbiAqIGBgYFxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWF0Y2gobm9kZTogU3ludGF4Tm9kZSwgdHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIG5vZGUgJiYgbm9kZS50eXBlID09PSB0eXBlO1xyXG59Il19 \ No newline at end of file diff --git a/build/src/utils/range.d.ts b/build/src/utils/range.d.ts new file mode 100644 index 0000000..72894b8 --- /dev/null +++ b/build/src/utils/range.d.ts @@ -0,0 +1,3 @@ +import * as Parser from 'tree-sitter'; +import TextRange from '../interfaces/TextRange'; +export default function range(node: Parser.SyntaxNode): TextRange; diff --git a/build/src/utils/range.js b/build/src/utils/range.js new file mode 100644 index 0000000..4adeddb --- /dev/null +++ b/build/src/utils/range.js @@ -0,0 +1,16 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function range(node) { + return { + position: { + start: node.startIndex, + end: node.endIndex + }, + location: { + row: { start: node.startPosition.row, end: node.endPosition.row }, + column: { start: node.startPosition.column, end: node.endPosition.column } + } + }; +} +exports.default = range; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvcmFuZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxTQUF3QixLQUFLLENBQUMsSUFBdUI7SUFDbkQsT0FBTztRQUNMLFFBQVEsRUFBRTtZQUNSLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVTtZQUN0QixHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDbkI7UUFDRCxRQUFRLEVBQUU7WUFDUixHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQ2pFLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7U0FDM0U7S0FDRixDQUFBO0FBQ0gsQ0FBQztBQVhELHdCQVdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcclxuaW1wb3J0IFRleHRSYW5nZSBmcm9tICcuLi9pbnRlcmZhY2VzL1RleHRSYW5nZSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByYW5nZShub2RlOiBQYXJzZXIuU3ludGF4Tm9kZSk6IFRleHRSYW5nZSB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHBvc2l0aW9uOiB7XHJcbiAgICAgIHN0YXJ0OiBub2RlLnN0YXJ0SW5kZXgsXHJcbiAgICAgIGVuZDogbm9kZS5lbmRJbmRleFxyXG4gICAgfSxcclxuICAgIGxvY2F0aW9uOiB7XHJcbiAgICAgIHJvdzogeyBzdGFydDogbm9kZS5zdGFydFBvc2l0aW9uLnJvdywgZW5kOiBub2RlLmVuZFBvc2l0aW9uLnJvdyB9LFxyXG4gICAgICBjb2x1bW46IHsgc3RhcnQ6IG5vZGUuc3RhcnRQb3NpdGlvbi5jb2x1bW4sIGVuZDogbm9kZS5lbmRQb3NpdGlvbi5jb2x1bW4gfVxyXG4gICAgfVxyXG4gIH1cclxufSJdfQ== \ No newline at end of file diff --git a/build/src/utils/text.d.ts b/build/src/utils/text.d.ts new file mode 100644 index 0000000..33c5b56 --- /dev/null +++ b/build/src/utils/text.d.ts @@ -0,0 +1,11 @@ +import { SyntaxNode } from "tree-sitter"; +import IFile from "../interfaces/IFile"; +/** + * Returns the context string + * + * # API + * + * @param source: IFile - The source file. + * @param node: SyntaxNode - The syntax node. + */ +export declare function text(source: IFile, node: SyntaxNode): string; diff --git a/build/src/utils/text.js b/build/src/utils/text.js new file mode 100644 index 0000000..9ec0f7b --- /dev/null +++ b/build/src/utils/text.js @@ -0,0 +1,15 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * Returns the context string + * + * # API + * + * @param source: IFile - The source file. + * @param node: SyntaxNode - The syntax node. + */ +function text(source, node) { + return source.text.substring(node.startIndex, node.endIndex); +} +exports.text = text; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy90ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0E7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLElBQUksQ0FBQyxNQUFhLEVBQUUsSUFBZ0I7SUFDbEQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRkQsb0JBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XHJcbmltcG9ydCBJRmlsZSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9JRmlsZVwiO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGNvbnRleHQgc3RyaW5nXHJcbiAqIFxyXG4gKiAjIEFQSVxyXG4gKiBcclxuICogQHBhcmFtIHNvdXJjZTogSUZpbGUgLSBUaGUgc291cmNlIGZpbGUuXHJcbiAqIEBwYXJhbSBub2RlOiBTeW50YXhOb2RlIC0gVGhlIHN5bnRheCBub2RlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHRleHQoc291cmNlOiBJRmlsZSwgbm9kZTogU3ludGF4Tm9kZSkge1xyXG4gIHJldHVybiBzb3VyY2UudGV4dC5zdWJzdHJpbmcobm9kZS5zdGFydEluZGV4LCBub2RlLmVuZEluZGV4KTtcclxufSJdfQ== \ No newline at end of file diff --git a/example.ts b/example.ts index 7b5ded0..8770311 100644 --- a/example.ts +++ b/example.ts @@ -2,4 +2,4 @@ /** * Description */ -export const REGEX = 2; +export const REGEX = 2; \ No newline at end of file diff --git a/index.ts b/index.ts index 5d60d76..fbf5b1a 100644 --- a/index.ts +++ b/index.ts @@ -42,5 +42,5 @@ const result = new Parser({ }).parse(); -console.log(JSON.stringify(result, null, 2)) +// console.log(JSON.stringify(result, null, 2)) // console.log(result); diff --git a/package-lock.json b/package-lock.json index 7fdbe5d..91c2a8a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -371,6 +371,19 @@ "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.4.tgz", "integrity": "sha512-YfQ1tAUZm561vpYD+5eyWN8+UsceQbSrqqlc/6zDY2gtAE+uZLSdkkovhnGpmCThsvKBFakq4EdY/FF93E8XIw==" }, + "color-convert": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", + "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", + "requires": { + "color-name": "1.1.1" + } + }, + "color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=" + }, "commander": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", @@ -489,6 +502,16 @@ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, + "fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -540,6 +563,11 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, "growl": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", @@ -554,6 +582,11 @@ "ansi-regex": "^2.0.0" } }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -687,6 +720,14 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, "lodash": { "version": "4.17.10", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", @@ -794,6 +835,44 @@ } } }, + "mr-doc-utils": { + "version": "github:iwatakeshi/mr-doc-utils#6caf13c5aa74160d9649909aaf63ebede8a5ce98", + "from": "github:iwatakeshi/mr-doc-utils", + "requires": { + "chalk": "^2.4.1", + "fs-extra": "^5.0.0", + "lodash": "^4.17.10", + "sparkles": "^1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -1089,6 +1168,11 @@ "source-map": "^0.5.6" } }, + "sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==" + }, "state-toggle": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.1.tgz", @@ -1310,6 +1394,11 @@ "unist-util-is": "^2.1.2" } }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/package.json b/package.json index e8ad89b..df1dd99 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "babel-traverse": "^6.7.6", "babylon": "^6.7.0", "lodash": "^4.17.10", + "mr-doc-utils": "github:iwatakeshi/mr-doc-utils", "tree-sitter": "^0.13.6", "tree-sitter-javascript": "^0.13.5", "tree-sitter-typescript": "^0.13.3", diff --git a/src/lang/typescript/Node.ts b/src/lang/typescript/Node.ts index 8a56105..87e5418 100644 --- a/src/lang/typescript/Node.ts +++ b/src/lang/typescript/Node.ts @@ -4,6 +4,7 @@ import range from "../../utils/range"; import xdoc from 'xdoc-parser'; import { DocumentationNode } from 'xdoc-parser/src/XDocASTNode'; import { RemarkNode } from 'xdoc-parser/src/XDocParser'; +import IFile from "../../interfaces/IFile"; export interface Node extends TextRange { @@ -16,13 +17,13 @@ export interface Node extends TextRange { } export function createNode( - source: string, + file: IFile, node: SyntaxNode, properties?: Partial, document?: boolean, ): Node { - let node_ = { ...range(node), text: source.substring(node.startIndex, node.endIndex) } + let node_ = { ...range(node), text: file.text.substring(node.startIndex, node.endIndex) } if (properties) { node_ = Object.assign(node_, { properties }) diff --git a/src/lang/typescript/index.ts b/src/lang/typescript/index.ts index 23de202..61951a0 100644 --- a/src/lang/typescript/index.ts +++ b/src/lang/typescript/index.ts @@ -29,7 +29,7 @@ export default class TypeScriptParser implements IParser { parse = () => { const tree = this.parser.parse(this.file.text); if (tree.rootNode.type === "program") { - return visitProgram(this.file.text, tree.rootNode) + return visitProgram(this.file, tree.rootNode) } } } diff --git a/src/lang/typescript/visitors/call_signature.visitor.ts b/src/lang/typescript/visitors/call_signature.visitor.ts index 2bc2109..ecb5854 100644 --- a/src/lang/typescript/visitors/call_signature.visitor.ts +++ b/src/lang/typescript/visitors/call_signature.visitor.ts @@ -3,8 +3,9 @@ import match from "../../../utils/match"; import visitTypeParameters from "./type_parameters.visitor"; import { visitFormalParameters } from "./formal_parameters.visitor"; import { visitType } from "./type.visitor"; +import IFile from "../../../interfaces/IFile"; -export function visitCallSignature(source: string, node: SyntaxNode) { +export function visitCallSignature(source: IFile, node: SyntaxNode) { let call_signature = node.children, type_parameters, diff --git a/src/lang/typescript/visitors/class.visitor.ts b/src/lang/typescript/visitors/class.visitor.ts index 849843f..41cdcca 100644 --- a/src/lang/typescript/visitors/class.visitor.ts +++ b/src/lang/typescript/visitors/class.visitor.ts @@ -4,11 +4,13 @@ import visitTypeParameters from "./type_parameters.visitor"; import match from "../../../utils/match"; import { isJavaDocComment } from "../../../utils/comment"; import { visitMethodDefinition } from "./method_definition.visitor"; -import { visitPublicFieldDefinition } from "../public_field_definition.visitor"; +import { visitPublicFieldDefinition } from "./public_field_definition.visitor"; import { visitTypeIdentifier } from "./type.visitor"; +import IFile from "../../../interfaces/IFile"; +import log, { ErrorType } from "../../../utils/log"; export function visitClass( - source: string, + source: IFile, node: SyntaxNode, comment: SyntaxNode, properties?: Partial @@ -47,7 +49,7 @@ export function visitClass( } } -export function visitClassHeritage(source: string, node: SyntaxNode) { +export function visitClassHeritage(source: IFile, node: SyntaxNode) { let heritage_clause = node.children.shift(); let heritage_clause_children = heritage_clause.children; // Remove the heritage type ('implements' or 'extends') @@ -64,7 +66,7 @@ export function visitClassHeritage(source: string, node: SyntaxNode) { } } -export function visitClassBody(source: string, node: SyntaxNode) { +export function visitClassBody(source: IFile, node: SyntaxNode) { const methods = [] const properties = [] @@ -82,7 +84,7 @@ export function visitClassBody(source: string, node: SyntaxNode) { properties.push(visitPublicFieldDefinition(source, nextSibling, child)); break; default: - console.log(`[mr-doc::parser]: info - '${nextSibling.type.replace(/[_]/g, ' ')}' is not supported yet.`) + log.report(source, nextSibling, ErrorType.NodeTypeNotSupported); break; } } diff --git a/src/lang/typescript/visitors/declaration.visitor.ts b/src/lang/typescript/visitors/declaration.visitor.ts new file mode 100644 index 0000000..7ffcfc1 --- /dev/null +++ b/src/lang/typescript/visitors/declaration.visitor.ts @@ -0,0 +1,43 @@ +import { SyntaxNode } from "tree-sitter"; +import { NodeProperties } from "../Node"; +import IFile from "../../../interfaces/IFile"; +import log, { ErrorType } from "../../../utils/log"; + + + +export function visitDeclaration( + source: IFile, + node: SyntaxNode, + comment: SyntaxNode, + properties: Partial +) { + switch (node.type) { + case 'interface_declaration': + return visitInterfaceDeclaration(source, node, comment, properties); + case 'lexical_declaration': + return visitLexicalDeclaration(source, node, comment, properties); + default: + log.report(source, node, ErrorType.NodeTypeNotSupported); + break; + } +} + +export function visitInterfaceDeclaration( + source: IFile, + node: SyntaxNode, + comment: SyntaxNode, + properties: Partial +) { + console.log(node.children); + +} + +export function visitLexicalDeclaration( + source: IFile, + node: SyntaxNode, + comment: SyntaxNode, + properties: Partial +) { + console.log(node.children); + +} \ No newline at end of file diff --git a/src/lang/typescript/visitors/export_statement.visitor.ts b/src/lang/typescript/visitors/export_statement.visitor.ts deleted file mode 100644 index d7ad76b..0000000 --- a/src/lang/typescript/visitors/export_statement.visitor.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { SyntaxNode } from "tree-sitter"; -import { visitNode } from "./node.visitor"; -import match from "../../../utils/match"; - -export function visitExportStatement( - source: string, - node: SyntaxNode, - comment: SyntaxNode, -) { - let children = node.children, - isDefaultExport = false; - - if (children.length > 1 && match(children.shift(), 'export')) { - } - - if (children.length > 1 && match(children.shift(), 'default')) { - isDefaultExport = true; - } - return visitNode(source, children.shift(), comment, { - exports: { - export: true, - default: isDefaultExport - } - }); -} \ No newline at end of file diff --git a/src/lang/typescript/visitors/expression_statement.visitor.ts b/src/lang/typescript/visitors/expression_statement.visitor.ts deleted file mode 100644 index fb3227e..0000000 --- a/src/lang/typescript/visitors/expression_statement.visitor.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { SyntaxNode } from "tree-sitter"; -import { visitNode } from "./node.visitor"; -import { NodeProperties } from "../Node"; - -export function visitExpressionStatement( - source: string, node: SyntaxNode, - comment: SyntaxNode, - properties: Partial -) { - return visitNode(source, node.children.shift(), comment, properties); -} \ No newline at end of file diff --git a/src/lang/typescript/visitors/formal_parameters.visitor.ts b/src/lang/typescript/visitors/formal_parameters.visitor.ts index bcdd235..07787d1 100644 --- a/src/lang/typescript/visitors/formal_parameters.visitor.ts +++ b/src/lang/typescript/visitors/formal_parameters.visitor.ts @@ -1,10 +1,11 @@ -import { SyntaxNode } from "tree-sitter"; import { createNode } from "../Node"; -import match from "../../../utils/match"; +import { SyntaxNode } from "tree-sitter"; import { text } from "../../../utils/text"; import { visitType } from "./type.visitor"; +import IFile from "../../../interfaces/IFile"; +import match from "../../../utils/match"; -export function visitFormalParameters(source: string, node: SyntaxNode) { +export function visitFormalParameters(source: IFile, node: SyntaxNode) { return { type: node.type, context: createNode(source, node), @@ -15,7 +16,7 @@ export function visitFormalParameters(source: string, node: SyntaxNode) { } -export function visitRequiredParameter(source: string, node: SyntaxNode) { +export function visitRequiredParameter(source: IFile, node: SyntaxNode) { let required_parameter = node.children, identifier, type_annotation; diff --git a/src/lang/typescript/visitors/function.visitor.ts b/src/lang/typescript/visitors/function.visitor.ts index 3251998..310bd97 100644 --- a/src/lang/typescript/visitors/function.visitor.ts +++ b/src/lang/typescript/visitors/function.visitor.ts @@ -2,9 +2,10 @@ import { SyntaxNode } from "tree-sitter"; import { NodeProperties, createNode } from "../Node"; import match from "../../../utils/match"; import { visitCallSignature } from "./call_signature.visitor"; +import IFile from "../../../interfaces/IFile"; export function visitFunction( - source: string, + source: IFile, node: SyntaxNode, comment: SyntaxNode, properties: Partial diff --git a/src/lang/typescript/visitors/method_definition.visitor.ts b/src/lang/typescript/visitors/method_definition.visitor.ts index eaeeb47..e218b63 100644 --- a/src/lang/typescript/visitors/method_definition.visitor.ts +++ b/src/lang/typescript/visitors/method_definition.visitor.ts @@ -1,10 +1,11 @@ +import { createNode } from "../Node"; import { SyntaxNode } from "tree-sitter"; -import match from "../../../utils/match"; import { text } from "../../../utils/text"; -import { createNode } from "../Node"; import { visitCallSignature } from "./call_signature.visitor"; +import IFile from "../../../interfaces/IFile"; +import match from "../../../utils/match"; -export function visitMethodDefinition(source: string, node: SyntaxNode, comment: SyntaxNode) { +export function visitMethodDefinition(source: IFile, node: SyntaxNode, comment: SyntaxNode) { let method_definition = node.children; let accessibility = 'public', isAsync = false, diff --git a/src/lang/typescript/visitors/node.visitor.ts b/src/lang/typescript/visitors/node.visitor.ts index d2beaa3..7e72c16 100644 --- a/src/lang/typescript/visitors/node.visitor.ts +++ b/src/lang/typescript/visitors/node.visitor.ts @@ -2,40 +2,40 @@ import { SyntaxNode } from "tree-sitter"; import { NodeProperties } from "../Node"; import { visitClass } from "./class.visitor"; import range from "../../../utils/range"; -import { visitExportStatement } from "./export_statement.visitor"; import { visitFunction } from "./function.visitor"; -import { visitExpressionStatement } from "./expression_statement.visitor"; +import log, { ErrorType } from '../../../utils/log'; + +import { visitInterfaceDeclaration, visitDeclaration } from "./declaration.visitor"; +import { visitStatement } from "./statement.visitor"; +import IFile from "../../../interfaces/IFile"; export function visitNode( - source: string, + source: IFile, node: SyntaxNode, comment: SyntaxNode, properties: Partial ) { switch (node.type) { - // Note: Export statements may include classes, functions, interfaces, etc. - case 'export_statement': - return visitExportStatement(source, node, comment); - case 'expression_statement': - return visitExpressionStatement(source, node, comment, properties) case 'class': return visitClass(source, node, comment, properties); - // TODO: Complete interfaces and functions - // case 'interface_declaration': - // return visitInterfaceDeclaration(node, comment, properties); case 'function': return visitFunction(source, node, comment, properties); case 'comment': // noop break; case 'ERROR': - const location = range(node).location; - console.error( - `[mr-doc::parser]: 'tree-sitter' was not able to parse at (${location.row.start + 1}:${location.column.start}).` - ) + log.report(source, node, ErrorType.TreeSitterParseError); break; default: - console.log(`[mr-doc::parser]: info - '${node.type.replace(/[_]/g, ' ')}' is not supported yet.`); + if (node.type.includes("statement")) { + return visitStatement(source, node, comment, properties); + } + + if (node.type.includes("declaration")) { + return visitDeclaration(source, node, comment, properties); + } + + log.report(source, node, ErrorType.NodeTypeNotSupported); break; } } \ No newline at end of file diff --git a/src/lang/typescript/visitors/program.visitor.ts b/src/lang/typescript/visitors/program.visitor.ts index 40691c9..b7f2e2f 100644 --- a/src/lang/typescript/visitors/program.visitor.ts +++ b/src/lang/typescript/visitors/program.visitor.ts @@ -1,9 +1,10 @@ +import { isJavaDocComment, isLegalComment } from "../../../utils/comment"; import { SyntaxNode } from "tree-sitter"; -import match from "../../../utils/match"; import { visitNode } from "./node.visitor"; -import { isJavaDocComment, isLegalComment } from "../../../utils/comment"; +import IFile from "../../../interfaces/IFile"; +import match from "../../../utils/match"; -export function visitProgram(source: string, node: SyntaxNode) { +export function visitProgram(source: IFile, node: SyntaxNode) { let children = node.children; if (node.children.length > 0) { if (isLegalComment(source, node.children[0])) { diff --git a/src/lang/typescript/public_field_definition.visitor.ts b/src/lang/typescript/visitors/public_field_definition.visitor.ts similarity index 71% rename from src/lang/typescript/public_field_definition.visitor.ts rename to src/lang/typescript/visitors/public_field_definition.visitor.ts index 433cb70..87c8d2f 100644 --- a/src/lang/typescript/public_field_definition.visitor.ts +++ b/src/lang/typescript/visitors/public_field_definition.visitor.ts @@ -1,10 +1,11 @@ import { SyntaxNode } from "tree-sitter"; -import match from "../../utils/match"; -import { text } from "../../utils/text"; -import { visitType } from "./visitors/type.visitor"; -import { createNode } from "./Node"; +import match from "../../../utils/match"; +import { text } from "../../../utils/text"; +import { visitType } from "./type.visitor"; +import { createNode } from "../Node"; +import IFile from "../../../interfaces/IFile"; -export function visitPublicFieldDefinition(source: string, node: SyntaxNode, comment: SyntaxNode) { +export function visitPublicFieldDefinition(source: IFile, node: SyntaxNode, comment: SyntaxNode) { let public_field_definition = node.children; let accessibility = 'public', identifier, diff --git a/src/lang/typescript/visitors/statement.visitor.ts b/src/lang/typescript/visitors/statement.visitor.ts new file mode 100644 index 0000000..0fb27ef --- /dev/null +++ b/src/lang/typescript/visitors/statement.visitor.ts @@ -0,0 +1,54 @@ +import { SyntaxNode } from "tree-sitter"; +import { visitNode } from "./node.visitor"; +import match from "../../../utils/match"; +import { NodeProperties } from "../Node"; +import log, { ErrorType } from "../../../utils/log"; +import IFile from "../../../interfaces/IFile"; + +export function visitStatement( + source: IFile, + node: SyntaxNode, + comment: SyntaxNode, + properties: Partial +) { + switch(node.type) { + case 'expression_statement': + return visitExpressionStatement(source, node, comment, properties); + case 'export_statement': + return visitExportStatement(source, node, comment); + default: + log.report(source, node, ErrorType.NodeTypeNotSupported); + break; + } +} + +export function visitExpressionStatement( + source: IFile, + node: SyntaxNode, + comment: SyntaxNode, + properties: Partial +) { + return visitNode(source, node.children.shift(), comment, properties); +} + +export function visitExportStatement( + source: IFile, + node: SyntaxNode, + comment: SyntaxNode, +) { + let children = node.children, + isDefaultExport = false; + + if (children.length > 1 && match(children.shift(), 'export')) { + } + + if (children.length > 1 && match(children.shift(), 'default')) { + isDefaultExport = true; + } + return visitNode(source, children.shift(), comment, { + exports: { + export: true, + default: isDefaultExport + } + }); +} \ No newline at end of file diff --git a/src/lang/typescript/visitors/type.visitor.ts b/src/lang/typescript/visitors/type.visitor.ts index 7f816fc..c2b8bed 100644 --- a/src/lang/typescript/visitors/type.visitor.ts +++ b/src/lang/typescript/visitors/type.visitor.ts @@ -1,15 +1,16 @@ import { SyntaxNode } from "tree-sitter"; import { createNode } from "../Node"; import { visitTypeArguments } from "./type_arguments.visitor"; +import IFile from "../../../interfaces/IFile"; -export function visitTypeOrTypeIdentifier(source: string, node: SyntaxNode) { +export function visitTypeOrTypeIdentifier(source: IFile, node: SyntaxNode) { if (node.type === 'type_identifier') { return visitTypeIdentifier(source, node) } return visitType(source, node); } -export function visitType(source: string, node: SyntaxNode) { +export function visitType(source: IFile, node: SyntaxNode) { switch (node.type) { case 'union_type': return visitUnionType(source, node); @@ -29,14 +30,14 @@ export function visitType(source: string, node: SyntaxNode) { } } -export function visitTypeIdentifier(source: string, node: SyntaxNode) { +export function visitTypeIdentifier(source: IFile, node: SyntaxNode) { return { type: node.type, context: createNode(source, node) } } -export function visitUnionType(source: string, node: SyntaxNode) { +export function visitUnionType(source: IFile, node: SyntaxNode) { const union = node.children; return { type: node.type, @@ -46,7 +47,7 @@ export function visitUnionType(source: string, node: SyntaxNode) { } } -export function visitIntersectionType(source: string, node: SyntaxNode) { +export function visitIntersectionType(source: IFile, node: SyntaxNode) { const intersect = node.children; return { type: node.type, @@ -56,7 +57,7 @@ export function visitIntersectionType(source: string, node: SyntaxNode) { } } -export function visitParenthesizedType(source: string, node: SyntaxNode) { +export function visitParenthesizedType(source: IFile, node: SyntaxNode) { return { type: node.type, context: createNode(source, node), @@ -64,7 +65,7 @@ export function visitParenthesizedType(source: string, node: SyntaxNode) { } } -export function visitGenericType(source: string, node: SyntaxNode) { +export function visitGenericType(source: IFile, node: SyntaxNode) { let children = node.children; return { type: node.type, @@ -74,7 +75,7 @@ export function visitGenericType(source: string, node: SyntaxNode) { } } -export function visitPredefinedType(source: string, node: SyntaxNode) { +export function visitPredefinedType(source: IFile, node: SyntaxNode) { return { type: node.type, context: createNode(source, node.children.shift()), diff --git a/src/lang/typescript/visitors/type_arguments.visitor.ts b/src/lang/typescript/visitors/type_arguments.visitor.ts index 7be51a7..50d99c5 100644 --- a/src/lang/typescript/visitors/type_arguments.visitor.ts +++ b/src/lang/typescript/visitors/type_arguments.visitor.ts @@ -1,7 +1,8 @@ import { SyntaxNode } from "tree-sitter"; import { visitType } from "./type.visitor"; +import IFile from "../../../interfaces/IFile"; -export function visitTypeArguments(source: string, node: SyntaxNode) { +export function visitTypeArguments(source: IFile, node: SyntaxNode) { return node.children .filter(child => !child.type.match(/[<>,]/)) .map(child => visitType(source, child)) diff --git a/src/lang/typescript/visitors/type_parameters.visitor.ts b/src/lang/typescript/visitors/type_parameters.visitor.ts index e50921a..c67b7f2 100644 --- a/src/lang/typescript/visitors/type_parameters.visitor.ts +++ b/src/lang/typescript/visitors/type_parameters.visitor.ts @@ -1,7 +1,8 @@ import { SyntaxNode } from "tree-sitter"; import { createNode } from "../Node"; +import IFile from "../../../interfaces/IFile"; -export default function visitTypeParameters(source: string, node: SyntaxNode) { +export default function visitTypeParameters(source: IFile, node: SyntaxNode) { return { type: node.type, context: createNode(source, node), diff --git a/src/utils/comment.ts b/src/utils/comment.ts index 3c42752..d59a241 100644 --- a/src/utils/comment.ts +++ b/src/utils/comment.ts @@ -1,9 +1,10 @@ import { SyntaxNode } from "tree-sitter"; import match from "./match"; +import IFile from "../interfaces/IFile"; export const XDocRegex = /@(\w+)([^{[(\n]*)?([\{\[\(][\s\S]*[\}\]\)]([\s]*(=|-)>.*)?)?([\s]*-(.)*)?/gmi; -export function isLegalComment (source: string, node: SyntaxNode) { +export function isLegalComment (source: IFile, node: SyntaxNode) { const possibleTexts = [ 'copyright', 'terms and conditions', @@ -12,7 +13,7 @@ export function isLegalComment (source: string, node: SyntaxNode) { ]; if (match(node, 'comment')) { return possibleTexts.map(text => - source + source.text .substring(node.startIndex, node.endIndex) .toLowerCase() .includes(text) @@ -20,8 +21,8 @@ export function isLegalComment (source: string, node: SyntaxNode) { } } -export function isJavaDocComment(source: string, node: SyntaxNode) { - const comment = source.substring(node.startIndex, node.endIndex); +export function isJavaDocComment(source: IFile, node: SyntaxNode) { + const comment = source.text.substring(node.startIndex, node.endIndex); // regexr.com/3ejvb return /(\/\*\*)((\s*)(.*?)(\s))*(\*\/)/.test(comment) } diff --git a/src/utils/log.ts b/src/utils/log.ts new file mode 100644 index 0000000..804b966 --- /dev/null +++ b/src/utils/log.ts @@ -0,0 +1,32 @@ +import { Log } from 'mr-doc-utils'; +import IFile from '../interfaces/IFile'; +import { SyntaxNode } from 'tree-sitter'; +import range from './range'; + +export enum ErrorType { + NodeTypeNotSupported, + TreeSitterParseError +} + +class ParserLog extends Log { + report = (source: IFile, node: SyntaxNode, error: ErrorType): void => { + const location = range(node).location; + const sameLine = location.row.start === location.row.end; + const getRange = () => sameLine ? location.row.start + 1 : location.row.start + 1 + ' - ' + location.row.end + 1; + const culprit = `Line${sameLine ? '' : 's'} ${getRange()} in '${source.path}${source.name}'`; + switch (error) { + case ErrorType.NodeTypeNotSupported: + this.info(`'${node.type.replace(/[_]/g, ' ')}' is not yet supported:\n${culprit}`) + break; + case ErrorType.TreeSitterParseError: + this.error(`'tree-sitter' was not able to parse the program:\n${culprit}`) + default: + break; + } + } +} + + +const log = new ParserLog('mr-doc::parser'); + +export default log; \ No newline at end of file diff --git a/src/utils/text.ts b/src/utils/text.ts index 1e67538..34d7258 100644 --- a/src/utils/text.ts +++ b/src/utils/text.ts @@ -1,13 +1,14 @@ import { SyntaxNode } from "tree-sitter"; +import IFile from "../interfaces/IFile"; /** * Returns the context string * * # API * - * @param source: string - The source string. + * @param source: IFile - The source file. * @param node: SyntaxNode - The syntax node. */ -export function text(source: string, node: SyntaxNode) { - return source.substring(node.startIndex, node.endIndex); +export function text(source: IFile, node: SyntaxNode) { + return source.text.substring(node.startIndex, node.endIndex); } \ No newline at end of file From 0e7385b95bf273e3c2941b77061c115ffe72d9e8 Mon Sep 17 00:00:00 2001 From: Takeshi Date: Mon, 20 Aug 2018 09:14:53 -0600 Subject: [PATCH 11/32] Update: WIP --- index.ts | 4 ++-- package-lock.json | 6 ++--- src/ParserFactory.ts | 6 ++--- src/interfaces/IParser.ts | 4 ++-- src/interfaces/{IFile.ts => Source.ts} | 2 +- src/lang/javascript/index.ts | 6 ++--- src/lang/typescript/Node.ts | 4 ++-- src/lang/typescript/index.ts | 6 ++--- .../visitors/call_signature.visitor.ts | 8 +++---- src/lang/typescript/visitors/class.visitor.ts | 16 ++++++------- .../visitors/declaration.visitor.ts | 8 +++---- .../visitors/formal_parameters.visitor.ts | 6 ++--- .../typescript/visitors/function.visitor.ts | 8 +++---- .../visitors/method_definition.visitor.ts | 4 ++-- src/lang/typescript/visitors/node.visitor.ts | 12 ++++------ .../typescript/visitors/program.visitor.ts | 4 ++-- .../public_field_definition.visitor.ts | 8 +++---- .../typescript/visitors/statement.visitor.ts | 12 +++++----- src/lang/typescript/visitors/type.visitor.ts | 23 ++++++++++--------- .../visitors/type_arguments.visitor.ts | 4 ++-- .../visitors/type_parameters.visitor.ts | 6 ++--- src/utils/comment.ts | 6 ++--- src/utils/log.ts | 4 ++-- src/utils/text.ts | 4 ++-- 24 files changed, 85 insertions(+), 86 deletions(-) rename src/interfaces/{IFile.ts => Source.ts} (58%) diff --git a/index.ts b/index.ts index fbf5b1a..1e94f75 100644 --- a/index.ts +++ b/index.ts @@ -1,4 +1,4 @@ -import IFile from './src/interfaces/IFile'; +import Source from './src/interfaces/Source'; import ParserFactory from './src/ParserFactory'; import IParser from './src/interfaces/IParser'; import * as FS from 'fs'; @@ -25,7 +25,7 @@ import * as FS from 'fs'; export default class Parser implements IParser { private parser: IParser; - constructor(file: IFile, options: any = {}) { + constructor(file: Source, options: any = {}) { this.parser = (new ParserFactory(file, options)).getParser(); } parse = () => { diff --git a/package-lock.json b/package-lock.json index 91c2a8a..b69c25b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -864,9 +864,9 @@ } }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } diff --git a/src/ParserFactory.ts b/src/ParserFactory.ts index 215826f..ae51263 100644 --- a/src/ParserFactory.ts +++ b/src/ParserFactory.ts @@ -1,14 +1,14 @@ -import IFile from "./interfaces/IFile"; +import Source from "./interfaces/Source"; import IParser from "./interfaces/IParser"; import JavaScriptParser from "./lang/javascript"; import TypeScriptParser from './lang/typescript'; export default class ParserFactory { - private file: IFile + private file: Source private options = { language: 'JavaScript' } - constructor(file: IFile, options: any = {}) { + constructor(file: Source, options: any = {}) { this.file = file; Object.assign(this.options, options) } diff --git a/src/interfaces/IParser.ts b/src/interfaces/IParser.ts index 00ab809..0f11955 100644 --- a/src/interfaces/IParser.ts +++ b/src/interfaces/IParser.ts @@ -1,8 +1,8 @@ -import IFile from "./IFile"; +import Source from "./Source"; // import IResult from "./IResult"; export default abstract class IParser { - constructor(file: IFile, options: any) { + constructor(file: Source, options: any) { } abstract parse(): any diff --git a/src/interfaces/IFile.ts b/src/interfaces/Source.ts similarity index 58% rename from src/interfaces/IFile.ts rename to src/interfaces/Source.ts index 517e5b8..02238fc 100644 --- a/src/interfaces/IFile.ts +++ b/src/interfaces/Source.ts @@ -1,4 +1,4 @@ -export default interface IFile { +export default interface Source { name: string, path: string, text: string diff --git a/src/lang/javascript/index.ts b/src/lang/javascript/index.ts index d9acf3b..678b440 100644 --- a/src/lang/javascript/index.ts +++ b/src/lang/javascript/index.ts @@ -1,7 +1,7 @@ import * as Parser from 'tree-sitter'; import * as JavaScript from 'tree-sitter-javascript'; import IParser from '../../interfaces/IParser'; -import IFile from '../../interfaces/IFile'; +import Source from '../../interfaces/Source'; // import IResult from '../../interfaces/IResult'; // import IComment from '../../interfaces/IComment'; @@ -17,10 +17,10 @@ import IFile from '../../interfaces/IFile'; * ``` */ export default class JavaScriptParser implements IParser { - private file: IFile; + private file: Source; private options: any; private parser: Parser; - constructor(file: IFile, options: any) { + constructor(file: Source, options: any) { this.file = file; Object.assign(this.options = {}, options || {}); this.parser = new Parser(); diff --git a/src/lang/typescript/Node.ts b/src/lang/typescript/Node.ts index 87e5418..c7ac527 100644 --- a/src/lang/typescript/Node.ts +++ b/src/lang/typescript/Node.ts @@ -4,7 +4,7 @@ import range from "../../utils/range"; import xdoc from 'xdoc-parser'; import { DocumentationNode } from 'xdoc-parser/src/XDocASTNode'; import { RemarkNode } from 'xdoc-parser/src/XDocParser'; -import IFile from "../../interfaces/IFile"; +import Source from "../../interfaces/Source"; export interface Node extends TextRange { @@ -17,7 +17,7 @@ export interface Node extends TextRange { } export function createNode( - file: IFile, + file: Source, node: SyntaxNode, properties?: Partial, document?: boolean, diff --git a/src/lang/typescript/index.ts b/src/lang/typescript/index.ts index 61951a0..961e481 100644 --- a/src/lang/typescript/index.ts +++ b/src/lang/typescript/index.ts @@ -1,7 +1,7 @@ import * as Parser from 'tree-sitter'; import * as TypeScript from 'tree-sitter-typescript'; import IParser from '../../interfaces/IParser'; -import IFile from '../../interfaces/IFile'; +import Source from '../../interfaces/Source'; import { visitProgram } from './visitors/program.visitor'; @@ -17,10 +17,10 @@ import { visitProgram } from './visitors/program.visitor'; * ``` */ export default class TypeScriptParser implements IParser { - private file: IFile; + private file: Source; private options: any; private parser: Parser; - constructor(file: IFile, options: any) { + constructor(file: Source, options: any) { this.file = file; Object.assign(this.options = {}, options || {}); this.parser = new Parser(); diff --git a/src/lang/typescript/visitors/call_signature.visitor.ts b/src/lang/typescript/visitors/call_signature.visitor.ts index ecb5854..2729c2a 100644 --- a/src/lang/typescript/visitors/call_signature.visitor.ts +++ b/src/lang/typescript/visitors/call_signature.visitor.ts @@ -1,11 +1,11 @@ import { SyntaxNode } from "tree-sitter"; -import match from "../../../utils/match"; -import visitTypeParameters from "./type_parameters.visitor"; import { visitFormalParameters } from "./formal_parameters.visitor"; import { visitType } from "./type.visitor"; -import IFile from "../../../interfaces/IFile"; +import Source from "../../../interfaces/Source"; +import match from "../../../utils/match"; +import visitTypeParameters from "./type_parameters.visitor"; -export function visitCallSignature(source: IFile, node: SyntaxNode) { +export function visitCallSignature(source: Source, node: SyntaxNode) { let call_signature = node.children, type_parameters, diff --git a/src/lang/typescript/visitors/class.visitor.ts b/src/lang/typescript/visitors/class.visitor.ts index 41cdcca..6924a29 100644 --- a/src/lang/typescript/visitors/class.visitor.ts +++ b/src/lang/typescript/visitors/class.visitor.ts @@ -1,16 +1,16 @@ -import { SyntaxNode } from "tree-sitter"; -import { NodeProperties, createNode } from "../Node"; -import visitTypeParameters from "./type_parameters.visitor"; -import match from "../../../utils/match"; import { isJavaDocComment } from "../../../utils/comment"; +import { NodeProperties, createNode } from "../Node"; +import { SyntaxNode } from "tree-sitter"; import { visitMethodDefinition } from "./method_definition.visitor"; import { visitPublicFieldDefinition } from "./public_field_definition.visitor"; import { visitTypeIdentifier } from "./type.visitor"; -import IFile from "../../../interfaces/IFile"; +import Source from "../../../interfaces/Source"; import log, { ErrorType } from "../../../utils/log"; +import match from "../../../utils/match"; +import visitTypeParameters from "./type_parameters.visitor"; export function visitClass( - source: IFile, + source: Source, node: SyntaxNode, comment: SyntaxNode, properties?: Partial @@ -49,7 +49,7 @@ export function visitClass( } } -export function visitClassHeritage(source: IFile, node: SyntaxNode) { +export function visitClassHeritage(source: Source, node: SyntaxNode) { let heritage_clause = node.children.shift(); let heritage_clause_children = heritage_clause.children; // Remove the heritage type ('implements' or 'extends') @@ -66,7 +66,7 @@ export function visitClassHeritage(source: IFile, node: SyntaxNode) { } } -export function visitClassBody(source: IFile, node: SyntaxNode) { +export function visitClassBody(source: Source, node: SyntaxNode) { const methods = [] const properties = [] diff --git a/src/lang/typescript/visitors/declaration.visitor.ts b/src/lang/typescript/visitors/declaration.visitor.ts index 7ffcfc1..52628b4 100644 --- a/src/lang/typescript/visitors/declaration.visitor.ts +++ b/src/lang/typescript/visitors/declaration.visitor.ts @@ -1,12 +1,12 @@ import { SyntaxNode } from "tree-sitter"; import { NodeProperties } from "../Node"; -import IFile from "../../../interfaces/IFile"; +import Source from "../../../interfaces/Source"; import log, { ErrorType } from "../../../utils/log"; export function visitDeclaration( - source: IFile, + source: Source, node: SyntaxNode, comment: SyntaxNode, properties: Partial @@ -23,7 +23,7 @@ export function visitDeclaration( } export function visitInterfaceDeclaration( - source: IFile, + source: Source, node: SyntaxNode, comment: SyntaxNode, properties: Partial @@ -33,7 +33,7 @@ export function visitInterfaceDeclaration( } export function visitLexicalDeclaration( - source: IFile, + source: Source, node: SyntaxNode, comment: SyntaxNode, properties: Partial diff --git a/src/lang/typescript/visitors/formal_parameters.visitor.ts b/src/lang/typescript/visitors/formal_parameters.visitor.ts index 07787d1..11f0ccf 100644 --- a/src/lang/typescript/visitors/formal_parameters.visitor.ts +++ b/src/lang/typescript/visitors/formal_parameters.visitor.ts @@ -2,10 +2,10 @@ import { createNode } from "../Node"; import { SyntaxNode } from "tree-sitter"; import { text } from "../../../utils/text"; import { visitType } from "./type.visitor"; -import IFile from "../../../interfaces/IFile"; +import Source from "../../../interfaces/Source"; import match from "../../../utils/match"; -export function visitFormalParameters(source: IFile, node: SyntaxNode) { +export function visitFormalParameters(source: Source, node: SyntaxNode) { return { type: node.type, context: createNode(source, node), @@ -16,7 +16,7 @@ export function visitFormalParameters(source: IFile, node: SyntaxNode) { } -export function visitRequiredParameter(source: IFile, node: SyntaxNode) { +export function visitRequiredParameter(source: Source, node: SyntaxNode) { let required_parameter = node.children, identifier, type_annotation; diff --git a/src/lang/typescript/visitors/function.visitor.ts b/src/lang/typescript/visitors/function.visitor.ts index 310bd97..0f8ceb5 100644 --- a/src/lang/typescript/visitors/function.visitor.ts +++ b/src/lang/typescript/visitors/function.visitor.ts @@ -1,11 +1,11 @@ -import { SyntaxNode } from "tree-sitter"; import { NodeProperties, createNode } from "../Node"; -import match from "../../../utils/match"; +import { SyntaxNode } from "tree-sitter"; import { visitCallSignature } from "./call_signature.visitor"; -import IFile from "../../../interfaces/IFile"; +import Source from "../../../interfaces/Source"; +import match from "../../../utils/match"; export function visitFunction( - source: IFile, + source: Source, node: SyntaxNode, comment: SyntaxNode, properties: Partial diff --git a/src/lang/typescript/visitors/method_definition.visitor.ts b/src/lang/typescript/visitors/method_definition.visitor.ts index e218b63..8fb5784 100644 --- a/src/lang/typescript/visitors/method_definition.visitor.ts +++ b/src/lang/typescript/visitors/method_definition.visitor.ts @@ -2,10 +2,10 @@ import { createNode } from "../Node"; import { SyntaxNode } from "tree-sitter"; import { text } from "../../../utils/text"; import { visitCallSignature } from "./call_signature.visitor"; -import IFile from "../../../interfaces/IFile"; +import Source from "../../../interfaces/Source"; import match from "../../../utils/match"; -export function visitMethodDefinition(source: IFile, node: SyntaxNode, comment: SyntaxNode) { +export function visitMethodDefinition(source: Source, node: SyntaxNode, comment: SyntaxNode) { let method_definition = node.children; let accessibility = 'public', isAsync = false, diff --git a/src/lang/typescript/visitors/node.visitor.ts b/src/lang/typescript/visitors/node.visitor.ts index 7e72c16..0f42315 100644 --- a/src/lang/typescript/visitors/node.visitor.ts +++ b/src/lang/typescript/visitors/node.visitor.ts @@ -1,16 +1,14 @@ -import { SyntaxNode } from "tree-sitter"; import { NodeProperties } from "../Node"; +import { SyntaxNode } from "tree-sitter"; import { visitClass } from "./class.visitor"; -import range from "../../../utils/range"; +import { visitDeclaration } from "./declaration.visitor"; import { visitFunction } from "./function.visitor"; -import log, { ErrorType } from '../../../utils/log'; - -import { visitInterfaceDeclaration, visitDeclaration } from "./declaration.visitor"; import { visitStatement } from "./statement.visitor"; -import IFile from "../../../interfaces/IFile"; +import Source from "../../../interfaces/Source"; +import log, { ErrorType } from '../../../utils/log'; export function visitNode( - source: IFile, + source: Source, node: SyntaxNode, comment: SyntaxNode, properties: Partial diff --git a/src/lang/typescript/visitors/program.visitor.ts b/src/lang/typescript/visitors/program.visitor.ts index b7f2e2f..950c9cd 100644 --- a/src/lang/typescript/visitors/program.visitor.ts +++ b/src/lang/typescript/visitors/program.visitor.ts @@ -1,10 +1,10 @@ import { isJavaDocComment, isLegalComment } from "../../../utils/comment"; import { SyntaxNode } from "tree-sitter"; import { visitNode } from "./node.visitor"; -import IFile from "../../../interfaces/IFile"; +import Source from "../../../interfaces/Source"; import match from "../../../utils/match"; -export function visitProgram(source: IFile, node: SyntaxNode) { +export function visitProgram(source: Source, node: SyntaxNode) { let children = node.children; if (node.children.length > 0) { if (isLegalComment(source, node.children[0])) { diff --git a/src/lang/typescript/visitors/public_field_definition.visitor.ts b/src/lang/typescript/visitors/public_field_definition.visitor.ts index 87c8d2f..74d9560 100644 --- a/src/lang/typescript/visitors/public_field_definition.visitor.ts +++ b/src/lang/typescript/visitors/public_field_definition.visitor.ts @@ -1,11 +1,11 @@ +import { createNode } from "../Node"; import { SyntaxNode } from "tree-sitter"; -import match from "../../../utils/match"; import { text } from "../../../utils/text"; import { visitType } from "./type.visitor"; -import { createNode } from "../Node"; -import IFile from "../../../interfaces/IFile"; +import Source from "../../../interfaces/Source"; +import match from "../../../utils/match"; -export function visitPublicFieldDefinition(source: IFile, node: SyntaxNode, comment: SyntaxNode) { +export function visitPublicFieldDefinition(source: Source, node: SyntaxNode, comment: SyntaxNode) { let public_field_definition = node.children; let accessibility = 'public', identifier, diff --git a/src/lang/typescript/visitors/statement.visitor.ts b/src/lang/typescript/visitors/statement.visitor.ts index 0fb27ef..f110810 100644 --- a/src/lang/typescript/visitors/statement.visitor.ts +++ b/src/lang/typescript/visitors/statement.visitor.ts @@ -1,12 +1,12 @@ +import { NodeProperties } from "../Node"; import { SyntaxNode } from "tree-sitter"; import { visitNode } from "./node.visitor"; -import match from "../../../utils/match"; -import { NodeProperties } from "../Node"; +import Source from "../../../interfaces/Source"; import log, { ErrorType } from "../../../utils/log"; -import IFile from "../../../interfaces/IFile"; +import match from "../../../utils/match"; export function visitStatement( - source: IFile, + source: Source, node: SyntaxNode, comment: SyntaxNode, properties: Partial @@ -23,7 +23,7 @@ export function visitStatement( } export function visitExpressionStatement( - source: IFile, + source: Source, node: SyntaxNode, comment: SyntaxNode, properties: Partial @@ -32,7 +32,7 @@ export function visitExpressionStatement( } export function visitExportStatement( - source: IFile, + source: Source, node: SyntaxNode, comment: SyntaxNode, ) { diff --git a/src/lang/typescript/visitors/type.visitor.ts b/src/lang/typescript/visitors/type.visitor.ts index c2b8bed..adb2708 100644 --- a/src/lang/typescript/visitors/type.visitor.ts +++ b/src/lang/typescript/visitors/type.visitor.ts @@ -1,16 +1,17 @@ -import { SyntaxNode } from "tree-sitter"; import { createNode } from "../Node"; +import { SyntaxNode } from "tree-sitter"; import { visitTypeArguments } from "./type_arguments.visitor"; -import IFile from "../../../interfaces/IFile"; +import Source from "../../../interfaces/Source"; +import log, { ErrorType } from "../../../utils/log"; -export function visitTypeOrTypeIdentifier(source: IFile, node: SyntaxNode) { +export function visitTypeOrTypeIdentifier(source: Source, node: SyntaxNode) { if (node.type === 'type_identifier') { return visitTypeIdentifier(source, node) } return visitType(source, node); } -export function visitType(source: IFile, node: SyntaxNode) { +export function visitType(source: Source, node: SyntaxNode) { switch (node.type) { case 'union_type': return visitUnionType(source, node); @@ -25,19 +26,19 @@ export function visitType(source: IFile, node: SyntaxNode) { case 'predefined_type': return visitPredefinedType(source, node); default: - console.log(`[mr-doc::parser]: info - '${node.type.replace(/[_]/g, ' ')}' is not supported yet.`); + log.report(source, node, ErrorType.NodeTypeNotSupported); break; } } -export function visitTypeIdentifier(source: IFile, node: SyntaxNode) { +export function visitTypeIdentifier(source: Source, node: SyntaxNode) { return { type: node.type, context: createNode(source, node) } } -export function visitUnionType(source: IFile, node: SyntaxNode) { +export function visitUnionType(source: Source, node: SyntaxNode) { const union = node.children; return { type: node.type, @@ -47,7 +48,7 @@ export function visitUnionType(source: IFile, node: SyntaxNode) { } } -export function visitIntersectionType(source: IFile, node: SyntaxNode) { +export function visitIntersectionType(source: Source, node: SyntaxNode) { const intersect = node.children; return { type: node.type, @@ -57,7 +58,7 @@ export function visitIntersectionType(source: IFile, node: SyntaxNode) { } } -export function visitParenthesizedType(source: IFile, node: SyntaxNode) { +export function visitParenthesizedType(source: Source, node: SyntaxNode) { return { type: node.type, context: createNode(source, node), @@ -65,7 +66,7 @@ export function visitParenthesizedType(source: IFile, node: SyntaxNode) { } } -export function visitGenericType(source: IFile, node: SyntaxNode) { +export function visitGenericType(source: Source, node: SyntaxNode) { let children = node.children; return { type: node.type, @@ -75,7 +76,7 @@ export function visitGenericType(source: IFile, node: SyntaxNode) { } } -export function visitPredefinedType(source: IFile, node: SyntaxNode) { +export function visitPredefinedType(source: Source, node: SyntaxNode) { return { type: node.type, context: createNode(source, node.children.shift()), diff --git a/src/lang/typescript/visitors/type_arguments.visitor.ts b/src/lang/typescript/visitors/type_arguments.visitor.ts index 50d99c5..df23556 100644 --- a/src/lang/typescript/visitors/type_arguments.visitor.ts +++ b/src/lang/typescript/visitors/type_arguments.visitor.ts @@ -1,8 +1,8 @@ import { SyntaxNode } from "tree-sitter"; import { visitType } from "./type.visitor"; -import IFile from "../../../interfaces/IFile"; +import Source from "../../../interfaces/Source"; -export function visitTypeArguments(source: IFile, node: SyntaxNode) { +export function visitTypeArguments(source: Source, node: SyntaxNode) { return node.children .filter(child => !child.type.match(/[<>,]/)) .map(child => visitType(source, child)) diff --git a/src/lang/typescript/visitors/type_parameters.visitor.ts b/src/lang/typescript/visitors/type_parameters.visitor.ts index c67b7f2..fad3bc3 100644 --- a/src/lang/typescript/visitors/type_parameters.visitor.ts +++ b/src/lang/typescript/visitors/type_parameters.visitor.ts @@ -1,8 +1,8 @@ -import { SyntaxNode } from "tree-sitter"; import { createNode } from "../Node"; -import IFile from "../../../interfaces/IFile"; +import { SyntaxNode } from "tree-sitter"; +import Source from "../../../interfaces/Source"; -export default function visitTypeParameters(source: IFile, node: SyntaxNode) { +export default function visitTypeParameters(source: Source, node: SyntaxNode) { return { type: node.type, context: createNode(source, node), diff --git a/src/utils/comment.ts b/src/utils/comment.ts index d59a241..74adf60 100644 --- a/src/utils/comment.ts +++ b/src/utils/comment.ts @@ -1,10 +1,10 @@ import { SyntaxNode } from "tree-sitter"; import match from "./match"; -import IFile from "../interfaces/IFile"; +import Source from "../interfaces/Source"; export const XDocRegex = /@(\w+)([^{[(\n]*)?([\{\[\(][\s\S]*[\}\]\)]([\s]*(=|-)>.*)?)?([\s]*-(.)*)?/gmi; -export function isLegalComment (source: IFile, node: SyntaxNode) { +export function isLegalComment (source: Source, node: SyntaxNode) { const possibleTexts = [ 'copyright', 'terms and conditions', @@ -21,7 +21,7 @@ export function isLegalComment (source: IFile, node: SyntaxNode) { } } -export function isJavaDocComment(source: IFile, node: SyntaxNode) { +export function isJavaDocComment(source: Source, node: SyntaxNode) { const comment = source.text.substring(node.startIndex, node.endIndex); // regexr.com/3ejvb return /(\/\*\*)((\s*)(.*?)(\s))*(\*\/)/.test(comment) diff --git a/src/utils/log.ts b/src/utils/log.ts index 804b966..e6c3ed8 100644 --- a/src/utils/log.ts +++ b/src/utils/log.ts @@ -1,5 +1,5 @@ import { Log } from 'mr-doc-utils'; -import IFile from '../interfaces/IFile'; +import Source from '../interfaces/Source'; import { SyntaxNode } from 'tree-sitter'; import range from './range'; @@ -9,7 +9,7 @@ export enum ErrorType { } class ParserLog extends Log { - report = (source: IFile, node: SyntaxNode, error: ErrorType): void => { + report = (source: Source, node: SyntaxNode, error: ErrorType): void => { const location = range(node).location; const sameLine = location.row.start === location.row.end; const getRange = () => sameLine ? location.row.start + 1 : location.row.start + 1 + ' - ' + location.row.end + 1; diff --git a/src/utils/text.ts b/src/utils/text.ts index 34d7258..c757993 100644 --- a/src/utils/text.ts +++ b/src/utils/text.ts @@ -1,5 +1,5 @@ import { SyntaxNode } from "tree-sitter"; -import IFile from "../interfaces/IFile"; +import Source from "../interfaces/Source"; /** * Returns the context string @@ -9,6 +9,6 @@ import IFile from "../interfaces/IFile"; * @param source: IFile - The source file. * @param node: SyntaxNode - The syntax node. */ -export function text(source: IFile, node: SyntaxNode) { +export function text(source: Source, node: SyntaxNode) { return source.text.substring(node.startIndex, node.endIndex); } \ No newline at end of file From decc62a239b08c4d69e74dac5926ea0496839f03 Mon Sep 17 00:00:00 2001 From: Takeshi Date: Tue, 21 Aug 2018 12:24:51 -0600 Subject: [PATCH 12/32] Update: WIP --- build/example.js | 2 +- build/index.d.ts | 4 +- build/index.js | 4 +- build/src/ParserFactory.d.ts | 4 +- build/src/ParserFactory.js | 2 +- build/src/interfaces/IParser.d.ts | 4 +- build/src/interfaces/IParser.js | 2 +- build/src/interfaces/Source.d.ts | 5 + build/src/interfaces/Source.js | 3 + build/src/interfaces/TextRange.js | 2 +- build/src/lang/javascript/index.d.ts | 4 +- build/src/lang/javascript/index.js | 2 +- build/src/lang/typescript/Node.d.ts | 4 +- build/src/lang/typescript/Node.js | 5 +- build/src/lang/typescript/index.d.ts | 4 +- build/src/lang/typescript/index.js | 2 +- .../visitors/call_signature.visitor.d.ts | 4 +- .../visitors/call_signature.visitor.js | 6 +- .../typescript/visitors/class.visitor.d.ts | 10 +- .../lang/typescript/visitors/class.visitor.js | 14 +-- .../visitors/declaration.visitor.d.ts | 8 +- .../visitors/declaration.visitor.js | 10 +- .../visitors/formal_parameters.visitor.d.ts | 6 +- .../visitors/formal_parameters.visitor.js | 5 +- .../typescript/visitors/function.visitor.d.ts | 6 +- .../typescript/visitors/function.visitor.js | 4 +- .../visitors/method_definition.visitor.d.ts | 4 +- .../visitors/method_definition.visitor.js | 2 +- .../typescript/visitors/node.visitor.d.ts | 6 +- .../lang/typescript/visitors/node.visitor.js | 8 +- .../typescript/visitors/program.visitor.d.ts | 4 +- .../typescript/visitors/program.visitor.js | 2 +- .../public_field_definition.visitor.d.ts | 10 ++ .../public_field_definition.visitor.js | 30 ++++++ .../visitors/statement.visitor.d.ts | 10 +- .../typescript/visitors/statement.visitor.js | 6 +- .../typescript/visitors/type.visitor.d.ts | 18 ++-- .../lang/typescript/visitors/type.visitor.js | 5 +- .../visitors/type_arguments.visitor.d.ts | 4 +- .../visitors/type_arguments.visitor.js | 2 +- .../visitors/type_parameters.visitor.d.ts | 4 +- .../visitors/type_parameters.visitor.js | 2 +- build/src/utils/comment.d.ts | 6 +- build/src/utils/comment.js | 2 +- build/src/utils/log.d.ts | 8 +- build/src/utils/log.js | 13 +-- build/src/utils/match.d.ts | 2 +- build/src/utils/match.js | 7 +- build/src/utils/range.js | 2 +- build/src/utils/text.d.ts | 4 +- build/src/utils/text.js | 2 +- example.ts | 9 +- src/lang/typescript/Node.ts | 11 ++- src/lang/typescript/index.ts | 4 +- .../visitors/call_signature.visitor.ts | 30 ------ src/lang/typescript/visitors/class.visitor.ts | 83 +++++++++++++++-- .../visitors/declaration.visitor.ts | 76 +++++++++++++++- .../visitors/formal_parameters.visitor.ts | 5 +- .../typescript/visitors/function.visitor.ts | 6 +- .../visitors/method_definition.visitor.ts | 47 ---------- src/lang/typescript/visitors/node.visitor.ts | 4 +- .../public_field_definition.visitor.ts | 34 ------- .../typescript/visitors/signature.visitor.ts | 91 +++++++++++++++++++ .../typescript/visitors/statement.visitor.ts | 4 +- src/lang/typescript/visitors/type.visitor.ts | 63 +++++++++++-- .../visitors/type_arguments.visitor.ts | 9 -- .../visitors/type_parameters.visitor.ts | 13 --- src/lang/typescript/visitors/visitor.ts | 43 +++++++++ src/lang/typescript/walk.ts | 8 ++ src/utils/log.ts | 4 +- src/utils/match.ts | 5 +- src/utils/sibling.ts | 17 ++++ 72 files changed, 567 insertions(+), 288 deletions(-) create mode 100644 build/src/interfaces/Source.d.ts create mode 100644 build/src/interfaces/Source.js create mode 100644 build/src/lang/typescript/visitors/public_field_definition.visitor.d.ts create mode 100644 build/src/lang/typescript/visitors/public_field_definition.visitor.js delete mode 100644 src/lang/typescript/visitors/call_signature.visitor.ts delete mode 100644 src/lang/typescript/visitors/method_definition.visitor.ts delete mode 100644 src/lang/typescript/visitors/public_field_definition.visitor.ts create mode 100644 src/lang/typescript/visitors/signature.visitor.ts delete mode 100644 src/lang/typescript/visitors/type_arguments.visitor.ts delete mode 100644 src/lang/typescript/visitors/type_parameters.visitor.ts create mode 100644 src/lang/typescript/visitors/visitor.ts create mode 100644 src/lang/typescript/walk.ts create mode 100644 src/utils/sibling.ts diff --git a/build/example.js b/build/example.js index da3329e..f9a816e 100644 --- a/build/example.js +++ b/build/example.js @@ -4,4 +4,4 @@ Object.defineProperty(exports, "__esModule", { value: true }); * Description */ exports.REGEX = 2; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhhbXBsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2V4YW1wbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQTs7R0FFRztBQUNVLFFBQUEsS0FBSyxHQUFHLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxyXG4vKipcclxuICogRGVzY3JpcHRpb25cclxuICovXHJcbmV4cG9ydCBjb25zdCBSRUdFWCA9IDI7Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhhbXBsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2V4YW1wbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQTs7R0FFRztBQUNVLFFBQUEsS0FBSyxHQUFHLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxuLyoqXG4gKiBEZXNjcmlwdGlvblxuICovXG5leHBvcnQgY29uc3QgUkVHRVggPSAyOyJdfQ== \ No newline at end of file diff --git a/build/index.d.ts b/build/index.d.ts index e3906a2..164cb09 100644 --- a/build/index.d.ts +++ b/build/index.d.ts @@ -1,4 +1,4 @@ -import IFile from './src/interfaces/IFile'; +import Source from './src/interfaces/Source'; import IParser from './src/interfaces/IParser'; /** * A class that parses a source code and generates an AST. @@ -21,6 +21,6 @@ import IParser from './src/interfaces/IParser'; */ export default class Parser implements IParser { private parser; - constructor(file: IFile, options?: any); + constructor(file: Source, options?: any); parse: () => any; } diff --git a/build/index.js b/build/index.js index 4453a76..491ed54 100644 --- a/build/index.js +++ b/build/index.js @@ -37,6 +37,6 @@ const result = new Parser({ }, { language: 'typescript' }).parse(); -console.log(JSON.stringify(result, null, 2)); +// console.log(JSON.stringify(result, null, 2)) // console.log(result); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLHVEQUFnRDtBQUVoRCx5QkFBeUI7QUFFekI7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQXFCLE1BQU07SUFHekIsWUFBWSxJQUFXLEVBQUUsVUFBZSxFQUFFO1FBRzFDLFVBQUssR0FBRyxHQUFHLEVBQUU7WUFDWCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDNUIsQ0FBQyxDQUFBO1FBSkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksdUJBQWEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMvRCxDQUFDO0NBSUY7QUFURCx5QkFTQztBQUVELE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDO0lBQ3hCLElBQUksRUFBRSxVQUFVO0lBQ2hCLElBQUksRUFBRSxRQUFRO0lBQ2QsSUFBSSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLGFBQWEsRUFBRSxPQUFPLENBQUM7Q0FDOUQsRUFBRTtJQUNELFFBQVEsRUFBRSxZQUFZO0NBQ3ZCLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUdYLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDNUMsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IElGaWxlIGZyb20gJy4vc3JjL2ludGVyZmFjZXMvSUZpbGUnO1xyXG5pbXBvcnQgUGFyc2VyRmFjdG9yeSBmcm9tICcuL3NyYy9QYXJzZXJGYWN0b3J5JztcclxuaW1wb3J0IElQYXJzZXIgZnJvbSAnLi9zcmMvaW50ZXJmYWNlcy9JUGFyc2VyJztcclxuaW1wb3J0ICogYXMgRlMgZnJvbSAnZnMnO1xyXG5cclxuLyoqXHJcbiAqIEEgY2xhc3MgdGhhdCBwYXJzZXMgYSBzb3VyY2UgY29kZSBhbmQgZ2VuZXJhdGVzIGFuIEFTVC5cclxuICogXHJcbiAqIEBjbGFzcyBQYXJzZXJcclxuICogQGltcGxlbWVudHMgSVBhcnNlclxyXG4gKiBcclxuICogIyBFeGFtcGxlXHJcbiAqIFxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKHtcclxuICogIG5hbWU6ICcuLi4nLFxyXG4gKiAgcGF0aDogJy4uLi4nLFxyXG4gKiAgdGV4dDogJy4uLidcclxuICogfSwgeyBsYW5ndWFnZTogJ3R5cGVzY3JpcHQnIH0pO1xyXG4gKiBcclxuICogY29uc3QgcmVzdWx0ID0gcGFyc2VyLnBhcnNlKCk7XHJcbiAqIFxyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhcnNlciBpbXBsZW1lbnRzIElQYXJzZXIge1xyXG5cclxuICBwcml2YXRlIHBhcnNlcjogSVBhcnNlcjtcclxuICBjb25zdHJ1Y3RvcihmaWxlOiBJRmlsZSwgb3B0aW9uczogYW55ID0ge30pIHtcclxuICAgIHRoaXMucGFyc2VyID0gKG5ldyBQYXJzZXJGYWN0b3J5KGZpbGUsIG9wdGlvbnMpKS5nZXRQYXJzZXIoKTtcclxuICB9XHJcbiAgcGFyc2UgPSAoKSA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIucGFyc2UoKVxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgcmVzdWx0ID0gbmV3IFBhcnNlcih7XHJcbiAgbmFtZTogJ2luZGV4LnRzJyxcclxuICBwYXRoOiAnLi4vLi4vJyxcclxuICB0ZXh0OiBGUy5yZWFkRmlsZVN5bmMoYCR7cHJvY2Vzcy5jd2QoKX0vZXhhbXBsZS50c2AsICd1dGYtOCcpXHJcbn0sIHtcclxuICBsYW5ndWFnZTogJ3R5cGVzY3JpcHQnXHJcbn0pLnBhcnNlKCk7XHJcblxyXG5cclxuY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSlcclxuLy8gY29uc29sZS5sb2cocmVzdWx0KTtcclxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLHVEQUFnRDtBQUVoRCx5QkFBeUI7QUFFekI7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQXFCLE1BQU07SUFHekIsWUFBWSxJQUFZLEVBQUUsVUFBZSxFQUFFO1FBRzNDLFVBQUssR0FBRyxHQUFHLEVBQUU7WUFDWCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDNUIsQ0FBQyxDQUFBO1FBSkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksdUJBQWEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMvRCxDQUFDO0NBSUY7QUFURCx5QkFTQztBQUVELE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDO0lBQ3hCLElBQUksRUFBRSxVQUFVO0lBQ2hCLElBQUksRUFBRSxRQUFRO0lBQ2QsSUFBSSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLGFBQWEsRUFBRSxPQUFPLENBQUM7Q0FDOUQsRUFBRTtJQUNELFFBQVEsRUFBRSxZQUFZO0NBQ3ZCLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUdYLCtDQUErQztBQUMvQyx1QkFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU291cmNlIGZyb20gJy4vc3JjL2ludGVyZmFjZXMvU291cmNlJztcbmltcG9ydCBQYXJzZXJGYWN0b3J5IGZyb20gJy4vc3JjL1BhcnNlckZhY3RvcnknO1xuaW1wb3J0IElQYXJzZXIgZnJvbSAnLi9zcmMvaW50ZXJmYWNlcy9JUGFyc2VyJztcbmltcG9ydCAqIGFzIEZTIGZyb20gJ2ZzJztcblxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgcGFyc2VzIGEgc291cmNlIGNvZGUgYW5kIGdlbmVyYXRlcyBhbiBBU1QuXG4gKiBcbiAqIEBjbGFzcyBQYXJzZXJcbiAqIEBpbXBsZW1lbnRzIElQYXJzZXJcbiAqIFxuICogIyBFeGFtcGxlXG4gKiBcbiAqIGBgYGpzXG4gKiBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKHtcbiAqICBuYW1lOiAnLi4uJyxcbiAqICBwYXRoOiAnLi4uLicsXG4gKiAgdGV4dDogJy4uLidcbiAqIH0sIHsgbGFuZ3VhZ2U6ICd0eXBlc2NyaXB0JyB9KTtcbiAqIFxuICogY29uc3QgcmVzdWx0ID0gcGFyc2VyLnBhcnNlKCk7XG4gKiBcbiAqIGBgYFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYXJzZXIgaW1wbGVtZW50cyBJUGFyc2VyIHtcblxuICBwcml2YXRlIHBhcnNlcjogSVBhcnNlcjtcbiAgY29uc3RydWN0b3IoZmlsZTogU291cmNlLCBvcHRpb25zOiBhbnkgPSB7fSkge1xuICAgIHRoaXMucGFyc2VyID0gKG5ldyBQYXJzZXJGYWN0b3J5KGZpbGUsIG9wdGlvbnMpKS5nZXRQYXJzZXIoKTtcbiAgfVxuICBwYXJzZSA9ICgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIucGFyc2UoKVxuICB9XG59XG5cbmNvbnN0IHJlc3VsdCA9IG5ldyBQYXJzZXIoe1xuICBuYW1lOiAnaW5kZXgudHMnLFxuICBwYXRoOiAnLi4vLi4vJyxcbiAgdGV4dDogRlMucmVhZEZpbGVTeW5jKGAke3Byb2Nlc3MuY3dkKCl9L2V4YW1wbGUudHNgLCAndXRmLTgnKVxufSwge1xuICBsYW5ndWFnZTogJ3R5cGVzY3JpcHQnXG59KS5wYXJzZSgpO1xuXG5cbi8vIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMikpXG4vLyBjb25zb2xlLmxvZyhyZXN1bHQpO1xuIl19 \ No newline at end of file diff --git a/build/src/ParserFactory.d.ts b/build/src/ParserFactory.d.ts index cc92b7b..ea645e9 100644 --- a/build/src/ParserFactory.d.ts +++ b/build/src/ParserFactory.d.ts @@ -1,8 +1,8 @@ -import IFile from "./interfaces/IFile"; +import Source from "./interfaces/Source"; import IParser from "./interfaces/IParser"; export default class ParserFactory { private file; private options; - constructor(file: IFile, options?: any); + constructor(file: Source, options?: any); getParser: () => IParser; } diff --git a/build/src/ParserFactory.js b/build/src/ParserFactory.js index c43c38f..ee0c756 100644 --- a/build/src/ParserFactory.js +++ b/build/src/ParserFactory.js @@ -25,4 +25,4 @@ class ParserFactory { } } exports.default = ParserFactory; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFyc2VyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9QYXJzZXJGYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsa0RBQWlEO0FBQ2pELGtEQUFpRDtBQUVqRCxNQUFxQixhQUFhO0lBS2hDLFlBQVksSUFBVyxFQUFFLFVBQWUsRUFBRTtRQUhsQyxZQUFPLEdBQUc7WUFDaEIsUUFBUSxFQUFFLFlBQVk7U0FDdkIsQ0FBQTtRQU1ELGNBQVMsR0FBRyxHQUFZLEVBQUU7WUFDeEIsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDM0MsS0FBSyxJQUFJLENBQUM7Z0JBQ1YsS0FBSyxZQUFZO29CQUNmLE9BQU8sSUFBSSxvQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkQsS0FBSyxJQUFJLENBQUM7Z0JBQ1YsS0FBSyxZQUFZO29CQUNmLE9BQU8sSUFBSSxvQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkQ7b0JBQ0EsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLFVBQVUsQ0FBQyxDQUFBO29CQUNyRSxNQUFNO2FBQ1Q7UUFDSCxDQUFDLENBQUE7UUFoQkMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3RDLENBQUM7Q0FnQkY7QUF4QkQsZ0NBd0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IElGaWxlIGZyb20gXCIuL2ludGVyZmFjZXMvSUZpbGVcIjtcclxuaW1wb3J0IElQYXJzZXIgZnJvbSBcIi4vaW50ZXJmYWNlcy9JUGFyc2VyXCI7XHJcbmltcG9ydCBKYXZhU2NyaXB0UGFyc2VyIGZyb20gXCIuL2xhbmcvamF2YXNjcmlwdFwiO1xyXG5pbXBvcnQgVHlwZVNjcmlwdFBhcnNlciBmcm9tICcuL2xhbmcvdHlwZXNjcmlwdCc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYXJzZXJGYWN0b3J5IHtcclxuICBwcml2YXRlIGZpbGU6IElGaWxlXHJcbiAgcHJpdmF0ZSBvcHRpb25zID0ge1xyXG4gICAgbGFuZ3VhZ2U6ICdKYXZhU2NyaXB0J1xyXG4gIH1cclxuICBjb25zdHJ1Y3RvcihmaWxlOiBJRmlsZSwgb3B0aW9uczogYW55ID0ge30pIHtcclxuICAgIHRoaXMuZmlsZSA9IGZpbGU7XHJcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucywgb3B0aW9ucylcclxuICB9XHJcblxyXG4gIGdldFBhcnNlciA9ICgpOiBJUGFyc2VyID0+IHtcclxuICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLmxhbmd1YWdlLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgY2FzZSAnanMnOlxyXG4gICAgICBjYXNlICdqYXZhc2NyaXB0JzpcclxuICAgICAgICByZXR1cm4gbmV3IEphdmFTY3JpcHRQYXJzZXIodGhpcy5maWxlLCB0aGlzLm9wdGlvbnMpO1xyXG4gICAgICBjYXNlICd0cyc6XHJcbiAgICAgIGNhc2UgJ3R5cGVzY3JpcHQnOlxyXG4gICAgICAgIHJldHVybiBuZXcgVHlwZVNjcmlwdFBhcnNlcih0aGlzLmZpbGUsIHRoaXMub3B0aW9ucyk7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgIGNvbnNvbGUubG9nKGBbbXItZG9jXTogTm8gcGFyc2VyIGZvciAke3RoaXMub3B0aW9ucy5sYW5ndWFnZX0gZXhpc3RzLmApXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFyc2VyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9QYXJzZXJGYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsa0RBQWlEO0FBQ2pELGtEQUFpRDtBQUVqRCxNQUFxQixhQUFhO0lBS2hDLFlBQVksSUFBWSxFQUFFLFVBQWUsRUFBRTtRQUhuQyxZQUFPLEdBQUc7WUFDaEIsUUFBUSxFQUFFLFlBQVk7U0FDdkIsQ0FBQTtRQU1ELGNBQVMsR0FBRyxHQUFZLEVBQUU7WUFDeEIsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDM0MsS0FBSyxJQUFJLENBQUM7Z0JBQ1YsS0FBSyxZQUFZO29CQUNmLE9BQU8sSUFBSSxvQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkQsS0FBSyxJQUFJLENBQUM7Z0JBQ1YsS0FBSyxZQUFZO29CQUNmLE9BQU8sSUFBSSxvQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkQ7b0JBQ0EsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLFVBQVUsQ0FBQyxDQUFBO29CQUNyRSxNQUFNO2FBQ1Q7UUFDSCxDQUFDLENBQUE7UUFoQkMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3RDLENBQUM7Q0FnQkY7QUF4QkQsZ0NBd0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuaW1wb3J0IElQYXJzZXIgZnJvbSBcIi4vaW50ZXJmYWNlcy9JUGFyc2VyXCI7XG5pbXBvcnQgSmF2YVNjcmlwdFBhcnNlciBmcm9tIFwiLi9sYW5nL2phdmFzY3JpcHRcIjtcbmltcG9ydCBUeXBlU2NyaXB0UGFyc2VyIGZyb20gJy4vbGFuZy90eXBlc2NyaXB0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFyc2VyRmFjdG9yeSB7XG4gIHByaXZhdGUgZmlsZTogU291cmNlXG4gIHByaXZhdGUgb3B0aW9ucyA9IHtcbiAgICBsYW5ndWFnZTogJ0phdmFTY3JpcHQnXG4gIH1cbiAgY29uc3RydWN0b3IoZmlsZTogU291cmNlLCBvcHRpb25zOiBhbnkgPSB7fSkge1xuICAgIHRoaXMuZmlsZSA9IGZpbGU7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdGlvbnMsIG9wdGlvbnMpXG4gIH1cblxuICBnZXRQYXJzZXIgPSAoKTogSVBhcnNlciA9PiB7XG4gICAgc3dpdGNoICh0aGlzLm9wdGlvbnMubGFuZ3VhZ2UudG9Mb3dlckNhc2UoKSkge1xuICAgICAgY2FzZSAnanMnOlxuICAgICAgY2FzZSAnamF2YXNjcmlwdCc6XG4gICAgICAgIHJldHVybiBuZXcgSmF2YVNjcmlwdFBhcnNlcih0aGlzLmZpbGUsIHRoaXMub3B0aW9ucyk7XG4gICAgICBjYXNlICd0cyc6XG4gICAgICBjYXNlICd0eXBlc2NyaXB0JzpcbiAgICAgICAgcmV0dXJuIG5ldyBUeXBlU2NyaXB0UGFyc2VyKHRoaXMuZmlsZSwgdGhpcy5vcHRpb25zKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICBjb25zb2xlLmxvZyhgW21yLWRvY106IE5vIHBhcnNlciBmb3IgJHt0aGlzLm9wdGlvbnMubGFuZ3VhZ2V9IGV4aXN0cy5gKVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxufSJdfQ== \ No newline at end of file diff --git a/build/src/interfaces/IParser.d.ts b/build/src/interfaces/IParser.d.ts index ec5d74d..0e90d3f 100644 --- a/build/src/interfaces/IParser.d.ts +++ b/build/src/interfaces/IParser.d.ts @@ -1,5 +1,5 @@ -import IFile from "./IFile"; +import Source from "./Source"; export default abstract class IParser { - constructor(file: IFile, options: any); + constructor(file: Source, options: any); abstract parse(): any; } diff --git a/build/src/interfaces/IParser.js b/build/src/interfaces/IParser.js index 30cc3ca..f23212a 100644 --- a/build/src/interfaces/IParser.js +++ b/build/src/interfaces/IParser.js @@ -6,4 +6,4 @@ class IParser { } } exports.default = IParser; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSVBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbnRlcmZhY2VzL0lQYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSxtQ0FBbUM7QUFFbkMsTUFBOEIsT0FBTztJQUNuQyxZQUFZLElBQVcsRUFBRSxPQUFZO0lBRXJDLENBQUM7Q0FFRjtBQUxELDBCQUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IElGaWxlIGZyb20gXCIuL0lGaWxlXCI7XHJcbi8vIGltcG9ydCBJUmVzdWx0IGZyb20gXCIuL0lSZXN1bHRcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGFic3RyYWN0IGNsYXNzIElQYXJzZXIge1xyXG4gIGNvbnN0cnVjdG9yKGZpbGU6IElGaWxlLCBvcHRpb25zOiBhbnkpIHtcclxuXHJcbiAgfVxyXG4gIGFic3RyYWN0IHBhcnNlKCk6IGFueVxyXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSVBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbnRlcmZhY2VzL0lQYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSxtQ0FBbUM7QUFFbkMsTUFBOEIsT0FBTztJQUNuQyxZQUFZLElBQVksRUFBRSxPQUFZO0lBRXRDLENBQUM7Q0FFRjtBQUxELDBCQUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi9Tb3VyY2VcIjtcbi8vIGltcG9ydCBJUmVzdWx0IGZyb20gXCIuL0lSZXN1bHRcIjtcblxuZXhwb3J0IGRlZmF1bHQgYWJzdHJhY3QgY2xhc3MgSVBhcnNlciB7XG4gIGNvbnN0cnVjdG9yKGZpbGU6IFNvdXJjZSwgb3B0aW9uczogYW55KSB7XG5cbiAgfVxuICBhYnN0cmFjdCBwYXJzZSgpOiBhbnlcbn0iXX0= \ No newline at end of file diff --git a/build/src/interfaces/Source.d.ts b/build/src/interfaces/Source.d.ts new file mode 100644 index 0000000..d0f8af4 --- /dev/null +++ b/build/src/interfaces/Source.d.ts @@ -0,0 +1,5 @@ +export default interface Source { + name: string; + path: string; + text: string; +} diff --git a/build/src/interfaces/Source.js b/build/src/interfaces/Source.js new file mode 100644 index 0000000..0d8ff4e --- /dev/null +++ b/build/src/interfaces/Source.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvU291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBpbnRlcmZhY2UgU291cmNlIHtcbiAgbmFtZTogc3RyaW5nLFxuICBwYXRoOiBzdHJpbmcsXG4gIHRleHQ6IHN0cmluZ1xufSJdfQ== \ No newline at end of file diff --git a/build/src/interfaces/TextRange.js b/build/src/interfaces/TextRange.js index 8d356dc..5973c0c 100644 --- a/build/src/interfaces/TextRange.js +++ b/build/src/interfaces/TextRange.js @@ -1,3 +1,3 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGV4dFJhbmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvVGV4dFJhbmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuLyoqXHJcbiAqIEFuIGludGVyZmFjZSB0aGF0IHJlcHJlc2VudHMgYSByYW5nZS5cclxuICogXHJcbiAqIGBgYHhkb2NcclxuICogQGludGVyZmFjZSBSYW5nZVxyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmFuZ2Uge1xyXG4gIHN0YXJ0OiBudW1iZXIsXHJcbiAgZW5kOiBudW1iZXJcclxufVxyXG5cclxuLyoqXHJcbiAqIEFuIGludGVyZmFjZSB0aGF0IHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uYWwgXHJcbiAqIGFuZCBsb2NhdGlvbmFsIHJhbmdlcyBvZiBhIHNvdXJjZSBjb2RlLlxyXG4gKiBcclxuICogYGBgeGRvY1xyXG4gKiBAaW50ZXJmYWNlIFRleHRSYW5nZVxyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGludGVyZmFjZSBUZXh0UmFuZ2Uge1xyXG4gIC8qKlxyXG4gICAqIFJlcHJlc2VudHMgYSBjb250ZXh0J3Mgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbi5cclxuICAgKiBgYGB4ZG9jXHJcbiAgICogQHByb3BlcnR5IHBvc2l0aW9uOiB7XHJcbiAgICogIHN0YXJ0OiBudW1iZXIsXHJcbiAgICogIGVuZDogbnVtYmVyXHJcbiAgICogfVxyXG4gICAqIGBgYFxyXG4gICAqL1xyXG4gIHBvc2l0aW9uOiBSYW5nZVxyXG4gIC8qKlxyXG4gICAqIFJlcHJlc2VudHMgYSBjb250ZXh0J3Mgcm93IGFuZCBjb2x1bW4gbG9jYXRpb24uXHJcbiAgICogXHJcbiAgICogYGBgeGRvY1xyXG4gICAqIEBsb2NhdGlvbjoge1xyXG4gICAqICByb3c6IFJhbmdlLFxyXG4gICAqICBjb2x1bW46IFJhbmdlXHJcbiAgICogfVxyXG4gICAqIGBgYFxyXG4gICAqL1xyXG4gIGxvY2F0aW9uOiB7XHJcbiAgICByb3c6IFJhbmdlLFxyXG4gICAgY29sdW1uOiBSYW5nZVxyXG4gIH1cclxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGV4dFJhbmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvVGV4dFJhbmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogQW4gaW50ZXJmYWNlIHRoYXQgcmVwcmVzZW50cyBhIHJhbmdlLlxuICogXG4gKiBgYGB4ZG9jXG4gKiBAaW50ZXJmYWNlIFJhbmdlXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSYW5nZSB7XG4gIHN0YXJ0OiBudW1iZXIsXG4gIGVuZDogbnVtYmVyXG59XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIHRoYXQgcmVwcmVzZW50cyB0aGUgcG9zaXRpb25hbCBcbiAqIGFuZCBsb2NhdGlvbmFsIHJhbmdlcyBvZiBhIHNvdXJjZSBjb2RlLlxuICogXG4gKiBgYGB4ZG9jXG4gKiBAaW50ZXJmYWNlIFRleHRSYW5nZVxuICogYGBgXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGludGVyZmFjZSBUZXh0UmFuZ2Uge1xuICAvKipcbiAgICogUmVwcmVzZW50cyBhIGNvbnRleHQncyBzdGFydCBhbmQgZW5kIHBvc2l0aW9uLlxuICAgKiBgYGB4ZG9jXG4gICAqIEBwcm9wZXJ0eSBwb3NpdGlvbjoge1xuICAgKiAgc3RhcnQ6IG51bWJlcixcbiAgICogIGVuZDogbnVtYmVyXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBwb3NpdGlvbjogUmFuZ2VcbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgYSBjb250ZXh0J3Mgcm93IGFuZCBjb2x1bW4gbG9jYXRpb24uXG4gICAqIFxuICAgKiBgYGB4ZG9jXG4gICAqIEBsb2NhdGlvbjoge1xuICAgKiAgcm93OiBSYW5nZSxcbiAgICogIGNvbHVtbjogUmFuZ2VcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGxvY2F0aW9uOiB7XG4gICAgcm93OiBSYW5nZSxcbiAgICBjb2x1bW46IFJhbmdlXG4gIH1cbn0iXX0= \ No newline at end of file diff --git a/build/src/lang/javascript/index.d.ts b/build/src/lang/javascript/index.d.ts index 8b50039..89ada78 100644 --- a/build/src/lang/javascript/index.d.ts +++ b/build/src/lang/javascript/index.d.ts @@ -1,5 +1,5 @@ import IParser from '../../interfaces/IParser'; -import IFile from '../../interfaces/IFile'; +import Source from '../../interfaces/Source'; /** * A class that parses JavaScript comments. * @@ -15,6 +15,6 @@ export default class JavaScriptParser implements IParser { private file; private options; private parser; - constructor(file: IFile, options: any); + constructor(file: Source, options: any); parse: () => void; } diff --git a/build/src/lang/javascript/index.js b/build/src/lang/javascript/index.js index 48643af..dc10aab 100644 --- a/build/src/lang/javascript/index.js +++ b/build/src/lang/javascript/index.js @@ -53,4 +53,4 @@ class JavaScriptParser { } } exports.default = JavaScriptParser; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy9qYXZhc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNDO0FBQ3RDLHFEQUFxRDtBQUdyRCxrREFBa0Q7QUFDbEQsb0RBQW9EO0FBRXBEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFxQixnQkFBZ0I7SUFJbkMsWUFBWSxJQUFXLEVBQUUsT0FBWTtRQU1yQyxVQUFLLEdBQUcsR0FBRyxFQUFFO1lBQ1gsZ0RBQWdEO1lBQ2hELDJCQUEyQjtZQUMzQiw2Q0FBNkM7WUFDN0MsaURBQWlEO1lBQ2pELDhDQUE4QztZQUM5QyxnRUFBZ0U7WUFFaEUsNkNBQTZDO1lBQzdDLG9EQUFvRDtZQUNwRCwrQ0FBK0M7WUFDL0MsNkRBQTZEO1lBQzdELGdCQUFnQjtZQUNoQiw0Q0FBNEM7WUFDNUMsMkNBQTJDO1lBQzNDLDJDQUEyQztZQUMzQyw0Q0FBNEM7WUFDNUMsNkNBQTZDO1lBQzdDLDZDQUE2QztZQUM3QyxRQUFRO1lBQ1Isd0NBQXdDO1lBQ3hDLElBQUk7WUFDSixXQUFXO1lBQ1gscUJBQXFCO1lBQ3JCLGlFQUFpRTtZQUNqRSwrQkFBK0I7WUFDL0IsOEJBQThCO1lBQzlCLCtCQUErQjtZQUMvQixJQUFJO1FBQ04sQ0FBQyxDQUFBO1FBbENDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN0QyxDQUFDO0NBZ0ZGO0FBekZELG1DQXlGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFBhcnNlciBmcm9tICd0cmVlLXNpdHRlcic7XHJcbmltcG9ydCAqIGFzIEphdmFTY3JpcHQgZnJvbSAndHJlZS1zaXR0ZXItamF2YXNjcmlwdCc7XHJcbmltcG9ydCBJUGFyc2VyIGZyb20gJy4uLy4uL2ludGVyZmFjZXMvSVBhcnNlcic7XHJcbmltcG9ydCBJRmlsZSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lGaWxlJztcclxuLy8gaW1wb3J0IElSZXN1bHQgZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9JUmVzdWx0JztcclxuLy8gaW1wb3J0IElDb21tZW50IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvSUNvbW1lbnQnO1xyXG5cclxuLyoqXHJcbiAqIEEgY2xhc3MgdGhhdCBwYXJzZXMgSmF2YVNjcmlwdCBjb21tZW50cy5cclxuICogXHJcbiAqICMgQVBJXHJcbiAqIFxyXG4gKiBgYGBcclxuICogQGNsYXNzIEphdmFTY3JpcHRQYXJzZXJcclxuICogQGltcGxlbWVudHMgSVBhcnNlclxyXG4gKiBAZXhwb3J0IGRlZmF1bHRcclxuICogYGBgXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBKYXZhU2NyaXB0UGFyc2VyIGltcGxlbWVudHMgSVBhcnNlciB7XHJcbiAgcHJpdmF0ZSBmaWxlOiBJRmlsZTtcclxuICBwcml2YXRlIG9wdGlvbnM6IGFueTtcclxuICBwcml2YXRlIHBhcnNlcjogUGFyc2VyO1xyXG4gIGNvbnN0cnVjdG9yKGZpbGU6IElGaWxlLCBvcHRpb25zOiBhbnkpIHtcclxuICAgIHRoaXMuZmlsZSA9IGZpbGU7XHJcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucyA9IHt9LCBvcHRpb25zIHx8IHt9KTtcclxuICAgIHRoaXMucGFyc2VyID0gbmV3IFBhcnNlcigpO1xyXG4gICAgdGhpcy5wYXJzZXIuc2V0TGFuZ3VhZ2UoSmF2YVNjcmlwdCk7XHJcbiAgfVxyXG4gIHBhcnNlID0gKCkgPT4ge1xyXG4gICAgLy8gbGV0IHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZSh0aGlzLmZpbGUudGV4dCk7XHJcbiAgICAvLyAvLyBHZXQgdGhlIGZpcnN0IGNvbW1lbnRcclxuICAgIC8vIGxldCBmaXJzdF9jb21tZW50ID0gdHJlZS5yb290Tm9kZS5jaGlsZHJlblxyXG4gICAgLy8gICAuZmlsdGVyKG5vZGUgPT4gbm9kZS50eXBlID09PSBcImNvbW1lbnRcIilbMF07XHJcbiAgICAvLyBjb25zdCBmaXJzdF9jb21tZW50X3N0cmluZyA9IHRoaXMuZmlsZS50ZXh0XHJcbiAgICAvLyAuc3Vic3RyaW5nKGZpcnN0X2NvbW1lbnQuc3RhcnRJbmRleCwgZmlyc3RfY29tbWVudC5lbmRJbmRleCk7XHJcbiAgICBcclxuICAgIC8vIC8vIFJlbW92ZSBhbnkgbGVnYWwgb3IgdW5uY2Vzc2FyeSBjb21tZW50c1xyXG4gICAgLy8gaWYgKGZpcnN0X2NvbW1lbnRfc3RyaW5nLmluY2x1ZGVzKFwiY29weXJpZ2h0XCIpIHx8XHJcbiAgICAvLyAgIGZpcnN0X2NvbW1lbnRfc3RyaW5nLmluY2x1ZGVzKFwiYXV0aG9yXCIpIHx8XHJcbiAgICAvLyAgIGZpcnN0X2NvbW1lbnRfc3RyaW5nLmluY2x1ZGVzKFwidGVybXMgYW5kIGNvbmRpdGlvbnNcIikpIHtcclxuICAgIC8vICAgdHJlZS5lZGl0KHtcclxuICAgIC8vICAgICBzdGFydEluZGV4OiBmaXJzdF9jb21tZW50LnN0YXJ0SW5kZXgsXHJcbiAgICAvLyAgICAgb2xkRW5kSW5kZXg6IGZpcnN0X2NvbW1lbnQuZW5kSW5kZXgsXHJcbiAgICAvLyAgICAgbmV3RW5kSW5kZXg6IGZpcnN0X2NvbW1lbnQuZW5kSW5kZXgsXHJcbiAgICAvLyAgICAgc3RhcnRQb3NpdGlvbjogeyByb3c6IDAsIGNvbHVtbjogMCB9LFxyXG4gICAgLy8gICAgIG9sZEVuZFBvc2l0aW9uOiB7IHJvdzogMCwgY29sdW1uOiAwIH0sXHJcbiAgICAvLyAgICAgbmV3RW5kUG9zaXRpb246IHsgcm93OiAwLCBjb2x1bW46IDAgfSxcclxuICAgIC8vICAgfSk7XHJcbiAgICAvLyAgIHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZSgnJywgdHJlZSk7XHJcbiAgICAvLyB9XHJcbiAgICAvLyByZXR1cm4ge1xyXG4gICAgLy8gICBmaWxlOiB0aGlzLmZpbGUsXHJcbiAgICAvLyAgIGNvbW1lbnRzOiBDb21tZW50UGFyc2VyLnBhcnNlKHRyZWUucm9vdE5vZGUsIHRoaXMuZmlsZS50ZXh0KVxyXG4gICAgLy8gICAgIC5maWx0ZXIodGhpcy5maWx0ZXJUeXBlKVxyXG4gICAgLy8gICAgIC8vIC5tYXAodGhpcy5jaGVja1R5cGUpXHJcbiAgICAvLyAgICAgLm1hcCh0aGlzLnBhcnNlQ2hpbGRyZW4pXHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICAvLyBwcml2YXRlIGZpbHRlclR5cGUgPSAoY29tbWVudCk6IGJvb2xlYW4gPT4ge1xyXG4gIC8vICAgcmV0dXJuICh0aGlzLm9wdGlvbnMuZmlsdGVyIHx8XHJcbiAgLy8gICAgIFtcclxuICAvLyAgICAgICAnZnVuY3Rpb24nLFxyXG4gIC8vICAgICAgICdjbGFzcycsXHJcbiAgLy8gICAgICAgJ3ZhcmlhYmxlX2RlY2xhcmF0aW9uJ1xyXG4gIC8vICAgICBdKS5pbmNsdWRlcyhjb21tZW50LmNvbnRleHQudHlwZSlcclxuICAvLyB9XHJcblxyXG4gIC8vIHByaXZhdGUgY2hlY2tUeXBlID0gKGNvbW1lbnQpID0+IHtcclxuICAvLyAgIGNvbnN0IHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZShjb21tZW50LmNvbnRleHQudGV4dCk7XHJcbiAgLy8gICBzd2l0Y2ggKGNvbW1lbnQuY29udGV4dC50eXBlKSB7XHJcbiAgLy8gICAgIGNhc2UgJ3ZhcmlhYmxlX2RlY2xhcmF0aW9uJzpcclxuICAvLyAgICAgICAvLyBDaGVjayB3aGV0aGVyIHdlIGhhdmUgYW4gYW5vbnltb3VzIGNsYXNzXHJcbiAgLy8gICAgICAgaWYgKGNvbW1lbnQuY29udGV4dC50ZXh0LmluY2x1ZGVzKFwiY2xhc3NcIikpIHtcclxuICAvLyAgICAgICAgIC8vIERyaWxsIGRvd24gdW50aWwgd2UgZmluZCB0aGUgY2xhc3MgYm9keVxyXG4gIC8vICAgICAgICAgY29uc3QgdmFyaWFibGVfZGVjbGFyYXRvciA9IHRyZWUucm9vdE5vZGUuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMV07XHJcbiAgLy8gICAgICAgICBjb25zdCBhbm9ueW1vdXNfY2xhc3MgPSB2YXJpYWJsZV9kZWNsYXJhdG9yLmNoaWxkcmVuXHJcbiAgLy8gICAgICAgICAgIC5maWx0ZXIobm9kZSA9PiBub2RlLnR5cGUgPT09IFwiYW5vbnltb3VzX2NsYXNzXCIpWzBdXHJcbiAgLy8gICAgICAgICBjb25zdCBjbGFzc19ib2R5ID0gYW5vbnltb3VzX2NsYXNzLmNoaWxkcmVuWzFdO1xyXG4gIC8vICAgICAgICAgY29tbWVudC5jb250ZXh0LmNoaWxkcmVuID0gQ29tbWVudFBhcnNlci5wYXJzZShcclxuICAvLyAgICAgICAgICAgY2xhc3NfYm9keSxcclxuICAvLyAgICAgICAgICAgY29tbWVudC5jb250ZXh0LnRleHQsXHJcbiAgLy8gICAgICAgICAgIHsgbG9jYXRpb246IGNvbW1lbnQuY29udGV4dC5sb2NhdGlvbiwgcG9zaXRpb246IGNvbW1lbnQuY29udGV4dC5wb3NpdGlvbiB9XHJcbiAgLy8gICAgICAgICApO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgZGVmYXVsdDpcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgIH1cclxuICAvLyAgIHJldHVybiBjb21tZW50O1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gcHJpdmF0ZSBwYXJzZUNoaWxkcmVuID0gKGNvbW1lbnQpID0+IHtcclxuICAvLyAgIHN3aXRjaCAoY29tbWVudC5jb250ZXh0LnR5cGUpIHtcclxuICAvLyAgICAgY2FzZSAnY2xhc3MnOlxyXG4gIC8vICAgICAgIGNvbnN0IHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZShjb21tZW50LmNvbnRleHQudGV4dCk7XHJcbiAgLy8gICAgICAgY29tbWVudC5jb250ZXh0LmNoaWxkcmVuID0gQ29tbWVudFBhcnNlci5wYXJzZShcclxuICAvLyAgICAgICAgIHRyZWUucm9vdE5vZGUsXHJcbiAgLy8gICAgICAgICBjb21tZW50LmNvbnRleHQudGV4dCxcclxuICAvLyAgICAgICAgIHsgbG9jYXRpb246IGNvbW1lbnQuY29udGV4dC5sb2NhdGlvbiwgcG9zaXRpb246IGNvbW1lbnQuY29udGV4dC5wb3NpdGlvbiB9XHJcbiAgLy8gICAgICAgKS5maWx0ZXIoY2hpbGQgPT4gY2hpbGQuY29udGV4dC50eXBlID09PSAnbWV0aG9kX2RlZmluaXRpb24nKTtcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgZGVmYXVsdDpcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgIH1cclxuICAvLyAgIHJldHVybiBjb21tZW50O1xyXG4gIC8vIH1cclxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy9qYXZhc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNDO0FBQ3RDLHFEQUFxRDtBQUdyRCxrREFBa0Q7QUFDbEQsb0RBQW9EO0FBRXBEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFxQixnQkFBZ0I7SUFJbkMsWUFBWSxJQUFZLEVBQUUsT0FBWTtRQU10QyxVQUFLLEdBQUcsR0FBRyxFQUFFO1lBQ1gsZ0RBQWdEO1lBQ2hELDJCQUEyQjtZQUMzQiw2Q0FBNkM7WUFDN0MsaURBQWlEO1lBQ2pELDhDQUE4QztZQUM5QyxnRUFBZ0U7WUFFaEUsNkNBQTZDO1lBQzdDLG9EQUFvRDtZQUNwRCwrQ0FBK0M7WUFDL0MsNkRBQTZEO1lBQzdELGdCQUFnQjtZQUNoQiw0Q0FBNEM7WUFDNUMsMkNBQTJDO1lBQzNDLDJDQUEyQztZQUMzQyw0Q0FBNEM7WUFDNUMsNkNBQTZDO1lBQzdDLDZDQUE2QztZQUM3QyxRQUFRO1lBQ1Isd0NBQXdDO1lBQ3hDLElBQUk7WUFDSixXQUFXO1lBQ1gscUJBQXFCO1lBQ3JCLGlFQUFpRTtZQUNqRSwrQkFBK0I7WUFDL0IsOEJBQThCO1lBQzlCLCtCQUErQjtZQUMvQixJQUFJO1FBQ04sQ0FBQyxDQUFBO1FBbENDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN0QyxDQUFDO0NBZ0ZGO0FBekZELG1DQXlGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFBhcnNlciBmcm9tICd0cmVlLXNpdHRlcic7XG5pbXBvcnQgKiBhcyBKYXZhU2NyaXB0IGZyb20gJ3RyZWUtc2l0dGVyLWphdmFzY3JpcHQnO1xuaW1wb3J0IElQYXJzZXIgZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9JUGFyc2VyJztcbmltcG9ydCBTb3VyY2UgZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2UnO1xuLy8gaW1wb3J0IElSZXN1bHQgZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9JUmVzdWx0Jztcbi8vIGltcG9ydCBJQ29tbWVudCBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lDb21tZW50JztcblxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgcGFyc2VzIEphdmFTY3JpcHQgY29tbWVudHMuXG4gKiBcbiAqICMgQVBJXG4gKiBcbiAqIGBgYFxuICogQGNsYXNzIEphdmFTY3JpcHRQYXJzZXJcbiAqIEBpbXBsZW1lbnRzIElQYXJzZXJcbiAqIEBleHBvcnQgZGVmYXVsdFxuICogYGBgXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEphdmFTY3JpcHRQYXJzZXIgaW1wbGVtZW50cyBJUGFyc2VyIHtcbiAgcHJpdmF0ZSBmaWxlOiBTb3VyY2U7XG4gIHByaXZhdGUgb3B0aW9uczogYW55O1xuICBwcml2YXRlIHBhcnNlcjogUGFyc2VyO1xuICBjb25zdHJ1Y3RvcihmaWxlOiBTb3VyY2UsIG9wdGlvbnM6IGFueSkge1xuICAgIHRoaXMuZmlsZSA9IGZpbGU7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdGlvbnMgPSB7fSwgb3B0aW9ucyB8fCB7fSk7XG4gICAgdGhpcy5wYXJzZXIgPSBuZXcgUGFyc2VyKCk7XG4gICAgdGhpcy5wYXJzZXIuc2V0TGFuZ3VhZ2UoSmF2YVNjcmlwdCk7XG4gIH1cbiAgcGFyc2UgPSAoKSA9PiB7XG4gICAgLy8gbGV0IHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZSh0aGlzLmZpbGUudGV4dCk7XG4gICAgLy8gLy8gR2V0IHRoZSBmaXJzdCBjb21tZW50XG4gICAgLy8gbGV0IGZpcnN0X2NvbW1lbnQgPSB0cmVlLnJvb3ROb2RlLmNoaWxkcmVuXG4gICAgLy8gICAuZmlsdGVyKG5vZGUgPT4gbm9kZS50eXBlID09PSBcImNvbW1lbnRcIilbMF07XG4gICAgLy8gY29uc3QgZmlyc3RfY29tbWVudF9zdHJpbmcgPSB0aGlzLmZpbGUudGV4dFxuICAgIC8vIC5zdWJzdHJpbmcoZmlyc3RfY29tbWVudC5zdGFydEluZGV4LCBmaXJzdF9jb21tZW50LmVuZEluZGV4KTtcbiAgICBcbiAgICAvLyAvLyBSZW1vdmUgYW55IGxlZ2FsIG9yIHVubmNlc3NhcnkgY29tbWVudHNcbiAgICAvLyBpZiAoZmlyc3RfY29tbWVudF9zdHJpbmcuaW5jbHVkZXMoXCJjb3B5cmlnaHRcIikgfHxcbiAgICAvLyAgIGZpcnN0X2NvbW1lbnRfc3RyaW5nLmluY2x1ZGVzKFwiYXV0aG9yXCIpIHx8XG4gICAgLy8gICBmaXJzdF9jb21tZW50X3N0cmluZy5pbmNsdWRlcyhcInRlcm1zIGFuZCBjb25kaXRpb25zXCIpKSB7XG4gICAgLy8gICB0cmVlLmVkaXQoe1xuICAgIC8vICAgICBzdGFydEluZGV4OiBmaXJzdF9jb21tZW50LnN0YXJ0SW5kZXgsXG4gICAgLy8gICAgIG9sZEVuZEluZGV4OiBmaXJzdF9jb21tZW50LmVuZEluZGV4LFxuICAgIC8vICAgICBuZXdFbmRJbmRleDogZmlyc3RfY29tbWVudC5lbmRJbmRleCxcbiAgICAvLyAgICAgc3RhcnRQb3NpdGlvbjogeyByb3c6IDAsIGNvbHVtbjogMCB9LFxuICAgIC8vICAgICBvbGRFbmRQb3NpdGlvbjogeyByb3c6IDAsIGNvbHVtbjogMCB9LFxuICAgIC8vICAgICBuZXdFbmRQb3NpdGlvbjogeyByb3c6IDAsIGNvbHVtbjogMCB9LFxuICAgIC8vICAgfSk7XG4gICAgLy8gICB0cmVlID0gdGhpcy5wYXJzZXIucGFyc2UoJycsIHRyZWUpO1xuICAgIC8vIH1cbiAgICAvLyByZXR1cm4ge1xuICAgIC8vICAgZmlsZTogdGhpcy5maWxlLFxuICAgIC8vICAgY29tbWVudHM6IENvbW1lbnRQYXJzZXIucGFyc2UodHJlZS5yb290Tm9kZSwgdGhpcy5maWxlLnRleHQpXG4gICAgLy8gICAgIC5maWx0ZXIodGhpcy5maWx0ZXJUeXBlKVxuICAgIC8vICAgICAvLyAubWFwKHRoaXMuY2hlY2tUeXBlKVxuICAgIC8vICAgICAubWFwKHRoaXMucGFyc2VDaGlsZHJlbilcbiAgICAvLyB9XG4gIH1cblxuICAvLyBwcml2YXRlIGZpbHRlclR5cGUgPSAoY29tbWVudCk6IGJvb2xlYW4gPT4ge1xuICAvLyAgIHJldHVybiAodGhpcy5vcHRpb25zLmZpbHRlciB8fFxuICAvLyAgICAgW1xuICAvLyAgICAgICAnZnVuY3Rpb24nLFxuICAvLyAgICAgICAnY2xhc3MnLFxuICAvLyAgICAgICAndmFyaWFibGVfZGVjbGFyYXRpb24nXG4gIC8vICAgICBdKS5pbmNsdWRlcyhjb21tZW50LmNvbnRleHQudHlwZSlcbiAgLy8gfVxuXG4gIC8vIHByaXZhdGUgY2hlY2tUeXBlID0gKGNvbW1lbnQpID0+IHtcbiAgLy8gICBjb25zdCB0cmVlID0gdGhpcy5wYXJzZXIucGFyc2UoY29tbWVudC5jb250ZXh0LnRleHQpO1xuICAvLyAgIHN3aXRjaCAoY29tbWVudC5jb250ZXh0LnR5cGUpIHtcbiAgLy8gICAgIGNhc2UgJ3ZhcmlhYmxlX2RlY2xhcmF0aW9uJzpcbiAgLy8gICAgICAgLy8gQ2hlY2sgd2hldGhlciB3ZSBoYXZlIGFuIGFub255bW91cyBjbGFzc1xuICAvLyAgICAgICBpZiAoY29tbWVudC5jb250ZXh0LnRleHQuaW5jbHVkZXMoXCJjbGFzc1wiKSkge1xuICAvLyAgICAgICAgIC8vIERyaWxsIGRvd24gdW50aWwgd2UgZmluZCB0aGUgY2xhc3MgYm9keVxuICAvLyAgICAgICAgIGNvbnN0IHZhcmlhYmxlX2RlY2xhcmF0b3IgPSB0cmVlLnJvb3ROb2RlLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzFdO1xuICAvLyAgICAgICAgIGNvbnN0IGFub255bW91c19jbGFzcyA9IHZhcmlhYmxlX2RlY2xhcmF0b3IuY2hpbGRyZW5cbiAgLy8gICAgICAgICAgIC5maWx0ZXIobm9kZSA9PiBub2RlLnR5cGUgPT09IFwiYW5vbnltb3VzX2NsYXNzXCIpWzBdXG4gIC8vICAgICAgICAgY29uc3QgY2xhc3NfYm9keSA9IGFub255bW91c19jbGFzcy5jaGlsZHJlblsxXTtcbiAgLy8gICAgICAgICBjb21tZW50LmNvbnRleHQuY2hpbGRyZW4gPSBDb21tZW50UGFyc2VyLnBhcnNlKFxuICAvLyAgICAgICAgICAgY2xhc3NfYm9keSxcbiAgLy8gICAgICAgICAgIGNvbW1lbnQuY29udGV4dC50ZXh0LFxuICAvLyAgICAgICAgICAgeyBsb2NhdGlvbjogY29tbWVudC5jb250ZXh0LmxvY2F0aW9uLCBwb3NpdGlvbjogY29tbWVudC5jb250ZXh0LnBvc2l0aW9uIH1cbiAgLy8gICAgICAgICApO1xuICAvLyAgICAgICB9XG4gIC8vICAgICAgIGJyZWFrO1xuICAvLyAgICAgZGVmYXVsdDpcbiAgLy8gICAgICAgYnJlYWs7XG4gIC8vICAgfVxuICAvLyAgIHJldHVybiBjb21tZW50O1xuICAvLyB9XG5cbiAgLy8gcHJpdmF0ZSBwYXJzZUNoaWxkcmVuID0gKGNvbW1lbnQpID0+IHtcbiAgLy8gICBzd2l0Y2ggKGNvbW1lbnQuY29udGV4dC50eXBlKSB7XG4gIC8vICAgICBjYXNlICdjbGFzcyc6XG4gIC8vICAgICAgIGNvbnN0IHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZShjb21tZW50LmNvbnRleHQudGV4dCk7XG4gIC8vICAgICAgIGNvbW1lbnQuY29udGV4dC5jaGlsZHJlbiA9IENvbW1lbnRQYXJzZXIucGFyc2UoXG4gIC8vICAgICAgICAgdHJlZS5yb290Tm9kZSxcbiAgLy8gICAgICAgICBjb21tZW50LmNvbnRleHQudGV4dCxcbiAgLy8gICAgICAgICB7IGxvY2F0aW9uOiBjb21tZW50LmNvbnRleHQubG9jYXRpb24sIHBvc2l0aW9uOiBjb21tZW50LmNvbnRleHQucG9zaXRpb24gfVxuICAvLyAgICAgICApLmZpbHRlcihjaGlsZCA9PiBjaGlsZC5jb250ZXh0LnR5cGUgPT09ICdtZXRob2RfZGVmaW5pdGlvbicpO1xuICAvLyAgICAgICBicmVhaztcbiAgLy8gICAgIGRlZmF1bHQ6XG4gIC8vICAgICAgIGJyZWFrO1xuICAvLyAgIH1cbiAgLy8gICByZXR1cm4gY29tbWVudDtcbiAgLy8gfVxufSJdfQ== \ No newline at end of file diff --git a/build/src/lang/typescript/Node.d.ts b/build/src/lang/typescript/Node.d.ts index d04ca42..f806940 100644 --- a/build/src/lang/typescript/Node.d.ts +++ b/build/src/lang/typescript/Node.d.ts @@ -2,7 +2,7 @@ import TextRange from "../../interfaces/TextRange"; import { SyntaxNode } from "tree-sitter"; import { DocumentationNode } from 'xdoc-parser/src/XDocASTNode'; import { RemarkNode } from 'xdoc-parser/src/XDocParser'; -import IFile from "../../interfaces/IFile"; +import Source from "../../interfaces/Source"; export interface Node extends TextRange { text: string; properties?: Partial; @@ -11,7 +11,7 @@ export interface Node extends TextRange { documentation: Partial; }; } -export declare function createNode(file: IFile, node: SyntaxNode, properties?: Partial, document?: boolean): Node; +export declare function createNode(file: Source, node: SyntaxNode, properties?: Partial, document?: boolean): Node; export interface NodeProperties { exports: Partial; inheritance: Partial; diff --git a/build/src/lang/typescript/Node.js b/build/src/lang/typescript/Node.js index a134a03..0ec8291 100644 --- a/build/src/lang/typescript/Node.js +++ b/build/src/lang/typescript/Node.js @@ -2,8 +2,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); const range_1 = require("../../utils/range"); const xdoc_parser_1 = require("xdoc-parser"); +const text_1 = require("../../utils/text"); function createNode(file, node, properties, document) { - let node_ = Object.assign({}, range_1.default(node), { text: file.text.substring(node.startIndex, node.endIndex) }); + let node_ = Object.assign({}, range_1.default(node), { text: text_1.text(file, node) }); if (properties) { node_ = Object.assign(node_, { properties }); } @@ -13,4 +14,4 @@ function createNode(file, node, properties, document) { return node_; } exports.createNode = createNode; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvTm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLDZDQUFzQztBQUN0Qyw2Q0FBK0I7QUFlL0IsU0FBZ0IsVUFBVSxDQUN4QixJQUFXLEVBQ1gsSUFBZ0IsRUFDaEIsVUFBb0MsRUFDcEMsUUFBa0I7SUFHbEIsSUFBSSxLQUFLLHFCQUFRLGVBQUssQ0FBQyxJQUFJLENBQUMsSUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUUsQ0FBQTtJQUV6RixJQUFJLFVBQVUsRUFBRTtRQUNkLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUE7S0FDN0M7SUFFRCxJQUFJLFFBQVEsRUFBRTtRQUNaLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxxQkFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7S0FDakU7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFqQkQsZ0NBaUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRleHRSYW5nZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9UZXh0UmFuZ2VcIjtcclxuaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5pbXBvcnQgcmFuZ2UgZnJvbSBcIi4uLy4uL3V0aWxzL3JhbmdlXCI7XHJcbmltcG9ydCB4ZG9jIGZyb20gJ3hkb2MtcGFyc2VyJztcclxuaW1wb3J0IHsgRG9jdW1lbnRhdGlvbk5vZGUgfSBmcm9tICd4ZG9jLXBhcnNlci9zcmMvWERvY0FTVE5vZGUnO1xyXG5pbXBvcnQgeyBSZW1hcmtOb2RlIH0gZnJvbSAneGRvYy1wYXJzZXIvc3JjL1hEb2NQYXJzZXInO1xyXG5pbXBvcnQgSUZpbGUgZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvSUZpbGVcIjtcclxuXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE5vZGUgZXh0ZW5kcyBUZXh0UmFuZ2Uge1xyXG4gIHRleHQ6IHN0cmluZyxcclxuICBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz5cclxuICB4ZG9jPzoge1xyXG4gICAgbWFya2Rvd246IFJlbWFya05vZGUsXHJcbiAgICBkb2N1bWVudGF0aW9uOiBQYXJ0aWFsPERvY3VtZW50YXRpb25Ob2RlPlxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU5vZGUoXHJcbiAgZmlsZTogSUZpbGUsIFxyXG4gIG5vZGU6IFN5bnRheE5vZGUsIFxyXG4gIHByb3BlcnRpZXM/OiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPixcclxuICBkb2N1bWVudD86IGJvb2xlYW4sXHJcbik6IE5vZGUge1xyXG5cclxuICBsZXQgbm9kZV8gPSB7IC4uLnJhbmdlKG5vZGUpLCB0ZXh0OiBmaWxlLnRleHQuc3Vic3RyaW5nKG5vZGUuc3RhcnRJbmRleCwgbm9kZS5lbmRJbmRleCkgfVxyXG5cclxuICBpZiAocHJvcGVydGllcykge1xyXG4gICAgbm9kZV8gPSBPYmplY3QuYXNzaWduKG5vZGVfLCB7IHByb3BlcnRpZXMgfSlcclxuICB9XHJcbiAgXHJcbiAgaWYgKGRvY3VtZW50KSB7XHJcbiAgICBub2RlXyA9IE9iamVjdC5hc3NpZ24obm9kZV8sIHsgeGRvYzogeGRvYyhub2RlXy50ZXh0KS5wYXJzZSgpIH0pXHJcbiAgfVxyXG4gIHJldHVybiBub2RlXztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBOb2RlUHJvcGVydGllcyB7XHJcbiAgZXhwb3J0czogUGFydGlhbDxOb2RlRXhwb3J0cz5cclxuICBpbmhlcml0YW5jZTogUGFydGlhbDxOb2RlSW5oZXJpdGFuY2U+XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTm9kZUV4cG9ydHMge1xyXG4gIGV4cG9ydDogYm9vbGVhbixcclxuICBkZWZhdWx0OiBib29sZWFuXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTm9kZUluaGVyaXRhbmNlIHtcclxuICBleHRlbmRzOiBib29sZWFuLFxyXG4gIGltcGxlbWVudHM6IGJvb2xlYW5cclxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvTm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLDZDQUFzQztBQUN0Qyw2Q0FBK0I7QUFJL0IsMkNBQXdDO0FBWXhDLFNBQWdCLFVBQVUsQ0FDeEIsSUFBWSxFQUNaLElBQWdCLEVBQ2hCLFVBQW9DLEVBQ3BDLFFBQWtCO0lBR2xCLElBQUksS0FBSyxxQkFBUSxlQUFLLENBQUMsSUFBSSxDQUFDLElBQUUsSUFBSSxFQUFFLFdBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUUsQ0FBQTtJQUV0RCxJQUFJLFVBQVUsRUFBRTtRQUNkLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUE7S0FDN0M7SUFFRCxJQUFJLFFBQVEsRUFBRTtRQUNaLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxxQkFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7S0FDakU7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFqQkQsZ0NBaUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRleHRSYW5nZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9UZXh0UmFuZ2VcIjtcbmltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcbmltcG9ydCByYW5nZSBmcm9tIFwiLi4vLi4vdXRpbHMvcmFuZ2VcIjtcbmltcG9ydCB4ZG9jIGZyb20gJ3hkb2MtcGFyc2VyJztcbmltcG9ydCB7IERvY3VtZW50YXRpb25Ob2RlIH0gZnJvbSAneGRvYy1wYXJzZXIvc3JjL1hEb2NBU1ROb2RlJztcbmltcG9ydCB7IFJlbWFya05vZGUgfSBmcm9tICd4ZG9jLXBhcnNlci9zcmMvWERvY1BhcnNlcic7XG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuaW1wb3J0IHsgdGV4dCB9IGZyb20gXCIuLi8uLi91dGlscy90ZXh0XCI7XG5cblxuZXhwb3J0IGludGVyZmFjZSBOb2RlIGV4dGVuZHMgVGV4dFJhbmdlIHtcbiAgdGV4dDogc3RyaW5nLFxuICBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz5cbiAgeGRvYz86IHtcbiAgICBtYXJrZG93bjogUmVtYXJrTm9kZSxcbiAgICBkb2N1bWVudGF0aW9uOiBQYXJ0aWFsPERvY3VtZW50YXRpb25Ob2RlPlxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVOb2RlKFxuICBmaWxlOiBTb3VyY2UsIFxuICBub2RlOiBTeW50YXhOb2RlLCBcbiAgcHJvcGVydGllcz86IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+LFxuICBkb2N1bWVudD86IGJvb2xlYW4sXG4pOiBOb2RlIHtcblxuICBsZXQgbm9kZV8gPSB7IC4uLnJhbmdlKG5vZGUpLCB0ZXh0OiB0ZXh0KGZpbGUsIG5vZGUpIH1cblxuICBpZiAocHJvcGVydGllcykge1xuICAgIG5vZGVfID0gT2JqZWN0LmFzc2lnbihub2RlXywgeyBwcm9wZXJ0aWVzIH0pXG4gIH1cbiAgXG4gIGlmIChkb2N1bWVudCkge1xuICAgIG5vZGVfID0gT2JqZWN0LmFzc2lnbihub2RlXywgeyB4ZG9jOiB4ZG9jKG5vZGVfLnRleHQpLnBhcnNlKCkgfSlcbiAgfVxuICByZXR1cm4gbm9kZV87XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9kZVByb3BlcnRpZXMge1xuICBleHBvcnRzOiBQYXJ0aWFsPE5vZGVFeHBvcnRzPlxuICBpbmhlcml0YW5jZTogUGFydGlhbDxOb2RlSW5oZXJpdGFuY2U+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9kZUV4cG9ydHMge1xuICBleHBvcnQ6IGJvb2xlYW4sXG4gIGRlZmF1bHQ6IGJvb2xlYW5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb2RlSW5oZXJpdGFuY2Uge1xuICBleHRlbmRzOiBib29sZWFuLFxuICBpbXBsZW1lbnRzOiBib29sZWFuXG59Il19 \ No newline at end of file diff --git a/build/src/lang/typescript/index.d.ts b/build/src/lang/typescript/index.d.ts index c13b5a6..852228a 100644 --- a/build/src/lang/typescript/index.d.ts +++ b/build/src/lang/typescript/index.d.ts @@ -1,5 +1,5 @@ import IParser from '../../interfaces/IParser'; -import IFile from '../../interfaces/IFile'; +import Source from '../../interfaces/Source'; /** * A class that parses JavaScript comments. * @@ -15,6 +15,6 @@ export default class TypeScriptParser implements IParser { private file; private options; private parser; - constructor(file: IFile, options: any); + constructor(file: Source, options: any); parse: () => any[]; } diff --git a/build/src/lang/typescript/index.js b/build/src/lang/typescript/index.js index 18fed5f..a6c0ad4 100644 --- a/build/src/lang/typescript/index.js +++ b/build/src/lang/typescript/index.js @@ -29,4 +29,4 @@ class TypeScriptParser { } } exports.default = TypeScriptParser; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy90eXBlc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNDO0FBQ3RDLHFEQUFxRDtBQUdyRCxnRUFBMEQ7QUFHMUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQXFCLGdCQUFnQjtJQUluQyxZQUFZLElBQVcsRUFBRSxPQUFZO1FBTXJDLFVBQUssR0FBRyxHQUFHLEVBQUU7WUFDWCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9DLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO2dCQUNwQyxPQUFPLDhCQUFZLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7YUFDOUM7UUFDSCxDQUFDLENBQUE7UUFWQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdEMsQ0FBQztDQU9GO0FBaEJELG1DQWdCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFBhcnNlciBmcm9tICd0cmVlLXNpdHRlcic7XHJcbmltcG9ydCAqIGFzIFR5cGVTY3JpcHQgZnJvbSAndHJlZS1zaXR0ZXItdHlwZXNjcmlwdCc7XHJcbmltcG9ydCBJUGFyc2VyIGZyb20gJy4uLy4uL2ludGVyZmFjZXMvSVBhcnNlcic7XHJcbmltcG9ydCBJRmlsZSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lGaWxlJztcclxuaW1wb3J0IHsgdmlzaXRQcm9ncmFtIH0gZnJvbSAnLi92aXNpdG9ycy9wcm9ncmFtLnZpc2l0b3InO1xyXG5cclxuXHJcbi8qKlxyXG4gKiBBIGNsYXNzIHRoYXQgcGFyc2VzIEphdmFTY3JpcHQgY29tbWVudHMuXHJcbiAqIFxyXG4gKiAjIEFQSVxyXG4gKiBcclxuICogYGBgXHJcbiAqIEBjbGFzcyBKYXZhU2NyaXB0UGFyc2VyXHJcbiAqIEBpbXBsZW1lbnRzIElQYXJzZXJcclxuICogQGV4cG9ydCBkZWZhdWx0XHJcbiAqIGBgYFxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVHlwZVNjcmlwdFBhcnNlciBpbXBsZW1lbnRzIElQYXJzZXIge1xyXG4gIHByaXZhdGUgZmlsZTogSUZpbGU7XHJcbiAgcHJpdmF0ZSBvcHRpb25zOiBhbnk7XHJcbiAgcHJpdmF0ZSBwYXJzZXI6IFBhcnNlcjtcclxuICBjb25zdHJ1Y3RvcihmaWxlOiBJRmlsZSwgb3B0aW9uczogYW55KSB7XHJcbiAgICB0aGlzLmZpbGUgPSBmaWxlO1xyXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdGlvbnMgPSB7fSwgb3B0aW9ucyB8fCB7fSk7XHJcbiAgICB0aGlzLnBhcnNlciA9IG5ldyBQYXJzZXIoKTtcclxuICAgIHRoaXMucGFyc2VyLnNldExhbmd1YWdlKFR5cGVTY3JpcHQpO1xyXG4gIH1cclxuICBwYXJzZSA9ICgpID0+IHtcclxuICAgIGNvbnN0IHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZSh0aGlzLmZpbGUudGV4dCk7XHJcbiAgICBpZiAodHJlZS5yb290Tm9kZS50eXBlID09PSBcInByb2dyYW1cIikge1xyXG4gICAgICByZXR1cm4gdmlzaXRQcm9ncmFtKHRoaXMuZmlsZSwgdHJlZS5yb290Tm9kZSlcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy90eXBlc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNDO0FBQ3RDLHFEQUFxRDtBQUdyRCxnRUFBMEQ7QUFHMUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQXFCLGdCQUFnQjtJQUluQyxZQUFZLElBQVksRUFBRSxPQUFZO1FBTXRDLFVBQUssR0FBRyxHQUFHLEVBQUU7WUFDWCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9DLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO2dCQUNwQyxPQUFPLDhCQUFZLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7YUFDOUM7UUFDSCxDQUFDLENBQUE7UUFWQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdEMsQ0FBQztDQU9GO0FBaEJELG1DQWdCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFBhcnNlciBmcm9tICd0cmVlLXNpdHRlcic7XG5pbXBvcnQgKiBhcyBUeXBlU2NyaXB0IGZyb20gJ3RyZWUtc2l0dGVyLXR5cGVzY3JpcHQnO1xuaW1wb3J0IElQYXJzZXIgZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9JUGFyc2VyJztcbmltcG9ydCBTb3VyY2UgZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2UnO1xuaW1wb3J0IHsgdmlzaXRQcm9ncmFtIH0gZnJvbSAnLi92aXNpdG9ycy9wcm9ncmFtLnZpc2l0b3InO1xuXG5cbi8qKlxuICogQSBjbGFzcyB0aGF0IHBhcnNlcyBKYXZhU2NyaXB0IGNvbW1lbnRzLlxuICogXG4gKiAjIEFQSVxuICogXG4gKiBgYGBcbiAqIEBjbGFzcyBKYXZhU2NyaXB0UGFyc2VyXG4gKiBAaW1wbGVtZW50cyBJUGFyc2VyXG4gKiBAZXhwb3J0IGRlZmF1bHRcbiAqIGBgYFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUeXBlU2NyaXB0UGFyc2VyIGltcGxlbWVudHMgSVBhcnNlciB7XG4gIHByaXZhdGUgZmlsZTogU291cmNlO1xuICBwcml2YXRlIG9wdGlvbnM6IGFueTtcbiAgcHJpdmF0ZSBwYXJzZXI6IFBhcnNlcjtcbiAgY29uc3RydWN0b3IoZmlsZTogU291cmNlLCBvcHRpb25zOiBhbnkpIHtcbiAgICB0aGlzLmZpbGUgPSBmaWxlO1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5vcHRpb25zID0ge30sIG9wdGlvbnMgfHwge30pO1xuICAgIHRoaXMucGFyc2VyID0gbmV3IFBhcnNlcigpO1xuICAgIHRoaXMucGFyc2VyLnNldExhbmd1YWdlKFR5cGVTY3JpcHQpO1xuICB9XG4gIHBhcnNlID0gKCkgPT4ge1xuICAgIGNvbnN0IHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZSh0aGlzLmZpbGUudGV4dCk7XG4gICAgaWYgKHRyZWUucm9vdE5vZGUudHlwZSA9PT0gXCJwcm9ncmFtXCIpIHtcbiAgICAgIHJldHVybiB2aXNpdFByb2dyYW0odGhpcy5maWxlLCB0cmVlLnJvb3ROb2RlKVxuICAgIH1cbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/call_signature.visitor.d.ts b/build/src/lang/typescript/visitors/call_signature.visitor.d.ts index 7a69a90..cd5f928 100644 --- a/build/src/lang/typescript/visitors/call_signature.visitor.d.ts +++ b/build/src/lang/typescript/visitors/call_signature.visitor.d.ts @@ -1,6 +1,6 @@ import { SyntaxNode } from "tree-sitter"; -import IFile from "../../../interfaces/IFile"; -export declare function visitCallSignature(source: IFile, node: SyntaxNode): { +import Source from "../../../interfaces/Source"; +export declare function visitCallSignature(source: Source, node: SyntaxNode): { type_parameters: any; formal_parameters: any; type_annotation: any; diff --git a/build/src/lang/typescript/visitors/call_signature.visitor.js b/build/src/lang/typescript/visitors/call_signature.visitor.js index faecbf0..ccbd8af 100644 --- a/build/src/lang/typescript/visitors/call_signature.visitor.js +++ b/build/src/lang/typescript/visitors/call_signature.visitor.js @@ -1,9 +1,9 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const match_1 = require("../../../utils/match"); -const type_parameters_visitor_1 = require("./type_parameters.visitor"); const formal_parameters_visitor_1 = require("./formal_parameters.visitor"); const type_visitor_1 = require("./type.visitor"); +const match_1 = require("../../../utils/match"); +const type_parameters_visitor_1 = require("./type_parameters.visitor"); function visitCallSignature(source, node) { let call_signature = node.children, type_parameters, formal_parameters, type_annotation; if (match_1.default(call_signature[0], 'type_parameters')) { @@ -19,4 +19,4 @@ function visitCallSignature(source, node) { return { type_parameters, formal_parameters, type_annotation }; } exports.visitCallSignature = visitCallSignature; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsbF9zaWduYXR1cmUudmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvY2FsbF9zaWduYXR1cmUudmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLGdEQUF5QztBQUN6Qyx1RUFBNEQ7QUFDNUQsMkVBQW9FO0FBQ3BFLGlEQUEyQztBQUczQyxTQUFnQixrQkFBa0IsQ0FBQyxNQUFhLEVBQUUsSUFBZ0I7SUFFOUQsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFDbEMsZUFBZSxFQUNmLGlCQUFpQixFQUNqQixlQUFlLENBQUM7SUFFaEIsSUFBSSxlQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLEVBQUU7UUFDN0MsZUFBZSxHQUFHLGlDQUFtQixDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUN6RTtJQUVELElBQUksZUFBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxFQUFFO1FBQy9DLGlCQUFpQixHQUFHLGlEQUFxQixDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUM3RTtJQUVELElBQUksZUFBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFO1FBQzdDLElBQUksSUFBSSxHQUFHLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsZUFBZSxHQUFHLHdCQUFTLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQzdDO0lBRUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsQ0FBQTtBQUVsRSxDQUFDO0FBdEJELGdEQXNCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcclxuaW1wb3J0IG1hdGNoIGZyb20gXCIuLi8uLi8uLi91dGlscy9tYXRjaFwiO1xyXG5pbXBvcnQgdmlzaXRUeXBlUGFyYW1ldGVycyBmcm9tIFwiLi90eXBlX3BhcmFtZXRlcnMudmlzaXRvclwiO1xyXG5pbXBvcnQgeyB2aXNpdEZvcm1hbFBhcmFtZXRlcnMgfSBmcm9tIFwiLi9mb3JtYWxfcGFyYW1ldGVycy52aXNpdG9yXCI7XHJcbmltcG9ydCB7IHZpc2l0VHlwZSB9IGZyb20gXCIuL3R5cGUudmlzaXRvclwiO1xyXG5pbXBvcnQgSUZpbGUgZnJvbSBcIi4uLy4uLy4uL2ludGVyZmFjZXMvSUZpbGVcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB2aXNpdENhbGxTaWduYXR1cmUoc291cmNlOiBJRmlsZSwgbm9kZTogU3ludGF4Tm9kZSkge1xyXG5cclxuICAgIGxldCBjYWxsX3NpZ25hdHVyZSA9IG5vZGUuY2hpbGRyZW4sXHJcbiAgICB0eXBlX3BhcmFtZXRlcnMsXHJcbiAgICBmb3JtYWxfcGFyYW1ldGVycyxcclxuICAgIHR5cGVfYW5ub3RhdGlvbjtcclxuXHJcbiAgICBpZiAobWF0Y2goY2FsbF9zaWduYXR1cmVbMF0sICd0eXBlX3BhcmFtZXRlcnMnKSkge1xyXG4gICAgICAgIHR5cGVfcGFyYW1ldGVycyA9IHZpc2l0VHlwZVBhcmFtZXRlcnMoc291cmNlLCBjYWxsX3NpZ25hdHVyZS5zaGlmdCgpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobWF0Y2goY2FsbF9zaWduYXR1cmVbMF0sICdmb3JtYWxfcGFyYW1ldGVycycpKSB7XHJcbiAgICAgICAgZm9ybWFsX3BhcmFtZXRlcnMgPSB2aXNpdEZvcm1hbFBhcmFtZXRlcnMoc291cmNlLCBjYWxsX3NpZ25hdHVyZS5zaGlmdCgpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobWF0Y2goY2FsbF9zaWduYXR1cmVbMF0sICd0eXBlX2Fubm90YXRpb24nKSkge1xyXG4gICAgICAgIGxldCB0eXBlID0gY2FsbF9zaWduYXR1cmUuc2hpZnQoKS5jaGlsZHJlblsxXTtcclxuICAgICAgICB0eXBlX2Fubm90YXRpb24gPSB2aXNpdFR5cGUoc291cmNlLCB0eXBlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyB0eXBlX3BhcmFtZXRlcnMsIGZvcm1hbF9wYXJhbWV0ZXJzLCB0eXBlX2Fubm90YXRpb24gfVxyXG5cclxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsbF9zaWduYXR1cmUudmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvY2FsbF9zaWduYXR1cmUudmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLDJFQUFvRTtBQUNwRSxpREFBMkM7QUFFM0MsZ0RBQXlDO0FBQ3pDLHVFQUE0RDtBQUU1RCxTQUFnQixrQkFBa0IsQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFFL0QsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFDbEMsZUFBZSxFQUNmLGlCQUFpQixFQUNqQixlQUFlLENBQUM7SUFFaEIsSUFBSSxlQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLEVBQUU7UUFDN0MsZUFBZSxHQUFHLGlDQUFtQixDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUN6RTtJQUVELElBQUksZUFBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxFQUFFO1FBQy9DLGlCQUFpQixHQUFHLGlEQUFxQixDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUM3RTtJQUVELElBQUksZUFBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFO1FBQzdDLElBQUksSUFBSSxHQUFHLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsZUFBZSxHQUFHLHdCQUFTLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQzdDO0lBRUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsQ0FBQTtBQUVsRSxDQUFDO0FBdEJELGdEQXNCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcbmltcG9ydCB7IHZpc2l0Rm9ybWFsUGFyYW1ldGVycyB9IGZyb20gXCIuL2Zvcm1hbF9wYXJhbWV0ZXJzLnZpc2l0b3JcIjtcbmltcG9ydCB7IHZpc2l0VHlwZSB9IGZyb20gXCIuL3R5cGUudmlzaXRvclwiO1xuaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi4vLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2VcIjtcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbWF0Y2hcIjtcbmltcG9ydCB2aXNpdFR5cGVQYXJhbWV0ZXJzIGZyb20gXCIuL3R5cGVfcGFyYW1ldGVycy52aXNpdG9yXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiB2aXNpdENhbGxTaWduYXR1cmUoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpIHtcblxuICAgIGxldCBjYWxsX3NpZ25hdHVyZSA9IG5vZGUuY2hpbGRyZW4sXG4gICAgdHlwZV9wYXJhbWV0ZXJzLFxuICAgIGZvcm1hbF9wYXJhbWV0ZXJzLFxuICAgIHR5cGVfYW5ub3RhdGlvbjtcblxuICAgIGlmIChtYXRjaChjYWxsX3NpZ25hdHVyZVswXSwgJ3R5cGVfcGFyYW1ldGVycycpKSB7XG4gICAgICAgIHR5cGVfcGFyYW1ldGVycyA9IHZpc2l0VHlwZVBhcmFtZXRlcnMoc291cmNlLCBjYWxsX3NpZ25hdHVyZS5zaGlmdCgpKTtcbiAgICB9XG5cbiAgICBpZiAobWF0Y2goY2FsbF9zaWduYXR1cmVbMF0sICdmb3JtYWxfcGFyYW1ldGVycycpKSB7XG4gICAgICAgIGZvcm1hbF9wYXJhbWV0ZXJzID0gdmlzaXRGb3JtYWxQYXJhbWV0ZXJzKHNvdXJjZSwgY2FsbF9zaWduYXR1cmUuc2hpZnQoKSk7XG4gICAgfVxuXG4gICAgaWYgKG1hdGNoKGNhbGxfc2lnbmF0dXJlWzBdLCAndHlwZV9hbm5vdGF0aW9uJykpIHtcbiAgICAgICAgbGV0IHR5cGUgPSBjYWxsX3NpZ25hdHVyZS5zaGlmdCgpLmNoaWxkcmVuWzFdO1xuICAgICAgICB0eXBlX2Fubm90YXRpb24gPSB2aXNpdFR5cGUoc291cmNlLCB0eXBlKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyB0eXBlX3BhcmFtZXRlcnMsIGZvcm1hbF9wYXJhbWV0ZXJzLCB0eXBlX2Fubm90YXRpb24gfVxuXG59Il19 \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/class.visitor.d.ts b/build/src/lang/typescript/visitors/class.visitor.d.ts index b560029..ca405ae 100644 --- a/build/src/lang/typescript/visitors/class.visitor.d.ts +++ b/build/src/lang/typescript/visitors/class.visitor.d.ts @@ -1,7 +1,7 @@ -import { SyntaxNode } from "tree-sitter"; import { NodeProperties } from "../Node"; -import IFile from "../../../interfaces/IFile"; -export declare function visitClass(source: IFile, node: SyntaxNode, comment: SyntaxNode, properties?: Partial): { +import { SyntaxNode } from "tree-sitter"; +import Source from "../../../interfaces/Source"; +export declare function visitClass(source: Source, node: SyntaxNode, comment: SyntaxNode, properties?: Partial): { type: string; identifier: import("../Node").Node; type_parameters: { @@ -71,7 +71,7 @@ export declare function visitClass(source: IFile, node: SyntaxNode, comment: Syn comment: import("../Node").Node; context: import("../Node").Node; }; -export declare function visitClassHeritage(source: IFile, node: SyntaxNode): { +export declare function visitClassHeritage(source: Source, node: SyntaxNode): { type: string; heritage_type: string; context: import("../Node").Node; @@ -80,7 +80,7 @@ export declare function visitClassHeritage(source: IFile, node: SyntaxNode): { context: import("../Node").Node; }[]; }; -export declare function visitClassBody(source: IFile, node: SyntaxNode): { +export declare function visitClassBody(source: Source, node: SyntaxNode): { type: string; context: import("../Node").Node; methods: any[]; diff --git a/build/src/lang/typescript/visitors/class.visitor.js b/build/src/lang/typescript/visitors/class.visitor.js index 1a648c2..412e58a 100644 --- a/build/src/lang/typescript/visitors/class.visitor.js +++ b/build/src/lang/typescript/visitors/class.visitor.js @@ -1,13 +1,13 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const Node_1 = require("../Node"); -const type_parameters_visitor_1 = require("./type_parameters.visitor"); -const match_1 = require("../../../utils/match"); const comment_1 = require("../../../utils/comment"); +const Node_1 = require("../Node"); const method_definition_visitor_1 = require("./method_definition.visitor"); -const public_field_definition_visitor_1 = require("../public_field_definition.visitor"); +const public_field_definition_visitor_1 = require("./public_field_definition.visitor"); const type_visitor_1 = require("./type.visitor"); const log_1 = require("../../../utils/log"); +const match_1 = require("../../../utils/match"); +const type_parameters_visitor_1 = require("./type_parameters.visitor"); function visitClass(source, node, comment, properties) { let children = node.children; // Remove 'class' from the array @@ -22,7 +22,7 @@ function visitClass(source, node, comment, properties) { case 'class_body': return visitClassBody(source, child); default: - console.log(`[mr-doc::parser]: info - '${node.type.replace(/[_]/g, ' ')}' is not supported yet.`); + log_1.default.report(source, node, log_1.ErrorType.NodeTypeNotYetSupported); break; } }); @@ -74,7 +74,7 @@ function visitClassBody(source, node) { properties.push(public_field_definition_visitor_1.visitPublicFieldDefinition(source, nextSibling, child)); break; default: - log_1.default.report(source, nextSibling, log_1.ErrorType.NodeTypeNotSupported); + log_1.default.report(source, nextSibling, log_1.ErrorType.NodeTypeNotYetSupported); break; } } @@ -88,4 +88,4 @@ function visitClassBody(source, node) { }; } exports.visitClassBody = visitClassBody; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3MudmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvY2xhc3MudmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLGtDQUFxRDtBQUNyRCx1RUFBNEQ7QUFDNUQsZ0RBQXlDO0FBQ3pDLG9EQUEwRDtBQUMxRCwyRUFBb0U7QUFDcEUsd0ZBQWdGO0FBQ2hGLGlEQUFxRDtBQUVyRCw0Q0FBb0Q7QUFFcEQsU0FBZ0IsVUFBVSxDQUN4QixNQUFhLEVBQ2IsSUFBZ0IsRUFDaEIsT0FBbUIsRUFDbkIsVUFBb0M7SUFFcEMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUM3QixnQ0FBZ0M7SUFDaEMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQ2hCLE1BQU0sVUFBVSxHQUFHLGlCQUFVLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBQ3ZELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDbkMsUUFBUSxLQUFLLENBQUMsSUFBSSxFQUFFO1lBQ2xCLEtBQUssaUJBQWlCO2dCQUNwQixPQUFPLGlDQUFtQixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQTtZQUMzQyxLQUFLLGdCQUFnQjtnQkFDbkIsT0FBTyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUE7WUFDMUMsS0FBSyxZQUFZO2dCQUNmLE9BQU8sY0FBYyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQTtZQUN0QztnQkFDRSxPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLHlCQUF5QixDQUFDLENBQUE7Z0JBQ2pHLE1BQU07U0FDVDtJQUNILENBQUMsQ0FBQyxD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aEUsTUFBTTtpQkFDVDthQUNGO1NBQ0Y7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVMLE9BQU87UUFDTCxJQUFJLEVBQUUsWUFBWTtRQUNsQixPQUFPLEVBQUUsaUJBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDO1FBQ2pDLE9BQU87UUFDUCxVQUFVO0tBQ1gsQ0FBQTtBQUNILENBQUM7QUEvQkQsd0NBK0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5pbXBvcnQgeyBOb2RlUHJvcGVydGllcywgY3JlYXRlTm9kZSB9IGZyb20gXCIuLi9Ob2RlXCI7XHJcbmltcG9ydCB2aXNpdFR5cGVQYXJhbWV0ZXJzIGZyb20gXCIuL3R5cGVfcGFyYW1ldGVycy52aXNpdG9yXCI7XHJcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbWF0Y2hcIjtcclxuaW1wb3J0IHsgaXNKYXZhRG9jQ29tbWVudCB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9jb21tZW50XCI7XHJcbmltcG9ydCB7IHZpc2l0TWV0aG9kRGVmaW5pdGlvbiB9IGZyb20gXCIuL21ldGhvZF9kZWZpbml0aW9uLnZpc2l0b3JcIjtcclxuaW1wb3J0IHsgdmlzaXRQdWJsaWNGaWVsZERlZmluaXRpb24gfSBmcm9tIFwiLi4vcHVibGljX2ZpZWxkX2RlZmluaXRpb24udmlzaXRvclwiO1xyXG5pbXBvcnQgeyB2aXNpdFR5cGVJZGVudGlmaWVyIH0gZnJvbSBcIi4vdHlwZS52aXNpdG9yXCI7XHJcbmltcG9ydCBJRmlsZSBmcm9tIFwiLi4vLi4vLi4vaW50ZXJmYWNlcy9JRmlsZVwiO1xyXG5pbXBvcnQgbG9nLCB7IEVycm9yVHlwZSB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9sb2dcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB2aXNpdENsYXNzKFxyXG4gIHNvdXJjZTogSUZpbGUsXHJcbiAgbm9kZTogU3ludGF4Tm9kZSxcclxuICBjb21tZW50OiBTeW50YXhOb2RlLFxyXG4gIHByb3BlcnRpZXM/OiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPlxyXG4pIHtcclxuICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xyXG4gIC8vIFJlbW92ZSAnY2xhc3MnIGZyb20gdGhlIGFycmF5XHJcbiAgY2hpbGRyZW4uc2hpZnQoKVxyXG4gIGNvbnN0IGlkZW50aWZpZXIgPSBjcmVhdGVOb2RlKHNvdXJjZSwgY2hpbGRyZW4uc2hpZnQoKSlcclxuICBjb25zdCB2aXNpdGVkID0gY2hpbGRyZW4ubWFwKGNoaWxkID0+IHtcclxuICAgIHN3aXRjaCAoY2hpbGQudHlwZSkge1xyXG4gICAgICBjYXNlICd0eXBlX3BhcmFtZXRlcnMnOlxyXG4gICAgICAgIHJldHVybiB2aXNpdFR5cGVQYXJhbWV0ZXJzKHNvdXJjZSwgY2hpbGQpXHJcbiAgICAgIGNhc2UgJ2NsYXNzX2hlcml0YWdlJzpcclxuICAgICAgICByZXR1cm4gdmlzaXRDbGFzc0hlcml0YWdlKHNvdXJjZSwgY2hpbGQpXHJcbiAgICAgIGNhc2UgJ2NsYXNzX2JvZHknOlxyXG4gICAgICAgIHJldHVybiB2aXNpdENsYXNzQm9keShzb3VyY2UsIGNoaWxkKVxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGNvbnNvbGUubG9nKGBbbXItZG9jOjpwYXJzZXJdOiBpbmZvIC0gJyR7bm9kZS50eXBlLnJlcGxhY2UoL1tfXS9nLCAnICcpfScgaXMgbm90IHN1cHBvcnRlZCB5ZXQuYClcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgY29uc3QgdHlwZV9wYXJhbWV0ZXJzID0gdmlzaXRlZC5maWx0ZXIoY2hpbGQgPT4gY2hpbGQudHlwZSA9PT0gJ3R5cGVfcGFyYW1ldGVycycpLnNoaWZ0KClcclxuICBjb25zdCBoZXJpdGFnZSA9IHZpc2l0ZWQuZmlsdGVyKGNoaWxkID0+IGNoaWxkLnR5cGUgPT09ICdjbGFzc19oZXJpdGFnZScpLnNoaWZ0KClcclxuICBjb25zdCBib2R5ID0gdmlzaXRlZC5maWx0ZXIoY2hpbGQgPT4gY2hpbGQudHlwZSA9PT0gJ2NsYXNzX2JvZHknKS5zaGlmdCgpO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgdHlwZTogJ2NsYXNzJyxcclxuICAgIGlkZW50aWZpZXIsXHJcbiAgICB0eXBlX3BhcmFtZXRlcnMsXHJcbiAgICBoZXJpdGFnZSxcclxuICAgIGJvZHksXHJcbiAgICBwcm9wZXJ0aWVzLFxyXG4gICAgY29tbWVudDogY3JlYXRlTm9kZShzb3VyY2UsIGNvbW1lbnQsIG51bGwsIHRydWUpLFxyXG4gICAgY29udGV4dDogY3JlYXRlTm9kZShzb3VyY2UsIG5vZGUpXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRDbGFzc0hlcml0YWdlKHNvdXJjZTogSUZpbGUsIG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICBsZXQgaGVyaXRhZ2VfY2xhdXNlID0gbm9kZS5jaGlsZHJlbi5zaGlmdCgpO1xyXG4gIGxldCBoZXJpdGFnZV9jbGF1c2VfY2hpbGRyZW4gPSBoZXJpdGFnZV9jbGF1c2UuY2hpbGRyZW47XHJcbiAgLy8gUmVtb3ZlIHRoZSBoZXJpdGFnZSB0eXBlICgnaW1wbGVtZW50cycgb3IgJ2V4dGVuZHMnKVxyXG4gIGxldCBoZXJpdGFnZV90eXBlID0gaGVyaXRhZ2VfY2xhdXNlX2NoaWxkcmVuLnNoaWZ0KCk7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICB0eXBlOiAnY2xhc3NfaGVyaXRhZ2UnLFxyXG4gICAgaGVyaXRhZ2VfdHlwZTogaGVyaXRhZ2VfdHlwZS50eXBlLFxyXG4gICAgY29udGV4dDogY3JlYXRlTm9kZShzb3VyY2UsIG5vZGUpLFxyXG4gICAgLy8gQSBoZXJpdGFnZSBpcyBlaXRoZXIgJ2ltcGxlbWVudHMnIG9yICdleHRlbmRzJ1xyXG4gICAgaGVyaXRhZ2VzOiBoZXJpdGFnZV9jbGF1c2VfY2hpbGRyZW5cclxuICAgICAgLmZpbHRlcihjaGlsZCA9PiBjaGlsZC50eXBlID09PSAndHlwZV9pZGVudGlmaWVyJylcclxuICAgICAgLm1hcChjaGlsZCA9PiB2aXNpdFR5cGVJZGVudGlmaWVyKHNvdXJjZSwgY2hpbGQpKVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHZpc2l0Q2xhc3NCb2R5KHNvdXJjZTogSUZpbGUsIG5vZGU6IFN5bnRheE5vZGUpIHtcclxuXHJcbiAgY29uc3QgbWV0aG9kcyA9IFtdXHJcbiAgY29uc3QgcHJvcGVydGllcyA9IFtdXHJcbiAgbm9kZS5jaGlsZHJlblxyXG4gICAgLmZpbHRlcihjaGlsZCA9PiAhY2hpbGQudHlwZS5tYXRjaCgvW3t9XS8pKVxyXG4gICAgLmZvckVhY2goY2hpbGQgPT4ge1xyXG4gICAgICBjb25zdCBuZXh0U2libGluZyA9IGNoaWxkLm5leHRTaWJsaW5nO1xyXG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdjb21tZW50JykgJiYgaXNKYXZhRG9jQ29tbWVudChzb3VyY2UsIGNoaWxkKSkge1xyXG4gICAgICAgIGlmIChuZXh0U2libGluZykge1xyXG4gICAgICAgICAgc3dpdGNoIChuZXh0U2libGluZy50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ21ldGhvZF9kZWZpbml0aW9uJzpcclxuICAgICAgICAgICAgICBtZXRob2RzLnB1c2godmlzaXRNZXRob2REZWZpbml0aW9uKHNvdXJjZSwgbmV4dFNpYmxpbmcsIGNoaWxkKSk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ3B1YmxpY19maWVsZF9kZWZpbml0aW9uJzpcclxuICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnB1c2godmlzaXRQdWJsaWNGaWVsZERlZmluaXRpb24oc291cmNlLCBuZXh0U2libGluZywgY2hpbGQpKTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICBsb2cucmVwb3J0KHNvdXJjZSwgbmV4dFNpYmxpbmcsIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFN1cHBvcnRlZCk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIHR5cGU6ICdjbGFzc19ib2R5JyxcclxuICAgIGNvbnRleHQ6IGNyZWF0ZU5vZGUoc291cmNlLCBub2RlKSxcclxuICAgIG1ldGhvZHMsXHJcbiAgICBwcm9wZXJ0aWVzXHJcbiAgfVxyXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3MudmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvY2xhc3MudmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLG9EQUEwRDtBQUMxRCxrQ0FBcUQ7QUFFckQsMkVBQW9FO0FBQ3BFLHVGQUErRTtBQUMvRSxpREFBcUQ7QUFFckQsNENBQW9EO0FBQ3BELGdEQUF5QztBQUN6Qyx1RUFBNEQ7QUFFNUQsU0FBZ0IsVUFBVSxDQUN4QixNQUFjLEVBQ2QsSUFBZ0IsRUFDaEIsT0FBbUIsRUFDbkIsVUFBb0M7SUFFcEMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUM3QixnQ0FBZ0M7SUFDaEMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQ2hCLE1BQU0sVUFBVSxHQUFHLGlCQUFVLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBQ3ZELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDbkMsUUFBUSxLQUFLLENBQUMsSUFBSSxFQUFFO1lBQ2xCLEtBQUssaUJBQWlCO2dCQUNwQixPQUFPLGlDQUFtQixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQTtZQUMzQyxLQUFLLGdCQUFnQjtnQkFDbkIsT0FBTyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUE7WUFDMUMsS0FBSyxZQUFZO2dCQUNmLE9BQU8sY0FBYyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQTtZQUN0QztnQkFDRSxhQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsZUFBUyxDQUFDLHVCQUF1QixDQUFDLENBQUM7Z0JBQzVELE1BQU07U0FDVDtJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsTUFBTSxlQUFlLEdBQUcsT0FB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SCxDQUFDLENBQUMsQ0FBQztJQUVMLE9BQU87UUFDTCxJQUFJLEVBQUUsWUFBWTtRQUNsQixPQUFPLEVBQUUsaUJBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDO1FBQ2pDLE9BQU87UUFDUCxVQUFVO0tBQ1gsQ0FBQTtBQUNILENBQUM7QUEvQkQsd0NBK0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNKYXZhRG9jQ29tbWVudCB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9jb21tZW50XCI7XG5pbXBvcnQgeyBOb2RlUHJvcGVydGllcywgY3JlYXRlTm9kZSB9IGZyb20gXCIuLi9Ob2RlXCI7XG5pbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgeyB2aXNpdE1ldGhvZERlZmluaXRpb24gfSBmcm9tIFwiLi9tZXRob2RfZGVmaW5pdGlvbi52aXNpdG9yXCI7XG5pbXBvcnQgeyB2aXNpdFB1YmxpY0ZpZWxkRGVmaW5pdGlvbiB9IGZyb20gXCIuL3B1YmxpY19maWVsZF9kZWZpbml0aW9uLnZpc2l0b3JcIjtcbmltcG9ydCB7IHZpc2l0VHlwZUlkZW50aWZpZXIgfSBmcm9tIFwiLi90eXBlLnZpc2l0b3JcIjtcbmltcG9ydCBTb3VyY2UgZnJvbSBcIi4uLy4uLy4uL2ludGVyZmFjZXMvU291cmNlXCI7XG5pbXBvcnQgbG9nLCB7IEVycm9yVHlwZSB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9sb2dcIjtcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbWF0Y2hcIjtcbmltcG9ydCB2aXNpdFR5cGVQYXJhbWV0ZXJzIGZyb20gXCIuL3R5cGVfcGFyYW1ldGVycy52aXNpdG9yXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiB2aXNpdENsYXNzKFxuICBzb3VyY2U6IFNvdXJjZSxcbiAgbm9kZTogU3ludGF4Tm9kZSxcbiAgY29tbWVudDogU3ludGF4Tm9kZSxcbiAgcHJvcGVydGllcz86IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+XG4pIHtcbiAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgLy8gUmVtb3ZlICdjbGFzcycgZnJvbSB0aGUgYXJyYXlcbiAgY2hpbGRyZW4uc2hpZnQoKVxuICBjb25zdCBpZGVudGlmaWVyID0gY3JlYXRlTm9kZShzb3VyY2UsIGNoaWxkcmVuLnNoaWZ0KCkpXG4gIGNvbnN0IHZpc2l0ZWQgPSBjaGlsZHJlbi5tYXAoY2hpbGQgPT4ge1xuICAgIHN3aXRjaCAoY2hpbGQudHlwZSkge1xuICAgICAgY2FzZSAndHlwZV9wYXJhbWV0ZXJzJzpcbiAgICAgICAgcmV0dXJuIHZpc2l0VHlwZVBhcmFtZXRlcnMoc291cmNlLCBjaGlsZClcbiAgICAgIGNhc2UgJ2NsYXNzX2hlcml0YWdlJzpcbiAgICAgICAgcmV0dXJuIHZpc2l0Q2xhc3NIZXJpdGFnZShzb3VyY2UsIGNoaWxkKVxuICAgICAgY2FzZSAnY2xhc3NfYm9keSc6XG4gICAgICAgIHJldHVybiB2aXNpdENsYXNzQm9keShzb3VyY2UsIGNoaWxkKVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgbG9nLnJlcG9ydChzb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFlldFN1cHBvcnRlZCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgdHlwZV9wYXJhbWV0ZXJzID0gdmlzaXRlZC5maWx0ZXIoY2hpbGQgPT4gY2hpbGQudHlwZSA9PT0gJ3R5cGVfcGFyYW1ldGVycycpLnNoaWZ0KClcbiAgY29uc3QgaGVyaXRhZ2UgPSB2aXNpdGVkLmZpbHRlcihjaGlsZCA9PiBjaGlsZC50eXBlID09PSAnY2xhc3NfaGVyaXRhZ2UnKS5zaGlmdCgpXG4gIGNvbnN0IGJvZHkgPSB2aXNpdGVkLmZpbHRlcihjaGlsZCA9PiBjaGlsZC50eXBlID09PSAnY2xhc3NfYm9keScpLnNoaWZ0KCk7XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnY2xhc3MnLFxuICAgIGlkZW50aWZpZXIsXG4gICAgdHlwZV9wYXJhbWV0ZXJzLFxuICAgIGhlcml0YWdlLFxuICAgIGJvZHksXG4gICAgcHJvcGVydGllcyxcbiAgICBjb21tZW50OiBjcmVhdGVOb2RlKHNvdXJjZSwgY29tbWVudCwgbnVsbCwgdHJ1ZSksXG4gICAgY29udGV4dDogY3JlYXRlTm9kZShzb3VyY2UsIG5vZGUpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZpc2l0Q2xhc3NIZXJpdGFnZShzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSkge1xuICBsZXQgaGVyaXRhZ2VfY2xhdXNlID0gbm9kZS5jaGlsZHJlbi5zaGlmdCgpO1xuICBsZXQgaGVyaXRhZ2VfY2xhdXNlX2NoaWxkcmVuID0gaGVyaXRhZ2VfY2xhdXNlLmNoaWxkcmVuO1xuICAvLyBSZW1vdmUgdGhlIGhlcml0YWdlIHR5cGUgKCdpbXBsZW1lbnRzJyBvciAnZXh0ZW5kcycpXG4gIGxldCBoZXJpdGFnZV90eXBlID0gaGVyaXRhZ2VfY2xhdXNlX2NoaWxkcmVuLnNoaWZ0KCk7XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnY2xhc3NfaGVyaXRhZ2UnLFxuICAgIGhlcml0YWdlX3R5cGU6IGhlcml0YWdlX3R5cGUudHlwZSxcbiAgICBjb250ZXh0OiBjcmVhdGVOb2RlKHNvdXJjZSwgbm9kZSksXG4gICAgLy8gQSBoZXJpdGFnZSBpcyBlaXRoZXIgJ2ltcGxlbWVudHMnIG9yICdleHRlbmRzJ1xuICAgIGhlcml0YWdlczogaGVyaXRhZ2VfY2xhdXNlX2NoaWxkcmVuXG4gICAgICAuZmlsdGVyKGNoaWxkID0+IGNoaWxkLnR5cGUgPT09ICd0eXBlX2lkZW50aWZpZXInKVxuICAgICAgLm1hcChjaGlsZCA9PiB2aXNpdFR5cGVJZGVudGlmaWVyKHNvdXJjZSwgY2hpbGQpKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2aXNpdENsYXNzQm9keShzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSkge1xuXG4gIGNvbnN0IG1ldGhvZHMgPSBbXVxuICBjb25zdCBwcm9wZXJ0aWVzID0gW11cbiAgbm9kZS5jaGlsZHJlblxuICAgIC5maWx0ZXIoY2hpbGQgPT4gIWNoaWxkLnR5cGUubWF0Y2goL1t7fV0vKSlcbiAgICAuZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICBjb25zdCBuZXh0U2libGluZyA9IGNoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgaWYgKG1hdGNoKGNoaWxkLCAnY29tbWVudCcpICYmIGlzSmF2YURvY0NvbW1lbnQoc291cmNlLCBjaGlsZCkpIHtcbiAgICAgICAgaWYgKG5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgc3dpdGNoIChuZXh0U2libGluZy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdtZXRob2RfZGVmaW5pdGlvbic6XG4gICAgICAgICAgICAgIG1ldGhvZHMucHVzaCh2aXNpdE1ldGhvZERlZmluaXRpb24oc291cmNlLCBuZXh0U2libGluZywgY2hpbGQpKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdwdWJsaWNfZmllbGRfZGVmaW5pdGlvbic6XG4gICAgICAgICAgICAgIHByb3BlcnRpZXMucHVzaCh2aXNpdFB1YmxpY0ZpZWxkRGVmaW5pdGlvbihzb3VyY2UsIG5leHRTaWJsaW5nLCBjaGlsZCkpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGxvZy5yZXBvcnQoc291cmNlLCBuZXh0U2libGluZywgRXJyb3JUeXBlLk5vZGVUeXBlTm90WWV0U3VwcG9ydGVkKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnY2xhc3NfYm9keScsXG4gICAgY29udGV4dDogY3JlYXRlTm9kZShzb3VyY2UsIG5vZGUpLFxuICAgIG1ldGhvZHMsXG4gICAgcHJvcGVydGllc1xuICB9XG59Il19 \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/declaration.visitor.d.ts b/build/src/lang/typescript/visitors/declaration.visitor.d.ts index 15bd6c4..ef6ce08 100644 --- a/build/src/lang/typescript/visitors/declaration.visitor.d.ts +++ b/build/src/lang/typescript/visitors/declaration.visitor.d.ts @@ -1,6 +1,6 @@ import { SyntaxNode } from "tree-sitter"; import { NodeProperties } from "../Node"; -import IFile from "../../../interfaces/IFile"; -export declare function visitDeclaration(source: IFile, node: SyntaxNode, comment: SyntaxNode, properties: Partial): void; -export declare function visitInterfaceDeclaration(source: IFile, node: SyntaxNode, comment: SyntaxNode, properties: Partial): void; -export declare function visitLexicalDeclaration(source: IFile, node: SyntaxNode, comment: SyntaxNode, properties: Partial): void; +import Source from "../../../interfaces/Source"; +export declare function visitDeclaration(source: Source, node: SyntaxNode, comment: SyntaxNode, properties: Partial): void; +export declare function visitInterfaceDeclaration(source: Source, node: SyntaxNode, comment: SyntaxNode, properties: Partial): void; +export declare function visitLexicalDeclaration(source: Source, node: SyntaxNode, comment: SyntaxNode, properties: Partial): void; diff --git a/build/src/lang/typescript/visitors/declaration.visitor.js b/build/src/lang/typescript/visitors/declaration.visitor.js index 1640249..918ab09 100644 --- a/build/src/lang/typescript/visitors/declaration.visitor.js +++ b/build/src/lang/typescript/visitors/declaration.visitor.js @@ -1,6 +1,8 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); +const Node_1 = require("../Node"); const log_1 = require("../../../utils/log"); +const match_1 = require("../../../utils/match"); function visitDeclaration(source, node, comment, properties) { switch (node.type) { case 'interface_declaration': @@ -8,7 +10,7 @@ function visitDeclaration(source, node, comment, properties) { case 'lexical_declaration': return visitLexicalDeclaration(source, node, comment, properties); default: - log_1.default.report(source, node, log_1.ErrorType.NodeTypeNotSupported); + log_1.default.report(source, node, log_1.ErrorType.NodeTypeNotYetSupported); break; } } @@ -18,7 +20,11 @@ function visitInterfaceDeclaration(source, node, comment, properties) { } exports.visitInterfaceDeclaration = visitInterfaceDeclaration; function visitLexicalDeclaration(source, node, comment, properties) { + let children = node.children, scope; + if (match_1.default(children[0], 'const', 'let')) { + scope = Node_1.createNode(source, children.shift()); + } console.log(node.children); } exports.visitLexicalDeclaration = visitLexicalDeclaration; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjbGFyYXRpb24udmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvZGVjbGFyYXRpb24udmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUdBLDRDQUFvRDtBQUlwRCxTQUFnQixnQkFBZ0IsQ0FDNUIsTUFBYSxFQUNiLElBQWdCLEVBQ2hCLE9BQW1CLEVBQ25CLFVBQW1DO0lBRW5DLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRTtRQUNmLEtBQUssdUJBQXVCO1lBQ3hCLE9BQU8seUJBQXlCLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDeEUsS0FBSyxxQkFBcUI7WUFDdEIsT0FBTyx1QkFBdUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN0RTtZQUNJLGFBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxlQUFTLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUN6RCxNQUFNO0tBQ2I7QUFDTCxDQUFDO0FBZkQsNENBZUM7QUFFRCxTQUFnQix5QkFBeUIsQ0FDckMsTUFBYSxFQUNiLElBQWdCLEVBQ2hCLE9BQW1CLEVBQ25CLFVBQW1DO0lBRW5DLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBRS9CLENBQUM7QUFSRCw4REFRQztBQUVELFNBQWdCLHVCQUF1QixDQUNuQyxNQUFhLEVBQ2IsSUFBZ0IsRUFDaEIsT0FBbUIsRUFDbkIsVUFBbUM7SUFFbkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7QUFFL0IsQ0FBQztBQVJELDBEQVFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5pbXBvcnQgeyBOb2RlUHJvcGVydGllcyB9IGZyb20gXCIuLi9Ob2RlXCI7XHJcbmltcG9ydCBJRmlsZSBmcm9tIFwiLi4vLi4vLi4vaW50ZXJmYWNlcy9JRmlsZVwiO1xyXG5pbXBvcnQgbG9nLCB7IEVycm9yVHlwZSB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9sb2dcIjtcclxuXHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHZpc2l0RGVjbGFyYXRpb24oXHJcbiAgICBzb3VyY2U6IElGaWxlLFxyXG4gICAgbm9kZTogU3ludGF4Tm9kZSxcclxuICAgIGNvbW1lbnQ6IFN5bnRheE5vZGUsXHJcbiAgICBwcm9wZXJ0aWVzOiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPlxyXG4pIHtcclxuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XHJcbiAgICAgICAgY2FzZSAnaW50ZXJmYWNlX2RlY2xhcmF0aW9uJzpcclxuICAgICAgICAgICAgcmV0dXJuIHZpc2l0SW50ZXJmYWNlRGVjbGFyYXRpb24oc291cmNlLCBub2RlLCBjb21tZW50LCBwcm9wZXJ0aWVzKTtcclxuICAgICAgICBjYXNlICdsZXhpY2FsX2RlY2xhcmF0aW9uJzpcclxuICAgICAgICAgICAgcmV0dXJuIHZpc2l0TGV4aWNhbERlY2xhcmF0aW9uKHNvdXJjZSwgbm9kZSwgY29tbWVudCwgcHJvcGVydGllcyk7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgbG9nLnJlcG9ydChzb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFN1cHBvcnRlZCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRJbnRlcmZhY2VEZWNsYXJhdGlvbihcclxuICAgIHNvdXJjZTogSUZpbGUsXHJcbiAgICBub2RlOiBTeW50YXhOb2RlLFxyXG4gICAgY29tbWVudDogU3ludGF4Tm9kZSxcclxuICAgIHByb3BlcnRpZXM6IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+XHJcbikge1xyXG4gICAgY29uc29sZS5sb2cobm9kZS5jaGlsZHJlbik7XHJcblxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRMZXhpY2FsRGVjbGFyYXRpb24oXHJcbiAgICBzb3VyY2U6IElGaWxlLFxyXG4gICAgbm9kZTogU3ludGF4Tm9kZSxcclxuICAgIGNvbW1lbnQ6IFN5bnRheE5vZGUsXHJcbiAgICBwcm9wZXJ0aWVzOiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPlxyXG4pIHtcclxuICAgIGNvbnNvbGUubG9nKG5vZGUuY2hpbGRyZW4pO1xyXG5cclxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjbGFyYXRpb24udmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvZGVjbGFyYXRpb24udmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLGtDQUFxRDtBQUVyRCw0Q0FBb0Q7QUFDcEQsZ0RBQXlDO0FBS3pDLFNBQWdCLGdCQUFnQixDQUM1QixNQUFjLEVBQ2QsSUFBZ0IsRUFDaEIsT0FBbUIsRUFDbkIsVUFBbUM7SUFFbkMsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO1FBQ2YsS0FBSyx1QkFBdUI7WUFDeEIsT0FBTyx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN4RSxLQUFLLHFCQUFxQjtZQUN0QixPQUFPLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3RFO1lBQ0ksYUFBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1lBQzVELE1BQU07S0FDYjtBQUNMLENBQUM7QUFmRCw0Q0FlQztBQUVELFNBQWdCLHlCQUF5QixDQUNyQyxNQUFjLEVBQ2QsSUFBZ0IsRUFDaEIsT0FBbUIsRUFDbkIsVUFBbUM7SUFFbkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7QUFFL0IsQ0FBQztBQVJELDhEQVFDO0FBRUQsU0FBZ0IsdUJBQXVCLENBQ25DLE1BQWMsRUFDZCxJQUFnQixFQUNoQixPQUFtQixFQUNuQixVQUFtQztJQUVuQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUN4QixLQUFLLENBQUM7SUFFVixJQUFJLGVBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFFO1FBQ3BDLEtBQUssR0FBRyxpQkFBVSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUNoRDtJQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFiRCwwREFhQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcbmltcG9ydCB7IE5vZGVQcm9wZXJ0aWVzLCBjcmVhdGVOb2RlIH0gZnJvbSBcIi4uL05vZGVcIjtcbmltcG9ydCBTb3VyY2UgZnJvbSBcIi4uLy4uLy4uL2ludGVyZmFjZXMvU291cmNlXCI7XG5pbXBvcnQgbG9nLCB7IEVycm9yVHlwZSB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9sb2dcIjtcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbWF0Y2hcIjtcbmltcG9ydCB7IHRleHQgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvdGV4dFwiO1xuXG5cblxuZXhwb3J0IGZ1bmN0aW9uIHZpc2l0RGVjbGFyYXRpb24oXG4gICAgc291cmNlOiBTb3VyY2UsXG4gICAgbm9kZTogU3ludGF4Tm9kZSxcbiAgICBjb21tZW50OiBTeW50YXhOb2RlLFxuICAgIHByb3BlcnRpZXM6IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+XG4pIHtcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgICBjYXNlICdpbnRlcmZhY2VfZGVjbGFyYXRpb24nOlxuICAgICAgICAgICAgcmV0dXJuIHZpc2l0SW50ZXJmYWNlRGVjbGFyYXRpb24oc291cmNlLCBub2RlLCBjb21tZW50LCBwcm9wZXJ0aWVzKTtcbiAgICAgICAgY2FzZSAnbGV4aWNhbF9kZWNsYXJhdGlvbic6XG4gICAgICAgICAgICByZXR1cm4gdmlzaXRMZXhpY2FsRGVjbGFyYXRpb24oc291cmNlLCBub2RlLCBjb21tZW50LCBwcm9wZXJ0aWVzKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGxvZy5yZXBvcnQoc291cmNlLCBub2RlLCBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRJbnRlcmZhY2VEZWNsYXJhdGlvbihcbiAgICBzb3VyY2U6IFNvdXJjZSxcbiAgICBub2RlOiBTeW50YXhOb2RlLFxuICAgIGNvbW1lbnQ6IFN5bnRheE5vZGUsXG4gICAgcHJvcGVydGllczogUGFydGlhbDxOb2RlUHJvcGVydGllcz5cbikge1xuICAgIGNvbnNvbGUubG9nKG5vZGUuY2hpbGRyZW4pO1xuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2aXNpdExleGljYWxEZWNsYXJhdGlvbihcbiAgICBzb3VyY2U6IFNvdXJjZSxcbiAgICBub2RlOiBTeW50YXhOb2RlLFxuICAgIGNvbW1lbnQ6IFN5bnRheE5vZGUsXG4gICAgcHJvcGVydGllczogUGFydGlhbDxOb2RlUHJvcGVydGllcz5cbikge1xuICAgIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4sXG4gICAgICAgIHNjb3BlO1xuXG4gICAgaWYgKG1hdGNoKGNoaWxkcmVuWzBdLCAnY29uc3QnLCAnbGV0JykpIHtcbiAgICAgICAgc2NvcGUgPSBjcmVhdGVOb2RlKHNvdXJjZSwgY2hpbGRyZW4uc2hpZnQoKSk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKG5vZGUuY2hpbGRyZW4pO1xufSJdfQ== \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/formal_parameters.visitor.d.ts b/build/src/lang/typescript/visitors/formal_parameters.visitor.d.ts index ecbdddb..e7ce592 100644 --- a/build/src/lang/typescript/visitors/formal_parameters.visitor.d.ts +++ b/build/src/lang/typescript/visitors/formal_parameters.visitor.d.ts @@ -1,6 +1,6 @@ import { SyntaxNode } from "tree-sitter"; -import IFile from "../../../interfaces/IFile"; -export declare function visitFormalParameters(source: IFile, node: SyntaxNode): { +import Source from "../../../interfaces/Source"; +export declare function visitFormalParameters(source: Source, node: SyntaxNode): { type: string; context: import("../Node").Node; parameters: { @@ -10,7 +10,7 @@ export declare function visitFormalParameters(source: IFile, node: SyntaxNode): type_annotation: any; }[]; }; -export declare function visitRequiredParameter(source: IFile, node: SyntaxNode): { +export declare function visitRequiredParameter(source: Source, node: SyntaxNode): { type: string; context: import("../Node").Node; identifier: any; diff --git a/build/src/lang/typescript/visitors/formal_parameters.visitor.js b/build/src/lang/typescript/visitors/formal_parameters.visitor.js index cd9a6b6..dc6919f 100644 --- a/build/src/lang/typescript/visitors/formal_parameters.visitor.js +++ b/build/src/lang/typescript/visitors/formal_parameters.visitor.js @@ -1,7 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const Node_1 = require("../Node"); -const text_1 = require("../../../utils/text"); const type_visitor_1 = require("./type.visitor"); const match_1 = require("../../../utils/match"); function visitFormalParameters(source, node) { @@ -17,7 +16,7 @@ exports.visitFormalParameters = visitFormalParameters; function visitRequiredParameter(source, node) { let required_parameter = node.children, identifier, type_annotation; if (match_1.default(required_parameter[0], 'identifier')) { - identifier = text_1.text(source, required_parameter.shift()); + identifier = Node_1.createNode(source, required_parameter.shift()); } if (match_1.default(required_parameter[0], 'type_annotation')) { let type = required_parameter.shift().children[1]; @@ -31,4 +30,4 @@ function visitRequiredParameter(source, node) { }; } exports.visitRequiredParameter = visitRequiredParameter; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWFsX3BhcmFtZXRlcnMudmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvZm9ybWFsX3BhcmFtZXRlcnMudmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtDQUFxQztBQUVyQyw4Q0FBMkM7QUFDM0MsaURBQTJDO0FBRTNDLGdEQUF5QztBQUV6QyxTQUFnQixxQkFBcUIsQ0FBQyxNQUFhLEVBQUUsSUFBZ0I7SUFDbkUsT0FBTztRQUNMLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtRQUNmLE9BQU8sRUFBRSxpQkFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7UUFDakMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRO2FBQ3hCLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDM0MsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsc0JBQXNCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQ3JELENBQUE7QUFDSCxDQUFDO0FBUkQsc0RBUUM7QUFHRCxTQUFnQixzQkFBc0IsQ0FBQyxNQUFhLEVBQUUsSUFBZ0I7SUFDcEUsSUFBSSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUNwQyxVQUFVLEVBQ1YsZUFBZSxDQUFDO0lBR2xCLElBQUksZUFBSyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFO1FBQzlDLFVBQVUsR0FBRyxXQUFJLENBQUMsTUFBTSxFQUFFLGtCQUFrQixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDdkQ7SUFFRCxJQUFHLGVBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFO1FBQ2xELElBQUksSUFBSSxHQUFHLGtCQUFrQixDQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRCxlQUFlLEdBQUcsd0JBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDM0M7SUFFRCxPQUFPO1FBQ0wsSUFBSSxFQUFFLFdBQVc7UUFDakIsT0FBTyxFQUFFLGlCQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztRQUNqQyxVQUFVO1FBQ1YsZUFBZTtLQUNoQixDQUFBO0FBQ0gsQ0FBQztBQXJCRCx3REFxQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVOb2RlIH0gZnJvbSBcIi4uL05vZGVcIjtcclxuaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5pbXBvcnQgeyB0ZXh0IH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3RleHRcIjtcclxuaW1wb3J0IHsgdmlzaXRUeXBlIH0gZnJvbSBcIi4vdHlwZS52aXNpdG9yXCI7XHJcbmltcG9ydCBJRmlsZSBmcm9tIFwiLi4vLi4vLi4vaW50ZXJmYWNlcy9JRmlsZVwiO1xyXG5pbXBvcnQgbWF0Y2ggZnJvbSBcIi4uLy4uLy4uL3V0aWxzL21hdGNoXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRGb3JtYWxQYXJhbWV0ZXJzKHNvdXJjZTogSUZpbGUsIG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICByZXR1cm4ge1xyXG4gICAgdHlwZTogbm9kZS50eXBlLFxyXG4gICAgY29udGV4dDogY3JlYXRlTm9kZShzb3VyY2UsIG5vZGUpLFxyXG4gICAgcGFyYW1ldGVyczogbm9kZS5jaGlsZHJlblxyXG4gICAgLmZpbHRlcihjaGlsZCA9PiAhY2hpbGQudHlwZS5tYXRjaCgvWygpLF0vKSlcclxuICAgIC5tYXAoY2hpbGQgPT4gdmlzaXRSZXF1aXJlZFBhcmFtZXRlcihzb3VyY2UsIGNoaWxkKSlcclxuICB9XHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRSZXF1aXJlZFBhcmFtZXRlcihzb3VyY2U6IElGaWxlLCBub2RlOiBTeW50YXhOb2RlKSB7XHJcbiAgbGV0IHJlcXVpcmVkX3BhcmFtZXRlciA9IG5vZGUuY2hpbGRyZW4sXHJcbiAgICBpZGVudGlmaWVyLFxyXG4gICAgdHlwZV9hbm5vdGF0aW9uO1xyXG4gICAgXHJcblxyXG4gIGlmIChtYXRjaChyZXF1aXJlZF9wYXJhbWV0ZXJbMF0sICdpZGVudGlmaWVyJykpIHtcclxuICAgIGlkZW50aWZpZXIgPSB0ZXh0KHNvdXJjZSwgcmVxdWlyZWRfcGFyYW1ldGVyLnNoaWZ0KCkpO1xyXG4gIH1cclxuXHJcbiAgaWYobWF0Y2gocmVxdWlyZWRfcGFyYW1ldGVyWzBdLCAndHlwZV9hbm5vdGF0aW9uJykpIHtcclxuICAgIGxldCB0eXBlID0gcmVxdWlyZWRfcGFyYW1ldGVyLnNoaWZ0KCkuY2hpbGRyZW5bMV07XHJcbiAgICB0eXBlX2Fubm90YXRpb24gPSB2aXNpdFR5cGUoc291cmNlLCB0eXBlKTsgXHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgdHlwZTogJ3BhcmFtZXRlcicsXHJcbiAgICBjb250ZXh0OiBjcmVhdGVOb2RlKHNvdXJjZSwgbm9kZSksXHJcbiAgICBpZGVudGlmaWVyLFxyXG4gICAgdHlwZV9hbm5vdGF0aW9uXHJcbiAgfVxyXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWFsX3BhcmFtZXRlcnMudmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvZm9ybWFsX3BhcmFtZXRlcnMudmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtDQUFxQztBQUVyQyxpREFBMkM7QUFFM0MsZ0RBQXlDO0FBRXpDLFNBQWdCLHFCQUFxQixDQUFDLE1BQWMsRUFBRSxJQUFnQjtJQUNwRSxPQUFPO1FBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1FBQ2YsT0FBTyxFQUFFLGlCQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztRQUNqQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVE7YUFDeEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUMzQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDckQsQ0FBQTtBQUNILENBQUM7QUFSRCxzREFRQztBQUdELFNBQWdCLHNCQUFzQixDQUFDLE1BQWMsRUFBRSxJQUFnQjtJQUNyRSxJQUFJLGtCQUFrQixHQUFHLElBQUksQ0FBQyxRQUFRLEVBQ3BDLFVBQVUsRUFDVixlQUFlLENBQUM7SUFHbEIsSUFBSSxlQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUU7UUFDOUMsVUFBVSxHQUFHLGlCQUFVLENBQUMsTUFBTSxFQUFFLGtCQUFrQixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDN0Q7SUFFRCxJQUFHLGVBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFO1FBQ2xELElBQUksSUFBSSxHQUFHLGtCQUFrQixDQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRCxlQUFlLEdBQUcsd0JBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDM0M7SUFFRCxPQUFPO1FBQ0wsSUFBSSxFQUFFLFdBQVc7UUFDakIsT0FBTyxFQUFFLGlCQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztRQUNqQyxVQUFVO1FBQ1YsZUFBZTtLQUNoQixDQUFBO0FBQ0gsQ0FBQztBQXJCRCx3REFxQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVOb2RlIH0gZnJvbSBcIi4uL05vZGVcIjtcbmltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcbmltcG9ydCB7IHZpc2l0VHlwZSB9IGZyb20gXCIuL3R5cGUudmlzaXRvclwiO1xuaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi4vLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2VcIjtcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbWF0Y2hcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHZpc2l0Rm9ybWFsUGFyYW1ldGVycyhzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IG5vZGUudHlwZSxcbiAgICBjb250ZXh0OiBjcmVhdGVOb2RlKHNvdXJjZSwgbm9kZSksXG4gICAgcGFyYW1ldGVyczogbm9kZS5jaGlsZHJlblxuICAgIC5maWx0ZXIoY2hpbGQgPT4gIWNoaWxkLnR5cGUubWF0Y2goL1soKSxdLykpXG4gICAgLm1hcChjaGlsZCA9PiB2aXNpdFJlcXVpcmVkUGFyYW1ldGVyKHNvdXJjZSwgY2hpbGQpKVxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHZpc2l0UmVxdWlyZWRQYXJhbWV0ZXIoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgbGV0IHJlcXVpcmVkX3BhcmFtZXRlciA9IG5vZGUuY2hpbGRyZW4sXG4gICAgaWRlbnRpZmllcixcbiAgICB0eXBlX2Fubm90YXRpb247XG4gICAgXG5cbiAgaWYgKG1hdGNoKHJlcXVpcmVkX3BhcmFtZXRlclswXSwgJ2lkZW50aWZpZXInKSkge1xuICAgIGlkZW50aWZpZXIgPSBjcmVhdGVOb2RlKHNvdXJjZSwgcmVxdWlyZWRfcGFyYW1ldGVyLnNoaWZ0KCkpO1xuICB9XG5cbiAgaWYobWF0Y2gocmVxdWlyZWRfcGFyYW1ldGVyWzBdLCAndHlwZV9hbm5vdGF0aW9uJykpIHtcbiAgICBsZXQgdHlwZSA9IHJlcXVpcmVkX3BhcmFtZXRlci5zaGlmdCgpLmNoaWxkcmVuWzFdO1xuICAgIHR5cGVfYW5ub3RhdGlvbiA9IHZpc2l0VHlwZShzb3VyY2UsIHR5cGUpOyBcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ3BhcmFtZXRlcicsXG4gICAgY29udGV4dDogY3JlYXRlTm9kZShzb3VyY2UsIG5vZGUpLFxuICAgIGlkZW50aWZpZXIsXG4gICAgdHlwZV9hbm5vdGF0aW9uXG4gIH1cbn0iXX0= \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/function.visitor.d.ts b/build/src/lang/typescript/visitors/function.visitor.d.ts index e9041fd..7e25d0b 100644 --- a/build/src/lang/typescript/visitors/function.visitor.d.ts +++ b/build/src/lang/typescript/visitors/function.visitor.d.ts @@ -1,7 +1,7 @@ -import { SyntaxNode } from "tree-sitter"; import { NodeProperties } from "../Node"; -import IFile from "../../../interfaces/IFile"; -export declare function visitFunction(source: IFile, node: SyntaxNode, comment: SyntaxNode, properties: Partial): { +import { SyntaxNode } from "tree-sitter"; +import Source from "../../../interfaces/Source"; +export declare function visitFunction(source: Source, node: SyntaxNode, comment: SyntaxNode, properties: Partial): { type: string; context: import("../Node").Node; comment: import("../Node").Node; diff --git a/build/src/lang/typescript/visitors/function.visitor.js b/build/src/lang/typescript/visitors/function.visitor.js index 7979203..dd6e420 100644 --- a/build/src/lang/typescript/visitors/function.visitor.js +++ b/build/src/lang/typescript/visitors/function.visitor.js @@ -1,8 +1,8 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const Node_1 = require("../Node"); -const match_1 = require("../../../utils/match"); const call_signature_visitor_1 = require("./call_signature.visitor"); +const match_1 = require("../../../utils/match"); function visitFunction(source, node, comment, properties) { let children = node.children; let isAync = false, identifier, type_parameters, formal_parameters, type_annotation; @@ -35,4 +35,4 @@ function visitFunction(source, node, comment, properties) { }; } exports.visitFunction = visitFunction; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24udmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvZnVuY3Rpb24udmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLGtDQUFxRDtBQUNyRCxnREFBeUM7QUFDekMscUVBQThEO0FBRzlELFNBQWdCLGFBQWEsQ0FDekIsTUFBYSxFQUNiLElBQWdCLEVBQ2hCLE9BQW1CLEVBQ25CLFVBQW1DO0lBRW5DLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDN0IsSUFBSSxNQUFNLEdBQUcsS0FBSyxFQUNkLFVBQVUsRUFDVixlQUFlLEVBQ2YsaUJBQWlCLEVBQ2pCLGVBQWUsQ0FBQztJQUVwQixJQUFJLGVBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUU7UUFDN0IsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNkLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztLQUNwQjtJQUVELElBQUksZUFBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRTtRQUNoQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7S0FDcEI7SUFFRCxJQUFJLGVBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUU7UUFDbEMsVUFBVSxHQUFHLGlCQUFVLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO0tBQ3BEO0lBRUQsSUFBSSxlQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLEVBQUU7UUFDdEMsSUFBSSxjQUFjLEdBQUcsMkNBQWtCLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO1FBQ2pFLGVBQWUsR0FBRyxjQUFjLENBQUMsZUFBZSxDQUFDO1FBQ2pELGlCQUFpQixHQUFHLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQztRQUNyRCxlQUFlLEdBQUcsY0FBYyxDQUFDLGVBQWUsQ0FBQztLQUNwRDtJQUVELE9BQU87UUFDSCxJQUFJLEVBQUUsVUFBVTtRQUNoQixPQUFPLEVBQUUsaUJBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQztRQUM3QyxPQUFPLEVBQUUsaUJBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7UUFDaEQsTUFBTTtRQUNOLFVBQVU7UUFDVixlQUFlO1FBQ2YsaUJBQWlCO1FBQ2pCLGVBQWU7UUFDZixVQUFVO0tBQ2IsQ0FBQTtBQUVMLENBQUM7QUE3Q0Qsc0NBNkNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5pbXBvcnQgeyBOb2RlUHJvcGVydGllcywgY3JlYXRlTm9kZSB9IGZyb20gXCIuLi9Ob2RlXCI7XHJcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbWF0Y2hcIjtcclxuaW1wb3J0IHsgdmlzaXRDYWxsU2lnbmF0dXJlIH0gZnJvbSBcIi4vY2FsbF9zaWduYXR1cmUudmlzaXRvclwiO1xyXG5pbXBvcnQgSUZpbGUgZnJvbSBcIi4uLy4uLy4uL2ludGVyZmFjZXMvSUZpbGVcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB2aXNpdEZ1bmN0aW9uKFxyXG4gICAgc291cmNlOiBJRmlsZSxcclxuICAgIG5vZGU6IFN5bnRheE5vZGUsXHJcbiAgICBjb21tZW50OiBTeW50YXhOb2RlLFxyXG4gICAgcHJvcGVydGllczogUGFydGlhbDxOb2RlUHJvcGVydGllcz5cclxuKSB7XHJcbiAgICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xyXG4gICAgbGV0IGlzQXluYyA9IGZhbHNlLFxyXG4gICAgICAgIGlkZW50aWZpZXIsXHJcbiAgICAgICAgdHlwZV9wYXJhbWV0ZXJzLFxyXG4gICAgICAgIGZvcm1hbF9wYXJhbWV0ZXJzLFxyXG4gICAgICAgIHR5cGVfYW5ub3RhdGlvbjtcclxuXHJcbiAgICBpZiAobWF0Y2goY2hpbGRyZW5bMF0sICdhc3luYycpKSB7XHJcbiAgICAgICAgaXNBeW5jID0gdHJ1ZTtcclxuICAgICAgICBjaGlsZHJlbi5zaGlmdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChtYXRjaChjaGlsZHJlblswXSwgJ2Z1bmN0aW9uJykpIHtcclxuICAgICAgICBjaGlsZHJlbi5zaGlmdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChtYXRjaChjaGlsZHJlblswXSwgJ2lkZW50aWZpZXInKSkge1xyXG4gICAgICAgIGlkZW50aWZpZXIgPSBjcmVhdGVOb2RlKHNvdXJjZSwgY2hpbGRyZW4uc2hpZnQoKSlcclxuICAgIH1cclxuXHJcbiAgICBpZiAobWF0Y2goY2hpbGRyZW5bMF0sICdjYWxsX3NpZ25hdHVyZScpKSB7XHJcbiAgICAgICAgbGV0IGNhbGxfc2lnbmF0dXJlID0gdmlzaXRDYWxsU2lnbmF0dXJlKHNvdXJjZSwgY2hpbGRyZW4uc2hpZnQoKSlcclxuICAgICAgICB0eXBlX3BhcmFtZXRlcnMgPSBjYWxsX3NpZ25hdHVyZS50eXBlX3BhcmFtZXRlcnM7XHJcbiAgICAgICAgZm9ybWFsX3BhcmFtZXRlcnMgPSBjYWxsX3NpZ25hdHVyZS5mb3JtYWxfcGFyYW1ldGVycztcclxuICAgICAgICB0eXBlX2Fubm90YXRpb24gPSBjYWxsX3NpZ25hdHVyZS50eXBlX2Fubm90YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICB0eXBlOiAnZnVuY3Rpb24nLFxyXG4gICAgICAgIGNvbnRleHQ6IGNyZWF0ZU5vZGUoc291cmNlLCBub2RlLCBwcm9wZXJ0aWVzKSxcclxuICAgICAgICBjb21tZW50OiBjcmVhdGVOb2RlKHNvdXJjZSwgY29tbWVudCwgbnVsbCwgdHJ1ZSksXHJcbiAgICAgICAgaXNBeW5jLFxyXG4gICAgICAgIGlkZW50aWZpZXIsXHJcbiAgICAgICAgdHlwZV9wYXJhbWV0ZXJzLFxyXG4gICAgICAgIGZvcm1hbF9wYXJhbWV0ZXJzLFxyXG4gICAgICAgIHR5cGVfYW5ub3RhdGlvbixcclxuICAgICAgICBwcm9wZXJ0aWVzXHJcbiAgICB9XHJcblxyXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24udmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvZnVuY3Rpb24udmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtDQUFxRDtBQUVyRCxxRUFBOEQ7QUFFOUQsZ0RBQXlDO0FBRXpDLFNBQWdCLGFBQWEsQ0FDekIsTUFBYyxFQUNkLElBQWdCLEVBQ2hCLE9BQW1CLEVBQ25CLFVBQW1DO0lBRW5DLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDN0IsSUFBSSxNQUFNLEdBQUcsS0FBSyxFQUNkLFVBQVUsRUFDVixlQUFlLEVBQ2YsaUJBQWlCLEVBQ2pCLGVBQWUsQ0FBQztJQUVwQixJQUFJLGVBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUU7UUFDN0IsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNkLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztLQUNwQjtJQUVELElBQUksZUFBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRTtRQUNoQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7S0FDcEI7SUFFRCxJQUFJLGVBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUU7UUFDbEMsVUFBVSxHQUFHLGlCQUFVLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO0tBQ3BEO0lBRUQsSUFBSSxlQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLEVBQUU7UUFDdEMsSUFBSSxjQUFjLEdBQUcsMkNBQWtCLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO1FBQ2pFLGVBQWUsR0FBRyxjQUFjLENBQUMsZUFBZSxDQUFDO1FBQ2pELGlCQUFpQixHQUFHLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQztRQUNyRCxlQUFlLEdBQUcsY0FBYyxDQUFDLGVBQWUsQ0FBQztLQUNwRDtJQUVELE9BQU87UUFDSCxJQUFJLEVBQUUsVUFBVTtRQUNoQixPQUFPLEVBQUUsaUJBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQztRQUM3QyxPQUFPLEVBQUUsaUJBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7UUFDaEQsTUFBTTtRQUNOLFVBQVU7UUFDVixlQUFlO1FBQ2YsaUJBQWlCO1FBQ2pCLGVBQWU7UUFDZixVQUFVO0tBQ2IsQ0FBQTtBQUVMLENBQUM7QUE3Q0Qsc0NBNkNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTm9kZVByb3BlcnRpZXMsIGNyZWF0ZU5vZGUgfSBmcm9tIFwiLi4vTm9kZVwiO1xuaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuaW1wb3J0IHsgdmlzaXRDYWxsU2lnbmF0dXJlIH0gZnJvbSBcIi4vY2FsbF9zaWduYXR1cmUudmlzaXRvclwiO1xuaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi4vLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2VcIjtcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbWF0Y2hcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHZpc2l0RnVuY3Rpb24oXG4gICAgc291cmNlOiBTb3VyY2UsXG4gICAgbm9kZTogU3ludGF4Tm9kZSxcbiAgICBjb21tZW50OiBTeW50YXhOb2RlLFxuICAgIHByb3BlcnRpZXM6IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+XG4pIHtcbiAgICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuICAgIGxldCBpc0F5bmMgPSBmYWxzZSxcbiAgICAgICAgaWRlbnRpZmllcixcbiAgICAgICAgdHlwZV9wYXJhbWV0ZXJzLFxuICAgICAgICBmb3JtYWxfcGFyYW1ldGVycyxcbiAgICAgICAgdHlwZV9hbm5vdGF0aW9uO1xuXG4gICAgaWYgKG1hdGNoKGNoaWxkcmVuWzBdLCAnYXN5bmMnKSkge1xuICAgICAgICBpc0F5bmMgPSB0cnVlO1xuICAgICAgICBjaGlsZHJlbi5zaGlmdCgpO1xuICAgIH1cblxuICAgIGlmIChtYXRjaChjaGlsZHJlblswXSwgJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgY2hpbGRyZW4uc2hpZnQoKTtcbiAgICB9XG5cbiAgICBpZiAobWF0Y2goY2hpbGRyZW5bMF0sICdpZGVudGlmaWVyJykpIHtcbiAgICAgICAgaWRlbnRpZmllciA9IGNyZWF0ZU5vZGUoc291cmNlLCBjaGlsZHJlbi5zaGlmdCgpKVxuICAgIH1cblxuICAgIGlmIChtYXRjaChjaGlsZHJlblswXSwgJ2NhbGxfc2lnbmF0dXJlJykpIHtcbiAgICAgICAgbGV0IGNhbGxfc2lnbmF0dXJlID0gdmlzaXRDYWxsU2lnbmF0dXJlKHNvdXJjZSwgY2hpbGRyZW4uc2hpZnQoKSlcbiAgICAgICAgdHlwZV9wYXJhbWV0ZXJzID0gY2FsbF9zaWduYXR1cmUudHlwZV9wYXJhbWV0ZXJzO1xuICAgICAgICBmb3JtYWxfcGFyYW1ldGVycyA9IGNhbGxfc2lnbmF0dXJlLmZvcm1hbF9wYXJhbWV0ZXJzO1xuICAgICAgICB0eXBlX2Fubm90YXRpb24gPSBjYWxsX3NpZ25hdHVyZS50eXBlX2Fubm90YXRpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2Z1bmN0aW9uJyxcbiAgICAgICAgY29udGV4dDogY3JlYXRlTm9kZShzb3VyY2UsIG5vZGUsIHByb3BlcnRpZXMpLFxuICAgICAgICBjb21tZW50OiBjcmVhdGVOb2RlKHNvdXJjZSwgY29tbWVudCwgbnVsbCwgdHJ1ZSksXG4gICAgICAgIGlzQXluYyxcbiAgICAgICAgaWRlbnRpZmllcixcbiAgICAgICAgdHlwZV9wYXJhbWV0ZXJzLFxuICAgICAgICBmb3JtYWxfcGFyYW1ldGVycyxcbiAgICAgICAgdHlwZV9hbm5vdGF0aW9uLFxuICAgICAgICBwcm9wZXJ0aWVzXG4gICAgfVxuXG59Il19 \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/method_definition.visitor.d.ts b/build/src/lang/typescript/visitors/method_definition.visitor.d.ts index 63d9bfa..c6af4ae 100644 --- a/build/src/lang/typescript/visitors/method_definition.visitor.d.ts +++ b/build/src/lang/typescript/visitors/method_definition.visitor.d.ts @@ -1,6 +1,6 @@ import { SyntaxNode } from "tree-sitter"; -import IFile from "../../../interfaces/IFile"; -export declare function visitMethodDefinition(source: IFile, node: SyntaxNode, comment: SyntaxNode): { +import Source from "../../../interfaces/Source"; +export declare function visitMethodDefinition(source: Source, node: SyntaxNode, comment: SyntaxNode): { type: string; context: import("../Node").Node; comment: import("../Node").Node; diff --git a/build/src/lang/typescript/visitors/method_definition.visitor.js b/build/src/lang/typescript/visitors/method_definition.visitor.js index 138ac46..c96d1dc 100644 --- a/build/src/lang/typescript/visitors/method_definition.visitor.js +++ b/build/src/lang/typescript/visitors/method_definition.visitor.js @@ -36,4 +36,4 @@ function visitMethodDefinition(source, node, comment) { }; } exports.visitMethodDefinition = visitMethodDefinition; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0aG9kX2RlZmluaXRpb24udmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvbWV0aG9kX2RlZmluaXRpb24udmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtDQUFxQztBQUVyQyw4Q0FBMkM7QUFDM0MscUVBQThEO0FBRTlELGdEQUF5QztBQUV6QyxTQUFnQixxQkFBcUIsQ0FBQyxNQUFhLEVBQUUsSUFBZ0IsRUFBRSxPQUFtQjtJQUN4RixJQUFJLGlCQUFpQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdEMsSUFBSSxhQUFhLEdBQUcsUUFBUSxFQUMxQixPQUFPLEdBQUcsS0FBSyxFQUNmLFVBQVUsRUFDVixlQUFlLEVBQ2YsaUJBQWlCLEVBQ2pCLGVBQWUsQ0FBQztJQUVsQixJQUFJLGVBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRTtRQUN4QyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ2YsaUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUM7S0FDM0I7SUFFRCxJQUFJLGVBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRSx3QkFBd0IsQ0FBQyxFQUFFO1FBQ3pELGFBQWEsR0FBRyxXQUFJLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUE7S0FDeEQ7SUFFRCxJQUFJLGVBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxFQUFFO1FBQ3RELFVBQVUsR0FBRyxpQkFBVSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO0tBQzNEO0lBRUQsSUFBSSxlQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsRUFBRTtRQUNqRCxNQUFNLGNBQWMsR0FBRywyQ0FBa0IsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQTtRQUM1RSxlQUFlLEdBQUcsY0FBYyxDQUFDLGVBQWUsQ0FBQztRQUNqRCxpQkFBaUIsR0FBRyxjQUFjLENBQUMsaUJBQWlCLENBQUM7UUFDckQsZUFBZSxHQUFHLGNBQWMsQ0FBQyxlQUFlLENBQUM7S0FDbEQ7SUFDRCxPQUFPO1FBQ0wsSUFBSSxFQUFFLFFBQVE7UUFDZCxPQUFPLEVBQUUsaUJBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDO1FBQ2pDLE9BQU8sRUFBRSxpQkFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztRQUM3QyxhQUFhO1FBQ2IsS0FBSyxFQUFFLE9BQU87UUFDZCxVQUFVO1FBQ1YsZUFBZTtRQUNmLGlCQUFpQjtRQUNqQixlQUFlO0tBQ2hCLENBQUE7QUFDSCxDQUFDO0FBdkNELHNEQXVDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZU5vZGUgfSBmcm9tIFwiLi4vTm9kZVwiO1xyXG5pbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XHJcbmltcG9ydCB7IHRleHQgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvdGV4dFwiO1xyXG5pbXBvcnQgeyB2aXNpdENhbGxTaWduYXR1cmUgfSBmcm9tIFwiLi9jYWxsX3NpZ25hdHVyZS52aXNpdG9yXCI7XHJcbmltcG9ydCBJRmlsZSBmcm9tIFwiLi4vLi4vLi4vaW50ZXJmYWNlcy9JRmlsZVwiO1xyXG5pbXBvcnQgbWF0Y2ggZnJvbSBcIi4uLy4uLy4uL3V0aWxzL21hdGNoXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRNZXRob2REZWZpbml0aW9uKHNvdXJjZTogSUZpbGUsIG5vZGU6IFN5bnRheE5vZGUsIGNvbW1lbnQ6IFN5bnRheE5vZGUpIHtcclxuICBsZXQgbWV0aG9kX2RlZmluaXRpb24gPSBub2RlLmNoaWxkcmVuO1xyXG4gIGxldCBhY2Nlc3NpYmlsaXR5ID0gJ3B1YmxpYycsXHJcbiAgICBpc0FzeW5jID0gZmFsc2UsXHJcbiAgICBpZGVudGlmaWVyLFxyXG4gICAgdHlwZV9wYXJhbWV0ZXJzLFxyXG4gICAgZm9ybWFsX3BhcmFtZXRlcnMsXHJcbiAgICB0eXBlX2Fubm90YXRpb247XHJcblxyXG4gIGlmIChtYXRjaChtZXRob2RfZGVmaW5pdGlvblswXSwgJ2FzeW5jJykpIHtcclxuICAgIGlzQXN5bmMgPSB0cnVlO1xyXG4gICAgbWV0aG9kX2RlZmluaXRpb24uc2hpZnQoKTtcclxuICB9XHJcbiAgXHJcbiAgaWYgKG1hdGNoKG1ldGhvZF9kZWZpbml0aW9uWzBdLCAnYWNjZXNzaWJpbGl0eV9tb2RpZmllcicpKSB7XHJcbiAgICBhY2Nlc3NpYmlsaXR5ID0gdGV4dChzb3VyY2UsIG1ldGhvZF9kZWZpbml0aW9uLnNoaWZ0KCkpXHJcbiAgfVxyXG5cclxuICBpZiAobWF0Y2gobWV0aG9kX2RlZmluaXRpb25bMF0sICdwcm9wZXJ0eV9pZGVudGlmaWVyJykpIHtcclxuICAgIGlkZW50aWZpZXIgPSBjcmVhdGVOb2RlKHNvdXJjZSwgbWV0aG9kX2RlZmluaXRpb24uc2hpZnQoKSlcclxuICB9XHJcblxyXG4gIGlmIChtYXRjaChtZXRob2RfZGVmaW5pdGlvblswXSwgJ2NhbGxfc2lnbmF0dXJlJykpIHtcclxuICAgIGNvbnN0IGNhbGxfc2lnbmF0dXJlID0gdmlzaXRDYWxsU2lnbmF0dXJlKHNvdXJjZSwgbWV0aG9kX2RlZmluaXRpb24uc2hpZnQoKSlcclxuICAgIHR5cGVfcGFyYW1ldGVycyA9IGNhbGxfc2lnbmF0dXJlLnR5cGVfcGFyYW1ldGVycztcclxuICAgIGZvcm1hbF9wYXJhbWV0ZXJzID0gY2FsbF9zaWduYXR1cmUuZm9ybWFsX3BhcmFtZXRlcnM7XHJcbiAgICB0eXBlX2Fubm90YXRpb24gPSBjYWxsX3NpZ25hdHVyZS50eXBlX2Fubm90YXRpb247XHJcbiAgfVxyXG4gIHJldHVybiB7XHJcbiAgICB0eXBlOiAnbWV0aG9kJyxcclxuICAgIGNvbnRleHQ6IGNyZWF0ZU5vZGUoc291cmNlLCBub2RlKSxcclxuICAgIGNvbW1lbnQ6IGNyZWF0ZU5vZGUoc291cmNlLCBub2RlLCBudWxsLCB0cnVlKSxcclxuICAgIGFjY2Vzc2liaWxpdHksXHJcbiAgICBhc3luYzogaXNBc3luYywgXHJcbiAgICBpZGVudGlmaWVyLFxyXG4gICAgdHlwZV9wYXJhbWV0ZXJzLFxyXG4gICAgZm9ybWFsX3BhcmFtZXRlcnMsXHJcbiAgICB0eXBlX2Fubm90YXRpb25cclxuICB9XHJcbn0iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0aG9kX2RlZmluaXRpb24udmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvbWV0aG9kX2RlZmluaXRpb24udmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtDQUFxQztBQUVyQyw4Q0FBMkM7QUFDM0MscUVBQThEO0FBRTlELGdEQUF5QztBQUV6QyxTQUFnQixxQkFBcUIsQ0FBQyxNQUFjLEVBQUUsSUFBZ0IsRUFBRSxPQUFtQjtJQUN6RixJQUFJLGlCQUFpQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdEMsSUFBSSxhQUFhLEdBQUcsUUFBUSxFQUMxQixPQUFPLEdBQUcsS0FBSyxFQUNmLFVBQVUsRUFDVixlQUFlLEVBQ2YsaUJBQWlCLEVBQ2pCLGVBQWUsQ0FBQztJQUVsQixJQUFJLGVBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRTtRQUN4QyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ2YsaUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUM7S0FDM0I7SUFFRCxJQUFJLGVBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRSx3QkFBd0IsQ0FBQyxFQUFFO1FBQ3pELGFBQWEsR0FBRyxXQUFJLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUE7S0FDeEQ7SUFFRCxJQUFJLGVBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxFQUFFO1FBQ3RELFVBQVUsR0FBRyxpQkFBVSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO0tBQzNEO0lBRUQsSUFBSSxlQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsRUFBRTtRQUNqRCxNQUFNLGNBQWMsR0FBRywyQ0FBa0IsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQTtRQUM1RSxlQUFlLEdBQUcsY0FBYyxDQUFDLGVBQWUsQ0FBQztRQUNqRCxpQkFBaUIsR0FBRyxjQUFjLENBQUMsaUJBQWlCLENBQUM7UUFDckQsZUFBZSxHQUFHLGNBQWMsQ0FBQyxlQUFlLENBQUM7S0FDbEQ7SUFDRCxPQUFPO1FBQ0wsSUFBSSxFQUFFLFFBQVE7UUFDZCxPQUFPLEVBQUUsaUJBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDO1FBQ2pDLE9BQU8sRUFBRSxpQkFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztRQUM3QyxhQUFhO1FBQ2IsS0FBSyxFQUFFLE9BQU87UUFDZCxVQUFVO1FBQ1YsZUFBZTtRQUNmLGlCQUFpQjtRQUNqQixlQUFlO0tBQ2hCLENBQUE7QUFDSCxDQUFDO0FBdkNELHNEQXVDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZU5vZGUgfSBmcm9tIFwiLi4vTm9kZVwiO1xuaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuaW1wb3J0IHsgdGV4dCB9IGZyb20gXCIuLi8uLi8uLi91dGlscy90ZXh0XCI7XG5pbXBvcnQgeyB2aXNpdENhbGxTaWduYXR1cmUgfSBmcm9tIFwiLi9jYWxsX3NpZ25hdHVyZS52aXNpdG9yXCI7XG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi8uLi8uLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuaW1wb3J0IG1hdGNoIGZyb20gXCIuLi8uLi8uLi91dGlscy9tYXRjaFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRNZXRob2REZWZpbml0aW9uKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlLCBjb21tZW50OiBTeW50YXhOb2RlKSB7XG4gIGxldCBtZXRob2RfZGVmaW5pdGlvbiA9IG5vZGUuY2hpbGRyZW47XG4gIGxldCBhY2Nlc3NpYmlsaXR5ID0gJ3B1YmxpYycsXG4gICAgaXNBc3luYyA9IGZhbHNlLFxuICAgIGlkZW50aWZpZXIsXG4gICAgdHlwZV9wYXJhbWV0ZXJzLFxuICAgIGZvcm1hbF9wYXJhbWV0ZXJzLFxuICAgIHR5cGVfYW5ub3RhdGlvbjtcblxuICBpZiAobWF0Y2gobWV0aG9kX2RlZmluaXRpb25bMF0sICdhc3luYycpKSB7XG4gICAgaXNBc3luYyA9IHRydWU7XG4gICAgbWV0aG9kX2RlZmluaXRpb24uc2hpZnQoKTtcbiAgfVxuICBcbiAgaWYgKG1hdGNoKG1ldGhvZF9kZWZpbml0aW9uWzBdLCAnYWNjZXNzaWJpbGl0eV9tb2RpZmllcicpKSB7XG4gICAgYWNjZXNzaWJpbGl0eSA9IHRleHQoc291cmNlLCBtZXRob2RfZGVmaW5pdGlvbi5zaGlmdCgpKVxuICB9XG5cbiAgaWYgKG1hdGNoKG1ldGhvZF9kZWZpbml0aW9uWzBdLCAncHJvcGVydHlfaWRlbnRpZmllcicpKSB7XG4gICAgaWRlbnRpZmllciA9IGNyZWF0ZU5vZGUoc291cmNlLCBtZXRob2RfZGVmaW5pdGlvbi5zaGlmdCgpKVxuICB9XG5cbiAgaWYgKG1hdGNoKG1ldGhvZF9kZWZpbml0aW9uWzBdLCAnY2FsbF9zaWduYXR1cmUnKSkge1xuICAgIGNvbnN0IGNhbGxfc2lnbmF0dXJlID0gdmlzaXRDYWxsU2lnbmF0dXJlKHNvdXJjZSwgbWV0aG9kX2RlZmluaXRpb24uc2hpZnQoKSlcbiAgICB0eXBlX3BhcmFtZXRlcnMgPSBjYWxsX3NpZ25hdHVyZS50eXBlX3BhcmFtZXRlcnM7XG4gICAgZm9ybWFsX3BhcmFtZXRlcnMgPSBjYWxsX3NpZ25hdHVyZS5mb3JtYWxfcGFyYW1ldGVycztcbiAgICB0eXBlX2Fubm90YXRpb24gPSBjYWxsX3NpZ25hdHVyZS50eXBlX2Fubm90YXRpb247XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnbWV0aG9kJyxcbiAgICBjb250ZXh0OiBjcmVhdGVOb2RlKHNvdXJjZSwgbm9kZSksXG4gICAgY29tbWVudDogY3JlYXRlTm9kZShzb3VyY2UsIG5vZGUsIG51bGwsIHRydWUpLFxuICAgIGFjY2Vzc2liaWxpdHksXG4gICAgYXN5bmM6IGlzQXN5bmMsIFxuICAgIGlkZW50aWZpZXIsXG4gICAgdHlwZV9wYXJhbWV0ZXJzLFxuICAgIGZvcm1hbF9wYXJhbWV0ZXJzLFxuICAgIHR5cGVfYW5ub3RhdGlvblxuICB9XG59Il19 \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/node.visitor.d.ts b/build/src/lang/typescript/visitors/node.visitor.d.ts index 654cfb1..437ef76 100644 --- a/build/src/lang/typescript/visitors/node.visitor.d.ts +++ b/build/src/lang/typescript/visitors/node.visitor.d.ts @@ -1,4 +1,4 @@ -import { SyntaxNode } from "tree-sitter"; import { NodeProperties } from "../Node"; -import IFile from "../../../interfaces/IFile"; -export declare function visitNode(source: IFile, node: SyntaxNode, comment: SyntaxNode, properties: Partial): any; +import { SyntaxNode } from "tree-sitter"; +import Source from "../../../interfaces/Source"; +export declare function visitNode(source: Source, node: SyntaxNode, comment: SyntaxNode, properties: Partial): any; diff --git a/build/src/lang/typescript/visitors/node.visitor.js b/build/src/lang/typescript/visitors/node.visitor.js index 408a053..717e77d 100644 --- a/build/src/lang/typescript/visitors/node.visitor.js +++ b/build/src/lang/typescript/visitors/node.visitor.js @@ -1,10 +1,10 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const class_visitor_1 = require("./class.visitor"); -const function_visitor_1 = require("./function.visitor"); -const log_1 = require("../../../utils/log"); const declaration_visitor_1 = require("./declaration.visitor"); +const function_visitor_1 = require("./function.visitor"); const statement_visitor_1 = require("./statement.visitor"); +const log_1 = require("../../../utils/log"); function visitNode(source, node, comment, properties) { switch (node.type) { case 'class': @@ -24,9 +24,9 @@ function visitNode(source, node, comment, properties) { if (node.type.includes("declaration")) { return declaration_visitor_1.visitDeclaration(source, node, comment, properties); } - log_1.default.info(`${node.type.replace(/[_]/g, ' ')}' is not supported yet.`); + log_1.default.report(source, node, log_1.ErrorType.NodeTypeNotYetSupported); break; } } exports.visitNode = visitNode; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS52aXNpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xhbmcvdHlwZXNjcmlwdC92aXNpdG9ycy9ub2RlLnZpc2l0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQSxtREFBNkM7QUFFN0MseURBQW1EO0FBQ25ELDRDQUFvRDtBQUVwRCwrREFBb0Y7QUFDcEYsMkRBQXFEO0FBR3JELFNBQWdCLFNBQVMsQ0FDdkIsTUFBYSxFQUNiLElBQWdCLEVBQ2hCLE9BQW1CLEVBQ25CLFVBQW1DO0lBRW5DLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRTtRQUNqQixLQUFLLE9BQU87WUFDVixPQUFPLDBCQUFVLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDdkQsS0FBSyxVQUFVO1lBQ2IsT0FBTyxnQ0FBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzFELEtBQUssU0FBUztZQUNaLE9BQU87WUFDUCxNQUFNO1FBQ1IsS0FBSyxPQUFPO1lBQ1YsYUFBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQ3pELE1BQU07UUFDUjtZQUNFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUU7Z0JBQ25DLE9BQU8sa0NBQWMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQzthQUMxRDtZQUVELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3JDLE9BQU8sc0NBQWdCLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7YUFDNUQ7WUFFRCxhQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1lBQ3JFLE1BQU07S0FDVDtBQUNILENBQUM7QUE3QkQsOEJBNkJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5pbXBvcnQgeyBOb2RlUHJvcGVydGllcyB9IGZyb20gXCIuLi9Ob2RlXCI7XHJcbmltcG9ydCB7IHZpc2l0Q2xhc3MgfSBmcm9tIFwiLi9jbGFzcy52aXNpdG9yXCI7XHJcbmltcG9ydCByYW5nZSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvcmFuZ2VcIjtcclxuaW1wb3J0IHsgdmlzaXRGdW5jdGlvbiB9IGZyb20gXCIuL2Z1bmN0aW9uLnZpc2l0b3JcIjtcclxuaW1wb3J0IGxvZywgeyBFcnJvclR5cGUgfSBmcm9tICcuLi8uLi8uLi91dGlscy9sb2cnO1xyXG5cclxuaW1wb3J0IHsgdmlzaXRJbnRlcmZhY2VEZWNsYXJhdGlvbiwgdmlzaXREZWNsYXJhdGlvbiB9IGZyb20gXCIuL2RlY2xhcmF0aW9uLnZpc2l0b3JcIjtcclxuaW1wb3J0IHsgdmlzaXRTdGF0ZW1lbnQgfSBmcm9tIFwiLi9zdGF0ZW1lbnQudmlzaXRvclwiO1xyXG5pbXBvcnQgSUZpbGUgZnJvbSBcIi4uLy4uLy4uL2ludGVyZmFjZXMvSUZpbGVcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB2aXNpdE5vZGUoXHJcbiAgc291cmNlOiBJRmlsZSxcclxuICBub2RlOiBTeW50YXhOb2RlLFxyXG4gIGNvbW1lbnQ6IFN5bnRheE5vZGUsXHJcbiAgcHJvcGVydGllczogUGFydGlhbDxOb2RlUHJvcGVydGllcz5cclxuKSB7XHJcbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcclxuICAgIGNhc2UgJ2NsYXNzJzpcclxuICAgICAgcmV0dXJuIHZpc2l0Q2xhc3Moc291cmNlLCBub2RlLCBjb21tZW50LCBwcm9wZXJ0aWVzKTtcclxuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcclxuICAgICAgcmV0dXJuIHZpc2l0RnVuY3Rpb24oc291cmNlLCBub2RlLCBjb21tZW50LCBwcm9wZXJ0aWVzKTtcclxuICAgIGNhc2UgJ2NvbW1lbnQnOlxyXG4gICAgICAvLyBub29wXHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSAnRVJST1InOlxyXG4gICAgICBsb2cucmVwb3J0KHNvdXJjZSwgbm9kZSwgRXJyb3JUeXBlLlRyZWVTaXR0ZXJQYXJzZUVycm9yKTtcclxuICAgICAgYnJlYWs7XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICBpZiAobm9kZS50eXBlLmluY2x1ZGVzKFwic3RhdGVtZW50XCIpKSB7XHJcbiAgICAgICAgcmV0dXJuIHZpc2l0U3RhdGVtZW50KHNvdXJjZSwgbm9kZSwgY29tbWVudCwgcHJvcGVydGllcyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChub2RlLnR5cGUuaW5jbHVkZXMoXCJkZWNsYXJhdGlvblwiKSkge1xyXG4gICAgICAgIHJldHVybiB2aXNpdERlY2xhcmF0aW9uKHNvdXJjZSwgbm9kZSwgY29tbWVudCwgcHJvcGVydGllcyk7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIGxvZy5pbmZvKGAke25vZGUudHlwZS5yZXBsYWNlKC9bX10vZywgJyAnKX0nIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LmApO1xyXG4gICAgICBicmVhaztcclxuICB9XHJcbn0iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS52aXNpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xhbmcvdHlwZXNjcmlwdC92aXNpdG9ycy9ub2RlLnZpc2l0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQSxtREFBNkM7QUFDN0MsK0RBQXlEO0FBQ3pELHlEQUFtRDtBQUNuRCwyREFBcUQ7QUFFckQsNENBQW9EO0FBRXBELFNBQWdCLFNBQVMsQ0FDdkIsTUFBYyxFQUNkLElBQWdCLEVBQ2hCLE9BQW1CLEVBQ25CLFVBQW1DO0lBRW5DLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRTtRQUNqQixLQUFLLE9BQU87WUFDVixPQUFPLDBCQUFVLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDdkQsS0FBSyxVQUFVO1lBQ2IsT0FBTyxnQ0FBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzFELEtBQUssU0FBUztZQUNaLE9BQU87WUFDUCxNQUFNO1FBQ1IsS0FBSyxPQUFPO1lBQ1YsYUFBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQ3pELE1BQU07UUFDUjtZQUNFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUU7Z0JBQ25DLE9BQU8sa0NBQWMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQzthQUMxRDtZQUVELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3JDLE9BQU8sc0NBQWdCLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7YUFDNUQ7WUFFRCxhQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsZUFBUyxDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDNUQsTUFBTTtLQUNUO0FBQ0gsQ0FBQztBQTdCRCw4QkE2QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOb2RlUHJvcGVydGllcyB9IGZyb20gXCIuLi9Ob2RlXCI7XG5pbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgeyB2aXNpdENsYXNzIH0gZnJvbSBcIi4vY2xhc3MudmlzaXRvclwiO1xuaW1wb3J0IHsgdmlzaXREZWNsYXJhdGlvbiB9IGZyb20gXCIuL2RlY2xhcmF0aW9uLnZpc2l0b3JcIjtcbmltcG9ydCB7IHZpc2l0RnVuY3Rpb24gfSBmcm9tIFwiLi9mdW5jdGlvbi52aXNpdG9yXCI7XG5pbXBvcnQgeyB2aXNpdFN0YXRlbWVudCB9IGZyb20gXCIuL3N0YXRlbWVudC52aXNpdG9yXCI7XG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi8uLi8uLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuaW1wb3J0IGxvZywgeyBFcnJvclR5cGUgfSBmcm9tICcuLi8uLi8uLi91dGlscy9sb2cnO1xuXG5leHBvcnQgZnVuY3Rpb24gdmlzaXROb2RlKFxuICBzb3VyY2U6IFNvdXJjZSxcbiAgbm9kZTogU3ludGF4Tm9kZSxcbiAgY29tbWVudDogU3ludGF4Tm9kZSxcbiAgcHJvcGVydGllczogUGFydGlhbDxOb2RlUHJvcGVydGllcz5cbikge1xuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgJ2NsYXNzJzpcbiAgICAgIHJldHVybiB2aXNpdENsYXNzKHNvdXJjZSwgbm9kZSwgY29tbWVudCwgcHJvcGVydGllcyk7XG4gICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgcmV0dXJuIHZpc2l0RnVuY3Rpb24oc291cmNlLCBub2RlLCBjb21tZW50LCBwcm9wZXJ0aWVzKTtcbiAgICBjYXNlICdjb21tZW50JzpcbiAgICAgIC8vIG5vb3BcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0VSUk9SJzpcbiAgICAgIGxvZy5yZXBvcnQoc291cmNlLCBub2RlLCBFcnJvclR5cGUuVHJlZVNpdHRlclBhcnNlRXJyb3IpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGlmIChub2RlLnR5cGUuaW5jbHVkZXMoXCJzdGF0ZW1lbnRcIikpIHtcbiAgICAgICAgcmV0dXJuIHZpc2l0U3RhdGVtZW50KHNvdXJjZSwgbm9kZSwgY29tbWVudCwgcHJvcGVydGllcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLnR5cGUuaW5jbHVkZXMoXCJkZWNsYXJhdGlvblwiKSkge1xuICAgICAgICByZXR1cm4gdmlzaXREZWNsYXJhdGlvbihzb3VyY2UsIG5vZGUsIGNvbW1lbnQsIHByb3BlcnRpZXMpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBsb2cucmVwb3J0KHNvdXJjZSwgbm9kZSwgRXJyb3JUeXBlLk5vZGVUeXBlTm90WWV0U3VwcG9ydGVkKTtcbiAgICAgIGJyZWFrO1xuICB9XG59Il19 \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/program.visitor.d.ts b/build/src/lang/typescript/visitors/program.visitor.d.ts index 5f1fd91..567c152 100644 --- a/build/src/lang/typescript/visitors/program.visitor.d.ts +++ b/build/src/lang/typescript/visitors/program.visitor.d.ts @@ -1,3 +1,3 @@ import { SyntaxNode } from "tree-sitter"; -import IFile from "../../../interfaces/IFile"; -export declare function visitProgram(source: IFile, node: SyntaxNode): any[]; +import Source from "../../../interfaces/Source"; +export declare function visitProgram(source: Source, node: SyntaxNode): any[]; diff --git a/build/src/lang/typescript/visitors/program.visitor.js b/build/src/lang/typescript/visitors/program.visitor.js index 342035a..fb7b129 100644 --- a/build/src/lang/typescript/visitors/program.visitor.js +++ b/build/src/lang/typescript/visitors/program.visitor.js @@ -31,4 +31,4 @@ function visitProgram(source, node) { } } exports.visitProgram = visitProgram; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3JhbS52aXNpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xhbmcvdHlwZXNjcmlwdC92aXNpdG9ycy9wcm9ncmFtLnZpc2l0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxvREFBMEU7QUFFMUUsaURBQTJDO0FBRTNDLGdEQUF5QztBQUV6QyxTQUFnQixZQUFZLENBQUMsTUFBYSxFQUFFLElBQWdCO0lBQzFELElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDN0IsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDNUIsSUFBSSx3QkFBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDNUMsb0NBQW9DO1lBQ3BDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNwQztRQUNELGFBQWE7UUFDYixPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDMUIsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztZQUN0Qyw2Q0FBNkM7WUFDN0MsSUFBSSxlQUFLLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxJQUFJLDBCQUFnQixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRTtnQkFDOUQsNENBQTRDO2dCQUM1QyxJQUFJLFdBQVcsRUFBRTtvQkFDZixvQkFBb0I7b0JBQ3BCLHdCQUF3QjtvQkFDeEIsT0FBTyx3QkFBUyxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFO3dCQUMzQyxPQUFPLEVBQUU7NEJBQ1AsTUFBTSxFQUFFLEtBQUs7NEJBQ2IsT0FBTyxFQUFFLEtBQUs7eUJBQ2Y7cUJBQ0YsQ0FBQyxDQUFDO2lCQUNKO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDN0I7QUFDSCxDQUFDO0FBMUJELG9DQTBCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzSmF2YURvY0NvbW1lbnQsIGlzTGVnYWxDb21tZW50IH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2NvbW1lbnRcIjtcclxuaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5pbXBvcnQgeyB2aXNpdE5vZGUgfSBmcm9tIFwiLi9ub2RlLnZpc2l0b3JcIjtcclxuaW1wb3J0IElGaWxlIGZyb20gXCIuLi8uLi8uLi9pbnRlcmZhY2VzL0lGaWxlXCI7XHJcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbWF0Y2hcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB2aXNpdFByb2dyYW0oc291cmNlOiBJRmlsZSwgbm9kZTogU3ludGF4Tm9kZSkge1xyXG4gIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XHJcbiAgaWYgKG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xyXG4gICAgaWYgKGlzTGVnYWxDb21tZW50KHNvdXJjZSwgbm9kZS5jaGlsZHJlblswXSkpIHtcclxuICAgICAgLy8gUmVtb3ZlIHRoZSBsZWdhbCBjb21tZW50IGZyb20gYXN0XHJcbiAgICAgIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbi5zcGxpY2UoMSk7XHJcbiAgICB9XHJcbiAgICAvLyBQZXJmOiBPKG4pXHJcbiAgICByZXR1cm4gY2hpbGRyZW4ubWFwKGNoaWxkID0+IHtcclxuICAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSBjaGlsZC5uZXh0U2libGluZztcclxuICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBub2RlIGlzIGEgYy1zdHlsZSBjb21tZW50XHJcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ2NvbW1lbnQnKSAmJiBpc0phdmFEb2NDb21tZW50KHNvdXJjZSwgY2hpbGQpKSB7XHJcbiAgICAgICAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgYSBjb21tZW50IGhhcyBhIHNpYmxpbmdcclxuICAgICAgICBpZiAobmV4dFNpYmxpbmcpIHtcclxuICAgICAgICAgIC8vIFZpc2l0IHRoZSBzaWJsaW5nXHJcbiAgICAgICAgICAvLyBQZXJmOiBQb3NzaWJseSBPKG5eMilcclxuICAgICAgICAgIHJldHVybiB2aXNpdE5vZGUoc291cmNlLCBuZXh0U2libGluZywgY2hpbGQsIHtcclxuICAgICAgICAgICAgZXhwb3J0czoge1xyXG4gICAgICAgICAgICAgIGV4cG9ydDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgZGVmYXVsdDogZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KS5maWx0ZXIoY2hpbGQgPT4gISFjaGlsZCk7XHJcbiAgfVxyXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3JhbS52aXNpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xhbmcvdHlwZXNjcmlwdC92aXNpdG9ycy9wcm9ncmFtLnZpc2l0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxvREFBMEU7QUFFMUUsaURBQTJDO0FBRTNDLGdEQUF5QztBQUV6QyxTQUFnQixZQUFZLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQzNELElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDN0IsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDNUIsSUFBSSx3QkFBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDNUMsb0NBQW9DO1lBQ3BDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNwQztRQUNELGFBQWE7UUFDYixPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDMUIsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztZQUN0Qyw2Q0FBNkM7WUFDN0MsSUFBSSxlQUFLLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxJQUFJLDBCQUFnQixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRTtnQkFDOUQsNENBQTRDO2dCQUM1QyxJQUFJLFdBQVcsRUFBRTtvQkFDZixvQkFBb0I7b0JBQ3BCLHdCQUF3QjtvQkFDeEIsT0FBTyx3QkFBUyxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFO3dCQUMzQyxPQUFPLEVBQUU7NEJBQ1AsTUFBTSxFQUFFLEtBQUs7NEJBQ2IsT0FBTyxFQUFFLEtBQUs7eUJBQ2Y7cUJBQ0YsQ0FBQyxDQUFDO2lCQUNKO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDN0I7QUFDSCxDQUFDO0FBMUJELG9DQTBCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzSmF2YURvY0NvbW1lbnQsIGlzTGVnYWxDb21tZW50IH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2NvbW1lbnRcIjtcbmltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcbmltcG9ydCB7IHZpc2l0Tm9kZSB9IGZyb20gXCIuL25vZGUudmlzaXRvclwiO1xuaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi4vLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2VcIjtcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbWF0Y2hcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHZpc2l0UHJvZ3JhbShzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSkge1xuICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgaWYgKGlzTGVnYWxDb21tZW50KHNvdXJjZSwgbm9kZS5jaGlsZHJlblswXSkpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgbGVnYWwgY29tbWVudCBmcm9tIGFzdFxuICAgICAgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuLnNwbGljZSgxKTtcbiAgICB9XG4gICAgLy8gUGVyZjogTyhuKVxuICAgIHJldHVybiBjaGlsZHJlbi5tYXAoY2hpbGQgPT4ge1xuICAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSBjaGlsZC5uZXh0U2libGluZztcbiAgICAgIC8vIERldGVybWluZSBpZiB0aGUgbm9kZSBpcyBhIGMtc3R5bGUgY29tbWVudFxuICAgICAgaWYgKG1hdGNoKGNoaWxkLCAnY29tbWVudCcpICYmIGlzSmF2YURvY0NvbW1lbnQoc291cmNlLCBjaGlsZCkpIHtcbiAgICAgICAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgYSBjb21tZW50IGhhcyBhIHNpYmxpbmdcbiAgICAgICAgaWYgKG5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgLy8gVmlzaXQgdGhlIHNpYmxpbmdcbiAgICAgICAgICAvLyBQZXJmOiBQb3NzaWJseSBPKG5eMilcbiAgICAgICAgICByZXR1cm4gdmlzaXROb2RlKHNvdXJjZSwgbmV4dFNpYmxpbmcsIGNoaWxkLCB7XG4gICAgICAgICAgICBleHBvcnRzOiB7XG4gICAgICAgICAgICAgIGV4cG9ydDogZmFsc2UsXG4gICAgICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KS5maWx0ZXIoY2hpbGQgPT4gISFjaGlsZCk7XG4gIH1cbn0iXX0= \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/public_field_definition.visitor.d.ts b/build/src/lang/typescript/visitors/public_field_definition.visitor.d.ts new file mode 100644 index 0000000..3fb951b --- /dev/null +++ b/build/src/lang/typescript/visitors/public_field_definition.visitor.d.ts @@ -0,0 +1,10 @@ +import { SyntaxNode } from "tree-sitter"; +import Source from "../../../interfaces/Source"; +export declare function visitPublicFieldDefinition(source: Source, node: SyntaxNode, comment: SyntaxNode): { + type: string; + context: import("../Node").Node; + comment: import("../Node").Node; + identifier: any; + accessibility: string; + type_annotation: any; +}; diff --git a/build/src/lang/typescript/visitors/public_field_definition.visitor.js b/build/src/lang/typescript/visitors/public_field_definition.visitor.js new file mode 100644 index 0000000..1380ee7 --- /dev/null +++ b/build/src/lang/typescript/visitors/public_field_definition.visitor.js @@ -0,0 +1,30 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const Node_1 = require("../Node"); +const text_1 = require("../../../utils/text"); +const type_visitor_1 = require("./type.visitor"); +const match_1 = require("../../../utils/match"); +function visitPublicFieldDefinition(source, node, comment) { + let public_field_definition = node.children; + let accessibility = 'public', identifier, type_annotation; + if (match_1.default(public_field_definition[0], 'accessibility_modifier')) { + accessibility = text_1.text(source, public_field_definition.shift()); + } + if (match_1.default(public_field_definition[0], 'property_identifier')) { + identifier = Node_1.createNode(source, public_field_definition.shift()); + } + if (match_1.default(public_field_definition[0], 'type_annotation')) { + let type = public_field_definition.shift().children[1]; + type_annotation = type_visitor_1.visitType(source, type); + } + return { + type: 'property', + context: Node_1.createNode(source, node), + comment: Node_1.createNode(source, comment, null, true), + identifier, + accessibility, + type_annotation + }; +} +exports.visitPublicFieldDefinition = visitPublicFieldDefinition; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2ZpZWxkX2RlZmluaXRpb24udmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvcHVibGljX2ZpZWxkX2RlZmluaXRpb24udmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtDQUFxQztBQUVyQyw4Q0FBMkM7QUFDM0MsaURBQTJDO0FBRTNDLGdEQUF5QztBQUV6QyxTQUFnQiwwQkFBMEIsQ0FBQyxNQUFjLEVBQUUsSUFBZ0IsRUFBRSxPQUFtQjtJQUM5RixJQUFJLHVCQUF1QixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDNUMsSUFBSSxhQUFhLEdBQUcsUUFBUSxFQUMxQixVQUFVLEVBQ1YsZUFBZSxDQUFDO0lBRWxCLElBQUksZUFBSyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxFQUFFLHdCQUF3QixDQUFDLEVBQUU7UUFDL0QsYUFBYSxHQUFHLFdBQUksQ0FBQyxNQUFNLEVBQUUsdUJBQXVCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUMvRDtJQUVELElBQUksZUFBSyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxFQUFFLHFCQUFxQixDQUFDLEVBQUU7UUFDNUQsVUFBVSxHQUFHLGlCQUFVLENBQUMsTUFBTSxFQUFFLHVCQUF1QixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDbEU7SUFFRCxJQUFJLGVBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFO1FBQ3hELElBQUksSUFBSSxHQUFHLHVCQUF1QixDQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RCxlQUFlLEdBQUcsd0JBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDM0M7SUFDRCxPQUFPO1FBQ0wsSUFBSSxFQUFFLFVBQVU7UUFDaEIsT0FBTyxFQUFFLGlCQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztRQUNqQyxPQUFPLEVBQUUsaUJBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7UUFDaEQsVUFBVTtRQUNWLGFBQWE7UUFDYixlQUFlO0tBQ2hCLENBQUE7QUFDSCxDQUFDO0FBMUJELGdFQTBCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZU5vZGUgfSBmcm9tIFwiLi4vTm9kZVwiO1xuaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuaW1wb3J0IHsgdGV4dCB9IGZyb20gXCIuLi8uLi8uLi91dGlscy90ZXh0XCI7XG5pbXBvcnQgeyB2aXNpdFR5cGUgfSBmcm9tIFwiLi90eXBlLnZpc2l0b3JcIjtcbmltcG9ydCBTb3VyY2UgZnJvbSBcIi4uLy4uLy4uL2ludGVyZmFjZXMvU291cmNlXCI7XG5pbXBvcnQgbWF0Y2ggZnJvbSBcIi4uLy4uLy4uL3V0aWxzL21hdGNoXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiB2aXNpdFB1YmxpY0ZpZWxkRGVmaW5pdGlvbihzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSwgY29tbWVudDogU3ludGF4Tm9kZSkge1xuICBsZXQgcHVibGljX2ZpZWxkX2RlZmluaXRpb24gPSBub2RlLmNoaWxkcmVuO1xuICBsZXQgYWNjZXNzaWJpbGl0eSA9ICdwdWJsaWMnLFxuICAgIGlkZW50aWZpZXIsXG4gICAgdHlwZV9hbm5vdGF0aW9uO1xuXG4gIGlmIChtYXRjaChwdWJsaWNfZmllbGRfZGVmaW5pdGlvblswXSwgJ2FjY2Vzc2liaWxpdHlfbW9kaWZpZXInKSkge1xuICAgIGFjY2Vzc2liaWxpdHkgPSB0ZXh0KHNvdXJjZSwgcHVibGljX2ZpZWxkX2RlZmluaXRpb24uc2hpZnQoKSk7XG4gIH1cblxuICBpZiAobWF0Y2gocHVibGljX2ZpZWxkX2RlZmluaXRpb25bMF0sICdwcm9wZXJ0eV9pZGVudGlmaWVyJykpIHtcbiAgICBpZGVudGlmaWVyID0gY3JlYXRlTm9kZShzb3VyY2UsIHB1YmxpY19maWVsZF9kZWZpbml0aW9uLnNoaWZ0KCkpO1xuICB9XG5cbiAgaWYgKG1hdGNoKHB1YmxpY19maWVsZF9kZWZpbml0aW9uWzBdLCAndHlwZV9hbm5vdGF0aW9uJykpIHtcbiAgICBsZXQgdHlwZSA9IHB1YmxpY19maWVsZF9kZWZpbml0aW9uLnNoaWZ0KCkuY2hpbGRyZW5bMV07XG4gICAgdHlwZV9hbm5vdGF0aW9uID0gdmlzaXRUeXBlKHNvdXJjZSwgdHlwZSk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAncHJvcGVydHknLFxuICAgIGNvbnRleHQ6IGNyZWF0ZU5vZGUoc291cmNlLCBub2RlKSxcbiAgICBjb21tZW50OiBjcmVhdGVOb2RlKHNvdXJjZSwgY29tbWVudCwgbnVsbCwgdHJ1ZSksXG4gICAgaWRlbnRpZmllcixcbiAgICBhY2Nlc3NpYmlsaXR5LFxuICAgIHR5cGVfYW5ub3RhdGlvblxuICB9XG59Il19 \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/statement.visitor.d.ts b/build/src/lang/typescript/visitors/statement.visitor.d.ts index 0cc3db5..d765f04 100644 --- a/build/src/lang/typescript/visitors/statement.visitor.d.ts +++ b/build/src/lang/typescript/visitors/statement.visitor.d.ts @@ -1,6 +1,6 @@ -import { SyntaxNode } from "tree-sitter"; import { NodeProperties } from "../Node"; -import IFile from "../../../interfaces/IFile"; -export declare function visitStatement(source: IFile, node: SyntaxNode, comment: SyntaxNode, properties: Partial): any; -export declare function visitExpressionStatement(source: IFile, node: SyntaxNode, comment: SyntaxNode, properties: Partial): any; -export declare function visitExportStatement(source: IFile, node: SyntaxNode, comment: SyntaxNode): any; +import { SyntaxNode } from "tree-sitter"; +import Source from "../../../interfaces/Source"; +export declare function visitStatement(source: Source, node: SyntaxNode, comment: SyntaxNode, properties: Partial): any; +export declare function visitExpressionStatement(source: Source, node: SyntaxNode, comment: SyntaxNode, properties: Partial): any; +export declare function visitExportStatement(source: Source, node: SyntaxNode, comment: SyntaxNode): any; diff --git a/build/src/lang/typescript/visitors/statement.visitor.js b/build/src/lang/typescript/visitors/statement.visitor.js index a8bebc6..deff783 100644 --- a/build/src/lang/typescript/visitors/statement.visitor.js +++ b/build/src/lang/typescript/visitors/statement.visitor.js @@ -1,8 +1,8 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const node_visitor_1 = require("./node.visitor"); -const match_1 = require("../../../utils/match"); const log_1 = require("../../../utils/log"); +const match_1 = require("../../../utils/match"); function visitStatement(source, node, comment, properties) { switch (node.type) { case 'expression_statement': @@ -10,7 +10,7 @@ function visitStatement(source, node, comment, properties) { case 'export_statement': return visitExportStatement(source, node, comment); default: - log_1.default.report(source, node, log_1.ErrorType.NodeTypeNotSupported); + log_1.default.report(source, node, log_1.ErrorType.NodeTypeNotYetSupported); break; } } @@ -34,4 +34,4 @@ function visitExportStatement(source, node, comment) { }); } exports.visitExportStatement = visitExportStatement; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGVtZW50LnZpc2l0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGFuZy90eXBlc2NyaXB0L3Zpc2l0b3JzL3N0YXRlbWVudC52aXNpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsaURBQTJDO0FBQzNDLGdEQUF5QztBQUV6Qyw0Q0FBb0Q7QUFHcEQsU0FBZ0IsY0FBYyxDQUM1QixNQUFhLEVBQ2IsSUFBZ0IsRUFDaEIsT0FBbUIsRUFDbkIsVUFBbUM7SUFFbkMsUUFBTyxJQUFJLENBQUMsSUFBSSxFQUFFO1FBQ2hCLEtBQUssc0JBQXNCO1lBQ3pCLE9BQU8sd0JBQXdCLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDckUsS0FBSyxrQkFBa0I7WUFDckIsT0FBTyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3JEO1lBQ0UsYUFBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQ3pELE1BQU07S0FDVDtBQUNILENBQUM7QUFmRCx3Q0FlQztBQUVELFNBQWdCLHdCQUF3QixDQUN0QyxNQUFhLEVBQ2IsSUFBZ0IsRUFDaEIsT0FBbUIsRUFDbkIsVUFBbUM7SUFFbkMsT0FBTyx3QkFBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBUEQsNERBT0M7QUFFRCxTQUFnQixvQkFBb0IsQ0FDbEMsTUFBYSxFQUNiLElBQWdCLEVBQ2hCLE9BQW1CO0lBRW5CLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQzFCLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFFMUIsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxlQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFO0tBQzdEO0lBRUQsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxlQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLFNBQVMsQ0FBQyxFQUFFO1FBQzdELGVBQWUsR0FBRyxJQUFJLENBQUM7S0FDeEI7SUFDRCxPQUFPLHdCQUFTLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUU7UUFDbEQsT0FBTyxFQUFFO1lBQ1AsTUFBTSxFQUFFLElBQUk7WUFDWixPQUFPLEVBQUUsZUFBZTtTQUN6QjtLQUNGLENBQUMsQ0FBQztBQUNMLENBQUM7QUFwQkQsb0RBb0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5pbXBvcnQgeyB2aXNpdE5vZGUgfSBmcm9tIFwiLi9ub2RlLnZpc2l0b3JcIjtcclxuaW1wb3J0IG1hdGNoIGZyb20gXCIuLi8uLi8uLi91dGlscy9tYXRjaFwiO1xyXG5pbXBvcnQgeyBOb2RlUHJvcGVydGllcyB9IGZyb20gXCIuLi9Ob2RlXCI7XHJcbmltcG9ydCBsb2csIHsgRXJyb3JUeXBlIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2xvZ1wiO1xyXG5pbXBvcnQgSUZpbGUgZnJvbSBcIi4uLy4uLy4uL2ludGVyZmFjZXMvSUZpbGVcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB2aXNpdFN0YXRlbWVudChcclxuICBzb3VyY2U6IElGaWxlLFxyXG4gIG5vZGU6IFN5bnRheE5vZGUsXHJcbiAgY29tbWVudDogU3ludGF4Tm9kZSxcclxuICBwcm9wZXJ0aWVzOiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPlxyXG4pIHtcclxuICBzd2l0Y2gobm9kZS50eXBlKSB7XHJcbiAgICBjYXNlICdleHByZXNzaW9uX3N0YXRlbWVudCc6XHJcbiAgICAgIHJldHVybiB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQoc291cmNlLCBub2RlLCBjb21tZW50LCBwcm9wZXJ0aWVzKTtcclxuICAgIGNhc2UgJ2V4cG9ydF9zdGF0ZW1lbnQnOlxyXG4gICAgICByZXR1cm4gdmlzaXRFeHBvcnRTdGF0ZW1lbnQoc291cmNlLCBub2RlLCBjb21tZW50KTtcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIGxvZy5yZXBvcnQoc291cmNlLCBub2RlLCBFcnJvclR5cGUuTm9kZVR5cGVOb3RTdXBwb3J0ZWQpO1xyXG4gICAgICBicmVhaztcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQoXHJcbiAgc291cmNlOiBJRmlsZSxcclxuICBub2RlOiBTeW50YXhOb2RlLFxyXG4gIGNvbW1lbnQ6IFN5bnRheE5vZGUsXHJcbiAgcHJvcGVydGllczogUGFydGlhbDxOb2RlUHJvcGVydGllcz5cclxuKSB7XHJcbiAgcmV0dXJuIHZpc2l0Tm9kZShzb3VyY2UsIG5vZGUuY2hpbGRyZW4uc2hpZnQoKSwgY29tbWVudCwgcHJvcGVydGllcyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB2aXNpdEV4cG9ydFN0YXRlbWVudChcclxuICBzb3VyY2U6IElGaWxlLFxyXG4gIG5vZGU6IFN5bnRheE5vZGUsXHJcbiAgY29tbWVudDogU3ludGF4Tm9kZSxcclxuKSB7XHJcbiAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbixcclxuICAgIGlzRGVmYXVsdEV4cG9ydCA9IGZhbHNlO1xyXG5cclxuICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMSAmJiBtYXRjaChjaGlsZHJlbi5zaGlmdCgpLCAnZXhwb3J0JykpIHtcclxuICB9XHJcblxyXG4gIGlmIChjaGlsZHJlbi5sZW5ndGggPiAxICYmIG1hdGNoKGNoaWxkcmVuLnNoaWZ0KCksICdkZWZhdWx0JykpIHtcclxuICAgIGlzRGVmYXVsdEV4cG9ydCA9IHRydWU7XHJcbiAgfVxyXG4gIHJldHVybiB2aXNpdE5vZGUoc291cmNlLCBjaGlsZHJlbi5zaGlmdCgpLCBjb21tZW50LCB7XHJcbiAgICBleHBvcnRzOiB7XHJcbiAgICAgIGV4cG9ydDogdHJ1ZSxcclxuICAgICAgZGVmYXVsdDogaXNEZWZhdWx0RXhwb3J0XHJcbiAgICB9XHJcbiAgfSk7XHJcbn0iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGVtZW50LnZpc2l0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGFuZy90eXBlc2NyaXB0L3Zpc2l0b3JzL3N0YXRlbWVudC52aXNpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsaURBQTJDO0FBRTNDLDRDQUFvRDtBQUNwRCxnREFBeUM7QUFFekMsU0FBZ0IsY0FBYyxDQUM1QixNQUFjLEVBQ2QsSUFBZ0IsRUFDaEIsT0FBbUIsRUFDbkIsVUFBbUM7SUFFbkMsUUFBTyxJQUFJLENBQUMsSUFBSSxFQUFFO1FBQ2hCLEtBQUssc0JBQXNCO1lBQ3pCLE9BQU8sd0JBQXdCLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDckUsS0FBSyxrQkFBa0I7WUFDckIsT0FBTyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3JEO1lBQ0UsYUFBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1lBQzVELE1BQU07S0FDVDtBQUNILENBQUM7QUFmRCx3Q0FlQztBQUVELFNBQWdCLHdCQUF3QixDQUN0QyxNQUFjLEVBQ2QsSUFBZ0IsRUFDaEIsT0FBbUIsRUFDbkIsVUFBbUM7SUFFbkMsT0FBTyx3QkFBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBUEQsNERBT0M7QUFFRCxTQUFnQixvQkFBb0IsQ0FDbEMsTUFBYyxFQUNkLElBQWdCLEVBQ2hCLE9BQW1CO0lBRW5CLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQzFCLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFFMUIsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxlQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFO0tBQzdEO0lBRUQsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxlQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLFNBQVMsQ0FBQyxFQUFFO1FBQzdELGVBQWUsR0FBRyxJQUFJLENBQUM7S0FDeEI7SUFDRCxPQUFPLHdCQUFTLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUU7UUFDbEQsT0FBTyxFQUFFO1lBQ1AsTUFBTSxFQUFFLElBQUk7WUFDWixPQUFPLEVBQUUsZUFBZTtTQUN6QjtLQUNGLENBQUMsQ0FBQztBQUNMLENBQUM7QUFwQkQsb0RBb0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTm9kZVByb3BlcnRpZXMgfSBmcm9tIFwiLi4vTm9kZVwiO1xuaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuaW1wb3J0IHsgdmlzaXROb2RlIH0gZnJvbSBcIi4vbm9kZS52aXNpdG9yXCI7XG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi8uLi8uLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuaW1wb3J0IGxvZywgeyBFcnJvclR5cGUgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbG9nXCI7XG5pbXBvcnQgbWF0Y2ggZnJvbSBcIi4uLy4uLy4uL3V0aWxzL21hdGNoXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiB2aXNpdFN0YXRlbWVudChcbiAgc291cmNlOiBTb3VyY2UsXG4gIG5vZGU6IFN5bnRheE5vZGUsXG4gIGNvbW1lbnQ6IFN5bnRheE5vZGUsXG4gIHByb3BlcnRpZXM6IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+XG4pIHtcbiAgc3dpdGNoKG5vZGUudHlwZSkge1xuICAgIGNhc2UgJ2V4cHJlc3Npb25fc3RhdGVtZW50JzpcbiAgICAgIHJldHVybiB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQoc291cmNlLCBub2RlLCBjb21tZW50LCBwcm9wZXJ0aWVzKTtcbiAgICBjYXNlICdleHBvcnRfc3RhdGVtZW50JzpcbiAgICAgIHJldHVybiB2aXNpdEV4cG9ydFN0YXRlbWVudChzb3VyY2UsIG5vZGUsIGNvbW1lbnQpO1xuICAgIGRlZmF1bHQ6XG4gICAgICBsb2cucmVwb3J0KHNvdXJjZSwgbm9kZSwgRXJyb3JUeXBlLk5vZGVUeXBlTm90WWV0U3VwcG9ydGVkKTtcbiAgICAgIGJyZWFrO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQoXG4gIHNvdXJjZTogU291cmNlLFxuICBub2RlOiBTeW50YXhOb2RlLFxuICBjb21tZW50OiBTeW50YXhOb2RlLFxuICBwcm9wZXJ0aWVzOiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPlxuKSB7XG4gIHJldHVybiB2aXNpdE5vZGUoc291cmNlLCBub2RlLmNoaWxkcmVuLnNoaWZ0KCksIGNvbW1lbnQsIHByb3BlcnRpZXMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRFeHBvcnRTdGF0ZW1lbnQoXG4gIHNvdXJjZTogU291cmNlLFxuICBub2RlOiBTeW50YXhOb2RlLFxuICBjb21tZW50OiBTeW50YXhOb2RlLFxuKSB7XG4gIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4sXG4gICAgaXNEZWZhdWx0RXhwb3J0ID0gZmFsc2U7XG5cbiAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDEgJiYgbWF0Y2goY2hpbGRyZW4uc2hpZnQoKSwgJ2V4cG9ydCcpKSB7XG4gIH1cblxuICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMSAmJiBtYXRjaChjaGlsZHJlbi5zaGlmdCgpLCAnZGVmYXVsdCcpKSB7XG4gICAgaXNEZWZhdWx0RXhwb3J0ID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gdmlzaXROb2RlKHNvdXJjZSwgY2hpbGRyZW4uc2hpZnQoKSwgY29tbWVudCwge1xuICAgIGV4cG9ydHM6IHtcbiAgICAgIGV4cG9ydDogdHJ1ZSxcbiAgICAgIGRlZmF1bHQ6IGlzRGVmYXVsdEV4cG9ydFxuICAgIH1cbiAgfSk7XG59Il19 \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/type.visitor.d.ts b/build/src/lang/typescript/visitors/type.visitor.d.ts index f0cde52..ac72a6b 100644 --- a/build/src/lang/typescript/visitors/type.visitor.d.ts +++ b/build/src/lang/typescript/visitors/type.visitor.d.ts @@ -1,25 +1,25 @@ import { SyntaxNode } from "tree-sitter"; -import IFile from "../../../interfaces/IFile"; -export declare function visitTypeOrTypeIdentifier(source: IFile, node: SyntaxNode): any; -export declare function visitType(source: IFile, node: SyntaxNode): any; -export declare function visitTypeIdentifier(source: IFile, node: SyntaxNode): { +import Source from "../../../interfaces/Source"; +export declare function visitTypeOrTypeIdentifier(source: Source, node: SyntaxNode): any; +export declare function visitType(source: Source, node: SyntaxNode): any; +export declare function visitTypeIdentifier(source: Source, node: SyntaxNode): { type: string; context: import("../Node").Node; }; -export declare function visitUnionType(source: IFile, node: SyntaxNode): any; -export declare function visitIntersectionType(source: IFile, node: SyntaxNode): { +export declare function visitUnionType(source: Source, node: SyntaxNode): any; +export declare function visitIntersectionType(source: Source, node: SyntaxNode): { type: string; context: import("../Node").Node; left: any; right: any; }; -export declare function visitParenthesizedType(source: IFile, node: SyntaxNode): { +export declare function visitParenthesizedType(source: Source, node: SyntaxNode): { type: string; context: import("../Node").Node; parenthesized: any; }; -export declare function visitGenericType(source: IFile, node: SyntaxNode): any; -export declare function visitPredefinedType(source: IFile, node: SyntaxNode): { +export declare function visitGenericType(source: Source, node: SyntaxNode): any; +export declare function visitPredefinedType(source: Source, node: SyntaxNode): { type: string; context: import("../Node").Node; }; diff --git a/build/src/lang/typescript/visitors/type.visitor.js b/build/src/lang/typescript/visitors/type.visitor.js index c91686c..8570e2e 100644 --- a/build/src/lang/typescript/visitors/type.visitor.js +++ b/build/src/lang/typescript/visitors/type.visitor.js @@ -2,6 +2,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); const Node_1 = require("../Node"); const type_arguments_visitor_1 = require("./type_arguments.visitor"); +const log_1 = require("../../../utils/log"); function visitTypeOrTypeIdentifier(source, node) { if (node.type === 'type_identifier') { return visitTypeIdentifier(source, node); @@ -24,7 +25,7 @@ function visitType(source, node) { case 'predefined_type': return visitPredefinedType(source, node); default: - console.log(`[mr-doc::parser]: info - '${node.type.replace(/[_]/g, ' ')}' is not supported yet.`); + log_1.default.report(source, node, log_1.ErrorType.NodeTypeNotYetSupported); break; } } @@ -81,4 +82,4 @@ function visitPredefinedType(source, node) { }; } exports.visitPredefinedType = visitPredefinedType; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS52aXNpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xhbmcvdHlwZXNjcmlwdC92aXNpdG9ycy90eXBlLnZpc2l0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSxrQ0FBcUM7QUFDckMscUVBQThEO0FBRzlELFNBQWdCLHlCQUF5QixDQUFDLE1BQWEsRUFBRSxJQUFnQjtJQUN2RSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssaUJBQWlCLEVBQUU7UUFDbkMsT0FBTyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUE7S0FDekM7SUFDRCxPQUFPLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUxELDhEQUtDO0FBRUQsU0FBZ0IsU0FBUyxDQUFDLE1BQWEsRUFBRSxJQUFnQjtJQUN2RCxRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUU7UUFDakIsS0FBSyxZQUFZO1lBQ2YsT0FBTyxjQUFjLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3RDLEtBQUssbUJBQW1CO1lBQ3RCLE9BQU8scUJBQXFCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdDLEtBQUssb0JBQW9CO1lBQ3ZCLE9BQU8sc0JBQXNCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzlDLEtBQUssaUJBQWlCO1lBQ3BCLE9BQU8sbUJBQW1CLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNDLEtBQUssY0FBYztZQUNqQixPQUFPLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN4QyxLQUFLLGlCQUFpQjtZQUNwQixPQUFPLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMzQztZQUNBLE9BQU8sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMseUJBQXlCLENBQUMsQ0FBQztZQUNsRyxNQUFNO0tBQ1A7QUFDSCxDQUFDO0FBbEJELDhCQWtCQztBQUVELFNBQWdCLG1CQUFtQixDQUFDLE1BQWEsRUFBRSxJQUFnQjtJQUNqRSxPQUFPO1FBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1FBQ2YsT0FBTyxFQUFFLGlCQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztLQUNsQyxDQUFBO0FBQ0gsQ0FBQztBQUxELGtEQUtDO0FBRUQsU0FBZ0IsY0FBYyxDQUFDLE1BQWEsRUFBRSxJQUFnQjtJQUM1RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQzVCLE9BQU87UUFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7UUFDZixPQUFPLEVBQUUsaUJBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDO1FBQ2pDLElBQUksRUFBRSx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pELEtBQUssRUFBRSx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ25ELENBQUE7QUFDSCxDQUFDO0FBUkQsd0NBUUM7QUFFRCxTQUFnQixxQkFBcUIsQ0FBQyxNQUFhLEVBQUUsSUFBZ0I7SUFDbkUsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUNoQyxPQUFPO1FBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1FBQ2YsT0FBTyxFQUFFLGlCQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztRQUNqQyxJQUFJLEVBQUUseUJBQXlCLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRCxLQUFLLEVBQUUseUJBQXlCLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN2RCxDQUFBO0FBQ0gsQ0FBQztBQVJELHNEQVFDO0FBRUQsU0FBZ0Isc0JBQXNCLENBQUMsTUFBYSxFQUFFLElBQWdCO0lBQ3BFLE9BQU87UUFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7UUFDZixPQUFPLEVBQUUsaUJBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDO1FBQ2pDLGFBQWEsRUFBRSx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNuRSxDQUFBO0FBQ0gsQ0FBQztBQU5ELHdEQU1DO0FBRUQsU0FBZ0IsZ0JBQWdCLENBQUMsTUFBYSxFQUFFLElBQWdCO0lBQzlELElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDN0IsT0FBTztRQUNMLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtRQUNmLE9BQU8sRUFBRSxpQkFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7UUFDakMsT0FBTyxFQUFFLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEQsY0FBYyxFQUFFLDJDQUFrQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7S0FDN0QsQ0FBQTtBQUNILENBQUM7QUFSRCw0Q0FRQztBQUVELFNBQWdCLG1CQUFtQixDQUFDLE1BQWEsRUFBRSxJQUFnQjtJQUNqRSxPQUFPO1FBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1FBQ2YsT0FBTyxFQUFFLGlCQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7S0FDbkQsQ0FBQTtBQUNILENBQUM7QUFMRCxrREFLQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcclxuaW1wb3J0IHsgY3JlYXRlTm9kZSB9IGZyb20gXCIuLi9Ob2RlXCI7XHJcbmltcG9ydCB7IHZpc2l0VHlwZUFyZ3VtZW50cyB9IGZyb20gXCIuL3R5cGVfYXJndW1lbnRzLnZpc2l0b3JcIjtcclxuaW1wb3J0IElGaWxlIGZyb20gXCIuLi8uLi8uLi9pbnRlcmZhY2VzL0lGaWxlXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRUeXBlT3JUeXBlSWRlbnRpZmllcihzb3VyY2U6IElGaWxlLCBub2RlOiBTeW50YXhOb2RlKSB7XHJcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ3R5cGVfaWRlbnRpZmllcicpIHtcclxuICAgIHJldHVybiB2aXNpdFR5cGVJZGVudGlmaWVyKHNvdXJjZSwgbm9kZSlcclxuICB9XHJcbiAgcmV0dXJuIHZpc2l0VHlwZShzb3VyY2UsIG5vZGUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRUeXBlKHNvdXJjZTogSUZpbGUsIG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xyXG4gICAgY2FzZSAndW5pb25fdHlwZSc6XHJcbiAgICAgIHJldHVybiB2aXNpdFVuaW9uVHlwZShzb3VyY2UsIG5vZGUpO1xyXG4gICAgY2FzZSAnaW50ZXJzZWN0aW9uX3R5cGUnOlxyXG4gICAgICByZXR1cm4gdmlzaXRJbnRlcnNlY3Rpb25UeXBlKHNvdXJjZSwgbm9kZSk7XHJcbiAgICBjYXNlICdwYXJlbnRoZXNpemVkX3R5cGUnOlxyXG4gICAgICByZXR1cm4gdmlzaXRQYXJlbnRoZXNpemVkVHlwZShzb3VyY2UsIG5vZGUpO1xyXG4gICAgY2FzZSAndHlwZV9pZGVudGlmaWVyJzpcclxuICAgICAgcmV0dXJuIHZpc2l0VHlwZUlkZW50aWZpZXIoc291cmNlLCBub2RlKTtcclxuICAgIGNhc2UgJ2dlbmVyaWNfdHlwZSc6XHJcbiAgICAgIHJldHVybiB2aXNpdEdlbmVyaWNUeXBlKHNvdXJjZSwgbm9kZSk7XHJcbiAgICBjYXNlICdwcmVkZWZpbmVkX3R5cGUnOlxyXG4gICAgICByZXR1cm4gdmlzaXRQcmVkZWZpbmVkVHlwZShzb3VyY2UsIG5vZGUpO1xyXG4gICAgZGVmYXVsdDpcclxuICAgIGNvbnNvbGUubG9nKGBbbXItZG9jOjpwYXJzZXJdOiBpbmZvIC0gJyR7bm9kZS50eXBlLnJlcGxhY2UoL1tfXS9nLCAnICcpfScgaXMgbm90IHN1cHBvcnRlZCB5ZXQuYCk7XHJcbiAgICBicmVhaztcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB2aXNpdFR5cGVJZGVudGlmaWVyKHNvdXJjZTogSUZpbGUsIG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICByZXR1cm4ge1xyXG4gICAgdHlwZTogbm9kZS50eXBlLFxyXG4gICAgY29udGV4dDogY3JlYXRlTm9kZShzb3VyY2UsIG5vZGUpXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRVbmlvblR5cGUoc291cmNlOiBJRmlsZSwgbm9kZTogU3ludGF4Tm9kZSkge1xyXG4gIGNvbnN0IHVuaW9uID0gbm9kZS5jaGlsZHJlbjtcclxuICByZXR1cm4ge1xyXG4gICAgdHlwZTogbm9kZS50eXBlLFxyXG4gICAgY29udGV4dDogY3JlYXRlTm9kZShzb3VyY2UsIG5vZGUpLFxyXG4gICAgbGVmdDogdmlzaXRUeXBlT3JUeXBlSWRlbnRpZmllcihzb3VyY2UsIHVuaW9uWzBdKSxcclxuICAgIHJpZ2h0OiB2aXNpdFR5cGVPclR5cGVJZGVudGlmaWVyKHNvdXJjZSwgdW5pb25bMl0pXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRJbnRlcnNlY3Rpb25UeXBlKHNvdXJjZTogSUZpbGUsIG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICBjb25zdCBpbnRlcnNlY3QgPSBub2RlLmNoaWxkcmVuO1xyXG4gIHJldHVybiB7XHJcbiAgICB0eXBlOiBub2RlLnR5cGUsXHJcbiAgICBjb250ZXh0OiBjcmVhdGVOb2RlKHNvdXJjZSwgbm9kZSksXHJcbiAgICBsZWZ0OiB2aXNpdFR5cGVPclR5cGVJZGVudGlmaWVyKHNvdXJjZSwgaW50ZXJzZWN0WzBdKSxcclxuICAgIHJpZ2h0OiB2aXNpdFR5cGVPclR5cGVJZGVudGlmaWVyKHNvdXJjZSwgaW50ZXJzZWN0WzJdKVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHZpc2l0UGFyZW50aGVzaXplZFR5cGUoc291cmNlOiBJRmlsZSwgbm9kZTogU3ludGF4Tm9kZSkge1xyXG4gIHJldHVybiB7XHJcbiAgICB0eXBlOiBub2RlLnR5cGUsXHJcbiAgICBjb250ZXh0OiBjcmVhdGVOb2RlKHNvdXJjZSwgbm9kZSksXHJcbiAgICBwYXJlbnRoZXNpemVkOiB2aXNpdFR5cGVPclR5cGVJZGVudGlmaWVyKHNvdXJjZSwgbm9kZS5jaGlsZHJlblsxXSlcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB2aXNpdEdlbmVyaWNUeXBlKHNvdXJjZTogSUZpbGUsIG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xyXG4gIHJldHVybiB7XHJcbiAgICB0eXBlOiBub2RlLnR5cGUsXHJcbiAgICBjb250ZXh0OiBjcmVhdGVOb2RlKHNvdXJjZSwgbm9kZSksXHJcbiAgICBnZW5lcmljOiB2aXNpdFR5cGVJZGVudGlmaWVyKHNvdXJjZSwgY2hpbGRyZW4uc2hpZnQoKSksXHJcbiAgICB0eXBlX2FyZ3VtZW50czogdmlzaXRUeXBlQXJndW1lbnRzKHNvdXJjZSwgY2hpbGRyZW4uc2hpZnQoKSlcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB2aXNpdFByZWRlZmluZWRUeXBlKHNvdXJjZTogSUZpbGUsIG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICByZXR1cm4ge1xyXG4gICAgdHlwZTogbm9kZS50eXBlLFxyXG4gICAgY29udGV4dDogY3JlYXRlTm9kZShzb3VyY2UsIG5vZGUuY2hpbGRyZW4uc2hpZnQoKSksXHJcbiAgfVxyXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS52aXNpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xhbmcvdHlwZXNjcmlwdC92aXNpdG9ycy90eXBlLnZpc2l0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxrQ0FBcUM7QUFFckMscUVBQThEO0FBRTlELDRDQUFvRDtBQUVwRCxTQUFnQix5QkFBeUIsQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDeEUsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGlCQUFpQixFQUFFO1FBQ25DLE9BQU8sbUJBQW1CLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFBO0tBQ3pDO0lBQ0QsT0FBTyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2pDLENBQUM7QUFMRCw4REFLQztBQUVELFNBQWdCLFNBQVMsQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDeEQsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO1FBQ2pCLEtBQUssWUFBWTtZQUNmLE9BQU8sY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN0QyxLQUFLLG1CQUFtQjtZQUN0QixPQUFPLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM3QyxLQUFLLG9CQUFvQjtZQUN2QixPQUFPLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM5QyxLQUFLLGlCQUFpQjtZQUNwQixPQUFPLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMzQyxLQUFLLGNBQWM7WUFDakIsT0FBTyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDeEMsS0FBSyxpQkFBaUI7WUFDcEIsT0FBTyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0M7WUFDQSxhQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsZUFBUyxDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDNUQsTUFBTTtLQUNQO0FBQ0gsQ0FBQztBQWxCRCw4QkFrQkM7QUFFRCxTQUFnQixtQkFBbUIsQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDbEUsT0FBTztRQUNMLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtRQUNmLE9BQU8sRUFBRSxpQkFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7S0FDbEMsQ0FBQTtBQUNILENBQUM7QUFMRCxrREFLQztBQUVELFNBQWdCLGNBQWMsQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDN0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUM1QixPQUFPO1FBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1FBQ2YsT0FBTyxFQUFFLGlCQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztRQUNqQyxJQUFJLEVBQUUseUJBQXlCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRCxLQUFLLEVBQUUseUJBQXlCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNuRCxDQUFBO0FBQ0gsQ0FBQztBQVJELHdDQVFDO0FBRUQsU0FBZ0IscUJBQXFCLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQ3BFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDaEMsT0FBTztRQUNMLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtRQUNmLE9BQU8sRUFBRSxpQkFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7UUFDakMsSUFBSSxFQUFFLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckQsS0FBSyxFQUFFLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDdkQsQ0FBQTtBQUNILENBQUM7QUFSRCxzREFRQztBQUVELFNBQWdCLHNCQUFzQixDQUFDLE1BQWMsRUFBRSxJQUFnQjtJQUNyRSxPQUFPO1FBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1FBQ2YsT0FBTyxFQUFFLGlCQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztRQUNqQyxhQUFhLEVBQUUseUJBQXlCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDbkUsQ0FBQTtBQUNILENBQUM7QUFORCx3REFNQztBQUVELFNBQWdCLGdCQUFnQixDQUFDLE1BQWMsRUFBRSxJQUFnQjtJQUMvRCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQzdCLE9BQU87UUFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7UUFDZixPQUFPLEVBQUUsaUJBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDO1FBQ2pDLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3RELGNBQWMsRUFBRSwyQ0FBa0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO0tBQzdELENBQUE7QUFDSCxDQUFDO0FBUkQsNENBUUM7QUFFRCxTQUFnQixtQkFBbUIsQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDbEUsT0FBTztRQUNMLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtRQUNmLE9BQU8sRUFBRSxpQkFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO0tBQ25ELENBQUE7QUFDSCxDQUFDO0FBTEQsa0RBS0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVOb2RlIH0gZnJvbSBcIi4uL05vZGVcIjtcbmltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcbmltcG9ydCB7IHZpc2l0VHlwZUFyZ3VtZW50cyB9IGZyb20gXCIuL3R5cGVfYXJndW1lbnRzLnZpc2l0b3JcIjtcbmltcG9ydCBTb3VyY2UgZnJvbSBcIi4uLy4uLy4uL2ludGVyZmFjZXMvU291cmNlXCI7XG5pbXBvcnQgbG9nLCB7IEVycm9yVHlwZSB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9sb2dcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHZpc2l0VHlwZU9yVHlwZUlkZW50aWZpZXIoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ3R5cGVfaWRlbnRpZmllcicpIHtcbiAgICByZXR1cm4gdmlzaXRUeXBlSWRlbnRpZmllcihzb3VyY2UsIG5vZGUpXG4gIH1cbiAgcmV0dXJuIHZpc2l0VHlwZShzb3VyY2UsIG5vZGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRUeXBlKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlKSB7XG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSAndW5pb25fdHlwZSc6XG4gICAgICByZXR1cm4gdmlzaXRVbmlvblR5cGUoc291cmNlLCBub2RlKTtcbiAgICBjYXNlICdpbnRlcnNlY3Rpb25fdHlwZSc6XG4gICAgICByZXR1cm4gdmlzaXRJbnRlcnNlY3Rpb25UeXBlKHNvdXJjZSwgbm9kZSk7XG4gICAgY2FzZSAncGFyZW50aGVzaXplZF90eXBlJzpcbiAgICAgIHJldHVybiB2aXNpdFBhcmVudGhlc2l6ZWRUeXBlKHNvdXJjZSwgbm9kZSk7XG4gICAgY2FzZSAndHlwZV9pZGVudGlmaWVyJzpcbiAgICAgIHJldHVybiB2aXNpdFR5cGVJZGVudGlmaWVyKHNvdXJjZSwgbm9kZSk7XG4gICAgY2FzZSAnZ2VuZXJpY190eXBlJzpcbiAgICAgIHJldHVybiB2aXNpdEdlbmVyaWNUeXBlKHNvdXJjZSwgbm9kZSk7XG4gICAgY2FzZSAncHJlZGVmaW5lZF90eXBlJzpcbiAgICAgIHJldHVybiB2aXNpdFByZWRlZmluZWRUeXBlKHNvdXJjZSwgbm9kZSk7XG4gICAgZGVmYXVsdDpcbiAgICBsb2cucmVwb3J0KHNvdXJjZSwgbm9kZSwgRXJyb3JUeXBlLk5vZGVUeXBlTm90WWV0U3VwcG9ydGVkKTtcbiAgICBicmVhaztcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRUeXBlSWRlbnRpZmllcihzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IG5vZGUudHlwZSxcbiAgICBjb250ZXh0OiBjcmVhdGVOb2RlKHNvdXJjZSwgbm9kZSlcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRVbmlvblR5cGUoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgY29uc3QgdW5pb24gPSBub2RlLmNoaWxkcmVuO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IG5vZGUudHlwZSxcbiAgICBjb250ZXh0OiBjcmVhdGVOb2RlKHNvdXJjZSwgbm9kZSksXG4gICAgbGVmdDogdmlzaXRUeXBlT3JUeXBlSWRlbnRpZmllcihzb3VyY2UsIHVuaW9uWzBdKSxcbiAgICByaWdodDogdmlzaXRUeXBlT3JUeXBlSWRlbnRpZmllcihzb3VyY2UsIHVuaW9uWzJdKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2aXNpdEludGVyc2VjdGlvblR5cGUoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgY29uc3QgaW50ZXJzZWN0ID0gbm9kZS5jaGlsZHJlbjtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBub2RlLnR5cGUsXG4gICAgY29udGV4dDogY3JlYXRlTm9kZShzb3VyY2UsIG5vZGUpLFxuICAgIGxlZnQ6IHZpc2l0VHlwZU9yVHlwZUlkZW50aWZpZXIoc291cmNlLCBpbnRlcnNlY3RbMF0pLFxuICAgIHJpZ2h0OiB2aXNpdFR5cGVPclR5cGVJZGVudGlmaWVyKHNvdXJjZSwgaW50ZXJzZWN0WzJdKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2aXNpdFBhcmVudGhlc2l6ZWRUeXBlKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogbm9kZS50eXBlLFxuICAgIGNvbnRleHQ6IGNyZWF0ZU5vZGUoc291cmNlLCBub2RlKSxcbiAgICBwYXJlbnRoZXNpemVkOiB2aXNpdFR5cGVPclR5cGVJZGVudGlmaWVyKHNvdXJjZSwgbm9kZS5jaGlsZHJlblsxXSlcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRHZW5lcmljVHlwZShzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSkge1xuICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IG5vZGUudHlwZSxcbiAgICBjb250ZXh0OiBjcmVhdGVOb2RlKHNvdXJjZSwgbm9kZSksXG4gICAgZ2VuZXJpYzogdmlzaXRUeXBlSWRlbnRpZmllcihzb3VyY2UsIGNoaWxkcmVuLnNoaWZ0KCkpLFxuICAgIHR5cGVfYXJndW1lbnRzOiB2aXNpdFR5cGVBcmd1bWVudHMoc291cmNlLCBjaGlsZHJlbi5zaGlmdCgpKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2aXNpdFByZWRlZmluZWRUeXBlKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogbm9kZS50eXBlLFxuICAgIGNvbnRleHQ6IGNyZWF0ZU5vZGUoc291cmNlLCBub2RlLmNoaWxkcmVuLnNoaWZ0KCkpLFxuICB9XG59Il19 \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/type_arguments.visitor.d.ts b/build/src/lang/typescript/visitors/type_arguments.visitor.d.ts index 3e93754..493d1e2 100644 --- a/build/src/lang/typescript/visitors/type_arguments.visitor.d.ts +++ b/build/src/lang/typescript/visitors/type_arguments.visitor.d.ts @@ -1,3 +1,3 @@ import { SyntaxNode } from "tree-sitter"; -import IFile from "../../../interfaces/IFile"; -export declare function visitTypeArguments(source: IFile, node: SyntaxNode): any; +import Source from "../../../interfaces/Source"; +export declare function visitTypeArguments(source: Source, node: SyntaxNode): any; diff --git a/build/src/lang/typescript/visitors/type_arguments.visitor.js b/build/src/lang/typescript/visitors/type_arguments.visitor.js index 35514f6..16cd690 100644 --- a/build/src/lang/typescript/visitors/type_arguments.visitor.js +++ b/build/src/lang/typescript/visitors/type_arguments.visitor.js @@ -7,4 +7,4 @@ function visitTypeArguments(source, node) { .map(child => type_visitor_1.visitType(source, child)); } exports.visitTypeArguments = visitTypeArguments; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZV9hcmd1bWVudHMudmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvdHlwZV9hcmd1bWVudHMudmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLGlEQUEyQztBQUczQyxTQUFnQixrQkFBa0IsQ0FBQyxNQUFhLEVBQUUsSUFBZ0I7SUFDOUQsT0FBTyxJQUFJLENBQUMsUUFBUTtTQUNuQixNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzNDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLHdCQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7QUFDM0MsQ0FBQztBQUpELGdEQUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5pbXBvcnQgeyB2aXNpdFR5cGUgfSBmcm9tIFwiLi90eXBlLnZpc2l0b3JcIjtcclxuaW1wb3J0IElGaWxlIGZyb20gXCIuLi8uLi8uLi9pbnRlcmZhY2VzL0lGaWxlXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRUeXBlQXJndW1lbnRzKHNvdXJjZTogSUZpbGUsIG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICAgIHJldHVybiBub2RlLmNoaWxkcmVuXHJcbiAgICAuZmlsdGVyKGNoaWxkID0+ICFjaGlsZC50eXBlLm1hdGNoKC9bPD4sXS8pKVxyXG4gICAgLm1hcChjaGlsZCA9PiB2aXNpdFR5cGUoc291cmNlLCBjaGlsZCkpXHJcbn0iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZV9hcmd1bWVudHMudmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvdHlwZV9hcmd1bWVudHMudmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLGlEQUEyQztBQUczQyxTQUFnQixrQkFBa0IsQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDL0QsT0FBTyxJQUFJLENBQUMsUUFBUTtTQUNuQixNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzNDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLHdCQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7QUFDM0MsQ0FBQztBQUpELGdEQUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuaW1wb3J0IHsgdmlzaXRUeXBlIH0gZnJvbSBcIi4vdHlwZS52aXNpdG9yXCI7XG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi8uLi8uLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRUeXBlQXJndW1lbnRzKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlKSB7XG4gICAgcmV0dXJuIG5vZGUuY2hpbGRyZW5cbiAgICAuZmlsdGVyKGNoaWxkID0+ICFjaGlsZC50eXBlLm1hdGNoKC9bPD4sXS8pKVxuICAgIC5tYXAoY2hpbGQgPT4gdmlzaXRUeXBlKHNvdXJjZSwgY2hpbGQpKVxufSJdfQ== \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/type_parameters.visitor.d.ts b/build/src/lang/typescript/visitors/type_parameters.visitor.d.ts index 32be942..236c8b5 100644 --- a/build/src/lang/typescript/visitors/type_parameters.visitor.d.ts +++ b/build/src/lang/typescript/visitors/type_parameters.visitor.d.ts @@ -1,6 +1,6 @@ import { SyntaxNode } from "tree-sitter"; -import IFile from "../../../interfaces/IFile"; -export default function visitTypeParameters(source: IFile, node: SyntaxNode): { +import Source from "../../../interfaces/Source"; +export default function visitTypeParameters(source: Source, node: SyntaxNode): { type: string; context: import("../Node").Node; parameters: { diff --git a/build/src/lang/typescript/visitors/type_parameters.visitor.js b/build/src/lang/typescript/visitors/type_parameters.visitor.js index 8f16626..e0e5926 100644 --- a/build/src/lang/typescript/visitors/type_parameters.visitor.js +++ b/build/src/lang/typescript/visitors/type_parameters.visitor.js @@ -11,4 +11,4 @@ function visitTypeParameters(source, node) { }; } exports.default = visitTypeParameters; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZV9wYXJhbWV0ZXJzLnZpc2l0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGFuZy90eXBlc2NyaXB0L3Zpc2l0b3JzL3R5cGVfcGFyYW1ldGVycy52aXNpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0Esa0NBQXFDO0FBR3JDLFNBQXdCLG1CQUFtQixDQUFDLE1BQWEsRUFBRSxJQUFnQjtJQUN6RSxPQUFPO1FBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1FBQ2YsT0FBTyxFQUFFLGlCQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztRQUNqQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVE7YUFDdEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUMzQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLGlCQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUM1RSxDQUFBO0FBQ0gsQ0FBQztBQVJELHNDQVFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5pbXBvcnQgeyBjcmVhdGVOb2RlIH0gZnJvbSBcIi4uL05vZGVcIjtcclxuaW1wb3J0IElGaWxlIGZyb20gXCIuLi8uLi8uLi9pbnRlcmZhY2VzL0lGaWxlXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2aXNpdFR5cGVQYXJhbWV0ZXJzKHNvdXJjZTogSUZpbGUsIG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICByZXR1cm4ge1xyXG4gICAgdHlwZTogbm9kZS50eXBlLFxyXG4gICAgY29udGV4dDogY3JlYXRlTm9kZShzb3VyY2UsIG5vZGUpLFxyXG4gICAgcGFyYW1ldGVyczogbm9kZS5jaGlsZHJlblxyXG4gICAgICAuZmlsdGVyKGNoaWxkID0+ICFjaGlsZC50eXBlLm1hdGNoKC9bPD4sXS8pKVxyXG4gICAgICAubWFwKGNoaWxkID0+ICh7IHR5cGU6IGNoaWxkLnR5cGUsIGNvbnRleHQ6IGNyZWF0ZU5vZGUoc291cmNlLCBjaGlsZCkgfSkpXHJcbiAgfVxyXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZV9wYXJhbWV0ZXJzLnZpc2l0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGFuZy90eXBlc2NyaXB0L3Zpc2l0b3JzL3R5cGVfcGFyYW1ldGVycy52aXNpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsa0NBQXFDO0FBSXJDLFNBQXdCLG1CQUFtQixDQUFDLE1BQWMsRUFBRSxJQUFnQjtJQUMxRSxPQUFPO1FBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1FBQ2YsT0FBTyxFQUFFLGlCQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztRQUNqQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVE7YUFDdEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUMzQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLGlCQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUM1RSxDQUFBO0FBQ0gsQ0FBQztBQVJELHNDQVFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlTm9kZSB9IGZyb20gXCIuLi9Ob2RlXCI7XG5pbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi8uLi8uLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2aXNpdFR5cGVQYXJhbWV0ZXJzKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogbm9kZS50eXBlLFxuICAgIGNvbnRleHQ6IGNyZWF0ZU5vZGUoc291cmNlLCBub2RlKSxcbiAgICBwYXJhbWV0ZXJzOiBub2RlLmNoaWxkcmVuXG4gICAgICAuZmlsdGVyKGNoaWxkID0+ICFjaGlsZC50eXBlLm1hdGNoKC9bPD4sXS8pKVxuICAgICAgLm1hcChjaGlsZCA9PiAoeyB0eXBlOiBjaGlsZC50eXBlLCBjb250ZXh0OiBjcmVhdGVOb2RlKHNvdXJjZSwgY2hpbGQpIH0pKVxuICB9XG59Il19 \ No newline at end of file diff --git a/build/src/utils/comment.d.ts b/build/src/utils/comment.d.ts index 0dc586e..ba9695a 100644 --- a/build/src/utils/comment.d.ts +++ b/build/src/utils/comment.d.ts @@ -1,8 +1,8 @@ import { SyntaxNode } from "tree-sitter"; -import IFile from "../interfaces/IFile"; +import Source from "../interfaces/Source"; export declare const XDocRegex: RegExp; -export declare function isLegalComment(source: IFile, node: SyntaxNode): boolean; -export declare function isJavaDocComment(source: IFile, node: SyntaxNode): boolean; +export declare function isLegalComment(source: Source, node: SyntaxNode): boolean; +export declare function isJavaDocComment(source: Source, node: SyntaxNode): boolean; export declare function isXDocComment(source: string, node?: SyntaxNode): boolean; export declare function isXDocCommentBlock(source: string, node: SyntaxNode): boolean; export declare function isXDocCommentFragment(source: string, node: SyntaxNode): boolean; diff --git a/build/src/utils/comment.js b/build/src/utils/comment.js index 96c256f..dd61fb4 100644 --- a/build/src/utils/comment.js +++ b/build/src/utils/comment.js @@ -39,4 +39,4 @@ function isXDocCommentFragment(source, node) { return !isXDocCommentBlock(source, node) && isXDocComment(source, node); } exports.isXDocCommentFragment = isXDocCommentFragment; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9jb21tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsbUNBQTRCO0FBR2YsUUFBQSxTQUFTLEdBQUcsOEVBQThFLENBQUM7QUFFeEcsU0FBZ0IsY0FBYyxDQUFFLE1BQWEsRUFBRSxJQUFnQjtJQUM3RCxNQUFNLGFBQWEsR0FBRztRQUNwQixXQUFXO1FBQ1gsc0JBQXNCO1FBQ3RCLFNBQVM7UUFDVCxxQkFBcUI7S0FDdEIsQ0FBQztJQUNGLElBQUksZUFBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRTtRQUMxQixPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDOUIsTUFBTSxDQUFDLElBQUk7YUFDUixTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQ3pDLFdBQVcsRUFBRTthQUNiLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FDbEIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDbEI7QUFDSCxDQUFDO0FBZkQsd0NBZUM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBQyxNQUFhLEVBQUUsSUFBZ0I7SUFDOUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEUsbUJBQW1CO0lBQ25CLE9BQU8saUNBQWlDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQ3hELENBQUM7QUFKRCw0Q0FJQztBQUVELFNBQWdCLGFBQWEsQ0FBQyxNQUFhLEVBQUUsSUFBaUI7SUFDNUQsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQ3JCLElBQUksSUFBSTtRQUFFLE9BQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JFLE9BQU8saUJBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUpELHNDQUlDO0FBRUQsU0FBZ0Isa0JBQWtCLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQ2pFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDM0QsQ0FBQztBQUhELGdEQUdDO0FBRUQsU0FBZ0IscUJBQXFCLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQ3BFLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRkQsc0RBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XHJcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi9tYXRjaFwiO1xyXG5pbXBvcnQgSUZpbGUgZnJvbSBcIi4uL2ludGVyZmFjZXMvSUZpbGVcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBYRG9jUmVnZXggPSAvQChcXHcrKShbXntbKFxcbl0qKT8oW1xce1xcW1xcKF1bXFxzXFxTXSpbXFx9XFxdXFwpXShbXFxzXSooPXwtKT4uKik/KT8oW1xcc10qLSguKSopPy9nbWk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNMZWdhbENvbW1lbnQgKHNvdXJjZTogSUZpbGUsIG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICBjb25zdCBwb3NzaWJsZVRleHRzID0gW1xyXG4gICAgJ2NvcHlyaWdodCcsXHJcbiAgICAndGVybXMgYW5kIGNvbmRpdGlvbnMnLFxyXG4gICAgJ2xpY2Vuc2UnLFxyXG4gICAgJ2FsbCByaWdodHMgcmVzZXJ2ZWQnXHJcbiAgXTtcclxuICBpZiAobWF0Y2gobm9kZSwgJ2NvbW1lbnQnKSkge1xyXG4gICAgcmV0dXJuIHBvc3NpYmxlVGV4dHMubWFwKHRleHQgPT5cclxuICAgICAgc291cmNlLnRleHRcclxuICAgICAgICAuc3Vic3RyaW5nKG5vZGUuc3RhcnRJbmRleCwgbm9kZS5lbmRJbmRleClcclxuICAgICAgICAudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgIC5pbmNsdWRlcyh0ZXh0KVxyXG4gICAgKS5pbmNsdWRlcyh0cnVlKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0phdmFEb2NDb21tZW50KHNvdXJjZTogSUZpbGUsIG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICBjb25zdCBjb21tZW50ID0gc291cmNlLnRleHQuc3Vic3RyaW5nKG5vZGUuc3RhcnRJbmRleCwgbm9kZS5lbmRJbmRleCk7XHJcbiAgLy8gcmVnZXhyLmNvbS8zZWp2YlxyXG4gIHJldHVybiAvKFxcL1xcKlxcKikoKFxccyopKC4qPykoXFxzKSkqKFxcKlxcLykvLnRlc3QoY29tbWVudClcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzWERvY0NvbW1lbnQoc291cmNlOnN0cmluZywgbm9kZT86IFN5bnRheE5vZGUpIHtcclxuICBsZXQgY29tbWVudCA9IHNvdXJjZTtcclxuICBpZiAobm9kZSkgY29tbWVudCA9IHNvdXJjZS5zdWJzdHJpbmcobm9kZS5zdGFydEluZGV4LCBub2RlLmVuZEluZGV4KTtcclxuICByZXR1cm4gWERvY1JlZ2V4LnRlc3QoY29tbWVudCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1hEb2NDb21tZW50QmxvY2soc291cmNlOiBzdHJpbmcsIG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICBjb25zdCBjb21tZW50ID0gc291cmNlLnN1YnN0cmluZyhub2RlLnN0YXJ0SW5kZXgsIG5vZGUuZW5kSW5kZXgpO1xyXG4gIHJldHVybiAvI0FQSS8udGVzdChjb21tZW50KSB8fCAvXFxgXFxgXFxgeGRvYy8udGVzdChjb21tZW50KVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNYRG9jQ29tbWVudEZyYWdtZW50KHNvdXJjZTogc3RyaW5nLCBub2RlOiBTeW50YXhOb2RlKSB7XHJcbiAgcmV0dXJuICFpc1hEb2NDb21tZW50QmxvY2soc291cmNlLCBub2RlKSAmJiBpc1hEb2NDb21tZW50KHNvdXJjZSwgbm9kZSk7XHJcbn0iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9jb21tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsbUNBQTRCO0FBR2YsUUFBQSxTQUFTLEdBQUcsOEVBQThFLENBQUM7QUFFeEcsU0FBZ0IsY0FBYyxDQUFFLE1BQWMsRUFBRSxJQUFnQjtJQUM5RCxNQUFNLGFBQWEsR0FBRztRQUNwQixXQUFXO1FBQ1gsc0JBQXNCO1FBQ3RCLFNBQVM7UUFDVCxxQkFBcUI7S0FDdEIsQ0FBQztJQUNGLElBQUksZUFBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRTtRQUMxQixPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDOUIsTUFBTSxDQUFDLElBQUk7YUFDUixTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQ3pDLFdBQVcsRUFBRTthQUNiLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FDbEIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDbEI7QUFDSCxDQUFDO0FBZkQsd0NBZUM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDL0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEUsbUJBQW1CO0lBQ25CLE9BQU8saUNBQWlDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQ3hELENBQUM7QUFKRCw0Q0FJQztBQUVELFNBQWdCLGFBQWEsQ0FBQyxNQUFhLEVBQUUsSUFBaUI7SUFDNUQsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQ3JCLElBQUksSUFBSTtRQUFFLE9BQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JFLE9BQU8saUJBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUpELHNDQUlDO0FBRUQsU0FBZ0Isa0JBQWtCLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQ2pFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDM0QsQ0FBQztBQUhELGdEQUdDO0FBRUQsU0FBZ0IscUJBQXFCLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQ3BFLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRkQsc0RBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgbWF0Y2ggZnJvbSBcIi4vbWF0Y2hcIjtcbmltcG9ydCBTb3VyY2UgZnJvbSBcIi4uL2ludGVyZmFjZXMvU291cmNlXCI7XG5cbmV4cG9ydCBjb25zdCBYRG9jUmVnZXggPSAvQChcXHcrKShbXntbKFxcbl0qKT8oW1xce1xcW1xcKF1bXFxzXFxTXSpbXFx9XFxdXFwpXShbXFxzXSooPXwtKT4uKik/KT8oW1xcc10qLSguKSopPy9nbWk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xlZ2FsQ29tbWVudCAoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgY29uc3QgcG9zc2libGVUZXh0cyA9IFtcbiAgICAnY29weXJpZ2h0JyxcbiAgICAndGVybXMgYW5kIGNvbmRpdGlvbnMnLFxuICAgICdsaWNlbnNlJyxcbiAgICAnYWxsIHJpZ2h0cyByZXNlcnZlZCdcbiAgXTtcbiAgaWYgKG1hdGNoKG5vZGUsICdjb21tZW50JykpIHtcbiAgICByZXR1cm4gcG9zc2libGVUZXh0cy5tYXAodGV4dCA9PlxuICAgICAgc291cmNlLnRleHRcbiAgICAgICAgLnN1YnN0cmluZyhub2RlLnN0YXJ0SW5kZXgsIG5vZGUuZW5kSW5kZXgpXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgIC5pbmNsdWRlcyh0ZXh0KVxuICAgICkuaW5jbHVkZXModHJ1ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSmF2YURvY0NvbW1lbnQoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgY29uc3QgY29tbWVudCA9IHNvdXJjZS50ZXh0LnN1YnN0cmluZyhub2RlLnN0YXJ0SW5kZXgsIG5vZGUuZW5kSW5kZXgpO1xuICAvLyByZWdleHIuY29tLzNlanZiXG4gIHJldHVybiAvKFxcL1xcKlxcKikoKFxccyopKC4qPykoXFxzKSkqKFxcKlxcLykvLnRlc3QoY29tbWVudClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzWERvY0NvbW1lbnQoc291cmNlOnN0cmluZywgbm9kZT86IFN5bnRheE5vZGUpIHtcbiAgbGV0IGNvbW1lbnQgPSBzb3VyY2U7XG4gIGlmIChub2RlKSBjb21tZW50ID0gc291cmNlLnN1YnN0cmluZyhub2RlLnN0YXJ0SW5kZXgsIG5vZGUuZW5kSW5kZXgpO1xuICByZXR1cm4gWERvY1JlZ2V4LnRlc3QoY29tbWVudCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1hEb2NDb21tZW50QmxvY2soc291cmNlOiBzdHJpbmcsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgY29uc3QgY29tbWVudCA9IHNvdXJjZS5zdWJzdHJpbmcobm9kZS5zdGFydEluZGV4LCBub2RlLmVuZEluZGV4KTtcbiAgcmV0dXJuIC8jQVBJLy50ZXN0KGNvbW1lbnQpIHx8IC9cXGBcXGBcXGB4ZG9jLy50ZXN0KGNvbW1lbnQpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1hEb2NDb21tZW50RnJhZ21lbnQoc291cmNlOiBzdHJpbmcsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgcmV0dXJuICFpc1hEb2NDb21tZW50QmxvY2soc291cmNlLCBub2RlKSAmJiBpc1hEb2NDb21tZW50KHNvdXJjZSwgbm9kZSk7XG59Il19 \ No newline at end of file diff --git a/build/src/utils/log.d.ts b/build/src/utils/log.d.ts index 3733072..1b43d53 100644 --- a/build/src/utils/log.d.ts +++ b/build/src/utils/log.d.ts @@ -1,12 +1,12 @@ import { Log } from 'mr-doc-utils'; -import IFile from '../interfaces/IFile'; +import Source from '../interfaces/Source'; import { SyntaxNode } from 'tree-sitter'; export declare enum ErrorType { - NodeTypeNotSupported = 0, + NodeTypeNotYetSupported = 0, TreeSitterParseError = 1 } -export declare class ParserLog extends Log { - report: (source: IFile, node: SyntaxNode, error: ErrorType) => void; +declare class ParserLog extends Log { + report: (source: Source, node: SyntaxNode, error: ErrorType) => void; } declare const log: ParserLog; export default log; diff --git a/build/src/utils/log.js b/build/src/utils/log.js index 609b4d5..e5a2f9e 100644 --- a/build/src/utils/log.js +++ b/build/src/utils/log.js @@ -4,7 +4,7 @@ const mr_doc_utils_1 = require("mr-doc-utils"); const range_1 = require("./range"); var ErrorType; (function (ErrorType) { - ErrorType[ErrorType["NodeTypeNotSupported"] = 0] = "NodeTypeNotSupported"; + ErrorType[ErrorType["NodeTypeNotYetSupported"] = 0] = "NodeTypeNotYetSupported"; ErrorType[ErrorType["TreeSitterParseError"] = 1] = "TreeSitterParseError"; })(ErrorType = exports.ErrorType || (exports.ErrorType = {})); class ParserLog extends mr_doc_utils_1.Log { @@ -12,10 +12,12 @@ class ParserLog extends mr_doc_utils_1.Log { super(...arguments); this.report = (source, node, error) => { const location = range_1.default(node).location; - const culprit = `(${location.row.start + 1}:${location.column.start}) in ${source.name} from ${source.path}`; + const sameLine = location.row.start === location.row.end; + const getRange = () => sameLine ? location.row.start + 1 : location.row.start + 1 + ' - ' + location.row.end + 1; + const culprit = `Line${sameLine ? '' : 's'} ${getRange()} in '${source.path}${source.name}'`; switch (error) { - case ErrorType.NodeTypeNotSupported: - this.info(`'${node.type.replace(/[_]/g, ' ')}' is not supported yet:\n${culprit}`); + case ErrorType.NodeTypeNotYetSupported: + this.info(`'${node.type.replace(/[_]/g, ' ')}' is not yet supported:\n${culprit}`); break; case ErrorType.TreeSitterParseError: this.error(`'tree-sitter' was not able to parse the program:\n${culprit}`); @@ -25,7 +27,6 @@ class ParserLog extends mr_doc_utils_1.Log { }; } } -exports.ParserLog = ParserLog; const log = new ParserLog('mr-doc::parser'); exports.default = log; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtDQUFtQztBQUduQyxtQ0FBNEI7QUFFNUIsSUFBWSxTQUdYO0FBSEQsV0FBWSxTQUFTO0lBQ2pCLHlFQUFvQixDQUFBO0lBQ3BCLHlFQUFvQixDQUFBO0FBQ3hCLENBQUMsRUFIVyxTQUFTLEdBQVQsaUJBQVMsS0FBVCxpQkFBUyxRQUdwQjtBQUVELE1BQWEsU0FBVSxTQUFRLGtCQUFHO0lBQWxDOztRQUNJLFdBQU0sR0FBRyxDQUFDLE1BQWEsRUFBRSxJQUFnQixFQUFFLEtBQWdCLEVBQVEsRUFBRTtZQUNqRSxNQUFNLFFBQVEsR0FBRyxlQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ3RDLE1BQU0sT0FBTyxHQUFHLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxRQUFRLE1BQU0sQ0FBQyxJQUFJLFNBQVMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzdHLFFBQVEsS0FBSyxFQUFFO2dCQUNYLEtBQUssU0FBUyxDQUFDLG9CQUFvQjtvQkFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsNEJBQTRCLE9BQU8sRUFBRSxDQUFDLENBQUE7b0JBQ2xGLE1BQU07Z0JBQ1YsS0FBSyxTQUFTLENBQUMsb0JBQW9CO29CQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLHFEQUFxRCxPQUFPLEVBQUUsQ0FBQyxDQUFBO2dCQUM5RTtvQkFDSSxNQUFNO2FBQ2I7UUFDTCxDQUFDLENBQUE7SUFDTCxDQUFDO0NBQUE7QUFkRCw4QkFjQztBQUdELE1BQU0sR0FBRyxHQUFHLElBQUksU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFFNUMsa0JBQWUsR0FBRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTG9nIH0gZnJvbSAnbXItZG9jLXV0aWxzJztcclxuaW1wb3J0IElGaWxlIGZyb20gJy4uL2ludGVyZmFjZXMvSUZpbGUnO1xyXG5pbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSAndHJlZS1zaXR0ZXInO1xyXG5pbXBvcnQgcmFuZ2UgZnJvbSAnLi9yYW5nZSc7XHJcblxyXG5leHBvcnQgZW51bSBFcnJvclR5cGUge1xyXG4gICAgTm9kZVR5cGVOb3RTdXBwb3J0ZWQsXHJcbiAgICBUcmVlU2l0dGVyUGFyc2VFcnJvclxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUGFyc2VyTG9nIGV4dGVuZHMgTG9nIHtcclxuICAgIHJlcG9ydCA9IChzb3VyY2U6IElGaWxlLCBub2RlOiBTeW50YXhOb2RlLCBlcnJvcjogRXJyb3JUeXBlKTogdm9pZCA9PiB7XHJcbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSByYW5nZShub2RlKS5sb2NhdGlvbjtcclxuICAgICAgICBjb25zdCBjdWxwcml0ID0gYCgke2xvY2F0aW9uLnJvdy5zdGFydCArIDF9OiR7bG9jYXRpb24uY29sdW1uLnN0YXJ0fSkgaW4gJHtzb3VyY2UubmFtZX0gZnJvbSAke3NvdXJjZS5wYXRofWA7XHJcbiAgICAgICAgc3dpdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjYXNlIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFN1cHBvcnRlZDpcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5mbyhgJyR7bm9kZS50eXBlLnJlcGxhY2UoL1tfXS9nLCAnICcpfScgaXMgbm90IHN1cHBvcnRlZCB5ZXQ6XFxuJHtjdWxwcml0fWApXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBFcnJvclR5cGUuVHJlZVNpdHRlclBhcnNlRXJyb3I6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yKGAndHJlZS1zaXR0ZXInIHdhcyBub3QgYWJsZSB0byBwYXJzZSB0aGUgcHJvZ3JhbTpcXG4ke2N1bHByaXR9YClcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuXHJcbmNvbnN0IGxvZyA9IG5ldyBQYXJzZXJMb2coJ21yLWRvYzo6cGFyc2VyJyk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBsb2c7Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtDQUFtQztBQUduQyxtQ0FBNEI7QUFFNUIsSUFBWSxTQUdYO0FBSEQsV0FBWSxTQUFTO0lBQ2pCLCtFQUF1QixDQUFBO0lBQ3ZCLHlFQUFvQixDQUFBO0FBQ3hCLENBQUMsRUFIVyxTQUFTLEdBQVQsaUJBQVMsS0FBVCxpQkFBUyxRQUdwQjtBQUVELE1BQU0sU0FBVSxTQUFRLGtCQUFHO0lBQTNCOztRQUNJLFdBQU0sR0FBRyxDQUFDLE1BQWMsRUFBRSxJQUFnQixFQUFFLEtBQWdCLEVBQVEsRUFBRTtZQUNsRSxNQUFNLFFBQVEsR0FBRyxlQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ3RDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQ3pELE1BQU0sUUFBUSxHQUFHLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNqSCxNQUFNLE9BQU8sR0FBRyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksUUFBUSxFQUFFLFFBQVEsTUFBTSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUM7WUFDN0YsUUFBUSxLQUFLLEVBQUU7Z0JBQ1gsS0FBSyxTQUFTLENBQUMsdUJBQXVCO29CQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyw0QkFBNEIsT0FBTyxFQUFFLENBQUMsQ0FBQTtvQkFDbEYsTUFBTTtnQkFDVixLQUFLLFNBQVMsQ0FBQyxvQkFBb0I7b0JBQy9CLElBQUksQ0FBQyxLQUFLLENBQUMscURBQXFELE9BQU8sRUFBRSxDQUFDLENBQUE7Z0JBQzlFO29CQUNJLE1BQU07YUFDYjtRQUNMLENBQUMsQ0FBQTtJQUNMLENBQUM7Q0FBQTtBQUdELE1BQU0sR0FBRyxHQUFHLElBQUksU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFFNUMsa0JBQWUsR0FBRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTG9nIH0gZnJvbSAnbXItZG9jLXV0aWxzJztcbmltcG9ydCBTb3VyY2UgZnJvbSAnLi4vaW50ZXJmYWNlcy9Tb3VyY2UnO1xuaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gJ3RyZWUtc2l0dGVyJztcbmltcG9ydCByYW5nZSBmcm9tICcuL3JhbmdlJztcblxuZXhwb3J0IGVudW0gRXJyb3JUeXBlIHtcbiAgICBOb2RlVHlwZU5vdFlldFN1cHBvcnRlZCxcbiAgICBUcmVlU2l0dGVyUGFyc2VFcnJvclxufVxuXG5jbGFzcyBQYXJzZXJMb2cgZXh0ZW5kcyBMb2cge1xuICAgIHJlcG9ydCA9IChzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSwgZXJyb3I6IEVycm9yVHlwZSk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCBsb2NhdGlvbiA9IHJhbmdlKG5vZGUpLmxvY2F0aW9uO1xuICAgICAgICBjb25zdCBzYW1lTGluZSA9IGxvY2F0aW9uLnJvdy5zdGFydCA9PT0gbG9jYXRpb24ucm93LmVuZDtcbiAgICAgICAgY29uc3QgZ2V0UmFuZ2UgPSAoKSA9PiBzYW1lTGluZSA/IGxvY2F0aW9uLnJvdy5zdGFydCArIDEgOiBsb2NhdGlvbi5yb3cuc3RhcnQgKyAxICsgJyAtICcgKyBsb2NhdGlvbi5yb3cuZW5kICsgMTtcbiAgICAgICAgY29uc3QgY3VscHJpdCA9IGBMaW5lJHtzYW1lTGluZSA/ICcnIDogJ3MnfSAke2dldFJhbmdlKCl9IGluICcke3NvdXJjZS5wYXRofSR7c291cmNlLm5hbWV9J2A7XG4gICAgICAgIHN3aXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhc2UgRXJyb3JUeXBlLk5vZGVUeXBlTm90WWV0U3VwcG9ydGVkOlxuICAgICAgICAgICAgICAgIHRoaXMuaW5mbyhgJyR7bm9kZS50eXBlLnJlcGxhY2UoL1tfXS9nLCAnICcpfScgaXMgbm90IHlldCBzdXBwb3J0ZWQ6XFxuJHtjdWxwcml0fWApXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEVycm9yVHlwZS5UcmVlU2l0dGVyUGFyc2VFcnJvcjpcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yKGAndHJlZS1zaXR0ZXInIHdhcyBub3QgYWJsZSB0byBwYXJzZSB0aGUgcHJvZ3JhbTpcXG4ke2N1bHByaXR9YClcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuY29uc3QgbG9nID0gbmV3IFBhcnNlckxvZygnbXItZG9jOjpwYXJzZXInKTtcblxuZXhwb3J0IGRlZmF1bHQgbG9nOyJdfQ== \ No newline at end of file diff --git a/build/src/utils/match.d.ts b/build/src/utils/match.d.ts index bd8acd0..2fde18b 100644 --- a/build/src/utils/match.d.ts +++ b/build/src/utils/match.d.ts @@ -7,4 +7,4 @@ import { SyntaxNode } from "tree-sitter"; * @return: boolean * ``` */ -export default function match(node: SyntaxNode, type: string): boolean; +export default function match(node: SyntaxNode, ...types: string[]): boolean; diff --git a/build/src/utils/match.js b/build/src/utils/match.js index e76e973..1805ad5 100644 --- a/build/src/utils/match.js +++ b/build/src/utils/match.js @@ -8,8 +8,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); * @return: boolean * ``` */ -function match(node, type) { - return node && node.type === type; +function match(node, ...types) { + const matches = types.map(type => type === node.type); + return node && matches.includes(true); } exports.default = match; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvbWF0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQTs7Ozs7OztHQU9HO0FBQ0gsU0FBd0IsS0FBSyxDQUFDLElBQWdCLEVBQUUsSUFBWTtJQUMxRCxPQUFPLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQztBQUNwQyxDQUFDO0FBRkQsd0JBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XHJcblxyXG4vKipcclxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgbm9kZSBpcyBhIGNlcnRhaW4gdHlwZS5cclxuICogYGBgXHJcbiAqIEBwYXJhbSBub2RlOiBTeW50YXhOb2RlIC0gVGhlIG5vZGUgdG8gY29tcGFyZS5cclxuICogQHBhcmFtIHR5cGU6IHN0cmluZyAgLSBUaGUgbm9kZSB0eXBlIHRvIG1hdGNoLlxyXG4gKiBAcmV0dXJuOiBib29sZWFuXHJcbiAqIGBgYFxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWF0Y2gobm9kZTogU3ludGF4Tm9kZSwgdHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIG5vZGUgJiYgbm9kZS50eXBlID09PSB0eXBlO1xyXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvbWF0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQTs7Ozs7OztHQU9HO0FBQ0gsU0FBd0IsS0FBSyxDQUFDLElBQWdCLEVBQUUsR0FBRyxLQUFlO0lBQ2hFLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RELE9BQU8sSUFBSSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUhELHdCQUdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIG5vZGUgaXMgYSBjZXJ0YWluIHR5cGUuXG4gKiBgYGBcbiAqIEBwYXJhbSBub2RlOiBTeW50YXhOb2RlIC0gVGhlIG5vZGUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB0eXBlOiBzdHJpbmcgIC0gVGhlIG5vZGUgdHlwZSB0byBtYXRjaC5cbiAqIEByZXR1cm46IGJvb2xlYW5cbiAqIGBgYFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYXRjaChub2RlOiBTeW50YXhOb2RlLCAuLi50eXBlczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgY29uc3QgbWF0Y2hlcyA9IHR5cGVzLm1hcCh0eXBlID0+IHR5cGUgPT09IG5vZGUudHlwZSk7XG4gIHJldHVybiBub2RlICYmIG1hdGNoZXMuaW5jbHVkZXModHJ1ZSk7XG59Il19 \ No newline at end of file diff --git a/build/src/utils/range.js b/build/src/utils/range.js index 4adeddb..e8ee5d6 100644 --- a/build/src/utils/range.js +++ b/build/src/utils/range.js @@ -13,4 +13,4 @@ function range(node) { }; } exports.default = range; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvcmFuZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxTQUF3QixLQUFLLENBQUMsSUFBdUI7SUFDbkQsT0FBTztRQUNMLFFBQVEsRUFBRTtZQUNSLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVTtZQUN0QixHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDbkI7UUFDRCxRQUFRLEVBQUU7WUFDUixHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQ2pFLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7U0FDM0U7S0FDRixDQUFBO0FBQ0gsQ0FBQztBQVhELHdCQVdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcclxuaW1wb3J0IFRleHRSYW5nZSBmcm9tICcuLi9pbnRlcmZhY2VzL1RleHRSYW5nZSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByYW5nZShub2RlOiBQYXJzZXIuU3ludGF4Tm9kZSk6IFRleHRSYW5nZSB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHBvc2l0aW9uOiB7XHJcbiAgICAgIHN0YXJ0OiBub2RlLnN0YXJ0SW5kZXgsXHJcbiAgICAgIGVuZDogbm9kZS5lbmRJbmRleFxyXG4gICAgfSxcclxuICAgIGxvY2F0aW9uOiB7XHJcbiAgICAgIHJvdzogeyBzdGFydDogbm9kZS5zdGFydFBvc2l0aW9uLnJvdywgZW5kOiBub2RlLmVuZFBvc2l0aW9uLnJvdyB9LFxyXG4gICAgICBjb2x1bW46IHsgc3RhcnQ6IG5vZGUuc3RhcnRQb3NpdGlvbi5jb2x1bW4sIGVuZDogbm9kZS5lbmRQb3NpdGlvbi5jb2x1bW4gfVxyXG4gICAgfVxyXG4gIH1cclxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvcmFuZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxTQUF3QixLQUFLLENBQUMsSUFBdUI7SUFDbkQsT0FBTztRQUNMLFFBQVEsRUFBRTtZQUNSLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVTtZQUN0QixHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDbkI7UUFDRCxRQUFRLEVBQUU7WUFDUixHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQ2pFLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7U0FDM0U7S0FDRixDQUFBO0FBQ0gsQ0FBQztBQVhELHdCQVdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcbmltcG9ydCBUZXh0UmFuZ2UgZnJvbSAnLi4vaW50ZXJmYWNlcy9UZXh0UmFuZ2UnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByYW5nZShub2RlOiBQYXJzZXIuU3ludGF4Tm9kZSk6IFRleHRSYW5nZSB7XG4gIHJldHVybiB7XG4gICAgcG9zaXRpb246IHtcbiAgICAgIHN0YXJ0OiBub2RlLnN0YXJ0SW5kZXgsXG4gICAgICBlbmQ6IG5vZGUuZW5kSW5kZXhcbiAgICB9LFxuICAgIGxvY2F0aW9uOiB7XG4gICAgICByb3c6IHsgc3RhcnQ6IG5vZGUuc3RhcnRQb3NpdGlvbi5yb3csIGVuZDogbm9kZS5lbmRQb3NpdGlvbi5yb3cgfSxcbiAgICAgIGNvbHVtbjogeyBzdGFydDogbm9kZS5zdGFydFBvc2l0aW9uLmNvbHVtbiwgZW5kOiBub2RlLmVuZFBvc2l0aW9uLmNvbHVtbiB9XG4gICAgfVxuICB9XG59Il19 \ No newline at end of file diff --git a/build/src/utils/text.d.ts b/build/src/utils/text.d.ts index 33c5b56..dc2e7af 100644 --- a/build/src/utils/text.d.ts +++ b/build/src/utils/text.d.ts @@ -1,5 +1,5 @@ import { SyntaxNode } from "tree-sitter"; -import IFile from "../interfaces/IFile"; +import Source from "../interfaces/Source"; /** * Returns the context string * @@ -8,4 +8,4 @@ import IFile from "../interfaces/IFile"; * @param source: IFile - The source file. * @param node: SyntaxNode - The syntax node. */ -export declare function text(source: IFile, node: SyntaxNode): string; +export declare function text(source: Source, node: SyntaxNode): string; diff --git a/build/src/utils/text.js b/build/src/utils/text.js index 9ec0f7b..c4b2bc3 100644 --- a/build/src/utils/text.js +++ b/build/src/utils/text.js @@ -12,4 +12,4 @@ function text(source, node) { return source.text.substring(node.startIndex, node.endIndex); } exports.text = text; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy90ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0E7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLElBQUksQ0FBQyxNQUFhLEVBQUUsSUFBZ0I7SUFDbEQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRkQsb0JBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XHJcbmltcG9ydCBJRmlsZSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9JRmlsZVwiO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGNvbnRleHQgc3RyaW5nXHJcbiAqIFxyXG4gKiAjIEFQSVxyXG4gKiBcclxuICogQHBhcmFtIHNvdXJjZTogSUZpbGUgLSBUaGUgc291cmNlIGZpbGUuXHJcbiAqIEBwYXJhbSBub2RlOiBTeW50YXhOb2RlIC0gVGhlIHN5bnRheCBub2RlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHRleHQoc291cmNlOiBJRmlsZSwgbm9kZTogU3ludGF4Tm9kZSkge1xyXG4gIHJldHVybiBzb3VyY2UudGV4dC5zdWJzdHJpbmcobm9kZS5zdGFydEluZGV4LCBub2RlLmVuZEluZGV4KTtcclxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy90ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0E7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLElBQUksQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDbkQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRkQsb0JBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGNvbnRleHQgc3RyaW5nXG4gKiBcbiAqICMgQVBJXG4gKiBcbiAqIEBwYXJhbSBzb3VyY2U6IElGaWxlIC0gVGhlIHNvdXJjZSBmaWxlLlxuICogQHBhcmFtIG5vZGU6IFN5bnRheE5vZGUgLSBUaGUgc3ludGF4IG5vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXh0KHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlKSB7XG4gIHJldHVybiBzb3VyY2UudGV4dC5zdWJzdHJpbmcobm9kZS5zdGFydEluZGV4LCBub2RlLmVuZEluZGV4KTtcbn0iXX0= \ No newline at end of file diff --git a/example.ts b/example.ts index 8770311..15bf6f2 100644 --- a/example.ts +++ b/example.ts @@ -1,5 +1,12 @@ +interface A { + +} + /** * Description */ -export const REGEX = 2; \ No newline at end of file +interface B { + (x: string): void + func (x: string): void +} \ No newline at end of file diff --git a/src/lang/typescript/Node.ts b/src/lang/typescript/Node.ts index c7ac527..f712b58 100644 --- a/src/lang/typescript/Node.ts +++ b/src/lang/typescript/Node.ts @@ -1,10 +1,11 @@ -import TextRange from "../../interfaces/TextRange"; -import { SyntaxNode } from "tree-sitter"; -import range from "../../utils/range"; -import xdoc from 'xdoc-parser'; import { DocumentationNode } from 'xdoc-parser/src/XDocASTNode'; import { RemarkNode } from 'xdoc-parser/src/XDocParser'; +import { SyntaxNode } from "tree-sitter"; +import { text } from "../../utils/text"; +import range from "../../utils/range"; import Source from "../../interfaces/Source"; +import TextRange from "../../interfaces/TextRange"; +import xdoc from 'xdoc-parser'; export interface Node extends TextRange { @@ -23,7 +24,7 @@ export function createNode( document?: boolean, ): Node { - let node_ = { ...range(node), text: file.text.substring(node.startIndex, node.endIndex) } + let node_ = { ...range(node), text: text(file, node) } if (properties) { node_ = Object.assign(node_, { properties }) diff --git a/src/lang/typescript/index.ts b/src/lang/typescript/index.ts index 961e481..5ea4625 100644 --- a/src/lang/typescript/index.ts +++ b/src/lang/typescript/index.ts @@ -3,6 +3,7 @@ import * as TypeScript from 'tree-sitter-typescript'; import IParser from '../../interfaces/IParser'; import Source from '../../interfaces/Source'; import { visitProgram } from './visitors/program.visitor'; +import { walk } from './walk'; /** @@ -29,7 +30,8 @@ export default class TypeScriptParser implements IParser { parse = () => { const tree = this.parser.parse(this.file.text); if (tree.rootNode.type === "program") { - return visitProgram(this.file, tree.rootNode) + walk(tree.rootNode); + // return visitProgram(this.file, tree.rootNode) } } } diff --git a/src/lang/typescript/visitors/call_signature.visitor.ts b/src/lang/typescript/visitors/call_signature.visitor.ts deleted file mode 100644 index 2729c2a..0000000 --- a/src/lang/typescript/visitors/call_signature.visitor.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { SyntaxNode } from "tree-sitter"; -import { visitFormalParameters } from "./formal_parameters.visitor"; -import { visitType } from "./type.visitor"; -import Source from "../../../interfaces/Source"; -import match from "../../../utils/match"; -import visitTypeParameters from "./type_parameters.visitor"; - -export function visitCallSignature(source: Source, node: SyntaxNode) { - - let call_signature = node.children, - type_parameters, - formal_parameters, - type_annotation; - - if (match(call_signature[0], 'type_parameters')) { - type_parameters = visitTypeParameters(source, call_signature.shift()); - } - - if (match(call_signature[0], 'formal_parameters')) { - formal_parameters = visitFormalParameters(source, call_signature.shift()); - } - - if (match(call_signature[0], 'type_annotation')) { - let type = call_signature.shift().children[1]; - type_annotation = visitType(source, type); - } - - return { type_parameters, formal_parameters, type_annotation } - -} \ No newline at end of file diff --git a/src/lang/typescript/visitors/class.visitor.ts b/src/lang/typescript/visitors/class.visitor.ts index 6924a29..061c3b2 100644 --- a/src/lang/typescript/visitors/class.visitor.ts +++ b/src/lang/typescript/visitors/class.visitor.ts @@ -1,13 +1,11 @@ import { isJavaDocComment } from "../../../utils/comment"; -import { NodeProperties, createNode } from "../Node"; +import { NodeProperties, createNode } from "../node"; import { SyntaxNode } from "tree-sitter"; -import { visitMethodDefinition } from "./method_definition.visitor"; -import { visitPublicFieldDefinition } from "./public_field_definition.visitor"; -import { visitTypeIdentifier } from "./type.visitor"; -import Source from "../../../interfaces/Source"; import log, { ErrorType } from "../../../utils/log"; import match from "../../../utils/match"; -import visitTypeParameters from "./type_parameters.visitor"; +import Source from "../../../interfaces/Source"; +import visitTypeParameters, { visitTypeIdentifier, visitType } from "./type.visitor"; +import { visitCallSignature } from "./signature.visitor"; export function visitClass( source: Source, @@ -28,7 +26,7 @@ export function visitClass( case 'class_body': return visitClassBody(source, child) default: - console.log(`[mr-doc::parser]: info - '${node.type.replace(/[_]/g, ' ')}' is not supported yet.`) + log.report(source, node, ErrorType.NodeTypeNotYetSupported); break; } }); @@ -84,7 +82,7 @@ export function visitClassBody(source: Source, node: SyntaxNode) { properties.push(visitPublicFieldDefinition(source, nextSibling, child)); break; default: - log.report(source, nextSibling, ErrorType.NodeTypeNotSupported); + log.report(source, nextSibling, ErrorType.NodeTypeNotYetSupported); break; } } @@ -97,4 +95,73 @@ export function visitClassBody(source: Source, node: SyntaxNode) { methods, properties } +} + +export function visitMethodDefinition(source: Source, node: SyntaxNode, comment: SyntaxNode) { + let method_definition = node.children; + let accessibility, + isAsync = false, + identifier, + type_parameters, + formal_parameters, + type_annotation; + + if (match(method_definition[0], 'async')) { + isAsync = true; + method_definition.shift(); + } + + if (match(method_definition[0], 'accessibility_modifier')) { + accessibility = createNode(source, method_definition.shift()) + } + + if (match(method_definition[0], 'property_identifier')) { + identifier = createNode(source, method_definition.shift()) + } + + if (match(method_definition[0], 'call_signature')) { + const call_signature = visitCallSignature(source, method_definition.shift()) + type_parameters = call_signature.type_parameters; + formal_parameters = call_signature.formal_parameters; + type_annotation = call_signature.type_annotation; + } + return { + type: 'method', + context: createNode(source, node), + comment: createNode(source, node, null, true), + accessibility, + async: isAsync, + identifier, + type_parameters, + formal_parameters, + type_annotation + } +} + +export function visitPublicFieldDefinition(source: Source, node: SyntaxNode, comment: SyntaxNode) { + let public_field_definition = node.children; + let accessibility, + identifier, + type_annotation; + + if (match(public_field_definition[0], 'accessibility_modifier')) { + accessibility = createNode(source, public_field_definition.shift()); + } + + if (match(public_field_definition[0], 'property_identifier')) { + identifier = createNode(source, public_field_definition.shift()); + } + + if (match(public_field_definition[0], 'type_annotation')) { + let type = public_field_definition.shift().children[1]; + type_annotation = visitType(source, type); + } + return { + type: 'property', + context: createNode(source, node), + comment: createNode(source, comment, null, true), + identifier, + accessibility, + type_annotation + } } \ No newline at end of file diff --git a/src/lang/typescript/visitors/declaration.visitor.ts b/src/lang/typescript/visitors/declaration.visitor.ts index 52628b4..68b92e6 100644 --- a/src/lang/typescript/visitors/declaration.visitor.ts +++ b/src/lang/typescript/visitors/declaration.visitor.ts @@ -1,7 +1,9 @@ import { SyntaxNode } from "tree-sitter"; -import { NodeProperties } from "../Node"; +import { NodeProperties, createNode } from "../node"; import Source from "../../../interfaces/Source"; import log, { ErrorType } from "../../../utils/log"; +import match from "../../../utils/match"; +import visitTypeParameters, { visitTypeIdentifier, visitObjectType } from "./type.visitor"; @@ -17,7 +19,7 @@ export function visitDeclaration( case 'lexical_declaration': return visitLexicalDeclaration(source, node, comment, properties); default: - log.report(source, node, ErrorType.NodeTypeNotSupported); + log.report(source, node, ErrorType.NodeTypeNotYetSupported); break; } } @@ -28,8 +30,27 @@ export function visitInterfaceDeclaration( comment: SyntaxNode, properties: Partial ) { - console.log(node.children); + let children = node.children, + type_identifier, + type_parameters, + body; + if (match(children[0], 'interface')) { + children.shift(); + } + + if (match(children[0], 'type_identifier')) { + type_identifier = visitTypeIdentifier(source, children.shift()); + } + + if (match(children[0], 'type_parameters')) { + type_parameters = visitTypeParameters(source, children.shift()); + } + + if (match(children[0], 'object_type')) { + body = visitObjectType(source, children.shift()); + } + } export function visitLexicalDeclaration( @@ -38,6 +59,53 @@ export function visitLexicalDeclaration( comment: SyntaxNode, properties: Partial ) { - console.log(node.children); + let children = node.children + .filter(child => !child.type.match(/[;]/)), + scope, + variable_declarator; + + if (match(children[0], 'const', 'let')) { + scope = createNode(source, children.shift()); + } + if (match(children[0], 'variable_declarator')) { + variable_declarator = visitVariableDeclarator(source, children.shift()); + } + + return { + type: node.type, + context: createNode(source, node, properties), + comment: createNode(source, comment, null, true), + scope, + variable_declarator + } +} + + +export function visitVariableDeclarator(source: Source, node: SyntaxNode) { + let children = node.children + .filter(child => !child.type.match(/[=;]/)), + identifier, + type_annotation, + initializer; + + if (match(children[0], 'identifier')) { + identifier = createNode(source, children.shift()); + } + + if (match(children[0], 'type_annotation')) { + type_annotation = createNode(source, children.shift()); + } + + if (children[0]) { + initializer = createNode(source, children.shift()); + } + + return { + type: node.type, + context: createNode(source, node), + identifier, + type_annotation, + initializer + } } \ No newline at end of file diff --git a/src/lang/typescript/visitors/formal_parameters.visitor.ts b/src/lang/typescript/visitors/formal_parameters.visitor.ts index 11f0ccf..e6f2b27 100644 --- a/src/lang/typescript/visitors/formal_parameters.visitor.ts +++ b/src/lang/typescript/visitors/formal_parameters.visitor.ts @@ -1,6 +1,5 @@ -import { createNode } from "../Node"; +import { createNode } from "../node"; import { SyntaxNode } from "tree-sitter"; -import { text } from "../../../utils/text"; import { visitType } from "./type.visitor"; import Source from "../../../interfaces/Source"; import match from "../../../utils/match"; @@ -23,7 +22,7 @@ export function visitRequiredParameter(source: Source, node: SyntaxNode) { if (match(required_parameter[0], 'identifier')) { - identifier = text(source, required_parameter.shift()); + identifier = createNode(source, required_parameter.shift()); } if(match(required_parameter[0], 'type_annotation')) { diff --git a/src/lang/typescript/visitors/function.visitor.ts b/src/lang/typescript/visitors/function.visitor.ts index 0f8ceb5..58b40af 100644 --- a/src/lang/typescript/visitors/function.visitor.ts +++ b/src/lang/typescript/visitors/function.visitor.ts @@ -1,8 +1,8 @@ -import { NodeProperties, createNode } from "../Node"; +import { NodeProperties, createNode } from "../node"; import { SyntaxNode } from "tree-sitter"; -import { visitCallSignature } from "./call_signature.visitor"; -import Source from "../../../interfaces/Source"; +import { visitCallSignature } from "./signature.visitor"; import match from "../../../utils/match"; +import Source from "../../../interfaces/Source"; export function visitFunction( source: Source, diff --git a/src/lang/typescript/visitors/method_definition.visitor.ts b/src/lang/typescript/visitors/method_definition.visitor.ts deleted file mode 100644 index 8fb5784..0000000 --- a/src/lang/typescript/visitors/method_definition.visitor.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { createNode } from "../Node"; -import { SyntaxNode } from "tree-sitter"; -import { text } from "../../../utils/text"; -import { visitCallSignature } from "./call_signature.visitor"; -import Source from "../../../interfaces/Source"; -import match from "../../../utils/match"; - -export function visitMethodDefinition(source: Source, node: SyntaxNode, comment: SyntaxNode) { - let method_definition = node.children; - let accessibility = 'public', - isAsync = false, - identifier, - type_parameters, - formal_parameters, - type_annotation; - - if (match(method_definition[0], 'async')) { - isAsync = true; - method_definition.shift(); - } - - if (match(method_definition[0], 'accessibility_modifier')) { - accessibility = text(source, method_definition.shift()) - } - - if (match(method_definition[0], 'property_identifier')) { - identifier = createNode(source, method_definition.shift()) - } - - if (match(method_definition[0], 'call_signature')) { - const call_signature = visitCallSignature(source, method_definition.shift()) - type_parameters = call_signature.type_parameters; - formal_parameters = call_signature.formal_parameters; - type_annotation = call_signature.type_annotation; - } - return { - type: 'method', - context: createNode(source, node), - comment: createNode(source, node, null, true), - accessibility, - async: isAsync, - identifier, - type_parameters, - formal_parameters, - type_annotation - } -} \ No newline at end of file diff --git a/src/lang/typescript/visitors/node.visitor.ts b/src/lang/typescript/visitors/node.visitor.ts index 0f42315..cf4813a 100644 --- a/src/lang/typescript/visitors/node.visitor.ts +++ b/src/lang/typescript/visitors/node.visitor.ts @@ -1,4 +1,4 @@ -import { NodeProperties } from "../Node"; +import { NodeProperties } from "../node"; import { SyntaxNode } from "tree-sitter"; import { visitClass } from "./class.visitor"; import { visitDeclaration } from "./declaration.visitor"; @@ -33,7 +33,7 @@ export function visitNode( return visitDeclaration(source, node, comment, properties); } - log.report(source, node, ErrorType.NodeTypeNotSupported); + log.report(source, node, ErrorType.NodeTypeNotYetSupported); break; } } \ No newline at end of file diff --git a/src/lang/typescript/visitors/public_field_definition.visitor.ts b/src/lang/typescript/visitors/public_field_definition.visitor.ts deleted file mode 100644 index 74d9560..0000000 --- a/src/lang/typescript/visitors/public_field_definition.visitor.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { createNode } from "../Node"; -import { SyntaxNode } from "tree-sitter"; -import { text } from "../../../utils/text"; -import { visitType } from "./type.visitor"; -import Source from "../../../interfaces/Source"; -import match from "../../../utils/match"; - -export function visitPublicFieldDefinition(source: Source, node: SyntaxNode, comment: SyntaxNode) { - let public_field_definition = node.children; - let accessibility = 'public', - identifier, - type_annotation; - - if (match(public_field_definition[0], 'accessibility_modifier')) { - accessibility = text(source, public_field_definition.shift()); - } - - if (match(public_field_definition[0], 'property_identifier')) { - identifier = createNode(source, public_field_definition.shift()); - } - - if (match(public_field_definition[0], 'type_annotation')) { - let type = public_field_definition.shift().children[1]; - type_annotation = visitType(source, type); - } - return { - type: 'property', - context: createNode(source, node), - comment: createNode(source, comment, null, true), - identifier, - accessibility, - type_annotation - } -} \ No newline at end of file diff --git a/src/lang/typescript/visitors/signature.visitor.ts b/src/lang/typescript/visitors/signature.visitor.ts new file mode 100644 index 0000000..bec33e3 --- /dev/null +++ b/src/lang/typescript/visitors/signature.visitor.ts @@ -0,0 +1,91 @@ +import { NodeProperties, createNode } from "../Node"; +import { SyntaxNode } from "tree-sitter"; +import { visitFormalParameters } from "./formal_parameters.visitor"; +import match from "../../../utils/match"; +import Source from "../../../interfaces/Source"; +import visitTypeParameters, { visitType } from "./type.visitor"; +import log, { ErrorType } from "../../../utils/log"; + +export function visitSignature( + source: Source, + node: SyntaxNode, + comment?: SyntaxNode, + properties?: Partial +) { + switch (node.type) { + case 'call_signature': + return visitCallSignature(source, node, comment, properties); + case 'method_signature': + return visitMethodSignature(source, node, comment, properties); + default: + log.report(source, node, ErrorType.NodeTypeNotYetSupported); + break; + } +} + +export function visitCallSignature( + source: Source, + node: SyntaxNode, + comment?: SyntaxNode, + properties?: Partial +) { + + let call_signature = node.children, + type_parameters, + formal_parameters, + type_annotation; + + if (match(call_signature[0], 'type_parameters')) { + type_parameters = visitTypeParameters(source, call_signature.shift()); + } + + if (match(call_signature[0], 'formal_parameters')) { + formal_parameters = visitFormalParameters(source, call_signature.shift()); + } + + if (match(call_signature[0], 'type_annotation')) { + let type = call_signature.shift().children[1]; + type_annotation = visitType(source, type); + } + + return { + type: node.type, + context: createNode(source, node), + comment: comment ? createNode(source, comment, null, true) : undefined, + properties, + type_parameters, + formal_parameters, + type_annotation + } +} + + +export function visitMethodSignature( + source: Source, + node: SyntaxNode, + comment: SyntaxNode, + properties: Partial +) { + let children = node.children, + identifier; + if(match(children[0], 'property_identifier')) { + identifier = createNode(source, children.shift()); + } + console.log(children); + + // console.log(children[0].type, createNode(source, children[0]).text) +} + +export function visitPropertySignature( + source: Source, + node: SyntaxNode, + comment?: SyntaxNode, + properties?: Partial +) { + // console.log(node) + return { + type: node.type, + context: createNode(source, node), + comment: comment ? createNode(source, comment, null, true) : undefined, + } +} \ No newline at end of file diff --git a/src/lang/typescript/visitors/statement.visitor.ts b/src/lang/typescript/visitors/statement.visitor.ts index f110810..2d1001d 100644 --- a/src/lang/typescript/visitors/statement.visitor.ts +++ b/src/lang/typescript/visitors/statement.visitor.ts @@ -1,4 +1,4 @@ -import { NodeProperties } from "../Node"; +import { NodeProperties } from "../node"; import { SyntaxNode } from "tree-sitter"; import { visitNode } from "./node.visitor"; import Source from "../../../interfaces/Source"; @@ -17,7 +17,7 @@ export function visitStatement( case 'export_statement': return visitExportStatement(source, node, comment); default: - log.report(source, node, ErrorType.NodeTypeNotSupported); + log.report(source, node, ErrorType.NodeTypeNotYetSupported); break; } } diff --git a/src/lang/typescript/visitors/type.visitor.ts b/src/lang/typescript/visitors/type.visitor.ts index adb2708..1bc1cc1 100644 --- a/src/lang/typescript/visitors/type.visitor.ts +++ b/src/lang/typescript/visitors/type.visitor.ts @@ -1,11 +1,16 @@ -import { createNode } from "../Node"; +import { createNode, NodeProperties } from "../node"; import { SyntaxNode } from "tree-sitter"; -import { visitTypeArguments } from "./type_arguments.visitor"; import Source from "../../../interfaces/Source"; import log, { ErrorType } from "../../../utils/log"; +import match from "../../../utils/match"; +import { isJavaDocComment } from "../../../utils/comment"; +import { visitSignature } from "./signature.visitor"; +import { sibling } from "../../../utils/sibling"; + +/* Type visitors */ export function visitTypeOrTypeIdentifier(source: Source, node: SyntaxNode) { - if (node.type === 'type_identifier') { + if (match(node, 'type_identifier')) { return visitTypeIdentifier(source, node) } return visitType(source, node); @@ -26,8 +31,8 @@ export function visitType(source: Source, node: SyntaxNode) { case 'predefined_type': return visitPredefinedType(source, node); default: - log.report(source, node, ErrorType.NodeTypeNotSupported); - break; + log.report(source, node, ErrorType.NodeTypeNotYetSupported); + break; } } @@ -79,6 +84,52 @@ export function visitGenericType(source: Source, node: SyntaxNode) { export function visitPredefinedType(source: Source, node: SyntaxNode) { return { type: node.type, - context: createNode(source, node.children.shift()), + context: createNode(source, node), + } +} + +export function visitObjectType( + source: Source, + node: SyntaxNode, + comment?: SyntaxNode, + properties?: Partial +) { + let children = node.children + .filter(child => !child.type.match(/[\{\},;]/)); + let signatures = []; + console.log(children) + children.forEach(child => { + let nextSibiling = sibling(child, children); + if (match(child, 'comment') && isJavaDocComment(source, child) && nextSibiling) { + // console.log(createNode(source, nextSibiling).text); + // let signature = visitSignature(source, nextSibiling, child, properties); + // if (signature) { + // signatures.push(signature) + // } + } + }); + return { + type: node.type, + context: createNode(source, node), + signatures + } +} + + +/* Helpers */ + +export default function visitTypeParameters(source: Source, node: SyntaxNode) { + return { + type: node.type, + context: createNode(source, node), + parameters: node.children + .filter(child => !child.type.match(/[<>,]/)) + .map(child => ({ type: child.type, context: createNode(source, child) })) } +} + +export function visitTypeArguments(source: Source, node: SyntaxNode) { + return node.children + .filter(child => !child.type.match(/[<>,]/)) + .map(child => visitType(source, child)) } \ No newline at end of file diff --git a/src/lang/typescript/visitors/type_arguments.visitor.ts b/src/lang/typescript/visitors/type_arguments.visitor.ts deleted file mode 100644 index df23556..0000000 --- a/src/lang/typescript/visitors/type_arguments.visitor.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { SyntaxNode } from "tree-sitter"; -import { visitType } from "./type.visitor"; -import Source from "../../../interfaces/Source"; - -export function visitTypeArguments(source: Source, node: SyntaxNode) { - return node.children - .filter(child => !child.type.match(/[<>,]/)) - .map(child => visitType(source, child)) -} \ No newline at end of file diff --git a/src/lang/typescript/visitors/type_parameters.visitor.ts b/src/lang/typescript/visitors/type_parameters.visitor.ts deleted file mode 100644 index fad3bc3..0000000 --- a/src/lang/typescript/visitors/type_parameters.visitor.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { createNode } from "../Node"; -import { SyntaxNode } from "tree-sitter"; -import Source from "../../../interfaces/Source"; - -export default function visitTypeParameters(source: Source, node: SyntaxNode) { - return { - type: node.type, - context: createNode(source, node), - parameters: node.children - .filter(child => !child.type.match(/[<>,]/)) - .map(child => ({ type: child.type, context: createNode(source, child) })) - } -} \ No newline at end of file diff --git a/src/lang/typescript/visitors/visitor.ts b/src/lang/typescript/visitors/visitor.ts new file mode 100644 index 0000000..c8df9c7 --- /dev/null +++ b/src/lang/typescript/visitors/visitor.ts @@ -0,0 +1,43 @@ +import { SyntaxNode } from "tree-sitter"; + + +export interface TreeSitterNode { + visit(visitor: NodeVisitor): void +} + +export interface NodeVisitor { + visitNode(node: SyntaxNode): void + visitChildren(nodes: SyntaxNode[]): void +} + +export class Node implements TreeSitterNode { + constructor(public syntaxNode: SyntaxNode) { } + visit = (visitor: NodeVisitor): void => { + visitor.visitNode(this.syntaxNode); + visitor.visitChildren(this.syntaxNode.children); + } +} + +export class TypeScriptVisitor implements NodeVisitor { + ast = [] + visitNode = (node: SyntaxNode): void => { + switch (node.type) { + case 'comment': + this.ast.push(this.visitComment(node)) + break; + default: + break; + } + } + + visitChildren = (nodes: SyntaxNode[]): void => { + nodes + .filter(child => !child.type.match(/[<>(){},;\[\]]/)) + .forEach(this.visitNode.bind(this)); + } + + visitComment = (node: SyntaxNode): void => { + + } + +} \ No newline at end of file diff --git a/src/lang/typescript/walk.ts b/src/lang/typescript/walk.ts new file mode 100644 index 0000000..3fb0fc5 --- /dev/null +++ b/src/lang/typescript/walk.ts @@ -0,0 +1,8 @@ +import { SyntaxNode } from "tree-sitter"; +import { Node } from "./visitors/visitor"; + +export function walk(node: SyntaxNode) { + let node_ = new Node(node); + node_.syntaxNode.children.map(child => walk(child)) + return node_; +} \ No newline at end of file diff --git a/src/utils/log.ts b/src/utils/log.ts index e6c3ed8..201de11 100644 --- a/src/utils/log.ts +++ b/src/utils/log.ts @@ -4,7 +4,7 @@ import { SyntaxNode } from 'tree-sitter'; import range from './range'; export enum ErrorType { - NodeTypeNotSupported, + NodeTypeNotYetSupported, TreeSitterParseError } @@ -15,7 +15,7 @@ class ParserLog extends Log { const getRange = () => sameLine ? location.row.start + 1 : location.row.start + 1 + ' - ' + location.row.end + 1; const culprit = `Line${sameLine ? '' : 's'} ${getRange()} in '${source.path}${source.name}'`; switch (error) { - case ErrorType.NodeTypeNotSupported: + case ErrorType.NodeTypeNotYetSupported: this.info(`'${node.type.replace(/[_]/g, ' ')}' is not yet supported:\n${culprit}`) break; case ErrorType.TreeSitterParseError: diff --git a/src/utils/match.ts b/src/utils/match.ts index bc8595a..205c970 100644 --- a/src/utils/match.ts +++ b/src/utils/match.ts @@ -8,6 +8,7 @@ import { SyntaxNode } from "tree-sitter"; * @return: boolean * ``` */ -export default function match(node: SyntaxNode, type: string): boolean { - return node && node.type === type; +export default function match(node: SyntaxNode, ...types: string[]): boolean { + const matches = types.map(type => node && type === node.type); + return matches.includes(true); } \ No newline at end of file diff --git a/src/utils/sibling.ts b/src/utils/sibling.ts new file mode 100644 index 0000000..81d1bb0 --- /dev/null +++ b/src/utils/sibling.ts @@ -0,0 +1,17 @@ +import { SyntaxNode } from "tree-sitter"; + +export function sibling( + node: SyntaxNode, + children?: SyntaxNode[], + filter?: () => boolean +) { + if (node) { + if (children) { + const index = filter ? + children.filter(filter).indexOf(node) : + children.indexOf(node); + return children[index + 1]; + } + return node.nextSibling; + } +} \ No newline at end of file From d2f997b8be2673e3e71b32202125d5e3383debb1 Mon Sep 17 00:00:00 2001 From: Takeshi Date: Tue, 21 Aug 2018 17:41:54 -0600 Subject: [PATCH 13/32] Update: WIP --- build/example.d.ts | 13 +- build/example.js | 7 +- build/src/lang/typescript/Node.d.ts | 12 +- build/src/lang/typescript/Node.js | 15 +- build/src/lang/typescript/index.d.ts | 4 +- build/src/lang/typescript/index.js | 13 +- .../src/lang/typescript/visitors/visitor.d.ts | 230 ++++++++++++++++++ build/src/lang/typescript/visitors/visitor.js | 159 ++++++++++++ build/src/lang/typescript/walk.d.ts | 3 + build/src/lang/typescript/walk.js | 10 + build/src/utils/match.js | 6 +- build/src/utils/sibling.d.ts | 2 + build/src/utils/sibling.js | 15 ++ example.ts | 8 +- src/lang/typescript/Node.ts | 21 +- src/lang/typescript/index.ts | 15 +- src/lang/typescript/visitors/class.visitor.ts | 167 ------------- .../visitors/declaration.visitor.ts | 111 --------- .../visitors/formal_parameters.visitor.ts | 39 --- .../typescript/visitors/function.visitor.ts | 52 ---- src/lang/typescript/visitors/node.visitor.ts | 39 --- .../typescript/visitors/program.visitor.ts | 33 --- .../typescript/visitors/signature.visitor.ts | 91 ------- .../typescript/visitors/statement.visitor.ts | 54 ---- src/lang/typescript/visitors/type.visitor.ts | 135 ---------- src/lang/typescript/visitors/visitor.ts | 224 ++++++++++++++++- src/lang/typescript/walk.ts | 2 +- 27 files changed, 693 insertions(+), 787 deletions(-) create mode 100644 build/src/lang/typescript/visitors/visitor.d.ts create mode 100644 build/src/lang/typescript/visitors/visitor.js create mode 100644 build/src/lang/typescript/walk.d.ts create mode 100644 build/src/lang/typescript/walk.js create mode 100644 build/src/utils/sibling.d.ts create mode 100644 build/src/utils/sibling.js delete mode 100644 src/lang/typescript/visitors/class.visitor.ts delete mode 100644 src/lang/typescript/visitors/declaration.visitor.ts delete mode 100644 src/lang/typescript/visitors/formal_parameters.visitor.ts delete mode 100644 src/lang/typescript/visitors/function.visitor.ts delete mode 100644 src/lang/typescript/visitors/node.visitor.ts delete mode 100644 src/lang/typescript/visitors/program.visitor.ts delete mode 100644 src/lang/typescript/visitors/signature.visitor.ts delete mode 100644 src/lang/typescript/visitors/statement.visitor.ts delete mode 100644 src/lang/typescript/visitors/type.visitor.ts diff --git a/build/example.d.ts b/build/example.d.ts index fb9849f..e737dae 100644 --- a/build/example.d.ts +++ b/build/example.d.ts @@ -1,4 +1,15 @@ +interface A { +} /** * Description */ -export declare const REGEX = 2; +interface B extends A { + /** + * description + */ + (x: string): void; + /** + * description + */ + func(x: string): void; +} diff --git a/build/example.js b/build/example.js index f9a816e..112c1f9 100644 --- a/build/example.js +++ b/build/example.js @@ -1,7 +1,2 @@ "use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -/** - * Description - */ -exports.REGEX = 2; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhhbXBsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2V4YW1wbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQTs7R0FFRztBQUNVLFFBQUEsS0FBSyxHQUFHLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxuLyoqXG4gKiBEZXNjcmlwdGlvblxuICovXG5leHBvcnQgY29uc3QgUkVHRVggPSAyOyJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhhbXBsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2V4YW1wbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIlxuaW50ZXJmYWNlIEEge1xuXG59XG5cbi8qKlxuICogRGVzY3JpcHRpb25cbiAqL1xuaW50ZXJmYWNlIEI8VCBleHRlbmRzIEEsIEs+IGV4dGVuZHMgQSB7XG4gIC8qKlxuICAgKiBkZXNjcmlwdGlvblxuICAgKi9cbiAgKHg6IHN0cmluZyk6IHZvaWRcbiAgLyoqXG4gICAqIGRlc2NyaXB0aW9uXG4gICAqL1xuICBmdW5jICh4OiBzdHJpbmcpOiB2b2lkXG59Il19 \ No newline at end of file diff --git a/build/src/lang/typescript/Node.d.ts b/build/src/lang/typescript/Node.d.ts index f806940..1de75fc 100644 --- a/build/src/lang/typescript/Node.d.ts +++ b/build/src/lang/typescript/Node.d.ts @@ -1,17 +1,17 @@ -import TextRange from "../../interfaces/TextRange"; -import { SyntaxNode } from "tree-sitter"; import { DocumentationNode } from 'xdoc-parser/src/XDocASTNode'; import { RemarkNode } from 'xdoc-parser/src/XDocParser'; +import { SyntaxNode } from "tree-sitter"; import Source from "../../interfaces/Source"; -export interface Node extends TextRange { +import TextRange from "../../interfaces/TextRange"; +export interface ASTNode extends TextRange { text: string; - properties?: Partial; - xdoc?: { + properties?: any; + comment?: { markdown: RemarkNode; documentation: Partial; }; } -export declare function createNode(file: Source, node: SyntaxNode, properties?: Partial, document?: boolean): Node; +export declare function createASTNode(source: Source, node: SyntaxNode, document?: boolean): ASTNode; export interface NodeProperties { exports: Partial; inheritance: Partial; diff --git a/build/src/lang/typescript/Node.js b/build/src/lang/typescript/Node.js index 0ec8291..fce58ae 100644 --- a/build/src/lang/typescript/Node.js +++ b/build/src/lang/typescript/Node.js @@ -1,17 +1,14 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); +const text_1 = require("../../utils/text"); const range_1 = require("../../utils/range"); const xdoc_parser_1 = require("xdoc-parser"); -const text_1 = require("../../utils/text"); -function createNode(file, node, properties, document) { - let node_ = Object.assign({}, range_1.default(node), { text: text_1.text(file, node) }); - if (properties) { - node_ = Object.assign(node_, { properties }); - } +function createASTNode(source, node, document) { + let node_ = Object.assign({}, range_1.default(node), { text: text_1.text(source, node) }); if (document) { - node_ = Object.assign(node_, { xdoc: xdoc_parser_1.default(node_.text).parse() }); + node_ = Object.assign(node_, { comment: xdoc_parser_1.default(node_.text).parse() }); } return node_; } -exports.createNode = createNode; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvTm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLDZDQUFzQztBQUN0Qyw2Q0FBK0I7QUFJL0IsMkNBQXdDO0FBWXhDLFNBQWdCLFVBQVUsQ0FDeEIsSUFBWSxFQUNaLElBQWdCLEVBQ2hCLFVBQW9DLEVBQ3BDLFFBQWtCO0lBR2xCLElBQUksS0FBSyxxQkFBUSxlQUFLLENBQUMsSUFBSSxDQUFDLElBQUUsSUFBSSxFQUFFLFdBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUUsQ0FBQTtJQUV0RCxJQUFJLFVBQVUsRUFBRTtRQUNkLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUE7S0FDN0M7SUFFRCxJQUFJLFFBQVEsRUFBRTtRQUNaLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxxQkFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7S0FDakU7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFqQkQsZ0NBaUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRleHRSYW5nZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9UZXh0UmFuZ2VcIjtcbmltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcbmltcG9ydCByYW5nZSBmcm9tIFwiLi4vLi4vdXRpbHMvcmFuZ2VcIjtcbmltcG9ydCB4ZG9jIGZyb20gJ3hkb2MtcGFyc2VyJztcbmltcG9ydCB7IERvY3VtZW50YXRpb25Ob2RlIH0gZnJvbSAneGRvYy1wYXJzZXIvc3JjL1hEb2NBU1ROb2RlJztcbmltcG9ydCB7IFJlbWFya05vZGUgfSBmcm9tICd4ZG9jLXBhcnNlci9zcmMvWERvY1BhcnNlcic7XG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuaW1wb3J0IHsgdGV4dCB9IGZyb20gXCIuLi8uLi91dGlscy90ZXh0XCI7XG5cblxuZXhwb3J0IGludGVyZmFjZSBOb2RlIGV4dGVuZHMgVGV4dFJhbmdlIHtcbiAgdGV4dDogc3RyaW5nLFxuICBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz5cbiAgeGRvYz86IHtcbiAgICBtYXJrZG93bjogUmVtYXJrTm9kZSxcbiAgICBkb2N1bWVudGF0aW9uOiBQYXJ0aWFsPERvY3VtZW50YXRpb25Ob2RlPlxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVOb2RlKFxuICBmaWxlOiBTb3VyY2UsIFxuICBub2RlOiBTeW50YXhOb2RlLCBcbiAgcHJvcGVydGllcz86IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+LFxuICBkb2N1bWVudD86IGJvb2xlYW4sXG4pOiBOb2RlIHtcblxuICBsZXQgbm9kZV8gPSB7IC4uLnJhbmdlKG5vZGUpLCB0ZXh0OiB0ZXh0KGZpbGUsIG5vZGUpIH1cblxuICBpZiAocHJvcGVydGllcykge1xuICAgIG5vZGVfID0gT2JqZWN0LmFzc2lnbihub2RlXywgeyBwcm9wZXJ0aWVzIH0pXG4gIH1cbiAgXG4gIGlmIChkb2N1bWVudCkge1xuICAgIG5vZGVfID0gT2JqZWN0LmFzc2lnbihub2RlXywgeyB4ZG9jOiB4ZG9jKG5vZGVfLnRleHQpLnBhcnNlKCkgfSlcbiAgfVxuICByZXR1cm4gbm9kZV87XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9kZVByb3BlcnRpZXMge1xuICBleHBvcnRzOiBQYXJ0aWFsPE5vZGVFeHBvcnRzPlxuICBpbmhlcml0YW5jZTogUGFydGlhbDxOb2RlSW5oZXJpdGFuY2U+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9kZUV4cG9ydHMge1xuICBleHBvcnQ6IGJvb2xlYW4sXG4gIGRlZmF1bHQ6IGJvb2xlYW5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb2RlSW5oZXJpdGFuY2Uge1xuICBleHRlbmRzOiBib29sZWFuLFxuICBpbXBsZW1lbnRzOiBib29sZWFuXG59Il19 \ No newline at end of file +exports.createASTNode = createASTNode; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvTm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUdBLDJDQUF3QztBQUN4Qyw2Q0FBc0M7QUFHdEMsNkNBQStCO0FBWS9CLFNBQWdCLGFBQWEsQ0FDM0IsTUFBYyxFQUNkLElBQWdCLEVBQ2hCLFFBQWtCO0lBR2xCLElBQUksS0FBSyxxQkFBUSxlQUFLLENBQUMsSUFBSSxDQUFDLElBQUUsSUFBSSxFQUFFLFdBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUUsQ0FBQTtJQUV4RCxJQUFJLFFBQVEsRUFBRTtRQUNaLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxxQkFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7S0FDcEU7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFaRCxzQ0FZQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERvY3VtZW50YXRpb25Ob2RlIH0gZnJvbSAneGRvYy1wYXJzZXIvc3JjL1hEb2NBU1ROb2RlJztcbmltcG9ydCB7IFJlbWFya05vZGUgfSBmcm9tICd4ZG9jLXBhcnNlci9zcmMvWERvY1BhcnNlcic7XG5pbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgeyB0ZXh0IH0gZnJvbSBcIi4uLy4uL3V0aWxzL3RleHRcIjtcbmltcG9ydCByYW5nZSBmcm9tIFwiLi4vLi4vdXRpbHMvcmFuZ2VcIjtcbmltcG9ydCBTb3VyY2UgZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvU291cmNlXCI7XG5pbXBvcnQgVGV4dFJhbmdlIGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL1RleHRSYW5nZVwiO1xuaW1wb3J0IHhkb2MgZnJvbSAneGRvYy1wYXJzZXInO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQVNUTm9kZSBleHRlbmRzIFRleHRSYW5nZSB7XG4gIHRleHQ6IHN0cmluZyxcbiAgcHJvcGVydGllcz86IGFueVxuICBjb21tZW50Pzoge1xuICAgIG1hcmtkb3duOiBSZW1hcmtOb2RlLFxuICAgIGRvY3VtZW50YXRpb246IFBhcnRpYWw8RG9jdW1lbnRhdGlvbk5vZGU+XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFTVE5vZGUoXG4gIHNvdXJjZTogU291cmNlLCBcbiAgbm9kZTogU3ludGF4Tm9kZSwgXG4gIGRvY3VtZW50PzogYm9vbGVhbixcbik6IEFTVE5vZGUge1xuXG4gIGxldCBub2RlXyA9IHsgLi4ucmFuZ2Uobm9kZSksIHRleHQ6IHRleHQoc291cmNlLCBub2RlKSB9XG5cbiAgaWYgKGRvY3VtZW50KSB7XG4gICAgbm9kZV8gPSBPYmplY3QuYXNzaWduKG5vZGVfLCB7IGNvbW1lbnQ6IHhkb2Mobm9kZV8udGV4dCkucGFyc2UoKSB9KVxuICB9XG4gIHJldHVybiBub2RlXztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb2RlUHJvcGVydGllcyB7XG4gIGV4cG9ydHM6IFBhcnRpYWw8Tm9kZUV4cG9ydHM+XG4gIGluaGVyaXRhbmNlOiBQYXJ0aWFsPE5vZGVJbmhlcml0YW5jZT5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb2RlRXhwb3J0cyB7XG4gIGV4cG9ydDogYm9vbGVhbixcbiAgZGVmYXVsdDogYm9vbGVhblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vZGVJbmhlcml0YW5jZSB7XG4gIGV4dGVuZHM6IGJvb2xlYW4sXG4gIGltcGxlbWVudHM6IGJvb2xlYW5cbn0iXX0= \ No newline at end of file diff --git a/build/src/lang/typescript/index.d.ts b/build/src/lang/typescript/index.d.ts index 852228a..2e585b8 100644 --- a/build/src/lang/typescript/index.d.ts +++ b/build/src/lang/typescript/index.d.ts @@ -12,9 +12,9 @@ import Source from '../../interfaces/Source'; * ``` */ export default class TypeScriptParser implements IParser { - private file; + private source; private options; private parser; constructor(file: Source, options: any); - parse: () => any[]; + parse: () => object[]; } diff --git a/build/src/lang/typescript/index.js b/build/src/lang/typescript/index.js index a6c0ad4..668d3c1 100644 --- a/build/src/lang/typescript/index.js +++ b/build/src/lang/typescript/index.js @@ -2,7 +2,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); const Parser = require("tree-sitter"); const TypeScript = require("tree-sitter-typescript"); -const program_visitor_1 = require("./visitors/program.visitor"); +const walk_1 = require("./walk"); +const visitor_1 = require("./visitors/visitor"); /** * A class that parses JavaScript comments. * @@ -17,16 +18,18 @@ const program_visitor_1 = require("./visitors/program.visitor"); class TypeScriptParser { constructor(file, options) { this.parse = () => { - const tree = this.parser.parse(this.file.text); + const tree = this.parser.parse(this.source.text); if (tree.rootNode.type === "program") { - return program_visitor_1.visitProgram(this.file, tree.rootNode); + const visitor = new visitor_1.TypeScriptVisitor(this.source); + walk_1.default(tree.rootNode).visit(visitor); + return visitor.getAST(); } }; - this.file = file; + this.source = file; Object.assign(this.options = {}, options || {}); this.parser = new Parser(); this.parser.setLanguage(TypeScript); } } exports.default = TypeScriptParser; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy90eXBlc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNDO0FBQ3RDLHFEQUFxRDtBQUdyRCxnRUFBMEQ7QUFHMUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQXFCLGdCQUFnQjtJQUluQyxZQUFZLElBQVksRUFBRSxPQUFZO1FBTXRDLFVBQUssR0FBRyxHQUFHLEVBQUU7WUFDWCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9DLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO2dCQUNwQyxPQUFPLDhCQUFZLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7YUFDOUM7UUFDSCxDQUFDLENBQUE7UUFWQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdEMsQ0FBQztDQU9GO0FBaEJELG1DQWdCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFBhcnNlciBmcm9tICd0cmVlLXNpdHRlcic7XG5pbXBvcnQgKiBhcyBUeXBlU2NyaXB0IGZyb20gJ3RyZWUtc2l0dGVyLXR5cGVzY3JpcHQnO1xuaW1wb3J0IElQYXJzZXIgZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9JUGFyc2VyJztcbmltcG9ydCBTb3VyY2UgZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2UnO1xuaW1wb3J0IHsgdmlzaXRQcm9ncmFtIH0gZnJvbSAnLi92aXNpdG9ycy9wcm9ncmFtLnZpc2l0b3InO1xuXG5cbi8qKlxuICogQSBjbGFzcyB0aGF0IHBhcnNlcyBKYXZhU2NyaXB0IGNvbW1lbnRzLlxuICogXG4gKiAjIEFQSVxuICogXG4gKiBgYGBcbiAqIEBjbGFzcyBKYXZhU2NyaXB0UGFyc2VyXG4gKiBAaW1wbGVtZW50cyBJUGFyc2VyXG4gKiBAZXhwb3J0IGRlZmF1bHRcbiAqIGBgYFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUeXBlU2NyaXB0UGFyc2VyIGltcGxlbWVudHMgSVBhcnNlciB7XG4gIHByaXZhdGUgZmlsZTogU291cmNlO1xuICBwcml2YXRlIG9wdGlvbnM6IGFueTtcbiAgcHJpdmF0ZSBwYXJzZXI6IFBhcnNlcjtcbiAgY29uc3RydWN0b3IoZmlsZTogU291cmNlLCBvcHRpb25zOiBhbnkpIHtcbiAgICB0aGlzLmZpbGUgPSBmaWxlO1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5vcHRpb25zID0ge30sIG9wdGlvbnMgfHwge30pO1xuICAgIHRoaXMucGFyc2VyID0gbmV3IFBhcnNlcigpO1xuICAgIHRoaXMucGFyc2VyLnNldExhbmd1YWdlKFR5cGVTY3JpcHQpO1xuICB9XG4gIHBhcnNlID0gKCkgPT4ge1xuICAgIGNvbnN0IHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZSh0aGlzLmZpbGUudGV4dCk7XG4gICAgaWYgKHRyZWUucm9vdE5vZGUudHlwZSA9PT0gXCJwcm9ncmFtXCIpIHtcbiAgICAgIHJldHVybiB2aXNpdFByb2dyYW0odGhpcy5maWxlLCB0cmVlLnJvb3ROb2RlKVxuICAgIH1cbiAgfVxufVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy90eXBlc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNDO0FBQ3RDLHFEQUFxRDtBQUdyRCxpQ0FBMEI7QUFDMUIsZ0RBQXVEO0FBR3ZEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFxQixnQkFBZ0I7SUFJbkMsWUFBWSxJQUFZLEVBQUUsT0FBWTtRQU10QyxVQUFLLEdBQUcsR0FBRyxFQUFFO1lBQ1gsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtnQkFDcEMsTUFBTSxPQUFPLEdBQUcsSUFBSSwyQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ25ELGNBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNuQyxPQUFPLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUN6QjtRQUNILENBQUMsQ0FBQTtRQVpDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN0QyxDQUFDO0NBU0Y7QUFsQkQsbUNBa0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcbmltcG9ydCAqIGFzIFR5cGVTY3JpcHQgZnJvbSAndHJlZS1zaXR0ZXItdHlwZXNjcmlwdCc7XG5pbXBvcnQgSVBhcnNlciBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lQYXJzZXInO1xuaW1wb3J0IFNvdXJjZSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZSc7XG5pbXBvcnQgd2FsayBmcm9tICcuL3dhbGsnO1xuaW1wb3J0IHsgVHlwZVNjcmlwdFZpc2l0b3IgfSBmcm9tICcuL3Zpc2l0b3JzL3Zpc2l0b3InO1xuXG5cbi8qKlxuICogQSBjbGFzcyB0aGF0IHBhcnNlcyBKYXZhU2NyaXB0IGNvbW1lbnRzLlxuICogXG4gKiAjIEFQSVxuICogXG4gKiBgYGBcbiAqIEBjbGFzcyBKYXZhU2NyaXB0UGFyc2VyXG4gKiBAaW1wbGVtZW50cyBJUGFyc2VyXG4gKiBAZXhwb3J0IGRlZmF1bHRcbiAqIGBgYFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUeXBlU2NyaXB0UGFyc2VyIGltcGxlbWVudHMgSVBhcnNlciB7XG4gIHByaXZhdGUgc291cmNlOiBTb3VyY2U7XG4gIHByaXZhdGUgb3B0aW9uczogYW55O1xuICBwcml2YXRlIHBhcnNlcjogUGFyc2VyO1xuICBjb25zdHJ1Y3RvcihmaWxlOiBTb3VyY2UsIG9wdGlvbnM6IGFueSkge1xuICAgIHRoaXMuc291cmNlID0gZmlsZTtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucyA9IHt9LCBvcHRpb25zIHx8IHt9KTtcbiAgICB0aGlzLnBhcnNlciA9IG5ldyBQYXJzZXIoKTtcbiAgICB0aGlzLnBhcnNlci5zZXRMYW5ndWFnZShUeXBlU2NyaXB0KTtcbiAgfVxuICBwYXJzZSA9ICgpID0+IHtcbiAgICBjb25zdCB0cmVlID0gdGhpcy5wYXJzZXIucGFyc2UodGhpcy5zb3VyY2UudGV4dCk7XG4gICAgaWYgKHRyZWUucm9vdE5vZGUudHlwZSA9PT0gXCJwcm9ncmFtXCIpIHtcbiAgICAgIGNvbnN0IHZpc2l0b3IgPSBuZXcgVHlwZVNjcmlwdFZpc2l0b3IodGhpcy5zb3VyY2UpO1xuICAgICAgd2Fsayh0cmVlLnJvb3ROb2RlKS52aXNpdCh2aXNpdG9yKTtcbiAgICAgIHJldHVybiB2aXNpdG9yLmdldEFTVCgpO1xuICAgIH1cbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/visitor.d.ts b/build/src/lang/typescript/visitors/visitor.d.ts new file mode 100644 index 0000000..ad6527a --- /dev/null +++ b/build/src/lang/typescript/visitors/visitor.d.ts @@ -0,0 +1,230 @@ +import { NodeProperties } from "../Node"; +import { SyntaxNode } from "tree-sitter"; +import Source from "../../../interfaces/Source"; +export interface TreeSitterNode { + visit(visitor: NodeVisitor): void; +} +export interface NodeVisitor { + getAST(): object[]; + visitNode(node: SyntaxNode): any; + visitChildren(nodes: SyntaxNode[]): any; +} +export declare class Node implements TreeSitterNode { + syntaxNode: SyntaxNode; + constructor(syntaxNode: SyntaxNode); + visit: (visitor: NodeVisitor) => NodeVisitor; +} +export declare class TypeScriptVisitor implements NodeVisitor { + private ast; + private source; + private parent; + constructor(source: Source); + private hasInheritance; + private getInheritanceType; + getAST(): object[]; + visitNode: (node: SyntaxNode) => { + text: string; + properties?: any; + comment?: { + markdown: import("xdoc-parser/src/XDocParser").RemarkNode; + documentation: Partial; + }; + position: import("../../../interfaces/TextRange").Range; + location: { + row: import("../../../interfaces/TextRange").Range; + column: import("../../../interfaces/TextRange").Range; + }; + type: string; + }; + visitChildren: (nodes: SyntaxNode[]) => {}[]; + visitProgram: (node: SyntaxNode) => {}[]; + visitComment: (node: SyntaxNode) => { + context: { + children: {}[]; + properties: Partial; + text: string; + comment?: { + markdown: import("xdoc-parser/src/XDocParser").RemarkNode; + documentation: Partial; + }; + position: import("../../../interfaces/TextRange").Range; + location: { + row: import("../../../interfaces/TextRange").Range; + column: import("../../../interfaces/TextRange").Range; + }; + type: string; + }; + comment: { + markdown: import("xdoc-parser/src/XDocParser").RemarkNode; + documentation: Partial; + }; + text: string; + properties?: any; + position: import("../../../interfaces/TextRange").Range; + location: { + row: import("../../../interfaces/TextRange").Range; + column: import("../../../interfaces/TextRange").Range; + }; + type: string; + }; + visitContext: (node: SyntaxNode, properties?: Partial) => { + children: {}[]; + properties: Partial; + text: string; + comment?: { + markdown: import("xdoc-parser/src/XDocParser").RemarkNode; + documentation: Partial; + }; + position: import("../../../interfaces/TextRange").Range; + location: { + row: import("../../../interfaces/TextRange").Range; + column: import("../../../interfaces/TextRange").Range; + }; + type: string; + }; + visitInterfaceDeclaration: (node: SyntaxNode, properties?: Partial) => { + children: {}[]; + properties: Partial; + text: string; + comment?: { + markdown: import("xdoc-parser/src/XDocParser").RemarkNode; + documentation: Partial; + }; + position: import("../../../interfaces/TextRange").Range; + location: { + row: import("../../../interfaces/TextRange").Range; + column: import("../../../interfaces/TextRange").Range; + }; + type: string; + }; + visitInterface: (node: SyntaxNode, properties: Partial) => { + children: {}[]; + properties: Partial; + text: string; + comment?: { + markdown: import("xdoc-parser/src/XDocParser").RemarkNode; + documentation: Partial; + }; + position: import("../../../interfaces/TextRange").Range; + location: { + row: import("../../../interfaces/TextRange").Range; + column: import("../../../interfaces/TextRange").Range; + }; + type: string; + }; + visitCallSignature: (node: SyntaxNode, properties: Partial) => { + children: {}[]; + properties: Partial; + text: string; + comment?: { + markdown: import("xdoc-parser/src/XDocParser").RemarkNode; + documentation: Partial; + }; + position: import("../../../interfaces/TextRange").Range; + location: { + row: import("../../../interfaces/TextRange").Range; + column: import("../../../interfaces/TextRange").Range; + }; + type: string; + }; + visitTypeNode: (node: SyntaxNode) => { + text: string; + properties?: any; + comment?: { + markdown: import("xdoc-parser/src/XDocParser").RemarkNode; + documentation: Partial; + }; + position: import("../../../interfaces/TextRange").Range; + location: { + row: import("../../../interfaces/TextRange").Range; + column: import("../../../interfaces/TextRange").Range; + }; + type: string; + } | { + children: {}[]; + text: string; + properties?: any; + comment?: { + markdown: import("xdoc-parser/src/XDocParser").RemarkNode; + documentation: Partial; + }; + position: import("../../../interfaces/TextRange").Range; + location: { + row: import("../../../interfaces/TextRange").Range; + column: import("../../../interfaces/TextRange").Range; + }; + type: "type_parameters"; + } | { + children: {}[]; + text: string; + properties?: any; + comment?: { + markdown: import("xdoc-parser/src/XDocParser").RemarkNode; + documentation: Partial; + }; + position: import("../../../interfaces/TextRange").Range; + location: { + row: import("../../../interfaces/TextRange").Range; + column: import("../../../interfaces/TextRange").Range; + }; + type: "type_parameter"; + } | { + children: {}[]; + text: string; + properties?: any; + comment?: { + markdown: import("xdoc-parser/src/XDocParser").RemarkNode; + documentation: Partial; + }; + position: import("../../../interfaces/TextRange").Range; + location: { + row: import("../../../interfaces/TextRange").Range; + column: import("../../../interfaces/TextRange").Range; + }; + type: "object_type"; + }; + visitConstraint: (node: SyntaxNode) => { + children: {}[]; + text: string; + properties?: any; + comment?: { + markdown: import("xdoc-parser/src/XDocParser").RemarkNode; + documentation: Partial; + }; + position: import("../../../interfaces/TextRange").Range; + location: { + row: import("../../../interfaces/TextRange").Range; + column: import("../../../interfaces/TextRange").Range; + }; + type: string; + }; + visitInheritanceClause: (node: SyntaxNode) => { + children: {}[]; + text: string; + properties?: any; + comment?: { + markdown: import("xdoc-parser/src/XDocParser").RemarkNode; + documentation: Partial; + }; + position: import("../../../interfaces/TextRange").Range; + location: { + row: import("../../../interfaces/TextRange").Range; + column: import("../../../interfaces/TextRange").Range; + }; + type: string; + }; + visitTerminal: (node: SyntaxNode) => { + text: string; + properties?: any; + comment?: { + markdown: import("xdoc-parser/src/XDocParser").RemarkNode; + documentation: Partial; + }; + position: import("../../../interfaces/TextRange").Range; + location: { + row: import("../../../interfaces/TextRange").Range; + column: import("../../../interfaces/TextRange").Range; + }; + type: string; + }; +} diff --git a/build/src/lang/typescript/visitors/visitor.js b/build/src/lang/typescript/visitors/visitor.js new file mode 100644 index 0000000..57e7070 --- /dev/null +++ b/build/src/lang/typescript/visitors/visitor.js @@ -0,0 +1,159 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const Node_1 = require("../Node"); +const comment_1 = require("../../../utils/comment"); +const sibling_1 = require("../../../utils/sibling"); +const text_1 = require("../../../utils/text"); +const log_1 = require("../../../utils/log"); +const match_1 = require("../../../utils/match"); +const xdoc_parser_1 = require("xdoc-parser"); +class Node { + constructor(syntaxNode) { + this.syntaxNode = syntaxNode; + this.visit = (visitor) => { + return visitor.visitNode(this.syntaxNode); + }; + } +} +exports.Node = Node; +class TypeScriptVisitor { + constructor(source) { + this.ast = []; + /* Visitors */ + this.visitNode = (node) => { + switch (node.type) { + case 'program': + this.parent = node; + this.ast = this.visitProgram(node); + case 'comment': + return this.visitComment(node); + case 'MISSING': + case 'ERROR': + log_1.default.report(this.source, node, log_1.ErrorType.TreeSitterParseError); + break; + default: + /* Match other non-terminals */ + if (match_1.default(node, 'constraint')) { + return this.visitConstraint(node); + } + if (match_1.default(node, 'type_identifier', 'type_parameters', 'type_parameter', 'object_type')) { + return this.visitTypeNode(node); + } + if (match_1.default(node, 'extends_clause')) { + return this.visitInheritanceClause(node); + } + /* Match terminals */ + if (match_1.default(node, 'identifier', 'extends')) { + return this.visitTerminal(node); + } + log_1.default.report(this.source, node, log_1.ErrorType.NodeTypeNotYetSupported); + break; + } + }; + this.visitChildren = (nodes) => { + return nodes + .filter(child => !child.type.match(/[<>(){},;\[\]]/)) + .map(this.visitNode.bind(this)) + .filter(child => !!child); + }; + this.visitProgram = (node) => { + return this.visitChildren(node.children.filter(child => { + return match_1.default(child, 'comment'); + })); + }; + this.visitComment = (node) => { + if (comment_1.isJavaDocComment(this.source, node)) { + const nextSibling = sibling_1.sibling(node); + if (nextSibling) { + return Object.assign({ type: node.type }, Node_1.createASTNode(this.source, node), { context: this.visitContext(nextSibling, {}), comment: xdoc_parser_1.default(text_1.text(this.source, node)).parse() }); + } + } + }; + this.visitContext = (node, properties) => { + switch (node.type) { + case 'interface_declaration': + this.parent = node; + return this.visitInterfaceDeclaration(node, properties); + case 'call_signature': + return this.visitCallSignature(node, properties); + default: + log_1.default.report(this.source, node, log_1.ErrorType.NodeTypeNotYetSupported); + break; + } + }; + /* Declarations */ + this.visitInterfaceDeclaration = (node, properties) => { + // Shorten the node + return this.visitInterface(node, properties); + }; + this.visitInterface = (node, properties) => { + let children = node.children; + let extends_ = false, implements_ = false; + if (this.hasInheritance(node)) { + const inheritance = this.getInheritanceType(node); + extends_ = inheritance === 'extends'; + implements_ = inheritance === 'implements'; + } + Object.assign(properties, { + inheritance: { + implements: implements_, + extends: extends_ + } + }); + return Object.assign({ type: children.shift().type }, Node_1.createASTNode(this.source, node), { children: this.visitChildren(children), properties }); + }; + /* Signatures */ + this.visitCallSignature = (node, properties) => { + return Object.assign({ type: node.type }, Node_1.createASTNode(this.source, node), { children: this.visitChildren(node.children), properties }); + }; + /* Types */ + this.visitTypeNode = (node) => { + switch (node.type) { + case 'type_identifier': + return this.visitTerminal(node); + case 'type_parameters': + return Object.assign({ type: node.type }, Node_1.createASTNode(this.source, node), { children: this.visitChildren(node.children) }); + case 'type_parameter': + return Object.assign({ type: node.type }, Node_1.createASTNode(this.source, node), { children: this.visitChildren(node.children) }); + case 'object_type': + return Object.assign({ type: node.type }, Node_1.createASTNode(this.source, node), { children: this.visitChildren(node.children.filter(child => { + return match_1.default(child, 'comment'); + })) }); + default: + log_1.default.report(this.source, node, log_1.ErrorType.NodeTypeNotYetSupported); + break; + } + }; + /* Other non-terminals */ + this.visitConstraint = (node) => { + return Object.assign({ type: node.type }, Node_1.createASTNode(this.source, node), { children: this.visitChildren(node.children) }); + }; + this.visitInheritanceClause = (node) => { + return Object.assign({ type: node.type }, Node_1.createASTNode(this.source, node), { children: this.visitChildren(node.children) }); + }; + /* Terminals */ + this.visitTerminal = (node) => { + return Object.assign({ type: node.type }, Node_1.createASTNode(this.source, node)); + }; + this.source = source; + } + hasInheritance(node) { + return node.children + .filter(node => { + return node.type === 'extends' || node.type === 'implements'; + }).length > 0; + } + getInheritanceType(node) { + if (node.children.filter(node => node.type === 'extends')) { + return 'extends'; + } + if (node.children.filter(node => node.type === 'implements')) { + return 'implements'; + } + } + getAST() { + return this.ast; + } +} +exports.TypeScriptVisitor = TypeScriptVisitor; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvdmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtDQUF5RTtBQUN6RSxvREFBMEQ7QUFDMUQsb0RBQWlEO0FBRWpELDhDQUEyQztBQUMzQyw0Q0FBb0Q7QUFDcEQsZ0RBQXlDO0FBRXpDLDZDQUErQjtBQWEvQixNQUFhLElBQUk7SUFDZixZQUFtQixVQUFzQjtRQUF0QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3pDLFVBQUssR0FBRyxDQUFDLE9BQW9CLEVBQWUsRUFBRTtZQUM1QyxPQUFPLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQTtJQUg0QyxDQUFDO0NBSS9DO0FBTEQsb0JBS0M7QUFFRCxNQUFhLGlCQUFpQjtJQUk1QixZQUFZLE1BQWM7UUFIbEIsUUFBRyxHQUFHLEVBQUUsQ0FBQTtRQTBCaEIsZUFBZTtRQUNmLGNBQVMsR0FBRyxDQUNWLElBQWdCLEVBQ2hCLEVBQUU7WUFDRixRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ2pCLEtBQUssU0FBUztvQkFDWixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztvQkFDbkIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNyQyxLQUFLLFNBQVM7b0JBQ1osT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNqQyxLQUFLLFNBQVMsQ0FBQztnQkFDZixLQUFLLE9BQU87b0JBQ1YsYUFBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxlQUFTLENBQUMsb0JBQW9CLENBQUMsQ0FBQztvQkFDOUQsTUFBTTtnQkFDUjtvQkFFRSwrQkFBK0I7b0JBRS9CLElBQUksZUFBSyxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsRUFBRTt3QkFDN0IsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFBO3FCQUNsQztvQkFFRCxJQUFJLGVBQUssQ0FBQyxJQUFJLEVBQ1osaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQ3RELGFBQWEsQ0FDZCxFQUFFO3dCQUNELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtxQkFDaEM7b0JBRUQsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLEVBQUU7d0JBQ2pDLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUMxQztvQkFFRCxxQkFBcUI7b0JBRXJCLElBQUksZUFBSyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsU0FBUyxDQUFDLEVBQUU7d0JBQ3hDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDakM7b0JBRUQsYUFBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxlQUFTLENBQUMsdUJBQXVCLENBQUMsQ0FBQztvQkFFakUsTUFBTTthQUNUO1FBQ0gsQ0FBQyxDQUFBO1FBRUQsa0JBQWEsR0FBRyxDQUFDLEtBQW1CLEVBQUUsRUFBRTtZQUN0QyxPQUFPLEtBQUs7aUJBQ1QsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2lCQUNwRCxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzlCLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUE7UUFFRCxpQkFBWSxHQUFHLENBQUMsSUFBZ0IsRUFBRSxFQUFFO1lBQ2xDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDckQsT0FBTyxlQUFLLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ2pDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDTixDQUFDLENBQUE7UUFFRCxpQkFBWSxHQUFHLENBQUMsSUFBZ0IsRUFBRSxFQUFFO1lBQ2xDLElBQUksMEJBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDdkMsTUFBTSxXQUFXLEdBQUcsaUJBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbEMsSUFBSSxXQUFXLEVBQUU7b0JBQ2YsdUJBQ0UsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLElBQ1osb0JBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUNuQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLEVBQzNDLE9BQU8sRUFBRSxxQkFBSSxDQUFDLFdBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQy9DO2lCQUNGO2FBQ0Y7UUFDSCxDQUFDLENBQUE7UUFFRCxpQkFBWSxHQUFHLENBQUMsSUFBZ0IsRUFBRSxVQUFvQyxFQUFFLEVBQUU7WUFDeEUsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNqQixLQUFLLHVCQUF1QjtvQkFDMUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7b0JBQ25CLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQTtnQkFDekQsS0FBSyxnQkFBZ0I7b0JBQ25CLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDbkQ7b0JBQ0UsYUFBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxlQUFTLENBQUMsdUJBQXVCLENBQUMsQ0FBQztvQkFDakUsTUFBTTthQUNUO1FBQ0gsQ0FBQyxDQUFBO1FBRUQsa0JBQWtCO1FBRWxCLDhCQUF5QixHQUFHLENBQzFCLElBQWdCLEVBQ2hCLFVBQW9DLEVBQ3BDLEVBQUU7WUFDRixtQkFBbUI7WUFDbkIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQTtRQUM5QyxDQUFDLENBQUE7UUFFRCxtQkFBYyxHQUFHLENBQUMsSUFBZ0IsRUFBRSxVQUFtQyxFQUFFLEVBQUU7WUFDekUsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUM3QixJQUFJLFFBQVEsR0FBRyxLQUFLLEVBQUUsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUMxQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzdCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFDakQsUUFBUSxHQUFHLFdBQVcsS0FBSyxTQUFTLENBQUM7Z0JBQ3JDLFdBQVcsR0FBRyxXQUFXLEtBQUssWUFBWSxDQUFDO2FBQzVDO1lBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUU7Z0JBQ3hCLFdBQVcsRUFBRTtvQkFDWCxVQUFVLEVBQUUsV0FBVztvQkFDdkIsT0FBTyxFQUFFLFFBQVE7aUJBQ0M7YUFDckIsQ0FBQyxDQUFBO1lBRUYsdUJBQ0UsSUFBSSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLElBQ3hCLG9CQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFDbkMsUUFBUSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQ3RDLFVBQVUsSUFDWDtRQUNILENBQUMsQ0FBQTtRQUVELGdCQUFnQjtRQUNoQix1QkFBa0IsR0FBRyxDQUFDLElBQWdCLEVBQUUsVUFBbUMsRUFBRSxFQUFFO1lBQzdFLHVCQUNFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxJQUNaLG9CQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFDbkMsUUFBUSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUMzQyxVQUFVLElBQ1g7UUFDSCxDQUFDLENBQUE7UUFFRCxXQUFXO1FBRVgsa0JBQWEsR0FBRyxDQUFDLElBQWdCLEVBQUUsRUFBRTtZQUNuQyxRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ2pCLEtBQUssaUJBQWlCO29CQUNwQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQ2pDLEtBQUssaUJBQWlCO29CQUNwQix1QkFDRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksSUFDWixvQkFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQ25DLFFBQVEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFDNUM7Z0JBQ0gsS0FBSyxnQkFBZ0I7b0JBQ25CLHVCQUNFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxJQUNaLG9CQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFDbkMsUUFBUSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUM1QztnQkFDSCxLQUFLLGFBQWE7b0JBQ2hCLHVCQUNFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxJQUNaLG9CQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFDbkMsUUFBUSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUU7NEJBQ3hELE9BQU8sZUFBSyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQTt3QkFDaEMsQ0FBQyxDQUFDLENBQUMsSUFDSjtnQkFDSDtvQkFDRSxhQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO29CQUNqRSxNQUFNO2FBRVQ7UUFDSCxDQUFDLENBQUE7UUFFRCx5QkFBeUI7UUFFekIsb0JBQWUsR0FBRyxDQUFDLElBQWdCLEVBQUUsRUFBRTtZQUNyQyx1QkFDRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksSUFDWixvQkFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQ25DLFFBQVEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFDNUM7UUFDSCxDQUFDLENBQUE7UUFFRCwyQkFBc0IsR0FBRyxDQUFDLElBQWdCLEVBQUUsRUFBRTtZQUM1Qyx1QkFDRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksSUFDWixvQkFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQ25DLFFBQVEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFDNUM7UUFDSCxDQUFDLENBQUE7UUFFRCxlQUFlO1FBRWYsa0JBQWEsR0FBRyxDQUFDLElBQWdCLEVBQUUsRUFBRTtZQUNuQyx1QkFDRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksSUFDWixvQkFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQ3BDO1FBQ0gsQ0FBQyxDQUFBO1FBaE5DLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFDTyxjQUFjLENBQUMsSUFBZ0I7UUFDckMsT0FBTyxJQUFJLENBQUMsUUFBUTthQUNqQixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDYixPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUE7SUFDakIsQ0FBQztJQUVPLGtCQUFrQixDQUFDLElBQWdCO1FBQ3pDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxFQUFFO1lBQ3pELE9BQU8sU0FBUyxDQUFDO1NBQ2xCO1FBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLEVBQUU7WUFDNUQsT0FBTyxZQUFZLENBQUM7U0FDckI7SUFDSCxDQUFDO0lBRUQsTUFBTTtRQUNKLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQixDQUFDO0NBNExGO0FBdE5ELDhDQXNOQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUFTVE5vZGUsIE5vZGVQcm9wZXJ0aWVzLCBOb2RlSW5oZXJpdGFuY2UgfSBmcm9tIFwiLi4vTm9kZVwiO1xuaW1wb3J0IHsgaXNKYXZhRG9jQ29tbWVudCB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9jb21tZW50XCI7XG5pbXBvcnQgeyBzaWJsaW5nIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3NpYmxpbmdcIjtcbmltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcbmltcG9ydCB7IHRleHQgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvdGV4dFwiO1xuaW1wb3J0IGxvZywgeyBFcnJvclR5cGUgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbG9nXCI7XG5pbXBvcnQgbWF0Y2ggZnJvbSBcIi4uLy4uLy4uL3V0aWxzL21hdGNoXCI7XG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi8uLi8uLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuaW1wb3J0IHhkb2MgZnJvbSBcInhkb2MtcGFyc2VyXCI7XG5cblxuZXhwb3J0IGludGVyZmFjZSBUcmVlU2l0dGVyTm9kZSB7XG4gIHZpc2l0KHZpc2l0b3I6IE5vZGVWaXNpdG9yKTogdm9pZFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vZGVWaXNpdG9yIHtcbiAgZ2V0QVNUKCk6IG9iamVjdFtdXG4gIHZpc2l0Tm9kZShub2RlOiBTeW50YXhOb2RlKTogYW55XG4gIHZpc2l0Q2hpbGRyZW4obm9kZXM6IFN5bnRheE5vZGVbXSk6IGFueVxufVxuXG5leHBvcnQgY2xhc3MgTm9kZSBpbXBsZW1lbnRzIFRyZWVTaXR0ZXJOb2RlIHtcbiAgY29uc3RydWN0b3IocHVibGljIHN5bnRheE5vZGU6IFN5bnRheE5vZGUpIHsgfVxuICB2aXNpdCA9ICh2aXNpdG9yOiBOb2RlVmlzaXRvcik6IE5vZGVWaXNpdG9yID0+IHtcbiAgICByZXR1cm4gdmlzaXRvci52aXNpdE5vZGUodGhpcy5zeW50YXhOb2RlKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHlwZVNjcmlwdFZpc2l0b3IgaW1wbGVtZW50cyBOb2RlVmlzaXRvciB7XG4gIHByaXZhdGUgYXN0ID0gW11cbiAgcHJpdmF0ZSBzb3VyY2U6IFNvdXJjZVxuICBwcml2YXRlIHBhcmVudDogU3ludGF4Tm9kZVxuICBjb25zdHJ1Y3Rvcihzb3VyY2U6IFNvdXJjZSkge1xuICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICB9XG4gIHByaXZhdGUgaGFzSW5oZXJpdGFuY2Uobm9kZTogU3ludGF4Tm9kZSkge1xuICAgIHJldHVybiBub2RlLmNoaWxkcmVuXG4gICAgICAuZmlsdGVyKG5vZGUgPT4ge1xuICAgICAgICByZXR1cm4gbm9kZS50eXBlID09PSAnZXh0ZW5kcycgfHwgbm9kZS50eXBlID09PSAnaW1wbGVtZW50cyc7XG4gICAgICB9KS5sZW5ndGggPiAwXG4gIH1cblxuICBwcml2YXRlIGdldEluaGVyaXRhbmNlVHlwZShub2RlOiBTeW50YXhOb2RlKSB7XG4gICAgaWYgKG5vZGUuY2hpbGRyZW4uZmlsdGVyKG5vZGUgPT4gbm9kZS50eXBlID09PSAnZXh0ZW5kcycpKSB7XG4gICAgICByZXR1cm4gJ2V4dGVuZHMnO1xuICAgIH1cblxuICAgIGlmIChub2RlLmNoaWxkcmVuLmZpbHRlcihub2RlID0+IG5vZGUudHlwZSA9PT0gJ2ltcGxlbWVudHMnKSkge1xuICAgICAgcmV0dXJuICdpbXBsZW1lbnRzJztcbiAgICB9XG4gIH1cblxuICBnZXRBU1QoKTogb2JqZWN0W10ge1xuICAgIHJldHVybiB0aGlzLmFzdDtcbiAgfVxuICAvKiBWaXNpdG9ycyAgKi9cbiAgdmlzaXROb2RlID0gKFxuICAgIG5vZGU6IFN5bnRheE5vZGVcbiAgKSA9PiB7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgJ3Byb2dyYW0nOlxuICAgICAgICB0aGlzLnBhcmVudCA9IG5vZGU7XG4gICAgICAgIHRoaXMuYXN0ID0gdGhpcy52aXNpdFByb2dyYW0obm9kZSk7XG4gICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRDb21tZW50KG5vZGUpO1xuICAgICAgY2FzZSAnTUlTU0lORyc6XG4gICAgICBjYXNlICdFUlJPUic6XG4gICAgICAgIGxvZy5yZXBvcnQodGhpcy5zb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5UcmVlU2l0dGVyUGFyc2VFcnJvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcblxuICAgICAgICAvKiBNYXRjaCBvdGhlciBub24tdGVybWluYWxzICovXG5cbiAgICAgICAgaWYgKG1hdGNoKG5vZGUsICdjb25zdHJhaW50JykpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdENvbnN0cmFpbnQobm9kZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtYXRjaChub2RlLFxuICAgICAgICAgICd0eXBlX2lkZW50aWZpZXInLCAndHlwZV9wYXJhbWV0ZXJzJywgJ3R5cGVfcGFyYW1ldGVyJyxcbiAgICAgICAgICAnb2JqZWN0X3R5cGUnXG4gICAgICAgICkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdFR5cGVOb2RlKG5vZGUpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWF0Y2gobm9kZSwgJ2V4dGVuZHNfY2xhdXNlJykpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdEluaGVyaXRhbmNlQ2xhdXNlKG5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogTWF0Y2ggdGVybWluYWxzICovXG5cbiAgICAgICAgaWYgKG1hdGNoKG5vZGUsICdpZGVudGlmaWVyJywgJ2V4dGVuZHMnKSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnZpc2l0VGVybWluYWwobm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQpO1xuXG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZpc2l0Q2hpbGRyZW4gPSAobm9kZXM6IFN5bnRheE5vZGVbXSkgPT4ge1xuICAgIHJldHVybiBub2Rlc1xuICAgICAgLmZpbHRlcihjaGlsZCA9PiAhY2hpbGQudHlwZS5tYXRjaCgvWzw+KCl7fSw7XFxbXFxdXS8pKVxuICAgICAgLm1hcCh0aGlzLnZpc2l0Tm9kZS5iaW5kKHRoaXMpKVxuICAgICAgLmZpbHRlcihjaGlsZCA9PiAhIWNoaWxkKTtcbiAgfVxuXG4gIHZpc2l0UHJvZ3JhbSA9IChub2RlOiBTeW50YXhOb2RlKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMudmlzaXRDaGlsZHJlbihub2RlLmNoaWxkcmVuLmZpbHRlcihjaGlsZCA9PiB7XG4gICAgICByZXR1cm4gbWF0Y2goY2hpbGQsICdjb21tZW50Jyk7XG4gICAgfSkpO1xuICB9XG5cbiAgdmlzaXRDb21tZW50ID0gKG5vZGU6IFN5bnRheE5vZGUpID0+IHtcbiAgICBpZiAoaXNKYXZhRG9jQ29tbWVudCh0aGlzLnNvdXJjZSwgbm9kZSkpIHtcbiAgICAgIGNvbnN0IG5leHRTaWJsaW5nID0gc2libGluZyhub2RlKTtcbiAgICAgIGlmIChuZXh0U2libGluZykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IG5vZGUudHlwZSxcbiAgICAgICAgICAuLi5jcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlKSxcbiAgICAgICAgICBjb250ZXh0OiB0aGlzLnZpc2l0Q29udGV4dChuZXh0U2libGluZywge30pLFxuICAgICAgICAgIGNvbW1lbnQ6IHhkb2ModGV4dCh0aGlzLnNvdXJjZSwgbm9kZSkpLnBhcnNlKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZpc2l0Q29udGV4dCA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz4pID0+IHtcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSAnaW50ZXJmYWNlX2RlY2xhcmF0aW9uJzpcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBub2RlO1xuICAgICAgICByZXR1cm4gdGhpcy52aXNpdEludGVyZmFjZURlY2xhcmF0aW9uKG5vZGUsIHByb3BlcnRpZXMpXG4gICAgICBjYXNlICdjYWxsX3NpZ25hdHVyZSc6XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0Q2FsbFNpZ25hdHVyZShub2RlLCBwcm9wZXJ0aWVzKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGxvZy5yZXBvcnQodGhpcy5zb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFlldFN1cHBvcnRlZCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qIERlY2xhcmF0aW9ucyAqL1xuXG4gIHZpc2l0SW50ZXJmYWNlRGVjbGFyYXRpb24gPSAoXG4gICAgbm9kZTogU3ludGF4Tm9kZSxcbiAgICBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz5cbiAgKSA9PiB7XG4gICAgLy8gU2hvcnRlbiB0aGUgbm9kZVxuICAgIHJldHVybiB0aGlzLnZpc2l0SW50ZXJmYWNlKG5vZGUsIHByb3BlcnRpZXMpXG4gIH1cblxuICB2aXNpdEludGVyZmFjZSA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzOiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPikgPT4ge1xuICAgIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XG4gICAgbGV0IGV4dGVuZHNfID0gZmFsc2UsIGltcGxlbWVudHNfID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuaGFzSW5oZXJpdGFuY2Uobm9kZSkpIHtcbiAgICAgIGNvbnN0IGluaGVyaXRhbmNlID0gdGhpcy5nZXRJbmhlcml0YW5jZVR5cGUobm9kZSlcbiAgICAgIGV4dGVuZHNfID0gaW5oZXJpdGFuY2UgPT09ICdleHRlbmRzJztcbiAgICAgIGltcGxlbWVudHNfID0gaW5oZXJpdGFuY2UgPT09ICdpbXBsZW1lbnRzJztcbiAgICB9XG4gICAgT2JqZWN0LmFzc2lnbihwcm9wZXJ0aWVzLCB7XG4gICAgICBpbmhlcml0YW5jZToge1xuICAgICAgICBpbXBsZW1lbnRzOiBpbXBsZW1lbnRzXyxcbiAgICAgICAgZXh0ZW5kczogZXh0ZW5kc19cbiAgICAgIH0gYXMgTm9kZUluaGVyaXRhbmNlXG4gICAgfSlcblxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBjaGlsZHJlbi5zaGlmdCgpLnR5cGUsXG4gICAgICAuLi5jcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlKSxcbiAgICAgIGNoaWxkcmVuOiB0aGlzLnZpc2l0Q2hpbGRyZW4oY2hpbGRyZW4pLFxuICAgICAgcHJvcGVydGllc1xuICAgIH1cbiAgfVxuXG4gIC8qIFNpZ25hdHVyZXMgKi9cbiAgdmlzaXRDYWxsU2lnbmF0dXJlID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM6IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+KSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IG5vZGUudHlwZSxcbiAgICAgIC4uLmNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUpLFxuICAgICAgY2hpbGRyZW46IHRoaXMudmlzaXRDaGlsZHJlbihub2RlLmNoaWxkcmVuKSxcbiAgICAgIHByb3BlcnRpZXNcbiAgICB9XG4gIH1cblxuICAvKiBUeXBlcyAqL1xuXG4gIHZpc2l0VHlwZU5vZGUgPSAobm9kZTogU3ludGF4Tm9kZSkgPT4ge1xuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICBjYXNlICd0eXBlX2lkZW50aWZpZXInOlxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdFRlcm1pbmFsKG5vZGUpXG4gICAgICBjYXNlICd0eXBlX3BhcmFtZXRlcnMnOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IG5vZGUudHlwZSxcbiAgICAgICAgICAuLi5jcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlKSxcbiAgICAgICAgICBjaGlsZHJlbjogdGhpcy52aXNpdENoaWxkcmVuKG5vZGUuY2hpbGRyZW4pLFxuICAgICAgICB9XG4gICAgICBjYXNlICd0eXBlX3BhcmFtZXRlcic6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogbm9kZS50eXBlLFxuICAgICAgICAgIC4uLmNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUpLFxuICAgICAgICAgIGNoaWxkcmVuOiB0aGlzLnZpc2l0Q2hpbGRyZW4obm9kZS5jaGlsZHJlbilcbiAgICAgICAgfVxuICAgICAgY2FzZSAnb2JqZWN0X3R5cGUnOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IG5vZGUudHlwZSxcbiAgICAgICAgICAuLi5jcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlKSxcbiAgICAgICAgICBjaGlsZHJlbjogdGhpcy52aXNpdENoaWxkcmVuKG5vZGUuY2hpbGRyZW4uZmlsdGVyKGNoaWxkID0+IHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaChjaGlsZCwgJ2NvbW1lbnQnKVxuICAgICAgICAgIH0pKVxuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQpO1xuICAgICAgICBicmVhaztcblxuICAgIH1cbiAgfVxuXG4gIC8qIE90aGVyIG5vbi10ZXJtaW5hbHMgKi9cblxuICB2aXNpdENvbnN0cmFpbnQgPSAobm9kZTogU3ludGF4Tm9kZSkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBub2RlLnR5cGUsXG4gICAgICAuLi5jcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlKSxcbiAgICAgIGNoaWxkcmVuOiB0aGlzLnZpc2l0Q2hpbGRyZW4obm9kZS5jaGlsZHJlbilcbiAgICB9XG4gIH1cblxuICB2aXNpdEluaGVyaXRhbmNlQ2xhdXNlID0gKG5vZGU6IFN5bnRheE5vZGUpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogbm9kZS50eXBlLFxuICAgICAgLi4uY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSksXG4gICAgICBjaGlsZHJlbjogdGhpcy52aXNpdENoaWxkcmVuKG5vZGUuY2hpbGRyZW4pXG4gICAgfVxuICB9XG5cbiAgLyogVGVybWluYWxzICovXG5cbiAgdmlzaXRUZXJtaW5hbCA9IChub2RlOiBTeW50YXhOb2RlKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IG5vZGUudHlwZSxcbiAgICAgIC4uLmNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUpLFxuICAgIH1cbiAgfVxufSJdfQ== \ No newline at end of file diff --git a/build/src/lang/typescript/walk.d.ts b/build/src/lang/typescript/walk.d.ts new file mode 100644 index 0000000..99c5165 --- /dev/null +++ b/build/src/lang/typescript/walk.d.ts @@ -0,0 +1,3 @@ +import { SyntaxNode } from "tree-sitter"; +import { Node } from "./visitors/visitor"; +export default function walk(node: SyntaxNode): Node; diff --git a/build/src/lang/typescript/walk.js b/build/src/lang/typescript/walk.js new file mode 100644 index 0000000..3de9c97 --- /dev/null +++ b/build/src/lang/typescript/walk.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const visitor_1 = require("./visitors/visitor"); +function walk(node) { + let node_ = new visitor_1.Node(node); + node_.syntaxNode.children.map(child => walk(child)); + return node_; +} +exports.default = walk; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Fsay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvd2Fsay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLGdEQUEwQztBQUUxQyxTQUF3QixJQUFJLENBQUMsSUFBZ0I7SUFDM0MsSUFBSSxLQUFLLEdBQUcsSUFBSSxjQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsS0FBSyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7SUFDbkQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBSkQsdUJBSUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgeyBOb2RlIH0gZnJvbSBcIi4vdmlzaXRvcnMvdmlzaXRvclwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB3YWxrKG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgbGV0IG5vZGVfID0gbmV3IE5vZGUobm9kZSk7XG4gIG5vZGVfLnN5bnRheE5vZGUuY2hpbGRyZW4ubWFwKGNoaWxkID0+IHdhbGsoY2hpbGQpKVxuICByZXR1cm4gbm9kZV87XG59Il19 \ No newline at end of file diff --git a/build/src/utils/match.js b/build/src/utils/match.js index 1805ad5..36fca43 100644 --- a/build/src/utils/match.js +++ b/build/src/utils/match.js @@ -9,8 +9,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); * ``` */ function match(node, ...types) { - const matches = types.map(type => type === node.type); - return node && matches.includes(true); + const matches = types.map(type => node && type === node.type); + return matches.includes(true); } exports.default = match; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvbWF0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQTs7Ozs7OztHQU9HO0FBQ0gsU0FBd0IsS0FBSyxDQUFDLElBQWdCLEVBQUUsR0FBRyxLQUFlO0lBQ2hFLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RELE9BQU8sSUFBSSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUhELHdCQUdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIG5vZGUgaXMgYSBjZXJ0YWluIHR5cGUuXG4gKiBgYGBcbiAqIEBwYXJhbSBub2RlOiBTeW50YXhOb2RlIC0gVGhlIG5vZGUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB0eXBlOiBzdHJpbmcgIC0gVGhlIG5vZGUgdHlwZSB0byBtYXRjaC5cbiAqIEByZXR1cm46IGJvb2xlYW5cbiAqIGBgYFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYXRjaChub2RlOiBTeW50YXhOb2RlLCAuLi50eXBlczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgY29uc3QgbWF0Y2hlcyA9IHR5cGVzLm1hcCh0eXBlID0+IHR5cGUgPT09IG5vZGUudHlwZSk7XG4gIHJldHVybiBub2RlICYmIG1hdGNoZXMuaW5jbHVkZXModHJ1ZSk7XG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvbWF0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQTs7Ozs7OztHQU9HO0FBQ0gsU0FBd0IsS0FBSyxDQUFDLElBQWdCLEVBQUUsR0FBRyxLQUFlO0lBQ2hFLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5RCxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQUhELHdCQUdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIG5vZGUgaXMgYSBjZXJ0YWluIHR5cGUuXG4gKiBgYGBcbiAqIEBwYXJhbSBub2RlOiBTeW50YXhOb2RlIC0gVGhlIG5vZGUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB0eXBlOiBzdHJpbmcgIC0gVGhlIG5vZGUgdHlwZSB0byBtYXRjaC5cbiAqIEByZXR1cm46IGJvb2xlYW5cbiAqIGBgYFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYXRjaChub2RlOiBTeW50YXhOb2RlLCAuLi50eXBlczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgY29uc3QgbWF0Y2hlcyA9IHR5cGVzLm1hcCh0eXBlID0+IG5vZGUgJiYgdHlwZSA9PT0gbm9kZS50eXBlKTtcbiAgcmV0dXJuIG1hdGNoZXMuaW5jbHVkZXModHJ1ZSk7XG59Il19 \ No newline at end of file diff --git a/build/src/utils/sibling.d.ts b/build/src/utils/sibling.d.ts new file mode 100644 index 0000000..692d7b0 --- /dev/null +++ b/build/src/utils/sibling.d.ts @@ -0,0 +1,2 @@ +import { SyntaxNode } from "tree-sitter"; +export declare function sibling(node: SyntaxNode, children?: SyntaxNode[], filter?: () => boolean): SyntaxNode; diff --git a/build/src/utils/sibling.js b/build/src/utils/sibling.js new file mode 100644 index 0000000..fe01442 --- /dev/null +++ b/build/src/utils/sibling.js @@ -0,0 +1,15 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function sibling(node, children, filter) { + if (node) { + if (children) { + const index = filter ? + children.filter(filter).indexOf(node) : + children.indexOf(node); + return children[index + 1]; + } + return node.nextSibling; + } +} +exports.sibling = sibling; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2libGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9zaWJsaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsU0FBZ0IsT0FBTyxDQUNyQixJQUFnQixFQUNoQixRQUF1QixFQUN2QixNQUFzQjtJQUV0QixJQUFJLElBQUksRUFBRTtRQUNSLElBQUksUUFBUSxFQUFFO1lBQ1osTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUM7Z0JBQ3BCLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsT0FBTyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzVCO1FBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0tBQ3pCO0FBQ0gsQ0FBQztBQWRELDBCQWNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuXG5leHBvcnQgZnVuY3Rpb24gc2libGluZyhcbiAgbm9kZTogU3ludGF4Tm9kZSxcbiAgY2hpbGRyZW4/OiBTeW50YXhOb2RlW10sXG4gIGZpbHRlcj86ICgpID0+IGJvb2xlYW5cbikge1xuICBpZiAobm9kZSkge1xuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgY29uc3QgaW5kZXggPSBmaWx0ZXIgP1xuICAgICAgICBjaGlsZHJlbi5maWx0ZXIoZmlsdGVyKS5pbmRleE9mKG5vZGUpIDpcbiAgICAgICAgY2hpbGRyZW4uaW5kZXhPZihub2RlKTtcbiAgICAgIHJldHVybiBjaGlsZHJlbltpbmRleCArIDFdO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZS5uZXh0U2libGluZztcbiAgfVxufSJdfQ== \ No newline at end of file diff --git a/example.ts b/example.ts index 15bf6f2..190a6c0 100644 --- a/example.ts +++ b/example.ts @@ -6,7 +6,13 @@ interface A { /** * Description */ -interface B { +interface B extends A { + /** + * description + */ (x: string): void + /** + * description + */ func (x: string): void } \ No newline at end of file diff --git a/src/lang/typescript/Node.ts b/src/lang/typescript/Node.ts index f712b58..fb4868b 100644 --- a/src/lang/typescript/Node.ts +++ b/src/lang/typescript/Node.ts @@ -8,30 +8,25 @@ import TextRange from "../../interfaces/TextRange"; import xdoc from 'xdoc-parser'; -export interface Node extends TextRange { +export interface ASTNode extends TextRange { text: string, - properties?: Partial - xdoc?: { + properties?: any + comment?: { markdown: RemarkNode, documentation: Partial } } -export function createNode( - file: Source, +export function createASTNode( + source: Source, node: SyntaxNode, - properties?: Partial, document?: boolean, -): Node { +): ASTNode { - let node_ = { ...range(node), text: text(file, node) } + let node_ = { ...range(node), text: text(source, node) } - if (properties) { - node_ = Object.assign(node_, { properties }) - } - if (document) { - node_ = Object.assign(node_, { xdoc: xdoc(node_.text).parse() }) + node_ = Object.assign(node_, { comment: xdoc(node_.text).parse() }) } return node_; } diff --git a/src/lang/typescript/index.ts b/src/lang/typescript/index.ts index 5ea4625..6befba6 100644 --- a/src/lang/typescript/index.ts +++ b/src/lang/typescript/index.ts @@ -2,8 +2,8 @@ import * as Parser from 'tree-sitter'; import * as TypeScript from 'tree-sitter-typescript'; import IParser from '../../interfaces/IParser'; import Source from '../../interfaces/Source'; -import { visitProgram } from './visitors/program.visitor'; -import { walk } from './walk'; +import walk from './walk'; +import { TypeScriptVisitor } from './visitors/visitor'; /** @@ -18,20 +18,21 @@ import { walk } from './walk'; * ``` */ export default class TypeScriptParser implements IParser { - private file: Source; + private source: Source; private options: any; private parser: Parser; constructor(file: Source, options: any) { - this.file = file; + this.source = file; Object.assign(this.options = {}, options || {}); this.parser = new Parser(); this.parser.setLanguage(TypeScript); } parse = () => { - const tree = this.parser.parse(this.file.text); + const tree = this.parser.parse(this.source.text); if (tree.rootNode.type === "program") { - walk(tree.rootNode); - // return visitProgram(this.file, tree.rootNode) + const visitor = new TypeScriptVisitor(this.source); + walk(tree.rootNode).visit(visitor); + return visitor.getAST(); } } } diff --git a/src/lang/typescript/visitors/class.visitor.ts b/src/lang/typescript/visitors/class.visitor.ts deleted file mode 100644 index 061c3b2..0000000 --- a/src/lang/typescript/visitors/class.visitor.ts +++ /dev/null @@ -1,167 +0,0 @@ -import { isJavaDocComment } from "../../../utils/comment"; -import { NodeProperties, createNode } from "../node"; -import { SyntaxNode } from "tree-sitter"; -import log, { ErrorType } from "../../../utils/log"; -import match from "../../../utils/match"; -import Source from "../../../interfaces/Source"; -import visitTypeParameters, { visitTypeIdentifier, visitType } from "./type.visitor"; -import { visitCallSignature } from "./signature.visitor"; - -export function visitClass( - source: Source, - node: SyntaxNode, - comment: SyntaxNode, - properties?: Partial -) { - let children = node.children; - // Remove 'class' from the array - children.shift() - const identifier = createNode(source, children.shift()) - const visited = children.map(child => { - switch (child.type) { - case 'type_parameters': - return visitTypeParameters(source, child) - case 'class_heritage': - return visitClassHeritage(source, child) - case 'class_body': - return visitClassBody(source, child) - default: - log.report(source, node, ErrorType.NodeTypeNotYetSupported); - break; - } - }); - - const type_parameters = visited.filter(child => child.type === 'type_parameters').shift() - const heritage = visited.filter(child => child.type === 'class_heritage').shift() - const body = visited.filter(child => child.type === 'class_body').shift(); - - return { - type: 'class', - identifier, - type_parameters, - heritage, - body, - properties, - comment: createNode(source, comment, null, true), - context: createNode(source, node) - } -} - -export function visitClassHeritage(source: Source, node: SyntaxNode) { - let heritage_clause = node.children.shift(); - let heritage_clause_children = heritage_clause.children; - // Remove the heritage type ('implements' or 'extends') - let heritage_type = heritage_clause_children.shift(); - - return { - type: 'class_heritage', - heritage_type: heritage_type.type, - context: createNode(source, node), - // A heritage is either 'implements' or 'extends' - heritages: heritage_clause_children - .filter(child => child.type === 'type_identifier') - .map(child => visitTypeIdentifier(source, child)) - } -} - -export function visitClassBody(source: Source, node: SyntaxNode) { - - const methods = [] - const properties = [] - node.children - .filter(child => !child.type.match(/[{}]/)) - .forEach(child => { - const nextSibling = child.nextSibling; - if (match(child, 'comment') && isJavaDocComment(source, child)) { - if (nextSibling) { - switch (nextSibling.type) { - case 'method_definition': - methods.push(visitMethodDefinition(source, nextSibling, child)); - break; - case 'public_field_definition': - properties.push(visitPublicFieldDefinition(source, nextSibling, child)); - break; - default: - log.report(source, nextSibling, ErrorType.NodeTypeNotYetSupported); - break; - } - } - } - }); - - return { - type: 'class_body', - context: createNode(source, node), - methods, - properties - } -} - -export function visitMethodDefinition(source: Source, node: SyntaxNode, comment: SyntaxNode) { - let method_definition = node.children; - let accessibility, - isAsync = false, - identifier, - type_parameters, - formal_parameters, - type_annotation; - - if (match(method_definition[0], 'async')) { - isAsync = true; - method_definition.shift(); - } - - if (match(method_definition[0], 'accessibility_modifier')) { - accessibility = createNode(source, method_definition.shift()) - } - - if (match(method_definition[0], 'property_identifier')) { - identifier = createNode(source, method_definition.shift()) - } - - if (match(method_definition[0], 'call_signature')) { - const call_signature = visitCallSignature(source, method_definition.shift()) - type_parameters = call_signature.type_parameters; - formal_parameters = call_signature.formal_parameters; - type_annotation = call_signature.type_annotation; - } - return { - type: 'method', - context: createNode(source, node), - comment: createNode(source, node, null, true), - accessibility, - async: isAsync, - identifier, - type_parameters, - formal_parameters, - type_annotation - } -} - -export function visitPublicFieldDefinition(source: Source, node: SyntaxNode, comment: SyntaxNode) { - let public_field_definition = node.children; - let accessibility, - identifier, - type_annotation; - - if (match(public_field_definition[0], 'accessibility_modifier')) { - accessibility = createNode(source, public_field_definition.shift()); - } - - if (match(public_field_definition[0], 'property_identifier')) { - identifier = createNode(source, public_field_definition.shift()); - } - - if (match(public_field_definition[0], 'type_annotation')) { - let type = public_field_definition.shift().children[1]; - type_annotation = visitType(source, type); - } - return { - type: 'property', - context: createNode(source, node), - comment: createNode(source, comment, null, true), - identifier, - accessibility, - type_annotation - } -} \ No newline at end of file diff --git a/src/lang/typescript/visitors/declaration.visitor.ts b/src/lang/typescript/visitors/declaration.visitor.ts deleted file mode 100644 index 68b92e6..0000000 --- a/src/lang/typescript/visitors/declaration.visitor.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { SyntaxNode } from "tree-sitter"; -import { NodeProperties, createNode } from "../node"; -import Source from "../../../interfaces/Source"; -import log, { ErrorType } from "../../../utils/log"; -import match from "../../../utils/match"; -import visitTypeParameters, { visitTypeIdentifier, visitObjectType } from "./type.visitor"; - - - -export function visitDeclaration( - source: Source, - node: SyntaxNode, - comment: SyntaxNode, - properties: Partial -) { - switch (node.type) { - case 'interface_declaration': - return visitInterfaceDeclaration(source, node, comment, properties); - case 'lexical_declaration': - return visitLexicalDeclaration(source, node, comment, properties); - default: - log.report(source, node, ErrorType.NodeTypeNotYetSupported); - break; - } -} - -export function visitInterfaceDeclaration( - source: Source, - node: SyntaxNode, - comment: SyntaxNode, - properties: Partial -) { - let children = node.children, - type_identifier, - type_parameters, - body; - - if (match(children[0], 'interface')) { - children.shift(); - } - - if (match(children[0], 'type_identifier')) { - type_identifier = visitTypeIdentifier(source, children.shift()); - } - - if (match(children[0], 'type_parameters')) { - type_parameters = visitTypeParameters(source, children.shift()); - } - - if (match(children[0], 'object_type')) { - body = visitObjectType(source, children.shift()); - } - -} - -export function visitLexicalDeclaration( - source: Source, - node: SyntaxNode, - comment: SyntaxNode, - properties: Partial -) { - let children = node.children - .filter(child => !child.type.match(/[;]/)), - scope, - variable_declarator; - - if (match(children[0], 'const', 'let')) { - scope = createNode(source, children.shift()); - } - - if (match(children[0], 'variable_declarator')) { - variable_declarator = visitVariableDeclarator(source, children.shift()); - } - - return { - type: node.type, - context: createNode(source, node, properties), - comment: createNode(source, comment, null, true), - scope, - variable_declarator - } -} - - -export function visitVariableDeclarator(source: Source, node: SyntaxNode) { - let children = node.children - .filter(child => !child.type.match(/[=;]/)), - identifier, - type_annotation, - initializer; - - if (match(children[0], 'identifier')) { - identifier = createNode(source, children.shift()); - } - - if (match(children[0], 'type_annotation')) { - type_annotation = createNode(source, children.shift()); - } - - if (children[0]) { - initializer = createNode(source, children.shift()); - } - - return { - type: node.type, - context: createNode(source, node), - identifier, - type_annotation, - initializer - } -} \ No newline at end of file diff --git a/src/lang/typescript/visitors/formal_parameters.visitor.ts b/src/lang/typescript/visitors/formal_parameters.visitor.ts deleted file mode 100644 index e6f2b27..0000000 --- a/src/lang/typescript/visitors/formal_parameters.visitor.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { createNode } from "../node"; -import { SyntaxNode } from "tree-sitter"; -import { visitType } from "./type.visitor"; -import Source from "../../../interfaces/Source"; -import match from "../../../utils/match"; - -export function visitFormalParameters(source: Source, node: SyntaxNode) { - return { - type: node.type, - context: createNode(source, node), - parameters: node.children - .filter(child => !child.type.match(/[(),]/)) - .map(child => visitRequiredParameter(source, child)) - } -} - - -export function visitRequiredParameter(source: Source, node: SyntaxNode) { - let required_parameter = node.children, - identifier, - type_annotation; - - - if (match(required_parameter[0], 'identifier')) { - identifier = createNode(source, required_parameter.shift()); - } - - if(match(required_parameter[0], 'type_annotation')) { - let type = required_parameter.shift().children[1]; - type_annotation = visitType(source, type); - } - - return { - type: 'parameter', - context: createNode(source, node), - identifier, - type_annotation - } -} \ No newline at end of file diff --git a/src/lang/typescript/visitors/function.visitor.ts b/src/lang/typescript/visitors/function.visitor.ts deleted file mode 100644 index 58b40af..0000000 --- a/src/lang/typescript/visitors/function.visitor.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { NodeProperties, createNode } from "../node"; -import { SyntaxNode } from "tree-sitter"; -import { visitCallSignature } from "./signature.visitor"; -import match from "../../../utils/match"; -import Source from "../../../interfaces/Source"; - -export function visitFunction( - source: Source, - node: SyntaxNode, - comment: SyntaxNode, - properties: Partial -) { - let children = node.children; - let isAync = false, - identifier, - type_parameters, - formal_parameters, - type_annotation; - - if (match(children[0], 'async')) { - isAync = true; - children.shift(); - } - - if (match(children[0], 'function')) { - children.shift(); - } - - if (match(children[0], 'identifier')) { - identifier = createNode(source, children.shift()) - } - - if (match(children[0], 'call_signature')) { - let call_signature = visitCallSignature(source, children.shift()) - type_parameters = call_signature.type_parameters; - formal_parameters = call_signature.formal_parameters; - type_annotation = call_signature.type_annotation; - } - - return { - type: 'function', - context: createNode(source, node, properties), - comment: createNode(source, comment, null, true), - isAync, - identifier, - type_parameters, - formal_parameters, - type_annotation, - properties - } - -} \ No newline at end of file diff --git a/src/lang/typescript/visitors/node.visitor.ts b/src/lang/typescript/visitors/node.visitor.ts deleted file mode 100644 index cf4813a..0000000 --- a/src/lang/typescript/visitors/node.visitor.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { NodeProperties } from "../node"; -import { SyntaxNode } from "tree-sitter"; -import { visitClass } from "./class.visitor"; -import { visitDeclaration } from "./declaration.visitor"; -import { visitFunction } from "./function.visitor"; -import { visitStatement } from "./statement.visitor"; -import Source from "../../../interfaces/Source"; -import log, { ErrorType } from '../../../utils/log'; - -export function visitNode( - source: Source, - node: SyntaxNode, - comment: SyntaxNode, - properties: Partial -) { - switch (node.type) { - case 'class': - return visitClass(source, node, comment, properties); - case 'function': - return visitFunction(source, node, comment, properties); - case 'comment': - // noop - break; - case 'ERROR': - log.report(source, node, ErrorType.TreeSitterParseError); - break; - default: - if (node.type.includes("statement")) { - return visitStatement(source, node, comment, properties); - } - - if (node.type.includes("declaration")) { - return visitDeclaration(source, node, comment, properties); - } - - log.report(source, node, ErrorType.NodeTypeNotYetSupported); - break; - } -} \ No newline at end of file diff --git a/src/lang/typescript/visitors/program.visitor.ts b/src/lang/typescript/visitors/program.visitor.ts deleted file mode 100644 index 950c9cd..0000000 --- a/src/lang/typescript/visitors/program.visitor.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { isJavaDocComment, isLegalComment } from "../../../utils/comment"; -import { SyntaxNode } from "tree-sitter"; -import { visitNode } from "./node.visitor"; -import Source from "../../../interfaces/Source"; -import match from "../../../utils/match"; - -export function visitProgram(source: Source, node: SyntaxNode) { - let children = node.children; - if (node.children.length > 0) { - if (isLegalComment(source, node.children[0])) { - // Remove the legal comment from ast - children = node.children.splice(1); - } - // Perf: O(n) - return children.map(child => { - const nextSibling = child.nextSibling; - // Determine if the node is a c-style comment - if (match(child, 'comment') && isJavaDocComment(source, child)) { - // Determine whether a comment has a sibling - if (nextSibling) { - // Visit the sibling - // Perf: Possibly O(n^2) - return visitNode(source, nextSibling, child, { - exports: { - export: false, - default: false - } - }); - } - } - }).filter(child => !!child); - } -} \ No newline at end of file diff --git a/src/lang/typescript/visitors/signature.visitor.ts b/src/lang/typescript/visitors/signature.visitor.ts deleted file mode 100644 index bec33e3..0000000 --- a/src/lang/typescript/visitors/signature.visitor.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { NodeProperties, createNode } from "../Node"; -import { SyntaxNode } from "tree-sitter"; -import { visitFormalParameters } from "./formal_parameters.visitor"; -import match from "../../../utils/match"; -import Source from "../../../interfaces/Source"; -import visitTypeParameters, { visitType } from "./type.visitor"; -import log, { ErrorType } from "../../../utils/log"; - -export function visitSignature( - source: Source, - node: SyntaxNode, - comment?: SyntaxNode, - properties?: Partial -) { - switch (node.type) { - case 'call_signature': - return visitCallSignature(source, node, comment, properties); - case 'method_signature': - return visitMethodSignature(source, node, comment, properties); - default: - log.report(source, node, ErrorType.NodeTypeNotYetSupported); - break; - } -} - -export function visitCallSignature( - source: Source, - node: SyntaxNode, - comment?: SyntaxNode, - properties?: Partial -) { - - let call_signature = node.children, - type_parameters, - formal_parameters, - type_annotation; - - if (match(call_signature[0], 'type_parameters')) { - type_parameters = visitTypeParameters(source, call_signature.shift()); - } - - if (match(call_signature[0], 'formal_parameters')) { - formal_parameters = visitFormalParameters(source, call_signature.shift()); - } - - if (match(call_signature[0], 'type_annotation')) { - let type = call_signature.shift().children[1]; - type_annotation = visitType(source, type); - } - - return { - type: node.type, - context: createNode(source, node), - comment: comment ? createNode(source, comment, null, true) : undefined, - properties, - type_parameters, - formal_parameters, - type_annotation - } -} - - -export function visitMethodSignature( - source: Source, - node: SyntaxNode, - comment: SyntaxNode, - properties: Partial -) { - let children = node.children, - identifier; - if(match(children[0], 'property_identifier')) { - identifier = createNode(source, children.shift()); - } - console.log(children); - - // console.log(children[0].type, createNode(source, children[0]).text) -} - -export function visitPropertySignature( - source: Source, - node: SyntaxNode, - comment?: SyntaxNode, - properties?: Partial -) { - // console.log(node) - return { - type: node.type, - context: createNode(source, node), - comment: comment ? createNode(source, comment, null, true) : undefined, - } -} \ No newline at end of file diff --git a/src/lang/typescript/visitors/statement.visitor.ts b/src/lang/typescript/visitors/statement.visitor.ts deleted file mode 100644 index 2d1001d..0000000 --- a/src/lang/typescript/visitors/statement.visitor.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { NodeProperties } from "../node"; -import { SyntaxNode } from "tree-sitter"; -import { visitNode } from "./node.visitor"; -import Source from "../../../interfaces/Source"; -import log, { ErrorType } from "../../../utils/log"; -import match from "../../../utils/match"; - -export function visitStatement( - source: Source, - node: SyntaxNode, - comment: SyntaxNode, - properties: Partial -) { - switch(node.type) { - case 'expression_statement': - return visitExpressionStatement(source, node, comment, properties); - case 'export_statement': - return visitExportStatement(source, node, comment); - default: - log.report(source, node, ErrorType.NodeTypeNotYetSupported); - break; - } -} - -export function visitExpressionStatement( - source: Source, - node: SyntaxNode, - comment: SyntaxNode, - properties: Partial -) { - return visitNode(source, node.children.shift(), comment, properties); -} - -export function visitExportStatement( - source: Source, - node: SyntaxNode, - comment: SyntaxNode, -) { - let children = node.children, - isDefaultExport = false; - - if (children.length > 1 && match(children.shift(), 'export')) { - } - - if (children.length > 1 && match(children.shift(), 'default')) { - isDefaultExport = true; - } - return visitNode(source, children.shift(), comment, { - exports: { - export: true, - default: isDefaultExport - } - }); -} \ No newline at end of file diff --git a/src/lang/typescript/visitors/type.visitor.ts b/src/lang/typescript/visitors/type.visitor.ts deleted file mode 100644 index 1bc1cc1..0000000 --- a/src/lang/typescript/visitors/type.visitor.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { createNode, NodeProperties } from "../node"; -import { SyntaxNode } from "tree-sitter"; -import Source from "../../../interfaces/Source"; -import log, { ErrorType } from "../../../utils/log"; -import match from "../../../utils/match"; -import { isJavaDocComment } from "../../../utils/comment"; -import { visitSignature } from "./signature.visitor"; -import { sibling } from "../../../utils/sibling"; - -/* Type visitors */ - -export function visitTypeOrTypeIdentifier(source: Source, node: SyntaxNode) { - if (match(node, 'type_identifier')) { - return visitTypeIdentifier(source, node) - } - return visitType(source, node); -} - -export function visitType(source: Source, node: SyntaxNode) { - switch (node.type) { - case 'union_type': - return visitUnionType(source, node); - case 'intersection_type': - return visitIntersectionType(source, node); - case 'parenthesized_type': - return visitParenthesizedType(source, node); - case 'type_identifier': - return visitTypeIdentifier(source, node); - case 'generic_type': - return visitGenericType(source, node); - case 'predefined_type': - return visitPredefinedType(source, node); - default: - log.report(source, node, ErrorType.NodeTypeNotYetSupported); - break; - } -} - -export function visitTypeIdentifier(source: Source, node: SyntaxNode) { - return { - type: node.type, - context: createNode(source, node) - } -} - -export function visitUnionType(source: Source, node: SyntaxNode) { - const union = node.children; - return { - type: node.type, - context: createNode(source, node), - left: visitTypeOrTypeIdentifier(source, union[0]), - right: visitTypeOrTypeIdentifier(source, union[2]) - } -} - -export function visitIntersectionType(source: Source, node: SyntaxNode) { - const intersect = node.children; - return { - type: node.type, - context: createNode(source, node), - left: visitTypeOrTypeIdentifier(source, intersect[0]), - right: visitTypeOrTypeIdentifier(source, intersect[2]) - } -} - -export function visitParenthesizedType(source: Source, node: SyntaxNode) { - return { - type: node.type, - context: createNode(source, node), - parenthesized: visitTypeOrTypeIdentifier(source, node.children[1]) - } -} - -export function visitGenericType(source: Source, node: SyntaxNode) { - let children = node.children; - return { - type: node.type, - context: createNode(source, node), - generic: visitTypeIdentifier(source, children.shift()), - type_arguments: visitTypeArguments(source, children.shift()) - } -} - -export function visitPredefinedType(source: Source, node: SyntaxNode) { - return { - type: node.type, - context: createNode(source, node), - } -} - -export function visitObjectType( - source: Source, - node: SyntaxNode, - comment?: SyntaxNode, - properties?: Partial -) { - let children = node.children - .filter(child => !child.type.match(/[\{\},;]/)); - let signatures = []; - console.log(children) - children.forEach(child => { - let nextSibiling = sibling(child, children); - if (match(child, 'comment') && isJavaDocComment(source, child) && nextSibiling) { - // console.log(createNode(source, nextSibiling).text); - // let signature = visitSignature(source, nextSibiling, child, properties); - // if (signature) { - // signatures.push(signature) - // } - } - }); - return { - type: node.type, - context: createNode(source, node), - signatures - } -} - - -/* Helpers */ - -export default function visitTypeParameters(source: Source, node: SyntaxNode) { - return { - type: node.type, - context: createNode(source, node), - parameters: node.children - .filter(child => !child.type.match(/[<>,]/)) - .map(child => ({ type: child.type, context: createNode(source, child) })) - } -} - -export function visitTypeArguments(source: Source, node: SyntaxNode) { - return node.children - .filter(child => !child.type.match(/[<>,]/)) - .map(child => visitType(source, child)) -} \ No newline at end of file diff --git a/src/lang/typescript/visitors/visitor.ts b/src/lang/typescript/visitors/visitor.ts index c8df9c7..178a0ae 100644 --- a/src/lang/typescript/visitors/visitor.ts +++ b/src/lang/typescript/visitors/visitor.ts @@ -1,4 +1,12 @@ +import { createASTNode, NodeProperties, NodeInheritance } from "../Node"; +import { isJavaDocComment } from "../../../utils/comment"; +import { sibling } from "../../../utils/sibling"; import { SyntaxNode } from "tree-sitter"; +import { text } from "../../../utils/text"; +import log, { ErrorType } from "../../../utils/log"; +import match from "../../../utils/match"; +import Source from "../../../interfaces/Source"; +import xdoc from "xdoc-parser"; export interface TreeSitterNode { @@ -6,38 +14,230 @@ export interface TreeSitterNode { } export interface NodeVisitor { - visitNode(node: SyntaxNode): void - visitChildren(nodes: SyntaxNode[]): void + getAST(): object[] + visitNode(node: SyntaxNode): any + visitChildren(nodes: SyntaxNode[]): any } export class Node implements TreeSitterNode { constructor(public syntaxNode: SyntaxNode) { } - visit = (visitor: NodeVisitor): void => { - visitor.visitNode(this.syntaxNode); - visitor.visitChildren(this.syntaxNode.children); + visit = (visitor: NodeVisitor): NodeVisitor => { + return visitor.visitNode(this.syntaxNode); } } export class TypeScriptVisitor implements NodeVisitor { - ast = [] - visitNode = (node: SyntaxNode): void => { + private ast = [] + private source: Source + private parent: SyntaxNode + constructor(source: Source) { + this.source = source; + } + private hasInheritance(node: SyntaxNode) { + return node.children + .filter(node => { + return node.type === 'extends' || node.type === 'implements'; + }).length > 0 + } + + private getInheritanceType(node: SyntaxNode) { + if (node.children.filter(node => node.type === 'extends')) { + return 'extends'; + } + + if (node.children.filter(node => node.type === 'implements')) { + return 'implements'; + } + } + + getAST(): object[] { + return this.ast; + } + /* Visitors */ + visitNode = ( + node: SyntaxNode + ) => { switch (node.type) { + case 'program': + this.parent = node; + this.ast = this.visitProgram(node); case 'comment': - this.ast.push(this.visitComment(node)) + return this.visitComment(node); + case 'MISSING': + case 'ERROR': + log.report(this.source, node, ErrorType.TreeSitterParseError); break; default: + + /* Match other non-terminals */ + + if (match(node, 'constraint')) { + return this.visitConstraint(node) + } + + if (match(node, + 'type_identifier', 'type_parameters', 'type_parameter', + 'object_type' + )) { + return this.visitTypeNode(node) + } + + if (match(node, 'extends_clause')) { + return this.visitInheritanceClause(node); + } + + /* Match terminals */ + + if (match(node, 'identifier', 'extends')) { + return this.visitTerminal(node); + } + + log.report(this.source, node, ErrorType.NodeTypeNotYetSupported); + break; } } - visitChildren = (nodes: SyntaxNode[]): void => { - nodes + visitChildren = (nodes: SyntaxNode[]) => { + return nodes .filter(child => !child.type.match(/[<>(){},;\[\]]/)) - .forEach(this.visitNode.bind(this)); + .map(this.visitNode.bind(this)) + .filter(child => !!child); + } + + visitProgram = (node: SyntaxNode) => { + return this.visitChildren(node.children.filter(child => { + return match(child, 'comment'); + })); + } + + visitComment = (node: SyntaxNode) => { + if (isJavaDocComment(this.source, node)) { + const nextSibling = sibling(node); + if (nextSibling) { + return { + type: node.type, + ...createASTNode(this.source, node), + context: this.visitContext(nextSibling, {}), + comment: xdoc(text(this.source, node)).parse() + } + } + } + } + + visitContext = (node: SyntaxNode, properties?: Partial) => { + switch (node.type) { + case 'interface_declaration': + this.parent = node; + return this.visitInterfaceDeclaration(node, properties) + case 'call_signature': + return this.visitCallSignature(node, properties); + default: + log.report(this.source, node, ErrorType.NodeTypeNotYetSupported); + break; + } + } + + /* Declarations */ + + visitInterfaceDeclaration = ( + node: SyntaxNode, + properties?: Partial + ) => { + // Shorten the node + return this.visitInterface(node, properties) } - visitComment = (node: SyntaxNode): void => { + visitInterface = (node: SyntaxNode, properties: Partial) => { + let children = node.children; + let extends_ = false, implements_ = false; + if (this.hasInheritance(node)) { + const inheritance = this.getInheritanceType(node) + extends_ = inheritance === 'extends'; + implements_ = inheritance === 'implements'; + } + Object.assign(properties, { + inheritance: { + implements: implements_, + extends: extends_ + } as NodeInheritance + }) + + return { + type: children.shift().type, + ...createASTNode(this.source, node), + children: this.visitChildren(children), + properties + } + } + /* Signatures */ + visitCallSignature = (node: SyntaxNode, properties: Partial) => { + return { + type: node.type, + ...createASTNode(this.source, node), + children: this.visitChildren(node.children), + properties + } } + /* Types */ + + visitTypeNode = (node: SyntaxNode) => { + switch (node.type) { + case 'type_identifier': + return this.visitTerminal(node) + case 'type_parameters': + return { + type: node.type, + ...createASTNode(this.source, node), + children: this.visitChildren(node.children), + } + case 'type_parameter': + return { + type: node.type, + ...createASTNode(this.source, node), + children: this.visitChildren(node.children) + } + case 'object_type': + return { + type: node.type, + ...createASTNode(this.source, node), + children: this.visitChildren(node.children.filter(child => { + return match(child, 'comment') + })) + } + default: + log.report(this.source, node, ErrorType.NodeTypeNotYetSupported); + break; + + } + } + + /* Other non-terminals */ + + visitConstraint = (node: SyntaxNode) => { + return { + type: node.type, + ...createASTNode(this.source, node), + children: this.visitChildren(node.children) + } + } + + visitInheritanceClause = (node: SyntaxNode) => { + return { + type: node.type, + ...createASTNode(this.source, node), + children: this.visitChildren(node.children) + } + } + + /* Terminals */ + + visitTerminal = (node: SyntaxNode) => { + return { + type: node.type, + ...createASTNode(this.source, node), + } + } } \ No newline at end of file diff --git a/src/lang/typescript/walk.ts b/src/lang/typescript/walk.ts index 3fb0fc5..0bbca0f 100644 --- a/src/lang/typescript/walk.ts +++ b/src/lang/typescript/walk.ts @@ -1,7 +1,7 @@ import { SyntaxNode } from "tree-sitter"; import { Node } from "./visitors/visitor"; -export function walk(node: SyntaxNode) { +export default function walk(node: SyntaxNode) { let node_ = new Node(node); node_.syntaxNode.children.map(child => walk(child)) return node_; From 68908b07e55ff7c8d9096aeec745d7c9d89e37bf Mon Sep 17 00:00:00 2001 From: Takeshi Date: Tue, 21 Aug 2018 21:19:58 -0600 Subject: [PATCH 14/32] Update: WIP --- build/example.d.ts | 6 +- build/example.js | 2 +- build/index.d.ts | 2 +- build/index.js | 4 +- build/src/ParserFactory.js | 2 +- build/src/interfaces/IParser.d.ts | 3 +- build/src/interfaces/IParser.js | 2 +- build/src/interfaces/Source.js | 2 +- build/src/interfaces/TextRange.d.ts | 8 - build/src/interfaces/TextRange.js | 2 +- build/src/lang/common/ast.d.ts | 38 +++ build/src/lang/common/ast.js | 19 ++ build/src/lang/common/emca.d.ts | 12 + build/src/lang/common/emca.js | 3 + build/src/lang/javascript/index.d.ts | 2 +- build/src/lang/javascript/index.js | 3 +- build/src/lang/typescript/index.d.ts | 2 +- build/src/lang/typescript/index.js | 6 +- build/src/lang/typescript/visitor.d.ts | 53 ++++ build/src/lang/typescript/visitor.js | 190 +++++++++++++ .../src/lang/typescript/visitors/visitor.d.ts | 237 ++-------------- build/src/lang/typescript/visitors/visitor.js | 75 +++--- build/src/utils/comment.js | 2 +- build/src/utils/log.js | 6 +- build/src/utils/match.js | 2 +- build/src/utils/range.js | 2 +- build/src/utils/sibling.js | 2 +- build/src/utils/text.js | 2 +- build/src/utils/walk.d.ts | 3 + build/src/utils/walk.js | 10 + example.ts | 7 +- index.ts | 2 +- package-lock.json | 32 +-- package.json | 2 +- src/interfaces/IParser.ts | 3 +- src/interfaces/TextRange.ts | 8 - src/lang/common/ast.ts | 64 +++++ src/lang/common/emca.ts | 14 + src/lang/javascript/index.ts | 2 + src/lang/typescript/Node.ts | 47 ---- src/lang/typescript/index.ts | 4 +- src/lang/typescript/visitor.ts | 252 ++++++++++++++++++ src/lang/typescript/visitors/visitor.ts | 243 ----------------- src/utils/log.ts | 4 +- src/{lang/typescript => utils}/walk.ts | 2 +- 45 files changed, 782 insertions(+), 606 deletions(-) create mode 100644 build/src/lang/common/ast.d.ts create mode 100644 build/src/lang/common/ast.js create mode 100644 build/src/lang/common/emca.d.ts create mode 100644 build/src/lang/common/emca.js create mode 100644 build/src/lang/typescript/visitor.d.ts create mode 100644 build/src/lang/typescript/visitor.js create mode 100644 build/src/utils/walk.d.ts create mode 100644 build/src/utils/walk.js create mode 100644 src/lang/common/ast.ts create mode 100644 src/lang/common/emca.ts delete mode 100644 src/lang/typescript/Node.ts create mode 100644 src/lang/typescript/visitor.ts delete mode 100644 src/lang/typescript/visitors/visitor.ts rename src/{lang/typescript => utils}/walk.ts (79%) diff --git a/build/example.d.ts b/build/example.d.ts index e737dae..b7a53dc 100644 --- a/build/example.d.ts +++ b/build/example.d.ts @@ -1,7 +1,11 @@ +/** + * Description + */ interface A { } /** * Description + * @interface B */ interface B extends A { /** @@ -11,5 +15,5 @@ interface B extends A { /** * description */ - func(x: string): void; + func(x: string): A; } diff --git a/build/example.js b/build/example.js index 112c1f9..85f6bc5 100644 --- a/build/example.js +++ b/build/example.js @@ -1,2 +1,2 @@ "use strict"; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhhbXBsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2V4YW1wbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIlxuaW50ZXJmYWNlIEEge1xuXG59XG5cbi8qKlxuICogRGVzY3JpcHRpb25cbiAqL1xuaW50ZXJmYWNlIEI8VCBleHRlbmRzIEEsIEs+IGV4dGVuZHMgQSB7XG4gIC8qKlxuICAgKiBkZXNjcmlwdGlvblxuICAgKi9cbiAgKHg6IHN0cmluZyk6IHZvaWRcbiAgLyoqXG4gICAqIGRlc2NyaXB0aW9uXG4gICAqL1xuICBmdW5jICh4OiBzdHJpbmcpOiB2b2lkXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhhbXBsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2V4YW1wbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBEZXNjcmlwdGlvblxyXG4gKi9cclxuaW50ZXJmYWNlIEEge1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIERlc2NyaXB0aW9uXHJcbiAqIEBpbnRlcmZhY2UgQlxyXG4gKi9cclxuaW50ZXJmYWNlIEI8VCBleHRlbmRzIEEsIEs+IGV4dGVuZHMgQSB7XHJcbiAgLyoqXHJcbiAgICogZGVzY3JpcHRpb25cclxuICAgKi9cclxuICAoeDogc3RyaW5nKTogdm9pZFxyXG4gIC8qKlxyXG4gICAqIGRlc2NyaXB0aW9uXHJcbiAgICovXHJcbiAgZnVuYyAoeDogc3RyaW5nKTogQVxyXG59Il19 \ No newline at end of file diff --git a/build/index.d.ts b/build/index.d.ts index 164cb09..0d09680 100644 --- a/build/index.d.ts +++ b/build/index.d.ts @@ -22,5 +22,5 @@ import IParser from './src/interfaces/IParser'; export default class Parser implements IParser { private parser; constructor(file: Source, options?: any); - parse: () => any; + parse: () => import("./src/lang/common/ast").ASTNode[]; } diff --git a/build/index.js b/build/index.js index 491ed54..9efa0a1 100644 --- a/build/index.js +++ b/build/index.js @@ -38,5 +38,5 @@ const result = new Parser({ language: 'typescript' }).parse(); // console.log(JSON.stringify(result, null, 2)) -// console.log(result); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLHVEQUFnRDtBQUVoRCx5QkFBeUI7QUFFekI7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQXFCLE1BQU07SUFHekIsWUFBWSxJQUFZLEVBQUUsVUFBZSxFQUFFO1FBRzNDLFVBQUssR0FBRyxHQUFHLEVBQUU7WUFDWCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDNUIsQ0FBQyxDQUFBO1FBSkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksdUJBQWEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMvRCxDQUFDO0NBSUY7QUFURCx5QkFTQztBQUVELE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDO0lBQ3hCLElBQUksRUFBRSxVQUFVO0lBQ2hCLElBQUksRUFBRSxRQUFRO0lBQ2QsSUFBSSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLGFBQWEsRUFBRSxPQUFPLENBQUM7Q0FDOUQsRUFBRTtJQUNELFFBQVEsRUFBRSxZQUFZO0NBQ3ZCLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUdYLCtDQUErQztBQUMvQyx1QkFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU291cmNlIGZyb20gJy4vc3JjL2ludGVyZmFjZXMvU291cmNlJztcbmltcG9ydCBQYXJzZXJGYWN0b3J5IGZyb20gJy4vc3JjL1BhcnNlckZhY3RvcnknO1xuaW1wb3J0IElQYXJzZXIgZnJvbSAnLi9zcmMvaW50ZXJmYWNlcy9JUGFyc2VyJztcbmltcG9ydCAqIGFzIEZTIGZyb20gJ2ZzJztcblxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgcGFyc2VzIGEgc291cmNlIGNvZGUgYW5kIGdlbmVyYXRlcyBhbiBBU1QuXG4gKiBcbiAqIEBjbGFzcyBQYXJzZXJcbiAqIEBpbXBsZW1lbnRzIElQYXJzZXJcbiAqIFxuICogIyBFeGFtcGxlXG4gKiBcbiAqIGBgYGpzXG4gKiBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKHtcbiAqICBuYW1lOiAnLi4uJyxcbiAqICBwYXRoOiAnLi4uLicsXG4gKiAgdGV4dDogJy4uLidcbiAqIH0sIHsgbGFuZ3VhZ2U6ICd0eXBlc2NyaXB0JyB9KTtcbiAqIFxuICogY29uc3QgcmVzdWx0ID0gcGFyc2VyLnBhcnNlKCk7XG4gKiBcbiAqIGBgYFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYXJzZXIgaW1wbGVtZW50cyBJUGFyc2VyIHtcblxuICBwcml2YXRlIHBhcnNlcjogSVBhcnNlcjtcbiAgY29uc3RydWN0b3IoZmlsZTogU291cmNlLCBvcHRpb25zOiBhbnkgPSB7fSkge1xuICAgIHRoaXMucGFyc2VyID0gKG5ldyBQYXJzZXJGYWN0b3J5KGZpbGUsIG9wdGlvbnMpKS5nZXRQYXJzZXIoKTtcbiAgfVxuICBwYXJzZSA9ICgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIucGFyc2UoKVxuICB9XG59XG5cbmNvbnN0IHJlc3VsdCA9IG5ldyBQYXJzZXIoe1xuICBuYW1lOiAnaW5kZXgudHMnLFxuICBwYXRoOiAnLi4vLi4vJyxcbiAgdGV4dDogRlMucmVhZEZpbGVTeW5jKGAke3Byb2Nlc3MuY3dkKCl9L2V4YW1wbGUudHNgLCAndXRmLTgnKVxufSwge1xuICBsYW5ndWFnZTogJ3R5cGVzY3JpcHQnXG59KS5wYXJzZSgpO1xuXG5cbi8vIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMikpXG4vLyBjb25zb2xlLmxvZyhyZXN1bHQpO1xuIl19 \ No newline at end of file +console.log(result); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLHVEQUFnRDtBQUVoRCx5QkFBeUI7QUFFekI7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQXFCLE1BQU07SUFHekIsWUFBWSxJQUFZLEVBQUUsVUFBZSxFQUFFO1FBRzNDLFVBQUssR0FBRyxHQUFHLEVBQUU7WUFDWCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDNUIsQ0FBQyxDQUFBO1FBSkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksdUJBQWEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMvRCxDQUFDO0NBSUY7QUFURCx5QkFTQztBQUVELE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDO0lBQ3hCLElBQUksRUFBRSxVQUFVO0lBQ2hCLElBQUksRUFBRSxRQUFRO0lBQ2QsSUFBSSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLGFBQWEsRUFBRSxPQUFPLENBQUM7Q0FDOUQsRUFBRTtJQUNELFFBQVEsRUFBRSxZQUFZO0NBQ3ZCLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUdYLCtDQUErQztBQUMvQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNvdXJjZSBmcm9tICcuL3NyYy9pbnRlcmZhY2VzL1NvdXJjZSc7XHJcbmltcG9ydCBQYXJzZXJGYWN0b3J5IGZyb20gJy4vc3JjL1BhcnNlckZhY3RvcnknO1xyXG5pbXBvcnQgSVBhcnNlciBmcm9tICcuL3NyYy9pbnRlcmZhY2VzL0lQYXJzZXInO1xyXG5pbXBvcnQgKiBhcyBGUyBmcm9tICdmcyc7XHJcblxyXG4vKipcclxuICogQSBjbGFzcyB0aGF0IHBhcnNlcyBhIHNvdXJjZSBjb2RlIGFuZCBnZW5lcmF0ZXMgYW4gQVNULlxyXG4gKiBcclxuICogQGNsYXNzIFBhcnNlclxyXG4gKiBAaW1wbGVtZW50cyBJUGFyc2VyXHJcbiAqIFxyXG4gKiAjIEV4YW1wbGVcclxuICogXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIoe1xyXG4gKiAgbmFtZTogJy4uLicsXHJcbiAqICBwYXRoOiAnLi4uLicsXHJcbiAqICB0ZXh0OiAnLi4uJ1xyXG4gKiB9LCB7IGxhbmd1YWdlOiAndHlwZXNjcmlwdCcgfSk7XHJcbiAqIFxyXG4gKiBjb25zdCByZXN1bHQgPSBwYXJzZXIucGFyc2UoKTtcclxuICogXHJcbiAqIGBgYFxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFyc2VyIGltcGxlbWVudHMgSVBhcnNlciB7XHJcblxyXG4gIHByaXZhdGUgcGFyc2VyOiBJUGFyc2VyO1xyXG4gIGNvbnN0cnVjdG9yKGZpbGU6IFNvdXJjZSwgb3B0aW9uczogYW55ID0ge30pIHtcclxuICAgIHRoaXMucGFyc2VyID0gKG5ldyBQYXJzZXJGYWN0b3J5KGZpbGUsIG9wdGlvbnMpKS5nZXRQYXJzZXIoKTtcclxuICB9XHJcbiAgcGFyc2UgPSAoKSA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIucGFyc2UoKVxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgcmVzdWx0ID0gbmV3IFBhcnNlcih7XHJcbiAgbmFtZTogJ2luZGV4LnRzJyxcclxuICBwYXRoOiAnLi4vLi4vJyxcclxuICB0ZXh0OiBGUy5yZWFkRmlsZVN5bmMoYCR7cHJvY2Vzcy5jd2QoKX0vZXhhbXBsZS50c2AsICd1dGYtOCcpXHJcbn0sIHtcclxuICBsYW5ndWFnZTogJ3R5cGVzY3JpcHQnXHJcbn0pLnBhcnNlKCk7XHJcblxyXG5cclxuLy8gY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSlcclxuY29uc29sZS5sb2cocmVzdWx0KTtcclxuIl19 \ No newline at end of file diff --git a/build/src/ParserFactory.js b/build/src/ParserFactory.js index ee0c756..98c15fd 100644 --- a/build/src/ParserFactory.js +++ b/build/src/ParserFactory.js @@ -25,4 +25,4 @@ class ParserFactory { } } exports.default = ParserFactory; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFyc2VyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9QYXJzZXJGYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsa0RBQWlEO0FBQ2pELGtEQUFpRDtBQUVqRCxNQUFxQixhQUFhO0lBS2hDLFlBQVksSUFBWSxFQUFFLFVBQWUsRUFBRTtRQUhuQyxZQUFPLEdBQUc7WUFDaEIsUUFBUSxFQUFFLFlBQVk7U0FDdkIsQ0FBQTtRQU1ELGNBQVMsR0FBRyxHQUFZLEVBQUU7WUFDeEIsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDM0MsS0FBSyxJQUFJLENBQUM7Z0JBQ1YsS0FBSyxZQUFZO29CQUNmLE9BQU8sSUFBSSxvQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkQsS0FBSyxJQUFJLENBQUM7Z0JBQ1YsS0FBSyxZQUFZO29CQUNmLE9BQU8sSUFBSSxvQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkQ7b0JBQ0EsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLFVBQVUsQ0FBQyxDQUFBO29CQUNyRSxNQUFNO2FBQ1Q7UUFDSCxDQUFDLENBQUE7UUFoQkMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3RDLENBQUM7Q0FnQkY7QUF4QkQsZ0NBd0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuaW1wb3J0IElQYXJzZXIgZnJvbSBcIi4vaW50ZXJmYWNlcy9JUGFyc2VyXCI7XG5pbXBvcnQgSmF2YVNjcmlwdFBhcnNlciBmcm9tIFwiLi9sYW5nL2phdmFzY3JpcHRcIjtcbmltcG9ydCBUeXBlU2NyaXB0UGFyc2VyIGZyb20gJy4vbGFuZy90eXBlc2NyaXB0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFyc2VyRmFjdG9yeSB7XG4gIHByaXZhdGUgZmlsZTogU291cmNlXG4gIHByaXZhdGUgb3B0aW9ucyA9IHtcbiAgICBsYW5ndWFnZTogJ0phdmFTY3JpcHQnXG4gIH1cbiAgY29uc3RydWN0b3IoZmlsZTogU291cmNlLCBvcHRpb25zOiBhbnkgPSB7fSkge1xuICAgIHRoaXMuZmlsZSA9IGZpbGU7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdGlvbnMsIG9wdGlvbnMpXG4gIH1cblxuICBnZXRQYXJzZXIgPSAoKTogSVBhcnNlciA9PiB7XG4gICAgc3dpdGNoICh0aGlzLm9wdGlvbnMubGFuZ3VhZ2UudG9Mb3dlckNhc2UoKSkge1xuICAgICAgY2FzZSAnanMnOlxuICAgICAgY2FzZSAnamF2YXNjcmlwdCc6XG4gICAgICAgIHJldHVybiBuZXcgSmF2YVNjcmlwdFBhcnNlcih0aGlzLmZpbGUsIHRoaXMub3B0aW9ucyk7XG4gICAgICBjYXNlICd0cyc6XG4gICAgICBjYXNlICd0eXBlc2NyaXB0JzpcbiAgICAgICAgcmV0dXJuIG5ldyBUeXBlU2NyaXB0UGFyc2VyKHRoaXMuZmlsZSwgdGhpcy5vcHRpb25zKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICBjb25zb2xlLmxvZyhgW21yLWRvY106IE5vIHBhcnNlciBmb3IgJHt0aGlzLm9wdGlvbnMubGFuZ3VhZ2V9IGV4aXN0cy5gKVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFyc2VyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9QYXJzZXJGYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsa0RBQWlEO0FBQ2pELGtEQUFpRDtBQUVqRCxNQUFxQixhQUFhO0lBS2hDLFlBQVksSUFBWSxFQUFFLFVBQWUsRUFBRTtRQUhuQyxZQUFPLEdBQUc7WUFDaEIsUUFBUSxFQUFFLFlBQVk7U0FDdkIsQ0FBQTtRQU1ELGNBQVMsR0FBRyxHQUFZLEVBQUU7WUFDeEIsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDM0MsS0FBSyxJQUFJLENBQUM7Z0JBQ1YsS0FBSyxZQUFZO29CQUNmLE9BQU8sSUFBSSxvQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkQsS0FBSyxJQUFJLENBQUM7Z0JBQ1YsS0FBSyxZQUFZO29CQUNmLE9BQU8sSUFBSSxvQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkQ7b0JBQ0EsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLFVBQVUsQ0FBQyxDQUFBO29CQUNyRSxNQUFNO2FBQ1Q7UUFDSCxDQUFDLENBQUE7UUFoQkMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3RDLENBQUM7Q0FnQkY7QUF4QkQsZ0NBd0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xyXG5pbXBvcnQgSVBhcnNlciBmcm9tIFwiLi9pbnRlcmZhY2VzL0lQYXJzZXJcIjtcclxuaW1wb3J0IEphdmFTY3JpcHRQYXJzZXIgZnJvbSBcIi4vbGFuZy9qYXZhc2NyaXB0XCI7XHJcbmltcG9ydCBUeXBlU2NyaXB0UGFyc2VyIGZyb20gJy4vbGFuZy90eXBlc2NyaXB0JztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhcnNlckZhY3Rvcnkge1xyXG4gIHByaXZhdGUgZmlsZTogU291cmNlXHJcbiAgcHJpdmF0ZSBvcHRpb25zID0ge1xyXG4gICAgbGFuZ3VhZ2U6ICdKYXZhU2NyaXB0J1xyXG4gIH1cclxuICBjb25zdHJ1Y3RvcihmaWxlOiBTb3VyY2UsIG9wdGlvbnM6IGFueSA9IHt9KSB7XHJcbiAgICB0aGlzLmZpbGUgPSBmaWxlO1xyXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdGlvbnMsIG9wdGlvbnMpXHJcbiAgfVxyXG5cclxuICBnZXRQYXJzZXIgPSAoKTogSVBhcnNlciA9PiB7XHJcbiAgICBzd2l0Y2ggKHRoaXMub3B0aW9ucy5sYW5ndWFnZS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIGNhc2UgJ2pzJzpcclxuICAgICAgY2FzZSAnamF2YXNjcmlwdCc6XHJcbiAgICAgICAgcmV0dXJuIG5ldyBKYXZhU2NyaXB0UGFyc2VyKHRoaXMuZmlsZSwgdGhpcy5vcHRpb25zKTtcclxuICAgICAgY2FzZSAndHMnOlxyXG4gICAgICBjYXNlICd0eXBlc2NyaXB0JzpcclxuICAgICAgICByZXR1cm4gbmV3IFR5cGVTY3JpcHRQYXJzZXIodGhpcy5maWxlLCB0aGlzLm9wdGlvbnMpO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICBjb25zb2xlLmxvZyhgW21yLWRvY106IE5vIHBhcnNlciBmb3IgJHt0aGlzLm9wdGlvbnMubGFuZ3VhZ2V9IGV4aXN0cy5gKVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn0iXX0= \ No newline at end of file diff --git a/build/src/interfaces/IParser.d.ts b/build/src/interfaces/IParser.d.ts index 0e90d3f..89e7362 100644 --- a/build/src/interfaces/IParser.d.ts +++ b/build/src/interfaces/IParser.d.ts @@ -1,5 +1,6 @@ import Source from "./Source"; +import { ASTNode } from "../lang/common/ast"; export default abstract class IParser { constructor(file: Source, options: any); - abstract parse(): any; + abstract parse(): ASTNode[]; } diff --git a/build/src/interfaces/IParser.js b/build/src/interfaces/IParser.js index f23212a..4a61442 100644 --- a/build/src/interfaces/IParser.js +++ b/build/src/interfaces/IParser.js @@ -6,4 +6,4 @@ class IParser { } } exports.default = IParser; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSVBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbnRlcmZhY2VzL0lQYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSxtQ0FBbUM7QUFFbkMsTUFBOEIsT0FBTztJQUNuQyxZQUFZLElBQVksRUFBRSxPQUFZO0lBRXRDLENBQUM7Q0FFRjtBQUxELDBCQUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi9Tb3VyY2VcIjtcbi8vIGltcG9ydCBJUmVzdWx0IGZyb20gXCIuL0lSZXN1bHRcIjtcblxuZXhwb3J0IGRlZmF1bHQgYWJzdHJhY3QgY2xhc3MgSVBhcnNlciB7XG4gIGNvbnN0cnVjdG9yKGZpbGU6IFNvdXJjZSwgb3B0aW9uczogYW55KSB7XG5cbiAgfVxuICBhYnN0cmFjdCBwYXJzZSgpOiBhbnlcbn0iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSVBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbnRlcmZhY2VzL0lQYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQSxtQ0FBbUM7QUFFbkMsTUFBOEIsT0FBTztJQUNuQyxZQUFZLElBQVksRUFBRSxPQUFZO0lBRXRDLENBQUM7Q0FFRjtBQUxELDBCQUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi9Tb3VyY2VcIjtcclxuaW1wb3J0IHsgQVNUTm9kZSB9IGZyb20gXCIuLi9sYW5nL2NvbW1vbi9hc3RcIjtcclxuLy8gaW1wb3J0IElSZXN1bHQgZnJvbSBcIi4vSVJlc3VsdFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgYWJzdHJhY3QgY2xhc3MgSVBhcnNlciB7XHJcbiAgY29uc3RydWN0b3IoZmlsZTogU291cmNlLCBvcHRpb25zOiBhbnkpIHtcclxuXHJcbiAgfVxyXG4gIGFic3RyYWN0IHBhcnNlKCk6IEFTVE5vZGVbXVxyXG59Il19 \ No newline at end of file diff --git a/build/src/interfaces/Source.js b/build/src/interfaces/Source.js index 0d8ff4e..6590b1a 100644 --- a/build/src/interfaces/Source.js +++ b/build/src/interfaces/Source.js @@ -1,3 +1,3 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvU291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBpbnRlcmZhY2UgU291cmNlIHtcbiAgbmFtZTogc3RyaW5nLFxuICBwYXRoOiBzdHJpbmcsXG4gIHRleHQ6IHN0cmluZ1xufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvU291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBpbnRlcmZhY2UgU291cmNlIHtcclxuICBuYW1lOiBzdHJpbmcsXHJcbiAgcGF0aDogc3RyaW5nLFxyXG4gIHRleHQ6IHN0cmluZ1xyXG59Il19 \ No newline at end of file diff --git a/build/src/interfaces/TextRange.d.ts b/build/src/interfaces/TextRange.d.ts index 548933a..142d2e1 100644 --- a/build/src/interfaces/TextRange.d.ts +++ b/build/src/interfaces/TextRange.d.ts @@ -1,9 +1,7 @@ /** * An interface that represents a range. * - * ```xdoc * @interface Range - * ``` */ export interface Range { start: number; @@ -13,30 +11,24 @@ export interface Range { * An interface that represents the positional * and locational ranges of a source code. * - * ```xdoc * @interface TextRange - * ``` */ export default interface TextRange { /** * Represents a context's start and end position. - * ```xdoc * @property position: { * start: number, * end: number * } - * ``` */ position: Range; /** * Represents a context's row and column location. * - * ```xdoc * @location: { * row: Range, * column: Range * } - * ``` */ location: { row: Range; diff --git a/build/src/interfaces/TextRange.js b/build/src/interfaces/TextRange.js index 5973c0c..015edef 100644 --- a/build/src/interfaces/TextRange.js +++ b/build/src/interfaces/TextRange.js @@ -1,3 +1,3 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGV4dFJhbmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvVGV4dFJhbmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogQW4gaW50ZXJmYWNlIHRoYXQgcmVwcmVzZW50cyBhIHJhbmdlLlxuICogXG4gKiBgYGB4ZG9jXG4gKiBAaW50ZXJmYWNlIFJhbmdlXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSYW5nZSB7XG4gIHN0YXJ0OiBudW1iZXIsXG4gIGVuZDogbnVtYmVyXG59XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIHRoYXQgcmVwcmVzZW50cyB0aGUgcG9zaXRpb25hbCBcbiAqIGFuZCBsb2NhdGlvbmFsIHJhbmdlcyBvZiBhIHNvdXJjZSBjb2RlLlxuICogXG4gKiBgYGB4ZG9jXG4gKiBAaW50ZXJmYWNlIFRleHRSYW5nZVxuICogYGBgXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGludGVyZmFjZSBUZXh0UmFuZ2Uge1xuICAvKipcbiAgICogUmVwcmVzZW50cyBhIGNvbnRleHQncyBzdGFydCBhbmQgZW5kIHBvc2l0aW9uLlxuICAgKiBgYGB4ZG9jXG4gICAqIEBwcm9wZXJ0eSBwb3NpdGlvbjoge1xuICAgKiAgc3RhcnQ6IG51bWJlcixcbiAgICogIGVuZDogbnVtYmVyXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBwb3NpdGlvbjogUmFuZ2VcbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgYSBjb250ZXh0J3Mgcm93IGFuZCBjb2x1bW4gbG9jYXRpb24uXG4gICAqIFxuICAgKiBgYGB4ZG9jXG4gICAqIEBsb2NhdGlvbjoge1xuICAgKiAgcm93OiBSYW5nZSxcbiAgICogIGNvbHVtbjogUmFuZ2VcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGxvY2F0aW9uOiB7XG4gICAgcm93OiBSYW5nZSxcbiAgICBjb2x1bW46IFJhbmdlXG4gIH1cbn0iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGV4dFJhbmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvVGV4dFJhbmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuLyoqXHJcbiAqIEFuIGludGVyZmFjZSB0aGF0IHJlcHJlc2VudHMgYSByYW5nZS5cclxuICogXHJcbiAqIEBpbnRlcmZhY2UgUmFuZ2VcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmFuZ2Uge1xyXG4gIHN0YXJ0OiBudW1iZXIsXHJcbiAgZW5kOiBudW1iZXJcclxufVxyXG5cclxuLyoqXHJcbiAqIEFuIGludGVyZmFjZSB0aGF0IHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uYWwgXHJcbiAqIGFuZCBsb2NhdGlvbmFsIHJhbmdlcyBvZiBhIHNvdXJjZSBjb2RlLlxyXG4gKiBcclxuICogQGludGVyZmFjZSBUZXh0UmFuZ2VcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGludGVyZmFjZSBUZXh0UmFuZ2Uge1xyXG4gIC8qKlxyXG4gICAqIFJlcHJlc2VudHMgYSBjb250ZXh0J3Mgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbi5cclxuICAgKiBAcHJvcGVydHkgcG9zaXRpb246IHtcclxuICAgKiAgc3RhcnQ6IG51bWJlcixcclxuICAgKiAgZW5kOiBudW1iZXJcclxuICAgKiB9XHJcbiAgICovXHJcbiAgcG9zaXRpb246IFJhbmdlXHJcbiAgLyoqXHJcbiAgICogUmVwcmVzZW50cyBhIGNvbnRleHQncyByb3cgYW5kIGNvbHVtbiBsb2NhdGlvbi5cclxuICAgKiBcclxuICAgKiBAbG9jYXRpb246IHtcclxuICAgKiAgcm93OiBSYW5nZSxcclxuICAgKiAgY29sdW1uOiBSYW5nZVxyXG4gICAqIH1cclxuICAgKi9cclxuICBsb2NhdGlvbjoge1xyXG4gICAgcm93OiBSYW5nZSxcclxuICAgIGNvbHVtbjogUmFuZ2VcclxuICB9XHJcbn0iXX0= \ No newline at end of file diff --git a/build/src/lang/common/ast.d.ts b/build/src/lang/common/ast.d.ts new file mode 100644 index 0000000..36396ce --- /dev/null +++ b/build/src/lang/common/ast.d.ts @@ -0,0 +1,38 @@ +import { DocumentationNode } from 'xdoc-parser/src/XDocASTNode'; +import { RemarkNode } from 'xdoc-parser/src/XDocParser'; +import { SyntaxNode } from "tree-sitter"; +import Source from "../../interfaces/Source"; +import TextRange from "../../interfaces/TextRange"; +export interface ASTNode extends TextRange { + /** + * @property - The type of node. + */ + type: string; + /** + * @property - The context string. + */ + text: string; + /** + * @property - The node's children. + */ + children: ASTNode[] | undefined[]; + /** + * @property - The context node that a comment node refers to. + */ + context: ASTNode; + /** + * @property - The properties that a ASTNode may possess. + */ + properties?: object; + /** + * @property - The parsed XDoc comment. + */ + comment?: { + markdown: RemarkNode; + documentation: Partial; + }; +} +export declare function createASTNode(source: Source, node: SyntaxNode): ASTNode; +export declare function createASTNode(source: Source, node: SyntaxNode, children: object[]): ASTNode; +export declare function createASTNode(source: Source, node: SyntaxNode, children: object[], properties: object): any; +export declare function createASTNode(source: Source, node: SyntaxNode, context: ASTNode, document: boolean): ASTNode; diff --git a/build/src/lang/common/ast.js b/build/src/lang/common/ast.js new file mode 100644 index 0000000..4a07bbd --- /dev/null +++ b/build/src/lang/common/ast.js @@ -0,0 +1,19 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const text_1 = require("../../utils/text"); +const range_1 = require("../../utils/range"); +const xdoc_parser_1 = require("xdoc-parser"); +function createASTNode(source, node, arg1, arg2) { + let context, children = [], document = typeof arg2 === 'boolean' && arg2 === true, properties; + if (Array.isArray(arg1)) + children = arg1; + else + context = arg1; + if (typeof arg2 === 'object') { + properties = arg2; + } + return Object.assign({ type: node.type, text: text_1.text(source, node) }, range_1.default(node), { context, + children, comment: document ? xdoc_parser_1.default(source.text).parse() : undefined, properties }); +} +exports.createASTNode = createASTNode; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xhbmcvY29tbW9uL2FzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUdBLDJDQUF3QztBQUN4Qyw2Q0FBc0M7QUFHdEMsNkNBQStCO0FBcUMvQixTQUFnQixhQUFhLENBQUMsTUFBYyxFQUFFLElBQWdCLEVBQUUsSUFBVSxFQUFFLElBQVU7SUFFcEYsSUFBSSxPQUFPLEVBQUUsUUFBUSxHQUFHLEVBQUUsRUFBRSxRQUFRLEdBQUcsT0FBTyxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUUsVUFBVSxDQUFDO0lBQzlGLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFBRSxRQUFRLEdBQUcsSUFBSSxDQUFDOztRQUNwQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBRXBCLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO1FBQzVCLFVBQVUsR0FBRyxJQUFJLENBQUM7S0FDbkI7SUFFRCx1QkFDRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFDZixJQUFJLEVBQUUsV0FBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFDckIsZUFBSyxDQUFDLElBQUksQ0FBQyxJQUNkLE9BQU87UUFDUCxRQUFRLEVBQ1IsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMscUJBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFDekQsVUFBVSxJQUNYO0FBQ0gsQ0FBQztBQW5CRCxzQ0FtQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEb2N1bWVudGF0aW9uTm9kZSB9IGZyb20gJ3hkb2MtcGFyc2VyL3NyYy9YRG9jQVNUTm9kZSc7XHJcbmltcG9ydCB7IFJlbWFya05vZGUgfSBmcm9tICd4ZG9jLXBhcnNlci9zcmMvWERvY1BhcnNlcic7XHJcbmltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcclxuaW1wb3J0IHsgdGV4dCB9IGZyb20gXCIuLi8uLi91dGlscy90ZXh0XCI7XHJcbmltcG9ydCByYW5nZSBmcm9tIFwiLi4vLi4vdXRpbHMvcmFuZ2VcIjtcclxuaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2VcIjtcclxuaW1wb3J0IFRleHRSYW5nZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9UZXh0UmFuZ2VcIjtcclxuaW1wb3J0IHhkb2MgZnJvbSAneGRvYy1wYXJzZXInO1xyXG5cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQVNUTm9kZSBleHRlbmRzIFRleHRSYW5nZSB7XHJcbiAgLyoqXHJcbiAgICogQHByb3BlcnR5IC0gVGhlIHR5cGUgb2Ygbm9kZS5cclxuICAgKi9cclxuICB0eXBlOiBzdHJpbmcsXHJcbiAgLyoqXHJcbiAgICogQHByb3BlcnR5IC0gVGhlIGNvbnRleHQgc3RyaW5nLlxyXG4gICAqL1xyXG4gIHRleHQ6IHN0cmluZyxcclxuICAvKipcclxuICAgKiBAcHJvcGVydHkgLSBUaGUgbm9kZSdzIGNoaWxkcmVuLlxyXG4gICAqL1xyXG4gIGNoaWxkcmVuOiBBU1ROb2RlW10gfCB1bmRlZmluZWRbXSxcclxuICAvKipcclxuICAgKiBAcHJvcGVydHkgLSBUaGUgY29udGV4dCBub2RlIHRoYXQgYSBjb21tZW50IG5vZGUgcmVmZXJzIHRvLlxyXG4gICAqL1xyXG4gIGNvbnRleHQ6IEFTVE5vZGUsXHJcbiAgLyoqXHJcbiAgICogQHByb3BlcnR5IC0gVGhlIHByb3BlcnRpZXMgdGhhdCBhIEFTVE5vZGUgbWF5IHBvc3Nlc3MuXHJcbiAgICovXHJcbiAgcHJvcGVydGllcz86IG9iamVjdFxyXG4gIC8qKlxyXG4gICAqIEBwcm9wZXJ0eSAtIFRoZSBwYXJzZWQgWERvYyBjb21tZW50LlxyXG4gICAqL1xyXG4gIGNvbW1lbnQ/OiB7XHJcbiAgICBtYXJrZG93bjogUmVtYXJrTm9kZSxcclxuICAgIGRvY3VtZW50YXRpb246IFBhcnRpYWw8RG9jdW1lbnRhdGlvbk5vZGU+XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQVNUTm9kZShzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSk6IEFTVE5vZGVcclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFTVE5vZGUoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUsIGNoaWxkcmVuOiBvYmplY3RbXSk6IEFTVE5vZGVcclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFTVE5vZGUoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUsIGNoaWxkcmVuOiBvYmplY3RbXSwgcHJvcGVydGllczogb2JqZWN0KVxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQVNUTm9kZShzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSwgY29udGV4dDogQVNUTm9kZSwgZG9jdW1lbnQ6IGJvb2xlYW4pOiBBU1ROb2RlIFxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQVNUTm9kZShzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSwgYXJnMT86IGFueSwgYXJnMj86IGFueSk6IEFTVE5vZGUge1xyXG5cclxuICBsZXQgY29udGV4dCwgY2hpbGRyZW4gPSBbXSwgZG9jdW1lbnQgPSB0eXBlb2YgYXJnMiA9PT0gJ2Jvb2xlYW4nICYmIGFyZzIgPT09IHRydWUsIHByb3BlcnRpZXM7XHJcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJnMSkpIGNoaWxkcmVuID0gYXJnMTtcclxuICBlbHNlIGNvbnRleHQgPSBhcmcxO1xyXG5cclxuICBpZiAodHlwZW9mIGFyZzIgPT09ICdvYmplY3QnKSB7XHJcbiAgICBwcm9wZXJ0aWVzID0gYXJnMjtcclxuICB9XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICB0eXBlOiBub2RlLnR5cGUsXHJcbiAgICB0ZXh0OiB0ZXh0KHNvdXJjZSwgbm9kZSksXHJcbiAgICAuLi5yYW5nZShub2RlKSxcclxuICAgIGNvbnRleHQsXHJcbiAgICBjaGlsZHJlbixcclxuICAgIGNvbW1lbnQ6IGRvY3VtZW50ID8geGRvYyhzb3VyY2UudGV4dCkucGFyc2UoKSA6IHVuZGVmaW5lZCxcclxuICAgIHByb3BlcnRpZXMsXHJcbiAgfVxyXG59XHJcbiJdfQ== \ No newline at end of file diff --git a/build/src/lang/common/emca.d.ts b/build/src/lang/common/emca.d.ts new file mode 100644 index 0000000..7d5678a --- /dev/null +++ b/build/src/lang/common/emca.d.ts @@ -0,0 +1,12 @@ +export interface NodeProperties { + exports: Partial; + inheritance: Partial; +} +export interface NodeExports { + export: boolean; + default: boolean; +} +export interface NodeInheritance { + extends: boolean; + implements: boolean; +} diff --git a/build/src/lang/common/emca.js b/build/src/lang/common/emca.js new file mode 100644 index 0000000..493260a --- /dev/null +++ b/build/src/lang/common/emca.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1jYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2NvbW1vbi9lbWNhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIE5vZGVQcm9wZXJ0aWVzIHtcclxuICBleHBvcnRzOiBQYXJ0aWFsPE5vZGVFeHBvcnRzPlxyXG4gIGluaGVyaXRhbmNlOiBQYXJ0aWFsPE5vZGVJbmhlcml0YW5jZT5cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBOb2RlRXhwb3J0cyB7XHJcbiAgZXhwb3J0OiBib29sZWFuLFxyXG4gIGRlZmF1bHQ6IGJvb2xlYW5cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBOb2RlSW5oZXJpdGFuY2Uge1xyXG4gIGV4dGVuZHM6IGJvb2xlYW4sXHJcbiAgaW1wbGVtZW50czogYm9vbGVhblxyXG59Il19 \ No newline at end of file diff --git a/build/src/lang/javascript/index.d.ts b/build/src/lang/javascript/index.d.ts index 89ada78..2bca672 100644 --- a/build/src/lang/javascript/index.d.ts +++ b/build/src/lang/javascript/index.d.ts @@ -16,5 +16,5 @@ export default class JavaScriptParser implements IParser { private options; private parser; constructor(file: Source, options: any); - parse: () => void; + parse: () => any[]; } diff --git a/build/src/lang/javascript/index.js b/build/src/lang/javascript/index.js index dc10aab..00c241b 100644 --- a/build/src/lang/javascript/index.js +++ b/build/src/lang/javascript/index.js @@ -45,6 +45,7 @@ class JavaScriptParser { // // .map(this.checkType) // .map(this.parseChildren) // } + return []; }; this.file = file; Object.assign(this.options = {}, options || {}); @@ -53,4 +54,4 @@ class JavaScriptParser { } } exports.default = JavaScriptParser; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy9qYXZhc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNDO0FBQ3RDLHFEQUFxRDtBQUdyRCxrREFBa0Q7QUFDbEQsb0RBQW9EO0FBRXBEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFxQixnQkFBZ0I7SUFJbkMsWUFBWSxJQUFZLEVBQUUsT0FBWTtRQU10QyxVQUFLLEdBQUcsR0FBRyxFQUFFO1lBQ1gsZ0RBQWdEO1lBQ2hELDJCQUEyQjtZQUMzQiw2Q0FBNkM7WUFDN0MsaURBQWlEO1lBQ2pELDhDQUE4QztZQUM5QyxnRUFBZ0U7WUFFaEUsNkNBQTZDO1lBQzdDLG9EQUFvRDtZQUNwRCwrQ0FBK0M7WUFDL0MsNkRBQTZEO1lBQzdELGdCQUFnQjtZQUNoQiw0Q0FBNEM7WUFDNUMsMkNBQTJDO1lBQzNDLDJDQUEyQztZQUMzQyw0Q0FBNEM7WUFDNUMsNkNBQTZDO1lBQzdDLDZDQUE2QztZQUM3QyxRQUFRO1lBQ1Isd0NBQXdDO1lBQ3hDLElBQUk7WUFDSixXQUFXO1lBQ1gscUJBQXFCO1lBQ3JCLGlFQUFpRTtZQUNqRSwrQkFBK0I7WUFDL0IsOEJBQThCO1lBQzlCLCtCQUErQjtZQUMvQixJQUFJO1FBQ04sQ0FBQyxDQUFBO1FBbENDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN0QyxDQUFDO0NBZ0ZGO0FBekZELG1DQXlGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFBhcnNlciBmcm9tICd0cmVlLXNpdHRlcic7XG5pbXBvcnQgKiBhcyBKYXZhU2NyaXB0IGZyb20gJ3RyZWUtc2l0dGVyLWphdmFzY3JpcHQnO1xuaW1wb3J0IElQYXJzZXIgZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9JUGFyc2VyJztcbmltcG9ydCBTb3VyY2UgZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2UnO1xuLy8gaW1wb3J0IElSZXN1bHQgZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9JUmVzdWx0Jztcbi8vIGltcG9ydCBJQ29tbWVudCBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lDb21tZW50JztcblxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgcGFyc2VzIEphdmFTY3JpcHQgY29tbWVudHMuXG4gKiBcbiAqICMgQVBJXG4gKiBcbiAqIGBgYFxuICogQGNsYXNzIEphdmFTY3JpcHRQYXJzZXJcbiAqIEBpbXBsZW1lbnRzIElQYXJzZXJcbiAqIEBleHBvcnQgZGVmYXVsdFxuICogYGBgXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEphdmFTY3JpcHRQYXJzZXIgaW1wbGVtZW50cyBJUGFyc2VyIHtcbiAgcHJpdmF0ZSBmaWxlOiBTb3VyY2U7XG4gIHByaXZhdGUgb3B0aW9uczogYW55O1xuICBwcml2YXRlIHBhcnNlcjogUGFyc2VyO1xuICBjb25zdHJ1Y3RvcihmaWxlOiBTb3VyY2UsIG9wdGlvbnM6IGFueSkge1xuICAgIHRoaXMuZmlsZSA9IGZpbGU7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdGlvbnMgPSB7fSwgb3B0aW9ucyB8fCB7fSk7XG4gICAgdGhpcy5wYXJzZXIgPSBuZXcgUGFyc2VyKCk7XG4gICAgdGhpcy5wYXJzZXIuc2V0TGFuZ3VhZ2UoSmF2YVNjcmlwdCk7XG4gIH1cbiAgcGFyc2UgPSAoKSA9PiB7XG4gICAgLy8gbGV0IHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZSh0aGlzLmZpbGUudGV4dCk7XG4gICAgLy8gLy8gR2V0IHRoZSBmaXJzdCBjb21tZW50XG4gICAgLy8gbGV0IGZpcnN0X2NvbW1lbnQgPSB0cmVlLnJvb3ROb2RlLmNoaWxkcmVuXG4gICAgLy8gICAuZmlsdGVyKG5vZGUgPT4gbm9kZS50eXBlID09PSBcImNvbW1lbnRcIilbMF07XG4gICAgLy8gY29uc3QgZmlyc3RfY29tbWVudF9zdHJpbmcgPSB0aGlzLmZpbGUudGV4dFxuICAgIC8vIC5zdWJzdHJpbmcoZmlyc3RfY29tbWVudC5zdGFydEluZGV4LCBmaXJzdF9jb21tZW50LmVuZEluZGV4KTtcbiAgICBcbiAgICAvLyAvLyBSZW1vdmUgYW55IGxlZ2FsIG9yIHVubmNlc3NhcnkgY29tbWVudHNcbiAgICAvLyBpZiAoZmlyc3RfY29tbWVudF9zdHJpbmcuaW5jbHVkZXMoXCJjb3B5cmlnaHRcIikgfHxcbiAgICAvLyAgIGZpcnN0X2NvbW1lbnRfc3RyaW5nLmluY2x1ZGVzKFwiYXV0aG9yXCIpIHx8XG4gICAgLy8gICBmaXJzdF9jb21tZW50X3N0cmluZy5pbmNsdWRlcyhcInRlcm1zIGFuZCBjb25kaXRpb25zXCIpKSB7XG4gICAgLy8gICB0cmVlLmVkaXQoe1xuICAgIC8vICAgICBzdGFydEluZGV4OiBmaXJzdF9jb21tZW50LnN0YXJ0SW5kZXgsXG4gICAgLy8gICAgIG9sZEVuZEluZGV4OiBmaXJzdF9jb21tZW50LmVuZEluZGV4LFxuICAgIC8vICAgICBuZXdFbmRJbmRleDogZmlyc3RfY29tbWVudC5lbmRJbmRleCxcbiAgICAvLyAgICAgc3RhcnRQb3NpdGlvbjogeyByb3c6IDAsIGNvbHVtbjogMCB9LFxuICAgIC8vICAgICBvbGRFbmRQb3NpdGlvbjogeyByb3c6IDAsIGNvbHVtbjogMCB9LFxuICAgIC8vICAgICBuZXdFbmRQb3NpdGlvbjogeyByb3c6IDAsIGNvbHVtbjogMCB9LFxuICAgIC8vICAgfSk7XG4gICAgLy8gICB0cmVlID0gdGhpcy5wYXJzZXIucGFyc2UoJycsIHRyZWUpO1xuICAgIC8vIH1cbiAgICAvLyByZXR1cm4ge1xuICAgIC8vICAgZmlsZTogdGhpcy5maWxlLFxuICAgIC8vICAgY29tbWVudHM6IENvbW1lbnRQYXJzZXIucGFyc2UodHJlZS5yb290Tm9kZSwgdGhpcy5maWxlLnRleHQpXG4gICAgLy8gICAgIC5maWx0ZXIodGhpcy5maWx0ZXJUeXBlKVxuICAgIC8vICAgICAvLyAubWFwKHRoaXMuY2hlY2tUeXBlKVxuICAgIC8vICAgICAubWFwKHRoaXMucGFyc2VDaGlsZHJlbilcbiAgICAvLyB9XG4gIH1cblxuICAvLyBwcml2YXRlIGZpbHRlclR5cGUgPSAoY29tbWVudCk6IGJvb2xlYW4gPT4ge1xuICAvLyAgIHJldHVybiAodGhpcy5vcHRpb25zLmZpbHRlciB8fFxuICAvLyAgICAgW1xuICAvLyAgICAgICAnZnVuY3Rpb24nLFxuICAvLyAgICAgICAnY2xhc3MnLFxuICAvLyAgICAgICAndmFyaWFibGVfZGVjbGFyYXRpb24nXG4gIC8vICAgICBdKS5pbmNsdWRlcyhjb21tZW50LmNvbnRleHQudHlwZSlcbiAgLy8gfVxuXG4gIC8vIHByaXZhdGUgY2hlY2tUeXBlID0gKGNvbW1lbnQpID0+IHtcbiAgLy8gICBjb25zdCB0cmVlID0gdGhpcy5wYXJzZXIucGFyc2UoY29tbWVudC5jb250ZXh0LnRleHQpO1xuICAvLyAgIHN3aXRjaCAoY29tbWVudC5jb250ZXh0LnR5cGUpIHtcbiAgLy8gICAgIGNhc2UgJ3ZhcmlhYmxlX2RlY2xhcmF0aW9uJzpcbiAgLy8gICAgICAgLy8gQ2hlY2sgd2hldGhlciB3ZSBoYXZlIGFuIGFub255bW91cyBjbGFzc1xuICAvLyAgICAgICBpZiAoY29tbWVudC5jb250ZXh0LnRleHQuaW5jbHVkZXMoXCJjbGFzc1wiKSkge1xuICAvLyAgICAgICAgIC8vIERyaWxsIGRvd24gdW50aWwgd2UgZmluZCB0aGUgY2xhc3MgYm9keVxuICAvLyAgICAgICAgIGNvbnN0IHZhcmlhYmxlX2RlY2xhcmF0b3IgPSB0cmVlLnJvb3ROb2RlLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzFdO1xuICAvLyAgICAgICAgIGNvbnN0IGFub255bW91c19jbGFzcyA9IHZhcmlhYmxlX2RlY2xhcmF0b3IuY2hpbGRyZW5cbiAgLy8gICAgICAgICAgIC5maWx0ZXIobm9kZSA9PiBub2RlLnR5cGUgPT09IFwiYW5vbnltb3VzX2NsYXNzXCIpWzBdXG4gIC8vICAgICAgICAgY29uc3QgY2xhc3NfYm9keSA9IGFub255bW91c19jbGFzcy5jaGlsZHJlblsxXTtcbiAgLy8gICAgICAgICBjb21tZW50LmNvbnRleHQuY2hpbGRyZW4gPSBDb21tZW50UGFyc2VyLnBhcnNlKFxuICAvLyAgICAgICAgICAgY2xhc3NfYm9keSxcbiAgLy8gICAgICAgICAgIGNvbW1lbnQuY29udGV4dC50ZXh0LFxuICAvLyAgICAgICAgICAgeyBsb2NhdGlvbjogY29tbWVudC5jb250ZXh0LmxvY2F0aW9uLCBwb3NpdGlvbjogY29tbWVudC5jb250ZXh0LnBvc2l0aW9uIH1cbiAgLy8gICAgICAgICApO1xuICAvLyAgICAgICB9XG4gIC8vICAgICAgIGJyZWFrO1xuICAvLyAgICAgZGVmYXVsdDpcbiAgLy8gICAgICAgYnJlYWs7XG4gIC8vICAgfVxuICAvLyAgIHJldHVybiBjb21tZW50O1xuICAvLyB9XG5cbiAgLy8gcHJpdmF0ZSBwYXJzZUNoaWxkcmVuID0gKGNvbW1lbnQpID0+IHtcbiAgLy8gICBzd2l0Y2ggKGNvbW1lbnQuY29udGV4dC50eXBlKSB7XG4gIC8vICAgICBjYXNlICdjbGFzcyc6XG4gIC8vICAgICAgIGNvbnN0IHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZShjb21tZW50LmNvbnRleHQudGV4dCk7XG4gIC8vICAgICAgIGNvbW1lbnQuY29udGV4dC5jaGlsZHJlbiA9IENvbW1lbnRQYXJzZXIucGFyc2UoXG4gIC8vICAgICAgICAgdHJlZS5yb290Tm9kZSxcbiAgLy8gICAgICAgICBjb21tZW50LmNvbnRleHQudGV4dCxcbiAgLy8gICAgICAgICB7IGxvY2F0aW9uOiBjb21tZW50LmNvbnRleHQubG9jYXRpb24sIHBvc2l0aW9uOiBjb21tZW50LmNvbnRleHQucG9zaXRpb24gfVxuICAvLyAgICAgICApLmZpbHRlcihjaGlsZCA9PiBjaGlsZC5jb250ZXh0LnR5cGUgPT09ICdtZXRob2RfZGVmaW5pdGlvbicpO1xuICAvLyAgICAgICBicmVhaztcbiAgLy8gICAgIGRlZmF1bHQ6XG4gIC8vICAgICAgIGJyZWFrO1xuICAvLyAgIH1cbiAgLy8gICByZXR1cm4gY29tbWVudDtcbiAgLy8gfVxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy9qYXZhc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNDO0FBQ3RDLHFEQUFxRDtBQUdyRCxrREFBa0Q7QUFDbEQsb0RBQW9EO0FBRXBEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFxQixnQkFBZ0I7SUFJbkMsWUFBWSxJQUFZLEVBQUUsT0FBWTtRQU10QyxVQUFLLEdBQUcsR0FBRyxFQUFFO1lBQ1gsZ0RBQWdEO1lBQ2hELDJCQUEyQjtZQUMzQiw2Q0FBNkM7WUFDN0MsaURBQWlEO1lBQ2pELDhDQUE4QztZQUM5QyxnRUFBZ0U7WUFFaEUsNkNBQTZDO1lBQzdDLG9EQUFvRDtZQUNwRCwrQ0FBK0M7WUFDL0MsNkRBQTZEO1lBQzdELGdCQUFnQjtZQUNoQiw0Q0FBNEM7WUFDNUMsMkNBQTJDO1lBQzNDLDJDQUEyQztZQUMzQyw0Q0FBNEM7WUFDNUMsNkNBQTZDO1lBQzdDLDZDQUE2QztZQUM3QyxRQUFRO1lBQ1Isd0NBQXdDO1lBQ3hDLElBQUk7WUFDSixXQUFXO1lBQ1gscUJBQXFCO1lBQ3JCLGlFQUFpRTtZQUNqRSwrQkFBK0I7WUFDL0IsOEJBQThCO1lBQzlCLCtCQUErQjtZQUMvQixJQUFJO1lBQ0osT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDLENBQUE7UUFuQ0MsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Q0FrRkY7QUEzRkQsbUNBMkZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcclxuaW1wb3J0ICogYXMgSmF2YVNjcmlwdCBmcm9tICd0cmVlLXNpdHRlci1qYXZhc2NyaXB0JztcclxuaW1wb3J0IElQYXJzZXIgZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9JUGFyc2VyJztcclxuaW1wb3J0IFNvdXJjZSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZSc7XHJcbi8vIGltcG9ydCBJUmVzdWx0IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvSVJlc3VsdCc7XHJcbi8vIGltcG9ydCBJQ29tbWVudCBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lDb21tZW50JztcclxuXHJcbi8qKlxyXG4gKiBBIGNsYXNzIHRoYXQgcGFyc2VzIEphdmFTY3JpcHQgY29tbWVudHMuXHJcbiAqIFxyXG4gKiAjIEFQSVxyXG4gKiBcclxuICogYGBgXHJcbiAqIEBjbGFzcyBKYXZhU2NyaXB0UGFyc2VyXHJcbiAqIEBpbXBsZW1lbnRzIElQYXJzZXJcclxuICogQGV4cG9ydCBkZWZhdWx0XHJcbiAqIGBgYFxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSmF2YVNjcmlwdFBhcnNlciBpbXBsZW1lbnRzIElQYXJzZXIge1xyXG4gIHByaXZhdGUgZmlsZTogU291cmNlO1xyXG4gIHByaXZhdGUgb3B0aW9uczogYW55O1xyXG4gIHByaXZhdGUgcGFyc2VyOiBQYXJzZXI7XHJcbiAgY29uc3RydWN0b3IoZmlsZTogU291cmNlLCBvcHRpb25zOiBhbnkpIHtcclxuICAgIHRoaXMuZmlsZSA9IGZpbGU7XHJcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucyA9IHt9LCBvcHRpb25zIHx8IHt9KTtcclxuICAgIHRoaXMucGFyc2VyID0gbmV3IFBhcnNlcigpO1xyXG4gICAgdGhpcy5wYXJzZXIuc2V0TGFuZ3VhZ2UoSmF2YVNjcmlwdCk7XHJcbiAgfVxyXG4gIHBhcnNlID0gKCkgPT4ge1xyXG4gICAgLy8gbGV0IHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZSh0aGlzLmZpbGUudGV4dCk7XHJcbiAgICAvLyAvLyBHZXQgdGhlIGZpcnN0IGNvbW1lbnRcclxuICAgIC8vIGxldCBmaXJzdF9jb21tZW50ID0gdHJlZS5yb290Tm9kZS5jaGlsZHJlblxyXG4gICAgLy8gICAuZmlsdGVyKG5vZGUgPT4gbm9kZS50eXBlID09PSBcImNvbW1lbnRcIilbMF07XHJcbiAgICAvLyBjb25zdCBmaXJzdF9jb21tZW50X3N0cmluZyA9IHRoaXMuZmlsZS50ZXh0XHJcbiAgICAvLyAuc3Vic3RyaW5nKGZpcnN0X2NvbW1lbnQuc3RhcnRJbmRleCwgZmlyc3RfY29tbWVudC5lbmRJbmRleCk7XHJcbiAgICBcclxuICAgIC8vIC8vIFJlbW92ZSBhbnkgbGVnYWwgb3IgdW5uY2Vzc2FyeSBjb21tZW50c1xyXG4gICAgLy8gaWYgKGZpcnN0X2NvbW1lbnRfc3RyaW5nLmluY2x1ZGVzKFwiY29weXJpZ2h0XCIpIHx8XHJcbiAgICAvLyAgIGZpcnN0X2NvbW1lbnRfc3RyaW5nLmluY2x1ZGVzKFwiYXV0aG9yXCIpIHx8XHJcbiAgICAvLyAgIGZpcnN0X2NvbW1lbnRfc3RyaW5nLmluY2x1ZGVzKFwidGVybXMgYW5kIGNvbmRpdGlvbnNcIikpIHtcclxuICAgIC8vICAgdHJlZS5lZGl0KHtcclxuICAgIC8vICAgICBzdGFydEluZGV4OiBmaXJzdF9jb21tZW50LnN0YXJ0SW5kZXgsXHJcbiAgICAvLyAgICAgb2xkRW5kSW5kZXg6IGZpcnN0X2NvbW1lbnQuZW5kSW5kZXgsXHJcbiAgICAvLyAgICAgbmV3RW5kSW5kZXg6IGZpcnN0X2NvbW1lbnQuZW5kSW5kZXgsXHJcbiAgICAvLyAgICAgc3RhcnRQb3NpdGlvbjogeyByb3c6IDAsIGNvbHVtbjogMCB9LFxyXG4gICAgLy8gICAgIG9sZEVuZFBvc2l0aW9uOiB7IHJvdzogMCwgY29sdW1uOiAwIH0sXHJcbiAgICAvLyAgICAgbmV3RW5kUG9zaXRpb246IHsgcm93OiAwLCBjb2x1bW46IDAgfSxcclxuICAgIC8vICAgfSk7XHJcbiAgICAvLyAgIHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZSgnJywgdHJlZSk7XHJcbiAgICAvLyB9XHJcbiAgICAvLyByZXR1cm4ge1xyXG4gICAgLy8gICBmaWxlOiB0aGlzLmZpbGUsXHJcbiAgICAvLyAgIGNvbW1lbnRzOiBDb21tZW50UGFyc2VyLnBhcnNlKHRyZWUucm9vdE5vZGUsIHRoaXMuZmlsZS50ZXh0KVxyXG4gICAgLy8gICAgIC5maWx0ZXIodGhpcy5maWx0ZXJUeXBlKVxyXG4gICAgLy8gICAgIC8vIC5tYXAodGhpcy5jaGVja1R5cGUpXHJcbiAgICAvLyAgICAgLm1hcCh0aGlzLnBhcnNlQ2hpbGRyZW4pXHJcbiAgICAvLyB9XHJcbiAgICByZXR1cm4gW107XHJcbiAgfVxyXG5cclxuICAvLyBwcml2YXRlIGZpbHRlclR5cGUgPSAoY29tbWVudCk6IGJvb2xlYW4gPT4ge1xyXG4gIC8vICAgcmV0dXJuICh0aGlzLm9wdGlvbnMuZmlsdGVyIHx8XHJcbiAgLy8gICAgIFtcclxuICAvLyAgICAgICAnZnVuY3Rpb24nLFxyXG4gIC8vICAgICAgICdjbGFzcycsXHJcbiAgLy8gICAgICAgJ3ZhcmlhYmxlX2RlY2xhcmF0aW9uJ1xyXG4gIC8vICAgICBdKS5pbmNsdWRlcyhjb21tZW50LmNvbnRleHQudHlwZSlcclxuICAvLyB9XHJcblxyXG4gIC8vIHByaXZhdGUgY2hlY2tUeXBlID0gKGNvbW1lbnQpID0+IHtcclxuICAvLyAgIGNvbnN0IHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZShjb21tZW50LmNvbnRleHQudGV4dCk7XHJcbiAgLy8gICBzd2l0Y2ggKGNvbW1lbnQuY29udGV4dC50eXBlKSB7XHJcbiAgLy8gICAgIGNhc2UgJ3ZhcmlhYmxlX2RlY2xhcmF0aW9uJzpcclxuICAvLyAgICAgICAvLyBDaGVjayB3aGV0aGVyIHdlIGhhdmUgYW4gYW5vbnltb3VzIGNsYXNzXHJcbiAgLy8gICAgICAgaWYgKGNvbW1lbnQuY29udGV4dC50ZXh0LmluY2x1ZGVzKFwiY2xhc3NcIikpIHtcclxuICAvLyAgICAgICAgIC8vIERyaWxsIGRvd24gdW50aWwgd2UgZmluZCB0aGUgY2xhc3MgYm9keVxyXG4gIC8vICAgICAgICAgY29uc3QgdmFyaWFibGVfZGVjbGFyYXRvciA9IHRyZWUucm9vdE5vZGUuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMV07XHJcbiAgLy8gICAgICAgICBjb25zdCBhbm9ueW1vdXNfY2xhc3MgPSB2YXJpYWJsZV9kZWNsYXJhdG9yLmNoaWxkcmVuXHJcbiAgLy8gICAgICAgICAgIC5maWx0ZXIobm9kZSA9PiBub2RlLnR5cGUgPT09IFwiYW5vbnltb3VzX2NsYXNzXCIpWzBdXHJcbiAgLy8gICAgICAgICBjb25zdCBjbGFzc19ib2R5ID0gYW5vbnltb3VzX2NsYXNzLmNoaWxkcmVuWzFdO1xyXG4gIC8vICAgICAgICAgY29tbWVudC5jb250ZXh0LmNoaWxkcmVuID0gQ29tbWVudFBhcnNlci5wYXJzZShcclxuICAvLyAgICAgICAgICAgY2xhc3NfYm9keSxcclxuICAvLyAgICAgICAgICAgY29tbWVudC5jb250ZXh0LnRleHQsXHJcbiAgLy8gICAgICAgICAgIHsgbG9jYXRpb246IGNvbW1lbnQuY29udGV4dC5sb2NhdGlvbiwgcG9zaXRpb246IGNvbW1lbnQuY29udGV4dC5wb3NpdGlvbiB9XHJcbiAgLy8gICAgICAgICApO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgZGVmYXVsdDpcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgIH1cclxuICAvLyAgIHJldHVybiBjb21tZW50O1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gcHJpdmF0ZSBwYXJzZUNoaWxkcmVuID0gKGNvbW1lbnQpID0+IHtcclxuICAvLyAgIHN3aXRjaCAoY29tbWVudC5jb250ZXh0LnR5cGUpIHtcclxuICAvLyAgICAgY2FzZSAnY2xhc3MnOlxyXG4gIC8vICAgICAgIGNvbnN0IHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZShjb21tZW50LmNvbnRleHQudGV4dCk7XHJcbiAgLy8gICAgICAgY29tbWVudC5jb250ZXh0LmNoaWxkcmVuID0gQ29tbWVudFBhcnNlci5wYXJzZShcclxuICAvLyAgICAgICAgIHRyZWUucm9vdE5vZGUsXHJcbiAgLy8gICAgICAgICBjb21tZW50LmNvbnRleHQudGV4dCxcclxuICAvLyAgICAgICAgIHsgbG9jYXRpb246IGNvbW1lbnQuY29udGV4dC5sb2NhdGlvbiwgcG9zaXRpb246IGNvbW1lbnQuY29udGV4dC5wb3NpdGlvbiB9XHJcbiAgLy8gICAgICAgKS5maWx0ZXIoY2hpbGQgPT4gY2hpbGQuY29udGV4dC50eXBlID09PSAnbWV0aG9kX2RlZmluaXRpb24nKTtcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgZGVmYXVsdDpcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgIH1cclxuICAvLyAgIHJldHVybiBjb21tZW50O1xyXG4gIC8vIH1cclxuXHJcbn0iXX0= \ No newline at end of file diff --git a/build/src/lang/typescript/index.d.ts b/build/src/lang/typescript/index.d.ts index 2e585b8..1027695 100644 --- a/build/src/lang/typescript/index.d.ts +++ b/build/src/lang/typescript/index.d.ts @@ -16,5 +16,5 @@ export default class TypeScriptParser implements IParser { private options; private parser; constructor(file: Source, options: any); - parse: () => object[]; + parse: () => import("../common/ast").ASTNode[]; } diff --git a/build/src/lang/typescript/index.js b/build/src/lang/typescript/index.js index 668d3c1..0069d66 100644 --- a/build/src/lang/typescript/index.js +++ b/build/src/lang/typescript/index.js @@ -2,8 +2,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); const Parser = require("tree-sitter"); const TypeScript = require("tree-sitter-typescript"); -const walk_1 = require("./walk"); -const visitor_1 = require("./visitors/visitor"); +const walk_1 = require("../../utils/walk"); +const visitor_1 = require("./visitor"); /** * A class that parses JavaScript comments. * @@ -32,4 +32,4 @@ class TypeScriptParser { } } exports.default = TypeScriptParser; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy90eXBlc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNDO0FBQ3RDLHFEQUFxRDtBQUdyRCxpQ0FBMEI7QUFDMUIsZ0RBQXVEO0FBR3ZEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFxQixnQkFBZ0I7SUFJbkMsWUFBWSxJQUFZLEVBQUUsT0FBWTtRQU10QyxVQUFLLEdBQUcsR0FBRyxFQUFFO1lBQ1gsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtnQkFDcEMsTUFBTSxPQUFPLEdBQUcsSUFBSSwyQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ25ELGNBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNuQyxPQUFPLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUN6QjtRQUNILENBQUMsQ0FBQTtRQVpDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN0QyxDQUFDO0NBU0Y7QUFsQkQsbUNBa0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcbmltcG9ydCAqIGFzIFR5cGVTY3JpcHQgZnJvbSAndHJlZS1zaXR0ZXItdHlwZXNjcmlwdCc7XG5pbXBvcnQgSVBhcnNlciBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lQYXJzZXInO1xuaW1wb3J0IFNvdXJjZSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZSc7XG5pbXBvcnQgd2FsayBmcm9tICcuL3dhbGsnO1xuaW1wb3J0IHsgVHlwZVNjcmlwdFZpc2l0b3IgfSBmcm9tICcuL3Zpc2l0b3JzL3Zpc2l0b3InO1xuXG5cbi8qKlxuICogQSBjbGFzcyB0aGF0IHBhcnNlcyBKYXZhU2NyaXB0IGNvbW1lbnRzLlxuICogXG4gKiAjIEFQSVxuICogXG4gKiBgYGBcbiAqIEBjbGFzcyBKYXZhU2NyaXB0UGFyc2VyXG4gKiBAaW1wbGVtZW50cyBJUGFyc2VyXG4gKiBAZXhwb3J0IGRlZmF1bHRcbiAqIGBgYFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUeXBlU2NyaXB0UGFyc2VyIGltcGxlbWVudHMgSVBhcnNlciB7XG4gIHByaXZhdGUgc291cmNlOiBTb3VyY2U7XG4gIHByaXZhdGUgb3B0aW9uczogYW55O1xuICBwcml2YXRlIHBhcnNlcjogUGFyc2VyO1xuICBjb25zdHJ1Y3RvcihmaWxlOiBTb3VyY2UsIG9wdGlvbnM6IGFueSkge1xuICAgIHRoaXMuc291cmNlID0gZmlsZTtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucyA9IHt9LCBvcHRpb25zIHx8IHt9KTtcbiAgICB0aGlzLnBhcnNlciA9IG5ldyBQYXJzZXIoKTtcbiAgICB0aGlzLnBhcnNlci5zZXRMYW5ndWFnZShUeXBlU2NyaXB0KTtcbiAgfVxuICBwYXJzZSA9ICgpID0+IHtcbiAgICBjb25zdCB0cmVlID0gdGhpcy5wYXJzZXIucGFyc2UodGhpcy5zb3VyY2UudGV4dCk7XG4gICAgaWYgKHRyZWUucm9vdE5vZGUudHlwZSA9PT0gXCJwcm9ncmFtXCIpIHtcbiAgICAgIGNvbnN0IHZpc2l0b3IgPSBuZXcgVHlwZVNjcmlwdFZpc2l0b3IodGhpcy5zb3VyY2UpO1xuICAgICAgd2Fsayh0cmVlLnJvb3ROb2RlKS52aXNpdCh2aXNpdG9yKTtcbiAgICAgIHJldHVybiB2aXNpdG9yLmdldEFTVCgpO1xuICAgIH1cbiAgfVxufVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy90eXBlc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNDO0FBQ3RDLHFEQUFxRDtBQUdyRCwyQ0FBb0M7QUFDcEMsdUNBQThDO0FBRzlDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFxQixnQkFBZ0I7SUFJbkMsWUFBWSxJQUFZLEVBQUUsT0FBWTtRQU10QyxVQUFLLEdBQUcsR0FBRyxFQUFFO1lBQ1gsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtnQkFDcEMsTUFBTSxPQUFPLEdBQUcsSUFBSSwyQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ25ELGNBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNuQyxPQUFPLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUN6QjtRQUNILENBQUMsQ0FBQTtRQVpDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN0QyxDQUFDO0NBU0Y7QUFsQkQsbUNBa0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcclxuaW1wb3J0ICogYXMgVHlwZVNjcmlwdCBmcm9tICd0cmVlLXNpdHRlci10eXBlc2NyaXB0JztcclxuaW1wb3J0IElQYXJzZXIgZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9JUGFyc2VyJztcclxuaW1wb3J0IFNvdXJjZSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZSc7XHJcbmltcG9ydCB3YWxrIGZyb20gJy4uLy4uL3V0aWxzL3dhbGsnO1xyXG5pbXBvcnQgeyBUeXBlU2NyaXB0VmlzaXRvciB9IGZyb20gJy4vdmlzaXRvcic7XHJcblxyXG5cclxuLyoqXHJcbiAqIEEgY2xhc3MgdGhhdCBwYXJzZXMgSmF2YVNjcmlwdCBjb21tZW50cy5cclxuICogXHJcbiAqICMgQVBJXHJcbiAqIFxyXG4gKiBgYGBcclxuICogQGNsYXNzIEphdmFTY3JpcHRQYXJzZXJcclxuICogQGltcGxlbWVudHMgSVBhcnNlclxyXG4gKiBAZXhwb3J0IGRlZmF1bHRcclxuICogYGBgXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUeXBlU2NyaXB0UGFyc2VyIGltcGxlbWVudHMgSVBhcnNlciB7XHJcbiAgcHJpdmF0ZSBzb3VyY2U6IFNvdXJjZTtcclxuICBwcml2YXRlIG9wdGlvbnM6IGFueTtcclxuICBwcml2YXRlIHBhcnNlcjogUGFyc2VyO1xyXG4gIGNvbnN0cnVjdG9yKGZpbGU6IFNvdXJjZSwgb3B0aW9uczogYW55KSB7XHJcbiAgICB0aGlzLnNvdXJjZSA9IGZpbGU7XHJcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucyA9IHt9LCBvcHRpb25zIHx8IHt9KTtcclxuICAgIHRoaXMucGFyc2VyID0gbmV3IFBhcnNlcigpO1xyXG4gICAgdGhpcy5wYXJzZXIuc2V0TGFuZ3VhZ2UoVHlwZVNjcmlwdCk7XHJcbiAgfVxyXG4gIHBhcnNlID0gKCkgPT4ge1xyXG4gICAgY29uc3QgdHJlZSA9IHRoaXMucGFyc2VyLnBhcnNlKHRoaXMuc291cmNlLnRleHQpO1xyXG4gICAgaWYgKHRyZWUucm9vdE5vZGUudHlwZSA9PT0gXCJwcm9ncmFtXCIpIHtcclxuICAgICAgY29uc3QgdmlzaXRvciA9IG5ldyBUeXBlU2NyaXB0VmlzaXRvcih0aGlzLnNvdXJjZSk7XHJcbiAgICAgIHdhbGsodHJlZS5yb290Tm9kZSkudmlzaXQodmlzaXRvcik7XHJcbiAgICAgIHJldHVybiB2aXNpdG9yLmdldEFTVCgpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0= \ No newline at end of file diff --git a/build/src/lang/typescript/visitor.d.ts b/build/src/lang/typescript/visitor.d.ts new file mode 100644 index 0000000..91ef6a2 --- /dev/null +++ b/build/src/lang/typescript/visitor.d.ts @@ -0,0 +1,53 @@ +import { SyntaxNode } from "tree-sitter"; +import Source from "../../interfaces/Source"; +import { ASTNode } from "../common/ast"; +export interface TreeSitterNode { + visit(visitor: NodeVisitor): void; +} +export interface NodeVisitor { + getAST(): ASTNode[]; + visitNode(node: SyntaxNode): ASTNode; + visitChildren(nodes: SyntaxNode[]): ASTNode[]; +} +export declare class Node implements TreeSitterNode { + syntaxNode: SyntaxNode; + constructor(syntaxNode: SyntaxNode); + visit: (visitor: NodeVisitor) => void; +} +export declare class TypeScriptVisitor implements NodeVisitor { + private ast; + private source; + private parent; + constructor(source: Source); + /** + * Determines whether a node has inheritance + */ + private hasInheritance; + /** + * Returns a node's inheritance type + */ + private getInheritanceType; + private filterComments; + getAST(): ASTNode[]; + visitNode: (node: SyntaxNode) => ASTNode; + visitChildren: (nodes: SyntaxNode[]) => ASTNode[]; + private visitProgram; + private visitComment; + /** + * Visit the contextual node + * + * # Remark + * + * A node is considered contextual when a comment is visited and the node is its sibling. + */ + private visitContext; + private visitInterfaceDeclaration; + private visitInterface; + private visitSignature; + private visitTypeNode; + private visitConstraint; + private visitInheritanceClause; + private visitFormalParamters; + private visitRequiredParameter; + private visitTerminal; +} diff --git a/build/src/lang/typescript/visitor.js b/build/src/lang/typescript/visitor.js new file mode 100644 index 0000000..26724d5 --- /dev/null +++ b/build/src/lang/typescript/visitor.js @@ -0,0 +1,190 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const comment_1 = require("../../utils/comment"); +const sibling_1 = require("../../utils/sibling"); +const log_1 = require("../../utils/log"); +const match_1 = require("../../utils/match"); +const ast_1 = require("../common/ast"); +class Node { + constructor(syntaxNode) { + this.syntaxNode = syntaxNode; + this.visit = (visitor) => { + visitor.visitNode(this.syntaxNode); + }; + } +} +exports.Node = Node; +class TypeScriptVisitor { + constructor(source) { + this.ast = []; + /* Visitors */ + this.visitNode = (node) => { + switch (node.type) { + case 'program': + this.parent = node; + this.ast = this.visitProgram(node); + case 'comment': + return this.visitComment(node); + case 'MISSING': + case 'ERROR': + log_1.default.report(this.source, node, log_1.ErrorType.TreeSitterParseError); + break; + default: + /* Match other non-terminals */ + if (match_1.default(node, 'constraint')) { + return this.visitConstraint(node); + } + if (match_1.default(node, 'formal_parameters')) { + return this.visitFormalParamters(node); + } + if (match_1.default(node, 'required_parameter')) { + return this.visitRequiredParameter(node); + } + if (match_1.default(node, 'type_identifier', 'type_parameters', 'type_parameter', 'type_annotation', 'object_type', 'predefined_type')) { + return this.visitTypeNode(node); + } + if (match_1.default(node, 'extends_clause')) { + return this.visitInheritanceClause(node); + } + // A call_signature can also be a non-contextual node + if (match_1.default(node, 'call_signature')) { + return this.visitSignature(node); + } + /* Match terminals */ + if (match_1.default(node, 'identifier', 'extends', 'property_identifier', 'string', 'void', 'boolean', 'null', 'undefined', 'number')) { + return this.visitTerminal(node); + } + log_1.default.report(this.source, node, log_1.ErrorType.NodeTypeNotYetSupported); + break; + } + }; + this.visitChildren = (nodes) => { + return nodes + .filter(child => !child.type.match(/[<>(){},:;\[\]]/)) + .map(this.visitNode.bind(this)).filter(child => !!child); + }; + this.visitProgram = (node) => { + return this.visitChildren(this.filterComments(node)); + }; + this.visitComment = (node) => { + if (comment_1.isJavaDocComment(this.source, node)) { + const nextSibling = sibling_1.sibling(node); + if (nextSibling) { + return ast_1.createASTNode(this.source, node, this.visitContext(nextSibling, {}), true); + } + } + }; + /** + * Visit the contextual node + * + * # Remark + * + * A node is considered contextual when a comment is visited and the node is its sibling. + */ + this.visitContext = (node, properties) => { + switch (node.type) { + case 'interface_declaration': + this.parent = node; + return this.visitInterfaceDeclaration(node, properties); + case 'call_signature': + case 'method_signature': + return this.visitSignature(node, properties); + default: + log_1.default.report(this.source, node, log_1.ErrorType.NodeTypeNotYetSupported); + break; + } + }; + /* Declarations */ + this.visitInterfaceDeclaration = (node, properties) => { + // Shorten the node from 'interface_declaration' to 'interface' + return this.visitInterface(node, properties); + }; + this.visitInterface = (node, properties) => { + // Since 'interface' is element in the array + // we'll need to remove it from the array. + let children = node.children; + const interface_ = children.shift(); + let extends_ = false, implements_ = false; + if (this.hasInheritance(node)) { + const inheritance = this.getInheritanceType(node); + extends_ = inheritance === 'extends'; + implements_ = inheritance === 'implements'; + } + const node_ = ast_1.createASTNode(this.source, node, this.visitChildren(children), Object.assign(properties || {}, { + inheritance: { + implements: implements_, + extends: extends_ + } + })); + // Overwrite the node type from 'interface_declaration' to 'interface' + return Object.assign(node_, { type: interface_.type }); + }; + /* Signatures */ + this.visitSignature = (node, properties) => { + return ast_1.createASTNode(this.source, node, this.visitChildren(node.children), properties); + }; + /* Types */ + this.visitTypeNode = (node) => { + switch (node.type) { + case 'type_identifier': + return this.visitTerminal(node); + case 'type_parameters': + case 'type_parameter': + case 'type_annotation': + case 'predefined_type': + return ast_1.createASTNode(this.source, node, this.visitChildren(node.children)); + case 'object_type': + return ast_1.createASTNode(this.source, node, this.visitChildren(this.filterComments(node))); + default: + log_1.default.report(this.source, node, log_1.ErrorType.NodeTypeNotYetSupported); + break; + } + }; + /* Other non-terminals */ + this.visitConstraint = (node) => { + return ast_1.createASTNode(this.source, node, this.visitChildren(node.children)); + }; + this.visitInheritanceClause = (node) => { + return ast_1.createASTNode(this.source, node, this.visitChildren(node.children)); + }; + this.visitFormalParamters = (node) => { + return ast_1.createASTNode(this.source, node, this.visitChildren(node.children)); + }; + this.visitRequiredParameter = (node) => { + return ast_1.createASTNode(this.source, node, this.visitChildren(node.children)); + }; + /* Terminals */ + this.visitTerminal = (node) => { + return ast_1.createASTNode(this.source, node); + }; + this.source = source; + } + /** + * Determines whether a node has inheritance + */ + hasInheritance(node) { + return node.children + .filter(node => { + return node.type.includes('extends') || node.type.includes('implements'); + }).length > 0; + } + /** + * Returns a node's inheritance type + */ + getInheritanceType(node) { + if (node.children.filter(node => node.type.includes('extends'))) { + return 'extends'; + } + if (node.children.filter(node => node.type.includes('implements'))) { + return 'implements'; + } + } + filterComments(node) { + return node.children.filter(child => match_1.default(child, 'comment')); + } + getAST() { + return this.ast; + } +} +exports.TypeScriptVisitor = TypeScriptVisitor; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLGlEQUF1RDtBQUN2RCxpREFBOEM7QUFHOUMseUNBQWlEO0FBQ2pELDZDQUFzQztBQUd0Qyx1Q0FBdUQ7QUFhdkQsTUFBYSxJQUFJO0lBQ2YsWUFBbUIsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN6QyxVQUFLLEdBQUcsQ0FBQyxPQUFvQixFQUFRLEVBQUU7WUFDckMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFBO0lBSDRDLENBQUM7Q0FJL0M7QUFMRCxvQkFLQztBQUVELE1BQWEsaUJBQWlCO0lBSTVCLFlBQVksTUFBYztRQUhsQixRQUFHLEdBQWMsRUFBRSxDQUFBO1FBcUMzQixlQUFlO1FBRWYsY0FBUyxHQUFHLENBQ1YsSUFBZ0IsRUFDaEIsRUFBRTtZQUNGLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDakIsS0FBSyxTQUFTO29CQUNaLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO29CQUNuQixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3JDLEtBQUssU0FBUztvQkFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pDLEtBQUssU0FBUyxDQUFDO2dCQUNmLEtBQUssT0FBTztvQkFDVixhQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO29CQUM5RCxNQUFNO2dCQUNSO29CQUVFLCtCQUErQjtvQkFFL0IsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxFQUFFO3dCQUM3QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUE7cUJBQ2xDO29CQUVELElBQUksZUFBSyxDQUFDLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxFQUFFO3dCQUNwQyxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDeEM7b0JBRUQsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUFFLG9CQUFvQixDQUFDLEVBQUU7d0JBQ3JDLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUMxQztvQkFFRCxJQUFJLGVBQUssQ0FBQyxJQUFJLEVBQ1osaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQ3pFLGFBQWEsRUFBRSxpQkFBaUIsQ0FDakMsRUFBRTt3QkFDRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUE7cUJBQ2hDO29CQUVELElBQUksZUFBSyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFO3dCQUNqQyxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDMUM7b0JBRUQscURBQXFEO29CQUNyRCxJQUFJLGVBQUssQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsRUFBRTt3QkFDakMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFBO3FCQUNqQztvQkFFRCxxQkFBcUI7b0JBQ3JCLElBQUksZUFBSyxDQUFDLElBQUksRUFDWixZQUFZLEVBQUUsU0FBUyxFQUFFLHFCQUFxQixFQUM5QyxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLFFBQVEsQ0FDM0QsRUFBRTt3QkFDRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQ2pDO29CQUVELGFBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsZUFBUyxDQUFDLHVCQUF1QixDQUFDLENBQUM7b0JBRWpFLE1BQU07YUFDVDtRQUNILENBQUMsQ0FBQTtRQUVELGtCQUFhLEdBQUcsQ0FBQyxLQUFtQixFQUFhLEVBQUU7WUFDakQsT0FDRSxLQUFLO2lCQUNGLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztpQkFDckQsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUNqQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUE7UUFFTyxpQkFBWSxHQUFHLENBQUMsSUFBZ0IsRUFBYSxFQUFFO1lBQ3JELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdkQsQ0FBQyxDQUFBO1FBRU8saUJBQVksR0FBRyxDQUFDLElBQWdCLEVBQVcsRUFBRTtZQUNuRCxJQUFJLDBCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ3ZDLE1BQU0sV0FBVyxHQUFHLGlCQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2xDLElBQUksV0FBVyxFQUFFO29CQUNmLE9BQU8sbUJBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtpQkFDbEY7YUFDRjtRQUNILENBQUMsQ0FBQTtRQUVEOzs7Ozs7V0FNRztRQUNLLGlCQUFZLEdBQUcsQ0FBQyxJQUFnQixFQUFFLFVBQW9DLEVBQVcsRUFBRTtZQUN6RixRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ2pCLEtBQUssdUJBQXVCO29CQUMxQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztvQkFDbkIsT0FBTyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFBO2dCQUN6RCxLQUFLLGdCQUFnQixDQUFDO2dCQUN0QixLQUFLLGtCQUFrQjtvQkFDckIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDL0M7b0JBQ0UsYUFBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxlQUFTLENBQUMsdUJBQXVCLENBQUMsQ0FBQztvQkFDakUsTUFBTTthQUNUO1FBQ0gsQ0FBQyxDQUFBO1FBRUQsa0JBQWtCO1FBRVYsOEJBQXlCLEdBQUcsQ0FBQyxJQUFnQixFQUFFLFVBQW9DLEVBQVcsRUFBRTtZQUN0RywrREFBK0Q7WUFDL0QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQTtRQUM5QyxDQUFDLENBQUE7UUFFTyxtQkFBYyxHQUFHLENBQUMsSUFBZ0IsRUFBRSxVQUFvQyxFQUFXLEVBQUU7WUFDM0YsNENBQTRDO1lBQzVDLDBDQUEwQztZQUMxQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQzdCLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUVwQyxJQUFJLFFBQVEsR0FBRyxLQUFLLEVBQUUsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUMxQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzdCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFDakQsUUFBUSxHQUFHLFdBQVcsS0FBSyxTQUFTLENBQUM7Z0JBQ3JDLFdBQVcsR0FBRyxXQUFXLEtBQUssWUFBWSxDQUFDO2FBQzVDO1lBRUQsTUFBTSxLQUFLLEdBQUcsbUJBQWEsQ0FDekIsSUFBSSxDQUFDLE1BQU0sRUFDWCxJQUFJLEVBQ0osSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFDNUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksRUFBRSxFQUFFO2dCQUNoQyxXQUFXLEVBQUU7b0JBQ1gsVUFBVSxFQUFFLFdBQVc7b0JBQ3ZCLE9BQU8sRUFBRSxRQUFRO2lCQUNDO2FBQ3JCLENBQUMsQ0FBQyxDQUFDO1lBQ0osc0VBQXNFO1lBQ3RFLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7UUFDeEQsQ0FBQyxDQUFBO1FBRUQsZ0JBQWdCO1FBQ1IsbUJBQWMsR0FBRyxDQUFDLElBQWdCLEVBQUUsVUFBb0MsRUFBVyxFQUFFO1lBQzNGLE9BQU8sbUJBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQTtRQUN4RixDQUFDLENBQUE7UUFFRCxXQUFXO1FBRUgsa0JBQWEsR0FBRyxDQUFDLElBQWdCLEVBQVcsRUFBRTtZQUNwRCxRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ2pCLEtBQUssaUJBQWlCO29CQUNwQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQ2pDLEtBQUssaUJBQWlCLENBQUM7Z0JBQ3ZCLEtBQUssZ0JBQWdCLENBQUM7Z0JBQ3RCLEtBQUssaUJBQWlCLENBQUM7Z0JBQ3ZCLEtBQUssaUJBQWlCO29CQUNwQixPQUFPLG1CQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTtnQkFDNUUsS0FBSyxhQUFhO29CQUNoQixPQUFPLG1CQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDeEY7b0JBQ0UsYUFBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxlQUFTLENBQUMsdUJBQXVCLENBQUMsQ0FBQztvQkFDakUsTUFBTTthQUVUO1FBQ0gsQ0FBQyxDQUFBO1FBRUQseUJBQXlCO1FBRWpCLG9CQUFlLEdBQUcsQ0FBQyxJQUFnQixFQUFXLEVBQUU7WUFDdEQsT0FBTyxtQkFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFDNUUsQ0FBQyxDQUFBO1FBRU8sMkJBQXNCLEdBQUcsQ0FBQyxJQUFnQixFQUFXLEVBQUU7WUFDN0QsT0FBTyxtQkFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFDNUUsQ0FBQyxDQUFBO1FBRU8seUJBQW9CLEdBQUcsQ0FBQyxJQUFnQixFQUFXLEVBQUU7WUFDM0QsT0FBTyxtQkFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDN0UsQ0FBQyxDQUFBO1FBRU8sMkJBQXNCLEdBQUcsQ0FBQyxJQUFnQixFQUFXLEVBQUU7WUFDN0QsT0FBTyxtQkFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDN0UsQ0FBQyxDQUFBO1FBQ0QsZUFBZTtRQUVQLGtCQUFhLEdBQUcsQ0FBQyxJQUFnQixFQUFXLEVBQUU7WUFDcEQsT0FBTyxtQkFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDekMsQ0FBQyxDQUFBO1FBeE5DLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFDRDs7T0FFRztJQUNLLGNBQWMsQ0FBQyxJQUFnQjtRQUNyQyxPQUFPLElBQUksQ0FBQyxRQUFRO2FBQ2pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNiLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDM0UsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQTtJQUNqQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxrQkFBa0IsQ0FBQyxJQUFnQjtRQUN6QyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRTtZQUMvRCxPQUFPLFNBQVMsQ0FBQztTQUNsQjtRQUVELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFO1lBQ2xFLE9BQU8sWUFBWSxDQUFDO1NBQ3JCO0lBQ0gsQ0FBQztJQUVPLGNBQWMsQ0FBQyxJQUFnQjtRQUNyQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsZUFBSyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxNQUFNO1FBQ0osT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2xCLENBQUM7Q0EwTEY7QUE5TkQsOENBOE5DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTm9kZVByb3BlcnRpZXMsIE5vZGVJbmhlcml0YW5jZSB9IGZyb20gXCIuLi9jb21tb24vZW1jYVwiO1xyXG5pbXBvcnQgeyBpc0phdmFEb2NDb21tZW50IH0gZnJvbSBcIi4uLy4uL3V0aWxzL2NvbW1lbnRcIjtcclxuaW1wb3J0IHsgc2libGluZyB9IGZyb20gXCIuLi8uLi91dGlscy9zaWJsaW5nXCI7XHJcbmltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcclxuaW1wb3J0IHsgdGV4dCB9IGZyb20gXCIuLi8uLi91dGlscy90ZXh0XCI7XHJcbmltcG9ydCBsb2csIHsgRXJyb3JUeXBlIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2xvZ1wiO1xyXG5pbXBvcnQgbWF0Y2ggZnJvbSBcIi4uLy4uL3V0aWxzL21hdGNoXCI7XHJcbmltcG9ydCBTb3VyY2UgZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvU291cmNlXCI7XHJcbmltcG9ydCB4ZG9jIGZyb20gXCJ4ZG9jLXBhcnNlclwiO1xyXG5pbXBvcnQgeyBjcmVhdGVBU1ROb2RlLCBBU1ROb2RlIH0gZnJvbSBcIi4uL2NvbW1vbi9hc3RcIjtcclxuXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRyZWVTaXR0ZXJOb2RlIHtcclxuICB2aXNpdCh2aXNpdG9yOiBOb2RlVmlzaXRvcik6IHZvaWRcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBOb2RlVmlzaXRvciB7XHJcbiAgZ2V0QVNUKCk6IEFTVE5vZGVbXVxyXG4gIHZpc2l0Tm9kZShub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZVxyXG4gIHZpc2l0Q2hpbGRyZW4obm9kZXM6IFN5bnRheE5vZGVbXSk6IEFTVE5vZGVbXVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTm9kZSBpbXBsZW1lbnRzIFRyZWVTaXR0ZXJOb2RlIHtcclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgc3ludGF4Tm9kZTogU3ludGF4Tm9kZSkgeyB9XHJcbiAgdmlzaXQgPSAodmlzaXRvcjogTm9kZVZpc2l0b3IpOiB2b2lkID0+IHtcclxuICAgIHZpc2l0b3IudmlzaXROb2RlKHRoaXMuc3ludGF4Tm9kZSk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgVHlwZVNjcmlwdFZpc2l0b3IgaW1wbGVtZW50cyBOb2RlVmlzaXRvciB7XHJcbiAgcHJpdmF0ZSBhc3Q6IEFTVE5vZGVbXSA9IFtdXHJcbiAgcHJpdmF0ZSBzb3VyY2U6IFNvdXJjZVxyXG4gIHByaXZhdGUgcGFyZW50OiBTeW50YXhOb2RlXHJcbiAgY29uc3RydWN0b3Ioc291cmNlOiBTb3VyY2UpIHtcclxuICAgIHRoaXMuc291cmNlID0gc291cmNlO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBub2RlIGhhcyBpbmhlcml0YW5jZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgaGFzSW5oZXJpdGFuY2Uobm9kZTogU3ludGF4Tm9kZSkge1xyXG4gICAgcmV0dXJuIG5vZGUuY2hpbGRyZW5cclxuICAgICAgLmZpbHRlcihub2RlID0+IHtcclxuICAgICAgICByZXR1cm4gbm9kZS50eXBlLmluY2x1ZGVzKCdleHRlbmRzJykgfHwgbm9kZS50eXBlLmluY2x1ZGVzKCdpbXBsZW1lbnRzJyk7XHJcbiAgICAgIH0pLmxlbmd0aCA+IDBcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBub2RlJ3MgaW5oZXJpdGFuY2UgdHlwZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0SW5oZXJpdGFuY2VUeXBlKG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICAgIGlmIChub2RlLmNoaWxkcmVuLmZpbHRlcihub2RlID0+IG5vZGUudHlwZS5pbmNsdWRlcygnZXh0ZW5kcycpKSkge1xyXG4gICAgICByZXR1cm4gJ2V4dGVuZHMnO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChub2RlLmNoaWxkcmVuLmZpbHRlcihub2RlID0+IG5vZGUudHlwZS5pbmNsdWRlcygnaW1wbGVtZW50cycpKSkge1xyXG4gICAgICByZXR1cm4gJ2ltcGxlbWVudHMnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaWx0ZXJDb21tZW50cyhub2RlOiBTeW50YXhOb2RlKSB7XHJcbiAgICByZXR1cm4gbm9kZS5jaGlsZHJlbi5maWx0ZXIoY2hpbGQgPT4gbWF0Y2goY2hpbGQsICdjb21tZW50JykpO1xyXG4gIH1cclxuXHJcbiAgZ2V0QVNUKCk6IEFTVE5vZGVbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5hc3Q7XHJcbiAgfVxyXG5cclxuICAvKiBWaXNpdG9ycyAgKi9cclxuXHJcbiAgdmlzaXROb2RlID0gKFxyXG4gICAgbm9kZTogU3ludGF4Tm9kZVxyXG4gICkgPT4ge1xyXG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcclxuICAgICAgY2FzZSAncHJvZ3JhbSc6XHJcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBub2RlO1xyXG4gICAgICAgIHRoaXMuYXN0ID0gdGhpcy52aXNpdFByb2dyYW0obm9kZSk7XHJcbiAgICAgIGNhc2UgJ2NvbW1lbnQnOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0Q29tbWVudChub2RlKTtcclxuICAgICAgY2FzZSAnTUlTU0lORyc6XHJcbiAgICAgIGNhc2UgJ0VSUk9SJzpcclxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuVHJlZVNpdHRlclBhcnNlRXJyb3IpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG5cclxuICAgICAgICAvKiBNYXRjaCBvdGhlciBub24tdGVybWluYWxzICovXHJcblxyXG4gICAgICAgIGlmIChtYXRjaChub2RlLCAnY29uc3RyYWludCcpKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdENvbnN0cmFpbnQobm9kZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChtYXRjaChub2RlLCAnZm9ybWFsX3BhcmFtZXRlcnMnKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRGb3JtYWxQYXJhbXRlcnMobm9kZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobWF0Y2gobm9kZSwgJ3JlcXVpcmVkX3BhcmFtZXRlcicpKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdFJlcXVpcmVkUGFyYW1ldGVyKG5vZGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG1hdGNoKG5vZGUsXHJcbiAgICAgICAgICAndHlwZV9pZGVudGlmaWVyJywgJ3R5cGVfcGFyYW1ldGVycycsICd0eXBlX3BhcmFtZXRlcicsICd0eXBlX2Fubm90YXRpb24nLFxyXG4gICAgICAgICAgJ29iamVjdF90eXBlJywgJ3ByZWRlZmluZWRfdHlwZSdcclxuICAgICAgICApKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdFR5cGVOb2RlKG5vZGUpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobWF0Y2gobm9kZSwgJ2V4dGVuZHNfY2xhdXNlJykpIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLnZpc2l0SW5oZXJpdGFuY2VDbGF1c2Uobm9kZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBBIGNhbGxfc2lnbmF0dXJlIGNhbiBhbHNvIGJlIGEgbm9uLWNvbnRleHR1YWwgbm9kZVxyXG4gICAgICAgIGlmIChtYXRjaChub2RlLCAnY2FsbF9zaWduYXR1cmUnKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRTaWduYXR1cmUobm9kZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIE1hdGNoIHRlcm1pbmFscyAqL1xyXG4gICAgICAgIGlmIChtYXRjaChub2RlLCBcclxuICAgICAgICAgICdpZGVudGlmaWVyJywgJ2V4dGVuZHMnLCAncHJvcGVydHlfaWRlbnRpZmllcicsXHJcbiAgICAgICAgICAnc3RyaW5nJywgJ3ZvaWQnLCAnYm9vbGVhbicsICdudWxsJywgJ3VuZGVmaW5lZCcsICdudW1iZXInXHJcbiAgICAgICAgKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRUZXJtaW5hbChub2RlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxvZy5yZXBvcnQodGhpcy5zb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFlldFN1cHBvcnRlZCk7XHJcblxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdmlzaXRDaGlsZHJlbiA9IChub2RlczogU3ludGF4Tm9kZVtdKTogQVNUTm9kZVtdID0+IHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIG5vZGVzXHJcbiAgICAgICAgLmZpbHRlcihjaGlsZCA9PiAhY2hpbGQudHlwZS5tYXRjaCgvWzw+KCl7fSw6O1xcW1xcXV0vKSlcclxuICAgICAgICAubWFwKHRoaXMudmlzaXROb2RlLmJpbmQodGhpcykpIGFzIEFTVE5vZGVbXVxyXG4gICAgKS5maWx0ZXIoY2hpbGQgPT4gISFjaGlsZCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHZpc2l0UHJvZ3JhbSA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZVtdID0+IHtcclxuICAgIHJldHVybiB0aGlzLnZpc2l0Q2hpbGRyZW4odGhpcy5maWx0ZXJDb21tZW50cyhub2RlKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHZpc2l0Q29tbWVudCA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZSA9PiB7XHJcbiAgICBpZiAoaXNKYXZhRG9jQ29tbWVudCh0aGlzLnNvdXJjZSwgbm9kZSkpIHtcclxuICAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSBzaWJsaW5nKG5vZGUpO1xyXG4gICAgICBpZiAobmV4dFNpYmxpbmcpIHtcclxuICAgICAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENvbnRleHQobmV4dFNpYmxpbmcsIHt9KSwgdHJ1ZSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmlzaXQgdGhlIGNvbnRleHR1YWwgbm9kZVxyXG4gICAqIFxyXG4gICAqICMgUmVtYXJrXHJcbiAgICogXHJcbiAgICogQSBub2RlIGlzIGNvbnNpZGVyZWQgY29udGV4dHVhbCB3aGVuIGEgY29tbWVudCBpcyB2aXNpdGVkIGFuZCB0aGUgbm9kZSBpcyBpdHMgc2libGluZy5cclxuICAgKi9cclxuICBwcml2YXRlIHZpc2l0Q29udGV4dCA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcclxuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XHJcbiAgICAgIGNhc2UgJ2ludGVyZmFjZV9kZWNsYXJhdGlvbic6XHJcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBub2RlO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0SW50ZXJmYWNlRGVjbGFyYXRpb24obm9kZSwgcHJvcGVydGllcylcclxuICAgICAgY2FzZSAnY2FsbF9zaWduYXR1cmUnOlxyXG4gICAgICBjYXNlICdtZXRob2Rfc2lnbmF0dXJlJzpcclxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdFNpZ25hdHVyZShub2RlLCBwcm9wZXJ0aWVzKTtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyogRGVjbGFyYXRpb25zICovXHJcblxyXG4gIHByaXZhdGUgdmlzaXRJbnRlcmZhY2VEZWNsYXJhdGlvbiA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcclxuICAgIC8vIFNob3J0ZW4gdGhlIG5vZGUgZnJvbSAnaW50ZXJmYWNlX2RlY2xhcmF0aW9uJyB0byAnaW50ZXJmYWNlJ1xyXG4gICAgcmV0dXJuIHRoaXMudmlzaXRJbnRlcmZhY2Uobm9kZSwgcHJvcGVydGllcylcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdmlzaXRJbnRlcmZhY2UgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XHJcbiAgICAvLyBTaW5jZSAnaW50ZXJmYWNlJyBpcyBlbGVtZW50IGluIHRoZSBhcnJheVxyXG4gICAgLy8gd2UnbGwgbmVlZCB0byByZW1vdmUgaXQgZnJvbSB0aGUgYXJyYXkuXHJcbiAgICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xyXG4gICAgY29uc3QgaW50ZXJmYWNlXyA9IGNoaWxkcmVuLnNoaWZ0KCk7XHJcblxyXG4gICAgbGV0IGV4dGVuZHNfID0gZmFsc2UsIGltcGxlbWVudHNfID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5oYXNJbmhlcml0YW5jZShub2RlKSkge1xyXG4gICAgICBjb25zdCBpbmhlcml0YW5jZSA9IHRoaXMuZ2V0SW5oZXJpdGFuY2VUeXBlKG5vZGUpXHJcbiAgICAgIGV4dGVuZHNfID0gaW5oZXJpdGFuY2UgPT09ICdleHRlbmRzJztcclxuICAgICAgaW1wbGVtZW50c18gPSBpbmhlcml0YW5jZSA9PT0gJ2ltcGxlbWVudHMnO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG5vZGVfID0gY3JlYXRlQVNUTm9kZShcclxuICAgICAgdGhpcy5zb3VyY2UsIFxyXG4gICAgICBub2RlLCBcclxuICAgICAgdGhpcy52aXNpdENoaWxkcmVuKGNoaWxkcmVuKSwgXHJcbiAgICAgIE9iamVjdC5hc3NpZ24ocHJvcGVydGllcyB8fCB7fSwge1xyXG4gICAgICBpbmhlcml0YW5jZToge1xyXG4gICAgICAgIGltcGxlbWVudHM6IGltcGxlbWVudHNfLFxyXG4gICAgICAgIGV4dGVuZHM6IGV4dGVuZHNfXHJcbiAgICAgIH0gYXMgTm9kZUluaGVyaXRhbmNlXHJcbiAgICB9KSk7XHJcbiAgICAvLyBPdmVyd3JpdGUgdGhlIG5vZGUgdHlwZSBmcm9tICdpbnRlcmZhY2VfZGVjbGFyYXRpb24nIHRvICdpbnRlcmZhY2UnXHJcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihub2RlXywgeyB0eXBlOiBpbnRlcmZhY2VfLnR5cGUgfSlcclxuICB9XHJcblxyXG4gIC8qIFNpZ25hdHVyZXMgKi9cclxuICBwcml2YXRlIHZpc2l0U2lnbmF0dXJlID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xyXG4gICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIHRoaXMudmlzaXRDaGlsZHJlbihub2RlLmNoaWxkcmVuKSwgcHJvcGVydGllcylcclxuICB9XHJcblxyXG4gIC8qIFR5cGVzICovXHJcblxyXG4gIHByaXZhdGUgdmlzaXRUeXBlTm9kZSA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZSA9PiB7XHJcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xyXG4gICAgICBjYXNlICd0eXBlX2lkZW50aWZpZXInOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0VGVybWluYWwobm9kZSlcclxuICAgICAgY2FzZSAndHlwZV9wYXJhbWV0ZXJzJzpcclxuICAgICAgY2FzZSAndHlwZV9wYXJhbWV0ZXInOlxyXG4gICAgICBjYXNlICd0eXBlX2Fubm90YXRpb24nOlxyXG4gICAgICBjYXNlICdwcmVkZWZpbmVkX3R5cGUnOlxyXG4gICAgICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q2hpbGRyZW4obm9kZS5jaGlsZHJlbikpXHJcbiAgICAgIGNhc2UgJ29iamVjdF90eXBlJzpcclxuICAgICAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyQ29tbWVudHMobm9kZSkpKVxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGxvZy5yZXBvcnQodGhpcy5zb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFlldFN1cHBvcnRlZCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyogT3RoZXIgbm9uLXRlcm1pbmFscyAqL1xyXG5cclxuICBwcml2YXRlIHZpc2l0Q29uc3RyYWludCA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZSA9PiB7XHJcbiAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENoaWxkcmVuKG5vZGUuY2hpbGRyZW4pKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB2aXNpdEluaGVyaXRhbmNlQ2xhdXNlID0gKG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlID0+IHtcclxuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q2hpbGRyZW4obm9kZS5jaGlsZHJlbikpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHZpc2l0Rm9ybWFsUGFyYW10ZXJzID0gKG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlID0+IHtcclxuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q2hpbGRyZW4obm9kZS5jaGlsZHJlbikpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB2aXNpdFJlcXVpcmVkUGFyYW1ldGVyID0gKG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlID0+IHtcclxuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q2hpbGRyZW4obm9kZS5jaGlsZHJlbikpO1xyXG4gIH1cclxuICAvKiBUZXJtaW5hbHMgKi9cclxuXHJcbiAgcHJpdmF0ZSB2aXNpdFRlcm1pbmFsID0gKG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlID0+IHtcclxuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlKVxyXG4gIH1cclxufSJdfQ== \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/visitor.d.ts b/build/src/lang/typescript/visitors/visitor.d.ts index ad6527a..096324e 100644 --- a/build/src/lang/typescript/visitors/visitor.d.ts +++ b/build/src/lang/typescript/visitors/visitor.d.ts @@ -1,230 +1,45 @@ -import { NodeProperties } from "../Node"; +import { NodeProperties } from "../../common/emca"; import { SyntaxNode } from "tree-sitter"; import Source from "../../../interfaces/Source"; +import { ASTNode } from "../../common/ast"; export interface TreeSitterNode { visit(visitor: NodeVisitor): void; } export interface NodeVisitor { - getAST(): object[]; - visitNode(node: SyntaxNode): any; - visitChildren(nodes: SyntaxNode[]): any; + getAST(): ASTNode[]; + visitNode(node: SyntaxNode): ASTNode; + visitChildren(nodes: SyntaxNode[]): ASTNode[]; } export declare class Node implements TreeSitterNode { syntaxNode: SyntaxNode; constructor(syntaxNode: SyntaxNode); - visit: (visitor: NodeVisitor) => NodeVisitor; + visit: (visitor: NodeVisitor) => void; } export declare class TypeScriptVisitor implements NodeVisitor { private ast; private source; private parent; constructor(source: Source); + /** + * Determines whether a node has inheritance + */ private hasInheritance; + /** + * Returns a node's inheritance type + */ private getInheritanceType; - getAST(): object[]; - visitNode: (node: SyntaxNode) => { - text: string; - properties?: any; - comment?: { - markdown: import("xdoc-parser/src/XDocParser").RemarkNode; - documentation: Partial; - }; - position: import("../../../interfaces/TextRange").Range; - location: { - row: import("../../../interfaces/TextRange").Range; - column: import("../../../interfaces/TextRange").Range; - }; - type: string; - }; - visitChildren: (nodes: SyntaxNode[]) => {}[]; - visitProgram: (node: SyntaxNode) => {}[]; - visitComment: (node: SyntaxNode) => { - context: { - children: {}[]; - properties: Partial; - text: string; - comment?: { - markdown: import("xdoc-parser/src/XDocParser").RemarkNode; - documentation: Partial; - }; - position: import("../../../interfaces/TextRange").Range; - location: { - row: import("../../../interfaces/TextRange").Range; - column: import("../../../interfaces/TextRange").Range; - }; - type: string; - }; - comment: { - markdown: import("xdoc-parser/src/XDocParser").RemarkNode; - documentation: Partial; - }; - text: string; - properties?: any; - position: import("../../../interfaces/TextRange").Range; - location: { - row: import("../../../interfaces/TextRange").Range; - column: import("../../../interfaces/TextRange").Range; - }; - type: string; - }; - visitContext: (node: SyntaxNode, properties?: Partial) => { - children: {}[]; - properties: Partial; - text: string; - comment?: { - markdown: import("xdoc-parser/src/XDocParser").RemarkNode; - documentation: Partial; - }; - position: import("../../../interfaces/TextRange").Range; - location: { - row: import("../../../interfaces/TextRange").Range; - column: import("../../../interfaces/TextRange").Range; - }; - type: string; - }; - visitInterfaceDeclaration: (node: SyntaxNode, properties?: Partial) => { - children: {}[]; - properties: Partial; - text: string; - comment?: { - markdown: import("xdoc-parser/src/XDocParser").RemarkNode; - documentation: Partial; - }; - position: import("../../../interfaces/TextRange").Range; - location: { - row: import("../../../interfaces/TextRange").Range; - column: import("../../../interfaces/TextRange").Range; - }; - type: string; - }; - visitInterface: (node: SyntaxNode, properties: Partial) => { - children: {}[]; - properties: Partial; - text: string; - comment?: { - markdown: import("xdoc-parser/src/XDocParser").RemarkNode; - documentation: Partial; - }; - position: import("../../../interfaces/TextRange").Range; - location: { - row: import("../../../interfaces/TextRange").Range; - column: import("../../../interfaces/TextRange").Range; - }; - type: string; - }; - visitCallSignature: (node: SyntaxNode, properties: Partial) => { - children: {}[]; - properties: Partial; - text: string; - comment?: { - markdown: import("xdoc-parser/src/XDocParser").RemarkNode; - documentation: Partial; - }; - position: import("../../../interfaces/TextRange").Range; - location: { - row: import("../../../interfaces/TextRange").Range; - column: import("../../../interfaces/TextRange").Range; - }; - type: string; - }; - visitTypeNode: (node: SyntaxNode) => { - text: string; - properties?: any; - comment?: { - markdown: import("xdoc-parser/src/XDocParser").RemarkNode; - documentation: Partial; - }; - position: import("../../../interfaces/TextRange").Range; - location: { - row: import("../../../interfaces/TextRange").Range; - column: import("../../../interfaces/TextRange").Range; - }; - type: string; - } | { - children: {}[]; - text: string; - properties?: any; - comment?: { - markdown: import("xdoc-parser/src/XDocParser").RemarkNode; - documentation: Partial; - }; - position: import("../../../interfaces/TextRange").Range; - location: { - row: import("../../../interfaces/TextRange").Range; - column: import("../../../interfaces/TextRange").Range; - }; - type: "type_parameters"; - } | { - children: {}[]; - text: string; - properties?: any; - comment?: { - markdown: import("xdoc-parser/src/XDocParser").RemarkNode; - documentation: Partial; - }; - position: import("../../../interfaces/TextRange").Range; - location: { - row: import("../../../interfaces/TextRange").Range; - column: import("../../../interfaces/TextRange").Range; - }; - type: "type_parameter"; - } | { - children: {}[]; - text: string; - properties?: any; - comment?: { - markdown: import("xdoc-parser/src/XDocParser").RemarkNode; - documentation: Partial; - }; - position: import("../../../interfaces/TextRange").Range; - location: { - row: import("../../../interfaces/TextRange").Range; - column: import("../../../interfaces/TextRange").Range; - }; - type: "object_type"; - }; - visitConstraint: (node: SyntaxNode) => { - children: {}[]; - text: string; - properties?: any; - comment?: { - markdown: import("xdoc-parser/src/XDocParser").RemarkNode; - documentation: Partial; - }; - position: import("../../../interfaces/TextRange").Range; - location: { - row: import("../../../interfaces/TextRange").Range; - column: import("../../../interfaces/TextRange").Range; - }; - type: string; - }; - visitInheritanceClause: (node: SyntaxNode) => { - children: {}[]; - text: string; - properties?: any; - comment?: { - markdown: import("xdoc-parser/src/XDocParser").RemarkNode; - documentation: Partial; - }; - position: import("../../../interfaces/TextRange").Range; - location: { - row: import("../../../interfaces/TextRange").Range; - column: import("../../../interfaces/TextRange").Range; - }; - type: string; - }; - visitTerminal: (node: SyntaxNode) => { - text: string; - properties?: any; - comment?: { - markdown: import("xdoc-parser/src/XDocParser").RemarkNode; - documentation: Partial; - }; - position: import("../../../interfaces/TextRange").Range; - location: { - row: import("../../../interfaces/TextRange").Range; - column: import("../../../interfaces/TextRange").Range; - }; - type: string; - }; + private filterComments; + getAST(): ASTNode[]; + visitNode: (node: SyntaxNode) => ASTNode; + visitChildren: (nodes: SyntaxNode[]) => ASTNode[]; + visitProgram: (node: SyntaxNode) => ASTNode[]; + visitComment: (node: SyntaxNode) => ASTNode; + visitContext: (node: SyntaxNode, properties?: Partial) => ASTNode; + visitInterfaceDeclaration: (node: SyntaxNode, properties?: Partial) => ASTNode; + visitInterface: (node: SyntaxNode, properties?: Partial) => ASTNode; + visitSignature: (node: SyntaxNode, properties?: Partial) => ASTNode; + visitTypeNode: (node: SyntaxNode) => ASTNode; + visitConstraint: (node: SyntaxNode) => ASTNode; + visitInheritanceClause: (node: SyntaxNode) => ASTNode; + visitTerminal: (node: SyntaxNode) => ASTNode; } diff --git a/build/src/lang/typescript/visitors/visitor.js b/build/src/lang/typescript/visitors/visitor.js index 57e7070..e7c3049 100644 --- a/build/src/lang/typescript/visitors/visitor.js +++ b/build/src/lang/typescript/visitors/visitor.js @@ -1,17 +1,15 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const Node_1 = require("../Node"); const comment_1 = require("../../../utils/comment"); const sibling_1 = require("../../../utils/sibling"); -const text_1 = require("../../../utils/text"); const log_1 = require("../../../utils/log"); const match_1 = require("../../../utils/match"); -const xdoc_parser_1 = require("xdoc-parser"); +const ast_1 = require("../../common/ast"); class Node { constructor(syntaxNode) { this.syntaxNode = syntaxNode; this.visit = (visitor) => { - return visitor.visitNode(this.syntaxNode); + visitor.visitNode(this.syntaxNode); }; } } @@ -36,14 +34,18 @@ class TypeScriptVisitor { if (match_1.default(node, 'constraint')) { return this.visitConstraint(node); } - if (match_1.default(node, 'type_identifier', 'type_parameters', 'type_parameter', 'object_type')) { + if (match_1.default(node, 'type_identifier', 'type_parameters', 'type_parameter', 'type_annotation', 'object_type')) { return this.visitTypeNode(node); } if (match_1.default(node, 'extends_clause')) { return this.visitInheritanceClause(node); } + // A call_signature can also be a non-contextual node + if (match_1.default(node, 'call_signature')) { + return this.visitSignature(node); + } /* Match terminals */ - if (match_1.default(node, 'identifier', 'extends')) { + if (match_1.default(node, 'identifier', 'extends', 'property_identifier')) { return this.visitTerminal(node); } log_1.default.report(this.source, node, log_1.ErrorType.NodeTypeNotYetSupported); @@ -52,20 +54,17 @@ class TypeScriptVisitor { }; this.visitChildren = (nodes) => { return nodes - .filter(child => !child.type.match(/[<>(){},;\[\]]/)) - .map(this.visitNode.bind(this)) - .filter(child => !!child); + .filter(child => !child.type.match(/[<>(){},:;\[\]]/)) + .map(this.visitNode.bind(this)).filter(child => !!child); }; this.visitProgram = (node) => { - return this.visitChildren(node.children.filter(child => { - return match_1.default(child, 'comment'); - })); + return this.visitChildren(this.filterComments(node)); }; this.visitComment = (node) => { if (comment_1.isJavaDocComment(this.source, node)) { const nextSibling = sibling_1.sibling(node); if (nextSibling) { - return Object.assign({ type: node.type }, Node_1.createASTNode(this.source, node), { context: this.visitContext(nextSibling, {}), comment: xdoc_parser_1.default(text_1.text(this.source, node)).parse() }); + return ast_1.createASTNode(this.source, node, this.visitContext(nextSibling, {}), true); } } }; @@ -75,7 +74,8 @@ class TypeScriptVisitor { this.parent = node; return this.visitInterfaceDeclaration(node, properties); case 'call_signature': - return this.visitCallSignature(node, properties); + case 'method_signature': + return this.visitSignature(node, properties); default: log_1.default.report(this.source, node, log_1.ErrorType.NodeTypeNotYetSupported); break; @@ -83,28 +83,32 @@ class TypeScriptVisitor { }; /* Declarations */ this.visitInterfaceDeclaration = (node, properties) => { - // Shorten the node + // Shorten the node from 'interface_declaration' to 'interface' return this.visitInterface(node, properties); }; this.visitInterface = (node, properties) => { + // Since 'interface' is element in the array + // we'll need to remove it from the array. let children = node.children; + const interface_ = children.shift(); let extends_ = false, implements_ = false; if (this.hasInheritance(node)) { const inheritance = this.getInheritanceType(node); extends_ = inheritance === 'extends'; implements_ = inheritance === 'implements'; } - Object.assign(properties, { + const node_ = ast_1.createASTNode(this.source, node, this.visitChildren(children), Object.assign(properties || {}, { inheritance: { implements: implements_, extends: extends_ } - }); - return Object.assign({ type: children.shift().type }, Node_1.createASTNode(this.source, node), { children: this.visitChildren(children), properties }); + })); + // Overwrite the node type from 'interface_declaration' to 'interface' + return Object.assign(node_, { type: interface_.type }); }; /* Signatures */ - this.visitCallSignature = (node, properties) => { - return Object.assign({ type: node.type }, Node_1.createASTNode(this.source, node), { children: this.visitChildren(node.children), properties }); + this.visitSignature = (node, properties) => { + return ast_1.createASTNode(this.source, node, this.visitChildren(node.children), properties); }; /* Types */ this.visitTypeNode = (node) => { @@ -112,13 +116,11 @@ class TypeScriptVisitor { case 'type_identifier': return this.visitTerminal(node); case 'type_parameters': - return Object.assign({ type: node.type }, Node_1.createASTNode(this.source, node), { children: this.visitChildren(node.children) }); case 'type_parameter': - return Object.assign({ type: node.type }, Node_1.createASTNode(this.source, node), { children: this.visitChildren(node.children) }); + case 'type_annotation': + return ast_1.createASTNode(this.source, node, this.visitChildren(node.children)); case 'object_type': - return Object.assign({ type: node.type }, Node_1.createASTNode(this.source, node), { children: this.visitChildren(node.children.filter(child => { - return match_1.default(child, 'comment'); - })) }); + return ast_1.createASTNode(this.source, node, this.visitChildren(this.filterComments(node))); default: log_1.default.report(this.source, node, log_1.ErrorType.NodeTypeNotYetSupported); break; @@ -126,34 +128,43 @@ class TypeScriptVisitor { }; /* Other non-terminals */ this.visitConstraint = (node) => { - return Object.assign({ type: node.type }, Node_1.createASTNode(this.source, node), { children: this.visitChildren(node.children) }); + return ast_1.createASTNode(this.source, node, this.visitChildren(node.children)); }; this.visitInheritanceClause = (node) => { - return Object.assign({ type: node.type }, Node_1.createASTNode(this.source, node), { children: this.visitChildren(node.children) }); + return ast_1.createASTNode(this.source, node, this.visitChildren(node.children)); }; /* Terminals */ this.visitTerminal = (node) => { - return Object.assign({ type: node.type }, Node_1.createASTNode(this.source, node)); + return ast_1.createASTNode(this.source, node); }; this.source = source; } + /** + * Determines whether a node has inheritance + */ hasInheritance(node) { return node.children .filter(node => { - return node.type === 'extends' || node.type === 'implements'; + return node.type.includes('extends') || node.type.includes('implements'); }).length > 0; } + /** + * Returns a node's inheritance type + */ getInheritanceType(node) { - if (node.children.filter(node => node.type === 'extends')) { + if (node.children.filter(node => node.type.includes('extends'))) { return 'extends'; } - if (node.children.filter(node => node.type === 'implements')) { + if (node.children.filter(node => node.type.includes('implements'))) { return 'implements'; } } + filterComments(node) { + return node.children.filter(child => match_1.default(child, 'comment')); + } getAST() { return this.ast; } } exports.TypeScriptVisitor = TypeScriptVisitor; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvdmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtDQUF5RTtBQUN6RSxvREFBMEQ7QUFDMUQsb0RBQWlEO0FBRWpELDhDQUEyQztBQUMzQyw0Q0FBb0Q7QUFDcEQsZ0RBQXlDO0FBRXpDLDZDQUErQjtBQWEvQixNQUFhLElBQUk7SUFDZixZQUFtQixVQUFzQjtRQUF0QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3pDLFVBQUssR0FBRyxDQUFDLE9BQW9CLEVBQWUsRUFBRTtZQUM1QyxPQUFPLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQTtJQUg0QyxDQUFDO0NBSS9DO0FBTEQsb0JBS0M7QUFFRCxNQUFhLGlCQUFpQjtJQUk1QixZQUFZLE1BQWM7UUFIbEIsUUFBRyxHQUFHLEVBQUUsQ0FBQTtRQTBCaEIsZUFBZTtRQUNmLGNBQVMsR0FBRyxDQUNWLElBQWdCLEVBQ2hCLEVBQUU7WUFDRixRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ2pCLEtBQUssU0FBUztvQkFDWixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztvQkFDbkIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNyQyxLQUFLLFNBQVM7b0JBQ1osT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNqQyxLQUFLLFNBQVMsQ0FBQztnQkFDZixLQUFLLE9BQU87b0JBQ1YsYUFBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxlQUFTLENBQUMsb0JBQW9CLENBQUMsQ0FBQztvQkFDOUQsTUFBTTtnQkFDUjtvQkFFRSwrQkFBK0I7b0JB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QU0sR0FBRyxDQUFDLENBQUE7SUFDakIsQ0FBQztJQUVPLGtCQUFrQixDQUFDLElBQWdCO1FBQ3pDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxFQUFFO1lBQ3pELE9BQU8sU0FBUyxDQUFDO1NBQ2xCO1FBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLEVBQUU7WUFDNUQsT0FBTyxZQUFZLENBQUM7U0FDckI7SUFDSCxDQUFDO0lBRUQsTUFBTTtRQUNKLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQixDQUFDO0NBNExGO0FBdE5ELDhDQXNOQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUFTVE5vZGUsIE5vZGVQcm9wZXJ0aWVzLCBOb2RlSW5oZXJpdGFuY2UgfSBmcm9tIFwiLi4vTm9kZVwiO1xuaW1wb3J0IHsgaXNKYXZhRG9jQ29tbWVudCB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9jb21tZW50XCI7XG5pbXBvcnQgeyBzaWJsaW5nIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3NpYmxpbmdcIjtcbmltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcbmltcG9ydCB7IHRleHQgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvdGV4dFwiO1xuaW1wb3J0IGxvZywgeyBFcnJvclR5cGUgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbG9nXCI7XG5pbXBvcnQgbWF0Y2ggZnJvbSBcIi4uLy4uLy4uL3V0aWxzL21hdGNoXCI7XG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi8uLi8uLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuaW1wb3J0IHhkb2MgZnJvbSBcInhkb2MtcGFyc2VyXCI7XG5cblxuZXhwb3J0IGludGVyZmFjZSBUcmVlU2l0dGVyTm9kZSB7XG4gIHZpc2l0KHZpc2l0b3I6IE5vZGVWaXNpdG9yKTogdm9pZFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vZGVWaXNpdG9yIHtcbiAgZ2V0QVNUKCk6IG9iamVjdFtdXG4gIHZpc2l0Tm9kZShub2RlOiBTeW50YXhOb2RlKTogYW55XG4gIHZpc2l0Q2hpbGRyZW4obm9kZXM6IFN5bnRheE5vZGVbXSk6IGFueVxufVxuXG5leHBvcnQgY2xhc3MgTm9kZSBpbXBsZW1lbnRzIFRyZWVTaXR0ZXJOb2RlIHtcbiAgY29uc3RydWN0b3IocHVibGljIHN5bnRheE5vZGU6IFN5bnRheE5vZGUpIHsgfVxuICB2aXNpdCA9ICh2aXNpdG9yOiBOb2RlVmlzaXRvcik6IE5vZGVWaXNpdG9yID0+IHtcbiAgICByZXR1cm4gdmlzaXRvci52aXNpdE5vZGUodGhpcy5zeW50YXhOb2RlKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHlwZVNjcmlwdFZpc2l0b3IgaW1wbGVtZW50cyBOb2RlVmlzaXRvciB7XG4gIHByaXZhdGUgYXN0ID0gW11cbiAgcHJpdmF0ZSBzb3VyY2U6IFNvdXJjZVxuICBwcml2YXRlIHBhcmVudDogU3ludGF4Tm9kZVxuICBjb25zdHJ1Y3Rvcihzb3VyY2U6IFNvdXJjZSkge1xuICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICB9XG4gIHByaXZhdGUgaGFzSW5oZXJpdGFuY2Uobm9kZTogU3ludGF4Tm9kZSkge1xuICAgIHJldHVybiBub2RlLmNoaWxkcmVuXG4gICAgICAuZmlsdGVyKG5vZGUgPT4ge1xuICAgICAgICByZXR1cm4gbm9kZS50eXBlID09PSAnZXh0ZW5kcycgfHwgbm9kZS50eXBlID09PSAnaW1wbGVtZW50cyc7XG4gICAgICB9KS5sZW5ndGggPiAwXG4gIH1cblxuICBwcml2YXRlIGdldEluaGVyaXRhbmNlVHlwZShub2RlOiBTeW50YXhOb2RlKSB7XG4gICAgaWYgKG5vZGUuY2hpbGRyZW4uZmlsdGVyKG5vZGUgPT4gbm9kZS50eXBlID09PSAnZXh0ZW5kcycpKSB7XG4gICAgICByZXR1cm4gJ2V4dGVuZHMnO1xuICAgIH1cblxuICAgIGlmIChub2RlLmNoaWxkcmVuLmZpbHRlcihub2RlID0+IG5vZGUudHlwZSA9PT0gJ2ltcGxlbWVudHMnKSkge1xuICAgICAgcmV0dXJuICdpbXBsZW1lbnRzJztcbiAgICB9XG4gIH1cblxuICBnZXRBU1QoKTogb2JqZWN0W10ge1xuICAgIHJldHVybiB0aGlzLmFzdDtcbiAgfVxuICAvKiBWaXNpdG9ycyAgKi9cbiAgdmlzaXROb2RlID0gKFxuICAgIG5vZGU6IFN5bnRheE5vZGVcbiAgKSA9PiB7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgJ3Byb2dyYW0nOlxuICAgICAgICB0aGlzLnBhcmVudCA9IG5vZGU7XG4gICAgICAgIHRoaXMuYXN0ID0gdGhpcy52aXNpdFByb2dyYW0obm9kZSk7XG4gICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRDb21tZW50KG5vZGUpO1xuICAgICAgY2FzZSAnTUlTU0lORyc6XG4gICAgICBjYXNlICdFUlJPUic6XG4gICAgICAgIGxvZy5yZXBvcnQodGhpcy5zb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5UcmVlU2l0dGVyUGFyc2VFcnJvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcblxuICAgICAgICAvKiBNYXRjaCBvdGhlciBub24tdGVybWluYWxzICovXG5cbiAgICAgICAgaWYgKG1hdGNoKG5vZGUsICdjb25zdHJhaW50JykpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdENvbnN0cmFpbnQobm9kZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtYXRjaChub2RlLFxuICAgICAgICAgICd0eXBlX2lkZW50aWZpZXInLCAndHlwZV9wYXJhbWV0ZXJzJywgJ3R5cGVfcGFyYW1ldGVyJyxcbiAgICAgICAgICAnb2JqZWN0X3R5cGUnXG4gICAgICAgICkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdFR5cGVOb2RlKG5vZGUpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWF0Y2gobm9kZSwgJ2V4dGVuZHNfY2xhdXNlJykpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdEluaGVyaXRhbmNlQ2xhdXNlKG5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogTWF0Y2ggdGVybWluYWxzICovXG5cbiAgICAgICAgaWYgKG1hdGNoKG5vZGUsICdpZGVudGlmaWVyJywgJ2V4dGVuZHMnKSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnZpc2l0VGVybWluYWwobm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQpO1xuXG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZpc2l0Q2hpbGRyZW4gPSAobm9kZXM6IFN5bnRheE5vZGVbXSkgPT4ge1xuICAgIHJldHVybiBub2Rlc1xuICAgICAgLmZpbHRlcihjaGlsZCA9PiAhY2hpbGQudHlwZS5tYXRjaCgvWzw+KCl7fSw7XFxbXFxdXS8pKVxuICAgICAgLm1hcCh0aGlzLnZpc2l0Tm9kZS5iaW5kKHRoaXMpKVxuICAgICAgLmZpbHRlcihjaGlsZCA9PiAhIWNoaWxkKTtcbiAgfVxuXG4gIHZpc2l0UHJvZ3JhbSA9IChub2RlOiBTeW50YXhOb2RlKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMudmlzaXRDaGlsZHJlbihub2RlLmNoaWxkcmVuLmZpbHRlcihjaGlsZCA9PiB7XG4gICAgICByZXR1cm4gbWF0Y2goY2hpbGQsICdjb21tZW50Jyk7XG4gICAgfSkpO1xuICB9XG5cbiAgdmlzaXRDb21tZW50ID0gKG5vZGU6IFN5bnRheE5vZGUpID0+IHtcbiAgICBpZiAoaXNKYXZhRG9jQ29tbWVudCh0aGlzLnNvdXJjZSwgbm9kZSkpIHtcbiAgICAgIGNvbnN0IG5leHRTaWJsaW5nID0gc2libGluZyhub2RlKTtcbiAgICAgIGlmIChuZXh0U2libGluZykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IG5vZGUudHlwZSxcbiAgICAgICAgICAuLi5jcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlKSxcbiAgICAgICAgICBjb250ZXh0OiB0aGlzLnZpc2l0Q29udGV4dChuZXh0U2libGluZywge30pLFxuICAgICAgICAgIGNvbW1lbnQ6IHhkb2ModGV4dCh0aGlzLnNvdXJjZSwgbm9kZSkpLnBhcnNlKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZpc2l0Q29udGV4dCA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz4pID0+IHtcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSAnaW50ZXJmYWNlX2RlY2xhcmF0aW9uJzpcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBub2RlO1xuICAgICAgICByZXR1cm4gdGhpcy52aXNpdEludGVyZmFjZURlY2xhcmF0aW9uKG5vZGUsIHByb3BlcnRpZXMpXG4gICAgICBjYXNlICdjYWxsX3NpZ25hdHVyZSc6XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0Q2FsbFNpZ25hdHVyZShub2RlLCBwcm9wZXJ0aWVzKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGxvZy5yZXBvcnQodGhpcy5zb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFlldFN1cHBvcnRlZCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qIERlY2xhcmF0aW9ucyAqL1xuXG4gIHZpc2l0SW50ZXJmYWNlRGVjbGFyYXRpb24gPSAoXG4gICAgbm9kZTogU3ludGF4Tm9kZSxcbiAgICBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz5cbiAgKSA9PiB7XG4gICAgLy8gU2hvcnRlbiB0aGUgbm9kZVxuICAgIHJldHVybiB0aGlzLnZpc2l0SW50ZXJmYWNlKG5vZGUsIHByb3BlcnRpZXMpXG4gIH1cblxuICB2aXNpdEludGVyZmFjZSA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzOiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPikgPT4ge1xuICAgIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XG4gICAgbGV0IGV4dGVuZHNfID0gZmFsc2UsIGltcGxlbWVudHNfID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuaGFzSW5oZXJpdGFuY2Uobm9kZSkpIHtcbiAgICAgIGNvbnN0IGluaGVyaXRhbmNlID0gdGhpcy5nZXRJbmhlcml0YW5jZVR5cGUobm9kZSlcbiAgICAgIGV4dGVuZHNfID0gaW5oZXJpdGFuY2UgPT09ICdleHRlbmRzJztcbiAgICAgIGltcGxlbWVudHNfID0gaW5oZXJpdGFuY2UgPT09ICdpbXBsZW1lbnRzJztcbiAgICB9XG4gICAgT2JqZWN0LmFzc2lnbihwcm9wZXJ0aWVzLCB7XG4gICAgICBpbmhlcml0YW5jZToge1xuICAgICAgICBpbXBsZW1lbnRzOiBpbXBsZW1lbnRzXyxcbiAgICAgICAgZXh0ZW5kczogZXh0ZW5kc19cbiAgICAgIH0gYXMgTm9kZUluaGVyaXRhbmNlXG4gICAgfSlcblxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBjaGlsZHJlbi5zaGlmdCgpLnR5cGUsXG4gICAgICAuLi5jcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlKSxcbiAgICAgIGNoaWxkcmVuOiB0aGlzLnZpc2l0Q2hpbGRyZW4oY2hpbGRyZW4pLFxuICAgICAgcHJvcGVydGllc1xuICAgIH1cbiAgfVxuXG4gIC8qIFNpZ25hdHVyZXMgKi9cbiAgdmlzaXRDYWxsU2lnbmF0dXJlID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM6IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+KSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IG5vZGUudHlwZSxcbiAgICAgIC4uLmNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUpLFxuICAgICAgY2hpbGRyZW46IHRoaXMudmlzaXRDaGlsZHJlbihub2RlLmNoaWxkcmVuKSxcbiAgICAgIHByb3BlcnRpZXNcbiAgICB9XG4gIH1cblxuICAvKiBUeXBlcyAqL1xuXG4gIHZpc2l0VHlwZU5vZGUgPSAobm9kZTogU3ludGF4Tm9kZSkgPT4ge1xuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICBjYXNlICd0eXBlX2lkZW50aWZpZXInOlxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdFRlcm1pbmFsKG5vZGUpXG4gICAgICBjYXNlICd0eXBlX3BhcmFtZXRlcnMnOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IG5vZGUudHlwZSxcbiAgICAgICAgICAuLi5jcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlKSxcbiAgICAgICAgICBjaGlsZHJlbjogdGhpcy52aXNpdENoaWxkcmVuKG5vZGUuY2hpbGRyZW4pLFxuICAgICAgICB9XG4gICAgICBjYXNlICd0eXBlX3BhcmFtZXRlcic6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogbm9kZS50eXBlLFxuICAgICAgICAgIC4uLmNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUpLFxuICAgICAgICAgIGNoaWxkcmVuOiB0aGlzLnZpc2l0Q2hpbGRyZW4obm9kZS5jaGlsZHJlbilcbiAgICAgICAgfVxuICAgICAgY2FzZSAnb2JqZWN0X3R5cGUnOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IG5vZGUudHlwZSxcbiAgICAgICAgICAuLi5jcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlKSxcbiAgICAgICAgICBjaGlsZHJlbjogdGhpcy52aXNpdENoaWxkcmVuKG5vZGUuY2hpbGRyZW4uZmlsdGVyKGNoaWxkID0+IHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaChjaGlsZCwgJ2NvbW1lbnQnKVxuICAgICAgICAgIH0pKVxuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQpO1xuICAgICAgICBicmVhaztcblxuICAgIH1cbiAgfVxuXG4gIC8qIE90aGVyIG5vbi10ZXJtaW5hbHMgKi9cblxuICB2aXNpdENvbnN0cmFpbnQgPSAobm9kZTogU3ludGF4Tm9kZSkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBub2RlLnR5cGUsXG4gICAgICAuLi5jcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlKSxcbiAgICAgIGNoaWxkcmVuOiB0aGlzLnZpc2l0Q2hpbGRyZW4obm9kZS5jaGlsZHJlbilcbiAgICB9XG4gIH1cblxuICB2aXNpdEluaGVyaXRhbmNlQ2xhdXNlID0gKG5vZGU6IFN5bnRheE5vZGUpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogbm9kZS50eXBlLFxuICAgICAgLi4uY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSksXG4gICAgICBjaGlsZHJlbjogdGhpcy52aXNpdENoaWxkcmVuKG5vZGUuY2hpbGRyZW4pXG4gICAgfVxuICB9XG5cbiAgLyogVGVybWluYWxzICovXG5cbiAgdmlzaXRUZXJtaW5hbCA9IChub2RlOiBTeW50YXhOb2RlKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IG5vZGUudHlwZSxcbiAgICAgIC4uLmNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUpLFxuICAgIH1cbiAgfVxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvdmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLG9EQUEwRDtBQUMxRCxvREFBaUQ7QUFHakQsNENBQW9EO0FBQ3BELGdEQUF5QztBQUd6QywwQ0FBMEQ7QUFhMUQsTUFBYSxJQUFJO0lBQ2YsWUFBbUIsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN6QyxVQUFLLEdBQUcsQ0FBQyxPQUFvQixFQUFRLEVBQUU7WUFDckMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFBO0lBSDRDLENBQUM7Q0FJL0M7QUFMRCxvQkFLQztBQUVELE1BQWEsaUJBQWlCO0lBSTVCLFlBQVksTUFBYztRQUhsQixRQUFHLEdBQWMsRUFBRSxDQUFBO1FBb0MzQixlQUFlO1FBQ2YsY0FBUyxHQUFHLENBQ1YsSUFBZ0IsRUFDaEIsRUFBRTtZQUNGLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDakIsS0FBSyxTQUFTO29CQUNaLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO29CQUNuQixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3JDLEtBQUssU0FBUztvQkFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pDLEtBQUssU0FBUyxDQUFDO2dCQUNmLEtBQUssT0FBTztvQkFDVixhQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO29CQUM5RCxNQUFNO2dCQUNSO29CQUVFLCtCQUErQjtvQkFFL0IsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUFFLFlB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QUFDO0lBRU8sY0FBYyxDQUFDLElBQWdCO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxlQUFLLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDbEIsQ0FBQztDQStKRjtBQW5NRCw4Q0FtTUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOb2RlUHJvcGVydGllcywgTm9kZUluaGVyaXRhbmNlIH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9lbWNhXCI7XHJcbmltcG9ydCB7IGlzSmF2YURvY0NvbW1lbnQgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvY29tbWVudFwiO1xyXG5pbXBvcnQgeyBzaWJsaW5nIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3NpYmxpbmdcIjtcclxuaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5pbXBvcnQgeyB0ZXh0IH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3RleHRcIjtcclxuaW1wb3J0IGxvZywgeyBFcnJvclR5cGUgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbG9nXCI7XHJcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbWF0Y2hcIjtcclxuaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi4vLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2VcIjtcclxuaW1wb3J0IHhkb2MgZnJvbSBcInhkb2MtcGFyc2VyXCI7XHJcbmltcG9ydCB7IGNyZWF0ZUFTVE5vZGUsIEFTVE5vZGUgfSBmcm9tIFwiLi4vLi4vY29tbW9uL2FzdFwiO1xyXG5cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVHJlZVNpdHRlck5vZGUge1xyXG4gIHZpc2l0KHZpc2l0b3I6IE5vZGVWaXNpdG9yKTogdm9pZFxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE5vZGVWaXNpdG9yIHtcclxuICBnZXRBU1QoKTogQVNUTm9kZVtdXHJcbiAgdmlzaXROb2RlKG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlXHJcbiAgdmlzaXRDaGlsZHJlbihub2RlczogU3ludGF4Tm9kZVtdKTogQVNUTm9kZVtdXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOb2RlIGltcGxlbWVudHMgVHJlZVNpdHRlck5vZGUge1xyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBzeW50YXhOb2RlOiBTeW50YXhOb2RlKSB7IH1cclxuICB2aXNpdCA9ICh2aXNpdG9yOiBOb2RlVmlzaXRvcik6IHZvaWQgPT4ge1xyXG4gICAgdmlzaXRvci52aXNpdE5vZGUodGhpcy5zeW50YXhOb2RlKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBUeXBlU2NyaXB0VmlzaXRvciBpbXBsZW1lbnRzIE5vZGVWaXNpdG9yIHtcclxuICBwcml2YXRlIGFzdDogQVNUTm9kZVtdID0gW11cclxuICBwcml2YXRlIHNvdXJjZTogU291cmNlXHJcbiAgcHJpdmF0ZSBwYXJlbnQ6IFN5bnRheE5vZGVcclxuICBjb25zdHJ1Y3Rvcihzb3VyY2U6IFNvdXJjZSkge1xyXG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgd2hldGhlciBhIG5vZGUgaGFzIGluaGVyaXRhbmNlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoYXNJbmhlcml0YW5jZShub2RlOiBTeW50YXhOb2RlKSB7XHJcbiAgICByZXR1cm4gbm9kZS5jaGlsZHJlblxyXG4gICAgICAuZmlsdGVyKG5vZGUgPT4ge1xyXG4gICAgICAgIHJldHVybiBub2RlLnR5cGUuaW5jbHVkZXMoJ2V4dGVuZHMnKSB8fCBub2RlLnR5cGUuaW5jbHVkZXMoJ2ltcGxlbWVudHMnKTtcclxuICAgICAgfSkubGVuZ3RoID4gMFxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIG5vZGUncyBpbmhlcml0YW5jZSB0eXBlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRJbmhlcml0YW5jZVR5cGUobm9kZTogU3ludGF4Tm9kZSkge1xyXG4gICAgaWYgKG5vZGUuY2hpbGRyZW4uZmlsdGVyKG5vZGUgPT4gbm9kZS50eXBlLmluY2x1ZGVzKCdleHRlbmRzJykpKSB7XHJcbiAgICAgIHJldHVybiAnZXh0ZW5kcyc7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG5vZGUuY2hpbGRyZW4uZmlsdGVyKG5vZGUgPT4gbm9kZS50eXBlLmluY2x1ZGVzKCdpbXBsZW1lbnRzJykpKSB7XHJcbiAgICAgIHJldHVybiAnaW1wbGVtZW50cyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbHRlckNvbW1lbnRzKG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICAgIHJldHVybiBub2RlLmNoaWxkcmVuLmZpbHRlcihjaGlsZCA9PiBtYXRjaChjaGlsZCwgJ2NvbW1lbnQnKSk7XHJcbiAgfVxyXG5cclxuICBnZXRBU1QoKTogQVNUTm9kZVtdIHtcclxuICAgIHJldHVybiB0aGlzLmFzdDtcclxuICB9XHJcbiAgLyogVmlzaXRvcnMgICovXHJcbiAgdmlzaXROb2RlID0gKFxyXG4gICAgbm9kZTogU3ludGF4Tm9kZVxyXG4gICkgPT4ge1xyXG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcclxuICAgICAgY2FzZSAncHJvZ3JhbSc6XHJcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBub2RlO1xyXG4gICAgICAgIHRoaXMuYXN0ID0gdGhpcy52aXNpdFByb2dyYW0obm9kZSk7XHJcbiAgICAgIGNhc2UgJ2NvbW1lbnQnOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0Q29tbWVudChub2RlKTtcclxuICAgICAgY2FzZSAnTUlTU0lORyc6XHJcbiAgICAgIGNhc2UgJ0VSUk9SJzpcclxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuVHJlZVNpdHRlclBhcnNlRXJyb3IpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG5cclxuICAgICAgICAvKiBNYXRjaCBvdGhlciBub24tdGVybWluYWxzICovXHJcblxyXG4gICAgICAgIGlmIChtYXRjaChub2RlLCAnY29uc3RyYWludCcpKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdENvbnN0cmFpbnQobm9kZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChtYXRjaChub2RlLFxyXG4gICAgICAgICAgJ3R5cGVfaWRlbnRpZmllcicsICd0eXBlX3BhcmFtZXRlcnMnLCAndHlwZV9wYXJhbWV0ZXInLCAndHlwZV9hbm5vdGF0aW9uJyxcclxuICAgICAgICAgICdvYmplY3RfdHlwZScsXHJcbiAgICAgICAgKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRUeXBlTm9kZShub2RlKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG1hdGNoKG5vZGUsICdleHRlbmRzX2NsYXVzZScpKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdEluaGVyaXRhbmNlQ2xhdXNlKG5vZGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQSBjYWxsX3NpZ25hdHVyZSBjYW4gYWxzbyBiZSBhIG5vbi1jb250ZXh0dWFsIG5vZGVcclxuICAgICAgICBpZiAobWF0Y2gobm9kZSwgJ2NhbGxfc2lnbmF0dXJlJykpIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLnZpc2l0U2lnbmF0dXJlKG5vZGUpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBNYXRjaCB0ZXJtaW5hbHMgKi9cclxuXHJcbiAgICAgICAgaWYgKG1hdGNoKG5vZGUsICdpZGVudGlmaWVyJywgJ2V4dGVuZHMnLCAncHJvcGVydHlfaWRlbnRpZmllcicpKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdFRlcm1pbmFsKG5vZGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbG9nLnJlcG9ydCh0aGlzLnNvdXJjZSwgbm9kZSwgRXJyb3JUeXBlLk5vZGVUeXBlTm90WWV0U3VwcG9ydGVkKTtcclxuXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB2aXNpdENoaWxkcmVuID0gKG5vZGVzOiBTeW50YXhOb2RlW10pOiBBU1ROb2RlW10gPT4ge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgbm9kZXNcclxuICAgICAgICAuZmlsdGVyKGNoaWxkID0+ICFjaGlsZC50eXBlLm1hdGNoKC9bPD4oKXt9LDo7XFxbXFxdXS8pKVxyXG4gICAgICAgIC5tYXAodGhpcy52aXNpdE5vZGUuYmluZCh0aGlzKSkgYXMgQVNUTm9kZVtdXHJcbiAgICApLmZpbHRlcihjaGlsZCA9PiAhIWNoaWxkKTtcclxuICB9XHJcblxyXG4gIHZpc2l0UHJvZ3JhbSA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZVtdID0+IHtcclxuICAgIHJldHVybiB0aGlzLnZpc2l0Q2hpbGRyZW4odGhpcy5maWx0ZXJDb21tZW50cyhub2RlKSk7XHJcbiAgfVxyXG5cclxuICB2aXNpdENvbW1lbnQgPSAobm9kZTogU3ludGF4Tm9kZSk6IEFTVE5vZGUgPT4ge1xyXG4gICAgaWYgKGlzSmF2YURvY0NvbW1lbnQodGhpcy5zb3VyY2UsIG5vZGUpKSB7XHJcbiAgICAgIGNvbnN0IG5leHRTaWJsaW5nID0gc2libGluZyhub2RlKTtcclxuICAgICAgaWYgKG5leHRTaWJsaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIHRoaXMudmlzaXRDb250ZXh0KG5leHRTaWJsaW5nLCB7fSksIHRydWUpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHZpc2l0Q29udGV4dCA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcclxuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XHJcbiAgICAgIGNhc2UgJ2ludGVyZmFjZV9kZWNsYXJhdGlvbic6XHJcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBub2RlO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0SW50ZXJmYWNlRGVjbGFyYXRpb24obm9kZSwgcHJvcGVydGllcylcclxuICAgICAgY2FzZSAnY2FsbF9zaWduYXR1cmUnOlxyXG4gICAgICBjYXNlICdtZXRob2Rfc2lnbmF0dXJlJzpcclxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdFNpZ25hdHVyZShub2RlLCBwcm9wZXJ0aWVzKTtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyogRGVjbGFyYXRpb25zICovXHJcblxyXG4gIHZpc2l0SW50ZXJmYWNlRGVjbGFyYXRpb24gPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XHJcbiAgICAvLyBTaG9ydGVuIHRoZSBub2RlIGZyb20gJ2ludGVyZmFjZV9kZWNsYXJhdGlvbicgdG8gJ2ludGVyZmFjZSdcclxuICAgIHJldHVybiB0aGlzLnZpc2l0SW50ZXJmYWNlKG5vZGUsIHByb3BlcnRpZXMpXHJcbiAgfVxyXG5cclxuICB2aXNpdEludGVyZmFjZSA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcclxuICAgIC8vIFNpbmNlICdpbnRlcmZhY2UnIGlzIGVsZW1lbnQgaW4gdGhlIGFycmF5XHJcbiAgICAvLyB3ZSdsbCBuZWVkIHRvIHJlbW92ZSBpdCBmcm9tIHRoZSBhcnJheS5cclxuICAgIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XHJcbiAgICBjb25zdCBpbnRlcmZhY2VfID0gY2hpbGRyZW4uc2hpZnQoKTtcclxuXHJcbiAgICBsZXQgZXh0ZW5kc18gPSBmYWxzZSwgaW1wbGVtZW50c18gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLmhhc0luaGVyaXRhbmNlKG5vZGUpKSB7XHJcbiAgICAgIGNvbnN0IGluaGVyaXRhbmNlID0gdGhpcy5nZXRJbmhlcml0YW5jZVR5cGUobm9kZSlcclxuICAgICAgZXh0ZW5kc18gPSBpbmhlcml0YW5jZSA9PT0gJ2V4dGVuZHMnO1xyXG4gICAgICBpbXBsZW1lbnRzXyA9IGluaGVyaXRhbmNlID09PSAnaW1wbGVtZW50cyc7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgbm9kZV8gPSBjcmVhdGVBU1ROb2RlKFxyXG4gICAgICB0aGlzLnNvdXJjZSwgXHJcbiAgICAgIG5vZGUsIFxyXG4gICAgICB0aGlzLnZpc2l0Q2hpbGRyZW4oY2hpbGRyZW4pLCBcclxuICAgICAgT2JqZWN0LmFzc2lnbihwcm9wZXJ0aWVzIHx8IHt9LCB7XHJcbiAgICAgIGluaGVyaXRhbmNlOiB7XHJcbiAgICAgICAgaW1wbGVtZW50czogaW1wbGVtZW50c18sXHJcbiAgICAgICAgZXh0ZW5kczogZXh0ZW5kc19cclxuICAgICAgfSBhcyBOb2RlSW5oZXJpdGFuY2VcclxuICAgIH0pKTtcclxuICAgIC8vIE92ZXJ3cml0ZSB0aGUgbm9kZSB0eXBlIGZyb20gJ2ludGVyZmFjZV9kZWNsYXJhdGlvbicgdG8gJ2ludGVyZmFjZSdcclxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5vZGVfLCB7IHR5cGU6IGludGVyZmFjZV8udHlwZSB9KVxyXG4gIH1cclxuXHJcbiAgLyogU2lnbmF0dXJlcyAqL1xyXG4gIHZpc2l0U2lnbmF0dXJlID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xyXG4gICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIHRoaXMudmlzaXRDaGlsZHJlbihub2RlLmNoaWxkcmVuKSwgcHJvcGVydGllcylcclxuICB9XHJcblxyXG4gIC8qIFR5cGVzICovXHJcblxyXG4gIHZpc2l0VHlwZU5vZGUgPSAobm9kZTogU3ludGF4Tm9kZSk6IEFTVE5vZGUgPT4ge1xyXG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcclxuICAgICAgY2FzZSAndHlwZV9pZGVudGlmaWVyJzpcclxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdFRlcm1pbmFsKG5vZGUpXHJcbiAgICAgIGNhc2UgJ3R5cGVfcGFyYW1ldGVycyc6XHJcbiAgICAgIGNhc2UgJ3R5cGVfcGFyYW1ldGVyJzpcclxuICAgICAgY2FzZSAndHlwZV9hbm5vdGF0aW9uJzpcclxuICAgICAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENoaWxkcmVuKG5vZGUuY2hpbGRyZW4pKVxyXG4gICAgICBjYXNlICdvYmplY3RfdHlwZSc6XHJcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIHRoaXMudmlzaXRDaGlsZHJlbih0aGlzLmZpbHRlckNvbW1lbnRzKG5vZGUpKSlcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qIE90aGVyIG5vbi10ZXJtaW5hbHMgKi9cclxuXHJcbiAgdmlzaXRDb25zdHJhaW50ID0gKG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlID0+IHtcclxuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q2hpbGRyZW4obm9kZS5jaGlsZHJlbikpXHJcbiAgfVxyXG5cclxuICB2aXNpdEluaGVyaXRhbmNlQ2xhdXNlID0gKG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlID0+IHtcclxuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q2hpbGRyZW4obm9kZS5jaGlsZHJlbikpXHJcbiAgfVxyXG5cclxuICAvKiBUZXJtaW5hbHMgKi9cclxuXHJcbiAgdmlzaXRUZXJtaW5hbCA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZSA9PiB7XHJcbiAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSlcclxuICB9XHJcbn0iXX0= \ No newline at end of file diff --git a/build/src/utils/comment.js b/build/src/utils/comment.js index dd61fb4..d67c1c8 100644 --- a/build/src/utils/comment.js +++ b/build/src/utils/comment.js @@ -39,4 +39,4 @@ function isXDocCommentFragment(source, node) { return !isXDocCommentBlock(source, node) && isXDocComment(source, node); } exports.isXDocCommentFragment = isXDocCommentFragment; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9jb21tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsbUNBQTRCO0FBR2YsUUFBQSxTQUFTLEdBQUcsOEVBQThFLENBQUM7QUFFeEcsU0FBZ0IsY0FBYyxDQUFFLE1BQWMsRUFBRSxJQUFnQjtJQUM5RCxNQUFNLGFBQWEsR0FBRztRQUNwQixXQUFXO1FBQ1gsc0JBQXNCO1FBQ3RCLFNBQVM7UUFDVCxxQkFBcUI7S0FDdEIsQ0FBQztJQUNGLElBQUksZUFBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRTtRQUMxQixPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDOUIsTUFBTSxDQUFDLElBQUk7YUFDUixTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQ3pDLFdBQVcsRUFBRTthQUNiLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FDbEIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDbEI7QUFDSCxDQUFDO0FBZkQsd0NBZUM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDL0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEUsbUJBQW1CO0lBQ25CLE9BQU8saUNBQWlDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQ3hELENBQUM7QUFKRCw0Q0FJQztBQUVELFNBQWdCLGFBQWEsQ0FBQyxNQUFhLEVBQUUsSUFBaUI7SUFDNUQsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQ3JCLElBQUksSUFBSTtRQUFFLE9BQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JFLE9BQU8saUJBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUpELHNDQUlDO0FBRUQsU0FBZ0Isa0JBQWtCLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQ2pFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDM0QsQ0FBQztBQUhELGdEQUdDO0FBRUQsU0FBZ0IscUJBQXFCLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQ3BFLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRkQsc0RBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgbWF0Y2ggZnJvbSBcIi4vbWF0Y2hcIjtcbmltcG9ydCBTb3VyY2UgZnJvbSBcIi4uL2ludGVyZmFjZXMvU291cmNlXCI7XG5cbmV4cG9ydCBjb25zdCBYRG9jUmVnZXggPSAvQChcXHcrKShbXntbKFxcbl0qKT8oW1xce1xcW1xcKF1bXFxzXFxTXSpbXFx9XFxdXFwpXShbXFxzXSooPXwtKT4uKik/KT8oW1xcc10qLSguKSopPy9nbWk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xlZ2FsQ29tbWVudCAoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgY29uc3QgcG9zc2libGVUZXh0cyA9IFtcbiAgICAnY29weXJpZ2h0JyxcbiAgICAndGVybXMgYW5kIGNvbmRpdGlvbnMnLFxuICAgICdsaWNlbnNlJyxcbiAgICAnYWxsIHJpZ2h0cyByZXNlcnZlZCdcbiAgXTtcbiAgaWYgKG1hdGNoKG5vZGUsICdjb21tZW50JykpIHtcbiAgICByZXR1cm4gcG9zc2libGVUZXh0cy5tYXAodGV4dCA9PlxuICAgICAgc291cmNlLnRleHRcbiAgICAgICAgLnN1YnN0cmluZyhub2RlLnN0YXJ0SW5kZXgsIG5vZGUuZW5kSW5kZXgpXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgIC5pbmNsdWRlcyh0ZXh0KVxuICAgICkuaW5jbHVkZXModHJ1ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSmF2YURvY0NvbW1lbnQoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgY29uc3QgY29tbWVudCA9IHNvdXJjZS50ZXh0LnN1YnN0cmluZyhub2RlLnN0YXJ0SW5kZXgsIG5vZGUuZW5kSW5kZXgpO1xuICAvLyByZWdleHIuY29tLzNlanZiXG4gIHJldHVybiAvKFxcL1xcKlxcKikoKFxccyopKC4qPykoXFxzKSkqKFxcKlxcLykvLnRlc3QoY29tbWVudClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzWERvY0NvbW1lbnQoc291cmNlOnN0cmluZywgbm9kZT86IFN5bnRheE5vZGUpIHtcbiAgbGV0IGNvbW1lbnQgPSBzb3VyY2U7XG4gIGlmIChub2RlKSBjb21tZW50ID0gc291cmNlLnN1YnN0cmluZyhub2RlLnN0YXJ0SW5kZXgsIG5vZGUuZW5kSW5kZXgpO1xuICByZXR1cm4gWERvY1JlZ2V4LnRlc3QoY29tbWVudCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1hEb2NDb21tZW50QmxvY2soc291cmNlOiBzdHJpbmcsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgY29uc3QgY29tbWVudCA9IHNvdXJjZS5zdWJzdHJpbmcobm9kZS5zdGFydEluZGV4LCBub2RlLmVuZEluZGV4KTtcbiAgcmV0dXJuIC8jQVBJLy50ZXN0KGNvbW1lbnQpIHx8IC9cXGBcXGBcXGB4ZG9jLy50ZXN0KGNvbW1lbnQpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1hEb2NDb21tZW50RnJhZ21lbnQoc291cmNlOiBzdHJpbmcsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgcmV0dXJuICFpc1hEb2NDb21tZW50QmxvY2soc291cmNlLCBub2RlKSAmJiBpc1hEb2NDb21tZW50KHNvdXJjZSwgbm9kZSk7XG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9jb21tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsbUNBQTRCO0FBR2YsUUFBQSxTQUFTLEdBQUcsOEVBQThFLENBQUM7QUFFeEcsU0FBZ0IsY0FBYyxDQUFFLE1BQWMsRUFBRSxJQUFnQjtJQUM5RCxNQUFNLGFBQWEsR0FBRztRQUNwQixXQUFXO1FBQ1gsc0JBQXNCO1FBQ3RCLFNBQVM7UUFDVCxxQkFBcUI7S0FDdEIsQ0FBQztJQUNGLElBQUksZUFBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRTtRQUMxQixPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDOUIsTUFBTSxDQUFDLElBQUk7YUFDUixTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQ3pDLFdBQVcsRUFBRTthQUNiLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FDbEIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDbEI7QUFDSCxDQUFDO0FBZkQsd0NBZUM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDL0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEUsbUJBQW1CO0lBQ25CLE9BQU8saUNBQWlDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQ3hELENBQUM7QUFKRCw0Q0FJQztBQUVELFNBQWdCLGFBQWEsQ0FBQyxNQUFhLEVBQUUsSUFBaUI7SUFDNUQsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQ3JCLElBQUksSUFBSTtRQUFFLE9BQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JFLE9BQU8saUJBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUpELHNDQUlDO0FBRUQsU0FBZ0Isa0JBQWtCLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQ2pFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDM0QsQ0FBQztBQUhELGdEQUdDO0FBRUQsU0FBZ0IscUJBQXFCLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQ3BFLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRkQsc0RBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XHJcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi9tYXRjaFwiO1xyXG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xyXG5cclxuZXhwb3J0IGNvbnN0IFhEb2NSZWdleCA9IC9AKFxcdyspKFtee1soXFxuXSopPyhbXFx7XFxbXFwoXVtcXHNcXFNdKltcXH1cXF1cXCldKFtcXHNdKig9fC0pPi4qKT8pPyhbXFxzXSotKC4pKik/L2dtaTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0xlZ2FsQ29tbWVudCAoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICBjb25zdCBwb3NzaWJsZVRleHRzID0gW1xyXG4gICAgJ2NvcHlyaWdodCcsXHJcbiAgICAndGVybXMgYW5kIGNvbmRpdGlvbnMnLFxyXG4gICAgJ2xpY2Vuc2UnLFxyXG4gICAgJ2FsbCByaWdodHMgcmVzZXJ2ZWQnXHJcbiAgXTtcclxuICBpZiAobWF0Y2gobm9kZSwgJ2NvbW1lbnQnKSkge1xyXG4gICAgcmV0dXJuIHBvc3NpYmxlVGV4dHMubWFwKHRleHQgPT5cclxuICAgICAgc291cmNlLnRleHRcclxuICAgICAgICAuc3Vic3RyaW5nKG5vZGUuc3RhcnRJbmRleCwgbm9kZS5lbmRJbmRleClcclxuICAgICAgICAudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgIC5pbmNsdWRlcyh0ZXh0KVxyXG4gICAgKS5pbmNsdWRlcyh0cnVlKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0phdmFEb2NDb21tZW50KHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlKSB7XHJcbiAgY29uc3QgY29tbWVudCA9IHNvdXJjZS50ZXh0LnN1YnN0cmluZyhub2RlLnN0YXJ0SW5kZXgsIG5vZGUuZW5kSW5kZXgpO1xyXG4gIC8vIHJlZ2V4ci5jb20vM2VqdmJcclxuICByZXR1cm4gLyhcXC9cXCpcXCopKChcXHMqKSguKj8pKFxccykpKihcXCpcXC8pLy50ZXN0KGNvbW1lbnQpXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1hEb2NDb21tZW50KHNvdXJjZTpzdHJpbmcsIG5vZGU/OiBTeW50YXhOb2RlKSB7XHJcbiAgbGV0IGNvbW1lbnQgPSBzb3VyY2U7XHJcbiAgaWYgKG5vZGUpIGNvbW1lbnQgPSBzb3VyY2Uuc3Vic3RyaW5nKG5vZGUuc3RhcnRJbmRleCwgbm9kZS5lbmRJbmRleCk7XHJcbiAgcmV0dXJuIFhEb2NSZWdleC50ZXN0KGNvbW1lbnQpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNYRG9jQ29tbWVudEJsb2NrKHNvdXJjZTogc3RyaW5nLCBub2RlOiBTeW50YXhOb2RlKSB7XHJcbiAgY29uc3QgY29tbWVudCA9IHNvdXJjZS5zdWJzdHJpbmcobm9kZS5zdGFydEluZGV4LCBub2RlLmVuZEluZGV4KTtcclxuICByZXR1cm4gLyNBUEkvLnRlc3QoY29tbWVudCkgfHwgL1xcYFxcYFxcYHhkb2MvLnRlc3QoY29tbWVudClcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzWERvY0NvbW1lbnRGcmFnbWVudChzb3VyY2U6IHN0cmluZywgbm9kZTogU3ludGF4Tm9kZSkge1xyXG4gIHJldHVybiAhaXNYRG9jQ29tbWVudEJsb2NrKHNvdXJjZSwgbm9kZSkgJiYgaXNYRG9jQ29tbWVudChzb3VyY2UsIG5vZGUpO1xyXG59Il19 \ No newline at end of file diff --git a/build/src/utils/log.js b/build/src/utils/log.js index e5a2f9e..07cc8cf 100644 --- a/build/src/utils/log.js +++ b/build/src/utils/log.js @@ -13,8 +13,8 @@ class ParserLog extends mr_doc_utils_1.Log { this.report = (source, node, error) => { const location = range_1.default(node).location; const sameLine = location.row.start === location.row.end; - const getRange = () => sameLine ? location.row.start + 1 : location.row.start + 1 + ' - ' + location.row.end + 1; - const culprit = `Line${sameLine ? '' : 's'} ${getRange()} in '${source.path}${source.name}'`; + const getLineRange = () => sameLine ? location.row.start + 1 : location.row.start + 1 + ' - ' + location.row.end + 1; + const culprit = `Line${sameLine ? '' : 's'} ${getLineRange()} in '${source.path}${source.name}'`; switch (error) { case ErrorType.NodeTypeNotYetSupported: this.info(`'${node.type.replace(/[_]/g, ' ')}' is not yet supported:\n${culprit}`); @@ -29,4 +29,4 @@ class ParserLog extends mr_doc_utils_1.Log { } const log = new ParserLog('mr-doc::parser'); exports.default = log; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtDQUFtQztBQUduQyxtQ0FBNEI7QUFFNUIsSUFBWSxTQUdYO0FBSEQsV0FBWSxTQUFTO0lBQ2pCLCtFQUF1QixDQUFBO0lBQ3ZCLHlFQUFvQixDQUFBO0FBQ3hCLENBQUMsRUFIVyxTQUFTLEdBQVQsaUJBQVMsS0FBVCxpQkFBUyxRQUdwQjtBQUVELE1BQU0sU0FBVSxTQUFRLGtCQUFHO0lBQTNCOztRQUNJLFdBQU0sR0FBRyxDQUFDLE1BQWMsRUFBRSxJQUFnQixFQUFFLEtBQWdCLEVBQVEsRUFBRTtZQUNsRSxNQUFNLFFBQVEsR0FBRyxlQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ3RDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQ3pELE1BQU0sUUFBUSxHQUFHLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNqSCxNQUFNLE9BQU8sR0FBRyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksUUFBUSxFQUFFLFFBQVEsTUFBTSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUM7WUFDN0YsUUFBUSxLQUFLLEVBQUU7Z0JBQ1gsS0FBSyxTQUFTLENBQUMsdUJBQXVCO29CQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyw0QkFBNEIsT0FBTyxFQUFFLENBQUMsQ0FBQTtvQkFDbEYsTUFBTTtnQkFDVixLQUFLLFNBQVMsQ0FBQyxvQkFBb0I7b0JBQy9CLElBQUksQ0FBQyxLQUFLLENBQUMscURBQXFELE9BQU8sRUFBRSxDQUFDLENBQUE7Z0JBQzlFO29CQUNJLE1BQU07YUFDYjtRQUNMLENBQUMsQ0FBQTtJQUNMLENBQUM7Q0FBQTtBQUdELE1BQU0sR0FBRyxHQUFHLElBQUksU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFFNUMsa0JBQWUsR0FBRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTG9nIH0gZnJvbSAnbXItZG9jLXV0aWxzJztcbmltcG9ydCBTb3VyY2UgZnJvbSAnLi4vaW50ZXJmYWNlcy9Tb3VyY2UnO1xuaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gJ3RyZWUtc2l0dGVyJztcbmltcG9ydCByYW5nZSBmcm9tICcuL3JhbmdlJztcblxuZXhwb3J0IGVudW0gRXJyb3JUeXBlIHtcbiAgICBOb2RlVHlwZU5vdFlldFN1cHBvcnRlZCxcbiAgICBUcmVlU2l0dGVyUGFyc2VFcnJvclxufVxuXG5jbGFzcyBQYXJzZXJMb2cgZXh0ZW5kcyBMb2cge1xuICAgIHJlcG9ydCA9IChzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSwgZXJyb3I6IEVycm9yVHlwZSk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCBsb2NhdGlvbiA9IHJhbmdlKG5vZGUpLmxvY2F0aW9uO1xuICAgICAgICBjb25zdCBzYW1lTGluZSA9IGxvY2F0aW9uLnJvdy5zdGFydCA9PT0gbG9jYXRpb24ucm93LmVuZDtcbiAgICAgICAgY29uc3QgZ2V0UmFuZ2UgPSAoKSA9PiBzYW1lTGluZSA/IGxvY2F0aW9uLnJvdy5zdGFydCArIDEgOiBsb2NhdGlvbi5yb3cuc3RhcnQgKyAxICsgJyAtICcgKyBsb2NhdGlvbi5yb3cuZW5kICsgMTtcbiAgICAgICAgY29uc3QgY3VscHJpdCA9IGBMaW5lJHtzYW1lTGluZSA/ICcnIDogJ3MnfSAke2dldFJhbmdlKCl9IGluICcke3NvdXJjZS5wYXRofSR7c291cmNlLm5hbWV9J2A7XG4gICAgICAgIHN3aXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhc2UgRXJyb3JUeXBlLk5vZGVUeXBlTm90WWV0U3VwcG9ydGVkOlxuICAgICAgICAgICAgICAgIHRoaXMuaW5mbyhgJyR7bm9kZS50eXBlLnJlcGxhY2UoL1tfXS9nLCAnICcpfScgaXMgbm90IHlldCBzdXBwb3J0ZWQ6XFxuJHtjdWxwcml0fWApXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEVycm9yVHlwZS5UcmVlU2l0dGVyUGFyc2VFcnJvcjpcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yKGAndHJlZS1zaXR0ZXInIHdhcyBub3QgYWJsZSB0byBwYXJzZSB0aGUgcHJvZ3JhbTpcXG4ke2N1bHByaXR9YClcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuY29uc3QgbG9nID0gbmV3IFBhcnNlckxvZygnbXItZG9jOjpwYXJzZXInKTtcblxuZXhwb3J0IGRlZmF1bHQgbG9nOyJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtDQUFtQztBQUduQyxtQ0FBNEI7QUFFNUIsSUFBWSxTQUdYO0FBSEQsV0FBWSxTQUFTO0lBQ2pCLCtFQUF1QixDQUFBO0lBQ3ZCLHlFQUFvQixDQUFBO0FBQ3hCLENBQUMsRUFIVyxTQUFTLEdBQVQsaUJBQVMsS0FBVCxpQkFBUyxRQUdwQjtBQUVELE1BQU0sU0FBVSxTQUFRLGtCQUFHO0lBQTNCOztRQUNJLFdBQU0sR0FBRyxDQUFDLE1BQWMsRUFBRSxJQUFnQixFQUFFLEtBQWdCLEVBQVEsRUFBRTtZQUNsRSxNQUFNLFFBQVEsR0FBRyxlQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ3RDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQ3pELE1BQU0sWUFBWSxHQUFHLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNySCxNQUFNLE9BQU8sR0FBRyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksWUFBWSxFQUFFLFFBQVEsTUFBTSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUM7WUFDakcsUUFBUSxLQUFLLEVBQUU7Z0JBQ1gsS0FBSyxTQUFTLENBQUMsdUJBQXVCO29CQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyw0QkFBNEIsT0FBTyxFQUFFLENBQUMsQ0FBQTtvQkFDbEYsTUFBTTtnQkFDVixLQUFLLFNBQVMsQ0FBQyxvQkFBb0I7b0JBQy9CLElBQUksQ0FBQyxLQUFLLENBQUMscURBQXFELE9BQU8sRUFBRSxDQUFDLENBQUE7Z0JBQzlFO29CQUNJLE1BQU07YUFDYjtRQUNMLENBQUMsQ0FBQTtJQUNMLENBQUM7Q0FBQTtBQUdELE1BQU0sR0FBRyxHQUFHLElBQUksU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFFNUMsa0JBQWUsR0FBRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTG9nIH0gZnJvbSAnbXItZG9jLXV0aWxzJztcclxuaW1wb3J0IFNvdXJjZSBmcm9tICcuLi9pbnRlcmZhY2VzL1NvdXJjZSc7XHJcbmltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tICd0cmVlLXNpdHRlcic7XHJcbmltcG9ydCByYW5nZSBmcm9tICcuL3JhbmdlJztcclxuXHJcbmV4cG9ydCBlbnVtIEVycm9yVHlwZSB7XHJcbiAgICBOb2RlVHlwZU5vdFlldFN1cHBvcnRlZCxcclxuICAgIFRyZWVTaXR0ZXJQYXJzZUVycm9yXHJcbn1cclxuXHJcbmNsYXNzIFBhcnNlckxvZyBleHRlbmRzIExvZyB7XHJcbiAgICByZXBvcnQgPSAoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUsIGVycm9yOiBFcnJvclR5cGUpOiB2b2lkID0+IHtcclxuICAgICAgICBjb25zdCBsb2NhdGlvbiA9IHJhbmdlKG5vZGUpLmxvY2F0aW9uO1xyXG4gICAgICAgIGNvbnN0IHNhbWVMaW5lID0gbG9jYXRpb24ucm93LnN0YXJ0ID09PSBsb2NhdGlvbi5yb3cuZW5kO1xyXG4gICAgICAgIGNvbnN0IGdldExpbmVSYW5nZSA9ICgpID0+IHNhbWVMaW5lID8gbG9jYXRpb24ucm93LnN0YXJ0ICsgMSA6IGxvY2F0aW9uLnJvdy5zdGFydCArIDEgKyAnIC0gJyArIGxvY2F0aW9uLnJvdy5lbmQgKyAxO1xyXG4gICAgICAgIGNvbnN0IGN1bHByaXQgPSBgTGluZSR7c2FtZUxpbmUgPyAnJyA6ICdzJ30gJHtnZXRMaW5lUmFuZ2UoKX0gaW4gJyR7c291cmNlLnBhdGh9JHtzb3VyY2UubmFtZX0nYDtcclxuICAgICAgICBzd2l0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNhc2UgRXJyb3JUeXBlLk5vZGVUeXBlTm90WWV0U3VwcG9ydGVkOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5pbmZvKGAnJHtub2RlLnR5cGUucmVwbGFjZSgvW19dL2csICcgJyl9JyBpcyBub3QgeWV0IHN1cHBvcnRlZDpcXG4ke2N1bHByaXR9YClcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIEVycm9yVHlwZS5UcmVlU2l0dGVyUGFyc2VFcnJvcjpcclxuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoYCd0cmVlLXNpdHRlcicgd2FzIG5vdCBhYmxlIHRvIHBhcnNlIHRoZSBwcm9ncmFtOlxcbiR7Y3VscHJpdH1gKVxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5cclxuY29uc3QgbG9nID0gbmV3IFBhcnNlckxvZygnbXItZG9jOjpwYXJzZXInKTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGxvZzsiXX0= \ No newline at end of file diff --git a/build/src/utils/match.js b/build/src/utils/match.js index 36fca43..d87f15b 100644 --- a/build/src/utils/match.js +++ b/build/src/utils/match.js @@ -13,4 +13,4 @@ function match(node, ...types) { return matches.includes(true); } exports.default = match; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvbWF0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQTs7Ozs7OztHQU9HO0FBQ0gsU0FBd0IsS0FBSyxDQUFDLElBQWdCLEVBQUUsR0FBRyxLQUFlO0lBQ2hFLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5RCxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQUhELHdCQUdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIG5vZGUgaXMgYSBjZXJ0YWluIHR5cGUuXG4gKiBgYGBcbiAqIEBwYXJhbSBub2RlOiBTeW50YXhOb2RlIC0gVGhlIG5vZGUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB0eXBlOiBzdHJpbmcgIC0gVGhlIG5vZGUgdHlwZSB0byBtYXRjaC5cbiAqIEByZXR1cm46IGJvb2xlYW5cbiAqIGBgYFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYXRjaChub2RlOiBTeW50YXhOb2RlLCAuLi50eXBlczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgY29uc3QgbWF0Y2hlcyA9IHR5cGVzLm1hcCh0eXBlID0+IG5vZGUgJiYgdHlwZSA9PT0gbm9kZS50eXBlKTtcbiAgcmV0dXJuIG1hdGNoZXMuaW5jbHVkZXModHJ1ZSk7XG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvbWF0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQTs7Ozs7OztHQU9HO0FBQ0gsU0FBd0IsS0FBSyxDQUFDLElBQWdCLEVBQUUsR0FBRyxLQUFlO0lBQ2hFLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5RCxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQUhELHdCQUdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5cclxuLyoqXHJcbiAqIERldGVybWluZXMgd2hldGhlciBhIG5vZGUgaXMgYSBjZXJ0YWluIHR5cGUuXHJcbiAqIGBgYFxyXG4gKiBAcGFyYW0gbm9kZTogU3ludGF4Tm9kZSAtIFRoZSBub2RlIHRvIGNvbXBhcmUuXHJcbiAqIEBwYXJhbSB0eXBlOiBzdHJpbmcgIC0gVGhlIG5vZGUgdHlwZSB0byBtYXRjaC5cclxuICogQHJldHVybjogYm9vbGVhblxyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1hdGNoKG5vZGU6IFN5bnRheE5vZGUsIC4uLnR5cGVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xyXG4gIGNvbnN0IG1hdGNoZXMgPSB0eXBlcy5tYXAodHlwZSA9PiBub2RlICYmIHR5cGUgPT09IG5vZGUudHlwZSk7XHJcbiAgcmV0dXJuIG1hdGNoZXMuaW5jbHVkZXModHJ1ZSk7XHJcbn0iXX0= \ No newline at end of file diff --git a/build/src/utils/range.js b/build/src/utils/range.js index e8ee5d6..4adeddb 100644 --- a/build/src/utils/range.js +++ b/build/src/utils/range.js @@ -13,4 +13,4 @@ function range(node) { }; } exports.default = range; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvcmFuZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxTQUF3QixLQUFLLENBQUMsSUFBdUI7SUFDbkQsT0FBTztRQUNMLFFBQVEsRUFBRTtZQUNSLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVTtZQUN0QixHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDbkI7UUFDRCxRQUFRLEVBQUU7WUFDUixHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQ2pFLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7U0FDM0U7S0FDRixDQUFBO0FBQ0gsQ0FBQztBQVhELHdCQVdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcbmltcG9ydCBUZXh0UmFuZ2UgZnJvbSAnLi4vaW50ZXJmYWNlcy9UZXh0UmFuZ2UnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByYW5nZShub2RlOiBQYXJzZXIuU3ludGF4Tm9kZSk6IFRleHRSYW5nZSB7XG4gIHJldHVybiB7XG4gICAgcG9zaXRpb246IHtcbiAgICAgIHN0YXJ0OiBub2RlLnN0YXJ0SW5kZXgsXG4gICAgICBlbmQ6IG5vZGUuZW5kSW5kZXhcbiAgICB9LFxuICAgIGxvY2F0aW9uOiB7XG4gICAgICByb3c6IHsgc3RhcnQ6IG5vZGUuc3RhcnRQb3NpdGlvbi5yb3csIGVuZDogbm9kZS5lbmRQb3NpdGlvbi5yb3cgfSxcbiAgICAgIGNvbHVtbjogeyBzdGFydDogbm9kZS5zdGFydFBvc2l0aW9uLmNvbHVtbiwgZW5kOiBub2RlLmVuZFBvc2l0aW9uLmNvbHVtbiB9XG4gICAgfVxuICB9XG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvcmFuZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxTQUF3QixLQUFLLENBQUMsSUFBdUI7SUFDbkQsT0FBTztRQUNMLFFBQVEsRUFBRTtZQUNSLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVTtZQUN0QixHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDbkI7UUFDRCxRQUFRLEVBQUU7WUFDUixHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQ2pFLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7U0FDM0U7S0FDRixDQUFBO0FBQ0gsQ0FBQztBQVhELHdCQVdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcclxuaW1wb3J0IFRleHRSYW5nZSBmcm9tICcuLi9pbnRlcmZhY2VzL1RleHRSYW5nZSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByYW5nZShub2RlOiBQYXJzZXIuU3ludGF4Tm9kZSk6IFRleHRSYW5nZSB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHBvc2l0aW9uOiB7XHJcbiAgICAgIHN0YXJ0OiBub2RlLnN0YXJ0SW5kZXgsXHJcbiAgICAgIGVuZDogbm9kZS5lbmRJbmRleFxyXG4gICAgfSxcclxuICAgIGxvY2F0aW9uOiB7XHJcbiAgICAgIHJvdzogeyBzdGFydDogbm9kZS5zdGFydFBvc2l0aW9uLnJvdywgZW5kOiBub2RlLmVuZFBvc2l0aW9uLnJvdyB9LFxyXG4gICAgICBjb2x1bW46IHsgc3RhcnQ6IG5vZGUuc3RhcnRQb3NpdGlvbi5jb2x1bW4sIGVuZDogbm9kZS5lbmRQb3NpdGlvbi5jb2x1bW4gfVxyXG4gICAgfVxyXG4gIH1cclxufSJdfQ== \ No newline at end of file diff --git a/build/src/utils/sibling.js b/build/src/utils/sibling.js index fe01442..66420fd 100644 --- a/build/src/utils/sibling.js +++ b/build/src/utils/sibling.js @@ -12,4 +12,4 @@ function sibling(node, children, filter) { } } exports.sibling = sibling; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2libGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9zaWJsaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsU0FBZ0IsT0FBTyxDQUNyQixJQUFnQixFQUNoQixRQUF1QixFQUN2QixNQUFzQjtJQUV0QixJQUFJLElBQUksRUFBRTtRQUNSLElBQUksUUFBUSxFQUFFO1lBQ1osTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUM7Z0JBQ3BCLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsT0FBTyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzVCO1FBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0tBQ3pCO0FBQ0gsQ0FBQztBQWRELDBCQWNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuXG5leHBvcnQgZnVuY3Rpb24gc2libGluZyhcbiAgbm9kZTogU3ludGF4Tm9kZSxcbiAgY2hpbGRyZW4/OiBTeW50YXhOb2RlW10sXG4gIGZpbHRlcj86ICgpID0+IGJvb2xlYW5cbikge1xuICBpZiAobm9kZSkge1xuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgY29uc3QgaW5kZXggPSBmaWx0ZXIgP1xuICAgICAgICBjaGlsZHJlbi5maWx0ZXIoZmlsdGVyKS5pbmRleE9mKG5vZGUpIDpcbiAgICAgICAgY2hpbGRyZW4uaW5kZXhPZihub2RlKTtcbiAgICAgIHJldHVybiBjaGlsZHJlbltpbmRleCArIDFdO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZS5uZXh0U2libGluZztcbiAgfVxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2libGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9zaWJsaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsU0FBZ0IsT0FBTyxDQUNyQixJQUFnQixFQUNoQixRQUF1QixFQUN2QixNQUFzQjtJQUV0QixJQUFJLElBQUksRUFBRTtRQUNSLElBQUksUUFBUSxFQUFFO1lBQ1osTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUM7Z0JBQ3BCLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsT0FBTyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzVCO1FBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0tBQ3pCO0FBQ0gsQ0FBQztBQWRELDBCQWNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNpYmxpbmcoXHJcbiAgbm9kZTogU3ludGF4Tm9kZSxcclxuICBjaGlsZHJlbj86IFN5bnRheE5vZGVbXSxcclxuICBmaWx0ZXI/OiAoKSA9PiBib29sZWFuXHJcbikge1xyXG4gIGlmIChub2RlKSB7XHJcbiAgICBpZiAoY2hpbGRyZW4pIHtcclxuICAgICAgY29uc3QgaW5kZXggPSBmaWx0ZXIgP1xyXG4gICAgICAgIGNoaWxkcmVuLmZpbHRlcihmaWx0ZXIpLmluZGV4T2Yobm9kZSkgOlxyXG4gICAgICAgIGNoaWxkcmVuLmluZGV4T2Yobm9kZSk7XHJcbiAgICAgIHJldHVybiBjaGlsZHJlbltpbmRleCArIDFdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7XHJcbiAgfVxyXG59Il19 \ No newline at end of file diff --git a/build/src/utils/text.js b/build/src/utils/text.js index c4b2bc3..2727251 100644 --- a/build/src/utils/text.js +++ b/build/src/utils/text.js @@ -12,4 +12,4 @@ function text(source, node) { return source.text.substring(node.startIndex, node.endIndex); } exports.text = text; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy90ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0E7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLElBQUksQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDbkQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRkQsb0JBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGNvbnRleHQgc3RyaW5nXG4gKiBcbiAqICMgQVBJXG4gKiBcbiAqIEBwYXJhbSBzb3VyY2U6IElGaWxlIC0gVGhlIHNvdXJjZSBmaWxlLlxuICogQHBhcmFtIG5vZGU6IFN5bnRheE5vZGUgLSBUaGUgc3ludGF4IG5vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXh0KHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlKSB7XG4gIHJldHVybiBzb3VyY2UudGV4dC5zdWJzdHJpbmcobm9kZS5zdGFydEluZGV4LCBub2RlLmVuZEluZGV4KTtcbn0iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy90ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0E7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLElBQUksQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDbkQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRkQsb0JBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XHJcbmltcG9ydCBTb3VyY2UgZnJvbSBcIi4uL2ludGVyZmFjZXMvU291cmNlXCI7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgY29udGV4dCBzdHJpbmdcclxuICogXHJcbiAqICMgQVBJXHJcbiAqIFxyXG4gKiBAcGFyYW0gc291cmNlOiBJRmlsZSAtIFRoZSBzb3VyY2UgZmlsZS5cclxuICogQHBhcmFtIG5vZGU6IFN5bnRheE5vZGUgLSBUaGUgc3ludGF4IG5vZGUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdGV4dChzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSkge1xyXG4gIHJldHVybiBzb3VyY2UudGV4dC5zdWJzdHJpbmcobm9kZS5zdGFydEluZGV4LCBub2RlLmVuZEluZGV4KTtcclxufSJdfQ== \ No newline at end of file diff --git a/build/src/utils/walk.d.ts b/build/src/utils/walk.d.ts new file mode 100644 index 0000000..4e9e624 --- /dev/null +++ b/build/src/utils/walk.d.ts @@ -0,0 +1,3 @@ +import { SyntaxNode } from "tree-sitter"; +import { Node } from "../lang/typescript/visitor"; +export default function walk(node: SyntaxNode): Node; diff --git a/build/src/utils/walk.js b/build/src/utils/walk.js new file mode 100644 index 0000000..a743446 --- /dev/null +++ b/build/src/utils/walk.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const visitor_1 = require("../lang/typescript/visitor"); +function walk(node) { + let node_ = new visitor_1.Node(node); + node_.syntaxNode.children.map(child => walk(child)); + return node_; +} +exports.default = walk; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Fsay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy93YWxrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0Esd0RBQWtEO0FBRWxELFNBQXdCLElBQUksQ0FBQyxJQUFnQjtJQUMzQyxJQUFJLEtBQUssR0FBRyxJQUFJLGNBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUNuRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFKRCx1QkFJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcclxuaW1wb3J0IHsgTm9kZSB9IGZyb20gXCIuLi9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvclwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gd2Fsayhub2RlOiBTeW50YXhOb2RlKSB7XHJcbiAgbGV0IG5vZGVfID0gbmV3IE5vZGUobm9kZSk7XHJcbiAgbm9kZV8uc3ludGF4Tm9kZS5jaGlsZHJlbi5tYXAoY2hpbGQgPT4gd2FsayhjaGlsZCkpXHJcbiAgcmV0dXJuIG5vZGVfO1xyXG59Il19 \ No newline at end of file diff --git a/example.ts b/example.ts index 190a6c0..dbd609e 100644 --- a/example.ts +++ b/example.ts @@ -1,10 +1,13 @@ - +/** + * Description + */ interface A { } /** * Description + * @interface B */ interface B extends A { /** @@ -14,5 +17,5 @@ interface B extends A { /** * description */ - func (x: string): void + func (x: string): A } \ No newline at end of file diff --git a/index.ts b/index.ts index 1e94f75..258a1d2 100644 --- a/index.ts +++ b/index.ts @@ -43,4 +43,4 @@ const result = new Parser({ // console.log(JSON.stringify(result, null, 2)) -// console.log(result); +console.log(result); diff --git a/package-lock.json b/package-lock.json index b69c25b..d805dc2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -100,11 +100,6 @@ "readable-stream": "^2.0.6" } }, - "array-iterate": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.2.tgz", - "integrity": "sha512-1hWSHTIlG/8wtYD+PPX5AOBtKWngpDFjrsrHgZpe+JdgNGz0udYu6ZIkAa/xuenIUEqFv7DvE2Yr60jxweJSrQ==" - }, "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -757,11 +752,10 @@ "integrity": "sha512-NcWuJFHDA8V3wkDgR/j4+gZx+YQwstPgfQDV8ndUeWWzta3dnDTBxpVzqS9lkmJAuV5YX35lmyojl6HO5JXAgw==" }, "mdast-util-compact": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.1.tgz", - "integrity": "sha1-zbX4TitqLTEU3zO9BdnLMuPECDo=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.2.tgz", + "integrity": "sha512-d2WS98JSDVbpSsBfVvD9TaDMlqPRz7ohM/11G0rp5jOBb5q96RJ6YLszQ/09AAixyzh23FeIpCGqfaamEADtWg==", "requires": { - "unist-util-modify-children": "^1.0.0", "unist-util-visit": "^1.1.0" } }, @@ -1272,9 +1266,9 @@ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" }, "tree-sitter": { - "version": "0.13.6", - "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.13.6.tgz", - "integrity": "sha512-HU6wzU1KUVe56HQKU04rVhX51U6myG3tuc3cdKZHNztv9LihI33eIOxGExPPCTSpHfDoV+a0i6Az8YOopEj+5w==", + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.13.7.tgz", + "integrity": "sha512-yHUI2QK52l5v1jru+oO29o1LAmgPFhGAFChfknWWFdqinPdNOIuWCBhvpIEu6Cf4/s9PdxWfinkSNbLBoHTxXA==", "requires": { "nan": "^2.10.0", "prebuild-install": "^5.0.0" @@ -1357,14 +1351,6 @@ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.2.tgz", "integrity": "sha512-YkXBK/H9raAmG7KXck+UUpnKiNmUdB+aBGrknfQ4EreE1banuzrKABx3jP6Z5Z3fMSPMQQmeXBlKpCbMwBkxVw==" }, - "unist-util-modify-children": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-1.1.2.tgz", - "integrity": "sha512-GRi04yhng1WqBf5RBzPkOtWAadcZS2gvuOgNn/cyJBYNxtTuyYqTKN0eg4rC1YJwGnzrqfRB3dSKm8cNCjNirg==", - "requires": { - "array-iterate": "^1.0.0" - } - }, "unist-util-remove-position": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.2.tgz", @@ -1452,9 +1438,9 @@ "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=" }, "xdoc-parser": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/xdoc-parser/-/xdoc-parser-3.2.1.tgz", - "integrity": "sha512-fboTklKlbe27iE4Wsg+K/O9+uV3qBhQ351PgNvh2NR54fh79wQL921+qLpfQ1WN06vbEUVknNVLR0vxYxALg6w==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/xdoc-parser/-/xdoc-parser-3.2.2.tgz", + "integrity": "sha512-P0ESzdcb8sujsRwRyKVvjyvAO7gm1tXID4s5v7snUXW3LvN2dJHnH9+d+T6C25FxEdoAbp+WzBbdkVT/uv81kQ==", "requires": { "antlr4ts": "^0.4.1-alpha.0", "lodash": "^4.17.10", diff --git a/package.json b/package.json index df1dd99..fa868d3 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "babylon": "^6.7.0", "lodash": "^4.17.10", "mr-doc-utils": "github:iwatakeshi/mr-doc-utils", - "tree-sitter": "^0.13.6", + "tree-sitter": "^0.13.7", "tree-sitter-javascript": "^0.13.5", "tree-sitter-typescript": "^0.13.3", "xdoc-parser": "^3.2.1" diff --git a/src/interfaces/IParser.ts b/src/interfaces/IParser.ts index 0f11955..27385f2 100644 --- a/src/interfaces/IParser.ts +++ b/src/interfaces/IParser.ts @@ -1,9 +1,10 @@ import Source from "./Source"; +import { ASTNode } from "../lang/common/ast"; // import IResult from "./IResult"; export default abstract class IParser { constructor(file: Source, options: any) { } - abstract parse(): any + abstract parse(): ASTNode[] } \ No newline at end of file diff --git a/src/interfaces/TextRange.ts b/src/interfaces/TextRange.ts index 36ab160..b221c22 100644 --- a/src/interfaces/TextRange.ts +++ b/src/interfaces/TextRange.ts @@ -2,9 +2,7 @@ /** * An interface that represents a range. * - * ```xdoc * @interface Range - * ``` */ export interface Range { start: number, @@ -15,30 +13,24 @@ export interface Range { * An interface that represents the positional * and locational ranges of a source code. * - * ```xdoc * @interface TextRange - * ``` */ export default interface TextRange { /** * Represents a context's start and end position. - * ```xdoc * @property position: { * start: number, * end: number * } - * ``` */ position: Range /** * Represents a context's row and column location. * - * ```xdoc * @location: { * row: Range, * column: Range * } - * ``` */ location: { row: Range, diff --git a/src/lang/common/ast.ts b/src/lang/common/ast.ts new file mode 100644 index 0000000..02f5f55 --- /dev/null +++ b/src/lang/common/ast.ts @@ -0,0 +1,64 @@ +import { DocumentationNode } from 'xdoc-parser/src/XDocASTNode'; +import { RemarkNode } from 'xdoc-parser/src/XDocParser'; +import { SyntaxNode } from "tree-sitter"; +import { text } from "../../utils/text"; +import range from "../../utils/range"; +import Source from "../../interfaces/Source"; +import TextRange from "../../interfaces/TextRange"; +import xdoc from 'xdoc-parser'; + + +export interface ASTNode extends TextRange { + /** + * @property - The type of node. + */ + type: string, + /** + * @property - The context string. + */ + text: string, + /** + * @property - The node's children. + */ + children: ASTNode[] | undefined[], + /** + * @property - The context node that a comment node refers to. + */ + context: ASTNode, + /** + * @property - The properties that a ASTNode may possess. + */ + properties?: object + /** + * @property - The parsed XDoc comment. + */ + comment?: { + markdown: RemarkNode, + documentation: Partial + } +} + +export function createASTNode(source: Source, node: SyntaxNode): ASTNode +export function createASTNode(source: Source, node: SyntaxNode, children: object[]): ASTNode +export function createASTNode(source: Source, node: SyntaxNode, children: object[], properties: object) +export function createASTNode(source: Source, node: SyntaxNode, context: ASTNode, document: boolean): ASTNode +export function createASTNode(source: Source, node: SyntaxNode, arg1?: any, arg2?: any): ASTNode { + + let context, children = [], document = typeof arg2 === 'boolean' && arg2 === true, properties; + if (Array.isArray(arg1)) children = arg1; + else context = arg1; + + if (typeof arg2 === 'object') { + properties = arg2; + } + + return { + type: node.type, + text: text(source, node), + ...range(node), + context, + children, + comment: document ? xdoc(source.text).parse() : undefined, + properties, + } +} diff --git a/src/lang/common/emca.ts b/src/lang/common/emca.ts new file mode 100644 index 0000000..0c223bb --- /dev/null +++ b/src/lang/common/emca.ts @@ -0,0 +1,14 @@ +export interface NodeProperties { + exports: Partial + inheritance: Partial +} + +export interface NodeExports { + export: boolean, + default: boolean +} + +export interface NodeInheritance { + extends: boolean, + implements: boolean +} \ No newline at end of file diff --git a/src/lang/javascript/index.ts b/src/lang/javascript/index.ts index 678b440..3479238 100644 --- a/src/lang/javascript/index.ts +++ b/src/lang/javascript/index.ts @@ -55,6 +55,7 @@ export default class JavaScriptParser implements IParser { // // .map(this.checkType) // .map(this.parseChildren) // } + return []; } // private filterType = (comment): boolean => { @@ -105,4 +106,5 @@ export default class JavaScriptParser implements IParser { // } // return comment; // } + } \ No newline at end of file diff --git a/src/lang/typescript/Node.ts b/src/lang/typescript/Node.ts deleted file mode 100644 index fb4868b..0000000 --- a/src/lang/typescript/Node.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { DocumentationNode } from 'xdoc-parser/src/XDocASTNode'; -import { RemarkNode } from 'xdoc-parser/src/XDocParser'; -import { SyntaxNode } from "tree-sitter"; -import { text } from "../../utils/text"; -import range from "../../utils/range"; -import Source from "../../interfaces/Source"; -import TextRange from "../../interfaces/TextRange"; -import xdoc from 'xdoc-parser'; - - -export interface ASTNode extends TextRange { - text: string, - properties?: any - comment?: { - markdown: RemarkNode, - documentation: Partial - } -} - -export function createASTNode( - source: Source, - node: SyntaxNode, - document?: boolean, -): ASTNode { - - let node_ = { ...range(node), text: text(source, node) } - - if (document) { - node_ = Object.assign(node_, { comment: xdoc(node_.text).parse() }) - } - return node_; -} - -export interface NodeProperties { - exports: Partial - inheritance: Partial -} - -export interface NodeExports { - export: boolean, - default: boolean -} - -export interface NodeInheritance { - extends: boolean, - implements: boolean -} \ No newline at end of file diff --git a/src/lang/typescript/index.ts b/src/lang/typescript/index.ts index 6befba6..2461fed 100644 --- a/src/lang/typescript/index.ts +++ b/src/lang/typescript/index.ts @@ -2,8 +2,8 @@ import * as Parser from 'tree-sitter'; import * as TypeScript from 'tree-sitter-typescript'; import IParser from '../../interfaces/IParser'; import Source from '../../interfaces/Source'; -import walk from './walk'; -import { TypeScriptVisitor } from './visitors/visitor'; +import walk from '../../utils/walk'; +import { TypeScriptVisitor } from './visitor'; /** diff --git a/src/lang/typescript/visitor.ts b/src/lang/typescript/visitor.ts new file mode 100644 index 0000000..d36e711 --- /dev/null +++ b/src/lang/typescript/visitor.ts @@ -0,0 +1,252 @@ +import { NodeProperties, NodeInheritance } from "../common/emca"; +import { isJavaDocComment } from "../../utils/comment"; +import { sibling } from "../../utils/sibling"; +import { SyntaxNode } from "tree-sitter"; +import { text } from "../../utils/text"; +import log, { ErrorType } from "../../utils/log"; +import match from "../../utils/match"; +import Source from "../../interfaces/Source"; +import xdoc from "xdoc-parser"; +import { createASTNode, ASTNode } from "../common/ast"; + + +export interface TreeSitterNode { + visit(visitor: NodeVisitor): void +} + +export interface NodeVisitor { + getAST(): ASTNode[] + visitNode(node: SyntaxNode): ASTNode + visitChildren(nodes: SyntaxNode[]): ASTNode[] +} + +export class Node implements TreeSitterNode { + constructor(public syntaxNode: SyntaxNode) { } + visit = (visitor: NodeVisitor): void => { + visitor.visitNode(this.syntaxNode); + } +} + +export class TypeScriptVisitor implements NodeVisitor { + private ast: ASTNode[] = [] + private source: Source + private parent: SyntaxNode + constructor(source: Source) { + this.source = source; + } + /** + * Determines whether a node has inheritance + */ + private hasInheritance(node: SyntaxNode) { + return node.children + .filter(node => { + return node.type.includes('extends') || node.type.includes('implements'); + }).length > 0 + } + + /** + * Returns a node's inheritance type + */ + private getInheritanceType(node: SyntaxNode) { + if (node.children.filter(node => node.type.includes('extends'))) { + return 'extends'; + } + + if (node.children.filter(node => node.type.includes('implements'))) { + return 'implements'; + } + } + + private filterComments(node: SyntaxNode) { + return node.children.filter(child => match(child, 'comment')); + } + + getAST(): ASTNode[] { + return this.ast; + } + + /* Visitors */ + + visitNode = ( + node: SyntaxNode + ) => { + switch (node.type) { + case 'program': + this.parent = node; + this.ast = this.visitProgram(node); + case 'comment': + return this.visitComment(node); + case 'MISSING': + case 'ERROR': + log.report(this.source, node, ErrorType.TreeSitterParseError); + break; + default: + + /* Match other non-terminals */ + + if (match(node, 'constraint')) { + return this.visitConstraint(node) + } + + if (match(node, 'formal_parameters')) { + return this.visitFormalParamters(node); + } + + if (match(node, 'required_parameter')) { + return this.visitRequiredParameter(node); + } + + if (match(node, + 'type_identifier', 'type_parameters', 'type_parameter', 'type_annotation', + 'object_type', 'predefined_type' + )) { + return this.visitTypeNode(node) + } + + if (match(node, 'extends_clause')) { + return this.visitInheritanceClause(node); + } + + // A call_signature can also be a non-contextual node + if (match(node, 'call_signature')) { + return this.visitSignature(node) + } + + /* Match terminals */ + if (match(node, + 'identifier', 'extends', 'property_identifier', + 'string', 'void', 'boolean', 'null', 'undefined', 'number' + )) { + return this.visitTerminal(node); + } + + log.report(this.source, node, ErrorType.NodeTypeNotYetSupported); + + break; + } + } + + visitChildren = (nodes: SyntaxNode[]): ASTNode[] => { + return ( + nodes + .filter(child => !child.type.match(/[<>(){},:;\[\]]/)) + .map(this.visitNode.bind(this)) as ASTNode[] + ).filter(child => !!child); + } + + private visitProgram = (node: SyntaxNode): ASTNode[] => { + return this.visitChildren(this.filterComments(node)); + } + + private visitComment = (node: SyntaxNode): ASTNode => { + if (isJavaDocComment(this.source, node)) { + const nextSibling = sibling(node); + if (nextSibling) { + return createASTNode(this.source, node, this.visitContext(nextSibling, {}), true) + } + } + } + + /** + * Visit the contextual node + * + * # Remark + * + * A node is considered contextual when a comment is visited and the node is its sibling. + */ + private visitContext = (node: SyntaxNode, properties?: Partial): ASTNode => { + switch (node.type) { + case 'interface_declaration': + this.parent = node; + return this.visitInterfaceDeclaration(node, properties) + case 'call_signature': + case 'method_signature': + return this.visitSignature(node, properties); + default: + log.report(this.source, node, ErrorType.NodeTypeNotYetSupported); + break; + } + } + + /* Declarations */ + + private visitInterfaceDeclaration = (node: SyntaxNode, properties?: Partial): ASTNode => { + // Shorten the node from 'interface_declaration' to 'interface' + return this.visitInterface(node, properties) + } + + private visitInterface = (node: SyntaxNode, properties?: Partial): ASTNode => { + // Since 'interface' is element in the array + // we'll need to remove it from the array. + let children = node.children; + const interface_ = children.shift(); + + let extends_ = false, implements_ = false; + if (this.hasInheritance(node)) { + const inheritance = this.getInheritanceType(node) + extends_ = inheritance === 'extends'; + implements_ = inheritance === 'implements'; + } + + const node_ = createASTNode( + this.source, + node, + this.visitChildren(children), + Object.assign(properties || {}, { + inheritance: { + implements: implements_, + extends: extends_ + } as NodeInheritance + })); + // Overwrite the node type from 'interface_declaration' to 'interface' + return Object.assign(node_, { type: interface_.type }) + } + + /* Signatures */ + private visitSignature = (node: SyntaxNode, properties?: Partial): ASTNode => { + return createASTNode(this.source, node, this.visitChildren(node.children), properties) + } + + /* Types */ + + private visitTypeNode = (node: SyntaxNode): ASTNode => { + switch (node.type) { + case 'type_identifier': + return this.visitTerminal(node) + case 'type_parameters': + case 'type_parameter': + case 'type_annotation': + case 'predefined_type': + return createASTNode(this.source, node, this.visitChildren(node.children)) + case 'object_type': + return createASTNode(this.source, node, this.visitChildren(this.filterComments(node))) + default: + log.report(this.source, node, ErrorType.NodeTypeNotYetSupported); + break; + + } + } + + /* Other non-terminals */ + + private visitConstraint = (node: SyntaxNode): ASTNode => { + return createASTNode(this.source, node, this.visitChildren(node.children)) + } + + private visitInheritanceClause = (node: SyntaxNode): ASTNode => { + return createASTNode(this.source, node, this.visitChildren(node.children)) + } + + private visitFormalParamters = (node: SyntaxNode): ASTNode => { + return createASTNode(this.source, node, this.visitChildren(node.children)); + } + + private visitRequiredParameter = (node: SyntaxNode): ASTNode => { + return createASTNode(this.source, node, this.visitChildren(node.children)); + } + /* Terminals */ + + private visitTerminal = (node: SyntaxNode): ASTNode => { + return createASTNode(this.source, node) + } +} \ No newline at end of file diff --git a/src/lang/typescript/visitors/visitor.ts b/src/lang/typescript/visitors/visitor.ts deleted file mode 100644 index 178a0ae..0000000 --- a/src/lang/typescript/visitors/visitor.ts +++ /dev/null @@ -1,243 +0,0 @@ -import { createASTNode, NodeProperties, NodeInheritance } from "../Node"; -import { isJavaDocComment } from "../../../utils/comment"; -import { sibling } from "../../../utils/sibling"; -import { SyntaxNode } from "tree-sitter"; -import { text } from "../../../utils/text"; -import log, { ErrorType } from "../../../utils/log"; -import match from "../../../utils/match"; -import Source from "../../../interfaces/Source"; -import xdoc from "xdoc-parser"; - - -export interface TreeSitterNode { - visit(visitor: NodeVisitor): void -} - -export interface NodeVisitor { - getAST(): object[] - visitNode(node: SyntaxNode): any - visitChildren(nodes: SyntaxNode[]): any -} - -export class Node implements TreeSitterNode { - constructor(public syntaxNode: SyntaxNode) { } - visit = (visitor: NodeVisitor): NodeVisitor => { - return visitor.visitNode(this.syntaxNode); - } -} - -export class TypeScriptVisitor implements NodeVisitor { - private ast = [] - private source: Source - private parent: SyntaxNode - constructor(source: Source) { - this.source = source; - } - private hasInheritance(node: SyntaxNode) { - return node.children - .filter(node => { - return node.type === 'extends' || node.type === 'implements'; - }).length > 0 - } - - private getInheritanceType(node: SyntaxNode) { - if (node.children.filter(node => node.type === 'extends')) { - return 'extends'; - } - - if (node.children.filter(node => node.type === 'implements')) { - return 'implements'; - } - } - - getAST(): object[] { - return this.ast; - } - /* Visitors */ - visitNode = ( - node: SyntaxNode - ) => { - switch (node.type) { - case 'program': - this.parent = node; - this.ast = this.visitProgram(node); - case 'comment': - return this.visitComment(node); - case 'MISSING': - case 'ERROR': - log.report(this.source, node, ErrorType.TreeSitterParseError); - break; - default: - - /* Match other non-terminals */ - - if (match(node, 'constraint')) { - return this.visitConstraint(node) - } - - if (match(node, - 'type_identifier', 'type_parameters', 'type_parameter', - 'object_type' - )) { - return this.visitTypeNode(node) - } - - if (match(node, 'extends_clause')) { - return this.visitInheritanceClause(node); - } - - /* Match terminals */ - - if (match(node, 'identifier', 'extends')) { - return this.visitTerminal(node); - } - - log.report(this.source, node, ErrorType.NodeTypeNotYetSupported); - - break; - } - } - - visitChildren = (nodes: SyntaxNode[]) => { - return nodes - .filter(child => !child.type.match(/[<>(){},;\[\]]/)) - .map(this.visitNode.bind(this)) - .filter(child => !!child); - } - - visitProgram = (node: SyntaxNode) => { - return this.visitChildren(node.children.filter(child => { - return match(child, 'comment'); - })); - } - - visitComment = (node: SyntaxNode) => { - if (isJavaDocComment(this.source, node)) { - const nextSibling = sibling(node); - if (nextSibling) { - return { - type: node.type, - ...createASTNode(this.source, node), - context: this.visitContext(nextSibling, {}), - comment: xdoc(text(this.source, node)).parse() - } - } - } - } - - visitContext = (node: SyntaxNode, properties?: Partial) => { - switch (node.type) { - case 'interface_declaration': - this.parent = node; - return this.visitInterfaceDeclaration(node, properties) - case 'call_signature': - return this.visitCallSignature(node, properties); - default: - log.report(this.source, node, ErrorType.NodeTypeNotYetSupported); - break; - } - } - - /* Declarations */ - - visitInterfaceDeclaration = ( - node: SyntaxNode, - properties?: Partial - ) => { - // Shorten the node - return this.visitInterface(node, properties) - } - - visitInterface = (node: SyntaxNode, properties: Partial) => { - let children = node.children; - let extends_ = false, implements_ = false; - if (this.hasInheritance(node)) { - const inheritance = this.getInheritanceType(node) - extends_ = inheritance === 'extends'; - implements_ = inheritance === 'implements'; - } - Object.assign(properties, { - inheritance: { - implements: implements_, - extends: extends_ - } as NodeInheritance - }) - - return { - type: children.shift().type, - ...createASTNode(this.source, node), - children: this.visitChildren(children), - properties - } - } - - /* Signatures */ - visitCallSignature = (node: SyntaxNode, properties: Partial) => { - return { - type: node.type, - ...createASTNode(this.source, node), - children: this.visitChildren(node.children), - properties - } - } - - /* Types */ - - visitTypeNode = (node: SyntaxNode) => { - switch (node.type) { - case 'type_identifier': - return this.visitTerminal(node) - case 'type_parameters': - return { - type: node.type, - ...createASTNode(this.source, node), - children: this.visitChildren(node.children), - } - case 'type_parameter': - return { - type: node.type, - ...createASTNode(this.source, node), - children: this.visitChildren(node.children) - } - case 'object_type': - return { - type: node.type, - ...createASTNode(this.source, node), - children: this.visitChildren(node.children.filter(child => { - return match(child, 'comment') - })) - } - default: - log.report(this.source, node, ErrorType.NodeTypeNotYetSupported); - break; - - } - } - - /* Other non-terminals */ - - visitConstraint = (node: SyntaxNode) => { - return { - type: node.type, - ...createASTNode(this.source, node), - children: this.visitChildren(node.children) - } - } - - visitInheritanceClause = (node: SyntaxNode) => { - return { - type: node.type, - ...createASTNode(this.source, node), - children: this.visitChildren(node.children) - } - } - - /* Terminals */ - - visitTerminal = (node: SyntaxNode) => { - return { - type: node.type, - ...createASTNode(this.source, node), - } - } -} \ No newline at end of file diff --git a/src/utils/log.ts b/src/utils/log.ts index 201de11..3e74f8e 100644 --- a/src/utils/log.ts +++ b/src/utils/log.ts @@ -12,8 +12,8 @@ class ParserLog extends Log { report = (source: Source, node: SyntaxNode, error: ErrorType): void => { const location = range(node).location; const sameLine = location.row.start === location.row.end; - const getRange = () => sameLine ? location.row.start + 1 : location.row.start + 1 + ' - ' + location.row.end + 1; - const culprit = `Line${sameLine ? '' : 's'} ${getRange()} in '${source.path}${source.name}'`; + const getLineRange = () => sameLine ? location.row.start + 1 : location.row.start + 1 + ' - ' + location.row.end + 1; + const culprit = `Line${sameLine ? '' : 's'} ${getLineRange()} in '${source.path}${source.name}'`; switch (error) { case ErrorType.NodeTypeNotYetSupported: this.info(`'${node.type.replace(/[_]/g, ' ')}' is not yet supported:\n${culprit}`) diff --git a/src/lang/typescript/walk.ts b/src/utils/walk.ts similarity index 79% rename from src/lang/typescript/walk.ts rename to src/utils/walk.ts index 0bbca0f..6ccc571 100644 --- a/src/lang/typescript/walk.ts +++ b/src/utils/walk.ts @@ -1,5 +1,5 @@ import { SyntaxNode } from "tree-sitter"; -import { Node } from "./visitors/visitor"; +import { Node } from "../lang/typescript/visitor"; export default function walk(node: SyntaxNode) { let node_ = new Node(node); From 287d937ebe60149716878eb04bd8b870e0227a86 Mon Sep 17 00:00:00 2001 From: Takeshi Date: Wed, 22 Aug 2018 18:17:27 -0600 Subject: [PATCH 15/32] Update: Complete initial TypeScript parser --- build/example.d.ts | 19 +- build/example.js | 12 +- build/index.js | 10 +- build/src/ParserFactory.js | 2 +- build/src/interfaces/IParser.js | 2 +- build/src/interfaces/Source.js | 2 +- build/src/interfaces/TextRange.js | 2 +- build/src/lang/common/ast.js | 2 +- build/src/lang/common/emca.d.ts | 2 + build/src/lang/common/emca.js | 2 +- build/src/lang/common/node.d.ts | 15 + build/src/lang/common/node.js | 12 + build/src/lang/javascript/index.js | 2 +- build/src/lang/typescript/index.js | 13 +- build/src/lang/typescript/visitor.d.ts | 45 +- build/src/lang/typescript/visitor.js | 253 +- build/src/utils/benchmark.d.ts | 1 + build/src/utils/benchmark.js | 10 + build/src/utils/comment.js | 2 +- build/src/utils/log.js | 2 +- build/src/utils/match.js | 11 +- build/src/utils/measure.d.ts | 1 + build/src/utils/measure.js | 6 + build/src/utils/performance.d.ts | 1 + build/src/utils/performance.js | 6 + build/src/utils/range.js | 2 +- build/src/utils/sibling.js | 2 +- build/src/utils/text.js | 2 +- build/src/utils/walk.d.ts | 2 +- build/src/utils/walk.js | 6 +- example.ts | 23 +- index.ts | 14 +- package-lock.json | 5 + package.json | 1 + parser.txt | 7953 ++++++++++++++++++++++++ result.txt | 9 + src/lang/common/emca.ts | 2 + src/lang/common/node.ts | 19 + src/lang/typescript/index.ts | 13 +- src/lang/typescript/visitor.ts | 328 +- src/utils/benchmark.ts | 10 + src/utils/match.ts | 9 +- src/utils/walk.ts | 3 +- 43 files changed, 8523 insertions(+), 315 deletions(-) create mode 100644 build/src/lang/common/node.d.ts create mode 100644 build/src/lang/common/node.js create mode 100644 build/src/utils/benchmark.d.ts create mode 100644 build/src/utils/benchmark.js create mode 100644 build/src/utils/measure.d.ts create mode 100644 build/src/utils/measure.js create mode 100644 build/src/utils/performance.d.ts create mode 100644 build/src/utils/performance.js create mode 100644 parser.txt create mode 100644 result.txt create mode 100644 src/lang/common/node.ts create mode 100644 src/utils/benchmark.ts diff --git a/build/example.d.ts b/build/example.d.ts index b7a53dc..2f25f48 100644 --- a/build/example.d.ts +++ b/build/example.d.ts @@ -1,19 +1,6 @@ -/** - * Description - */ -interface A { -} -/** - * Description - * @interface B - */ -interface B extends A { - /** - * description - */ - (x: string): void; +export declare namespace X { /** - * description + * */ - func(x: string): A; + function name(params: string): void; } diff --git a/build/example.js b/build/example.js index 85f6bc5..c02bf06 100644 --- a/build/example.js +++ b/build/example.js @@ -1,2 +1,12 @@ "use strict"; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhhbXBsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2V4YW1wbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBEZXNjcmlwdGlvblxyXG4gKi9cclxuaW50ZXJmYWNlIEEge1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIERlc2NyaXB0aW9uXHJcbiAqIEBpbnRlcmZhY2UgQlxyXG4gKi9cclxuaW50ZXJmYWNlIEI8VCBleHRlbmRzIEEsIEs+IGV4dGVuZHMgQSB7XHJcbiAgLyoqXHJcbiAgICogZGVzY3JpcHRpb25cclxuICAgKi9cclxuICAoeDogc3RyaW5nKTogdm9pZFxyXG4gIC8qKlxyXG4gICAqIGRlc2NyaXB0aW9uXHJcbiAgICovXHJcbiAgZnVuYyAoeDogc3RyaW5nKTogQVxyXG59Il19 \ No newline at end of file +Object.defineProperty(exports, "__esModule", { value: true }); +var X; +(function (X) { + /** + * + */ + function name(params) { + } + X.name = name; +})(X = exports.X || (exports.X = {})); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhhbXBsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2V4YW1wbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxJQUFpQixDQUFDLENBT2pCO0FBUEQsV0FBaUIsQ0FBQztJQUNoQjs7T0FFRztJQUNILFNBQWdCLElBQUksQ0FBQyxNQUFhO0lBRWxDLENBQUM7SUFGZSxNQUFJLE9BRW5CLENBQUE7QUFDSCxDQUFDLEVBUGdCLENBQUMsR0FBRCxTQUFDLEtBQUQsU0FBQyxRQU9qQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBuYW1lc3BhY2UgWCB7XG4gIC8qKlxuICAgKiBcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBuYW1lKHBhcmFtczpzdHJpbmcpIHtcbiAgICBcbiAgfVxufSJdfQ== \ No newline at end of file diff --git a/build/index.js b/build/index.js index 9efa0a1..4496403 100644 --- a/build/index.js +++ b/build/index.js @@ -2,6 +2,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); const ParserFactory_1 = require("./src/ParserFactory"); const FS = require("fs"); +// import { ASTNode } from './src/lang/common/ast'; /** * A class that parses a source code and generates an AST. * @@ -30,13 +31,12 @@ class Parser { } } exports.default = Parser; +const path = `${process.cwd()}/example.ts`; const result = new Parser({ name: 'index.ts', - path: '../../', - text: FS.readFileSync(`${process.cwd()}/example.ts`, 'utf-8') + path: path, + text: FS.readFileSync(path, 'utf-8') }, { language: 'typescript' }).parse(); -// console.log(JSON.stringify(result, null, 2)) -console.log(result); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLHVEQUFnRDtBQUVoRCx5QkFBeUI7QUFFekI7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQXFCLE1BQU07SUFHekIsWUFBWSxJQUFZLEVBQUUsVUFBZSxFQUFFO1FBRzNDLFVBQUssR0FBRyxHQUFHLEVBQUU7WUFDWCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDNUIsQ0FBQyxDQUFBO1FBSkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksdUJBQWEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMvRCxDQUFDO0NBSUY7QUFURCx5QkFTQztBQUVELE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDO0lBQ3hCLElBQUksRUFBRSxVQUFVO0lBQ2hCLElBQUksRUFBRSxRQUFRO0lBQ2QsSUFBSSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLGFBQWEsRUFBRSxPQUFPLENBQUM7Q0FDOUQsRUFBRTtJQUNELFFBQVEsRUFBRSxZQUFZO0NBQ3ZCLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUdYLCtDQUErQztBQUMvQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNvdXJjZSBmcm9tICcuL3NyYy9pbnRlcmZhY2VzL1NvdXJjZSc7XHJcbmltcG9ydCBQYXJzZXJGYWN0b3J5IGZyb20gJy4vc3JjL1BhcnNlckZhY3RvcnknO1xyXG5pbXBvcnQgSVBhcnNlciBmcm9tICcuL3NyYy9pbnRlcmZhY2VzL0lQYXJzZXInO1xyXG5pbXBvcnQgKiBhcyBGUyBmcm9tICdmcyc7XHJcblxyXG4vKipcclxuICogQSBjbGFzcyB0aGF0IHBhcnNlcyBhIHNvdXJjZSBjb2RlIGFuZCBnZW5lcmF0ZXMgYW4gQVNULlxyXG4gKiBcclxuICogQGNsYXNzIFBhcnNlclxyXG4gKiBAaW1wbGVtZW50cyBJUGFyc2VyXHJcbiAqIFxyXG4gKiAjIEV4YW1wbGVcclxuICogXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIoe1xyXG4gKiAgbmFtZTogJy4uLicsXHJcbiAqICBwYXRoOiAnLi4uLicsXHJcbiAqICB0ZXh0OiAnLi4uJ1xyXG4gKiB9LCB7IGxhbmd1YWdlOiAndHlwZXNjcmlwdCcgfSk7XHJcbiAqIFxyXG4gKiBjb25zdCByZXN1bHQgPSBwYXJzZXIucGFyc2UoKTtcclxuICogXHJcbiAqIGBgYFxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFyc2VyIGltcGxlbWVudHMgSVBhcnNlciB7XHJcblxyXG4gIHByaXZhdGUgcGFyc2VyOiBJUGFyc2VyO1xyXG4gIGNvbnN0cnVjdG9yKGZpbGU6IFNvdXJjZSwgb3B0aW9uczogYW55ID0ge30pIHtcclxuICAgIHRoaXMucGFyc2VyID0gKG5ldyBQYXJzZXJGYWN0b3J5KGZpbGUsIG9wdGlvbnMpKS5nZXRQYXJzZXIoKTtcclxuICB9XHJcbiAgcGFyc2UgPSAoKSA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIucGFyc2UoKVxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgcmVzdWx0ID0gbmV3IFBhcnNlcih7XHJcbiAgbmFtZTogJ2luZGV4LnRzJyxcclxuICBwYXRoOiAnLi4vLi4vJyxcclxuICB0ZXh0OiBGUy5yZWFkRmlsZVN5bmMoYCR7cHJvY2Vzcy5jd2QoKX0vZXhhbXBsZS50c2AsICd1dGYtOCcpXHJcbn0sIHtcclxuICBsYW5ndWFnZTogJ3R5cGVzY3JpcHQnXHJcbn0pLnBhcnNlKCk7XHJcblxyXG5cclxuLy8gY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSlcclxuY29uc29sZS5sb2cocmVzdWx0KTtcclxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLHVEQUFnRDtBQUVoRCx5QkFBeUI7QUFDekIsbURBQW1EO0FBQ25EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFxQixNQUFNO0lBR3pCLFlBQVksSUFBWSxFQUFFLFVBQWUsRUFBRTtRQUczQyxVQUFLLEdBQUcsR0FBRyxFQUFFO1lBQ1gsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQzVCLENBQUMsQ0FBQTtRQUpDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLHVCQUFhLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDL0QsQ0FBQztDQUlGO0FBVEQseUJBU0M7QUFDRCxNQUFNLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsYUFBYSxDQUFDO0FBQzNDLE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDO0lBQ3hCLElBQUksRUFBRSxVQUFVO0lBQ2hCLElBQUksRUFBRSxJQUFJO0lBQ1YsSUFBSSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQztDQUNyQyxFQUFFO0lBQ0QsUUFBUSxFQUFFLFlBQVk7Q0FDdkIsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNvdXJjZSBmcm9tICcuL3NyYy9pbnRlcmZhY2VzL1NvdXJjZSc7XG5pbXBvcnQgUGFyc2VyRmFjdG9yeSBmcm9tICcuL3NyYy9QYXJzZXJGYWN0b3J5JztcbmltcG9ydCBJUGFyc2VyIGZyb20gJy4vc3JjL2ludGVyZmFjZXMvSVBhcnNlcic7XG5pbXBvcnQgKiBhcyBGUyBmcm9tICdmcyc7XG4vLyBpbXBvcnQgeyBBU1ROb2RlIH0gZnJvbSAnLi9zcmMvbGFuZy9jb21tb24vYXN0Jztcbi8qKlxuICogQSBjbGFzcyB0aGF0IHBhcnNlcyBhIHNvdXJjZSBjb2RlIGFuZCBnZW5lcmF0ZXMgYW4gQVNULlxuICogXG4gKiBAY2xhc3MgUGFyc2VyXG4gKiBAaW1wbGVtZW50cyBJUGFyc2VyXG4gKiBcbiAqICMgRXhhbXBsZVxuICogXG4gKiBgYGBqc1xuICogY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcih7XG4gKiAgbmFtZTogJy4uLicsXG4gKiAgcGF0aDogJy4uLi4nLFxuICogIHRleHQ6ICcuLi4nXG4gKiB9LCB7IGxhbmd1YWdlOiAndHlwZXNjcmlwdCcgfSk7XG4gKiBcbiAqIGNvbnN0IHJlc3VsdCA9IHBhcnNlci5wYXJzZSgpO1xuICogXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFyc2VyIGltcGxlbWVudHMgSVBhcnNlciB7XG5cbiAgcHJpdmF0ZSBwYXJzZXI6IElQYXJzZXI7XG4gIGNvbnN0cnVjdG9yKGZpbGU6IFNvdXJjZSwgb3B0aW9uczogYW55ID0ge30pIHtcbiAgICB0aGlzLnBhcnNlciA9IChuZXcgUGFyc2VyRmFjdG9yeShmaWxlLCBvcHRpb25zKSkuZ2V0UGFyc2VyKCk7XG4gIH1cbiAgcGFyc2UgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLnBhcnNlKClcbiAgfVxufVxuY29uc3QgcGF0aCA9IGAke3Byb2Nlc3MuY3dkKCl9L2V4YW1wbGUudHNgO1xuY29uc3QgcmVzdWx0ID0gbmV3IFBhcnNlcih7XG4gIG5hbWU6ICdpbmRleC50cycsXG4gIHBhdGg6IHBhdGgsXG4gIHRleHQ6IEZTLnJlYWRGaWxlU3luYyhwYXRoLCAndXRmLTgnKVxufSwge1xuICBsYW5ndWFnZTogJ3R5cGVzY3JpcHQnXG59KS5wYXJzZSgpOyJdfQ== \ No newline at end of file diff --git a/build/src/ParserFactory.js b/build/src/ParserFactory.js index 98c15fd..ee0c756 100644 --- a/build/src/ParserFactory.js +++ b/build/src/ParserFactory.js @@ -25,4 +25,4 @@ class ParserFactory { } } exports.default = ParserFactory; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFyc2VyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9QYXJzZXJGYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsa0RBQWlEO0FBQ2pELGtEQUFpRDtBQUVqRCxNQUFxQixhQUFhO0lBS2hDLFlBQVksSUFBWSxFQUFFLFVBQWUsRUFBRTtRQUhuQyxZQUFPLEdBQUc7WUFDaEIsUUFBUSxFQUFFLFlBQVk7U0FDdkIsQ0FBQTtRQU1ELGNBQVMsR0FBRyxHQUFZLEVBQUU7WUFDeEIsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDM0MsS0FBSyxJQUFJLENBQUM7Z0JBQ1YsS0FBSyxZQUFZO29CQUNmLE9BQU8sSUFBSSxvQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkQsS0FBSyxJQUFJLENBQUM7Z0JBQ1YsS0FBSyxZQUFZO29CQUNmLE9BQU8sSUFBSSxvQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkQ7b0JBQ0EsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLFVBQVUsQ0FBQyxDQUFBO29CQUNyRSxNQUFNO2FBQ1Q7UUFDSCxDQUFDLENBQUE7UUFoQkMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3RDLENBQUM7Q0FnQkY7QUF4QkQsZ0NBd0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xyXG5pbXBvcnQgSVBhcnNlciBmcm9tIFwiLi9pbnRlcmZhY2VzL0lQYXJzZXJcIjtcclxuaW1wb3J0IEphdmFTY3JpcHRQYXJzZXIgZnJvbSBcIi4vbGFuZy9qYXZhc2NyaXB0XCI7XHJcbmltcG9ydCBUeXBlU2NyaXB0UGFyc2VyIGZyb20gJy4vbGFuZy90eXBlc2NyaXB0JztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhcnNlckZhY3Rvcnkge1xyXG4gIHByaXZhdGUgZmlsZTogU291cmNlXHJcbiAgcHJpdmF0ZSBvcHRpb25zID0ge1xyXG4gICAgbGFuZ3VhZ2U6ICdKYXZhU2NyaXB0J1xyXG4gIH1cclxuICBjb25zdHJ1Y3RvcihmaWxlOiBTb3VyY2UsIG9wdGlvbnM6IGFueSA9IHt9KSB7XHJcbiAgICB0aGlzLmZpbGUgPSBmaWxlO1xyXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdGlvbnMsIG9wdGlvbnMpXHJcbiAgfVxyXG5cclxuICBnZXRQYXJzZXIgPSAoKTogSVBhcnNlciA9PiB7XHJcbiAgICBzd2l0Y2ggKHRoaXMub3B0aW9ucy5sYW5ndWFnZS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIGNhc2UgJ2pzJzpcclxuICAgICAgY2FzZSAnamF2YXNjcmlwdCc6XHJcbiAgICAgICAgcmV0dXJuIG5ldyBKYXZhU2NyaXB0UGFyc2VyKHRoaXMuZmlsZSwgdGhpcy5vcHRpb25zKTtcclxuICAgICAgY2FzZSAndHMnOlxyXG4gICAgICBjYXNlICd0eXBlc2NyaXB0JzpcclxuICAgICAgICByZXR1cm4gbmV3IFR5cGVTY3JpcHRQYXJzZXIodGhpcy5maWxlLCB0aGlzLm9wdGlvbnMpO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICBjb25zb2xlLmxvZyhgW21yLWRvY106IE5vIHBhcnNlciBmb3IgJHt0aGlzLm9wdGlvbnMubGFuZ3VhZ2V9IGV4aXN0cy5gKVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn0iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFyc2VyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9QYXJzZXJGYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsa0RBQWlEO0FBQ2pELGtEQUFpRDtBQUVqRCxNQUFxQixhQUFhO0lBS2hDLFlBQVksSUFBWSxFQUFFLFVBQWUsRUFBRTtRQUhuQyxZQUFPLEdBQUc7WUFDaEIsUUFBUSxFQUFFLFlBQVk7U0FDdkIsQ0FBQTtRQU1ELGNBQVMsR0FBRyxHQUFZLEVBQUU7WUFDeEIsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDM0MsS0FBSyxJQUFJLENBQUM7Z0JBQ1YsS0FBSyxZQUFZO29CQUNmLE9BQU8sSUFBSSxvQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkQsS0FBSyxJQUFJLENBQUM7Z0JBQ1YsS0FBSyxZQUFZO29CQUNmLE9BQU8sSUFBSSxvQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkQ7b0JBQ0EsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLFVBQVUsQ0FBQyxDQUFBO29CQUNyRSxNQUFNO2FBQ1Q7UUFDSCxDQUFDLENBQUE7UUFoQkMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3RDLENBQUM7Q0FnQkY7QUF4QkQsZ0NBd0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuaW1wb3J0IElQYXJzZXIgZnJvbSBcIi4vaW50ZXJmYWNlcy9JUGFyc2VyXCI7XG5pbXBvcnQgSmF2YVNjcmlwdFBhcnNlciBmcm9tIFwiLi9sYW5nL2phdmFzY3JpcHRcIjtcbmltcG9ydCBUeXBlU2NyaXB0UGFyc2VyIGZyb20gJy4vbGFuZy90eXBlc2NyaXB0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFyc2VyRmFjdG9yeSB7XG4gIHByaXZhdGUgZmlsZTogU291cmNlXG4gIHByaXZhdGUgb3B0aW9ucyA9IHtcbiAgICBsYW5ndWFnZTogJ0phdmFTY3JpcHQnXG4gIH1cbiAgY29uc3RydWN0b3IoZmlsZTogU291cmNlLCBvcHRpb25zOiBhbnkgPSB7fSkge1xuICAgIHRoaXMuZmlsZSA9IGZpbGU7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdGlvbnMsIG9wdGlvbnMpXG4gIH1cblxuICBnZXRQYXJzZXIgPSAoKTogSVBhcnNlciA9PiB7XG4gICAgc3dpdGNoICh0aGlzLm9wdGlvbnMubGFuZ3VhZ2UudG9Mb3dlckNhc2UoKSkge1xuICAgICAgY2FzZSAnanMnOlxuICAgICAgY2FzZSAnamF2YXNjcmlwdCc6XG4gICAgICAgIHJldHVybiBuZXcgSmF2YVNjcmlwdFBhcnNlcih0aGlzLmZpbGUsIHRoaXMub3B0aW9ucyk7XG4gICAgICBjYXNlICd0cyc6XG4gICAgICBjYXNlICd0eXBlc2NyaXB0JzpcbiAgICAgICAgcmV0dXJuIG5ldyBUeXBlU2NyaXB0UGFyc2VyKHRoaXMuZmlsZSwgdGhpcy5vcHRpb25zKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICBjb25zb2xlLmxvZyhgW21yLWRvY106IE5vIHBhcnNlciBmb3IgJHt0aGlzLm9wdGlvbnMubGFuZ3VhZ2V9IGV4aXN0cy5gKVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxufSJdfQ== \ No newline at end of file diff --git a/build/src/interfaces/IParser.js b/build/src/interfaces/IParser.js index 4a61442..ab87992 100644 --- a/build/src/interfaces/IParser.js +++ b/build/src/interfaces/IParser.js @@ -6,4 +6,4 @@ class IParser { } } exports.default = IParser; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSVBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbnRlcmZhY2VzL0lQYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQSxtQ0FBbUM7QUFFbkMsTUFBOEIsT0FBTztJQUNuQyxZQUFZLElBQVksRUFBRSxPQUFZO0lBRXRDLENBQUM7Q0FFRjtBQUxELDBCQUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi9Tb3VyY2VcIjtcclxuaW1wb3J0IHsgQVNUTm9kZSB9IGZyb20gXCIuLi9sYW5nL2NvbW1vbi9hc3RcIjtcclxuLy8gaW1wb3J0IElSZXN1bHQgZnJvbSBcIi4vSVJlc3VsdFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgYWJzdHJhY3QgY2xhc3MgSVBhcnNlciB7XHJcbiAgY29uc3RydWN0b3IoZmlsZTogU291cmNlLCBvcHRpb25zOiBhbnkpIHtcclxuXHJcbiAgfVxyXG4gIGFic3RyYWN0IHBhcnNlKCk6IEFTVE5vZGVbXVxyXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSVBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbnRlcmZhY2VzL0lQYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQSxtQ0FBbUM7QUFFbkMsTUFBOEIsT0FBTztJQUNuQyxZQUFZLElBQVksRUFBRSxPQUFZO0lBRXRDLENBQUM7Q0FFRjtBQUxELDBCQUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi9Tb3VyY2VcIjtcbmltcG9ydCB7IEFTVE5vZGUgfSBmcm9tIFwiLi4vbGFuZy9jb21tb24vYXN0XCI7XG4vLyBpbXBvcnQgSVJlc3VsdCBmcm9tIFwiLi9JUmVzdWx0XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGFic3RyYWN0IGNsYXNzIElQYXJzZXIge1xuICBjb25zdHJ1Y3RvcihmaWxlOiBTb3VyY2UsIG9wdGlvbnM6IGFueSkge1xuXG4gIH1cbiAgYWJzdHJhY3QgcGFyc2UoKTogQVNUTm9kZVtdXG59Il19 \ No newline at end of file diff --git a/build/src/interfaces/Source.js b/build/src/interfaces/Source.js index 6590b1a..0d8ff4e 100644 --- a/build/src/interfaces/Source.js +++ b/build/src/interfaces/Source.js @@ -1,3 +1,3 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvU291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBpbnRlcmZhY2UgU291cmNlIHtcclxuICBuYW1lOiBzdHJpbmcsXHJcbiAgcGF0aDogc3RyaW5nLFxyXG4gIHRleHQ6IHN0cmluZ1xyXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvU291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBpbnRlcmZhY2UgU291cmNlIHtcbiAgbmFtZTogc3RyaW5nLFxuICBwYXRoOiBzdHJpbmcsXG4gIHRleHQ6IHN0cmluZ1xufSJdfQ== \ No newline at end of file diff --git a/build/src/interfaces/TextRange.js b/build/src/interfaces/TextRange.js index 015edef..51ef572 100644 --- a/build/src/interfaces/TextRange.js +++ b/build/src/interfaces/TextRange.js @@ -1,3 +1,3 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGV4dFJhbmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvVGV4dFJhbmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuLyoqXHJcbiAqIEFuIGludGVyZmFjZSB0aGF0IHJlcHJlc2VudHMgYSByYW5nZS5cclxuICogXHJcbiAqIEBpbnRlcmZhY2UgUmFuZ2VcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmFuZ2Uge1xyXG4gIHN0YXJ0OiBudW1iZXIsXHJcbiAgZW5kOiBudW1iZXJcclxufVxyXG5cclxuLyoqXHJcbiAqIEFuIGludGVyZmFjZSB0aGF0IHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uYWwgXHJcbiAqIGFuZCBsb2NhdGlvbmFsIHJhbmdlcyBvZiBhIHNvdXJjZSBjb2RlLlxyXG4gKiBcclxuICogQGludGVyZmFjZSBUZXh0UmFuZ2VcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGludGVyZmFjZSBUZXh0UmFuZ2Uge1xyXG4gIC8qKlxyXG4gICAqIFJlcHJlc2VudHMgYSBjb250ZXh0J3Mgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbi5cclxuICAgKiBAcHJvcGVydHkgcG9zaXRpb246IHtcclxuICAgKiAgc3RhcnQ6IG51bWJlcixcclxuICAgKiAgZW5kOiBudW1iZXJcclxuICAgKiB9XHJcbiAgICovXHJcbiAgcG9zaXRpb246IFJhbmdlXHJcbiAgLyoqXHJcbiAgICogUmVwcmVzZW50cyBhIGNvbnRleHQncyByb3cgYW5kIGNvbHVtbiBsb2NhdGlvbi5cclxuICAgKiBcclxuICAgKiBAbG9jYXRpb246IHtcclxuICAgKiAgcm93OiBSYW5nZSxcclxuICAgKiAgY29sdW1uOiBSYW5nZVxyXG4gICAqIH1cclxuICAgKi9cclxuICBsb2NhdGlvbjoge1xyXG4gICAgcm93OiBSYW5nZSxcclxuICAgIGNvbHVtbjogUmFuZ2VcclxuICB9XHJcbn0iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGV4dFJhbmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvVGV4dFJhbmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogQW4gaW50ZXJmYWNlIHRoYXQgcmVwcmVzZW50cyBhIHJhbmdlLlxuICogXG4gKiBAaW50ZXJmYWNlIFJhbmdlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmFuZ2Uge1xuICBzdGFydDogbnVtYmVyLFxuICBlbmQ6IG51bWJlclxufVxuXG4vKipcbiAqIEFuIGludGVyZmFjZSB0aGF0IHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uYWwgXG4gKiBhbmQgbG9jYXRpb25hbCByYW5nZXMgb2YgYSBzb3VyY2UgY29kZS5cbiAqIFxuICogQGludGVyZmFjZSBUZXh0UmFuZ2VcbiAqL1xuZXhwb3J0IGRlZmF1bHQgaW50ZXJmYWNlIFRleHRSYW5nZSB7XG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGEgY29udGV4dCdzIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb24uXG4gICAqIEBwcm9wZXJ0eSBwb3NpdGlvbjoge1xuICAgKiAgc3RhcnQ6IG51bWJlcixcbiAgICogIGVuZDogbnVtYmVyXG4gICAqIH1cbiAgICovXG4gIHBvc2l0aW9uOiBSYW5nZVxuICAvKipcbiAgICogUmVwcmVzZW50cyBhIGNvbnRleHQncyByb3cgYW5kIGNvbHVtbiBsb2NhdGlvbi5cbiAgICogXG4gICAqIEBsb2NhdGlvbjoge1xuICAgKiAgcm93OiBSYW5nZSxcbiAgICogIGNvbHVtbjogUmFuZ2VcbiAgICogfVxuICAgKi9cbiAgbG9jYXRpb246IHtcbiAgICByb3c6IFJhbmdlLFxuICAgIGNvbHVtbjogUmFuZ2VcbiAgfVxufSJdfQ== \ No newline at end of file diff --git a/build/src/lang/common/ast.js b/build/src/lang/common/ast.js index 4a07bbd..31be4a5 100644 --- a/build/src/lang/common/ast.js +++ b/build/src/lang/common/ast.js @@ -16,4 +16,4 @@ function createASTNode(source, node, arg1, arg2) { children, comment: document ? xdoc_parser_1.default(source.text).parse() : undefined, properties }); } exports.createASTNode = createASTNode; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xhbmcvY29tbW9uL2FzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUdBLDJDQUF3QztBQUN4Qyw2Q0FBc0M7QUFHdEMsNkNBQStCO0FBcUMvQixTQUFnQixhQUFhLENBQUMsTUFBYyxFQUFFLElBQWdCLEVBQUUsSUFBVSxFQUFFLElBQVU7SUFFcEYsSUFBSSxPQUFPLEVBQUUsUUFBUSxHQUFHLEVBQUUsRUFBRSxRQUFRLEdBQUcsT0FBTyxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUUsVUFBVSxDQUFDO0lBQzlGLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFBRSxRQUFRLEdBQUcsSUFBSSxDQUFDOztRQUNwQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBRXBCLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO1FBQzVCLFVBQVUsR0FBRyxJQUFJLENBQUM7S0FDbkI7SUFFRCx1QkFDRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFDZixJQUFJLEVBQUUsV0FBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFDckIsZUFBSyxDQUFDLElBQUksQ0FBQyxJQUNkLE9BQU87UUFDUCxRQUFRLEVBQ1IsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMscUJBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFDekQsVUFBVSxJQUNYO0FBQ0gsQ0FBQztBQW5CRCxzQ0FtQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEb2N1bWVudGF0aW9uTm9kZSB9IGZyb20gJ3hkb2MtcGFyc2VyL3NyYy9YRG9jQVNUTm9kZSc7XHJcbmltcG9ydCB7IFJlbWFya05vZGUgfSBmcm9tICd4ZG9jLXBhcnNlci9zcmMvWERvY1BhcnNlcic7XHJcbmltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcclxuaW1wb3J0IHsgdGV4dCB9IGZyb20gXCIuLi8uLi91dGlscy90ZXh0XCI7XHJcbmltcG9ydCByYW5nZSBmcm9tIFwiLi4vLi4vdXRpbHMvcmFuZ2VcIjtcclxuaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2VcIjtcclxuaW1wb3J0IFRleHRSYW5nZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9UZXh0UmFuZ2VcIjtcclxuaW1wb3J0IHhkb2MgZnJvbSAneGRvYy1wYXJzZXInO1xyXG5cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQVNUTm9kZSBleHRlbmRzIFRleHRSYW5nZSB7XHJcbiAgLyoqXHJcbiAgICogQHByb3BlcnR5IC0gVGhlIHR5cGUgb2Ygbm9kZS5cclxuICAgKi9cclxuICB0eXBlOiBzdHJpbmcsXHJcbiAgLyoqXHJcbiAgICogQHByb3BlcnR5IC0gVGhlIGNvbnRleHQgc3RyaW5nLlxyXG4gICAqL1xyXG4gIHRleHQ6IHN0cmluZyxcclxuICAvKipcclxuICAgKiBAcHJvcGVydHkgLSBUaGUgbm9kZSdzIGNoaWxkcmVuLlxyXG4gICAqL1xyXG4gIGNoaWxkcmVuOiBBU1ROb2RlW10gfCB1bmRlZmluZWRbXSxcclxuICAvKipcclxuICAgKiBAcHJvcGVydHkgLSBUaGUgY29udGV4dCBub2RlIHRoYXQgYSBjb21tZW50IG5vZGUgcmVmZXJzIHRvLlxyXG4gICAqL1xyXG4gIGNvbnRleHQ6IEFTVE5vZGUsXHJcbiAgLyoqXHJcbiAgICogQHByb3BlcnR5IC0gVGhlIHByb3BlcnRpZXMgdGhhdCBhIEFTVE5vZGUgbWF5IHBvc3Nlc3MuXHJcbiAgICovXHJcbiAgcHJvcGVydGllcz86IG9iamVjdFxyXG4gIC8qKlxyXG4gICAqIEBwcm9wZXJ0eSAtIFRoZSBwYXJzZWQgWERvYyBjb21tZW50LlxyXG4gICAqL1xyXG4gIGNvbW1lbnQ/OiB7XHJcbiAgICBtYXJrZG93bjogUmVtYXJrTm9kZSxcclxuICAgIGRvY3VtZW50YXRpb246IFBhcnRpYWw8RG9jdW1lbnRhdGlvbk5vZGU+XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQVNUTm9kZShzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSk6IEFTVE5vZGVcclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFTVE5vZGUoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUsIGNoaWxkcmVuOiBvYmplY3RbXSk6IEFTVE5vZGVcclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFTVE5vZGUoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUsIGNoaWxkcmVuOiBvYmplY3RbXSwgcHJvcGVydGllczogb2JqZWN0KVxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQVNUTm9kZShzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSwgY29udGV4dDogQVNUTm9kZSwgZG9jdW1lbnQ6IGJvb2xlYW4pOiBBU1ROb2RlIFxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQVNUTm9kZShzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSwgYXJnMT86IGFueSwgYXJnMj86IGFueSk6IEFTVE5vZGUge1xyXG5cclxuICBsZXQgY29udGV4dCwgY2hpbGRyZW4gPSBbXSwgZG9jdW1lbnQgPSB0eXBlb2YgYXJnMiA9PT0gJ2Jvb2xlYW4nICYmIGFyZzIgPT09IHRydWUsIHByb3BlcnRpZXM7XHJcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJnMSkpIGNoaWxkcmVuID0gYXJnMTtcclxuICBlbHNlIGNvbnRleHQgPSBhcmcxO1xyXG5cclxuICBpZiAodHlwZW9mIGFyZzIgPT09ICdvYmplY3QnKSB7XHJcbiAgICBwcm9wZXJ0aWVzID0gYXJnMjtcclxuICB9XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICB0eXBlOiBub2RlLnR5cGUsXHJcbiAgICB0ZXh0OiB0ZXh0KHNvdXJjZSwgbm9kZSksXHJcbiAgICAuLi5yYW5nZShub2RlKSxcclxuICAgIGNvbnRleHQsXHJcbiAgICBjaGlsZHJlbixcclxuICAgIGNvbW1lbnQ6IGRvY3VtZW50ID8geGRvYyhzb3VyY2UudGV4dCkucGFyc2UoKSA6IHVuZGVmaW5lZCxcclxuICAgIHByb3BlcnRpZXMsXHJcbiAgfVxyXG59XHJcbiJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xhbmcvY29tbW9uL2FzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUdBLDJDQUF3QztBQUN4Qyw2Q0FBc0M7QUFHdEMsNkNBQStCO0FBcUMvQixTQUFnQixhQUFhLENBQUMsTUFBYyxFQUFFLElBQWdCLEVBQUUsSUFBVSxFQUFFLElBQVU7SUFFcEYsSUFBSSxPQUFPLEVBQUUsUUFBUSxHQUFHLEVBQUUsRUFBRSxRQUFRLEdBQUcsT0FBTyxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUUsVUFBVSxDQUFDO0lBQzlGLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFBRSxRQUFRLEdBQUcsSUFBSSxDQUFDOztRQUNwQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBRXBCLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO1FBQzVCLFVBQVUsR0FBRyxJQUFJLENBQUM7S0FDbkI7SUFFRCx1QkFDRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFDZixJQUFJLEVBQUUsV0FBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFDckIsZUFBSyxDQUFDLElBQUksQ0FBQyxJQUNkLE9BQU87UUFDUCxRQUFRLEVBQ1IsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMscUJBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFDekQsVUFBVSxJQUNYO0FBQ0gsQ0FBQztBQW5CRCxzQ0FtQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEb2N1bWVudGF0aW9uTm9kZSB9IGZyb20gJ3hkb2MtcGFyc2VyL3NyYy9YRG9jQVNUTm9kZSc7XG5pbXBvcnQgeyBSZW1hcmtOb2RlIH0gZnJvbSAneGRvYy1wYXJzZXIvc3JjL1hEb2NQYXJzZXInO1xuaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuaW1wb3J0IHsgdGV4dCB9IGZyb20gXCIuLi8uLi91dGlscy90ZXh0XCI7XG5pbXBvcnQgcmFuZ2UgZnJvbSBcIi4uLy4uL3V0aWxzL3JhbmdlXCI7XG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuaW1wb3J0IFRleHRSYW5nZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9UZXh0UmFuZ2VcIjtcbmltcG9ydCB4ZG9jIGZyb20gJ3hkb2MtcGFyc2VyJztcblxuXG5leHBvcnQgaW50ZXJmYWNlIEFTVE5vZGUgZXh0ZW5kcyBUZXh0UmFuZ2Uge1xuICAvKipcbiAgICogQHByb3BlcnR5IC0gVGhlIHR5cGUgb2Ygbm9kZS5cbiAgICovXG4gIHR5cGU6IHN0cmluZyxcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSAtIFRoZSBjb250ZXh0IHN0cmluZy5cbiAgICovXG4gIHRleHQ6IHN0cmluZyxcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSAtIFRoZSBub2RlJ3MgY2hpbGRyZW4uXG4gICAqL1xuICBjaGlsZHJlbjogQVNUTm9kZVtdIHwgdW5kZWZpbmVkW10sXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgLSBUaGUgY29udGV4dCBub2RlIHRoYXQgYSBjb21tZW50IG5vZGUgcmVmZXJzIHRvLlxuICAgKi9cbiAgY29udGV4dDogQVNUTm9kZSxcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0aWVzIHRoYXQgYSBBU1ROb2RlIG1heSBwb3NzZXNzLlxuICAgKi9cbiAgcHJvcGVydGllcz86IG9iamVjdFxuICAvKipcbiAgICogQHByb3BlcnR5IC0gVGhlIHBhcnNlZCBYRG9jIGNvbW1lbnQuXG4gICAqL1xuICBjb21tZW50Pzoge1xuICAgIG1hcmtkb3duOiBSZW1hcmtOb2RlLFxuICAgIGRvY3VtZW50YXRpb246IFBhcnRpYWw8RG9jdW1lbnRhdGlvbk5vZGU+XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFTVE5vZGUoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQVNUTm9kZShzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSwgY2hpbGRyZW46IG9iamVjdFtdKTogQVNUTm9kZVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFTVE5vZGUoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUsIGNoaWxkcmVuOiBvYmplY3RbXSwgcHJvcGVydGllczogb2JqZWN0KVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFTVE5vZGUoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUsIGNvbnRleHQ6IEFTVE5vZGUsIGRvY3VtZW50OiBib29sZWFuKTogQVNUTm9kZSBcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBU1ROb2RlKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlLCBhcmcxPzogYW55LCBhcmcyPzogYW55KTogQVNUTm9kZSB7XG5cbiAgbGV0IGNvbnRleHQsIGNoaWxkcmVuID0gW10sIGRvY3VtZW50ID0gdHlwZW9mIGFyZzIgPT09ICdib29sZWFuJyAmJiBhcmcyID09PSB0cnVlLCBwcm9wZXJ0aWVzO1xuICBpZiAoQXJyYXkuaXNBcnJheShhcmcxKSkgY2hpbGRyZW4gPSBhcmcxO1xuICBlbHNlIGNvbnRleHQgPSBhcmcxO1xuXG4gIGlmICh0eXBlb2YgYXJnMiA9PT0gJ29iamVjdCcpIHtcbiAgICBwcm9wZXJ0aWVzID0gYXJnMjtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogbm9kZS50eXBlLFxuICAgIHRleHQ6IHRleHQoc291cmNlLCBub2RlKSxcbiAgICAuLi5yYW5nZShub2RlKSxcbiAgICBjb250ZXh0LFxuICAgIGNoaWxkcmVuLFxuICAgIGNvbW1lbnQ6IGRvY3VtZW50ID8geGRvYyhzb3VyY2UudGV4dCkucGFyc2UoKSA6IHVuZGVmaW5lZCxcbiAgICBwcm9wZXJ0aWVzLFxuICB9XG59XG4iXX0= \ No newline at end of file diff --git a/build/src/lang/common/emca.d.ts b/build/src/lang/common/emca.d.ts index 7d5678a..55435f1 100644 --- a/build/src/lang/common/emca.d.ts +++ b/build/src/lang/common/emca.d.ts @@ -1,6 +1,8 @@ export interface NodeProperties { exports: Partial; inheritance: Partial; + namespace: boolean; + module: boolean; } export interface NodeExports { export: boolean; diff --git a/build/src/lang/common/emca.js b/build/src/lang/common/emca.js index 493260a..6291930 100644 --- a/build/src/lang/common/emca.js +++ b/build/src/lang/common/emca.js @@ -1,3 +1,3 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1jYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2NvbW1vbi9lbWNhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIE5vZGVQcm9wZXJ0aWVzIHtcclxuICBleHBvcnRzOiBQYXJ0aWFsPE5vZGVFeHBvcnRzPlxyXG4gIGluaGVyaXRhbmNlOiBQYXJ0aWFsPE5vZGVJbmhlcml0YW5jZT5cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBOb2RlRXhwb3J0cyB7XHJcbiAgZXhwb3J0OiBib29sZWFuLFxyXG4gIGRlZmF1bHQ6IGJvb2xlYW5cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBOb2RlSW5oZXJpdGFuY2Uge1xyXG4gIGV4dGVuZHM6IGJvb2xlYW4sXHJcbiAgaW1wbGVtZW50czogYm9vbGVhblxyXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1jYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2NvbW1vbi9lbWNhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIE5vZGVQcm9wZXJ0aWVzIHtcbiAgZXhwb3J0czogUGFydGlhbDxOb2RlRXhwb3J0cz5cbiAgaW5oZXJpdGFuY2U6IFBhcnRpYWw8Tm9kZUluaGVyaXRhbmNlPlxuICBuYW1lc3BhY2U6IGJvb2xlYW4sXG4gIG1vZHVsZTogYm9vbGVhblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vZGVFeHBvcnRzIHtcbiAgZXhwb3J0OiBib29sZWFuLFxuICBkZWZhdWx0OiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9kZUluaGVyaXRhbmNlIHtcbiAgZXh0ZW5kczogYm9vbGVhbixcbiAgaW1wbGVtZW50czogYm9vbGVhblxufSJdfQ== \ No newline at end of file diff --git a/build/src/lang/common/node.d.ts b/build/src/lang/common/node.d.ts new file mode 100644 index 0000000..82e071a --- /dev/null +++ b/build/src/lang/common/node.d.ts @@ -0,0 +1,15 @@ +import { ASTNode } from "./ast"; +import { SyntaxNode } from "tree-sitter"; +export interface TreeSitterNode { + visit(visitor: NodeVisitor): void; +} +export interface NodeVisitor { + getAST(): ASTNode[]; + visitNode(node: SyntaxNode, properties?: object): ASTNode; + visitChildren(nodes: SyntaxNode[], properties?: object): ASTNode[]; +} +export declare class Node implements TreeSitterNode { + syntaxNode: SyntaxNode; + constructor(syntaxNode: SyntaxNode); + visit: (visitor: NodeVisitor) => void; +} diff --git a/build/src/lang/common/node.js b/build/src/lang/common/node.js new file mode 100644 index 0000000..b90d3ee --- /dev/null +++ b/build/src/lang/common/node.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class Node { + constructor(syntaxNode) { + this.syntaxNode = syntaxNode; + this.visit = (visitor) => { + visitor.visitNode(this.syntaxNode); + }; + } +} +exports.Node = Node; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2NvbW1vbi9ub2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBYUEsTUFBYSxJQUFJO0lBQ2YsWUFBbUIsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN6QyxVQUFLLEdBQUcsQ0FBQyxPQUFvQixFQUFRLEVBQUU7WUFDckMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFBO0lBSDRDLENBQUM7Q0FJL0M7QUFMRCxvQkFLQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFTVE5vZGUgfSBmcm9tIFwiLi9hc3RcIjtcbmltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBUcmVlU2l0dGVyTm9kZSB7XG4gIHZpc2l0KHZpc2l0b3I6IE5vZGVWaXNpdG9yKTogdm9pZFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vZGVWaXNpdG9yIHtcbiAgZ2V0QVNUKCk6IEFTVE5vZGVbXVxuICB2aXNpdE5vZGUobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IG9iamVjdCk6IEFTVE5vZGVcbiAgdmlzaXRDaGlsZHJlbihub2RlczogU3ludGF4Tm9kZVtdLCBwcm9wZXJ0aWVzPzogb2JqZWN0KTogQVNUTm9kZVtdXG59XG5cbmV4cG9ydCBjbGFzcyBOb2RlIGltcGxlbWVudHMgVHJlZVNpdHRlck5vZGUge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgc3ludGF4Tm9kZTogU3ludGF4Tm9kZSkgeyB9XG4gIHZpc2l0ID0gKHZpc2l0b3I6IE5vZGVWaXNpdG9yKTogdm9pZCA9PiB7XG4gICAgdmlzaXRvci52aXNpdE5vZGUodGhpcy5zeW50YXhOb2RlKTtcbiAgfVxufSJdfQ== \ No newline at end of file diff --git a/build/src/lang/javascript/index.js b/build/src/lang/javascript/index.js index 00c241b..139e0c1 100644 --- a/build/src/lang/javascript/index.js +++ b/build/src/lang/javascript/index.js @@ -54,4 +54,4 @@ class JavaScriptParser { } } exports.default = JavaScriptParser; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy9qYXZhc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNDO0FBQ3RDLHFEQUFxRDtBQUdyRCxrREFBa0Q7QUFDbEQsb0RBQW9EO0FBRXBEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFxQixnQkFBZ0I7SUFJbkMsWUFBWSxJQUFZLEVBQUUsT0FBWTtRQU10QyxVQUFLLEdBQUcsR0FBRyxFQUFFO1lBQ1gsZ0RBQWdEO1lBQ2hELDJCQUEyQjtZQUMzQiw2Q0FBNkM7WUFDN0MsaURBQWlEO1lBQ2pELDhDQUE4QztZQUM5QyxnRUFBZ0U7WUFFaEUsNkNBQTZDO1lBQzdDLG9EQUFvRDtZQUNwRCwrQ0FBK0M7WUFDL0MsNkRBQTZEO1lBQzdELGdCQUFnQjtZQUNoQiw0Q0FBNEM7WUFDNUMsMkNBQTJDO1lBQzNDLDJDQUEyQztZQUMzQyw0Q0FBNEM7WUFDNUMsNkNBQTZDO1lBQzdDLDZDQUE2QztZQUM3QyxRQUFRO1lBQ1Isd0NBQXdDO1lBQ3hDLElBQUk7WUFDSixXQUFXO1lBQ1gscUJBQXFCO1lBQ3JCLGlFQUFpRTtZQUNqRSwrQkFBK0I7WUFDL0IsOEJBQThCO1lBQzlCLCtCQUErQjtZQUMvQixJQUFJO1lBQ0osT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDLENBQUE7UUFuQ0MsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Q0FrRkY7QUEzRkQsbUNBMkZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcclxuaW1wb3J0ICogYXMgSmF2YVNjcmlwdCBmcm9tICd0cmVlLXNpdHRlci1qYXZhc2NyaXB0JztcclxuaW1wb3J0IElQYXJzZXIgZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9JUGFyc2VyJztcclxuaW1wb3J0IFNvdXJjZSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZSc7XHJcbi8vIGltcG9ydCBJUmVzdWx0IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvSVJlc3VsdCc7XHJcbi8vIGltcG9ydCBJQ29tbWVudCBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lDb21tZW50JztcclxuXHJcbi8qKlxyXG4gKiBBIGNsYXNzIHRoYXQgcGFyc2VzIEphdmFTY3JpcHQgY29tbWVudHMuXHJcbiAqIFxyXG4gKiAjIEFQSVxyXG4gKiBcclxuICogYGBgXHJcbiAqIEBjbGFzcyBKYXZhU2NyaXB0UGFyc2VyXHJcbiAqIEBpbXBsZW1lbnRzIElQYXJzZXJcclxuICogQGV4cG9ydCBkZWZhdWx0XHJcbiAqIGBgYFxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSmF2YVNjcmlwdFBhcnNlciBpbXBsZW1lbnRzIElQYXJzZXIge1xyXG4gIHByaXZhdGUgZmlsZTogU291cmNlO1xyXG4gIHByaXZhdGUgb3B0aW9uczogYW55O1xyXG4gIHByaXZhdGUgcGFyc2VyOiBQYXJzZXI7XHJcbiAgY29uc3RydWN0b3IoZmlsZTogU291cmNlLCBvcHRpb25zOiBhbnkpIHtcclxuICAgIHRoaXMuZmlsZSA9IGZpbGU7XHJcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucyA9IHt9LCBvcHRpb25zIHx8IHt9KTtcclxuICAgIHRoaXMucGFyc2VyID0gbmV3IFBhcnNlcigpO1xyXG4gICAgdGhpcy5wYXJzZXIuc2V0TGFuZ3VhZ2UoSmF2YVNjcmlwdCk7XHJcbiAgfVxyXG4gIHBhcnNlID0gKCkgPT4ge1xyXG4gICAgLy8gbGV0IHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZSh0aGlzLmZpbGUudGV4dCk7XHJcbiAgICAvLyAvLyBHZXQgdGhlIGZpcnN0IGNvbW1lbnRcclxuICAgIC8vIGxldCBmaXJzdF9jb21tZW50ID0gdHJlZS5yb290Tm9kZS5jaGlsZHJlblxyXG4gICAgLy8gICAuZmlsdGVyKG5vZGUgPT4gbm9kZS50eXBlID09PSBcImNvbW1lbnRcIilbMF07XHJcbiAgICAvLyBjb25zdCBmaXJzdF9jb21tZW50X3N0cmluZyA9IHRoaXMuZmlsZS50ZXh0XHJcbiAgICAvLyAuc3Vic3RyaW5nKGZpcnN0X2NvbW1lbnQuc3RhcnRJbmRleCwgZmlyc3RfY29tbWVudC5lbmRJbmRleCk7XHJcbiAgICBcclxuICAgIC8vIC8vIFJlbW92ZSBhbnkgbGVnYWwgb3IgdW5uY2Vzc2FyeSBjb21tZW50c1xyXG4gICAgLy8gaWYgKGZpcnN0X2NvbW1lbnRfc3RyaW5nLmluY2x1ZGVzKFwiY29weXJpZ2h0XCIpIHx8XHJcbiAgICAvLyAgIGZpcnN0X2NvbW1lbnRfc3RyaW5nLmluY2x1ZGVzKFwiYXV0aG9yXCIpIHx8XHJcbiAgICAvLyAgIGZpcnN0X2NvbW1lbnRfc3RyaW5nLmluY2x1ZGVzKFwidGVybXMgYW5kIGNvbmRpdGlvbnNcIikpIHtcclxuICAgIC8vICAgdHJlZS5lZGl0KHtcclxuICAgIC8vICAgICBzdGFydEluZGV4OiBmaXJzdF9jb21tZW50LnN0YXJ0SW5kZXgsXHJcbiAgICAvLyAgICAgb2xkRW5kSW5kZXg6IGZpcnN0X2NvbW1lbnQuZW5kSW5kZXgsXHJcbiAgICAvLyAgICAgbmV3RW5kSW5kZXg6IGZpcnN0X2NvbW1lbnQuZW5kSW5kZXgsXHJcbiAgICAvLyAgICAgc3RhcnRQb3NpdGlvbjogeyByb3c6IDAsIGNvbHVtbjogMCB9LFxyXG4gICAgLy8gICAgIG9sZEVuZFBvc2l0aW9uOiB7IHJvdzogMCwgY29sdW1uOiAwIH0sXHJcbiAgICAvLyAgICAgbmV3RW5kUG9zaXRpb246IHsgcm93OiAwLCBjb2x1bW46IDAgfSxcclxuICAgIC8vICAgfSk7XHJcbiAgICAvLyAgIHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZSgnJywgdHJlZSk7XHJcbiAgICAvLyB9XHJcbiAgICAvLyByZXR1cm4ge1xyXG4gICAgLy8gICBmaWxlOiB0aGlzLmZpbGUsXHJcbiAgICAvLyAgIGNvbW1lbnRzOiBDb21tZW50UGFyc2VyLnBhcnNlKHRyZWUucm9vdE5vZGUsIHRoaXMuZmlsZS50ZXh0KVxyXG4gICAgLy8gICAgIC5maWx0ZXIodGhpcy5maWx0ZXJUeXBlKVxyXG4gICAgLy8gICAgIC8vIC5tYXAodGhpcy5jaGVja1R5cGUpXHJcbiAgICAvLyAgICAgLm1hcCh0aGlzLnBhcnNlQ2hpbGRyZW4pXHJcbiAgICAvLyB9XHJcbiAgICByZXR1cm4gW107XHJcbiAgfVxyXG5cclxuICAvLyBwcml2YXRlIGZpbHRlclR5cGUgPSAoY29tbWVudCk6IGJvb2xlYW4gPT4ge1xyXG4gIC8vICAgcmV0dXJuICh0aGlzLm9wdGlvbnMuZmlsdGVyIHx8XHJcbiAgLy8gICAgIFtcclxuICAvLyAgICAgICAnZnVuY3Rpb24nLFxyXG4gIC8vICAgICAgICdjbGFzcycsXHJcbiAgLy8gICAgICAgJ3ZhcmlhYmxlX2RlY2xhcmF0aW9uJ1xyXG4gIC8vICAgICBdKS5pbmNsdWRlcyhjb21tZW50LmNvbnRleHQudHlwZSlcclxuICAvLyB9XHJcblxyXG4gIC8vIHByaXZhdGUgY2hlY2tUeXBlID0gKGNvbW1lbnQpID0+IHtcclxuICAvLyAgIGNvbnN0IHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZShjb21tZW50LmNvbnRleHQudGV4dCk7XHJcbiAgLy8gICBzd2l0Y2ggKGNvbW1lbnQuY29udGV4dC50eXBlKSB7XHJcbiAgLy8gICAgIGNhc2UgJ3ZhcmlhYmxlX2RlY2xhcmF0aW9uJzpcclxuICAvLyAgICAgICAvLyBDaGVjayB3aGV0aGVyIHdlIGhhdmUgYW4gYW5vbnltb3VzIGNsYXNzXHJcbiAgLy8gICAgICAgaWYgKGNvbW1lbnQuY29udGV4dC50ZXh0LmluY2x1ZGVzKFwiY2xhc3NcIikpIHtcclxuICAvLyAgICAgICAgIC8vIERyaWxsIGRvd24gdW50aWwgd2UgZmluZCB0aGUgY2xhc3MgYm9keVxyXG4gIC8vICAgICAgICAgY29uc3QgdmFyaWFibGVfZGVjbGFyYXRvciA9IHRyZWUucm9vdE5vZGUuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMV07XHJcbiAgLy8gICAgICAgICBjb25zdCBhbm9ueW1vdXNfY2xhc3MgPSB2YXJpYWJsZV9kZWNsYXJhdG9yLmNoaWxkcmVuXHJcbiAgLy8gICAgICAgICAgIC5maWx0ZXIobm9kZSA9PiBub2RlLnR5cGUgPT09IFwiYW5vbnltb3VzX2NsYXNzXCIpWzBdXHJcbiAgLy8gICAgICAgICBjb25zdCBjbGFzc19ib2R5ID0gYW5vbnltb3VzX2NsYXNzLmNoaWxkcmVuWzFdO1xyXG4gIC8vICAgICAgICAgY29tbWVudC5jb250ZXh0LmNoaWxkcmVuID0gQ29tbWVudFBhcnNlci5wYXJzZShcclxuICAvLyAgICAgICAgICAgY2xhc3NfYm9keSxcclxuICAvLyAgICAgICAgICAgY29tbWVudC5jb250ZXh0LnRleHQsXHJcbiAgLy8gICAgICAgICAgIHsgbG9jYXRpb246IGNvbW1lbnQuY29udGV4dC5sb2NhdGlvbiwgcG9zaXRpb246IGNvbW1lbnQuY29udGV4dC5wb3NpdGlvbiB9XHJcbiAgLy8gICAgICAgICApO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgZGVmYXVsdDpcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgIH1cclxuICAvLyAgIHJldHVybiBjb21tZW50O1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gcHJpdmF0ZSBwYXJzZUNoaWxkcmVuID0gKGNvbW1lbnQpID0+IHtcclxuICAvLyAgIHN3aXRjaCAoY29tbWVudC5jb250ZXh0LnR5cGUpIHtcclxuICAvLyAgICAgY2FzZSAnY2xhc3MnOlxyXG4gIC8vICAgICAgIGNvbnN0IHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZShjb21tZW50LmNvbnRleHQudGV4dCk7XHJcbiAgLy8gICAgICAgY29tbWVudC5jb250ZXh0LmNoaWxkcmVuID0gQ29tbWVudFBhcnNlci5wYXJzZShcclxuICAvLyAgICAgICAgIHRyZWUucm9vdE5vZGUsXHJcbiAgLy8gICAgICAgICBjb21tZW50LmNvbnRleHQudGV4dCxcclxuICAvLyAgICAgICAgIHsgbG9jYXRpb246IGNvbW1lbnQuY29udGV4dC5sb2NhdGlvbiwgcG9zaXRpb246IGNvbW1lbnQuY29udGV4dC5wb3NpdGlvbiB9XHJcbiAgLy8gICAgICAgKS5maWx0ZXIoY2hpbGQgPT4gY2hpbGQuY29udGV4dC50eXBlID09PSAnbWV0aG9kX2RlZmluaXRpb24nKTtcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgZGVmYXVsdDpcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgIH1cclxuICAvLyAgIHJldHVybiBjb21tZW50O1xyXG4gIC8vIH1cclxuXHJcbn0iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy9qYXZhc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNDO0FBQ3RDLHFEQUFxRDtBQUdyRCxrREFBa0Q7QUFDbEQsb0RBQW9EO0FBRXBEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFxQixnQkFBZ0I7SUFJbkMsWUFBWSxJQUFZLEVBQUUsT0FBWTtRQU10QyxVQUFLLEdBQUcsR0FBRyxFQUFFO1lBQ1gsZ0RBQWdEO1lBQ2hELDJCQUEyQjtZQUMzQiw2Q0FBNkM7WUFDN0MsaURBQWlEO1lBQ2pELDhDQUE4QztZQUM5QyxnRUFBZ0U7WUFFaEUsNkNBQTZDO1lBQzdDLG9EQUFvRDtZQUNwRCwrQ0FBK0M7WUFDL0MsNkRBQTZEO1lBQzdELGdCQUFnQjtZQUNoQiw0Q0FBNEM7WUFDNUMsMkNBQTJDO1lBQzNDLDJDQUEyQztZQUMzQyw0Q0FBNEM7WUFDNUMsNkNBQTZDO1lBQzdDLDZDQUE2QztZQUM3QyxRQUFRO1lBQ1Isd0NBQXdDO1lBQ3hDLElBQUk7WUFDSixXQUFXO1lBQ1gscUJBQXFCO1lBQ3JCLGlFQUFpRTtZQUNqRSwrQkFBK0I7WUFDL0IsOEJBQThCO1lBQzlCLCtCQUErQjtZQUMvQixJQUFJO1lBQ0osT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDLENBQUE7UUFuQ0MsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Q0FrRkY7QUEzRkQsbUNBMkZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcbmltcG9ydCAqIGFzIEphdmFTY3JpcHQgZnJvbSAndHJlZS1zaXR0ZXItamF2YXNjcmlwdCc7XG5pbXBvcnQgSVBhcnNlciBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lQYXJzZXInO1xuaW1wb3J0IFNvdXJjZSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZSc7XG4vLyBpbXBvcnQgSVJlc3VsdCBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lSZXN1bHQnO1xuLy8gaW1wb3J0IElDb21tZW50IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvSUNvbW1lbnQnO1xuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCBwYXJzZXMgSmF2YVNjcmlwdCBjb21tZW50cy5cbiAqIFxuICogIyBBUElcbiAqIFxuICogYGBgXG4gKiBAY2xhc3MgSmF2YVNjcmlwdFBhcnNlclxuICogQGltcGxlbWVudHMgSVBhcnNlclxuICogQGV4cG9ydCBkZWZhdWx0XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSmF2YVNjcmlwdFBhcnNlciBpbXBsZW1lbnRzIElQYXJzZXIge1xuICBwcml2YXRlIGZpbGU6IFNvdXJjZTtcbiAgcHJpdmF0ZSBvcHRpb25zOiBhbnk7XG4gIHByaXZhdGUgcGFyc2VyOiBQYXJzZXI7XG4gIGNvbnN0cnVjdG9yKGZpbGU6IFNvdXJjZSwgb3B0aW9uczogYW55KSB7XG4gICAgdGhpcy5maWxlID0gZmlsZTtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucyA9IHt9LCBvcHRpb25zIHx8IHt9KTtcbiAgICB0aGlzLnBhcnNlciA9IG5ldyBQYXJzZXIoKTtcbiAgICB0aGlzLnBhcnNlci5zZXRMYW5ndWFnZShKYXZhU2NyaXB0KTtcbiAgfVxuICBwYXJzZSA9ICgpID0+IHtcbiAgICAvLyBsZXQgdHJlZSA9IHRoaXMucGFyc2VyLnBhcnNlKHRoaXMuZmlsZS50ZXh0KTtcbiAgICAvLyAvLyBHZXQgdGhlIGZpcnN0IGNvbW1lbnRcbiAgICAvLyBsZXQgZmlyc3RfY29tbWVudCA9IHRyZWUucm9vdE5vZGUuY2hpbGRyZW5cbiAgICAvLyAgIC5maWx0ZXIobm9kZSA9PiBub2RlLnR5cGUgPT09IFwiY29tbWVudFwiKVswXTtcbiAgICAvLyBjb25zdCBmaXJzdF9jb21tZW50X3N0cmluZyA9IHRoaXMuZmlsZS50ZXh0XG4gICAgLy8gLnN1YnN0cmluZyhmaXJzdF9jb21tZW50LnN0YXJ0SW5kZXgsIGZpcnN0X2NvbW1lbnQuZW5kSW5kZXgpO1xuICAgIFxuICAgIC8vIC8vIFJlbW92ZSBhbnkgbGVnYWwgb3IgdW5uY2Vzc2FyeSBjb21tZW50c1xuICAgIC8vIGlmIChmaXJzdF9jb21tZW50X3N0cmluZy5pbmNsdWRlcyhcImNvcHlyaWdodFwiKSB8fFxuICAgIC8vICAgZmlyc3RfY29tbWVudF9zdHJpbmcuaW5jbHVkZXMoXCJhdXRob3JcIikgfHxcbiAgICAvLyAgIGZpcnN0X2NvbW1lbnRfc3RyaW5nLmluY2x1ZGVzKFwidGVybXMgYW5kIGNvbmRpdGlvbnNcIikpIHtcbiAgICAvLyAgIHRyZWUuZWRpdCh7XG4gICAgLy8gICAgIHN0YXJ0SW5kZXg6IGZpcnN0X2NvbW1lbnQuc3RhcnRJbmRleCxcbiAgICAvLyAgICAgb2xkRW5kSW5kZXg6IGZpcnN0X2NvbW1lbnQuZW5kSW5kZXgsXG4gICAgLy8gICAgIG5ld0VuZEluZGV4OiBmaXJzdF9jb21tZW50LmVuZEluZGV4LFxuICAgIC8vICAgICBzdGFydFBvc2l0aW9uOiB7IHJvdzogMCwgY29sdW1uOiAwIH0sXG4gICAgLy8gICAgIG9sZEVuZFBvc2l0aW9uOiB7IHJvdzogMCwgY29sdW1uOiAwIH0sXG4gICAgLy8gICAgIG5ld0VuZFBvc2l0aW9uOiB7IHJvdzogMCwgY29sdW1uOiAwIH0sXG4gICAgLy8gICB9KTtcbiAgICAvLyAgIHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZSgnJywgdHJlZSk7XG4gICAgLy8gfVxuICAgIC8vIHJldHVybiB7XG4gICAgLy8gICBmaWxlOiB0aGlzLmZpbGUsXG4gICAgLy8gICBjb21tZW50czogQ29tbWVudFBhcnNlci5wYXJzZSh0cmVlLnJvb3ROb2RlLCB0aGlzLmZpbGUudGV4dClcbiAgICAvLyAgICAgLmZpbHRlcih0aGlzLmZpbHRlclR5cGUpXG4gICAgLy8gICAgIC8vIC5tYXAodGhpcy5jaGVja1R5cGUpXG4gICAgLy8gICAgIC5tYXAodGhpcy5wYXJzZUNoaWxkcmVuKVxuICAgIC8vIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvLyBwcml2YXRlIGZpbHRlclR5cGUgPSAoY29tbWVudCk6IGJvb2xlYW4gPT4ge1xuICAvLyAgIHJldHVybiAodGhpcy5vcHRpb25zLmZpbHRlciB8fFxuICAvLyAgICAgW1xuICAvLyAgICAgICAnZnVuY3Rpb24nLFxuICAvLyAgICAgICAnY2xhc3MnLFxuICAvLyAgICAgICAndmFyaWFibGVfZGVjbGFyYXRpb24nXG4gIC8vICAgICBdKS5pbmNsdWRlcyhjb21tZW50LmNvbnRleHQudHlwZSlcbiAgLy8gfVxuXG4gIC8vIHByaXZhdGUgY2hlY2tUeXBlID0gKGNvbW1lbnQpID0+IHtcbiAgLy8gICBjb25zdCB0cmVlID0gdGhpcy5wYXJzZXIucGFyc2UoY29tbWVudC5jb250ZXh0LnRleHQpO1xuICAvLyAgIHN3aXRjaCAoY29tbWVudC5jb250ZXh0LnR5cGUpIHtcbiAgLy8gICAgIGNhc2UgJ3ZhcmlhYmxlX2RlY2xhcmF0aW9uJzpcbiAgLy8gICAgICAgLy8gQ2hlY2sgd2hldGhlciB3ZSBoYXZlIGFuIGFub255bW91cyBjbGFzc1xuICAvLyAgICAgICBpZiAoY29tbWVudC5jb250ZXh0LnRleHQuaW5jbHVkZXMoXCJjbGFzc1wiKSkge1xuICAvLyAgICAgICAgIC8vIERyaWxsIGRvd24gdW50aWwgd2UgZmluZCB0aGUgY2xhc3MgYm9keVxuICAvLyAgICAgICAgIGNvbnN0IHZhcmlhYmxlX2RlY2xhcmF0b3IgPSB0cmVlLnJvb3ROb2RlLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzFdO1xuICAvLyAgICAgICAgIGNvbnN0IGFub255bW91c19jbGFzcyA9IHZhcmlhYmxlX2RlY2xhcmF0b3IuY2hpbGRyZW5cbiAgLy8gICAgICAgICAgIC5maWx0ZXIobm9kZSA9PiBub2RlLnR5cGUgPT09IFwiYW5vbnltb3VzX2NsYXNzXCIpWzBdXG4gIC8vICAgICAgICAgY29uc3QgY2xhc3NfYm9keSA9IGFub255bW91c19jbGFzcy5jaGlsZHJlblsxXTtcbiAgLy8gICAgICAgICBjb21tZW50LmNvbnRleHQuY2hpbGRyZW4gPSBDb21tZW50UGFyc2VyLnBhcnNlKFxuICAvLyAgICAgICAgICAgY2xhc3NfYm9keSxcbiAgLy8gICAgICAgICAgIGNvbW1lbnQuY29udGV4dC50ZXh0LFxuICAvLyAgICAgICAgICAgeyBsb2NhdGlvbjogY29tbWVudC5jb250ZXh0LmxvY2F0aW9uLCBwb3NpdGlvbjogY29tbWVudC5jb250ZXh0LnBvc2l0aW9uIH1cbiAgLy8gICAgICAgICApO1xuICAvLyAgICAgICB9XG4gIC8vICAgICAgIGJyZWFrO1xuICAvLyAgICAgZGVmYXVsdDpcbiAgLy8gICAgICAgYnJlYWs7XG4gIC8vICAgfVxuICAvLyAgIHJldHVybiBjb21tZW50O1xuICAvLyB9XG5cbiAgLy8gcHJpdmF0ZSBwYXJzZUNoaWxkcmVuID0gKGNvbW1lbnQpID0+IHtcbiAgLy8gICBzd2l0Y2ggKGNvbW1lbnQuY29udGV4dC50eXBlKSB7XG4gIC8vICAgICBjYXNlICdjbGFzcyc6XG4gIC8vICAgICAgIGNvbnN0IHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZShjb21tZW50LmNvbnRleHQudGV4dCk7XG4gIC8vICAgICAgIGNvbW1lbnQuY29udGV4dC5jaGlsZHJlbiA9IENvbW1lbnRQYXJzZXIucGFyc2UoXG4gIC8vICAgICAgICAgdHJlZS5yb290Tm9kZSxcbiAgLy8gICAgICAgICBjb21tZW50LmNvbnRleHQudGV4dCxcbiAgLy8gICAgICAgICB7IGxvY2F0aW9uOiBjb21tZW50LmNvbnRleHQubG9jYXRpb24sIHBvc2l0aW9uOiBjb21tZW50LmNvbnRleHQucG9zaXRpb24gfVxuICAvLyAgICAgICApLmZpbHRlcihjaGlsZCA9PiBjaGlsZC5jb250ZXh0LnR5cGUgPT09ICdtZXRob2RfZGVmaW5pdGlvbicpO1xuICAvLyAgICAgICBicmVhaztcbiAgLy8gICAgIGRlZmF1bHQ6XG4gIC8vICAgICAgIGJyZWFrO1xuICAvLyAgIH1cbiAgLy8gICByZXR1cm4gY29tbWVudDtcbiAgLy8gfVxuXG59Il19 \ No newline at end of file diff --git a/build/src/lang/typescript/index.js b/build/src/lang/typescript/index.js index 0069d66..55fae94 100644 --- a/build/src/lang/typescript/index.js +++ b/build/src/lang/typescript/index.js @@ -19,11 +19,12 @@ class TypeScriptParser { constructor(file, options) { this.parse = () => { const tree = this.parser.parse(this.source.text); - if (tree.rootNode.type === "program") { - const visitor = new visitor_1.TypeScriptVisitor(this.source); - walk_1.default(tree.rootNode).visit(visitor); - return visitor.getAST(); - } + const visitor = new visitor_1.TypeScriptVisitor(this.source); + const root = walk_1.default(tree.rootNode); + console.time('visit'); + root.visit(visitor); + console.timeEnd('visit'); + return visitor.getAST(); }; this.source = file; Object.assign(this.options = {}, options || {}); @@ -32,4 +33,4 @@ class TypeScriptParser { } } exports.default = TypeScriptParser; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy90eXBlc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNDO0FBQ3RDLHFEQUFxRDtBQUdyRCwyQ0FBb0M7QUFDcEMsdUNBQThDO0FBRzlDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFxQixnQkFBZ0I7SUFJbkMsWUFBWSxJQUFZLEVBQUUsT0FBWTtRQU10QyxVQUFLLEdBQUcsR0FBRyxFQUFFO1lBQ1gsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtnQkFDcEMsTUFBTSxPQUFPLEdBQUcsSUFBSSwyQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ25ELGNBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNuQyxPQUFPLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUN6QjtRQUNILENBQUMsQ0FBQTtRQVpDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN0QyxDQUFDO0NBU0Y7QUFsQkQsbUNBa0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcclxuaW1wb3J0ICogYXMgVHlwZVNjcmlwdCBmcm9tICd0cmVlLXNpdHRlci10eXBlc2NyaXB0JztcclxuaW1wb3J0IElQYXJzZXIgZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9JUGFyc2VyJztcclxuaW1wb3J0IFNvdXJjZSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZSc7XHJcbmltcG9ydCB3YWxrIGZyb20gJy4uLy4uL3V0aWxzL3dhbGsnO1xyXG5pbXBvcnQgeyBUeXBlU2NyaXB0VmlzaXRvciB9IGZyb20gJy4vdmlzaXRvcic7XHJcblxyXG5cclxuLyoqXHJcbiAqIEEgY2xhc3MgdGhhdCBwYXJzZXMgSmF2YVNjcmlwdCBjb21tZW50cy5cclxuICogXHJcbiAqICMgQVBJXHJcbiAqIFxyXG4gKiBgYGBcclxuICogQGNsYXNzIEphdmFTY3JpcHRQYXJzZXJcclxuICogQGltcGxlbWVudHMgSVBhcnNlclxyXG4gKiBAZXhwb3J0IGRlZmF1bHRcclxuICogYGBgXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUeXBlU2NyaXB0UGFyc2VyIGltcGxlbWVudHMgSVBhcnNlciB7XHJcbiAgcHJpdmF0ZSBzb3VyY2U6IFNvdXJjZTtcclxuICBwcml2YXRlIG9wdGlvbnM6IGFueTtcclxuICBwcml2YXRlIHBhcnNlcjogUGFyc2VyO1xyXG4gIGNvbnN0cnVjdG9yKGZpbGU6IFNvdXJjZSwgb3B0aW9uczogYW55KSB7XHJcbiAgICB0aGlzLnNvdXJjZSA9IGZpbGU7XHJcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucyA9IHt9LCBvcHRpb25zIHx8IHt9KTtcclxuICAgIHRoaXMucGFyc2VyID0gbmV3IFBhcnNlcigpO1xyXG4gICAgdGhpcy5wYXJzZXIuc2V0TGFuZ3VhZ2UoVHlwZVNjcmlwdCk7XHJcbiAgfVxyXG4gIHBhcnNlID0gKCkgPT4ge1xyXG4gICAgY29uc3QgdHJlZSA9IHRoaXMucGFyc2VyLnBhcnNlKHRoaXMuc291cmNlLnRleHQpO1xyXG4gICAgaWYgKHRyZWUucm9vdE5vZGUudHlwZSA9PT0gXCJwcm9ncmFtXCIpIHtcclxuICAgICAgY29uc3QgdmlzaXRvciA9IG5ldyBUeXBlU2NyaXB0VmlzaXRvcih0aGlzLnNvdXJjZSk7XHJcbiAgICAgIHdhbGsodHJlZS5yb290Tm9kZSkudmlzaXQodmlzaXRvcik7XHJcbiAgICAgIHJldHVybiB2aXNpdG9yLmdldEFTVCgpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy90eXBlc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNDO0FBQ3RDLHFEQUFxRDtBQUdyRCwyQ0FBb0M7QUFDcEMsdUNBQThDO0FBSTlDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFxQixnQkFBZ0I7SUFJbkMsWUFBWSxJQUFZLEVBQUUsT0FBWTtRQU10QyxVQUFLLEdBQUcsR0FBRyxFQUFFO1lBQ1gsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqRCxNQUFNLE9BQU8sR0FBRyxJQUFJLDJCQUFpQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuRCxNQUFNLElBQUksR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUNuQixPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBRXhCLE9BQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzFCLENBQUMsQ0FBQTtRQWRDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN0QyxDQUFDO0NBV0Y7QUFwQkQsbUNBb0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcbmltcG9ydCAqIGFzIFR5cGVTY3JpcHQgZnJvbSAndHJlZS1zaXR0ZXItdHlwZXNjcmlwdCc7XG5pbXBvcnQgSVBhcnNlciBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lQYXJzZXInO1xuaW1wb3J0IFNvdXJjZSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZSc7XG5pbXBvcnQgd2FsayBmcm9tICcuLi8uLi91dGlscy93YWxrJztcbmltcG9ydCB7IFR5cGVTY3JpcHRWaXNpdG9yIH0gZnJvbSAnLi92aXNpdG9yJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vLi4vdXRpbHMvbG9nJztcblxuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCBwYXJzZXMgSmF2YVNjcmlwdCBjb21tZW50cy5cbiAqIFxuICogIyBBUElcbiAqIFxuICogYGBgXG4gKiBAY2xhc3MgSmF2YVNjcmlwdFBhcnNlclxuICogQGltcGxlbWVudHMgSVBhcnNlclxuICogQGV4cG9ydCBkZWZhdWx0XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVHlwZVNjcmlwdFBhcnNlciBpbXBsZW1lbnRzIElQYXJzZXIge1xuICBwcml2YXRlIHNvdXJjZTogU291cmNlO1xuICBwcml2YXRlIG9wdGlvbnM6IGFueTtcbiAgcHJpdmF0ZSBwYXJzZXI6IFBhcnNlcjtcbiAgY29uc3RydWN0b3IoZmlsZTogU291cmNlLCBvcHRpb25zOiBhbnkpIHtcbiAgICB0aGlzLnNvdXJjZSA9IGZpbGU7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdGlvbnMgPSB7fSwgb3B0aW9ucyB8fCB7fSk7XG4gICAgdGhpcy5wYXJzZXIgPSBuZXcgUGFyc2VyKCk7XG4gICAgdGhpcy5wYXJzZXIuc2V0TGFuZ3VhZ2UoVHlwZVNjcmlwdCk7XG4gIH1cbiAgcGFyc2UgPSAoKSA9PiB7XG4gICAgY29uc3QgdHJlZSA9IHRoaXMucGFyc2VyLnBhcnNlKHRoaXMuc291cmNlLnRleHQpO1xuICAgIGNvbnN0IHZpc2l0b3IgPSBuZXcgVHlwZVNjcmlwdFZpc2l0b3IodGhpcy5zb3VyY2UpO1xuICAgIGNvbnN0IHJvb3QgPSB3YWxrKHRyZWUucm9vdE5vZGUpO1xuICAgIGNvbnNvbGUudGltZSgndmlzaXQnKVxuICAgIHJvb3QudmlzaXQodmlzaXRvcilcbiAgICBjb25zb2xlLnRpbWVFbmQoJ3Zpc2l0JylcblxuICAgIHJldHVybiB2aXNpdG9yLmdldEFTVCgpO1xuICB9XG59XG4iXX0= \ No newline at end of file diff --git a/build/src/lang/typescript/visitor.d.ts b/build/src/lang/typescript/visitor.d.ts index 91ef6a2..11f7488 100644 --- a/build/src/lang/typescript/visitor.d.ts +++ b/build/src/lang/typescript/visitor.d.ts @@ -1,23 +1,14 @@ +import { ASTNode } from "../common/ast"; +import { NodeProperties } from "../common/emca"; +import { NodeVisitor } from "../common/node"; import { SyntaxNode } from "tree-sitter"; import Source from "../../interfaces/Source"; -import { ASTNode } from "../common/ast"; -export interface TreeSitterNode { - visit(visitor: NodeVisitor): void; -} -export interface NodeVisitor { - getAST(): ASTNode[]; - visitNode(node: SyntaxNode): ASTNode; - visitChildren(nodes: SyntaxNode[]): ASTNode[]; -} -export declare class Node implements TreeSitterNode { - syntaxNode: SyntaxNode; - constructor(syntaxNode: SyntaxNode); - visit: (visitor: NodeVisitor) => void; -} +/** + * A class that visits ASTNodes from a TypeScript tree. + */ export declare class TypeScriptVisitor implements NodeVisitor { private ast; private source; - private parent; constructor(source: Source); /** * Determines whether a node has inheritance @@ -27,9 +18,16 @@ export declare class TypeScriptVisitor implements NodeVisitor { * Returns a node's inheritance type */ private getInheritanceType; - private filterComments; + /** + * Determines whether an export is default + */ + private hasDefaultExport; + /** + * Returns only the comments from a node's children. + */ + private filterType; getAST(): ASTNode[]; - visitNode: (node: SyntaxNode) => ASTNode; + visitNode: (node: SyntaxNode, properties?: Partial) => ASTNode; visitChildren: (nodes: SyntaxNode[]) => ASTNode[]; private visitProgram; private visitComment; @@ -41,13 +39,10 @@ export declare class TypeScriptVisitor implements NodeVisitor { * A node is considered contextual when a comment is visited and the node is its sibling. */ private visitContext; - private visitInterfaceDeclaration; - private visitInterface; - private visitSignature; - private visitTypeNode; - private visitConstraint; - private visitInheritanceClause; - private visitFormalParamters; - private visitRequiredParameter; + private visitExportStatement; + private visitExpressionStatement; + private visitInternalModule; + private visitClassOrInterface; + private visitNonTerminal; private visitTerminal; } diff --git a/build/src/lang/typescript/visitor.js b/build/src/lang/typescript/visitor.js index 26724d5..ef9835a 100644 --- a/build/src/lang/typescript/visitor.js +++ b/build/src/lang/typescript/visitor.js @@ -1,28 +1,23 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); +const ast_1 = require("../common/ast"); const comment_1 = require("../../utils/comment"); const sibling_1 = require("../../utils/sibling"); +const _ = require("lodash"); const log_1 = require("../../utils/log"); const match_1 = require("../../utils/match"); -const ast_1 = require("../common/ast"); -class Node { - constructor(syntaxNode) { - this.syntaxNode = syntaxNode; - this.visit = (visitor) => { - visitor.visitNode(this.syntaxNode); - }; - } -} -exports.Node = Node; +/** + * A class that visits ASTNodes from a TypeScript tree. + */ class TypeScriptVisitor { constructor(source) { this.ast = []; /* Visitors */ - this.visitNode = (node) => { + this.visitNode = (node, properties) => { switch (node.type) { case 'program': - this.parent = node; this.ast = this.visitProgram(node); + break; case 'comment': return this.visitComment(node); case 'MISSING': @@ -31,27 +26,13 @@ class TypeScriptVisitor { break; default: /* Match other non-terminals */ - if (match_1.default(node, 'constraint')) { - return this.visitConstraint(node); - } - if (match_1.default(node, 'formal_parameters')) { - return this.visitFormalParamters(node); - } - if (match_1.default(node, 'required_parameter')) { - return this.visitRequiredParameter(node); - } - if (match_1.default(node, 'type_identifier', 'type_parameters', 'type_parameter', 'type_annotation', 'object_type', 'predefined_type')) { - return this.visitTypeNode(node); - } - if (match_1.default(node, 'extends_clause')) { - return this.visitInheritanceClause(node); - } + if (match_1.default(node, 'constraint', 'formal_parameters', 'required_parameter', 'type_identifier', 'type_parameters', 'type_parameter', 'type_annotation', 'object_type', 'predefined_type', 'parenthesized_type', 'literal_type', 'intersection_type', 'union_type', 'class_body', 'extends_clause', 'unary_expression', 'binary_expression', 'statement_block', 'return_statement', 'export_statement', 'expression_statement', // A call_signature can also be a non-contextual node - if (match_1.default(node, 'call_signature')) { - return this.visitSignature(node); + 'call_signature', 'internal_module')) { + return this.visitNonTerminal(node, properties); } /* Match terminals */ - if (match_1.default(node, 'identifier', 'extends', 'property_identifier', 'string', 'void', 'boolean', 'null', 'undefined', 'number')) { + if (match_1.default(node, 'identifier', 'extends', 'property_identifier', 'accessibility_modifier', 'string', 'void', 'boolean', 'null', 'undefined', 'number', 'return', 'get', 'function', 'namespace')) { return this.visitTerminal(node); } log_1.default.report(this.source, node, log_1.ErrorType.NodeTypeNotYetSupported); @@ -59,12 +40,55 @@ class TypeScriptVisitor { } }; this.visitChildren = (nodes) => { - return nodes - .filter(child => !child.type.match(/[<>(){},:;\[\]]/)) - .map(this.visitNode.bind(this)).filter(child => !!child); + let children = []; + for (let i = 0; i < nodes.length; i++) { + const node = nodes[i]; + if (!node.type.match(/[<>(){},:;\[\]&|=\+\-\*\/]/)) { + const child = this.visitNode(node); + if (child) + children.push(child); + } + } + return children; }; this.visitProgram = (node) => { - return this.visitChildren(this.filterComments(node)); + let visited = {}, getStartLocation = (n) => `${n.location.row.start}:${n.location.column.start}`; + // A program can have modules, namespaces, comments as its children + // The first step is to parse all the comments in the root node + let comments = this.visitChildren(this.filterType(node, 'comment')); + // Parse the namespaces in expression_statement + let namespaces = this.visitChildren(this.filterType(node, 'expression_statement')); + // Parse the export statements in the root node + let exports = this.visitChildren(this.filterType(node, 'export_statement')); + // Get the visited context nodes + for (let i = 0; i < comments.length; i++) { + const comment = comments[i]; + const context = comment; + visited[getStartLocation(context)] = true; + } + // Remove the visited nodes from namespaces array + namespaces = _.remove(namespaces, x => !visited[getStartLocation(x)]); + // Exports are oddballs since some exports may reference + // a type/node that may have been commented. + // We'll first need to filter the ones we have visited + exports = _.remove(exports, x => !visited[getStartLocation(x)]); + // From the ones we have not visited, we'll need to modify + // the node properties of each context in a comment node that + // matches the ones we have not visited. + const matched = {}; + comments = _.remove(comments.map(comment => { + for (let i = 0; i < exports.length; i++) { + const export_ = exports[i]; + if (comment.context.type === export_.type) { + matched[getStartLocation(export_)] = true; + comment.context.properties = Object.assign(comment.context.properties || {}, export_.properties); + return comment; + } + } + }), (comment) => !comment); + // Removed the matched exports + exports = _.remove(exports, x => !matched[getStartLocation(x)]); + return [].concat(comments).concat(namespaces).concat(exports); }; this.visitComment = (node) => { if (comment_1.isJavaDocComment(this.source, node)) { @@ -83,24 +107,59 @@ class TypeScriptVisitor { */ this.visitContext = (node, properties) => { switch (node.type) { + case 'export_statement': + return this.visitExportStatement(node, properties); + case 'expression_statement': + return this.visitExpressionStatement(node, properties); + case 'class': case 'interface_declaration': - this.parent = node; - return this.visitInterfaceDeclaration(node, properties); + return this.visitClassOrInterface(node, properties); + case 'function': case 'call_signature': case 'method_signature': - return this.visitSignature(node, properties); + case 'property_signature': + case 'public_field_definition': + case 'method_definition': + return this.visitNonTerminal(node, properties); default: log_1.default.report(this.source, node, log_1.ErrorType.NodeTypeNotYetSupported); break; } }; - /* Declarations */ - this.visitInterfaceDeclaration = (node, properties) => { - // Shorten the node from 'interface_declaration' to 'interface' - return this.visitInterface(node, properties); + /* Statements */ + this.visitExportStatement = (node, properties) => { + let children = node.children, defaultExport = false; + // Remove 'export' since it's always first in the array + children.shift(); + if (this.hasDefaultExport(node)) { + defaultExport = true; + // Remove 'default' export + children.shift(); + } + const child = children.shift(); + return this.visitNode(child, { exports: { export: true, default: defaultExport } }); + }; + this.visitExpressionStatement = (node, properties) => { + let children = node.children; + const child = children.shift(); + if (match_1.default(child, 'internal_module')) { + return this.visitInternalModule(child, properties); + } + return this.visitNonTerminal(node); + }; + /* Modules */ + this.visitInternalModule = (node, properties) => { + let children = node.children.map(child => { + if (match_1.default(child, 'statement_block')) { + return ast_1.createASTNode(this.source, node, this.visitChildren(this.filterType(child, 'comment'))); + } + return this.visitNode(child); + }); + return ast_1.createASTNode(this.source, node, children, Object.assign(properties || {}, { namespace: true })); }; - this.visitInterface = (node, properties) => { - // Since 'interface' is element in the array + /* Declarations */ + this.visitClassOrInterface = (node, properties) => { + // Since 'interface' or 'class' is always first in the array // we'll need to remove it from the array. let children = node.children; const interface_ = children.shift(); @@ -116,42 +175,33 @@ class TypeScriptVisitor { extends: extends_ } })); + if (match_1.default(node, 'class')) { + return node_; + } // Overwrite the node type from 'interface_declaration' to 'interface' return Object.assign(node_, { type: interface_.type }); }; - /* Signatures */ - this.visitSignature = (node, properties) => { - return ast_1.createASTNode(this.source, node, this.visitChildren(node.children), properties); - }; - /* Types */ - this.visitTypeNode = (node) => { - switch (node.type) { - case 'type_identifier': - return this.visitTerminal(node); - case 'type_parameters': - case 'type_parameter': - case 'type_annotation': - case 'predefined_type': - return ast_1.createASTNode(this.source, node, this.visitChildren(node.children)); - case 'object_type': - return ast_1.createASTNode(this.source, node, this.visitChildren(this.filterComments(node))); - default: - log_1.default.report(this.source, node, log_1.ErrorType.NodeTypeNotYetSupported); - break; + /* Non-terminals */ + this.visitNonTerminal = (node, properties) => { + let children = node.children; + // Handle special cases where some non-terminals + // contain comments which is what we care about + if (match_1.default(node, 'class_body', 'object_type')) { + children = this.filterType(node, 'comment'); } - }; - /* Other non-terminals */ - this.visitConstraint = (node) => { - return ast_1.createASTNode(this.source, node, this.visitChildren(node.children)); - }; - this.visitInheritanceClause = (node) => { - return ast_1.createASTNode(this.source, node, this.visitChildren(node.children)); - }; - this.visitFormalParamters = (node) => { - return ast_1.createASTNode(this.source, node, this.visitChildren(node.children)); - }; - this.visitRequiredParameter = (node) => { - return ast_1.createASTNode(this.source, node, this.visitChildren(node.children)); + // Handle special cases where export statements have node properties + if (match_1.default(node, 'export_statement')) { + return this.visitExportStatement(node); + } + // Handle special cases where an internal module contains other nodes + if (match_1.default(node, 'internal_module')) { + return this.visitInternalModule(node, properties); + } + // Handle special cases where an intermal_module can exist in an expression_statement + if (match_1.default(node, 'expression_statement')) { + return this.visitExpressionStatement(node, properties); + } + return ast_1.createASTNode(this.source, node, this.visitChildren(children), properties); }; /* Terminals */ this.visitTerminal = (node) => { @@ -163,28 +213,59 @@ class TypeScriptVisitor { * Determines whether a node has inheritance */ hasInheritance(node) { - return node.children - .filter(node => { - return node.type.includes('extends') || node.type.includes('implements'); - }).length > 0; + let inherits = false; + for (let i = 0; i < node.children.length; i++) { + const child = node.children[i]; + if (match_1.default(child, 'extends', 'implements')) { + inherits = true; + } + } + return inherits; } /** * Returns a node's inheritance type */ getInheritanceType(node) { - if (node.children.filter(node => node.type.includes('extends'))) { - return 'extends'; + for (let i = 0; i < node.children.length; i++) { + const child = node.children[i]; + if (match_1.default(child, 'extends')) { + return 'extends'; + } + if (match_1.default(child, 'implements')) { + return 'implements'; + } } - if (node.children.filter(node => node.type.includes('implements'))) { - return 'implements'; + } + /** + * Determines whether an export is default + */ + hasDefaultExport(node) { + for (let i = 0; i < node.children.length; i++) { + const child = node.children[i]; + if (match_1.default(child, 'default')) { + return true; + } } + return false; } - filterComments(node) { - return node.children.filter(child => match_1.default(child, 'comment')); + /** + * Returns only the comments from a node's children. + */ + filterType(node, type) { + // console.time('filterType') + let children = []; + for (let i = 0; i < node.children.length; i++) { + const child = node.children[i]; + if (match_1.default(child, type)) { + children.push(child); + } + } + // console.timeEnd('filterType') + return children; } getAST() { return this.ast; } } exports.TypeScriptVisitor = TypeScriptVisitor; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLGlEQUF1RDtBQUN2RCxpREFBOEM7QUFHOUMseUNBQWlEO0FBQ2pELDZDQUFzQztBQUd0Qyx1Q0FBdUQ7QUFhdkQsTUFBYSxJQUFJO0lBQ2YsWUFBbUIsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN6QyxVQUFLLEdBQUcsQ0FBQyxPQUFvQixFQUFRLEVBQUU7WUFDckMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFBO0lBSDRDLENBQUM7Q0FJL0M7QUFMRCxvQkFLQztBQUVELE1BQWEsaUJBQWlCO0lBSTVCLFlBQVksTUFBYztRQUhsQixRQUFHLEdBQWMsRUFBRSxDQUFBO1FBcUMzQixlQUFlO1FBRWYsY0FBUyxHQUFHLENBQ1YsSUFBZ0IsRUFDaEIsRUFBRTtZQUNGLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDakIsS0FBSyxTQUFTO29CQUNaLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO29CQUNuQixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3JDLEtBQUssU0FBUztvQkFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pDLEtBQUssU0FBUyxDQUFDO2dCQUNmLEtBQUssT0FBTztvQkFDVixhQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO29CQUM5RCxNQUFNO2dCQUNSO29CQUVFLCtCQUErQjtvQkFFL0IsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxFQUFF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UUFDekMsQ0FBQyxDQUFBO1FBeE5DLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFDRDs7T0FFRztJQUNLLGNBQWMsQ0FBQyxJQUFnQjtRQUNyQyxPQUFPLElBQUksQ0FBQyxRQUFRO2FBQ2pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNiLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDM0UsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQTtJQUNqQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxrQkFBa0IsQ0FBQyxJQUFnQjtRQUN6QyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRTtZQUMvRCxPQUFPLFNBQVMsQ0FBQztTQUNsQjtRQUVELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFO1lBQ2xFLE9BQU8sWUFBWSxDQUFDO1NBQ3JCO0lBQ0gsQ0FBQztJQUVPLGNBQWMsQ0FBQyxJQUFnQjtRQUNyQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsZUFBSyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxNQUFNO1FBQ0osT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2xCLENBQUM7Q0EwTEY7QUE5TkQsOENBOE5DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTm9kZVByb3BlcnRpZXMsIE5vZGVJbmhlcml0YW5jZSB9IGZyb20gXCIuLi9jb21tb24vZW1jYVwiO1xyXG5pbXBvcnQgeyBpc0phdmFEb2NDb21tZW50IH0gZnJvbSBcIi4uLy4uL3V0aWxzL2NvbW1lbnRcIjtcclxuaW1wb3J0IHsgc2libGluZyB9IGZyb20gXCIuLi8uLi91dGlscy9zaWJsaW5nXCI7XHJcbmltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcclxuaW1wb3J0IHsgdGV4dCB9IGZyb20gXCIuLi8uLi91dGlscy90ZXh0XCI7XHJcbmltcG9ydCBsb2csIHsgRXJyb3JUeXBlIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2xvZ1wiO1xyXG5pbXBvcnQgbWF0Y2ggZnJvbSBcIi4uLy4uL3V0aWxzL21hdGNoXCI7XHJcbmltcG9ydCBTb3VyY2UgZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvU291cmNlXCI7XHJcbmltcG9ydCB4ZG9jIGZyb20gXCJ4ZG9jLXBhcnNlclwiO1xyXG5pbXBvcnQgeyBjcmVhdGVBU1ROb2RlLCBBU1ROb2RlIH0gZnJvbSBcIi4uL2NvbW1vbi9hc3RcIjtcclxuXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRyZWVTaXR0ZXJOb2RlIHtcclxuICB2aXNpdCh2aXNpdG9yOiBOb2RlVmlzaXRvcik6IHZvaWRcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBOb2RlVmlzaXRvciB7XHJcbiAgZ2V0QVNUKCk6IEFTVE5vZGVbXVxyXG4gIHZpc2l0Tm9kZShub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZVxyXG4gIHZpc2l0Q2hpbGRyZW4obm9kZXM6IFN5bnRheE5vZGVbXSk6IEFTVE5vZGVbXVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTm9kZSBpbXBsZW1lbnRzIFRyZWVTaXR0ZXJOb2RlIHtcclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgc3ludGF4Tm9kZTogU3ludGF4Tm9kZSkgeyB9XHJcbiAgdmlzaXQgPSAodmlzaXRvcjogTm9kZVZpc2l0b3IpOiB2b2lkID0+IHtcclxuICAgIHZpc2l0b3IudmlzaXROb2RlKHRoaXMuc3ludGF4Tm9kZSk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgVHlwZVNjcmlwdFZpc2l0b3IgaW1wbGVtZW50cyBOb2RlVmlzaXRvciB7XHJcbiAgcHJpdmF0ZSBhc3Q6IEFTVE5vZGVbXSA9IFtdXHJcbiAgcHJpdmF0ZSBzb3VyY2U6IFNvdXJjZVxyXG4gIHByaXZhdGUgcGFyZW50OiBTeW50YXhOb2RlXHJcbiAgY29uc3RydWN0b3Ioc291cmNlOiBTb3VyY2UpIHtcclxuICAgIHRoaXMuc291cmNlID0gc291cmNlO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBub2RlIGhhcyBpbmhlcml0YW5jZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgaGFzSW5oZXJpdGFuY2Uobm9kZTogU3ludGF4Tm9kZSkge1xyXG4gICAgcmV0dXJuIG5vZGUuY2hpbGRyZW5cclxuICAgICAgLmZpbHRlcihub2RlID0+IHtcclxuICAgICAgICByZXR1cm4gbm9kZS50eXBlLmluY2x1ZGVzKCdleHRlbmRzJykgfHwgbm9kZS50eXBlLmluY2x1ZGVzKCdpbXBsZW1lbnRzJyk7XHJcbiAgICAgIH0pLmxlbmd0aCA+IDBcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBub2RlJ3MgaW5oZXJpdGFuY2UgdHlwZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0SW5oZXJpdGFuY2VUeXBlKG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICAgIGlmIChub2RlLmNoaWxkcmVuLmZpbHRlcihub2RlID0+IG5vZGUudHlwZS5pbmNsdWRlcygnZXh0ZW5kcycpKSkge1xyXG4gICAgICByZXR1cm4gJ2V4dGVuZHMnO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChub2RlLmNoaWxkcmVuLmZpbHRlcihub2RlID0+IG5vZGUudHlwZS5pbmNsdWRlcygnaW1wbGVtZW50cycpKSkge1xyXG4gICAgICByZXR1cm4gJ2ltcGxlbWVudHMnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaWx0ZXJDb21tZW50cyhub2RlOiBTeW50YXhOb2RlKSB7XHJcbiAgICByZXR1cm4gbm9kZS5jaGlsZHJlbi5maWx0ZXIoY2hpbGQgPT4gbWF0Y2goY2hpbGQsICdjb21tZW50JykpO1xyXG4gIH1cclxuXHJcbiAgZ2V0QVNUKCk6IEFTVE5vZGVbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5hc3Q7XHJcbiAgfVxyXG5cclxuICAvKiBWaXNpdG9ycyAgKi9cclxuXHJcbiAgdmlzaXROb2RlID0gKFxyXG4gICAgbm9kZTogU3ludGF4Tm9kZVxyXG4gICkgPT4ge1xyXG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcclxuICAgICAgY2FzZSAncHJvZ3JhbSc6XHJcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBub2RlO1xyXG4gICAgICAgIHRoaXMuYXN0ID0gdGhpcy52aXNpdFByb2dyYW0obm9kZSk7XHJcbiAgICAgIGNhc2UgJ2NvbW1lbnQnOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0Q29tbWVudChub2RlKTtcclxuICAgICAgY2FzZSAnTUlTU0lORyc6XHJcbiAgICAgIGNhc2UgJ0VSUk9SJzpcclxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuVHJlZVNpdHRlclBhcnNlRXJyb3IpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG5cclxuICAgICAgICAvKiBNYXRjaCBvdGhlciBub24tdGVybWluYWxzICovXHJcblxyXG4gICAgICAgIGlmIChtYXRjaChub2RlLCAnY29uc3RyYWludCcpKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdENvbnN0cmFpbnQobm9kZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChtYXRjaChub2RlLCAnZm9ybWFsX3BhcmFtZXRlcnMnKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRGb3JtYWxQYXJhbXRlcnMobm9kZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobWF0Y2gobm9kZSwgJ3JlcXVpcmVkX3BhcmFtZXRlcicpKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdFJlcXVpcmVkUGFyYW1ldGVyKG5vZGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG1hdGNoKG5vZGUsXHJcbiAgICAgICAgICAndHlwZV9pZGVudGlmaWVyJywgJ3R5cGVfcGFyYW1ldGVycycsICd0eXBlX3BhcmFtZXRlcicsICd0eXBlX2Fubm90YXRpb24nLFxyXG4gICAgICAgICAgJ29iamVjdF90eXBlJywgJ3ByZWRlZmluZWRfdHlwZSdcclxuICAgICAgICApKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdFR5cGVOb2RlKG5vZGUpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobWF0Y2gobm9kZSwgJ2V4dGVuZHNfY2xhdXNlJykpIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLnZpc2l0SW5oZXJpdGFuY2VDbGF1c2Uobm9kZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBBIGNhbGxfc2lnbmF0dXJlIGNhbiBhbHNvIGJlIGEgbm9uLWNvbnRleHR1YWwgbm9kZVxyXG4gICAgICAgIGlmIChtYXRjaChub2RlLCAnY2FsbF9zaWduYXR1cmUnKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRTaWduYXR1cmUobm9kZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIE1hdGNoIHRlcm1pbmFscyAqL1xyXG4gICAgICAgIGlmIChtYXRjaChub2RlLCBcclxuICAgICAgICAgICdpZGVudGlmaWVyJywgJ2V4dGVuZHMnLCAncHJvcGVydHlfaWRlbnRpZmllcicsXHJcbiAgICAgICAgICAnc3RyaW5nJywgJ3ZvaWQnLCAnYm9vbGVhbicsICdudWxsJywgJ3VuZGVmaW5lZCcsICdudW1iZXInXHJcbiAgICAgICAgKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRUZXJtaW5hbChub2RlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxvZy5yZXBvcnQodGhpcy5zb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFlldFN1cHBvcnRlZCk7XHJcblxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdmlzaXRDaGlsZHJlbiA9IChub2RlczogU3ludGF4Tm9kZVtdKTogQVNUTm9kZVtdID0+IHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIG5vZGVzXHJcbiAgICAgICAgLmZpbHRlcihjaGlsZCA9PiAhY2hpbGQudHlwZS5tYXRjaCgvWzw+KCl7fSw6O1xcW1xcXV0vKSlcclxuICAgICAgICAubWFwKHRoaXMudmlzaXROb2RlLmJpbmQodGhpcykpIGFzIEFTVE5vZGVbXVxyXG4gICAgKS5maWx0ZXIoY2hpbGQgPT4gISFjaGlsZCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHZpc2l0UHJvZ3JhbSA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZVtdID0+IHtcclxuICAgIHJldHVybiB0aGlzLnZpc2l0Q2hpbGRyZW4odGhpcy5maWx0ZXJDb21tZW50cyhub2RlKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHZpc2l0Q29tbWVudCA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZSA9PiB7XHJcbiAgICBpZiAoaXNKYXZhRG9jQ29tbWVudCh0aGlzLnNvdXJjZSwgbm9kZSkpIHtcclxuICAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSBzaWJsaW5nKG5vZGUpO1xyXG4gICAgICBpZiAobmV4dFNpYmxpbmcpIHtcclxuICAgICAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENvbnRleHQobmV4dFNpYmxpbmcsIHt9KSwgdHJ1ZSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmlzaXQgdGhlIGNvbnRleHR1YWwgbm9kZVxyXG4gICAqIFxyXG4gICAqICMgUmVtYXJrXHJcbiAgICogXHJcbiAgICogQSBub2RlIGlzIGNvbnNpZGVyZWQgY29udGV4dHVhbCB3aGVuIGEgY29tbWVudCBpcyB2aXNpdGVkIGFuZCB0aGUgbm9kZSBpcyBpdHMgc2libGluZy5cclxuICAgKi9cclxuICBwcml2YXRlIHZpc2l0Q29udGV4dCA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcclxuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XHJcbiAgICAgIGNhc2UgJ2ludGVyZmFjZV9kZWNsYXJhdGlvbic6XHJcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBub2RlO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0SW50ZXJmYWNlRGVjbGFyYXRpb24obm9kZSwgcHJvcGVydGllcylcclxuICAgICAgY2FzZSAnY2FsbF9zaWduYXR1cmUnOlxyXG4gICAgICBjYXNlICdtZXRob2Rfc2lnbmF0dXJlJzpcclxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdFNpZ25hdHVyZShub2RlLCBwcm9wZXJ0aWVzKTtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyogRGVjbGFyYXRpb25zICovXHJcblxyXG4gIHByaXZhdGUgdmlzaXRJbnRlcmZhY2VEZWNsYXJhdGlvbiA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcclxuICAgIC8vIFNob3J0ZW4gdGhlIG5vZGUgZnJvbSAnaW50ZXJmYWNlX2RlY2xhcmF0aW9uJyB0byAnaW50ZXJmYWNlJ1xyXG4gICAgcmV0dXJuIHRoaXMudmlzaXRJbnRlcmZhY2Uobm9kZSwgcHJvcGVydGllcylcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdmlzaXRJbnRlcmZhY2UgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XHJcbiAgICAvLyBTaW5jZSAnaW50ZXJmYWNlJyBpcyBlbGVtZW50IGluIHRoZSBhcnJheVxyXG4gICAgLy8gd2UnbGwgbmVlZCB0byByZW1vdmUgaXQgZnJvbSB0aGUgYXJyYXkuXHJcbiAgICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xyXG4gICAgY29uc3QgaW50ZXJmYWNlXyA9IGNoaWxkcmVuLnNoaWZ0KCk7XHJcblxyXG4gICAgbGV0IGV4dGVuZHNfID0gZmFsc2UsIGltcGxlbWVudHNfID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5oYXNJbmhlcml0YW5jZShub2RlKSkge1xyXG4gICAgICBjb25zdCBpbmhlcml0YW5jZSA9IHRoaXMuZ2V0SW5oZXJpdGFuY2VUeXBlKG5vZGUpXHJcbiAgICAgIGV4dGVuZHNfID0gaW5oZXJpdGFuY2UgPT09ICdleHRlbmRzJztcclxuICAgICAgaW1wbGVtZW50c18gPSBpbmhlcml0YW5jZSA9PT0gJ2ltcGxlbWVudHMnO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG5vZGVfID0gY3JlYXRlQVNUTm9kZShcclxuICAgICAgdGhpcy5zb3VyY2UsIFxyXG4gICAgICBub2RlLCBcclxuICAgICAgdGhpcy52aXNpdENoaWxkcmVuKGNoaWxkcmVuKSwgXHJcbiAgICAgIE9iamVjdC5hc3NpZ24ocHJvcGVydGllcyB8fCB7fSwge1xyXG4gICAgICBpbmhlcml0YW5jZToge1xyXG4gICAgICAgIGltcGxlbWVudHM6IGltcGxlbWVudHNfLFxyXG4gICAgICAgIGV4dGVuZHM6IGV4dGVuZHNfXHJcbiAgICAgIH0gYXMgTm9kZUluaGVyaXRhbmNlXHJcbiAgICB9KSk7XHJcbiAgICAvLyBPdmVyd3JpdGUgdGhlIG5vZGUgdHlwZSBmcm9tICdpbnRlcmZhY2VfZGVjbGFyYXRpb24nIHRvICdpbnRlcmZhY2UnXHJcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihub2RlXywgeyB0eXBlOiBpbnRlcmZhY2VfLnR5cGUgfSlcclxuICB9XHJcblxyXG4gIC8qIFNpZ25hdHVyZXMgKi9cclxuICBwcml2YXRlIHZpc2l0U2lnbmF0dXJlID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xyXG4gICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIHRoaXMudmlzaXRDaGlsZHJlbihub2RlLmNoaWxkcmVuKSwgcHJvcGVydGllcylcclxuICB9XHJcblxyXG4gIC8qIFR5cGVzICovXHJcblxyXG4gIHByaXZhdGUgdmlzaXRUeXBlTm9kZSA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZSA9PiB7XHJcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xyXG4gICAgICBjYXNlICd0eXBlX2lkZW50aWZpZXInOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0VGVybWluYWwobm9kZSlcclxuICAgICAgY2FzZSAndHlwZV9wYXJhbWV0ZXJzJzpcclxuICAgICAgY2FzZSAndHlwZV9wYXJhbWV0ZXInOlxyXG4gICAgICBjYXNlICd0eXBlX2Fubm90YXRpb24nOlxyXG4gICAgICBjYXNlICdwcmVkZWZpbmVkX3R5cGUnOlxyXG4gICAgICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q2hpbGRyZW4obm9kZS5jaGlsZHJlbikpXHJcbiAgICAgIGNhc2UgJ29iamVjdF90eXBlJzpcclxuICAgICAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyQ29tbWVudHMobm9kZSkpKVxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGxvZy5yZXBvcnQodGhpcy5zb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFlldFN1cHBvcnRlZCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyogT3RoZXIgbm9uLXRlcm1pbmFscyAqL1xyXG5cclxuICBwcml2YXRlIHZpc2l0Q29uc3RyYWludCA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZSA9PiB7XHJcbiAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENoaWxkcmVuKG5vZGUuY2hpbGRyZW4pKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB2aXNpdEluaGVyaXRhbmNlQ2xhdXNlID0gKG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlID0+IHtcclxuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q2hpbGRyZW4obm9kZS5jaGlsZHJlbikpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHZpc2l0Rm9ybWFsUGFyYW10ZXJzID0gKG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlID0+IHtcclxuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q2hpbGRyZW4obm9kZS5jaGlsZHJlbikpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB2aXNpdFJlcXVpcmVkUGFyYW1ldGVyID0gKG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlID0+IHtcclxuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q2hpbGRyZW4obm9kZS5jaGlsZHJlbikpO1xyXG4gIH1cclxuICAvKiBUZXJtaW5hbHMgKi9cclxuXHJcbiAgcHJpdmF0ZSB2aXNpdFRlcm1pbmFsID0gKG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlID0+IHtcclxuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlKVxyXG4gIH1cclxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHVDQUF1RDtBQUN2RCxpREFBdUQ7QUFHdkQsaURBQThDO0FBRTlDLDRCQUE0QjtBQUM1Qix5Q0FBaUQ7QUFDakQsNkNBQXNDO0FBR3RDOztHQUVHO0FBQ0gsTUFBYSxpQkFBaUI7SUFHNUIsWUFBWSxNQUFjO1FBRmxCLFFBQUcsR0FBYyxFQUFFLENBQUE7UUFxRTNCLGVBQWU7UUFFZixjQUFTLEdBQUcsQ0FDVixJQUFnQixFQUNoQixVQUFvQyxFQUNwQyxFQUFFO1lBQ0YsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNqQixLQUFLLFNBQVM7b0JBQ1osSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNuQyxNQUFNO2dCQUNSLEtBQUssU0FBUztvQkFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pDLEtBQUssU0FBUyxDQUFDO2dCQUNmLEtBQUssT0FBTztvQkFDVixhQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO29CQUM5RCxNQUFNO2dCQUNSO29CQUVFLCtCQUErQjtvQkFFL0IsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUNaLFlBQVksRUFDWixtQkFBbUIsRUFBRSxvQkFBb0IsRUFDekMsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQ3pFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQ3RFLG1CQUFtQixFQUFFLFlBQVksRUFDakMsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixrQkFBa0IsRUFBRSxtQkFBbUIs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RSxJQUFJLENBQUMsRUFBRTtnQkFDdEIsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN0QjtTQUNGO1FBQ0QsZ0NBQWdDO1FBQ2hDLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxNQUFNO1FBQ0osT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2xCLENBQUM7Q0ErUEY7QUFuVUQsOENBbVVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlQVNUTm9kZSwgQVNUTm9kZSB9IGZyb20gXCIuLi9jb21tb24vYXN0XCI7XG5pbXBvcnQgeyBpc0phdmFEb2NDb21tZW50IH0gZnJvbSBcIi4uLy4uL3V0aWxzL2NvbW1lbnRcIjtcbmltcG9ydCB7IE5vZGVQcm9wZXJ0aWVzLCBOb2RlSW5oZXJpdGFuY2UgfSBmcm9tIFwiLi4vY29tbW9uL2VtY2FcIjtcbmltcG9ydCB7IE5vZGVWaXNpdG9yIH0gZnJvbSBcIi4uL2NvbW1vbi9ub2RlXCI7XG5pbXBvcnQgeyBzaWJsaW5nIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3NpYmxpbmdcIjtcbmltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBsb2csIHsgRXJyb3JUeXBlIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2xvZ1wiO1xuaW1wb3J0IG1hdGNoIGZyb20gXCIuLi8uLi91dGlscy9tYXRjaFwiO1xuaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2VcIjtcblxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgdmlzaXRzIEFTVE5vZGVzIGZyb20gYSBUeXBlU2NyaXB0IHRyZWUuXG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlU2NyaXB0VmlzaXRvciBpbXBsZW1lbnRzIE5vZGVWaXNpdG9yIHtcbiAgcHJpdmF0ZSBhc3Q6IEFTVE5vZGVbXSA9IFtdXG4gIHByaXZhdGUgc291cmNlOiBTb3VyY2VcbiAgY29uc3RydWN0b3Ioc291cmNlOiBTb3VyY2UpIHtcbiAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBub2RlIGhhcyBpbmhlcml0YW5jZVxuICAgKi9cbiAgcHJpdmF0ZSBoYXNJbmhlcml0YW5jZShub2RlOiBTeW50YXhOb2RlKSB7XG4gICAgbGV0IGluaGVyaXRzID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdleHRlbmRzJywgJ2ltcGxlbWVudHMnKSkge1xuICAgICAgICBpbmhlcml0cyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbmhlcml0c1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBub2RlJ3MgaW5oZXJpdGFuY2UgdHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRJbmhlcml0YW5jZVR5cGUobm9kZTogU3ludGF4Tm9kZSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgaWYgKG1hdGNoKGNoaWxkLCAnZXh0ZW5kcycpKSB7XG4gICAgICAgIHJldHVybiAnZXh0ZW5kcyc7XG4gICAgICB9XG5cbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ2ltcGxlbWVudHMnKSkge1xuICAgICAgICByZXR1cm4gJ2ltcGxlbWVudHMnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gZXhwb3J0IGlzIGRlZmF1bHRcbiAgICovXG4gIHByaXZhdGUgaGFzRGVmYXVsdEV4cG9ydChub2RlOiBTeW50YXhOb2RlKTogYm9vbGVhbiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdkZWZhdWx0JykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG9ubHkgdGhlIGNvbW1lbnRzIGZyb20gYSBub2RlJ3MgY2hpbGRyZW4uXG4gICAqL1xuICBwcml2YXRlIGZpbHRlclR5cGUobm9kZTogU3ludGF4Tm9kZSwgdHlwZTogc3RyaW5nKTogU3ludGF4Tm9kZVtdIHtcbiAgICAvLyBjb25zb2xlLnRpbWUoJ2ZpbHRlclR5cGUnKVxuICAgIGxldCBjaGlsZHJlbjogU3ludGF4Tm9kZVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XG4gICAgICBpZiAobWF0Y2goY2hpbGQsIHR5cGUpKSB7XG4gICAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBjb25zb2xlLnRpbWVFbmQoJ2ZpbHRlclR5cGUnKVxuICAgIHJldHVybiBjaGlsZHJlbjtcbiAgfVxuXG4gIGdldEFTVCgpOiBBU1ROb2RlW10ge1xuICAgIHJldHVybiB0aGlzLmFzdDtcbiAgfVxuXG4gIC8qIFZpc2l0b3JzICAqL1xuXG4gIHZpc2l0Tm9kZSA9IChcbiAgICBub2RlOiBTeW50YXhOb2RlLFxuICAgIHByb3BlcnRpZXM/OiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPlxuICApID0+IHtcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSAncHJvZ3JhbSc6XG4gICAgICAgIHRoaXMuYXN0ID0gdGhpcy52aXNpdFByb2dyYW0obm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY29tbWVudCc6XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0Q29tbWVudChub2RlKTtcbiAgICAgIGNhc2UgJ01JU1NJTkcnOlxuICAgICAgY2FzZSAnRVJST1InOlxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuVHJlZVNpdHRlclBhcnNlRXJyb3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG5cbiAgICAgICAgLyogTWF0Y2ggb3RoZXIgbm9uLXRlcm1pbmFscyAqL1xuXG4gICAgICAgIGlmIChtYXRjaChub2RlLFxuICAgICAgICAgICdjb25zdHJhaW50JyxcbiAgICAgICAgICAnZm9ybWFsX3BhcmFtZXRlcnMnLCAncmVxdWlyZWRfcGFyYW1ldGVyJyxcbiAgICAgICAgICAndHlwZV9pZGVudGlmaWVyJywgJ3R5cGVfcGFyYW1ldGVycycsICd0eXBlX3BhcmFtZXRlcicsICd0eXBlX2Fubm90YXRpb24nLFxuICAgICAgICAgICdvYmplY3RfdHlwZScsICdwcmVkZWZpbmVkX3R5cGUnLCAncGFyZW50aGVzaXplZF90eXBlJywgJ2xpdGVyYWxfdHlwZScsXG4gICAgICAgICAgJ2ludGVyc2VjdGlvbl90eXBlJywgJ3VuaW9uX3R5cGUnLFxuICAgICAgICAgICdjbGFzc19ib2R5JyxcbiAgICAgICAgICAnZXh0ZW5kc19jbGF1c2UnLFxuICAgICAgICAgICd1bmFyeV9leHByZXNzaW9uJywgJ2JpbmFyeV9leHByZXNzaW9uJyxcbiAgICAgICAgICAnc3RhdGVtZW50X2Jsb2NrJywgJ3JldHVybl9zdGF0ZW1lbnQnLCAnZXhwb3J0X3N0YXRlbWVudCcsICdleHByZXNzaW9uX3N0YXRlbWVudCcsXG4gICAgICAgICAgLy8gQSBjYWxsX3NpZ25hdHVyZSBjYW4gYWxzbyBiZSBhIG5vbi1jb250ZXh0dWFsIG5vZGVcbiAgICAgICAgICAnY2FsbF9zaWduYXR1cmUnLFxuICAgICAgICAgICdpbnRlcm5hbF9tb2R1bGUnXG4gICAgICAgICkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdE5vblRlcm1pbmFsKG5vZGUsIHByb3BlcnRpZXMpXG4gICAgICAgIH1cblxuICAgICAgICAvKiBNYXRjaCB0ZXJtaW5hbHMgKi9cbiAgICAgICAgaWYgKG1hdGNoKG5vZGUsXG4gICAgICAgICAgJ2lkZW50aWZpZXInLCAnZXh0ZW5kcycsICdwcm9wZXJ0eV9pZGVudGlmaWVyJywgJ2FjY2Vzc2liaWxpdHlfbW9kaWZpZXInLFxuICAgICAgICAgICdzdHJpbmcnLCAndm9pZCcsICdib29sZWFuJywgJ251bGwnLCAndW5kZWZpbmVkJywgJ251bWJlcicsICdyZXR1cm4nLFxuICAgICAgICAgICdnZXQnLCAnZnVuY3Rpb24nLCAnbmFtZXNwYWNlJ1xuICAgICAgICApKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRUZXJtaW5hbChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2aXNpdENoaWxkcmVuID0gKG5vZGVzOiBTeW50YXhOb2RlW10pOiBBU1ROb2RlW10gPT4ge1xuICAgIGxldCBjaGlsZHJlbjogQVNUTm9kZVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgaWYgKCFub2RlLnR5cGUubWF0Y2goL1s8Pigpe30sOjtcXFtcXF0mfD1cXCtcXC1cXCpcXC9dLykpIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSB0aGlzLnZpc2l0Tm9kZShub2RlKTtcbiAgICAgICAgaWYgKGNoaWxkKSBjaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG5cbiAgcHJpdmF0ZSB2aXNpdFByb2dyYW0gPSAobm9kZTogU3ludGF4Tm9kZSk6IEFTVE5vZGVbXSA9PiB7XG4gICAgbGV0IHZpc2l0ZWQgPSB7fSxcbiAgICAgIGdldFN0YXJ0TG9jYXRpb24gPSAobjogQVNUTm9kZSkgPT4gYCR7bi5sb2NhdGlvbi5yb3cuc3RhcnR9OiR7bi5sb2NhdGlvbi5jb2x1bW4uc3RhcnR9YDtcbiAgICAvLyBBIHByb2dyYW0gY2FuIGhhdmUgbW9kdWxlcywgbmFtZXNwYWNlcywgY29tbWVudHMgYXMgaXRzIGNoaWxkcmVuXG4gICAgLy8gVGhlIGZpcnN0IHN0ZXAgaXMgdG8gcGFyc2UgYWxsIHRoZSBjb21tZW50cyBpbiB0aGUgcm9vdCBub2RlXG4gICAgbGV0IGNvbW1lbnRzID0gdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShub2RlLCAnY29tbWVudCcpKTtcbiAgICAvLyBQYXJzZSB0aGUgbmFtZXNwYWNlcyBpbiBleHByZXNzaW9uX3N0YXRlbWVudFxuICAgIGxldCBuYW1lc3BhY2VzID0gdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShub2RlLCAnZXhwcmVzc2lvbl9zdGF0ZW1lbnQnKSk7XG4gICAgLy8gUGFyc2UgdGhlIGV4cG9ydCBzdGF0ZW1lbnRzIGluIHRoZSByb290IG5vZGVcbiAgICBsZXQgZXhwb3J0cyA9IHRoaXMudmlzaXRDaGlsZHJlbih0aGlzLmZpbHRlclR5cGUobm9kZSwgJ2V4cG9ydF9zdGF0ZW1lbnQnKSk7XG5cbiAgICAvLyBHZXQgdGhlIHZpc2l0ZWQgY29udGV4dCBub2Rlc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNvbW1lbnQgPSBjb21tZW50c1tpXTtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBjb21tZW50O1xuICAgICAgdmlzaXRlZFtnZXRTdGFydExvY2F0aW9uKGNvbnRleHQpXSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHRoZSB2aXNpdGVkIG5vZGVzIGZyb20gbmFtZXNwYWNlcyBhcnJheVxuICAgIG5hbWVzcGFjZXMgPSBfLnJlbW92ZShuYW1lc3BhY2VzLCB4ID0+ICF2aXNpdGVkW2dldFN0YXJ0TG9jYXRpb24oeCldKTtcblxuICAgIC8vIEV4cG9ydHMgYXJlIG9kZGJhbGxzIHNpbmNlIHNvbWUgZXhwb3J0cyBtYXkgcmVmZXJlbmNlXG4gICAgLy8gYSB0eXBlL25vZGUgdGhhdCBtYXkgaGF2ZSBiZWVuIGNvbW1lbnRlZC5cbiAgICAvLyBXZSdsbCBmaXJzdCBuZWVkIHRvIGZpbHRlciB0aGUgb25lcyB3ZSBoYXZlIHZpc2l0ZWRcbiAgICBleHBvcnRzID0gXy5yZW1vdmUoZXhwb3J0cywgeCA9PiAhdmlzaXRlZFtnZXRTdGFydExvY2F0aW9uKHgpXSk7XG5cbiAgICAvLyBGcm9tIHRoZSBvbmVzIHdlIGhhdmUgbm90IHZpc2l0ZWQsIHdlJ2xsIG5lZWQgdG8gbW9kaWZ5XG4gICAgLy8gdGhlIG5vZGUgcHJvcGVydGllcyBvZiBlYWNoIGNvbnRleHQgaW4gYSBjb21tZW50IG5vZGUgdGhhdFxuICAgIC8vIG1hdGNoZXMgdGhlIG9uZXMgd2UgaGF2ZSBub3QgdmlzaXRlZC5cbiAgICBjb25zdCBtYXRjaGVkID0ge307XG4gICAgY29tbWVudHMgPSBfLnJlbW92ZShcbiAgICAgIGNvbW1lbnRzLm1hcChjb21tZW50ID0+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBvcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZXhwb3J0XyA9IGV4cG9ydHNbaV07XG4gICAgICAgICAgaWYgKGNvbW1lbnQuY29udGV4dC50eXBlID09PSBleHBvcnRfLnR5cGUpIHtcbiAgICAgICAgICAgIG1hdGNoZWRbZ2V0U3RhcnRMb2NhdGlvbihleHBvcnRfKV0gPSB0cnVlO1xuICAgICAgICAgICAgY29tbWVudC5jb250ZXh0LnByb3BlcnRpZXMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICBjb21tZW50LmNvbnRleHQucHJvcGVydGllcyB8fCB7fSxcbiAgICAgICAgICAgICAgZXhwb3J0Xy5wcm9wZXJ0aWVzXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGNvbW1lbnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSwgKGNvbW1lbnQpID0+ICFjb21tZW50KTtcblxuICAgIC8vIFJlbW92ZWQgdGhlIG1hdGNoZWQgZXhwb3J0c1xuICAgIGV4cG9ydHMgPSBfLnJlbW92ZShleHBvcnRzLCB4ID0+ICFtYXRjaGVkW2dldFN0YXJ0TG9jYXRpb24oeCldKVxuXG4gICAgcmV0dXJuIFtdLmNvbmNhdChjb21tZW50cykuY29uY2F0KG5hbWVzcGFjZXMpLmNvbmNhdChleHBvcnRzKTtcbiAgfVxuXG4gIHByaXZhdGUgdmlzaXRDb21tZW50ID0gKG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlID0+IHtcbiAgICBpZiAoaXNKYXZhRG9jQ29tbWVudCh0aGlzLnNvdXJjZSwgbm9kZSkpIHtcbiAgICAgIGNvbnN0IG5leHRTaWJsaW5nID0gc2libGluZyhub2RlKTtcbiAgICAgIGlmIChuZXh0U2libGluZykge1xuICAgICAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENvbnRleHQobmV4dFNpYmxpbmcsIHt9KSwgdHJ1ZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmlzaXQgdGhlIGNvbnRleHR1YWwgbm9kZVxuICAgKiBcbiAgICogIyBSZW1hcmtcbiAgICogXG4gICAqIEEgbm9kZSBpcyBjb25zaWRlcmVkIGNvbnRleHR1YWwgd2hlbiBhIGNvbW1lbnQgaXMgdmlzaXRlZCBhbmQgdGhlIG5vZGUgaXMgaXRzIHNpYmxpbmcuXG4gICAqL1xuICBwcml2YXRlIHZpc2l0Q29udGV4dCA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSAnZXhwb3J0X3N0YXRlbWVudCc6XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0RXhwb3J0U3RhdGVtZW50KG5vZGUsIHByb3BlcnRpZXMpO1xuICAgICAgY2FzZSAnZXhwcmVzc2lvbl9zdGF0ZW1lbnQnOlxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQobm9kZSwgcHJvcGVydGllcyk7XG4gICAgICBjYXNlICdjbGFzcyc6XG4gICAgICBjYXNlICdpbnRlcmZhY2VfZGVjbGFyYXRpb24nOlxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdENsYXNzT3JJbnRlcmZhY2Uobm9kZSwgcHJvcGVydGllcylcbiAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIGNhc2UgJ2NhbGxfc2lnbmF0dXJlJzpcbiAgICAgIGNhc2UgJ21ldGhvZF9zaWduYXR1cmUnOlxuICAgICAgY2FzZSAncHJvcGVydHlfc2lnbmF0dXJlJzpcbiAgICAgIGNhc2UgJ3B1YmxpY19maWVsZF9kZWZpbml0aW9uJzpcbiAgICAgIGNhc2UgJ21ldGhvZF9kZWZpbml0aW9uJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXROb25UZXJtaW5hbChub2RlLCBwcm9wZXJ0aWVzKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGxvZy5yZXBvcnQodGhpcy5zb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFlldFN1cHBvcnRlZCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qIFN0YXRlbWVudHMgKi9cblxuICBwcml2YXRlIHZpc2l0RXhwb3J0U3RhdGVtZW50ID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xuICAgIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4sIGRlZmF1bHRFeHBvcnQgPSBmYWxzZTtcbiAgICAvLyBSZW1vdmUgJ2V4cG9ydCcgc2luY2UgaXQncyBhbHdheXMgZmlyc3QgaW4gdGhlIGFycmF5XG4gICAgY2hpbGRyZW4uc2hpZnQoKTtcbiAgICBpZiAodGhpcy5oYXNEZWZhdWx0RXhwb3J0KG5vZGUpKSB7XG4gICAgICBkZWZhdWx0RXhwb3J0ID0gdHJ1ZTtcbiAgICAgIC8vIFJlbW92ZSAnZGVmYXVsdCcgZXhwb3J0XG4gICAgICBjaGlsZHJlbi5zaGlmdCgpO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuLnNoaWZ0KCk7XG4gICAgcmV0dXJuIHRoaXMudmlzaXROb2RlKGNoaWxkLCB7IGV4cG9ydHM6IHsgZXhwb3J0OiB0cnVlLCBkZWZhdWx0OiBkZWZhdWx0RXhwb3J0IH0gfSk7XG4gIH1cblxuICBwcml2YXRlIHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudCA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzOiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xuICAgIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbi5zaGlmdCgpO1xuICAgIGlmIChtYXRjaChjaGlsZCwgJ2ludGVybmFsX21vZHVsZScpKSB7XG4gICAgICByZXR1cm4gdGhpcy52aXNpdEludGVybmFsTW9kdWxlKGNoaWxkLCBwcm9wZXJ0aWVzKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy52aXNpdE5vblRlcm1pbmFsKG5vZGUpO1xuICB9XG5cbiAgLyogTW9kdWxlcyAqL1xuXG4gIHByaXZhdGUgdmlzaXRJbnRlcm5hbE1vZHVsZSA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcbiAgICBsZXQgY2hpbGRyZW46IEFTVE5vZGVbXSA9IG5vZGUuY2hpbGRyZW4ubWFwKGNoaWxkID0+IHtcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ3N0YXRlbWVudF9ibG9jaycpKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q2hpbGRyZW4odGhpcy5maWx0ZXJUeXBlKGNoaWxkLCAnY29tbWVudCcpKSlcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnZpc2l0Tm9kZShjaGlsZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIGNoaWxkcmVuLCBPYmplY3QuYXNzaWduKHByb3BlcnRpZXMgfHwge30sIHsgbmFtZXNwYWNlOiB0cnVlIH0pKTtcbiAgfVxuXG5cbiAgLyogRGVjbGFyYXRpb25zICovXG5cbiAgcHJpdmF0ZSB2aXNpdENsYXNzT3JJbnRlcmZhY2UgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XG4gICAgLy8gU2luY2UgJ2ludGVyZmFjZScgb3IgJ2NsYXNzJyBpcyBhbHdheXMgZmlyc3QgaW4gdGhlIGFycmF5XG4gICAgLy8gd2UnbGwgbmVlZCB0byByZW1vdmUgaXQgZnJvbSB0aGUgYXJyYXkuXG4gICAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgICBjb25zdCBpbnRlcmZhY2VfID0gY2hpbGRyZW4uc2hpZnQoKTtcbiAgICBsZXQgZXh0ZW5kc18gPSBmYWxzZSwgaW1wbGVtZW50c18gPSBmYWxzZTtcbiAgICBpZiAodGhpcy5oYXNJbmhlcml0YW5jZShub2RlKSkge1xuICAgICAgY29uc3QgaW5oZXJpdGFuY2UgPSB0aGlzLmdldEluaGVyaXRhbmNlVHlwZShub2RlKVxuICAgICAgZXh0ZW5kc18gPSBpbmhlcml0YW5jZSA9PT0gJ2V4dGVuZHMnO1xuICAgICAgaW1wbGVtZW50c18gPSBpbmhlcml0YW5jZSA9PT0gJ2ltcGxlbWVudHMnO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGVfID0gY3JlYXRlQVNUTm9kZShcbiAgICAgIHRoaXMuc291cmNlLFxuICAgICAgbm9kZSxcbiAgICAgIHRoaXMudmlzaXRDaGlsZHJlbihjaGlsZHJlbiksXG4gICAgICBPYmplY3QuYXNzaWduKHByb3BlcnRpZXMgfHwge30sIHtcbiAgICAgICAgaW5oZXJpdGFuY2U6IHtcbiAgICAgICAgICBpbXBsZW1lbnRzOiBpbXBsZW1lbnRzXyxcbiAgICAgICAgICBleHRlbmRzOiBleHRlbmRzX1xuICAgICAgICB9IGFzIE5vZGVJbmhlcml0YW5jZVxuICAgICAgfSkpO1xuXG4gICAgaWYgKG1hdGNoKG5vZGUsICdjbGFzcycpKSB7XG4gICAgICByZXR1cm4gbm9kZV87XG4gICAgfVxuICAgIC8vIE92ZXJ3cml0ZSB0aGUgbm9kZSB0eXBlIGZyb20gJ2ludGVyZmFjZV9kZWNsYXJhdGlvbicgdG8gJ2ludGVyZmFjZSdcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihub2RlXywgeyB0eXBlOiBpbnRlcmZhY2VfLnR5cGUgfSlcbiAgfVxuXG4gIC8qIE5vbi10ZXJtaW5hbHMgKi9cblxuICBwcml2YXRlIHZpc2l0Tm9uVGVybWluYWwgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XG4gICAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBzb21lIG5vbi10ZXJtaW5hbHNcbiAgICAvLyBjb250YWluIGNvbW1lbnRzIHdoaWNoIGlzIHdoYXQgd2UgY2FyZSBhYm91dFxuICAgIGlmIChtYXRjaChub2RlLCAnY2xhc3NfYm9keScsICdvYmplY3RfdHlwZScpKSB7XG4gICAgICBjaGlsZHJlbiA9IHRoaXMuZmlsdGVyVHlwZShub2RlLCAnY29tbWVudCcpO1xuICAgIH1cbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBleHBvcnQgc3RhdGVtZW50cyBoYXZlIG5vZGUgcHJvcGVydGllc1xuICAgIGlmIChtYXRjaChub2RlLCAnZXhwb3J0X3N0YXRlbWVudCcpKSB7XG4gICAgICByZXR1cm4gdGhpcy52aXNpdEV4cG9ydFN0YXRlbWVudChub2RlKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBhbiBpbnRlcm5hbCBtb2R1bGUgY29udGFpbnMgb3RoZXIgbm9kZXNcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2ludGVybmFsX21vZHVsZScpKSB7XG4gICAgICByZXR1cm4gdGhpcy52aXNpdEludGVybmFsTW9kdWxlKG5vZGUsIHByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2VzIHdoZXJlIGFuIGludGVybWFsX21vZHVsZSBjYW4gZXhpc3QgaW4gYW4gZXhwcmVzc2lvbl9zdGF0ZW1lbnRcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2V4cHJlc3Npb25fc3RhdGVtZW50JykpIHtcbiAgICAgIHJldHVybiB0aGlzLnZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChub2RlLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cblxuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q2hpbGRyZW4oY2hpbGRyZW4pLCBwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIC8qIFRlcm1pbmFscyAqL1xuXG4gIHByaXZhdGUgdmlzaXRUZXJtaW5hbCA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZSA9PiB7XG4gICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUpXG4gIH1cbn0iXX0= \ No newline at end of file diff --git a/build/src/utils/benchmark.d.ts b/build/src/utils/benchmark.d.ts new file mode 100644 index 0000000..d19bd5b --- /dev/null +++ b/build/src/utils/benchmark.d.ts @@ -0,0 +1 @@ +export default function benchmark(label: string, f: (x: T2) => T, ...args: T2[]): T; diff --git a/build/src/utils/benchmark.js b/build/src/utils/benchmark.js new file mode 100644 index 0000000..a6e49e6 --- /dev/null +++ b/build/src/utils/benchmark.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function benchmark(label, f, ...args) { + console.time(label); + const result = f.apply(null, args); + console.timeEnd(label); + return result; +} +exports.default = benchmark; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVuY2htYXJrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2JlbmNobWFyay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLFNBQXdCLFNBQVMsQ0FDL0IsS0FBYSxFQUNiLENBQWUsRUFDZixHQUFHLElBQVU7SUFFYixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ25CLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ25DLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQVRELDRCQVNDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYmVuY2htYXJrPFQsIFQyPihcbiAgbGFiZWw6IHN0cmluZyxcbiAgZjogKHg6IFQyKSA9PiBULFxuICAuLi5hcmdzOiBUMltdXG4pOiBUIHtcbiAgY29uc29sZS50aW1lKGxhYmVsKVxuICBjb25zdCByZXN1bHQgPSBmLmFwcGx5KG51bGwsIGFyZ3MpO1xuICBjb25zb2xlLnRpbWVFbmQobGFiZWwpO1xuICByZXR1cm4gcmVzdWx0O1xufSJdfQ== \ No newline at end of file diff --git a/build/src/utils/comment.js b/build/src/utils/comment.js index d67c1c8..dd61fb4 100644 --- a/build/src/utils/comment.js +++ b/build/src/utils/comment.js @@ -39,4 +39,4 @@ function isXDocCommentFragment(source, node) { return !isXDocCommentBlock(source, node) && isXDocComment(source, node); } exports.isXDocCommentFragment = isXDocCommentFragment; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9jb21tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsbUNBQTRCO0FBR2YsUUFBQSxTQUFTLEdBQUcsOEVBQThFLENBQUM7QUFFeEcsU0FBZ0IsY0FBYyxDQUFFLE1BQWMsRUFBRSxJQUFnQjtJQUM5RCxNQUFNLGFBQWEsR0FBRztRQUNwQixXQUFXO1FBQ1gsc0JBQXNCO1FBQ3RCLFNBQVM7UUFDVCxxQkFBcUI7S0FDdEIsQ0FBQztJQUNGLElBQUksZUFBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRTtRQUMxQixPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDOUIsTUFBTSxDQUFDLElBQUk7YUFDUixTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQ3pDLFdBQVcsRUFBRTthQUNiLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FDbEIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDbEI7QUFDSCxDQUFDO0FBZkQsd0NBZUM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDL0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEUsbUJBQW1CO0lBQ25CLE9BQU8saUNBQWlDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQ3hELENBQUM7QUFKRCw0Q0FJQztBQUVELFNBQWdCLGFBQWEsQ0FBQyxNQUFhLEVBQUUsSUFBaUI7SUFDNUQsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQ3JCLElBQUksSUFBSTtRQUFFLE9BQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JFLE9BQU8saUJBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUpELHNDQUlDO0FBRUQsU0FBZ0Isa0JBQWtCLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQ2pFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDM0QsQ0FBQztBQUhELGdEQUdDO0FBRUQsU0FBZ0IscUJBQXFCLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQ3BFLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRkQsc0RBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XHJcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi9tYXRjaFwiO1xyXG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xyXG5cclxuZXhwb3J0IGNvbnN0IFhEb2NSZWdleCA9IC9AKFxcdyspKFtee1soXFxuXSopPyhbXFx7XFxbXFwoXVtcXHNcXFNdKltcXH1cXF1cXCldKFtcXHNdKig9fC0pPi4qKT8pPyhbXFxzXSotKC4pKik/L2dtaTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0xlZ2FsQ29tbWVudCAoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICBjb25zdCBwb3NzaWJsZVRleHRzID0gW1xyXG4gICAgJ2NvcHlyaWdodCcsXHJcbiAgICAndGVybXMgYW5kIGNvbmRpdGlvbnMnLFxyXG4gICAgJ2xpY2Vuc2UnLFxyXG4gICAgJ2FsbCByaWdodHMgcmVzZXJ2ZWQnXHJcbiAgXTtcclxuICBpZiAobWF0Y2gobm9kZSwgJ2NvbW1lbnQnKSkge1xyXG4gICAgcmV0dXJuIHBvc3NpYmxlVGV4dHMubWFwKHRleHQgPT5cclxuICAgICAgc291cmNlLnRleHRcclxuICAgICAgICAuc3Vic3RyaW5nKG5vZGUuc3RhcnRJbmRleCwgbm9kZS5lbmRJbmRleClcclxuICAgICAgICAudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgIC5pbmNsdWRlcyh0ZXh0KVxyXG4gICAgKS5pbmNsdWRlcyh0cnVlKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0phdmFEb2NDb21tZW50KHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlKSB7XHJcbiAgY29uc3QgY29tbWVudCA9IHNvdXJjZS50ZXh0LnN1YnN0cmluZyhub2RlLnN0YXJ0SW5kZXgsIG5vZGUuZW5kSW5kZXgpO1xyXG4gIC8vIHJlZ2V4ci5jb20vM2VqdmJcclxuICByZXR1cm4gLyhcXC9cXCpcXCopKChcXHMqKSguKj8pKFxccykpKihcXCpcXC8pLy50ZXN0KGNvbW1lbnQpXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1hEb2NDb21tZW50KHNvdXJjZTpzdHJpbmcsIG5vZGU/OiBTeW50YXhOb2RlKSB7XHJcbiAgbGV0IGNvbW1lbnQgPSBzb3VyY2U7XHJcbiAgaWYgKG5vZGUpIGNvbW1lbnQgPSBzb3VyY2Uuc3Vic3RyaW5nKG5vZGUuc3RhcnRJbmRleCwgbm9kZS5lbmRJbmRleCk7XHJcbiAgcmV0dXJuIFhEb2NSZWdleC50ZXN0KGNvbW1lbnQpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNYRG9jQ29tbWVudEJsb2NrKHNvdXJjZTogc3RyaW5nLCBub2RlOiBTeW50YXhOb2RlKSB7XHJcbiAgY29uc3QgY29tbWVudCA9IHNvdXJjZS5zdWJzdHJpbmcobm9kZS5zdGFydEluZGV4LCBub2RlLmVuZEluZGV4KTtcclxuICByZXR1cm4gLyNBUEkvLnRlc3QoY29tbWVudCkgfHwgL1xcYFxcYFxcYHhkb2MvLnRlc3QoY29tbWVudClcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzWERvY0NvbW1lbnRGcmFnbWVudChzb3VyY2U6IHN0cmluZywgbm9kZTogU3ludGF4Tm9kZSkge1xyXG4gIHJldHVybiAhaXNYRG9jQ29tbWVudEJsb2NrKHNvdXJjZSwgbm9kZSkgJiYgaXNYRG9jQ29tbWVudChzb3VyY2UsIG5vZGUpO1xyXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9jb21tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsbUNBQTRCO0FBR2YsUUFBQSxTQUFTLEdBQUcsOEVBQThFLENBQUM7QUFFeEcsU0FBZ0IsY0FBYyxDQUFFLE1BQWMsRUFBRSxJQUFnQjtJQUM5RCxNQUFNLGFBQWEsR0FBRztRQUNwQixXQUFXO1FBQ1gsc0JBQXNCO1FBQ3RCLFNBQVM7UUFDVCxxQkFBcUI7S0FDdEIsQ0FBQztJQUNGLElBQUksZUFBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRTtRQUMxQixPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDOUIsTUFBTSxDQUFDLElBQUk7YUFDUixTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQ3pDLFdBQVcsRUFBRTthQUNiLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FDbEIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDbEI7QUFDSCxDQUFDO0FBZkQsd0NBZUM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDL0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEUsbUJBQW1CO0lBQ25CLE9BQU8saUNBQWlDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQ3hELENBQUM7QUFKRCw0Q0FJQztBQUVELFNBQWdCLGFBQWEsQ0FBQyxNQUFhLEVBQUUsSUFBaUI7SUFDNUQsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQ3JCLElBQUksSUFBSTtRQUFFLE9BQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JFLE9BQU8saUJBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUpELHNDQUlDO0FBRUQsU0FBZ0Isa0JBQWtCLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQ2pFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDM0QsQ0FBQztBQUhELGdEQUdDO0FBRUQsU0FBZ0IscUJBQXFCLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQ3BFLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRkQsc0RBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgbWF0Y2ggZnJvbSBcIi4vbWF0Y2hcIjtcbmltcG9ydCBTb3VyY2UgZnJvbSBcIi4uL2ludGVyZmFjZXMvU291cmNlXCI7XG5cbmV4cG9ydCBjb25zdCBYRG9jUmVnZXggPSAvQChcXHcrKShbXntbKFxcbl0qKT8oW1xce1xcW1xcKF1bXFxzXFxTXSpbXFx9XFxdXFwpXShbXFxzXSooPXwtKT4uKik/KT8oW1xcc10qLSguKSopPy9nbWk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xlZ2FsQ29tbWVudCAoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgY29uc3QgcG9zc2libGVUZXh0cyA9IFtcbiAgICAnY29weXJpZ2h0JyxcbiAgICAndGVybXMgYW5kIGNvbmRpdGlvbnMnLFxuICAgICdsaWNlbnNlJyxcbiAgICAnYWxsIHJpZ2h0cyByZXNlcnZlZCdcbiAgXTtcbiAgaWYgKG1hdGNoKG5vZGUsICdjb21tZW50JykpIHtcbiAgICByZXR1cm4gcG9zc2libGVUZXh0cy5tYXAodGV4dCA9PlxuICAgICAgc291cmNlLnRleHRcbiAgICAgICAgLnN1YnN0cmluZyhub2RlLnN0YXJ0SW5kZXgsIG5vZGUuZW5kSW5kZXgpXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgIC5pbmNsdWRlcyh0ZXh0KVxuICAgICkuaW5jbHVkZXModHJ1ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSmF2YURvY0NvbW1lbnQoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgY29uc3QgY29tbWVudCA9IHNvdXJjZS50ZXh0LnN1YnN0cmluZyhub2RlLnN0YXJ0SW5kZXgsIG5vZGUuZW5kSW5kZXgpO1xuICAvLyByZWdleHIuY29tLzNlanZiXG4gIHJldHVybiAvKFxcL1xcKlxcKikoKFxccyopKC4qPykoXFxzKSkqKFxcKlxcLykvLnRlc3QoY29tbWVudClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzWERvY0NvbW1lbnQoc291cmNlOnN0cmluZywgbm9kZT86IFN5bnRheE5vZGUpIHtcbiAgbGV0IGNvbW1lbnQgPSBzb3VyY2U7XG4gIGlmIChub2RlKSBjb21tZW50ID0gc291cmNlLnN1YnN0cmluZyhub2RlLnN0YXJ0SW5kZXgsIG5vZGUuZW5kSW5kZXgpO1xuICByZXR1cm4gWERvY1JlZ2V4LnRlc3QoY29tbWVudCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1hEb2NDb21tZW50QmxvY2soc291cmNlOiBzdHJpbmcsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgY29uc3QgY29tbWVudCA9IHNvdXJjZS5zdWJzdHJpbmcobm9kZS5zdGFydEluZGV4LCBub2RlLmVuZEluZGV4KTtcbiAgcmV0dXJuIC8jQVBJLy50ZXN0KGNvbW1lbnQpIHx8IC9cXGBcXGBcXGB4ZG9jLy50ZXN0KGNvbW1lbnQpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1hEb2NDb21tZW50RnJhZ21lbnQoc291cmNlOiBzdHJpbmcsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgcmV0dXJuICFpc1hEb2NDb21tZW50QmxvY2soc291cmNlLCBub2RlKSAmJiBpc1hEb2NDb21tZW50KHNvdXJjZSwgbm9kZSk7XG59Il19 \ No newline at end of file diff --git a/build/src/utils/log.js b/build/src/utils/log.js index 07cc8cf..357c28d 100644 --- a/build/src/utils/log.js +++ b/build/src/utils/log.js @@ -29,4 +29,4 @@ class ParserLog extends mr_doc_utils_1.Log { } const log = new ParserLog('mr-doc::parser'); exports.default = log; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtDQUFtQztBQUduQyxtQ0FBNEI7QUFFNUIsSUFBWSxTQUdYO0FBSEQsV0FBWSxTQUFTO0lBQ2pCLCtFQUF1QixDQUFBO0lBQ3ZCLHlFQUFvQixDQUFBO0FBQ3hCLENBQUMsRUFIVyxTQUFTLEdBQVQsaUJBQVMsS0FBVCxpQkFBUyxRQUdwQjtBQUVELE1BQU0sU0FBVSxTQUFRLGtCQUFHO0lBQTNCOztRQUNJLFdBQU0sR0FBRyxDQUFDLE1BQWMsRUFBRSxJQUFnQixFQUFFLEtBQWdCLEVBQVEsRUFBRTtZQUNsRSxNQUFNLFFBQVEsR0FBRyxlQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ3RDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQ3pELE1BQU0sWUFBWSxHQUFHLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNySCxNQUFNLE9BQU8sR0FBRyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksWUFBWSxFQUFFLFFBQVEsTUFBTSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUM7WUFDakcsUUFBUSxLQUFLLEVBQUU7Z0JBQ1gsS0FBSyxTQUFTLENBQUMsdUJBQXVCO29CQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyw0QkFBNEIsT0FBTyxFQUFFLENBQUMsQ0FBQTtvQkFDbEYsTUFBTTtnQkFDVixLQUFLLFNBQVMsQ0FBQyxvQkFBb0I7b0JBQy9CLElBQUksQ0FBQyxLQUFLLENBQUMscURBQXFELE9BQU8sRUFBRSxDQUFDLENBQUE7Z0JBQzlFO29CQUNJLE1BQU07YUFDYjtRQUNMLENBQUMsQ0FBQTtJQUNMLENBQUM7Q0FBQTtBQUdELE1BQU0sR0FBRyxHQUFHLElBQUksU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFFNUMsa0JBQWUsR0FBRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTG9nIH0gZnJvbSAnbXItZG9jLXV0aWxzJztcclxuaW1wb3J0IFNvdXJjZSBmcm9tICcuLi9pbnRlcmZhY2VzL1NvdXJjZSc7XHJcbmltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tICd0cmVlLXNpdHRlcic7XHJcbmltcG9ydCByYW5nZSBmcm9tICcuL3JhbmdlJztcclxuXHJcbmV4cG9ydCBlbnVtIEVycm9yVHlwZSB7XHJcbiAgICBOb2RlVHlwZU5vdFlldFN1cHBvcnRlZCxcclxuICAgIFRyZWVTaXR0ZXJQYXJzZUVycm9yXHJcbn1cclxuXHJcbmNsYXNzIFBhcnNlckxvZyBleHRlbmRzIExvZyB7XHJcbiAgICByZXBvcnQgPSAoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUsIGVycm9yOiBFcnJvclR5cGUpOiB2b2lkID0+IHtcclxuICAgICAgICBjb25zdCBsb2NhdGlvbiA9IHJhbmdlKG5vZGUpLmxvY2F0aW9uO1xyXG4gICAgICAgIGNvbnN0IHNhbWVMaW5lID0gbG9jYXRpb24ucm93LnN0YXJ0ID09PSBsb2NhdGlvbi5yb3cuZW5kO1xyXG4gICAgICAgIGNvbnN0IGdldExpbmVSYW5nZSA9ICgpID0+IHNhbWVMaW5lID8gbG9jYXRpb24ucm93LnN0YXJ0ICsgMSA6IGxvY2F0aW9uLnJvdy5zdGFydCArIDEgKyAnIC0gJyArIGxvY2F0aW9uLnJvdy5lbmQgKyAxO1xyXG4gICAgICAgIGNvbnN0IGN1bHByaXQgPSBgTGluZSR7c2FtZUxpbmUgPyAnJyA6ICdzJ30gJHtnZXRMaW5lUmFuZ2UoKX0gaW4gJyR7c291cmNlLnBhdGh9JHtzb3VyY2UubmFtZX0nYDtcclxuICAgICAgICBzd2l0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNhc2UgRXJyb3JUeXBlLk5vZGVUeXBlTm90WWV0U3VwcG9ydGVkOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5pbmZvKGAnJHtub2RlLnR5cGUucmVwbGFjZSgvW19dL2csICcgJyl9JyBpcyBub3QgeWV0IHN1cHBvcnRlZDpcXG4ke2N1bHByaXR9YClcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIEVycm9yVHlwZS5UcmVlU2l0dGVyUGFyc2VFcnJvcjpcclxuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoYCd0cmVlLXNpdHRlcicgd2FzIG5vdCBhYmxlIHRvIHBhcnNlIHRoZSBwcm9ncmFtOlxcbiR7Y3VscHJpdH1gKVxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5cclxuY29uc3QgbG9nID0gbmV3IFBhcnNlckxvZygnbXItZG9jOjpwYXJzZXInKTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGxvZzsiXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtDQUFtQztBQUduQyxtQ0FBNEI7QUFFNUIsSUFBWSxTQUdYO0FBSEQsV0FBWSxTQUFTO0lBQ2pCLCtFQUF1QixDQUFBO0lBQ3ZCLHlFQUFvQixDQUFBO0FBQ3hCLENBQUMsRUFIVyxTQUFTLEdBQVQsaUJBQVMsS0FBVCxpQkFBUyxRQUdwQjtBQUVELE1BQU0sU0FBVSxTQUFRLGtCQUFHO0lBQTNCOztRQUNJLFdBQU0sR0FBRyxDQUFDLE1BQWMsRUFBRSxJQUFnQixFQUFFLEtBQWdCLEVBQVEsRUFBRTtZQUNsRSxNQUFNLFFBQVEsR0FBRyxlQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ3RDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQ3pELE1BQU0sWUFBWSxHQUFHLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNySCxNQUFNLE9BQU8sR0FBRyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksWUFBWSxFQUFFLFFBQVEsTUFBTSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUM7WUFDakcsUUFBUSxLQUFLLEVBQUU7Z0JBQ1gsS0FBSyxTQUFTLENBQUMsdUJBQXVCO29CQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyw0QkFBNEIsT0FBTyxFQUFFLENBQUMsQ0FBQTtvQkFDbEYsTUFBTTtnQkFDVixLQUFLLFNBQVMsQ0FBQyxvQkFBb0I7b0JBQy9CLElBQUksQ0FBQyxLQUFLLENBQUMscURBQXFELE9BQU8sRUFBRSxDQUFDLENBQUE7Z0JBQzlFO29CQUNJLE1BQU07YUFDYjtRQUNMLENBQUMsQ0FBQTtJQUNMLENBQUM7Q0FBQTtBQUdELE1BQU0sR0FBRyxHQUFHLElBQUksU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFFNUMsa0JBQWUsR0FBRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTG9nIH0gZnJvbSAnbXItZG9jLXV0aWxzJztcbmltcG9ydCBTb3VyY2UgZnJvbSAnLi4vaW50ZXJmYWNlcy9Tb3VyY2UnO1xuaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gJ3RyZWUtc2l0dGVyJztcbmltcG9ydCByYW5nZSBmcm9tICcuL3JhbmdlJztcblxuZXhwb3J0IGVudW0gRXJyb3JUeXBlIHtcbiAgICBOb2RlVHlwZU5vdFlldFN1cHBvcnRlZCxcbiAgICBUcmVlU2l0dGVyUGFyc2VFcnJvclxufVxuXG5jbGFzcyBQYXJzZXJMb2cgZXh0ZW5kcyBMb2cge1xuICAgIHJlcG9ydCA9IChzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSwgZXJyb3I6IEVycm9yVHlwZSk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCBsb2NhdGlvbiA9IHJhbmdlKG5vZGUpLmxvY2F0aW9uO1xuICAgICAgICBjb25zdCBzYW1lTGluZSA9IGxvY2F0aW9uLnJvdy5zdGFydCA9PT0gbG9jYXRpb24ucm93LmVuZDtcbiAgICAgICAgY29uc3QgZ2V0TGluZVJhbmdlID0gKCkgPT4gc2FtZUxpbmUgPyBsb2NhdGlvbi5yb3cuc3RhcnQgKyAxIDogbG9jYXRpb24ucm93LnN0YXJ0ICsgMSArICcgLSAnICsgbG9jYXRpb24ucm93LmVuZCArIDE7XG4gICAgICAgIGNvbnN0IGN1bHByaXQgPSBgTGluZSR7c2FtZUxpbmUgPyAnJyA6ICdzJ30gJHtnZXRMaW5lUmFuZ2UoKX0gaW4gJyR7c291cmNlLnBhdGh9JHtzb3VyY2UubmFtZX0nYDtcbiAgICAgICAgc3dpdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FzZSBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQ6XG4gICAgICAgICAgICAgICAgdGhpcy5pbmZvKGAnJHtub2RlLnR5cGUucmVwbGFjZSgvW19dL2csICcgJyl9JyBpcyBub3QgeWV0IHN1cHBvcnRlZDpcXG4ke2N1bHByaXR9YClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRXJyb3JUeXBlLlRyZWVTaXR0ZXJQYXJzZUVycm9yOlxuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoYCd0cmVlLXNpdHRlcicgd2FzIG5vdCBhYmxlIHRvIHBhcnNlIHRoZSBwcm9ncmFtOlxcbiR7Y3VscHJpdH1gKVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG5jb25zdCBsb2cgPSBuZXcgUGFyc2VyTG9nKCdtci1kb2M6OnBhcnNlcicpO1xuXG5leHBvcnQgZGVmYXVsdCBsb2c7Il19 \ No newline at end of file diff --git a/build/src/utils/match.js b/build/src/utils/match.js index d87f15b..74e0c8d 100644 --- a/build/src/utils/match.js +++ b/build/src/utils/match.js @@ -9,8 +9,13 @@ Object.defineProperty(exports, "__esModule", { value: true }); * ``` */ function match(node, ...types) { - const matches = types.map(type => node && type === node.type); - return matches.includes(true); + for (let i = 0; i < types.length; i++) { + const type = types[i]; + if (node.type === type) { + return true; + } + } + return false; } exports.default = match; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvbWF0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQTs7Ozs7OztHQU9HO0FBQ0gsU0FBd0IsS0FBSyxDQUFDLElBQWdCLEVBQUUsR0FBRyxLQUFlO0lBQ2hFLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5RCxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQUhELHdCQUdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5cclxuLyoqXHJcbiAqIERldGVybWluZXMgd2hldGhlciBhIG5vZGUgaXMgYSBjZXJ0YWluIHR5cGUuXHJcbiAqIGBgYFxyXG4gKiBAcGFyYW0gbm9kZTogU3ludGF4Tm9kZSAtIFRoZSBub2RlIHRvIGNvbXBhcmUuXHJcbiAqIEBwYXJhbSB0eXBlOiBzdHJpbmcgIC0gVGhlIG5vZGUgdHlwZSB0byBtYXRjaC5cclxuICogQHJldHVybjogYm9vbGVhblxyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1hdGNoKG5vZGU6IFN5bnRheE5vZGUsIC4uLnR5cGVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xyXG4gIGNvbnN0IG1hdGNoZXMgPSB0eXBlcy5tYXAodHlwZSA9PiBub2RlICYmIHR5cGUgPT09IG5vZGUudHlwZSk7XHJcbiAgcmV0dXJuIG1hdGNoZXMuaW5jbHVkZXModHJ1ZSk7XHJcbn0iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvbWF0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQTs7Ozs7OztHQU9HO0FBQ0gsU0FBd0IsS0FBSyxDQUFDLElBQWdCLEVBQUUsR0FBRyxLQUFlO0lBQ2hFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3JDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQ3RCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7S0FDRjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQVJELHdCQVFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIG5vZGUgaXMgYSBjZXJ0YWluIHR5cGUuXG4gKiBgYGBcbiAqIEBwYXJhbSBub2RlOiBTeW50YXhOb2RlIC0gVGhlIG5vZGUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB0eXBlOiBzdHJpbmcgIC0gVGhlIG5vZGUgdHlwZSB0byBtYXRjaC5cbiAqIEByZXR1cm46IGJvb2xlYW5cbiAqIGBgYFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYXRjaChub2RlOiBTeW50YXhOb2RlLCAuLi50eXBlczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlc1tpXTtcbiAgICBpZiAobm9kZS50eXBlID09PSB0eXBlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufSJdfQ== \ No newline at end of file diff --git a/build/src/utils/measure.d.ts b/build/src/utils/measure.d.ts new file mode 100644 index 0000000..15d7c0f --- /dev/null +++ b/build/src/utils/measure.d.ts @@ -0,0 +1 @@ +export default function measure(): void; diff --git a/build/src/utils/measure.js b/build/src/utils/measure.js new file mode 100644 index 0000000..a82b65f --- /dev/null +++ b/build/src/utils/measure.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function measure() { +} +exports.default = measure; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVhc3VyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9tZWFzdXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsU0FBd0IsT0FBTztBQUUvQixDQUFDO0FBRkQsMEJBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZWFzdXJlPFQ+KCkge1xuXG59Il19 \ No newline at end of file diff --git a/build/src/utils/performance.d.ts b/build/src/utils/performance.d.ts new file mode 100644 index 0000000..15d7c0f --- /dev/null +++ b/build/src/utils/performance.d.ts @@ -0,0 +1 @@ +export default function measure(): void; diff --git a/build/src/utils/performance.js b/build/src/utils/performance.js new file mode 100644 index 0000000..c9e9339 --- /dev/null +++ b/build/src/utils/performance.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function measure() { +} +exports.default = measure; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyZm9ybWFuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvcGVyZm9ybWFuY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxTQUF3QixPQUFPO0FBRS9CLENBQUM7QUFGRCwwQkFFQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lYXN1cmU8VD4oKSB7XG5cbn0iXX0= \ No newline at end of file diff --git a/build/src/utils/range.js b/build/src/utils/range.js index 4adeddb..e8ee5d6 100644 --- a/build/src/utils/range.js +++ b/build/src/utils/range.js @@ -13,4 +13,4 @@ function range(node) { }; } exports.default = range; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvcmFuZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxTQUF3QixLQUFLLENBQUMsSUFBdUI7SUFDbkQsT0FBTztRQUNMLFFBQVEsRUFBRTtZQUNSLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVTtZQUN0QixHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDbkI7UUFDRCxRQUFRLEVBQUU7WUFDUixHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQ2pFLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7U0FDM0U7S0FDRixDQUFBO0FBQ0gsQ0FBQztBQVhELHdCQVdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcclxuaW1wb3J0IFRleHRSYW5nZSBmcm9tICcuLi9pbnRlcmZhY2VzL1RleHRSYW5nZSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByYW5nZShub2RlOiBQYXJzZXIuU3ludGF4Tm9kZSk6IFRleHRSYW5nZSB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHBvc2l0aW9uOiB7XHJcbiAgICAgIHN0YXJ0OiBub2RlLnN0YXJ0SW5kZXgsXHJcbiAgICAgIGVuZDogbm9kZS5lbmRJbmRleFxyXG4gICAgfSxcclxuICAgIGxvY2F0aW9uOiB7XHJcbiAgICAgIHJvdzogeyBzdGFydDogbm9kZS5zdGFydFBvc2l0aW9uLnJvdywgZW5kOiBub2RlLmVuZFBvc2l0aW9uLnJvdyB9LFxyXG4gICAgICBjb2x1bW46IHsgc3RhcnQ6IG5vZGUuc3RhcnRQb3NpdGlvbi5jb2x1bW4sIGVuZDogbm9kZS5lbmRQb3NpdGlvbi5jb2x1bW4gfVxyXG4gICAgfVxyXG4gIH1cclxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvcmFuZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxTQUF3QixLQUFLLENBQUMsSUFBdUI7SUFDbkQsT0FBTztRQUNMLFFBQVEsRUFBRTtZQUNSLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVTtZQUN0QixHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDbkI7UUFDRCxRQUFRLEVBQUU7WUFDUixHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQ2pFLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7U0FDM0U7S0FDRixDQUFBO0FBQ0gsQ0FBQztBQVhELHdCQVdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcbmltcG9ydCBUZXh0UmFuZ2UgZnJvbSAnLi4vaW50ZXJmYWNlcy9UZXh0UmFuZ2UnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByYW5nZShub2RlOiBQYXJzZXIuU3ludGF4Tm9kZSk6IFRleHRSYW5nZSB7XG4gIHJldHVybiB7XG4gICAgcG9zaXRpb246IHtcbiAgICAgIHN0YXJ0OiBub2RlLnN0YXJ0SW5kZXgsXG4gICAgICBlbmQ6IG5vZGUuZW5kSW5kZXhcbiAgICB9LFxuICAgIGxvY2F0aW9uOiB7XG4gICAgICByb3c6IHsgc3RhcnQ6IG5vZGUuc3RhcnRQb3NpdGlvbi5yb3csIGVuZDogbm9kZS5lbmRQb3NpdGlvbi5yb3cgfSxcbiAgICAgIGNvbHVtbjogeyBzdGFydDogbm9kZS5zdGFydFBvc2l0aW9uLmNvbHVtbiwgZW5kOiBub2RlLmVuZFBvc2l0aW9uLmNvbHVtbiB9XG4gICAgfVxuICB9XG59Il19 \ No newline at end of file diff --git a/build/src/utils/sibling.js b/build/src/utils/sibling.js index 66420fd..fe01442 100644 --- a/build/src/utils/sibling.js +++ b/build/src/utils/sibling.js @@ -12,4 +12,4 @@ function sibling(node, children, filter) { } } exports.sibling = sibling; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2libGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9zaWJsaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsU0FBZ0IsT0FBTyxDQUNyQixJQUFnQixFQUNoQixRQUF1QixFQUN2QixNQUFzQjtJQUV0QixJQUFJLElBQUksRUFBRTtRQUNSLElBQUksUUFBUSxFQUFFO1lBQ1osTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUM7Z0JBQ3BCLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsT0FBTyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzVCO1FBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0tBQ3pCO0FBQ0gsQ0FBQztBQWRELDBCQWNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNpYmxpbmcoXHJcbiAgbm9kZTogU3ludGF4Tm9kZSxcclxuICBjaGlsZHJlbj86IFN5bnRheE5vZGVbXSxcclxuICBmaWx0ZXI/OiAoKSA9PiBib29sZWFuXHJcbikge1xyXG4gIGlmIChub2RlKSB7XHJcbiAgICBpZiAoY2hpbGRyZW4pIHtcclxuICAgICAgY29uc3QgaW5kZXggPSBmaWx0ZXIgP1xyXG4gICAgICAgIGNoaWxkcmVuLmZpbHRlcihmaWx0ZXIpLmluZGV4T2Yobm9kZSkgOlxyXG4gICAgICAgIGNoaWxkcmVuLmluZGV4T2Yobm9kZSk7XHJcbiAgICAgIHJldHVybiBjaGlsZHJlbltpbmRleCArIDFdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7XHJcbiAgfVxyXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2libGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9zaWJsaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsU0FBZ0IsT0FBTyxDQUNyQixJQUFnQixFQUNoQixRQUF1QixFQUN2QixNQUFzQjtJQUV0QixJQUFJLElBQUksRUFBRTtRQUNSLElBQUksUUFBUSxFQUFFO1lBQ1osTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUM7Z0JBQ3BCLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsT0FBTyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzVCO1FBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0tBQ3pCO0FBQ0gsQ0FBQztBQWRELDBCQWNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuXG5leHBvcnQgZnVuY3Rpb24gc2libGluZyhcbiAgbm9kZTogU3ludGF4Tm9kZSxcbiAgY2hpbGRyZW4/OiBTeW50YXhOb2RlW10sXG4gIGZpbHRlcj86ICgpID0+IGJvb2xlYW5cbikge1xuICBpZiAobm9kZSkge1xuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgY29uc3QgaW5kZXggPSBmaWx0ZXIgP1xuICAgICAgICBjaGlsZHJlbi5maWx0ZXIoZmlsdGVyKS5pbmRleE9mKG5vZGUpIDpcbiAgICAgICAgY2hpbGRyZW4uaW5kZXhPZihub2RlKTtcbiAgICAgIHJldHVybiBjaGlsZHJlbltpbmRleCArIDFdO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZS5uZXh0U2libGluZztcbiAgfVxufSJdfQ== \ No newline at end of file diff --git a/build/src/utils/text.js b/build/src/utils/text.js index 2727251..c4b2bc3 100644 --- a/build/src/utils/text.js +++ b/build/src/utils/text.js @@ -12,4 +12,4 @@ function text(source, node) { return source.text.substring(node.startIndex, node.endIndex); } exports.text = text; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy90ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0E7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLElBQUksQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDbkQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRkQsb0JBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XHJcbmltcG9ydCBTb3VyY2UgZnJvbSBcIi4uL2ludGVyZmFjZXMvU291cmNlXCI7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgY29udGV4dCBzdHJpbmdcclxuICogXHJcbiAqICMgQVBJXHJcbiAqIFxyXG4gKiBAcGFyYW0gc291cmNlOiBJRmlsZSAtIFRoZSBzb3VyY2UgZmlsZS5cclxuICogQHBhcmFtIG5vZGU6IFN5bnRheE5vZGUgLSBUaGUgc3ludGF4IG5vZGUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdGV4dChzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSkge1xyXG4gIHJldHVybiBzb3VyY2UudGV4dC5zdWJzdHJpbmcobm9kZS5zdGFydEluZGV4LCBub2RlLmVuZEluZGV4KTtcclxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy90ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0E7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLElBQUksQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDbkQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRkQsb0JBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGNvbnRleHQgc3RyaW5nXG4gKiBcbiAqICMgQVBJXG4gKiBcbiAqIEBwYXJhbSBzb3VyY2U6IElGaWxlIC0gVGhlIHNvdXJjZSBmaWxlLlxuICogQHBhcmFtIG5vZGU6IFN5bnRheE5vZGUgLSBUaGUgc3ludGF4IG5vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXh0KHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlKSB7XG4gIHJldHVybiBzb3VyY2UudGV4dC5zdWJzdHJpbmcobm9kZS5zdGFydEluZGV4LCBub2RlLmVuZEluZGV4KTtcbn0iXX0= \ No newline at end of file diff --git a/build/src/utils/walk.d.ts b/build/src/utils/walk.d.ts index 4e9e624..a4ef2e4 100644 --- a/build/src/utils/walk.d.ts +++ b/build/src/utils/walk.d.ts @@ -1,3 +1,3 @@ import { SyntaxNode } from "tree-sitter"; -import { Node } from "../lang/typescript/visitor"; +import { Node } from '../lang/common/node'; export default function walk(node: SyntaxNode): Node; diff --git a/build/src/utils/walk.js b/build/src/utils/walk.js index a743446..d2e0acd 100644 --- a/build/src/utils/walk.js +++ b/build/src/utils/walk.js @@ -1,10 +1,10 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const visitor_1 = require("../lang/typescript/visitor"); +const node_1 = require("../lang/common/node"); function walk(node) { - let node_ = new visitor_1.Node(node); + let node_ = new node_1.Node(node); node_.syntaxNode.children.map(child => walk(child)); return node_; } exports.default = walk; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Fsay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy93YWxrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0Esd0RBQWtEO0FBRWxELFNBQXdCLElBQUksQ0FBQyxJQUFnQjtJQUMzQyxJQUFJLEtBQUssR0FBRyxJQUFJLGNBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUNuRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFKRCx1QkFJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcclxuaW1wb3J0IHsgTm9kZSB9IGZyb20gXCIuLi9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvclwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gd2Fsayhub2RlOiBTeW50YXhOb2RlKSB7XHJcbiAgbGV0IG5vZGVfID0gbmV3IE5vZGUobm9kZSk7XHJcbiAgbm9kZV8uc3ludGF4Tm9kZS5jaGlsZHJlbi5tYXAoY2hpbGQgPT4gd2FsayhjaGlsZCkpXHJcbiAgcmV0dXJuIG5vZGVfO1xyXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Fsay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy93YWxrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsOENBQTBDO0FBQzFDLFNBQXdCLElBQUksQ0FBQyxJQUFnQjtJQUMzQyxJQUFJLEtBQUssR0FBRyxJQUFJLFdBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUNuRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFKRCx1QkFJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcbmltcG9ydCB7IE5vZGUgfSBmcm9tICcuLi9sYW5nL2NvbW1vbi9ub2RlJ1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gd2Fsayhub2RlOiBTeW50YXhOb2RlKSB7XG4gIGxldCBub2RlXyA9IG5ldyBOb2RlKG5vZGUpO1xuICBub2RlXy5zeW50YXhOb2RlLmNoaWxkcmVuLm1hcChjaGlsZCA9PiB3YWxrKGNoaWxkKSlcbiAgcmV0dXJuIG5vZGVfO1xufSJdfQ== \ No newline at end of file diff --git a/example.ts b/example.ts index dbd609e..4faac88 100644 --- a/example.ts +++ b/example.ts @@ -1,21 +1,8 @@ -/** - * Description - */ -interface A { - -} - -/** - * Description - * @interface B - */ -interface B extends A { +export namespace X { /** - * description + * */ - (x: string): void - /** - * description - */ - func (x: string): A + export function name(params:string) { + + } } \ No newline at end of file diff --git a/index.ts b/index.ts index 258a1d2..11703ea 100644 --- a/index.ts +++ b/index.ts @@ -2,7 +2,7 @@ import Source from './src/interfaces/Source'; import ParserFactory from './src/ParserFactory'; import IParser from './src/interfaces/IParser'; import * as FS from 'fs'; - +// import { ASTNode } from './src/lang/common/ast'; /** * A class that parses a source code and generates an AST. * @@ -32,15 +32,11 @@ export default class Parser implements IParser { return this.parser.parse() } } - +const path = `${process.cwd()}/example.ts`; const result = new Parser({ name: 'index.ts', - path: '../../', - text: FS.readFileSync(`${process.cwd()}/example.ts`, 'utf-8') + path: path, + text: FS.readFileSync(path, 'utf-8') }, { language: 'typescript' -}).parse(); - - -// console.log(JSON.stringify(result, null, 2)) -console.log(result); +}).parse(); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index d805dc2..a34eb8e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1265,6 +1265,11 @@ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" }, + "tree-crawl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tree-crawl/-/tree-crawl-1.0.5.tgz", + "integrity": "sha512-iGxq6nMcZ2PCRQOHykbhM5nMBiErA9iVfWvfatKlfAZ4O4t/46BfrbZfTcoNM6H6o6TYHQvxHtPWEnvPqH7rDA==" + }, "tree-sitter": { "version": "0.13.7", "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.13.7.tgz", diff --git a/package.json b/package.json index fa868d3..5965ea1 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "babylon": "^6.7.0", "lodash": "^4.17.10", "mr-doc-utils": "github:iwatakeshi/mr-doc-utils", + "tree-crawl": "^1.0.5", "tree-sitter": "^0.13.7", "tree-sitter-javascript": "^0.13.5", "tree-sitter-typescript": "^0.13.3", diff --git a/parser.txt b/parser.txt new file mode 100644 index 0000000..1b792f6 --- /dev/null +++ b/parser.txt @@ -0,0 +1,7953 @@ +namespace ts { + const enum SignatureFlags { + None = 0, + Yield = 1 << 0, + Await = 1 << 1, + Type = 1 << 2, + IgnoreMissingOpenBrace = 1 << 4, + JSDoc = 1 << 5, + } + + // tslint:disable variable-name + let NodeConstructor: new (kind: SyntaxKind, pos?: number, end?: number) => Node; + let TokenConstructor: new (kind: SyntaxKind, pos?: number, end?: number) => Node; + let IdentifierConstructor: new (kind: SyntaxKind, pos?: number, end?: number) => Node; + let SourceFileConstructor: new (kind: SyntaxKind, pos?: number, end?: number) => Node; + // tslint:enable variable-name + + export function createNode(kind: SyntaxKind, pos?: number, end?: number): Node { + if (kind === SyntaxKind.SourceFile) { + return new (SourceFileConstructor || (SourceFileConstructor = objectAllocator.getSourceFileConstructor()))(kind, pos, end); + } + else if (kind === SyntaxKind.Identifier) { + return new (IdentifierConstructor || (IdentifierConstructor = objectAllocator.getIdentifierConstructor()))(kind, pos, end); + } + else if (!isNodeKind(kind)) { + return new (TokenConstructor || (TokenConstructor = objectAllocator.getTokenConstructor()))(kind, pos, end); + } + else { + return new (NodeConstructor || (NodeConstructor = objectAllocator.getNodeConstructor()))(kind, pos, end); + } + } + + function visitNode(cbNode: (node: Node) => T, node: Node | undefined): T | undefined { + return node && cbNode(node); + } + + function visitNodes(cbNode: (node: Node) => T, cbNodes: ((node: NodeArray) => T | undefined) | undefined, nodes: NodeArray | undefined): T | undefined { + if (nodes) { + if (cbNodes) { + return cbNodes(nodes); + } + for (const node of nodes) { + const result = cbNode(node); + if (result) { + return result; + } + } + } + } + + /*@internal*/ + export function isJSDocLikeText(text: string, start: number) { + return text.charCodeAt(start + 1) === CharacterCodes.asterisk && + text.charCodeAt(start + 2) === CharacterCodes.asterisk && + text.charCodeAt(start + 3) !== CharacterCodes.slash; + } + + /** + * Invokes a callback for each child of the given node. The 'cbNode' callback is invoked for all child nodes + * stored in properties. If a 'cbNodes' callback is specified, it is invoked for embedded arrays; otherwise, + * embedded arrays are flattened and the 'cbNode' callback is invoked for each element. If a callback returns + * a truthy value, iteration stops and that value is returned. Otherwise, undefined is returned. + * + * @param node - a given node to visit its children + * @param cbNode - a callback to be invoked for all child nodes + * @param cbNodes - a callback to be invoked for embedded array + * + * @remarks - `forEachChild` must visit the children of a node in the order + * that they appear in the source code. The language service depends on this property to locate nodes by position. + */ + export function forEachChild(node: Node, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + if (!node || node.kind <= SyntaxKind.LastToken) { + return; + } + switch (node.kind) { + case SyntaxKind.QualifiedName: + return visitNode(cbNode, (node).left) || + visitNode(cbNode, (node).right); + case SyntaxKind.TypeParameter: + return visitNode(cbNode, (node).name) || + visitNode(cbNode, (node).constraint) || + visitNode(cbNode, (node).default) || + visitNode(cbNode, (node).expression); + case SyntaxKind.ShorthandPropertyAssignment: + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, (node).name) || + visitNode(cbNode, (node).questionToken) || + visitNode(cbNode, (node).equalsToken) || + visitNode(cbNode, (node).objectAssignmentInitializer); + case SyntaxKind.SpreadAssignment: + return visitNode(cbNode, (node).expression); + case SyntaxKind.Parameter: + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, (node).dotDotDotToken) || + visitNode(cbNode, (node).name) || + visitNode(cbNode, (node).questionToken) || + visitNode(cbNode, (node).type) || + visitNode(cbNode, (node).initializer); + case SyntaxKind.PropertyDeclaration: + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, (node).name) || + visitNode(cbNode, (node).questionToken) || + visitNode(cbNode, (node).exclamationToken) || + visitNode(cbNode, (node).type) || + visitNode(cbNode, (node).initializer); + case SyntaxKind.PropertySignature: + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, (node).name) || + visitNode(cbNode, (node).questionToken) || + visitNode(cbNode, (node).type) || + visitNode(cbNode, (node).initializer); + case SyntaxKind.PropertyAssignment: + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, (node).name) || + visitNode(cbNode, (node).questionToken) || + visitNode(cbNode, (node).initializer); + case SyntaxKind.VariableDeclaration: + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, (node).name) || + visitNode(cbNode, (node).exclamationToken) || + visitNode(cbNode, (node).type) || + visitNode(cbNode, (node).initializer); + case SyntaxKind.BindingElement: + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, (node).dotDotDotToken) || + visitNode(cbNode, (node).propertyName) || + visitNode(cbNode, (node).name) || + visitNode(cbNode, (node).initializer); + case SyntaxKind.FunctionType: + case SyntaxKind.ConstructorType: + case SyntaxKind.CallSignature: + case SyntaxKind.ConstructSignature: + case SyntaxKind.IndexSignature: + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNodes(cbNode, cbNodes, (node).typeParameters) || + visitNodes(cbNode, cbNodes, (node).parameters) || + visitNode(cbNode, (node).type); + case SyntaxKind.MethodDeclaration: + case SyntaxKind.MethodSignature: + case SyntaxKind.Constructor: + case SyntaxKind.GetAccessor: + case SyntaxKind.SetAccessor: + case SyntaxKind.FunctionExpression: + case SyntaxKind.FunctionDeclaration: + case SyntaxKind.ArrowFunction: + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, (node).asteriskToken) || + visitNode(cbNode, (node).name) || + visitNode(cbNode, (node).questionToken) || + visitNodes(cbNode, cbNodes, (node).typeParameters) || + visitNodes(cbNode, cbNodes, (node).parameters) || + visitNode(cbNode, (node).type) || + visitNode(cbNode, (node).equalsGreaterThanToken) || + visitNode(cbNode, (node).body); + case SyntaxKind.TypeReference: + return visitNode(cbNode, (node).typeName) || + visitNodes(cbNode, cbNodes, (node).typeArguments); + case SyntaxKind.TypePredicate: + return visitNode(cbNode, (node).parameterName) || + visitNode(cbNode, (node).type); + case SyntaxKind.TypeQuery: + return visitNode(cbNode, (node).exprName); + case SyntaxKind.TypeLiteral: + return visitNodes(cbNode, cbNodes, (node).members); + case SyntaxKind.ArrayType: + return visitNode(cbNode, (node).elementType); + case SyntaxKind.TupleType: + return visitNodes(cbNode, cbNodes, (node).elementTypes); + case SyntaxKind.UnionType: + case SyntaxKind.IntersectionType: + return visitNodes(cbNode, cbNodes, (node).types); + case SyntaxKind.ConditionalType: + return visitNode(cbNode, (node).checkType) || + visitNode(cbNode, (node).extendsType) || + visitNode(cbNode, (node).trueType) || + visitNode(cbNode, (node).falseType); + case SyntaxKind.InferType: + return visitNode(cbNode, (node).typeParameter); + case SyntaxKind.ImportType: + return visitNode(cbNode, (node).argument) || + visitNode(cbNode, (node).qualifier) || + visitNodes(cbNode, cbNodes, (node).typeArguments); + case SyntaxKind.ParenthesizedType: + case SyntaxKind.TypeOperator: + return visitNode(cbNode, (node).type); + case SyntaxKind.IndexedAccessType: + return visitNode(cbNode, (node).objectType) || + visitNode(cbNode, (node).indexType); + case SyntaxKind.MappedType: + return visitNode(cbNode, (node).readonlyToken) || + visitNode(cbNode, (node).typeParameter) || + visitNode(cbNode, (node).questionToken) || + visitNode(cbNode, (node).type); + case SyntaxKind.LiteralType: + return visitNode(cbNode, (node).literal); + case SyntaxKind.ObjectBindingPattern: + case SyntaxKind.ArrayBindingPattern: + return visitNodes(cbNode, cbNodes, (node).elements); + case SyntaxKind.ArrayLiteralExpression: + return visitNodes(cbNode, cbNodes, (node).elements); + case SyntaxKind.ObjectLiteralExpression: + return visitNodes(cbNode, cbNodes, (node).properties); + case SyntaxKind.PropertyAccessExpression: + return visitNode(cbNode, (node).expression) || + visitNode(cbNode, (node).name); + case SyntaxKind.ElementAccessExpression: + return visitNode(cbNode, (node).expression) || + visitNode(cbNode, (node).argumentExpression); + case SyntaxKind.CallExpression: + case SyntaxKind.NewExpression: + return visitNode(cbNode, (node).expression) || + visitNodes(cbNode, cbNodes, (node).typeArguments) || + visitNodes(cbNode, cbNodes, (node).arguments); + case SyntaxKind.TaggedTemplateExpression: + return visitNode(cbNode, (node).tag) || + visitNodes(cbNode, cbNodes, (node).typeArguments) || + visitNode(cbNode, (node).template); + case SyntaxKind.TypeAssertionExpression: + return visitNode(cbNode, (node).type) || + visitNode(cbNode, (node).expression); + case SyntaxKind.ParenthesizedExpression: + return visitNode(cbNode, (node).expression); + case SyntaxKind.DeleteExpression: + return visitNode(cbNode, (node).expression); + case SyntaxKind.TypeOfExpression: + return visitNode(cbNode, (node).expression); + case SyntaxKind.VoidExpression: + return visitNode(cbNode, (node).expression); + case SyntaxKind.PrefixUnaryExpression: + return visitNode(cbNode, (node).operand); + case SyntaxKind.YieldExpression: + return visitNode(cbNode, (node).asteriskToken) || + visitNode(cbNode, (node).expression); + case SyntaxKind.AwaitExpression: + return visitNode(cbNode, (node).expression); + case SyntaxKind.PostfixUnaryExpression: + return visitNode(cbNode, (node).operand); + case SyntaxKind.BinaryExpression: + return visitNode(cbNode, (node).left) || + visitNode(cbNode, (node).operatorToken) || + visitNode(cbNode, (node).right); + case SyntaxKind.AsExpression: + return visitNode(cbNode, (node).expression) || + visitNode(cbNode, (node).type); + case SyntaxKind.NonNullExpression: + return visitNode(cbNode, (node).expression); + case SyntaxKind.MetaProperty: + return visitNode(cbNode, (node).name); + case SyntaxKind.ConditionalExpression: + return visitNode(cbNode, (node).condition) || + visitNode(cbNode, (node).questionToken) || + visitNode(cbNode, (node).whenTrue) || + visitNode(cbNode, (node).colonToken) || + visitNode(cbNode, (node).whenFalse); + case SyntaxKind.SpreadElement: + return visitNode(cbNode, (node).expression); + case SyntaxKind.Block: + case SyntaxKind.ModuleBlock: + return visitNodes(cbNode, cbNodes, (node).statements); + case SyntaxKind.SourceFile: + return visitNodes(cbNode, cbNodes, (node).statements) || + visitNode(cbNode, (node).endOfFileToken); + case SyntaxKind.VariableStatement: + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, (node).declarationList); + case SyntaxKind.VariableDeclarationList: + return visitNodes(cbNode, cbNodes, (node).declarations); + case SyntaxKind.ExpressionStatement: + return visitNode(cbNode, (node).expression); + case SyntaxKind.IfStatement: + return visitNode(cbNode, (node).expression) || + visitNode(cbNode, (node).thenStatement) || + visitNode(cbNode, (node).elseStatement); + case SyntaxKind.DoStatement: + return visitNode(cbNode, (node).statement) || + visitNode(cbNode, (node).expression); + case SyntaxKind.WhileStatement: + return visitNode(cbNode, (node).expression) || + visitNode(cbNode, (node).statement); + case SyntaxKind.ForStatement: + return visitNode(cbNode, (node).initializer) || + visitNode(cbNode, (node).condition) || + visitNode(cbNode, (node).incrementor) || + visitNode(cbNode, (node).statement); + case SyntaxKind.ForInStatement: + return visitNode(cbNode, (node).initializer) || + visitNode(cbNode, (node).expression) || + visitNode(cbNode, (node).statement); + case SyntaxKind.ForOfStatement: + return visitNode(cbNode, (node).awaitModifier) || + visitNode(cbNode, (node).initializer) || + visitNode(cbNode, (node).expression) || + visitNode(cbNode, (node).statement); + case SyntaxKind.ContinueStatement: + case SyntaxKind.BreakStatement: + return visitNode(cbNode, (node).label); + case SyntaxKind.ReturnStatement: + return visitNode(cbNode, (node).expression); + case SyntaxKind.WithStatement: + return visitNode(cbNode, (node).expression) || + visitNode(cbNode, (node).statement); + case SyntaxKind.SwitchStatement: + return visitNode(cbNode, (node).expression) || + visitNode(cbNode, (node).caseBlock); + case SyntaxKind.CaseBlock: + return visitNodes(cbNode, cbNodes, (node).clauses); + case SyntaxKind.CaseClause: + return visitNode(cbNode, (node).expression) || + visitNodes(cbNode, cbNodes, (node).statements); + case SyntaxKind.DefaultClause: + return visitNodes(cbNode, cbNodes, (node).statements); + case SyntaxKind.LabeledStatement: + return visitNode(cbNode, (node).label) || + visitNode(cbNode, (node).statement); + case SyntaxKind.ThrowStatement: + return visitNode(cbNode, (node).expression); + case SyntaxKind.TryStatement: + return visitNode(cbNode, (node).tryBlock) || + visitNode(cbNode, (node).catchClause) || + visitNode(cbNode, (node).finallyBlock); + case SyntaxKind.CatchClause: + return visitNode(cbNode, (node).variableDeclaration) || + visitNode(cbNode, (node).block); + case SyntaxKind.Decorator: + return visitNode(cbNode, (node).expression); + case SyntaxKind.ClassDeclaration: + case SyntaxKind.ClassExpression: + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, (node).name) || + visitNodes(cbNode, cbNodes, (node).typeParameters) || + visitNodes(cbNode, cbNodes, (node).heritageClauses) || + visitNodes(cbNode, cbNodes, (node).members); + case SyntaxKind.InterfaceDeclaration: + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, (node).name) || + visitNodes(cbNode, cbNodes, (node).typeParameters) || + visitNodes(cbNode, cbNodes, (node).heritageClauses) || + visitNodes(cbNode, cbNodes, (node).members); + case SyntaxKind.TypeAliasDeclaration: + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, (node).name) || + visitNodes(cbNode, cbNodes, (node).typeParameters) || + visitNode(cbNode, (node).type); + case SyntaxKind.EnumDeclaration: + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, (node).name) || + visitNodes(cbNode, cbNodes, (node).members); + case SyntaxKind.EnumMember: + return visitNode(cbNode, (node).name) || + visitNode(cbNode, (node).initializer); + case SyntaxKind.ModuleDeclaration: + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, (node).name) || + visitNode(cbNode, (node).body); + case SyntaxKind.ImportEqualsDeclaration: + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, (node).name) || + visitNode(cbNode, (node).moduleReference); + case SyntaxKind.ImportDeclaration: + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, (node).importClause) || + visitNode(cbNode, (node).moduleSpecifier); + case SyntaxKind.ImportClause: + return visitNode(cbNode, (node).name) || + visitNode(cbNode, (node).namedBindings); + case SyntaxKind.NamespaceExportDeclaration: + return visitNode(cbNode, (node).name); + + case SyntaxKind.NamespaceImport: + return visitNode(cbNode, (node).name); + case SyntaxKind.NamedImports: + case SyntaxKind.NamedExports: + return visitNodes(cbNode, cbNodes, (node).elements); + case SyntaxKind.ExportDeclaration: + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, (node).exportClause) || + visitNode(cbNode, (node).moduleSpecifier); + case SyntaxKind.ImportSpecifier: + case SyntaxKind.ExportSpecifier: + return visitNode(cbNode, (node).propertyName) || + visitNode(cbNode, (node).name); + case SyntaxKind.ExportAssignment: + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, (node).expression); + case SyntaxKind.TemplateExpression: + return visitNode(cbNode, (node).head) || visitNodes(cbNode, cbNodes, (node).templateSpans); + case SyntaxKind.TemplateSpan: + return visitNode(cbNode, (node).expression) || visitNode(cbNode, (node).literal); + case SyntaxKind.ComputedPropertyName: + return visitNode(cbNode, (node).expression); + case SyntaxKind.HeritageClause: + return visitNodes(cbNode, cbNodes, (node).types); + case SyntaxKind.ExpressionWithTypeArguments: + return visitNode(cbNode, (node).expression) || + visitNodes(cbNode, cbNodes, (node).typeArguments); + case SyntaxKind.ExternalModuleReference: + return visitNode(cbNode, (node).expression); + case SyntaxKind.MissingDeclaration: + return visitNodes(cbNode, cbNodes, node.decorators); + case SyntaxKind.CommaListExpression: + return visitNodes(cbNode, cbNodes, (node).elements); + + case SyntaxKind.JsxElement: + return visitNode(cbNode, (node).openingElement) || + visitNodes(cbNode, cbNodes, (node).children) || + visitNode(cbNode, (node).closingElement); + case SyntaxKind.JsxFragment: + return visitNode(cbNode, (node).openingFragment) || + visitNodes(cbNode, cbNodes, (node).children) || + visitNode(cbNode, (node).closingFragment); + case SyntaxKind.JsxSelfClosingElement: + case SyntaxKind.JsxOpeningElement: + return visitNode(cbNode, (node).tagName) || + visitNodes(cbNode, cbNodes, (node).typeArguments) || + visitNode(cbNode, (node).attributes); + case SyntaxKind.JsxAttributes: + return visitNodes(cbNode, cbNodes, (node).properties); + case SyntaxKind.JsxAttribute: + return visitNode(cbNode, (node).name) || + visitNode(cbNode, (node).initializer); + case SyntaxKind.JsxSpreadAttribute: + return visitNode(cbNode, (node).expression); + case SyntaxKind.JsxExpression: + return visitNode(cbNode, (node as JsxExpression).dotDotDotToken) || + visitNode(cbNode, (node as JsxExpression).expression); + case SyntaxKind.JsxClosingElement: + return visitNode(cbNode, (node).tagName); + + case SyntaxKind.OptionalType: + case SyntaxKind.RestType: + case SyntaxKind.JSDocTypeExpression: + case SyntaxKind.JSDocNonNullableType: + case SyntaxKind.JSDocNullableType: + case SyntaxKind.JSDocOptionalType: + case SyntaxKind.JSDocVariadicType: + return visitNode(cbNode, (node).type); + case SyntaxKind.JSDocFunctionType: + return visitNodes(cbNode, cbNodes, (node).parameters) || + visitNode(cbNode, (node).type); + case SyntaxKind.JSDocComment: + return visitNodes(cbNode, cbNodes, (node).tags); + case SyntaxKind.JSDocParameterTag: + case SyntaxKind.JSDocPropertyTag: + if ((node as JSDocPropertyLikeTag).isNameFirst) { + return visitNode(cbNode, (node).name) || + visitNode(cbNode, (node).typeExpression); + } + else { + return visitNode(cbNode, (node).typeExpression) || + visitNode(cbNode, (node).name); + } + case SyntaxKind.JSDocReturnTag: + return visitNode(cbNode, (node).typeExpression); + case SyntaxKind.JSDocTypeTag: + return visitNode(cbNode, (node).typeExpression); + case SyntaxKind.JSDocAugmentsTag: + return visitNode(cbNode, (node).class); + case SyntaxKind.JSDocTemplateTag: + return visitNode(cbNode, (node).constraint) || visitNodes(cbNode, cbNodes, (node).typeParameters); + case SyntaxKind.JSDocTypedefTag: + if ((node as JSDocTypedefTag).typeExpression && + (node as JSDocTypedefTag).typeExpression!.kind === SyntaxKind.JSDocTypeExpression) { + return visitNode(cbNode, (node).typeExpression) || + visitNode(cbNode, (node).fullName); + } + else { + return visitNode(cbNode, (node).fullName) || + visitNode(cbNode, (node).typeExpression); + } + case SyntaxKind.JSDocCallbackTag: + return visitNode(cbNode, (node as JSDocCallbackTag).fullName) || + visitNode(cbNode, (node as JSDocCallbackTag).typeExpression); + case SyntaxKind.JSDocThisTag: + return visitNode(cbNode, (node as JSDocThisTag).typeExpression); + case SyntaxKind.JSDocEnumTag: + return visitNode(cbNode, (node as JSDocEnumTag).typeExpression); + case SyntaxKind.JSDocSignature: + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + forEach((node).typeParameters, cbNode) || + forEach((node).parameters, cbNode) || + visitNode(cbNode, (node).type); + case SyntaxKind.JSDocTypeLiteral: + if ((node as JSDocTypeLiteral).jsDocPropertyTags) { + for (const tag of (node as JSDocTypeLiteral).jsDocPropertyTags!) { + visitNode(cbNode, tag); + } + } + return; + case SyntaxKind.PartiallyEmittedExpression: + return visitNode(cbNode, (node).expression); + } + } + + export function createSourceFile(fileName: string, sourceText: string, languageVersion: ScriptTarget, setParentNodes = false, scriptKind?: ScriptKind): SourceFile { + performance.mark("beforeParse"); + let result: SourceFile; + if (languageVersion === ScriptTarget.JSON) { + result = Parser.parseJsonText(fileName, sourceText, languageVersion, /*syntaxCursor*/ undefined, setParentNodes); + } + else { + result = Parser.parseSourceFile(fileName, sourceText, languageVersion, /*syntaxCursor*/ undefined, setParentNodes, scriptKind); + } + performance.mark("afterParse"); + performance.measure("Parse", "beforeParse", "afterParse"); + return result; + } + + export function parseIsolatedEntityName(text: string, languageVersion: ScriptTarget): EntityName | undefined { + return Parser.parseIsolatedEntityName(text, languageVersion); + } + + /** + * Parse json text into SyntaxTree and return node and parse errors if any + * @param fileName + * @param sourceText + */ + export function parseJsonText(fileName: string, sourceText: string): JsonSourceFile { + return Parser.parseJsonText(fileName, sourceText); + } + + // See also `isExternalOrCommonJsModule` in utilities.ts + export function isExternalModule(file: SourceFile): boolean { + return file.externalModuleIndicator !== undefined; + } + + // Produces a new SourceFile for the 'newText' provided. The 'textChangeRange' parameter + // indicates what changed between the 'text' that this SourceFile has and the 'newText'. + // The SourceFile will be created with the compiler attempting to reuse as many nodes from + // this file as possible. + // + // Note: this function mutates nodes from this SourceFile. That means any existing nodes + // from this SourceFile that are being held onto may change as a result (including + // becoming detached from any SourceFile). It is recommended that this SourceFile not + // be used once 'update' is called on it. + export function updateSourceFile(sourceFile: SourceFile, newText: string, textChangeRange: TextChangeRange, aggressiveChecks = false): SourceFile { + const newSourceFile = IncrementalParser.updateSourceFile(sourceFile, newText, textChangeRange, aggressiveChecks); + // Because new source file node is created, it may not have the flag PossiblyContainDynamicImport. This is the case if there is no new edit to add dynamic import. + // We will manually port the flag to the new source file. + newSourceFile.flags |= (sourceFile.flags & NodeFlags.PermanentlySetIncrementalFlags); + return newSourceFile; + } + + /* @internal */ + export function parseIsolatedJSDocComment(content: string, start?: number, length?: number) { + const result = Parser.JSDocParser.parseIsolatedJSDocComment(content, start, length); + if (result && result.jsDoc) { + // because the jsDocComment was parsed out of the source file, it might + // not be covered by the fixupParentReferences. + Parser.fixupParentReferences(result.jsDoc); + } + + return result; + } + + /* @internal */ + // Exposed only for testing. + export function parseJSDocTypeExpressionForTests(content: string, start?: number, length?: number) { + return Parser.JSDocParser.parseJSDocTypeExpressionForTests(content, start, length); + } + + // Implement the parser as a singleton module. We do this for perf reasons because creating + // parser instances can actually be expensive enough to impact us on projects with many source + // files. + namespace Parser { + // Share a single scanner across all calls to parse a source file. This helps speed things + // up by avoiding the cost of creating/compiling scanners over and over again. + const scanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ true); + const disallowInAndDecoratorContext = NodeFlags.DisallowInContext | NodeFlags.DecoratorContext; + + // capture constructors in 'initializeState' to avoid null checks + // tslint:disable variable-name + let NodeConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node; + let TokenConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node; + let IdentifierConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node; + let SourceFileConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node; + // tslint:enable variable-name + + let sourceFile: SourceFile; + let parseDiagnostics: DiagnosticWithLocation[]; + let syntaxCursor: IncrementalParser.SyntaxCursor | undefined; + + let currentToken: SyntaxKind; + let sourceText: string; + let nodeCount: number; + let identifiers: Map; + let identifierCount: number; + + let parsingContext: ParsingContext; + + // Flags that dictate what parsing context we're in. For example: + // Whether or not we are in strict parsing mode. All that changes in strict parsing mode is + // that some tokens that would be considered identifiers may be considered keywords. + // + // When adding more parser context flags, consider which is the more common case that the + // flag will be in. This should be the 'false' state for that flag. The reason for this is + // that we don't store data in our nodes unless the value is in the *non-default* state. So, + // for example, more often than code 'allows-in' (or doesn't 'disallow-in'). We opt for + // 'disallow-in' set to 'false'. Otherwise, if we had 'allowsIn' set to 'true', then almost + // all nodes would need extra state on them to store this info. + // + // Note: 'allowIn' and 'allowYield' track 1:1 with the [in] and [yield] concepts in the ES6 + // grammar specification. + // + // An important thing about these context concepts. By default they are effectively inherited + // while parsing through every grammar production. i.e. if you don't change them, then when + // you parse a sub-production, it will have the same context values as the parent production. + // This is great most of the time. After all, consider all the 'expression' grammar productions + // and how nearly all of them pass along the 'in' and 'yield' context values: + // + // EqualityExpression[In, Yield] : + // RelationalExpression[?In, ?Yield] + // EqualityExpression[?In, ?Yield] == RelationalExpression[?In, ?Yield] + // EqualityExpression[?In, ?Yield] != RelationalExpression[?In, ?Yield] + // EqualityExpression[?In, ?Yield] === RelationalExpression[?In, ?Yield] + // EqualityExpression[?In, ?Yield] !== RelationalExpression[?In, ?Yield] + // + // Where you have to be careful is then understanding what the points are in the grammar + // where the values are *not* passed along. For example: + // + // SingleNameBinding[Yield,GeneratorParameter] + // [+GeneratorParameter]BindingIdentifier[Yield] Initializer[In]opt + // [~GeneratorParameter]BindingIdentifier[?Yield]Initializer[In, ?Yield]opt + // + // Here this is saying that if the GeneratorParameter context flag is set, that we should + // explicitly set the 'yield' context flag to false before calling into the BindingIdentifier + // and we should explicitly unset the 'yield' context flag before calling into the Initializer. + // production. Conversely, if the GeneratorParameter context flag is not set, then we + // should leave the 'yield' context flag alone. + // + // Getting this all correct is tricky and requires careful reading of the grammar to + // understand when these values should be changed versus when they should be inherited. + // + // Note: it should not be necessary to save/restore these flags during speculative/lookahead + // parsing. These context flags are naturally stored and restored through normal recursive + // descent parsing and unwinding. + let contextFlags: NodeFlags; + + // Whether or not we've had a parse error since creating the last AST node. If we have + // encountered an error, it will be stored on the next AST node we create. Parse errors + // can be broken down into three categories: + // + // 1) An error that occurred during scanning. For example, an unterminated literal, or a + // character that was completely not understood. + // + // 2) A token was expected, but was not present. This type of error is commonly produced + // by the 'parseExpected' function. + // + // 3) A token was present that no parsing function was able to consume. This type of error + // only occurs in the 'abortParsingListOrMoveToNextToken' function when the parser + // decides to skip the token. + // + // In all of these cases, we want to mark the next node as having had an error before it. + // With this mark, we can know in incremental settings if this node can be reused, or if + // we have to reparse it. If we don't keep this information around, we may just reuse the + // node. in that event we would then not produce the same errors as we did before, causing + // significant confusion problems. + // + // Note: it is necessary that this value be saved/restored during speculative/lookahead + // parsing. During lookahead parsing, we will often create a node. That node will have + // this value attached, and then this value will be set back to 'false'. If we decide to + // rewind, we must get back to the same value we had prior to the lookahead. + // + // Note: any errors at the end of the file that do not precede a regular node, should get + // attached to the EOF token. + let parseErrorBeforeNextFinishedNode = false; + + export function parseSourceFile(fileName: string, sourceText: string, languageVersion: ScriptTarget, syntaxCursor: IncrementalParser.SyntaxCursor | undefined, setParentNodes = false, scriptKind?: ScriptKind): SourceFile { + scriptKind = ensureScriptKind(fileName, scriptKind); + if (scriptKind === ScriptKind.JSON) { + const result = parseJsonText(fileName, sourceText, languageVersion, syntaxCursor, setParentNodes); + convertToObjectWorker(result, result.parseDiagnostics, /*returnValue*/ false, /*knownRootOptions*/ undefined, /*jsonConversionNotifier*/ undefined); + result.typeReferenceDirectives = emptyArray; + result.amdDependencies = emptyArray; + return result; + } + + initializeState(sourceText, languageVersion, syntaxCursor, scriptKind); + + const result = parseSourceFileWorker(fileName, languageVersion, setParentNodes, scriptKind); + + clearState(); + + return result; + } + + export function parseIsolatedEntityName(content: string, languageVersion: ScriptTarget): EntityName | undefined { + // Choice of `isDeclarationFile` should be arbitrary + initializeState(content, languageVersion, /*syntaxCursor*/ undefined, ScriptKind.JS); + // Prime the scanner. + nextToken(); + const entityName = parseEntityName(/*allowReservedWords*/ true); + const isInvalid = token() === SyntaxKind.EndOfFileToken && !parseDiagnostics.length; + clearState(); + return isInvalid ? entityName : undefined; + } + + export function parseJsonText(fileName: string, sourceText: string, languageVersion: ScriptTarget = ScriptTarget.ES2015, syntaxCursor?: IncrementalParser.SyntaxCursor, setParentNodes?: boolean): JsonSourceFile { + initializeState(sourceText, languageVersion, syntaxCursor, ScriptKind.JSON); + // Set source file so that errors will be reported with this file name + sourceFile = createSourceFile(fileName, ScriptTarget.ES2015, ScriptKind.JSON, /*isDeclaration*/ false); + sourceFile.flags = contextFlags; + + // Prime the scanner. + nextToken(); + const pos = getNodePos(); + if (token() === SyntaxKind.EndOfFileToken) { + sourceFile.statements = createNodeArray([], pos, pos); + sourceFile.endOfFileToken = parseTokenNode(); + } + else { + const statement = createNode(SyntaxKind.ExpressionStatement) as JsonObjectExpressionStatement; + switch (token()) { + case SyntaxKind.OpenBracketToken: + statement.expression = parseArrayLiteralExpression(); + break; + case SyntaxKind.TrueKeyword: + case SyntaxKind.FalseKeyword: + case SyntaxKind.NullKeyword: + statement.expression = parseTokenNode(); + break; + case SyntaxKind.MinusToken: + if (lookAhead(() => nextToken() === SyntaxKind.NumericLiteral && nextToken() !== SyntaxKind.ColonToken)) { + statement.expression = parsePrefixUnaryExpression() as JsonMinusNumericLiteral; + } + else { + statement.expression = parseObjectLiteralExpression(); + } + break; + case SyntaxKind.NumericLiteral: + case SyntaxKind.StringLiteral: + if (lookAhead(() => nextToken() !== SyntaxKind.ColonToken)) { + statement.expression = parseLiteralNode() as StringLiteral | NumericLiteral; + break; + } + // falls through + default: + statement.expression = parseObjectLiteralExpression(); + break; + } + finishNode(statement); + sourceFile.statements = createNodeArray([statement], pos); + sourceFile.endOfFileToken = parseExpectedToken(SyntaxKind.EndOfFileToken, Diagnostics.Unexpected_token); + } + + if (setParentNodes) { + fixupParentReferences(sourceFile); + } + + sourceFile.parseDiagnostics = parseDiagnostics; + const result = sourceFile as JsonSourceFile; + clearState(); + return result; + } + + function getLanguageVariant(scriptKind: ScriptKind) { + // .tsx and .jsx files are treated as jsx language variant. + return scriptKind === ScriptKind.TSX || scriptKind === ScriptKind.JSX || scriptKind === ScriptKind.JS || scriptKind === ScriptKind.JSON ? LanguageVariant.JSX : LanguageVariant.Standard; + } + + function initializeState(_sourceText: string, languageVersion: ScriptTarget, _syntaxCursor: IncrementalParser.SyntaxCursor | undefined, scriptKind: ScriptKind) { + NodeConstructor = objectAllocator.getNodeConstructor(); + TokenConstructor = objectAllocator.getTokenConstructor(); + IdentifierConstructor = objectAllocator.getIdentifierConstructor(); + SourceFileConstructor = objectAllocator.getSourceFileConstructor(); + + sourceText = _sourceText; + syntaxCursor = _syntaxCursor; + + parseDiagnostics = []; + parsingContext = 0; + identifiers = createMap(); + identifierCount = 0; + nodeCount = 0; + + switch (scriptKind) { + case ScriptKind.JS: + case ScriptKind.JSX: + contextFlags = NodeFlags.JavaScriptFile; + break; + case ScriptKind.JSON: + contextFlags = NodeFlags.JavaScriptFile | NodeFlags.JsonFile; + break; + default: + contextFlags = NodeFlags.None; + break; + } + parseErrorBeforeNextFinishedNode = false; + + // Initialize and prime the scanner before parsing the source elements. + scanner.setText(sourceText); + scanner.setOnError(scanError); + scanner.setScriptTarget(languageVersion); + scanner.setLanguageVariant(getLanguageVariant(scriptKind)); + } + + function clearState() { + // Clear out the text the scanner is pointing at, so it doesn't keep anything alive unnecessarily. + scanner.setText(""); + scanner.setOnError(undefined); + + // Clear any data. We don't want to accidentally hold onto it for too long. + parseDiagnostics = undefined!; + sourceFile = undefined!; + identifiers = undefined!; + syntaxCursor = undefined; + sourceText = undefined!; + } + + function parseSourceFileWorker(fileName: string, languageVersion: ScriptTarget, setParentNodes: boolean, scriptKind: ScriptKind): SourceFile { + const isDeclarationFile = isDeclarationFileName(fileName); + if (isDeclarationFile) { + contextFlags |= NodeFlags.Ambient; + } + + sourceFile = createSourceFile(fileName, languageVersion, scriptKind, isDeclarationFile); + sourceFile.flags = contextFlags; + + // Prime the scanner. + nextToken(); + // A member of ReadonlyArray isn't assignable to a member of T[] (and prevents a direct cast) - but this is where we set up those members so they can be readonly in the future + processCommentPragmas(sourceFile as {} as PragmaContext, sourceText); + processPragmasIntoFields(sourceFile as {} as PragmaContext, reportPragmaDiagnostic); + + sourceFile.statements = parseList(ParsingContext.SourceElements, parseStatement); + Debug.assert(token() === SyntaxKind.EndOfFileToken); + sourceFile.endOfFileToken = addJSDocComment(parseTokenNode()); + + setExternalModuleIndicator(sourceFile); + + sourceFile.nodeCount = nodeCount; + sourceFile.identifierCount = identifierCount; + sourceFile.identifiers = identifiers; + sourceFile.parseDiagnostics = parseDiagnostics; + + if (setParentNodes) { + fixupParentReferences(sourceFile); + } + + return sourceFile; + + function reportPragmaDiagnostic(pos: number, end: number, diagnostic: DiagnosticMessage) { + parseDiagnostics.push(createFileDiagnostic(sourceFile, pos, end, diagnostic)); + } + } + + function addJSDocComment(node: T): T { + Debug.assert(!node.jsDoc); // Should only be called once per node + const jsDoc = mapDefined(getJSDocCommentRanges(node, sourceFile.text), comment => JSDocParser.parseJSDocComment(node, comment.pos, comment.end - comment.pos)); + if (jsDoc.length) node.jsDoc = jsDoc; + return node; + } + + export function fixupParentReferences(rootNode: Node) { + // normally parent references are set during binding. However, for clients that only need + // a syntax tree, and no semantic features, then the binding process is an unnecessary + // overhead. This functions allows us to set all the parents, without all the expense of + // binding. + + let parent: Node = rootNode; + forEachChild(rootNode, visitNode); + return; + + function visitNode(n: Node): void { + // walk down setting parents that differ from the parent we think it should be. This + // allows us to quickly bail out of setting parents for subtrees during incremental + // parsing + if (n.parent !== parent) { + n.parent = parent; + + const saveParent = parent; + parent = n; + forEachChild(n, visitNode); + if (hasJSDocNodes(n)) { + for (const jsDoc of n.jsDoc!) { + jsDoc.parent = n; + parent = jsDoc; + forEachChild(jsDoc, visitNode); + } + } + parent = saveParent; + } + } + } + + function createSourceFile(fileName: string, languageVersion: ScriptTarget, scriptKind: ScriptKind, isDeclarationFile: boolean): SourceFile { + // code from createNode is inlined here so createNode won't have to deal with special case of creating source files + // this is quite rare comparing to other nodes and createNode should be as fast as possible + const sourceFile = new SourceFileConstructor(SyntaxKind.SourceFile, /*pos*/ 0, /* end */ sourceText.length); + nodeCount++; + + sourceFile.text = sourceText; + sourceFile.bindDiagnostics = []; + sourceFile.bindSuggestionDiagnostics = undefined; + sourceFile.languageVersion = languageVersion; + sourceFile.fileName = normalizePath(fileName); + sourceFile.languageVariant = getLanguageVariant(scriptKind); + sourceFile.isDeclarationFile = isDeclarationFile; + sourceFile.scriptKind = scriptKind; + + return sourceFile; + } + + function setContextFlag(val: boolean, flag: NodeFlags) { + if (val) { + contextFlags |= flag; + } + else { + contextFlags &= ~flag; + } + } + + function setDisallowInContext(val: boolean) { + setContextFlag(val, NodeFlags.DisallowInContext); + } + + function setYieldContext(val: boolean) { + setContextFlag(val, NodeFlags.YieldContext); + } + + function setDecoratorContext(val: boolean) { + setContextFlag(val, NodeFlags.DecoratorContext); + } + + function setAwaitContext(val: boolean) { + setContextFlag(val, NodeFlags.AwaitContext); + } + + function doOutsideOfContext(context: NodeFlags, func: () => T): T { + // contextFlagsToClear will contain only the context flags that are + // currently set that we need to temporarily clear + // We don't just blindly reset to the previous flags to ensure + // that we do not mutate cached flags for the incremental + // parser (ThisNodeHasError, ThisNodeOrAnySubNodesHasError, and + // HasAggregatedChildData). + const contextFlagsToClear = context & contextFlags; + if (contextFlagsToClear) { + // clear the requested context flags + setContextFlag(/*val*/ false, contextFlagsToClear); + const result = func(); + // restore the context flags we just cleared + setContextFlag(/*val*/ true, contextFlagsToClear); + return result; + } + + // no need to do anything special as we are not in any of the requested contexts + return func(); + } + + function doInsideOfContext(context: NodeFlags, func: () => T): T { + // contextFlagsToSet will contain only the context flags that + // are not currently set that we need to temporarily enable. + // We don't just blindly reset to the previous flags to ensure + // that we do not mutate cached flags for the incremental + // parser (ThisNodeHasError, ThisNodeOrAnySubNodesHasError, and + // HasAggregatedChildData). + const contextFlagsToSet = context & ~contextFlags; + if (contextFlagsToSet) { + // set the requested context flags + setContextFlag(/*val*/ true, contextFlagsToSet); + const result = func(); + // reset the context flags we just set + setContextFlag(/*val*/ false, contextFlagsToSet); + return result; + } + + // no need to do anything special as we are already in all of the requested contexts + return func(); + } + + function allowInAnd(func: () => T): T { + return doOutsideOfContext(NodeFlags.DisallowInContext, func); + } + + function disallowInAnd(func: () => T): T { + return doInsideOfContext(NodeFlags.DisallowInContext, func); + } + + function doInYieldContext(func: () => T): T { + return doInsideOfContext(NodeFlags.YieldContext, func); + } + + function doInDecoratorContext(func: () => T): T { + return doInsideOfContext(NodeFlags.DecoratorContext, func); + } + + function doInAwaitContext(func: () => T): T { + return doInsideOfContext(NodeFlags.AwaitContext, func); + } + + function doOutsideOfAwaitContext(func: () => T): T { + return doOutsideOfContext(NodeFlags.AwaitContext, func); + } + + function doInYieldAndAwaitContext(func: () => T): T { + return doInsideOfContext(NodeFlags.YieldContext | NodeFlags.AwaitContext, func); + } + + function inContext(flags: NodeFlags) { + return (contextFlags & flags) !== 0; + } + + function inYieldContext() { + return inContext(NodeFlags.YieldContext); + } + + function inDisallowInContext() { + return inContext(NodeFlags.DisallowInContext); + } + + function inDecoratorContext() { + return inContext(NodeFlags.DecoratorContext); + } + + function inAwaitContext() { + return inContext(NodeFlags.AwaitContext); + } + + function parseErrorAtCurrentToken(message: DiagnosticMessage, arg0?: any): void { + parseErrorAt(scanner.getTokenPos(), scanner.getTextPos(), message, arg0); + } + + function parseErrorAtPosition(start: number, length: number, message: DiagnosticMessage, arg0?: any): void { + // Don't report another error if it would just be at the same position as the last error. + const lastError = lastOrUndefined(parseDiagnostics); + if (!lastError || start !== lastError.start) { + parseDiagnostics.push(createFileDiagnostic(sourceFile, start, length, message, arg0)); + } + + // Mark that we've encountered an error. We'll set an appropriate bit on the next + // node we finish so that it can't be reused incrementally. + parseErrorBeforeNextFinishedNode = true; + } + + function parseErrorAt(start: number, end: number, message: DiagnosticMessage, arg0?: any): void { + parseErrorAtPosition(start, end - start, message, arg0); + } + + function parseErrorAtRange(range: TextRange, message: DiagnosticMessage, arg0?: any): void { + parseErrorAt(range.pos, range.end, message, arg0); + } + + function scanError(message: DiagnosticMessage, length: number): void { + parseErrorAtPosition(scanner.getTextPos(), length, message); + } + + function getNodePos(): number { + return scanner.getStartPos(); + } + + // Use this function to access the current token instead of reading the currentToken + // variable. Since function results aren't narrowed in control flow analysis, this ensures + // that the type checker doesn't make wrong assumptions about the type of the current + // token (e.g. a call to nextToken() changes the current token but the checker doesn't + // reason about this side effect). Mainstream VMs inline simple functions like this, so + // there is no performance penalty. + function token(): SyntaxKind { + return currentToken; + } + + function nextToken(): SyntaxKind { + return currentToken = scanner.scan(); + } + + function reScanGreaterToken(): SyntaxKind { + return currentToken = scanner.reScanGreaterToken(); + } + + function reScanSlashToken(): SyntaxKind { + return currentToken = scanner.reScanSlashToken(); + } + + function reScanTemplateToken(): SyntaxKind { + return currentToken = scanner.reScanTemplateToken(); + } + + function scanJsxIdentifier(): SyntaxKind { + return currentToken = scanner.scanJsxIdentifier(); + } + + function scanJsxText(): SyntaxKind { + return currentToken = scanner.scanJsxToken(); + } + + function scanJsxAttributeValue(): SyntaxKind { + return currentToken = scanner.scanJsxAttributeValue(); + } + + function speculationHelper(callback: () => T, isLookAhead: boolean): T { + // Keep track of the state we'll need to rollback to if lookahead fails (or if the + // caller asked us to always reset our state). + const saveToken = currentToken; + const saveParseDiagnosticsLength = parseDiagnostics.length; + const saveParseErrorBeforeNextFinishedNode = parseErrorBeforeNextFinishedNode; + + // Note: it is not actually necessary to save/restore the context flags here. That's + // because the saving/restoring of these flags happens naturally through the recursive + // descent nature of our parser. However, we still store this here just so we can + // assert that invariant holds. + const saveContextFlags = contextFlags; + + // If we're only looking ahead, then tell the scanner to only lookahead as well. + // Otherwise, if we're actually speculatively parsing, then tell the scanner to do the + // same. + const result = isLookAhead + ? scanner.lookAhead(callback) + : scanner.tryScan(callback); + + Debug.assert(saveContextFlags === contextFlags); + + // If our callback returned something 'falsy' or we're just looking ahead, + // then unconditionally restore us to where we were. + if (!result || isLookAhead) { + currentToken = saveToken; + parseDiagnostics.length = saveParseDiagnosticsLength; + parseErrorBeforeNextFinishedNode = saveParseErrorBeforeNextFinishedNode; + } + + return result; + } + + /** Invokes the provided callback then unconditionally restores the parser to the state it + * was in immediately prior to invoking the callback. The result of invoking the callback + * is returned from this function. + */ + function lookAhead(callback: () => T): T { + return speculationHelper(callback, /*isLookAhead*/ true); + } + + /** Invokes the provided callback. If the callback returns something falsy, then it restores + * the parser to the state it was in immediately prior to invoking the callback. If the + * callback returns something truthy, then the parser state is not rolled back. The result + * of invoking the callback is returned from this function. + */ + function tryParse(callback: () => T): T { + return speculationHelper(callback, /*isLookAhead*/ false); + } + + // Ignore strict mode flag because we will report an error in type checker instead. + function isIdentifier(): boolean { + if (token() === SyntaxKind.Identifier) { + return true; + } + + // If we have a 'yield' keyword, and we're in the [yield] context, then 'yield' is + // considered a keyword and is not an identifier. + if (token() === SyntaxKind.YieldKeyword && inYieldContext()) { + return false; + } + + // If we have a 'await' keyword, and we're in the [Await] context, then 'await' is + // considered a keyword and is not an identifier. + if (token() === SyntaxKind.AwaitKeyword && inAwaitContext()) { + return false; + } + + return token() > SyntaxKind.LastReservedWord; + } + + function parseExpected(kind: SyntaxKind, diagnosticMessage?: DiagnosticMessage, shouldAdvance = true): boolean { + if (token() === kind) { + if (shouldAdvance) { + nextToken(); + } + return true; + } + + // Report specific message if provided with one. Otherwise, report generic fallback message. + if (diagnosticMessage) { + parseErrorAtCurrentToken(diagnosticMessage); + } + else { + parseErrorAtCurrentToken(Diagnostics._0_expected, tokenToString(kind)); + } + return false; + } + + function parseOptional(t: SyntaxKind): boolean { + if (token() === t) { + nextToken(); + return true; + } + return false; + } + + function parseOptionalToken(t: TKind): Token; + function parseOptionalToken(t: SyntaxKind): Node | undefined { + if (token() === t) { + return parseTokenNode(); + } + return undefined; + } + + function parseExpectedToken(t: TKind, diagnosticMessage?: DiagnosticMessage, arg0?: any): Token; + function parseExpectedToken(t: SyntaxKind, diagnosticMessage?: DiagnosticMessage, arg0?: any): Node { + return parseOptionalToken(t) || + createMissingNode(t, /*reportAtCurrentPosition*/ false, diagnosticMessage || Diagnostics._0_expected, arg0 || tokenToString(t)); + } + + function parseTokenNode(): T { + const node = createNode(token()); + nextToken(); + return finishNode(node); + } + + function canParseSemicolon() { + // If there's a real semicolon, then we can always parse it out. + if (token() === SyntaxKind.SemicolonToken) { + return true; + } + + // We can parse out an optional semicolon in ASI cases in the following cases. + return token() === SyntaxKind.CloseBraceToken || token() === SyntaxKind.EndOfFileToken || scanner.hasPrecedingLineBreak(); + } + + function parseSemicolon(): boolean { + if (canParseSemicolon()) { + if (token() === SyntaxKind.SemicolonToken) { + // consume the semicolon if it was explicitly provided. + nextToken(); + } + + return true; + } + else { + return parseExpected(SyntaxKind.SemicolonToken); + } + } + + function createNode(kind: SyntaxKind, pos?: number): Node { + nodeCount++; + const p = pos! >= 0 ? pos! : scanner.getStartPos(); + return isNodeKind(kind) || kind === SyntaxKind.Unknown ? new NodeConstructor(kind, p, p) : + kind === SyntaxKind.Identifier ? new IdentifierConstructor(kind, p, p) : + new TokenConstructor(kind, p, p); + } + + function createNodeWithJSDoc(kind: SyntaxKind, pos?: number): Node { + const node = createNode(kind, pos); + if (scanner.getTokenFlags() & TokenFlags.PrecedingJSDocComment) { + addJSDocComment(node); + } + return node; + } + + function createNodeArray(elements: T[], pos: number, end?: number): NodeArray { + // Since the element list of a node array is typically created by starting with an empty array and + // repeatedly calling push(), the list may not have the optimal memory layout. We invoke slice() for + // small arrays (1 to 4 elements) to give the VM a chance to allocate an optimal representation. + const length = elements.length; + const array = >(length >= 1 && length <= 4 ? elements.slice() : elements); + array.pos = pos; + array.end = end === undefined ? scanner.getStartPos() : end; + return array; + } + + function finishNode(node: T, end?: number): T { + node.end = end === undefined ? scanner.getStartPos() : end; + + if (contextFlags) { + node.flags |= contextFlags; + } + + // Keep track on the node if we encountered an error while parsing it. If we did, then + // we cannot reuse the node incrementally. Once we've marked this node, clear out the + // flag so that we don't mark any subsequent nodes. + if (parseErrorBeforeNextFinishedNode) { + parseErrorBeforeNextFinishedNode = false; + node.flags |= NodeFlags.ThisNodeHasError; + } + + return node; + } + + function createMissingNode(kind: T["kind"], reportAtCurrentPosition: boolean, diagnosticMessage: DiagnosticMessage, arg0?: any): T { + if (reportAtCurrentPosition) { + parseErrorAtPosition(scanner.getStartPos(), 0, diagnosticMessage, arg0); + } + else if (diagnosticMessage) { + parseErrorAtCurrentToken(diagnosticMessage, arg0); + } + + const result = createNode(kind); + + if (kind === SyntaxKind.Identifier) { + (result as Identifier).escapedText = "" as __String; + } + else if (isLiteralKind(kind) || isTemplateLiteralKind(kind)) { + (result as LiteralLikeNode).text = ""; + } + + return finishNode(result) as T; + } + + function internIdentifier(text: string): string { + let identifier = identifiers.get(text); + if (identifier === undefined) { + identifiers.set(text, identifier = text); + } + return identifier; + } + + // An identifier that starts with two underscores has an extra underscore character prepended to it to avoid issues + // with magic property names like '__proto__'. The 'identifiers' object is used to share a single string instance for + // each identifier in order to reduce memory consumption. + function createIdentifier(isIdentifier: boolean, diagnosticMessage?: DiagnosticMessage): Identifier { + identifierCount++; + if (isIdentifier) { + const node = createNode(SyntaxKind.Identifier); + + // Store original token kind if it is not just an Identifier so we can report appropriate error later in type checker + if (token() !== SyntaxKind.Identifier) { + node.originalKeywordKind = token(); + } + node.escapedText = escapeLeadingUnderscores(internIdentifier(scanner.getTokenValue())); + nextToken(); + return finishNode(node); + } + + // Only for end of file because the error gets reported incorrectly on embedded script tags. + const reportAtCurrentPosition = token() === SyntaxKind.EndOfFileToken; + + return createMissingNode(SyntaxKind.Identifier, reportAtCurrentPosition, diagnosticMessage || Diagnostics.Identifier_expected); + } + + function parseIdentifier(diagnosticMessage?: DiagnosticMessage): Identifier { + return createIdentifier(isIdentifier(), diagnosticMessage); + } + + function parseIdentifierName(diagnosticMessage?: DiagnosticMessage): Identifier { + return createIdentifier(tokenIsIdentifierOrKeyword(token()), diagnosticMessage); + } + + function isLiteralPropertyName(): boolean { + return tokenIsIdentifierOrKeyword(token()) || + token() === SyntaxKind.StringLiteral || + token() === SyntaxKind.NumericLiteral; + } + + function parsePropertyNameWorker(allowComputedPropertyNames: boolean): PropertyName { + if (token() === SyntaxKind.StringLiteral || token() === SyntaxKind.NumericLiteral) { + const node = parseLiteralNode(); + node.text = internIdentifier(node.text); + return node; + } + if (allowComputedPropertyNames && token() === SyntaxKind.OpenBracketToken) { + return parseComputedPropertyName(); + } + return parseIdentifierName(); + } + + function parsePropertyName(): PropertyName { + return parsePropertyNameWorker(/*allowComputedPropertyNames*/ true); + } + + function parseComputedPropertyName(): ComputedPropertyName { + // PropertyName [Yield]: + // LiteralPropertyName + // ComputedPropertyName[?Yield] + const node = createNode(SyntaxKind.ComputedPropertyName); + parseExpected(SyntaxKind.OpenBracketToken); + + // We parse any expression (including a comma expression). But the grammar + // says that only an assignment expression is allowed, so the grammar checker + // will error if it sees a comma expression. + node.expression = allowInAnd(parseExpression); + + parseExpected(SyntaxKind.CloseBracketToken); + return finishNode(node); + } + + function parseContextualModifier(t: SyntaxKind): boolean { + return token() === t && tryParse(nextTokenCanFollowModifier); + } + + function nextTokenIsOnSameLineAndCanFollowModifier() { + nextToken(); + if (scanner.hasPrecedingLineBreak()) { + return false; + } + return canFollowModifier(); + } + + function nextTokenCanFollowModifier() { + switch (token()) { + case SyntaxKind.ConstKeyword: + // 'const' is only a modifier if followed by 'enum'. + return nextToken() === SyntaxKind.EnumKeyword; + case SyntaxKind.ExportKeyword: + nextToken(); + if (token() === SyntaxKind.DefaultKeyword) { + return lookAhead(nextTokenCanFollowDefaultKeyword); + } + return token() !== SyntaxKind.AsteriskToken && token() !== SyntaxKind.AsKeyword && token() !== SyntaxKind.OpenBraceToken && canFollowModifier(); + case SyntaxKind.DefaultKeyword: + return nextTokenCanFollowDefaultKeyword(); + case SyntaxKind.StaticKeyword: + case SyntaxKind.GetKeyword: + case SyntaxKind.SetKeyword: + nextToken(); + return canFollowModifier(); + default: + return nextTokenIsOnSameLineAndCanFollowModifier(); + } + } + + function parseAnyContextualModifier(): boolean { + return isModifierKind(token()) && tryParse(nextTokenCanFollowModifier); + } + + function canFollowModifier(): boolean { + return token() === SyntaxKind.OpenBracketToken + || token() === SyntaxKind.OpenBraceToken + || token() === SyntaxKind.AsteriskToken + || token() === SyntaxKind.DotDotDotToken + || isLiteralPropertyName(); + } + + function nextTokenCanFollowDefaultKeyword(): boolean { + nextToken(); + return token() === SyntaxKind.ClassKeyword || token() === SyntaxKind.FunctionKeyword || + token() === SyntaxKind.InterfaceKeyword || + (token() === SyntaxKind.AbstractKeyword && lookAhead(nextTokenIsClassKeywordOnSameLine)) || + (token() === SyntaxKind.AsyncKeyword && lookAhead(nextTokenIsFunctionKeywordOnSameLine)); + } + + // True if positioned at the start of a list element + function isListElement(parsingContext: ParsingContext, inErrorRecovery: boolean): boolean { + const node = currentNode(parsingContext); + if (node) { + return true; + } + + switch (parsingContext) { + case ParsingContext.SourceElements: + case ParsingContext.BlockStatements: + case ParsingContext.SwitchClauseStatements: + // If we're in error recovery, then we don't want to treat ';' as an empty statement. + // The problem is that ';' can show up in far too many contexts, and if we see one + // and assume it's a statement, then we may bail out inappropriately from whatever + // we're parsing. For example, if we have a semicolon in the middle of a class, then + // we really don't want to assume the class is over and we're on a statement in the + // outer module. We just want to consume and move on. + return !(token() === SyntaxKind.SemicolonToken && inErrorRecovery) && isStartOfStatement(); + case ParsingContext.SwitchClauses: + return token() === SyntaxKind.CaseKeyword || token() === SyntaxKind.DefaultKeyword; + case ParsingContext.TypeMembers: + return lookAhead(isTypeMemberStart); + case ParsingContext.ClassMembers: + // We allow semicolons as class elements (as specified by ES6) as long as we're + // not in error recovery. If we're in error recovery, we don't want an errant + // semicolon to be treated as a class member (since they're almost always used + // for statements. + return lookAhead(isClassMemberStart) || (token() === SyntaxKind.SemicolonToken && !inErrorRecovery); + case ParsingContext.EnumMembers: + // Include open bracket computed properties. This technically also lets in indexers, + // which would be a candidate for improved error reporting. + return token() === SyntaxKind.OpenBracketToken || isLiteralPropertyName(); + case ParsingContext.ObjectLiteralMembers: + return token() === SyntaxKind.OpenBracketToken || token() === SyntaxKind.AsteriskToken || token() === SyntaxKind.DotDotDotToken || isLiteralPropertyName(); + case ParsingContext.RestProperties: + return isLiteralPropertyName(); + case ParsingContext.ObjectBindingElements: + return token() === SyntaxKind.OpenBracketToken || token() === SyntaxKind.DotDotDotToken || isLiteralPropertyName(); + case ParsingContext.HeritageClauseElement: + // If we see `{ ... }` then only consume it as an expression if it is followed by `,` or `{` + // That way we won't consume the body of a class in its heritage clause. + if (token() === SyntaxKind.OpenBraceToken) { + return lookAhead(isValidHeritageClauseObjectLiteral); + } + + if (!inErrorRecovery) { + return isStartOfLeftHandSideExpression() && !isHeritageClauseExtendsOrImplementsKeyword(); + } + else { + // If we're in error recovery we tighten up what we're willing to match. + // That way we don't treat something like "this" as a valid heritage clause + // element during recovery. + return isIdentifier() && !isHeritageClauseExtendsOrImplementsKeyword(); + } + case ParsingContext.VariableDeclarations: + return isIdentifierOrPattern(); + case ParsingContext.ArrayBindingElements: + return token() === SyntaxKind.CommaToken || token() === SyntaxKind.DotDotDotToken || isIdentifierOrPattern(); + case ParsingContext.TypeParameters: + return isIdentifier(); + case ParsingContext.ArrayLiteralMembers: + if (token() === SyntaxKind.CommaToken) { + return true; + } + // falls through + case ParsingContext.ArgumentExpressions: + return token() === SyntaxKind.DotDotDotToken || isStartOfExpression(); + case ParsingContext.Parameters: + return isStartOfParameter(/*isJSDocParameter*/ false); + case ParsingContext.JSDocParameters: + return isStartOfParameter(/*isJSDocParameter*/ true); + case ParsingContext.TypeArguments: + case ParsingContext.TupleElementTypes: + return token() === SyntaxKind.CommaToken || isStartOfType(); + case ParsingContext.HeritageClauses: + return isHeritageClause(); + case ParsingContext.ImportOrExportSpecifiers: + return tokenIsIdentifierOrKeyword(token()); + case ParsingContext.JsxAttributes: + return tokenIsIdentifierOrKeyword(token()) || token() === SyntaxKind.OpenBraceToken; + case ParsingContext.JsxChildren: + return true; + } + + return Debug.fail("Non-exhaustive case in 'isListElement'."); + } + + function isValidHeritageClauseObjectLiteral() { + Debug.assert(token() === SyntaxKind.OpenBraceToken); + if (nextToken() === SyntaxKind.CloseBraceToken) { + // if we see "extends {}" then only treat the {} as what we're extending (and not + // the class body) if we have: + // + // extends {} { + // extends {}, + // extends {} extends + // extends {} implements + + const next = nextToken(); + return next === SyntaxKind.CommaToken || next === SyntaxKind.OpenBraceToken || next === SyntaxKind.ExtendsKeyword || next === SyntaxKind.ImplementsKeyword; + } + + return true; + } + + function nextTokenIsIdentifier() { + nextToken(); + return isIdentifier(); + } + + function nextTokenIsIdentifierOrKeyword() { + nextToken(); + return tokenIsIdentifierOrKeyword(token()); + } + + function nextTokenIsIdentifierOrKeywordOrGreaterThan() { + nextToken(); + return tokenIsIdentifierOrKeywordOrGreaterThan(token()); + } + + function isHeritageClauseExtendsOrImplementsKeyword(): boolean { + if (token() === SyntaxKind.ImplementsKeyword || + token() === SyntaxKind.ExtendsKeyword) { + + return lookAhead(nextTokenIsStartOfExpression); + } + + return false; + } + + function nextTokenIsStartOfExpression() { + nextToken(); + return isStartOfExpression(); + } + + function nextTokenIsStartOfType() { + nextToken(); + return isStartOfType(); + } + + // True if positioned at a list terminator + function isListTerminator(kind: ParsingContext): boolean { + if (token() === SyntaxKind.EndOfFileToken) { + // Being at the end of the file ends all lists. + return true; + } + + switch (kind) { + case ParsingContext.BlockStatements: + case ParsingContext.SwitchClauses: + case ParsingContext.TypeMembers: + case ParsingContext.ClassMembers: + case ParsingContext.EnumMembers: + case ParsingContext.ObjectLiteralMembers: + case ParsingContext.ObjectBindingElements: + case ParsingContext.ImportOrExportSpecifiers: + return token() === SyntaxKind.CloseBraceToken; + case ParsingContext.SwitchClauseStatements: + return token() === SyntaxKind.CloseBraceToken || token() === SyntaxKind.CaseKeyword || token() === SyntaxKind.DefaultKeyword; + case ParsingContext.HeritageClauseElement: + return token() === SyntaxKind.OpenBraceToken || token() === SyntaxKind.ExtendsKeyword || token() === SyntaxKind.ImplementsKeyword; + case ParsingContext.VariableDeclarations: + return isVariableDeclaratorListTerminator(); + case ParsingContext.TypeParameters: + // Tokens other than '>' are here for better error recovery + return token() === SyntaxKind.GreaterThanToken || token() === SyntaxKind.OpenParenToken || token() === SyntaxKind.OpenBraceToken || token() === SyntaxKind.ExtendsKeyword || token() === SyntaxKind.ImplementsKeyword; + case ParsingContext.ArgumentExpressions: + // Tokens other than ')' are here for better error recovery + return token() === SyntaxKind.CloseParenToken || token() === SyntaxKind.SemicolonToken; + case ParsingContext.ArrayLiteralMembers: + case ParsingContext.TupleElementTypes: + case ParsingContext.ArrayBindingElements: + return token() === SyntaxKind.CloseBracketToken; + case ParsingContext.JSDocParameters: + case ParsingContext.Parameters: + case ParsingContext.RestProperties: + // Tokens other than ')' and ']' (the latter for index signatures) are here for better error recovery + return token() === SyntaxKind.CloseParenToken || token() === SyntaxKind.CloseBracketToken /*|| token === SyntaxKind.OpenBraceToken*/; + case ParsingContext.TypeArguments: + // All other tokens should cause the type-argument to terminate except comma token + return token() !== SyntaxKind.CommaToken; + case ParsingContext.HeritageClauses: + return token() === SyntaxKind.OpenBraceToken || token() === SyntaxKind.CloseBraceToken; + case ParsingContext.JsxAttributes: + return token() === SyntaxKind.GreaterThanToken || token() === SyntaxKind.SlashToken; + case ParsingContext.JsxChildren: + return token() === SyntaxKind.LessThanToken && lookAhead(nextTokenIsSlash); + default: + return false; + } + } + + function isVariableDeclaratorListTerminator(): boolean { + // If we can consume a semicolon (either explicitly, or with ASI), then consider us done + // with parsing the list of variable declarators. + if (canParseSemicolon()) { + return true; + } + + // in the case where we're parsing the variable declarator of a 'for-in' statement, we + // are done if we see an 'in' keyword in front of us. Same with for-of + if (isInOrOfKeyword(token())) { + return true; + } + + // ERROR RECOVERY TWEAK: + // For better error recovery, if we see an '=>' then we just stop immediately. We've got an + // arrow function here and it's going to be very unlikely that we'll resynchronize and get + // another variable declaration. + if (token() === SyntaxKind.EqualsGreaterThanToken) { + return true; + } + + // Keep trying to parse out variable declarators. + return false; + } + + // True if positioned at element or terminator of the current list or any enclosing list + function isInSomeParsingContext(): boolean { + for (let kind = 0; kind < ParsingContext.Count; kind++) { + if (parsingContext & (1 << kind)) { + if (isListElement(kind, /*inErrorRecovery*/ true) || isListTerminator(kind)) { + return true; + } + } + } + + return false; + } + + // Parses a list of elements + function parseList(kind: ParsingContext, parseElement: () => T): NodeArray { + const saveParsingContext = parsingContext; + parsingContext |= 1 << kind; + const list = []; + const listPos = getNodePos(); + + while (!isListTerminator(kind)) { + if (isListElement(kind, /*inErrorRecovery*/ false)) { + const element = parseListElement(kind, parseElement); + list.push(element); + + continue; + } + + if (abortParsingListOrMoveToNextToken(kind)) { + break; + } + } + + parsingContext = saveParsingContext; + return createNodeArray(list, listPos); + } + + function parseListElement(parsingContext: ParsingContext, parseElement: () => T): T { + const node = currentNode(parsingContext); + if (node) { + return consumeNode(node); + } + + return parseElement(); + } + + function currentNode(parsingContext: ParsingContext): Node | undefined { + // If there is an outstanding parse error that we've encountered, but not attached to + // some node, then we cannot get a node from the old source tree. This is because we + // want to mark the next node we encounter as being unusable. + // + // Note: This may be too conservative. Perhaps we could reuse the node and set the bit + // on it (or its leftmost child) as having the error. For now though, being conservative + // is nice and likely won't ever affect perf. + if (parseErrorBeforeNextFinishedNode) { + return undefined; + } + + if (!syntaxCursor) { + // if we don't have a cursor, we could never return a node from the old tree. + return undefined; + } + + const node = syntaxCursor.currentNode(scanner.getStartPos()); + + // Can't reuse a missing node. + if (nodeIsMissing(node)) { + return undefined; + } + + // Can't reuse a node that intersected the change range. + if (node.intersectsChange) { + return undefined; + } + + // Can't reuse a node that contains a parse error. This is necessary so that we + // produce the same set of errors again. + if (containsParseError(node)) { + return undefined; + } + + // We can only reuse a node if it was parsed under the same strict mode that we're + // currently in. i.e. if we originally parsed a node in non-strict mode, but then + // the user added 'using strict' at the top of the file, then we can't use that node + // again as the presence of strict mode may cause us to parse the tokens in the file + // differently. + // + // Note: we *can* reuse tokens when the strict mode changes. That's because tokens + // are unaffected by strict mode. It's just the parser will decide what to do with it + // differently depending on what mode it is in. + // + // This also applies to all our other context flags as well. + const nodeContextFlags = node.flags & NodeFlags.ContextFlags; + if (nodeContextFlags !== contextFlags) { + return undefined; + } + + // Ok, we have a node that looks like it could be reused. Now verify that it is valid + // in the current list parsing context that we're currently at. + if (!canReuseNode(node, parsingContext)) { + return undefined; + } + + if ((node as JSDocContainer).jsDocCache) { + // jsDocCache may include tags from parent nodes, which might have been modified. + (node as JSDocContainer).jsDocCache = undefined; + } + + return node; + } + + function consumeNode(node: Node) { + // Move the scanner so it is after the node we just consumed. + scanner.setTextPos(node.end); + nextToken(); + return node; + } + + function canReuseNode(node: Node, parsingContext: ParsingContext): boolean { + switch (parsingContext) { + case ParsingContext.ClassMembers: + return isReusableClassMember(node); + + case ParsingContext.SwitchClauses: + return isReusableSwitchClause(node); + + case ParsingContext.SourceElements: + case ParsingContext.BlockStatements: + case ParsingContext.SwitchClauseStatements: + return isReusableStatement(node); + + case ParsingContext.EnumMembers: + return isReusableEnumMember(node); + + case ParsingContext.TypeMembers: + return isReusableTypeMember(node); + + case ParsingContext.VariableDeclarations: + return isReusableVariableDeclaration(node); + + case ParsingContext.JSDocParameters: + case ParsingContext.Parameters: + return isReusableParameter(node); + + case ParsingContext.RestProperties: + return false; + + // Any other lists we do not care about reusing nodes in. But feel free to add if + // you can do so safely. Danger areas involve nodes that may involve speculative + // parsing. If speculative parsing is involved with the node, then the range the + // parser reached while looking ahead might be in the edited range (see the example + // in canReuseVariableDeclaratorNode for a good case of this). + case ParsingContext.HeritageClauses: + // This would probably be safe to reuse. There is no speculative parsing with + // heritage clauses. + + case ParsingContext.TypeParameters: + // This would probably be safe to reuse. There is no speculative parsing with + // type parameters. Note that that's because type *parameters* only occur in + // unambiguous *type* contexts. While type *arguments* occur in very ambiguous + // *expression* contexts. + + case ParsingContext.TupleElementTypes: + // This would probably be safe to reuse. There is no speculative parsing with + // tuple types. + + // Technically, type argument list types are probably safe to reuse. While + // speculative parsing is involved with them (since type argument lists are only + // produced from speculative parsing a < as a type argument list), we only have + // the types because speculative parsing succeeded. Thus, the lookahead never + // went past the end of the list and rewound. + case ParsingContext.TypeArguments: + + // Note: these are almost certainly not safe to ever reuse. Expressions commonly + // need a large amount of lookahead, and we should not reuse them as they may + // have actually intersected the edit. + case ParsingContext.ArgumentExpressions: + + // This is not safe to reuse for the same reason as the 'AssignmentExpression' + // cases. i.e. a property assignment may end with an expression, and thus might + // have lookahead far beyond it's old node. + case ParsingContext.ObjectLiteralMembers: + + // This is probably not safe to reuse. There can be speculative parsing with + // type names in a heritage clause. There can be generic names in the type + // name list, and there can be left hand side expressions (which can have type + // arguments.) + case ParsingContext.HeritageClauseElement: + + // Perhaps safe to reuse, but it's unlikely we'd see more than a dozen attributes + // on any given element. Same for children. + case ParsingContext.JsxAttributes: + case ParsingContext.JsxChildren: + + } + + return false; + } + + function isReusableClassMember(node: Node) { + if (node) { + switch (node.kind) { + case SyntaxKind.Constructor: + case SyntaxKind.IndexSignature: + case SyntaxKind.GetAccessor: + case SyntaxKind.SetAccessor: + case SyntaxKind.PropertyDeclaration: + case SyntaxKind.SemicolonClassElement: + return true; + case SyntaxKind.MethodDeclaration: + // Method declarations are not necessarily reusable. An object-literal + // may have a method calls "constructor(...)" and we must reparse that + // into an actual .ConstructorDeclaration. + const methodDeclaration = node; + const nameIsConstructor = methodDeclaration.name.kind === SyntaxKind.Identifier && + methodDeclaration.name.originalKeywordKind === SyntaxKind.ConstructorKeyword; + + return !nameIsConstructor; + } + } + + return false; + } + + function isReusableSwitchClause(node: Node) { + if (node) { + switch (node.kind) { + case SyntaxKind.CaseClause: + case SyntaxKind.DefaultClause: + return true; + } + } + + return false; + } + + function isReusableStatement(node: Node) { + if (node) { + switch (node.kind) { + case SyntaxKind.FunctionDeclaration: + case SyntaxKind.VariableStatement: + case SyntaxKind.Block: + case SyntaxKind.IfStatement: + case SyntaxKind.ExpressionStatement: + case SyntaxKind.ThrowStatement: + case SyntaxKind.ReturnStatement: + case SyntaxKind.SwitchStatement: + case SyntaxKind.BreakStatement: + case SyntaxKind.ContinueStatement: + case SyntaxKind.ForInStatement: + case SyntaxKind.ForOfStatement: + case SyntaxKind.ForStatement: + case SyntaxKind.WhileStatement: + case SyntaxKind.WithStatement: + case SyntaxKind.EmptyStatement: + case SyntaxKind.TryStatement: + case SyntaxKind.LabeledStatement: + case SyntaxKind.DoStatement: + case SyntaxKind.DebuggerStatement: + case SyntaxKind.ImportDeclaration: + case SyntaxKind.ImportEqualsDeclaration: + case SyntaxKind.ExportDeclaration: + case SyntaxKind.ExportAssignment: + case SyntaxKind.ModuleDeclaration: + case SyntaxKind.ClassDeclaration: + case SyntaxKind.InterfaceDeclaration: + case SyntaxKind.EnumDeclaration: + case SyntaxKind.TypeAliasDeclaration: + return true; + } + } + + return false; + } + + function isReusableEnumMember(node: Node) { + return node.kind === SyntaxKind.EnumMember; + } + + function isReusableTypeMember(node: Node) { + if (node) { + switch (node.kind) { + case SyntaxKind.ConstructSignature: + case SyntaxKind.MethodSignature: + case SyntaxKind.IndexSignature: + case SyntaxKind.PropertySignature: + case SyntaxKind.CallSignature: + return true; + } + } + + return false; + } + + function isReusableVariableDeclaration(node: Node) { + if (node.kind !== SyntaxKind.VariableDeclaration) { + return false; + } + + // Very subtle incremental parsing bug. Consider the following code: + // + // let v = new List < A, B + // + // This is actually legal code. It's a list of variable declarators "v = new List() + // + // then we have a problem. "v = new Listnode; + return variableDeclarator.initializer === undefined; + } + + function isReusableParameter(node: Node) { + if (node.kind !== SyntaxKind.Parameter) { + return false; + } + + // See the comment in isReusableVariableDeclaration for why we do this. + const parameter = node; + return parameter.initializer === undefined; + } + + // Returns true if we should abort parsing. + function abortParsingListOrMoveToNextToken(kind: ParsingContext) { + parseErrorAtCurrentToken(parsingContextErrors(kind)); + if (isInSomeParsingContext()) { + return true; + } + + nextToken(); + return false; + } + + function parsingContextErrors(context: ParsingContext): DiagnosticMessage { + switch (context) { + case ParsingContext.SourceElements: return Diagnostics.Declaration_or_statement_expected; + case ParsingContext.BlockStatements: return Diagnostics.Declaration_or_statement_expected; + case ParsingContext.SwitchClauses: return Diagnostics.case_or_default_expected; + case ParsingContext.SwitchClauseStatements: return Diagnostics.Statement_expected; + case ParsingContext.RestProperties: // fallthrough + case ParsingContext.TypeMembers: return Diagnostics.Property_or_signature_expected; + case ParsingContext.ClassMembers: return Diagnostics.Unexpected_token_A_constructor_method_accessor_or_property_was_expected; + case ParsingContext.EnumMembers: return Diagnostics.Enum_member_expected; + case ParsingContext.HeritageClauseElement: return Diagnostics.Expression_expected; + case ParsingContext.VariableDeclarations: return Diagnostics.Variable_declaration_expected; + case ParsingContext.ObjectBindingElements: return Diagnostics.Property_destructuring_pattern_expected; + case ParsingContext.ArrayBindingElements: return Diagnostics.Array_element_destructuring_pattern_expected; + case ParsingContext.ArgumentExpressions: return Diagnostics.Argument_expression_expected; + case ParsingContext.ObjectLiteralMembers: return Diagnostics.Property_assignment_expected; + case ParsingContext.ArrayLiteralMembers: return Diagnostics.Expression_or_comma_expected; + case ParsingContext.JSDocParameters: return Diagnostics.Parameter_declaration_expected; + case ParsingContext.Parameters: return Diagnostics.Parameter_declaration_expected; + case ParsingContext.TypeParameters: return Diagnostics.Type_parameter_declaration_expected; + case ParsingContext.TypeArguments: return Diagnostics.Type_argument_expected; + case ParsingContext.TupleElementTypes: return Diagnostics.Type_expected; + case ParsingContext.HeritageClauses: return Diagnostics.Unexpected_token_expected; + case ParsingContext.ImportOrExportSpecifiers: return Diagnostics.Identifier_expected; + case ParsingContext.JsxAttributes: return Diagnostics.Identifier_expected; + case ParsingContext.JsxChildren: return Diagnostics.Identifier_expected; + default: return undefined!; // TODO: GH#18217 `default: Debug.assertNever(context);` + } + } + + // Parses a comma-delimited list of elements + function parseDelimitedList(kind: ParsingContext, parseElement: () => T, considerSemicolonAsDelimiter?: boolean): NodeArray { + const saveParsingContext = parsingContext; + parsingContext |= 1 << kind; + const list = []; + const listPos = getNodePos(); + + let commaStart = -1; // Meaning the previous token was not a comma + while (true) { + if (isListElement(kind, /*inErrorRecovery*/ false)) { + const startPos = scanner.getStartPos(); + list.push(parseListElement(kind, parseElement)); + commaStart = scanner.getTokenPos(); + + if (parseOptional(SyntaxKind.CommaToken)) { + // No need to check for a zero length node since we know we parsed a comma + continue; + } + + commaStart = -1; // Back to the state where the last token was not a comma + if (isListTerminator(kind)) { + break; + } + + // We didn't get a comma, and the list wasn't terminated, explicitly parse + // out a comma so we give a good error message. + parseExpected(SyntaxKind.CommaToken); + + // If the token was a semicolon, and the caller allows that, then skip it and + // continue. This ensures we get back on track and don't result in tons of + // parse errors. For example, this can happen when people do things like use + // a semicolon to delimit object literal members. Note: we'll have already + // reported an error when we called parseExpected above. + if (considerSemicolonAsDelimiter && token() === SyntaxKind.SemicolonToken && !scanner.hasPrecedingLineBreak()) { + nextToken(); + } + if (startPos === scanner.getStartPos()) { + // What we're parsing isn't actually remotely recognizable as a element and we've consumed no tokens whatsoever + // Consume a token to advance the parser in some way and avoid an infinite loop + // This can happen when we're speculatively parsing parenthesized expressions which we think may be arrow functions, + // or when a modifier keyword which is disallowed as a parameter name (ie, `static` in strict mode) is supplied + nextToken(); + } + continue; + } + + if (isListTerminator(kind)) { + break; + } + + if (abortParsingListOrMoveToNextToken(kind)) { + break; + } + } + + parsingContext = saveParsingContext; + const result = createNodeArray(list, listPos); + // Recording the trailing comma is deliberately done after the previous + // loop, and not just if we see a list terminator. This is because the list + // may have ended incorrectly, but it is still important to know if there + // was a trailing comma. + // Check if the last token was a comma. + if (commaStart >= 0) { + // Always preserve a trailing comma by marking it on the NodeArray + result.hasTrailingComma = true; + } + return result; + } + + interface MissingList extends NodeArray { + isMissingList: true; + } + + function createMissingList(): MissingList { + const list = createNodeArray([], getNodePos()) as MissingList; + list.isMissingList = true; + return list; + } + + function isMissingList(arr: NodeArray): boolean { + return !!(arr as MissingList).isMissingList; + } + + function parseBracketedList(kind: ParsingContext, parseElement: () => T, open: SyntaxKind, close: SyntaxKind): NodeArray { + if (parseExpected(open)) { + const result = parseDelimitedList(kind, parseElement); + parseExpected(close); + return result; + } + + return createMissingList(); + } + + function parseEntityName(allowReservedWords: boolean, diagnosticMessage?: DiagnosticMessage): EntityName { + let entity: EntityName = allowReservedWords ? parseIdentifierName(diagnosticMessage) : parseIdentifier(diagnosticMessage); + let dotPos = scanner.getStartPos(); + while (parseOptional(SyntaxKind.DotToken)) { + if (token() === SyntaxKind.LessThanToken) { + // the entity is part of a JSDoc-style generic, so record the trailing dot for later error reporting + entity.jsdocDotPos = dotPos; + break; + } + dotPos = scanner.getStartPos(); + entity = createQualifiedName(entity, parseRightSideOfDot(allowReservedWords)); + } + return entity; + } + + function createQualifiedName(entity: EntityName, name: Identifier): QualifiedName { + const node = createNode(SyntaxKind.QualifiedName, entity.pos) as QualifiedName; + node.left = entity; + node.right = name; + return finishNode(node); + } + + function parseRightSideOfDot(allowIdentifierNames: boolean): Identifier { + // Technically a keyword is valid here as all identifiers and keywords are identifier names. + // However, often we'll encounter this in error situations when the identifier or keyword + // is actually starting another valid construct. + // + // So, we check for the following specific case: + // + // name. + // identifierOrKeyword identifierNameOrKeyword + // + // Note: the newlines are important here. For example, if that above code + // were rewritten into: + // + // name.identifierOrKeyword + // identifierNameOrKeyword + // + // Then we would consider it valid. That's because ASI would take effect and + // the code would be implicitly: "name.identifierOrKeyword; identifierNameOrKeyword". + // In the first case though, ASI will not take effect because there is not a + // line terminator after the identifier or keyword. + if (scanner.hasPrecedingLineBreak() && tokenIsIdentifierOrKeyword(token())) { + const matchesPattern = lookAhead(nextTokenIsIdentifierOrKeywordOnSameLine); + + if (matchesPattern) { + // Report that we need an identifier. However, report it right after the dot, + // and not on the next token. This is because the next token might actually + // be an identifier and the error would be quite confusing. + return createMissingNode(SyntaxKind.Identifier, /*reportAtCurrentPosition*/ true, Diagnostics.Identifier_expected); + } + } + + return allowIdentifierNames ? parseIdentifierName() : parseIdentifier(); + } + + function parseTemplateExpression(): TemplateExpression { + const template = createNode(SyntaxKind.TemplateExpression); + + template.head = parseTemplateHead(); + Debug.assert(template.head.kind === SyntaxKind.TemplateHead, "Template head has wrong token kind"); + + const list = []; + const listPos = getNodePos(); + + do { + list.push(parseTemplateSpan()); + } + while (last(list).literal.kind === SyntaxKind.TemplateMiddle); + + template.templateSpans = createNodeArray(list, listPos); + + return finishNode(template); + } + + function parseTemplateSpan(): TemplateSpan { + const span = createNode(SyntaxKind.TemplateSpan); + span.expression = allowInAnd(parseExpression); + + let literal: TemplateMiddle | TemplateTail; + if (token() === SyntaxKind.CloseBraceToken) { + reScanTemplateToken(); + literal = parseTemplateMiddleOrTemplateTail(); + } + else { + literal = parseExpectedToken(SyntaxKind.TemplateTail, Diagnostics._0_expected, tokenToString(SyntaxKind.CloseBraceToken)); + } + + span.literal = literal; + return finishNode(span); + } + + function parseLiteralNode(): LiteralExpression { + return parseLiteralLikeNode(token()); + } + + function parseTemplateHead(): TemplateHead { + const fragment = parseLiteralLikeNode(token()); + Debug.assert(fragment.kind === SyntaxKind.TemplateHead, "Template head has wrong token kind"); + return fragment; + } + + function parseTemplateMiddleOrTemplateTail(): TemplateMiddle | TemplateTail { + const fragment = parseLiteralLikeNode(token()); + Debug.assert(fragment.kind === SyntaxKind.TemplateMiddle || fragment.kind === SyntaxKind.TemplateTail, "Template fragment has wrong token kind"); + return fragment; + } + + function parseLiteralLikeNode(kind: SyntaxKind): LiteralExpression | LiteralLikeNode { + const node = createNode(kind); + const text = scanner.getTokenValue(); + node.text = text; + + if (scanner.hasExtendedUnicodeEscape()) { + node.hasExtendedUnicodeEscape = true; + } + + if (scanner.isUnterminated()) { + node.isUnterminated = true; + } + + // Octal literals are not allowed in strict mode or ES5 + // Note that theoretically the following condition would hold true literals like 009, + // which is not octal.But because of how the scanner separates the tokens, we would + // never get a token like this. Instead, we would get 00 and 9 as two separate tokens. + // We also do not need to check for negatives because any prefix operator would be part of a + // parent unary expression. + if (node.kind === SyntaxKind.NumericLiteral) { + (node).numericLiteralFlags = scanner.getTokenFlags() & TokenFlags.NumericLiteralFlags; + } + + nextToken(); + finishNode(node); + + return node; + } + + // TYPES + + function parseTypeReference(): TypeReferenceNode { + const node = createNode(SyntaxKind.TypeReference); + node.typeName = parseEntityName(/*allowReservedWords*/ true, Diagnostics.Type_expected); + if (!scanner.hasPrecedingLineBreak() && token() === SyntaxKind.LessThanToken) { + node.typeArguments = parseBracketedList(ParsingContext.TypeArguments, parseType, SyntaxKind.LessThanToken, SyntaxKind.GreaterThanToken); + } + return finishNode(node); + } + + // If true, we should abort parsing an error function. + function typeHasArrowFunctionBlockingParseError(node: TypeNode): boolean { + switch (node.kind) { + case SyntaxKind.TypeReference: + return nodeIsMissing((node as TypeReferenceNode).typeName); + case SyntaxKind.FunctionType: + case SyntaxKind.ConstructorType: { + const { parameters, type } = node as FunctionOrConstructorTypeNode; + return isMissingList(parameters) || typeHasArrowFunctionBlockingParseError(type); + } + case SyntaxKind.ParenthesizedType: + return typeHasArrowFunctionBlockingParseError((node as ParenthesizedTypeNode).type); + default: + return false; + } + } + + function parseThisTypePredicate(lhs: ThisTypeNode): TypePredicateNode { + nextToken(); + const node = createNode(SyntaxKind.TypePredicate, lhs.pos) as TypePredicateNode; + node.parameterName = lhs; + node.type = parseType(); + return finishNode(node); + } + + function parseThisTypeNode(): ThisTypeNode { + const node = createNode(SyntaxKind.ThisType) as ThisTypeNode; + nextToken(); + return finishNode(node); + } + + function parseJSDocAllType(postFixEquals: boolean): JSDocAllType | JSDocOptionalType { + const result = createNode(SyntaxKind.JSDocAllType) as JSDocAllType; + if (postFixEquals) { + return createPostfixType(SyntaxKind.JSDocOptionalType, result) as JSDocOptionalType; + } + else { + nextToken(); + } + return finishNode(result); + } + + function parseJSDocNonNullableType(): TypeNode { + const result = createNode(SyntaxKind.JSDocNonNullableType) as JSDocNonNullableType; + nextToken(); + result.type = parseNonArrayType(); + return finishNode(result); + } + + function parseJSDocUnknownOrNullableType(): JSDocUnknownType | JSDocNullableType { + const pos = scanner.getStartPos(); + // skip the ? + nextToken(); + + // Need to lookahead to decide if this is a nullable or unknown type. + + // Here are cases where we'll pick the unknown type: + // + // Foo(?, + // { a: ? } + // Foo(?) + // Foo + // Foo(?= + // (?| + if (token() === SyntaxKind.CommaToken || + token() === SyntaxKind.CloseBraceToken || + token() === SyntaxKind.CloseParenToken || + token() === SyntaxKind.GreaterThanToken || + token() === SyntaxKind.EqualsToken || + token() === SyntaxKind.BarToken) { + + const result = createNode(SyntaxKind.JSDocUnknownType, pos); + return finishNode(result); + } + else { + const result = createNode(SyntaxKind.JSDocNullableType, pos); + result.type = parseType(); + return finishNode(result); + } + } + + function parseJSDocFunctionType(): JSDocFunctionType | TypeReferenceNode { + if (lookAhead(nextTokenIsOpenParen)) { + const result = createNodeWithJSDoc(SyntaxKind.JSDocFunctionType); + nextToken(); + fillSignature(SyntaxKind.ColonToken, SignatureFlags.Type | SignatureFlags.JSDoc, result); + return finishNode(result); + } + const node = createNode(SyntaxKind.TypeReference); + node.typeName = parseIdentifierName(); + return finishNode(node); + } + + function parseJSDocParameter(): ParameterDeclaration { + const parameter = createNode(SyntaxKind.Parameter) as ParameterDeclaration; + if (token() === SyntaxKind.ThisKeyword || token() === SyntaxKind.NewKeyword) { + parameter.name = parseIdentifierName(); + parseExpected(SyntaxKind.ColonToken); + } + parameter.type = parseJSDocType(); + return finishNode(parameter); + } + + function parseJSDocType(): TypeNode { + const dotdotdot = parseOptionalToken(SyntaxKind.DotDotDotToken); + let type = parseTypeOrTypePredicate(); + if (dotdotdot) { + const variadic = createNode(SyntaxKind.JSDocVariadicType, dotdotdot.pos) as JSDocVariadicType; + variadic.type = type; + type = finishNode(variadic); + } + if (token() === SyntaxKind.EqualsToken) { + return createPostfixType(SyntaxKind.JSDocOptionalType, type); + } + return type; + } + + function parseTypeQuery(): TypeQueryNode { + const node = createNode(SyntaxKind.TypeQuery); + parseExpected(SyntaxKind.TypeOfKeyword); + node.exprName = parseEntityName(/*allowReservedWords*/ true); + return finishNode(node); + } + + function parseTypeParameter(): TypeParameterDeclaration { + const node = createNode(SyntaxKind.TypeParameter); + node.name = parseIdentifier(); + if (parseOptional(SyntaxKind.ExtendsKeyword)) { + // It's not uncommon for people to write improper constraints to a generic. If the + // user writes a constraint that is an expression and not an actual type, then parse + // it out as an expression (so we can recover well), but report that a type is needed + // instead. + if (isStartOfType() || !isStartOfExpression()) { + node.constraint = parseType(); + } + else { + // It was not a type, and it looked like an expression. Parse out an expression + // here so we recover well. Note: it is important that we call parseUnaryExpression + // and not parseExpression here. If the user has: + // + // + // + // We do *not* want to consume the `>` as we're consuming the expression for "". + node.expression = parseUnaryExpressionOrHigher(); + } + } + + if (parseOptional(SyntaxKind.EqualsToken)) { + node.default = parseType(); + } + + return finishNode(node); + } + + function parseTypeParameters(): NodeArray | undefined { + if (token() === SyntaxKind.LessThanToken) { + return parseBracketedList(ParsingContext.TypeParameters, parseTypeParameter, SyntaxKind.LessThanToken, SyntaxKind.GreaterThanToken); + } + } + + function parseParameterType(): TypeNode | undefined { + if (parseOptional(SyntaxKind.ColonToken)) { + return parseType(); + } + + return undefined; + } + + function isStartOfParameter(isJSDocParameter: boolean): boolean { + return token() === SyntaxKind.DotDotDotToken || + isIdentifierOrPattern() || + isModifierKind(token()) || + token() === SyntaxKind.AtToken || + isStartOfType(/*inStartOfParameter*/ !isJSDocParameter); + } + + function parseParameter(): ParameterDeclaration { + const node = createNodeWithJSDoc(SyntaxKind.Parameter); + if (token() === SyntaxKind.ThisKeyword) { + node.name = createIdentifier(/*isIdentifier*/ true); + node.type = parseParameterType(); + return finishNode(node); + } + + node.decorators = parseDecorators(); + node.modifiers = parseModifiers(); + node.dotDotDotToken = parseOptionalToken(SyntaxKind.DotDotDotToken); + + // FormalParameter [Yield,Await]: + // BindingElement[?Yield,?Await] + node.name = parseIdentifierOrPattern(); + if (getFullWidth(node.name) === 0 && !hasModifiers(node) && isModifierKind(token())) { + // in cases like + // 'use strict' + // function foo(static) + // isParameter('static') === true, because of isModifier('static') + // however 'static' is not a legal identifier in a strict mode. + // so result of this function will be ParameterDeclaration (flags = 0, name = missing, type = undefined, initializer = undefined) + // and current token will not change => parsing of the enclosing parameter list will last till the end of time (or OOM) + // to avoid this we'll advance cursor to the next token. + nextToken(); + } + + node.questionToken = parseOptionalToken(SyntaxKind.QuestionToken); + node.type = parseParameterType(); + node.initializer = parseInitializer(); + + return finishNode(node); + } + + /** + * Note: If returnToken is EqualsGreaterThanToken, `signature.type` will always be defined. + * @returns - If return type parsing succeeds + */ + function fillSignature( + returnToken: SyntaxKind.ColonToken | SyntaxKind.EqualsGreaterThanToken, + flags: SignatureFlags, + signature: SignatureDeclaration): boolean { + if (!(flags & SignatureFlags.JSDoc)) { + signature.typeParameters = parseTypeParameters(); + } + const parametersParsedSuccessfully = parseParameterList(signature, flags); + if (shouldParseReturnType(returnToken, !!(flags & SignatureFlags.Type))) { + signature.type = parseTypeOrTypePredicate(); + if (typeHasArrowFunctionBlockingParseError(signature.type)) return false; + } + return parametersParsedSuccessfully; + } + + function shouldParseReturnType(returnToken: SyntaxKind.ColonToken | SyntaxKind.EqualsGreaterThanToken, isType: boolean): boolean { + if (returnToken === SyntaxKind.EqualsGreaterThanToken) { + parseExpected(returnToken); + return true; + } + else if (parseOptional(SyntaxKind.ColonToken)) { + return true; + } + else if (isType && token() === SyntaxKind.EqualsGreaterThanToken) { + // This is easy to get backward, especially in type contexts, so parse the type anyway + parseErrorAtCurrentToken(Diagnostics._0_expected, tokenToString(SyntaxKind.ColonToken)); + nextToken(); + return true; + } + return false; + } + + // Returns true on success. + function parseParameterList(signature: SignatureDeclaration, flags: SignatureFlags): boolean { + // FormalParameters [Yield,Await]: (modified) + // [empty] + // FormalParameterList[?Yield,Await] + // + // FormalParameter[Yield,Await]: (modified) + // BindingElement[?Yield,Await] + // + // BindingElement [Yield,Await]: (modified) + // SingleNameBinding[?Yield,?Await] + // BindingPattern[?Yield,?Await]Initializer [In, ?Yield,?Await] opt + // + // SingleNameBinding [Yield,Await]: + // BindingIdentifier[?Yield,?Await]Initializer [In, ?Yield,?Await] opt + if (!parseExpected(SyntaxKind.OpenParenToken)) { + signature.parameters = createMissingList(); + return false; + } + + const savedYieldContext = inYieldContext(); + const savedAwaitContext = inAwaitContext(); + + setYieldContext(!!(flags & SignatureFlags.Yield)); + setAwaitContext(!!(flags & SignatureFlags.Await)); + + signature.parameters = flags & SignatureFlags.JSDoc ? + parseDelimitedList(ParsingContext.JSDocParameters, parseJSDocParameter) : + parseDelimitedList(ParsingContext.Parameters, parseParameter); + + setYieldContext(savedYieldContext); + setAwaitContext(savedAwaitContext); + + return parseExpected(SyntaxKind.CloseParenToken); + } + + function parseTypeMemberSemicolon() { + // We allow type members to be separated by commas or (possibly ASI) semicolons. + // First check if it was a comma. If so, we're done with the member. + if (parseOptional(SyntaxKind.CommaToken)) { + return; + } + + // Didn't have a comma. We must have a (possible ASI) semicolon. + parseSemicolon(); + } + + function parseSignatureMember(kind: SyntaxKind.CallSignature | SyntaxKind.ConstructSignature): CallSignatureDeclaration | ConstructSignatureDeclaration { + const node = createNodeWithJSDoc(kind); + if (kind === SyntaxKind.ConstructSignature) { + parseExpected(SyntaxKind.NewKeyword); + } + fillSignature(SyntaxKind.ColonToken, SignatureFlags.Type, node); + parseTypeMemberSemicolon(); + return finishNode(node); + } + + function isIndexSignature(): boolean { + return token() === SyntaxKind.OpenBracketToken && lookAhead(isUnambiguouslyIndexSignature); + } + + function isUnambiguouslyIndexSignature() { + // The only allowed sequence is: + // + // [id: + // + // However, for error recovery, we also check the following cases: + // + // [... + // [id, + // [id?, + // [id?: + // [id?] + // [public id + // [private id + // [protected id + // [] + // + nextToken(); + if (token() === SyntaxKind.DotDotDotToken || token() === SyntaxKind.CloseBracketToken) { + return true; + } + + if (isModifierKind(token())) { + nextToken(); + if (isIdentifier()) { + return true; + } + } + else if (!isIdentifier()) { + return false; + } + else { + // Skip the identifier + nextToken(); + } + + // A colon signifies a well formed indexer + // A comma should be a badly formed indexer because comma expressions are not allowed + // in computed properties. + if (token() === SyntaxKind.ColonToken || token() === SyntaxKind.CommaToken) { + return true; + } + + // Question mark could be an indexer with an optional property, + // or it could be a conditional expression in a computed property. + if (token() !== SyntaxKind.QuestionToken) { + return false; + } + + // If any of the following tokens are after the question mark, it cannot + // be a conditional expression, so treat it as an indexer. + nextToken(); + return token() === SyntaxKind.ColonToken || token() === SyntaxKind.CommaToken || token() === SyntaxKind.CloseBracketToken; + } + + function parseIndexSignatureDeclaration(node: IndexSignatureDeclaration): IndexSignatureDeclaration { + node.kind = SyntaxKind.IndexSignature; + node.parameters = parseBracketedList(ParsingContext.Parameters, parseParameter, SyntaxKind.OpenBracketToken, SyntaxKind.CloseBracketToken); + node.type = parseTypeAnnotation(); + parseTypeMemberSemicolon(); + return finishNode(node); + } + + function parsePropertyOrMethodSignature(node: PropertySignature | MethodSignature): PropertySignature | MethodSignature { + node.name = parsePropertyName(); + node.questionToken = parseOptionalToken(SyntaxKind.QuestionToken); + if (token() === SyntaxKind.OpenParenToken || token() === SyntaxKind.LessThanToken) { + node.kind = SyntaxKind.MethodSignature; + // Method signatures don't exist in expression contexts. So they have neither + // [Yield] nor [Await] + fillSignature(SyntaxKind.ColonToken, SignatureFlags.Type, node); + } + else { + node.kind = SyntaxKind.PropertySignature; + node.type = parseTypeAnnotation(); + if (token() === SyntaxKind.EqualsToken) { + // Although type literal properties cannot not have initializers, we attempt + // to parse an initializer so we can report in the checker that an interface + // property or type literal property cannot have an initializer. + (node).initializer = parseInitializer(); + } + } + parseTypeMemberSemicolon(); + return finishNode(node); + } + + function isTypeMemberStart(): boolean { + // Return true if we have the start of a signature member + if (token() === SyntaxKind.OpenParenToken || token() === SyntaxKind.LessThanToken) { + return true; + } + let idToken = false; + // Eat up all modifiers, but hold on to the last one in case it is actually an identifier + while (isModifierKind(token())) { + idToken = true; + nextToken(); + } + // Index signatures and computed property names are type members + if (token() === SyntaxKind.OpenBracketToken) { + return true; + } + // Try to get the first property-like token following all modifiers + if (isLiteralPropertyName()) { + idToken = true; + nextToken(); + } + // If we were able to get any potential identifier, check that it is + // the start of a member declaration + if (idToken) { + return token() === SyntaxKind.OpenParenToken || + token() === SyntaxKind.LessThanToken || + token() === SyntaxKind.QuestionToken || + token() === SyntaxKind.ColonToken || + token() === SyntaxKind.CommaToken || + canParseSemicolon(); + } + return false; + } + + function parseTypeMember(): TypeElement { + if (token() === SyntaxKind.OpenParenToken || token() === SyntaxKind.LessThanToken) { + return parseSignatureMember(SyntaxKind.CallSignature); + } + if (token() === SyntaxKind.NewKeyword && lookAhead(nextTokenIsOpenParenOrLessThan)) { + return parseSignatureMember(SyntaxKind.ConstructSignature); + } + const node = createNodeWithJSDoc(SyntaxKind.Unknown); + node.modifiers = parseModifiers(); + if (isIndexSignature()) { + return parseIndexSignatureDeclaration(node); + } + return parsePropertyOrMethodSignature(node); + } + + function nextTokenIsOpenParenOrLessThan() { + nextToken(); + return token() === SyntaxKind.OpenParenToken || token() === SyntaxKind.LessThanToken; + } + + function nextTokenIsDot() { + return nextToken() === SyntaxKind.DotToken; + } + + function nextTokenIsOpenParenOrLessThanOrDot() { + switch (nextToken()) { + case SyntaxKind.OpenParenToken: + case SyntaxKind.LessThanToken: + case SyntaxKind.DotToken: + return true; + } + return false; + } + + function parseTypeLiteral(): TypeLiteralNode { + const node = createNode(SyntaxKind.TypeLiteral); + node.members = parseObjectTypeMembers(); + return finishNode(node); + } + + function parseObjectTypeMembers(): NodeArray { + let members: NodeArray; + if (parseExpected(SyntaxKind.OpenBraceToken)) { + members = parseList(ParsingContext.TypeMembers, parseTypeMember); + parseExpected(SyntaxKind.CloseBraceToken); + } + else { + members = createMissingList(); + } + + return members; + } + + function isStartOfMappedType() { + nextToken(); + if (token() === SyntaxKind.PlusToken || token() === SyntaxKind.MinusToken) { + return nextToken() === SyntaxKind.ReadonlyKeyword; + } + if (token() === SyntaxKind.ReadonlyKeyword) { + nextToken(); + } + return token() === SyntaxKind.OpenBracketToken && nextTokenIsIdentifier() && nextToken() === SyntaxKind.InKeyword; + } + + function parseMappedTypeParameter() { + const node = createNode(SyntaxKind.TypeParameter); + node.name = parseIdentifier(); + parseExpected(SyntaxKind.InKeyword); + node.constraint = parseType(); + return finishNode(node); + } + + function parseMappedType() { + const node = createNode(SyntaxKind.MappedType); + parseExpected(SyntaxKind.OpenBraceToken); + if (token() === SyntaxKind.ReadonlyKeyword || token() === SyntaxKind.PlusToken || token() === SyntaxKind.MinusToken) { + node.readonlyToken = parseTokenNode(); + if (node.readonlyToken.kind !== SyntaxKind.ReadonlyKeyword) { + parseExpectedToken(SyntaxKind.ReadonlyKeyword); + } + } + parseExpected(SyntaxKind.OpenBracketToken); + node.typeParameter = parseMappedTypeParameter(); + parseExpected(SyntaxKind.CloseBracketToken); + if (token() === SyntaxKind.QuestionToken || token() === SyntaxKind.PlusToken || token() === SyntaxKind.MinusToken) { + node.questionToken = parseTokenNode(); + if (node.questionToken.kind !== SyntaxKind.QuestionToken) { + parseExpectedToken(SyntaxKind.QuestionToken); + } + } + node.type = parseTypeAnnotation(); + parseSemicolon(); + parseExpected(SyntaxKind.CloseBraceToken); + return finishNode(node); + } + + function parseTupleElementType() { + const pos = getNodePos(); + if (parseOptional(SyntaxKind.DotDotDotToken)) { + const node = createNode(SyntaxKind.RestType, pos); + node.type = parseType(); + return finishNode(node); + } + const type = parseType(); + if (!(contextFlags & NodeFlags.JSDoc) && type.kind === SyntaxKind.JSDocNullableType && type.pos === (type).type.pos) { + type.kind = SyntaxKind.OptionalType; + } + return type; + } + + function parseTupleType(): TupleTypeNode { + const node = createNode(SyntaxKind.TupleType); + node.elementTypes = parseBracketedList(ParsingContext.TupleElementTypes, parseTupleElementType, SyntaxKind.OpenBracketToken, SyntaxKind.CloseBracketToken); + return finishNode(node); + } + + function parseParenthesizedType(): TypeNode { + const node = createNode(SyntaxKind.ParenthesizedType); + parseExpected(SyntaxKind.OpenParenToken); + node.type = parseType(); + parseExpected(SyntaxKind.CloseParenToken); + return finishNode(node); + } + + function parseFunctionOrConstructorType(): TypeNode { + const pos = getNodePos(); + const kind = parseOptional(SyntaxKind.NewKeyword) ? SyntaxKind.ConstructorType : SyntaxKind.FunctionType; + const node = createNodeWithJSDoc(kind, pos); + fillSignature(SyntaxKind.EqualsGreaterThanToken, SignatureFlags.Type, node); + return finishNode(node); + } + + function parseKeywordAndNoDot(): TypeNode | undefined { + const node = parseTokenNode(); + return token() === SyntaxKind.DotToken ? undefined : node; + } + + function parseLiteralTypeNode(negative?: boolean): LiteralTypeNode { + const node = createNode(SyntaxKind.LiteralType) as LiteralTypeNode; + let unaryMinusExpression!: PrefixUnaryExpression; + if (negative) { + unaryMinusExpression = createNode(SyntaxKind.PrefixUnaryExpression) as PrefixUnaryExpression; + unaryMinusExpression.operator = SyntaxKind.MinusToken; + nextToken(); + } + let expression: BooleanLiteral | LiteralExpression | PrefixUnaryExpression = token() === SyntaxKind.TrueKeyword || token() === SyntaxKind.FalseKeyword + ? parseTokenNode() + : parseLiteralLikeNode(token()) as LiteralExpression; + if (negative) { + unaryMinusExpression.operand = expression; + finishNode(unaryMinusExpression); + expression = unaryMinusExpression; + } + node.literal = expression; + return finishNode(node); + } + + function isStartOfTypeOfImportType() { + nextToken(); + return token() === SyntaxKind.ImportKeyword; + } + + function parseImportType(): ImportTypeNode { + sourceFile.flags |= NodeFlags.PossiblyContainsDynamicImport; + const node = createNode(SyntaxKind.ImportType) as ImportTypeNode; + if (parseOptional(SyntaxKind.TypeOfKeyword)) { + node.isTypeOf = true; + } + parseExpected(SyntaxKind.ImportKeyword); + parseExpected(SyntaxKind.OpenParenToken); + node.argument = parseType(); + parseExpected(SyntaxKind.CloseParenToken); + if (parseOptional(SyntaxKind.DotToken)) { + node.qualifier = parseEntityName(/*allowReservedWords*/ true, Diagnostics.Type_expected); + } + node.typeArguments = tryParseTypeArguments(); + return finishNode(node); + } + + function nextTokenIsNumericLiteral() { + return nextToken() === SyntaxKind.NumericLiteral; + } + + function parseNonArrayType(): TypeNode { + switch (token()) { + case SyntaxKind.AnyKeyword: + case SyntaxKind.UnknownKeyword: + case SyntaxKind.StringKeyword: + case SyntaxKind.NumberKeyword: + case SyntaxKind.SymbolKeyword: + case SyntaxKind.BooleanKeyword: + case SyntaxKind.UndefinedKeyword: + case SyntaxKind.NeverKeyword: + case SyntaxKind.ObjectKeyword: + // If these are followed by a dot, then parse these out as a dotted type reference instead. + return tryParse(parseKeywordAndNoDot) || parseTypeReference(); + case SyntaxKind.AsteriskToken: + return parseJSDocAllType(/*postfixEquals*/ false); + case SyntaxKind.AsteriskEqualsToken: + return parseJSDocAllType(/*postfixEquals*/ true); + case SyntaxKind.QuestionToken: + return parseJSDocUnknownOrNullableType(); + case SyntaxKind.FunctionKeyword: + return parseJSDocFunctionType(); + case SyntaxKind.ExclamationToken: + return parseJSDocNonNullableType(); + case SyntaxKind.NoSubstitutionTemplateLiteral: + case SyntaxKind.StringLiteral: + case SyntaxKind.NumericLiteral: + case SyntaxKind.TrueKeyword: + case SyntaxKind.FalseKeyword: + return parseLiteralTypeNode(); + case SyntaxKind.MinusToken: + return lookAhead(nextTokenIsNumericLiteral) ? parseLiteralTypeNode(/*negative*/ true) : parseTypeReference(); + case SyntaxKind.VoidKeyword: + case SyntaxKind.NullKeyword: + return parseTokenNode(); + case SyntaxKind.ThisKeyword: { + const thisKeyword = parseThisTypeNode(); + if (token() === SyntaxKind.IsKeyword && !scanner.hasPrecedingLineBreak()) { + return parseThisTypePredicate(thisKeyword); + } + else { + return thisKeyword; + } + } + case SyntaxKind.TypeOfKeyword: + return lookAhead(isStartOfTypeOfImportType) ? parseImportType() : parseTypeQuery(); + case SyntaxKind.OpenBraceToken: + return lookAhead(isStartOfMappedType) ? parseMappedType() : parseTypeLiteral(); + case SyntaxKind.OpenBracketToken: + return parseTupleType(); + case SyntaxKind.OpenParenToken: + return parseParenthesizedType(); + case SyntaxKind.ImportKeyword: + return parseImportType(); + default: + return parseTypeReference(); + } + } + + function isStartOfType(inStartOfParameter?: boolean): boolean { + switch (token()) { + case SyntaxKind.AnyKeyword: + case SyntaxKind.UnknownKeyword: + case SyntaxKind.StringKeyword: + case SyntaxKind.NumberKeyword: + case SyntaxKind.BooleanKeyword: + case SyntaxKind.SymbolKeyword: + case SyntaxKind.UniqueKeyword: + case SyntaxKind.VoidKeyword: + case SyntaxKind.UndefinedKeyword: + case SyntaxKind.NullKeyword: + case SyntaxKind.ThisKeyword: + case SyntaxKind.TypeOfKeyword: + case SyntaxKind.NeverKeyword: + case SyntaxKind.OpenBraceToken: + case SyntaxKind.OpenBracketToken: + case SyntaxKind.LessThanToken: + case SyntaxKind.BarToken: + case SyntaxKind.AmpersandToken: + case SyntaxKind.NewKeyword: + case SyntaxKind.StringLiteral: + case SyntaxKind.NumericLiteral: + case SyntaxKind.TrueKeyword: + case SyntaxKind.FalseKeyword: + case SyntaxKind.ObjectKeyword: + case SyntaxKind.AsteriskToken: + case SyntaxKind.QuestionToken: + case SyntaxKind.ExclamationToken: + case SyntaxKind.DotDotDotToken: + case SyntaxKind.InferKeyword: + case SyntaxKind.ImportKeyword: + return true; + case SyntaxKind.FunctionKeyword: + return !inStartOfParameter; + case SyntaxKind.MinusToken: + return !inStartOfParameter && lookAhead(nextTokenIsNumericLiteral); + case SyntaxKind.OpenParenToken: + // Only consider '(' the start of a type if followed by ')', '...', an identifier, a modifier, + // or something that starts a type. We don't want to consider things like '(1)' a type. + return !inStartOfParameter && lookAhead(isStartOfParenthesizedOrFunctionType); + default: + return isIdentifier(); + } + } + + function isStartOfParenthesizedOrFunctionType() { + nextToken(); + return token() === SyntaxKind.CloseParenToken || isStartOfParameter(/*isJSDocParameter*/ false) || isStartOfType(); + } + + function parsePostfixTypeOrHigher(): TypeNode { + let type = parseNonArrayType(); + while (!scanner.hasPrecedingLineBreak()) { + switch (token()) { + case SyntaxKind.ExclamationToken: + type = createPostfixType(SyntaxKind.JSDocNonNullableType, type); + break; + case SyntaxKind.QuestionToken: + // If not in JSDoc and next token is start of a type we have a conditional type + if (!(contextFlags & NodeFlags.JSDoc) && lookAhead(nextTokenIsStartOfType)) { + return type; + } + type = createPostfixType(SyntaxKind.JSDocNullableType, type); + break; + case SyntaxKind.OpenBracketToken: + parseExpected(SyntaxKind.OpenBracketToken); + if (isStartOfType()) { + const node = createNode(SyntaxKind.IndexedAccessType, type.pos) as IndexedAccessTypeNode; + node.objectType = type; + node.indexType = parseType(); + parseExpected(SyntaxKind.CloseBracketToken); + type = finishNode(node); + } + else { + const node = createNode(SyntaxKind.ArrayType, type.pos) as ArrayTypeNode; + node.elementType = type; + parseExpected(SyntaxKind.CloseBracketToken); + type = finishNode(node); + } + break; + default: + return type; + } + } + return type; + } + + function createPostfixType(kind: SyntaxKind, type: TypeNode) { + nextToken(); + const postfix = createNode(kind, type.pos) as OptionalTypeNode | JSDocOptionalType | JSDocNonNullableType | JSDocNullableType; + postfix.type = type; + return finishNode(postfix); + } + + function parseTypeOperator(operator: SyntaxKind.KeyOfKeyword | SyntaxKind.UniqueKeyword) { + const node = createNode(SyntaxKind.TypeOperator); + parseExpected(operator); + node.operator = operator; + node.type = parseTypeOperatorOrHigher(); + return finishNode(node); + } + + function parseInferType(): InferTypeNode { + const node = createNode(SyntaxKind.InferType); + parseExpected(SyntaxKind.InferKeyword); + const typeParameter = createNode(SyntaxKind.TypeParameter); + typeParameter.name = parseIdentifier(); + node.typeParameter = finishNode(typeParameter); + return finishNode(node); + } + + function parseTypeOperatorOrHigher(): TypeNode { + const operator = token(); + switch (operator) { + case SyntaxKind.KeyOfKeyword: + case SyntaxKind.UniqueKeyword: + return parseTypeOperator(operator); + case SyntaxKind.InferKeyword: + return parseInferType(); + } + return parsePostfixTypeOrHigher(); + } + + function parseUnionOrIntersectionType(kind: SyntaxKind.UnionType | SyntaxKind.IntersectionType, parseConstituentType: () => TypeNode, operator: SyntaxKind.BarToken | SyntaxKind.AmpersandToken): TypeNode { + parseOptional(operator); + let type = parseConstituentType(); + if (token() === operator) { + const types = [type]; + while (parseOptional(operator)) { + types.push(parseConstituentType()); + } + const node = createNode(kind, type.pos); + node.types = createNodeArray(types, type.pos); + type = finishNode(node); + } + return type; + } + + function parseIntersectionTypeOrHigher(): TypeNode { + return parseUnionOrIntersectionType(SyntaxKind.IntersectionType, parseTypeOperatorOrHigher, SyntaxKind.AmpersandToken); + } + + function parseUnionTypeOrHigher(): TypeNode { + return parseUnionOrIntersectionType(SyntaxKind.UnionType, parseIntersectionTypeOrHigher, SyntaxKind.BarToken); + } + + function isStartOfFunctionType(): boolean { + if (token() === SyntaxKind.LessThanToken) { + return true; + } + return token() === SyntaxKind.OpenParenToken && lookAhead(isUnambiguouslyStartOfFunctionType); + } + + function skipParameterStart(): boolean { + if (isModifierKind(token())) { + // Skip modifiers + parseModifiers(); + } + if (isIdentifier() || token() === SyntaxKind.ThisKeyword) { + nextToken(); + return true; + } + if (token() === SyntaxKind.OpenBracketToken || token() === SyntaxKind.OpenBraceToken) { + // Return true if we can parse an array or object binding pattern with no errors + const previousErrorCount = parseDiagnostics.length; + parseIdentifierOrPattern(); + return previousErrorCount === parseDiagnostics.length; + } + return false; + } + + function isUnambiguouslyStartOfFunctionType() { + nextToken(); + if (token() === SyntaxKind.CloseParenToken || token() === SyntaxKind.DotDotDotToken) { + // ( ) + // ( ... + return true; + } + if (skipParameterStart()) { + // We successfully skipped modifiers (if any) and an identifier or binding pattern, + // now see if we have something that indicates a parameter declaration + if (token() === SyntaxKind.ColonToken || token() === SyntaxKind.CommaToken || + token() === SyntaxKind.QuestionToken || token() === SyntaxKind.EqualsToken) { + // ( xxx : + // ( xxx , + // ( xxx ? + // ( xxx = + return true; + } + if (token() === SyntaxKind.CloseParenToken) { + nextToken(); + if (token() === SyntaxKind.EqualsGreaterThanToken) { + // ( xxx ) => + return true; + } + } + } + return false; + } + + function parseTypeOrTypePredicate(): TypeNode { + const typePredicateVariable = isIdentifier() && tryParse(parseTypePredicatePrefix); + const type = parseType(); + if (typePredicateVariable) { + const node = createNode(SyntaxKind.TypePredicate, typePredicateVariable.pos); + node.parameterName = typePredicateVariable; + node.type = type; + return finishNode(node); + } + else { + return type; + } + } + + function parseTypePredicatePrefix() { + const id = parseIdentifier(); + if (token() === SyntaxKind.IsKeyword && !scanner.hasPrecedingLineBreak()) { + nextToken(); + return id; + } + } + + function parseType(): TypeNode { + // The rules about 'yield' only apply to actual code/expression contexts. They don't + // apply to 'type' contexts. So we disable these parameters here before moving on. + return doOutsideOfContext(NodeFlags.TypeExcludesFlags, parseTypeWorker); + } + + function parseTypeWorker(noConditionalTypes?: boolean): TypeNode { + if (isStartOfFunctionType() || token() === SyntaxKind.NewKeyword) { + return parseFunctionOrConstructorType(); + } + const type = parseUnionTypeOrHigher(); + if (!noConditionalTypes && !scanner.hasPrecedingLineBreak() && parseOptional(SyntaxKind.ExtendsKeyword)) { + const node = createNode(SyntaxKind.ConditionalType, type.pos); + node.checkType = type; + // The type following 'extends' is not permitted to be another conditional type + node.extendsType = parseTypeWorker(/*noConditionalTypes*/ true); + parseExpected(SyntaxKind.QuestionToken); + node.trueType = parseTypeWorker(); + parseExpected(SyntaxKind.ColonToken); + node.falseType = parseTypeWorker(); + return finishNode(node); + } + return type; + } + + function parseTypeAnnotation(): TypeNode | undefined { + return parseOptional(SyntaxKind.ColonToken) ? parseType() : undefined; + } + + // EXPRESSIONS + function isStartOfLeftHandSideExpression(): boolean { + switch (token()) { + case SyntaxKind.ThisKeyword: + case SyntaxKind.SuperKeyword: + case SyntaxKind.NullKeyword: + case SyntaxKind.TrueKeyword: + case SyntaxKind.FalseKeyword: + case SyntaxKind.NumericLiteral: + case SyntaxKind.StringLiteral: + case SyntaxKind.NoSubstitutionTemplateLiteral: + case SyntaxKind.TemplateHead: + case SyntaxKind.OpenParenToken: + case SyntaxKind.OpenBracketToken: + case SyntaxKind.OpenBraceToken: + case SyntaxKind.FunctionKeyword: + case SyntaxKind.ClassKeyword: + case SyntaxKind.NewKeyword: + case SyntaxKind.SlashToken: + case SyntaxKind.SlashEqualsToken: + case SyntaxKind.Identifier: + return true; + case SyntaxKind.ImportKeyword: + return lookAhead(nextTokenIsOpenParenOrLessThanOrDot); + default: + return isIdentifier(); + } + } + + function isStartOfExpression(): boolean { + if (isStartOfLeftHandSideExpression()) { + return true; + } + + switch (token()) { + case SyntaxKind.PlusToken: + case SyntaxKind.MinusToken: + case SyntaxKind.TildeToken: + case SyntaxKind.ExclamationToken: + case SyntaxKind.DeleteKeyword: + case SyntaxKind.TypeOfKeyword: + case SyntaxKind.VoidKeyword: + case SyntaxKind.PlusPlusToken: + case SyntaxKind.MinusMinusToken: + case SyntaxKind.LessThanToken: + case SyntaxKind.AwaitKeyword: + case SyntaxKind.YieldKeyword: + // Yield/await always starts an expression. Either it is an identifier (in which case + // it is definitely an expression). Or it's a keyword (either because we're in + // a generator or async function, or in strict mode (or both)) and it started a yield or await expression. + return true; + default: + // Error tolerance. If we see the start of some binary operator, we consider + // that the start of an expression. That way we'll parse out a missing identifier, + // give a good message about an identifier being missing, and then consume the + // rest of the binary expression. + if (isBinaryOperator()) { + return true; + } + + return isIdentifier(); + } + } + + function isStartOfExpressionStatement(): boolean { + // As per the grammar, none of '{' or 'function' or 'class' can start an expression statement. + return token() !== SyntaxKind.OpenBraceToken && + token() !== SyntaxKind.FunctionKeyword && + token() !== SyntaxKind.ClassKeyword && + token() !== SyntaxKind.AtToken && + isStartOfExpression(); + } + + function parseExpression(): Expression { + // Expression[in]: + // AssignmentExpression[in] + // Expression[in] , AssignmentExpression[in] + + // clear the decorator context when parsing Expression, as it should be unambiguous when parsing a decorator + const saveDecoratorContext = inDecoratorContext(); + if (saveDecoratorContext) { + setDecoratorContext(/*val*/ false); + } + + let expr = parseAssignmentExpressionOrHigher(); + let operatorToken: BinaryOperatorToken; + while ((operatorToken = parseOptionalToken(SyntaxKind.CommaToken))) { + expr = makeBinaryExpression(expr, operatorToken, parseAssignmentExpressionOrHigher()); + } + + if (saveDecoratorContext) { + setDecoratorContext(/*val*/ true); + } + return expr; + } + + function parseInitializer(): Expression | undefined { + return parseOptional(SyntaxKind.EqualsToken) ? parseAssignmentExpressionOrHigher() : undefined; + } + + function parseAssignmentExpressionOrHigher(): Expression { + // AssignmentExpression[in,yield]: + // 1) ConditionalExpression[?in,?yield] + // 2) LeftHandSideExpression = AssignmentExpression[?in,?yield] + // 3) LeftHandSideExpression AssignmentOperator AssignmentExpression[?in,?yield] + // 4) ArrowFunctionExpression[?in,?yield] + // 5) AsyncArrowFunctionExpression[in,yield,await] + // 6) [+Yield] YieldExpression[?In] + // + // Note: for ease of implementation we treat productions '2' and '3' as the same thing. + // (i.e. they're both BinaryExpressions with an assignment operator in it). + + // First, do the simple check if we have a YieldExpression (production '6'). + if (isYieldExpression()) { + return parseYieldExpression(); + } + + // Then, check if we have an arrow function (production '4' and '5') that starts with a parenthesized + // parameter list or is an async arrow function. + // AsyncArrowFunctionExpression: + // 1) async[no LineTerminator here]AsyncArrowBindingIdentifier[?Yield][no LineTerminator here]=>AsyncConciseBody[?In] + // 2) CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await][no LineTerminator here]=>AsyncConciseBody[?In] + // Production (1) of AsyncArrowFunctionExpression is parsed in "tryParseAsyncSimpleArrowFunctionExpression". + // And production (2) is parsed in "tryParseParenthesizedArrowFunctionExpression". + // + // If we do successfully parse arrow-function, we must *not* recurse for productions 1, 2 or 3. An ArrowFunction is + // not a LeftHandSideExpression, nor does it start a ConditionalExpression. So we are done + // with AssignmentExpression if we see one. + const arrowExpression = tryParseParenthesizedArrowFunctionExpression() || tryParseAsyncSimpleArrowFunctionExpression(); + if (arrowExpression) { + return arrowExpression; + } + + // Now try to see if we're in production '1', '2' or '3'. A conditional expression can + // start with a LogicalOrExpression, while the assignment productions can only start with + // LeftHandSideExpressions. + // + // So, first, we try to just parse out a BinaryExpression. If we get something that is a + // LeftHandSide or higher, then we can try to parse out the assignment expression part. + // Otherwise, we try to parse out the conditional expression bit. We want to allow any + // binary expression here, so we pass in the 'lowest' precedence here so that it matches + // and consumes anything. + const expr = parseBinaryExpressionOrHigher(/*precedence*/ 0); + + // To avoid a look-ahead, we did not handle the case of an arrow function with a single un-parenthesized + // parameter ('x => ...') above. We handle it here by checking if the parsed expression was a single + // identifier and the current token is an arrow. + if (expr.kind === SyntaxKind.Identifier && token() === SyntaxKind.EqualsGreaterThanToken) { + return parseSimpleArrowFunctionExpression(expr); + } + + // Now see if we might be in cases '2' or '3'. + // If the expression was a LHS expression, and we have an assignment operator, then + // we're in '2' or '3'. Consume the assignment and return. + // + // Note: we call reScanGreaterToken so that we get an appropriately merged token + // for cases like `> > =` becoming `>>=` + if (isLeftHandSideExpression(expr) && isAssignmentOperator(reScanGreaterToken())) { + return makeBinaryExpression(expr, parseTokenNode(), parseAssignmentExpressionOrHigher()); + } + + // It wasn't an assignment or a lambda. This is a conditional expression: + return parseConditionalExpressionRest(expr); + } + + function isYieldExpression(): boolean { + if (token() === SyntaxKind.YieldKeyword) { + // If we have a 'yield' keyword, and this is a context where yield expressions are + // allowed, then definitely parse out a yield expression. + if (inYieldContext()) { + return true; + } + + // We're in a context where 'yield expr' is not allowed. However, if we can + // definitely tell that the user was trying to parse a 'yield expr' and not + // just a normal expr that start with a 'yield' identifier, then parse out + // a 'yield expr'. We can then report an error later that they are only + // allowed in generator expressions. + // + // for example, if we see 'yield(foo)', then we'll have to treat that as an + // invocation expression of something called 'yield'. However, if we have + // 'yield foo' then that is not legal as a normal expression, so we can + // definitely recognize this as a yield expression. + // + // for now we just check if the next token is an identifier. More heuristics + // can be added here later as necessary. We just need to make sure that we + // don't accidentally consume something legal. + return lookAhead(nextTokenIsIdentifierOrKeywordOrLiteralOnSameLine); + } + + return false; + } + + function nextTokenIsIdentifierOnSameLine() { + nextToken(); + return !scanner.hasPrecedingLineBreak() && isIdentifier(); + } + + function parseYieldExpression(): YieldExpression { + const node = createNode(SyntaxKind.YieldExpression); + + // YieldExpression[In] : + // yield + // yield [no LineTerminator here] [Lexical goal InputElementRegExp]AssignmentExpression[?In, Yield] + // yield [no LineTerminator here] * [Lexical goal InputElementRegExp]AssignmentExpression[?In, Yield] + nextToken(); + + if (!scanner.hasPrecedingLineBreak() && + (token() === SyntaxKind.AsteriskToken || isStartOfExpression())) { + node.asteriskToken = parseOptionalToken(SyntaxKind.AsteriskToken); + node.expression = parseAssignmentExpressionOrHigher(); + return finishNode(node); + } + else { + // if the next token is not on the same line as yield. or we don't have an '*' or + // the start of an expression, then this is just a simple "yield" expression. + return finishNode(node); + } + } + + function parseSimpleArrowFunctionExpression(identifier: Identifier, asyncModifier?: NodeArray | undefined): ArrowFunction { + Debug.assert(token() === SyntaxKind.EqualsGreaterThanToken, "parseSimpleArrowFunctionExpression should only have been called if we had a =>"); + + let node: ArrowFunction; + if (asyncModifier) { + node = createNode(SyntaxKind.ArrowFunction, asyncModifier.pos); + node.modifiers = asyncModifier; + } + else { + node = createNode(SyntaxKind.ArrowFunction, identifier.pos); + } + + const parameter = createNode(SyntaxKind.Parameter, identifier.pos); + parameter.name = identifier; + finishNode(parameter); + + node.parameters = createNodeArray([parameter], parameter.pos, parameter.end); + + node.equalsGreaterThanToken = parseExpectedToken(SyntaxKind.EqualsGreaterThanToken); + node.body = parseArrowFunctionExpressionBody(/*isAsync*/ !!asyncModifier); + + return addJSDocComment(finishNode(node)); + } + + function tryParseParenthesizedArrowFunctionExpression(): Expression | undefined { + const triState = isParenthesizedArrowFunctionExpression(); + if (triState === Tristate.False) { + // It's definitely not a parenthesized arrow function expression. + return undefined; + } + + // If we definitely have an arrow function, then we can just parse one, not requiring a + // following => or { token. Otherwise, we *might* have an arrow function. Try to parse + // it out, but don't allow any ambiguity, and return 'undefined' if this could be an + // expression instead. + const arrowFunction = triState === Tristate.True + ? parseParenthesizedArrowFunctionExpressionHead(/*allowAmbiguity*/ true) + : tryParse(parsePossibleParenthesizedArrowFunctionExpressionHead); + + if (!arrowFunction) { + // Didn't appear to actually be a parenthesized arrow function. Just bail out. + return undefined; + } + + const isAsync = hasModifier(arrowFunction, ModifierFlags.Async); + + // If we have an arrow, then try to parse the body. Even if not, try to parse if we + // have an opening brace, just in case we're in an error state. + const lastToken = token(); + arrowFunction.equalsGreaterThanToken = parseExpectedToken(SyntaxKind.EqualsGreaterThanToken); + arrowFunction.body = (lastToken === SyntaxKind.EqualsGreaterThanToken || lastToken === SyntaxKind.OpenBraceToken) + ? parseArrowFunctionExpressionBody(isAsync) + : parseIdentifier(); + + return finishNode(arrowFunction); + } + + // True -> We definitely expect a parenthesized arrow function here. + // False -> There *cannot* be a parenthesized arrow function here. + // Unknown -> There *might* be a parenthesized arrow function here. + // Speculatively look ahead to be sure, and rollback if not. + function isParenthesizedArrowFunctionExpression(): Tristate { + if (token() === SyntaxKind.OpenParenToken || token() === SyntaxKind.LessThanToken || token() === SyntaxKind.AsyncKeyword) { + return lookAhead(isParenthesizedArrowFunctionExpressionWorker); + } + + if (token() === SyntaxKind.EqualsGreaterThanToken) { + // ERROR RECOVERY TWEAK: + // If we see a standalone => try to parse it as an arrow function expression as that's + // likely what the user intended to write. + return Tristate.True; + } + // Definitely not a parenthesized arrow function. + return Tristate.False; + } + + function isParenthesizedArrowFunctionExpressionWorker() { + if (token() === SyntaxKind.AsyncKeyword) { + nextToken(); + if (scanner.hasPrecedingLineBreak()) { + return Tristate.False; + } + if (token() !== SyntaxKind.OpenParenToken && token() !== SyntaxKind.LessThanToken) { + return Tristate.False; + } + } + + const first = token(); + const second = nextToken(); + + if (first === SyntaxKind.OpenParenToken) { + if (second === SyntaxKind.CloseParenToken) { + // Simple cases: "() =>", "(): ", and "() {". + // This is an arrow function with no parameters. + // The last one is not actually an arrow function, + // but this is probably what the user intended. + const third = nextToken(); + switch (third) { + case SyntaxKind.EqualsGreaterThanToken: + case SyntaxKind.ColonToken: + case SyntaxKind.OpenBraceToken: + return Tristate.True; + default: + return Tristate.False; + } + } + + // If encounter "([" or "({", this could be the start of a binding pattern. + // Examples: + // ([ x ]) => { } + // ({ x }) => { } + // ([ x ]) + // ({ x }) + if (second === SyntaxKind.OpenBracketToken || second === SyntaxKind.OpenBraceToken) { + return Tristate.Unknown; + } + + // Simple case: "(..." + // This is an arrow function with a rest parameter. + if (second === SyntaxKind.DotDotDotToken) { + return Tristate.True; + } + + // Check for "(xxx yyy", where xxx is a modifier and yyy is an identifier. This + // isn't actually allowed, but we want to treat it as a lambda so we can provide + // a good error message. + if (isModifierKind(second) && second !== SyntaxKind.AsyncKeyword && lookAhead(nextTokenIsIdentifier)) { + return Tristate.True; + } + + // If we had "(" followed by something that's not an identifier, + // then this definitely doesn't look like a lambda. "this" is not + // valid, but we want to parse it and then give a semantic error. + if (!isIdentifier() && second !== SyntaxKind.ThisKeyword) { + return Tristate.False; + } + + switch (nextToken()) { + case SyntaxKind.ColonToken: + // If we have something like "(a:", then we must have a + // type-annotated parameter in an arrow function expression. + return Tristate.True; + case SyntaxKind.QuestionToken: + nextToken(); + // If we have "(a?:" or "(a?," or "(a?=" or "(a?)" then it is definitely a lambda. + if (token() === SyntaxKind.ColonToken || token() === SyntaxKind.CommaToken || token() === SyntaxKind.EqualsToken || token() === SyntaxKind.CloseParenToken) { + return Tristate.True; + } + // Otherwise it is definitely not a lambda. + return Tristate.False; + case SyntaxKind.CommaToken: + case SyntaxKind.EqualsToken: + case SyntaxKind.CloseParenToken: + // If we have "(a," or "(a=" or "(a)" this *could* be an arrow function + return Tristate.Unknown; + } + // It is definitely not an arrow function + return Tristate.False; + } + else { + Debug.assert(first === SyntaxKind.LessThanToken); + + // If we have "<" not followed by an identifier, + // then this definitely is not an arrow function. + if (!isIdentifier()) { + return Tristate.False; + } + + // JSX overrides + if (sourceFile.languageVariant === LanguageVariant.JSX) { + const isArrowFunctionInJsx = lookAhead(() => { + const third = nextToken(); + if (third === SyntaxKind.ExtendsKeyword) { + const fourth = nextToken(); + switch (fourth) { + case SyntaxKind.EqualsToken: + case SyntaxKind.GreaterThanToken: + return false; + default: + return true; + } + } + else if (third === SyntaxKind.CommaToken) { + return true; + } + return false; + }); + + if (isArrowFunctionInJsx) { + return Tristate.True; + } + + return Tristate.False; + } + + // This *could* be a parenthesized arrow function. + return Tristate.Unknown; + } + } + + function parsePossibleParenthesizedArrowFunctionExpressionHead(): ArrowFunction | undefined { + return parseParenthesizedArrowFunctionExpressionHead(/*allowAmbiguity*/ false); + } + + function tryParseAsyncSimpleArrowFunctionExpression(): ArrowFunction | undefined { + // We do a check here so that we won't be doing unnecessarily call to "lookAhead" + if (token() === SyntaxKind.AsyncKeyword) { + if (lookAhead(isUnParenthesizedAsyncArrowFunctionWorker) === Tristate.True) { + const asyncModifier = parseModifiersForArrowFunction(); + const expr = parseBinaryExpressionOrHigher(/*precedence*/ 0); + return parseSimpleArrowFunctionExpression(expr, asyncModifier); + } + } + return undefined; + } + + function isUnParenthesizedAsyncArrowFunctionWorker(): Tristate { + // AsyncArrowFunctionExpression: + // 1) async[no LineTerminator here]AsyncArrowBindingIdentifier[?Yield][no LineTerminator here]=>AsyncConciseBody[?In] + // 2) CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await][no LineTerminator here]=>AsyncConciseBody[?In] + if (token() === SyntaxKind.AsyncKeyword) { + nextToken(); + // If the "async" is followed by "=>" token then it is not a beginning of an async arrow-function + // but instead a simple arrow-function which will be parsed inside "parseAssignmentExpressionOrHigher" + if (scanner.hasPrecedingLineBreak() || token() === SyntaxKind.EqualsGreaterThanToken) { + return Tristate.False; + } + // Check for un-parenthesized AsyncArrowFunction + const expr = parseBinaryExpressionOrHigher(/*precedence*/ 0); + if (!scanner.hasPrecedingLineBreak() && expr.kind === SyntaxKind.Identifier && token() === SyntaxKind.EqualsGreaterThanToken) { + return Tristate.True; + } + } + + return Tristate.False; + } + + function parseParenthesizedArrowFunctionExpressionHead(allowAmbiguity: boolean): ArrowFunction | undefined { + const node = createNodeWithJSDoc(SyntaxKind.ArrowFunction); + node.modifiers = parseModifiersForArrowFunction(); + const isAsync = hasModifier(node, ModifierFlags.Async) ? SignatureFlags.Await : SignatureFlags.None; + // Arrow functions are never generators. + // + // If we're speculatively parsing a signature for a parenthesized arrow function, then + // we have to have a complete parameter list. Otherwise we might see something like + // a => (b => c) + // And think that "(b =>" was actually a parenthesized arrow function with a missing + // close paren. + if (!fillSignature(SyntaxKind.ColonToken, isAsync, node) && !allowAmbiguity) { + return undefined; + } + + // Parsing a signature isn't enough. + // Parenthesized arrow signatures often look like other valid expressions. + // For instance: + // - "(x = 10)" is an assignment expression parsed as a signature with a default parameter value. + // - "(x,y)" is a comma expression parsed as a signature with two parameters. + // - "a ? (b): c" will have "(b):" parsed as a signature with a return type annotation. + // + // So we need just a bit of lookahead to ensure that it can only be a signature. + if (!allowAmbiguity && token() !== SyntaxKind.EqualsGreaterThanToken && token() !== SyntaxKind.OpenBraceToken) { + // Returning undefined here will cause our caller to rewind to where we started from. + return undefined; + } + + return node; + } + + function parseArrowFunctionExpressionBody(isAsync: boolean): Block | Expression { + if (token() === SyntaxKind.OpenBraceToken) { + return parseFunctionBlock(isAsync ? SignatureFlags.Await : SignatureFlags.None); + } + + if (token() !== SyntaxKind.SemicolonToken && + token() !== SyntaxKind.FunctionKeyword && + token() !== SyntaxKind.ClassKeyword && + isStartOfStatement() && + !isStartOfExpressionStatement()) { + // Check if we got a plain statement (i.e. no expression-statements, no function/class expressions/declarations) + // + // Here we try to recover from a potential error situation in the case where the + // user meant to supply a block. For example, if the user wrote: + // + // a => + // let v = 0; + // } + // + // they may be missing an open brace. Check to see if that's the case so we can + // try to recover better. If we don't do this, then the next close curly we see may end + // up preemptively closing the containing construct. + // + // Note: even when 'IgnoreMissingOpenBrace' is passed, parseBody will still error. + return parseFunctionBlock(SignatureFlags.IgnoreMissingOpenBrace | (isAsync ? SignatureFlags.Await : SignatureFlags.None)); + } + + return isAsync + ? doInAwaitContext(parseAssignmentExpressionOrHigher) + : doOutsideOfAwaitContext(parseAssignmentExpressionOrHigher); + } + + function parseConditionalExpressionRest(leftOperand: Expression): Expression { + // Note: we are passed in an expression which was produced from parseBinaryExpressionOrHigher. + const questionToken = parseOptionalToken(SyntaxKind.QuestionToken); + if (!questionToken) { + return leftOperand; + } + + // Note: we explicitly 'allowIn' in the whenTrue part of the condition expression, and + // we do not that for the 'whenFalse' part. + const node = createNode(SyntaxKind.ConditionalExpression, leftOperand.pos); + node.condition = leftOperand; + node.questionToken = questionToken; + node.whenTrue = doOutsideOfContext(disallowInAndDecoratorContext, parseAssignmentExpressionOrHigher); + node.colonToken = parseExpectedToken(SyntaxKind.ColonToken); + node.whenFalse = nodeIsPresent(node.colonToken) + ? parseAssignmentExpressionOrHigher() + : createMissingNode(SyntaxKind.Identifier, /*reportAtCurrentPosition*/ false, Diagnostics._0_expected, tokenToString(SyntaxKind.ColonToken)); + return finishNode(node); + } + + function parseBinaryExpressionOrHigher(precedence: number): Expression { + const leftOperand = parseUnaryExpressionOrHigher(); + return parseBinaryExpressionRest(precedence, leftOperand); + } + + function isInOrOfKeyword(t: SyntaxKind) { + return t === SyntaxKind.InKeyword || t === SyntaxKind.OfKeyword; + } + + function parseBinaryExpressionRest(precedence: number, leftOperand: Expression): Expression { + while (true) { + // We either have a binary operator here, or we're finished. We call + // reScanGreaterToken so that we merge token sequences like > and = into >= + + reScanGreaterToken(); + const newPrecedence = getBinaryOperatorPrecedence(token()); + + // Check the precedence to see if we should "take" this operator + // - For left associative operator (all operator but **), consume the operator, + // recursively call the function below, and parse binaryExpression as a rightOperand + // of the caller if the new precedence of the operator is greater then or equal to the current precedence. + // For example: + // a - b - c; + // ^token; leftOperand = b. Return b to the caller as a rightOperand + // a * b - c + // ^token; leftOperand = b. Return b to the caller as a rightOperand + // a - b * c; + // ^token; leftOperand = b. Return b * c to the caller as a rightOperand + // - For right associative operator (**), consume the operator, recursively call the function + // and parse binaryExpression as a rightOperand of the caller if the new precedence of + // the operator is strictly grater than the current precedence + // For example: + // a ** b ** c; + // ^^token; leftOperand = b. Return b ** c to the caller as a rightOperand + // a - b ** c; + // ^^token; leftOperand = b. Return b ** c to the caller as a rightOperand + // a ** b - c + // ^token; leftOperand = b. Return b to the caller as a rightOperand + const consumeCurrentOperator = token() === SyntaxKind.AsteriskAsteriskToken ? + newPrecedence >= precedence : + newPrecedence > precedence; + + if (!consumeCurrentOperator) { + break; + } + + if (token() === SyntaxKind.InKeyword && inDisallowInContext()) { + break; + } + + if (token() === SyntaxKind.AsKeyword) { + // Make sure we *do* perform ASI for constructs like this: + // var x = foo + // as (Bar) + // This should be parsed as an initialized variable, followed + // by a function call to 'as' with the argument 'Bar' + if (scanner.hasPrecedingLineBreak()) { + break; + } + else { + nextToken(); + leftOperand = makeAsExpression(leftOperand, parseType()); + } + } + else { + leftOperand = makeBinaryExpression(leftOperand, parseTokenNode(), parseBinaryExpressionOrHigher(newPrecedence)); + } + } + + return leftOperand; + } + + function isBinaryOperator() { + if (inDisallowInContext() && token() === SyntaxKind.InKeyword) { + return false; + } + + return getBinaryOperatorPrecedence(token()) > 0; + } + + function makeBinaryExpression(left: Expression, operatorToken: BinaryOperatorToken, right: Expression): BinaryExpression { + const node = createNode(SyntaxKind.BinaryExpression, left.pos); + node.left = left; + node.operatorToken = operatorToken; + node.right = right; + return finishNode(node); + } + + function makeAsExpression(left: Expression, right: TypeNode): AsExpression { + const node = createNode(SyntaxKind.AsExpression, left.pos); + node.expression = left; + node.type = right; + return finishNode(node); + } + + function parsePrefixUnaryExpression() { + const node = createNode(SyntaxKind.PrefixUnaryExpression); + node.operator = token(); + nextToken(); + node.operand = parseSimpleUnaryExpression(); + + return finishNode(node); + } + + function parseDeleteExpression() { + const node = createNode(SyntaxKind.DeleteExpression); + nextToken(); + node.expression = parseSimpleUnaryExpression(); + return finishNode(node); + } + + function parseTypeOfExpression() { + const node = createNode(SyntaxKind.TypeOfExpression); + nextToken(); + node.expression = parseSimpleUnaryExpression(); + return finishNode(node); + } + + function parseVoidExpression() { + const node = createNode(SyntaxKind.VoidExpression); + nextToken(); + node.expression = parseSimpleUnaryExpression(); + return finishNode(node); + } + + function isAwaitExpression(): boolean { + if (token() === SyntaxKind.AwaitKeyword) { + if (inAwaitContext()) { + return true; + } + + // here we are using similar heuristics as 'isYieldExpression' + return lookAhead(nextTokenIsIdentifierOrKeywordOrLiteralOnSameLine); + } + + return false; + } + + function parseAwaitExpression() { + const node = createNode(SyntaxKind.AwaitExpression); + nextToken(); + node.expression = parseSimpleUnaryExpression(); + return finishNode(node); + } + + /** + * Parse ES7 exponential expression and await expression + * + * ES7 ExponentiationExpression: + * 1) UnaryExpression[?Yield] + * 2) UpdateExpression[?Yield] ** ExponentiationExpression[?Yield] + * + */ + function parseUnaryExpressionOrHigher(): UnaryExpression | BinaryExpression { + /** + * ES7 UpdateExpression: + * 1) LeftHandSideExpression[?Yield] + * 2) LeftHandSideExpression[?Yield][no LineTerminator here]++ + * 3) LeftHandSideExpression[?Yield][no LineTerminator here]-- + * 4) ++UnaryExpression[?Yield] + * 5) --UnaryExpression[?Yield] + */ + if (isUpdateExpression()) { + const updateExpression = parseUpdateExpression(); + return token() === SyntaxKind.AsteriskAsteriskToken ? + parseBinaryExpressionRest(getBinaryOperatorPrecedence(token()), updateExpression) : + updateExpression; + } + + /** + * ES7 UnaryExpression: + * 1) UpdateExpression[?yield] + * 2) delete UpdateExpression[?yield] + * 3) void UpdateExpression[?yield] + * 4) typeof UpdateExpression[?yield] + * 5) + UpdateExpression[?yield] + * 6) - UpdateExpression[?yield] + * 7) ~ UpdateExpression[?yield] + * 8) ! UpdateExpression[?yield] + */ + const unaryOperator = token(); + const simpleUnaryExpression = parseSimpleUnaryExpression(); + if (token() === SyntaxKind.AsteriskAsteriskToken) { + const pos = skipTrivia(sourceText, simpleUnaryExpression.pos); + const { end } = simpleUnaryExpression; + if (simpleUnaryExpression.kind === SyntaxKind.TypeAssertionExpression) { + parseErrorAt(pos, end, Diagnostics.A_type_assertion_expression_is_not_allowed_in_the_left_hand_side_of_an_exponentiation_expression_Consider_enclosing_the_expression_in_parentheses); + } + else { + parseErrorAt(pos, end, Diagnostics.An_unary_expression_with_the_0_operator_is_not_allowed_in_the_left_hand_side_of_an_exponentiation_expression_Consider_enclosing_the_expression_in_parentheses, tokenToString(unaryOperator)); + } + } + return simpleUnaryExpression; + } + + /** + * Parse ES7 simple-unary expression or higher: + * + * ES7 UnaryExpression: + * 1) UpdateExpression[?yield] + * 2) delete UnaryExpression[?yield] + * 3) void UnaryExpression[?yield] + * 4) typeof UnaryExpression[?yield] + * 5) + UnaryExpression[?yield] + * 6) - UnaryExpression[?yield] + * 7) ~ UnaryExpression[?yield] + * 8) ! UnaryExpression[?yield] + * 9) [+Await] await UnaryExpression[?yield] + */ + function parseSimpleUnaryExpression(): UnaryExpression { + switch (token()) { + case SyntaxKind.PlusToken: + case SyntaxKind.MinusToken: + case SyntaxKind.TildeToken: + case SyntaxKind.ExclamationToken: + return parsePrefixUnaryExpression(); + case SyntaxKind.DeleteKeyword: + return parseDeleteExpression(); + case SyntaxKind.TypeOfKeyword: + return parseTypeOfExpression(); + case SyntaxKind.VoidKeyword: + return parseVoidExpression(); + case SyntaxKind.LessThanToken: + // This is modified UnaryExpression grammar in TypeScript + // UnaryExpression (modified): + // < type > UnaryExpression + return parseTypeAssertion(); + case SyntaxKind.AwaitKeyword: + if (isAwaitExpression()) { + return parseAwaitExpression(); + } + // falls through + default: + return parseUpdateExpression(); + } + } + + /** + * Check if the current token can possibly be an ES7 increment expression. + * + * ES7 UpdateExpression: + * LeftHandSideExpression[?Yield] + * LeftHandSideExpression[?Yield][no LineTerminator here]++ + * LeftHandSideExpression[?Yield][no LineTerminator here]-- + * ++LeftHandSideExpression[?Yield] + * --LeftHandSideExpression[?Yield] + */ + function isUpdateExpression(): boolean { + // This function is called inside parseUnaryExpression to decide + // whether to call parseSimpleUnaryExpression or call parseUpdateExpression directly + switch (token()) { + case SyntaxKind.PlusToken: + case SyntaxKind.MinusToken: + case SyntaxKind.TildeToken: + case SyntaxKind.ExclamationToken: + case SyntaxKind.DeleteKeyword: + case SyntaxKind.TypeOfKeyword: + case SyntaxKind.VoidKeyword: + case SyntaxKind.AwaitKeyword: + return false; + case SyntaxKind.LessThanToken: + // If we are not in JSX context, we are parsing TypeAssertion which is an UnaryExpression + if (sourceFile.languageVariant !== LanguageVariant.JSX) { + return false; + } + // We are in JSX context and the token is part of JSXElement. + // falls through + default: + return true; + } + } + + /** + * Parse ES7 UpdateExpression. UpdateExpression is used instead of ES6's PostFixExpression. + * + * ES7 UpdateExpression[yield]: + * 1) LeftHandSideExpression[?yield] + * 2) LeftHandSideExpression[?yield] [[no LineTerminator here]]++ + * 3) LeftHandSideExpression[?yield] [[no LineTerminator here]]-- + * 4) ++LeftHandSideExpression[?yield] + * 5) --LeftHandSideExpression[?yield] + * In TypeScript (2), (3) are parsed as PostfixUnaryExpression. (4), (5) are parsed as PrefixUnaryExpression + */ + function parseUpdateExpression(): UpdateExpression { + if (token() === SyntaxKind.PlusPlusToken || token() === SyntaxKind.MinusMinusToken) { + const node = createNode(SyntaxKind.PrefixUnaryExpression); + node.operator = token(); + nextToken(); + node.operand = parseLeftHandSideExpressionOrHigher(); + return finishNode(node); + } + else if (sourceFile.languageVariant === LanguageVariant.JSX && token() === SyntaxKind.LessThanToken && lookAhead(nextTokenIsIdentifierOrKeywordOrGreaterThan)) { + // JSXElement is part of primaryExpression + return parseJsxElementOrSelfClosingElementOrFragment(/*inExpressionContext*/ true); + } + + const expression = parseLeftHandSideExpressionOrHigher(); + + Debug.assert(isLeftHandSideExpression(expression)); + if ((token() === SyntaxKind.PlusPlusToken || token() === SyntaxKind.MinusMinusToken) && !scanner.hasPrecedingLineBreak()) { + const node = createNode(SyntaxKind.PostfixUnaryExpression, expression.pos); + node.operand = expression; + node.operator = token(); + nextToken(); + return finishNode(node); + } + + return expression; + } + + function parseLeftHandSideExpressionOrHigher(): LeftHandSideExpression { + // Original Ecma: + // LeftHandSideExpression: See 11.2 + // NewExpression + // CallExpression + // + // Our simplification: + // + // LeftHandSideExpression: See 11.2 + // MemberExpression + // CallExpression + // + // See comment in parseMemberExpressionOrHigher on how we replaced NewExpression with + // MemberExpression to make our lives easier. + // + // to best understand the below code, it's important to see how CallExpression expands + // out into its own productions: + // + // CallExpression: + // MemberExpression Arguments + // CallExpression Arguments + // CallExpression[Expression] + // CallExpression.IdentifierName + // import (AssignmentExpression) + // super Arguments + // super.IdentifierName + // + // Because of the recursion in these calls, we need to bottom out first. There are three + // bottom out states we can run into: 1) We see 'super' which must start either of + // the last two CallExpression productions. 2) We see 'import' which must start import call. + // 3)we have a MemberExpression which either completes the LeftHandSideExpression, + // or starts the beginning of the first four CallExpression productions. + let expression: MemberExpression; + if (token() === SyntaxKind.ImportKeyword) { + if (lookAhead(nextTokenIsOpenParenOrLessThan)) { + // We don't want to eagerly consume all import keyword as import call expression so we look ahead to find "(" + // For example: + // var foo3 = require("subfolder + // import * as foo1 from "module-from-node + // We want this import to be a statement rather than import call expression + sourceFile.flags |= NodeFlags.PossiblyContainsDynamicImport; + expression = parseTokenNode(); + } + else if (lookAhead(nextTokenIsDot)) { + // This is an 'import.*' metaproperty (i.e. 'import.meta') + const fullStart = scanner.getStartPos(); + nextToken(); // advance past the 'import' + nextToken(); // advance past the dot + const node = createNode(SyntaxKind.MetaProperty, fullStart) as MetaProperty; + node.keywordToken = SyntaxKind.ImportKeyword; + node.name = parseIdentifierName(); + expression = finishNode(node); + + sourceFile.flags |= NodeFlags.PossiblyContainsImportMeta; + } + else { + expression = parseMemberExpressionOrHigher(); + } + } + else { + expression = token() === SyntaxKind.SuperKeyword ? parseSuperExpression() : parseMemberExpressionOrHigher(); + } + + // Now, we *may* be complete. However, we might have consumed the start of a + // CallExpression. As such, we need to consume the rest of it here to be complete. + return parseCallExpressionRest(expression); + } + + function parseMemberExpressionOrHigher(): MemberExpression { + // Note: to make our lives simpler, we decompose the NewExpression productions and + // place ObjectCreationExpression and FunctionExpression into PrimaryExpression. + // like so: + // + // PrimaryExpression : See 11.1 + // this + // Identifier + // Literal + // ArrayLiteral + // ObjectLiteral + // (Expression) + // FunctionExpression + // new MemberExpression Arguments? + // + // MemberExpression : See 11.2 + // PrimaryExpression + // MemberExpression[Expression] + // MemberExpression.IdentifierName + // + // CallExpression : See 11.2 + // MemberExpression + // CallExpression Arguments + // CallExpression[Expression] + // CallExpression.IdentifierName + // + // Technically this is ambiguous. i.e. CallExpression defines: + // + // CallExpression: + // CallExpression Arguments + // + // If you see: "new Foo()" + // + // Then that could be treated as a single ObjectCreationExpression, or it could be + // treated as the invocation of "new Foo". We disambiguate that in code (to match + // the original grammar) by making sure that if we see an ObjectCreationExpression + // we always consume arguments if they are there. So we treat "new Foo()" as an + // object creation only, and not at all as an invocation. Another way to think + // about this is that for every "new" that we see, we will consume an argument list if + // it is there as part of the *associated* object creation node. Any additional + // argument lists we see, will become invocation expressions. + // + // Because there are no other places in the grammar now that refer to FunctionExpression + // or ObjectCreationExpression, it is safe to push down into the PrimaryExpression + // production. + // + // Because CallExpression and MemberExpression are left recursive, we need to bottom out + // of the recursion immediately. So we parse out a primary expression to start with. + const expression = parsePrimaryExpression(); + return parseMemberExpressionRest(expression); + } + + function parseSuperExpression(): MemberExpression { + const expression = parseTokenNode(); + if (token() === SyntaxKind.OpenParenToken || token() === SyntaxKind.DotToken || token() === SyntaxKind.OpenBracketToken) { + return expression; + } + + // If we have seen "super" it must be followed by '(' or '.'. + // If it wasn't then just try to parse out a '.' and report an error. + const node = createNode(SyntaxKind.PropertyAccessExpression, expression.pos); + node.expression = expression; + parseExpectedToken(SyntaxKind.DotToken, Diagnostics.super_must_be_followed_by_an_argument_list_or_member_access); + node.name = parseRightSideOfDot(/*allowIdentifierNames*/ true); + return finishNode(node); + } + + function parseJsxElementOrSelfClosingElementOrFragment(inExpressionContext: boolean): JsxElement | JsxSelfClosingElement | JsxFragment { + const opening = parseJsxOpeningOrSelfClosingElementOrOpeningFragment(inExpressionContext); + let result: JsxElement | JsxSelfClosingElement | JsxFragment; + if (opening.kind === SyntaxKind.JsxOpeningElement) { + const node = createNode(SyntaxKind.JsxElement, opening.pos); + node.openingElement = opening; + + node.children = parseJsxChildren(node.openingElement); + node.closingElement = parseJsxClosingElement(inExpressionContext); + + if (!tagNamesAreEquivalent(node.openingElement.tagName, node.closingElement.tagName)) { + parseErrorAtRange(node.closingElement, Diagnostics.Expected_corresponding_JSX_closing_tag_for_0, getTextOfNodeFromSourceText(sourceText, node.openingElement.tagName)); + } + + result = finishNode(node); + } + else if (opening.kind === SyntaxKind.JsxOpeningFragment) { + const node = createNode(SyntaxKind.JsxFragment, opening.pos); + node.openingFragment = opening; + node.children = parseJsxChildren(node.openingFragment); + node.closingFragment = parseJsxClosingFragment(inExpressionContext); + + result = finishNode(node); + } + else { + Debug.assert(opening.kind === SyntaxKind.JsxSelfClosingElement); + // Nothing else to do for self-closing elements + result = opening; + } + + // If the user writes the invalid code '
' in an expression context (i.e. not wrapped in + // an enclosing tag), we'll naively try to parse ^ this as a 'less than' operator and the remainder of the tag + // as garbage, which will cause the formatter to badly mangle the JSX. Perform a speculative parse of a JSX + // element if we see a < token so that we can wrap it in a synthetic binary expression so the formatter + // does less damage and we can report a better error. + // Since JSX elements are invalid < operands anyway, this lookahead parse will only occur in error scenarios + // of one sort or another. + if (inExpressionContext && token() === SyntaxKind.LessThanToken) { + const invalidElement = tryParse(() => parseJsxElementOrSelfClosingElementOrFragment(/*inExpressionContext*/ true)); + if (invalidElement) { + parseErrorAtCurrentToken(Diagnostics.JSX_expressions_must_have_one_parent_element); + const badNode = createNode(SyntaxKind.BinaryExpression, result.pos); + badNode.end = invalidElement.end; + badNode.left = result; + badNode.right = invalidElement; + badNode.operatorToken = createMissingNode(SyntaxKind.CommaToken, /*reportAtCurrentPosition*/ false, /*diagnosticMessage*/ undefined!); // TODO: GH#18217 + badNode.operatorToken.pos = badNode.operatorToken.end = badNode.right.pos; + return badNode; + } + } + + return result; + } + + function parseJsxText(): JsxText { + const node = createNode(SyntaxKind.JsxText); + node.containsOnlyWhiteSpaces = currentToken === SyntaxKind.JsxTextAllWhiteSpaces; + currentToken = scanner.scanJsxToken(); + return finishNode(node); + } + + function parseJsxChild(openingTag: JsxOpeningElement | JsxOpeningFragment, token: JsxTokenSyntaxKind): JsxChild | undefined { + switch (token) { + case SyntaxKind.EndOfFileToken: + // If we hit EOF, issue the error at the tag that lacks the closing element + // rather than at the end of the file (which is useless) + if (isJsxOpeningFragment(openingTag)) { + parseErrorAtRange(openingTag, Diagnostics.JSX_fragment_has_no_corresponding_closing_tag); + } + else { + parseErrorAtRange(openingTag.tagName, Diagnostics.JSX_element_0_has_no_corresponding_closing_tag, getTextOfNodeFromSourceText(sourceText, openingTag.tagName)); + } + return undefined; + case SyntaxKind.LessThanSlashToken: + case SyntaxKind.ConflictMarkerTrivia: + return undefined; + case SyntaxKind.JsxText: + case SyntaxKind.JsxTextAllWhiteSpaces: + return parseJsxText(); + case SyntaxKind.OpenBraceToken: + return parseJsxExpression(/*inExpressionContext*/ false); + case SyntaxKind.LessThanToken: + return parseJsxElementOrSelfClosingElementOrFragment(/*inExpressionContext*/ false); + default: + return Debug.assertNever(token); + } + } + + function parseJsxChildren(openingTag: JsxOpeningElement | JsxOpeningFragment): NodeArray { + const list = []; + const listPos = getNodePos(); + const saveParsingContext = parsingContext; + parsingContext |= 1 << ParsingContext.JsxChildren; + + while (true) { + const child = parseJsxChild(openingTag, currentToken = scanner.reScanJsxToken()); + if (!child) break; + list.push(child); + } + + parsingContext = saveParsingContext; + return createNodeArray(list, listPos); + } + + function parseJsxAttributes(): JsxAttributes { + const jsxAttributes = createNode(SyntaxKind.JsxAttributes); + jsxAttributes.properties = parseList(ParsingContext.JsxAttributes, parseJsxAttribute); + return finishNode(jsxAttributes); + } + + function parseJsxOpeningOrSelfClosingElementOrOpeningFragment(inExpressionContext: boolean): JsxOpeningElement | JsxSelfClosingElement | JsxOpeningFragment { + const fullStart = scanner.getStartPos(); + + parseExpected(SyntaxKind.LessThanToken); + + if (token() === SyntaxKind.GreaterThanToken) { + // See below for explanation of scanJsxText + const node: JsxOpeningFragment = createNode(SyntaxKind.JsxOpeningFragment, fullStart); + scanJsxText(); + return finishNode(node); + } + + const tagName = parseJsxElementName(); + const typeArguments = tryParseTypeArguments(); + const attributes = parseJsxAttributes(); + + let node: JsxOpeningLikeElement; + + if (token() === SyntaxKind.GreaterThanToken) { + // Closing tag, so scan the immediately-following text with the JSX scanning instead + // of regular scanning to avoid treating illegal characters (e.g. '#') as immediate + // scanning errors + node = createNode(SyntaxKind.JsxOpeningElement, fullStart); + scanJsxText(); + } + else { + parseExpected(SyntaxKind.SlashToken); + if (inExpressionContext) { + parseExpected(SyntaxKind.GreaterThanToken); + } + else { + parseExpected(SyntaxKind.GreaterThanToken, /*diagnostic*/ undefined, /*shouldAdvance*/ false); + scanJsxText(); + } + node = createNode(SyntaxKind.JsxSelfClosingElement, fullStart); + } + + node.tagName = tagName; + node.typeArguments = typeArguments; + node.attributes = attributes; + + return finishNode(node); + } + + function parseJsxElementName(): JsxTagNameExpression { + scanJsxIdentifier(); + // JsxElement can have name in the form of + // propertyAccessExpression + // primaryExpression in the form of an identifier and "this" keyword + // We can't just simply use parseLeftHandSideExpressionOrHigher because then we will start consider class,function etc as a keyword + // We only want to consider "this" as a primaryExpression + let expression: JsxTagNameExpression = token() === SyntaxKind.ThisKeyword ? + parseTokenNode() : parseIdentifierName(); + while (parseOptional(SyntaxKind.DotToken)) { + const propertyAccess: JsxTagNamePropertyAccess = createNode(SyntaxKind.PropertyAccessExpression, expression.pos); + propertyAccess.expression = expression; + propertyAccess.name = parseRightSideOfDot(/*allowIdentifierNames*/ true); + expression = finishNode(propertyAccess); + } + return expression; + } + + function parseJsxExpression(inExpressionContext: boolean): JsxExpression | undefined { + const node = createNode(SyntaxKind.JsxExpression); + + if (!parseExpected(SyntaxKind.OpenBraceToken)) { + return undefined; + } + + if (token() !== SyntaxKind.CloseBraceToken) { + node.dotDotDotToken = parseOptionalToken(SyntaxKind.DotDotDotToken); + node.expression = parseAssignmentExpressionOrHigher(); + } + if (inExpressionContext) { + parseExpected(SyntaxKind.CloseBraceToken); + } + else { + parseExpected(SyntaxKind.CloseBraceToken, /*message*/ undefined, /*shouldAdvance*/ false); + scanJsxText(); + } + + return finishNode(node); + } + + function parseJsxAttribute(): JsxAttribute | JsxSpreadAttribute { + if (token() === SyntaxKind.OpenBraceToken) { + return parseJsxSpreadAttribute(); + } + + scanJsxIdentifier(); + const node = createNode(SyntaxKind.JsxAttribute); + node.name = parseIdentifierName(); + if (token() === SyntaxKind.EqualsToken) { + switch (scanJsxAttributeValue()) { + case SyntaxKind.StringLiteral: + node.initializer = parseLiteralNode(); + break; + default: + node.initializer = parseJsxExpression(/*inExpressionContext*/ true); + break; + } + } + return finishNode(node); + } + + function parseJsxSpreadAttribute(): JsxSpreadAttribute { + const node = createNode(SyntaxKind.JsxSpreadAttribute); + parseExpected(SyntaxKind.OpenBraceToken); + parseExpected(SyntaxKind.DotDotDotToken); + node.expression = parseExpression(); + parseExpected(SyntaxKind.CloseBraceToken); + return finishNode(node); + } + + function parseJsxClosingElement(inExpressionContext: boolean): JsxClosingElement { + const node = createNode(SyntaxKind.JsxClosingElement); + parseExpected(SyntaxKind.LessThanSlashToken); + node.tagName = parseJsxElementName(); + if (inExpressionContext) { + parseExpected(SyntaxKind.GreaterThanToken); + } + else { + parseExpected(SyntaxKind.GreaterThanToken, /*diagnostic*/ undefined, /*shouldAdvance*/ false); + scanJsxText(); + } + return finishNode(node); + } + + function parseJsxClosingFragment(inExpressionContext: boolean): JsxClosingFragment { + const node = createNode(SyntaxKind.JsxClosingFragment); + parseExpected(SyntaxKind.LessThanSlashToken); + if (tokenIsIdentifierOrKeyword(token())) { + parseErrorAtRange(parseJsxElementName(), Diagnostics.Expected_corresponding_closing_tag_for_JSX_fragment); + } + if (inExpressionContext) { + parseExpected(SyntaxKind.GreaterThanToken); + } + else { + parseExpected(SyntaxKind.GreaterThanToken, /*diagnostic*/ undefined, /*shouldAdvance*/ false); + scanJsxText(); + } + return finishNode(node); + } + + function parseTypeAssertion(): TypeAssertion { + const node = createNode(SyntaxKind.TypeAssertionExpression); + parseExpected(SyntaxKind.LessThanToken); + node.type = parseType(); + parseExpected(SyntaxKind.GreaterThanToken); + node.expression = parseSimpleUnaryExpression(); + return finishNode(node); + } + + function parseMemberExpressionRest(expression: LeftHandSideExpression): MemberExpression { + while (true) { + const dotToken = parseOptionalToken(SyntaxKind.DotToken); + if (dotToken) { + const propertyAccess = createNode(SyntaxKind.PropertyAccessExpression, expression.pos); + propertyAccess.expression = expression; + propertyAccess.name = parseRightSideOfDot(/*allowIdentifierNames*/ true); + expression = finishNode(propertyAccess); + continue; + } + + if (token() === SyntaxKind.ExclamationToken && !scanner.hasPrecedingLineBreak()) { + nextToken(); + const nonNullExpression = createNode(SyntaxKind.NonNullExpression, expression.pos); + nonNullExpression.expression = expression; + expression = finishNode(nonNullExpression); + continue; + } + + // when in the [Decorator] context, we do not parse ElementAccess as it could be part of a ComputedPropertyName + if (!inDecoratorContext() && parseOptional(SyntaxKind.OpenBracketToken)) { + const indexedAccess = createNode(SyntaxKind.ElementAccessExpression, expression.pos); + indexedAccess.expression = expression; + + if (token() === SyntaxKind.CloseBracketToken) { + indexedAccess.argumentExpression = createMissingNode(SyntaxKind.Identifier, /*reportAtCurrentPosition*/ true, Diagnostics.An_element_access_expression_should_take_an_argument); + } + else { + const argument = allowInAnd(parseExpression); + if (isStringOrNumericLiteralLike(argument)) { + argument.text = internIdentifier(argument.text); + } + indexedAccess.argumentExpression = argument; + } + + parseExpected(SyntaxKind.CloseBracketToken); + expression = finishNode(indexedAccess); + continue; + } + + if (isTemplateStartOfTaggedTemplate()) { + expression = parseTaggedTemplateRest(expression, /*typeArguments*/ undefined); + continue; + } + + return expression; + } + } + + function isTemplateStartOfTaggedTemplate() { + return token() === SyntaxKind.NoSubstitutionTemplateLiteral || token() === SyntaxKind.TemplateHead; + } + + function parseTaggedTemplateRest(tag: LeftHandSideExpression, typeArguments: NodeArray | undefined) { + const tagExpression = createNode(SyntaxKind.TaggedTemplateExpression, tag.pos); + tagExpression.tag = tag; + tagExpression.typeArguments = typeArguments; + tagExpression.template = token() === SyntaxKind.NoSubstitutionTemplateLiteral + ? parseLiteralNode() + : parseTemplateExpression(); + return finishNode(tagExpression); + } + + function parseCallExpressionRest(expression: LeftHandSideExpression): LeftHandSideExpression { + while (true) { + expression = parseMemberExpressionRest(expression); + if (token() === SyntaxKind.LessThanToken) { + // See if this is the start of a generic invocation. If so, consume it and + // keep checking for postfix expressions. Otherwise, it's just a '<' that's + // part of an arithmetic expression. Break out so we consume it higher in the + // stack. + const typeArguments = tryParse(parseTypeArgumentsInExpression); + if (!typeArguments) { + return expression; + } + + if (isTemplateStartOfTaggedTemplate()) { + expression = parseTaggedTemplateRest(expression, typeArguments); + continue; + } + + const callExpr = createNode(SyntaxKind.CallExpression, expression.pos); + callExpr.expression = expression; + callExpr.typeArguments = typeArguments; + callExpr.arguments = parseArgumentList(); + expression = finishNode(callExpr); + continue; + } + else if (token() === SyntaxKind.OpenParenToken) { + const callExpr = createNode(SyntaxKind.CallExpression, expression.pos); + callExpr.expression = expression; + callExpr.arguments = parseArgumentList(); + expression = finishNode(callExpr); + continue; + } + + return expression; + } + } + + function parseArgumentList() { + parseExpected(SyntaxKind.OpenParenToken); + const result = parseDelimitedList(ParsingContext.ArgumentExpressions, parseArgumentExpression); + parseExpected(SyntaxKind.CloseParenToken); + return result; + } + + function parseTypeArgumentsInExpression() { + if (!parseOptional(SyntaxKind.LessThanToken)) { + return undefined; + } + + const typeArguments = parseDelimitedList(ParsingContext.TypeArguments, parseType); + if (!parseExpected(SyntaxKind.GreaterThanToken)) { + // If it doesn't have the closing `>` then it's definitely not an type argument list. + return undefined; + } + + // If we have a '<', then only parse this as a argument list if the type arguments + // are complete and we have an open paren. if we don't, rewind and return nothing. + return typeArguments && canFollowTypeArgumentsInExpression() + ? typeArguments + : undefined; + } + + function canFollowTypeArgumentsInExpression(): boolean { + switch (token()) { + case SyntaxKind.OpenParenToken: // foo( + case SyntaxKind.NoSubstitutionTemplateLiteral: // foo `...` + case SyntaxKind.TemplateHead: // foo `...${100}...` + // these are the only tokens can legally follow a type argument + // list. So we definitely want to treat them as type arg lists. + + case SyntaxKind.DotToken: // foo. + case SyntaxKind.CloseParenToken: // foo) + case SyntaxKind.CloseBracketToken: // foo] + case SyntaxKind.ColonToken: // foo: + case SyntaxKind.SemicolonToken: // foo; + case SyntaxKind.QuestionToken: // foo? + case SyntaxKind.EqualsEqualsToken: // foo == + case SyntaxKind.EqualsEqualsEqualsToken: // foo === + case SyntaxKind.ExclamationEqualsToken: // foo != + case SyntaxKind.ExclamationEqualsEqualsToken: // foo !== + case SyntaxKind.AmpersandAmpersandToken: // foo && + case SyntaxKind.BarBarToken: // foo || + case SyntaxKind.CaretToken: // foo ^ + case SyntaxKind.AmpersandToken: // foo & + case SyntaxKind.BarToken: // foo | + case SyntaxKind.CloseBraceToken: // foo } + case SyntaxKind.EndOfFileToken: // foo + // these cases can't legally follow a type arg list. However, they're not legal + // expressions either. The user is probably in the middle of a generic type. So + // treat it as such. + return true; + + case SyntaxKind.CommaToken: // foo, + case SyntaxKind.OpenBraceToken: // foo { + // We don't want to treat these as type arguments. Otherwise we'll parse this + // as an invocation expression. Instead, we want to parse out the expression + // in isolation from the type arguments. + + default: + // Anything else treat as an expression. + return false; + } + } + + function parsePrimaryExpression(): PrimaryExpression { + switch (token()) { + case SyntaxKind.NumericLiteral: + case SyntaxKind.StringLiteral: + case SyntaxKind.NoSubstitutionTemplateLiteral: + return parseLiteralNode(); + case SyntaxKind.ThisKeyword: + case SyntaxKind.SuperKeyword: + case SyntaxKind.NullKeyword: + case SyntaxKind.TrueKeyword: + case SyntaxKind.FalseKeyword: + return parseTokenNode(); + case SyntaxKind.OpenParenToken: + return parseParenthesizedExpression(); + case SyntaxKind.OpenBracketToken: + return parseArrayLiteralExpression(); + case SyntaxKind.OpenBraceToken: + return parseObjectLiteralExpression(); + case SyntaxKind.AsyncKeyword: + // Async arrow functions are parsed earlier in parseAssignmentExpressionOrHigher. + // If we encounter `async [no LineTerminator here] function` then this is an async + // function; otherwise, its an identifier. + if (!lookAhead(nextTokenIsFunctionKeywordOnSameLine)) { + break; + } + + return parseFunctionExpression(); + case SyntaxKind.ClassKeyword: + return parseClassExpression(); + case SyntaxKind.FunctionKeyword: + return parseFunctionExpression(); + case SyntaxKind.NewKeyword: + return parseNewExpressionOrNewDotTarget(); + case SyntaxKind.SlashToken: + case SyntaxKind.SlashEqualsToken: + if (reScanSlashToken() === SyntaxKind.RegularExpressionLiteral) { + return parseLiteralNode(); + } + break; + case SyntaxKind.TemplateHead: + return parseTemplateExpression(); + } + + return parseIdentifier(Diagnostics.Expression_expected); + } + + function parseParenthesizedExpression(): ParenthesizedExpression { + const node = createNodeWithJSDoc(SyntaxKind.ParenthesizedExpression); + parseExpected(SyntaxKind.OpenParenToken); + node.expression = allowInAnd(parseExpression); + parseExpected(SyntaxKind.CloseParenToken); + return finishNode(node); + } + + function parseSpreadElement(): Expression { + const node = createNode(SyntaxKind.SpreadElement); + parseExpected(SyntaxKind.DotDotDotToken); + node.expression = parseAssignmentExpressionOrHigher(); + return finishNode(node); + } + + function parseArgumentOrArrayLiteralElement(): Expression { + return token() === SyntaxKind.DotDotDotToken ? parseSpreadElement() : + token() === SyntaxKind.CommaToken ? createNode(SyntaxKind.OmittedExpression) : + parseAssignmentExpressionOrHigher(); + } + + function parseArgumentExpression(): Expression { + return doOutsideOfContext(disallowInAndDecoratorContext, parseArgumentOrArrayLiteralElement); + } + + function parseArrayLiteralExpression(): ArrayLiteralExpression { + const node = createNode(SyntaxKind.ArrayLiteralExpression); + parseExpected(SyntaxKind.OpenBracketToken); + if (scanner.hasPrecedingLineBreak()) { + node.multiLine = true; + } + node.elements = parseDelimitedList(ParsingContext.ArrayLiteralMembers, parseArgumentOrArrayLiteralElement); + parseExpected(SyntaxKind.CloseBracketToken); + return finishNode(node); + } + + function parseObjectLiteralElement(): ObjectLiteralElementLike { + const node = createNodeWithJSDoc(SyntaxKind.Unknown); + + if (parseOptionalToken(SyntaxKind.DotDotDotToken)) { + node.kind = SyntaxKind.SpreadAssignment; + (node).expression = parseAssignmentExpressionOrHigher(); + return finishNode(node); + } + + node.decorators = parseDecorators(); + node.modifiers = parseModifiers(); + + if (parseContextualModifier(SyntaxKind.GetKeyword)) { + return parseAccessorDeclaration(node, SyntaxKind.GetAccessor); + } + if (parseContextualModifier(SyntaxKind.SetKeyword)) { + return parseAccessorDeclaration(node, SyntaxKind.SetAccessor); + } + + const asteriskToken = parseOptionalToken(SyntaxKind.AsteriskToken); + const tokenIsIdentifier = isIdentifier(); + node.name = parsePropertyName(); + // Disallowing of optional property assignments happens in the grammar checker. + (node).questionToken = parseOptionalToken(SyntaxKind.QuestionToken); + if (asteriskToken || token() === SyntaxKind.OpenParenToken || token() === SyntaxKind.LessThanToken) { + return parseMethodDeclaration(node, asteriskToken); + } + + // check if it is short-hand property assignment or normal property assignment + // NOTE: if token is EqualsToken it is interpreted as CoverInitializedName production + // CoverInitializedName[Yield] : + // IdentifierReference[?Yield] Initializer[In, ?Yield] + // this is necessary because ObjectLiteral productions are also used to cover grammar for ObjectAssignmentPattern + const isShorthandPropertyAssignment = + tokenIsIdentifier && (token() === SyntaxKind.CommaToken || token() === SyntaxKind.CloseBraceToken || token() === SyntaxKind.EqualsToken); + if (isShorthandPropertyAssignment) { + node.kind = SyntaxKind.ShorthandPropertyAssignment; + const equalsToken = parseOptionalToken(SyntaxKind.EqualsToken); + if (equalsToken) { + (node).equalsToken = equalsToken; + (node).objectAssignmentInitializer = allowInAnd(parseAssignmentExpressionOrHigher); + } + } + else { + node.kind = SyntaxKind.PropertyAssignment; + parseExpected(SyntaxKind.ColonToken); + (node).initializer = allowInAnd(parseAssignmentExpressionOrHigher); + } + return finishNode(node); + } + + function parseObjectLiteralExpression(): ObjectLiteralExpression { + const node = createNode(SyntaxKind.ObjectLiteralExpression); + parseExpected(SyntaxKind.OpenBraceToken); + if (scanner.hasPrecedingLineBreak()) { + node.multiLine = true; + } + + node.properties = parseDelimitedList(ParsingContext.ObjectLiteralMembers, parseObjectLiteralElement, /*considerSemicolonAsDelimiter*/ true); + parseExpected(SyntaxKind.CloseBraceToken); + return finishNode(node); + } + + function parseFunctionExpression(): FunctionExpression { + // GeneratorExpression: + // function* BindingIdentifier [Yield][opt](FormalParameters[Yield]){ GeneratorBody } + // + // FunctionExpression: + // function BindingIdentifier[opt](FormalParameters){ FunctionBody } + const saveDecoratorContext = inDecoratorContext(); + if (saveDecoratorContext) { + setDecoratorContext(/*val*/ false); + } + + const node = createNodeWithJSDoc(SyntaxKind.FunctionExpression); + node.modifiers = parseModifiers(); + parseExpected(SyntaxKind.FunctionKeyword); + node.asteriskToken = parseOptionalToken(SyntaxKind.AsteriskToken); + + const isGenerator = node.asteriskToken ? SignatureFlags.Yield : SignatureFlags.None; + const isAsync = hasModifier(node, ModifierFlags.Async) ? SignatureFlags.Await : SignatureFlags.None; + node.name = + isGenerator && isAsync ? doInYieldAndAwaitContext(parseOptionalIdentifier) : + isGenerator ? doInYieldContext(parseOptionalIdentifier) : + isAsync ? doInAwaitContext(parseOptionalIdentifier) : + parseOptionalIdentifier(); + + fillSignature(SyntaxKind.ColonToken, isGenerator | isAsync, node); + node.body = parseFunctionBlock(isGenerator | isAsync); + + if (saveDecoratorContext) { + setDecoratorContext(/*val*/ true); + } + + return finishNode(node); + } + + function parseOptionalIdentifier(): Identifier | undefined { + return isIdentifier() ? parseIdentifier() : undefined; + } + + function parseNewExpressionOrNewDotTarget(): NewExpression | MetaProperty { + const fullStart = scanner.getStartPos(); + parseExpected(SyntaxKind.NewKeyword); + if (parseOptional(SyntaxKind.DotToken)) { + const node = createNode(SyntaxKind.MetaProperty, fullStart); + node.keywordToken = SyntaxKind.NewKeyword; + node.name = parseIdentifierName(); + return finishNode(node); + } + + let expression: MemberExpression = parsePrimaryExpression(); + let typeArguments; + while (true) { + expression = parseMemberExpressionRest(expression); + typeArguments = tryParse(parseTypeArgumentsInExpression); + if (isTemplateStartOfTaggedTemplate()) { + Debug.assert(!!typeArguments, + "Expected a type argument list; all plain tagged template starts should be consumed in 'parseMemberExpressionRest'"); + expression = parseTaggedTemplateRest(expression, typeArguments); + typeArguments = undefined; + } + break; + } + + const node = createNode(SyntaxKind.NewExpression, fullStart); + node.expression = expression; + node.typeArguments = typeArguments; + if (node.typeArguments || token() === SyntaxKind.OpenParenToken) { + node.arguments = parseArgumentList(); + } + return finishNode(node); + } + + // STATEMENTS + function parseBlock(ignoreMissingOpenBrace: boolean, diagnosticMessage?: DiagnosticMessage): Block { + const node = createNode(SyntaxKind.Block); + if (parseExpected(SyntaxKind.OpenBraceToken, diagnosticMessage) || ignoreMissingOpenBrace) { + if (scanner.hasPrecedingLineBreak()) { + node.multiLine = true; + } + + node.statements = parseList(ParsingContext.BlockStatements, parseStatement); + parseExpected(SyntaxKind.CloseBraceToken); + } + else { + node.statements = createMissingList(); + } + return finishNode(node); + } + + function parseFunctionBlock(flags: SignatureFlags, diagnosticMessage?: DiagnosticMessage): Block { + const savedYieldContext = inYieldContext(); + setYieldContext(!!(flags & SignatureFlags.Yield)); + + const savedAwaitContext = inAwaitContext(); + setAwaitContext(!!(flags & SignatureFlags.Await)); + + // We may be in a [Decorator] context when parsing a function expression or + // arrow function. The body of the function is not in [Decorator] context. + const saveDecoratorContext = inDecoratorContext(); + if (saveDecoratorContext) { + setDecoratorContext(/*val*/ false); + } + + const block = parseBlock(!!(flags & SignatureFlags.IgnoreMissingOpenBrace), diagnosticMessage); + + if (saveDecoratorContext) { + setDecoratorContext(/*val*/ true); + } + + setYieldContext(savedYieldContext); + setAwaitContext(savedAwaitContext); + + return block; + } + + function parseEmptyStatement(): Statement { + const node = createNode(SyntaxKind.EmptyStatement); + parseExpected(SyntaxKind.SemicolonToken); + return finishNode(node); + } + + function parseIfStatement(): IfStatement { + const node = createNode(SyntaxKind.IfStatement); + parseExpected(SyntaxKind.IfKeyword); + parseExpected(SyntaxKind.OpenParenToken); + node.expression = allowInAnd(parseExpression); + parseExpected(SyntaxKind.CloseParenToken); + node.thenStatement = parseStatement(); + node.elseStatement = parseOptional(SyntaxKind.ElseKeyword) ? parseStatement() : undefined; + return finishNode(node); + } + + function parseDoStatement(): DoStatement { + const node = createNode(SyntaxKind.DoStatement); + parseExpected(SyntaxKind.DoKeyword); + node.statement = parseStatement(); + parseExpected(SyntaxKind.WhileKeyword); + parseExpected(SyntaxKind.OpenParenToken); + node.expression = allowInAnd(parseExpression); + parseExpected(SyntaxKind.CloseParenToken); + + // From: https://mail.mozilla.org/pipermail/es-discuss/2011-August/016188.html + // 157 min --- All allen at wirfs-brock.com CONF --- "do{;}while(false)false" prohibited in + // spec but allowed in consensus reality. Approved -- this is the de-facto standard whereby + // do;while(0)x will have a semicolon inserted before x. + parseOptional(SyntaxKind.SemicolonToken); + return finishNode(node); + } + + function parseWhileStatement(): WhileStatement { + const node = createNode(SyntaxKind.WhileStatement); + parseExpected(SyntaxKind.WhileKeyword); + parseExpected(SyntaxKind.OpenParenToken); + node.expression = allowInAnd(parseExpression); + parseExpected(SyntaxKind.CloseParenToken); + node.statement = parseStatement(); + return finishNode(node); + } + + function parseForOrForInOrForOfStatement(): Statement { + const pos = getNodePos(); + parseExpected(SyntaxKind.ForKeyword); + const awaitToken = parseOptionalToken(SyntaxKind.AwaitKeyword); + parseExpected(SyntaxKind.OpenParenToken); + + let initializer!: VariableDeclarationList | Expression; + if (token() !== SyntaxKind.SemicolonToken) { + if (token() === SyntaxKind.VarKeyword || token() === SyntaxKind.LetKeyword || token() === SyntaxKind.ConstKeyword) { + initializer = parseVariableDeclarationList(/*inForStatementInitializer*/ true); + } + else { + initializer = disallowInAnd(parseExpression); + } + } + let forOrForInOrForOfStatement: IterationStatement; + if (awaitToken ? parseExpected(SyntaxKind.OfKeyword) : parseOptional(SyntaxKind.OfKeyword)) { + const forOfStatement = createNode(SyntaxKind.ForOfStatement, pos); + forOfStatement.awaitModifier = awaitToken; + forOfStatement.initializer = initializer; + forOfStatement.expression = allowInAnd(parseAssignmentExpressionOrHigher); + parseExpected(SyntaxKind.CloseParenToken); + forOrForInOrForOfStatement = forOfStatement; + } + else if (parseOptional(SyntaxKind.InKeyword)) { + const forInStatement = createNode(SyntaxKind.ForInStatement, pos); + forInStatement.initializer = initializer; + forInStatement.expression = allowInAnd(parseExpression); + parseExpected(SyntaxKind.CloseParenToken); + forOrForInOrForOfStatement = forInStatement; + } + else { + const forStatement = createNode(SyntaxKind.ForStatement, pos); + forStatement.initializer = initializer; + parseExpected(SyntaxKind.SemicolonToken); + if (token() !== SyntaxKind.SemicolonToken && token() !== SyntaxKind.CloseParenToken) { + forStatement.condition = allowInAnd(parseExpression); + } + parseExpected(SyntaxKind.SemicolonToken); + if (token() !== SyntaxKind.CloseParenToken) { + forStatement.incrementor = allowInAnd(parseExpression); + } + parseExpected(SyntaxKind.CloseParenToken); + forOrForInOrForOfStatement = forStatement; + } + + forOrForInOrForOfStatement.statement = parseStatement(); + + return finishNode(forOrForInOrForOfStatement); + } + + function parseBreakOrContinueStatement(kind: SyntaxKind): BreakOrContinueStatement { + const node = createNode(kind); + + parseExpected(kind === SyntaxKind.BreakStatement ? SyntaxKind.BreakKeyword : SyntaxKind.ContinueKeyword); + if (!canParseSemicolon()) { + node.label = parseIdentifier(); + } + + parseSemicolon(); + return finishNode(node); + } + + function parseReturnStatement(): ReturnStatement { + const node = createNode(SyntaxKind.ReturnStatement); + + parseExpected(SyntaxKind.ReturnKeyword); + if (!canParseSemicolon()) { + node.expression = allowInAnd(parseExpression); + } + + parseSemicolon(); + return finishNode(node); + } + + function parseWithStatement(): WithStatement { + const node = createNode(SyntaxKind.WithStatement); + parseExpected(SyntaxKind.WithKeyword); + parseExpected(SyntaxKind.OpenParenToken); + node.expression = allowInAnd(parseExpression); + parseExpected(SyntaxKind.CloseParenToken); + node.statement = doInsideOfContext(NodeFlags.InWithStatement, parseStatement); + return finishNode(node); + } + + function parseCaseClause(): CaseClause { + const node = createNode(SyntaxKind.CaseClause); + parseExpected(SyntaxKind.CaseKeyword); + node.expression = allowInAnd(parseExpression); + parseExpected(SyntaxKind.ColonToken); + node.statements = parseList(ParsingContext.SwitchClauseStatements, parseStatement); + return finishNode(node); + } + + function parseDefaultClause(): DefaultClause { + const node = createNode(SyntaxKind.DefaultClause); + parseExpected(SyntaxKind.DefaultKeyword); + parseExpected(SyntaxKind.ColonToken); + node.statements = parseList(ParsingContext.SwitchClauseStatements, parseStatement); + return finishNode(node); + } + + function parseCaseOrDefaultClause(): CaseOrDefaultClause { + return token() === SyntaxKind.CaseKeyword ? parseCaseClause() : parseDefaultClause(); + } + + function parseSwitchStatement(): SwitchStatement { + const node = createNode(SyntaxKind.SwitchStatement); + parseExpected(SyntaxKind.SwitchKeyword); + parseExpected(SyntaxKind.OpenParenToken); + node.expression = allowInAnd(parseExpression); + parseExpected(SyntaxKind.CloseParenToken); + const caseBlock = createNode(SyntaxKind.CaseBlock); + parseExpected(SyntaxKind.OpenBraceToken); + caseBlock.clauses = parseList(ParsingContext.SwitchClauses, parseCaseOrDefaultClause); + parseExpected(SyntaxKind.CloseBraceToken); + node.caseBlock = finishNode(caseBlock); + return finishNode(node); + } + + function parseThrowStatement(): ThrowStatement { + // ThrowStatement[Yield] : + // throw [no LineTerminator here]Expression[In, ?Yield]; + + // Because of automatic semicolon insertion, we need to report error if this + // throw could be terminated with a semicolon. Note: we can't call 'parseExpression' + // directly as that might consume an expression on the following line. + // We just return 'undefined' in that case. The actual error will be reported in the + // grammar walker. + const node = createNode(SyntaxKind.ThrowStatement); + parseExpected(SyntaxKind.ThrowKeyword); + node.expression = scanner.hasPrecedingLineBreak() ? undefined : allowInAnd(parseExpression); + parseSemicolon(); + return finishNode(node); + } + + // TODO: Review for error recovery + function parseTryStatement(): TryStatement { + const node = createNode(SyntaxKind.TryStatement); + + parseExpected(SyntaxKind.TryKeyword); + node.tryBlock = parseBlock(/*ignoreMissingOpenBrace*/ false); + node.catchClause = token() === SyntaxKind.CatchKeyword ? parseCatchClause() : undefined; + + // If we don't have a catch clause, then we must have a finally clause. Try to parse + // one out no matter what. + if (!node.catchClause || token() === SyntaxKind.FinallyKeyword) { + parseExpected(SyntaxKind.FinallyKeyword); + node.finallyBlock = parseBlock(/*ignoreMissingOpenBrace*/ false); + } + + return finishNode(node); + } + + function parseCatchClause(): CatchClause { + const result = createNode(SyntaxKind.CatchClause); + parseExpected(SyntaxKind.CatchKeyword); + + if (parseOptional(SyntaxKind.OpenParenToken)) { + result.variableDeclaration = parseVariableDeclaration(); + parseExpected(SyntaxKind.CloseParenToken); + } + else { + // Keep shape of node to avoid degrading performance. + result.variableDeclaration = undefined; + } + + result.block = parseBlock(/*ignoreMissingOpenBrace*/ false); + return finishNode(result); + } + + function parseDebuggerStatement(): Statement { + const node = createNode(SyntaxKind.DebuggerStatement); + parseExpected(SyntaxKind.DebuggerKeyword); + parseSemicolon(); + return finishNode(node); + } + + function parseExpressionOrLabeledStatement(): ExpressionStatement | LabeledStatement { + // Avoiding having to do the lookahead for a labeled statement by just trying to parse + // out an expression, seeing if it is identifier and then seeing if it is followed by + // a colon. + const node = createNodeWithJSDoc(SyntaxKind.Unknown); + const expression = allowInAnd(parseExpression); + if (expression.kind === SyntaxKind.Identifier && parseOptional(SyntaxKind.ColonToken)) { + node.kind = SyntaxKind.LabeledStatement; + (node).label = expression; + (node).statement = parseStatement(); + } + else { + node.kind = SyntaxKind.ExpressionStatement; + (node).expression = expression; + parseSemicolon(); + } + return finishNode(node); + } + + function nextTokenIsIdentifierOrKeywordOnSameLine() { + nextToken(); + return tokenIsIdentifierOrKeyword(token()) && !scanner.hasPrecedingLineBreak(); + } + + function nextTokenIsClassKeywordOnSameLine() { + nextToken(); + return token() === SyntaxKind.ClassKeyword && !scanner.hasPrecedingLineBreak(); + } + + function nextTokenIsFunctionKeywordOnSameLine() { + nextToken(); + return token() === SyntaxKind.FunctionKeyword && !scanner.hasPrecedingLineBreak(); + } + + function nextTokenIsIdentifierOrKeywordOrLiteralOnSameLine() { + nextToken(); + return (tokenIsIdentifierOrKeyword(token()) || token() === SyntaxKind.NumericLiteral || token() === SyntaxKind.StringLiteral) && !scanner.hasPrecedingLineBreak(); + } + + function isDeclaration(): boolean { + while (true) { + switch (token()) { + case SyntaxKind.VarKeyword: + case SyntaxKind.LetKeyword: + case SyntaxKind.ConstKeyword: + case SyntaxKind.FunctionKeyword: + case SyntaxKind.ClassKeyword: + case SyntaxKind.EnumKeyword: + return true; + + // 'declare', 'module', 'namespace', 'interface'* and 'type' are all legal JavaScript identifiers; + // however, an identifier cannot be followed by another identifier on the same line. This is what we + // count on to parse out the respective declarations. For instance, we exploit this to say that + // + // namespace n + // + // can be none other than the beginning of a namespace declaration, but need to respect that JavaScript sees + // + // namespace + // n + // + // as the identifier 'namespace' on one line followed by the identifier 'n' on another. + // We need to look one token ahead to see if it permissible to try parsing a declaration. + // + // *Note*: 'interface' is actually a strict mode reserved word. So while + // + // "use strict" + // interface + // I {} + // + // could be legal, it would add complexity for very little gain. + case SyntaxKind.InterfaceKeyword: + case SyntaxKind.TypeKeyword: + return nextTokenIsIdentifierOnSameLine(); + case SyntaxKind.ModuleKeyword: + case SyntaxKind.NamespaceKeyword: + return nextTokenIsIdentifierOrStringLiteralOnSameLine(); + case SyntaxKind.AbstractKeyword: + case SyntaxKind.AsyncKeyword: + case SyntaxKind.DeclareKeyword: + case SyntaxKind.PrivateKeyword: + case SyntaxKind.ProtectedKeyword: + case SyntaxKind.PublicKeyword: + case SyntaxKind.ReadonlyKeyword: + nextToken(); + // ASI takes effect for this modifier. + if (scanner.hasPrecedingLineBreak()) { + return false; + } + continue; + + case SyntaxKind.GlobalKeyword: + nextToken(); + return token() === SyntaxKind.OpenBraceToken || token() === SyntaxKind.Identifier || token() === SyntaxKind.ExportKeyword; + + case SyntaxKind.ImportKeyword: + nextToken(); + return token() === SyntaxKind.StringLiteral || token() === SyntaxKind.AsteriskToken || + token() === SyntaxKind.OpenBraceToken || tokenIsIdentifierOrKeyword(token()); + case SyntaxKind.ExportKeyword: + nextToken(); + if (token() === SyntaxKind.EqualsToken || token() === SyntaxKind.AsteriskToken || + token() === SyntaxKind.OpenBraceToken || token() === SyntaxKind.DefaultKeyword || + token() === SyntaxKind.AsKeyword) { + return true; + } + continue; + + case SyntaxKind.StaticKeyword: + nextToken(); + continue; + default: + return false; + } + } + } + + function isStartOfDeclaration(): boolean { + return lookAhead(isDeclaration); + } + + function isStartOfStatement(): boolean { + switch (token()) { + case SyntaxKind.AtToken: + case SyntaxKind.SemicolonToken: + case SyntaxKind.OpenBraceToken: + case SyntaxKind.VarKeyword: + case SyntaxKind.LetKeyword: + case SyntaxKind.FunctionKeyword: + case SyntaxKind.ClassKeyword: + case SyntaxKind.EnumKeyword: + case SyntaxKind.IfKeyword: + case SyntaxKind.DoKeyword: + case SyntaxKind.WhileKeyword: + case SyntaxKind.ForKeyword: + case SyntaxKind.ContinueKeyword: + case SyntaxKind.BreakKeyword: + case SyntaxKind.ReturnKeyword: + case SyntaxKind.WithKeyword: + case SyntaxKind.SwitchKeyword: + case SyntaxKind.ThrowKeyword: + case SyntaxKind.TryKeyword: + case SyntaxKind.DebuggerKeyword: + // 'catch' and 'finally' do not actually indicate that the code is part of a statement, + // however, we say they are here so that we may gracefully parse them and error later. + case SyntaxKind.CatchKeyword: + case SyntaxKind.FinallyKeyword: + return true; + + case SyntaxKind.ImportKeyword: + return isStartOfDeclaration() || lookAhead(nextTokenIsOpenParenOrLessThanOrDot); + + case SyntaxKind.ConstKeyword: + case SyntaxKind.ExportKeyword: + return isStartOfDeclaration(); + + case SyntaxKind.AsyncKeyword: + case SyntaxKind.DeclareKeyword: + case SyntaxKind.InterfaceKeyword: + case SyntaxKind.ModuleKeyword: + case SyntaxKind.NamespaceKeyword: + case SyntaxKind.TypeKeyword: + case SyntaxKind.GlobalKeyword: + // When these don't start a declaration, they're an identifier in an expression statement + return true; + + case SyntaxKind.PublicKeyword: + case SyntaxKind.PrivateKeyword: + case SyntaxKind.ProtectedKeyword: + case SyntaxKind.StaticKeyword: + case SyntaxKind.ReadonlyKeyword: + // When these don't start a declaration, they may be the start of a class member if an identifier + // immediately follows. Otherwise they're an identifier in an expression statement. + return isStartOfDeclaration() || !lookAhead(nextTokenIsIdentifierOrKeywordOnSameLine); + + default: + return isStartOfExpression(); + } + } + + function nextTokenIsIdentifierOrStartOfDestructuring() { + nextToken(); + return isIdentifier() || token() === SyntaxKind.OpenBraceToken || token() === SyntaxKind.OpenBracketToken; + } + + function isLetDeclaration() { + // In ES6 'let' always starts a lexical declaration if followed by an identifier or { + // or [. + return lookAhead(nextTokenIsIdentifierOrStartOfDestructuring); + } + + function parseStatement(): Statement { + switch (token()) { + case SyntaxKind.SemicolonToken: + return parseEmptyStatement(); + case SyntaxKind.OpenBraceToken: + return parseBlock(/*ignoreMissingOpenBrace*/ false); + case SyntaxKind.VarKeyword: + return parseVariableStatement(createNodeWithJSDoc(SyntaxKind.VariableDeclaration)); + case SyntaxKind.LetKeyword: + if (isLetDeclaration()) { + return parseVariableStatement(createNodeWithJSDoc(SyntaxKind.VariableDeclaration)); + } + break; + case SyntaxKind.FunctionKeyword: + return parseFunctionDeclaration(createNodeWithJSDoc(SyntaxKind.FunctionDeclaration)); + case SyntaxKind.ClassKeyword: + return parseClassDeclaration(createNodeWithJSDoc(SyntaxKind.ClassDeclaration)); + case SyntaxKind.IfKeyword: + return parseIfStatement(); + case SyntaxKind.DoKeyword: + return parseDoStatement(); + case SyntaxKind.WhileKeyword: + return parseWhileStatement(); + case SyntaxKind.ForKeyword: + return parseForOrForInOrForOfStatement(); + case SyntaxKind.ContinueKeyword: + return parseBreakOrContinueStatement(SyntaxKind.ContinueStatement); + case SyntaxKind.BreakKeyword: + return parseBreakOrContinueStatement(SyntaxKind.BreakStatement); + case SyntaxKind.ReturnKeyword: + return parseReturnStatement(); + case SyntaxKind.WithKeyword: + return parseWithStatement(); + case SyntaxKind.SwitchKeyword: + return parseSwitchStatement(); + case SyntaxKind.ThrowKeyword: + return parseThrowStatement(); + case SyntaxKind.TryKeyword: + // Include 'catch' and 'finally' for error recovery. + case SyntaxKind.CatchKeyword: + case SyntaxKind.FinallyKeyword: + return parseTryStatement(); + case SyntaxKind.DebuggerKeyword: + return parseDebuggerStatement(); + case SyntaxKind.AtToken: + return parseDeclaration(); + case SyntaxKind.AsyncKeyword: + case SyntaxKind.InterfaceKeyword: + case SyntaxKind.TypeKeyword: + case SyntaxKind.ModuleKeyword: + case SyntaxKind.NamespaceKeyword: + case SyntaxKind.DeclareKeyword: + case SyntaxKind.ConstKeyword: + case SyntaxKind.EnumKeyword: + case SyntaxKind.ExportKeyword: + case SyntaxKind.ImportKeyword: + case SyntaxKind.PrivateKeyword: + case SyntaxKind.ProtectedKeyword: + case SyntaxKind.PublicKeyword: + case SyntaxKind.AbstractKeyword: + case SyntaxKind.StaticKeyword: + case SyntaxKind.ReadonlyKeyword: + case SyntaxKind.GlobalKeyword: + if (isStartOfDeclaration()) { + return parseDeclaration(); + } + break; + } + return parseExpressionOrLabeledStatement(); + } + + function isDeclareModifier(modifier: Modifier) { + return modifier.kind === SyntaxKind.DeclareKeyword; + } + + function parseDeclaration(): Statement { + const node = createNodeWithJSDoc(SyntaxKind.Unknown); + node.decorators = parseDecorators(); + node.modifiers = parseModifiers(); + if (some(node.modifiers, isDeclareModifier)) { + for (const m of node.modifiers!) { + m.flags |= NodeFlags.Ambient; + } + return doInsideOfContext(NodeFlags.Ambient, () => parseDeclarationWorker(node)); + } + else { + return parseDeclarationWorker(node); + } + } + + function parseDeclarationWorker(node: Statement): Statement { + switch (token()) { + case SyntaxKind.VarKeyword: + case SyntaxKind.LetKeyword: + case SyntaxKind.ConstKeyword: + return parseVariableStatement(node); + case SyntaxKind.FunctionKeyword: + return parseFunctionDeclaration(node); + case SyntaxKind.ClassKeyword: + return parseClassDeclaration(node); + case SyntaxKind.InterfaceKeyword: + return parseInterfaceDeclaration(node); + case SyntaxKind.TypeKeyword: + return parseTypeAliasDeclaration(node); + case SyntaxKind.EnumKeyword: + return parseEnumDeclaration(node); + case SyntaxKind.GlobalKeyword: + case SyntaxKind.ModuleKeyword: + case SyntaxKind.NamespaceKeyword: + return parseModuleDeclaration(node); + case SyntaxKind.ImportKeyword: + return parseImportDeclarationOrImportEqualsDeclaration(node); + case SyntaxKind.ExportKeyword: + nextToken(); + switch (token()) { + case SyntaxKind.DefaultKeyword: + case SyntaxKind.EqualsToken: + return parseExportAssignment(node); + case SyntaxKind.AsKeyword: + return parseNamespaceExportDeclaration(node); + default: + return parseExportDeclaration(node); + } + default: + if (node.decorators || node.modifiers) { + // We reached this point because we encountered decorators and/or modifiers and assumed a declaration + // would follow. For recovery and error reporting purposes, return an incomplete declaration. + const missing = createMissingNode(SyntaxKind.MissingDeclaration, /*reportAtCurrentPosition*/ true, Diagnostics.Declaration_expected); + missing.pos = node.pos; + missing.decorators = node.decorators; + missing.modifiers = node.modifiers; + return finishNode(missing); + } + return undefined!; // TODO: GH#18217 + } + } + + function nextTokenIsIdentifierOrStringLiteralOnSameLine() { + nextToken(); + return !scanner.hasPrecedingLineBreak() && (isIdentifier() || token() === SyntaxKind.StringLiteral); + } + + function parseFunctionBlockOrSemicolon(flags: SignatureFlags, diagnosticMessage?: DiagnosticMessage): Block | undefined { + if (token() !== SyntaxKind.OpenBraceToken && canParseSemicolon()) { + parseSemicolon(); + return; + } + + return parseFunctionBlock(flags, diagnosticMessage); + } + + // DECLARATIONS + + function parseArrayBindingElement(): ArrayBindingElement { + if (token() === SyntaxKind.CommaToken) { + return createNode(SyntaxKind.OmittedExpression); + } + const node = createNode(SyntaxKind.BindingElement); + node.dotDotDotToken = parseOptionalToken(SyntaxKind.DotDotDotToken); + node.name = parseIdentifierOrPattern(); + node.initializer = parseInitializer(); + return finishNode(node); + } + + function parseObjectBindingElement(): BindingElement { + const node = createNode(SyntaxKind.BindingElement); + node.dotDotDotToken = parseOptionalToken(SyntaxKind.DotDotDotToken); + const tokenIsIdentifier = isIdentifier(); + const propertyName = parsePropertyName(); + if (tokenIsIdentifier && token() !== SyntaxKind.ColonToken) { + node.name = propertyName; + } + else { + parseExpected(SyntaxKind.ColonToken); + node.propertyName = propertyName; + node.name = parseIdentifierOrPattern(); + } + node.initializer = parseInitializer(); + return finishNode(node); + } + + function parseObjectBindingPattern(): ObjectBindingPattern { + const node = createNode(SyntaxKind.ObjectBindingPattern); + parseExpected(SyntaxKind.OpenBraceToken); + node.elements = parseDelimitedList(ParsingContext.ObjectBindingElements, parseObjectBindingElement); + parseExpected(SyntaxKind.CloseBraceToken); + return finishNode(node); + } + + function parseArrayBindingPattern(): ArrayBindingPattern { + const node = createNode(SyntaxKind.ArrayBindingPattern); + parseExpected(SyntaxKind.OpenBracketToken); + node.elements = parseDelimitedList(ParsingContext.ArrayBindingElements, parseArrayBindingElement); + parseExpected(SyntaxKind.CloseBracketToken); + return finishNode(node); + } + + function isIdentifierOrPattern() { + return token() === SyntaxKind.OpenBraceToken || token() === SyntaxKind.OpenBracketToken || isIdentifier(); + } + + function parseIdentifierOrPattern(): Identifier | BindingPattern { + if (token() === SyntaxKind.OpenBracketToken) { + return parseArrayBindingPattern(); + } + if (token() === SyntaxKind.OpenBraceToken) { + return parseObjectBindingPattern(); + } + return parseIdentifier(); + } + + function parseVariableDeclarationAllowExclamation() { + return parseVariableDeclaration(/*allowExclamation*/ true); + } + + function parseVariableDeclaration(allowExclamation?: boolean): VariableDeclaration { + const node = createNode(SyntaxKind.VariableDeclaration); + node.name = parseIdentifierOrPattern(); + if (allowExclamation && node.name.kind === SyntaxKind.Identifier && + token() === SyntaxKind.ExclamationToken && !scanner.hasPrecedingLineBreak()) { + node.exclamationToken = parseTokenNode>(); + } + node.type = parseTypeAnnotation(); + if (!isInOrOfKeyword(token())) { + node.initializer = parseInitializer(); + } + return finishNode(node); + } + + function parseVariableDeclarationList(inForStatementInitializer: boolean): VariableDeclarationList { + const node = createNode(SyntaxKind.VariableDeclarationList); + + switch (token()) { + case SyntaxKind.VarKeyword: + break; + case SyntaxKind.LetKeyword: + node.flags |= NodeFlags.Let; + break; + case SyntaxKind.ConstKeyword: + node.flags |= NodeFlags.Const; + break; + default: + Debug.fail(); + } + + nextToken(); + + // The user may have written the following: + // + // for (let of X) { } + // + // In this case, we want to parse an empty declaration list, and then parse 'of' + // as a keyword. The reason this is not automatic is that 'of' is a valid identifier. + // So we need to look ahead to determine if 'of' should be treated as a keyword in + // this context. + // The checker will then give an error that there is an empty declaration list. + if (token() === SyntaxKind.OfKeyword && lookAhead(canFollowContextualOfKeyword)) { + node.declarations = createMissingList(); + } + else { + const savedDisallowIn = inDisallowInContext(); + setDisallowInContext(inForStatementInitializer); + + node.declarations = parseDelimitedList(ParsingContext.VariableDeclarations, + inForStatementInitializer ? parseVariableDeclaration : parseVariableDeclarationAllowExclamation); + + setDisallowInContext(savedDisallowIn); + } + + return finishNode(node); + } + + function canFollowContextualOfKeyword(): boolean { + return nextTokenIsIdentifier() && nextToken() === SyntaxKind.CloseParenToken; + } + + function parseVariableStatement(node: VariableStatement): VariableStatement { + node.kind = SyntaxKind.VariableStatement; + node.declarationList = parseVariableDeclarationList(/*inForStatementInitializer*/ false); + parseSemicolon(); + return finishNode(node); + } + + function parseFunctionDeclaration(node: FunctionDeclaration): FunctionDeclaration { + node.kind = SyntaxKind.FunctionDeclaration; + parseExpected(SyntaxKind.FunctionKeyword); + node.asteriskToken = parseOptionalToken(SyntaxKind.AsteriskToken); + node.name = hasModifier(node, ModifierFlags.Default) ? parseOptionalIdentifier() : parseIdentifier(); + const isGenerator = node.asteriskToken ? SignatureFlags.Yield : SignatureFlags.None; + const isAsync = hasModifier(node, ModifierFlags.Async) ? SignatureFlags.Await : SignatureFlags.None; + fillSignature(SyntaxKind.ColonToken, isGenerator | isAsync, node); + node.body = parseFunctionBlockOrSemicolon(isGenerator | isAsync, Diagnostics.or_expected); + return finishNode(node); + } + + function parseConstructorDeclaration(node: ConstructorDeclaration): ConstructorDeclaration { + node.kind = SyntaxKind.Constructor; + parseExpected(SyntaxKind.ConstructorKeyword); + fillSignature(SyntaxKind.ColonToken, SignatureFlags.None, node); + node.body = parseFunctionBlockOrSemicolon(SignatureFlags.None, Diagnostics.or_expected); + return finishNode(node); + } + + function parseMethodDeclaration(node: MethodDeclaration, asteriskToken: AsteriskToken, diagnosticMessage?: DiagnosticMessage): MethodDeclaration { + node.kind = SyntaxKind.MethodDeclaration; + node.asteriskToken = asteriskToken; + const isGenerator = asteriskToken ? SignatureFlags.Yield : SignatureFlags.None; + const isAsync = hasModifier(node, ModifierFlags.Async) ? SignatureFlags.Await : SignatureFlags.None; + fillSignature(SyntaxKind.ColonToken, isGenerator | isAsync, node); + node.body = parseFunctionBlockOrSemicolon(isGenerator | isAsync, diagnosticMessage); + return finishNode(node); + } + + function parsePropertyDeclaration(node: PropertyDeclaration): PropertyDeclaration { + node.kind = SyntaxKind.PropertyDeclaration; + if (!node.questionToken && token() === SyntaxKind.ExclamationToken && !scanner.hasPrecedingLineBreak()) { + node.exclamationToken = parseTokenNode>(); + } + node.type = parseTypeAnnotation(); + + // For instance properties specifically, since they are evaluated inside the constructor, + // we do *not * want to parse yield expressions, so we specifically turn the yield context + // off. The grammar would look something like this: + // + // MemberVariableDeclaration[Yield]: + // AccessibilityModifier_opt PropertyName TypeAnnotation_opt Initializer_opt[In]; + // AccessibilityModifier_opt static_opt PropertyName TypeAnnotation_opt Initializer_opt[In, ?Yield]; + // + // The checker may still error in the static case to explicitly disallow the yield expression. + node.initializer = hasModifier(node, ModifierFlags.Static) + ? allowInAnd(parseInitializer) + : doOutsideOfContext(NodeFlags.YieldContext | NodeFlags.DisallowInContext, parseInitializer); + + parseSemicolon(); + return finishNode(node); + } + + function parsePropertyOrMethodDeclaration(node: PropertyDeclaration | MethodDeclaration): PropertyDeclaration | MethodDeclaration { + const asteriskToken = parseOptionalToken(SyntaxKind.AsteriskToken); + node.name = parsePropertyName(); + // Note: this is not legal as per the grammar. But we allow it in the parser and + // report an error in the grammar checker. + node.questionToken = parseOptionalToken(SyntaxKind.QuestionToken); + if (asteriskToken || token() === SyntaxKind.OpenParenToken || token() === SyntaxKind.LessThanToken) { + return parseMethodDeclaration(node, asteriskToken, Diagnostics.or_expected); + } + return parsePropertyDeclaration(node); + } + + function parseAccessorDeclaration(node: AccessorDeclaration, kind: AccessorDeclaration["kind"]): AccessorDeclaration { + node.kind = kind; + node.name = parsePropertyName(); + fillSignature(SyntaxKind.ColonToken, SignatureFlags.None, node); + node.body = parseFunctionBlockOrSemicolon(SignatureFlags.None); + return finishNode(node); + } + + function isClassMemberStart(): boolean { + let idToken: SyntaxKind | undefined; + + if (token() === SyntaxKind.AtToken) { + return true; + } + + // Eat up all modifiers, but hold on to the last one in case it is actually an identifier. + while (isModifierKind(token())) { + idToken = token(); + // If the idToken is a class modifier (protected, private, public, and static), it is + // certain that we are starting to parse class member. This allows better error recovery + // Example: + // public foo() ... // true + // public @dec blah ... // true; we will then report an error later + // export public ... // true; we will then report an error later + if (isClassMemberModifier(idToken)) { + return true; + } + + nextToken(); + } + + if (token() === SyntaxKind.AsteriskToken) { + return true; + } + + // Try to get the first property-like token following all modifiers. + // This can either be an identifier or the 'get' or 'set' keywords. + if (isLiteralPropertyName()) { + idToken = token(); + nextToken(); + } + + // Index signatures and computed properties are class members; we can parse. + if (token() === SyntaxKind.OpenBracketToken) { + return true; + } + + // If we were able to get any potential identifier... + if (idToken !== undefined) { + // If we have a non-keyword identifier, or if we have an accessor, then it's safe to parse. + if (!isKeyword(idToken) || idToken === SyntaxKind.SetKeyword || idToken === SyntaxKind.GetKeyword) { + return true; + } + + // If it *is* a keyword, but not an accessor, check a little farther along + // to see if it should actually be parsed as a class member. + switch (token()) { + case SyntaxKind.OpenParenToken: // Method declaration + case SyntaxKind.LessThanToken: // Generic Method declaration + case SyntaxKind.ExclamationToken: // Non-null assertion on property name + case SyntaxKind.ColonToken: // Type Annotation for declaration + case SyntaxKind.EqualsToken: // Initializer for declaration + case SyntaxKind.QuestionToken: // Not valid, but permitted so that it gets caught later on. + return true; + default: + // Covers + // - Semicolons (declaration termination) + // - Closing braces (end-of-class, must be declaration) + // - End-of-files (not valid, but permitted so that it gets caught later on) + // - Line-breaks (enabling *automatic semicolon insertion*) + return canParseSemicolon(); + } + } + + return false; + } + + function parseDecorators(): NodeArray | undefined { + let list: Decorator[] | undefined; + const listPos = getNodePos(); + while (true) { + const decoratorStart = getNodePos(); + if (!parseOptional(SyntaxKind.AtToken)) { + break; + } + const decorator = createNode(SyntaxKind.Decorator, decoratorStart); + decorator.expression = doInDecoratorContext(parseLeftHandSideExpressionOrHigher); + finishNode(decorator); + (list || (list = [])).push(decorator); + } + return list && createNodeArray(list, listPos); + } + + /* + * There are situations in which a modifier like 'const' will appear unexpectedly, such as on a class member. + * In those situations, if we are entirely sure that 'const' is not valid on its own (such as when ASI takes effect + * and turns it into a standalone declaration), then it is better to parse it and report an error later. + * + * In such situations, 'permitInvalidConstAsModifier' should be set to true. + */ + function parseModifiers(permitInvalidConstAsModifier?: boolean): NodeArray | undefined { + let list: Modifier[] | undefined; + const listPos = getNodePos(); + while (true) { + const modifierStart = scanner.getStartPos(); + const modifierKind = token(); + + if (token() === SyntaxKind.ConstKeyword && permitInvalidConstAsModifier) { + // We need to ensure that any subsequent modifiers appear on the same line + // so that when 'const' is a standalone declaration, we don't issue an error. + if (!tryParse(nextTokenIsOnSameLineAndCanFollowModifier)) { + break; + } + } + else { + if (!parseAnyContextualModifier()) { + break; + } + } + + const modifier = finishNode(createNode(modifierKind, modifierStart)); + (list || (list = [])).push(modifier); + } + return list && createNodeArray(list, listPos); + } + + function parseModifiersForArrowFunction(): NodeArray | undefined { + let modifiers: NodeArray | undefined; + if (token() === SyntaxKind.AsyncKeyword) { + const modifierStart = scanner.getStartPos(); + const modifierKind = token(); + nextToken(); + const modifier = finishNode(createNode(modifierKind, modifierStart)); + modifiers = createNodeArray([modifier], modifierStart); + } + return modifiers; + } + + function parseClassElement(): ClassElement { + if (token() === SyntaxKind.SemicolonToken) { + const result = createNode(SyntaxKind.SemicolonClassElement); + nextToken(); + return finishNode(result); + } + + const node = createNodeWithJSDoc(SyntaxKind.Unknown); + node.decorators = parseDecorators(); + node.modifiers = parseModifiers(/*permitInvalidConstAsModifier*/ true); + + if (parseContextualModifier(SyntaxKind.GetKeyword)) { + return parseAccessorDeclaration(node, SyntaxKind.GetAccessor); + } + + if (parseContextualModifier(SyntaxKind.SetKeyword)) { + return parseAccessorDeclaration(node, SyntaxKind.SetAccessor); + } + + if (token() === SyntaxKind.ConstructorKeyword) { + return parseConstructorDeclaration(node); + } + + if (isIndexSignature()) { + return parseIndexSignatureDeclaration(node); + } + + // It is very important that we check this *after* checking indexers because + // the [ token can start an index signature or a computed property name + if (tokenIsIdentifierOrKeyword(token()) || + token() === SyntaxKind.StringLiteral || + token() === SyntaxKind.NumericLiteral || + token() === SyntaxKind.AsteriskToken || + token() === SyntaxKind.OpenBracketToken) { + + return parsePropertyOrMethodDeclaration(node); + } + + if (node.decorators || node.modifiers) { + // treat this as a property declaration with a missing name. + node.name = createMissingNode(SyntaxKind.Identifier, /*reportAtCurrentPosition*/ true, Diagnostics.Declaration_expected); + return parsePropertyDeclaration(node); + } + + // 'isClassMemberStart' should have hinted not to attempt parsing. + return Debug.fail("Should not have attempted to parse class member declaration."); + } + + function parseClassExpression(): ClassExpression { + return parseClassDeclarationOrExpression(createNodeWithJSDoc(SyntaxKind.Unknown), SyntaxKind.ClassExpression); + } + + function parseClassDeclaration(node: ClassLikeDeclaration): ClassDeclaration { + return parseClassDeclarationOrExpression(node, SyntaxKind.ClassDeclaration); + } + + function parseClassDeclarationOrExpression(node: ClassLikeDeclaration, kind: ClassLikeDeclaration["kind"]): ClassLikeDeclaration { + node.kind = kind; + parseExpected(SyntaxKind.ClassKeyword); + node.name = parseNameOfClassDeclarationOrExpression(); + node.typeParameters = parseTypeParameters(); + node.heritageClauses = parseHeritageClauses(); + + if (parseExpected(SyntaxKind.OpenBraceToken)) { + // ClassTail[Yield,Await] : (Modified) See 14.5 + // ClassHeritage[?Yield,?Await]opt { ClassBody[?Yield,?Await]opt } + node.members = parseClassMembers(); + parseExpected(SyntaxKind.CloseBraceToken); + } + else { + node.members = createMissingList(); + } + + return finishNode(node); + } + + function parseNameOfClassDeclarationOrExpression(): Identifier | undefined { + // implements is a future reserved word so + // 'class implements' might mean either + // - class expression with omitted name, 'implements' starts heritage clause + // - class with name 'implements' + // 'isImplementsClause' helps to disambiguate between these two cases + return isIdentifier() && !isImplementsClause() + ? parseIdentifier() + : undefined; + } + + function isImplementsClause() { + return token() === SyntaxKind.ImplementsKeyword && lookAhead(nextTokenIsIdentifierOrKeyword); + } + + function parseHeritageClauses(): NodeArray | undefined { + // ClassTail[Yield,Await] : (Modified) See 14.5 + // ClassHeritage[?Yield,?Await]opt { ClassBody[?Yield,?Await]opt } + + if (isHeritageClause()) { + return parseList(ParsingContext.HeritageClauses, parseHeritageClause); + } + + return undefined; + } + + function parseHeritageClause(): HeritageClause { + const tok = token(); + Debug.assert(tok === SyntaxKind.ExtendsKeyword || tok === SyntaxKind.ImplementsKeyword); // isListElement() should ensure this. + const node = createNode(SyntaxKind.HeritageClause); + node.token = tok as SyntaxKind.ExtendsKeyword | SyntaxKind.ImplementsKeyword; + nextToken(); + node.types = parseDelimitedList(ParsingContext.HeritageClauseElement, parseExpressionWithTypeArguments); + return finishNode(node); + } + + function parseExpressionWithTypeArguments(): ExpressionWithTypeArguments { + const node = createNode(SyntaxKind.ExpressionWithTypeArguments); + node.expression = parseLeftHandSideExpressionOrHigher(); + node.typeArguments = tryParseTypeArguments(); + return finishNode(node); + } + + function tryParseTypeArguments(): NodeArray | undefined { + return token() === SyntaxKind.LessThanToken + ? parseBracketedList(ParsingContext.TypeArguments, parseType, SyntaxKind.LessThanToken, SyntaxKind.GreaterThanToken) + : undefined; + } + + function isHeritageClause(): boolean { + return token() === SyntaxKind.ExtendsKeyword || token() === SyntaxKind.ImplementsKeyword; + } + + function parseClassMembers(): NodeArray { + return parseList(ParsingContext.ClassMembers, parseClassElement); + } + + function parseInterfaceDeclaration(node: InterfaceDeclaration): InterfaceDeclaration { + node.kind = SyntaxKind.InterfaceDeclaration; + parseExpected(SyntaxKind.InterfaceKeyword); + node.name = parseIdentifier(); + node.typeParameters = parseTypeParameters(); + node.heritageClauses = parseHeritageClauses(); + node.members = parseObjectTypeMembers(); + return finishNode(node); + } + + function parseTypeAliasDeclaration(node: TypeAliasDeclaration): TypeAliasDeclaration { + node.kind = SyntaxKind.TypeAliasDeclaration; + parseExpected(SyntaxKind.TypeKeyword); + node.name = parseIdentifier(); + node.typeParameters = parseTypeParameters(); + parseExpected(SyntaxKind.EqualsToken); + node.type = parseType(); + parseSemicolon(); + return finishNode(node); + } + + // In an ambient declaration, the grammar only allows integer literals as initializers. + // In a non-ambient declaration, the grammar allows uninitialized members only in a + // ConstantEnumMemberSection, which starts at the beginning of an enum declaration + // or any time an integer literal initializer is encountered. + function parseEnumMember(): EnumMember { + const node = createNodeWithJSDoc(SyntaxKind.EnumMember); + node.name = parsePropertyName(); + node.initializer = allowInAnd(parseInitializer); + return finishNode(node); + } + + function parseEnumDeclaration(node: EnumDeclaration): EnumDeclaration { + node.kind = SyntaxKind.EnumDeclaration; + parseExpected(SyntaxKind.EnumKeyword); + node.name = parseIdentifier(); + if (parseExpected(SyntaxKind.OpenBraceToken)) { + node.members = parseDelimitedList(ParsingContext.EnumMembers, parseEnumMember); + parseExpected(SyntaxKind.CloseBraceToken); + } + else { + node.members = createMissingList(); + } + return finishNode(node); + } + + function parseModuleBlock(): ModuleBlock { + const node = createNode(SyntaxKind.ModuleBlock); + if (parseExpected(SyntaxKind.OpenBraceToken)) { + node.statements = parseList(ParsingContext.BlockStatements, parseStatement); + parseExpected(SyntaxKind.CloseBraceToken); + } + else { + node.statements = createMissingList(); + } + return finishNode(node); + } + + function parseModuleOrNamespaceDeclaration(node: ModuleDeclaration, flags: NodeFlags): ModuleDeclaration { + node.kind = SyntaxKind.ModuleDeclaration; + // If we are parsing a dotted namespace name, we want to + // propagate the 'Namespace' flag across the names if set. + const namespaceFlag = flags & NodeFlags.Namespace; + node.flags |= flags; + node.name = parseIdentifier(); + node.body = parseOptional(SyntaxKind.DotToken) + ? parseModuleOrNamespaceDeclaration(createNode(SyntaxKind.Unknown), NodeFlags.NestedNamespace | namespaceFlag) + : parseModuleBlock(); + return finishNode(node); + } + + function parseAmbientExternalModuleDeclaration(node: ModuleDeclaration): ModuleDeclaration { + node.kind = SyntaxKind.ModuleDeclaration; + if (token() === SyntaxKind.GlobalKeyword) { + // parse 'global' as name of global scope augmentation + node.name = parseIdentifier(); + node.flags |= NodeFlags.GlobalAugmentation; + } + else { + node.name = parseLiteralNode(); + node.name.text = internIdentifier(node.name.text); + } + if (token() === SyntaxKind.OpenBraceToken) { + node.body = parseModuleBlock(); + } + else { + parseSemicolon(); + } + return finishNode(node); + } + + function parseModuleDeclaration(node: ModuleDeclaration): ModuleDeclaration { + let flags: NodeFlags = 0; + if (token() === SyntaxKind.GlobalKeyword) { + // global augmentation + return parseAmbientExternalModuleDeclaration(node); + } + else if (parseOptional(SyntaxKind.NamespaceKeyword)) { + flags |= NodeFlags.Namespace; + } + else { + parseExpected(SyntaxKind.ModuleKeyword); + if (token() === SyntaxKind.StringLiteral) { + return parseAmbientExternalModuleDeclaration(node); + } + } + return parseModuleOrNamespaceDeclaration(node, flags); + } + + function isExternalModuleReference() { + return token() === SyntaxKind.RequireKeyword && + lookAhead(nextTokenIsOpenParen); + } + + function nextTokenIsOpenParen() { + return nextToken() === SyntaxKind.OpenParenToken; + } + + function nextTokenIsSlash() { + return nextToken() === SyntaxKind.SlashToken; + } + + function parseNamespaceExportDeclaration(node: NamespaceExportDeclaration): NamespaceExportDeclaration { + node.kind = SyntaxKind.NamespaceExportDeclaration; + parseExpected(SyntaxKind.AsKeyword); + parseExpected(SyntaxKind.NamespaceKeyword); + node.name = parseIdentifier(); + parseSemicolon(); + return finishNode(node); + } + + function parseImportDeclarationOrImportEqualsDeclaration(node: ImportEqualsDeclaration | ImportDeclaration): ImportEqualsDeclaration | ImportDeclaration { + parseExpected(SyntaxKind.ImportKeyword); + const afterImportPos = scanner.getStartPos(); + + let identifier: Identifier | undefined; + if (isIdentifier()) { + identifier = parseIdentifier(); + if (token() !== SyntaxKind.CommaToken && token() !== SyntaxKind.FromKeyword) { + return parseImportEqualsDeclaration(node, identifier); + } + } + + // Import statement + node.kind = SyntaxKind.ImportDeclaration; + // ImportDeclaration: + // import ImportClause from ModuleSpecifier ; + // import ModuleSpecifier; + if (identifier || // import id + token() === SyntaxKind.AsteriskToken || // import * + token() === SyntaxKind.OpenBraceToken) { // import { + (node).importClause = parseImportClause(identifier, afterImportPos); + parseExpected(SyntaxKind.FromKeyword); + } + + (node).moduleSpecifier = parseModuleSpecifier(); + parseSemicolon(); + return finishNode(node); + } + + function parseImportEqualsDeclaration(node: ImportEqualsDeclaration, identifier: Identifier): ImportEqualsDeclaration { + node.kind = SyntaxKind.ImportEqualsDeclaration; + node.name = identifier; + parseExpected(SyntaxKind.EqualsToken); + node.moduleReference = parseModuleReference(); + parseSemicolon(); + return finishNode(node); + } + + function parseImportClause(identifier: Identifier | undefined, fullStart: number) { + // ImportClause: + // ImportedDefaultBinding + // NameSpaceImport + // NamedImports + // ImportedDefaultBinding, NameSpaceImport + // ImportedDefaultBinding, NamedImports + + const importClause = createNode(SyntaxKind.ImportClause, fullStart); + if (identifier) { + // ImportedDefaultBinding: + // ImportedBinding + importClause.name = identifier; + } + + // If there was no default import or if there is comma token after default import + // parse namespace or named imports + if (!importClause.name || + parseOptional(SyntaxKind.CommaToken)) { + importClause.namedBindings = token() === SyntaxKind.AsteriskToken ? parseNamespaceImport() : parseNamedImportsOrExports(SyntaxKind.NamedImports); + } + + return finishNode(importClause); + } + + function parseModuleReference() { + return isExternalModuleReference() + ? parseExternalModuleReference() + : parseEntityName(/*allowReservedWords*/ false); + } + + function parseExternalModuleReference() { + const node = createNode(SyntaxKind.ExternalModuleReference); + parseExpected(SyntaxKind.RequireKeyword); + parseExpected(SyntaxKind.OpenParenToken); + node.expression = parseModuleSpecifier(); + parseExpected(SyntaxKind.CloseParenToken); + return finishNode(node); + } + + function parseModuleSpecifier(): Expression { + if (token() === SyntaxKind.StringLiteral) { + const result = parseLiteralNode(); + result.text = internIdentifier(result.text); + return result; + } + else { + // We allow arbitrary expressions here, even though the grammar only allows string + // literals. We check to ensure that it is only a string literal later in the grammar + // check pass. + return parseExpression(); + } + } + + function parseNamespaceImport(): NamespaceImport { + // NameSpaceImport: + // * as ImportedBinding + const namespaceImport = createNode(SyntaxKind.NamespaceImport); + parseExpected(SyntaxKind.AsteriskToken); + parseExpected(SyntaxKind.AsKeyword); + namespaceImport.name = parseIdentifier(); + return finishNode(namespaceImport); + } + + function parseNamedImportsOrExports(kind: SyntaxKind.NamedImports): NamedImports; + function parseNamedImportsOrExports(kind: SyntaxKind.NamedExports): NamedExports; + function parseNamedImportsOrExports(kind: SyntaxKind): NamedImportsOrExports { + const node = createNode(kind); + + // NamedImports: + // { } + // { ImportsList } + // { ImportsList, } + + // ImportsList: + // ImportSpecifier + // ImportsList, ImportSpecifier + node.elements = | NodeArray>parseBracketedList(ParsingContext.ImportOrExportSpecifiers, + kind === SyntaxKind.NamedImports ? parseImportSpecifier : parseExportSpecifier, + SyntaxKind.OpenBraceToken, SyntaxKind.CloseBraceToken); + return finishNode(node); + } + + function parseExportSpecifier() { + return parseImportOrExportSpecifier(SyntaxKind.ExportSpecifier); + } + + function parseImportSpecifier() { + return parseImportOrExportSpecifier(SyntaxKind.ImportSpecifier); + } + + function parseImportOrExportSpecifier(kind: SyntaxKind): ImportOrExportSpecifier { + const node = createNode(kind); + // ImportSpecifier: + // BindingIdentifier + // IdentifierName as BindingIdentifier + // ExportSpecifier: + // IdentifierName + // IdentifierName as IdentifierName + let checkIdentifierIsKeyword = isKeyword(token()) && !isIdentifier(); + let checkIdentifierStart = scanner.getTokenPos(); + let checkIdentifierEnd = scanner.getTextPos(); + const identifierName = parseIdentifierName(); + if (token() === SyntaxKind.AsKeyword) { + node.propertyName = identifierName; + parseExpected(SyntaxKind.AsKeyword); + checkIdentifierIsKeyword = isKeyword(token()) && !isIdentifier(); + checkIdentifierStart = scanner.getTokenPos(); + checkIdentifierEnd = scanner.getTextPos(); + node.name = parseIdentifierName(); + } + else { + node.name = identifierName; + } + if (kind === SyntaxKind.ImportSpecifier && checkIdentifierIsKeyword) { + parseErrorAt(checkIdentifierStart, checkIdentifierEnd, Diagnostics.Identifier_expected); + } + return finishNode(node); + } + + function parseExportDeclaration(node: ExportDeclaration): ExportDeclaration { + node.kind = SyntaxKind.ExportDeclaration; + if (parseOptional(SyntaxKind.AsteriskToken)) { + parseExpected(SyntaxKind.FromKeyword); + node.moduleSpecifier = parseModuleSpecifier(); + } + else { + node.exportClause = parseNamedImportsOrExports(SyntaxKind.NamedExports); + // It is not uncommon to accidentally omit the 'from' keyword. Additionally, in editing scenarios, + // the 'from' keyword can be parsed as a named export when the export clause is unterminated (i.e. `export { from "moduleName";`) + // If we don't have a 'from' keyword, see if we have a string literal such that ASI won't take effect. + if (token() === SyntaxKind.FromKeyword || (token() === SyntaxKind.StringLiteral && !scanner.hasPrecedingLineBreak())) { + parseExpected(SyntaxKind.FromKeyword); + node.moduleSpecifier = parseModuleSpecifier(); + } + } + parseSemicolon(); + return finishNode(node); + } + + function parseExportAssignment(node: ExportAssignment): ExportAssignment { + node.kind = SyntaxKind.ExportAssignment; + if (parseOptional(SyntaxKind.EqualsToken)) { + node.isExportEquals = true; + } + else { + parseExpected(SyntaxKind.DefaultKeyword); + } + node.expression = parseAssignmentExpressionOrHigher(); + parseSemicolon(); + return finishNode(node); + } + + function setExternalModuleIndicator(sourceFile: SourceFile) { + // Try to use the first top-level import/export when available, then + // fall back to looking for an 'import.meta' somewhere in the tree if necessary. + sourceFile.externalModuleIndicator = + forEach(sourceFile.statements, isAnExternalModuleIndicatorNode) || + getImportMetaIfNecessary(sourceFile); + } + + function isAnExternalModuleIndicatorNode(node: Node) { + return hasModifier(node, ModifierFlags.Export) + || node.kind === SyntaxKind.ImportEqualsDeclaration && (node).moduleReference.kind === SyntaxKind.ExternalModuleReference + || node.kind === SyntaxKind.ImportDeclaration + || node.kind === SyntaxKind.ExportAssignment + || node.kind === SyntaxKind.ExportDeclaration + ? node + : undefined; + } + + function getImportMetaIfNecessary(sourceFile: SourceFile) { + return sourceFile.flags & NodeFlags.PossiblyContainsImportMeta ? + walkTreeForExternalModuleIndicators(sourceFile) : + undefined; + } + + function walkTreeForExternalModuleIndicators(node: Node): Node | undefined { + return isImportMeta(node) ? node : forEachChild(node, walkTreeForExternalModuleIndicators); + } + + function isImportMeta(node: Node): boolean { + return isMetaProperty(node) && node.keywordToken === SyntaxKind.ImportKeyword && node.name.escapedText === "meta"; + } + + const enum ParsingContext { + SourceElements, // Elements in source file + BlockStatements, // Statements in block + SwitchClauses, // Clauses in switch statement + SwitchClauseStatements, // Statements in switch clause + TypeMembers, // Members in interface or type literal + ClassMembers, // Members in class declaration + EnumMembers, // Members in enum declaration + HeritageClauseElement, // Elements in a heritage clause + VariableDeclarations, // Variable declarations in variable statement + ObjectBindingElements, // Binding elements in object binding list + ArrayBindingElements, // Binding elements in array binding list + ArgumentExpressions, // Expressions in argument list + ObjectLiteralMembers, // Members in object literal + JsxAttributes, // Attributes in jsx element + JsxChildren, // Things between opening and closing JSX tags + ArrayLiteralMembers, // Members in array literal + Parameters, // Parameters in parameter list + JSDocParameters, // JSDoc parameters in parameter list of JSDoc function type + RestProperties, // Property names in a rest type list + TypeParameters, // Type parameters in type parameter list + TypeArguments, // Type arguments in type argument list + TupleElementTypes, // Element types in tuple element type list + HeritageClauses, // Heritage clauses for a class or interface declaration. + ImportOrExportSpecifiers, // Named import clause's import specifier list + Count // Number of parsing contexts + } + + const enum Tristate { + False, + True, + Unknown + } + + export namespace JSDocParser { + export function parseJSDocTypeExpressionForTests(content: string, start: number | undefined, length: number | undefined): { jsDocTypeExpression: JSDocTypeExpression, diagnostics: Diagnostic[] } | undefined { + initializeState(content, ScriptTarget.Latest, /*_syntaxCursor:*/ undefined, ScriptKind.JS); + sourceFile = createSourceFile("file.js", ScriptTarget.Latest, ScriptKind.JS, /*isDeclarationFile*/ false); + scanner.setText(content, start, length); + currentToken = scanner.scan(); + const jsDocTypeExpression = parseJSDocTypeExpression(); + const diagnostics = parseDiagnostics; + clearState(); + + return jsDocTypeExpression ? { jsDocTypeExpression, diagnostics } : undefined; + } + + // Parses out a JSDoc type expression. + export function parseJSDocTypeExpression(mayOmitBraces?: boolean): JSDocTypeExpression { + const result = createNode(SyntaxKind.JSDocTypeExpression, scanner.getTokenPos()); + + const hasBrace = (mayOmitBraces ? parseOptional : parseExpected)(SyntaxKind.OpenBraceToken); + result.type = doInsideOfContext(NodeFlags.JSDoc, parseJSDocType); + if (!mayOmitBraces || hasBrace) { + parseExpected(SyntaxKind.CloseBraceToken); + } + + fixupParentReferences(result); + return finishNode(result); + } + + export function parseIsolatedJSDocComment(content: string, start: number | undefined, length: number | undefined): { jsDoc: JSDoc, diagnostics: Diagnostic[] } | undefined { + initializeState(content, ScriptTarget.Latest, /*_syntaxCursor:*/ undefined, ScriptKind.JS); + sourceFile = { languageVariant: LanguageVariant.Standard, text: content }; // tslint:disable-line no-object-literal-type-assertion + const jsDoc = parseJSDocCommentWorker(start, length); + const diagnostics = parseDiagnostics; + clearState(); + + return jsDoc ? { jsDoc, diagnostics } : undefined; + } + + export function parseJSDocComment(parent: HasJSDoc, start: number, length: number): JSDoc | undefined { + const saveToken = currentToken; + const saveParseDiagnosticsLength = parseDiagnostics.length; + const saveParseErrorBeforeNextFinishedNode = parseErrorBeforeNextFinishedNode; + + const comment = parseJSDocCommentWorker(start, length); + if (comment) { + comment.parent = parent; + } + + if (contextFlags & NodeFlags.JavaScriptFile) { + if (!sourceFile.jsDocDiagnostics) { + sourceFile.jsDocDiagnostics = []; + } + sourceFile.jsDocDiagnostics.push(...parseDiagnostics); + } + currentToken = saveToken; + parseDiagnostics.length = saveParseDiagnosticsLength; + parseErrorBeforeNextFinishedNode = saveParseErrorBeforeNextFinishedNode; + + return comment; + } + + const enum JSDocState { + BeginningOfLine, + SawAsterisk, + SavingComments, + } + + const enum PropertyLikeParse { + Property = 1 << 0, + Parameter = 1 << 1, + CallbackParameter = 1 << 2, + } + + export function parseJSDocCommentWorker(start = 0, length: number | undefined): JSDoc | undefined { + const content = sourceText; + const end = length === undefined ? content.length : start + length; + length = end - start; + + Debug.assert(start >= 0); + Debug.assert(start <= end); + Debug.assert(end <= content.length); + + // Check for /** (JSDoc opening part) + if (!isJSDocLikeText(content, start)) { + return undefined; + } + + let tags: JSDocTag[]; + let tagsPos: number; + let tagsEnd: number; + const comments: string[] = []; + + // + 3 for leading /**, - 5 in total for /** */ + return scanner.scanRange(start + 3, length - 5, () => { + // Initially we can parse out a tag. We also have seen a starting asterisk. + // This is so that /** * @type */ doesn't parse. + let state = JSDocState.SawAsterisk; + let margin: number | undefined; + // + 4 for leading '/** ' + let indent = start - Math.max(content.lastIndexOf("\n", start), 0) + 4; + function pushComment(text: string) { + if (!margin) { + margin = indent; + } + comments.push(text); + indent += text.length; + } + + nextJSDocToken(); + while (parseOptionalJsdoc(SyntaxKind.WhitespaceTrivia)); + if (parseOptionalJsdoc(SyntaxKind.NewLineTrivia)) { + state = JSDocState.BeginningOfLine; + indent = 0; + } + loop: while (true) { + switch (token()) { + case SyntaxKind.AtToken: + if (state === JSDocState.BeginningOfLine || state === JSDocState.SawAsterisk) { + removeTrailingWhitespace(comments); + addTag(parseTag(indent)); + // NOTE: According to usejsdoc.org, a tag goes to end of line, except the last tag. + // Real-world comments may break this rule, so "BeginningOfLine" will not be a real line beginning + // for malformed examples like `/** @param {string} x @returns {number} the length */` + state = JSDocState.BeginningOfLine; + margin = undefined; + indent++; + } + else { + pushComment(scanner.getTokenText()); + } + break; + case SyntaxKind.NewLineTrivia: + comments.push(scanner.getTokenText()); + state = JSDocState.BeginningOfLine; + indent = 0; + break; + case SyntaxKind.AsteriskToken: + const asterisk = scanner.getTokenText(); + if (state === JSDocState.SawAsterisk || state === JSDocState.SavingComments) { + // If we've already seen an asterisk, then we can no longer parse a tag on this line + state = JSDocState.SavingComments; + pushComment(asterisk); + } + else { + // Ignore the first asterisk on a line + state = JSDocState.SawAsterisk; + indent += asterisk.length; + } + break; + case SyntaxKind.Identifier: + // Anything else is doc comment text. We just save it. Because it + // wasn't a tag, we can no longer parse a tag on this line until we hit the next + // line break. + pushComment(scanner.getTokenText()); + state = JSDocState.SavingComments; + break; + case SyntaxKind.WhitespaceTrivia: + // only collect whitespace if we're already saving comments or have just crossed the comment indent margin + const whitespace = scanner.getTokenText(); + if (state === JSDocState.SavingComments) { + comments.push(whitespace); + } + else if (margin !== undefined && indent + whitespace.length > margin) { + comments.push(whitespace.slice(margin - indent - 1)); + } + indent += whitespace.length; + break; + case SyntaxKind.EndOfFileToken: + break loop; + default: + // anything other than whitespace or asterisk at the beginning of the line starts the comment text + state = JSDocState.SavingComments; + pushComment(scanner.getTokenText()); + break; + } + nextJSDocToken(); + } + removeLeadingNewlines(comments); + removeTrailingWhitespace(comments); + return createJSDocComment(); + }); + + function removeLeadingNewlines(comments: string[]) { + while (comments.length && (comments[0] === "\n" || comments[0] === "\r")) { + comments.shift(); + } + } + + function removeTrailingWhitespace(comments: string[]) { + while (comments.length && comments[comments.length - 1].trim() === "") { + comments.pop(); + } + } + + function createJSDocComment(): JSDoc { + const result = createNode(SyntaxKind.JSDocComment, start); + result.tags = tags && createNodeArray(tags, tagsPos, tagsEnd); + result.comment = comments.length ? comments.join("") : undefined; + return finishNode(result, end); + } + + function isNextNonwhitespaceTokenEndOfFile(): boolean { + // We must use infinite lookahead, as there could be any number of newlines :( + while (true) { + nextJSDocToken(); + if (token() === SyntaxKind.EndOfFileToken) { + return true; + } + if (!(token() === SyntaxKind.WhitespaceTrivia || token() === SyntaxKind.NewLineTrivia)) { + return false; + } + } + } + + function skipWhitespace(): void { + if (token() === SyntaxKind.WhitespaceTrivia || token() === SyntaxKind.NewLineTrivia) { + if (lookAhead(isNextNonwhitespaceTokenEndOfFile)) { + return; // Don't skip whitespace prior to EoF (or end of comment) - that shouldn't be included in any node's range + } + } + while (token() === SyntaxKind.WhitespaceTrivia || token() === SyntaxKind.NewLineTrivia) { + nextJSDocToken(); + } + } + + function skipWhitespaceOrAsterisk(): void { + if (token() === SyntaxKind.WhitespaceTrivia || token() === SyntaxKind.NewLineTrivia) { + if (lookAhead(isNextNonwhitespaceTokenEndOfFile)) { + return; // Don't skip whitespace prior to EoF (or end of comment) - that shouldn't be included in any node's range + } + } + + let precedingLineBreak = scanner.hasPrecedingLineBreak(); + while ((precedingLineBreak && token() === SyntaxKind.AsteriskToken) || token() === SyntaxKind.WhitespaceTrivia || token() === SyntaxKind.NewLineTrivia) { + if (token() === SyntaxKind.NewLineTrivia) { + precedingLineBreak = true; + } + else if (token() === SyntaxKind.AsteriskToken) { + precedingLineBreak = false; + } + nextJSDocToken(); + } + } + + function parseTag(indent: number) { + Debug.assert(token() === SyntaxKind.AtToken); + const atToken = createNode(SyntaxKind.AtToken, scanner.getTokenPos()); + atToken.end = scanner.getTextPos(); + nextJSDocToken(); + + const tagName = parseJSDocIdentifierName(); + skipWhitespaceOrAsterisk(); + + let tag: JSDocTag | undefined; + switch (tagName.escapedText) { + case "augments": + case "extends": + tag = parseAugmentsTag(atToken, tagName); + break; + case "class": + case "constructor": + tag = parseClassTag(atToken, tagName); + break; + case "this": + tag = parseThisTag(atToken, tagName); + break; + case "enum": + tag = parseEnumTag(atToken, tagName); + break; + case "arg": + case "argument": + case "param": + return parseParameterOrPropertyTag(atToken, tagName, PropertyLikeParse.Parameter, indent); + case "return": + case "returns": + tag = parseReturnTag(atToken, tagName); + break; + case "template": + tag = parseTemplateTag(atToken, tagName); + break; + case "type": + tag = parseTypeTag(atToken, tagName); + break; + case "typedef": + tag = parseTypedefTag(atToken, tagName, indent); + break; + case "callback": + tag = parseCallbackTag(atToken, tagName, indent); + break; + default: + tag = parseUnknownTag(atToken, tagName); + break; + } + + if (!tag.comment) { + // some tags, like typedef and callback, have already parsed their comments earlier + tag.comment = parseTagComments(indent + tag.end - tag.pos); + } + return tag; + } + + function parseTagComments(indent: number): string | undefined { + const comments: string[] = []; + let state = JSDocState.BeginningOfLine; + let margin: number | undefined; + function pushComment(text: string) { + if (!margin) { + margin = indent; + } + comments.push(text); + indent += text.length; + } + let tok = token() as JsDocSyntaxKind; + loop: while (true) { + switch (tok) { + case SyntaxKind.NewLineTrivia: + if (state >= JSDocState.SawAsterisk) { + state = JSDocState.BeginningOfLine; + comments.push(scanner.getTokenText()); + } + indent = 0; + break; + case SyntaxKind.AtToken: + scanner.setTextPos(scanner.getTextPos() - 1); + // falls through + case SyntaxKind.EndOfFileToken: + // Done + break loop; + case SyntaxKind.WhitespaceTrivia: + if (state === JSDocState.SavingComments) { + pushComment(scanner.getTokenText()); + } + else { + const whitespace = scanner.getTokenText(); + // if the whitespace crosses the margin, take only the whitespace that passes the margin + if (margin !== undefined && indent + whitespace.length > margin) { + comments.push(whitespace.slice(margin - indent - 1)); + } + indent += whitespace.length; + } + break; + case SyntaxKind.OpenBraceToken: + state = JSDocState.SavingComments; + if (lookAhead(() => nextJSDocToken() === SyntaxKind.AtToken && tokenIsIdentifierOrKeyword(nextJSDocToken()) && scanner.getTokenText() === "link")) { + pushComment(scanner.getTokenText()); + nextJSDocToken(); + pushComment(scanner.getTokenText()); + nextJSDocToken(); + } + pushComment(scanner.getTokenText()); + break; + case SyntaxKind.AsteriskToken: + if (state === JSDocState.BeginningOfLine) { + // leading asterisks start recording on the *next* (non-whitespace) token + state = JSDocState.SawAsterisk; + indent += 1; + break; + } + // record the * as a comment + // falls through + default: + state = JSDocState.SavingComments; // leading identifiers start recording as well + pushComment(scanner.getTokenText()); + break; + } + tok = nextJSDocToken(); + } + + removeLeadingNewlines(comments); + removeTrailingWhitespace(comments); + return comments.length === 0 ? undefined : comments.join(""); + } + + function parseUnknownTag(atToken: AtToken, tagName: Identifier) { + const result = createNode(SyntaxKind.JSDocTag, atToken.pos); + result.atToken = atToken; + result.tagName = tagName; + return finishNode(result); + } + + function addTag(tag: JSDocTag | undefined): void { + if (!tag) { + return; + } + if (!tags) { + tags = [tag]; + tagsPos = tag.pos; + } + else { + tags.push(tag); + } + tagsEnd = tag.end; + } + + function tryParseTypeExpression(): JSDocTypeExpression | undefined { + skipWhitespaceOrAsterisk(); + return token() === SyntaxKind.OpenBraceToken ? parseJSDocTypeExpression() : undefined; + } + + function parseBracketNameInPropertyAndParamTag(): { name: EntityName, isBracketed: boolean } { + if (token() === SyntaxKind.NoSubstitutionTemplateLiteral) { + // a markdown-quoted name: `arg` is not legal jsdoc, but occurs in the wild + return { name: createIdentifier(/*isIdentifier*/ true), isBracketed: false }; + } + // Looking for something like '[foo]', 'foo', '[foo.bar]' or 'foo.bar' + const isBracketed = parseOptional(SyntaxKind.OpenBracketToken); + const name = parseJSDocEntityName(); + if (isBracketed) { + skipWhitespace(); + + // May have an optional default, e.g. '[foo = 42]' + if (parseOptionalToken(SyntaxKind.EqualsToken)) { + parseExpression(); + } + + parseExpected(SyntaxKind.CloseBracketToken); + } + + return { name, isBracketed }; + } + + function isObjectOrObjectArrayTypeReference(node: TypeNode): boolean { + switch (node.kind) { + case SyntaxKind.ObjectKeyword: + return true; + case SyntaxKind.ArrayType: + return isObjectOrObjectArrayTypeReference((node as ArrayTypeNode).elementType); + default: + return isTypeReferenceNode(node) && ts.isIdentifier(node.typeName) && node.typeName.escapedText === "Object"; + } + } + + function parseParameterOrPropertyTag(atToken: AtToken, tagName: Identifier, target: PropertyLikeParse, indent: number | undefined): JSDocParameterTag | JSDocPropertyTag { + let typeExpression = tryParseTypeExpression(); + let isNameFirst = !typeExpression; + skipWhitespaceOrAsterisk(); + + const { name, isBracketed } = parseBracketNameInPropertyAndParamTag(); + skipWhitespace(); + + if (isNameFirst) { + typeExpression = tryParseTypeExpression(); + } + + const result = target === PropertyLikeParse.Property ? + createNode(SyntaxKind.JSDocPropertyTag, atToken.pos) : + createNode(SyntaxKind.JSDocParameterTag, atToken.pos); + let comment: string | undefined; + if (indent !== undefined) comment = parseTagComments(indent + scanner.getStartPos() - atToken.pos); + const nestedTypeLiteral = target !== PropertyLikeParse.CallbackParameter && parseNestedTypeLiteral(typeExpression, name, target); + if (nestedTypeLiteral) { + typeExpression = nestedTypeLiteral; + isNameFirst = true; + } + result.atToken = atToken; + result.tagName = tagName; + result.typeExpression = typeExpression; + result.name = name; + result.isNameFirst = isNameFirst; + result.isBracketed = isBracketed; + result.comment = comment; + return finishNode(result); + } + + function parseNestedTypeLiteral(typeExpression: JSDocTypeExpression | undefined, name: EntityName, target: PropertyLikeParse) { + if (typeExpression && isObjectOrObjectArrayTypeReference(typeExpression.type)) { + const typeLiteralExpression = createNode(SyntaxKind.JSDocTypeExpression, scanner.getTokenPos()); + let child: JSDocPropertyLikeTag | JSDocTypeTag | false; + let jsdocTypeLiteral: JSDocTypeLiteral; + const start = scanner.getStartPos(); + let children: JSDocPropertyLikeTag[] | undefined; + while (child = tryParse(() => parseChildParameterOrPropertyTag(target, name))) { + if (child.kind === SyntaxKind.JSDocParameterTag || child.kind === SyntaxKind.JSDocPropertyTag) { + children = append(children, child); + } + } + if (children) { + jsdocTypeLiteral = createNode(SyntaxKind.JSDocTypeLiteral, start); + jsdocTypeLiteral.jsDocPropertyTags = children; + if (typeExpression.type.kind === SyntaxKind.ArrayType) { + jsdocTypeLiteral.isArrayType = true; + } + typeLiteralExpression.type = finishNode(jsdocTypeLiteral); + return finishNode(typeLiteralExpression); + } + } + } + + function parseReturnTag(atToken: AtToken, tagName: Identifier): JSDocReturnTag { + if (forEach(tags, t => t.kind === SyntaxKind.JSDocReturnTag)) { + parseErrorAt(tagName.pos, scanner.getTokenPos(), Diagnostics._0_tag_already_specified, tagName.escapedText); + } + + const result = createNode(SyntaxKind.JSDocReturnTag, atToken.pos); + result.atToken = atToken; + result.tagName = tagName; + result.typeExpression = tryParseTypeExpression(); + return finishNode(result); + } + + function parseTypeTag(atToken: AtToken, tagName: Identifier): JSDocTypeTag { + if (forEach(tags, t => t.kind === SyntaxKind.JSDocTypeTag)) { + parseErrorAt(tagName.pos, scanner.getTokenPos(), Diagnostics._0_tag_already_specified, tagName.escapedText); + } + + const result = createNode(SyntaxKind.JSDocTypeTag, atToken.pos); + result.atToken = atToken; + result.tagName = tagName; + result.typeExpression = parseJSDocTypeExpression(/*mayOmitBraces*/ true); + return finishNode(result); + } + + function parseAugmentsTag(atToken: AtToken, tagName: Identifier): JSDocAugmentsTag { + const result = createNode(SyntaxKind.JSDocAugmentsTag, atToken.pos); + result.atToken = atToken; + result.tagName = tagName; + result.class = parseExpressionWithTypeArgumentsForAugments(); + return finishNode(result); + } + + function parseExpressionWithTypeArgumentsForAugments(): ExpressionWithTypeArguments & { expression: Identifier | PropertyAccessEntityNameExpression } { + const usedBrace = parseOptional(SyntaxKind.OpenBraceToken); + const node = createNode(SyntaxKind.ExpressionWithTypeArguments) as ExpressionWithTypeArguments & { expression: Identifier | PropertyAccessEntityNameExpression }; + node.expression = parsePropertyAccessEntityNameExpression(); + node.typeArguments = tryParseTypeArguments(); + const res = finishNode(node); + if (usedBrace) { + parseExpected(SyntaxKind.CloseBraceToken); + } + return res; + } + + function parsePropertyAccessEntityNameExpression() { + let node: Identifier | PropertyAccessEntityNameExpression = parseJSDocIdentifierName(); + while (parseOptional(SyntaxKind.DotToken)) { + const prop: PropertyAccessEntityNameExpression = createNode(SyntaxKind.PropertyAccessExpression, node.pos) as PropertyAccessEntityNameExpression; + prop.expression = node; + prop.name = parseJSDocIdentifierName(); + node = finishNode(prop); + } + return node; + } + + function parseClassTag(atToken: AtToken, tagName: Identifier): JSDocClassTag { + const tag = createNode(SyntaxKind.JSDocClassTag, atToken.pos); + tag.atToken = atToken; + tag.tagName = tagName; + return finishNode(tag); + } + + function parseThisTag(atToken: AtToken, tagName: Identifier): JSDocThisTag { + const tag = createNode(SyntaxKind.JSDocThisTag, atToken.pos); + tag.atToken = atToken; + tag.tagName = tagName; + tag.typeExpression = parseJSDocTypeExpression(/*mayOmitBraces*/ true); + skipWhitespace(); + return finishNode(tag); + } + + function parseEnumTag(atToken: AtToken, tagName: Identifier): JSDocEnumTag { + const tag = createNode(SyntaxKind.JSDocEnumTag, atToken.pos); + tag.atToken = atToken; + tag.tagName = tagName; + tag.typeExpression = parseJSDocTypeExpression(/*mayOmitBraces*/ true); + skipWhitespace(); + return finishNode(tag); + } + + function parseTypedefTag(atToken: AtToken, tagName: Identifier, indent: number): JSDocTypedefTag { + const typeExpression = tryParseTypeExpression(); + skipWhitespace(); + + const typedefTag = createNode(SyntaxKind.JSDocTypedefTag, atToken.pos); + typedefTag.atToken = atToken; + typedefTag.tagName = tagName; + typedefTag.fullName = parseJSDocTypeNameWithNamespace(); + typedefTag.name = getJSDocTypeAliasName(typedefTag.fullName); + skipWhitespace(); + typedefTag.comment = parseTagComments(indent); + + typedefTag.typeExpression = typeExpression; + let end: number | undefined; + if (!typeExpression || isObjectOrObjectArrayTypeReference(typeExpression.type)) { + let child: JSDocTypeTag | JSDocPropertyTag | false; + let jsdocTypeLiteral: JSDocTypeLiteral | undefined; + let childTypeTag: JSDocTypeTag | undefined; + const start = atToken.pos; + while (child = tryParse(() => parseChildPropertyTag())) { + if (!jsdocTypeLiteral) { + jsdocTypeLiteral = createNode(SyntaxKind.JSDocTypeLiteral, start); + } + if (child.kind === SyntaxKind.JSDocTypeTag) { + if (childTypeTag) { + break; + } + else { + childTypeTag = child; + } + } + else { + jsdocTypeLiteral.jsDocPropertyTags = append(jsdocTypeLiteral.jsDocPropertyTags as MutableNodeArray, child); + } + } + if (jsdocTypeLiteral) { + if (typeExpression && typeExpression.type.kind === SyntaxKind.ArrayType) { + jsdocTypeLiteral.isArrayType = true; + } + typedefTag.typeExpression = childTypeTag && childTypeTag.typeExpression && !isObjectOrObjectArrayTypeReference(childTypeTag.typeExpression.type) ? + childTypeTag.typeExpression : + finishNode(jsdocTypeLiteral); + end = typedefTag.typeExpression.end; + } + } + + // Only include the characters between the name end and the next token if a comment was actually parsed out - otherwise it's just whitespace + return finishNode(typedefTag, end || typedefTag.comment !== undefined ? scanner.getStartPos() : (typedefTag.fullName || typedefTag.typeExpression || typedefTag.tagName).end); + } + + function parseJSDocTypeNameWithNamespace(nested?: boolean) { + const pos = scanner.getTokenPos(); + if (!tokenIsIdentifierOrKeyword(token())) { + return undefined; + } + const typeNameOrNamespaceName = parseJSDocIdentifierName(); + if (parseOptional(SyntaxKind.DotToken)) { + const jsDocNamespaceNode = createNode(SyntaxKind.ModuleDeclaration, pos); + if (nested) { + jsDocNamespaceNode.flags |= NodeFlags.NestedNamespace; + } + jsDocNamespaceNode.name = typeNameOrNamespaceName; + jsDocNamespaceNode.body = parseJSDocTypeNameWithNamespace(/*nested*/ true); + return finishNode(jsDocNamespaceNode); + } + + if (nested) { + typeNameOrNamespaceName.isInJSDocNamespace = true; + } + return typeNameOrNamespaceName; + } + + function parseCallbackTag(atToken: AtToken, tagName: Identifier, indent: number): JSDocCallbackTag { + const callbackTag = createNode(SyntaxKind.JSDocCallbackTag, atToken.pos) as JSDocCallbackTag; + callbackTag.atToken = atToken; + callbackTag.tagName = tagName; + callbackTag.fullName = parseJSDocTypeNameWithNamespace(); + callbackTag.name = getJSDocTypeAliasName(callbackTag.fullName); + skipWhitespace(); + callbackTag.comment = parseTagComments(indent); + + let child: JSDocParameterTag | false; + const start = scanner.getStartPos(); + const jsdocSignature = createNode(SyntaxKind.JSDocSignature, start) as JSDocSignature; + jsdocSignature.parameters = []; + while (child = tryParse(() => parseChildParameterOrPropertyTag(PropertyLikeParse.CallbackParameter) as JSDocParameterTag)) { + jsdocSignature.parameters = append(jsdocSignature.parameters as MutableNodeArray, child); + } + const returnTag = tryParse(() => { + if (parseOptionalJsdoc(SyntaxKind.AtToken)) { + const tag = parseTag(indent); + if (tag && tag.kind === SyntaxKind.JSDocReturnTag) { + return tag as JSDocReturnTag; + } + } + }); + if (returnTag) { + jsdocSignature.type = returnTag; + } + callbackTag.typeExpression = finishNode(jsdocSignature); + return finishNode(callbackTag); + } + + function getJSDocTypeAliasName(fullName: JSDocNamespaceBody | undefined) { + if (fullName) { + let rightNode = fullName; + while (true) { + if (ts.isIdentifier(rightNode) || !rightNode.body) { + return ts.isIdentifier(rightNode) ? rightNode : rightNode.name; + } + rightNode = rightNode.body; + } + } + } + + function escapedTextsEqual(a: EntityName, b: EntityName): boolean { + while (!ts.isIdentifier(a) || !ts.isIdentifier(b)) { + if (!ts.isIdentifier(a) && !ts.isIdentifier(b) && a.right.escapedText === b.right.escapedText) { + a = a.left; + b = b.left; + } + else { + return false; + } + } + return a.escapedText === b.escapedText; + } + + function parseChildPropertyTag() { + return parseChildParameterOrPropertyTag(PropertyLikeParse.Property) as JSDocTypeTag | JSDocPropertyTag | false; + } + + function parseChildParameterOrPropertyTag(target: PropertyLikeParse, name?: EntityName): JSDocTypeTag | JSDocPropertyTag | JSDocParameterTag | false { + let canParseTag = true; + let seenAsterisk = false; + while (true) { + switch (nextJSDocToken()) { + case SyntaxKind.AtToken: + if (canParseTag) { + const child = tryParseChildTag(target); + if (child && (child.kind === SyntaxKind.JSDocParameterTag || child.kind === SyntaxKind.JSDocPropertyTag) && + target !== PropertyLikeParse.CallbackParameter && + name && (ts.isIdentifier(child.name) || !escapedTextsEqual(name, child.name.left))) { + return false; + } + return child; + } + seenAsterisk = false; + break; + case SyntaxKind.NewLineTrivia: + canParseTag = true; + seenAsterisk = false; + break; + case SyntaxKind.AsteriskToken: + if (seenAsterisk) { + canParseTag = false; + } + seenAsterisk = true; + break; + case SyntaxKind.Identifier: + canParseTag = false; + break; + case SyntaxKind.EndOfFileToken: + return false; + } + } + } + + function tryParseChildTag(target: PropertyLikeParse): JSDocTypeTag | JSDocPropertyTag | JSDocParameterTag | false { + Debug.assert(token() === SyntaxKind.AtToken); + const atToken = createNode(SyntaxKind.AtToken); + atToken.end = scanner.getTextPos(); + nextJSDocToken(); + + const tagName = parseJSDocIdentifierName(); + skipWhitespace(); + let t: PropertyLikeParse; + switch (tagName.escapedText) { + case "type": + return target === PropertyLikeParse.Property && parseTypeTag(atToken, tagName); + case "prop": + case "property": + t = PropertyLikeParse.Property; + break; + case "arg": + case "argument": + case "param": + t = PropertyLikeParse.Parameter | PropertyLikeParse.CallbackParameter; + break; + default: + return false; + } + if (!(target & t)) { + return false; + } + const tag = parseParameterOrPropertyTag(atToken, tagName, target, /*indent*/ undefined); + tag.comment = parseTagComments(tag.end - tag.pos); + return tag; + } + + function parseTemplateTag(atToken: AtToken, tagName: Identifier): JSDocTemplateTag { + // the template tag looks like '@template {Constraint} T,U,V' + let constraint: JSDocTypeExpression | undefined; + if (token() === SyntaxKind.OpenBraceToken) { + constraint = parseJSDocTypeExpression(); + } + + const typeParameters = []; + const typeParametersPos = getNodePos(); + do { + skipWhitespace(); + const typeParameter = createNode(SyntaxKind.TypeParameter); + typeParameter.name = parseJSDocIdentifierName(Diagnostics.Unexpected_token_A_type_parameter_name_was_expected_without_curly_braces); + finishNode(typeParameter); + skipWhitespace(); + typeParameters.push(typeParameter); + } while (parseOptionalJsdoc(SyntaxKind.CommaToken)); + + const result = createNode(SyntaxKind.JSDocTemplateTag, atToken.pos); + result.atToken = atToken; + result.tagName = tagName; + result.constraint = constraint; + result.typeParameters = createNodeArray(typeParameters, typeParametersPos); + finishNode(result); + return result; + } + + function nextJSDocToken(): JsDocSyntaxKind { + return currentToken = scanner.scanJSDocToken(); + } + + function parseOptionalJsdoc(t: JsDocSyntaxKind): boolean { + if (token() === t) { + nextJSDocToken(); + return true; + } + return false; + } + + function parseJSDocEntityName(): EntityName { + let entity: EntityName = parseJSDocIdentifierName(); + if (parseOptional(SyntaxKind.OpenBracketToken)) { + parseExpected(SyntaxKind.CloseBracketToken); + // Note that y[] is accepted as an entity name, but the postfix brackets are not saved for checking. + // Technically usejsdoc.org requires them for specifying a property of a type equivalent to Array<{ x: ...}> + // but it's not worth it to enforce that restriction. + } + while (parseOptional(SyntaxKind.DotToken)) { + const name = parseJSDocIdentifierName(); + if (parseOptional(SyntaxKind.OpenBracketToken)) { + parseExpected(SyntaxKind.CloseBracketToken); + } + entity = createQualifiedName(entity, name); + } + return entity; + } + + function parseJSDocIdentifierName(message?: DiagnosticMessage): Identifier { + if (!tokenIsIdentifierOrKeyword(token())) { + return createMissingNode(SyntaxKind.Identifier, /*reportAtCurrentPosition*/ !message, message || Diagnostics.Identifier_expected); + } + + const pos = scanner.getTokenPos(); + const end = scanner.getTextPos(); + const result = createNode(SyntaxKind.Identifier, pos); + result.escapedText = escapeLeadingUnderscores(scanner.getTokenText()); + finishNode(result, end); + + nextJSDocToken(); + return result; + } + } + } + } + + namespace IncrementalParser { + export function updateSourceFile(sourceFile: SourceFile, newText: string, textChangeRange: TextChangeRange, aggressiveChecks: boolean): SourceFile { + aggressiveChecks = aggressiveChecks || Debug.shouldAssert(AssertionLevel.Aggressive); + + checkChangeRange(sourceFile, newText, textChangeRange, aggressiveChecks); + if (textChangeRangeIsUnchanged(textChangeRange)) { + // if the text didn't change, then we can just return our current source file as-is. + return sourceFile; + } + + if (sourceFile.statements.length === 0) { + // If we don't have any statements in the current source file, then there's no real + // way to incrementally parse. So just do a full parse instead. + return Parser.parseSourceFile(sourceFile.fileName, newText, sourceFile.languageVersion, /*syntaxCursor*/ undefined, /*setParentNodes*/ true, sourceFile.scriptKind); + } + + // Make sure we're not trying to incrementally update a source file more than once. Once + // we do an update the original source file is considered unusable from that point onwards. + // + // This is because we do incremental parsing in-place. i.e. we take nodes from the old + // tree and give them new positions and parents. From that point on, trusting the old + // tree at all is not possible as far too much of it may violate invariants. + const incrementalSourceFile = sourceFile; + Debug.assert(!incrementalSourceFile.hasBeenIncrementallyParsed); + incrementalSourceFile.hasBeenIncrementallyParsed = true; + + const oldText = sourceFile.text; + const syntaxCursor = createSyntaxCursor(sourceFile); + + // Make the actual change larger so that we know to reparse anything whose lookahead + // might have intersected the change. + const changeRange = extendToAffectedRange(sourceFile, textChangeRange); + checkChangeRange(sourceFile, newText, changeRange, aggressiveChecks); + + // Ensure that extending the affected range only moved the start of the change range + // earlier in the file. + Debug.assert(changeRange.span.start <= textChangeRange.span.start); + Debug.assert(textSpanEnd(changeRange.span) === textSpanEnd(textChangeRange.span)); + Debug.assert(textSpanEnd(textChangeRangeNewSpan(changeRange)) === textSpanEnd(textChangeRangeNewSpan(textChangeRange))); + + // The is the amount the nodes after the edit range need to be adjusted. It can be + // positive (if the edit added characters), negative (if the edit deleted characters) + // or zero (if this was a pure overwrite with nothing added/removed). + const delta = textChangeRangeNewSpan(changeRange).length - changeRange.span.length; + + // If we added or removed characters during the edit, then we need to go and adjust all + // the nodes after the edit. Those nodes may move forward (if we inserted chars) or they + // may move backward (if we deleted chars). + // + // Doing this helps us out in two ways. First, it means that any nodes/tokens we want + // to reuse are already at the appropriate position in the new text. That way when we + // reuse them, we don't have to figure out if they need to be adjusted. Second, it makes + // it very easy to determine if we can reuse a node. If the node's position is at where + // we are in the text, then we can reuse it. Otherwise we can't. If the node's position + // is ahead of us, then we'll need to rescan tokens. If the node's position is behind + // us, then we'll need to skip it or crumble it as appropriate + // + // We will also adjust the positions of nodes that intersect the change range as well. + // By doing this, we ensure that all the positions in the old tree are consistent, not + // just the positions of nodes entirely before/after the change range. By being + // consistent, we can then easily map from positions to nodes in the old tree easily. + // + // Also, mark any syntax elements that intersect the changed span. We know, up front, + // that we cannot reuse these elements. + updateTokenPositionsAndMarkElements(incrementalSourceFile, + changeRange.span.start, textSpanEnd(changeRange.span), textSpanEnd(textChangeRangeNewSpan(changeRange)), delta, oldText, newText, aggressiveChecks); + + // Now that we've set up our internal incremental state just proceed and parse the + // source file in the normal fashion. When possible the parser will retrieve and + // reuse nodes from the old tree. + // + // Note: passing in 'true' for setNodeParents is very important. When incrementally + // parsing, we will be reusing nodes from the old tree, and placing it into new + // parents. If we don't set the parents now, we'll end up with an observably + // inconsistent tree. Setting the parents on the new tree should be very fast. We + // will immediately bail out of walking any subtrees when we can see that their parents + // are already correct. + const result = Parser.parseSourceFile(sourceFile.fileName, newText, sourceFile.languageVersion, syntaxCursor, /*setParentNodes*/ true, sourceFile.scriptKind); + + return result; + } + + function moveElementEntirelyPastChangeRange(element: IncrementalElement, isArray: boolean, delta: number, oldText: string, newText: string, aggressiveChecks: boolean) { + if (isArray) { + visitArray(element); + } + else { + visitNode(element); + } + return; + + function visitNode(node: IncrementalNode) { + let text = ""; + if (aggressiveChecks && shouldCheckNode(node)) { + text = oldText.substring(node.pos, node.end); + } + + // Ditch any existing LS children we may have created. This way we can avoid + // moving them forward. + if (node._children) { + node._children = undefined; + } + + node.pos += delta; + node.end += delta; + + if (aggressiveChecks && shouldCheckNode(node)) { + Debug.assert(text === newText.substring(node.pos, node.end)); + } + + forEachChild(node, visitNode, visitArray); + if (hasJSDocNodes(node)) { + for (const jsDocComment of node.jsDoc!) { + visitNode(jsDocComment); + } + } + checkNodePositions(node, aggressiveChecks); + } + + function visitArray(array: IncrementalNodeArray) { + array._children = undefined; + array.pos += delta; + array.end += delta; + + for (const node of array) { + visitNode(node); + } + } + } + + function shouldCheckNode(node: Node) { + switch (node.kind) { + case SyntaxKind.StringLiteral: + case SyntaxKind.NumericLiteral: + case SyntaxKind.Identifier: + return true; + } + + return false; + } + + function adjustIntersectingElement(element: IncrementalElement, changeStart: number, changeRangeOldEnd: number, changeRangeNewEnd: number, delta: number) { + Debug.assert(element.end >= changeStart, "Adjusting an element that was entirely before the change range"); + Debug.assert(element.pos <= changeRangeOldEnd, "Adjusting an element that was entirely after the change range"); + Debug.assert(element.pos <= element.end); + + // We have an element that intersects the change range in some way. It may have its + // start, or its end (or both) in the changed range. We want to adjust any part + // that intersects such that the final tree is in a consistent state. i.e. all + // children have spans within the span of their parent, and all siblings are ordered + // properly. + + // We may need to update both the 'pos' and the 'end' of the element. + + // If the 'pos' is before the start of the change, then we don't need to touch it. + // If it isn't, then the 'pos' must be inside the change. How we update it will + // depend if delta is positive or negative. If delta is positive then we have + // something like: + // + // -------------------AAA----------------- + // -------------------BBBCCCCCCC----------------- + // + // In this case, we consider any node that started in the change range to still be + // starting at the same position. + // + // however, if the delta is negative, then we instead have something like this: + // + // -------------------XXXYYYYYYY----------------- + // -------------------ZZZ----------------- + // + // In this case, any element that started in the 'X' range will keep its position. + // However any element that started after that will have their pos adjusted to be + // at the end of the new range. i.e. any node that started in the 'Y' range will + // be adjusted to have their start at the end of the 'Z' range. + // + // The element will keep its position if possible. Or Move backward to the new-end + // if it's in the 'Y' range. + element.pos = Math.min(element.pos, changeRangeNewEnd); + + // If the 'end' is after the change range, then we always adjust it by the delta + // amount. However, if the end is in the change range, then how we adjust it + // will depend on if delta is positive or negative. If delta is positive then we + // have something like: + // + // -------------------AAA----------------- + // -------------------BBBCCCCCCC----------------- + // + // In this case, we consider any node that ended inside the change range to keep its + // end position. + // + // however, if the delta is negative, then we instead have something like this: + // + // -------------------XXXYYYYYYY----------------- + // -------------------ZZZ----------------- + // + // In this case, any element that ended in the 'X' range will keep its position. + // However any element that ended after that will have their pos adjusted to be + // at the end of the new range. i.e. any node that ended in the 'Y' range will + // be adjusted to have their end at the end of the 'Z' range. + if (element.end >= changeRangeOldEnd) { + // Element ends after the change range. Always adjust the end pos. + element.end += delta; + } + else { + // Element ends in the change range. The element will keep its position if + // possible. Or Move backward to the new-end if it's in the 'Y' range. + element.end = Math.min(element.end, changeRangeNewEnd); + } + + Debug.assert(element.pos <= element.end); + if (element.parent) { + Debug.assert(element.pos >= element.parent.pos); + Debug.assert(element.end <= element.parent.end); + } + } + + function checkNodePositions(node: Node, aggressiveChecks: boolean) { + if (aggressiveChecks) { + let pos = node.pos; + const visitNode = (child: Node) => { + Debug.assert(child.pos >= pos); + pos = child.end; + }; + if (hasJSDocNodes(node)) { + for (const jsDocComment of node.jsDoc!) { + visitNode(jsDocComment); + } + } + forEachChild(node, visitNode); + Debug.assert(pos <= node.end); + } + } + + function updateTokenPositionsAndMarkElements( + sourceFile: IncrementalNode, + changeStart: number, + changeRangeOldEnd: number, + changeRangeNewEnd: number, + delta: number, + oldText: string, + newText: string, + aggressiveChecks: boolean): void { + + visitNode(sourceFile); + return; + + function visitNode(child: IncrementalNode) { + Debug.assert(child.pos <= child.end); + if (child.pos > changeRangeOldEnd) { + // Node is entirely past the change range. We need to move both its pos and + // end, forward or backward appropriately. + moveElementEntirelyPastChangeRange(child, /*isArray*/ false, delta, oldText, newText, aggressiveChecks); + return; + } + + // Check if the element intersects the change range. If it does, then it is not + // reusable. Also, we'll need to recurse to see what constituent portions we may + // be able to use. + const fullEnd = child.end; + if (fullEnd >= changeStart) { + child.intersectsChange = true; + child._children = undefined; + + // Adjust the pos or end (or both) of the intersecting element accordingly. + adjustIntersectingElement(child, changeStart, changeRangeOldEnd, changeRangeNewEnd, delta); + forEachChild(child, visitNode, visitArray); + if (hasJSDocNodes(child)) { + for (const jsDocComment of child.jsDoc!) { + visitNode(jsDocComment); + } + } + checkNodePositions(child, aggressiveChecks); + return; + } + + // Otherwise, the node is entirely before the change range. No need to do anything with it. + Debug.assert(fullEnd < changeStart); + } + + function visitArray(array: IncrementalNodeArray) { + Debug.assert(array.pos <= array.end); + if (array.pos > changeRangeOldEnd) { + // Array is entirely after the change range. We need to move it, and move any of + // its children. + moveElementEntirelyPastChangeRange(array, /*isArray*/ true, delta, oldText, newText, aggressiveChecks); + return; + } + + // Check if the element intersects the change range. If it does, then it is not + // reusable. Also, we'll need to recurse to see what constituent portions we may + // be able to use. + const fullEnd = array.end; + if (fullEnd >= changeStart) { + array.intersectsChange = true; + array._children = undefined; + + // Adjust the pos or end (or both) of the intersecting array accordingly. + adjustIntersectingElement(array, changeStart, changeRangeOldEnd, changeRangeNewEnd, delta); + for (const node of array) { + visitNode(node); + } + return; + } + + // Otherwise, the array is entirely before the change range. No need to do anything with it. + Debug.assert(fullEnd < changeStart); + } + } + + function extendToAffectedRange(sourceFile: SourceFile, changeRange: TextChangeRange): TextChangeRange { + // Consider the following code: + // void foo() { /; } + // + // If the text changes with an insertion of / just before the semicolon then we end up with: + // void foo() { //; } + // + // If we were to just use the changeRange a is, then we would not rescan the { token + // (as it does not intersect the actual original change range). Because an edit may + // change the token touching it, we actually need to look back *at least* one token so + // that the prior token sees that change. + const maxLookahead = 1; + + let start = changeRange.span.start; + + // the first iteration aligns us with the change start. subsequent iteration move us to + // the left by maxLookahead tokens. We only need to do this as long as we're not at the + // start of the tree. + for (let i = 0; start > 0 && i <= maxLookahead; i++) { + const nearestNode = findNearestNodeStartingBeforeOrAtPosition(sourceFile, start); + Debug.assert(nearestNode.pos <= start); + const position = nearestNode.pos; + + start = Math.max(0, position - 1); + } + + const finalSpan = createTextSpanFromBounds(start, textSpanEnd(changeRange.span)); + const finalLength = changeRange.newLength + (changeRange.span.start - start); + + return createTextChangeRange(finalSpan, finalLength); + } + + function findNearestNodeStartingBeforeOrAtPosition(sourceFile: SourceFile, position: number): Node { + let bestResult: Node = sourceFile; + let lastNodeEntirelyBeforePosition: Node | undefined; + + forEachChild(sourceFile, visit); + + if (lastNodeEntirelyBeforePosition) { + const lastChildOfLastEntireNodeBeforePosition = getLastDescendant(lastNodeEntirelyBeforePosition); + if (lastChildOfLastEntireNodeBeforePosition.pos > bestResult.pos) { + bestResult = lastChildOfLastEntireNodeBeforePosition; + } + } + + return bestResult; + + function getLastDescendant(node: Node): Node { + while (true) { + const lastChild = getLastChild(node); + if (lastChild) { + node = lastChild; + } + else { + return node; + } + } + } + + function visit(child: Node) { + if (nodeIsMissing(child)) { + // Missing nodes are effectively invisible to us. We never even consider them + // When trying to find the nearest node before us. + return; + } + + // If the child intersects this position, then this node is currently the nearest + // node that starts before the position. + if (child.pos <= position) { + if (child.pos >= bestResult.pos) { + // This node starts before the position, and is closer to the position than + // the previous best node we found. It is now the new best node. + bestResult = child; + } + + // Now, the node may overlap the position, or it may end entirely before the + // position. If it overlaps with the position, then either it, or one of its + // children must be the nearest node before the position. So we can just + // recurse into this child to see if we can find something better. + if (position < child.end) { + // The nearest node is either this child, or one of the children inside + // of it. We've already marked this child as the best so far. Recurse + // in case one of the children is better. + forEachChild(child, visit); + + // Once we look at the children of this node, then there's no need to + // continue any further. + return true; + } + else { + Debug.assert(child.end <= position); + // The child ends entirely before this position. Say you have the following + // (where $ is the position) + // + // ? $ : <...> <...> + // + // We would want to find the nearest preceding node in "complex expr 2". + // To support that, we keep track of this node, and once we're done searching + // for a best node, we recurse down this node to see if we can find a good + // result in it. + // + // This approach allows us to quickly skip over nodes that are entirely + // before the position, while still allowing us to find any nodes in the + // last one that might be what we want. + lastNodeEntirelyBeforePosition = child; + } + } + else { + Debug.assert(child.pos > position); + // We're now at a node that is entirely past the position we're searching for. + // This node (and all following nodes) could never contribute to the result, + // so just skip them by returning 'true' here. + return true; + } + } + } + + function checkChangeRange(sourceFile: SourceFile, newText: string, textChangeRange: TextChangeRange, aggressiveChecks: boolean) { + const oldText = sourceFile.text; + if (textChangeRange) { + Debug.assert((oldText.length - textChangeRange.span.length + textChangeRange.newLength) === newText.length); + + if (aggressiveChecks || Debug.shouldAssert(AssertionLevel.VeryAggressive)) { + const oldTextPrefix = oldText.substr(0, textChangeRange.span.start); + const newTextPrefix = newText.substr(0, textChangeRange.span.start); + Debug.assert(oldTextPrefix === newTextPrefix); + + const oldTextSuffix = oldText.substring(textSpanEnd(textChangeRange.span), oldText.length); + const newTextSuffix = newText.substring(textSpanEnd(textChangeRangeNewSpan(textChangeRange)), newText.length); + Debug.assert(oldTextSuffix === newTextSuffix); + } + } + } + + interface IncrementalElement extends TextRange { + parent: Node; + intersectsChange: boolean; + length?: number; + _children: Node[] | undefined; + } + + export interface IncrementalNode extends Node, IncrementalElement { + hasBeenIncrementallyParsed: boolean; + } + + interface IncrementalNodeArray extends NodeArray, IncrementalElement { + length: number; + } + + // Allows finding nodes in the source file at a certain position in an efficient manner. + // The implementation takes advantage of the calling pattern it knows the parser will + // make in order to optimize finding nodes as quickly as possible. + export interface SyntaxCursor { + currentNode(position: number): IncrementalNode; + } + + function createSyntaxCursor(sourceFile: SourceFile): SyntaxCursor { + let currentArray: NodeArray = sourceFile.statements; + let currentArrayIndex = 0; + + Debug.assert(currentArrayIndex < currentArray.length); + let current = currentArray[currentArrayIndex]; + let lastQueriedPosition = InvalidPosition.Value; + + return { + currentNode(position: number) { + // Only compute the current node if the position is different than the last time + // we were asked. The parser commonly asks for the node at the same position + // twice. Once to know if can read an appropriate list element at a certain point, + // and then to actually read and consume the node. + if (position !== lastQueriedPosition) { + // Much of the time the parser will need the very next node in the array that + // we just returned a node from.So just simply check for that case and move + // forward in the array instead of searching for the node again. + if (current && current.end === position && currentArrayIndex < (currentArray.length - 1)) { + currentArrayIndex++; + current = currentArray[currentArrayIndex]; + } + + // If we don't have a node, or the node we have isn't in the right position, + // then try to find a viable node at the position requested. + if (!current || current.pos !== position) { + findHighestListElementThatStartsAtPosition(position); + } + } + + // Cache this query so that we don't do any extra work if the parser calls back + // into us. Note: this is very common as the parser will make pairs of calls like + // 'isListElement -> parseListElement'. If we were unable to find a node when + // called with 'isListElement', we don't want to redo the work when parseListElement + // is called immediately after. + lastQueriedPosition = position; + + // Either we don'd have a node, or we have a node at the position being asked for. + Debug.assert(!current || current.pos === position); + return current; + } + }; + + // Finds the highest element in the tree we can find that starts at the provided position. + // The element must be a direct child of some node list in the tree. This way after we + // return it, we can easily return its next sibling in the list. + function findHighestListElementThatStartsAtPosition(position: number) { + // Clear out any cached state about the last node we found. + currentArray = undefined!; + currentArrayIndex = InvalidPosition.Value; + current = undefined!; + + // Recurse into the source file to find the highest node at this position. + forEachChild(sourceFile, visitNode, visitArray); + return; + + function visitNode(node: Node) { + if (position >= node.pos && position < node.end) { + // Position was within this node. Keep searching deeper to find the node. + forEachChild(node, visitNode, visitArray); + + // don't proceed any further in the search. + return true; + } + + // position wasn't in this node, have to keep searching. + return false; + } + + function visitArray(array: NodeArray) { + if (position >= array.pos && position < array.end) { + // position was in this array. Search through this array to see if we find a + // viable element. + for (let i = 0; i < array.length; i++) { + const child = array[i]; + if (child) { + if (child.pos === position) { + // Found the right node. We're done. + currentArray = array; + currentArrayIndex = i; + current = child; + return true; + } + else { + if (child.pos < position && position < child.end) { + // Position in somewhere within this child. Search in it and + // stop searching in this array. + forEachChild(child, visitNode, visitArray); + return true; + } + } + } + } + } + + // position wasn't in this array, have to keep searching. + return false; + } + } + } + + const enum InvalidPosition { + Value = -1 + } + } + + /** @internal */ + export function isDeclarationFileName(fileName: string): boolean { + return fileExtensionIs(fileName, Extension.Dts); + } + + /*@internal*/ + export interface PragmaContext { + languageVersion: ScriptTarget; + pragmas?: PragmaMap; + checkJsDirective?: CheckJsDirective; + referencedFiles: FileReference[]; + typeReferenceDirectives: FileReference[]; + libReferenceDirectives: FileReference[]; + amdDependencies: AmdDependency[]; + hasNoDefaultLib?: boolean; + moduleName?: string; + } + + /*@internal*/ + export function processCommentPragmas(context: PragmaContext, sourceText: string): void { + const triviaScanner = createScanner(context.languageVersion, /*skipTrivia*/ false, LanguageVariant.Standard, sourceText); + const pragmas: PragmaPsuedoMapEntry[] = []; + + // Keep scanning all the leading trivia in the file until we get to something that + // isn't trivia. Any single line comment will be analyzed to see if it is a + // reference comment. + while (true) { + const kind = triviaScanner.scan(); + if (!isTrivia(kind)) { + break; + } + + const range = { + kind: triviaScanner.getToken(), + pos: triviaScanner.getTokenPos(), + end: triviaScanner.getTextPos(), + }; + + const comment = sourceText.substring(range.pos, range.end); + extractPragmas(pragmas, range, comment); + } + + context.pragmas = createMap() as PragmaMap; + for (const pragma of pragmas) { + if (context.pragmas.has(pragma!.name)) { // TODO: GH#18217 + const currentValue = context.pragmas.get(pragma!.name); + if (currentValue instanceof Array) { + currentValue.push(pragma!.args); + } + else { + context.pragmas.set(pragma!.name, [currentValue, pragma!.args]); + } + continue; + } + context.pragmas.set(pragma!.name, pragma!.args); + } + } + + /*@internal*/ + type PragmaDiagnosticReporter = (pos: number, length: number, message: DiagnosticMessage) => void; + + /*@internal*/ + export function processPragmasIntoFields(context: PragmaContext, reportDiagnostic: PragmaDiagnosticReporter): void { + context.checkJsDirective = undefined; + context.referencedFiles = []; + context.typeReferenceDirectives = []; + context.libReferenceDirectives = []; + context.amdDependencies = []; + context.hasNoDefaultLib = false; + context.pragmas!.forEach((entryOrList, key) => { // TODO: GH#18217 + // TODO: The below should be strongly type-guarded and not need casts/explicit annotations, since entryOrList is related to + // key and key is constrained to a union; but it's not (see GH#21483 for at least partial fix) :( + switch (key) { + case "reference": { + const referencedFiles = context.referencedFiles; + const typeReferenceDirectives = context.typeReferenceDirectives; + const libReferenceDirectives = context.libReferenceDirectives; + forEach(toArray(entryOrList), (arg: PragmaPsuedoMap["reference"]) => { + // TODO: GH#18217 + if (arg!.arguments["no-default-lib"]) { + context.hasNoDefaultLib = true; + } + else if (arg!.arguments.types) { + typeReferenceDirectives.push({ pos: arg!.arguments.types!.pos, end: arg!.arguments.types!.end, fileName: arg!.arguments.types!.value }); + } + else if (arg!.arguments.lib) { + libReferenceDirectives.push({ pos: arg!.arguments.lib!.pos, end: arg!.arguments.lib!.end, fileName: arg!.arguments.lib!.value }); + } + else if (arg!.arguments.path) { + referencedFiles.push({ pos: arg!.arguments.path!.pos, end: arg!.arguments.path!.end, fileName: arg!.arguments.path!.value }); + } + else { + reportDiagnostic(arg!.range.pos, arg!.range.end - arg!.range.pos, Diagnostics.Invalid_reference_directive_syntax); + } + }); + break; + } + case "amd-dependency": { + context.amdDependencies = map( + toArray(entryOrList), + (x: PragmaPsuedoMap["amd-dependency"]) => ({ name: x!.arguments.name!, path: x!.arguments.path })); // TODO: GH#18217 + break; + } + case "amd-module": { + if (entryOrList instanceof Array) { + for (const entry of entryOrList) { + if (context.moduleName) { + // TODO: It's probably fine to issue this diagnostic on all instances of the pragma + reportDiagnostic(entry!.range.pos, entry!.range.end - entry!.range.pos, Diagnostics.An_AMD_module_cannot_have_multiple_name_assignments); + } + context.moduleName = (entry as PragmaPsuedoMap["amd-module"])!.arguments.name; + } + } + else { + context.moduleName = (entryOrList as PragmaPsuedoMap["amd-module"])!.arguments.name; + } + break; + } + case "ts-nocheck": + case "ts-check": { + // _last_ of either nocheck or check in a file is the "winner" + forEach(toArray(entryOrList), entry => { + if (!context.checkJsDirective || entry!.range.pos > context.checkJsDirective.pos) { // TODO: GH#18217 + context.checkJsDirective = { + enabled: key === "ts-check", + end: entry!.range.end, + pos: entry!.range.pos + }; + } + }); + break; + } + case "jsx": return; // Accessed directly + default: Debug.fail("Unhandled pragma kind"); // Can this be made into an assertNever in the future? + } + }); + } + + const namedArgRegExCache = createMap(); + function getNamedArgRegEx(name: string): RegExp { + if (namedArgRegExCache.has(name)) { + return namedArgRegExCache.get(name)!; + } + const result = new RegExp(`(\\s${name}\\s*=\\s*)('|")(.+?)\\2`, "im"); + namedArgRegExCache.set(name, result); + return result; + } + + const tripleSlashXMLCommentStartRegEx = /^\/\/\/\s*<(\S+)\s.*?\/>/im; + const singleLinePragmaRegEx = /^\/\/\/?\s*@(\S+)\s*(.*)\s*$/im; + function extractPragmas(pragmas: PragmaPsuedoMapEntry[], range: CommentRange, text: string) { + const tripleSlash = range.kind === SyntaxKind.SingleLineCommentTrivia && tripleSlashXMLCommentStartRegEx.exec(text); + if (tripleSlash) { + const name = tripleSlash[1].toLowerCase() as keyof PragmaPsuedoMap; // Technically unsafe cast, but we do it so the below check to make it safe typechecks + const pragma = commentPragmas[name] as PragmaDefinition; + if (!pragma || !(pragma.kind! & PragmaKindFlags.TripleSlashXML)) { + return; + } + if (pragma.args) { + const argument: {[index: string]: string | {value: string, pos: number, end: number}} = {}; + for (const arg of pragma.args) { + const matcher = getNamedArgRegEx(arg.name); + const matchResult = matcher.exec(text); + if (!matchResult && !arg.optional) { + return; // Missing required argument, don't parse + } + else if (matchResult) { + if (arg.captureSpan) { + const startPos = range.pos + matchResult.index + matchResult[1].length + matchResult[2].length; + argument[arg.name] = { + value: matchResult[3], + pos: startPos, + end: startPos + matchResult[3].length + }; + } + else { + argument[arg.name] = matchResult[3]; + } + } + } + pragmas.push({ name, args: { arguments: argument, range } } as PragmaPsuedoMapEntry); + } + else { + pragmas.push({ name, args: { arguments: {}, range } } as PragmaPsuedoMapEntry); + } + return; + } + + const singleLine = range.kind === SyntaxKind.SingleLineCommentTrivia && singleLinePragmaRegEx.exec(text); + if (singleLine) { + return addPragmaForMatch(pragmas, range, PragmaKindFlags.SingleLine, singleLine); + } + + if (range.kind === SyntaxKind.MultiLineCommentTrivia) { + const multiLinePragmaRegEx = /\s*@(\S+)\s*(.*)\s*$/gim; // Defined inline since it uses the "g" flag, which keeps a persistent index (for iterating) + let multiLineMatch: RegExpExecArray | null; + while (multiLineMatch = multiLinePragmaRegEx.exec(text)) { + addPragmaForMatch(pragmas, range, PragmaKindFlags.MultiLine, multiLineMatch); + } + } + } + + function addPragmaForMatch(pragmas: PragmaPsuedoMapEntry[], range: CommentRange, kind: PragmaKindFlags, match: RegExpExecArray) { + if (!match) return; + const name = match[1].toLowerCase() as keyof PragmaPsuedoMap; // Technically unsafe cast, but we do it so they below check to make it safe typechecks + const pragma = commentPragmas[name] as PragmaDefinition; + if (!pragma || !(pragma.kind! & kind)) { + return; + } + const args = match[2]; // Split on spaces and match up positionally with definition + const argument = getNamedPragmaArguments(pragma, args); + if (argument === "fail") return; // Missing required argument, fail to parse it + pragmas.push({ name, args: { arguments: argument, range } } as PragmaPsuedoMapEntry); + return; + } + + function getNamedPragmaArguments(pragma: PragmaDefinition, text: string | undefined): {[index: string]: string} | "fail" { + if (!text) return {}; + if (!pragma.args) return {}; + const args = text.split(/\s+/); + const argMap: {[index: string]: string} = {}; + for (let i = 0; i < pragma.args.length; i++) { + const argument = pragma.args[i]; + if (!args[i] && !argument.optional) { + return "fail"; + } + if (argument.captureSpan) { + return Debug.fail("Capture spans not yet implemented for non-xml pragmas"); + } + argMap[argument.name] = args[i]; + } + return argMap; + } + + /** @internal */ + export function tagNamesAreEquivalent(lhs: JsxTagNameExpression, rhs: JsxTagNameExpression): boolean { + if (lhs.kind !== rhs.kind) { + return false; + } + + if (lhs.kind === SyntaxKind.Identifier) { + return lhs.escapedText === (rhs).escapedText; + } + + if (lhs.kind === SyntaxKind.ThisKeyword) { + return true; + } + + // If we are at this statement then we must have PropertyAccessExpression and because tag name in Jsx element can only + // take forms of JsxTagNameExpression which includes an identifier, "this" expression, or another propertyAccessExpression + // it is safe to case the expression property as such. See parseJsxElementName for how we parse tag name in Jsx element + return (lhs).name.escapedText === (rhs).name.escapedText && + tagNamesAreEquivalent((lhs).expression as JsxTagNameExpression, (rhs).expression as JsxTagNameExpression); + } +} \ No newline at end of file diff --git a/result.txt b/result.txt new file mode 100644 index 0000000..95801b4 --- /dev/null +++ b/result.txt @@ -0,0 +1,9 @@ +visit: 327.424ms +internal_module +namespace +identifier +internal_module +comment +comment +comment +comment diff --git a/src/lang/common/emca.ts b/src/lang/common/emca.ts index 0c223bb..79ee683 100644 --- a/src/lang/common/emca.ts +++ b/src/lang/common/emca.ts @@ -1,6 +1,8 @@ export interface NodeProperties { exports: Partial inheritance: Partial + namespace: boolean, + module: boolean } export interface NodeExports { diff --git a/src/lang/common/node.ts b/src/lang/common/node.ts new file mode 100644 index 0000000..e1a40ee --- /dev/null +++ b/src/lang/common/node.ts @@ -0,0 +1,19 @@ +import { ASTNode } from "./ast"; +import { SyntaxNode } from "tree-sitter"; + +export interface TreeSitterNode { + visit(visitor: NodeVisitor): void +} + +export interface NodeVisitor { + getAST(): ASTNode[] + visitNode(node: SyntaxNode, properties?: object): ASTNode + visitChildren(nodes: SyntaxNode[], properties?: object): ASTNode[] +} + +export class Node implements TreeSitterNode { + constructor(public syntaxNode: SyntaxNode) { } + visit = (visitor: NodeVisitor): void => { + visitor.visitNode(this.syntaxNode); + } +} \ No newline at end of file diff --git a/src/lang/typescript/index.ts b/src/lang/typescript/index.ts index 2461fed..5c99b6c 100644 --- a/src/lang/typescript/index.ts +++ b/src/lang/typescript/index.ts @@ -4,6 +4,7 @@ import IParser from '../../interfaces/IParser'; import Source from '../../interfaces/Source'; import walk from '../../utils/walk'; import { TypeScriptVisitor } from './visitor'; +import log from '../../utils/log'; /** @@ -29,10 +30,12 @@ export default class TypeScriptParser implements IParser { } parse = () => { const tree = this.parser.parse(this.source.text); - if (tree.rootNode.type === "program") { - const visitor = new TypeScriptVisitor(this.source); - walk(tree.rootNode).visit(visitor); - return visitor.getAST(); - } + const visitor = new TypeScriptVisitor(this.source); + const root = walk(tree.rootNode); + console.time('visit') + root.visit(visitor) + console.timeEnd('visit') + + return visitor.getAST(); } } diff --git a/src/lang/typescript/visitor.ts b/src/lang/typescript/visitor.ts index d36e711..79a6355 100644 --- a/src/lang/typescript/visitor.ts +++ b/src/lang/typescript/visitor.ts @@ -1,64 +1,81 @@ -import { NodeProperties, NodeInheritance } from "../common/emca"; +import { createASTNode, ASTNode } from "../common/ast"; import { isJavaDocComment } from "../../utils/comment"; +import { NodeProperties, NodeInheritance } from "../common/emca"; +import { NodeVisitor } from "../common/node"; import { sibling } from "../../utils/sibling"; import { SyntaxNode } from "tree-sitter"; -import { text } from "../../utils/text"; +import * as _ from 'lodash'; import log, { ErrorType } from "../../utils/log"; import match from "../../utils/match"; import Source from "../../interfaces/Source"; -import xdoc from "xdoc-parser"; -import { createASTNode, ASTNode } from "../common/ast"; - - -export interface TreeSitterNode { - visit(visitor: NodeVisitor): void -} - -export interface NodeVisitor { - getAST(): ASTNode[] - visitNode(node: SyntaxNode): ASTNode - visitChildren(nodes: SyntaxNode[]): ASTNode[] -} - -export class Node implements TreeSitterNode { - constructor(public syntaxNode: SyntaxNode) { } - visit = (visitor: NodeVisitor): void => { - visitor.visitNode(this.syntaxNode); - } -} +/** + * A class that visits ASTNodes from a TypeScript tree. + */ export class TypeScriptVisitor implements NodeVisitor { private ast: ASTNode[] = [] private source: Source - private parent: SyntaxNode constructor(source: Source) { this.source = source; } + /** * Determines whether a node has inheritance */ private hasInheritance(node: SyntaxNode) { - return node.children - .filter(node => { - return node.type.includes('extends') || node.type.includes('implements'); - }).length > 0 + let inherits = false; + for (let i = 0; i < node.children.length; i++) { + const child = node.children[i]; + if (match(child, 'extends', 'implements')) { + inherits = true; + } + } + return inherits } /** * Returns a node's inheritance type */ private getInheritanceType(node: SyntaxNode) { - if (node.children.filter(node => node.type.includes('extends'))) { - return 'extends'; + for (let i = 0; i < node.children.length; i++) { + const child = node.children[i]; + if (match(child, 'extends')) { + return 'extends'; + } + + if (match(child, 'implements')) { + return 'implements'; + } } + } - if (node.children.filter(node => node.type.includes('implements'))) { - return 'implements'; + /** + * Determines whether an export is default + */ + private hasDefaultExport(node: SyntaxNode): boolean { + for (let i = 0; i < node.children.length; i++) { + const child = node.children[i]; + if (match(child, 'default')) { + return true; + } } + return false; } - private filterComments(node: SyntaxNode) { - return node.children.filter(child => match(child, 'comment')); + /** + * Returns only the comments from a node's children. + */ + private filterType(node: SyntaxNode, type: string): SyntaxNode[] { + // console.time('filterType') + let children: SyntaxNode[] = []; + for (let i = 0; i < node.children.length; i++) { + const child = node.children[i]; + if (match(child, type)) { + children.push(child); + } + } + // console.timeEnd('filterType') + return children; } getAST(): ASTNode[] { @@ -68,12 +85,13 @@ export class TypeScriptVisitor implements NodeVisitor { /* Visitors */ visitNode = ( - node: SyntaxNode + node: SyntaxNode, + properties?: Partial ) => { switch (node.type) { case 'program': - this.parent = node; this.ast = this.visitProgram(node); + break; case 'comment': return this.visitComment(node); case 'MISSING': @@ -84,58 +102,97 @@ export class TypeScriptVisitor implements NodeVisitor { /* Match other non-terminals */ - if (match(node, 'constraint')) { - return this.visitConstraint(node) - } - - if (match(node, 'formal_parameters')) { - return this.visitFormalParamters(node); - } - - if (match(node, 'required_parameter')) { - return this.visitRequiredParameter(node); - } - if (match(node, + 'constraint', + 'formal_parameters', 'required_parameter', 'type_identifier', 'type_parameters', 'type_parameter', 'type_annotation', - 'object_type', 'predefined_type' + 'object_type', 'predefined_type', 'parenthesized_type', 'literal_type', + 'intersection_type', 'union_type', + 'class_body', + 'extends_clause', + 'unary_expression', 'binary_expression', + 'statement_block', 'return_statement', 'export_statement', 'expression_statement', + // A call_signature can also be a non-contextual node + 'call_signature', + 'internal_module' )) { - return this.visitTypeNode(node) - } - - if (match(node, 'extends_clause')) { - return this.visitInheritanceClause(node); - } - - // A call_signature can also be a non-contextual node - if (match(node, 'call_signature')) { - return this.visitSignature(node) + return this.visitNonTerminal(node, properties) } /* Match terminals */ - if (match(node, - 'identifier', 'extends', 'property_identifier', - 'string', 'void', 'boolean', 'null', 'undefined', 'number' + if (match(node, + 'identifier', 'extends', 'property_identifier', 'accessibility_modifier', + 'string', 'void', 'boolean', 'null', 'undefined', 'number', 'return', + 'get', 'function', 'namespace' )) { return this.visitTerminal(node); } - log.report(this.source, node, ErrorType.NodeTypeNotYetSupported); - break; } } visitChildren = (nodes: SyntaxNode[]): ASTNode[] => { - return ( - nodes - .filter(child => !child.type.match(/[<>(){},:;\[\]]/)) - .map(this.visitNode.bind(this)) as ASTNode[] - ).filter(child => !!child); + let children: ASTNode[] = []; + for (let i = 0; i < nodes.length; i++) { + const node = nodes[i]; + if (!node.type.match(/[<>(){},:;\[\]&|=\+\-\*\/]/)) { + const child = this.visitNode(node); + if (child) children.push(child); + } + } + return children; } private visitProgram = (node: SyntaxNode): ASTNode[] => { - return this.visitChildren(this.filterComments(node)); + let visited = {}, + getStartLocation = (n: ASTNode) => `${n.location.row.start}:${n.location.column.start}`; + // A program can have modules, namespaces, comments as its children + // The first step is to parse all the comments in the root node + let comments = this.visitChildren(this.filterType(node, 'comment')); + // Parse the namespaces in expression_statement + let namespaces = this.visitChildren(this.filterType(node, 'expression_statement')); + // Parse the export statements in the root node + let exports = this.visitChildren(this.filterType(node, 'export_statement')); + + // Get the visited context nodes + for (let i = 0; i < comments.length; i++) { + const comment = comments[i]; + const context = comment; + visited[getStartLocation(context)] = true; + } + + // Remove the visited nodes from namespaces array + namespaces = _.remove(namespaces, x => !visited[getStartLocation(x)]); + + // Exports are oddballs since some exports may reference + // a type/node that may have been commented. + // We'll first need to filter the ones we have visited + exports = _.remove(exports, x => !visited[getStartLocation(x)]); + + // From the ones we have not visited, we'll need to modify + // the node properties of each context in a comment node that + // matches the ones we have not visited. + const matched = {}; + comments = _.remove( + comments.map(comment => { + for (let i = 0; i < exports.length; i++) { + const export_ = exports[i]; + if (comment.context.type === export_.type) { + matched[getStartLocation(export_)] = true; + comment.context.properties = Object.assign( + comment.context.properties || {}, + export_.properties + ); + return comment; + } + } + }), (comment) => !comment); + + // Removed the matched exports + exports = _.remove(exports, x => !matched[getStartLocation(x)]) + + return [].concat(comments).concat(namespaces).concat(exports); } private visitComment = (node: SyntaxNode): ASTNode => { @@ -156,31 +213,70 @@ export class TypeScriptVisitor implements NodeVisitor { */ private visitContext = (node: SyntaxNode, properties?: Partial): ASTNode => { switch (node.type) { + case 'export_statement': + return this.visitExportStatement(node, properties); + case 'expression_statement': + return this.visitExpressionStatement(node, properties); + case 'class': case 'interface_declaration': - this.parent = node; - return this.visitInterfaceDeclaration(node, properties) + return this.visitClassOrInterface(node, properties) + case 'function': case 'call_signature': case 'method_signature': - return this.visitSignature(node, properties); + case 'property_signature': + case 'public_field_definition': + case 'method_definition': + return this.visitNonTerminal(node, properties); default: log.report(this.source, node, ErrorType.NodeTypeNotYetSupported); break; } } - /* Declarations */ + /* Statements */ - private visitInterfaceDeclaration = (node: SyntaxNode, properties?: Partial): ASTNode => { - // Shorten the node from 'interface_declaration' to 'interface' - return this.visitInterface(node, properties) + private visitExportStatement = (node: SyntaxNode, properties?: Partial): ASTNode => { + let children = node.children, defaultExport = false; + // Remove 'export' since it's always first in the array + children.shift(); + if (this.hasDefaultExport(node)) { + defaultExport = true; + // Remove 'default' export + children.shift(); + } + const child = children.shift(); + return this.visitNode(child, { exports: { export: true, default: defaultExport } }); } - private visitInterface = (node: SyntaxNode, properties?: Partial): ASTNode => { - // Since 'interface' is element in the array + private visitExpressionStatement = (node: SyntaxNode, properties: Partial): ASTNode => { + let children = node.children; + const child = children.shift(); + if (match(child, 'internal_module')) { + return this.visitInternalModule(child, properties) + } + return this.visitNonTerminal(node); + } + + /* Modules */ + + private visitInternalModule = (node: SyntaxNode, properties?: Partial): ASTNode => { + let children: ASTNode[] = node.children.map(child => { + if (match(child, 'statement_block')) { + return createASTNode(this.source, node, this.visitChildren(this.filterType(child, 'comment'))) + } + return this.visitNode(child); + }); + return createASTNode(this.source, node, children, Object.assign(properties || {}, { namespace: true })); + } + + + /* Declarations */ + + private visitClassOrInterface = (node: SyntaxNode, properties?: Partial): ASTNode => { + // Since 'interface' or 'class' is always first in the array // we'll need to remove it from the array. let children = node.children; const interface_ = children.shift(); - let extends_ = false, implements_ = false; if (this.hasInheritance(node)) { const inheritance = this.getInheritanceType(node) @@ -189,61 +285,51 @@ export class TypeScriptVisitor implements NodeVisitor { } const node_ = createASTNode( - this.source, - node, - this.visitChildren(children), + this.source, + node, + this.visitChildren(children), Object.assign(properties || {}, { - inheritance: { - implements: implements_, - extends: extends_ - } as NodeInheritance - })); + inheritance: { + implements: implements_, + extends: extends_ + } as NodeInheritance + })); + + if (match(node, 'class')) { + return node_; + } // Overwrite the node type from 'interface_declaration' to 'interface' return Object.assign(node_, { type: interface_.type }) } - /* Signatures */ - private visitSignature = (node: SyntaxNode, properties?: Partial): ASTNode => { - return createASTNode(this.source, node, this.visitChildren(node.children), properties) - } - - /* Types */ - - private visitTypeNode = (node: SyntaxNode): ASTNode => { - switch (node.type) { - case 'type_identifier': - return this.visitTerminal(node) - case 'type_parameters': - case 'type_parameter': - case 'type_annotation': - case 'predefined_type': - return createASTNode(this.source, node, this.visitChildren(node.children)) - case 'object_type': - return createASTNode(this.source, node, this.visitChildren(this.filterComments(node))) - default: - log.report(this.source, node, ErrorType.NodeTypeNotYetSupported); - break; + /* Non-terminals */ + private visitNonTerminal = (node: SyntaxNode, properties?: Partial): ASTNode => { + let children = node.children; + // Handle special cases where some non-terminals + // contain comments which is what we care about + if (match(node, 'class_body', 'object_type')) { + children = this.filterType(node, 'comment'); + } + // Handle special cases where export statements have node properties + if (match(node, 'export_statement')) { + return this.visitExportStatement(node); } - } - /* Other non-terminals */ + // Handle special cases where an internal module contains other nodes + if (match(node, 'internal_module')) { + return this.visitInternalModule(node, properties); + } - private visitConstraint = (node: SyntaxNode): ASTNode => { - return createASTNode(this.source, node, this.visitChildren(node.children)) - } + // Handle special cases where an intermal_module can exist in an expression_statement + if (match(node, 'expression_statement')) { + return this.visitExpressionStatement(node, properties); + } - private visitInheritanceClause = (node: SyntaxNode): ASTNode => { - return createASTNode(this.source, node, this.visitChildren(node.children)) - } - private visitFormalParamters = (node: SyntaxNode): ASTNode => { - return createASTNode(this.source, node, this.visitChildren(node.children)); + return createASTNode(this.source, node, this.visitChildren(children), properties); } - private visitRequiredParameter = (node: SyntaxNode): ASTNode => { - return createASTNode(this.source, node, this.visitChildren(node.children)); - } /* Terminals */ private visitTerminal = (node: SyntaxNode): ASTNode => { diff --git a/src/utils/benchmark.ts b/src/utils/benchmark.ts new file mode 100644 index 0000000..8b78d70 --- /dev/null +++ b/src/utils/benchmark.ts @@ -0,0 +1,10 @@ +export default function benchmark( + label: string, + f: (x: T2) => T, + ...args: T2[] +): T { + console.time(label) + const result = f.apply(null, args); + console.timeEnd(label); + return result; +} \ No newline at end of file diff --git a/src/utils/match.ts b/src/utils/match.ts index 205c970..a7a565e 100644 --- a/src/utils/match.ts +++ b/src/utils/match.ts @@ -9,6 +9,11 @@ import { SyntaxNode } from "tree-sitter"; * ``` */ export default function match(node: SyntaxNode, ...types: string[]): boolean { - const matches = types.map(type => node && type === node.type); - return matches.includes(true); + for (let i = 0; i < types.length; i++) { + const type = types[i]; + if (node.type === type) { + return true; + } + } + return false; } \ No newline at end of file diff --git a/src/utils/walk.ts b/src/utils/walk.ts index 6ccc571..1f3437c 100644 --- a/src/utils/walk.ts +++ b/src/utils/walk.ts @@ -1,6 +1,5 @@ import { SyntaxNode } from "tree-sitter"; -import { Node } from "../lang/typescript/visitor"; - +import { Node } from '../lang/common/node' export default function walk(node: SyntaxNode) { let node_ = new Node(node); node_.syntaxNode.children.map(child => walk(child)) From 753c5e822c14722d06cf81e6a6003d199c1dc27d Mon Sep 17 00:00:00 2001 From: Takeshi Date: Wed, 22 Aug 2018 20:52:49 -0600 Subject: [PATCH 16/32] Update: Complete JavaScript parser --- .vscode/settings.json | 12 - build/{ => corpus}/example.d.ts | 2 +- build/corpus/example.js | 12 + build/example.js | 12 - build/index.d.ts | 6 +- build/index.js | 10 +- build/src/ParserFactory.d.ts | 4 +- build/src/ParserFactory.js | 2 +- build/src/interfaces/IFile.d.ts | 5 - build/src/interfaces/IFile.js | 3 - build/src/interfaces/IParser.js | 2 +- build/src/interfaces/ParserInterface.d.ts | 8 + build/src/interfaces/ParserInterface.js | 9 + build/src/interfaces/Source.js | 2 +- build/src/interfaces/TextRange.js | 2 +- build/src/lang/common/ast.js | 2 +- build/src/lang/common/emca.js | 2 +- build/src/lang/common/node.js | 2 +- build/src/lang/javascript/index.d.ts | 14 +- build/src/lang/javascript/index.js | 52 +-- build/src/lang/javascript/visitor.d.ts | 48 +++ build/src/lang/javascript/visitor.js | 271 ++++++++++++++ build/src/lang/typescript/Node.d.ts | 26 -- build/src/lang/typescript/Node.js | 14 - build/src/lang/typescript/index.d.ts | 9 +- build/src/lang/typescript/index.js | 17 +- .../public_field_definition.visitor.d.ts | 10 - .../public_field_definition.visitor.js | 30 -- build/src/lang/typescript/visitor.js | 27 +- .../visitors/call_signature.visitor.d.ts | 7 - .../visitors/call_signature.visitor.js | 22 -- .../typescript/visitors/class.visitor.d.ts | 88 ----- .../lang/typescript/visitors/class.visitor.js | 91 ----- .../visitors/declaration.visitor.d.ts | 6 - .../visitors/declaration.visitor.js | 30 -- .../visitors/formal_parameters.visitor.d.ts | 18 - .../visitors/formal_parameters.visitor.js | 33 -- .../typescript/visitors/function.visitor.d.ts | 14 - .../typescript/visitors/function.visitor.js | 38 -- .../visitors/method_definition.visitor.d.ts | 13 - .../visitors/method_definition.visitor.js | 39 -- .../typescript/visitors/node.visitor.d.ts | 4 - .../lang/typescript/visitors/node.visitor.js | 32 -- .../typescript/visitors/program.visitor.d.ts | 3 - .../typescript/visitors/program.visitor.js | 34 -- .../public_field_definition.visitor.d.ts | 10 - .../public_field_definition.visitor.js | 30 -- .../visitors/statement.visitor.d.ts | 6 - .../typescript/visitors/statement.visitor.js | 37 -- .../typescript/visitors/type.visitor.d.ts | 25 -- .../lang/typescript/visitors/type.visitor.js | 85 ----- .../visitors/type_arguments.visitor.d.ts | 3 - .../visitors/type_arguments.visitor.js | 10 - .../visitors/type_parameters.visitor.d.ts | 10 - .../visitors/type_parameters.visitor.js | 14 - .../src/lang/typescript/visitors/visitor.d.ts | 45 --- build/src/lang/typescript/visitors/visitor.js | 170 --------- build/src/lang/typescript/walk.d.ts | 3 - build/src/lang/typescript/walk.js | 10 - build/src/utils/benchmark.js | 2 +- build/src/utils/comment.js | 2 +- build/src/utils/log.js | 4 +- build/src/utils/match.js | 2 +- build/src/utils/measure.d.ts | 1 - build/src/utils/measure.js | 6 - build/src/utils/performance.d.ts | 1 - build/src/utils/performance.js | 6 - build/src/utils/range.js | 2 +- build/src/utils/sibling.js | 2 +- build/src/utils/text.js | 2 +- build/src/utils/walk.js | 2 +- corpus/example.js | 7 + example.ts => corpus/example.ts | 2 +- parser.txt => corpus/parser.txt | 0 example.js | 7 - index.ts | 19 +- src/ParserFactory.ts | 4 +- src/interfaces/IParser.ts | 10 - src/interfaces/ParserInterface.ts | 12 + src/lang/javascript/index.ts | 108 ++---- src/lang/javascript/visitor.ts | 337 ++++++++++++++++++ src/lang/typescript/index.ts | 22 +- src/lang/typescript/visitor.ts | 32 +- src/utils/log.ts | 2 +- 84 files changed, 859 insertions(+), 1280 deletions(-) rename build/{ => corpus}/example.d.ts (56%) create mode 100644 build/corpus/example.js delete mode 100644 build/example.js delete mode 100644 build/src/interfaces/IFile.d.ts delete mode 100644 build/src/interfaces/IFile.js create mode 100644 build/src/interfaces/ParserInterface.d.ts create mode 100644 build/src/interfaces/ParserInterface.js create mode 100644 build/src/lang/javascript/visitor.d.ts create mode 100644 build/src/lang/javascript/visitor.js delete mode 100644 build/src/lang/typescript/Node.d.ts delete mode 100644 build/src/lang/typescript/Node.js delete mode 100644 build/src/lang/typescript/public_field_definition.visitor.d.ts delete mode 100644 build/src/lang/typescript/public_field_definition.visitor.js delete mode 100644 build/src/lang/typescript/visitors/call_signature.visitor.d.ts delete mode 100644 build/src/lang/typescript/visitors/call_signature.visitor.js delete mode 100644 build/src/lang/typescript/visitors/class.visitor.d.ts delete mode 100644 build/src/lang/typescript/visitors/class.visitor.js delete mode 100644 build/src/lang/typescript/visitors/declaration.visitor.d.ts delete mode 100644 build/src/lang/typescript/visitors/declaration.visitor.js delete mode 100644 build/src/lang/typescript/visitors/formal_parameters.visitor.d.ts delete mode 100644 build/src/lang/typescript/visitors/formal_parameters.visitor.js delete mode 100644 build/src/lang/typescript/visitors/function.visitor.d.ts delete mode 100644 build/src/lang/typescript/visitors/function.visitor.js delete mode 100644 build/src/lang/typescript/visitors/method_definition.visitor.d.ts delete mode 100644 build/src/lang/typescript/visitors/method_definition.visitor.js delete mode 100644 build/src/lang/typescript/visitors/node.visitor.d.ts delete mode 100644 build/src/lang/typescript/visitors/node.visitor.js delete mode 100644 build/src/lang/typescript/visitors/program.visitor.d.ts delete mode 100644 build/src/lang/typescript/visitors/program.visitor.js delete mode 100644 build/src/lang/typescript/visitors/public_field_definition.visitor.d.ts delete mode 100644 build/src/lang/typescript/visitors/public_field_definition.visitor.js delete mode 100644 build/src/lang/typescript/visitors/statement.visitor.d.ts delete mode 100644 build/src/lang/typescript/visitors/statement.visitor.js delete mode 100644 build/src/lang/typescript/visitors/type.visitor.d.ts delete mode 100644 build/src/lang/typescript/visitors/type.visitor.js delete mode 100644 build/src/lang/typescript/visitors/type_arguments.visitor.d.ts delete mode 100644 build/src/lang/typescript/visitors/type_arguments.visitor.js delete mode 100644 build/src/lang/typescript/visitors/type_parameters.visitor.d.ts delete mode 100644 build/src/lang/typescript/visitors/type_parameters.visitor.js delete mode 100644 build/src/lang/typescript/visitors/visitor.d.ts delete mode 100644 build/src/lang/typescript/visitors/visitor.js delete mode 100644 build/src/lang/typescript/walk.d.ts delete mode 100644 build/src/lang/typescript/walk.js delete mode 100644 build/src/utils/measure.d.ts delete mode 100644 build/src/utils/measure.js delete mode 100644 build/src/utils/performance.d.ts delete mode 100644 build/src/utils/performance.js create mode 100644 corpus/example.js rename example.ts => corpus/example.ts (55%) rename parser.txt => corpus/parser.txt (100%) delete mode 100644 example.js delete mode 100644 src/interfaces/IParser.ts create mode 100644 src/interfaces/ParserInterface.ts create mode 100644 src/lang/javascript/visitor.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index f47f36d..e69de29 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,12 +0,0 @@ -{ - "files.exclude": { - "**/.git": true, - "**/.svn": true, - "**/.hg": true, - "**/.DS_Store": true, - "**/*.js.map": true, - "**/*.js": { - "when": "$(basename).ts" - } - } -} \ No newline at end of file diff --git a/build/example.d.ts b/build/corpus/example.d.ts similarity index 56% rename from build/example.d.ts rename to build/corpus/example.d.ts index 2f25f48..e0a4604 100644 --- a/build/example.d.ts +++ b/build/corpus/example.d.ts @@ -2,5 +2,5 @@ export declare namespace X { /** * */ - function name(params: string): void; + function name(...args: any[]): void; } diff --git a/build/corpus/example.js b/build/corpus/example.js new file mode 100644 index 0000000..c7a4dba --- /dev/null +++ b/build/corpus/example.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var X; +(function (X) { + /** + * + */ + function name(...args) { + } + X.name = name; +})(X = exports.X || (exports.X = {})); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhhbXBsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2NvcnB1cy9leGFtcGxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsSUFBaUIsQ0FBQyxDQU9qQjtBQVBELFdBQWlCLENBQUM7SUFDaEI7O09BRUc7SUFDSCxTQUFnQixJQUFJLENBQUMsR0FBRyxJQUFJO0lBRTVCLENBQUM7SUFGZSxNQUFJLE9BRW5CLENBQUE7QUFDSCxDQUFDLEVBUGdCLENBQUMsR0FBRCxTQUFDLEtBQUQsU0FBQyxRQU9qQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBuYW1lc3BhY2UgWCB7XHJcbiAgLyoqXHJcbiAgICogXHJcbiAgICovXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIG5hbWUoLi4uYXJncykge1xyXG4gICAgXHJcbiAgfVxyXG59Il19 \ No newline at end of file diff --git a/build/example.js b/build/example.js deleted file mode 100644 index c02bf06..0000000 --- a/build/example.js +++ /dev/null @@ -1,12 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -var X; -(function (X) { - /** - * - */ - function name(params) { - } - X.name = name; -})(X = exports.X || (exports.X = {})); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhhbXBsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2V4YW1wbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxJQUFpQixDQUFDLENBT2pCO0FBUEQsV0FBaUIsQ0FBQztJQUNoQjs7T0FFRztJQUNILFNBQWdCLElBQUksQ0FBQyxNQUFhO0lBRWxDLENBQUM7SUFGZSxNQUFJLE9BRW5CLENBQUE7QUFDSCxDQUFDLEVBUGdCLENBQUMsR0FBRCxTQUFDLEtBQUQsU0FBQyxRQU9qQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBuYW1lc3BhY2UgWCB7XG4gIC8qKlxuICAgKiBcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBuYW1lKHBhcmFtczpzdHJpbmcpIHtcbiAgICBcbiAgfVxufSJdfQ== \ No newline at end of file diff --git a/build/index.d.ts b/build/index.d.ts index 0d09680..de1f7d2 100644 --- a/build/index.d.ts +++ b/build/index.d.ts @@ -1,5 +1,6 @@ import Source from './src/interfaces/Source'; -import IParser from './src/interfaces/IParser'; +import ParserInterface from './src/interfaces/ParserInterface'; +import { Tree } from 'tree-sitter'; /** * A class that parses a source code and generates an AST. * @@ -19,8 +20,9 @@ import IParser from './src/interfaces/IParser'; * * ``` */ -export default class Parser implements IParser { +export default class Parser implements ParserInterface { private parser; constructor(file: Source, options?: any); parse: () => import("./src/lang/common/ast").ASTNode[]; + readonly tree: Tree; } diff --git a/build/index.js b/build/index.js index 4496403..b38a3b1 100644 --- a/build/index.js +++ b/build/index.js @@ -29,14 +29,18 @@ class Parser { }; this.parser = (new ParserFactory_1.default(file, options)).getParser(); } + get tree() { + return this.parser.tree; + } } exports.default = Parser; -const path = `${process.cwd()}/example.ts`; +const path = `${process.cwd()}/corpus/example.js`; const result = new Parser({ name: 'index.ts', path: path, text: FS.readFileSync(path, 'utf-8') }, { - language: 'typescript' + language: 'javascript' }).parse(); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLHVEQUFnRDtBQUVoRCx5QkFBeUI7QUFDekIsbURBQW1EO0FBQ25EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFxQixNQUFNO0lBR3pCLFlBQVksSUFBWSxFQUFFLFVBQWUsRUFBRTtRQUczQyxVQUFLLEdBQUcsR0FBRyxFQUFFO1lBQ1gsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQzVCLENBQUMsQ0FBQTtRQUpDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLHVCQUFhLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDL0QsQ0FBQztDQUlGO0FBVEQseUJBU0M7QUFDRCxNQUFNLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsYUFBYSxDQUFDO0FBQzNDLE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDO0lBQ3hCLElBQUksRUFBRSxVQUFVO0lBQ2hCLElBQUksRUFBRSxJQUFJO0lBQ1YsSUFBSSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQztDQUNyQyxFQUFFO0lBQ0QsUUFBUSxFQUFFLFlBQVk7Q0FDdkIsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNvdXJjZSBmcm9tICcuL3NyYy9pbnRlcmZhY2VzL1NvdXJjZSc7XG5pbXBvcnQgUGFyc2VyRmFjdG9yeSBmcm9tICcuL3NyYy9QYXJzZXJGYWN0b3J5JztcbmltcG9ydCBJUGFyc2VyIGZyb20gJy4vc3JjL2ludGVyZmFjZXMvSVBhcnNlcic7XG5pbXBvcnQgKiBhcyBGUyBmcm9tICdmcyc7XG4vLyBpbXBvcnQgeyBBU1ROb2RlIH0gZnJvbSAnLi9zcmMvbGFuZy9jb21tb24vYXN0Jztcbi8qKlxuICogQSBjbGFzcyB0aGF0IHBhcnNlcyBhIHNvdXJjZSBjb2RlIGFuZCBnZW5lcmF0ZXMgYW4gQVNULlxuICogXG4gKiBAY2xhc3MgUGFyc2VyXG4gKiBAaW1wbGVtZW50cyBJUGFyc2VyXG4gKiBcbiAqICMgRXhhbXBsZVxuICogXG4gKiBgYGBqc1xuICogY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcih7XG4gKiAgbmFtZTogJy4uLicsXG4gKiAgcGF0aDogJy4uLi4nLFxuICogIHRleHQ6ICcuLi4nXG4gKiB9LCB7IGxhbmd1YWdlOiAndHlwZXNjcmlwdCcgfSk7XG4gKiBcbiAqIGNvbnN0IHJlc3VsdCA9IHBhcnNlci5wYXJzZSgpO1xuICogXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFyc2VyIGltcGxlbWVudHMgSVBhcnNlciB7XG5cbiAgcHJpdmF0ZSBwYXJzZXI6IElQYXJzZXI7XG4gIGNvbnN0cnVjdG9yKGZpbGU6IFNvdXJjZSwgb3B0aW9uczogYW55ID0ge30pIHtcbiAgICB0aGlzLnBhcnNlciA9IChuZXcgUGFyc2VyRmFjdG9yeShmaWxlLCBvcHRpb25zKSkuZ2V0UGFyc2VyKCk7XG4gIH1cbiAgcGFyc2UgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLnBhcnNlKClcbiAgfVxufVxuY29uc3QgcGF0aCA9IGAke3Byb2Nlc3MuY3dkKCl9L2V4YW1wbGUudHNgO1xuY29uc3QgcmVzdWx0ID0gbmV3IFBhcnNlcih7XG4gIG5hbWU6ICdpbmRleC50cycsXG4gIHBhdGg6IHBhdGgsXG4gIHRleHQ6IEZTLnJlYWRGaWxlU3luYyhwYXRoLCAndXRmLTgnKVxufSwge1xuICBsYW5ndWFnZTogJ3R5cGVzY3JpcHQnXG59KS5wYXJzZSgpOyJdfQ== \ No newline at end of file +console.log(result); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLHVEQUFnRDtBQUVoRCx5QkFBeUI7QUFFekIsbURBQW1EO0FBQ25EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFxQixNQUFNO0lBR3pCLFlBQVksSUFBWSxFQUFFLFVBQWUsRUFBRTtRQUczQyxVQUFLLEdBQUcsR0FBRyxFQUFFO1lBQ1gsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQzVCLENBQUMsQ0FBQTtRQUpDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLHVCQUFhLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDL0QsQ0FBQztJQUlELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDMUIsQ0FBQztDQUNGO0FBWkQseUJBWUM7QUFFRCxNQUFNLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsb0JBQW9CLENBQUM7QUFDbEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUM7SUFDeEIsSUFBSSxFQUFFLFVBQVU7SUFDaEIsSUFBSSxFQUFFLElBQUk7SUFDVixJQUFJLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDO0NBQ3JDLEVBQUU7SUFDRCxRQUFRLEVBQUUsWUFBWTtDQUN2QixDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7QUFFWCxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNvdXJjZSBmcm9tICcuL3NyYy9pbnRlcmZhY2VzL1NvdXJjZSc7XHJcbmltcG9ydCBQYXJzZXJGYWN0b3J5IGZyb20gJy4vc3JjL1BhcnNlckZhY3RvcnknO1xyXG5pbXBvcnQgUGFyc2VySW50ZXJmYWNlIGZyb20gJy4vc3JjL2ludGVyZmFjZXMvUGFyc2VySW50ZXJmYWNlJztcclxuaW1wb3J0ICogYXMgRlMgZnJvbSAnZnMnO1xyXG5pbXBvcnQgeyBUcmVlIH0gZnJvbSAndHJlZS1zaXR0ZXInO1xyXG4vLyBpbXBvcnQgeyBBU1ROb2RlIH0gZnJvbSAnLi9zcmMvbGFuZy9jb21tb24vYXN0JztcclxuLyoqXHJcbiAqIEEgY2xhc3MgdGhhdCBwYXJzZXMgYSBzb3VyY2UgY29kZSBhbmQgZ2VuZXJhdGVzIGFuIEFTVC5cclxuICogXHJcbiAqIEBjbGFzcyBQYXJzZXJcclxuICogQGltcGxlbWVudHMgSVBhcnNlclxyXG4gKiBcclxuICogIyBFeGFtcGxlXHJcbiAqIFxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKHtcclxuICogIG5hbWU6ICcuLi4nLFxyXG4gKiAgcGF0aDogJy4uLi4nLFxyXG4gKiAgdGV4dDogJy4uLidcclxuICogfSwgeyBsYW5ndWFnZTogJ3R5cGVzY3JpcHQnIH0pO1xyXG4gKiBcclxuICogY29uc3QgcmVzdWx0ID0gcGFyc2VyLnBhcnNlKCk7XHJcbiAqIFxyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhcnNlciBpbXBsZW1lbnRzIFBhcnNlckludGVyZmFjZSB7XHJcblxyXG4gIHByaXZhdGUgcGFyc2VyOiBQYXJzZXJJbnRlcmZhY2U7XHJcbiAgY29uc3RydWN0b3IoZmlsZTogU291cmNlLCBvcHRpb25zOiBhbnkgPSB7fSkge1xyXG4gICAgdGhpcy5wYXJzZXIgPSAobmV3IFBhcnNlckZhY3RvcnkoZmlsZSwgb3B0aW9ucykpLmdldFBhcnNlcigpO1xyXG4gIH1cclxuICBwYXJzZSA9ICgpID0+IHtcclxuICAgIHJldHVybiB0aGlzLnBhcnNlci5wYXJzZSgpXHJcbiAgfVxyXG4gIGdldCB0cmVlICgpOiBUcmVlIHtcclxuICAgIHJldHVybiB0aGlzLnBhcnNlci50cmVlO1xyXG4gIH1cclxufVxyXG5cclxuY29uc3QgcGF0aCA9IGAke3Byb2Nlc3MuY3dkKCl9L2NvcnB1cy9leGFtcGxlLmpzYDtcclxuY29uc3QgcmVzdWx0ID0gbmV3IFBhcnNlcih7XHJcbiAgbmFtZTogJ2luZGV4LnRzJyxcclxuICBwYXRoOiBwYXRoLFxyXG4gIHRleHQ6IEZTLnJlYWRGaWxlU3luYyhwYXRoLCAndXRmLTgnKVxyXG59LCB7XHJcbiAgbGFuZ3VhZ2U6ICdqYXZhc2NyaXB0J1xyXG59KS5wYXJzZSgpO1xyXG5cclxuY29uc29sZS5sb2cocmVzdWx0KTtcclxuIl19 \ No newline at end of file diff --git a/build/src/ParserFactory.d.ts b/build/src/ParserFactory.d.ts index ea645e9..77fb292 100644 --- a/build/src/ParserFactory.d.ts +++ b/build/src/ParserFactory.d.ts @@ -1,8 +1,8 @@ import Source from "./interfaces/Source"; -import IParser from "./interfaces/IParser"; +import ParserInterface from "./interfaces/ParserInterface"; export default class ParserFactory { private file; private options; constructor(file: Source, options?: any); - getParser: () => IParser; + getParser: () => ParserInterface; } diff --git a/build/src/ParserFactory.js b/build/src/ParserFactory.js index ee0c756..77a24c1 100644 --- a/build/src/ParserFactory.js +++ b/build/src/ParserFactory.js @@ -25,4 +25,4 @@ class ParserFactory { } } exports.default = ParserFactory; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFyc2VyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9QYXJzZXJGYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsa0RBQWlEO0FBQ2pELGtEQUFpRDtBQUVqRCxNQUFxQixhQUFhO0lBS2hDLFlBQVksSUFBWSxFQUFFLFVBQWUsRUFBRTtRQUhuQyxZQUFPLEdBQUc7WUFDaEIsUUFBUSxFQUFFLFlBQVk7U0FDdkIsQ0FBQTtRQU1ELGNBQVMsR0FBRyxHQUFZLEVBQUU7WUFDeEIsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDM0MsS0FBSyxJQUFJLENBQUM7Z0JBQ1YsS0FBSyxZQUFZO29CQUNmLE9BQU8sSUFBSSxvQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkQsS0FBSyxJQUFJLENBQUM7Z0JBQ1YsS0FBSyxZQUFZO29CQUNmLE9BQU8sSUFBSSxvQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkQ7b0JBQ0EsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLFVBQVUsQ0FBQyxDQUFBO29CQUNyRSxNQUFNO2FBQ1Q7UUFDSCxDQUFDLENBQUE7UUFoQkMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3RDLENBQUM7Q0FnQkY7QUF4QkQsZ0NBd0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuaW1wb3J0IElQYXJzZXIgZnJvbSBcIi4vaW50ZXJmYWNlcy9JUGFyc2VyXCI7XG5pbXBvcnQgSmF2YVNjcmlwdFBhcnNlciBmcm9tIFwiLi9sYW5nL2phdmFzY3JpcHRcIjtcbmltcG9ydCBUeXBlU2NyaXB0UGFyc2VyIGZyb20gJy4vbGFuZy90eXBlc2NyaXB0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFyc2VyRmFjdG9yeSB7XG4gIHByaXZhdGUgZmlsZTogU291cmNlXG4gIHByaXZhdGUgb3B0aW9ucyA9IHtcbiAgICBsYW5ndWFnZTogJ0phdmFTY3JpcHQnXG4gIH1cbiAgY29uc3RydWN0b3IoZmlsZTogU291cmNlLCBvcHRpb25zOiBhbnkgPSB7fSkge1xuICAgIHRoaXMuZmlsZSA9IGZpbGU7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdGlvbnMsIG9wdGlvbnMpXG4gIH1cblxuICBnZXRQYXJzZXIgPSAoKTogSVBhcnNlciA9PiB7XG4gICAgc3dpdGNoICh0aGlzLm9wdGlvbnMubGFuZ3VhZ2UudG9Mb3dlckNhc2UoKSkge1xuICAgICAgY2FzZSAnanMnOlxuICAgICAgY2FzZSAnamF2YXNjcmlwdCc6XG4gICAgICAgIHJldHVybiBuZXcgSmF2YVNjcmlwdFBhcnNlcih0aGlzLmZpbGUsIHRoaXMub3B0aW9ucyk7XG4gICAgICBjYXNlICd0cyc6XG4gICAgICBjYXNlICd0eXBlc2NyaXB0JzpcbiAgICAgICAgcmV0dXJuIG5ldyBUeXBlU2NyaXB0UGFyc2VyKHRoaXMuZmlsZSwgdGhpcy5vcHRpb25zKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICBjb25zb2xlLmxvZyhgW21yLWRvY106IE5vIHBhcnNlciBmb3IgJHt0aGlzLm9wdGlvbnMubGFuZ3VhZ2V9IGV4aXN0cy5gKVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFyc2VyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9QYXJzZXJGYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsa0RBQWlEO0FBQ2pELGtEQUFpRDtBQUVqRCxNQUFxQixhQUFhO0lBS2hDLFlBQVksSUFBWSxFQUFFLFVBQWUsRUFBRTtRQUhuQyxZQUFPLEdBQUc7WUFDaEIsUUFBUSxFQUFFLFlBQVk7U0FDdkIsQ0FBQTtRQU1ELGNBQVMsR0FBRyxHQUFvQixFQUFFO1lBQ2hDLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEVBQUU7Z0JBQzNDLEtBQUssSUFBSSxDQUFDO2dCQUNWLEtBQUssWUFBWTtvQkFDZixPQUFPLElBQUksb0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3ZELEtBQUssSUFBSSxDQUFDO2dCQUNWLEtBQUssWUFBWTtvQkFDZixPQUFPLElBQUksb0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3ZEO29CQUNBLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxVQUFVLENBQUMsQ0FBQTtvQkFDckUsTUFBTTthQUNUO1FBQ0gsQ0FBQyxDQUFBO1FBaEJDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUN0QyxDQUFDO0NBZ0JGO0FBeEJELGdDQXdCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTb3VyY2UgZnJvbSBcIi4vaW50ZXJmYWNlcy9Tb3VyY2VcIjtcclxuaW1wb3J0IFBhcnNlckludGVyZmFjZSBmcm9tIFwiLi9pbnRlcmZhY2VzL1BhcnNlckludGVyZmFjZVwiO1xyXG5pbXBvcnQgSmF2YVNjcmlwdFBhcnNlciBmcm9tIFwiLi9sYW5nL2phdmFzY3JpcHRcIjtcclxuaW1wb3J0IFR5cGVTY3JpcHRQYXJzZXIgZnJvbSAnLi9sYW5nL3R5cGVzY3JpcHQnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFyc2VyRmFjdG9yeSB7XHJcbiAgcHJpdmF0ZSBmaWxlOiBTb3VyY2VcclxuICBwcml2YXRlIG9wdGlvbnMgPSB7XHJcbiAgICBsYW5ndWFnZTogJ0phdmFTY3JpcHQnXHJcbiAgfVxyXG4gIGNvbnN0cnVjdG9yKGZpbGU6IFNvdXJjZSwgb3B0aW9uczogYW55ID0ge30pIHtcclxuICAgIHRoaXMuZmlsZSA9IGZpbGU7XHJcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucywgb3B0aW9ucylcclxuICB9XHJcblxyXG4gIGdldFBhcnNlciA9ICgpOiBQYXJzZXJJbnRlcmZhY2UgPT4ge1xyXG4gICAgc3dpdGNoICh0aGlzLm9wdGlvbnMubGFuZ3VhZ2UudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICBjYXNlICdqcyc6XHJcbiAgICAgIGNhc2UgJ2phdmFzY3JpcHQnOlxyXG4gICAgICAgIHJldHVybiBuZXcgSmF2YVNjcmlwdFBhcnNlcih0aGlzLmZpbGUsIHRoaXMub3B0aW9ucyk7XHJcbiAgICAgIGNhc2UgJ3RzJzpcclxuICAgICAgY2FzZSAndHlwZXNjcmlwdCc6XHJcbiAgICAgICAgcmV0dXJuIG5ldyBUeXBlU2NyaXB0UGFyc2VyKHRoaXMuZmlsZSwgdGhpcy5vcHRpb25zKTtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgY29uc29sZS5sb2coYFttci1kb2NdOiBObyBwYXJzZXIgZm9yICR7dGhpcy5vcHRpb25zLmxhbmd1YWdlfSBleGlzdHMuYClcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG59Il19 \ No newline at end of file diff --git a/build/src/interfaces/IFile.d.ts b/build/src/interfaces/IFile.d.ts deleted file mode 100644 index c29d01f..0000000 --- a/build/src/interfaces/IFile.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -export default interface IFile { - name: string; - path: string; - text: string; -} diff --git a/build/src/interfaces/IFile.js b/build/src/interfaces/IFile.js deleted file mode 100644 index a9ffe77..0000000 --- a/build/src/interfaces/IFile.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSUZpbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW50ZXJmYWNlcy9JRmlsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgaW50ZXJmYWNlIElGaWxlIHtcclxuICBuYW1lOiBzdHJpbmcsXHJcbiAgcGF0aDogc3RyaW5nLFxyXG4gIHRleHQ6IHN0cmluZ1xyXG59Il19 \ No newline at end of file diff --git a/build/src/interfaces/IParser.js b/build/src/interfaces/IParser.js index ab87992..4a61442 100644 --- a/build/src/interfaces/IParser.js +++ b/build/src/interfaces/IParser.js @@ -6,4 +6,4 @@ class IParser { } } exports.default = IParser; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSVBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbnRlcmZhY2VzL0lQYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQSxtQ0FBbUM7QUFFbkMsTUFBOEIsT0FBTztJQUNuQyxZQUFZLElBQVksRUFBRSxPQUFZO0lBRXRDLENBQUM7Q0FFRjtBQUxELDBCQUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi9Tb3VyY2VcIjtcbmltcG9ydCB7IEFTVE5vZGUgfSBmcm9tIFwiLi4vbGFuZy9jb21tb24vYXN0XCI7XG4vLyBpbXBvcnQgSVJlc3VsdCBmcm9tIFwiLi9JUmVzdWx0XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGFic3RyYWN0IGNsYXNzIElQYXJzZXIge1xuICBjb25zdHJ1Y3RvcihmaWxlOiBTb3VyY2UsIG9wdGlvbnM6IGFueSkge1xuXG4gIH1cbiAgYWJzdHJhY3QgcGFyc2UoKTogQVNUTm9kZVtdXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSVBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbnRlcmZhY2VzL0lQYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQSxtQ0FBbUM7QUFFbkMsTUFBOEIsT0FBTztJQUNuQyxZQUFZLElBQVksRUFBRSxPQUFZO0lBRXRDLENBQUM7Q0FFRjtBQUxELDBCQUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi9Tb3VyY2VcIjtcclxuaW1wb3J0IHsgQVNUTm9kZSB9IGZyb20gXCIuLi9sYW5nL2NvbW1vbi9hc3RcIjtcclxuLy8gaW1wb3J0IElSZXN1bHQgZnJvbSBcIi4vSVJlc3VsdFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgYWJzdHJhY3QgY2xhc3MgSVBhcnNlciB7XHJcbiAgY29uc3RydWN0b3IoZmlsZTogU291cmNlLCBvcHRpb25zOiBhbnkpIHtcclxuXHJcbiAgfVxyXG4gIGFic3RyYWN0IHBhcnNlKCk6IEFTVE5vZGVbXVxyXG59Il19 \ No newline at end of file diff --git a/build/src/interfaces/ParserInterface.d.ts b/build/src/interfaces/ParserInterface.d.ts new file mode 100644 index 0000000..320ea04 --- /dev/null +++ b/build/src/interfaces/ParserInterface.d.ts @@ -0,0 +1,8 @@ +import Source from "./Source"; +import { ASTNode } from "../lang/common/ast"; +import { Tree } from "tree-sitter"; +export default abstract class ParserInterface { + constructor(source: Source, options: any); + abstract parse(): ASTNode[]; + abstract readonly tree: Tree; +} diff --git a/build/src/interfaces/ParserInterface.js b/build/src/interfaces/ParserInterface.js new file mode 100644 index 0000000..0508294 --- /dev/null +++ b/build/src/interfaces/ParserInterface.js @@ -0,0 +1,9 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +// import IResult from "./IResult"; +class ParserInterface { + constructor(source, options) { + } +} +exports.default = ParserInterface; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFyc2VySW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvUGFyc2VySW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0EsbUNBQW1DO0FBRW5DLE1BQThCLGVBQWU7SUFDM0MsWUFBWSxNQUFjLEVBQUUsT0FBWTtJQUV4QyxDQUFDO0NBR0Y7QUFORCxrQ0FNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTb3VyY2UgZnJvbSBcIi4vU291cmNlXCI7XHJcbmltcG9ydCB7IEFTVE5vZGUgfSBmcm9tIFwiLi4vbGFuZy9jb21tb24vYXN0XCI7XHJcbmltcG9ydCB7IFRyZWUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcclxuLy8gaW1wb3J0IElSZXN1bHQgZnJvbSBcIi4vSVJlc3VsdFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgYWJzdHJhY3QgY2xhc3MgUGFyc2VySW50ZXJmYWNlIHtcclxuICBjb25zdHJ1Y3Rvcihzb3VyY2U6IFNvdXJjZSwgb3B0aW9uczogYW55KSB7XHJcblxyXG4gIH1cclxuICBhYnN0cmFjdCBwYXJzZSgpOiBBU1ROb2RlW11cclxuICBhYnN0cmFjdCBnZXQgdHJlZSgpOiBUcmVlXHJcbn0iXX0= \ No newline at end of file diff --git a/build/src/interfaces/Source.js b/build/src/interfaces/Source.js index 0d8ff4e..6590b1a 100644 --- a/build/src/interfaces/Source.js +++ b/build/src/interfaces/Source.js @@ -1,3 +1,3 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvU291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBpbnRlcmZhY2UgU291cmNlIHtcbiAgbmFtZTogc3RyaW5nLFxuICBwYXRoOiBzdHJpbmcsXG4gIHRleHQ6IHN0cmluZ1xufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvU291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBpbnRlcmZhY2UgU291cmNlIHtcclxuICBuYW1lOiBzdHJpbmcsXHJcbiAgcGF0aDogc3RyaW5nLFxyXG4gIHRleHQ6IHN0cmluZ1xyXG59Il19 \ No newline at end of file diff --git a/build/src/interfaces/TextRange.js b/build/src/interfaces/TextRange.js index 51ef572..015edef 100644 --- a/build/src/interfaces/TextRange.js +++ b/build/src/interfaces/TextRange.js @@ -1,3 +1,3 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGV4dFJhbmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvVGV4dFJhbmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogQW4gaW50ZXJmYWNlIHRoYXQgcmVwcmVzZW50cyBhIHJhbmdlLlxuICogXG4gKiBAaW50ZXJmYWNlIFJhbmdlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmFuZ2Uge1xuICBzdGFydDogbnVtYmVyLFxuICBlbmQ6IG51bWJlclxufVxuXG4vKipcbiAqIEFuIGludGVyZmFjZSB0aGF0IHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uYWwgXG4gKiBhbmQgbG9jYXRpb25hbCByYW5nZXMgb2YgYSBzb3VyY2UgY29kZS5cbiAqIFxuICogQGludGVyZmFjZSBUZXh0UmFuZ2VcbiAqL1xuZXhwb3J0IGRlZmF1bHQgaW50ZXJmYWNlIFRleHRSYW5nZSB7XG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGEgY29udGV4dCdzIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb24uXG4gICAqIEBwcm9wZXJ0eSBwb3NpdGlvbjoge1xuICAgKiAgc3RhcnQ6IG51bWJlcixcbiAgICogIGVuZDogbnVtYmVyXG4gICAqIH1cbiAgICovXG4gIHBvc2l0aW9uOiBSYW5nZVxuICAvKipcbiAgICogUmVwcmVzZW50cyBhIGNvbnRleHQncyByb3cgYW5kIGNvbHVtbiBsb2NhdGlvbi5cbiAgICogXG4gICAqIEBsb2NhdGlvbjoge1xuICAgKiAgcm93OiBSYW5nZSxcbiAgICogIGNvbHVtbjogUmFuZ2VcbiAgICogfVxuICAgKi9cbiAgbG9jYXRpb246IHtcbiAgICByb3c6IFJhbmdlLFxuICAgIGNvbHVtbjogUmFuZ2VcbiAgfVxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGV4dFJhbmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvVGV4dFJhbmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuLyoqXHJcbiAqIEFuIGludGVyZmFjZSB0aGF0IHJlcHJlc2VudHMgYSByYW5nZS5cclxuICogXHJcbiAqIEBpbnRlcmZhY2UgUmFuZ2VcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmFuZ2Uge1xyXG4gIHN0YXJ0OiBudW1iZXIsXHJcbiAgZW5kOiBudW1iZXJcclxufVxyXG5cclxuLyoqXHJcbiAqIEFuIGludGVyZmFjZSB0aGF0IHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uYWwgXHJcbiAqIGFuZCBsb2NhdGlvbmFsIHJhbmdlcyBvZiBhIHNvdXJjZSBjb2RlLlxyXG4gKiBcclxuICogQGludGVyZmFjZSBUZXh0UmFuZ2VcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGludGVyZmFjZSBUZXh0UmFuZ2Uge1xyXG4gIC8qKlxyXG4gICAqIFJlcHJlc2VudHMgYSBjb250ZXh0J3Mgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbi5cclxuICAgKiBAcHJvcGVydHkgcG9zaXRpb246IHtcclxuICAgKiAgc3RhcnQ6IG51bWJlcixcclxuICAgKiAgZW5kOiBudW1iZXJcclxuICAgKiB9XHJcbiAgICovXHJcbiAgcG9zaXRpb246IFJhbmdlXHJcbiAgLyoqXHJcbiAgICogUmVwcmVzZW50cyBhIGNvbnRleHQncyByb3cgYW5kIGNvbHVtbiBsb2NhdGlvbi5cclxuICAgKiBcclxuICAgKiBAbG9jYXRpb246IHtcclxuICAgKiAgcm93OiBSYW5nZSxcclxuICAgKiAgY29sdW1uOiBSYW5nZVxyXG4gICAqIH1cclxuICAgKi9cclxuICBsb2NhdGlvbjoge1xyXG4gICAgcm93OiBSYW5nZSxcclxuICAgIGNvbHVtbjogUmFuZ2VcclxuICB9XHJcbn0iXX0= \ No newline at end of file diff --git a/build/src/lang/common/ast.js b/build/src/lang/common/ast.js index 31be4a5..4a07bbd 100644 --- a/build/src/lang/common/ast.js +++ b/build/src/lang/common/ast.js @@ -16,4 +16,4 @@ function createASTNode(source, node, arg1, arg2) { children, comment: document ? xdoc_parser_1.default(source.text).parse() : undefined, properties }); } exports.createASTNode = createASTNode; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xhbmcvY29tbW9uL2FzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUdBLDJDQUF3QztBQUN4Qyw2Q0FBc0M7QUFHdEMsNkNBQStCO0FBcUMvQixTQUFnQixhQUFhLENBQUMsTUFBYyxFQUFFLElBQWdCLEVBQUUsSUFBVSxFQUFFLElBQVU7SUFFcEYsSUFBSSxPQUFPLEVBQUUsUUFBUSxHQUFHLEVBQUUsRUFBRSxRQUFRLEdBQUcsT0FBTyxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUUsVUFBVSxDQUFDO0lBQzlGLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFBRSxRQUFRLEdBQUcsSUFBSSxDQUFDOztRQUNwQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBRXBCLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO1FBQzVCLFVBQVUsR0FBRyxJQUFJLENBQUM7S0FDbkI7SUFFRCx1QkFDRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFDZixJQUFJLEVBQUUsV0FBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFDckIsZUFBSyxDQUFDLElBQUksQ0FBQyxJQUNkLE9BQU87UUFDUCxRQUFRLEVBQ1IsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMscUJBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFDekQsVUFBVSxJQUNYO0FBQ0gsQ0FBQztBQW5CRCxzQ0FtQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEb2N1bWVudGF0aW9uTm9kZSB9IGZyb20gJ3hkb2MtcGFyc2VyL3NyYy9YRG9jQVNUTm9kZSc7XG5pbXBvcnQgeyBSZW1hcmtOb2RlIH0gZnJvbSAneGRvYy1wYXJzZXIvc3JjL1hEb2NQYXJzZXInO1xuaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuaW1wb3J0IHsgdGV4dCB9IGZyb20gXCIuLi8uLi91dGlscy90ZXh0XCI7XG5pbXBvcnQgcmFuZ2UgZnJvbSBcIi4uLy4uL3V0aWxzL3JhbmdlXCI7XG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuaW1wb3J0IFRleHRSYW5nZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9UZXh0UmFuZ2VcIjtcbmltcG9ydCB4ZG9jIGZyb20gJ3hkb2MtcGFyc2VyJztcblxuXG5leHBvcnQgaW50ZXJmYWNlIEFTVE5vZGUgZXh0ZW5kcyBUZXh0UmFuZ2Uge1xuICAvKipcbiAgICogQHByb3BlcnR5IC0gVGhlIHR5cGUgb2Ygbm9kZS5cbiAgICovXG4gIHR5cGU6IHN0cmluZyxcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSAtIFRoZSBjb250ZXh0IHN0cmluZy5cbiAgICovXG4gIHRleHQ6IHN0cmluZyxcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSAtIFRoZSBub2RlJ3MgY2hpbGRyZW4uXG4gICAqL1xuICBjaGlsZHJlbjogQVNUTm9kZVtdIHwgdW5kZWZpbmVkW10sXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgLSBUaGUgY29udGV4dCBub2RlIHRoYXQgYSBjb21tZW50IG5vZGUgcmVmZXJzIHRvLlxuICAgKi9cbiAgY29udGV4dDogQVNUTm9kZSxcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0aWVzIHRoYXQgYSBBU1ROb2RlIG1heSBwb3NzZXNzLlxuICAgKi9cbiAgcHJvcGVydGllcz86IG9iamVjdFxuICAvKipcbiAgICogQHByb3BlcnR5IC0gVGhlIHBhcnNlZCBYRG9jIGNvbW1lbnQuXG4gICAqL1xuICBjb21tZW50Pzoge1xuICAgIG1hcmtkb3duOiBSZW1hcmtOb2RlLFxuICAgIGRvY3VtZW50YXRpb246IFBhcnRpYWw8RG9jdW1lbnRhdGlvbk5vZGU+XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFTVE5vZGUoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQVNUTm9kZShzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSwgY2hpbGRyZW46IG9iamVjdFtdKTogQVNUTm9kZVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFTVE5vZGUoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUsIGNoaWxkcmVuOiBvYmplY3RbXSwgcHJvcGVydGllczogb2JqZWN0KVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFTVE5vZGUoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUsIGNvbnRleHQ6IEFTVE5vZGUsIGRvY3VtZW50OiBib29sZWFuKTogQVNUTm9kZSBcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBU1ROb2RlKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlLCBhcmcxPzogYW55LCBhcmcyPzogYW55KTogQVNUTm9kZSB7XG5cbiAgbGV0IGNvbnRleHQsIGNoaWxkcmVuID0gW10sIGRvY3VtZW50ID0gdHlwZW9mIGFyZzIgPT09ICdib29sZWFuJyAmJiBhcmcyID09PSB0cnVlLCBwcm9wZXJ0aWVzO1xuICBpZiAoQXJyYXkuaXNBcnJheShhcmcxKSkgY2hpbGRyZW4gPSBhcmcxO1xuICBlbHNlIGNvbnRleHQgPSBhcmcxO1xuXG4gIGlmICh0eXBlb2YgYXJnMiA9PT0gJ29iamVjdCcpIHtcbiAgICBwcm9wZXJ0aWVzID0gYXJnMjtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogbm9kZS50eXBlLFxuICAgIHRleHQ6IHRleHQoc291cmNlLCBub2RlKSxcbiAgICAuLi5yYW5nZShub2RlKSxcbiAgICBjb250ZXh0LFxuICAgIGNoaWxkcmVuLFxuICAgIGNvbW1lbnQ6IGRvY3VtZW50ID8geGRvYyhzb3VyY2UudGV4dCkucGFyc2UoKSA6IHVuZGVmaW5lZCxcbiAgICBwcm9wZXJ0aWVzLFxuICB9XG59XG4iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xhbmcvY29tbW9uL2FzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUdBLDJDQUF3QztBQUN4Qyw2Q0FBc0M7QUFHdEMsNkNBQStCO0FBcUMvQixTQUFnQixhQUFhLENBQUMsTUFBYyxFQUFFLElBQWdCLEVBQUUsSUFBVSxFQUFFLElBQVU7SUFFcEYsSUFBSSxPQUFPLEVBQUUsUUFBUSxHQUFHLEVBQUUsRUFBRSxRQUFRLEdBQUcsT0FBTyxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUUsVUFBVSxDQUFDO0lBQzlGLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFBRSxRQUFRLEdBQUcsSUFBSSxDQUFDOztRQUNwQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBRXBCLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO1FBQzVCLFVBQVUsR0FBRyxJQUFJLENBQUM7S0FDbkI7SUFFRCx1QkFDRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFDZixJQUFJLEVBQUUsV0FBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFDckIsZUFBSyxDQUFDLElBQUksQ0FBQyxJQUNkLE9BQU87UUFDUCxRQUFRLEVBQ1IsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMscUJBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFDekQsVUFBVSxJQUNYO0FBQ0gsQ0FBQztBQW5CRCxzQ0FtQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEb2N1bWVudGF0aW9uTm9kZSB9IGZyb20gJ3hkb2MtcGFyc2VyL3NyYy9YRG9jQVNUTm9kZSc7XHJcbmltcG9ydCB7IFJlbWFya05vZGUgfSBmcm9tICd4ZG9jLXBhcnNlci9zcmMvWERvY1BhcnNlcic7XHJcbmltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcclxuaW1wb3J0IHsgdGV4dCB9IGZyb20gXCIuLi8uLi91dGlscy90ZXh0XCI7XHJcbmltcG9ydCByYW5nZSBmcm9tIFwiLi4vLi4vdXRpbHMvcmFuZ2VcIjtcclxuaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2VcIjtcclxuaW1wb3J0IFRleHRSYW5nZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9UZXh0UmFuZ2VcIjtcclxuaW1wb3J0IHhkb2MgZnJvbSAneGRvYy1wYXJzZXInO1xyXG5cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQVNUTm9kZSBleHRlbmRzIFRleHRSYW5nZSB7XHJcbiAgLyoqXHJcbiAgICogQHByb3BlcnR5IC0gVGhlIHR5cGUgb2Ygbm9kZS5cclxuICAgKi9cclxuICB0eXBlOiBzdHJpbmcsXHJcbiAgLyoqXHJcbiAgICogQHByb3BlcnR5IC0gVGhlIGNvbnRleHQgc3RyaW5nLlxyXG4gICAqL1xyXG4gIHRleHQ6IHN0cmluZyxcclxuICAvKipcclxuICAgKiBAcHJvcGVydHkgLSBUaGUgbm9kZSdzIGNoaWxkcmVuLlxyXG4gICAqL1xyXG4gIGNoaWxkcmVuOiBBU1ROb2RlW10gfCB1bmRlZmluZWRbXSxcclxuICAvKipcclxuICAgKiBAcHJvcGVydHkgLSBUaGUgY29udGV4dCBub2RlIHRoYXQgYSBjb21tZW50IG5vZGUgcmVmZXJzIHRvLlxyXG4gICAqL1xyXG4gIGNvbnRleHQ6IEFTVE5vZGUsXHJcbiAgLyoqXHJcbiAgICogQHByb3BlcnR5IC0gVGhlIHByb3BlcnRpZXMgdGhhdCBhIEFTVE5vZGUgbWF5IHBvc3Nlc3MuXHJcbiAgICovXHJcbiAgcHJvcGVydGllcz86IG9iamVjdFxyXG4gIC8qKlxyXG4gICAqIEBwcm9wZXJ0eSAtIFRoZSBwYXJzZWQgWERvYyBjb21tZW50LlxyXG4gICAqL1xyXG4gIGNvbW1lbnQ/OiB7XHJcbiAgICBtYXJrZG93bjogUmVtYXJrTm9kZSxcclxuICAgIGRvY3VtZW50YXRpb246IFBhcnRpYWw8RG9jdW1lbnRhdGlvbk5vZGU+XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQVNUTm9kZShzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSk6IEFTVE5vZGVcclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFTVE5vZGUoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUsIGNoaWxkcmVuOiBvYmplY3RbXSk6IEFTVE5vZGVcclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFTVE5vZGUoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUsIGNoaWxkcmVuOiBvYmplY3RbXSwgcHJvcGVydGllczogb2JqZWN0KVxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQVNUTm9kZShzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSwgY29udGV4dDogQVNUTm9kZSwgZG9jdW1lbnQ6IGJvb2xlYW4pOiBBU1ROb2RlIFxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQVNUTm9kZShzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSwgYXJnMT86IGFueSwgYXJnMj86IGFueSk6IEFTVE5vZGUge1xyXG5cclxuICBsZXQgY29udGV4dCwgY2hpbGRyZW4gPSBbXSwgZG9jdW1lbnQgPSB0eXBlb2YgYXJnMiA9PT0gJ2Jvb2xlYW4nICYmIGFyZzIgPT09IHRydWUsIHByb3BlcnRpZXM7XHJcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJnMSkpIGNoaWxkcmVuID0gYXJnMTtcclxuICBlbHNlIGNvbnRleHQgPSBhcmcxO1xyXG5cclxuICBpZiAodHlwZW9mIGFyZzIgPT09ICdvYmplY3QnKSB7XHJcbiAgICBwcm9wZXJ0aWVzID0gYXJnMjtcclxuICB9XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICB0eXBlOiBub2RlLnR5cGUsXHJcbiAgICB0ZXh0OiB0ZXh0KHNvdXJjZSwgbm9kZSksXHJcbiAgICAuLi5yYW5nZShub2RlKSxcclxuICAgIGNvbnRleHQsXHJcbiAgICBjaGlsZHJlbixcclxuICAgIGNvbW1lbnQ6IGRvY3VtZW50ID8geGRvYyhzb3VyY2UudGV4dCkucGFyc2UoKSA6IHVuZGVmaW5lZCxcclxuICAgIHByb3BlcnRpZXMsXHJcbiAgfVxyXG59XHJcbiJdfQ== \ No newline at end of file diff --git a/build/src/lang/common/emca.js b/build/src/lang/common/emca.js index 6291930..b13ad40 100644 --- a/build/src/lang/common/emca.js +++ b/build/src/lang/common/emca.js @@ -1,3 +1,3 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1jYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2NvbW1vbi9lbWNhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIE5vZGVQcm9wZXJ0aWVzIHtcbiAgZXhwb3J0czogUGFydGlhbDxOb2RlRXhwb3J0cz5cbiAgaW5oZXJpdGFuY2U6IFBhcnRpYWw8Tm9kZUluaGVyaXRhbmNlPlxuICBuYW1lc3BhY2U6IGJvb2xlYW4sXG4gIG1vZHVsZTogYm9vbGVhblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vZGVFeHBvcnRzIHtcbiAgZXhwb3J0OiBib29sZWFuLFxuICBkZWZhdWx0OiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9kZUluaGVyaXRhbmNlIHtcbiAgZXh0ZW5kczogYm9vbGVhbixcbiAgaW1wbGVtZW50czogYm9vbGVhblxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1jYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2NvbW1vbi9lbWNhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIE5vZGVQcm9wZXJ0aWVzIHtcclxuICBleHBvcnRzOiBQYXJ0aWFsPE5vZGVFeHBvcnRzPlxyXG4gIGluaGVyaXRhbmNlOiBQYXJ0aWFsPE5vZGVJbmhlcml0YW5jZT5cclxuICBuYW1lc3BhY2U6IGJvb2xlYW4sXHJcbiAgbW9kdWxlOiBib29sZWFuXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTm9kZUV4cG9ydHMge1xyXG4gIGV4cG9ydDogYm9vbGVhbixcclxuICBkZWZhdWx0OiBib29sZWFuXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTm9kZUluaGVyaXRhbmNlIHtcclxuICBleHRlbmRzOiBib29sZWFuLFxyXG4gIGltcGxlbWVudHM6IGJvb2xlYW5cclxufSJdfQ== \ No newline at end of file diff --git a/build/src/lang/common/node.js b/build/src/lang/common/node.js index b90d3ee..9cb0e52 100644 --- a/build/src/lang/common/node.js +++ b/build/src/lang/common/node.js @@ -9,4 +9,4 @@ class Node { } } exports.Node = Node; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2NvbW1vbi9ub2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBYUEsTUFBYSxJQUFJO0lBQ2YsWUFBbUIsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN6QyxVQUFLLEdBQUcsQ0FBQyxPQUFvQixFQUFRLEVBQUU7WUFDckMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFBO0lBSDRDLENBQUM7Q0FJL0M7QUFMRCxvQkFLQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFTVE5vZGUgfSBmcm9tIFwiLi9hc3RcIjtcbmltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBUcmVlU2l0dGVyTm9kZSB7XG4gIHZpc2l0KHZpc2l0b3I6IE5vZGVWaXNpdG9yKTogdm9pZFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vZGVWaXNpdG9yIHtcbiAgZ2V0QVNUKCk6IEFTVE5vZGVbXVxuICB2aXNpdE5vZGUobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IG9iamVjdCk6IEFTVE5vZGVcbiAgdmlzaXRDaGlsZHJlbihub2RlczogU3ludGF4Tm9kZVtdLCBwcm9wZXJ0aWVzPzogb2JqZWN0KTogQVNUTm9kZVtdXG59XG5cbmV4cG9ydCBjbGFzcyBOb2RlIGltcGxlbWVudHMgVHJlZVNpdHRlck5vZGUge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgc3ludGF4Tm9kZTogU3ludGF4Tm9kZSkgeyB9XG4gIHZpc2l0ID0gKHZpc2l0b3I6IE5vZGVWaXNpdG9yKTogdm9pZCA9PiB7XG4gICAgdmlzaXRvci52aXNpdE5vZGUodGhpcy5zeW50YXhOb2RlKTtcbiAgfVxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2NvbW1vbi9ub2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBYUEsTUFBYSxJQUFJO0lBQ2YsWUFBbUIsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN6QyxVQUFLLEdBQUcsQ0FBQyxPQUFvQixFQUFRLEVBQUU7WUFDckMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFBO0lBSDRDLENBQUM7Q0FJL0M7QUFMRCxvQkFLQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFTVE5vZGUgfSBmcm9tIFwiLi9hc3RcIjtcclxuaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUcmVlU2l0dGVyTm9kZSB7XHJcbiAgdmlzaXQodmlzaXRvcjogTm9kZVZpc2l0b3IpOiB2b2lkXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTm9kZVZpc2l0b3Ige1xyXG4gIGdldEFTVCgpOiBBU1ROb2RlW11cclxuICB2aXNpdE5vZGUobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IG9iamVjdCk6IEFTVE5vZGVcclxuICB2aXNpdENoaWxkcmVuKG5vZGVzOiBTeW50YXhOb2RlW10sIHByb3BlcnRpZXM/OiBvYmplY3QpOiBBU1ROb2RlW11cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE5vZGUgaW1wbGVtZW50cyBUcmVlU2l0dGVyTm9kZSB7XHJcbiAgY29uc3RydWN0b3IocHVibGljIHN5bnRheE5vZGU6IFN5bnRheE5vZGUpIHsgfVxyXG4gIHZpc2l0ID0gKHZpc2l0b3I6IE5vZGVWaXNpdG9yKTogdm9pZCA9PiB7XHJcbiAgICB2aXNpdG9yLnZpc2l0Tm9kZSh0aGlzLnN5bnRheE5vZGUpO1xyXG4gIH1cclxufSJdfQ== \ No newline at end of file diff --git a/build/src/lang/javascript/index.d.ts b/build/src/lang/javascript/index.d.ts index 2bca672..524581c 100644 --- a/build/src/lang/javascript/index.d.ts +++ b/build/src/lang/javascript/index.d.ts @@ -1,5 +1,7 @@ -import IParser from '../../interfaces/IParser'; +import * as Parser from 'tree-sitter'; +import ParserInterface from '../../interfaces/ParserInterface'; import Source from '../../interfaces/Source'; +import { ASTNode } from '../common/ast'; /** * A class that parses JavaScript comments. * @@ -11,10 +13,12 @@ import Source from '../../interfaces/Source'; * @export default * ``` */ -export default class JavaScriptParser implements IParser { - private file; +export default class JavaScriptParser implements ParserInterface { + private source; private options; private parser; - constructor(file: Source, options: any); - parse: () => any[]; + private tree_; + constructor(source: Source, options: any); + parse(): ASTNode[]; + readonly tree: Parser.Tree; } diff --git a/build/src/lang/javascript/index.js b/build/src/lang/javascript/index.js index 139e0c1..633a090 100644 --- a/build/src/lang/javascript/index.js +++ b/build/src/lang/javascript/index.js @@ -2,8 +2,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); const Parser = require("tree-sitter"); const JavaScript = require("tree-sitter-javascript"); -// import IResult from '../../interfaces/IResult'; -// import IComment from '../../interfaces/IComment'; +const visitor_1 = require("./visitor"); +const walk_1 = require("../../utils/walk"); /** * A class that parses JavaScript comments. * @@ -16,42 +16,24 @@ const JavaScript = require("tree-sitter-javascript"); * ``` */ class JavaScriptParser { - constructor(file, options) { - this.parse = () => { - // let tree = this.parser.parse(this.file.text); - // // Get the first comment - // let first_comment = tree.rootNode.children - // .filter(node => node.type === "comment")[0]; - // const first_comment_string = this.file.text - // .substring(first_comment.startIndex, first_comment.endIndex); - // // Remove any legal or unncessary comments - // if (first_comment_string.includes("copyright") || - // first_comment_string.includes("author") || - // first_comment_string.includes("terms and conditions")) { - // tree.edit({ - // startIndex: first_comment.startIndex, - // oldEndIndex: first_comment.endIndex, - // newEndIndex: first_comment.endIndex, - // startPosition: { row: 0, column: 0 }, - // oldEndPosition: { row: 0, column: 0 }, - // newEndPosition: { row: 0, column: 0 }, - // }); - // tree = this.parser.parse('', tree); - // } - // return { - // file: this.file, - // comments: CommentParser.parse(tree.rootNode, this.file.text) - // .filter(this.filterType) - // // .map(this.checkType) - // .map(this.parseChildren) - // } - return []; - }; - this.file = file; + constructor(source, options) { + this.source = source; Object.assign(this.options = {}, options || {}); this.parser = new Parser(); this.parser.setLanguage(JavaScript); + this.tree_ = this.parser.parse(this.source.text); + } + parse() { + const visitor = new visitor_1.JavaScriptVisitor(this.source); + const root = walk_1.default(this.tree.rootNode); + // console.time('visit') + root.visit(visitor); + // console.timeEnd('visit') + return visitor.getAST(); + } + get tree() { + return this.tree_; } } exports.default = JavaScriptParser; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy9qYXZhc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNDO0FBQ3RDLHFEQUFxRDtBQUdyRCxrREFBa0Q7QUFDbEQsb0RBQW9EO0FBRXBEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFxQixnQkFBZ0I7SUFJbkMsWUFBWSxJQUFZLEVBQUUsT0FBWTtRQU10QyxVQUFLLEdBQUcsR0FBRyxFQUFFO1lBQ1gsZ0RBQWdEO1lBQ2hELDJCQUEyQjtZQUMzQiw2Q0FBNkM7WUFDN0MsaURBQWlEO1lBQ2pELDhDQUE4QztZQUM5QyxnRUFBZ0U7WUFFaEUsNkNBQTZDO1lBQzdDLG9EQUFvRDtZQUNwRCwrQ0FBK0M7WUFDL0MsNkRBQTZEO1lBQzdELGdCQUFnQjtZQUNoQiw0Q0FBNEM7WUFDNUMsMkNBQTJDO1lBQzNDLDJDQUEyQztZQUMzQyw0Q0FBNEM7WUFDNUMsNkNBQTZDO1lBQzdDLDZDQUE2QztZQUM3QyxRQUFRO1lBQ1Isd0NBQXdDO1lBQ3hDLElBQUk7WUFDSixXQUFXO1lBQ1gscUJBQXFCO1lBQ3JCLGlFQUFpRTtZQUNqRSwrQkFBK0I7WUFDL0IsOEJBQThCO1lBQzlCLCtCQUErQjtZQUMvQixJQUFJO1lBQ0osT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDLENBQUE7UUFuQ0MsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Q0FrRkY7QUEzRkQsbUNBMkZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcbmltcG9ydCAqIGFzIEphdmFTY3JpcHQgZnJvbSAndHJlZS1zaXR0ZXItamF2YXNjcmlwdCc7XG5pbXBvcnQgSVBhcnNlciBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lQYXJzZXInO1xuaW1wb3J0IFNvdXJjZSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZSc7XG4vLyBpbXBvcnQgSVJlc3VsdCBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lSZXN1bHQnO1xuLy8gaW1wb3J0IElDb21tZW50IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvSUNvbW1lbnQnO1xuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCBwYXJzZXMgSmF2YVNjcmlwdCBjb21tZW50cy5cbiAqIFxuICogIyBBUElcbiAqIFxuICogYGBgXG4gKiBAY2xhc3MgSmF2YVNjcmlwdFBhcnNlclxuICogQGltcGxlbWVudHMgSVBhcnNlclxuICogQGV4cG9ydCBkZWZhdWx0XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSmF2YVNjcmlwdFBhcnNlciBpbXBsZW1lbnRzIElQYXJzZXIge1xuICBwcml2YXRlIGZpbGU6IFNvdXJjZTtcbiAgcHJpdmF0ZSBvcHRpb25zOiBhbnk7XG4gIHByaXZhdGUgcGFyc2VyOiBQYXJzZXI7XG4gIGNvbnN0cnVjdG9yKGZpbGU6IFNvdXJjZSwgb3B0aW9uczogYW55KSB7XG4gICAgdGhpcy5maWxlID0gZmlsZTtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucyA9IHt9LCBvcHRpb25zIHx8IHt9KTtcbiAgICB0aGlzLnBhcnNlciA9IG5ldyBQYXJzZXIoKTtcbiAgICB0aGlzLnBhcnNlci5zZXRMYW5ndWFnZShKYXZhU2NyaXB0KTtcbiAgfVxuICBwYXJzZSA9ICgpID0+IHtcbiAgICAvLyBsZXQgdHJlZSA9IHRoaXMucGFyc2VyLnBhcnNlKHRoaXMuZmlsZS50ZXh0KTtcbiAgICAvLyAvLyBHZXQgdGhlIGZpcnN0IGNvbW1lbnRcbiAgICAvLyBsZXQgZmlyc3RfY29tbWVudCA9IHRyZWUucm9vdE5vZGUuY2hpbGRyZW5cbiAgICAvLyAgIC5maWx0ZXIobm9kZSA9PiBub2RlLnR5cGUgPT09IFwiY29tbWVudFwiKVswXTtcbiAgICAvLyBjb25zdCBmaXJzdF9jb21tZW50X3N0cmluZyA9IHRoaXMuZmlsZS50ZXh0XG4gICAgLy8gLnN1YnN0cmluZyhmaXJzdF9jb21tZW50LnN0YXJ0SW5kZXgsIGZpcnN0X2NvbW1lbnQuZW5kSW5kZXgpO1xuICAgIFxuICAgIC8vIC8vIFJlbW92ZSBhbnkgbGVnYWwgb3IgdW5uY2Vzc2FyeSBjb21tZW50c1xuICAgIC8vIGlmIChmaXJzdF9jb21tZW50X3N0cmluZy5pbmNsdWRlcyhcImNvcHlyaWdodFwiKSB8fFxuICAgIC8vICAgZmlyc3RfY29tbWVudF9zdHJpbmcuaW5jbHVkZXMoXCJhdXRob3JcIikgfHxcbiAgICAvLyAgIGZpcnN0X2NvbW1lbnRfc3RyaW5nLmluY2x1ZGVzKFwidGVybXMgYW5kIGNvbmRpdGlvbnNcIikpIHtcbiAgICAvLyAgIHRyZWUuZWRpdCh7XG4gICAgLy8gICAgIHN0YXJ0SW5kZXg6IGZpcnN0X2NvbW1lbnQuc3RhcnRJbmRleCxcbiAgICAvLyAgICAgb2xkRW5kSW5kZXg6IGZpcnN0X2NvbW1lbnQuZW5kSW5kZXgsXG4gICAgLy8gICAgIG5ld0VuZEluZGV4OiBmaXJzdF9jb21tZW50LmVuZEluZGV4LFxuICAgIC8vICAgICBzdGFydFBvc2l0aW9uOiB7IHJvdzogMCwgY29sdW1uOiAwIH0sXG4gICAgLy8gICAgIG9sZEVuZFBvc2l0aW9uOiB7IHJvdzogMCwgY29sdW1uOiAwIH0sXG4gICAgLy8gICAgIG5ld0VuZFBvc2l0aW9uOiB7IHJvdzogMCwgY29sdW1uOiAwIH0sXG4gICAgLy8gICB9KTtcbiAgICAvLyAgIHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZSgnJywgdHJlZSk7XG4gICAgLy8gfVxuICAgIC8vIHJldHVybiB7XG4gICAgLy8gICBmaWxlOiB0aGlzLmZpbGUsXG4gICAgLy8gICBjb21tZW50czogQ29tbWVudFBhcnNlci5wYXJzZSh0cmVlLnJvb3ROb2RlLCB0aGlzLmZpbGUudGV4dClcbiAgICAvLyAgICAgLmZpbHRlcih0aGlzLmZpbHRlclR5cGUpXG4gICAgLy8gICAgIC8vIC5tYXAodGhpcy5jaGVja1R5cGUpXG4gICAgLy8gICAgIC5tYXAodGhpcy5wYXJzZUNoaWxkcmVuKVxuICAgIC8vIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvLyBwcml2YXRlIGZpbHRlclR5cGUgPSAoY29tbWVudCk6IGJvb2xlYW4gPT4ge1xuICAvLyAgIHJldHVybiAodGhpcy5vcHRpb25zLmZpbHRlciB8fFxuICAvLyAgICAgW1xuICAvLyAgICAgICAnZnVuY3Rpb24nLFxuICAvLyAgICAgICAnY2xhc3MnLFxuICAvLyAgICAgICAndmFyaWFibGVfZGVjbGFyYXRpb24nXG4gIC8vICAgICBdKS5pbmNsdWRlcyhjb21tZW50LmNvbnRleHQudHlwZSlcbiAgLy8gfVxuXG4gIC8vIHByaXZhdGUgY2hlY2tUeXBlID0gKGNvbW1lbnQpID0+IHtcbiAgLy8gICBjb25zdCB0cmVlID0gdGhpcy5wYXJzZXIucGFyc2UoY29tbWVudC5jb250ZXh0LnRleHQpO1xuICAvLyAgIHN3aXRjaCAoY29tbWVudC5jb250ZXh0LnR5cGUpIHtcbiAgLy8gICAgIGNhc2UgJ3ZhcmlhYmxlX2RlY2xhcmF0aW9uJzpcbiAgLy8gICAgICAgLy8gQ2hlY2sgd2hldGhlciB3ZSBoYXZlIGFuIGFub255bW91cyBjbGFzc1xuICAvLyAgICAgICBpZiAoY29tbWVudC5jb250ZXh0LnRleHQuaW5jbHVkZXMoXCJjbGFzc1wiKSkge1xuICAvLyAgICAgICAgIC8vIERyaWxsIGRvd24gdW50aWwgd2UgZmluZCB0aGUgY2xhc3MgYm9keVxuICAvLyAgICAgICAgIGNvbnN0IHZhcmlhYmxlX2RlY2xhcmF0b3IgPSB0cmVlLnJvb3ROb2RlLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzFdO1xuICAvLyAgICAgICAgIGNvbnN0IGFub255bW91c19jbGFzcyA9IHZhcmlhYmxlX2RlY2xhcmF0b3IuY2hpbGRyZW5cbiAgLy8gICAgICAgICAgIC5maWx0ZXIobm9kZSA9PiBub2RlLnR5cGUgPT09IFwiYW5vbnltb3VzX2NsYXNzXCIpWzBdXG4gIC8vICAgICAgICAgY29uc3QgY2xhc3NfYm9keSA9IGFub255bW91c19jbGFzcy5jaGlsZHJlblsxXTtcbiAgLy8gICAgICAgICBjb21tZW50LmNvbnRleHQuY2hpbGRyZW4gPSBDb21tZW50UGFyc2VyLnBhcnNlKFxuICAvLyAgICAgICAgICAgY2xhc3NfYm9keSxcbiAgLy8gICAgICAgICAgIGNvbW1lbnQuY29udGV4dC50ZXh0LFxuICAvLyAgICAgICAgICAgeyBsb2NhdGlvbjogY29tbWVudC5jb250ZXh0LmxvY2F0aW9uLCBwb3NpdGlvbjogY29tbWVudC5jb250ZXh0LnBvc2l0aW9uIH1cbiAgLy8gICAgICAgICApO1xuICAvLyAgICAgICB9XG4gIC8vICAgICAgIGJyZWFrO1xuICAvLyAgICAgZGVmYXVsdDpcbiAgLy8gICAgICAgYnJlYWs7XG4gIC8vICAgfVxuICAvLyAgIHJldHVybiBjb21tZW50O1xuICAvLyB9XG5cbiAgLy8gcHJpdmF0ZSBwYXJzZUNoaWxkcmVuID0gKGNvbW1lbnQpID0+IHtcbiAgLy8gICBzd2l0Y2ggKGNvbW1lbnQuY29udGV4dC50eXBlKSB7XG4gIC8vICAgICBjYXNlICdjbGFzcyc6XG4gIC8vICAgICAgIGNvbnN0IHRyZWUgPSB0aGlzLnBhcnNlci5wYXJzZShjb21tZW50LmNvbnRleHQudGV4dCk7XG4gIC8vICAgICAgIGNvbW1lbnQuY29udGV4dC5jaGlsZHJlbiA9IENvbW1lbnRQYXJzZXIucGFyc2UoXG4gIC8vICAgICAgICAgdHJlZS5yb290Tm9kZSxcbiAgLy8gICAgICAgICBjb21tZW50LmNvbnRleHQudGV4dCxcbiAgLy8gICAgICAgICB7IGxvY2F0aW9uOiBjb21tZW50LmNvbnRleHQubG9jYXRpb24sIHBvc2l0aW9uOiBjb21tZW50LmNvbnRleHQucG9zaXRpb24gfVxuICAvLyAgICAgICApLmZpbHRlcihjaGlsZCA9PiBjaGlsZC5jb250ZXh0LnR5cGUgPT09ICdtZXRob2RfZGVmaW5pdGlvbicpO1xuICAvLyAgICAgICBicmVhaztcbiAgLy8gICAgIGRlZmF1bHQ6XG4gIC8vICAgICAgIGJyZWFrO1xuICAvLyAgIH1cbiAgLy8gICByZXR1cm4gY29tbWVudDtcbiAgLy8gfVxuXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy9qYXZhc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNDO0FBQ3RDLHFEQUFxRDtBQUlyRCx1Q0FBOEM7QUFDOUMsMkNBQW9DO0FBRXBDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFxQixnQkFBZ0I7SUFNbkMsWUFBWSxNQUFjLEVBQUUsT0FBWTtRQUN0QyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFDRCxLQUFLO1FBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSwyQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkQsTUFBTSxJQUFJLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEMsd0JBQXdCO1FBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDbkIsMkJBQTJCO1FBQzNCLE9BQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFDRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztDQUNGO0FBeEJELG1DQXdCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFBhcnNlciBmcm9tICd0cmVlLXNpdHRlcic7XHJcbmltcG9ydCAqIGFzIEphdmFTY3JpcHQgZnJvbSAndHJlZS1zaXR0ZXItamF2YXNjcmlwdCc7XHJcbmltcG9ydCBQYXJzZXJJbnRlcmZhY2UgZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9QYXJzZXJJbnRlcmZhY2UnO1xyXG5pbXBvcnQgU291cmNlIGZyb20gJy4uLy4uL2ludGVyZmFjZXMvU291cmNlJztcclxuaW1wb3J0IHsgQVNUTm9kZSB9IGZyb20gJy4uL2NvbW1vbi9hc3QnO1xyXG5pbXBvcnQgeyBKYXZhU2NyaXB0VmlzaXRvciB9IGZyb20gJy4vdmlzaXRvcic7XHJcbmltcG9ydCB3YWxrIGZyb20gJy4uLy4uL3V0aWxzL3dhbGsnO1xyXG5cclxuLyoqXHJcbiAqIEEgY2xhc3MgdGhhdCBwYXJzZXMgSmF2YVNjcmlwdCBjb21tZW50cy5cclxuICogXHJcbiAqICMgQVBJXHJcbiAqIFxyXG4gKiBgYGBcclxuICogQGNsYXNzIEphdmFTY3JpcHRQYXJzZXJcclxuICogQGltcGxlbWVudHMgSVBhcnNlclxyXG4gKiBAZXhwb3J0IGRlZmF1bHRcclxuICogYGBgXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBKYXZhU2NyaXB0UGFyc2VyIGltcGxlbWVudHMgUGFyc2VySW50ZXJmYWNlIHtcclxuICBcclxuICBwcml2YXRlIHNvdXJjZTogU291cmNlO1xyXG4gIHByaXZhdGUgb3B0aW9uczogYW55O1xyXG4gIHByaXZhdGUgcGFyc2VyOiBQYXJzZXI7XHJcbiAgcHJpdmF0ZSB0cmVlXzogUGFyc2VyLlRyZWU7XHJcbiAgY29uc3RydWN0b3Ioc291cmNlOiBTb3VyY2UsIG9wdGlvbnM6IGFueSkge1xyXG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XHJcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucyA9IHt9LCBvcHRpb25zIHx8IHt9KTtcclxuICAgIHRoaXMucGFyc2VyID0gbmV3IFBhcnNlcigpO1xyXG4gICAgdGhpcy5wYXJzZXIuc2V0TGFuZ3VhZ2UoSmF2YVNjcmlwdCk7XHJcbiAgICB0aGlzLnRyZWVfID0gdGhpcy5wYXJzZXIucGFyc2UodGhpcy5zb3VyY2UudGV4dCk7XHJcbiAgfVxyXG4gIHBhcnNlKCk6IEFTVE5vZGVbXSB7XHJcbiAgICBjb25zdCB2aXNpdG9yID0gbmV3IEphdmFTY3JpcHRWaXNpdG9yKHRoaXMuc291cmNlKTtcclxuICAgIGNvbnN0IHJvb3QgPSB3YWxrKHRoaXMudHJlZS5yb290Tm9kZSk7XHJcbiAgICAvLyBjb25zb2xlLnRpbWUoJ3Zpc2l0JylcclxuICAgIHJvb3QudmlzaXQodmlzaXRvcilcclxuICAgIC8vIGNvbnNvbGUudGltZUVuZCgndmlzaXQnKVxyXG4gICAgcmV0dXJuIHZpc2l0b3IuZ2V0QVNUKCk7XHJcbiAgfVxyXG4gIGdldCB0cmVlICgpOiBQYXJzZXIuVHJlZSB7XHJcbiAgICByZXR1cm4gdGhpcy50cmVlXztcclxuICB9XHJcbn0iXX0= \ No newline at end of file diff --git a/build/src/lang/javascript/visitor.d.ts b/build/src/lang/javascript/visitor.d.ts new file mode 100644 index 0000000..82236b7 --- /dev/null +++ b/build/src/lang/javascript/visitor.d.ts @@ -0,0 +1,48 @@ +import { ASTNode } from "../common/ast"; +import { NodeProperties } from "../common/emca"; +import { NodeVisitor } from "../common/node"; +import { SyntaxNode } from "tree-sitter"; +import Source from "../../interfaces/Source"; +/** + * A class that visits ASTNodes from a TypeScript tree. + */ +export declare class JavaScriptVisitor implements NodeVisitor { + private ast; + private source; + constructor(source: Source); + /** + * Determines whether a node has inheritance + */ + private hasInheritance; + /** + * Returns a node's inheritance type + */ + private getInheritanceType; + /** + * Determines whether an export is default + */ + private hasDefaultExport; + /** + * Returns only the comments from a node's children. + */ + private filterType; + getAST(): ASTNode[]; + visitNode: (node: SyntaxNode, properties?: Partial) => ASTNode; + visitChildren: (nodes: SyntaxNode[]) => ASTNode[]; + private visitProgram; + private visitComment; + /** + * Visit the contextual node + * + * # Remark + * + * A node is considered contextual when a comment is visited and the node is its sibling. + */ + private visitContext; + private visitExportStatement; + private visitExpressionStatement; + private visitInternalModule; + private visitClass; + private visitNonTerminal; + private visitTerminal; +} diff --git a/build/src/lang/javascript/visitor.js b/build/src/lang/javascript/visitor.js new file mode 100644 index 0000000..ebecb2a --- /dev/null +++ b/build/src/lang/javascript/visitor.js @@ -0,0 +1,271 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const ast_1 = require("../common/ast"); +const comment_1 = require("../../utils/comment"); +const sibling_1 = require("../../utils/sibling"); +const _ = require("lodash"); +const log_1 = require("../../utils/log"); +const match_1 = require("../../utils/match"); +/** + * A class that visits ASTNodes from a TypeScript tree. + */ +class JavaScriptVisitor { + constructor(source) { + this.ast = []; + /* Visitors */ + this.visitNode = (node, properties) => { + switch (node.type) { + case 'program': + this.ast = this.visitProgram(node); + break; + case 'comment': + return this.visitComment(node); + case 'MISSING': + case 'ERROR': + log_1.default.report(this.source, node, log_1.ErrorType.TreeSitterParseError); + break; + default: + /* Match other non-terminals */ + if (match_1.default(node, 'constraint', 'formal_parameters', 'required_parameter', 'rest_parameter', 'type_identifier', 'type_parameters', 'type_parameter', 'type_annotation', 'object_type', 'predefined_type', 'parenthesized_type', 'literal_type', 'intersection_type', 'union_type', 'class_body', 'extends_clause', 'unary_expression', 'binary_expression', 'statement_block', 'return_statement', 'export_statement', 'expression_statement', + // A call_signature can also be a non-contextual node + 'call_signature', 'internal_module')) { + return this.visitNonTerminal(node, properties); + } + /* Match terminals */ + if (match_1.default(node, 'identifier', 'extends', 'property_identifier', 'accessibility_modifier', 'string', 'void', 'boolean', 'null', 'undefined', 'number', 'return', 'get', 'function', 'namespace')) { + return this.visitTerminal(node); + } + log_1.default.report(this.source, node, log_1.ErrorType.NodeTypeNotYetSupported); + break; + } + }; + this.visitChildren = (nodes) => { + let children = []; + for (let i = 0; i < nodes.length; i++) { + const node = nodes[i]; + if (!node.type.match(/[<>(){},:;\[\]&|=\+\-\*\/]/) && node.type !== '...') { + const child = this.visitNode(node); + if (child) + children.push(child); + } + } + return children; + }; + this.visitProgram = (node) => { + let visited = {}, getStartLocation = (n) => `${n.location.row.start}:${n.location.column.start}`; + // A program can have modules, namespaces, comments as its children + // The first step is to parse all the comments in the root node + let comments = this.visitChildren(this.filterType(node, 'comment')); + // Parse the namespaces in expression_statement + // let namespaces = this.visitChildren(this.filterType(node, 'expression_statement')); + // Parse the export statements in the root node + let exports = this.visitChildren(this.filterType(node, 'export_statement')); + // Get the visited context nodes + for (let i = 0; i < comments.length; i++) { + const comment = comments[i]; + const context = comment; + visited[getStartLocation(context)] = true; + } + // Exports are oddballs since some exports may reference + // a type/node that may have been commented. + // We'll first need to filter the ones we have visited + _.remove(exports, x => visited[getStartLocation(x)]); + // From the ones we have not visited, we'll need to modify + // the node properties of each context in a comment node that + // matches the ones we have not visited. + const matched = {}; + comments = _.compact(comments.map(comment => { + for (let i = 0; i < exports.length; i++) { + const export_ = exports[i]; + const context = comment.context; + for (let j = 0; j < context.children.length; j++) { + if (context.children[i].type === export_.type) { + matched[getStartLocation(export_)] = true; + comment.context.properties = Object.assign(comment.context.properties || {}, export_.properties); + } + } + } + return comment; + })); + // Removed the matched exports + _.remove(exports, x => matched[getStartLocation(x)]); + return [].concat(comments).concat(exports); + }; + this.visitComment = (node) => { + if (comment_1.isJavaDocComment(this.source, node)) { + const nextSibling = sibling_1.sibling(node); + if (nextSibling) { + return ast_1.createASTNode(this.source, node, this.visitContext(nextSibling, {}), true); + } + } + }; + /** + * Visit the contextual node + * + * # Remark + * + * A node is considered contextual when a comment is visited and the node is its sibling. + */ + this.visitContext = (node, properties) => { + switch (node.type) { + case 'export_statement': + return this.visitExportStatement(node, properties); + case 'expression_statement': + return this.visitExpressionStatement(node, properties); + case 'class': + return this.visitClass(node, properties); + case 'function': + case 'call_signature': + case 'method_signature': + case 'property_signature': + case 'public_field_definition': + case 'method_definition': + return this.visitNonTerminal(node, properties); + default: + log_1.default.report(this.source, node, log_1.ErrorType.NodeTypeNotYetSupported); + break; + } + }; + /* Statements */ + this.visitExportStatement = (node, properties) => { + let children = node.children, defaultExport = false; + // Remove 'export' since it's always first in the array + children.shift(); + if (this.hasDefaultExport(node)) { + defaultExport = true; + // Remove 'default' export + children.shift(); + } + const child = children.shift(); + return this.visitNode(child, { exports: { export: true, default: defaultExport } }); + }; + this.visitExpressionStatement = (node, properties) => { + let children = node.children; + const child = children.shift(); + if (match_1.default(child, 'internal_module')) { + return this.visitInternalModule(child, properties); + } + return this.visitNonTerminal(node); + }; + /* Modules */ + this.visitInternalModule = (node, properties) => { + let children = node.children.map(child => { + if (match_1.default(child, 'statement_block')) { + return ast_1.createASTNode(this.source, node, this.visitChildren(this.filterType(child, 'comment'))); + } + return this.visitNode(child); + }); + return ast_1.createASTNode(this.source, node, children, Object.assign(properties || {}, { namespace: true })); + }; + /* Declarations */ + this.visitClass = (node, properties) => { + // Since 'interface' or 'class' is always first in the array + // we'll need to remove it from the array. + let children = node.children; + const interface_ = children.shift(); + let extends_ = false, implements_ = false; + if (this.hasInheritance(node)) { + const inheritance = this.getInheritanceType(node); + extends_ = inheritance === 'extends'; + implements_ = inheritance === 'implements'; + } + const node_ = ast_1.createASTNode(this.source, node, this.visitChildren(children), Object.assign(properties || {}, { + inheritance: { + implements: implements_, + extends: extends_ + } + })); + if (match_1.default(node, 'class')) { + return node_; + } + // Overwrite the node type from 'interface_declaration' to 'interface' + return Object.assign(node_, { type: interface_.type }); + }; + /* Non-terminals */ + this.visitNonTerminal = (node, properties) => { + let children = node.children; + // Handle special cases where some non-terminals + // contain comments which is what we care about + if (match_1.default(node, 'class_body', 'object_type')) { + children = this.filterType(node, 'comment'); + } + // Handle special cases where export statements have node properties + if (match_1.default(node, 'export_statement')) { + return this.visitExportStatement(node); + } + // Handle special cases where an internal module contains other nodes + if (match_1.default(node, 'internal_module')) { + return this.visitInternalModule(node, properties); + } + // Handle special cases where an intermal_module can exist in an expression_statement + if (match_1.default(node, 'expression_statement')) { + return this.visitExpressionStatement(node, properties); + } + return ast_1.createASTNode(this.source, node, this.visitChildren(children), properties); + }; + /* Terminals */ + this.visitTerminal = (node) => { + return ast_1.createASTNode(this.source, node); + }; + this.source = source; + } + /** + * Determines whether a node has inheritance + */ + hasInheritance(node) { + let inherits = false; + for (let i = 0; i < node.children.length; i++) { + const child = node.children[i]; + if (match_1.default(child, 'extends', 'implements')) { + inherits = true; + } + } + return inherits; + } + /** + * Returns a node's inheritance type + */ + getInheritanceType(node) { + for (let i = 0; i < node.children.length; i++) { + const child = node.children[i]; + if (match_1.default(child, 'extends')) { + return 'extends'; + } + if (match_1.default(child, 'implements')) { + return 'implements'; + } + } + } + /** + * Determines whether an export is default + */ + hasDefaultExport(node) { + for (let i = 0; i < node.children.length; i++) { + const child = node.children[i]; + if (match_1.default(child, 'default')) { + return true; + } + } + return false; + } + /** + * Returns only the comments from a node's children. + */ + filterType(node, type) { + // console.time('filterType') + let children = []; + for (let i = 0; i < node.children.length; i++) { + const child = node.children[i]; + if (match_1.default(child, type)) { + children.push(child); + } + } + // console.timeEnd('filterType') + return children; + } + getAST() { + return this.ast; + } +} +exports.JavaScriptVisitor = JavaScriptVisitor; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2phdmFzY3JpcHQvdmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHVDQUF1RDtBQUN2RCxpREFBdUQ7QUFHdkQsaURBQThDO0FBRTlDLDRCQUE0QjtBQUM1Qix5Q0FBaUQ7QUFDakQsNkNBQXNDO0FBR3RDOztHQUVHO0FBQ0gsTUFBYSxpQkFBaUI7SUFHNUIsWUFBWSxNQUFjO1FBRmxCLFFBQUcsR0FBYyxFQUFFLENBQUE7UUFxRTNCLGVBQWU7UUFFZixjQUFTLEdBQUcsQ0FDVixJQUFnQixFQUNoQixVQUFvQyxFQUNwQyxFQUFFO1lBQ0YsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNqQixLQUFLLFNBQVM7b0JBQ1osSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNuQyxNQUFNO2dCQUNSLEtBQUssU0FBUztvQkFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pDLEtBQUssU0FBUyxDQUFDO2dCQUNmLEtBQUssT0FBTztvQkFDVixhQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO29CQUM5RCxNQUFNO2dCQUNSO29CQUVFLCtCQUErQjtvQkFFL0IsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUNaLFlBQVksRUFDWixtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFDM0QsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQ3pFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQ3RFLG1CQUFtQixFQUFFLFlBQVksRUFDakMsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixrQkFBa0Is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LENBQUMsR0FBRyxDQUFDO0lBQ2xCLENBQUM7Q0ErUEY7QUFuVUQsOENBbVVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlQVNUTm9kZSwgQVNUTm9kZSB9IGZyb20gXCIuLi9jb21tb24vYXN0XCI7XHJcbmltcG9ydCB7IGlzSmF2YURvY0NvbW1lbnQgfSBmcm9tIFwiLi4vLi4vdXRpbHMvY29tbWVudFwiO1xyXG5pbXBvcnQgeyBOb2RlUHJvcGVydGllcywgTm9kZUluaGVyaXRhbmNlIH0gZnJvbSBcIi4uL2NvbW1vbi9lbWNhXCI7XHJcbmltcG9ydCB7IE5vZGVWaXNpdG9yIH0gZnJvbSBcIi4uL2NvbW1vbi9ub2RlXCI7XHJcbmltcG9ydCB7IHNpYmxpbmcgfSBmcm9tIFwiLi4vLi4vdXRpbHMvc2libGluZ1wiO1xyXG5pbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XHJcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcclxuaW1wb3J0IGxvZywgeyBFcnJvclR5cGUgfSBmcm9tIFwiLi4vLi4vdXRpbHMvbG9nXCI7XHJcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi4vLi4vdXRpbHMvbWF0Y2hcIjtcclxuaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2VcIjtcclxuXHJcbi8qKlxyXG4gKiBBIGNsYXNzIHRoYXQgdmlzaXRzIEFTVE5vZGVzIGZyb20gYSBUeXBlU2NyaXB0IHRyZWUuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgSmF2YVNjcmlwdFZpc2l0b3IgaW1wbGVtZW50cyBOb2RlVmlzaXRvciB7XHJcbiAgcHJpdmF0ZSBhc3Q6IEFTVE5vZGVbXSA9IFtdXHJcbiAgcHJpdmF0ZSBzb3VyY2U6IFNvdXJjZVxyXG4gIGNvbnN0cnVjdG9yKHNvdXJjZTogU291cmNlKSB7XHJcbiAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgd2hldGhlciBhIG5vZGUgaGFzIGluaGVyaXRhbmNlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoYXNJbmhlcml0YW5jZShub2RlOiBTeW50YXhOb2RlKSB7XHJcbiAgICBsZXQgaW5oZXJpdHMgPSBmYWxzZTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XHJcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ2V4dGVuZHMnLCAnaW1wbGVtZW50cycpKSB7XHJcbiAgICAgICAgaW5oZXJpdHMgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaW5oZXJpdHNcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBub2RlJ3MgaW5oZXJpdGFuY2UgdHlwZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0SW5oZXJpdGFuY2VUeXBlKG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XHJcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ2V4dGVuZHMnKSkge1xyXG4gICAgICAgIHJldHVybiAnZXh0ZW5kcyc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ2ltcGxlbWVudHMnKSkge1xyXG4gICAgICAgIHJldHVybiAnaW1wbGVtZW50cyc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgd2hldGhlciBhbiBleHBvcnQgaXMgZGVmYXVsdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgaGFzRGVmYXVsdEV4cG9ydChub2RlOiBTeW50YXhOb2RlKTogYm9vbGVhbiB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xyXG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdkZWZhdWx0JykpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBvbmx5IHRoZSBjb21tZW50cyBmcm9tIGEgbm9kZSdzIGNoaWxkcmVuLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZmlsdGVyVHlwZShub2RlOiBTeW50YXhOb2RlLCB0eXBlOiBzdHJpbmcpOiBTeW50YXhOb2RlW10ge1xyXG4gICAgLy8gY29uc29sZS50aW1lKCdmaWx0ZXJUeXBlJylcclxuICAgIGxldCBjaGlsZHJlbjogU3ludGF4Tm9kZVtdID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xyXG4gICAgICBpZiAobWF0Y2goY2hpbGQsIHR5cGUpKSB7XHJcbiAgICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGNvbnNvbGUudGltZUVuZCgnZmlsdGVyVHlwZScpXHJcbiAgICByZXR1cm4gY2hpbGRyZW47XHJcbiAgfVxyXG5cclxuICBnZXRBU1QoKTogQVNUTm9kZVtdIHtcclxuICAgIHJldHVybiB0aGlzLmFzdDtcclxuICB9XHJcblxyXG4gIC8qIFZpc2l0b3JzICAqL1xyXG5cclxuICB2aXNpdE5vZGUgPSAoXHJcbiAgICBub2RlOiBTeW50YXhOb2RlLFxyXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+XHJcbiAgKSA9PiB7XHJcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xyXG4gICAgICBjYXNlICdwcm9ncmFtJzpcclxuICAgICAgICB0aGlzLmFzdCA9IHRoaXMudmlzaXRQcm9ncmFtKG5vZGUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdjb21tZW50JzpcclxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdENvbW1lbnQobm9kZSk7XHJcbiAgICAgIGNhc2UgJ01JU1NJTkcnOlxyXG4gICAgICBjYXNlICdFUlJPUic6XHJcbiAgICAgICAgbG9nLnJlcG9ydCh0aGlzLnNvdXJjZSwgbm9kZSwgRXJyb3JUeXBlLlRyZWVTaXR0ZXJQYXJzZUVycm9yKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuXHJcbiAgICAgICAgLyogTWF0Y2ggb3RoZXIgbm9uLXRlcm1pbmFscyAqL1xyXG5cclxuICAgICAgICBpZiAobWF0Y2gobm9kZSxcclxuICAgICAgICAgICdjb25zdHJhaW50JyxcclxuICAgICAgICAgICdmb3JtYWxfcGFyYW1ldGVycycsICdyZXF1aXJlZF9wYXJhbWV0ZXInLCAncmVzdF9wYXJhbWV0ZXInLFxyXG4gICAgICAgICAgJ3R5cGVfaWRlbnRpZmllcicsICd0eXBlX3BhcmFtZXRlcnMnLCAndHlwZV9wYXJhbWV0ZXInLCAndHlwZV9hbm5vdGF0aW9uJyxcclxuICAgICAgICAgICdvYmplY3RfdHlwZScsICdwcmVkZWZpbmVkX3R5cGUnLCAncGFyZW50aGVzaXplZF90eXBlJywgJ2xpdGVyYWxfdHlwZScsXHJcbiAgICAgICAgICAnaW50ZXJzZWN0aW9uX3R5cGUnLCAndW5pb25fdHlwZScsXHJcbiAgICAgICAgICAnY2xhc3NfYm9keScsXHJcbiAgICAgICAgICAnZXh0ZW5kc19jbGF1c2UnLFxyXG4gICAgICAgICAgJ3VuYXJ5X2V4cHJlc3Npb24nLCAnYmluYXJ5X2V4cHJlc3Npb24nLFxyXG4gICAgICAgICAgJ3N0YXRlbWVudF9ibG9jaycsICdyZXR1cm5fc3RhdGVtZW50JywgJ2V4cG9ydF9zdGF0ZW1lbnQnLCAnZXhwcmVzc2lvbl9zdGF0ZW1lbnQnLFxyXG4gICAgICAgICAgLy8gQSBjYWxsX3NpZ25hdHVyZSBjYW4gYWxzbyBiZSBhIG5vbi1jb250ZXh0dWFsIG5vZGVcclxuICAgICAgICAgICdjYWxsX3NpZ25hdHVyZScsXHJcbiAgICAgICAgICAnaW50ZXJuYWxfbW9kdWxlJ1xyXG4gICAgICAgICkpIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLnZpc2l0Tm9uVGVybWluYWwobm9kZSwgcHJvcGVydGllcylcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIE1hdGNoIHRlcm1pbmFscyAqL1xyXG4gICAgICAgIGlmIChtYXRjaChub2RlLFxyXG4gICAgICAgICAgJ2lkZW50aWZpZXInLCAnZXh0ZW5kcycsICdwcm9wZXJ0eV9pZGVudGlmaWVyJywgJ2FjY2Vzc2liaWxpdHlfbW9kaWZpZXInLFxyXG4gICAgICAgICAgJ3N0cmluZycsICd2b2lkJywgJ2Jvb2xlYW4nLCAnbnVsbCcsICd1bmRlZmluZWQnLCAnbnVtYmVyJywgJ3JldHVybicsXHJcbiAgICAgICAgICAnZ2V0JywgJ2Z1bmN0aW9uJywgJ25hbWVzcGFjZScsXHJcbiAgICAgICAgKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRUZXJtaW5hbChub2RlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgbG9nLnJlcG9ydCh0aGlzLnNvdXJjZSwgbm9kZSwgRXJyb3JUeXBlLk5vZGVUeXBlTm90WWV0U3VwcG9ydGVkKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHZpc2l0Q2hpbGRyZW4gPSAobm9kZXM6IFN5bnRheE5vZGVbXSk6IEFTVE5vZGVbXSA9PiB7XHJcbiAgICBsZXQgY2hpbGRyZW46IEFTVE5vZGVbXSA9IFtdO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBub2RlID0gbm9kZXNbaV07XHJcbiAgICAgIGlmICghbm9kZS50eXBlLm1hdGNoKC9bPD4oKXt9LDo7XFxbXFxdJnw9XFwrXFwtXFwqXFwvXS8pICYmIG5vZGUudHlwZSAhPT0gJy4uLicpIHtcclxuICAgICAgICBjb25zdCBjaGlsZCA9IHRoaXMudmlzaXROb2RlKG5vZGUpO1xyXG4gICAgICAgIGlmIChjaGlsZCkgY2hpbGRyZW4ucHVzaChjaGlsZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjaGlsZHJlbjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdmlzaXRQcm9ncmFtID0gKG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlW10gPT4ge1xyXG4gICAgbGV0IHZpc2l0ZWQgPSB7fSxcclxuICAgICAgZ2V0U3RhcnRMb2NhdGlvbiA9IChuOiBBU1ROb2RlKSA9PiBgJHtuLmxvY2F0aW9uLnJvdy5zdGFydH06JHtuLmxvY2F0aW9uLmNvbHVtbi5zdGFydH1gO1xyXG4gICAgLy8gQSBwcm9ncmFtIGNhbiBoYXZlIG1vZHVsZXMsIG5hbWVzcGFjZXMsIGNvbW1lbnRzIGFzIGl0cyBjaGlsZHJlblxyXG4gICAgLy8gVGhlIGZpcnN0IHN0ZXAgaXMgdG8gcGFyc2UgYWxsIHRoZSBjb21tZW50cyBpbiB0aGUgcm9vdCBub2RlXHJcbiAgICBsZXQgY29tbWVudHMgPSB0aGlzLnZpc2l0Q2hpbGRyZW4odGhpcy5maWx0ZXJUeXBlKG5vZGUsICdjb21tZW50JykpO1xyXG4gICAgLy8gUGFyc2UgdGhlIG5hbWVzcGFjZXMgaW4gZXhwcmVzc2lvbl9zdGF0ZW1lbnRcclxuICAgIC8vIGxldCBuYW1lc3BhY2VzID0gdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShub2RlLCAnZXhwcmVzc2lvbl9zdGF0ZW1lbnQnKSk7XHJcbiAgICAvLyBQYXJzZSB0aGUgZXhwb3J0IHN0YXRlbWVudHMgaW4gdGhlIHJvb3Qgbm9kZVxyXG4gICAgbGV0IGV4cG9ydHMgPSB0aGlzLnZpc2l0Q2hpbGRyZW4odGhpcy5maWx0ZXJUeXBlKG5vZGUsICdleHBvcnRfc3RhdGVtZW50JykpO1xyXG5cclxuICAgIC8vIEdldCB0aGUgdmlzaXRlZCBjb250ZXh0IG5vZGVzXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGNvbW1lbnQgPSBjb21tZW50c1tpXTtcclxuICAgICAgY29uc3QgY29udGV4dCA9IGNvbW1lbnQ7XHJcbiAgICAgIHZpc2l0ZWRbZ2V0U3RhcnRMb2NhdGlvbihjb250ZXh0KV0gPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEV4cG9ydHMgYXJlIG9kZGJhbGxzIHNpbmNlIHNvbWUgZXhwb3J0cyBtYXkgcmVmZXJlbmNlXHJcbiAgICAvLyBhIHR5cGUvbm9kZSB0aGF0IG1heSBoYXZlIGJlZW4gY29tbWVudGVkLlxyXG4gICAgLy8gV2UnbGwgZmlyc3QgbmVlZCB0byBmaWx0ZXIgdGhlIG9uZXMgd2UgaGF2ZSB2aXNpdGVkXHJcbiAgICBfLnJlbW92ZShleHBvcnRzLCB4ID0+IHZpc2l0ZWRbZ2V0U3RhcnRMb2NhdGlvbih4KV0pO1xyXG5cclxuICAgIC8vIEZyb20gdGhlIG9uZXMgd2UgaGF2ZSBub3QgdmlzaXRlZCwgd2UnbGwgbmVlZCB0byBtb2RpZnlcclxuICAgIC8vIHRoZSBub2RlIHByb3BlcnRpZXMgb2YgZWFjaCBjb250ZXh0IGluIGEgY29tbWVudCBub2RlIHRoYXRcclxuICAgIC8vIG1hdGNoZXMgdGhlIG9uZXMgd2UgaGF2ZSBub3QgdmlzaXRlZC5cclxuICAgIGNvbnN0IG1hdGNoZWQgPSB7fTtcclxuICAgIGNvbW1lbnRzID0gXy5jb21wYWN0KFxyXG4gICAgICBjb21tZW50cy5tYXAoY29tbWVudCA9PiB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBvcnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBjb25zdCBleHBvcnRfID0gZXhwb3J0c1tpXTtcclxuICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSBjb21tZW50LmNvbnRleHQ7XHJcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbnRleHQuY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRleHQuY2hpbGRyZW5baV0udHlwZSA9PT0gZXhwb3J0Xy50eXBlKSB7XHJcbiAgICAgICAgICAgICAgbWF0Y2hlZFtnZXRTdGFydExvY2F0aW9uKGV4cG9ydF8pXSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgY29tbWVudC5jb250ZXh0LnByb3BlcnRpZXMgPSBPYmplY3QuYXNzaWduKFxyXG4gICAgICAgICAgICAgICAgY29tbWVudC5jb250ZXh0LnByb3BlcnRpZXMgfHwge30sXHJcbiAgICAgICAgICAgICAgICBleHBvcnRfLnByb3BlcnRpZXNcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb21tZW50O1xyXG4gICAgICB9KSk7XHJcblxyXG4gICAgLy8gUmVtb3ZlZCB0aGUgbWF0Y2hlZCBleHBvcnRzXHJcbiAgICBfLnJlbW92ZShleHBvcnRzLCB4ID0+IG1hdGNoZWRbZ2V0U3RhcnRMb2NhdGlvbih4KV0pXHJcblxyXG4gICAgcmV0dXJuIFtdLmNvbmNhdChjb21tZW50cykuY29uY2F0KGV4cG9ydHMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB2aXNpdENvbW1lbnQgPSAobm9kZTogU3ludGF4Tm9kZSk6IEFTVE5vZGUgPT4ge1xyXG4gICAgaWYgKGlzSmF2YURvY0NvbW1lbnQodGhpcy5zb3VyY2UsIG5vZGUpKSB7XHJcbiAgICAgIGNvbnN0IG5leHRTaWJsaW5nID0gc2libGluZyhub2RlKTtcclxuICAgICAgaWYgKG5leHRTaWJsaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIHRoaXMudmlzaXRDb250ZXh0KG5leHRTaWJsaW5nLCB7fSksIHRydWUpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFZpc2l0IHRoZSBjb250ZXh0dWFsIG5vZGVcclxuICAgKiBcclxuICAgKiAjIFJlbWFya1xyXG4gICAqIFxyXG4gICAqIEEgbm9kZSBpcyBjb25zaWRlcmVkIGNvbnRleHR1YWwgd2hlbiBhIGNvbW1lbnQgaXMgdmlzaXRlZCBhbmQgdGhlIG5vZGUgaXMgaXRzIHNpYmxpbmcuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB2aXNpdENvbnRleHQgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XHJcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xyXG4gICAgICBjYXNlICdleHBvcnRfc3RhdGVtZW50JzpcclxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdEV4cG9ydFN0YXRlbWVudChub2RlLCBwcm9wZXJ0aWVzKTtcclxuICAgICAgY2FzZSAnZXhwcmVzc2lvbl9zdGF0ZW1lbnQnOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChub2RlLCBwcm9wZXJ0aWVzKTtcclxuICAgICAgY2FzZSAnY2xhc3MnOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0Q2xhc3Mobm9kZSwgcHJvcGVydGllcylcclxuICAgICAgY2FzZSAnZnVuY3Rpb24nOlxyXG4gICAgICBjYXNlICdjYWxsX3NpZ25hdHVyZSc6XHJcbiAgICAgIGNhc2UgJ21ldGhvZF9zaWduYXR1cmUnOlxyXG4gICAgICBjYXNlICdwcm9wZXJ0eV9zaWduYXR1cmUnOlxyXG4gICAgICBjYXNlICdwdWJsaWNfZmllbGRfZGVmaW5pdGlvbic6XHJcbiAgICAgIGNhc2UgJ21ldGhvZF9kZWZpbml0aW9uJzpcclxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdE5vblRlcm1pbmFsKG5vZGUsIHByb3BlcnRpZXMpO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGxvZy5yZXBvcnQodGhpcy5zb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFlldFN1cHBvcnRlZCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiBTdGF0ZW1lbnRzICovXHJcblxyXG4gIHByaXZhdGUgdmlzaXRFeHBvcnRTdGF0ZW1lbnQgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XHJcbiAgICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuLCBkZWZhdWx0RXhwb3J0ID0gZmFsc2U7XHJcbiAgICAvLyBSZW1vdmUgJ2V4cG9ydCcgc2luY2UgaXQncyBhbHdheXMgZmlyc3QgaW4gdGhlIGFycmF5XHJcbiAgICBjaGlsZHJlbi5zaGlmdCgpO1xyXG4gICAgaWYgKHRoaXMuaGFzRGVmYXVsdEV4cG9ydChub2RlKSkge1xyXG4gICAgICBkZWZhdWx0RXhwb3J0ID0gdHJ1ZTtcclxuICAgICAgLy8gUmVtb3ZlICdkZWZhdWx0JyBleHBvcnRcclxuICAgICAgY2hpbGRyZW4uc2hpZnQoKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW4uc2hpZnQoKTtcclxuICAgIHJldHVybiB0aGlzLnZpc2l0Tm9kZShjaGlsZCwgeyBleHBvcnRzOiB7IGV4cG9ydDogdHJ1ZSwgZGVmYXVsdDogZGVmYXVsdEV4cG9ydCB9IH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllczogUGFydGlhbDxOb2RlUHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcclxuICAgIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XHJcbiAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuLnNoaWZ0KCk7XHJcbiAgICBpZiAobWF0Y2goY2hpbGQsICdpbnRlcm5hbF9tb2R1bGUnKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy52aXNpdEludGVybmFsTW9kdWxlKGNoaWxkLCBwcm9wZXJ0aWVzKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMudmlzaXROb25UZXJtaW5hbChub2RlKTtcclxuICB9XHJcblxyXG4gIC8qIE1vZHVsZXMgKi9cclxuXHJcbiAgcHJpdmF0ZSB2aXNpdEludGVybmFsTW9kdWxlID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xyXG4gICAgbGV0IGNoaWxkcmVuOiBBU1ROb2RlW10gPSBub2RlLmNoaWxkcmVuLm1hcChjaGlsZCA9PiB7XHJcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ3N0YXRlbWVudF9ibG9jaycpKSB7XHJcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIHRoaXMudmlzaXRDaGlsZHJlbih0aGlzLmZpbHRlclR5cGUoY2hpbGQsICdjb21tZW50JykpKVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzLnZpc2l0Tm9kZShjaGlsZCk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCBjaGlsZHJlbiwgT2JqZWN0LmFzc2lnbihwcm9wZXJ0aWVzIHx8IHt9LCB7IG5hbWVzcGFjZTogdHJ1ZSB9KSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyogRGVjbGFyYXRpb25zICovXHJcblxyXG4gIHByaXZhdGUgdmlzaXRDbGFzcyA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcclxuICAgIC8vIFNpbmNlICdpbnRlcmZhY2UnIG9yICdjbGFzcycgaXMgYWx3YXlzIGZpcnN0IGluIHRoZSBhcnJheVxyXG4gICAgLy8gd2UnbGwgbmVlZCB0byByZW1vdmUgaXQgZnJvbSB0aGUgYXJyYXkuXHJcbiAgICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xyXG4gICAgY29uc3QgaW50ZXJmYWNlXyA9IGNoaWxkcmVuLnNoaWZ0KCk7XHJcbiAgICBsZXQgZXh0ZW5kc18gPSBmYWxzZSwgaW1wbGVtZW50c18gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLmhhc0luaGVyaXRhbmNlKG5vZGUpKSB7XHJcbiAgICAgIGNvbnN0IGluaGVyaXRhbmNlID0gdGhpcy5nZXRJbmhlcml0YW5jZVR5cGUobm9kZSlcclxuICAgICAgZXh0ZW5kc18gPSBpbmhlcml0YW5jZSA9PT0gJ2V4dGVuZHMnO1xyXG4gICAgICBpbXBsZW1lbnRzXyA9IGluaGVyaXRhbmNlID09PSAnaW1wbGVtZW50cyc7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgbm9kZV8gPSBjcmVhdGVBU1ROb2RlKFxyXG4gICAgICB0aGlzLnNvdXJjZSxcclxuICAgICAgbm9kZSxcclxuICAgICAgdGhpcy52aXNpdENoaWxkcmVuKGNoaWxkcmVuKSxcclxuICAgICAgT2JqZWN0LmFzc2lnbihwcm9wZXJ0aWVzIHx8IHt9LCB7XHJcbiAgICAgICAgaW5oZXJpdGFuY2U6IHtcclxuICAgICAgICAgIGltcGxlbWVudHM6IGltcGxlbWVudHNfLFxyXG4gICAgICAgICAgZXh0ZW5kczogZXh0ZW5kc19cclxuICAgICAgICB9IGFzIE5vZGVJbmhlcml0YW5jZVxyXG4gICAgICB9KSk7XHJcblxyXG4gICAgaWYgKG1hdGNoKG5vZGUsICdjbGFzcycpKSB7XHJcbiAgICAgIHJldHVybiBub2RlXztcclxuICAgIH1cclxuICAgIC8vIE92ZXJ3cml0ZSB0aGUgbm9kZSB0eXBlIGZyb20gJ2ludGVyZmFjZV9kZWNsYXJhdGlvbicgdG8gJ2ludGVyZmFjZSdcclxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5vZGVfLCB7IHR5cGU6IGludGVyZmFjZV8udHlwZSB9KVxyXG4gIH1cclxuXHJcbiAgLyogTm9uLXRlcm1pbmFscyAqL1xyXG5cclxuICBwcml2YXRlIHZpc2l0Tm9uVGVybWluYWwgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XHJcbiAgICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xyXG4gICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZXMgd2hlcmUgc29tZSBub24tdGVybWluYWxzXHJcbiAgICAvLyBjb250YWluIGNvbW1lbnRzIHdoaWNoIGlzIHdoYXQgd2UgY2FyZSBhYm91dFxyXG4gICAgaWYgKG1hdGNoKG5vZGUsICdjbGFzc19ib2R5JywgJ29iamVjdF90eXBlJykpIHtcclxuICAgICAgY2hpbGRyZW4gPSB0aGlzLmZpbHRlclR5cGUobm9kZSwgJ2NvbW1lbnQnKTtcclxuICAgIH1cclxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2VzIHdoZXJlIGV4cG9ydCBzdGF0ZW1lbnRzIGhhdmUgbm9kZSBwcm9wZXJ0aWVzXHJcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2V4cG9ydF9zdGF0ZW1lbnQnKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy52aXNpdEV4cG9ydFN0YXRlbWVudChub2RlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBhbiBpbnRlcm5hbCBtb2R1bGUgY29udGFpbnMgb3RoZXIgbm9kZXNcclxuICAgIGlmIChtYXRjaChub2RlLCAnaW50ZXJuYWxfbW9kdWxlJykpIHtcclxuICAgICAgcmV0dXJuIHRoaXMudmlzaXRJbnRlcm5hbE1vZHVsZShub2RlLCBwcm9wZXJ0aWVzKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBhbiBpbnRlcm1hbF9tb2R1bGUgY2FuIGV4aXN0IGluIGFuIGV4cHJlc3Npb25fc3RhdGVtZW50XHJcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2V4cHJlc3Npb25fc3RhdGVtZW50JykpIHtcclxuICAgICAgcmV0dXJuIHRoaXMudmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KG5vZGUsIHByb3BlcnRpZXMpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENoaWxkcmVuKGNoaWxkcmVuKSwgcHJvcGVydGllcyk7XHJcbiAgfVxyXG5cclxuICAvKiBUZXJtaW5hbHMgKi9cclxuXHJcbiAgcHJpdmF0ZSB2aXNpdFRlcm1pbmFsID0gKG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlID0+IHtcclxuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlKVxyXG4gIH1cclxufSJdfQ== \ No newline at end of file diff --git a/build/src/lang/typescript/Node.d.ts b/build/src/lang/typescript/Node.d.ts deleted file mode 100644 index 1de75fc..0000000 --- a/build/src/lang/typescript/Node.d.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { DocumentationNode } from 'xdoc-parser/src/XDocASTNode'; -import { RemarkNode } from 'xdoc-parser/src/XDocParser'; -import { SyntaxNode } from "tree-sitter"; -import Source from "../../interfaces/Source"; -import TextRange from "../../interfaces/TextRange"; -export interface ASTNode extends TextRange { - text: string; - properties?: any; - comment?: { - markdown: RemarkNode; - documentation: Partial; - }; -} -export declare function createASTNode(source: Source, node: SyntaxNode, document?: boolean): ASTNode; -export interface NodeProperties { - exports: Partial; - inheritance: Partial; -} -export interface NodeExports { - export: boolean; - default: boolean; -} -export interface NodeInheritance { - extends: boolean; - implements: boolean; -} diff --git a/build/src/lang/typescript/Node.js b/build/src/lang/typescript/Node.js deleted file mode 100644 index fce58ae..0000000 --- a/build/src/lang/typescript/Node.js +++ /dev/null @@ -1,14 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const text_1 = require("../../utils/text"); -const range_1 = require("../../utils/range"); -const xdoc_parser_1 = require("xdoc-parser"); -function createASTNode(source, node, document) { - let node_ = Object.assign({}, range_1.default(node), { text: text_1.text(source, node) }); - if (document) { - node_ = Object.assign(node_, { comment: xdoc_parser_1.default(node_.text).parse() }); - } - return node_; -} -exports.createASTNode = createASTNode; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvTm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUdBLDJDQUF3QztBQUN4Qyw2Q0FBc0M7QUFHdEMsNkNBQStCO0FBWS9CLFNBQWdCLGFBQWEsQ0FDM0IsTUFBYyxFQUNkLElBQWdCLEVBQ2hCLFFBQWtCO0lBR2xCLElBQUksS0FBSyxxQkFBUSxlQUFLLENBQUMsSUFBSSxDQUFDLElBQUUsSUFBSSxFQUFFLFdBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUUsQ0FBQTtJQUV4RCxJQUFJLFFBQVEsRUFBRTtRQUNaLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxxQkFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7S0FDcEU7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFaRCxzQ0FZQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERvY3VtZW50YXRpb25Ob2RlIH0gZnJvbSAneGRvYy1wYXJzZXIvc3JjL1hEb2NBU1ROb2RlJztcbmltcG9ydCB7IFJlbWFya05vZGUgfSBmcm9tICd4ZG9jLXBhcnNlci9zcmMvWERvY1BhcnNlcic7XG5pbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgeyB0ZXh0IH0gZnJvbSBcIi4uLy4uL3V0aWxzL3RleHRcIjtcbmltcG9ydCByYW5nZSBmcm9tIFwiLi4vLi4vdXRpbHMvcmFuZ2VcIjtcbmltcG9ydCBTb3VyY2UgZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvU291cmNlXCI7XG5pbXBvcnQgVGV4dFJhbmdlIGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL1RleHRSYW5nZVwiO1xuaW1wb3J0IHhkb2MgZnJvbSAneGRvYy1wYXJzZXInO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQVNUTm9kZSBleHRlbmRzIFRleHRSYW5nZSB7XG4gIHRleHQ6IHN0cmluZyxcbiAgcHJvcGVydGllcz86IGFueVxuICBjb21tZW50Pzoge1xuICAgIG1hcmtkb3duOiBSZW1hcmtOb2RlLFxuICAgIGRvY3VtZW50YXRpb246IFBhcnRpYWw8RG9jdW1lbnRhdGlvbk5vZGU+XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFTVE5vZGUoXG4gIHNvdXJjZTogU291cmNlLCBcbiAgbm9kZTogU3ludGF4Tm9kZSwgXG4gIGRvY3VtZW50PzogYm9vbGVhbixcbik6IEFTVE5vZGUge1xuXG4gIGxldCBub2RlXyA9IHsgLi4ucmFuZ2Uobm9kZSksIHRleHQ6IHRleHQoc291cmNlLCBub2RlKSB9XG5cbiAgaWYgKGRvY3VtZW50KSB7XG4gICAgbm9kZV8gPSBPYmplY3QuYXNzaWduKG5vZGVfLCB7IGNvbW1lbnQ6IHhkb2Mobm9kZV8udGV4dCkucGFyc2UoKSB9KVxuICB9XG4gIHJldHVybiBub2RlXztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb2RlUHJvcGVydGllcyB7XG4gIGV4cG9ydHM6IFBhcnRpYWw8Tm9kZUV4cG9ydHM+XG4gIGluaGVyaXRhbmNlOiBQYXJ0aWFsPE5vZGVJbmhlcml0YW5jZT5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb2RlRXhwb3J0cyB7XG4gIGV4cG9ydDogYm9vbGVhbixcbiAgZGVmYXVsdDogYm9vbGVhblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vZGVJbmhlcml0YW5jZSB7XG4gIGV4dGVuZHM6IGJvb2xlYW4sXG4gIGltcGxlbWVudHM6IGJvb2xlYW5cbn0iXX0= \ No newline at end of file diff --git a/build/src/lang/typescript/index.d.ts b/build/src/lang/typescript/index.d.ts index 1027695..3f98f69 100644 --- a/build/src/lang/typescript/index.d.ts +++ b/build/src/lang/typescript/index.d.ts @@ -1,4 +1,5 @@ -import IParser from '../../interfaces/IParser'; +import * as Parser from 'tree-sitter'; +import ParserInterface from '../../interfaces/ParserInterface'; import Source from '../../interfaces/Source'; /** * A class that parses JavaScript comments. @@ -11,10 +12,12 @@ import Source from '../../interfaces/Source'; * @export default * ``` */ -export default class TypeScriptParser implements IParser { +export default class TypeScriptParser implements ParserInterface { private source; private options; private parser; - constructor(file: Source, options: any); + private tree_; + constructor(source: Source, options: any); parse: () => import("../common/ast").ASTNode[]; + readonly tree: Parser.Tree; } diff --git a/build/src/lang/typescript/index.js b/build/src/lang/typescript/index.js index 55fae94..f601683 100644 --- a/build/src/lang/typescript/index.js +++ b/build/src/lang/typescript/index.js @@ -16,21 +16,24 @@ const visitor_1 = require("./visitor"); * ``` */ class TypeScriptParser { - constructor(file, options) { + constructor(source, options) { this.parse = () => { - const tree = this.parser.parse(this.source.text); const visitor = new visitor_1.TypeScriptVisitor(this.source); - const root = walk_1.default(tree.rootNode); - console.time('visit'); + const root = walk_1.default(this.tree.rootNode); + // console.time('visit') root.visit(visitor); - console.timeEnd('visit'); + // console.timeEnd('visit') return visitor.getAST(); }; - this.source = file; + this.source = source; Object.assign(this.options = {}, options || {}); this.parser = new Parser(); this.parser.setLanguage(TypeScript); + this.tree_ = this.parser.parse(this.source.text); + } + get tree() { + return this.tree; } } exports.default = TypeScriptParser; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy90eXBlc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNDO0FBQ3RDLHFEQUFxRDtBQUdyRCwyQ0FBb0M7QUFDcEMsdUNBQThDO0FBSTlDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFxQixnQkFBZ0I7SUFJbkMsWUFBWSxJQUFZLEVBQUUsT0FBWTtRQU10QyxVQUFLLEdBQUcsR0FBRyxFQUFFO1lBQ1gsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqRCxNQUFNLE9BQU8sR0FBRyxJQUFJLDJCQUFpQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuRCxNQUFNLElBQUksR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUNuQixPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBRXhCLE9BQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzFCLENBQUMsQ0FBQTtRQWRDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN0QyxDQUFDO0NBV0Y7QUFwQkQsbUNBb0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcbmltcG9ydCAqIGFzIFR5cGVTY3JpcHQgZnJvbSAndHJlZS1zaXR0ZXItdHlwZXNjcmlwdCc7XG5pbXBvcnQgSVBhcnNlciBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lQYXJzZXInO1xuaW1wb3J0IFNvdXJjZSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZSc7XG5pbXBvcnQgd2FsayBmcm9tICcuLi8uLi91dGlscy93YWxrJztcbmltcG9ydCB7IFR5cGVTY3JpcHRWaXNpdG9yIH0gZnJvbSAnLi92aXNpdG9yJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vLi4vdXRpbHMvbG9nJztcblxuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCBwYXJzZXMgSmF2YVNjcmlwdCBjb21tZW50cy5cbiAqIFxuICogIyBBUElcbiAqIFxuICogYGBgXG4gKiBAY2xhc3MgSmF2YVNjcmlwdFBhcnNlclxuICogQGltcGxlbWVudHMgSVBhcnNlclxuICogQGV4cG9ydCBkZWZhdWx0XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVHlwZVNjcmlwdFBhcnNlciBpbXBsZW1lbnRzIElQYXJzZXIge1xuICBwcml2YXRlIHNvdXJjZTogU291cmNlO1xuICBwcml2YXRlIG9wdGlvbnM6IGFueTtcbiAgcHJpdmF0ZSBwYXJzZXI6IFBhcnNlcjtcbiAgY29uc3RydWN0b3IoZmlsZTogU291cmNlLCBvcHRpb25zOiBhbnkpIHtcbiAgICB0aGlzLnNvdXJjZSA9IGZpbGU7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdGlvbnMgPSB7fSwgb3B0aW9ucyB8fCB7fSk7XG4gICAgdGhpcy5wYXJzZXIgPSBuZXcgUGFyc2VyKCk7XG4gICAgdGhpcy5wYXJzZXIuc2V0TGFuZ3VhZ2UoVHlwZVNjcmlwdCk7XG4gIH1cbiAgcGFyc2UgPSAoKSA9PiB7XG4gICAgY29uc3QgdHJlZSA9IHRoaXMucGFyc2VyLnBhcnNlKHRoaXMuc291cmNlLnRleHQpO1xuICAgIGNvbnN0IHZpc2l0b3IgPSBuZXcgVHlwZVNjcmlwdFZpc2l0b3IodGhpcy5zb3VyY2UpO1xuICAgIGNvbnN0IHJvb3QgPSB3YWxrKHRyZWUucm9vdE5vZGUpO1xuICAgIGNvbnNvbGUudGltZSgndmlzaXQnKVxuICAgIHJvb3QudmlzaXQodmlzaXRvcilcbiAgICBjb25zb2xlLnRpbWVFbmQoJ3Zpc2l0JylcblxuICAgIHJldHVybiB2aXNpdG9yLmdldEFTVCgpO1xuICB9XG59XG4iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy90eXBlc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNDO0FBQ3RDLHFEQUFxRDtBQUdyRCwyQ0FBb0M7QUFDcEMsdUNBQThDO0FBSTlDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFxQixnQkFBZ0I7SUFLbkMsWUFBWSxNQUFjLEVBQUUsT0FBWTtRQU94QyxVQUFLLEdBQUcsR0FBRyxFQUFFO1lBQ1gsTUFBTSxPQUFPLEdBQUcsSUFBSSwyQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbkQsTUFBTSxJQUFJLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEMsd0JBQXdCO1lBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDbkIsMkJBQTJCO1lBQzNCLE9BQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzFCLENBQUMsQ0FBQTtRQWJDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQVVELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0NBQ0Y7QUF4QkQsbUNBd0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcclxuaW1wb3J0ICogYXMgVHlwZVNjcmlwdCBmcm9tICd0cmVlLXNpdHRlci10eXBlc2NyaXB0JztcclxuaW1wb3J0IFBhcnNlckludGVyZmFjZSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL1BhcnNlckludGVyZmFjZSc7XHJcbmltcG9ydCBTb3VyY2UgZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2UnO1xyXG5pbXBvcnQgd2FsayBmcm9tICcuLi8uLi91dGlscy93YWxrJztcclxuaW1wb3J0IHsgVHlwZVNjcmlwdFZpc2l0b3IgfSBmcm9tICcuL3Zpc2l0b3InO1xyXG5pbXBvcnQgbG9nIGZyb20gJy4uLy4uL3V0aWxzL2xvZyc7XHJcblxyXG5cclxuLyoqXHJcbiAqIEEgY2xhc3MgdGhhdCBwYXJzZXMgSmF2YVNjcmlwdCBjb21tZW50cy5cclxuICogXHJcbiAqICMgQVBJXHJcbiAqIFxyXG4gKiBgYGBcclxuICogQGNsYXNzIEphdmFTY3JpcHRQYXJzZXJcclxuICogQGltcGxlbWVudHMgSVBhcnNlclxyXG4gKiBAZXhwb3J0IGRlZmF1bHRcclxuICogYGBgXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUeXBlU2NyaXB0UGFyc2VyIGltcGxlbWVudHMgUGFyc2VySW50ZXJmYWNlIHtcclxuICBwcml2YXRlIHNvdXJjZTogU291cmNlO1xyXG4gIHByaXZhdGUgb3B0aW9uczogYW55O1xyXG4gIHByaXZhdGUgcGFyc2VyOiBQYXJzZXI7XHJcbiAgcHJpdmF0ZSB0cmVlXzogUGFyc2VyLlRyZWU7XHJcbiAgY29uc3RydWN0b3Ioc291cmNlOiBTb3VyY2UsIG9wdGlvbnM6IGFueSkge1xyXG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XHJcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucyA9IHt9LCBvcHRpb25zIHx8IHt9KTtcclxuICAgIHRoaXMucGFyc2VyID0gbmV3IFBhcnNlcigpO1xyXG4gICAgdGhpcy5wYXJzZXIuc2V0TGFuZ3VhZ2UoVHlwZVNjcmlwdCk7XHJcbiAgICB0aGlzLnRyZWVfID0gdGhpcy5wYXJzZXIucGFyc2UodGhpcy5zb3VyY2UudGV4dCk7XHJcbiAgfVxyXG4gIHBhcnNlID0gKCkgPT4ge1xyXG4gICAgY29uc3QgdmlzaXRvciA9IG5ldyBUeXBlU2NyaXB0VmlzaXRvcih0aGlzLnNvdXJjZSk7XHJcbiAgICBjb25zdCByb290ID0gd2Fsayh0aGlzLnRyZWUucm9vdE5vZGUpO1xyXG4gICAgLy8gY29uc29sZS50aW1lKCd2aXNpdCcpXHJcbiAgICByb290LnZpc2l0KHZpc2l0b3IpXHJcbiAgICAvLyBjb25zb2xlLnRpbWVFbmQoJ3Zpc2l0JylcclxuICAgIHJldHVybiB2aXNpdG9yLmdldEFTVCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRyZWUgKCk6IFBhcnNlci5UcmVlIHtcclxuICAgIHJldHVybiB0aGlzLnRyZWU7XHJcbiAgfVxyXG59XHJcbiJdfQ== \ No newline at end of file diff --git a/build/src/lang/typescript/public_field_definition.visitor.d.ts b/build/src/lang/typescript/public_field_definition.visitor.d.ts deleted file mode 100644 index ab5bf40..0000000 --- a/build/src/lang/typescript/public_field_definition.visitor.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SyntaxNode } from "tree-sitter"; -import IFile from "../../interfaces/IFile"; -export declare function visitPublicFieldDefinition(source: IFile, node: SyntaxNode, comment: SyntaxNode): { - type: string; - context: import("./Node").Node; - comment: import("./Node").Node; - identifier: any; - accessibility: string; - type_annotation: any; -}; diff --git a/build/src/lang/typescript/public_field_definition.visitor.js b/build/src/lang/typescript/public_field_definition.visitor.js deleted file mode 100644 index 4ace70a..0000000 --- a/build/src/lang/typescript/public_field_definition.visitor.js +++ /dev/null @@ -1,30 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const match_1 = require("../../utils/match"); -const text_1 = require("../../utils/text"); -const type_visitor_1 = require("./visitors/type.visitor"); -const Node_1 = require("./Node"); -function visitPublicFieldDefinition(source, node, comment) { - let public_field_definition = node.children; - let accessibility = 'public', identifier, type_annotation; - if (match_1.default(public_field_definition[0], 'accessibility_modifier')) { - accessibility = text_1.text(source, public_field_definition.shift()); - } - if (match_1.default(public_field_definition[0], 'property_identifier')) { - identifier = Node_1.createNode(source, public_field_definition.shift()); - } - if (match_1.default(public_field_definition[0], 'type_annotation')) { - let type = public_field_definition.shift().children[1]; - type_annotation = type_visitor_1.visitType(source, type); - } - return { - type: 'property', - context: Node_1.createNode(source, node), - comment: Node_1.createNode(source, comment, null, true), - identifier, - accessibility, - type_annotation - }; -} -exports.visitPublicFieldDefinition = visitPublicFieldDefinition; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2ZpZWxkX2RlZmluaXRpb24udmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvcHVibGljX2ZpZWxkX2RlZmluaXRpb24udmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLDZDQUFzQztBQUN0QywyQ0FBd0M7QUFDeEMsMERBQW9EO0FBQ3BELGlDQUFvQztBQUdwQyxTQUFnQiwwQkFBMEIsQ0FBQyxNQUFhLEVBQUUsSUFBZ0IsRUFBRSxPQUFtQjtJQUM3RixJQUFJLHVCQUF1QixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDNUMsSUFBSSxhQUFhLEdBQUcsUUFBUSxFQUMxQixVQUFVLEVBQ1YsZUFBZSxDQUFDO0lBRWxCLElBQUksZUFBSyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxFQUFFLHdCQUF3QixDQUFDLEVBQUU7UUFDL0QsYUFBYSxHQUFHLFdBQUksQ0FBQyxNQUFNLEVBQUUsdUJBQXVCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUMvRDtJQUVELElBQUksZUFBSyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxFQUFFLHFCQUFxQixDQUFDLEVBQUU7UUFDNUQsVUFBVSxHQUFHLGlCQUFVLENBQUMsTUFBTSxFQUFFLHVCQUF1QixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDbEU7SUFFRCxJQUFJLGVBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFO1FBQ3hELElBQUksSUFBSSxHQUFHLHVCQUF1QixDQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RCxlQUFlLEdBQUcsd0JBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDM0M7SUFDRCxPQUFPO1FBQ0wsSUFBSSxFQUFFLFVBQVU7UUFDaEIsT0FBTyxFQUFFLGlCQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztRQUNqQyxPQUFPLEVBQUUsaUJBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7UUFDaEQsVUFBVTtRQUNWLGFBQWE7UUFDYixlQUFlO0tBQ2hCLENBQUE7QUFDSCxDQUFDO0FBMUJELGdFQTBCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcclxuaW1wb3J0IG1hdGNoIGZyb20gXCIuLi8uLi91dGlscy9tYXRjaFwiO1xyXG5pbXBvcnQgeyB0ZXh0IH0gZnJvbSBcIi4uLy4uL3V0aWxzL3RleHRcIjtcclxuaW1wb3J0IHsgdmlzaXRUeXBlIH0gZnJvbSBcIi4vdmlzaXRvcnMvdHlwZS52aXNpdG9yXCI7XHJcbmltcG9ydCB7IGNyZWF0ZU5vZGUgfSBmcm9tIFwiLi9Ob2RlXCI7XHJcbmltcG9ydCBJRmlsZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9JRmlsZVwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHZpc2l0UHVibGljRmllbGREZWZpbml0aW9uKHNvdXJjZTogSUZpbGUsIG5vZGU6IFN5bnRheE5vZGUsIGNvbW1lbnQ6IFN5bnRheE5vZGUpIHtcclxuICBsZXQgcHVibGljX2ZpZWxkX2RlZmluaXRpb24gPSBub2RlLmNoaWxkcmVuO1xyXG4gIGxldCBhY2Nlc3NpYmlsaXR5ID0gJ3B1YmxpYycsXHJcbiAgICBpZGVudGlmaWVyLFxyXG4gICAgdHlwZV9hbm5vdGF0aW9uO1xyXG5cclxuICBpZiAobWF0Y2gocHVibGljX2ZpZWxkX2RlZmluaXRpb25bMF0sICdhY2Nlc3NpYmlsaXR5X21vZGlmaWVyJykpIHtcclxuICAgIGFjY2Vzc2liaWxpdHkgPSB0ZXh0KHNvdXJjZSwgcHVibGljX2ZpZWxkX2RlZmluaXRpb24uc2hpZnQoKSk7XHJcbiAgfVxyXG5cclxuICBpZiAobWF0Y2gocHVibGljX2ZpZWxkX2RlZmluaXRpb25bMF0sICdwcm9wZXJ0eV9pZGVudGlmaWVyJykpIHtcclxuICAgIGlkZW50aWZpZXIgPSBjcmVhdGVOb2RlKHNvdXJjZSwgcHVibGljX2ZpZWxkX2RlZmluaXRpb24uc2hpZnQoKSk7XHJcbiAgfVxyXG5cclxuICBpZiAobWF0Y2gocHVibGljX2ZpZWxkX2RlZmluaXRpb25bMF0sICd0eXBlX2Fubm90YXRpb24nKSkge1xyXG4gICAgbGV0IHR5cGUgPSBwdWJsaWNfZmllbGRfZGVmaW5pdGlvbi5zaGlmdCgpLmNoaWxkcmVuWzFdO1xyXG4gICAgdHlwZV9hbm5vdGF0aW9uID0gdmlzaXRUeXBlKHNvdXJjZSwgdHlwZSk7XHJcbiAgfVxyXG4gIHJldHVybiB7XHJcbiAgICB0eXBlOiAncHJvcGVydHknLFxyXG4gICAgY29udGV4dDogY3JlYXRlTm9kZShzb3VyY2UsIG5vZGUpLFxyXG4gICAgY29tbWVudDogY3JlYXRlTm9kZShzb3VyY2UsIGNvbW1lbnQsIG51bGwsIHRydWUpLFxyXG4gICAgaWRlbnRpZmllcixcclxuICAgIGFjY2Vzc2liaWxpdHksXHJcbiAgICB0eXBlX2Fubm90YXRpb25cclxuICB9XHJcbn0iXX0= \ No newline at end of file diff --git a/build/src/lang/typescript/visitor.js b/build/src/lang/typescript/visitor.js index ef9835a..2916aaf 100644 --- a/build/src/lang/typescript/visitor.js +++ b/build/src/lang/typescript/visitor.js @@ -26,7 +26,7 @@ class TypeScriptVisitor { break; default: /* Match other non-terminals */ - if (match_1.default(node, 'constraint', 'formal_parameters', 'required_parameter', 'type_identifier', 'type_parameters', 'type_parameter', 'type_annotation', 'object_type', 'predefined_type', 'parenthesized_type', 'literal_type', 'intersection_type', 'union_type', 'class_body', 'extends_clause', 'unary_expression', 'binary_expression', 'statement_block', 'return_statement', 'export_statement', 'expression_statement', + if (match_1.default(node, 'constraint', 'formal_parameters', 'required_parameter', 'rest_parameter', 'type_identifier', 'type_parameters', 'type_parameter', 'type_annotation', 'object_type', 'predefined_type', 'parenthesized_type', 'literal_type', 'intersection_type', 'union_type', 'class_body', 'extends_clause', 'unary_expression', 'binary_expression', 'statement_block', 'return_statement', 'export_statement', 'expression_statement', // A call_signature can also be a non-contextual node 'call_signature', 'internal_module')) { return this.visitNonTerminal(node, properties); @@ -43,7 +43,7 @@ class TypeScriptVisitor { let children = []; for (let i = 0; i < nodes.length; i++) { const node = nodes[i]; - if (!node.type.match(/[<>(){},:;\[\]&|=\+\-\*\/]/)) { + if (!node.type.match(/[<>(){},:;\[\]&|=\+\-\*\/]/) && node.type !== '...') { const child = this.visitNode(node); if (child) children.push(child); @@ -67,27 +67,30 @@ class TypeScriptVisitor { visited[getStartLocation(context)] = true; } // Remove the visited nodes from namespaces array - namespaces = _.remove(namespaces, x => !visited[getStartLocation(x)]); + _.remove(namespaces, x => visited[getStartLocation(x)]); // Exports are oddballs since some exports may reference // a type/node that may have been commented. // We'll first need to filter the ones we have visited - exports = _.remove(exports, x => !visited[getStartLocation(x)]); + _.remove(exports, x => visited[getStartLocation(x)]); // From the ones we have not visited, we'll need to modify // the node properties of each context in a comment node that // matches the ones we have not visited. const matched = {}; - comments = _.remove(comments.map(comment => { + comments = _.compact(comments.map(comment => { for (let i = 0; i < exports.length; i++) { const export_ = exports[i]; - if (comment.context.type === export_.type) { - matched[getStartLocation(export_)] = true; - comment.context.properties = Object.assign(comment.context.properties || {}, export_.properties); - return comment; + const context = comment.context; + for (let j = 0; j < context.children.length; j++) { + if (context.children[i].type === export_.type) { + matched[getStartLocation(export_)] = true; + comment.context.properties = Object.assign(comment.context.properties || {}, export_.properties); + } } } - }), (comment) => !comment); + return comment; + })); // Removed the matched exports - exports = _.remove(exports, x => !matched[getStartLocation(x)]); + _.remove(exports, x => matched[getStartLocation(x)]); return [].concat(comments).concat(namespaces).concat(exports); }; this.visitComment = (node) => { @@ -268,4 +271,4 @@ class TypeScriptVisitor { } } exports.TypeScriptVisitor = TypeScriptVisitor; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHVDQUF1RDtBQUN2RCxpREFBdUQ7QUFHdkQsaURBQThDO0FBRTlDLDRCQUE0QjtBQUM1Qix5Q0FBaUQ7QUFDakQsNkNBQXNDO0FBR3RDOztHQUVHO0FBQ0gsTUFBYSxpQkFBaUI7SUFHNUIsWUFBWSxNQUFjO1FBRmxCLFFBQUcsR0FBYyxFQUFFLENBQUE7UUFxRTNCLGVBQWU7UUFFZixjQUFTLEdBQUcsQ0FDVixJQUFnQixFQUNoQixVQUFvQyxFQUNwQyxFQUFFO1lBQ0YsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNqQixLQUFLLFNBQVM7b0JBQ1osSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNuQyxNQUFNO2dCQUNSLEtBQUssU0FBUztvQkFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pDLEtBQUssU0FBUyxDQUFDO2dCQUNmLEtBQUssT0FBTztvQkFDVixhQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO29CQUM5RCxNQUFNO2dCQUNSO29CQUVFLCtCQUErQjtvQkFFL0IsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUNaLFlBQVksRUFDWixtQkFBbUIsRUFBRSxvQkFBb0IsRUFDekMsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQ3pFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQ3RFLG1CQUFtQixFQUFFLFlBQVksRUFDakMsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixrQkFBa0IsRUFBRSxtQkFBbUIsRUFDdkMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsc0JBQXNCO29CQUNqRixxREFBcUQ7b0JBQ3JELGdCQUFnQixFQUNoQixpQkFBaUIsQ0FDbEIsRUFBRTt3QkFDRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUE7cUJBQy9DO29CQUVELHFCQUFxQjtvQkFDckIsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUNaLFlBQVksRUFBRSxTQUFTLEVBQUUscUJBQXFCLEVBQUUsd0JBQXdCLEVBQ3hFLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFDcEUsS0FBSyxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQy9CLEVBQUU7d0JBQ0QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUNqQztvQkFDRCxhQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO29CQUNqRSxNQUFNO2FBQ1Q7UUFDSCxDQUFDLENBQUE7UUFFRCxrQkFBYSxHQUFHLENBQUMsS0FBbUIsRUFBYSxFQUFFO1lBQ2pELElBQUksUUFBUSxHQUFjLEVBQUUsQ0FBQztZQUM3QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDckMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsRUFBRTtvQkFDbEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDbkMsSUFBSSxLQUFLO3dCQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ2pDO2FBQ0Y7WUFDRCxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDLENBQUE7UUFFTyxpQkFBWSxHQUFHLENBQUMsSUFBZ0IsRUFBYSxFQUFFO1lBQ3JELElBQUksT0FBTyxHQUFHLEVBQUUsRUFDZCxnQkFBZ0IsR0FBRyxDQUFDLENBQVUsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDMUYsbUVBQW1FO1lBQ25FLCtEQUErRDtZQUMvRCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDcEUsK0NBQStDO1lBQy9DLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLENBQUMsQ0FBQyxDQUFDO1lBQ25GLCtDQUErQztZQUMvQyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQztZQUU1RSxnQ0FBZ0M7WUFDaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3hDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUIsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDO2dCQUN4QixPQUFPLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7YUFDM0M7WUFFRCxpREFBaUQ7WUFDakQsVUFBVSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXRFLHdEQUF3RDtZQUN4RCw0Q0FBNEM7WUFDNUMsc0RBQXNEO1lBQ3RELE9BQU8sR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVoRSwwREFBMEQ7WUFDMUQsNkRBQTZEO1lBQzdELHdDQUF3QztZQUN4QyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDbkIsUUFBUSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQ2pCLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ3JCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUN2QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzNCLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLElBQUksRUFBRTt3QkFDekMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO3dCQUMxQyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUN4QyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsSUFBSSxFQUFFLEVBQ2hDLE9BQU8sQ0FBQyxVQUFVLENBQ25CLENBQUM7d0JBQ0YsT0FBTyxPQUFPLENBQUM7cUJBQ2hCO2lCQUNGO1lBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFN0IsOEJBQThCO1lBQzlCLE9BQU8sR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUUvRCxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUE7UUFFTyxpQkFBWSxHQUFHLENBQUMsSUFBZ0IsRUFBVyxFQUFFO1lBQ25ELElBQUksMEJBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDdkMsTUFBTSxXQUFXLEdBQUcsaUJBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbEMsSUFBSSxXQUFXLEVBQUU7b0JBQ2YsT0FBTyxtQkFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBO2lCQUNsRjthQUNGO1FBQ0gsQ0FBQyxDQUFBO1FBRUQ7Ozs7OztXQU1HO1FBQ0ssaUJBQVksR0FBRyxDQUFDLElBQWdCLEVBQUUsVUFBb0MsRUFBVyxFQUFFO1lBQ3pGLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDakIsS0FBSyxrQkFBa0I7b0JBQ3JCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDckQsS0FBSyxzQkFBc0I7b0JBQ3pCLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDekQsS0FBSyxPQUFPLENBQUM7Z0JBQ2IsS0FBSyx1QkFBdUI7b0JBQzFCLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQTtnQkFDckQsS0FBSyxVQUFVLENBQUM7Z0JBQ2hCLEtBQUssZ0JBQWdCLENBQUM7Z0JBQ3RCLEtBQUssa0JBQWtCLENBQUM7Z0JBQ3hCLEtBQUssb0JBQW9CLENBQUM7Z0JBQzFCLEtBQUsseUJBQXlCLENBQUM7Z0JBQy9CLEtBQUssbUJBQW1CO29CQUN0QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQ2pEO29CQUNFLGFBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsZUFBUyxDQUFDLHVCQUF1QixDQUFDLENBQUM7b0JBQ2pFLE1BQU07YUFDVDtRQUNILENBQUMsQ0FBQTtRQUVELGdCQUFnQjtRQUVSLHlCQUFvQixHQUFHLENBQUMsSUFBZ0IsRUFBRSxVQUFvQyxFQUFXLEVBQUU7WUFDakcsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBQ3BELHVEQUF1RDtZQUN2RCxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDakIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQy9CLGFBQWEsR0FBRyxJQUFJLENBQUM7Z0JBQ3JCLDBCQUEwQjtnQkFDMUIsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO2FBQ2xCO1lBQ0QsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQy9CLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdEYsQ0FBQyxDQUFBO1FBRU8sNkJBQXdCLEdBQUcsQ0FBQyxJQUFnQixFQUFFLFVBQW1DLEVBQVcsRUFBRTtZQUNwRyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQzdCLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMvQixJQUFJLGVBQUssQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLENBQUMsRUFBRTtnQkFDbkMsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFBO2FBQ25EO1lBQ0QsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFBO1FBRUQsYUFBYTtRQUVMLHdCQUFtQixHQUFHLENBQUMsSUFBZ0IsRUFBRSxVQUFvQyxFQUFXLEVBQUU7WUFDaEcsSUFBSSxRQUFRLEdBQWMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2xELElBQUksZUFBSyxDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxFQUFFO29CQUNuQyxPQUFPLG1CQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUE7aUJBQy9GO2dCQUNELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQixDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sbUJBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxRyxDQUFDLENBQUE7UUFHRCxrQkFBa0I7UUFFViwwQkFBcUIsR0FBRyxDQUFDLElBQWdCLEVBQUUsVUFBb0MsRUFBVyxFQUFFO1lBQ2xHLDREQUE0RDtZQUM1RCwwQ0FBMEM7WUFDMUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUM3QixNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDcEMsSUFBSSxRQUFRLEdBQUcsS0FBSyxFQUFFLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDMUMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUM3QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQ2pELFFBQVEsR0FBRyxXQUFXLEtBQUssU0FBUyxDQUFDO2dCQUNyQyxXQUFXLEdBQUcsV0FBVyxLQUFLLFlBQVksQ0FBQzthQUM1QztZQUVELE1BQU0sS0FBSyxHQUFHLG1CQUFhLENBQ3pCLElBQUksQ0FBQyxNQUFNLEVBQ1gsSUFBSSxFQUNKLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQzVCLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLEVBQUUsRUFBRTtnQkFDOUIsV0FBVyxFQUFFO29CQUNYLFVBQVUsRUFBRSxXQUFXO29CQUN2QixPQUFPLEVBQUUsUUFBUTtpQkFDQzthQUNyQixDQUFDLENBQUMsQ0FBQztZQUVOLElBQUksZUFBSyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsRUFBRTtnQkFDeEIsT0FBTyxLQUFLLENBQUM7YUFDZDtZQUNELHNFQUFzRTtZQUN0RSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQ3hELENBQUMsQ0FBQTtRQUVELG1CQUFtQjtRQUVYLHFCQUFnQixHQUFHLENBQUMsSUFBZ0IsRUFBRSxVQUFvQyxFQUFXLEVBQUU7WUFDN0YsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUM3QixnREFBZ0Q7WUFDaEQsK0NBQStDO1lBQy9DLElBQUksZUFBSyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsYUFBYSxDQUFDLEVBQUU7Z0JBQzVDLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQzthQUM3QztZQUNELG9FQUFvRTtZQUNwRSxJQUFJLGVBQUssQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLENBQUMsRUFBRTtnQkFDbkMsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDeEM7WUFFRCxxRUFBcUU7WUFDckUsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLEVBQUU7Z0JBQ2xDLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQzthQUNuRDtZQUVELHFGQUFxRjtZQUNyRixJQUFJLGVBQUssQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLENBQUMsRUFBRTtnQkFDdkMsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2FBQ3hEO1lBR0QsT0FBTyxtQkFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDcEYsQ0FBQyxDQUFBO1FBRUQsZUFBZTtRQUVQLGtCQUFhLEdBQUcsQ0FBQyxJQUFnQixFQUFXLEVBQUU7WUFDcEQsT0FBTyxtQkFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDekMsQ0FBQyxDQUFBO1FBOVRDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNLLGNBQWMsQ0FBQyxJQUFnQjtRQUNyQyxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzdDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxlQUFLLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsRUFBRTtnQkFDekMsUUFBUSxHQUFHLElBQUksQ0FBQzthQUNqQjtTQUNGO1FBQ0QsT0FBTyxRQUFRLENBQUE7SUFDakIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssa0JBQWtCLENBQUMsSUFBZ0I7UUFDekMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzdDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxlQUFLLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxFQUFFO2dCQUMzQixPQUFPLFNBQVMsQ0FBQzthQUNsQjtZQUVELElBQUksZUFBSyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsRUFBRTtnQkFDOUIsT0FBTyxZQUFZLENBQUM7YUFDckI7U0FDRjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLGdCQUFnQixDQUFDLElBQWdCO1FBQ3ZDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM3QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksZUFBSyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsRUFBRTtnQkFDM0IsT0FBTyxJQUFJLENBQUM7YUFDYjtTQUNGO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7O09BRUc7SUFDSyxVQUFVLENBQUMsSUFBZ0IsRUFBRSxJQUFZO1FBQy9DLDZCQUE2QjtRQUM3QixJQUFJLFFBQVEsR0FBaUIsRUFBRSxDQUFDO1FBQ2hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM3QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksZUFBSyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDdEIsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN0QjtTQUNGO1FBQ0QsZ0NBQWdDO1FBQ2hDLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxNQUFNO1FBQ0osT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2xCLENBQUM7Q0ErUEY7QUFuVUQsOENBbVVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlQVNUTm9kZSwgQVNUTm9kZSB9IGZyb20gXCIuLi9jb21tb24vYXN0XCI7XG5pbXBvcnQgeyBpc0phdmFEb2NDb21tZW50IH0gZnJvbSBcIi4uLy4uL3V0aWxzL2NvbW1lbnRcIjtcbmltcG9ydCB7IE5vZGVQcm9wZXJ0aWVzLCBOb2RlSW5oZXJpdGFuY2UgfSBmcm9tIFwiLi4vY29tbW9uL2VtY2FcIjtcbmltcG9ydCB7IE5vZGVWaXNpdG9yIH0gZnJvbSBcIi4uL2NvbW1vbi9ub2RlXCI7XG5pbXBvcnQgeyBzaWJsaW5nIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3NpYmxpbmdcIjtcbmltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBsb2csIHsgRXJyb3JUeXBlIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2xvZ1wiO1xuaW1wb3J0IG1hdGNoIGZyb20gXCIuLi8uLi91dGlscy9tYXRjaFwiO1xuaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2VcIjtcblxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgdmlzaXRzIEFTVE5vZGVzIGZyb20gYSBUeXBlU2NyaXB0IHRyZWUuXG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlU2NyaXB0VmlzaXRvciBpbXBsZW1lbnRzIE5vZGVWaXNpdG9yIHtcbiAgcHJpdmF0ZSBhc3Q6IEFTVE5vZGVbXSA9IFtdXG4gIHByaXZhdGUgc291cmNlOiBTb3VyY2VcbiAgY29uc3RydWN0b3Ioc291cmNlOiBTb3VyY2UpIHtcbiAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBub2RlIGhhcyBpbmhlcml0YW5jZVxuICAgKi9cbiAgcHJpdmF0ZSBoYXNJbmhlcml0YW5jZShub2RlOiBTeW50YXhOb2RlKSB7XG4gICAgbGV0IGluaGVyaXRzID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdleHRlbmRzJywgJ2ltcGxlbWVudHMnKSkge1xuICAgICAgICBpbmhlcml0cyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbmhlcml0c1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBub2RlJ3MgaW5oZXJpdGFuY2UgdHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRJbmhlcml0YW5jZVR5cGUobm9kZTogU3ludGF4Tm9kZSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgaWYgKG1hdGNoKGNoaWxkLCAnZXh0ZW5kcycpKSB7XG4gICAgICAgIHJldHVybiAnZXh0ZW5kcyc7XG4gICAgICB9XG5cbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ2ltcGxlbWVudHMnKSkge1xuICAgICAgICByZXR1cm4gJ2ltcGxlbWVudHMnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gZXhwb3J0IGlzIGRlZmF1bHRcbiAgICovXG4gIHByaXZhdGUgaGFzRGVmYXVsdEV4cG9ydChub2RlOiBTeW50YXhOb2RlKTogYm9vbGVhbiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdkZWZhdWx0JykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG9ubHkgdGhlIGNvbW1lbnRzIGZyb20gYSBub2RlJ3MgY2hpbGRyZW4uXG4gICAqL1xuICBwcml2YXRlIGZpbHRlclR5cGUobm9kZTogU3ludGF4Tm9kZSwgdHlwZTogc3RyaW5nKTogU3ludGF4Tm9kZVtdIHtcbiAgICAvLyBjb25zb2xlLnRpbWUoJ2ZpbHRlclR5cGUnKVxuICAgIGxldCBjaGlsZHJlbjogU3ludGF4Tm9kZVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XG4gICAgICBpZiAobWF0Y2goY2hpbGQsIHR5cGUpKSB7XG4gICAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBjb25zb2xlLnRpbWVFbmQoJ2ZpbHRlclR5cGUnKVxuICAgIHJldHVybiBjaGlsZHJlbjtcbiAgfVxuXG4gIGdldEFTVCgpOiBBU1ROb2RlW10ge1xuICAgIHJldHVybiB0aGlzLmFzdDtcbiAgfVxuXG4gIC8qIFZpc2l0b3JzICAqL1xuXG4gIHZpc2l0Tm9kZSA9IChcbiAgICBub2RlOiBTeW50YXhOb2RlLFxuICAgIHByb3BlcnRpZXM/OiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPlxuICApID0+IHtcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSAncHJvZ3JhbSc6XG4gICAgICAgIHRoaXMuYXN0ID0gdGhpcy52aXNpdFByb2dyYW0obm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY29tbWVudCc6XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0Q29tbWVudChub2RlKTtcbiAgICAgIGNhc2UgJ01JU1NJTkcnOlxuICAgICAgY2FzZSAnRVJST1InOlxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuVHJlZVNpdHRlclBhcnNlRXJyb3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG5cbiAgICAgICAgLyogTWF0Y2ggb3RoZXIgbm9uLXRlcm1pbmFscyAqL1xuXG4gICAgICAgIGlmIChtYXRjaChub2RlLFxuICAgICAgICAgICdjb25zdHJhaW50JyxcbiAgICAgICAgICAnZm9ybWFsX3BhcmFtZXRlcnMnLCAncmVxdWlyZWRfcGFyYW1ldGVyJyxcbiAgICAgICAgICAndHlwZV9pZGVudGlmaWVyJywgJ3R5cGVfcGFyYW1ldGVycycsICd0eXBlX3BhcmFtZXRlcicsICd0eXBlX2Fubm90YXRpb24nLFxuICAgICAgICAgICdvYmplY3RfdHlwZScsICdwcmVkZWZpbmVkX3R5cGUnLCAncGFyZW50aGVzaXplZF90eXBlJywgJ2xpdGVyYWxfdHlwZScsXG4gICAgICAgICAgJ2ludGVyc2VjdGlvbl90eXBlJywgJ3VuaW9uX3R5cGUnLFxuICAgICAgICAgICdjbGFzc19ib2R5JyxcbiAgICAgICAgICAnZXh0ZW5kc19jbGF1c2UnLFxuICAgICAgICAgICd1bmFyeV9leHByZXNzaW9uJywgJ2JpbmFyeV9leHByZXNzaW9uJyxcbiAgICAgICAgICAnc3RhdGVtZW50X2Jsb2NrJywgJ3JldHVybl9zdGF0ZW1lbnQnLCAnZXhwb3J0X3N0YXRlbWVudCcsICdleHByZXNzaW9uX3N0YXRlbWVudCcsXG4gICAgICAgICAgLy8gQSBjYWxsX3NpZ25hdHVyZSBjYW4gYWxzbyBiZSBhIG5vbi1jb250ZXh0dWFsIG5vZGVcbiAgICAgICAgICAnY2FsbF9zaWduYXR1cmUnLFxuICAgICAgICAgICdpbnRlcm5hbF9tb2R1bGUnXG4gICAgICAgICkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdE5vblRlcm1pbmFsKG5vZGUsIHByb3BlcnRpZXMpXG4gICAgICAgIH1cblxuICAgICAgICAvKiBNYXRjaCB0ZXJtaW5hbHMgKi9cbiAgICAgICAgaWYgKG1hdGNoKG5vZGUsXG4gICAgICAgICAgJ2lkZW50aWZpZXInLCAnZXh0ZW5kcycsICdwcm9wZXJ0eV9pZGVudGlmaWVyJywgJ2FjY2Vzc2liaWxpdHlfbW9kaWZpZXInLFxuICAgICAgICAgICdzdHJpbmcnLCAndm9pZCcsICdib29sZWFuJywgJ251bGwnLCAndW5kZWZpbmVkJywgJ251bWJlcicsICdyZXR1cm4nLFxuICAgICAgICAgICdnZXQnLCAnZnVuY3Rpb24nLCAnbmFtZXNwYWNlJ1xuICAgICAgICApKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRUZXJtaW5hbChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2aXNpdENoaWxkcmVuID0gKG5vZGVzOiBTeW50YXhOb2RlW10pOiBBU1ROb2RlW10gPT4ge1xuICAgIGxldCBjaGlsZHJlbjogQVNUTm9kZVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgaWYgKCFub2RlLnR5cGUubWF0Y2goL1s8Pigpe30sOjtcXFtcXF0mfD1cXCtcXC1cXCpcXC9dLykpIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSB0aGlzLnZpc2l0Tm9kZShub2RlKTtcbiAgICAgICAgaWYgKGNoaWxkKSBjaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG5cbiAgcHJpdmF0ZSB2aXNpdFByb2dyYW0gPSAobm9kZTogU3ludGF4Tm9kZSk6IEFTVE5vZGVbXSA9PiB7XG4gICAgbGV0IHZpc2l0ZWQgPSB7fSxcbiAgICAgIGdldFN0YXJ0TG9jYXRpb24gPSAobjogQVNUTm9kZSkgPT4gYCR7bi5sb2NhdGlvbi5yb3cuc3RhcnR9OiR7bi5sb2NhdGlvbi5jb2x1bW4uc3RhcnR9YDtcbiAgICAvLyBBIHByb2dyYW0gY2FuIGhhdmUgbW9kdWxlcywgbmFtZXNwYWNlcywgY29tbWVudHMgYXMgaXRzIGNoaWxkcmVuXG4gICAgLy8gVGhlIGZpcnN0IHN0ZXAgaXMgdG8gcGFyc2UgYWxsIHRoZSBjb21tZW50cyBpbiB0aGUgcm9vdCBub2RlXG4gICAgbGV0IGNvbW1lbnRzID0gdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShub2RlLCAnY29tbWVudCcpKTtcbiAgICAvLyBQYXJzZSB0aGUgbmFtZXNwYWNlcyBpbiBleHByZXNzaW9uX3N0YXRlbWVudFxuICAgIGxldCBuYW1lc3BhY2VzID0gdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShub2RlLCAnZXhwcmVzc2lvbl9zdGF0ZW1lbnQnKSk7XG4gICAgLy8gUGFyc2UgdGhlIGV4cG9ydCBzdGF0ZW1lbnRzIGluIHRoZSByb290IG5vZGVcbiAgICBsZXQgZXhwb3J0cyA9IHRoaXMudmlzaXRDaGlsZHJlbih0aGlzLmZpbHRlclR5cGUobm9kZSwgJ2V4cG9ydF9zdGF0ZW1lbnQnKSk7XG5cbiAgICAvLyBHZXQgdGhlIHZpc2l0ZWQgY29udGV4dCBub2Rlc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNvbW1lbnQgPSBjb21tZW50c1tpXTtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBjb21tZW50O1xuICAgICAgdmlzaXRlZFtnZXRTdGFydExvY2F0aW9uKGNvbnRleHQpXSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHRoZSB2aXNpdGVkIG5vZGVzIGZyb20gbmFtZXNwYWNlcyBhcnJheVxuICAgIG5hbWVzcGFjZXMgPSBfLnJlbW92ZShuYW1lc3BhY2VzLCB4ID0+ICF2aXNpdGVkW2dldFN0YXJ0TG9jYXRpb24oeCldKTtcblxuICAgIC8vIEV4cG9ydHMgYXJlIG9kZGJhbGxzIHNpbmNlIHNvbWUgZXhwb3J0cyBtYXkgcmVmZXJlbmNlXG4gICAgLy8gYSB0eXBlL25vZGUgdGhhdCBtYXkgaGF2ZSBiZWVuIGNvbW1lbnRlZC5cbiAgICAvLyBXZSdsbCBmaXJzdCBuZWVkIHRvIGZpbHRlciB0aGUgb25lcyB3ZSBoYXZlIHZpc2l0ZWRcbiAgICBleHBvcnRzID0gXy5yZW1vdmUoZXhwb3J0cywgeCA9PiAhdmlzaXRlZFtnZXRTdGFydExvY2F0aW9uKHgpXSk7XG5cbiAgICAvLyBGcm9tIHRoZSBvbmVzIHdlIGhhdmUgbm90IHZpc2l0ZWQsIHdlJ2xsIG5lZWQgdG8gbW9kaWZ5XG4gICAgLy8gdGhlIG5vZGUgcHJvcGVydGllcyBvZiBlYWNoIGNvbnRleHQgaW4gYSBjb21tZW50IG5vZGUgdGhhdFxuICAgIC8vIG1hdGNoZXMgdGhlIG9uZXMgd2UgaGF2ZSBub3QgdmlzaXRlZC5cbiAgICBjb25zdCBtYXRjaGVkID0ge307XG4gICAgY29tbWVudHMgPSBfLnJlbW92ZShcbiAgICAgIGNvbW1lbnRzLm1hcChjb21tZW50ID0+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBvcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZXhwb3J0XyA9IGV4cG9ydHNbaV07XG4gICAgICAgICAgaWYgKGNvbW1lbnQuY29udGV4dC50eXBlID09PSBleHBvcnRfLnR5cGUpIHtcbiAgICAgICAgICAgIG1hdGNoZWRbZ2V0U3RhcnRMb2NhdGlvbihleHBvcnRfKV0gPSB0cnVlO1xuICAgICAgICAgICAgY29tbWVudC5jb250ZXh0LnByb3BlcnRpZXMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICBjb21tZW50LmNvbnRleHQucHJvcGVydGllcyB8fCB7fSxcbiAgICAgICAgICAgICAgZXhwb3J0Xy5wcm9wZXJ0aWVzXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGNvbW1lbnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSwgKGNvbW1lbnQpID0+ICFjb21tZW50KTtcblxuICAgIC8vIFJlbW92ZWQgdGhlIG1hdGNoZWQgZXhwb3J0c1xuICAgIGV4cG9ydHMgPSBfLnJlbW92ZShleHBvcnRzLCB4ID0+ICFtYXRjaGVkW2dldFN0YXJ0TG9jYXRpb24oeCldKVxuXG4gICAgcmV0dXJuIFtdLmNvbmNhdChjb21tZW50cykuY29uY2F0KG5hbWVzcGFjZXMpLmNvbmNhdChleHBvcnRzKTtcbiAgfVxuXG4gIHByaXZhdGUgdmlzaXRDb21tZW50ID0gKG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlID0+IHtcbiAgICBpZiAoaXNKYXZhRG9jQ29tbWVudCh0aGlzLnNvdXJjZSwgbm9kZSkpIHtcbiAgICAgIGNvbnN0IG5leHRTaWJsaW5nID0gc2libGluZyhub2RlKTtcbiAgICAgIGlmIChuZXh0U2libGluZykge1xuICAgICAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENvbnRleHQobmV4dFNpYmxpbmcsIHt9KSwgdHJ1ZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmlzaXQgdGhlIGNvbnRleHR1YWwgbm9kZVxuICAgKiBcbiAgICogIyBSZW1hcmtcbiAgICogXG4gICAqIEEgbm9kZSBpcyBjb25zaWRlcmVkIGNvbnRleHR1YWwgd2hlbiBhIGNvbW1lbnQgaXMgdmlzaXRlZCBhbmQgdGhlIG5vZGUgaXMgaXRzIHNpYmxpbmcuXG4gICAqL1xuICBwcml2YXRlIHZpc2l0Q29udGV4dCA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSAnZXhwb3J0X3N0YXRlbWVudCc6XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0RXhwb3J0U3RhdGVtZW50KG5vZGUsIHByb3BlcnRpZXMpO1xuICAgICAgY2FzZSAnZXhwcmVzc2lvbl9zdGF0ZW1lbnQnOlxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQobm9kZSwgcHJvcGVydGllcyk7XG4gICAgICBjYXNlICdjbGFzcyc6XG4gICAgICBjYXNlICdpbnRlcmZhY2VfZGVjbGFyYXRpb24nOlxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdENsYXNzT3JJbnRlcmZhY2Uobm9kZSwgcHJvcGVydGllcylcbiAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIGNhc2UgJ2NhbGxfc2lnbmF0dXJlJzpcbiAgICAgIGNhc2UgJ21ldGhvZF9zaWduYXR1cmUnOlxuICAgICAgY2FzZSAncHJvcGVydHlfc2lnbmF0dXJlJzpcbiAgICAgIGNhc2UgJ3B1YmxpY19maWVsZF9kZWZpbml0aW9uJzpcbiAgICAgIGNhc2UgJ21ldGhvZF9kZWZpbml0aW9uJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXROb25UZXJtaW5hbChub2RlLCBwcm9wZXJ0aWVzKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGxvZy5yZXBvcnQodGhpcy5zb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFlldFN1cHBvcnRlZCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qIFN0YXRlbWVudHMgKi9cblxuICBwcml2YXRlIHZpc2l0RXhwb3J0U3RhdGVtZW50ID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xuICAgIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4sIGRlZmF1bHRFeHBvcnQgPSBmYWxzZTtcbiAgICAvLyBSZW1vdmUgJ2V4cG9ydCcgc2luY2UgaXQncyBhbHdheXMgZmlyc3QgaW4gdGhlIGFycmF5XG4gICAgY2hpbGRyZW4uc2hpZnQoKTtcbiAgICBpZiAodGhpcy5oYXNEZWZhdWx0RXhwb3J0KG5vZGUpKSB7XG4gICAgICBkZWZhdWx0RXhwb3J0ID0gdHJ1ZTtcbiAgICAgIC8vIFJlbW92ZSAnZGVmYXVsdCcgZXhwb3J0XG4gICAgICBjaGlsZHJlbi5zaGlmdCgpO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuLnNoaWZ0KCk7XG4gICAgcmV0dXJuIHRoaXMudmlzaXROb2RlKGNoaWxkLCB7IGV4cG9ydHM6IHsgZXhwb3J0OiB0cnVlLCBkZWZhdWx0OiBkZWZhdWx0RXhwb3J0IH0gfSk7XG4gIH1cblxuICBwcml2YXRlIHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudCA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzOiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xuICAgIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbi5zaGlmdCgpO1xuICAgIGlmIChtYXRjaChjaGlsZCwgJ2ludGVybmFsX21vZHVsZScpKSB7XG4gICAgICByZXR1cm4gdGhpcy52aXNpdEludGVybmFsTW9kdWxlKGNoaWxkLCBwcm9wZXJ0aWVzKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy52aXNpdE5vblRlcm1pbmFsKG5vZGUpO1xuICB9XG5cbiAgLyogTW9kdWxlcyAqL1xuXG4gIHByaXZhdGUgdmlzaXRJbnRlcm5hbE1vZHVsZSA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcbiAgICBsZXQgY2hpbGRyZW46IEFTVE5vZGVbXSA9IG5vZGUuY2hpbGRyZW4ubWFwKGNoaWxkID0+IHtcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ3N0YXRlbWVudF9ibG9jaycpKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q2hpbGRyZW4odGhpcy5maWx0ZXJUeXBlKGNoaWxkLCAnY29tbWVudCcpKSlcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnZpc2l0Tm9kZShjaGlsZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIGNoaWxkcmVuLCBPYmplY3QuYXNzaWduKHByb3BlcnRpZXMgfHwge30sIHsgbmFtZXNwYWNlOiB0cnVlIH0pKTtcbiAgfVxuXG5cbiAgLyogRGVjbGFyYXRpb25zICovXG5cbiAgcHJpdmF0ZSB2aXNpdENsYXNzT3JJbnRlcmZhY2UgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XG4gICAgLy8gU2luY2UgJ2ludGVyZmFjZScgb3IgJ2NsYXNzJyBpcyBhbHdheXMgZmlyc3QgaW4gdGhlIGFycmF5XG4gICAgLy8gd2UnbGwgbmVlZCB0byByZW1vdmUgaXQgZnJvbSB0aGUgYXJyYXkuXG4gICAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgICBjb25zdCBpbnRlcmZhY2VfID0gY2hpbGRyZW4uc2hpZnQoKTtcbiAgICBsZXQgZXh0ZW5kc18gPSBmYWxzZSwgaW1wbGVtZW50c18gPSBmYWxzZTtcbiAgICBpZiAodGhpcy5oYXNJbmhlcml0YW5jZShub2RlKSkge1xuICAgICAgY29uc3QgaW5oZXJpdGFuY2UgPSB0aGlzLmdldEluaGVyaXRhbmNlVHlwZShub2RlKVxuICAgICAgZXh0ZW5kc18gPSBpbmhlcml0YW5jZSA9PT0gJ2V4dGVuZHMnO1xuICAgICAgaW1wbGVtZW50c18gPSBpbmhlcml0YW5jZSA9PT0gJ2ltcGxlbWVudHMnO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGVfID0gY3JlYXRlQVNUTm9kZShcbiAgICAgIHRoaXMuc291cmNlLFxuICAgICAgbm9kZSxcbiAgICAgIHRoaXMudmlzaXRDaGlsZHJlbihjaGlsZHJlbiksXG4gICAgICBPYmplY3QuYXNzaWduKHByb3BlcnRpZXMgfHwge30sIHtcbiAgICAgICAgaW5oZXJpdGFuY2U6IHtcbiAgICAgICAgICBpbXBsZW1lbnRzOiBpbXBsZW1lbnRzXyxcbiAgICAgICAgICBleHRlbmRzOiBleHRlbmRzX1xuICAgICAgICB9IGFzIE5vZGVJbmhlcml0YW5jZVxuICAgICAgfSkpO1xuXG4gICAgaWYgKG1hdGNoKG5vZGUsICdjbGFzcycpKSB7XG4gICAgICByZXR1cm4gbm9kZV87XG4gICAgfVxuICAgIC8vIE92ZXJ3cml0ZSB0aGUgbm9kZSB0eXBlIGZyb20gJ2ludGVyZmFjZV9kZWNsYXJhdGlvbicgdG8gJ2ludGVyZmFjZSdcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihub2RlXywgeyB0eXBlOiBpbnRlcmZhY2VfLnR5cGUgfSlcbiAgfVxuXG4gIC8qIE5vbi10ZXJtaW5hbHMgKi9cblxuICBwcml2YXRlIHZpc2l0Tm9uVGVybWluYWwgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XG4gICAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBzb21lIG5vbi10ZXJtaW5hbHNcbiAgICAvLyBjb250YWluIGNvbW1lbnRzIHdoaWNoIGlzIHdoYXQgd2UgY2FyZSBhYm91dFxuICAgIGlmIChtYXRjaChub2RlLCAnY2xhc3NfYm9keScsICdvYmplY3RfdHlwZScpKSB7XG4gICAgICBjaGlsZHJlbiA9IHRoaXMuZmlsdGVyVHlwZShub2RlLCAnY29tbWVudCcpO1xuICAgIH1cbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBleHBvcnQgc3RhdGVtZW50cyBoYXZlIG5vZGUgcHJvcGVydGllc1xuICAgIGlmIChtYXRjaChub2RlLCAnZXhwb3J0X3N0YXRlbWVudCcpKSB7XG4gICAgICByZXR1cm4gdGhpcy52aXNpdEV4cG9ydFN0YXRlbWVudChub2RlKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBhbiBpbnRlcm5hbCBtb2R1bGUgY29udGFpbnMgb3RoZXIgbm9kZXNcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2ludGVybmFsX21vZHVsZScpKSB7XG4gICAgICByZXR1cm4gdGhpcy52aXNpdEludGVybmFsTW9kdWxlKG5vZGUsIHByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2VzIHdoZXJlIGFuIGludGVybWFsX21vZHVsZSBjYW4gZXhpc3QgaW4gYW4gZXhwcmVzc2lvbl9zdGF0ZW1lbnRcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2V4cHJlc3Npb25fc3RhdGVtZW50JykpIHtcbiAgICAgIHJldHVybiB0aGlzLnZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChub2RlLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cblxuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q2hpbGRyZW4oY2hpbGRyZW4pLCBwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIC8qIFRlcm1pbmFscyAqL1xuXG4gIHByaXZhdGUgdmlzaXRUZXJtaW5hbCA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZSA9PiB7XG4gICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUpXG4gIH1cbn0iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHVDQUF1RDtBQUN2RCxpREFBdUQ7QUFHdkQsaURBQThDO0FBRTlDLDRCQUE0QjtBQUM1Qix5Q0FBaUQ7QUFDakQsNkNBQXNDO0FBR3RDOztHQUVHO0FBQ0gsTUFBYSxpQkFBaUI7SUFHNUIsWUFBWSxNQUFjO1FBRmxCLFFBQUcsR0FBYyxFQUFFLENBQUE7UUFxRTNCLGVBQWU7UUFFZixjQUFTLEdBQUcsQ0FDVixJQUFnQixFQUNoQixVQUFvQyxFQUNwQyxFQUFFO1lBQ0YsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNqQixLQUFLLFNBQVM7b0JBQ1osSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNuQyxNQUFNO2dCQUNSLEtBQUssU0FBUztvQkFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pDLEtBQUssU0FBUyxDQUFDO2dCQUNmLEtBQUssT0FBTztvQkFDVixhQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO29CQUM5RCxNQUFNO2dCQUNSO29CQUVFLCtCQUErQjtvQkFFL0IsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUNaLFlBQVksRUFDWixtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFDM0QsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQ3pFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQ3RFLG1CQUFtQixFQUFFLFlBQVksRUFDakMsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixrQkFBa0IsRUFBRSxtQkFBbUIsRUFDdkMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsc0JBQXNCO29CQUNqRixxREFBcUQ7b0JBQ3JELGdCQUFnQixFQUNoQixpQkFBaUIsQ0FDbEIsRUFBRTt3QkFDRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUE7cUJBQy9DO29CQUVELHFCQUFxQjtvQkFDckIsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUNaLFlBQVksRUFBRSxTQUFTLEVBQUUscUJBQXFCLEVBQUUsd0JBQXdCLEVBQ3hFLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFDcEUsS0FBSyxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQy9CLEVBQUU7d0JBQ0QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUNqQztvQkFDRCxhQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO29CQUNqRSxNQUFNO2FBQ1Q7UUFDSCxDQUFDLENBQUE7UUFFRCxrQkFBYSxHQUFHLENBQUMsS0FBbUIsRUFBYSxFQUFFO1lBQ2pELElBQUksUUFBUSxHQUFjLEVBQUUsQ0FBQztZQUM3QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDckMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEtBQUssRUFBRTtvQkFDekUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDbkMsSUFBSSxLQUFLO3dCQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ2pDO2FBQ0Y7WUFDRCxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDLENBQUE7UUFFTyxpQkFBWSxHQUFHLENBQUMsSUFBZ0IsRUFBYSxFQUFFO1lBQ3JELElBQUksT0FBTyxHQUFHLEVBQUUsRUFDZCxnQkFBZ0IsR0FBRyxDQUFDLENBQVUsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDMUYsbUVBQW1FO1lBQ25FLCtEQUErRDtZQUMvRCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDcEUsK0NBQStDO1lBQy9DLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLENBQUMsQ0FBQyxDQUFDO1lBQ25GLCtDQUErQztZQUMvQyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQztZQUU1RSxnQ0FBZ0M7WUFDaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3hDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUIsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDO2dCQUN4QixPQUFPLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7YUFDM0M7WUFFRCxpREFBaUQ7WUFDakQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXhELHdEQUF3RDtZQUN4RCw0Q0FBNEM7WUFDNUMsc0RBQXNEO1lBQ3RELENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVyRCwwREFBMEQ7WUFDMUQsNkRBQTZEO1lBQzdELHdDQUF3QztZQUN4QyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDbkIsUUFBUSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQ2xCLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ3JCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUN2QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzNCLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7b0JBQ2hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTt3QkFDaEQsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsSUFBSSxFQUFFOzRCQUM3QyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7NEJBQzFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQ3hDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxJQUFJLEVBQUUsRUFDaEMsT0FBTyxDQUFDLFVBQVUsQ0FDbkIsQ0FBQzt5QkFDSDtxQkFDRjtpQkFDRjtnQkFDRCxPQUFPLE9BQU8sQ0FBQztZQUNqQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRU4sOEJBQThCO1lBQzlCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUVwRCxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUE7UUFFTyxpQkFBWSxHQUFHLENBQUMsSUFBZ0IsRUFBVyxFQUFFO1lBQ25ELElBQUksMEJBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDdkMsTUFBTSxXQUFXLEdBQUcsaUJBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbEMsSUFBSSxXQUFXLEVBQUU7b0JBQ2YsT0FBTyxtQkFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBO2lCQUNsRjthQUNGO1FBQ0gsQ0FBQyxDQUFBO1FBRUQ7Ozs7OztXQU1HO1FBQ0ssaUJBQVksR0FBRyxDQUFDLElBQWdCLEVBQUUsVUFBb0MsRUFBVyxFQUFFO1lBQ3pGLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDakIsS0FBSyxrQkFBa0I7b0JBQ3JCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDckQsS0FBSyxzQkFBc0I7b0JBQ3pCLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDekQsS0FBSyxPQUFPLENBQUM7Z0JBQ2IsS0FBSyx1QkFBdUI7b0JBQzFCLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQTtnQkFDckQsS0FBSyxVQUFVLENBQUM7Z0JBQ2hCLEtBQUssZ0JBQWdCLENBQUM7Z0JBQ3RCLEtBQUssa0JBQWtCLENBQUM7Z0JBQ3hCLEtBQUssb0JBQW9CLENBQUM7Z0JBQzFCLEtBQUsseUJBQXlCLENBQUM7Z0JBQy9CLEtBQUssbUJBQW1CO29CQUN0QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQ2pEO29CQUNFLGFBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsZUFBUyxDQUFDLHVCQUF1QixDQUFDLENBQUM7b0JBQ2pFLE1BQU07YUFDVDtRQUNILENBQUMsQ0FBQTtRQUVELGdCQUFnQjtRQUVSLHlCQUFvQixHQUFHLENBQUMsSUFBZ0IsRUFBRSxVQUFvQyxFQUFXLEVBQUU7WUFDakcsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBQ3BELHVEQUF1RDtZQUN2RCxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDakIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQy9CLGFBQWEsR0FBRyxJQUFJLENBQUM7Z0JBQ3JCLDBCQUEwQjtnQkFDMUIsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO2FBQ2xCO1lBQ0QsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQy9CLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdEYsQ0FBQyxDQUFBO1FBRU8sNkJBQXdCLEdBQUcsQ0FBQyxJQUFnQixFQUFFLFVBQW1DLEVBQVcsRUFBRTtZQUNwRyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQzdCLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMvQixJQUFJLGVBQUssQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLENBQUMsRUFBRTtnQkFDbkMsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFBO2FBQ25EO1lBQ0QsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFBO1FBRUQsYUFBYTtRQUVMLHdCQUFtQixHQUFHLENBQUMsSUFBZ0IsRUFBRSxVQUFvQyxFQUFXLEVBQUU7WUFDaEcsSUFBSSxRQUFRLEdBQWMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2xELElBQUksZUFBSyxDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxFQUFFO29CQUNuQyxPQUFPLG1CQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUE7aUJBQy9GO2dCQUNELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQixDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sbUJBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxRyxDQUFDLENBQUE7UUFHRCxrQkFBa0I7UUFFViwwQkFBcUIsR0FBRyxDQUFDLElBQWdCLEVBQUUsVUFBb0MsRUFBVyxFQUFFO1lBQ2xHLDREQUE0RDtZQUM1RCwwQ0FBMEM7WUFDMUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUM3QixNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDcEMsSUFBSSxRQUFRLEdBQUcsS0FBSyxFQUFFLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDMUMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUM3QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQ2pELFFBQVEsR0FBRyxXQUFXLEtBQUssU0FBUyxDQUFDO2dCQUNyQyxXQUFXLEdBQUcsV0FBVyxLQUFLLFlBQVksQ0FBQzthQUM1QztZQUVELE1BQU0sS0FBSyxHQUFHLG1CQUFhLENBQ3pCLElBQUksQ0FBQyxNQUFNLEVBQ1gsSUFBSSxFQUNKLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQzVCLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLEVBQUUsRUFBRTtnQkFDOUIsV0FBVyxFQUFFO29CQUNYLFVBQVUsRUFBRSxXQUFXO29CQUN2QixPQUFPLEVBQUUsUUFBUTtpQkFDQzthQUNyQixDQUFDLENBQUMsQ0FBQztZQUVOLElBQUksZUFBSyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsRUFBRTtnQkFDeEIsT0FBTyxLQUFLLENBQUM7YUFDZDtZQUNELHNFQUFzRTtZQUN0RSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQ3hELENBQUMsQ0FBQTtRQUVELG1CQUFtQjtRQUVYLHFCQUFnQixHQUFHLENBQUMsSUFBZ0IsRUFBRSxVQUFvQyxFQUFXLEVBQUU7WUFDN0YsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUM3QixnREFBZ0Q7WUFDaEQsK0NBQStDO1lBQy9DLElBQUksZUFBSyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsYUFBYSxDQUFDLEVBQUU7Z0JBQzVDLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQzthQUM3QztZQUNELG9FQUFvRTtZQUNwRSxJQUFJLGVBQUssQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLENBQUMsRUFBRTtnQkFDbkMsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDeEM7WUFFRCxxRUFBcUU7WUFDckUsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLEVBQUU7Z0JBQ2xDLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQzthQUNuRDtZQUVELHFGQUFxRjtZQUNyRixJQUFJLGVBQUssQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLENBQUMsRUFBRTtnQkFDdkMsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2FBQ3hEO1lBR0QsT0FBTyxtQkFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDcEYsQ0FBQyxDQUFBO1FBRUQsZUFBZTtRQUVQLGtCQUFhLEdBQUcsQ0FBQyxJQUFnQixFQUFXLEVBQUU7WUFDcEQsT0FBTyxtQkFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDekMsQ0FBQyxDQUFBO1FBalVDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNLLGNBQWMsQ0FBQyxJQUFnQjtRQUNyQyxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzdDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxlQUFLLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsRUFBRTtnQkFDekMsUUFBUSxHQUFHLElBQUksQ0FBQzthQUNqQjtTQUNGO1FBQ0QsT0FBTyxRQUFRLENBQUE7SUFDakIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssa0JBQWtCLENBQUMsSUFBZ0I7UUFDekMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzdDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxlQUFLLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxFQUFFO2dCQUMzQixPQUFPLFNBQVMsQ0FBQzthQUNsQjtZQUVELElBQUksZUFBSyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsRUFBRTtnQkFDOUIsT0FBTyxZQUFZLENBQUM7YUFDckI7U0FDRjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLGdCQUFnQixDQUFDLElBQWdCO1FBQ3ZDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM3QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksZUFBSyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsRUFBRTtnQkFDM0IsT0FBTyxJQUFJLENBQUM7YUFDYjtTQUNGO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7O09BRUc7SUFDSyxVQUFVLENBQUMsSUFBZ0IsRUFBRSxJQUFZO1FBQy9DLDZCQUE2QjtRQUM3QixJQUFJLFFBQVEsR0FBaUIsRUFBRSxDQUFDO1FBQ2hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM3QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksZUFBSyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDdEIsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN0QjtTQUNGO1FBQ0QsZ0NBQWdDO1FBQ2hDLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxNQUFNO1FBQ0osT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2xCLENBQUM7Q0FrUUY7QUF0VUQsOENBc1VDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlQVNUTm9kZSwgQVNUTm9kZSB9IGZyb20gXCIuLi9jb21tb24vYXN0XCI7XHJcbmltcG9ydCB7IGlzSmF2YURvY0NvbW1lbnQgfSBmcm9tIFwiLi4vLi4vdXRpbHMvY29tbWVudFwiO1xyXG5pbXBvcnQgeyBOb2RlUHJvcGVydGllcywgTm9kZUluaGVyaXRhbmNlIH0gZnJvbSBcIi4uL2NvbW1vbi9lbWNhXCI7XHJcbmltcG9ydCB7IE5vZGVWaXNpdG9yIH0gZnJvbSBcIi4uL2NvbW1vbi9ub2RlXCI7XHJcbmltcG9ydCB7IHNpYmxpbmcgfSBmcm9tIFwiLi4vLi4vdXRpbHMvc2libGluZ1wiO1xyXG5pbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XHJcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcclxuaW1wb3J0IGxvZywgeyBFcnJvclR5cGUgfSBmcm9tIFwiLi4vLi4vdXRpbHMvbG9nXCI7XHJcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi4vLi4vdXRpbHMvbWF0Y2hcIjtcclxuaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2VcIjtcclxuXHJcbi8qKlxyXG4gKiBBIGNsYXNzIHRoYXQgdmlzaXRzIEFTVE5vZGVzIGZyb20gYSBUeXBlU2NyaXB0IHRyZWUuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVHlwZVNjcmlwdFZpc2l0b3IgaW1wbGVtZW50cyBOb2RlVmlzaXRvciB7XHJcbiAgcHJpdmF0ZSBhc3Q6IEFTVE5vZGVbXSA9IFtdXHJcbiAgcHJpdmF0ZSBzb3VyY2U6IFNvdXJjZVxyXG4gIGNvbnN0cnVjdG9yKHNvdXJjZTogU291cmNlKSB7XHJcbiAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgd2hldGhlciBhIG5vZGUgaGFzIGluaGVyaXRhbmNlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoYXNJbmhlcml0YW5jZShub2RlOiBTeW50YXhOb2RlKSB7XHJcbiAgICBsZXQgaW5oZXJpdHMgPSBmYWxzZTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XHJcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ2V4dGVuZHMnLCAnaW1wbGVtZW50cycpKSB7XHJcbiAgICAgICAgaW5oZXJpdHMgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaW5oZXJpdHNcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBub2RlJ3MgaW5oZXJpdGFuY2UgdHlwZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0SW5oZXJpdGFuY2VUeXBlKG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XHJcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ2V4dGVuZHMnKSkge1xyXG4gICAgICAgIHJldHVybiAnZXh0ZW5kcyc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ2ltcGxlbWVudHMnKSkge1xyXG4gICAgICAgIHJldHVybiAnaW1wbGVtZW50cyc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgd2hldGhlciBhbiBleHBvcnQgaXMgZGVmYXVsdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgaGFzRGVmYXVsdEV4cG9ydChub2RlOiBTeW50YXhOb2RlKTogYm9vbGVhbiB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xyXG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdkZWZhdWx0JykpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBvbmx5IHRoZSBjb21tZW50cyBmcm9tIGEgbm9kZSdzIGNoaWxkcmVuLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZmlsdGVyVHlwZShub2RlOiBTeW50YXhOb2RlLCB0eXBlOiBzdHJpbmcpOiBTeW50YXhOb2RlW10ge1xyXG4gICAgLy8gY29uc29sZS50aW1lKCdmaWx0ZXJUeXBlJylcclxuICAgIGxldCBjaGlsZHJlbjogU3ludGF4Tm9kZVtdID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xyXG4gICAgICBpZiAobWF0Y2goY2hpbGQsIHR5cGUpKSB7XHJcbiAgICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGNvbnNvbGUudGltZUVuZCgnZmlsdGVyVHlwZScpXHJcbiAgICByZXR1cm4gY2hpbGRyZW47XHJcbiAgfVxyXG5cclxuICBnZXRBU1QoKTogQVNUTm9kZVtdIHtcclxuICAgIHJldHVybiB0aGlzLmFzdDtcclxuICB9XHJcblxyXG4gIC8qIFZpc2l0b3JzICAqL1xyXG5cclxuICB2aXNpdE5vZGUgPSAoXHJcbiAgICBub2RlOiBTeW50YXhOb2RlLFxyXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+XHJcbiAgKSA9PiB7XHJcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xyXG4gICAgICBjYXNlICdwcm9ncmFtJzpcclxuICAgICAgICB0aGlzLmFzdCA9IHRoaXMudmlzaXRQcm9ncmFtKG5vZGUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdjb21tZW50JzpcclxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdENvbW1lbnQobm9kZSk7XHJcbiAgICAgIGNhc2UgJ01JU1NJTkcnOlxyXG4gICAgICBjYXNlICdFUlJPUic6XHJcbiAgICAgICAgbG9nLnJlcG9ydCh0aGlzLnNvdXJjZSwgbm9kZSwgRXJyb3JUeXBlLlRyZWVTaXR0ZXJQYXJzZUVycm9yKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuXHJcbiAgICAgICAgLyogTWF0Y2ggb3RoZXIgbm9uLXRlcm1pbmFscyAqL1xyXG5cclxuICAgICAgICBpZiAobWF0Y2gobm9kZSxcclxuICAgICAgICAgICdjb25zdHJhaW50JyxcclxuICAgICAgICAgICdmb3JtYWxfcGFyYW1ldGVycycsICdyZXF1aXJlZF9wYXJhbWV0ZXInLCAncmVzdF9wYXJhbWV0ZXInLFxyXG4gICAgICAgICAgJ3R5cGVfaWRlbnRpZmllcicsICd0eXBlX3BhcmFtZXRlcnMnLCAndHlwZV9wYXJhbWV0ZXInLCAndHlwZV9hbm5vdGF0aW9uJyxcclxuICAgICAgICAgICdvYmplY3RfdHlwZScsICdwcmVkZWZpbmVkX3R5cGUnLCAncGFyZW50aGVzaXplZF90eXBlJywgJ2xpdGVyYWxfdHlwZScsXHJcbiAgICAgICAgICAnaW50ZXJzZWN0aW9uX3R5cGUnLCAndW5pb25fdHlwZScsXHJcbiAgICAgICAgICAnY2xhc3NfYm9keScsXHJcbiAgICAgICAgICAnZXh0ZW5kc19jbGF1c2UnLFxyXG4gICAgICAgICAgJ3VuYXJ5X2V4cHJlc3Npb24nLCAnYmluYXJ5X2V4cHJlc3Npb24nLFxyXG4gICAgICAgICAgJ3N0YXRlbWVudF9ibG9jaycsICdyZXR1cm5fc3RhdGVtZW50JywgJ2V4cG9ydF9zdGF0ZW1lbnQnLCAnZXhwcmVzc2lvbl9zdGF0ZW1lbnQnLFxyXG4gICAgICAgICAgLy8gQSBjYWxsX3NpZ25hdHVyZSBjYW4gYWxzbyBiZSBhIG5vbi1jb250ZXh0dWFsIG5vZGVcclxuICAgICAgICAgICdjYWxsX3NpZ25hdHVyZScsXHJcbiAgICAgICAgICAnaW50ZXJuYWxfbW9kdWxlJ1xyXG4gICAgICAgICkpIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLnZpc2l0Tm9uVGVybWluYWwobm9kZSwgcHJvcGVydGllcylcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIE1hdGNoIHRlcm1pbmFscyAqL1xyXG4gICAgICAgIGlmIChtYXRjaChub2RlLFxyXG4gICAgICAgICAgJ2lkZW50aWZpZXInLCAnZXh0ZW5kcycsICdwcm9wZXJ0eV9pZGVudGlmaWVyJywgJ2FjY2Vzc2liaWxpdHlfbW9kaWZpZXInLFxyXG4gICAgICAgICAgJ3N0cmluZycsICd2b2lkJywgJ2Jvb2xlYW4nLCAnbnVsbCcsICd1bmRlZmluZWQnLCAnbnVtYmVyJywgJ3JldHVybicsXHJcbiAgICAgICAgICAnZ2V0JywgJ2Z1bmN0aW9uJywgJ25hbWVzcGFjZSdcclxuICAgICAgICApKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdFRlcm1pbmFsKG5vZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdmlzaXRDaGlsZHJlbiA9IChub2RlczogU3ludGF4Tm9kZVtdKTogQVNUTm9kZVtdID0+IHtcclxuICAgIGxldCBjaGlsZHJlbjogQVNUTm9kZVtdID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpXTtcclxuICAgICAgaWYgKCFub2RlLnR5cGUubWF0Y2goL1s8Pigpe30sOjtcXFtcXF0mfD1cXCtcXC1cXCpcXC9dLykgJiYgbm9kZS50eXBlICE9PSAnLi4uJykge1xyXG4gICAgICAgIGNvbnN0IGNoaWxkID0gdGhpcy52aXNpdE5vZGUobm9kZSk7XHJcbiAgICAgICAgaWYgKGNoaWxkKSBjaGlsZHJlbi5wdXNoKGNoaWxkKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNoaWxkcmVuO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB2aXNpdFByb2dyYW0gPSAobm9kZTogU3ludGF4Tm9kZSk6IEFTVE5vZGVbXSA9PiB7XHJcbiAgICBsZXQgdmlzaXRlZCA9IHt9LFxyXG4gICAgICBnZXRTdGFydExvY2F0aW9uID0gKG46IEFTVE5vZGUpID0+IGAke24ubG9jYXRpb24ucm93LnN0YXJ0fToke24ubG9jYXRpb24uY29sdW1uLnN0YXJ0fWA7XHJcbiAgICAvLyBBIHByb2dyYW0gY2FuIGhhdmUgbW9kdWxlcywgbmFtZXNwYWNlcywgY29tbWVudHMgYXMgaXRzIGNoaWxkcmVuXHJcbiAgICAvLyBUaGUgZmlyc3Qgc3RlcCBpcyB0byBwYXJzZSBhbGwgdGhlIGNvbW1lbnRzIGluIHRoZSByb290IG5vZGVcclxuICAgIGxldCBjb21tZW50cyA9IHRoaXMudmlzaXRDaGlsZHJlbih0aGlzLmZpbHRlclR5cGUobm9kZSwgJ2NvbW1lbnQnKSk7XHJcbiAgICAvLyBQYXJzZSB0aGUgbmFtZXNwYWNlcyBpbiBleHByZXNzaW9uX3N0YXRlbWVudFxyXG4gICAgbGV0IG5hbWVzcGFjZXMgPSB0aGlzLnZpc2l0Q2hpbGRyZW4odGhpcy5maWx0ZXJUeXBlKG5vZGUsICdleHByZXNzaW9uX3N0YXRlbWVudCcpKTtcclxuICAgIC8vIFBhcnNlIHRoZSBleHBvcnQgc3RhdGVtZW50cyBpbiB0aGUgcm9vdCBub2RlXHJcbiAgICBsZXQgZXhwb3J0cyA9IHRoaXMudmlzaXRDaGlsZHJlbih0aGlzLmZpbHRlclR5cGUobm9kZSwgJ2V4cG9ydF9zdGF0ZW1lbnQnKSk7XHJcblxyXG4gICAgLy8gR2V0IHRoZSB2aXNpdGVkIGNvbnRleHQgbm9kZXNcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgY29tbWVudCA9IGNvbW1lbnRzW2ldO1xyXG4gICAgICBjb25zdCBjb250ZXh0ID0gY29tbWVudDtcclxuICAgICAgdmlzaXRlZFtnZXRTdGFydExvY2F0aW9uKGNvbnRleHQpXSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVtb3ZlIHRoZSB2aXNpdGVkIG5vZGVzIGZyb20gbmFtZXNwYWNlcyBhcnJheVxyXG4gICAgXy5yZW1vdmUobmFtZXNwYWNlcywgeCA9PiB2aXNpdGVkW2dldFN0YXJ0TG9jYXRpb24oeCldKTtcclxuXHJcbiAgICAvLyBFeHBvcnRzIGFyZSBvZGRiYWxscyBzaW5jZSBzb21lIGV4cG9ydHMgbWF5IHJlZmVyZW5jZVxyXG4gICAgLy8gYSB0eXBlL25vZGUgdGhhdCBtYXkgaGF2ZSBiZWVuIGNvbW1lbnRlZC5cclxuICAgIC8vIFdlJ2xsIGZpcnN0IG5lZWQgdG8gZmlsdGVyIHRoZSBvbmVzIHdlIGhhdmUgdmlzaXRlZFxyXG4gICAgXy5yZW1vdmUoZXhwb3J0cywgeCA9PiB2aXNpdGVkW2dldFN0YXJ0TG9jYXRpb24oeCldKTtcclxuXHJcbiAgICAvLyBGcm9tIHRoZSBvbmVzIHdlIGhhdmUgbm90IHZpc2l0ZWQsIHdlJ2xsIG5lZWQgdG8gbW9kaWZ5XHJcbiAgICAvLyB0aGUgbm9kZSBwcm9wZXJ0aWVzIG9mIGVhY2ggY29udGV4dCBpbiBhIGNvbW1lbnQgbm9kZSB0aGF0XHJcbiAgICAvLyBtYXRjaGVzIHRoZSBvbmVzIHdlIGhhdmUgbm90IHZpc2l0ZWQuXHJcbiAgICBjb25zdCBtYXRjaGVkID0ge307XHJcbiAgICBjb21tZW50cyA9IF8uY29tcGFjdChcclxuICAgICAgY29tbWVudHMubWFwKGNvbW1lbnQgPT4ge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwb3J0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgY29uc3QgZXhwb3J0XyA9IGV4cG9ydHNbaV07XHJcbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0gY29tbWVudC5jb250ZXh0O1xyXG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb250ZXh0LmNoaWxkcmVuLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgIGlmIChjb250ZXh0LmNoaWxkcmVuW2ldLnR5cGUgPT09IGV4cG9ydF8udHlwZSkge1xyXG4gICAgICAgICAgICAgIG1hdGNoZWRbZ2V0U3RhcnRMb2NhdGlvbihleHBvcnRfKV0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGNvbW1lbnQuY29udGV4dC5wcm9wZXJ0aWVzID0gT2JqZWN0LmFzc2lnbihcclxuICAgICAgICAgICAgICAgIGNvbW1lbnQuY29udGV4dC5wcm9wZXJ0aWVzIHx8IHt9LFxyXG4gICAgICAgICAgICAgICAgZXhwb3J0Xy5wcm9wZXJ0aWVzXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29tbWVudDtcclxuICAgICAgfSkpO1xyXG5cclxuICAgIC8vIFJlbW92ZWQgdGhlIG1hdGNoZWQgZXhwb3J0c1xyXG4gICAgXy5yZW1vdmUoZXhwb3J0cywgeCA9PiBtYXRjaGVkW2dldFN0YXJ0TG9jYXRpb24oeCldKVxyXG5cclxuICAgIHJldHVybiBbXS5jb25jYXQoY29tbWVudHMpLmNvbmNhdChuYW1lc3BhY2VzKS5jb25jYXQoZXhwb3J0cyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHZpc2l0Q29tbWVudCA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZSA9PiB7XHJcbiAgICBpZiAoaXNKYXZhRG9jQ29tbWVudCh0aGlzLnNvdXJjZSwgbm9kZSkpIHtcclxuICAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSBzaWJsaW5nKG5vZGUpO1xyXG4gICAgICBpZiAobmV4dFNpYmxpbmcpIHtcclxuICAgICAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENvbnRleHQobmV4dFNpYmxpbmcsIHt9KSwgdHJ1ZSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmlzaXQgdGhlIGNvbnRleHR1YWwgbm9kZVxyXG4gICAqIFxyXG4gICAqICMgUmVtYXJrXHJcbiAgICogXHJcbiAgICogQSBub2RlIGlzIGNvbnNpZGVyZWQgY29udGV4dHVhbCB3aGVuIGEgY29tbWVudCBpcyB2aXNpdGVkIGFuZCB0aGUgbm9kZSBpcyBpdHMgc2libGluZy5cclxuICAgKi9cclxuICBwcml2YXRlIHZpc2l0Q29udGV4dCA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcclxuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XHJcbiAgICAgIGNhc2UgJ2V4cG9ydF9zdGF0ZW1lbnQnOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0RXhwb3J0U3RhdGVtZW50KG5vZGUsIHByb3BlcnRpZXMpO1xyXG4gICAgICBjYXNlICdleHByZXNzaW9uX3N0YXRlbWVudCc6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KG5vZGUsIHByb3BlcnRpZXMpO1xyXG4gICAgICBjYXNlICdjbGFzcyc6XHJcbiAgICAgIGNhc2UgJ2ludGVyZmFjZV9kZWNsYXJhdGlvbic6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRDbGFzc09ySW50ZXJmYWNlKG5vZGUsIHByb3BlcnRpZXMpXHJcbiAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcclxuICAgICAgY2FzZSAnY2FsbF9zaWduYXR1cmUnOlxyXG4gICAgICBjYXNlICdtZXRob2Rfc2lnbmF0dXJlJzpcclxuICAgICAgY2FzZSAncHJvcGVydHlfc2lnbmF0dXJlJzpcclxuICAgICAgY2FzZSAncHVibGljX2ZpZWxkX2RlZmluaXRpb24nOlxyXG4gICAgICBjYXNlICdtZXRob2RfZGVmaW5pdGlvbic6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXROb25UZXJtaW5hbChub2RlLCBwcm9wZXJ0aWVzKTtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyogU3RhdGVtZW50cyAqL1xyXG5cclxuICBwcml2YXRlIHZpc2l0RXhwb3J0U3RhdGVtZW50ID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xyXG4gICAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiwgZGVmYXVsdEV4cG9ydCA9IGZhbHNlO1xyXG4gICAgLy8gUmVtb3ZlICdleHBvcnQnIHNpbmNlIGl0J3MgYWx3YXlzIGZpcnN0IGluIHRoZSBhcnJheVxyXG4gICAgY2hpbGRyZW4uc2hpZnQoKTtcclxuICAgIGlmICh0aGlzLmhhc0RlZmF1bHRFeHBvcnQobm9kZSkpIHtcclxuICAgICAgZGVmYXVsdEV4cG9ydCA9IHRydWU7XHJcbiAgICAgIC8vIFJlbW92ZSAnZGVmYXVsdCcgZXhwb3J0XHJcbiAgICAgIGNoaWxkcmVuLnNoaWZ0KCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuLnNoaWZ0KCk7XHJcbiAgICByZXR1cm4gdGhpcy52aXNpdE5vZGUoY2hpbGQsIHsgZXhwb3J0czogeyBleHBvcnQ6IHRydWUsIGRlZmF1bHQ6IGRlZmF1bHRFeHBvcnQgfSB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50ID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM6IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XHJcbiAgICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xyXG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbi5zaGlmdCgpO1xyXG4gICAgaWYgKG1hdGNoKGNoaWxkLCAnaW50ZXJuYWxfbW9kdWxlJykpIHtcclxuICAgICAgcmV0dXJuIHRoaXMudmlzaXRJbnRlcm5hbE1vZHVsZShjaGlsZCwgcHJvcGVydGllcylcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnZpc2l0Tm9uVGVybWluYWwobm9kZSk7XHJcbiAgfVxyXG5cclxuICAvKiBNb2R1bGVzICovXHJcblxyXG4gIHByaXZhdGUgdmlzaXRJbnRlcm5hbE1vZHVsZSA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcclxuICAgIGxldCBjaGlsZHJlbjogQVNUTm9kZVtdID0gbm9kZS5jaGlsZHJlbi5tYXAoY2hpbGQgPT4ge1xyXG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdzdGF0ZW1lbnRfYmxvY2snKSkge1xyXG4gICAgICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q2hpbGRyZW4odGhpcy5maWx0ZXJUeXBlKGNoaWxkLCAnY29tbWVudCcpKSlcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy52aXNpdE5vZGUoY2hpbGQpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgY2hpbGRyZW4sIE9iamVjdC5hc3NpZ24ocHJvcGVydGllcyB8fCB7fSwgeyBuYW1lc3BhY2U6IHRydWUgfSkpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qIERlY2xhcmF0aW9ucyAqL1xyXG5cclxuICBwcml2YXRlIHZpc2l0Q2xhc3NPckludGVyZmFjZSA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcclxuICAgIC8vIFNpbmNlICdpbnRlcmZhY2UnIG9yICdjbGFzcycgaXMgYWx3YXlzIGZpcnN0IGluIHRoZSBhcnJheVxyXG4gICAgLy8gd2UnbGwgbmVlZCB0byByZW1vdmUgaXQgZnJvbSB0aGUgYXJyYXkuXHJcbiAgICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xyXG4gICAgY29uc3QgaW50ZXJmYWNlXyA9IGNoaWxkcmVuLnNoaWZ0KCk7XHJcbiAgICBsZXQgZXh0ZW5kc18gPSBmYWxzZSwgaW1wbGVtZW50c18gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLmhhc0luaGVyaXRhbmNlKG5vZGUpKSB7XHJcbiAgICAgIGNvbnN0IGluaGVyaXRhbmNlID0gdGhpcy5nZXRJbmhlcml0YW5jZVR5cGUobm9kZSlcclxuICAgICAgZXh0ZW5kc18gPSBpbmhlcml0YW5jZSA9PT0gJ2V4dGVuZHMnO1xyXG4gICAgICBpbXBsZW1lbnRzXyA9IGluaGVyaXRhbmNlID09PSAnaW1wbGVtZW50cyc7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgbm9kZV8gPSBjcmVhdGVBU1ROb2RlKFxyXG4gICAgICB0aGlzLnNvdXJjZSxcclxuICAgICAgbm9kZSxcclxuICAgICAgdGhpcy52aXNpdENoaWxkcmVuKGNoaWxkcmVuKSxcclxuICAgICAgT2JqZWN0LmFzc2lnbihwcm9wZXJ0aWVzIHx8IHt9LCB7XHJcbiAgICAgICAgaW5oZXJpdGFuY2U6IHtcclxuICAgICAgICAgIGltcGxlbWVudHM6IGltcGxlbWVudHNfLFxyXG4gICAgICAgICAgZXh0ZW5kczogZXh0ZW5kc19cclxuICAgICAgICB9IGFzIE5vZGVJbmhlcml0YW5jZVxyXG4gICAgICB9KSk7XHJcblxyXG4gICAgaWYgKG1hdGNoKG5vZGUsICdjbGFzcycpKSB7XHJcbiAgICAgIHJldHVybiBub2RlXztcclxuICAgIH1cclxuICAgIC8vIE92ZXJ3cml0ZSB0aGUgbm9kZSB0eXBlIGZyb20gJ2ludGVyZmFjZV9kZWNsYXJhdGlvbicgdG8gJ2ludGVyZmFjZSdcclxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5vZGVfLCB7IHR5cGU6IGludGVyZmFjZV8udHlwZSB9KVxyXG4gIH1cclxuXHJcbiAgLyogTm9uLXRlcm1pbmFscyAqL1xyXG5cclxuICBwcml2YXRlIHZpc2l0Tm9uVGVybWluYWwgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XHJcbiAgICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xyXG4gICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZXMgd2hlcmUgc29tZSBub24tdGVybWluYWxzXHJcbiAgICAvLyBjb250YWluIGNvbW1lbnRzIHdoaWNoIGlzIHdoYXQgd2UgY2FyZSBhYm91dFxyXG4gICAgaWYgKG1hdGNoKG5vZGUsICdjbGFzc19ib2R5JywgJ29iamVjdF90eXBlJykpIHtcclxuICAgICAgY2hpbGRyZW4gPSB0aGlzLmZpbHRlclR5cGUobm9kZSwgJ2NvbW1lbnQnKTtcclxuICAgIH1cclxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2VzIHdoZXJlIGV4cG9ydCBzdGF0ZW1lbnRzIGhhdmUgbm9kZSBwcm9wZXJ0aWVzXHJcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2V4cG9ydF9zdGF0ZW1lbnQnKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy52aXNpdEV4cG9ydFN0YXRlbWVudChub2RlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBhbiBpbnRlcm5hbCBtb2R1bGUgY29udGFpbnMgb3RoZXIgbm9kZXNcclxuICAgIGlmIChtYXRjaChub2RlLCAnaW50ZXJuYWxfbW9kdWxlJykpIHtcclxuICAgICAgcmV0dXJuIHRoaXMudmlzaXRJbnRlcm5hbE1vZHVsZShub2RlLCBwcm9wZXJ0aWVzKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBhbiBpbnRlcm1hbF9tb2R1bGUgY2FuIGV4aXN0IGluIGFuIGV4cHJlc3Npb25fc3RhdGVtZW50XHJcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2V4cHJlc3Npb25fc3RhdGVtZW50JykpIHtcclxuICAgICAgcmV0dXJuIHRoaXMudmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KG5vZGUsIHByb3BlcnRpZXMpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENoaWxkcmVuKGNoaWxkcmVuKSwgcHJvcGVydGllcyk7XHJcbiAgfVxyXG5cclxuICAvKiBUZXJtaW5hbHMgKi9cclxuXHJcbiAgcHJpdmF0ZSB2aXNpdFRlcm1pbmFsID0gKG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlID0+IHtcclxuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlKVxyXG4gIH1cclxufSJdfQ== \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/call_signature.visitor.d.ts b/build/src/lang/typescript/visitors/call_signature.visitor.d.ts deleted file mode 100644 index cd5f928..0000000 --- a/build/src/lang/typescript/visitors/call_signature.visitor.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { SyntaxNode } from "tree-sitter"; -import Source from "../../../interfaces/Source"; -export declare function visitCallSignature(source: Source, node: SyntaxNode): { - type_parameters: any; - formal_parameters: any; - type_annotation: any; -}; diff --git a/build/src/lang/typescript/visitors/call_signature.visitor.js b/build/src/lang/typescript/visitors/call_signature.visitor.js deleted file mode 100644 index ccbd8af..0000000 --- a/build/src/lang/typescript/visitors/call_signature.visitor.js +++ /dev/null @@ -1,22 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const formal_parameters_visitor_1 = require("./formal_parameters.visitor"); -const type_visitor_1 = require("./type.visitor"); -const match_1 = require("../../../utils/match"); -const type_parameters_visitor_1 = require("./type_parameters.visitor"); -function visitCallSignature(source, node) { - let call_signature = node.children, type_parameters, formal_parameters, type_annotation; - if (match_1.default(call_signature[0], 'type_parameters')) { - type_parameters = type_parameters_visitor_1.default(source, call_signature.shift()); - } - if (match_1.default(call_signature[0], 'formal_parameters')) { - formal_parameters = formal_parameters_visitor_1.visitFormalParameters(source, call_signature.shift()); - } - if (match_1.default(call_signature[0], 'type_annotation')) { - let type = call_signature.shift().children[1]; - type_annotation = type_visitor_1.visitType(source, type); - } - return { type_parameters, formal_parameters, type_annotation }; -} -exports.visitCallSignature = visitCallSignature; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsbF9zaWduYXR1cmUudmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvY2FsbF9zaWduYXR1cmUudmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLDJFQUFvRTtBQUNwRSxpREFBMkM7QUFFM0MsZ0RBQXlDO0FBQ3pDLHVFQUE0RDtBQUU1RCxTQUFnQixrQkFBa0IsQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFFL0QsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFDbEMsZUFBZSxFQUNmLGlCQUFpQixFQUNqQixlQUFlLENBQUM7SUFFaEIsSUFBSSxlQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLEVBQUU7UUFDN0MsZUFBZSxHQUFHLGlDQUFtQixDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUN6RTtJQUVELElBQUksZUFBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxFQUFFO1FBQy9DLGlCQUFpQixHQUFHLGlEQUFxQixDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUM3RTtJQUVELElBQUksZUFBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFO1FBQzdDLElBQUksSUFBSSxHQUFHLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsZUFBZSxHQUFHLHdCQUFTLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQzdDO0lBRUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsQ0FBQTtBQUVsRSxDQUFDO0FBdEJELGdEQXNCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcbmltcG9ydCB7IHZpc2l0Rm9ybWFsUGFyYW1ldGVycyB9IGZyb20gXCIuL2Zvcm1hbF9wYXJhbWV0ZXJzLnZpc2l0b3JcIjtcbmltcG9ydCB7IHZpc2l0VHlwZSB9IGZyb20gXCIuL3R5cGUudmlzaXRvclwiO1xuaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi4vLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2VcIjtcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbWF0Y2hcIjtcbmltcG9ydCB2aXNpdFR5cGVQYXJhbWV0ZXJzIGZyb20gXCIuL3R5cGVfcGFyYW1ldGVycy52aXNpdG9yXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiB2aXNpdENhbGxTaWduYXR1cmUoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpIHtcblxuICAgIGxldCBjYWxsX3NpZ25hdHVyZSA9IG5vZGUuY2hpbGRyZW4sXG4gICAgdHlwZV9wYXJhbWV0ZXJzLFxuICAgIGZvcm1hbF9wYXJhbWV0ZXJzLFxuICAgIHR5cGVfYW5ub3RhdGlvbjtcblxuICAgIGlmIChtYXRjaChjYWxsX3NpZ25hdHVyZVswXSwgJ3R5cGVfcGFyYW1ldGVycycpKSB7XG4gICAgICAgIHR5cGVfcGFyYW1ldGVycyA9IHZpc2l0VHlwZVBhcmFtZXRlcnMoc291cmNlLCBjYWxsX3NpZ25hdHVyZS5zaGlmdCgpKTtcbiAgICB9XG5cbiAgICBpZiAobWF0Y2goY2FsbF9zaWduYXR1cmVbMF0sICdmb3JtYWxfcGFyYW1ldGVycycpKSB7XG4gICAgICAgIGZvcm1hbF9wYXJhbWV0ZXJzID0gdmlzaXRGb3JtYWxQYXJhbWV0ZXJzKHNvdXJjZSwgY2FsbF9zaWduYXR1cmUuc2hpZnQoKSk7XG4gICAgfVxuXG4gICAgaWYgKG1hdGNoKGNhbGxfc2lnbmF0dXJlWzBdLCAndHlwZV9hbm5vdGF0aW9uJykpIHtcbiAgICAgICAgbGV0IHR5cGUgPSBjYWxsX3NpZ25hdHVyZS5zaGlmdCgpLmNoaWxkcmVuWzFdO1xuICAgICAgICB0eXBlX2Fubm90YXRpb24gPSB2aXNpdFR5cGUoc291cmNlLCB0eXBlKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyB0eXBlX3BhcmFtZXRlcnMsIGZvcm1hbF9wYXJhbWV0ZXJzLCB0eXBlX2Fubm90YXRpb24gfVxuXG59Il19 \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/class.visitor.d.ts b/build/src/lang/typescript/visitors/class.visitor.d.ts deleted file mode 100644 index ca405ae..0000000 --- a/build/src/lang/typescript/visitors/class.visitor.d.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { NodeProperties } from "../Node"; -import { SyntaxNode } from "tree-sitter"; -import Source from "../../../interfaces/Source"; -export declare function visitClass(source: Source, node: SyntaxNode, comment: SyntaxNode, properties?: Partial): { - type: string; - identifier: import("../Node").Node; - type_parameters: { - type: string; - context: import("../Node").Node; - parameters: { - type: string; - context: import("../Node").Node; - }[]; - } | { - type: string; - heritage_type: string; - context: import("../Node").Node; - heritages: { - type: string; - context: import("../Node").Node; - }[]; - } | { - type: string; - context: import("../Node").Node; - methods: any[]; - properties: any[]; - }; - heritage: { - type: string; - context: import("../Node").Node; - parameters: { - type: string; - context: import("../Node").Node; - }[]; - } | { - type: string; - heritage_type: string; - context: import("../Node").Node; - heritages: { - type: string; - context: import("../Node").Node; - }[]; - } | { - type: string; - context: import("../Node").Node; - methods: any[]; - properties: any[]; - }; - body: { - type: string; - context: import("../Node").Node; - parameters: { - type: string; - context: import("../Node").Node; - }[]; - } | { - type: string; - heritage_type: string; - context: import("../Node").Node; - heritages: { - type: string; - context: import("../Node").Node; - }[]; - } | { - type: string; - context: import("../Node").Node; - methods: any[]; - properties: any[]; - }; - properties: Partial; - comment: import("../Node").Node; - context: import("../Node").Node; -}; -export declare function visitClassHeritage(source: Source, node: SyntaxNode): { - type: string; - heritage_type: string; - context: import("../Node").Node; - heritages: { - type: string; - context: import("../Node").Node; - }[]; -}; -export declare function visitClassBody(source: Source, node: SyntaxNode): { - type: string; - context: import("../Node").Node; - methods: any[]; - properties: any[]; -}; diff --git a/build/src/lang/typescript/visitors/class.visitor.js b/build/src/lang/typescript/visitors/class.visitor.js deleted file mode 100644 index 412e58a..0000000 --- a/build/src/lang/typescript/visitors/class.visitor.js +++ /dev/null @@ -1,91 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const comment_1 = require("../../../utils/comment"); -const Node_1 = require("../Node"); -const method_definition_visitor_1 = require("./method_definition.visitor"); -const public_field_definition_visitor_1 = require("./public_field_definition.visitor"); -const type_visitor_1 = require("./type.visitor"); -const log_1 = require("../../../utils/log"); -const match_1 = require("../../../utils/match"); -const type_parameters_visitor_1 = require("./type_parameters.visitor"); -function visitClass(source, node, comment, properties) { - let children = node.children; - // Remove 'class' from the array - children.shift(); - const identifier = Node_1.createNode(source, children.shift()); - const visited = children.map(child => { - switch (child.type) { - case 'type_parameters': - return type_parameters_visitor_1.default(source, child); - case 'class_heritage': - return visitClassHeritage(source, child); - case 'class_body': - return visitClassBody(source, child); - default: - log_1.default.report(source, node, log_1.ErrorType.NodeTypeNotYetSupported); - break; - } - }); - const type_parameters = visited.filter(child => child.type === 'type_parameters').shift(); - const heritage = visited.filter(child => child.type === 'class_heritage').shift(); - const body = visited.filter(child => child.type === 'class_body').shift(); - return { - type: 'class', - identifier, - type_parameters, - heritage, - body, - properties, - comment: Node_1.createNode(source, comment, null, true), - context: Node_1.createNode(source, node) - }; -} -exports.visitClass = visitClass; -function visitClassHeritage(source, node) { - let heritage_clause = node.children.shift(); - let heritage_clause_children = heritage_clause.children; - // Remove the heritage type ('implements' or 'extends') - let heritage_type = heritage_clause_children.shift(); - return { - type: 'class_heritage', - heritage_type: heritage_type.type, - context: Node_1.createNode(source, node), - // A heritage is either 'implements' or 'extends' - heritages: heritage_clause_children - .filter(child => child.type === 'type_identifier') - .map(child => type_visitor_1.visitTypeIdentifier(source, child)) - }; -} -exports.visitClassHeritage = visitClassHeritage; -function visitClassBody(source, node) { - const methods = []; - const properties = []; - node.children - .filter(child => !child.type.match(/[{}]/)) - .forEach(child => { - const nextSibling = child.nextSibling; - if (match_1.default(child, 'comment') && comment_1.isJavaDocComment(source, child)) { - if (nextSibling) { - switch (nextSibling.type) { - case 'method_definition': - methods.push(method_definition_visitor_1.visitMethodDefinition(source, nextSibling, child)); - break; - case 'public_field_definition': - properties.push(public_field_definition_visitor_1.visitPublicFieldDefinition(source, nextSibling, child)); - break; - default: - log_1.default.report(source, nextSibling, log_1.ErrorType.NodeTypeNotYetSupported); - break; - } - } - } - }); - return { - type: 'class_body', - context: Node_1.createNode(source, node), - methods, - properties - }; -} -exports.visitClassBody = visitClassBody; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3MudmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvY2xhc3MudmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLG9EQUEwRDtBQUMxRCxrQ0FBcUQ7QUFFckQsMkVBQW9FO0FBQ3BFLHVGQUErRTtBQUMvRSxpREFBcUQ7QUFFckQsNENBQW9EO0FBQ3BELGdEQUF5QztBQUN6Qyx1RUFBNEQ7QUFFNUQsU0FBZ0IsVUFBVSxDQUN4QixNQUFjLEVBQ2QsSUFBZ0IsRUFDaEIsT0FBbUIsRUFDbkIsVUFBb0M7SUFFcEMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUM3QixnQ0FBZ0M7SUFDaEMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQ2hCLE1BQU0sVUFBVSxHQUFHLGlCQUFVLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBQ3ZELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDbkMsUUFBUSxLQUFLLENBQUMsSUFBSSxFQUFFO1lBQ2xCLEtBQUssaUJBQWlCO2dCQUNwQixPQUFPLGlDQUFtQixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQTtZQUMzQyxLQUFLLGdCQUFnQjtnQkFDbkIsT0FBTyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUE7WUFDMUMsS0FBSyxZQUFZO2dCQUNmLE9BQU8sY0FBYyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQTtZQUN0QztnQkFDRSxhQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsZUFBUyxDQUFDLHVCQUF1QixDQUFDLENBQUM7Z0JBQzVELE1BQU07U0FDVDtJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsTUFBTSxlQUFlLEdBQUcsT0FB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SCxDQUFDLENBQUMsQ0FBQztJQUVMLE9BQU87UUFDTCxJQUFJLEVBQUUsWUFBWTtRQUNsQixPQUFPLEVBQUUsaUJBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDO1FBQ2pDLE9BQU87UUFDUCxVQUFVO0tBQ1gsQ0FBQTtBQUNILENBQUM7QUEvQkQsd0NBK0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNKYXZhRG9jQ29tbWVudCB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9jb21tZW50XCI7XG5pbXBvcnQgeyBOb2RlUHJvcGVydGllcywgY3JlYXRlTm9kZSB9IGZyb20gXCIuLi9Ob2RlXCI7XG5pbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgeyB2aXNpdE1ldGhvZERlZmluaXRpb24gfSBmcm9tIFwiLi9tZXRob2RfZGVmaW5pdGlvbi52aXNpdG9yXCI7XG5pbXBvcnQgeyB2aXNpdFB1YmxpY0ZpZWxkRGVmaW5pdGlvbiB9IGZyb20gXCIuL3B1YmxpY19maWVsZF9kZWZpbml0aW9uLnZpc2l0b3JcIjtcbmltcG9ydCB7IHZpc2l0VHlwZUlkZW50aWZpZXIgfSBmcm9tIFwiLi90eXBlLnZpc2l0b3JcIjtcbmltcG9ydCBTb3VyY2UgZnJvbSBcIi4uLy4uLy4uL2ludGVyZmFjZXMvU291cmNlXCI7XG5pbXBvcnQgbG9nLCB7IEVycm9yVHlwZSB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9sb2dcIjtcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbWF0Y2hcIjtcbmltcG9ydCB2aXNpdFR5cGVQYXJhbWV0ZXJzIGZyb20gXCIuL3R5cGVfcGFyYW1ldGVycy52aXNpdG9yXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiB2aXNpdENsYXNzKFxuICBzb3VyY2U6IFNvdXJjZSxcbiAgbm9kZTogU3ludGF4Tm9kZSxcbiAgY29tbWVudDogU3ludGF4Tm9kZSxcbiAgcHJvcGVydGllcz86IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+XG4pIHtcbiAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgLy8gUmVtb3ZlICdjbGFzcycgZnJvbSB0aGUgYXJyYXlcbiAgY2hpbGRyZW4uc2hpZnQoKVxuICBjb25zdCBpZGVudGlmaWVyID0gY3JlYXRlTm9kZShzb3VyY2UsIGNoaWxkcmVuLnNoaWZ0KCkpXG4gIGNvbnN0IHZpc2l0ZWQgPSBjaGlsZHJlbi5tYXAoY2hpbGQgPT4ge1xuICAgIHN3aXRjaCAoY2hpbGQudHlwZSkge1xuICAgICAgY2FzZSAndHlwZV9wYXJhbWV0ZXJzJzpcbiAgICAgICAgcmV0dXJuIHZpc2l0VHlwZVBhcmFtZXRlcnMoc291cmNlLCBjaGlsZClcbiAgICAgIGNhc2UgJ2NsYXNzX2hlcml0YWdlJzpcbiAgICAgICAgcmV0dXJuIHZpc2l0Q2xhc3NIZXJpdGFnZShzb3VyY2UsIGNoaWxkKVxuICAgICAgY2FzZSAnY2xhc3NfYm9keSc6XG4gICAgICAgIHJldHVybiB2aXNpdENsYXNzQm9keShzb3VyY2UsIGNoaWxkKVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgbG9nLnJlcG9ydChzb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFlldFN1cHBvcnRlZCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgdHlwZV9wYXJhbWV0ZXJzID0gdmlzaXRlZC5maWx0ZXIoY2hpbGQgPT4gY2hpbGQudHlwZSA9PT0gJ3R5cGVfcGFyYW1ldGVycycpLnNoaWZ0KClcbiAgY29uc3QgaGVyaXRhZ2UgPSB2aXNpdGVkLmZpbHRlcihjaGlsZCA9PiBjaGlsZC50eXBlID09PSAnY2xhc3NfaGVyaXRhZ2UnKS5zaGlmdCgpXG4gIGNvbnN0IGJvZHkgPSB2aXNpdGVkLmZpbHRlcihjaGlsZCA9PiBjaGlsZC50eXBlID09PSAnY2xhc3NfYm9keScpLnNoaWZ0KCk7XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnY2xhc3MnLFxuICAgIGlkZW50aWZpZXIsXG4gICAgdHlwZV9wYXJhbWV0ZXJzLFxuICAgIGhlcml0YWdlLFxuICAgIGJvZHksXG4gICAgcHJvcGVydGllcyxcbiAgICBjb21tZW50OiBjcmVhdGVOb2RlKHNvdXJjZSwgY29tbWVudCwgbnVsbCwgdHJ1ZSksXG4gICAgY29udGV4dDogY3JlYXRlTm9kZShzb3VyY2UsIG5vZGUpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZpc2l0Q2xhc3NIZXJpdGFnZShzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSkge1xuICBsZXQgaGVyaXRhZ2VfY2xhdXNlID0gbm9kZS5jaGlsZHJlbi5zaGlmdCgpO1xuICBsZXQgaGVyaXRhZ2VfY2xhdXNlX2NoaWxkcmVuID0gaGVyaXRhZ2VfY2xhdXNlLmNoaWxkcmVuO1xuICAvLyBSZW1vdmUgdGhlIGhlcml0YWdlIHR5cGUgKCdpbXBsZW1lbnRzJyBvciAnZXh0ZW5kcycpXG4gIGxldCBoZXJpdGFnZV90eXBlID0gaGVyaXRhZ2VfY2xhdXNlX2NoaWxkcmVuLnNoaWZ0KCk7XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnY2xhc3NfaGVyaXRhZ2UnLFxuICAgIGhlcml0YWdlX3R5cGU6IGhlcml0YWdlX3R5cGUudHlwZSxcbiAgICBjb250ZXh0OiBjcmVhdGVOb2RlKHNvdXJjZSwgbm9kZSksXG4gICAgLy8gQSBoZXJpdGFnZSBpcyBlaXRoZXIgJ2ltcGxlbWVudHMnIG9yICdleHRlbmRzJ1xuICAgIGhlcml0YWdlczogaGVyaXRhZ2VfY2xhdXNlX2NoaWxkcmVuXG4gICAgICAuZmlsdGVyKGNoaWxkID0+IGNoaWxkLnR5cGUgPT09ICd0eXBlX2lkZW50aWZpZXInKVxuICAgICAgLm1hcChjaGlsZCA9PiB2aXNpdFR5cGVJZGVudGlmaWVyKHNvdXJjZSwgY2hpbGQpKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2aXNpdENsYXNzQm9keShzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSkge1xuXG4gIGNvbnN0IG1ldGhvZHMgPSBbXVxuICBjb25zdCBwcm9wZXJ0aWVzID0gW11cbiAgbm9kZS5jaGlsZHJlblxuICAgIC5maWx0ZXIoY2hpbGQgPT4gIWNoaWxkLnR5cGUubWF0Y2goL1t7fV0vKSlcbiAgICAuZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICBjb25zdCBuZXh0U2libGluZyA9IGNoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgaWYgKG1hdGNoKGNoaWxkLCAnY29tbWVudCcpICYmIGlzSmF2YURvY0NvbW1lbnQoc291cmNlLCBjaGlsZCkpIHtcbiAgICAgICAgaWYgKG5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgc3dpdGNoIChuZXh0U2libGluZy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdtZXRob2RfZGVmaW5pdGlvbic6XG4gICAgICAgICAgICAgIG1ldGhvZHMucHVzaCh2aXNpdE1ldGhvZERlZmluaXRpb24oc291cmNlLCBuZXh0U2libGluZywgY2hpbGQpKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdwdWJsaWNfZmllbGRfZGVmaW5pdGlvbic6XG4gICAgICAgICAgICAgIHByb3BlcnRpZXMucHVzaCh2aXNpdFB1YmxpY0ZpZWxkRGVmaW5pdGlvbihzb3VyY2UsIG5leHRTaWJsaW5nLCBjaGlsZCkpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGxvZy5yZXBvcnQoc291cmNlLCBuZXh0U2libGluZywgRXJyb3JUeXBlLk5vZGVUeXBlTm90WWV0U3VwcG9ydGVkKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnY2xhc3NfYm9keScsXG4gICAgY29udGV4dDogY3JlYXRlTm9kZShzb3VyY2UsIG5vZGUpLFxuICAgIG1ldGhvZHMsXG4gICAgcHJvcGVydGllc1xuICB9XG59Il19 \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/declaration.visitor.d.ts b/build/src/lang/typescript/visitors/declaration.visitor.d.ts deleted file mode 100644 index ef6ce08..0000000 --- a/build/src/lang/typescript/visitors/declaration.visitor.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { SyntaxNode } from "tree-sitter"; -import { NodeProperties } from "../Node"; -import Source from "../../../interfaces/Source"; -export declare function visitDeclaration(source: Source, node: SyntaxNode, comment: SyntaxNode, properties: Partial): void; -export declare function visitInterfaceDeclaration(source: Source, node: SyntaxNode, comment: SyntaxNode, properties: Partial): void; -export declare function visitLexicalDeclaration(source: Source, node: SyntaxNode, comment: SyntaxNode, properties: Partial): void; diff --git a/build/src/lang/typescript/visitors/declaration.visitor.js b/build/src/lang/typescript/visitors/declaration.visitor.js deleted file mode 100644 index 918ab09..0000000 --- a/build/src/lang/typescript/visitors/declaration.visitor.js +++ /dev/null @@ -1,30 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const Node_1 = require("../Node"); -const log_1 = require("../../../utils/log"); -const match_1 = require("../../../utils/match"); -function visitDeclaration(source, node, comment, properties) { - switch (node.type) { - case 'interface_declaration': - return visitInterfaceDeclaration(source, node, comment, properties); - case 'lexical_declaration': - return visitLexicalDeclaration(source, node, comment, properties); - default: - log_1.default.report(source, node, log_1.ErrorType.NodeTypeNotYetSupported); - break; - } -} -exports.visitDeclaration = visitDeclaration; -function visitInterfaceDeclaration(source, node, comment, properties) { - console.log(node.children); -} -exports.visitInterfaceDeclaration = visitInterfaceDeclaration; -function visitLexicalDeclaration(source, node, comment, properties) { - let children = node.children, scope; - if (match_1.default(children[0], 'const', 'let')) { - scope = Node_1.createNode(source, children.shift()); - } - console.log(node.children); -} -exports.visitLexicalDeclaration = visitLexicalDeclaration; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjbGFyYXRpb24udmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvZGVjbGFyYXRpb24udmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLGtDQUFxRDtBQUVyRCw0Q0FBb0Q7QUFDcEQsZ0RBQXlDO0FBS3pDLFNBQWdCLGdCQUFnQixDQUM1QixNQUFjLEVBQ2QsSUFBZ0IsRUFDaEIsT0FBbUIsRUFDbkIsVUFBbUM7SUFFbkMsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO1FBQ2YsS0FBSyx1QkFBdUI7WUFDeEIsT0FBTyx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN4RSxLQUFLLHFCQUFxQjtZQUN0QixPQUFPLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3RFO1lBQ0ksYUFBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1lBQzVELE1BQU07S0FDYjtBQUNMLENBQUM7QUFmRCw0Q0FlQztBQUVELFNBQWdCLHlCQUF5QixDQUNyQyxNQUFjLEVBQ2QsSUFBZ0IsRUFDaEIsT0FBbUIsRUFDbkIsVUFBbUM7SUFFbkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7QUFFL0IsQ0FBQztBQVJELDhEQVFDO0FBRUQsU0FBZ0IsdUJBQXVCLENBQ25DLE1BQWMsRUFDZCxJQUFnQixFQUNoQixPQUFtQixFQUNuQixVQUFtQztJQUVuQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUN4QixLQUFLLENBQUM7SUFFVixJQUFJLGVBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFFO1FBQ3BDLEtBQUssR0FBRyxpQkFBVSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUNoRDtJQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFiRCwwREFhQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcbmltcG9ydCB7IE5vZGVQcm9wZXJ0aWVzLCBjcmVhdGVOb2RlIH0gZnJvbSBcIi4uL05vZGVcIjtcbmltcG9ydCBTb3VyY2UgZnJvbSBcIi4uLy4uLy4uL2ludGVyZmFjZXMvU291cmNlXCI7XG5pbXBvcnQgbG9nLCB7IEVycm9yVHlwZSB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9sb2dcIjtcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbWF0Y2hcIjtcbmltcG9ydCB7IHRleHQgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvdGV4dFwiO1xuXG5cblxuZXhwb3J0IGZ1bmN0aW9uIHZpc2l0RGVjbGFyYXRpb24oXG4gICAgc291cmNlOiBTb3VyY2UsXG4gICAgbm9kZTogU3ludGF4Tm9kZSxcbiAgICBjb21tZW50OiBTeW50YXhOb2RlLFxuICAgIHByb3BlcnRpZXM6IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+XG4pIHtcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgICBjYXNlICdpbnRlcmZhY2VfZGVjbGFyYXRpb24nOlxuICAgICAgICAgICAgcmV0dXJuIHZpc2l0SW50ZXJmYWNlRGVjbGFyYXRpb24oc291cmNlLCBub2RlLCBjb21tZW50LCBwcm9wZXJ0aWVzKTtcbiAgICAgICAgY2FzZSAnbGV4aWNhbF9kZWNsYXJhdGlvbic6XG4gICAgICAgICAgICByZXR1cm4gdmlzaXRMZXhpY2FsRGVjbGFyYXRpb24oc291cmNlLCBub2RlLCBjb21tZW50LCBwcm9wZXJ0aWVzKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGxvZy5yZXBvcnQoc291cmNlLCBub2RlLCBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRJbnRlcmZhY2VEZWNsYXJhdGlvbihcbiAgICBzb3VyY2U6IFNvdXJjZSxcbiAgICBub2RlOiBTeW50YXhOb2RlLFxuICAgIGNvbW1lbnQ6IFN5bnRheE5vZGUsXG4gICAgcHJvcGVydGllczogUGFydGlhbDxOb2RlUHJvcGVydGllcz5cbikge1xuICAgIGNvbnNvbGUubG9nKG5vZGUuY2hpbGRyZW4pO1xuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2aXNpdExleGljYWxEZWNsYXJhdGlvbihcbiAgICBzb3VyY2U6IFNvdXJjZSxcbiAgICBub2RlOiBTeW50YXhOb2RlLFxuICAgIGNvbW1lbnQ6IFN5bnRheE5vZGUsXG4gICAgcHJvcGVydGllczogUGFydGlhbDxOb2RlUHJvcGVydGllcz5cbikge1xuICAgIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4sXG4gICAgICAgIHNjb3BlO1xuXG4gICAgaWYgKG1hdGNoKGNoaWxkcmVuWzBdLCAnY29uc3QnLCAnbGV0JykpIHtcbiAgICAgICAgc2NvcGUgPSBjcmVhdGVOb2RlKHNvdXJjZSwgY2hpbGRyZW4uc2hpZnQoKSk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKG5vZGUuY2hpbGRyZW4pO1xufSJdfQ== \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/formal_parameters.visitor.d.ts b/build/src/lang/typescript/visitors/formal_parameters.visitor.d.ts deleted file mode 100644 index e7ce592..0000000 --- a/build/src/lang/typescript/visitors/formal_parameters.visitor.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { SyntaxNode } from "tree-sitter"; -import Source from "../../../interfaces/Source"; -export declare function visitFormalParameters(source: Source, node: SyntaxNode): { - type: string; - context: import("../Node").Node; - parameters: { - type: string; - context: import("../Node").Node; - identifier: any; - type_annotation: any; - }[]; -}; -export declare function visitRequiredParameter(source: Source, node: SyntaxNode): { - type: string; - context: import("../Node").Node; - identifier: any; - type_annotation: any; -}; diff --git a/build/src/lang/typescript/visitors/formal_parameters.visitor.js b/build/src/lang/typescript/visitors/formal_parameters.visitor.js deleted file mode 100644 index dc6919f..0000000 --- a/build/src/lang/typescript/visitors/formal_parameters.visitor.js +++ /dev/null @@ -1,33 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const Node_1 = require("../Node"); -const type_visitor_1 = require("./type.visitor"); -const match_1 = require("../../../utils/match"); -function visitFormalParameters(source, node) { - return { - type: node.type, - context: Node_1.createNode(source, node), - parameters: node.children - .filter(child => !child.type.match(/[(),]/)) - .map(child => visitRequiredParameter(source, child)) - }; -} -exports.visitFormalParameters = visitFormalParameters; -function visitRequiredParameter(source, node) { - let required_parameter = node.children, identifier, type_annotation; - if (match_1.default(required_parameter[0], 'identifier')) { - identifier = Node_1.createNode(source, required_parameter.shift()); - } - if (match_1.default(required_parameter[0], 'type_annotation')) { - let type = required_parameter.shift().children[1]; - type_annotation = type_visitor_1.visitType(source, type); - } - return { - type: 'parameter', - context: Node_1.createNode(source, node), - identifier, - type_annotation - }; -} -exports.visitRequiredParameter = visitRequiredParameter; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWFsX3BhcmFtZXRlcnMudmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvZm9ybWFsX3BhcmFtZXRlcnMudmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtDQUFxQztBQUVyQyxpREFBMkM7QUFFM0MsZ0RBQXlDO0FBRXpDLFNBQWdCLHFCQUFxQixDQUFDLE1BQWMsRUFBRSxJQUFnQjtJQUNwRSxPQUFPO1FBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1FBQ2YsT0FBTyxFQUFFLGlCQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztRQUNqQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVE7YUFDeEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUMzQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDckQsQ0FBQTtBQUNILENBQUM7QUFSRCxzREFRQztBQUdELFNBQWdCLHNCQUFzQixDQUFDLE1BQWMsRUFBRSxJQUFnQjtJQUNyRSxJQUFJLGtCQUFrQixHQUFHLElBQUksQ0FBQyxRQUFRLEVBQ3BDLFVBQVUsRUFDVixlQUFlLENBQUM7SUFHbEIsSUFBSSxlQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUU7UUFDOUMsVUFBVSxHQUFHLGlCQUFVLENBQUMsTUFBTSxFQUFFLGtCQUFrQixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDN0Q7SUFFRCxJQUFHLGVBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFO1FBQ2xELElBQUksSUFBSSxHQUFHLGtCQUFrQixDQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRCxlQUFlLEdBQUcsd0JBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDM0M7SUFFRCxPQUFPO1FBQ0wsSUFBSSxFQUFFLFdBQVc7UUFDakIsT0FBTyxFQUFFLGlCQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztRQUNqQyxVQUFVO1FBQ1YsZUFBZTtLQUNoQixDQUFBO0FBQ0gsQ0FBQztBQXJCRCx3REFxQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVOb2RlIH0gZnJvbSBcIi4uL05vZGVcIjtcbmltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcbmltcG9ydCB7IHZpc2l0VHlwZSB9IGZyb20gXCIuL3R5cGUudmlzaXRvclwiO1xuaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi4vLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2VcIjtcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbWF0Y2hcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHZpc2l0Rm9ybWFsUGFyYW1ldGVycyhzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IG5vZGUudHlwZSxcbiAgICBjb250ZXh0OiBjcmVhdGVOb2RlKHNvdXJjZSwgbm9kZSksXG4gICAgcGFyYW1ldGVyczogbm9kZS5jaGlsZHJlblxuICAgIC5maWx0ZXIoY2hpbGQgPT4gIWNoaWxkLnR5cGUubWF0Y2goL1soKSxdLykpXG4gICAgLm1hcChjaGlsZCA9PiB2aXNpdFJlcXVpcmVkUGFyYW1ldGVyKHNvdXJjZSwgY2hpbGQpKVxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHZpc2l0UmVxdWlyZWRQYXJhbWV0ZXIoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgbGV0IHJlcXVpcmVkX3BhcmFtZXRlciA9IG5vZGUuY2hpbGRyZW4sXG4gICAgaWRlbnRpZmllcixcbiAgICB0eXBlX2Fubm90YXRpb247XG4gICAgXG5cbiAgaWYgKG1hdGNoKHJlcXVpcmVkX3BhcmFtZXRlclswXSwgJ2lkZW50aWZpZXInKSkge1xuICAgIGlkZW50aWZpZXIgPSBjcmVhdGVOb2RlKHNvdXJjZSwgcmVxdWlyZWRfcGFyYW1ldGVyLnNoaWZ0KCkpO1xuICB9XG5cbiAgaWYobWF0Y2gocmVxdWlyZWRfcGFyYW1ldGVyWzBdLCAndHlwZV9hbm5vdGF0aW9uJykpIHtcbiAgICBsZXQgdHlwZSA9IHJlcXVpcmVkX3BhcmFtZXRlci5zaGlmdCgpLmNoaWxkcmVuWzFdO1xuICAgIHR5cGVfYW5ub3RhdGlvbiA9IHZpc2l0VHlwZShzb3VyY2UsIHR5cGUpOyBcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ3BhcmFtZXRlcicsXG4gICAgY29udGV4dDogY3JlYXRlTm9kZShzb3VyY2UsIG5vZGUpLFxuICAgIGlkZW50aWZpZXIsXG4gICAgdHlwZV9hbm5vdGF0aW9uXG4gIH1cbn0iXX0= \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/function.visitor.d.ts b/build/src/lang/typescript/visitors/function.visitor.d.ts deleted file mode 100644 index 7e25d0b..0000000 --- a/build/src/lang/typescript/visitors/function.visitor.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { NodeProperties } from "../Node"; -import { SyntaxNode } from "tree-sitter"; -import Source from "../../../interfaces/Source"; -export declare function visitFunction(source: Source, node: SyntaxNode, comment: SyntaxNode, properties: Partial): { - type: string; - context: import("../Node").Node; - comment: import("../Node").Node; - isAync: boolean; - identifier: any; - type_parameters: any; - formal_parameters: any; - type_annotation: any; - properties: Partial; -}; diff --git a/build/src/lang/typescript/visitors/function.visitor.js b/build/src/lang/typescript/visitors/function.visitor.js deleted file mode 100644 index dd6e420..0000000 --- a/build/src/lang/typescript/visitors/function.visitor.js +++ /dev/null @@ -1,38 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const Node_1 = require("../Node"); -const call_signature_visitor_1 = require("./call_signature.visitor"); -const match_1 = require("../../../utils/match"); -function visitFunction(source, node, comment, properties) { - let children = node.children; - let isAync = false, identifier, type_parameters, formal_parameters, type_annotation; - if (match_1.default(children[0], 'async')) { - isAync = true; - children.shift(); - } - if (match_1.default(children[0], 'function')) { - children.shift(); - } - if (match_1.default(children[0], 'identifier')) { - identifier = Node_1.createNode(source, children.shift()); - } - if (match_1.default(children[0], 'call_signature')) { - let call_signature = call_signature_visitor_1.visitCallSignature(source, children.shift()); - type_parameters = call_signature.type_parameters; - formal_parameters = call_signature.formal_parameters; - type_annotation = call_signature.type_annotation; - } - return { - type: 'function', - context: Node_1.createNode(source, node, properties), - comment: Node_1.createNode(source, comment, null, true), - isAync, - identifier, - type_parameters, - formal_parameters, - type_annotation, - properties - }; -} -exports.visitFunction = visitFunction; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24udmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvZnVuY3Rpb24udmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtDQUFxRDtBQUVyRCxxRUFBOEQ7QUFFOUQsZ0RBQXlDO0FBRXpDLFNBQWdCLGFBQWEsQ0FDekIsTUFBYyxFQUNkLElBQWdCLEVBQ2hCLE9BQW1CLEVBQ25CLFVBQW1DO0lBRW5DLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDN0IsSUFBSSxNQUFNLEdBQUcsS0FBSyxFQUNkLFVBQVUsRUFDVixlQUFlLEVBQ2YsaUJBQWlCLEVBQ2pCLGVBQWUsQ0FBQztJQUVwQixJQUFJLGVBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUU7UUFDN0IsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNkLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztLQUNwQjtJQUVELElBQUksZUFBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRTtRQUNoQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7S0FDcEI7SUFFRCxJQUFJLGVBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUU7UUFDbEMsVUFBVSxHQUFHLGlCQUFVLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO0tBQ3BEO0lBRUQsSUFBSSxlQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLEVBQUU7UUFDdEMsSUFBSSxjQUFjLEdBQUcsMkNBQWtCLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO1FBQ2pFLGVBQWUsR0FBRyxjQUFjLENBQUMsZUFBZSxDQUFDO1FBQ2pELGlCQUFpQixHQUFHLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQztRQUNyRCxlQUFlLEdBQUcsY0FBYyxDQUFDLGVBQWUsQ0FBQztLQUNwRDtJQUVELE9BQU87UUFDSCxJQUFJLEVBQUUsVUFBVTtRQUNoQixPQUFPLEVBQUUsaUJBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQztRQUM3QyxPQUFPLEVBQUUsaUJBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7UUFDaEQsTUFBTTtRQUNOLFVBQVU7UUFDVixlQUFlO1FBQ2YsaUJBQWlCO1FBQ2pCLGVBQWU7UUFDZixVQUFVO0tBQ2IsQ0FBQTtBQUVMLENBQUM7QUE3Q0Qsc0NBNkNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTm9kZVByb3BlcnRpZXMsIGNyZWF0ZU5vZGUgfSBmcm9tIFwiLi4vTm9kZVwiO1xuaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuaW1wb3J0IHsgdmlzaXRDYWxsU2lnbmF0dXJlIH0gZnJvbSBcIi4vY2FsbF9zaWduYXR1cmUudmlzaXRvclwiO1xuaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi4vLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2VcIjtcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbWF0Y2hcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHZpc2l0RnVuY3Rpb24oXG4gICAgc291cmNlOiBTb3VyY2UsXG4gICAgbm9kZTogU3ludGF4Tm9kZSxcbiAgICBjb21tZW50OiBTeW50YXhOb2RlLFxuICAgIHByb3BlcnRpZXM6IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+XG4pIHtcbiAgICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuICAgIGxldCBpc0F5bmMgPSBmYWxzZSxcbiAgICAgICAgaWRlbnRpZmllcixcbiAgICAgICAgdHlwZV9wYXJhbWV0ZXJzLFxuICAgICAgICBmb3JtYWxfcGFyYW1ldGVycyxcbiAgICAgICAgdHlwZV9hbm5vdGF0aW9uO1xuXG4gICAgaWYgKG1hdGNoKGNoaWxkcmVuWzBdLCAnYXN5bmMnKSkge1xuICAgICAgICBpc0F5bmMgPSB0cnVlO1xuICAgICAgICBjaGlsZHJlbi5zaGlmdCgpO1xuICAgIH1cblxuICAgIGlmIChtYXRjaChjaGlsZHJlblswXSwgJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgY2hpbGRyZW4uc2hpZnQoKTtcbiAgICB9XG5cbiAgICBpZiAobWF0Y2goY2hpbGRyZW5bMF0sICdpZGVudGlmaWVyJykpIHtcbiAgICAgICAgaWRlbnRpZmllciA9IGNyZWF0ZU5vZGUoc291cmNlLCBjaGlsZHJlbi5zaGlmdCgpKVxuICAgIH1cblxuICAgIGlmIChtYXRjaChjaGlsZHJlblswXSwgJ2NhbGxfc2lnbmF0dXJlJykpIHtcbiAgICAgICAgbGV0IGNhbGxfc2lnbmF0dXJlID0gdmlzaXRDYWxsU2lnbmF0dXJlKHNvdXJjZSwgY2hpbGRyZW4uc2hpZnQoKSlcbiAgICAgICAgdHlwZV9wYXJhbWV0ZXJzID0gY2FsbF9zaWduYXR1cmUudHlwZV9wYXJhbWV0ZXJzO1xuICAgICAgICBmb3JtYWxfcGFyYW1ldGVycyA9IGNhbGxfc2lnbmF0dXJlLmZvcm1hbF9wYXJhbWV0ZXJzO1xuICAgICAgICB0eXBlX2Fubm90YXRpb24gPSBjYWxsX3NpZ25hdHVyZS50eXBlX2Fubm90YXRpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2Z1bmN0aW9uJyxcbiAgICAgICAgY29udGV4dDogY3JlYXRlTm9kZShzb3VyY2UsIG5vZGUsIHByb3BlcnRpZXMpLFxuICAgICAgICBjb21tZW50OiBjcmVhdGVOb2RlKHNvdXJjZSwgY29tbWVudCwgbnVsbCwgdHJ1ZSksXG4gICAgICAgIGlzQXluYyxcbiAgICAgICAgaWRlbnRpZmllcixcbiAgICAgICAgdHlwZV9wYXJhbWV0ZXJzLFxuICAgICAgICBmb3JtYWxfcGFyYW1ldGVycyxcbiAgICAgICAgdHlwZV9hbm5vdGF0aW9uLFxuICAgICAgICBwcm9wZXJ0aWVzXG4gICAgfVxuXG59Il19 \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/method_definition.visitor.d.ts b/build/src/lang/typescript/visitors/method_definition.visitor.d.ts deleted file mode 100644 index c6af4ae..0000000 --- a/build/src/lang/typescript/visitors/method_definition.visitor.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { SyntaxNode } from "tree-sitter"; -import Source from "../../../interfaces/Source"; -export declare function visitMethodDefinition(source: Source, node: SyntaxNode, comment: SyntaxNode): { - type: string; - context: import("../Node").Node; - comment: import("../Node").Node; - accessibility: string; - async: boolean; - identifier: any; - type_parameters: any; - formal_parameters: any; - type_annotation: any; -}; diff --git a/build/src/lang/typescript/visitors/method_definition.visitor.js b/build/src/lang/typescript/visitors/method_definition.visitor.js deleted file mode 100644 index c96d1dc..0000000 --- a/build/src/lang/typescript/visitors/method_definition.visitor.js +++ /dev/null @@ -1,39 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const Node_1 = require("../Node"); -const text_1 = require("../../../utils/text"); -const call_signature_visitor_1 = require("./call_signature.visitor"); -const match_1 = require("../../../utils/match"); -function visitMethodDefinition(source, node, comment) { - let method_definition = node.children; - let accessibility = 'public', isAsync = false, identifier, type_parameters, formal_parameters, type_annotation; - if (match_1.default(method_definition[0], 'async')) { - isAsync = true; - method_definition.shift(); - } - if (match_1.default(method_definition[0], 'accessibility_modifier')) { - accessibility = text_1.text(source, method_definition.shift()); - } - if (match_1.default(method_definition[0], 'property_identifier')) { - identifier = Node_1.createNode(source, method_definition.shift()); - } - if (match_1.default(method_definition[0], 'call_signature')) { - const call_signature = call_signature_visitor_1.visitCallSignature(source, method_definition.shift()); - type_parameters = call_signature.type_parameters; - formal_parameters = call_signature.formal_parameters; - type_annotation = call_signature.type_annotation; - } - return { - type: 'method', - context: Node_1.createNode(source, node), - comment: Node_1.createNode(source, node, null, true), - accessibility, - async: isAsync, - identifier, - type_parameters, - formal_parameters, - type_annotation - }; -} -exports.visitMethodDefinition = visitMethodDefinition; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0aG9kX2RlZmluaXRpb24udmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvbWV0aG9kX2RlZmluaXRpb24udmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtDQUFxQztBQUVyQyw4Q0FBMkM7QUFDM0MscUVBQThEO0FBRTlELGdEQUF5QztBQUV6QyxTQUFnQixxQkFBcUIsQ0FBQyxNQUFjLEVBQUUsSUFBZ0IsRUFBRSxPQUFtQjtJQUN6RixJQUFJLGlCQUFpQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdEMsSUFBSSxhQUFhLEdBQUcsUUFBUSxFQUMxQixPQUFPLEdBQUcsS0FBSyxFQUNmLFVBQVUsRUFDVixlQUFlLEVBQ2YsaUJBQWlCLEVBQ2pCLGVBQWUsQ0FBQztJQUVsQixJQUFJLGVBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRTtRQUN4QyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ2YsaUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUM7S0FDM0I7SUFFRCxJQUFJLGVBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRSx3QkFBd0IsQ0FBQyxFQUFFO1FBQ3pELGFBQWEsR0FBRyxXQUFJLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUE7S0FDeEQ7SUFFRCxJQUFJLGVBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxFQUFFO1FBQ3RELFVBQVUsR0FBRyxpQkFBVSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO0tBQzNEO0lBRUQsSUFBSSxlQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsRUFBRTtRQUNqRCxNQUFNLGNBQWMsR0FBRywyQ0FBa0IsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQTtRQUM1RSxlQUFlLEdBQUcsY0FBYyxDQUFDLGVBQWUsQ0FBQztRQUNqRCxpQkFBaUIsR0FBRyxjQUFjLENBQUMsaUJBQWlCLENBQUM7UUFDckQsZUFBZSxHQUFHLGNBQWMsQ0FBQyxlQUFlLENBQUM7S0FDbEQ7SUFDRCxPQUFPO1FBQ0wsSUFBSSxFQUFFLFFBQVE7UUFDZCxPQUFPLEVBQUUsaUJBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDO1FBQ2pDLE9BQU8sRUFBRSxpQkFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztRQUM3QyxhQUFhO1FBQ2IsS0FBSyxFQUFFLE9BQU87UUFDZCxVQUFVO1FBQ1YsZUFBZTtRQUNmLGlCQUFpQjtRQUNqQixlQUFlO0tBQ2hCLENBQUE7QUFDSCxDQUFDO0FBdkNELHNEQXVDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZU5vZGUgfSBmcm9tIFwiLi4vTm9kZVwiO1xuaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuaW1wb3J0IHsgdGV4dCB9IGZyb20gXCIuLi8uLi8uLi91dGlscy90ZXh0XCI7XG5pbXBvcnQgeyB2aXNpdENhbGxTaWduYXR1cmUgfSBmcm9tIFwiLi9jYWxsX3NpZ25hdHVyZS52aXNpdG9yXCI7XG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi8uLi8uLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuaW1wb3J0IG1hdGNoIGZyb20gXCIuLi8uLi8uLi91dGlscy9tYXRjaFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRNZXRob2REZWZpbml0aW9uKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlLCBjb21tZW50OiBTeW50YXhOb2RlKSB7XG4gIGxldCBtZXRob2RfZGVmaW5pdGlvbiA9IG5vZGUuY2hpbGRyZW47XG4gIGxldCBhY2Nlc3NpYmlsaXR5ID0gJ3B1YmxpYycsXG4gICAgaXNBc3luYyA9IGZhbHNlLFxuICAgIGlkZW50aWZpZXIsXG4gICAgdHlwZV9wYXJhbWV0ZXJzLFxuICAgIGZvcm1hbF9wYXJhbWV0ZXJzLFxuICAgIHR5cGVfYW5ub3RhdGlvbjtcblxuICBpZiAobWF0Y2gobWV0aG9kX2RlZmluaXRpb25bMF0sICdhc3luYycpKSB7XG4gICAgaXNBc3luYyA9IHRydWU7XG4gICAgbWV0aG9kX2RlZmluaXRpb24uc2hpZnQoKTtcbiAgfVxuICBcbiAgaWYgKG1hdGNoKG1ldGhvZF9kZWZpbml0aW9uWzBdLCAnYWNjZXNzaWJpbGl0eV9tb2RpZmllcicpKSB7XG4gICAgYWNjZXNzaWJpbGl0eSA9IHRleHQoc291cmNlLCBtZXRob2RfZGVmaW5pdGlvbi5zaGlmdCgpKVxuICB9XG5cbiAgaWYgKG1hdGNoKG1ldGhvZF9kZWZpbml0aW9uWzBdLCAncHJvcGVydHlfaWRlbnRpZmllcicpKSB7XG4gICAgaWRlbnRpZmllciA9IGNyZWF0ZU5vZGUoc291cmNlLCBtZXRob2RfZGVmaW5pdGlvbi5zaGlmdCgpKVxuICB9XG5cbiAgaWYgKG1hdGNoKG1ldGhvZF9kZWZpbml0aW9uWzBdLCAnY2FsbF9zaWduYXR1cmUnKSkge1xuICAgIGNvbnN0IGNhbGxfc2lnbmF0dXJlID0gdmlzaXRDYWxsU2lnbmF0dXJlKHNvdXJjZSwgbWV0aG9kX2RlZmluaXRpb24uc2hpZnQoKSlcbiAgICB0eXBlX3BhcmFtZXRlcnMgPSBjYWxsX3NpZ25hdHVyZS50eXBlX3BhcmFtZXRlcnM7XG4gICAgZm9ybWFsX3BhcmFtZXRlcnMgPSBjYWxsX3NpZ25hdHVyZS5mb3JtYWxfcGFyYW1ldGVycztcbiAgICB0eXBlX2Fubm90YXRpb24gPSBjYWxsX3NpZ25hdHVyZS50eXBlX2Fubm90YXRpb247XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnbWV0aG9kJyxcbiAgICBjb250ZXh0OiBjcmVhdGVOb2RlKHNvdXJjZSwgbm9kZSksXG4gICAgY29tbWVudDogY3JlYXRlTm9kZShzb3VyY2UsIG5vZGUsIG51bGwsIHRydWUpLFxuICAgIGFjY2Vzc2liaWxpdHksXG4gICAgYXN5bmM6IGlzQXN5bmMsIFxuICAgIGlkZW50aWZpZXIsXG4gICAgdHlwZV9wYXJhbWV0ZXJzLFxuICAgIGZvcm1hbF9wYXJhbWV0ZXJzLFxuICAgIHR5cGVfYW5ub3RhdGlvblxuICB9XG59Il19 \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/node.visitor.d.ts b/build/src/lang/typescript/visitors/node.visitor.d.ts deleted file mode 100644 index 437ef76..0000000 --- a/build/src/lang/typescript/visitors/node.visitor.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { NodeProperties } from "../Node"; -import { SyntaxNode } from "tree-sitter"; -import Source from "../../../interfaces/Source"; -export declare function visitNode(source: Source, node: SyntaxNode, comment: SyntaxNode, properties: Partial): any; diff --git a/build/src/lang/typescript/visitors/node.visitor.js b/build/src/lang/typescript/visitors/node.visitor.js deleted file mode 100644 index 717e77d..0000000 --- a/build/src/lang/typescript/visitors/node.visitor.js +++ /dev/null @@ -1,32 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const class_visitor_1 = require("./class.visitor"); -const declaration_visitor_1 = require("./declaration.visitor"); -const function_visitor_1 = require("./function.visitor"); -const statement_visitor_1 = require("./statement.visitor"); -const log_1 = require("../../../utils/log"); -function visitNode(source, node, comment, properties) { - switch (node.type) { - case 'class': - return class_visitor_1.visitClass(source, node, comment, properties); - case 'function': - return function_visitor_1.visitFunction(source, node, comment, properties); - case 'comment': - // noop - break; - case 'ERROR': - log_1.default.report(source, node, log_1.ErrorType.TreeSitterParseError); - break; - default: - if (node.type.includes("statement")) { - return statement_visitor_1.visitStatement(source, node, comment, properties); - } - if (node.type.includes("declaration")) { - return declaration_visitor_1.visitDeclaration(source, node, comment, properties); - } - log_1.default.report(source, node, log_1.ErrorType.NodeTypeNotYetSupported); - break; - } -} -exports.visitNode = visitNode; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS52aXNpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xhbmcvdHlwZXNjcmlwdC92aXNpdG9ycy9ub2RlLnZpc2l0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQSxtREFBNkM7QUFDN0MsK0RBQXlEO0FBQ3pELHlEQUFtRDtBQUNuRCwyREFBcUQ7QUFFckQsNENBQW9EO0FBRXBELFNBQWdCLFNBQVMsQ0FDdkIsTUFBYyxFQUNkLElBQWdCLEVBQ2hCLE9BQW1CLEVBQ25CLFVBQW1DO0lBRW5DLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRTtRQUNqQixLQUFLLE9BQU87WUFDVixPQUFPLDBCQUFVLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDdkQsS0FBSyxVQUFVO1lBQ2IsT0FBTyxnQ0FBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzFELEtBQUssU0FBUztZQUNaLE9BQU87WUFDUCxNQUFNO1FBQ1IsS0FBSyxPQUFPO1lBQ1YsYUFBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQ3pELE1BQU07UUFDUjtZQUNFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUU7Z0JBQ25DLE9BQU8sa0NBQWMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQzthQUMxRDtZQUVELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3JDLE9BQU8sc0NBQWdCLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7YUFDNUQ7WUFFRCxhQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsZUFBUyxDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDNUQsTUFBTTtLQUNUO0FBQ0gsQ0FBQztBQTdCRCw4QkE2QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOb2RlUHJvcGVydGllcyB9IGZyb20gXCIuLi9Ob2RlXCI7XG5pbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgeyB2aXNpdENsYXNzIH0gZnJvbSBcIi4vY2xhc3MudmlzaXRvclwiO1xuaW1wb3J0IHsgdmlzaXREZWNsYXJhdGlvbiB9IGZyb20gXCIuL2RlY2xhcmF0aW9uLnZpc2l0b3JcIjtcbmltcG9ydCB7IHZpc2l0RnVuY3Rpb24gfSBmcm9tIFwiLi9mdW5jdGlvbi52aXNpdG9yXCI7XG5pbXBvcnQgeyB2aXNpdFN0YXRlbWVudCB9IGZyb20gXCIuL3N0YXRlbWVudC52aXNpdG9yXCI7XG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi8uLi8uLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuaW1wb3J0IGxvZywgeyBFcnJvclR5cGUgfSBmcm9tICcuLi8uLi8uLi91dGlscy9sb2cnO1xuXG5leHBvcnQgZnVuY3Rpb24gdmlzaXROb2RlKFxuICBzb3VyY2U6IFNvdXJjZSxcbiAgbm9kZTogU3ludGF4Tm9kZSxcbiAgY29tbWVudDogU3ludGF4Tm9kZSxcbiAgcHJvcGVydGllczogUGFydGlhbDxOb2RlUHJvcGVydGllcz5cbikge1xuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgJ2NsYXNzJzpcbiAgICAgIHJldHVybiB2aXNpdENsYXNzKHNvdXJjZSwgbm9kZSwgY29tbWVudCwgcHJvcGVydGllcyk7XG4gICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgcmV0dXJuIHZpc2l0RnVuY3Rpb24oc291cmNlLCBub2RlLCBjb21tZW50LCBwcm9wZXJ0aWVzKTtcbiAgICBjYXNlICdjb21tZW50JzpcbiAgICAgIC8vIG5vb3BcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0VSUk9SJzpcbiAgICAgIGxvZy5yZXBvcnQoc291cmNlLCBub2RlLCBFcnJvclR5cGUuVHJlZVNpdHRlclBhcnNlRXJyb3IpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGlmIChub2RlLnR5cGUuaW5jbHVkZXMoXCJzdGF0ZW1lbnRcIikpIHtcbiAgICAgICAgcmV0dXJuIHZpc2l0U3RhdGVtZW50KHNvdXJjZSwgbm9kZSwgY29tbWVudCwgcHJvcGVydGllcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLnR5cGUuaW5jbHVkZXMoXCJkZWNsYXJhdGlvblwiKSkge1xuICAgICAgICByZXR1cm4gdmlzaXREZWNsYXJhdGlvbihzb3VyY2UsIG5vZGUsIGNvbW1lbnQsIHByb3BlcnRpZXMpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBsb2cucmVwb3J0KHNvdXJjZSwgbm9kZSwgRXJyb3JUeXBlLk5vZGVUeXBlTm90WWV0U3VwcG9ydGVkKTtcbiAgICAgIGJyZWFrO1xuICB9XG59Il19 \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/program.visitor.d.ts b/build/src/lang/typescript/visitors/program.visitor.d.ts deleted file mode 100644 index 567c152..0000000 --- a/build/src/lang/typescript/visitors/program.visitor.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { SyntaxNode } from "tree-sitter"; -import Source from "../../../interfaces/Source"; -export declare function visitProgram(source: Source, node: SyntaxNode): any[]; diff --git a/build/src/lang/typescript/visitors/program.visitor.js b/build/src/lang/typescript/visitors/program.visitor.js deleted file mode 100644 index fb7b129..0000000 --- a/build/src/lang/typescript/visitors/program.visitor.js +++ /dev/null @@ -1,34 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const comment_1 = require("../../../utils/comment"); -const node_visitor_1 = require("./node.visitor"); -const match_1 = require("../../../utils/match"); -function visitProgram(source, node) { - let children = node.children; - if (node.children.length > 0) { - if (comment_1.isLegalComment(source, node.children[0])) { - // Remove the legal comment from ast - children = node.children.splice(1); - } - // Perf: O(n) - return children.map(child => { - const nextSibling = child.nextSibling; - // Determine if the node is a c-style comment - if (match_1.default(child, 'comment') && comment_1.isJavaDocComment(source, child)) { - // Determine whether a comment has a sibling - if (nextSibling) { - // Visit the sibling - // Perf: Possibly O(n^2) - return node_visitor_1.visitNode(source, nextSibling, child, { - exports: { - export: false, - default: false - } - }); - } - } - }).filter(child => !!child); - } -} -exports.visitProgram = visitProgram; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3JhbS52aXNpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xhbmcvdHlwZXNjcmlwdC92aXNpdG9ycy9wcm9ncmFtLnZpc2l0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxvREFBMEU7QUFFMUUsaURBQTJDO0FBRTNDLGdEQUF5QztBQUV6QyxTQUFnQixZQUFZLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQzNELElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDN0IsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDNUIsSUFBSSx3QkFBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDNUMsb0NBQW9DO1lBQ3BDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNwQztRQUNELGFBQWE7UUFDYixPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDMUIsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztZQUN0Qyw2Q0FBNkM7WUFDN0MsSUFBSSxlQUFLLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxJQUFJLDBCQUFnQixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRTtnQkFDOUQsNENBQTRDO2dCQUM1QyxJQUFJLFdBQVcsRUFBRTtvQkFDZixvQkFBb0I7b0JBQ3BCLHdCQUF3QjtvQkFDeEIsT0FBTyx3QkFBUyxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFO3dCQUMzQyxPQUFPLEVBQUU7NEJBQ1AsTUFBTSxFQUFFLEtBQUs7NEJBQ2IsT0FBTyxFQUFFLEtBQUs7eUJBQ2Y7cUJBQ0YsQ0FBQyxDQUFDO2lCQUNKO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDN0I7QUFDSCxDQUFDO0FBMUJELG9DQTBCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzSmF2YURvY0NvbW1lbnQsIGlzTGVnYWxDb21tZW50IH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2NvbW1lbnRcIjtcbmltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcbmltcG9ydCB7IHZpc2l0Tm9kZSB9IGZyb20gXCIuL25vZGUudmlzaXRvclwiO1xuaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi4vLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2VcIjtcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbWF0Y2hcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHZpc2l0UHJvZ3JhbShzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSkge1xuICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgaWYgKGlzTGVnYWxDb21tZW50KHNvdXJjZSwgbm9kZS5jaGlsZHJlblswXSkpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgbGVnYWwgY29tbWVudCBmcm9tIGFzdFxuICAgICAgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuLnNwbGljZSgxKTtcbiAgICB9XG4gICAgLy8gUGVyZjogTyhuKVxuICAgIHJldHVybiBjaGlsZHJlbi5tYXAoY2hpbGQgPT4ge1xuICAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSBjaGlsZC5uZXh0U2libGluZztcbiAgICAgIC8vIERldGVybWluZSBpZiB0aGUgbm9kZSBpcyBhIGMtc3R5bGUgY29tbWVudFxuICAgICAgaWYgKG1hdGNoKGNoaWxkLCAnY29tbWVudCcpICYmIGlzSmF2YURvY0NvbW1lbnQoc291cmNlLCBjaGlsZCkpIHtcbiAgICAgICAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgYSBjb21tZW50IGhhcyBhIHNpYmxpbmdcbiAgICAgICAgaWYgKG5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgLy8gVmlzaXQgdGhlIHNpYmxpbmdcbiAgICAgICAgICAvLyBQZXJmOiBQb3NzaWJseSBPKG5eMilcbiAgICAgICAgICByZXR1cm4gdmlzaXROb2RlKHNvdXJjZSwgbmV4dFNpYmxpbmcsIGNoaWxkLCB7XG4gICAgICAgICAgICBleHBvcnRzOiB7XG4gICAgICAgICAgICAgIGV4cG9ydDogZmFsc2UsXG4gICAgICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KS5maWx0ZXIoY2hpbGQgPT4gISFjaGlsZCk7XG4gIH1cbn0iXX0= \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/public_field_definition.visitor.d.ts b/build/src/lang/typescript/visitors/public_field_definition.visitor.d.ts deleted file mode 100644 index 3fb951b..0000000 --- a/build/src/lang/typescript/visitors/public_field_definition.visitor.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SyntaxNode } from "tree-sitter"; -import Source from "../../../interfaces/Source"; -export declare function visitPublicFieldDefinition(source: Source, node: SyntaxNode, comment: SyntaxNode): { - type: string; - context: import("../Node").Node; - comment: import("../Node").Node; - identifier: any; - accessibility: string; - type_annotation: any; -}; diff --git a/build/src/lang/typescript/visitors/public_field_definition.visitor.js b/build/src/lang/typescript/visitors/public_field_definition.visitor.js deleted file mode 100644 index 1380ee7..0000000 --- a/build/src/lang/typescript/visitors/public_field_definition.visitor.js +++ /dev/null @@ -1,30 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const Node_1 = require("../Node"); -const text_1 = require("../../../utils/text"); -const type_visitor_1 = require("./type.visitor"); -const match_1 = require("../../../utils/match"); -function visitPublicFieldDefinition(source, node, comment) { - let public_field_definition = node.children; - let accessibility = 'public', identifier, type_annotation; - if (match_1.default(public_field_definition[0], 'accessibility_modifier')) { - accessibility = text_1.text(source, public_field_definition.shift()); - } - if (match_1.default(public_field_definition[0], 'property_identifier')) { - identifier = Node_1.createNode(source, public_field_definition.shift()); - } - if (match_1.default(public_field_definition[0], 'type_annotation')) { - let type = public_field_definition.shift().children[1]; - type_annotation = type_visitor_1.visitType(source, type); - } - return { - type: 'property', - context: Node_1.createNode(source, node), - comment: Node_1.createNode(source, comment, null, true), - identifier, - accessibility, - type_annotation - }; -} -exports.visitPublicFieldDefinition = visitPublicFieldDefinition; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2ZpZWxkX2RlZmluaXRpb24udmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvcHVibGljX2ZpZWxkX2RlZmluaXRpb24udmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtDQUFxQztBQUVyQyw4Q0FBMkM7QUFDM0MsaURBQTJDO0FBRTNDLGdEQUF5QztBQUV6QyxTQUFnQiwwQkFBMEIsQ0FBQyxNQUFjLEVBQUUsSUFBZ0IsRUFBRSxPQUFtQjtJQUM5RixJQUFJLHVCQUF1QixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDNUMsSUFBSSxhQUFhLEdBQUcsUUFBUSxFQUMxQixVQUFVLEVBQ1YsZUFBZSxDQUFDO0lBRWxCLElBQUksZUFBSyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxFQUFFLHdCQUF3QixDQUFDLEVBQUU7UUFDL0QsYUFBYSxHQUFHLFdBQUksQ0FBQyxNQUFNLEVBQUUsdUJBQXVCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUMvRDtJQUVELElBQUksZUFBSyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxFQUFFLHFCQUFxQixDQUFDLEVBQUU7UUFDNUQsVUFBVSxHQUFHLGlCQUFVLENBQUMsTUFBTSxFQUFFLHVCQUF1QixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDbEU7SUFFRCxJQUFJLGVBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFO1FBQ3hELElBQUksSUFBSSxHQUFHLHVCQUF1QixDQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RCxlQUFlLEdBQUcsd0JBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDM0M7SUFDRCxPQUFPO1FBQ0wsSUFBSSxFQUFFLFVBQVU7UUFDaEIsT0FBTyxFQUFFLGlCQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztRQUNqQyxPQUFPLEVBQUUsaUJBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7UUFDaEQsVUFBVTtRQUNWLGFBQWE7UUFDYixlQUFlO0tBQ2hCLENBQUE7QUFDSCxDQUFDO0FBMUJELGdFQTBCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZU5vZGUgfSBmcm9tIFwiLi4vTm9kZVwiO1xuaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuaW1wb3J0IHsgdGV4dCB9IGZyb20gXCIuLi8uLi8uLi91dGlscy90ZXh0XCI7XG5pbXBvcnQgeyB2aXNpdFR5cGUgfSBmcm9tIFwiLi90eXBlLnZpc2l0b3JcIjtcbmltcG9ydCBTb3VyY2UgZnJvbSBcIi4uLy4uLy4uL2ludGVyZmFjZXMvU291cmNlXCI7XG5pbXBvcnQgbWF0Y2ggZnJvbSBcIi4uLy4uLy4uL3V0aWxzL21hdGNoXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiB2aXNpdFB1YmxpY0ZpZWxkRGVmaW5pdGlvbihzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSwgY29tbWVudDogU3ludGF4Tm9kZSkge1xuICBsZXQgcHVibGljX2ZpZWxkX2RlZmluaXRpb24gPSBub2RlLmNoaWxkcmVuO1xuICBsZXQgYWNjZXNzaWJpbGl0eSA9ICdwdWJsaWMnLFxuICAgIGlkZW50aWZpZXIsXG4gICAgdHlwZV9hbm5vdGF0aW9uO1xuXG4gIGlmIChtYXRjaChwdWJsaWNfZmllbGRfZGVmaW5pdGlvblswXSwgJ2FjY2Vzc2liaWxpdHlfbW9kaWZpZXInKSkge1xuICAgIGFjY2Vzc2liaWxpdHkgPSB0ZXh0KHNvdXJjZSwgcHVibGljX2ZpZWxkX2RlZmluaXRpb24uc2hpZnQoKSk7XG4gIH1cblxuICBpZiAobWF0Y2gocHVibGljX2ZpZWxkX2RlZmluaXRpb25bMF0sICdwcm9wZXJ0eV9pZGVudGlmaWVyJykpIHtcbiAgICBpZGVudGlmaWVyID0gY3JlYXRlTm9kZShzb3VyY2UsIHB1YmxpY19maWVsZF9kZWZpbml0aW9uLnNoaWZ0KCkpO1xuICB9XG5cbiAgaWYgKG1hdGNoKHB1YmxpY19maWVsZF9kZWZpbml0aW9uWzBdLCAndHlwZV9hbm5vdGF0aW9uJykpIHtcbiAgICBsZXQgdHlwZSA9IHB1YmxpY19maWVsZF9kZWZpbml0aW9uLnNoaWZ0KCkuY2hpbGRyZW5bMV07XG4gICAgdHlwZV9hbm5vdGF0aW9uID0gdmlzaXRUeXBlKHNvdXJjZSwgdHlwZSk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAncHJvcGVydHknLFxuICAgIGNvbnRleHQ6IGNyZWF0ZU5vZGUoc291cmNlLCBub2RlKSxcbiAgICBjb21tZW50OiBjcmVhdGVOb2RlKHNvdXJjZSwgY29tbWVudCwgbnVsbCwgdHJ1ZSksXG4gICAgaWRlbnRpZmllcixcbiAgICBhY2Nlc3NpYmlsaXR5LFxuICAgIHR5cGVfYW5ub3RhdGlvblxuICB9XG59Il19 \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/statement.visitor.d.ts b/build/src/lang/typescript/visitors/statement.visitor.d.ts deleted file mode 100644 index d765f04..0000000 --- a/build/src/lang/typescript/visitors/statement.visitor.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { NodeProperties } from "../Node"; -import { SyntaxNode } from "tree-sitter"; -import Source from "../../../interfaces/Source"; -export declare function visitStatement(source: Source, node: SyntaxNode, comment: SyntaxNode, properties: Partial): any; -export declare function visitExpressionStatement(source: Source, node: SyntaxNode, comment: SyntaxNode, properties: Partial): any; -export declare function visitExportStatement(source: Source, node: SyntaxNode, comment: SyntaxNode): any; diff --git a/build/src/lang/typescript/visitors/statement.visitor.js b/build/src/lang/typescript/visitors/statement.visitor.js deleted file mode 100644 index deff783..0000000 --- a/build/src/lang/typescript/visitors/statement.visitor.js +++ /dev/null @@ -1,37 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const node_visitor_1 = require("./node.visitor"); -const log_1 = require("../../../utils/log"); -const match_1 = require("../../../utils/match"); -function visitStatement(source, node, comment, properties) { - switch (node.type) { - case 'expression_statement': - return visitExpressionStatement(source, node, comment, properties); - case 'export_statement': - return visitExportStatement(source, node, comment); - default: - log_1.default.report(source, node, log_1.ErrorType.NodeTypeNotYetSupported); - break; - } -} -exports.visitStatement = visitStatement; -function visitExpressionStatement(source, node, comment, properties) { - return node_visitor_1.visitNode(source, node.children.shift(), comment, properties); -} -exports.visitExpressionStatement = visitExpressionStatement; -function visitExportStatement(source, node, comment) { - let children = node.children, isDefaultExport = false; - if (children.length > 1 && match_1.default(children.shift(), 'export')) { - } - if (children.length > 1 && match_1.default(children.shift(), 'default')) { - isDefaultExport = true; - } - return node_visitor_1.visitNode(source, children.shift(), comment, { - exports: { - export: true, - default: isDefaultExport - } - }); -} -exports.visitExportStatement = visitExportStatement; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGVtZW50LnZpc2l0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGFuZy90eXBlc2NyaXB0L3Zpc2l0b3JzL3N0YXRlbWVudC52aXNpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsaURBQTJDO0FBRTNDLDRDQUFvRDtBQUNwRCxnREFBeUM7QUFFekMsU0FBZ0IsY0FBYyxDQUM1QixNQUFjLEVBQ2QsSUFBZ0IsRUFDaEIsT0FBbUIsRUFDbkIsVUFBbUM7SUFFbkMsUUFBTyxJQUFJLENBQUMsSUFBSSxFQUFFO1FBQ2hCLEtBQUssc0JBQXNCO1lBQ3pCLE9BQU8sd0JBQXdCLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDckUsS0FBSyxrQkFBa0I7WUFDckIsT0FBTyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3JEO1lBQ0UsYUFBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1lBQzVELE1BQU07S0FDVDtBQUNILENBQUM7QUFmRCx3Q0FlQztBQUVELFNBQWdCLHdCQUF3QixDQUN0QyxNQUFjLEVBQ2QsSUFBZ0IsRUFDaEIsT0FBbUIsRUFDbkIsVUFBbUM7SUFFbkMsT0FBTyx3QkFBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBUEQsNERBT0M7QUFFRCxTQUFnQixvQkFBb0IsQ0FDbEMsTUFBYyxFQUNkLElBQWdCLEVBQ2hCLE9BQW1CO0lBRW5CLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQzFCLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFFMUIsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxlQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFO0tBQzdEO0lBRUQsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxlQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLFNBQVMsQ0FBQyxFQUFFO1FBQzdELGVBQWUsR0FBRyxJQUFJLENBQUM7S0FDeEI7SUFDRCxPQUFPLHdCQUFTLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUU7UUFDbEQsT0FBTyxFQUFFO1lBQ1AsTUFBTSxFQUFFLElBQUk7WUFDWixPQUFPLEVBQUUsZUFBZTtTQUN6QjtLQUNGLENBQUMsQ0FBQztBQUNMLENBQUM7QUFwQkQsb0RBb0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTm9kZVByb3BlcnRpZXMgfSBmcm9tIFwiLi4vTm9kZVwiO1xuaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuaW1wb3J0IHsgdmlzaXROb2RlIH0gZnJvbSBcIi4vbm9kZS52aXNpdG9yXCI7XG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi8uLi8uLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuaW1wb3J0IGxvZywgeyBFcnJvclR5cGUgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbG9nXCI7XG5pbXBvcnQgbWF0Y2ggZnJvbSBcIi4uLy4uLy4uL3V0aWxzL21hdGNoXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiB2aXNpdFN0YXRlbWVudChcbiAgc291cmNlOiBTb3VyY2UsXG4gIG5vZGU6IFN5bnRheE5vZGUsXG4gIGNvbW1lbnQ6IFN5bnRheE5vZGUsXG4gIHByb3BlcnRpZXM6IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+XG4pIHtcbiAgc3dpdGNoKG5vZGUudHlwZSkge1xuICAgIGNhc2UgJ2V4cHJlc3Npb25fc3RhdGVtZW50JzpcbiAgICAgIHJldHVybiB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQoc291cmNlLCBub2RlLCBjb21tZW50LCBwcm9wZXJ0aWVzKTtcbiAgICBjYXNlICdleHBvcnRfc3RhdGVtZW50JzpcbiAgICAgIHJldHVybiB2aXNpdEV4cG9ydFN0YXRlbWVudChzb3VyY2UsIG5vZGUsIGNvbW1lbnQpO1xuICAgIGRlZmF1bHQ6XG4gICAgICBsb2cucmVwb3J0KHNvdXJjZSwgbm9kZSwgRXJyb3JUeXBlLk5vZGVUeXBlTm90WWV0U3VwcG9ydGVkKTtcbiAgICAgIGJyZWFrO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQoXG4gIHNvdXJjZTogU291cmNlLFxuICBub2RlOiBTeW50YXhOb2RlLFxuICBjb21tZW50OiBTeW50YXhOb2RlLFxuICBwcm9wZXJ0aWVzOiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPlxuKSB7XG4gIHJldHVybiB2aXNpdE5vZGUoc291cmNlLCBub2RlLmNoaWxkcmVuLnNoaWZ0KCksIGNvbW1lbnQsIHByb3BlcnRpZXMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRFeHBvcnRTdGF0ZW1lbnQoXG4gIHNvdXJjZTogU291cmNlLFxuICBub2RlOiBTeW50YXhOb2RlLFxuICBjb21tZW50OiBTeW50YXhOb2RlLFxuKSB7XG4gIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4sXG4gICAgaXNEZWZhdWx0RXhwb3J0ID0gZmFsc2U7XG5cbiAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDEgJiYgbWF0Y2goY2hpbGRyZW4uc2hpZnQoKSwgJ2V4cG9ydCcpKSB7XG4gIH1cblxuICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMSAmJiBtYXRjaChjaGlsZHJlbi5zaGlmdCgpLCAnZGVmYXVsdCcpKSB7XG4gICAgaXNEZWZhdWx0RXhwb3J0ID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gdmlzaXROb2RlKHNvdXJjZSwgY2hpbGRyZW4uc2hpZnQoKSwgY29tbWVudCwge1xuICAgIGV4cG9ydHM6IHtcbiAgICAgIGV4cG9ydDogdHJ1ZSxcbiAgICAgIGRlZmF1bHQ6IGlzRGVmYXVsdEV4cG9ydFxuICAgIH1cbiAgfSk7XG59Il19 \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/type.visitor.d.ts b/build/src/lang/typescript/visitors/type.visitor.d.ts deleted file mode 100644 index ac72a6b..0000000 --- a/build/src/lang/typescript/visitors/type.visitor.d.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { SyntaxNode } from "tree-sitter"; -import Source from "../../../interfaces/Source"; -export declare function visitTypeOrTypeIdentifier(source: Source, node: SyntaxNode): any; -export declare function visitType(source: Source, node: SyntaxNode): any; -export declare function visitTypeIdentifier(source: Source, node: SyntaxNode): { - type: string; - context: import("../Node").Node; -}; -export declare function visitUnionType(source: Source, node: SyntaxNode): any; -export declare function visitIntersectionType(source: Source, node: SyntaxNode): { - type: string; - context: import("../Node").Node; - left: any; - right: any; -}; -export declare function visitParenthesizedType(source: Source, node: SyntaxNode): { - type: string; - context: import("../Node").Node; - parenthesized: any; -}; -export declare function visitGenericType(source: Source, node: SyntaxNode): any; -export declare function visitPredefinedType(source: Source, node: SyntaxNode): { - type: string; - context: import("../Node").Node; -}; diff --git a/build/src/lang/typescript/visitors/type.visitor.js b/build/src/lang/typescript/visitors/type.visitor.js deleted file mode 100644 index 8570e2e..0000000 --- a/build/src/lang/typescript/visitors/type.visitor.js +++ /dev/null @@ -1,85 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const Node_1 = require("../Node"); -const type_arguments_visitor_1 = require("./type_arguments.visitor"); -const log_1 = require("../../../utils/log"); -function visitTypeOrTypeIdentifier(source, node) { - if (node.type === 'type_identifier') { - return visitTypeIdentifier(source, node); - } - return visitType(source, node); -} -exports.visitTypeOrTypeIdentifier = visitTypeOrTypeIdentifier; -function visitType(source, node) { - switch (node.type) { - case 'union_type': - return visitUnionType(source, node); - case 'intersection_type': - return visitIntersectionType(source, node); - case 'parenthesized_type': - return visitParenthesizedType(source, node); - case 'type_identifier': - return visitTypeIdentifier(source, node); - case 'generic_type': - return visitGenericType(source, node); - case 'predefined_type': - return visitPredefinedType(source, node); - default: - log_1.default.report(source, node, log_1.ErrorType.NodeTypeNotYetSupported); - break; - } -} -exports.visitType = visitType; -function visitTypeIdentifier(source, node) { - return { - type: node.type, - context: Node_1.createNode(source, node) - }; -} -exports.visitTypeIdentifier = visitTypeIdentifier; -function visitUnionType(source, node) { - const union = node.children; - return { - type: node.type, - context: Node_1.createNode(source, node), - left: visitTypeOrTypeIdentifier(source, union[0]), - right: visitTypeOrTypeIdentifier(source, union[2]) - }; -} -exports.visitUnionType = visitUnionType; -function visitIntersectionType(source, node) { - const intersect = node.children; - return { - type: node.type, - context: Node_1.createNode(source, node), - left: visitTypeOrTypeIdentifier(source, intersect[0]), - right: visitTypeOrTypeIdentifier(source, intersect[2]) - }; -} -exports.visitIntersectionType = visitIntersectionType; -function visitParenthesizedType(source, node) { - return { - type: node.type, - context: Node_1.createNode(source, node), - parenthesized: visitTypeOrTypeIdentifier(source, node.children[1]) - }; -} -exports.visitParenthesizedType = visitParenthesizedType; -function visitGenericType(source, node) { - let children = node.children; - return { - type: node.type, - context: Node_1.createNode(source, node), - generic: visitTypeIdentifier(source, children.shift()), - type_arguments: type_arguments_visitor_1.visitTypeArguments(source, children.shift()) - }; -} -exports.visitGenericType = visitGenericType; -function visitPredefinedType(source, node) { - return { - type: node.type, - context: Node_1.createNode(source, node.children.shift()), - }; -} -exports.visitPredefinedType = visitPredefinedType; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS52aXNpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xhbmcvdHlwZXNjcmlwdC92aXNpdG9ycy90eXBlLnZpc2l0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxrQ0FBcUM7QUFFckMscUVBQThEO0FBRTlELDRDQUFvRDtBQUVwRCxTQUFnQix5QkFBeUIsQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDeEUsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGlCQUFpQixFQUFFO1FBQ25DLE9BQU8sbUJBQW1CLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFBO0tBQ3pDO0lBQ0QsT0FBTyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2pDLENBQUM7QUFMRCw4REFLQztBQUVELFNBQWdCLFNBQVMsQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDeEQsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO1FBQ2pCLEtBQUssWUFBWTtZQUNmLE9BQU8sY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN0QyxLQUFLLG1CQUFtQjtZQUN0QixPQUFPLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM3QyxLQUFLLG9CQUFvQjtZQUN2QixPQUFPLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM5QyxLQUFLLGlCQUFpQjtZQUNwQixPQUFPLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMzQyxLQUFLLGNBQWM7WUFDakIsT0FBTyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDeEMsS0FBSyxpQkFBaUI7WUFDcEIsT0FBTyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0M7WUFDQSxhQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsZUFBUyxDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDNUQsTUFBTTtLQUNQO0FBQ0gsQ0FBQztBQWxCRCw4QkFrQkM7QUFFRCxTQUFnQixtQkFBbUIsQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDbEUsT0FBTztRQUNMLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtRQUNmLE9BQU8sRUFBRSxpQkFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7S0FDbEMsQ0FBQTtBQUNILENBQUM7QUFMRCxrREFLQztBQUVELFNBQWdCLGNBQWMsQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDN0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUM1QixPQUFPO1FBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1FBQ2YsT0FBTyxFQUFFLGlCQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztRQUNqQyxJQUFJLEVBQUUseUJBQXlCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRCxLQUFLLEVBQUUseUJBQXlCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNuRCxDQUFBO0FBQ0gsQ0FBQztBQVJELHdDQVFDO0FBRUQsU0FBZ0IscUJBQXFCLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQ3BFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDaEMsT0FBTztRQUNMLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtRQUNmLE9BQU8sRUFBRSxpQkFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7UUFDakMsSUFBSSxFQUFFLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckQsS0FBSyxFQUFFLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDdkQsQ0FBQTtBQUNILENBQUM7QUFSRCxzREFRQztBQUVELFNBQWdCLHNCQUFzQixDQUFDLE1BQWMsRUFBRSxJQUFnQjtJQUNyRSxPQUFPO1FBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1FBQ2YsT0FBTyxFQUFFLGlCQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztRQUNqQyxhQUFhLEVBQUUseUJBQXlCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDbkUsQ0FBQTtBQUNILENBQUM7QUFORCx3REFNQztBQUVELFNBQWdCLGdCQUFnQixDQUFDLE1BQWMsRUFBRSxJQUFnQjtJQUMvRCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQzdCLE9BQU87UUFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7UUFDZixPQUFPLEVBQUUsaUJBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDO1FBQ2pDLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3RELGNBQWMsRUFBRSwyQ0FBa0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO0tBQzdELENBQUE7QUFDSCxDQUFDO0FBUkQsNENBUUM7QUFFRCxTQUFnQixtQkFBbUIsQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDbEUsT0FBTztRQUNMLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtRQUNmLE9BQU8sRUFBRSxpQkFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO0tBQ25ELENBQUE7QUFDSCxDQUFDO0FBTEQsa0RBS0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVOb2RlIH0gZnJvbSBcIi4uL05vZGVcIjtcbmltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcbmltcG9ydCB7IHZpc2l0VHlwZUFyZ3VtZW50cyB9IGZyb20gXCIuL3R5cGVfYXJndW1lbnRzLnZpc2l0b3JcIjtcbmltcG9ydCBTb3VyY2UgZnJvbSBcIi4uLy4uLy4uL2ludGVyZmFjZXMvU291cmNlXCI7XG5pbXBvcnQgbG9nLCB7IEVycm9yVHlwZSB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9sb2dcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHZpc2l0VHlwZU9yVHlwZUlkZW50aWZpZXIoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ3R5cGVfaWRlbnRpZmllcicpIHtcbiAgICByZXR1cm4gdmlzaXRUeXBlSWRlbnRpZmllcihzb3VyY2UsIG5vZGUpXG4gIH1cbiAgcmV0dXJuIHZpc2l0VHlwZShzb3VyY2UsIG5vZGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRUeXBlKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlKSB7XG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSAndW5pb25fdHlwZSc6XG4gICAgICByZXR1cm4gdmlzaXRVbmlvblR5cGUoc291cmNlLCBub2RlKTtcbiAgICBjYXNlICdpbnRlcnNlY3Rpb25fdHlwZSc6XG4gICAgICByZXR1cm4gdmlzaXRJbnRlcnNlY3Rpb25UeXBlKHNvdXJjZSwgbm9kZSk7XG4gICAgY2FzZSAncGFyZW50aGVzaXplZF90eXBlJzpcbiAgICAgIHJldHVybiB2aXNpdFBhcmVudGhlc2l6ZWRUeXBlKHNvdXJjZSwgbm9kZSk7XG4gICAgY2FzZSAndHlwZV9pZGVudGlmaWVyJzpcbiAgICAgIHJldHVybiB2aXNpdFR5cGVJZGVudGlmaWVyKHNvdXJjZSwgbm9kZSk7XG4gICAgY2FzZSAnZ2VuZXJpY190eXBlJzpcbiAgICAgIHJldHVybiB2aXNpdEdlbmVyaWNUeXBlKHNvdXJjZSwgbm9kZSk7XG4gICAgY2FzZSAncHJlZGVmaW5lZF90eXBlJzpcbiAgICAgIHJldHVybiB2aXNpdFByZWRlZmluZWRUeXBlKHNvdXJjZSwgbm9kZSk7XG4gICAgZGVmYXVsdDpcbiAgICBsb2cucmVwb3J0KHNvdXJjZSwgbm9kZSwgRXJyb3JUeXBlLk5vZGVUeXBlTm90WWV0U3VwcG9ydGVkKTtcbiAgICBicmVhaztcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRUeXBlSWRlbnRpZmllcihzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IG5vZGUudHlwZSxcbiAgICBjb250ZXh0OiBjcmVhdGVOb2RlKHNvdXJjZSwgbm9kZSlcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRVbmlvblR5cGUoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgY29uc3QgdW5pb24gPSBub2RlLmNoaWxkcmVuO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IG5vZGUudHlwZSxcbiAgICBjb250ZXh0OiBjcmVhdGVOb2RlKHNvdXJjZSwgbm9kZSksXG4gICAgbGVmdDogdmlzaXRUeXBlT3JUeXBlSWRlbnRpZmllcihzb3VyY2UsIHVuaW9uWzBdKSxcbiAgICByaWdodDogdmlzaXRUeXBlT3JUeXBlSWRlbnRpZmllcihzb3VyY2UsIHVuaW9uWzJdKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2aXNpdEludGVyc2VjdGlvblR5cGUoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgY29uc3QgaW50ZXJzZWN0ID0gbm9kZS5jaGlsZHJlbjtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBub2RlLnR5cGUsXG4gICAgY29udGV4dDogY3JlYXRlTm9kZShzb3VyY2UsIG5vZGUpLFxuICAgIGxlZnQ6IHZpc2l0VHlwZU9yVHlwZUlkZW50aWZpZXIoc291cmNlLCBpbnRlcnNlY3RbMF0pLFxuICAgIHJpZ2h0OiB2aXNpdFR5cGVPclR5cGVJZGVudGlmaWVyKHNvdXJjZSwgaW50ZXJzZWN0WzJdKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2aXNpdFBhcmVudGhlc2l6ZWRUeXBlKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogbm9kZS50eXBlLFxuICAgIGNvbnRleHQ6IGNyZWF0ZU5vZGUoc291cmNlLCBub2RlKSxcbiAgICBwYXJlbnRoZXNpemVkOiB2aXNpdFR5cGVPclR5cGVJZGVudGlmaWVyKHNvdXJjZSwgbm9kZS5jaGlsZHJlblsxXSlcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRHZW5lcmljVHlwZShzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSkge1xuICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IG5vZGUudHlwZSxcbiAgICBjb250ZXh0OiBjcmVhdGVOb2RlKHNvdXJjZSwgbm9kZSksXG4gICAgZ2VuZXJpYzogdmlzaXRUeXBlSWRlbnRpZmllcihzb3VyY2UsIGNoaWxkcmVuLnNoaWZ0KCkpLFxuICAgIHR5cGVfYXJndW1lbnRzOiB2aXNpdFR5cGVBcmd1bWVudHMoc291cmNlLCBjaGlsZHJlbi5zaGlmdCgpKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2aXNpdFByZWRlZmluZWRUeXBlKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogbm9kZS50eXBlLFxuICAgIGNvbnRleHQ6IGNyZWF0ZU5vZGUoc291cmNlLCBub2RlLmNoaWxkcmVuLnNoaWZ0KCkpLFxuICB9XG59Il19 \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/type_arguments.visitor.d.ts b/build/src/lang/typescript/visitors/type_arguments.visitor.d.ts deleted file mode 100644 index 493d1e2..0000000 --- a/build/src/lang/typescript/visitors/type_arguments.visitor.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { SyntaxNode } from "tree-sitter"; -import Source from "../../../interfaces/Source"; -export declare function visitTypeArguments(source: Source, node: SyntaxNode): any; diff --git a/build/src/lang/typescript/visitors/type_arguments.visitor.js b/build/src/lang/typescript/visitors/type_arguments.visitor.js deleted file mode 100644 index 16cd690..0000000 --- a/build/src/lang/typescript/visitors/type_arguments.visitor.js +++ /dev/null @@ -1,10 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const type_visitor_1 = require("./type.visitor"); -function visitTypeArguments(source, node) { - return node.children - .filter(child => !child.type.match(/[<>,]/)) - .map(child => type_visitor_1.visitType(source, child)); -} -exports.visitTypeArguments = visitTypeArguments; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZV9hcmd1bWVudHMudmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvdHlwZV9hcmd1bWVudHMudmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLGlEQUEyQztBQUczQyxTQUFnQixrQkFBa0IsQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDL0QsT0FBTyxJQUFJLENBQUMsUUFBUTtTQUNuQixNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzNDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLHdCQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7QUFDM0MsQ0FBQztBQUpELGdEQUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuaW1wb3J0IHsgdmlzaXRUeXBlIH0gZnJvbSBcIi4vdHlwZS52aXNpdG9yXCI7XG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi8uLi8uLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRUeXBlQXJndW1lbnRzKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlKSB7XG4gICAgcmV0dXJuIG5vZGUuY2hpbGRyZW5cbiAgICAuZmlsdGVyKGNoaWxkID0+ICFjaGlsZC50eXBlLm1hdGNoKC9bPD4sXS8pKVxuICAgIC5tYXAoY2hpbGQgPT4gdmlzaXRUeXBlKHNvdXJjZSwgY2hpbGQpKVxufSJdfQ== \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/type_parameters.visitor.d.ts b/build/src/lang/typescript/visitors/type_parameters.visitor.d.ts deleted file mode 100644 index 236c8b5..0000000 --- a/build/src/lang/typescript/visitors/type_parameters.visitor.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SyntaxNode } from "tree-sitter"; -import Source from "../../../interfaces/Source"; -export default function visitTypeParameters(source: Source, node: SyntaxNode): { - type: string; - context: import("../Node").Node; - parameters: { - type: string; - context: import("../Node").Node; - }[]; -}; diff --git a/build/src/lang/typescript/visitors/type_parameters.visitor.js b/build/src/lang/typescript/visitors/type_parameters.visitor.js deleted file mode 100644 index e0e5926..0000000 --- a/build/src/lang/typescript/visitors/type_parameters.visitor.js +++ /dev/null @@ -1,14 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const Node_1 = require("../Node"); -function visitTypeParameters(source, node) { - return { - type: node.type, - context: Node_1.createNode(source, node), - parameters: node.children - .filter(child => !child.type.match(/[<>,]/)) - .map(child => ({ type: child.type, context: Node_1.createNode(source, child) })) - }; -} -exports.default = visitTypeParameters; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZV9wYXJhbWV0ZXJzLnZpc2l0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGFuZy90eXBlc2NyaXB0L3Zpc2l0b3JzL3R5cGVfcGFyYW1ldGVycy52aXNpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsa0NBQXFDO0FBSXJDLFNBQXdCLG1CQUFtQixDQUFDLE1BQWMsRUFBRSxJQUFnQjtJQUMxRSxPQUFPO1FBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1FBQ2YsT0FBTyxFQUFFLGlCQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztRQUNqQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVE7YUFDdEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUMzQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLGlCQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUM1RSxDQUFBO0FBQ0gsQ0FBQztBQVJELHNDQVFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlTm9kZSB9IGZyb20gXCIuLi9Ob2RlXCI7XG5pbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi8uLi8uLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2aXNpdFR5cGVQYXJhbWV0ZXJzKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogbm9kZS50eXBlLFxuICAgIGNvbnRleHQ6IGNyZWF0ZU5vZGUoc291cmNlLCBub2RlKSxcbiAgICBwYXJhbWV0ZXJzOiBub2RlLmNoaWxkcmVuXG4gICAgICAuZmlsdGVyKGNoaWxkID0+ICFjaGlsZC50eXBlLm1hdGNoKC9bPD4sXS8pKVxuICAgICAgLm1hcChjaGlsZCA9PiAoeyB0eXBlOiBjaGlsZC50eXBlLCBjb250ZXh0OiBjcmVhdGVOb2RlKHNvdXJjZSwgY2hpbGQpIH0pKVxuICB9XG59Il19 \ No newline at end of file diff --git a/build/src/lang/typescript/visitors/visitor.d.ts b/build/src/lang/typescript/visitors/visitor.d.ts deleted file mode 100644 index 096324e..0000000 --- a/build/src/lang/typescript/visitors/visitor.d.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { NodeProperties } from "../../common/emca"; -import { SyntaxNode } from "tree-sitter"; -import Source from "../../../interfaces/Source"; -import { ASTNode } from "../../common/ast"; -export interface TreeSitterNode { - visit(visitor: NodeVisitor): void; -} -export interface NodeVisitor { - getAST(): ASTNode[]; - visitNode(node: SyntaxNode): ASTNode; - visitChildren(nodes: SyntaxNode[]): ASTNode[]; -} -export declare class Node implements TreeSitterNode { - syntaxNode: SyntaxNode; - constructor(syntaxNode: SyntaxNode); - visit: (visitor: NodeVisitor) => void; -} -export declare class TypeScriptVisitor implements NodeVisitor { - private ast; - private source; - private parent; - constructor(source: Source); - /** - * Determines whether a node has inheritance - */ - private hasInheritance; - /** - * Returns a node's inheritance type - */ - private getInheritanceType; - private filterComments; - getAST(): ASTNode[]; - visitNode: (node: SyntaxNode) => ASTNode; - visitChildren: (nodes: SyntaxNode[]) => ASTNode[]; - visitProgram: (node: SyntaxNode) => ASTNode[]; - visitComment: (node: SyntaxNode) => ASTNode; - visitContext: (node: SyntaxNode, properties?: Partial) => ASTNode; - visitInterfaceDeclaration: (node: SyntaxNode, properties?: Partial) => ASTNode; - visitInterface: (node: SyntaxNode, properties?: Partial) => ASTNode; - visitSignature: (node: SyntaxNode, properties?: Partial) => ASTNode; - visitTypeNode: (node: SyntaxNode) => ASTNode; - visitConstraint: (node: SyntaxNode) => ASTNode; - visitInheritanceClause: (node: SyntaxNode) => ASTNode; - visitTerminal: (node: SyntaxNode) => ASTNode; -} diff --git a/build/src/lang/typescript/visitors/visitor.js b/build/src/lang/typescript/visitors/visitor.js deleted file mode 100644 index e7c3049..0000000 --- a/build/src/lang/typescript/visitors/visitor.js +++ /dev/null @@ -1,170 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const comment_1 = require("../../../utils/comment"); -const sibling_1 = require("../../../utils/sibling"); -const log_1 = require("../../../utils/log"); -const match_1 = require("../../../utils/match"); -const ast_1 = require("../../common/ast"); -class Node { - constructor(syntaxNode) { - this.syntaxNode = syntaxNode; - this.visit = (visitor) => { - visitor.visitNode(this.syntaxNode); - }; - } -} -exports.Node = Node; -class TypeScriptVisitor { - constructor(source) { - this.ast = []; - /* Visitors */ - this.visitNode = (node) => { - switch (node.type) { - case 'program': - this.parent = node; - this.ast = this.visitProgram(node); - case 'comment': - return this.visitComment(node); - case 'MISSING': - case 'ERROR': - log_1.default.report(this.source, node, log_1.ErrorType.TreeSitterParseError); - break; - default: - /* Match other non-terminals */ - if (match_1.default(node, 'constraint')) { - return this.visitConstraint(node); - } - if (match_1.default(node, 'type_identifier', 'type_parameters', 'type_parameter', 'type_annotation', 'object_type')) { - return this.visitTypeNode(node); - } - if (match_1.default(node, 'extends_clause')) { - return this.visitInheritanceClause(node); - } - // A call_signature can also be a non-contextual node - if (match_1.default(node, 'call_signature')) { - return this.visitSignature(node); - } - /* Match terminals */ - if (match_1.default(node, 'identifier', 'extends', 'property_identifier')) { - return this.visitTerminal(node); - } - log_1.default.report(this.source, node, log_1.ErrorType.NodeTypeNotYetSupported); - break; - } - }; - this.visitChildren = (nodes) => { - return nodes - .filter(child => !child.type.match(/[<>(){},:;\[\]]/)) - .map(this.visitNode.bind(this)).filter(child => !!child); - }; - this.visitProgram = (node) => { - return this.visitChildren(this.filterComments(node)); - }; - this.visitComment = (node) => { - if (comment_1.isJavaDocComment(this.source, node)) { - const nextSibling = sibling_1.sibling(node); - if (nextSibling) { - return ast_1.createASTNode(this.source, node, this.visitContext(nextSibling, {}), true); - } - } - }; - this.visitContext = (node, properties) => { - switch (node.type) { - case 'interface_declaration': - this.parent = node; - return this.visitInterfaceDeclaration(node, properties); - case 'call_signature': - case 'method_signature': - return this.visitSignature(node, properties); - default: - log_1.default.report(this.source, node, log_1.ErrorType.NodeTypeNotYetSupported); - break; - } - }; - /* Declarations */ - this.visitInterfaceDeclaration = (node, properties) => { - // Shorten the node from 'interface_declaration' to 'interface' - return this.visitInterface(node, properties); - }; - this.visitInterface = (node, properties) => { - // Since 'interface' is element in the array - // we'll need to remove it from the array. - let children = node.children; - const interface_ = children.shift(); - let extends_ = false, implements_ = false; - if (this.hasInheritance(node)) { - const inheritance = this.getInheritanceType(node); - extends_ = inheritance === 'extends'; - implements_ = inheritance === 'implements'; - } - const node_ = ast_1.createASTNode(this.source, node, this.visitChildren(children), Object.assign(properties || {}, { - inheritance: { - implements: implements_, - extends: extends_ - } - })); - // Overwrite the node type from 'interface_declaration' to 'interface' - return Object.assign(node_, { type: interface_.type }); - }; - /* Signatures */ - this.visitSignature = (node, properties) => { - return ast_1.createASTNode(this.source, node, this.visitChildren(node.children), properties); - }; - /* Types */ - this.visitTypeNode = (node) => { - switch (node.type) { - case 'type_identifier': - return this.visitTerminal(node); - case 'type_parameters': - case 'type_parameter': - case 'type_annotation': - return ast_1.createASTNode(this.source, node, this.visitChildren(node.children)); - case 'object_type': - return ast_1.createASTNode(this.source, node, this.visitChildren(this.filterComments(node))); - default: - log_1.default.report(this.source, node, log_1.ErrorType.NodeTypeNotYetSupported); - break; - } - }; - /* Other non-terminals */ - this.visitConstraint = (node) => { - return ast_1.createASTNode(this.source, node, this.visitChildren(node.children)); - }; - this.visitInheritanceClause = (node) => { - return ast_1.createASTNode(this.source, node, this.visitChildren(node.children)); - }; - /* Terminals */ - this.visitTerminal = (node) => { - return ast_1.createASTNode(this.source, node); - }; - this.source = source; - } - /** - * Determines whether a node has inheritance - */ - hasInheritance(node) { - return node.children - .filter(node => { - return node.type.includes('extends') || node.type.includes('implements'); - }).length > 0; - } - /** - * Returns a node's inheritance type - */ - getInheritanceType(node) { - if (node.children.filter(node => node.type.includes('extends'))) { - return 'extends'; - } - if (node.children.filter(node => node.type.includes('implements'))) { - return 'implements'; - } - } - filterComments(node) { - return node.children.filter(child => match_1.default(child, 'comment')); - } - getAST() { - return this.ast; - } -} -exports.TypeScriptVisitor = TypeScriptVisitor; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvcnMvdmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLG9EQUEwRDtBQUMxRCxvREFBaUQ7QUFHakQsNENBQW9EO0FBQ3BELGdEQUF5QztBQUd6QywwQ0FBMEQ7QUFhMUQsTUFBYSxJQUFJO0lBQ2YsWUFBbUIsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN6QyxVQUFLLEdBQUcsQ0FBQyxPQUFvQixFQUFRLEVBQUU7WUFDckMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFBO0lBSDRDLENBQUM7Q0FJL0M7QUFMRCxvQkFLQztBQUVELE1BQWEsaUJBQWlCO0lBSTVCLFlBQVksTUFBYztRQUhsQixRQUFHLEdBQWMsRUFBRSxDQUFBO1FBb0MzQixlQUFlO1FBQ2YsY0FBUyxHQUFHLENBQ1YsSUFBZ0IsRUFDaEIsRUFBRTtZQUNGLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDakIsS0FBSyxTQUFTO29CQUNaLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO29CQUNuQixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3JDLEtBQUssU0FBUztvQkFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pDLEtBQUssU0FBUyxDQUFDO2dCQUNmLEtBQUssT0FBTztvQkFDVixhQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO29CQUM5RCxNQUFNO2dCQUNSO29CQUVFLCtCQUErQjtvQkFFL0IsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxFQUFFO3dCQUM3QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUE7cUJBQ2xDO29CQUVELElBQUksZUFBSyxDQUFDLElBQUksRUFDWixpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFDekUsYUFBYSxDQUNkLEVBQUU7d0JBQ0QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFBO3FCQUNoQztvQkFFRCxJQUFJLGVBQUssQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsRUFBRTt3QkFDakMsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQzFDO29CQUVELHFEQUFxRDtvQkFDckQsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLEVBQUU7d0JBQ2pDLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtxQkFDakM7b0JBRUQscUJBQXFCO29CQUVyQixJQUFJLGVBQUssQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxxQkFBcUIsQ0FBQyxFQUFFO3dCQUMvRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQ2pDO29CQUVELGFBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsZUFBUyxDQUFDLHVCQUF1QixDQUFDLENBQUM7b0JBRWpFLE1BQU07YUFDVDtRQUNILENBQUMsQ0FBQTtRQUVELGtCQUFhLEdBQUcsQ0FBQyxLQUFtQixFQUFhLEVBQUU7WUFDakQsT0FDRSxLQUFLO2lCQUNGLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztpQkFDckQsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUNqQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUE7UUFFRCxpQkFBWSxHQUFHLENBQUMsSUFBZ0IsRUFBYSxFQUFFO1lBQzdDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdkQsQ0FBQyxDQUFBO1FBRUQsaUJBQVksR0FBRyxDQUFDLElBQWdCLEVBQVcsRUFBRTtZQUMzQyxJQUFJLDBCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ3ZDLE1BQU0sV0FBVyxHQUFHLGlCQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2xDLElBQUksV0FBVyxFQUFFO29CQUNmLE9BQU8sbUJBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtpQkFDbEY7YUFDRjtRQUNILENBQUMsQ0FBQTtRQUVELGlCQUFZLEdBQUcsQ0FBQyxJQUFnQixFQUFFLFVBQW9DLEVBQVcsRUFBRTtZQUNqRixRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ2pCLEtBQUssdUJBQXVCO29CQUMxQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztvQkFDbkIsT0FBTyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFBO2dCQUN6RCxLQUFLLGdCQUFnQixDQUFDO2dCQUN0QixLQUFLLGtCQUFrQjtvQkFDckIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDL0M7b0JBQ0UsYUFBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxlQUFTLENBQUMsdUJBQXVCLENBQUMsQ0FBQztvQkFDakUsTUFBTTthQUNUO1FBQ0gsQ0FBQyxDQUFBO1FBRUQsa0JBQWtCO1FBRWxCLDhCQUF5QixHQUFHLENBQUMsSUFBZ0IsRUFBRSxVQUFvQyxFQUFXLEVBQUU7WUFDOUYsK0RBQStEO1lBQy9ELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFDOUMsQ0FBQyxDQUFBO1FBRUQsbUJBQWMsR0FBRyxDQUFDLElBQWdCLEVBQUUsVUFBb0MsRUFBVyxFQUFFO1lBQ25GLDRDQUE0QztZQUM1QywwQ0FBMEM7WUFDMUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUM3QixNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFcEMsSUFBSSxRQUFRLEdBQUcsS0FBSyxFQUFFLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDMUMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUM3QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQ2pELFFBQVEsR0FBRyxXQUFXLEtBQUssU0FBUyxDQUFDO2dCQUNyQyxXQUFXLEdBQUcsV0FBVyxLQUFLLFlBQVksQ0FBQzthQUM1QztZQUVELE1BQU0sS0FBSyxHQUFHLG1CQUFhLENBQ3pCLElBQUksQ0FBQyxNQUFNLEVBQ1gsSUFBSSxFQUNKLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQzVCLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLEVBQUUsRUFBRTtnQkFDaEMsV0FBVyxFQUFFO29CQUNYLFVBQVUsRUFBRSxXQUFXO29CQUN2QixPQUFPLEVBQUUsUUFBUTtpQkFDQzthQUNyQixDQUFDLENBQUMsQ0FBQztZQUNKLHNFQUFzRTtZQUN0RSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQ3hELENBQUMsQ0FBQTtRQUVELGdCQUFnQjtRQUNoQixtQkFBYyxHQUFHLENBQUMsSUFBZ0IsRUFBRSxVQUFvQyxFQUFXLEVBQUU7WUFDbkYsT0FBTyxtQkFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFBO1FBQ3hGLENBQUMsQ0FBQTtRQUVELFdBQVc7UUFFWCxrQkFBYSxHQUFHLENBQUMsSUFBZ0IsRUFBVyxFQUFFO1lBQzVDLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDakIsS0FBSyxpQkFBaUI7b0JBQ3BCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFDakMsS0FBSyxpQkFBaUIsQ0FBQztnQkFDdkIsS0FBSyxnQkFBZ0IsQ0FBQztnQkFDdEIsS0FBSyxpQkFBaUI7b0JBQ3BCLE9BQU8sbUJBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO2dCQUM1RSxLQUFLLGFBQWE7b0JBQ2hCLE9BQU8sbUJBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUN4RjtvQkFDRSxhQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO29CQUNqRSxNQUFNO2FBRVQ7UUFDSCxDQUFDLENBQUE7UUFFRCx5QkFBeUI7UUFFekIsb0JBQWUsR0FBRyxDQUFDLElBQWdCLEVBQVcsRUFBRTtZQUM5QyxPQUFPLG1CQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTtRQUM1RSxDQUFDLENBQUE7UUFFRCwyQkFBc0IsR0FBRyxDQUFDLElBQWdCLEVBQVcsRUFBRTtZQUNyRCxPQUFPLG1CQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTtRQUM1RSxDQUFDLENBQUE7UUFFRCxlQUFlO1FBRWYsa0JBQWEsR0FBRyxDQUFDLElBQWdCLEVBQVcsRUFBRTtZQUM1QyxPQUFPLG1CQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUN6QyxDQUFDLENBQUE7UUE3TEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUNEOztPQUVHO0lBQ0ssY0FBYyxDQUFDLElBQWdCO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLFFBQVE7YUFDakIsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMzRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFBO0lBQ2pCLENBQUM7SUFFRDs7T0FFRztJQUNLLGtCQUFrQixDQUFDLElBQWdCO1FBQ3pDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFO1lBQy9ELE9BQU8sU0FBUyxDQUFDO1NBQ2xCO1FBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUU7WUFDbEUsT0FBTyxZQUFZLENBQUM7U0FDckI7SUFDSCxDQUFDO0lBRU8sY0FBYyxDQUFDLElBQWdCO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxlQUFLLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDbEIsQ0FBQztDQStKRjtBQW5NRCw4Q0FtTUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOb2RlUHJvcGVydGllcywgTm9kZUluaGVyaXRhbmNlIH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9lbWNhXCI7XHJcbmltcG9ydCB7IGlzSmF2YURvY0NvbW1lbnQgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvY29tbWVudFwiO1xyXG5pbXBvcnQgeyBzaWJsaW5nIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3NpYmxpbmdcIjtcclxuaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5pbXBvcnQgeyB0ZXh0IH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3RleHRcIjtcclxuaW1wb3J0IGxvZywgeyBFcnJvclR5cGUgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbG9nXCI7XHJcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbWF0Y2hcIjtcclxuaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi4vLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2VcIjtcclxuaW1wb3J0IHhkb2MgZnJvbSBcInhkb2MtcGFyc2VyXCI7XHJcbmltcG9ydCB7IGNyZWF0ZUFTVE5vZGUsIEFTVE5vZGUgfSBmcm9tIFwiLi4vLi4vY29tbW9uL2FzdFwiO1xyXG5cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVHJlZVNpdHRlck5vZGUge1xyXG4gIHZpc2l0KHZpc2l0b3I6IE5vZGVWaXNpdG9yKTogdm9pZFxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE5vZGVWaXNpdG9yIHtcclxuICBnZXRBU1QoKTogQVNUTm9kZVtdXHJcbiAgdmlzaXROb2RlKG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlXHJcbiAgdmlzaXRDaGlsZHJlbihub2RlczogU3ludGF4Tm9kZVtdKTogQVNUTm9kZVtdXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOb2RlIGltcGxlbWVudHMgVHJlZVNpdHRlck5vZGUge1xyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBzeW50YXhOb2RlOiBTeW50YXhOb2RlKSB7IH1cclxuICB2aXNpdCA9ICh2aXNpdG9yOiBOb2RlVmlzaXRvcik6IHZvaWQgPT4ge1xyXG4gICAgdmlzaXRvci52aXNpdE5vZGUodGhpcy5zeW50YXhOb2RlKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBUeXBlU2NyaXB0VmlzaXRvciBpbXBsZW1lbnRzIE5vZGVWaXNpdG9yIHtcclxuICBwcml2YXRlIGFzdDogQVNUTm9kZVtdID0gW11cclxuICBwcml2YXRlIHNvdXJjZTogU291cmNlXHJcbiAgcHJpdmF0ZSBwYXJlbnQ6IFN5bnRheE5vZGVcclxuICBjb25zdHJ1Y3Rvcihzb3VyY2U6IFNvdXJjZSkge1xyXG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgd2hldGhlciBhIG5vZGUgaGFzIGluaGVyaXRhbmNlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoYXNJbmhlcml0YW5jZShub2RlOiBTeW50YXhOb2RlKSB7XHJcbiAgICByZXR1cm4gbm9kZS5jaGlsZHJlblxyXG4gICAgICAuZmlsdGVyKG5vZGUgPT4ge1xyXG4gICAgICAgIHJldHVybiBub2RlLnR5cGUuaW5jbHVkZXMoJ2V4dGVuZHMnKSB8fCBub2RlLnR5cGUuaW5jbHVkZXMoJ2ltcGxlbWVudHMnKTtcclxuICAgICAgfSkubGVuZ3RoID4gMFxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIG5vZGUncyBpbmhlcml0YW5jZSB0eXBlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRJbmhlcml0YW5jZVR5cGUobm9kZTogU3ludGF4Tm9kZSkge1xyXG4gICAgaWYgKG5vZGUuY2hpbGRyZW4uZmlsdGVyKG5vZGUgPT4gbm9kZS50eXBlLmluY2x1ZGVzKCdleHRlbmRzJykpKSB7XHJcbiAgICAgIHJldHVybiAnZXh0ZW5kcyc7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG5vZGUuY2hpbGRyZW4uZmlsdGVyKG5vZGUgPT4gbm9kZS50eXBlLmluY2x1ZGVzKCdpbXBsZW1lbnRzJykpKSB7XHJcbiAgICAgIHJldHVybiAnaW1wbGVtZW50cyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbHRlckNvbW1lbnRzKG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICAgIHJldHVybiBub2RlLmNoaWxkcmVuLmZpbHRlcihjaGlsZCA9PiBtYXRjaChjaGlsZCwgJ2NvbW1lbnQnKSk7XHJcbiAgfVxyXG5cclxuICBnZXRBU1QoKTogQVNUTm9kZVtdIHtcclxuICAgIHJldHVybiB0aGlzLmFzdDtcclxuICB9XHJcbiAgLyogVmlzaXRvcnMgICovXHJcbiAgdmlzaXROb2RlID0gKFxyXG4gICAgbm9kZTogU3ludGF4Tm9kZVxyXG4gICkgPT4ge1xyXG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcclxuICAgICAgY2FzZSAncHJvZ3JhbSc6XHJcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBub2RlO1xyXG4gICAgICAgIHRoaXMuYXN0ID0gdGhpcy52aXNpdFByb2dyYW0obm9kZSk7XHJcbiAgICAgIGNhc2UgJ2NvbW1lbnQnOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0Q29tbWVudChub2RlKTtcclxuICAgICAgY2FzZSAnTUlTU0lORyc6XHJcbiAgICAgIGNhc2UgJ0VSUk9SJzpcclxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuVHJlZVNpdHRlclBhcnNlRXJyb3IpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG5cclxuICAgICAgICAvKiBNYXRjaCBvdGhlciBub24tdGVybWluYWxzICovXHJcblxyXG4gICAgICAgIGlmIChtYXRjaChub2RlLCAnY29uc3RyYWludCcpKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdENvbnN0cmFpbnQobm9kZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChtYXRjaChub2RlLFxyXG4gICAgICAgICAgJ3R5cGVfaWRlbnRpZmllcicsICd0eXBlX3BhcmFtZXRlcnMnLCAndHlwZV9wYXJhbWV0ZXInLCAndHlwZV9hbm5vdGF0aW9uJyxcclxuICAgICAgICAgICdvYmplY3RfdHlwZScsXHJcbiAgICAgICAgKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRUeXBlTm9kZShub2RlKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG1hdGNoKG5vZGUsICdleHRlbmRzX2NsYXVzZScpKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdEluaGVyaXRhbmNlQ2xhdXNlKG5vZGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQSBjYWxsX3NpZ25hdHVyZSBjYW4gYWxzbyBiZSBhIG5vbi1jb250ZXh0dWFsIG5vZGVcclxuICAgICAgICBpZiAobWF0Y2gobm9kZSwgJ2NhbGxfc2lnbmF0dXJlJykpIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLnZpc2l0U2lnbmF0dXJlKG5vZGUpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBNYXRjaCB0ZXJtaW5hbHMgKi9cclxuXHJcbiAgICAgICAgaWYgKG1hdGNoKG5vZGUsICdpZGVudGlmaWVyJywgJ2V4dGVuZHMnLCAncHJvcGVydHlfaWRlbnRpZmllcicpKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdFRlcm1pbmFsKG5vZGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbG9nLnJlcG9ydCh0aGlzLnNvdXJjZSwgbm9kZSwgRXJyb3JUeXBlLk5vZGVUeXBlTm90WWV0U3VwcG9ydGVkKTtcclxuXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB2aXNpdENoaWxkcmVuID0gKG5vZGVzOiBTeW50YXhOb2RlW10pOiBBU1ROb2RlW10gPT4ge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgbm9kZXNcclxuICAgICAgICAuZmlsdGVyKGNoaWxkID0+ICFjaGlsZC50eXBlLm1hdGNoKC9bPD4oKXt9LDo7XFxbXFxdXS8pKVxyXG4gICAgICAgIC5tYXAodGhpcy52aXNpdE5vZGUuYmluZCh0aGlzKSkgYXMgQVNUTm9kZVtdXHJcbiAgICApLmZpbHRlcihjaGlsZCA9PiAhIWNoaWxkKTtcclxuICB9XHJcblxyXG4gIHZpc2l0UHJvZ3JhbSA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZVtdID0+IHtcclxuICAgIHJldHVybiB0aGlzLnZpc2l0Q2hpbGRyZW4odGhpcy5maWx0ZXJDb21tZW50cyhub2RlKSk7XHJcbiAgfVxyXG5cclxuICB2aXNpdENvbW1lbnQgPSAobm9kZTogU3ludGF4Tm9kZSk6IEFTVE5vZGUgPT4ge1xyXG4gICAgaWYgKGlzSmF2YURvY0NvbW1lbnQodGhpcy5zb3VyY2UsIG5vZGUpKSB7XHJcbiAgICAgIGNvbnN0IG5leHRTaWJsaW5nID0gc2libGluZyhub2RlKTtcclxuICAgICAgaWYgKG5leHRTaWJsaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIHRoaXMudmlzaXRDb250ZXh0KG5leHRTaWJsaW5nLCB7fSksIHRydWUpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHZpc2l0Q29udGV4dCA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcclxuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XHJcbiAgICAgIGNhc2UgJ2ludGVyZmFjZV9kZWNsYXJhdGlvbic6XHJcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBub2RlO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0SW50ZXJmYWNlRGVjbGFyYXRpb24obm9kZSwgcHJvcGVydGllcylcclxuICAgICAgY2FzZSAnY2FsbF9zaWduYXR1cmUnOlxyXG4gICAgICBjYXNlICdtZXRob2Rfc2lnbmF0dXJlJzpcclxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdFNpZ25hdHVyZShub2RlLCBwcm9wZXJ0aWVzKTtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyogRGVjbGFyYXRpb25zICovXHJcblxyXG4gIHZpc2l0SW50ZXJmYWNlRGVjbGFyYXRpb24gPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XHJcbiAgICAvLyBTaG9ydGVuIHRoZSBub2RlIGZyb20gJ2ludGVyZmFjZV9kZWNsYXJhdGlvbicgdG8gJ2ludGVyZmFjZSdcclxuICAgIHJldHVybiB0aGlzLnZpc2l0SW50ZXJmYWNlKG5vZGUsIHByb3BlcnRpZXMpXHJcbiAgfVxyXG5cclxuICB2aXNpdEludGVyZmFjZSA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcclxuICAgIC8vIFNpbmNlICdpbnRlcmZhY2UnIGlzIGVsZW1lbnQgaW4gdGhlIGFycmF5XHJcbiAgICAvLyB3ZSdsbCBuZWVkIHRvIHJlbW92ZSBpdCBmcm9tIHRoZSBhcnJheS5cclxuICAgIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XHJcbiAgICBjb25zdCBpbnRlcmZhY2VfID0gY2hpbGRyZW4uc2hpZnQoKTtcclxuXHJcbiAgICBsZXQgZXh0ZW5kc18gPSBmYWxzZSwgaW1wbGVtZW50c18gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLmhhc0luaGVyaXRhbmNlKG5vZGUpKSB7XHJcbiAgICAgIGNvbnN0IGluaGVyaXRhbmNlID0gdGhpcy5nZXRJbmhlcml0YW5jZVR5cGUobm9kZSlcclxuICAgICAgZXh0ZW5kc18gPSBpbmhlcml0YW5jZSA9PT0gJ2V4dGVuZHMnO1xyXG4gICAgICBpbXBsZW1lbnRzXyA9IGluaGVyaXRhbmNlID09PSAnaW1wbGVtZW50cyc7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgbm9kZV8gPSBjcmVhdGVBU1ROb2RlKFxyXG4gICAgICB0aGlzLnNvdXJjZSwgXHJcbiAgICAgIG5vZGUsIFxyXG4gICAgICB0aGlzLnZpc2l0Q2hpbGRyZW4oY2hpbGRyZW4pLCBcclxuICAgICAgT2JqZWN0LmFzc2lnbihwcm9wZXJ0aWVzIHx8IHt9LCB7XHJcbiAgICAgIGluaGVyaXRhbmNlOiB7XHJcbiAgICAgICAgaW1wbGVtZW50czogaW1wbGVtZW50c18sXHJcbiAgICAgICAgZXh0ZW5kczogZXh0ZW5kc19cclxuICAgICAgfSBhcyBOb2RlSW5oZXJpdGFuY2VcclxuICAgIH0pKTtcclxuICAgIC8vIE92ZXJ3cml0ZSB0aGUgbm9kZSB0eXBlIGZyb20gJ2ludGVyZmFjZV9kZWNsYXJhdGlvbicgdG8gJ2ludGVyZmFjZSdcclxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5vZGVfLCB7IHR5cGU6IGludGVyZmFjZV8udHlwZSB9KVxyXG4gIH1cclxuXHJcbiAgLyogU2lnbmF0dXJlcyAqL1xyXG4gIHZpc2l0U2lnbmF0dXJlID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xyXG4gICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIHRoaXMudmlzaXRDaGlsZHJlbihub2RlLmNoaWxkcmVuKSwgcHJvcGVydGllcylcclxuICB9XHJcblxyXG4gIC8qIFR5cGVzICovXHJcblxyXG4gIHZpc2l0VHlwZU5vZGUgPSAobm9kZTogU3ludGF4Tm9kZSk6IEFTVE5vZGUgPT4ge1xyXG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcclxuICAgICAgY2FzZSAndHlwZV9pZGVudGlmaWVyJzpcclxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdFRlcm1pbmFsKG5vZGUpXHJcbiAgICAgIGNhc2UgJ3R5cGVfcGFyYW1ldGVycyc6XHJcbiAgICAgIGNhc2UgJ3R5cGVfcGFyYW1ldGVyJzpcclxuICAgICAgY2FzZSAndHlwZV9hbm5vdGF0aW9uJzpcclxuICAgICAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENoaWxkcmVuKG5vZGUuY2hpbGRyZW4pKVxyXG4gICAgICBjYXNlICdvYmplY3RfdHlwZSc6XHJcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIHRoaXMudmlzaXRDaGlsZHJlbih0aGlzLmZpbHRlckNvbW1lbnRzKG5vZGUpKSlcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qIE90aGVyIG5vbi10ZXJtaW5hbHMgKi9cclxuXHJcbiAgdmlzaXRDb25zdHJhaW50ID0gKG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlID0+IHtcclxuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q2hpbGRyZW4obm9kZS5jaGlsZHJlbikpXHJcbiAgfVxyXG5cclxuICB2aXNpdEluaGVyaXRhbmNlQ2xhdXNlID0gKG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlID0+IHtcclxuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q2hpbGRyZW4obm9kZS5jaGlsZHJlbikpXHJcbiAgfVxyXG5cclxuICAvKiBUZXJtaW5hbHMgKi9cclxuXHJcbiAgdmlzaXRUZXJtaW5hbCA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZSA9PiB7XHJcbiAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSlcclxuICB9XHJcbn0iXX0= \ No newline at end of file diff --git a/build/src/lang/typescript/walk.d.ts b/build/src/lang/typescript/walk.d.ts deleted file mode 100644 index 99c5165..0000000 --- a/build/src/lang/typescript/walk.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { SyntaxNode } from "tree-sitter"; -import { Node } from "./visitors/visitor"; -export default function walk(node: SyntaxNode): Node; diff --git a/build/src/lang/typescript/walk.js b/build/src/lang/typescript/walk.js deleted file mode 100644 index 3de9c97..0000000 --- a/build/src/lang/typescript/walk.js +++ /dev/null @@ -1,10 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const visitor_1 = require("./visitors/visitor"); -function walk(node) { - let node_ = new visitor_1.Node(node); - node_.syntaxNode.children.map(child => walk(child)); - return node_; -} -exports.default = walk; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Fsay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvd2Fsay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLGdEQUEwQztBQUUxQyxTQUF3QixJQUFJLENBQUMsSUFBZ0I7SUFDM0MsSUFBSSxLQUFLLEdBQUcsSUFBSSxjQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsS0FBSyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7SUFDbkQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBSkQsdUJBSUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgeyBOb2RlIH0gZnJvbSBcIi4vdmlzaXRvcnMvdmlzaXRvclwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB3YWxrKG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgbGV0IG5vZGVfID0gbmV3IE5vZGUobm9kZSk7XG4gIG5vZGVfLnN5bnRheE5vZGUuY2hpbGRyZW4ubWFwKGNoaWxkID0+IHdhbGsoY2hpbGQpKVxuICByZXR1cm4gbm9kZV87XG59Il19 \ No newline at end of file diff --git a/build/src/utils/benchmark.js b/build/src/utils/benchmark.js index a6e49e6..61900e9 100644 --- a/build/src/utils/benchmark.js +++ b/build/src/utils/benchmark.js @@ -7,4 +7,4 @@ function benchmark(label, f, ...args) { return result; } exports.default = benchmark; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVuY2htYXJrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2JlbmNobWFyay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLFNBQXdCLFNBQVMsQ0FDL0IsS0FBYSxFQUNiLENBQWUsRUFDZixHQUFHLElBQVU7SUFFYixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ25CLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ25DLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQVRELDRCQVNDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYmVuY2htYXJrPFQsIFQyPihcbiAgbGFiZWw6IHN0cmluZyxcbiAgZjogKHg6IFQyKSA9PiBULFxuICAuLi5hcmdzOiBUMltdXG4pOiBUIHtcbiAgY29uc29sZS50aW1lKGxhYmVsKVxuICBjb25zdCByZXN1bHQgPSBmLmFwcGx5KG51bGwsIGFyZ3MpO1xuICBjb25zb2xlLnRpbWVFbmQobGFiZWwpO1xuICByZXR1cm4gcmVzdWx0O1xufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVuY2htYXJrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2JlbmNobWFyay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLFNBQXdCLFNBQVMsQ0FDL0IsS0FBYSxFQUNiLENBQWUsRUFDZixHQUFHLElBQVU7SUFFYixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ25CLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ25DLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQVRELDRCQVNDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYmVuY2htYXJrPFQsIFQyPihcclxuICBsYWJlbDogc3RyaW5nLFxyXG4gIGY6ICh4OiBUMikgPT4gVCxcclxuICAuLi5hcmdzOiBUMltdXHJcbik6IFQge1xyXG4gIGNvbnNvbGUudGltZShsYWJlbClcclxuICBjb25zdCByZXN1bHQgPSBmLmFwcGx5KG51bGwsIGFyZ3MpO1xyXG4gIGNvbnNvbGUudGltZUVuZChsYWJlbCk7XHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufSJdfQ== \ No newline at end of file diff --git a/build/src/utils/comment.js b/build/src/utils/comment.js index dd61fb4..d67c1c8 100644 --- a/build/src/utils/comment.js +++ b/build/src/utils/comment.js @@ -39,4 +39,4 @@ function isXDocCommentFragment(source, node) { return !isXDocCommentBlock(source, node) && isXDocComment(source, node); } exports.isXDocCommentFragment = isXDocCommentFragment; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9jb21tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsbUNBQTRCO0FBR2YsUUFBQSxTQUFTLEdBQUcsOEVBQThFLENBQUM7QUFFeEcsU0FBZ0IsY0FBYyxDQUFFLE1BQWMsRUFBRSxJQUFnQjtJQUM5RCxNQUFNLGFBQWEsR0FBRztRQUNwQixXQUFXO1FBQ1gsc0JBQXNCO1FBQ3RCLFNBQVM7UUFDVCxxQkFBcUI7S0FDdEIsQ0FBQztJQUNGLElBQUksZUFBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRTtRQUMxQixPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDOUIsTUFBTSxDQUFDLElBQUk7YUFDUixTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQ3pDLFdBQVcsRUFBRTthQUNiLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FDbEIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDbEI7QUFDSCxDQUFDO0FBZkQsd0NBZUM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDL0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEUsbUJBQW1CO0lBQ25CLE9BQU8saUNBQWlDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQ3hELENBQUM7QUFKRCw0Q0FJQztBQUVELFNBQWdCLGFBQWEsQ0FBQyxNQUFhLEVBQUUsSUFBaUI7SUFDNUQsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQ3JCLElBQUksSUFBSTtRQUFFLE9BQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JFLE9BQU8saUJBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUpELHNDQUlDO0FBRUQsU0FBZ0Isa0JBQWtCLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQ2pFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDM0QsQ0FBQztBQUhELGdEQUdDO0FBRUQsU0FBZ0IscUJBQXFCLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQ3BFLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRkQsc0RBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgbWF0Y2ggZnJvbSBcIi4vbWF0Y2hcIjtcbmltcG9ydCBTb3VyY2UgZnJvbSBcIi4uL2ludGVyZmFjZXMvU291cmNlXCI7XG5cbmV4cG9ydCBjb25zdCBYRG9jUmVnZXggPSAvQChcXHcrKShbXntbKFxcbl0qKT8oW1xce1xcW1xcKF1bXFxzXFxTXSpbXFx9XFxdXFwpXShbXFxzXSooPXwtKT4uKik/KT8oW1xcc10qLSguKSopPy9nbWk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xlZ2FsQ29tbWVudCAoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgY29uc3QgcG9zc2libGVUZXh0cyA9IFtcbiAgICAnY29weXJpZ2h0JyxcbiAgICAndGVybXMgYW5kIGNvbmRpdGlvbnMnLFxuICAgICdsaWNlbnNlJyxcbiAgICAnYWxsIHJpZ2h0cyByZXNlcnZlZCdcbiAgXTtcbiAgaWYgKG1hdGNoKG5vZGUsICdjb21tZW50JykpIHtcbiAgICByZXR1cm4gcG9zc2libGVUZXh0cy5tYXAodGV4dCA9PlxuICAgICAgc291cmNlLnRleHRcbiAgICAgICAgLnN1YnN0cmluZyhub2RlLnN0YXJ0SW5kZXgsIG5vZGUuZW5kSW5kZXgpXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgIC5pbmNsdWRlcyh0ZXh0KVxuICAgICkuaW5jbHVkZXModHJ1ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSmF2YURvY0NvbW1lbnQoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgY29uc3QgY29tbWVudCA9IHNvdXJjZS50ZXh0LnN1YnN0cmluZyhub2RlLnN0YXJ0SW5kZXgsIG5vZGUuZW5kSW5kZXgpO1xuICAvLyByZWdleHIuY29tLzNlanZiXG4gIHJldHVybiAvKFxcL1xcKlxcKikoKFxccyopKC4qPykoXFxzKSkqKFxcKlxcLykvLnRlc3QoY29tbWVudClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzWERvY0NvbW1lbnQoc291cmNlOnN0cmluZywgbm9kZT86IFN5bnRheE5vZGUpIHtcbiAgbGV0IGNvbW1lbnQgPSBzb3VyY2U7XG4gIGlmIChub2RlKSBjb21tZW50ID0gc291cmNlLnN1YnN0cmluZyhub2RlLnN0YXJ0SW5kZXgsIG5vZGUuZW5kSW5kZXgpO1xuICByZXR1cm4gWERvY1JlZ2V4LnRlc3QoY29tbWVudCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1hEb2NDb21tZW50QmxvY2soc291cmNlOiBzdHJpbmcsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgY29uc3QgY29tbWVudCA9IHNvdXJjZS5zdWJzdHJpbmcobm9kZS5zdGFydEluZGV4LCBub2RlLmVuZEluZGV4KTtcbiAgcmV0dXJuIC8jQVBJLy50ZXN0KGNvbW1lbnQpIHx8IC9cXGBcXGBcXGB4ZG9jLy50ZXN0KGNvbW1lbnQpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1hEb2NDb21tZW50RnJhZ21lbnQoc291cmNlOiBzdHJpbmcsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgcmV0dXJuICFpc1hEb2NDb21tZW50QmxvY2soc291cmNlLCBub2RlKSAmJiBpc1hEb2NDb21tZW50KHNvdXJjZSwgbm9kZSk7XG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9jb21tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsbUNBQTRCO0FBR2YsUUFBQSxTQUFTLEdBQUcsOEVBQThFLENBQUM7QUFFeEcsU0FBZ0IsY0FBYyxDQUFFLE1BQWMsRUFBRSxJQUFnQjtJQUM5RCxNQUFNLGFBQWEsR0FBRztRQUNwQixXQUFXO1FBQ1gsc0JBQXNCO1FBQ3RCLFNBQVM7UUFDVCxxQkFBcUI7S0FDdEIsQ0FBQztJQUNGLElBQUksZUFBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRTtRQUMxQixPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDOUIsTUFBTSxDQUFDLElBQUk7YUFDUixTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQ3pDLFdBQVcsRUFBRTthQUNiLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FDbEIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDbEI7QUFDSCxDQUFDO0FBZkQsd0NBZUM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDL0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEUsbUJBQW1CO0lBQ25CLE9BQU8saUNBQWlDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQ3hELENBQUM7QUFKRCw0Q0FJQztBQUVELFNBQWdCLGFBQWEsQ0FBQyxNQUFhLEVBQUUsSUFBaUI7SUFDNUQsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQ3JCLElBQUksSUFBSTtRQUFFLE9BQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JFLE9BQU8saUJBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUpELHNDQUlDO0FBRUQsU0FBZ0Isa0JBQWtCLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQ2pFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDM0QsQ0FBQztBQUhELGdEQUdDO0FBRUQsU0FBZ0IscUJBQXFCLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQ3BFLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRkQsc0RBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XHJcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi9tYXRjaFwiO1xyXG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xyXG5cclxuZXhwb3J0IGNvbnN0IFhEb2NSZWdleCA9IC9AKFxcdyspKFtee1soXFxuXSopPyhbXFx7XFxbXFwoXVtcXHNcXFNdKltcXH1cXF1cXCldKFtcXHNdKig9fC0pPi4qKT8pPyhbXFxzXSotKC4pKik/L2dtaTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0xlZ2FsQ29tbWVudCAoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICBjb25zdCBwb3NzaWJsZVRleHRzID0gW1xyXG4gICAgJ2NvcHlyaWdodCcsXHJcbiAgICAndGVybXMgYW5kIGNvbmRpdGlvbnMnLFxyXG4gICAgJ2xpY2Vuc2UnLFxyXG4gICAgJ2FsbCByaWdodHMgcmVzZXJ2ZWQnXHJcbiAgXTtcclxuICBpZiAobWF0Y2gobm9kZSwgJ2NvbW1lbnQnKSkge1xyXG4gICAgcmV0dXJuIHBvc3NpYmxlVGV4dHMubWFwKHRleHQgPT5cclxuICAgICAgc291cmNlLnRleHRcclxuICAgICAgICAuc3Vic3RyaW5nKG5vZGUuc3RhcnRJbmRleCwgbm9kZS5lbmRJbmRleClcclxuICAgICAgICAudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgIC5pbmNsdWRlcyh0ZXh0KVxyXG4gICAgKS5pbmNsdWRlcyh0cnVlKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0phdmFEb2NDb21tZW50KHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlKSB7XHJcbiAgY29uc3QgY29tbWVudCA9IHNvdXJjZS50ZXh0LnN1YnN0cmluZyhub2RlLnN0YXJ0SW5kZXgsIG5vZGUuZW5kSW5kZXgpO1xyXG4gIC8vIHJlZ2V4ci5jb20vM2VqdmJcclxuICByZXR1cm4gLyhcXC9cXCpcXCopKChcXHMqKSguKj8pKFxccykpKihcXCpcXC8pLy50ZXN0KGNvbW1lbnQpXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1hEb2NDb21tZW50KHNvdXJjZTpzdHJpbmcsIG5vZGU/OiBTeW50YXhOb2RlKSB7XHJcbiAgbGV0IGNvbW1lbnQgPSBzb3VyY2U7XHJcbiAgaWYgKG5vZGUpIGNvbW1lbnQgPSBzb3VyY2Uuc3Vic3RyaW5nKG5vZGUuc3RhcnRJbmRleCwgbm9kZS5lbmRJbmRleCk7XHJcbiAgcmV0dXJuIFhEb2NSZWdleC50ZXN0KGNvbW1lbnQpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNYRG9jQ29tbWVudEJsb2NrKHNvdXJjZTogc3RyaW5nLCBub2RlOiBTeW50YXhOb2RlKSB7XHJcbiAgY29uc3QgY29tbWVudCA9IHNvdXJjZS5zdWJzdHJpbmcobm9kZS5zdGFydEluZGV4LCBub2RlLmVuZEluZGV4KTtcclxuICByZXR1cm4gLyNBUEkvLnRlc3QoY29tbWVudCkgfHwgL1xcYFxcYFxcYHhkb2MvLnRlc3QoY29tbWVudClcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzWERvY0NvbW1lbnRGcmFnbWVudChzb3VyY2U6IHN0cmluZywgbm9kZTogU3ludGF4Tm9kZSkge1xyXG4gIHJldHVybiAhaXNYRG9jQ29tbWVudEJsb2NrKHNvdXJjZSwgbm9kZSkgJiYgaXNYRG9jQ29tbWVudChzb3VyY2UsIG5vZGUpO1xyXG59Il19 \ No newline at end of file diff --git a/build/src/utils/log.js b/build/src/utils/log.js index 357c28d..47f9527 100644 --- a/build/src/utils/log.js +++ b/build/src/utils/log.js @@ -14,7 +14,7 @@ class ParserLog extends mr_doc_utils_1.Log { const location = range_1.default(node).location; const sameLine = location.row.start === location.row.end; const getLineRange = () => sameLine ? location.row.start + 1 : location.row.start + 1 + ' - ' + location.row.end + 1; - const culprit = `Line${sameLine ? '' : 's'} ${getLineRange()} in '${source.path}${source.name}'`; + const culprit = `Line${sameLine ? '' : 's'} ${getLineRange()} in '${source.path}'`; switch (error) { case ErrorType.NodeTypeNotYetSupported: this.info(`'${node.type.replace(/[_]/g, ' ')}' is not yet supported:\n${culprit}`); @@ -29,4 +29,4 @@ class ParserLog extends mr_doc_utils_1.Log { } const log = new ParserLog('mr-doc::parser'); exports.default = log; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtDQUFtQztBQUduQyxtQ0FBNEI7QUFFNUIsSUFBWSxTQUdYO0FBSEQsV0FBWSxTQUFTO0lBQ2pCLCtFQUF1QixDQUFBO0lBQ3ZCLHlFQUFvQixDQUFBO0FBQ3hCLENBQUMsRUFIVyxTQUFTLEdBQVQsaUJBQVMsS0FBVCxpQkFBUyxRQUdwQjtBQUVELE1BQU0sU0FBVSxTQUFRLGtCQUFHO0lBQTNCOztRQUNJLFdBQU0sR0FBRyxDQUFDLE1BQWMsRUFBRSxJQUFnQixFQUFFLEtBQWdCLEVBQVEsRUFBRTtZQUNsRSxNQUFNLFFBQVEsR0FBRyxlQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ3RDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQ3pELE1BQU0sWUFBWSxHQUFHLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNySCxNQUFNLE9BQU8sR0FBRyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksWUFBWSxFQUFFLFFBQVEsTUFBTSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUM7WUFDakcsUUFBUSxLQUFLLEVBQUU7Z0JBQ1gsS0FBSyxTQUFTLENBQUMsdUJBQXVCO29CQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyw0QkFBNEIsT0FBTyxFQUFFLENBQUMsQ0FBQTtvQkFDbEYsTUFBTTtnQkFDVixLQUFLLFNBQVMsQ0FBQyxvQkFBb0I7b0JBQy9CLElBQUksQ0FBQyxLQUFLLENBQUMscURBQXFELE9BQU8sRUFBRSxDQUFDLENBQUE7Z0JBQzlFO29CQUNJLE1BQU07YUFDYjtRQUNMLENBQUMsQ0FBQTtJQUNMLENBQUM7Q0FBQTtBQUdELE1BQU0sR0FBRyxHQUFHLElBQUksU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFFNUMsa0JBQWUsR0FBRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTG9nIH0gZnJvbSAnbXItZG9jLXV0aWxzJztcbmltcG9ydCBTb3VyY2UgZnJvbSAnLi4vaW50ZXJmYWNlcy9Tb3VyY2UnO1xuaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gJ3RyZWUtc2l0dGVyJztcbmltcG9ydCByYW5nZSBmcm9tICcuL3JhbmdlJztcblxuZXhwb3J0IGVudW0gRXJyb3JUeXBlIHtcbiAgICBOb2RlVHlwZU5vdFlldFN1cHBvcnRlZCxcbiAgICBUcmVlU2l0dGVyUGFyc2VFcnJvclxufVxuXG5jbGFzcyBQYXJzZXJMb2cgZXh0ZW5kcyBMb2cge1xuICAgIHJlcG9ydCA9IChzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSwgZXJyb3I6IEVycm9yVHlwZSk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCBsb2NhdGlvbiA9IHJhbmdlKG5vZGUpLmxvY2F0aW9uO1xuICAgICAgICBjb25zdCBzYW1lTGluZSA9IGxvY2F0aW9uLnJvdy5zdGFydCA9PT0gbG9jYXRpb24ucm93LmVuZDtcbiAgICAgICAgY29uc3QgZ2V0TGluZVJhbmdlID0gKCkgPT4gc2FtZUxpbmUgPyBsb2NhdGlvbi5yb3cuc3RhcnQgKyAxIDogbG9jYXRpb24ucm93LnN0YXJ0ICsgMSArICcgLSAnICsgbG9jYXRpb24ucm93LmVuZCArIDE7XG4gICAgICAgIGNvbnN0IGN1bHByaXQgPSBgTGluZSR7c2FtZUxpbmUgPyAnJyA6ICdzJ30gJHtnZXRMaW5lUmFuZ2UoKX0gaW4gJyR7c291cmNlLnBhdGh9JHtzb3VyY2UubmFtZX0nYDtcbiAgICAgICAgc3dpdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FzZSBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQ6XG4gICAgICAgICAgICAgICAgdGhpcy5pbmZvKGAnJHtub2RlLnR5cGUucmVwbGFjZSgvW19dL2csICcgJyl9JyBpcyBub3QgeWV0IHN1cHBvcnRlZDpcXG4ke2N1bHByaXR9YClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRXJyb3JUeXBlLlRyZWVTaXR0ZXJQYXJzZUVycm9yOlxuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoYCd0cmVlLXNpdHRlcicgd2FzIG5vdCBhYmxlIHRvIHBhcnNlIHRoZSBwcm9ncmFtOlxcbiR7Y3VscHJpdH1gKVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG5jb25zdCBsb2cgPSBuZXcgUGFyc2VyTG9nKCdtci1kb2M6OnBhcnNlcicpO1xuXG5leHBvcnQgZGVmYXVsdCBsb2c7Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtDQUFtQztBQUduQyxtQ0FBNEI7QUFFNUIsSUFBWSxTQUdYO0FBSEQsV0FBWSxTQUFTO0lBQ2pCLCtFQUF1QixDQUFBO0lBQ3ZCLHlFQUFvQixDQUFBO0FBQ3hCLENBQUMsRUFIVyxTQUFTLEdBQVQsaUJBQVMsS0FBVCxpQkFBUyxRQUdwQjtBQUVELE1BQU0sU0FBVSxTQUFRLGtCQUFHO0lBQTNCOztRQUNJLFdBQU0sR0FBRyxDQUFDLE1BQWMsRUFBRSxJQUFnQixFQUFFLEtBQWdCLEVBQVEsRUFBRTtZQUNsRSxNQUFNLFFBQVEsR0FBRyxlQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ3RDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQ3pELE1BQU0sWUFBWSxHQUFHLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNySCxNQUFNLE9BQU8sR0FBRyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksWUFBWSxFQUFFLFFBQVEsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDO1lBQ25GLFFBQVEsS0FBSyxFQUFFO2dCQUNYLEtBQUssU0FBUyxDQUFDLHVCQUF1QjtvQkFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsNEJBQTRCLE9BQU8sRUFBRSxDQUFDLENBQUE7b0JBQ2xGLE1BQU07Z0JBQ1YsS0FBSyxTQUFTLENBQUMsb0JBQW9CO29CQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLHFEQUFxRCxPQUFPLEVBQUUsQ0FBQyxDQUFBO2dCQUM5RTtvQkFDSSxNQUFNO2FBQ2I7UUFDTCxDQUFDLENBQUE7SUFDTCxDQUFDO0NBQUE7QUFHRCxNQUFNLEdBQUcsR0FBRyxJQUFJLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRTVDLGtCQUFlLEdBQUcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvZyB9IGZyb20gJ21yLWRvYy11dGlscyc7XHJcbmltcG9ydCBTb3VyY2UgZnJvbSAnLi4vaW50ZXJmYWNlcy9Tb3VyY2UnO1xyXG5pbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSAndHJlZS1zaXR0ZXInO1xyXG5pbXBvcnQgcmFuZ2UgZnJvbSAnLi9yYW5nZSc7XHJcblxyXG5leHBvcnQgZW51bSBFcnJvclR5cGUge1xyXG4gICAgTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQsXHJcbiAgICBUcmVlU2l0dGVyUGFyc2VFcnJvclxyXG59XHJcblxyXG5jbGFzcyBQYXJzZXJMb2cgZXh0ZW5kcyBMb2cge1xyXG4gICAgcmVwb3J0ID0gKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlLCBlcnJvcjogRXJyb3JUeXBlKTogdm9pZCA9PiB7XHJcbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSByYW5nZShub2RlKS5sb2NhdGlvbjtcclxuICAgICAgICBjb25zdCBzYW1lTGluZSA9IGxvY2F0aW9uLnJvdy5zdGFydCA9PT0gbG9jYXRpb24ucm93LmVuZDtcclxuICAgICAgICBjb25zdCBnZXRMaW5lUmFuZ2UgPSAoKSA9PiBzYW1lTGluZSA/IGxvY2F0aW9uLnJvdy5zdGFydCArIDEgOiBsb2NhdGlvbi5yb3cuc3RhcnQgKyAxICsgJyAtICcgKyBsb2NhdGlvbi5yb3cuZW5kICsgMTtcclxuICAgICAgICBjb25zdCBjdWxwcml0ID0gYExpbmUke3NhbWVMaW5lID8gJycgOiAncyd9ICR7Z2V0TGluZVJhbmdlKCl9IGluICcke3NvdXJjZS5wYXRofSdgO1xyXG4gICAgICAgIHN3aXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY2FzZSBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQ6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluZm8oYCcke25vZGUudHlwZS5yZXBsYWNlKC9bX10vZywgJyAnKX0nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkOlxcbiR7Y3VscHJpdH1gKVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgRXJyb3JUeXBlLlRyZWVTaXR0ZXJQYXJzZUVycm9yOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvcihgJ3RyZWUtc2l0dGVyJyB3YXMgbm90IGFibGUgdG8gcGFyc2UgdGhlIHByb2dyYW06XFxuJHtjdWxwcml0fWApXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5jb25zdCBsb2cgPSBuZXcgUGFyc2VyTG9nKCdtci1kb2M6OnBhcnNlcicpO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbG9nOyJdfQ== \ No newline at end of file diff --git a/build/src/utils/match.js b/build/src/utils/match.js index 74e0c8d..58a09da 100644 --- a/build/src/utils/match.js +++ b/build/src/utils/match.js @@ -18,4 +18,4 @@ function match(node, ...types) { return false; } exports.default = match; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvbWF0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQTs7Ozs7OztHQU9HO0FBQ0gsU0FBd0IsS0FBSyxDQUFDLElBQWdCLEVBQUUsR0FBRyxLQUFlO0lBQ2hFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3JDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQ3RCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7S0FDRjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQVJELHdCQVFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIG5vZGUgaXMgYSBjZXJ0YWluIHR5cGUuXG4gKiBgYGBcbiAqIEBwYXJhbSBub2RlOiBTeW50YXhOb2RlIC0gVGhlIG5vZGUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB0eXBlOiBzdHJpbmcgIC0gVGhlIG5vZGUgdHlwZSB0byBtYXRjaC5cbiAqIEByZXR1cm46IGJvb2xlYW5cbiAqIGBgYFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYXRjaChub2RlOiBTeW50YXhOb2RlLCAuLi50eXBlczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlc1tpXTtcbiAgICBpZiAobm9kZS50eXBlID09PSB0eXBlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvbWF0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQTs7Ozs7OztHQU9HO0FBQ0gsU0FBd0IsS0FBSyxDQUFDLElBQWdCLEVBQUUsR0FBRyxLQUFlO0lBQ2hFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3JDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQ3RCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7S0FDRjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQVJELHdCQVFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5cclxuLyoqXHJcbiAqIERldGVybWluZXMgd2hldGhlciBhIG5vZGUgaXMgYSBjZXJ0YWluIHR5cGUuXHJcbiAqIGBgYFxyXG4gKiBAcGFyYW0gbm9kZTogU3ludGF4Tm9kZSAtIFRoZSBub2RlIHRvIGNvbXBhcmUuXHJcbiAqIEBwYXJhbSB0eXBlOiBzdHJpbmcgIC0gVGhlIG5vZGUgdHlwZSB0byBtYXRjaC5cclxuICogQHJldHVybjogYm9vbGVhblxyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1hdGNoKG5vZGU6IFN5bnRheE5vZGUsIC4uLnR5cGVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHtcclxuICAgIGNvbnN0IHR5cGUgPSB0eXBlc1tpXTtcclxuICAgIGlmIChub2RlLnR5cGUgPT09IHR5cGUpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBmYWxzZTtcclxufSJdfQ== \ No newline at end of file diff --git a/build/src/utils/measure.d.ts b/build/src/utils/measure.d.ts deleted file mode 100644 index 15d7c0f..0000000 --- a/build/src/utils/measure.d.ts +++ /dev/null @@ -1 +0,0 @@ -export default function measure(): void; diff --git a/build/src/utils/measure.js b/build/src/utils/measure.js deleted file mode 100644 index a82b65f..0000000 --- a/build/src/utils/measure.js +++ /dev/null @@ -1,6 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -function measure() { -} -exports.default = measure; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVhc3VyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9tZWFzdXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsU0FBd0IsT0FBTztBQUUvQixDQUFDO0FBRkQsMEJBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZWFzdXJlPFQ+KCkge1xuXG59Il19 \ No newline at end of file diff --git a/build/src/utils/performance.d.ts b/build/src/utils/performance.d.ts deleted file mode 100644 index 15d7c0f..0000000 --- a/build/src/utils/performance.d.ts +++ /dev/null @@ -1 +0,0 @@ -export default function measure(): void; diff --git a/build/src/utils/performance.js b/build/src/utils/performance.js deleted file mode 100644 index c9e9339..0000000 --- a/build/src/utils/performance.js +++ /dev/null @@ -1,6 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -function measure() { -} -exports.default = measure; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyZm9ybWFuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvcGVyZm9ybWFuY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxTQUF3QixPQUFPO0FBRS9CLENBQUM7QUFGRCwwQkFFQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lYXN1cmU8VD4oKSB7XG5cbn0iXX0= \ No newline at end of file diff --git a/build/src/utils/range.js b/build/src/utils/range.js index e8ee5d6..4adeddb 100644 --- a/build/src/utils/range.js +++ b/build/src/utils/range.js @@ -13,4 +13,4 @@ function range(node) { }; } exports.default = range; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvcmFuZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxTQUF3QixLQUFLLENBQUMsSUFBdUI7SUFDbkQsT0FBTztRQUNMLFFBQVEsRUFBRTtZQUNSLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVTtZQUN0QixHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDbkI7UUFDRCxRQUFRLEVBQUU7WUFDUixHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQ2pFLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7U0FDM0U7S0FDRixDQUFBO0FBQ0gsQ0FBQztBQVhELHdCQVdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcbmltcG9ydCBUZXh0UmFuZ2UgZnJvbSAnLi4vaW50ZXJmYWNlcy9UZXh0UmFuZ2UnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByYW5nZShub2RlOiBQYXJzZXIuU3ludGF4Tm9kZSk6IFRleHRSYW5nZSB7XG4gIHJldHVybiB7XG4gICAgcG9zaXRpb246IHtcbiAgICAgIHN0YXJ0OiBub2RlLnN0YXJ0SW5kZXgsXG4gICAgICBlbmQ6IG5vZGUuZW5kSW5kZXhcbiAgICB9LFxuICAgIGxvY2F0aW9uOiB7XG4gICAgICByb3c6IHsgc3RhcnQ6IG5vZGUuc3RhcnRQb3NpdGlvbi5yb3csIGVuZDogbm9kZS5lbmRQb3NpdGlvbi5yb3cgfSxcbiAgICAgIGNvbHVtbjogeyBzdGFydDogbm9kZS5zdGFydFBvc2l0aW9uLmNvbHVtbiwgZW5kOiBub2RlLmVuZFBvc2l0aW9uLmNvbHVtbiB9XG4gICAgfVxuICB9XG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvcmFuZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxTQUF3QixLQUFLLENBQUMsSUFBdUI7SUFDbkQsT0FBTztRQUNMLFFBQVEsRUFBRTtZQUNSLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVTtZQUN0QixHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDbkI7UUFDRCxRQUFRLEVBQUU7WUFDUixHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQ2pFLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7U0FDM0U7S0FDRixDQUFBO0FBQ0gsQ0FBQztBQVhELHdCQVdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcclxuaW1wb3J0IFRleHRSYW5nZSBmcm9tICcuLi9pbnRlcmZhY2VzL1RleHRSYW5nZSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByYW5nZShub2RlOiBQYXJzZXIuU3ludGF4Tm9kZSk6IFRleHRSYW5nZSB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHBvc2l0aW9uOiB7XHJcbiAgICAgIHN0YXJ0OiBub2RlLnN0YXJ0SW5kZXgsXHJcbiAgICAgIGVuZDogbm9kZS5lbmRJbmRleFxyXG4gICAgfSxcclxuICAgIGxvY2F0aW9uOiB7XHJcbiAgICAgIHJvdzogeyBzdGFydDogbm9kZS5zdGFydFBvc2l0aW9uLnJvdywgZW5kOiBub2RlLmVuZFBvc2l0aW9uLnJvdyB9LFxyXG4gICAgICBjb2x1bW46IHsgc3RhcnQ6IG5vZGUuc3RhcnRQb3NpdGlvbi5jb2x1bW4sIGVuZDogbm9kZS5lbmRQb3NpdGlvbi5jb2x1bW4gfVxyXG4gICAgfVxyXG4gIH1cclxufSJdfQ== \ No newline at end of file diff --git a/build/src/utils/sibling.js b/build/src/utils/sibling.js index fe01442..66420fd 100644 --- a/build/src/utils/sibling.js +++ b/build/src/utils/sibling.js @@ -12,4 +12,4 @@ function sibling(node, children, filter) { } } exports.sibling = sibling; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2libGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9zaWJsaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsU0FBZ0IsT0FBTyxDQUNyQixJQUFnQixFQUNoQixRQUF1QixFQUN2QixNQUFzQjtJQUV0QixJQUFJLElBQUksRUFBRTtRQUNSLElBQUksUUFBUSxFQUFFO1lBQ1osTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUM7Z0JBQ3BCLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsT0FBTyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzVCO1FBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0tBQ3pCO0FBQ0gsQ0FBQztBQWRELDBCQWNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuXG5leHBvcnQgZnVuY3Rpb24gc2libGluZyhcbiAgbm9kZTogU3ludGF4Tm9kZSxcbiAgY2hpbGRyZW4/OiBTeW50YXhOb2RlW10sXG4gIGZpbHRlcj86ICgpID0+IGJvb2xlYW5cbikge1xuICBpZiAobm9kZSkge1xuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgY29uc3QgaW5kZXggPSBmaWx0ZXIgP1xuICAgICAgICBjaGlsZHJlbi5maWx0ZXIoZmlsdGVyKS5pbmRleE9mKG5vZGUpIDpcbiAgICAgICAgY2hpbGRyZW4uaW5kZXhPZihub2RlKTtcbiAgICAgIHJldHVybiBjaGlsZHJlbltpbmRleCArIDFdO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZS5uZXh0U2libGluZztcbiAgfVxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2libGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9zaWJsaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsU0FBZ0IsT0FBTyxDQUNyQixJQUFnQixFQUNoQixRQUF1QixFQUN2QixNQUFzQjtJQUV0QixJQUFJLElBQUksRUFBRTtRQUNSLElBQUksUUFBUSxFQUFFO1lBQ1osTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUM7Z0JBQ3BCLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsT0FBTyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzVCO1FBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0tBQ3pCO0FBQ0gsQ0FBQztBQWRELDBCQWNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNpYmxpbmcoXHJcbiAgbm9kZTogU3ludGF4Tm9kZSxcclxuICBjaGlsZHJlbj86IFN5bnRheE5vZGVbXSxcclxuICBmaWx0ZXI/OiAoKSA9PiBib29sZWFuXHJcbikge1xyXG4gIGlmIChub2RlKSB7XHJcbiAgICBpZiAoY2hpbGRyZW4pIHtcclxuICAgICAgY29uc3QgaW5kZXggPSBmaWx0ZXIgP1xyXG4gICAgICAgIGNoaWxkcmVuLmZpbHRlcihmaWx0ZXIpLmluZGV4T2Yobm9kZSkgOlxyXG4gICAgICAgIGNoaWxkcmVuLmluZGV4T2Yobm9kZSk7XHJcbiAgICAgIHJldHVybiBjaGlsZHJlbltpbmRleCArIDFdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7XHJcbiAgfVxyXG59Il19 \ No newline at end of file diff --git a/build/src/utils/text.js b/build/src/utils/text.js index c4b2bc3..2727251 100644 --- a/build/src/utils/text.js +++ b/build/src/utils/text.js @@ -12,4 +12,4 @@ function text(source, node) { return source.text.substring(node.startIndex, node.endIndex); } exports.text = text; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy90ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0E7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLElBQUksQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDbkQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRkQsb0JBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGNvbnRleHQgc3RyaW5nXG4gKiBcbiAqICMgQVBJXG4gKiBcbiAqIEBwYXJhbSBzb3VyY2U6IElGaWxlIC0gVGhlIHNvdXJjZSBmaWxlLlxuICogQHBhcmFtIG5vZGU6IFN5bnRheE5vZGUgLSBUaGUgc3ludGF4IG5vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXh0KHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlKSB7XG4gIHJldHVybiBzb3VyY2UudGV4dC5zdWJzdHJpbmcobm9kZS5zdGFydEluZGV4LCBub2RlLmVuZEluZGV4KTtcbn0iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy90ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0E7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLElBQUksQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDbkQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRkQsb0JBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XHJcbmltcG9ydCBTb3VyY2UgZnJvbSBcIi4uL2ludGVyZmFjZXMvU291cmNlXCI7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgY29udGV4dCBzdHJpbmdcclxuICogXHJcbiAqICMgQVBJXHJcbiAqIFxyXG4gKiBAcGFyYW0gc291cmNlOiBJRmlsZSAtIFRoZSBzb3VyY2UgZmlsZS5cclxuICogQHBhcmFtIG5vZGU6IFN5bnRheE5vZGUgLSBUaGUgc3ludGF4IG5vZGUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdGV4dChzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSkge1xyXG4gIHJldHVybiBzb3VyY2UudGV4dC5zdWJzdHJpbmcobm9kZS5zdGFydEluZGV4LCBub2RlLmVuZEluZGV4KTtcclxufSJdfQ== \ No newline at end of file diff --git a/build/src/utils/walk.js b/build/src/utils/walk.js index d2e0acd..cc60803 100644 --- a/build/src/utils/walk.js +++ b/build/src/utils/walk.js @@ -7,4 +7,4 @@ function walk(node) { return node_; } exports.default = walk; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Fsay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy93YWxrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsOENBQTBDO0FBQzFDLFNBQXdCLElBQUksQ0FBQyxJQUFnQjtJQUMzQyxJQUFJLEtBQUssR0FBRyxJQUFJLFdBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUNuRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFKRCx1QkFJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcbmltcG9ydCB7IE5vZGUgfSBmcm9tICcuLi9sYW5nL2NvbW1vbi9ub2RlJ1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gd2Fsayhub2RlOiBTeW50YXhOb2RlKSB7XG4gIGxldCBub2RlXyA9IG5ldyBOb2RlKG5vZGUpO1xuICBub2RlXy5zeW50YXhOb2RlLmNoaWxkcmVuLm1hcChjaGlsZCA9PiB3YWxrKGNoaWxkKSlcbiAgcmV0dXJuIG5vZGVfO1xufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Fsay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy93YWxrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsOENBQTBDO0FBQzFDLFNBQXdCLElBQUksQ0FBQyxJQUFnQjtJQUMzQyxJQUFJLEtBQUssR0FBRyxJQUFJLFdBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUNuRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFKRCx1QkFJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcclxuaW1wb3J0IHsgTm9kZSB9IGZyb20gJy4uL2xhbmcvY29tbW9uL25vZGUnXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHdhbGsobm9kZTogU3ludGF4Tm9kZSkge1xyXG4gIGxldCBub2RlXyA9IG5ldyBOb2RlKG5vZGUpO1xyXG4gIG5vZGVfLnN5bnRheE5vZGUuY2hpbGRyZW4ubWFwKGNoaWxkID0+IHdhbGsoY2hpbGQpKVxyXG4gIHJldHVybiBub2RlXztcclxufSJdfQ== \ No newline at end of file diff --git a/corpus/example.js b/corpus/example.js new file mode 100644 index 0000000..a6051ac --- /dev/null +++ b/corpus/example.js @@ -0,0 +1,7 @@ +/** + * + * @param x - description + */ +function name(...args) { + +} \ No newline at end of file diff --git a/example.ts b/corpus/example.ts similarity index 55% rename from example.ts rename to corpus/example.ts index 4faac88..2f43745 100644 --- a/example.ts +++ b/corpus/example.ts @@ -2,7 +2,7 @@ export namespace X { /** * */ - export function name(params:string) { + export function name(...args) { } } \ No newline at end of file diff --git a/parser.txt b/corpus/parser.txt similarity index 100% rename from parser.txt rename to corpus/parser.txt diff --git a/example.js b/example.js deleted file mode 100644 index df4e3d1..0000000 --- a/example.js +++ /dev/null @@ -1,7 +0,0 @@ -/** - * @author - */ - - function b() { - - } \ No newline at end of file diff --git a/index.ts b/index.ts index 11703ea..ff08cba 100644 --- a/index.ts +++ b/index.ts @@ -1,7 +1,8 @@ import Source from './src/interfaces/Source'; import ParserFactory from './src/ParserFactory'; -import IParser from './src/interfaces/IParser'; +import ParserInterface from './src/interfaces/ParserInterface'; import * as FS from 'fs'; +import { Tree } from 'tree-sitter'; // import { ASTNode } from './src/lang/common/ast'; /** * A class that parses a source code and generates an AST. @@ -22,21 +23,27 @@ import * as FS from 'fs'; * * ``` */ -export default class Parser implements IParser { +export default class Parser implements ParserInterface { - private parser: IParser; + private parser: ParserInterface; constructor(file: Source, options: any = {}) { this.parser = (new ParserFactory(file, options)).getParser(); } parse = () => { return this.parser.parse() } + get tree (): Tree { + return this.parser.tree; + } } -const path = `${process.cwd()}/example.ts`; + +const path = `${process.cwd()}/corpus/example.js`; const result = new Parser({ name: 'index.ts', path: path, text: FS.readFileSync(path, 'utf-8') }, { - language: 'typescript' -}).parse(); \ No newline at end of file + language: 'javascript' +}).parse(); + +console.log(result); diff --git a/src/ParserFactory.ts b/src/ParserFactory.ts index ae51263..86eeed6 100644 --- a/src/ParserFactory.ts +++ b/src/ParserFactory.ts @@ -1,5 +1,5 @@ import Source from "./interfaces/Source"; -import IParser from "./interfaces/IParser"; +import ParserInterface from "./interfaces/ParserInterface"; import JavaScriptParser from "./lang/javascript"; import TypeScriptParser from './lang/typescript'; @@ -13,7 +13,7 @@ export default class ParserFactory { Object.assign(this.options, options) } - getParser = (): IParser => { + getParser = (): ParserInterface => { switch (this.options.language.toLowerCase()) { case 'js': case 'javascript': diff --git a/src/interfaces/IParser.ts b/src/interfaces/IParser.ts deleted file mode 100644 index 27385f2..0000000 --- a/src/interfaces/IParser.ts +++ /dev/null @@ -1,10 +0,0 @@ -import Source from "./Source"; -import { ASTNode } from "../lang/common/ast"; -// import IResult from "./IResult"; - -export default abstract class IParser { - constructor(file: Source, options: any) { - - } - abstract parse(): ASTNode[] -} \ No newline at end of file diff --git a/src/interfaces/ParserInterface.ts b/src/interfaces/ParserInterface.ts new file mode 100644 index 0000000..9485cc1 --- /dev/null +++ b/src/interfaces/ParserInterface.ts @@ -0,0 +1,12 @@ +import Source from "./Source"; +import { ASTNode } from "../lang/common/ast"; +import { Tree } from "tree-sitter"; +// import IResult from "./IResult"; + +export default abstract class ParserInterface { + constructor(source: Source, options: any) { + + } + abstract parse(): ASTNode[] + abstract get tree(): Tree +} \ No newline at end of file diff --git a/src/lang/javascript/index.ts b/src/lang/javascript/index.ts index 3479238..2ad1445 100644 --- a/src/lang/javascript/index.ts +++ b/src/lang/javascript/index.ts @@ -1,9 +1,10 @@ import * as Parser from 'tree-sitter'; import * as JavaScript from 'tree-sitter-javascript'; -import IParser from '../../interfaces/IParser'; +import ParserInterface from '../../interfaces/ParserInterface'; import Source from '../../interfaces/Source'; -// import IResult from '../../interfaces/IResult'; -// import IComment from '../../interfaces/IComment'; +import { ASTNode } from '../common/ast'; +import { JavaScriptVisitor } from './visitor'; +import walk from '../../utils/walk'; /** * A class that parses JavaScript comments. @@ -16,95 +17,28 @@ import Source from '../../interfaces/Source'; * @export default * ``` */ -export default class JavaScriptParser implements IParser { - private file: Source; +export default class JavaScriptParser implements ParserInterface { + + private source: Source; private options: any; private parser: Parser; - constructor(file: Source, options: any) { - this.file = file; + private tree_: Parser.Tree; + constructor(source: Source, options: any) { + this.source = source; Object.assign(this.options = {}, options || {}); this.parser = new Parser(); this.parser.setLanguage(JavaScript); + this.tree_ = this.parser.parse(this.source.text); } - parse = () => { - // let tree = this.parser.parse(this.file.text); - // // Get the first comment - // let first_comment = tree.rootNode.children - // .filter(node => node.type === "comment")[0]; - // const first_comment_string = this.file.text - // .substring(first_comment.startIndex, first_comment.endIndex); - - // // Remove any legal or unncessary comments - // if (first_comment_string.includes("copyright") || - // first_comment_string.includes("author") || - // first_comment_string.includes("terms and conditions")) { - // tree.edit({ - // startIndex: first_comment.startIndex, - // oldEndIndex: first_comment.endIndex, - // newEndIndex: first_comment.endIndex, - // startPosition: { row: 0, column: 0 }, - // oldEndPosition: { row: 0, column: 0 }, - // newEndPosition: { row: 0, column: 0 }, - // }); - // tree = this.parser.parse('', tree); - // } - // return { - // file: this.file, - // comments: CommentParser.parse(tree.rootNode, this.file.text) - // .filter(this.filterType) - // // .map(this.checkType) - // .map(this.parseChildren) - // } - return []; + parse(): ASTNode[] { + const visitor = new JavaScriptVisitor(this.source); + const root = walk(this.tree.rootNode); + // console.time('visit') + root.visit(visitor) + // console.timeEnd('visit') + return visitor.getAST(); + } + get tree (): Parser.Tree { + return this.tree_; } - - // private filterType = (comment): boolean => { - // return (this.options.filter || - // [ - // 'function', - // 'class', - // 'variable_declaration' - // ]).includes(comment.context.type) - // } - - // private checkType = (comment) => { - // const tree = this.parser.parse(comment.context.text); - // switch (comment.context.type) { - // case 'variable_declaration': - // // Check whether we have an anonymous class - // if (comment.context.text.includes("class")) { - // // Drill down until we find the class body - // const variable_declarator = tree.rootNode.children[0].children[1]; - // const anonymous_class = variable_declarator.children - // .filter(node => node.type === "anonymous_class")[0] - // const class_body = anonymous_class.children[1]; - // comment.context.children = CommentParser.parse( - // class_body, - // comment.context.text, - // { location: comment.context.location, position: comment.context.position } - // ); - // } - // break; - // default: - // break; - // } - // return comment; - // } - - // private parseChildren = (comment) => { - // switch (comment.context.type) { - // case 'class': - // const tree = this.parser.parse(comment.context.text); - // comment.context.children = CommentParser.parse( - // tree.rootNode, - // comment.context.text, - // { location: comment.context.location, position: comment.context.position } - // ).filter(child => child.context.type === 'method_definition'); - // break; - // default: - // break; - // } - // return comment; - // } - } \ No newline at end of file diff --git a/src/lang/javascript/visitor.ts b/src/lang/javascript/visitor.ts new file mode 100644 index 0000000..a7848b9 --- /dev/null +++ b/src/lang/javascript/visitor.ts @@ -0,0 +1,337 @@ +import { createASTNode, ASTNode } from "../common/ast"; +import { isJavaDocComment } from "../../utils/comment"; +import { NodeProperties, NodeInheritance } from "../common/emca"; +import { NodeVisitor } from "../common/node"; +import { sibling } from "../../utils/sibling"; +import { SyntaxNode } from "tree-sitter"; +import * as _ from 'lodash'; +import log, { ErrorType } from "../../utils/log"; +import match from "../../utils/match"; +import Source from "../../interfaces/Source"; + +/** + * A class that visits ASTNodes from a TypeScript tree. + */ +export class JavaScriptVisitor implements NodeVisitor { + private ast: ASTNode[] = [] + private source: Source + constructor(source: Source) { + this.source = source; + } + + /** + * Determines whether a node has inheritance + */ + private hasInheritance(node: SyntaxNode) { + let inherits = false; + for (let i = 0; i < node.children.length; i++) { + const child = node.children[i]; + if (match(child, 'extends', 'implements')) { + inherits = true; + } + } + return inherits + } + + /** + * Returns a node's inheritance type + */ + private getInheritanceType(node: SyntaxNode) { + for (let i = 0; i < node.children.length; i++) { + const child = node.children[i]; + if (match(child, 'extends')) { + return 'extends'; + } + + if (match(child, 'implements')) { + return 'implements'; + } + } + } + + /** + * Determines whether an export is default + */ + private hasDefaultExport(node: SyntaxNode): boolean { + for (let i = 0; i < node.children.length; i++) { + const child = node.children[i]; + if (match(child, 'default')) { + return true; + } + } + return false; + } + + /** + * Returns only the comments from a node's children. + */ + private filterType(node: SyntaxNode, type: string): SyntaxNode[] { + // console.time('filterType') + let children: SyntaxNode[] = []; + for (let i = 0; i < node.children.length; i++) { + const child = node.children[i]; + if (match(child, type)) { + children.push(child); + } + } + // console.timeEnd('filterType') + return children; + } + + getAST(): ASTNode[] { + return this.ast; + } + + /* Visitors */ + + visitNode = ( + node: SyntaxNode, + properties?: Partial + ) => { + switch (node.type) { + case 'program': + this.ast = this.visitProgram(node); + break; + case 'comment': + return this.visitComment(node); + case 'MISSING': + case 'ERROR': + log.report(this.source, node, ErrorType.TreeSitterParseError); + break; + default: + + /* Match other non-terminals */ + + if (match(node, + 'constraint', + 'formal_parameters', 'required_parameter', 'rest_parameter', + 'type_identifier', 'type_parameters', 'type_parameter', 'type_annotation', + 'object_type', 'predefined_type', 'parenthesized_type', 'literal_type', + 'intersection_type', 'union_type', + 'class_body', + 'extends_clause', + 'unary_expression', 'binary_expression', + 'statement_block', 'return_statement', 'export_statement', 'expression_statement', + // A call_signature can also be a non-contextual node + 'call_signature', + 'internal_module' + )) { + return this.visitNonTerminal(node, properties) + } + + /* Match terminals */ + if (match(node, + 'identifier', 'extends', 'property_identifier', 'accessibility_modifier', + 'null', 'undefined', 'return', + 'get', 'function', 'namespace', + )) { + return this.visitTerminal(node); + } + + log.report(this.source, node, ErrorType.NodeTypeNotYetSupported); + break; + } + } + + visitChildren = (nodes: SyntaxNode[]): ASTNode[] => { + let children: ASTNode[] = []; + for (let i = 0; i < nodes.length; i++) { + const node = nodes[i]; + if (!node.type.match(/[<>(){},:;\[\]&|=\+\-\*\/]/) && node.type !== '...') { + const child = this.visitNode(node); + if (child) children.push(child); + } + } + return children; + } + + private visitProgram = (node: SyntaxNode): ASTNode[] => { + let visited = {}, + getStartLocation = (n: ASTNode) => `${n.location.row.start}:${n.location.column.start}`; + // A program can have modules, namespaces, comments as its children + // The first step is to parse all the comments in the root node + let comments = this.visitChildren(this.filterType(node, 'comment')); + // Parse the namespaces in expression_statement + // let namespaces = this.visitChildren(this.filterType(node, 'expression_statement')); + // Parse the export statements in the root node + let exports = this.visitChildren(this.filterType(node, 'export_statement')); + + // Get the visited context nodes + for (let i = 0; i < comments.length; i++) { + const comment = comments[i]; + const context = comment; + visited[getStartLocation(context)] = true; + } + + // Exports are oddballs since some exports may reference + // a type/node that may have been commented. + // We'll first need to filter the ones we have visited + _.remove(exports, x => visited[getStartLocation(x)]); + + // From the ones we have not visited, we'll need to modify + // the node properties of each context in a comment node that + // matches the ones we have not visited. + const matched = {}; + comments = _.compact( + comments.map(comment => { + for (let i = 0; i < exports.length; i++) { + const export_ = exports[i]; + const context = comment.context; + for (let j = 0; j < context.children.length; j++) { + if (context.children[i].type === export_.type) { + matched[getStartLocation(export_)] = true; + comment.context.properties = Object.assign( + comment.context.properties || {}, + export_.properties + ); + } + } + } + return comment; + })); + + // Removed the matched exports + _.remove(exports, x => matched[getStartLocation(x)]) + + return [].concat(comments).concat(exports); + } + + private visitComment = (node: SyntaxNode): ASTNode => { + if (isJavaDocComment(this.source, node)) { + const nextSibling = sibling(node); + if (nextSibling) { + return createASTNode(this.source, node, this.visitContext(nextSibling, {}), true) + } + } + } + + /** + * Visit the contextual node + * + * # Remark + * + * A node is considered contextual when a comment is visited and the node is its sibling. + */ + private visitContext = (node: SyntaxNode, properties?: Partial): ASTNode => { + switch (node.type) { + case 'export_statement': + return this.visitExportStatement(node, properties); + case 'expression_statement': + return this.visitExpressionStatement(node, properties); + case 'class': + return this.visitClass(node, properties) + case 'function': + case 'call_signature': + case 'method_signature': + case 'property_signature': + case 'public_field_definition': + case 'method_definition': + return this.visitNonTerminal(node, properties); + default: + log.report(this.source, node, ErrorType.NodeTypeNotYetSupported); + break; + } + } + + /* Statements */ + + private visitExportStatement = (node: SyntaxNode, properties?: Partial): ASTNode => { + let children = node.children, defaultExport = false; + // Remove 'export' since it's always first in the array + children.shift(); + if (this.hasDefaultExport(node)) { + defaultExport = true; + // Remove 'default' export + children.shift(); + } + const child = children.shift(); + return this.visitNode(child, { exports: { export: true, default: defaultExport } }); + } + + private visitExpressionStatement = (node: SyntaxNode, properties: Partial): ASTNode => { + let children = node.children; + const child = children.shift(); + if (match(child, 'internal_module')) { + return this.visitInternalModule(child, properties) + } + return this.visitNonTerminal(node); + } + + /* Modules */ + + private visitInternalModule = (node: SyntaxNode, properties?: Partial): ASTNode => { + let children: ASTNode[] = node.children.map(child => { + if (match(child, 'statement_block')) { + return createASTNode(this.source, node, this.visitChildren(this.filterType(child, 'comment'))) + } + return this.visitNode(child); + }); + return createASTNode(this.source, node, children, Object.assign(properties || {}, { namespace: true })); + } + + + /* Declarations */ + + private visitClass = (node: SyntaxNode, properties?: Partial): ASTNode => { + // Since 'interface' or 'class' is always first in the array + // we'll need to remove it from the array. + let children = node.children; + const interface_ = children.shift(); + let extends_ = false, implements_ = false; + if (this.hasInheritance(node)) { + const inheritance = this.getInheritanceType(node) + extends_ = inheritance === 'extends'; + implements_ = inheritance === 'implements'; + } + + const node_ = createASTNode( + this.source, + node, + this.visitChildren(children), + Object.assign(properties || {}, { + inheritance: { + implements: implements_, + extends: extends_ + } as NodeInheritance + })); + + if (match(node, 'class')) { + return node_; + } + // Overwrite the node type from 'interface_declaration' to 'interface' + return Object.assign(node_, { type: interface_.type }) + } + + /* Non-terminals */ + + private visitNonTerminal = (node: SyntaxNode, properties?: Partial): ASTNode => { + let children = node.children; + // Handle special cases where some non-terminals + // contain comments which is what we care about + if (match(node, 'class_body', 'object_type')) { + children = this.filterType(node, 'comment'); + } + // Handle special cases where export statements have node properties + if (match(node, 'export_statement')) { + return this.visitExportStatement(node); + } + + // Handle special cases where an internal module contains other nodes + if (match(node, 'internal_module')) { + return this.visitInternalModule(node, properties); + } + + // Handle special cases where an intermal_module can exist in an expression_statement + if (match(node, 'expression_statement')) { + return this.visitExpressionStatement(node, properties); + } + + return createASTNode(this.source, node, this.visitChildren(children), properties); + } + + /* Terminals */ + + private visitTerminal = (node: SyntaxNode): ASTNode => { + return createASTNode(this.source, node) + } +} \ No newline at end of file diff --git a/src/lang/typescript/index.ts b/src/lang/typescript/index.ts index 5c99b6c..b4337f8 100644 --- a/src/lang/typescript/index.ts +++ b/src/lang/typescript/index.ts @@ -1,6 +1,6 @@ import * as Parser from 'tree-sitter'; import * as TypeScript from 'tree-sitter-typescript'; -import IParser from '../../interfaces/IParser'; +import ParserInterface from '../../interfaces/ParserInterface'; import Source from '../../interfaces/Source'; import walk from '../../utils/walk'; import { TypeScriptVisitor } from './visitor'; @@ -18,24 +18,28 @@ import log from '../../utils/log'; * @export default * ``` */ -export default class TypeScriptParser implements IParser { +export default class TypeScriptParser implements ParserInterface { private source: Source; private options: any; private parser: Parser; - constructor(file: Source, options: any) { - this.source = file; + private tree_: Parser.Tree; + constructor(source: Source, options: any) { + this.source = source; Object.assign(this.options = {}, options || {}); this.parser = new Parser(); this.parser.setLanguage(TypeScript); + this.tree_ = this.parser.parse(this.source.text); } parse = () => { - const tree = this.parser.parse(this.source.text); const visitor = new TypeScriptVisitor(this.source); - const root = walk(tree.rootNode); - console.time('visit') + const root = walk(this.tree.rootNode); + // console.time('visit') root.visit(visitor) - console.timeEnd('visit') - + // console.timeEnd('visit') return visitor.getAST(); } + + get tree (): Parser.Tree { + return this.tree; + } } diff --git a/src/lang/typescript/visitor.ts b/src/lang/typescript/visitor.ts index 79a6355..2064f8f 100644 --- a/src/lang/typescript/visitor.ts +++ b/src/lang/typescript/visitor.ts @@ -104,7 +104,7 @@ export class TypeScriptVisitor implements NodeVisitor { if (match(node, 'constraint', - 'formal_parameters', 'required_parameter', + 'formal_parameters', 'required_parameter', 'rest_parameter', 'type_identifier', 'type_parameters', 'type_parameter', 'type_annotation', 'object_type', 'predefined_type', 'parenthesized_type', 'literal_type', 'intersection_type', 'union_type', @@ -136,7 +136,7 @@ export class TypeScriptVisitor implements NodeVisitor { let children: ASTNode[] = []; for (let i = 0; i < nodes.length; i++) { const node = nodes[i]; - if (!node.type.match(/[<>(){},:;\[\]&|=\+\-\*\/]/)) { + if (!node.type.match(/[<>(){},:;\[\]&|=\+\-\*\/]/) && node.type !== '...') { const child = this.visitNode(node); if (child) children.push(child); } @@ -163,34 +163,37 @@ export class TypeScriptVisitor implements NodeVisitor { } // Remove the visited nodes from namespaces array - namespaces = _.remove(namespaces, x => !visited[getStartLocation(x)]); + _.remove(namespaces, x => visited[getStartLocation(x)]); // Exports are oddballs since some exports may reference // a type/node that may have been commented. // We'll first need to filter the ones we have visited - exports = _.remove(exports, x => !visited[getStartLocation(x)]); + _.remove(exports, x => visited[getStartLocation(x)]); // From the ones we have not visited, we'll need to modify // the node properties of each context in a comment node that // matches the ones we have not visited. const matched = {}; - comments = _.remove( + comments = _.compact( comments.map(comment => { for (let i = 0; i < exports.length; i++) { const export_ = exports[i]; - if (comment.context.type === export_.type) { - matched[getStartLocation(export_)] = true; - comment.context.properties = Object.assign( - comment.context.properties || {}, - export_.properties - ); - return comment; + const context = comment.context; + for (let j = 0; j < context.children.length; j++) { + if (context.children[i].type === export_.type) { + matched[getStartLocation(export_)] = true; + comment.context.properties = Object.assign( + comment.context.properties || {}, + export_.properties + ); + } } } - }), (comment) => !comment); + return comment; + })); // Removed the matched exports - exports = _.remove(exports, x => !matched[getStartLocation(x)]) + _.remove(exports, x => matched[getStartLocation(x)]) return [].concat(comments).concat(namespaces).concat(exports); } @@ -326,7 +329,6 @@ export class TypeScriptVisitor implements NodeVisitor { return this.visitExpressionStatement(node, properties); } - return createASTNode(this.source, node, this.visitChildren(children), properties); } diff --git a/src/utils/log.ts b/src/utils/log.ts index 3e74f8e..f0bd75c 100644 --- a/src/utils/log.ts +++ b/src/utils/log.ts @@ -13,7 +13,7 @@ class ParserLog extends Log { const location = range(node).location; const sameLine = location.row.start === location.row.end; const getLineRange = () => sameLine ? location.row.start + 1 : location.row.start + 1 + ' - ' + location.row.end + 1; - const culprit = `Line${sameLine ? '' : 's'} ${getLineRange()} in '${source.path}${source.name}'`; + const culprit = `Line${sameLine ? '' : 's'} ${getLineRange()} in '${source.path}'`; switch (error) { case ErrorType.NodeTypeNotYetSupported: this.info(`'${node.type.replace(/[_]/g, ' ')}' is not yet supported:\n${culprit}`) From 7040307f9c32d91024daa85a8d5ab4070cf604ce Mon Sep 17 00:00:00 2001 From: Takeshi Date: Thu, 23 Aug 2018 14:08:07 -0600 Subject: [PATCH 17/32] Fix: Endless recursive call --- build/corpus/example.js | 2 +- build/corpus/nodes.d.ts | 0 build/corpus/nodes.js | 2 + build/index.js | 8 +- build/src/ParserFactory.js | 2 +- build/src/interfaces/ParserInterface.js | 2 +- build/src/interfaces/Source.js | 2 +- build/src/interfaces/TextRange.js | 2 +- build/src/lang/common/ast.d.ts | 2 + build/src/lang/common/ast.js | 20 +- build/src/lang/common/emca.js | 2 +- build/src/lang/common/node.js | 2 +- build/src/lang/javascript/index.js | 4 +- build/src/lang/javascript/visitor.js | 31 +- build/src/lang/typescript/index.js | 6 +- build/src/lang/typescript/visitor.js | 25 +- build/src/utils/benchmark.js | 2 +- build/src/utils/comment.js | 2 +- build/src/utils/log.js | 2 +- build/src/utils/match.js | 2 +- build/src/utils/range.js | 2 +- build/src/utils/sibling.js | 2 +- build/src/utils/text.js | 2 +- build/src/utils/walk.js | 2 +- corpus/ReactElementValidator.txt | 367 ++++++++++++++++++++++++ corpus/nodes.txt | 97 +++++++ index.ts | 6 +- src/lang/common/ast.ts | 20 +- src/lang/javascript/index.ts | 2 +- src/lang/javascript/visitor.ts | 35 ++- src/lang/typescript/index.ts | 5 +- src/lang/typescript/visitor.ts | 30 +- 32 files changed, 614 insertions(+), 76 deletions(-) create mode 100644 build/corpus/nodes.d.ts create mode 100644 build/corpus/nodes.js create mode 100644 corpus/ReactElementValidator.txt create mode 100644 corpus/nodes.txt diff --git a/build/corpus/example.js b/build/corpus/example.js index c7a4dba..7204ff3 100644 --- a/build/corpus/example.js +++ b/build/corpus/example.js @@ -9,4 +9,4 @@ var X; } X.name = name; })(X = exports.X || (exports.X = {})); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhhbXBsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2NvcnB1cy9leGFtcGxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsSUFBaUIsQ0FBQyxDQU9qQjtBQVBELFdBQWlCLENBQUM7SUFDaEI7O09BRUc7SUFDSCxTQUFnQixJQUFJLENBQUMsR0FBRyxJQUFJO0lBRTVCLENBQUM7SUFGZSxNQUFJLE9BRW5CLENBQUE7QUFDSCxDQUFDLEVBUGdCLENBQUMsR0FBRCxTQUFDLEtBQUQsU0FBQyxRQU9qQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBuYW1lc3BhY2UgWCB7XHJcbiAgLyoqXHJcbiAgICogXHJcbiAgICovXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIG5hbWUoLi4uYXJncykge1xyXG4gICAgXHJcbiAgfVxyXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhhbXBsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2NvcnB1cy9leGFtcGxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsSUFBaUIsQ0FBQyxDQU9qQjtBQVBELFdBQWlCLENBQUM7SUFDaEI7O09BRUc7SUFDSCxTQUFnQixJQUFJLENBQUMsR0FBRyxJQUFJO0lBRTVCLENBQUM7SUFGZSxNQUFJLE9BRW5CLENBQUE7QUFDSCxDQUFDLEVBUGdCLENBQUMsR0FBRCxTQUFDLEtBQUQsU0FBQyxRQU9qQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBuYW1lc3BhY2UgWCB7XG4gIC8qKlxuICAgKiBcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBuYW1lKC4uLmFyZ3MpIHtcbiAgICBcbiAgfVxufSJdfQ== \ No newline at end of file diff --git a/build/corpus/nodes.d.ts b/build/corpus/nodes.d.ts new file mode 100644 index 0000000..e69de29 diff --git a/build/corpus/nodes.js b/build/corpus/nodes.js new file mode 100644 index 0000000..3e4f897 --- /dev/null +++ b/build/corpus/nodes.js @@ -0,0 +1,2 @@ +"use strict"; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9jb3JwdXMvbm9kZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIiJdfQ== \ No newline at end of file diff --git a/build/index.js b/build/index.js index b38a3b1..c437708 100644 --- a/build/index.js +++ b/build/index.js @@ -34,13 +34,13 @@ class Parser { } } exports.default = Parser; -const path = `${process.cwd()}/corpus/example.js`; +const path = `${process.cwd()}/corpus/ReactElementValidator.txt`; const result = new Parser({ name: 'index.ts', path: path, text: FS.readFileSync(path, 'utf-8') }, { - language: 'javascript' + language: 'ts' }).parse(); -console.log(result); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLHVEQUFnRDtBQUVoRCx5QkFBeUI7QUFFekIsbURBQW1EO0FBQ25EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFxQixNQUFNO0lBR3pCLFlBQVksSUFBWSxFQUFFLFVBQWUsRUFBRTtRQUczQyxVQUFLLEdBQUcsR0FBRyxFQUFFO1lBQ1gsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQzVCLENBQUMsQ0FBQTtRQUpDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLHVCQUFhLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDL0QsQ0FBQztJQUlELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDMUIsQ0FBQztDQUNGO0FBWkQseUJBWUM7QUFFRCxNQUFNLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsb0JBQW9CLENBQUM7QUFDbEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUM7SUFDeEIsSUFBSSxFQUFFLFVBQVU7SUFDaEIsSUFBSSxFQUFFLElBQUk7SUFDVixJQUFJLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDO0NBQ3JDLEVBQUU7SUFDRCxRQUFRLEVBQUUsWUFBWTtDQUN2QixDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7QUFFWCxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNvdXJjZSBmcm9tICcuL3NyYy9pbnRlcmZhY2VzL1NvdXJjZSc7XHJcbmltcG9ydCBQYXJzZXJGYWN0b3J5IGZyb20gJy4vc3JjL1BhcnNlckZhY3RvcnknO1xyXG5pbXBvcnQgUGFyc2VySW50ZXJmYWNlIGZyb20gJy4vc3JjL2ludGVyZmFjZXMvUGFyc2VySW50ZXJmYWNlJztcclxuaW1wb3J0ICogYXMgRlMgZnJvbSAnZnMnO1xyXG5pbXBvcnQgeyBUcmVlIH0gZnJvbSAndHJlZS1zaXR0ZXInO1xyXG4vLyBpbXBvcnQgeyBBU1ROb2RlIH0gZnJvbSAnLi9zcmMvbGFuZy9jb21tb24vYXN0JztcclxuLyoqXHJcbiAqIEEgY2xhc3MgdGhhdCBwYXJzZXMgYSBzb3VyY2UgY29kZSBhbmQgZ2VuZXJhdGVzIGFuIEFTVC5cclxuICogXHJcbiAqIEBjbGFzcyBQYXJzZXJcclxuICogQGltcGxlbWVudHMgSVBhcnNlclxyXG4gKiBcclxuICogIyBFeGFtcGxlXHJcbiAqIFxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKHtcclxuICogIG5hbWU6ICcuLi4nLFxyXG4gKiAgcGF0aDogJy4uLi4nLFxyXG4gKiAgdGV4dDogJy4uLidcclxuICogfSwgeyBsYW5ndWFnZTogJ3R5cGVzY3JpcHQnIH0pO1xyXG4gKiBcclxuICogY29uc3QgcmVzdWx0ID0gcGFyc2VyLnBhcnNlKCk7XHJcbiAqIFxyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhcnNlciBpbXBsZW1lbnRzIFBhcnNlckludGVyZmFjZSB7XHJcblxyXG4gIHByaXZhdGUgcGFyc2VyOiBQYXJzZXJJbnRlcmZhY2U7XHJcbiAgY29uc3RydWN0b3IoZmlsZTogU291cmNlLCBvcHRpb25zOiBhbnkgPSB7fSkge1xyXG4gICAgdGhpcy5wYXJzZXIgPSAobmV3IFBhcnNlckZhY3RvcnkoZmlsZSwgb3B0aW9ucykpLmdldFBhcnNlcigpO1xyXG4gIH1cclxuICBwYXJzZSA9ICgpID0+IHtcclxuICAgIHJldHVybiB0aGlzLnBhcnNlci5wYXJzZSgpXHJcbiAgfVxyXG4gIGdldCB0cmVlICgpOiBUcmVlIHtcclxuICAgIHJldHVybiB0aGlzLnBhcnNlci50cmVlO1xyXG4gIH1cclxufVxyXG5cclxuY29uc3QgcGF0aCA9IGAke3Byb2Nlc3MuY3dkKCl9L2NvcnB1cy9leGFtcGxlLmpzYDtcclxuY29uc3QgcmVzdWx0ID0gbmV3IFBhcnNlcih7XHJcbiAgbmFtZTogJ2luZGV4LnRzJyxcclxuICBwYXRoOiBwYXRoLFxyXG4gIHRleHQ6IEZTLnJlYWRGaWxlU3luYyhwYXRoLCAndXRmLTgnKVxyXG59LCB7XHJcbiAgbGFuZ3VhZ2U6ICdqYXZhc2NyaXB0J1xyXG59KS5wYXJzZSgpO1xyXG5cclxuY29uc29sZS5sb2cocmVzdWx0KTtcclxuIl19 \ No newline at end of file +// console.log(result); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLHVEQUFnRDtBQUVoRCx5QkFBeUI7QUFFekIsbURBQW1EO0FBQ25EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFxQixNQUFNO0lBR3pCLFlBQVksSUFBWSxFQUFFLFVBQWUsRUFBRTtRQUczQyxVQUFLLEdBQUcsR0FBRyxFQUFFO1lBQ1gsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQzVCLENBQUMsQ0FBQTtRQUpDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLHVCQUFhLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDL0QsQ0FBQztJQUlELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDMUIsQ0FBQztDQUNGO0FBWkQseUJBWUM7QUFFRCxNQUFNLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsbUNBQW1DLENBQUM7QUFDakUsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUM7SUFDeEIsSUFBSSxFQUFFLFVBQVU7SUFDaEIsSUFBSSxFQUFFLElBQUk7SUFDVixJQUFJLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDO0NBQ3JDLEVBQUU7SUFDRCxRQUFRLEVBQUUsSUFBSTtDQUNmLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUVYLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTb3VyY2UgZnJvbSAnLi9zcmMvaW50ZXJmYWNlcy9Tb3VyY2UnO1xuaW1wb3J0IFBhcnNlckZhY3RvcnkgZnJvbSAnLi9zcmMvUGFyc2VyRmFjdG9yeSc7XG5pbXBvcnQgUGFyc2VySW50ZXJmYWNlIGZyb20gJy4vc3JjL2ludGVyZmFjZXMvUGFyc2VySW50ZXJmYWNlJztcbmltcG9ydCAqIGFzIEZTIGZyb20gJ2ZzJztcbmltcG9ydCB7IFRyZWUgfSBmcm9tICd0cmVlLXNpdHRlcic7XG4vLyBpbXBvcnQgeyBBU1ROb2RlIH0gZnJvbSAnLi9zcmMvbGFuZy9jb21tb24vYXN0Jztcbi8qKlxuICogQSBjbGFzcyB0aGF0IHBhcnNlcyBhIHNvdXJjZSBjb2RlIGFuZCBnZW5lcmF0ZXMgYW4gQVNULlxuICogXG4gKiBAY2xhc3MgUGFyc2VyXG4gKiBAaW1wbGVtZW50cyBJUGFyc2VyXG4gKiBcbiAqICMgRXhhbXBsZVxuICogXG4gKiBgYGBqc1xuICogY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcih7XG4gKiAgbmFtZTogJy4uLicsXG4gKiAgcGF0aDogJy4uLi4nLFxuICogIHRleHQ6ICcuLi4nXG4gKiB9LCB7IGxhbmd1YWdlOiAndHlwZXNjcmlwdCcgfSk7XG4gKiBcbiAqIGNvbnN0IHJlc3VsdCA9IHBhcnNlci5wYXJzZSgpO1xuICogXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFyc2VyIGltcGxlbWVudHMgUGFyc2VySW50ZXJmYWNlIHtcblxuICBwcml2YXRlIHBhcnNlcjogUGFyc2VySW50ZXJmYWNlO1xuICBjb25zdHJ1Y3RvcihmaWxlOiBTb3VyY2UsIG9wdGlvbnM6IGFueSA9IHt9KSB7XG4gICAgdGhpcy5wYXJzZXIgPSAobmV3IFBhcnNlckZhY3RvcnkoZmlsZSwgb3B0aW9ucykpLmdldFBhcnNlcigpO1xuICB9XG4gIHBhcnNlID0gKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5wYXJzZSgpXG4gIH1cbiAgZ2V0IHRyZWUgKCk6IFRyZWUge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci50cmVlO1xuICB9XG59XG5cbmNvbnN0IHBhdGggPSBgJHtwcm9jZXNzLmN3ZCgpfS9jb3JwdXMvUmVhY3RFbGVtZW50VmFsaWRhdG9yLnR4dGA7XG5jb25zdCByZXN1bHQgPSBuZXcgUGFyc2VyKHtcbiAgbmFtZTogJ2luZGV4LnRzJyxcbiAgcGF0aDogcGF0aCxcbiAgdGV4dDogRlMucmVhZEZpbGVTeW5jKHBhdGgsICd1dGYtOCcpXG59LCB7XG4gIGxhbmd1YWdlOiAndHMnXG59KS5wYXJzZSgpO1xuXG4vLyBjb25zb2xlLmxvZyhyZXN1bHQpO1xuIl19 \ No newline at end of file diff --git a/build/src/ParserFactory.js b/build/src/ParserFactory.js index 77a24c1..3489ae1 100644 --- a/build/src/ParserFactory.js +++ b/build/src/ParserFactory.js @@ -25,4 +25,4 @@ class ParserFactory { } } exports.default = ParserFactory; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFyc2VyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9QYXJzZXJGYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsa0RBQWlEO0FBQ2pELGtEQUFpRDtBQUVqRCxNQUFxQixhQUFhO0lBS2hDLFlBQVksSUFBWSxFQUFFLFVBQWUsRUFBRTtRQUhuQyxZQUFPLEdBQUc7WUFDaEIsUUFBUSxFQUFFLFlBQVk7U0FDdkIsQ0FBQTtRQU1ELGNBQVMsR0FBRyxHQUFvQixFQUFFO1lBQ2hDLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEVBQUU7Z0JBQzNDLEtBQUssSUFBSSxDQUFDO2dCQUNWLEtBQUssWUFBWTtvQkFDZixPQUFPLElBQUksb0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3ZELEtBQUssSUFBSSxDQUFDO2dCQUNWLEtBQUssWUFBWTtvQkFDZixPQUFPLElBQUksb0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3ZEO29CQUNBLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxVQUFVLENBQUMsQ0FBQTtvQkFDckUsTUFBTTthQUNUO1FBQ0gsQ0FBQyxDQUFBO1FBaEJDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUN0QyxDQUFDO0NBZ0JGO0FBeEJELGdDQXdCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTb3VyY2UgZnJvbSBcIi4vaW50ZXJmYWNlcy9Tb3VyY2VcIjtcclxuaW1wb3J0IFBhcnNlckludGVyZmFjZSBmcm9tIFwiLi9pbnRlcmZhY2VzL1BhcnNlckludGVyZmFjZVwiO1xyXG5pbXBvcnQgSmF2YVNjcmlwdFBhcnNlciBmcm9tIFwiLi9sYW5nL2phdmFzY3JpcHRcIjtcclxuaW1wb3J0IFR5cGVTY3JpcHRQYXJzZXIgZnJvbSAnLi9sYW5nL3R5cGVzY3JpcHQnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFyc2VyRmFjdG9yeSB7XHJcbiAgcHJpdmF0ZSBmaWxlOiBTb3VyY2VcclxuICBwcml2YXRlIG9wdGlvbnMgPSB7XHJcbiAgICBsYW5ndWFnZTogJ0phdmFTY3JpcHQnXHJcbiAgfVxyXG4gIGNvbnN0cnVjdG9yKGZpbGU6IFNvdXJjZSwgb3B0aW9uczogYW55ID0ge30pIHtcclxuICAgIHRoaXMuZmlsZSA9IGZpbGU7XHJcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucywgb3B0aW9ucylcclxuICB9XHJcblxyXG4gIGdldFBhcnNlciA9ICgpOiBQYXJzZXJJbnRlcmZhY2UgPT4ge1xyXG4gICAgc3dpdGNoICh0aGlzLm9wdGlvbnMubGFuZ3VhZ2UudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICBjYXNlICdqcyc6XHJcbiAgICAgIGNhc2UgJ2phdmFzY3JpcHQnOlxyXG4gICAgICAgIHJldHVybiBuZXcgSmF2YVNjcmlwdFBhcnNlcih0aGlzLmZpbGUsIHRoaXMub3B0aW9ucyk7XHJcbiAgICAgIGNhc2UgJ3RzJzpcclxuICAgICAgY2FzZSAndHlwZXNjcmlwdCc6XHJcbiAgICAgICAgcmV0dXJuIG5ldyBUeXBlU2NyaXB0UGFyc2VyKHRoaXMuZmlsZSwgdGhpcy5vcHRpb25zKTtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgY29uc29sZS5sb2coYFttci1kb2NdOiBObyBwYXJzZXIgZm9yICR7dGhpcy5vcHRpb25zLmxhbmd1YWdlfSBleGlzdHMuYClcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFyc2VyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9QYXJzZXJGYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsa0RBQWlEO0FBQ2pELGtEQUFpRDtBQUVqRCxNQUFxQixhQUFhO0lBS2hDLFlBQVksSUFBWSxFQUFFLFVBQWUsRUFBRTtRQUhuQyxZQUFPLEdBQUc7WUFDaEIsUUFBUSxFQUFFLFlBQVk7U0FDdkIsQ0FBQTtRQU1ELGNBQVMsR0FBRyxHQUFvQixFQUFFO1lBQ2hDLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEVBQUU7Z0JBQzNDLEtBQUssSUFBSSxDQUFDO2dCQUNWLEtBQUssWUFBWTtvQkFDZixPQUFPLElBQUksb0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3ZELEtBQUssSUFBSSxDQUFDO2dCQUNWLEtBQUssWUFBWTtvQkFDZixPQUFPLElBQUksb0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3ZEO29CQUNBLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxVQUFVLENBQUMsQ0FBQTtvQkFDckUsTUFBTTthQUNUO1FBQ0gsQ0FBQyxDQUFBO1FBaEJDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUN0QyxDQUFDO0NBZ0JGO0FBeEJELGdDQXdCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTb3VyY2UgZnJvbSBcIi4vaW50ZXJmYWNlcy9Tb3VyY2VcIjtcbmltcG9ydCBQYXJzZXJJbnRlcmZhY2UgZnJvbSBcIi4vaW50ZXJmYWNlcy9QYXJzZXJJbnRlcmZhY2VcIjtcbmltcG9ydCBKYXZhU2NyaXB0UGFyc2VyIGZyb20gXCIuL2xhbmcvamF2YXNjcmlwdFwiO1xuaW1wb3J0IFR5cGVTY3JpcHRQYXJzZXIgZnJvbSAnLi9sYW5nL3R5cGVzY3JpcHQnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYXJzZXJGYWN0b3J5IHtcbiAgcHJpdmF0ZSBmaWxlOiBTb3VyY2VcbiAgcHJpdmF0ZSBvcHRpb25zID0ge1xuICAgIGxhbmd1YWdlOiAnSmF2YVNjcmlwdCdcbiAgfVxuICBjb25zdHJ1Y3RvcihmaWxlOiBTb3VyY2UsIG9wdGlvbnM6IGFueSA9IHt9KSB7XG4gICAgdGhpcy5maWxlID0gZmlsZTtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucywgb3B0aW9ucylcbiAgfVxuXG4gIGdldFBhcnNlciA9ICgpOiBQYXJzZXJJbnRlcmZhY2UgPT4ge1xuICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLmxhbmd1YWdlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNhc2UgJ2pzJzpcbiAgICAgIGNhc2UgJ2phdmFzY3JpcHQnOlxuICAgICAgICByZXR1cm4gbmV3IEphdmFTY3JpcHRQYXJzZXIodGhpcy5maWxlLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgY2FzZSAndHMnOlxuICAgICAgY2FzZSAndHlwZXNjcmlwdCc6XG4gICAgICAgIHJldHVybiBuZXcgVHlwZVNjcmlwdFBhcnNlcih0aGlzLmZpbGUsIHRoaXMub3B0aW9ucyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgY29uc29sZS5sb2coYFttci1kb2NdOiBObyBwYXJzZXIgZm9yICR7dGhpcy5vcHRpb25zLmxhbmd1YWdlfSBleGlzdHMuYClcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbn0iXX0= \ No newline at end of file diff --git a/build/src/interfaces/ParserInterface.js b/build/src/interfaces/ParserInterface.js index 0508294..4755ee4 100644 --- a/build/src/interfaces/ParserInterface.js +++ b/build/src/interfaces/ParserInterface.js @@ -6,4 +6,4 @@ class ParserInterface { } } exports.default = ParserInterface; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFyc2VySW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvUGFyc2VySW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0EsbUNBQW1DO0FBRW5DLE1BQThCLGVBQWU7SUFDM0MsWUFBWSxNQUFjLEVBQUUsT0FBWTtJQUV4QyxDQUFDO0NBR0Y7QUFORCxrQ0FNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTb3VyY2UgZnJvbSBcIi4vU291cmNlXCI7XHJcbmltcG9ydCB7IEFTVE5vZGUgfSBmcm9tIFwiLi4vbGFuZy9jb21tb24vYXN0XCI7XHJcbmltcG9ydCB7IFRyZWUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcclxuLy8gaW1wb3J0IElSZXN1bHQgZnJvbSBcIi4vSVJlc3VsdFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgYWJzdHJhY3QgY2xhc3MgUGFyc2VySW50ZXJmYWNlIHtcclxuICBjb25zdHJ1Y3Rvcihzb3VyY2U6IFNvdXJjZSwgb3B0aW9uczogYW55KSB7XHJcblxyXG4gIH1cclxuICBhYnN0cmFjdCBwYXJzZSgpOiBBU1ROb2RlW11cclxuICBhYnN0cmFjdCBnZXQgdHJlZSgpOiBUcmVlXHJcbn0iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFyc2VySW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvUGFyc2VySW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0EsbUNBQW1DO0FBRW5DLE1BQThCLGVBQWU7SUFDM0MsWUFBWSxNQUFjLEVBQUUsT0FBWTtJQUV4QyxDQUFDO0NBR0Y7QUFORCxrQ0FNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTb3VyY2UgZnJvbSBcIi4vU291cmNlXCI7XG5pbXBvcnQgeyBBU1ROb2RlIH0gZnJvbSBcIi4uL2xhbmcvY29tbW9uL2FzdFwiO1xuaW1wb3J0IHsgVHJlZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuLy8gaW1wb3J0IElSZXN1bHQgZnJvbSBcIi4vSVJlc3VsdFwiO1xuXG5leHBvcnQgZGVmYXVsdCBhYnN0cmFjdCBjbGFzcyBQYXJzZXJJbnRlcmZhY2Uge1xuICBjb25zdHJ1Y3Rvcihzb3VyY2U6IFNvdXJjZSwgb3B0aW9uczogYW55KSB7XG5cbiAgfVxuICBhYnN0cmFjdCBwYXJzZSgpOiBBU1ROb2RlW11cbiAgYWJzdHJhY3QgZ2V0IHRyZWUoKTogVHJlZVxufSJdfQ== \ No newline at end of file diff --git a/build/src/interfaces/Source.js b/build/src/interfaces/Source.js index 6590b1a..0d8ff4e 100644 --- a/build/src/interfaces/Source.js +++ b/build/src/interfaces/Source.js @@ -1,3 +1,3 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvU291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBpbnRlcmZhY2UgU291cmNlIHtcclxuICBuYW1lOiBzdHJpbmcsXHJcbiAgcGF0aDogc3RyaW5nLFxyXG4gIHRleHQ6IHN0cmluZ1xyXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvU291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBpbnRlcmZhY2UgU291cmNlIHtcbiAgbmFtZTogc3RyaW5nLFxuICBwYXRoOiBzdHJpbmcsXG4gIHRleHQ6IHN0cmluZ1xufSJdfQ== \ No newline at end of file diff --git a/build/src/interfaces/TextRange.js b/build/src/interfaces/TextRange.js index 015edef..51ef572 100644 --- a/build/src/interfaces/TextRange.js +++ b/build/src/interfaces/TextRange.js @@ -1,3 +1,3 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGV4dFJhbmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvVGV4dFJhbmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuLyoqXHJcbiAqIEFuIGludGVyZmFjZSB0aGF0IHJlcHJlc2VudHMgYSByYW5nZS5cclxuICogXHJcbiAqIEBpbnRlcmZhY2UgUmFuZ2VcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmFuZ2Uge1xyXG4gIHN0YXJ0OiBudW1iZXIsXHJcbiAgZW5kOiBudW1iZXJcclxufVxyXG5cclxuLyoqXHJcbiAqIEFuIGludGVyZmFjZSB0aGF0IHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uYWwgXHJcbiAqIGFuZCBsb2NhdGlvbmFsIHJhbmdlcyBvZiBhIHNvdXJjZSBjb2RlLlxyXG4gKiBcclxuICogQGludGVyZmFjZSBUZXh0UmFuZ2VcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGludGVyZmFjZSBUZXh0UmFuZ2Uge1xyXG4gIC8qKlxyXG4gICAqIFJlcHJlc2VudHMgYSBjb250ZXh0J3Mgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbi5cclxuICAgKiBAcHJvcGVydHkgcG9zaXRpb246IHtcclxuICAgKiAgc3RhcnQ6IG51bWJlcixcclxuICAgKiAgZW5kOiBudW1iZXJcclxuICAgKiB9XHJcbiAgICovXHJcbiAgcG9zaXRpb246IFJhbmdlXHJcbiAgLyoqXHJcbiAgICogUmVwcmVzZW50cyBhIGNvbnRleHQncyByb3cgYW5kIGNvbHVtbiBsb2NhdGlvbi5cclxuICAgKiBcclxuICAgKiBAbG9jYXRpb246IHtcclxuICAgKiAgcm93OiBSYW5nZSxcclxuICAgKiAgY29sdW1uOiBSYW5nZVxyXG4gICAqIH1cclxuICAgKi9cclxuICBsb2NhdGlvbjoge1xyXG4gICAgcm93OiBSYW5nZSxcclxuICAgIGNvbHVtbjogUmFuZ2VcclxuICB9XHJcbn0iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGV4dFJhbmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvVGV4dFJhbmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogQW4gaW50ZXJmYWNlIHRoYXQgcmVwcmVzZW50cyBhIHJhbmdlLlxuICogXG4gKiBAaW50ZXJmYWNlIFJhbmdlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmFuZ2Uge1xuICBzdGFydDogbnVtYmVyLFxuICBlbmQ6IG51bWJlclxufVxuXG4vKipcbiAqIEFuIGludGVyZmFjZSB0aGF0IHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uYWwgXG4gKiBhbmQgbG9jYXRpb25hbCByYW5nZXMgb2YgYSBzb3VyY2UgY29kZS5cbiAqIFxuICogQGludGVyZmFjZSBUZXh0UmFuZ2VcbiAqL1xuZXhwb3J0IGRlZmF1bHQgaW50ZXJmYWNlIFRleHRSYW5nZSB7XG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGEgY29udGV4dCdzIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb24uXG4gICAqIEBwcm9wZXJ0eSBwb3NpdGlvbjoge1xuICAgKiAgc3RhcnQ6IG51bWJlcixcbiAgICogIGVuZDogbnVtYmVyXG4gICAqIH1cbiAgICovXG4gIHBvc2l0aW9uOiBSYW5nZVxuICAvKipcbiAgICogUmVwcmVzZW50cyBhIGNvbnRleHQncyByb3cgYW5kIGNvbHVtbiBsb2NhdGlvbi5cbiAgICogXG4gICAqIEBsb2NhdGlvbjoge1xuICAgKiAgcm93OiBSYW5nZSxcbiAgICogIGNvbHVtbjogUmFuZ2VcbiAgICogfVxuICAgKi9cbiAgbG9jYXRpb246IHtcbiAgICByb3c6IFJhbmdlLFxuICAgIGNvbHVtbjogUmFuZ2VcbiAgfVxufSJdfQ== \ No newline at end of file diff --git a/build/src/lang/common/ast.d.ts b/build/src/lang/common/ast.d.ts index 36396ce..4fafe1d 100644 --- a/build/src/lang/common/ast.d.ts +++ b/build/src/lang/common/ast.d.ts @@ -32,7 +32,9 @@ export interface ASTNode extends TextRange { documentation: Partial; }; } +export declare function isASTNode(object: object): object is ASTNode; export declare function createASTNode(source: Source, node: SyntaxNode): ASTNode; +export declare function createASTNode(source: Source, node: SyntaxNode, properties: object): any; export declare function createASTNode(source: Source, node: SyntaxNode, children: object[]): ASTNode; export declare function createASTNode(source: Source, node: SyntaxNode, children: object[], properties: object): any; export declare function createASTNode(source: Source, node: SyntaxNode, context: ASTNode, document: boolean): ASTNode; diff --git a/build/src/lang/common/ast.js b/build/src/lang/common/ast.js index 4a07bbd..85ba9da 100644 --- a/build/src/lang/common/ast.js +++ b/build/src/lang/common/ast.js @@ -3,17 +3,27 @@ Object.defineProperty(exports, "__esModule", { value: true }); const text_1 = require("../../utils/text"); const range_1 = require("../../utils/range"); const xdoc_parser_1 = require("xdoc-parser"); +const _ = require("lodash"); +function isASTNode(object) { + return object && 'type' in object && 'text' in object && 'children' in object; +} +exports.isASTNode = isASTNode; function createASTNode(source, node, arg1, arg2) { let context, children = [], document = typeof arg2 === 'boolean' && arg2 === true, properties; - if (Array.isArray(arg1)) - children = arg1; - else + if (_.isPlainObject(arg1) && !isASTNode(arg1)) { + properties = arg1; + } + else if (_.isPlainObject(arg1) && isASTNode(arg1)) { context = arg1; - if (typeof arg2 === 'object') { + } + else if (_.isArray(arg1)) { + children = arg1; + } + if (_.isPlainObject(arg2)) { properties = arg2; } return Object.assign({ type: node.type, text: text_1.text(source, node) }, range_1.default(node), { context, children, comment: document ? xdoc_parser_1.default(source.text).parse() : undefined, properties }); } exports.createASTNode = createASTNode; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xhbmcvY29tbW9uL2FzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUdBLDJDQUF3QztBQUN4Qyw2Q0FBc0M7QUFHdEMsNkNBQStCO0FBcUMvQixTQUFnQixhQUFhLENBQUMsTUFBYyxFQUFFLElBQWdCLEVBQUUsSUFBVSxFQUFFLElBQVU7SUFFcEYsSUFBSSxPQUFPLEVBQUUsUUFBUSxHQUFHLEVBQUUsRUFBRSxRQUFRLEdBQUcsT0FBTyxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUUsVUFBVSxDQUFDO0lBQzlGLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFBRSxRQUFRLEdBQUcsSUFBSSxDQUFDOztRQUNwQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBRXBCLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO1FBQzVCLFVBQVUsR0FBRyxJQUFJLENBQUM7S0FDbkI7SUFFRCx1QkFDRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFDZixJQUFJLEVBQUUsV0FBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFDckIsZUFBSyxDQUFDLElBQUksQ0FBQyxJQUNkLE9BQU87UUFDUCxRQUFRLEVBQ1IsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMscUJBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFDekQsVUFBVSxJQUNYO0FBQ0gsQ0FBQztBQW5CRCxzQ0FtQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEb2N1bWVudGF0aW9uTm9kZSB9IGZyb20gJ3hkb2MtcGFyc2VyL3NyYy9YRG9jQVNUTm9kZSc7XHJcbmltcG9ydCB7IFJlbWFya05vZGUgfSBmcm9tICd4ZG9jLXBhcnNlci9zcmMvWERvY1BhcnNlcic7XHJcbmltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcclxuaW1wb3J0IHsgdGV4dCB9IGZyb20gXCIuLi8uLi91dGlscy90ZXh0XCI7XHJcbmltcG9ydCByYW5nZSBmcm9tIFwiLi4vLi4vdXRpbHMvcmFuZ2VcIjtcclxuaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2VcIjtcclxuaW1wb3J0IFRleHRSYW5nZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9UZXh0UmFuZ2VcIjtcclxuaW1wb3J0IHhkb2MgZnJvbSAneGRvYy1wYXJzZXInO1xyXG5cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQVNUTm9kZSBleHRlbmRzIFRleHRSYW5nZSB7XHJcbiAgLyoqXHJcbiAgICogQHByb3BlcnR5IC0gVGhlIHR5cGUgb2Ygbm9kZS5cclxuICAgKi9cclxuICB0eXBlOiBzdHJpbmcsXHJcbiAgLyoqXHJcbiAgICogQHByb3BlcnR5IC0gVGhlIGNvbnRleHQgc3RyaW5nLlxyXG4gICAqL1xyXG4gIHRleHQ6IHN0cmluZyxcclxuICAvKipcclxuICAgKiBAcHJvcGVydHkgLSBUaGUgbm9kZSdzIGNoaWxkcmVuLlxyXG4gICAqL1xyXG4gIGNoaWxkcmVuOiBBU1ROb2RlW10gfCB1bmRlZmluZWRbXSxcclxuICAvKipcclxuICAgKiBAcHJvcGVydHkgLSBUaGUgY29udGV4dCBub2RlIHRoYXQgYSBjb21tZW50IG5vZGUgcmVmZXJzIHRvLlxyXG4gICAqL1xyXG4gIGNvbnRleHQ6IEFTVE5vZGUsXHJcbiAgLyoqXHJcbiAgICogQHByb3BlcnR5IC0gVGhlIHByb3BlcnRpZXMgdGhhdCBhIEFTVE5vZGUgbWF5IHBvc3Nlc3MuXHJcbiAgICovXHJcbiAgcHJvcGVydGllcz86IG9iamVjdFxyXG4gIC8qKlxyXG4gICAqIEBwcm9wZXJ0eSAtIFRoZSBwYXJzZWQgWERvYyBjb21tZW50LlxyXG4gICAqL1xyXG4gIGNvbW1lbnQ/OiB7XHJcbiAgICBtYXJrZG93bjogUmVtYXJrTm9kZSxcclxuICAgIGRvY3VtZW50YXRpb246IFBhcnRpYWw8RG9jdW1lbnRhdGlvbk5vZGU+XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQVNUTm9kZShzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSk6IEFTVE5vZGVcclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFTVE5vZGUoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUsIGNoaWxkcmVuOiBvYmplY3RbXSk6IEFTVE5vZGVcclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFTVE5vZGUoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUsIGNoaWxkcmVuOiBvYmplY3RbXSwgcHJvcGVydGllczogb2JqZWN0KVxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQVNUTm9kZShzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSwgY29udGV4dDogQVNUTm9kZSwgZG9jdW1lbnQ6IGJvb2xlYW4pOiBBU1ROb2RlIFxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQVNUTm9kZShzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSwgYXJnMT86IGFueSwgYXJnMj86IGFueSk6IEFTVE5vZGUge1xyXG5cclxuICBsZXQgY29udGV4dCwgY2hpbGRyZW4gPSBbXSwgZG9jdW1lbnQgPSB0eXBlb2YgYXJnMiA9PT0gJ2Jvb2xlYW4nICYmIGFyZzIgPT09IHRydWUsIHByb3BlcnRpZXM7XHJcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJnMSkpIGNoaWxkcmVuID0gYXJnMTtcclxuICBlbHNlIGNvbnRleHQgPSBhcmcxO1xyXG5cclxuICBpZiAodHlwZW9mIGFyZzIgPT09ICdvYmplY3QnKSB7XHJcbiAgICBwcm9wZXJ0aWVzID0gYXJnMjtcclxuICB9XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICB0eXBlOiBub2RlLnR5cGUsXHJcbiAgICB0ZXh0OiB0ZXh0KHNvdXJjZSwgbm9kZSksXHJcbiAgICAuLi5yYW5nZShub2RlKSxcclxuICAgIGNvbnRleHQsXHJcbiAgICBjaGlsZHJlbixcclxuICAgIGNvbW1lbnQ6IGRvY3VtZW50ID8geGRvYyhzb3VyY2UudGV4dCkucGFyc2UoKSA6IHVuZGVmaW5lZCxcclxuICAgIHByb3BlcnRpZXMsXHJcbiAgfVxyXG59XHJcbiJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xhbmcvY29tbW9uL2FzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUdBLDJDQUF3QztBQUN4Qyw2Q0FBc0M7QUFHdEMsNkNBQStCO0FBQy9CLDRCQUEyQjtBQWlDM0IsU0FBZ0IsU0FBUyxDQUFDLE1BQWM7SUFDdEMsT0FBTyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLFVBQVUsSUFBSSxNQUFNLENBQUM7QUFDaEYsQ0FBQztBQUZELDhCQUVDO0FBT0QsU0FBZ0IsYUFBYSxDQUFDLE1BQWMsRUFBRSxJQUFnQixFQUFFLElBQVUsRUFBRSxJQUFVO0lBRXBGLElBQUksT0FBTyxFQUFFLFFBQVEsR0FBRyxFQUFFLEVBQUUsUUFBUSxHQUFHLE9BQU8sSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFLFVBQVUsQ0FBQztJQUU5RixJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDN0MsVUFBVSxHQUFHLElBQUksQ0FBQztLQUNuQjtTQUFNLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDbkQsT0FBTyxHQUFHLElBQUksQ0FBQztLQUNoQjtTQUFNLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUMxQixRQUFRLEdBQUcsSUFBSSxDQUFDO0tBQ2pCO0lBRUQsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3pCLFVBQVUsR0FBRyxJQUFJLENBQUM7S0FDbkI7SUFFRCx1QkFDRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFDZixJQUFJLEVBQUUsV0FBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFDckIsZUFBSyxDQUFDLElBQUksQ0FBQyxJQUNkLE9BQU87UUFDUCxRQUFRLEVBQ1IsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMscUJBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFDekQsVUFBVSxJQUNYO0FBQ0gsQ0FBQztBQXpCRCxzQ0F5QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEb2N1bWVudGF0aW9uTm9kZSB9IGZyb20gJ3hkb2MtcGFyc2VyL3NyYy9YRG9jQVNUTm9kZSc7XG5pbXBvcnQgeyBSZW1hcmtOb2RlIH0gZnJvbSAneGRvYy1wYXJzZXIvc3JjL1hEb2NQYXJzZXInO1xuaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuaW1wb3J0IHsgdGV4dCB9IGZyb20gXCIuLi8uLi91dGlscy90ZXh0XCI7XG5pbXBvcnQgcmFuZ2UgZnJvbSBcIi4uLy4uL3V0aWxzL3JhbmdlXCI7XG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuaW1wb3J0IFRleHRSYW5nZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9UZXh0UmFuZ2VcIjtcbmltcG9ydCB4ZG9jIGZyb20gJ3hkb2MtcGFyc2VyJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJ1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQVNUTm9kZSBleHRlbmRzIFRleHRSYW5nZSB7XG4gIC8qKlxuICAgKiBAcHJvcGVydHkgLSBUaGUgdHlwZSBvZiBub2RlLlxuICAgKi9cbiAgdHlwZTogc3RyaW5nLFxuICAvKipcbiAgICogQHByb3BlcnR5IC0gVGhlIGNvbnRleHQgc3RyaW5nLlxuICAgKi9cbiAgdGV4dDogc3RyaW5nLFxuICAvKipcbiAgICogQHByb3BlcnR5IC0gVGhlIG5vZGUncyBjaGlsZHJlbi5cbiAgICovXG4gIGNoaWxkcmVuOiBBU1ROb2RlW10gfCB1bmRlZmluZWRbXSxcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSAtIFRoZSBjb250ZXh0IG5vZGUgdGhhdCBhIGNvbW1lbnQgbm9kZSByZWZlcnMgdG8uXG4gICAqL1xuICBjb250ZXh0OiBBU1ROb2RlLFxuICAvKipcbiAgICogQHByb3BlcnR5IC0gVGhlIHByb3BlcnRpZXMgdGhhdCBhIEFTVE5vZGUgbWF5IHBvc3Nlc3MuXG4gICAqL1xuICBwcm9wZXJ0aWVzPzogb2JqZWN0XG4gIC8qKlxuICAgKiBAcHJvcGVydHkgLSBUaGUgcGFyc2VkIFhEb2MgY29tbWVudC5cbiAgICovXG4gIGNvbW1lbnQ/OiB7XG4gICAgbWFya2Rvd246IFJlbWFya05vZGUsXG4gICAgZG9jdW1lbnRhdGlvbjogUGFydGlhbDxEb2N1bWVudGF0aW9uTm9kZT5cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNBU1ROb2RlKG9iamVjdDogb2JqZWN0KTogb2JqZWN0IGlzIEFTVE5vZGUge1xuICByZXR1cm4gb2JqZWN0ICYmICd0eXBlJyBpbiBvYmplY3QgJiYgJ3RleHQnIGluIG9iamVjdCAmJiAnY2hpbGRyZW4nIGluIG9iamVjdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFTVE5vZGUoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQVNUTm9kZShzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllczogb2JqZWN0KVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFTVE5vZGUoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUsIGNoaWxkcmVuOiBvYmplY3RbXSk6IEFTVE5vZGVcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBU1ROb2RlKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlLCBjaGlsZHJlbjogb2JqZWN0W10sIHByb3BlcnRpZXM6IG9iamVjdClcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBU1ROb2RlKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlLCBjb250ZXh0OiBBU1ROb2RlLCBkb2N1bWVudDogYm9vbGVhbik6IEFTVE5vZGVcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBU1ROb2RlKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlLCBhcmcxPzogYW55LCBhcmcyPzogYW55KTogQVNUTm9kZSB7XG5cbiAgbGV0IGNvbnRleHQsIGNoaWxkcmVuID0gW10sIGRvY3VtZW50ID0gdHlwZW9mIGFyZzIgPT09ICdib29sZWFuJyAmJiBhcmcyID09PSB0cnVlLCBwcm9wZXJ0aWVzO1xuXG4gIGlmIChfLmlzUGxhaW5PYmplY3QoYXJnMSkgJiYgIWlzQVNUTm9kZShhcmcxKSkge1xuICAgIHByb3BlcnRpZXMgPSBhcmcxO1xuICB9IGVsc2UgaWYgKF8uaXNQbGFpbk9iamVjdChhcmcxKSAmJiBpc0FTVE5vZGUoYXJnMSkpIHtcbiAgICBjb250ZXh0ID0gYXJnMTtcbiAgfSBlbHNlIGlmIChfLmlzQXJyYXkoYXJnMSkpIHtcbiAgICBjaGlsZHJlbiA9IGFyZzE7XG4gIH1cblxuICBpZiAoXy5pc1BsYWluT2JqZWN0KGFyZzIpKSB7XG4gICAgcHJvcGVydGllcyA9IGFyZzI7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6IG5vZGUudHlwZSxcbiAgICB0ZXh0OiB0ZXh0KHNvdXJjZSwgbm9kZSksXG4gICAgLi4ucmFuZ2Uobm9kZSksXG4gICAgY29udGV4dCxcbiAgICBjaGlsZHJlbixcbiAgICBjb21tZW50OiBkb2N1bWVudCA/IHhkb2Moc291cmNlLnRleHQpLnBhcnNlKCkgOiB1bmRlZmluZWQsXG4gICAgcHJvcGVydGllcyxcbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/build/src/lang/common/emca.js b/build/src/lang/common/emca.js index b13ad40..6291930 100644 --- a/build/src/lang/common/emca.js +++ b/build/src/lang/common/emca.js @@ -1,3 +1,3 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1jYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2NvbW1vbi9lbWNhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIE5vZGVQcm9wZXJ0aWVzIHtcclxuICBleHBvcnRzOiBQYXJ0aWFsPE5vZGVFeHBvcnRzPlxyXG4gIGluaGVyaXRhbmNlOiBQYXJ0aWFsPE5vZGVJbmhlcml0YW5jZT5cclxuICBuYW1lc3BhY2U6IGJvb2xlYW4sXHJcbiAgbW9kdWxlOiBib29sZWFuXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTm9kZUV4cG9ydHMge1xyXG4gIGV4cG9ydDogYm9vbGVhbixcclxuICBkZWZhdWx0OiBib29sZWFuXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTm9kZUluaGVyaXRhbmNlIHtcclxuICBleHRlbmRzOiBib29sZWFuLFxyXG4gIGltcGxlbWVudHM6IGJvb2xlYW5cclxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1jYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2NvbW1vbi9lbWNhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIE5vZGVQcm9wZXJ0aWVzIHtcbiAgZXhwb3J0czogUGFydGlhbDxOb2RlRXhwb3J0cz5cbiAgaW5oZXJpdGFuY2U6IFBhcnRpYWw8Tm9kZUluaGVyaXRhbmNlPlxuICBuYW1lc3BhY2U6IGJvb2xlYW4sXG4gIG1vZHVsZTogYm9vbGVhblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vZGVFeHBvcnRzIHtcbiAgZXhwb3J0OiBib29sZWFuLFxuICBkZWZhdWx0OiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9kZUluaGVyaXRhbmNlIHtcbiAgZXh0ZW5kczogYm9vbGVhbixcbiAgaW1wbGVtZW50czogYm9vbGVhblxufSJdfQ== \ No newline at end of file diff --git a/build/src/lang/common/node.js b/build/src/lang/common/node.js index 9cb0e52..b90d3ee 100644 --- a/build/src/lang/common/node.js +++ b/build/src/lang/common/node.js @@ -9,4 +9,4 @@ class Node { } } exports.Node = Node; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2NvbW1vbi9ub2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBYUEsTUFBYSxJQUFJO0lBQ2YsWUFBbUIsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN6QyxVQUFLLEdBQUcsQ0FBQyxPQUFvQixFQUFRLEVBQUU7WUFDckMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFBO0lBSDRDLENBQUM7Q0FJL0M7QUFMRCxvQkFLQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFTVE5vZGUgfSBmcm9tIFwiLi9hc3RcIjtcclxuaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUcmVlU2l0dGVyTm9kZSB7XHJcbiAgdmlzaXQodmlzaXRvcjogTm9kZVZpc2l0b3IpOiB2b2lkXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTm9kZVZpc2l0b3Ige1xyXG4gIGdldEFTVCgpOiBBU1ROb2RlW11cclxuICB2aXNpdE5vZGUobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IG9iamVjdCk6IEFTVE5vZGVcclxuICB2aXNpdENoaWxkcmVuKG5vZGVzOiBTeW50YXhOb2RlW10sIHByb3BlcnRpZXM/OiBvYmplY3QpOiBBU1ROb2RlW11cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE5vZGUgaW1wbGVtZW50cyBUcmVlU2l0dGVyTm9kZSB7XHJcbiAgY29uc3RydWN0b3IocHVibGljIHN5bnRheE5vZGU6IFN5bnRheE5vZGUpIHsgfVxyXG4gIHZpc2l0ID0gKHZpc2l0b3I6IE5vZGVWaXNpdG9yKTogdm9pZCA9PiB7XHJcbiAgICB2aXNpdG9yLnZpc2l0Tm9kZSh0aGlzLnN5bnRheE5vZGUpO1xyXG4gIH1cclxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2NvbW1vbi9ub2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBYUEsTUFBYSxJQUFJO0lBQ2YsWUFBbUIsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN6QyxVQUFLLEdBQUcsQ0FBQyxPQUFvQixFQUFRLEVBQUU7WUFDckMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFBO0lBSDRDLENBQUM7Q0FJL0M7QUFMRCxvQkFLQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFTVE5vZGUgfSBmcm9tIFwiLi9hc3RcIjtcbmltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBUcmVlU2l0dGVyTm9kZSB7XG4gIHZpc2l0KHZpc2l0b3I6IE5vZGVWaXNpdG9yKTogdm9pZFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vZGVWaXNpdG9yIHtcbiAgZ2V0QVNUKCk6IEFTVE5vZGVbXVxuICB2aXNpdE5vZGUobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IG9iamVjdCk6IEFTVE5vZGVcbiAgdmlzaXRDaGlsZHJlbihub2RlczogU3ludGF4Tm9kZVtdLCBwcm9wZXJ0aWVzPzogb2JqZWN0KTogQVNUTm9kZVtdXG59XG5cbmV4cG9ydCBjbGFzcyBOb2RlIGltcGxlbWVudHMgVHJlZVNpdHRlck5vZGUge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgc3ludGF4Tm9kZTogU3ludGF4Tm9kZSkgeyB9XG4gIHZpc2l0ID0gKHZpc2l0b3I6IE5vZGVWaXNpdG9yKTogdm9pZCA9PiB7XG4gICAgdmlzaXRvci52aXNpdE5vZGUodGhpcy5zeW50YXhOb2RlKTtcbiAgfVxufSJdfQ== \ No newline at end of file diff --git a/build/src/lang/javascript/index.js b/build/src/lang/javascript/index.js index 633a090..eadd75b 100644 --- a/build/src/lang/javascript/index.js +++ b/build/src/lang/javascript/index.js @@ -25,7 +25,7 @@ class JavaScriptParser { } parse() { const visitor = new visitor_1.JavaScriptVisitor(this.source); - const root = walk_1.default(this.tree.rootNode); + const root = walk_1.default(this.tree_.rootNode); // console.time('visit') root.visit(visitor); // console.timeEnd('visit') @@ -36,4 +36,4 @@ class JavaScriptParser { } } exports.default = JavaScriptParser; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy9qYXZhc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNDO0FBQ3RDLHFEQUFxRDtBQUlyRCx1Q0FBOEM7QUFDOUMsMkNBQW9DO0FBRXBDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFxQixnQkFBZ0I7SUFNbkMsWUFBWSxNQUFjLEVBQUUsT0FBWTtRQUN0QyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFDRCxLQUFLO1FBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSwyQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkQsTUFBTSxJQUFJLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEMsd0JBQXdCO1FBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDbkIsMkJBQTJCO1FBQzNCLE9BQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFDRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztDQUNGO0FBeEJELG1DQXdCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFBhcnNlciBmcm9tICd0cmVlLXNpdHRlcic7XHJcbmltcG9ydCAqIGFzIEphdmFTY3JpcHQgZnJvbSAndHJlZS1zaXR0ZXItamF2YXNjcmlwdCc7XHJcbmltcG9ydCBQYXJzZXJJbnRlcmZhY2UgZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9QYXJzZXJJbnRlcmZhY2UnO1xyXG5pbXBvcnQgU291cmNlIGZyb20gJy4uLy4uL2ludGVyZmFjZXMvU291cmNlJztcclxuaW1wb3J0IHsgQVNUTm9kZSB9IGZyb20gJy4uL2NvbW1vbi9hc3QnO1xyXG5pbXBvcnQgeyBKYXZhU2NyaXB0VmlzaXRvciB9IGZyb20gJy4vdmlzaXRvcic7XHJcbmltcG9ydCB3YWxrIGZyb20gJy4uLy4uL3V0aWxzL3dhbGsnO1xyXG5cclxuLyoqXHJcbiAqIEEgY2xhc3MgdGhhdCBwYXJzZXMgSmF2YVNjcmlwdCBjb21tZW50cy5cclxuICogXHJcbiAqICMgQVBJXHJcbiAqIFxyXG4gKiBgYGBcclxuICogQGNsYXNzIEphdmFTY3JpcHRQYXJzZXJcclxuICogQGltcGxlbWVudHMgSVBhcnNlclxyXG4gKiBAZXhwb3J0IGRlZmF1bHRcclxuICogYGBgXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBKYXZhU2NyaXB0UGFyc2VyIGltcGxlbWVudHMgUGFyc2VySW50ZXJmYWNlIHtcclxuICBcclxuICBwcml2YXRlIHNvdXJjZTogU291cmNlO1xyXG4gIHByaXZhdGUgb3B0aW9uczogYW55O1xyXG4gIHByaXZhdGUgcGFyc2VyOiBQYXJzZXI7XHJcbiAgcHJpdmF0ZSB0cmVlXzogUGFyc2VyLlRyZWU7XHJcbiAgY29uc3RydWN0b3Ioc291cmNlOiBTb3VyY2UsIG9wdGlvbnM6IGFueSkge1xyXG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XHJcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucyA9IHt9LCBvcHRpb25zIHx8IHt9KTtcclxuICAgIHRoaXMucGFyc2VyID0gbmV3IFBhcnNlcigpO1xyXG4gICAgdGhpcy5wYXJzZXIuc2V0TGFuZ3VhZ2UoSmF2YVNjcmlwdCk7XHJcbiAgICB0aGlzLnRyZWVfID0gdGhpcy5wYXJzZXIucGFyc2UodGhpcy5zb3VyY2UudGV4dCk7XHJcbiAgfVxyXG4gIHBhcnNlKCk6IEFTVE5vZGVbXSB7XHJcbiAgICBjb25zdCB2aXNpdG9yID0gbmV3IEphdmFTY3JpcHRWaXNpdG9yKHRoaXMuc291cmNlKTtcclxuICAgIGNvbnN0IHJvb3QgPSB3YWxrKHRoaXMudHJlZS5yb290Tm9kZSk7XHJcbiAgICAvLyBjb25zb2xlLnRpbWUoJ3Zpc2l0JylcclxuICAgIHJvb3QudmlzaXQodmlzaXRvcilcclxuICAgIC8vIGNvbnNvbGUudGltZUVuZCgndmlzaXQnKVxyXG4gICAgcmV0dXJuIHZpc2l0b3IuZ2V0QVNUKCk7XHJcbiAgfVxyXG4gIGdldCB0cmVlICgpOiBQYXJzZXIuVHJlZSB7XHJcbiAgICByZXR1cm4gdGhpcy50cmVlXztcclxuICB9XHJcbn0iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy9qYXZhc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNDO0FBQ3RDLHFEQUFxRDtBQUlyRCx1Q0FBOEM7QUFDOUMsMkNBQW9DO0FBRXBDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFxQixnQkFBZ0I7SUFNbkMsWUFBWSxNQUFjLEVBQUUsT0FBWTtRQUN0QyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFDRCxLQUFLO1FBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSwyQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkQsTUFBTSxJQUFJLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsd0JBQXdCO1FBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDbkIsMkJBQTJCO1FBQzNCLE9BQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFDRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztDQUNGO0FBeEJELG1DQXdCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFBhcnNlciBmcm9tICd0cmVlLXNpdHRlcic7XG5pbXBvcnQgKiBhcyBKYXZhU2NyaXB0IGZyb20gJ3RyZWUtc2l0dGVyLWphdmFzY3JpcHQnO1xuaW1wb3J0IFBhcnNlckludGVyZmFjZSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL1BhcnNlckludGVyZmFjZSc7XG5pbXBvcnQgU291cmNlIGZyb20gJy4uLy4uL2ludGVyZmFjZXMvU291cmNlJztcbmltcG9ydCB7IEFTVE5vZGUgfSBmcm9tICcuLi9jb21tb24vYXN0JztcbmltcG9ydCB7IEphdmFTY3JpcHRWaXNpdG9yIH0gZnJvbSAnLi92aXNpdG9yJztcbmltcG9ydCB3YWxrIGZyb20gJy4uLy4uL3V0aWxzL3dhbGsnO1xuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCBwYXJzZXMgSmF2YVNjcmlwdCBjb21tZW50cy5cbiAqIFxuICogIyBBUElcbiAqIFxuICogYGBgXG4gKiBAY2xhc3MgSmF2YVNjcmlwdFBhcnNlclxuICogQGltcGxlbWVudHMgSVBhcnNlclxuICogQGV4cG9ydCBkZWZhdWx0XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSmF2YVNjcmlwdFBhcnNlciBpbXBsZW1lbnRzIFBhcnNlckludGVyZmFjZSB7XG4gIFxuICBwcml2YXRlIHNvdXJjZTogU291cmNlO1xuICBwcml2YXRlIG9wdGlvbnM6IGFueTtcbiAgcHJpdmF0ZSBwYXJzZXI6IFBhcnNlcjtcbiAgcHJpdmF0ZSB0cmVlXzogUGFyc2VyLlRyZWU7XG4gIGNvbnN0cnVjdG9yKHNvdXJjZTogU291cmNlLCBvcHRpb25zOiBhbnkpIHtcbiAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucyA9IHt9LCBvcHRpb25zIHx8IHt9KTtcbiAgICB0aGlzLnBhcnNlciA9IG5ldyBQYXJzZXIoKTtcbiAgICB0aGlzLnBhcnNlci5zZXRMYW5ndWFnZShKYXZhU2NyaXB0KTtcbiAgICB0aGlzLnRyZWVfID0gdGhpcy5wYXJzZXIucGFyc2UodGhpcy5zb3VyY2UudGV4dCk7XG4gIH1cbiAgcGFyc2UoKTogQVNUTm9kZVtdIHtcbiAgICBjb25zdCB2aXNpdG9yID0gbmV3IEphdmFTY3JpcHRWaXNpdG9yKHRoaXMuc291cmNlKTtcbiAgICBjb25zdCByb290ID0gd2Fsayh0aGlzLnRyZWVfLnJvb3ROb2RlKTtcbiAgICAvLyBjb25zb2xlLnRpbWUoJ3Zpc2l0JylcbiAgICByb290LnZpc2l0KHZpc2l0b3IpXG4gICAgLy8gY29uc29sZS50aW1lRW5kKCd2aXNpdCcpXG4gICAgcmV0dXJuIHZpc2l0b3IuZ2V0QVNUKCk7XG4gIH1cbiAgZ2V0IHRyZWUgKCk6IFBhcnNlci5UcmVlIHtcbiAgICByZXR1cm4gdGhpcy50cmVlXztcbiAgfVxufSJdfQ== \ No newline at end of file diff --git a/build/src/lang/javascript/visitor.js b/build/src/lang/javascript/visitor.js index ebecb2a..d7b7de4 100644 --- a/build/src/lang/javascript/visitor.js +++ b/build/src/lang/javascript/visitor.js @@ -26,24 +26,24 @@ class JavaScriptVisitor { break; default: /* Match other non-terminals */ - if (match_1.default(node, 'constraint', 'formal_parameters', 'required_parameter', 'rest_parameter', 'type_identifier', 'type_parameters', 'type_parameter', 'type_annotation', 'object_type', 'predefined_type', 'parenthesized_type', 'literal_type', 'intersection_type', 'union_type', 'class_body', 'extends_clause', 'unary_expression', 'binary_expression', 'statement_block', 'return_statement', 'export_statement', 'expression_statement', + if (match_1.default(node, 'constraint', 'formal_parameters', 'required_parameter', 'rest_parameter', 'type_identifier', 'type_parameters', 'type_parameter', 'type_annotation', 'object_type', 'predefined_type', 'parenthesized_type', 'literal_type', 'intersection_type', 'union_type', 'class_body', 'extends_clause', 'unary_expression', 'binary_expression', 'parenthesized_expression', 'member_expression', 'statement_block', 'return_statement', 'export_statement', 'expression_statement', // A call_signature can also be a non-contextual node - 'call_signature', 'internal_module')) { + 'call_signature', 'internal_module', 'if_statement')) { return this.visitNonTerminal(node, properties); } /* Match terminals */ - if (match_1.default(node, 'identifier', 'extends', 'property_identifier', 'accessibility_modifier', 'string', 'void', 'boolean', 'null', 'undefined', 'number', 'return', 'get', 'function', 'namespace')) { + if (match_1.default(node, 'identifier', 'extends', 'property_identifier', 'accessibility_modifier', 'null', 'undefined', 'return', 'get', 'function', 'namespace', 'if', 'const')) { return this.visitTerminal(node); } log_1.default.report(this.source, node, log_1.ErrorType.NodeTypeNotYetSupported); - break; + return; } }; this.visitChildren = (nodes) => { let children = []; for (let i = 0; i < nodes.length; i++) { const node = nodes[i]; - if (!node.type.match(/[<>(){},:;\[\]&|=\+\-\*\/]/) && node.type !== '...') { + if (!node.type.match(/[<>(){},:;\[\]&|=\+\-\*\/!.]/) && node.type !== '...') { const child = this.visitNode(node); if (child) children.push(child); @@ -78,8 +78,8 @@ class JavaScriptVisitor { for (let i = 0; i < exports.length; i++) { const export_ = exports[i]; const context = comment.context; - for (let j = 0; j < context.children.length; j++) { - if (context.children[i].type === export_.type) { + for (let j = 0; context && j < context.children.length; j++) { + if (context.children[i] && context.children[i].type === export_.type) { matched[getStartLocation(export_)] = true; comment.context.properties = Object.assign(comment.context.properties || {}, export_.properties); } @@ -120,10 +120,11 @@ class JavaScriptVisitor { case 'property_signature': case 'public_field_definition': case 'method_definition': + case 'lexical_declaration': return this.visitNonTerminal(node, properties); default: log_1.default.report(this.source, node, log_1.ErrorType.NodeTypeNotYetSupported); - break; + return; } }; /* Statements */ @@ -145,7 +146,11 @@ class JavaScriptVisitor { if (match_1.default(child, 'internal_module')) { return this.visitInternalModule(child, properties); } - return this.visitNonTerminal(node); + if (match_1.default(child, 'function')) { + if (properties) + return this.visitContext(child); + } + return this.visitNonTerminal(child); }; /* Modules */ this.visitInternalModule = (node, properties) => { @@ -201,6 +206,12 @@ class JavaScriptVisitor { if (match_1.default(node, 'expression_statement')) { return this.visitExpressionStatement(node, properties); } + // Handle special cases where a function has a statement_block + if (match_1.default(node, 'function')) { + _.remove(children, child => match_1.default(child, 'statement_block')); + console.log(children); + return ast_1.createASTNode(this.source, node, this.visitChildren(children), properties); + } return ast_1.createASTNode(this.source, node, this.visitChildren(children), properties); }; /* Terminals */ @@ -268,4 +279,4 @@ class JavaScriptVisitor { } } exports.JavaScriptVisitor = JavaScriptVisitor; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2phdmFzY3JpcHQvdmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHVDQUF1RDtBQUN2RCxpREFBdUQ7QUFHdkQsaURBQThDO0FBRTlDLDRCQUE0QjtBQUM1Qix5Q0FBaUQ7QUFDakQsNkNBQXNDO0FBR3RDOztHQUVHO0FBQ0gsTUFBYSxpQkFBaUI7SUFHNUIsWUFBWSxNQUFjO1FBRmxCLFFBQUcsR0FBYyxFQUFFLENBQUE7UUFxRTNCLGVBQWU7UUFFZixjQUFTLEdBQUcsQ0FDVixJQUFnQixFQUNoQixVQUFvQyxFQUNwQyxFQUFFO1lBQ0YsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNqQixLQUFLLFNBQVM7b0JBQ1osSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNuQyxNQUFNO2dCQUNSLEtBQUssU0FBUztvQkFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pDLEtBQUssU0FBUyxDQUFDO2dCQUNmLEtBQUssT0FBTztvQkFDVixhQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO29CQUM5RCxNQUFNO2dCQUNSO29CQUVFLCtCQUErQjtvQkFFL0IsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUNaLFlBQVksRUFDWixtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFDM0QsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQ3pFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQ3RFLG1CQUFtQixFQUFFLFlBQVksRUFDakMsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixrQkFBa0Is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LENBQUMsR0FBRyxDQUFDO0lBQ2xCLENBQUM7Q0ErUEY7QUFuVUQsOENBbVVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlQVNUTm9kZSwgQVNUTm9kZSB9IGZyb20gXCIuLi9jb21tb24vYXN0XCI7XHJcbmltcG9ydCB7IGlzSmF2YURvY0NvbW1lbnQgfSBmcm9tIFwiLi4vLi4vdXRpbHMvY29tbWVudFwiO1xyXG5pbXBvcnQgeyBOb2RlUHJvcGVydGllcywgTm9kZUluaGVyaXRhbmNlIH0gZnJvbSBcIi4uL2NvbW1vbi9lbWNhXCI7XHJcbmltcG9ydCB7IE5vZGVWaXNpdG9yIH0gZnJvbSBcIi4uL2NvbW1vbi9ub2RlXCI7XHJcbmltcG9ydCB7IHNpYmxpbmcgfSBmcm9tIFwiLi4vLi4vdXRpbHMvc2libGluZ1wiO1xyXG5pbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XHJcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcclxuaW1wb3J0IGxvZywgeyBFcnJvclR5cGUgfSBmcm9tIFwiLi4vLi4vdXRpbHMvbG9nXCI7XHJcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi4vLi4vdXRpbHMvbWF0Y2hcIjtcclxuaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2VcIjtcclxuXHJcbi8qKlxyXG4gKiBBIGNsYXNzIHRoYXQgdmlzaXRzIEFTVE5vZGVzIGZyb20gYSBUeXBlU2NyaXB0IHRyZWUuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgSmF2YVNjcmlwdFZpc2l0b3IgaW1wbGVtZW50cyBOb2RlVmlzaXRvciB7XHJcbiAgcHJpdmF0ZSBhc3Q6IEFTVE5vZGVbXSA9IFtdXHJcbiAgcHJpdmF0ZSBzb3VyY2U6IFNvdXJjZVxyXG4gIGNvbnN0cnVjdG9yKHNvdXJjZTogU291cmNlKSB7XHJcbiAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgd2hldGhlciBhIG5vZGUgaGFzIGluaGVyaXRhbmNlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoYXNJbmhlcml0YW5jZShub2RlOiBTeW50YXhOb2RlKSB7XHJcbiAgICBsZXQgaW5oZXJpdHMgPSBmYWxzZTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XHJcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ2V4dGVuZHMnLCAnaW1wbGVtZW50cycpKSB7XHJcbiAgICAgICAgaW5oZXJpdHMgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaW5oZXJpdHNcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBub2RlJ3MgaW5oZXJpdGFuY2UgdHlwZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0SW5oZXJpdGFuY2VUeXBlKG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XHJcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ2V4dGVuZHMnKSkge1xyXG4gICAgICAgIHJldHVybiAnZXh0ZW5kcyc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ2ltcGxlbWVudHMnKSkge1xyXG4gICAgICAgIHJldHVybiAnaW1wbGVtZW50cyc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgd2hldGhlciBhbiBleHBvcnQgaXMgZGVmYXVsdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgaGFzRGVmYXVsdEV4cG9ydChub2RlOiBTeW50YXhOb2RlKTogYm9vbGVhbiB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xyXG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdkZWZhdWx0JykpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBvbmx5IHRoZSBjb21tZW50cyBmcm9tIGEgbm9kZSdzIGNoaWxkcmVuLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZmlsdGVyVHlwZShub2RlOiBTeW50YXhOb2RlLCB0eXBlOiBzdHJpbmcpOiBTeW50YXhOb2RlW10ge1xyXG4gICAgLy8gY29uc29sZS50aW1lKCdmaWx0ZXJUeXBlJylcclxuICAgIGxldCBjaGlsZHJlbjogU3ludGF4Tm9kZVtdID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xyXG4gICAgICBpZiAobWF0Y2goY2hpbGQsIHR5cGUpKSB7XHJcbiAgICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGNvbnNvbGUudGltZUVuZCgnZmlsdGVyVHlwZScpXHJcbiAgICByZXR1cm4gY2hpbGRyZW47XHJcbiAgfVxyXG5cclxuICBnZXRBU1QoKTogQVNUTm9kZVtdIHtcclxuICAgIHJldHVybiB0aGlzLmFzdDtcclxuICB9XHJcblxyXG4gIC8qIFZpc2l0b3JzICAqL1xyXG5cclxuICB2aXNpdE5vZGUgPSAoXHJcbiAgICBub2RlOiBTeW50YXhOb2RlLFxyXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+XHJcbiAgKSA9PiB7XHJcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xyXG4gICAgICBjYXNlICdwcm9ncmFtJzpcclxuICAgICAgICB0aGlzLmFzdCA9IHRoaXMudmlzaXRQcm9ncmFtKG5vZGUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdjb21tZW50JzpcclxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdENvbW1lbnQobm9kZSk7XHJcbiAgICAgIGNhc2UgJ01JU1NJTkcnOlxyXG4gICAgICBjYXNlICdFUlJPUic6XHJcbiAgICAgICAgbG9nLnJlcG9ydCh0aGlzLnNvdXJjZSwgbm9kZSwgRXJyb3JUeXBlLlRyZWVTaXR0ZXJQYXJzZUVycm9yKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuXHJcbiAgICAgICAgLyogTWF0Y2ggb3RoZXIgbm9uLXRlcm1pbmFscyAqL1xyXG5cclxuICAgICAgICBpZiAobWF0Y2gobm9kZSxcclxuICAgICAgICAgICdjb25zdHJhaW50JyxcclxuICAgICAgICAgICdmb3JtYWxfcGFyYW1ldGVycycsICdyZXF1aXJlZF9wYXJhbWV0ZXInLCAncmVzdF9wYXJhbWV0ZXInLFxyXG4gICAgICAgICAgJ3R5cGVfaWRlbnRpZmllcicsICd0eXBlX3BhcmFtZXRlcnMnLCAndHlwZV9wYXJhbWV0ZXInLCAndHlwZV9hbm5vdGF0aW9uJyxcclxuICAgICAgICAgICdvYmplY3RfdHlwZScsICdwcmVkZWZpbmVkX3R5cGUnLCAncGFyZW50aGVzaXplZF90eXBlJywgJ2xpdGVyYWxfdHlwZScsXHJcbiAgICAgICAgICAnaW50ZXJzZWN0aW9uX3R5cGUnLCAndW5pb25fdHlwZScsXHJcbiAgICAgICAgICAnY2xhc3NfYm9keScsXHJcbiAgICAgICAgICAnZXh0ZW5kc19jbGF1c2UnLFxyXG4gICAgICAgICAgJ3VuYXJ5X2V4cHJlc3Npb24nLCAnYmluYXJ5X2V4cHJlc3Npb24nLFxyXG4gICAgICAgICAgJ3N0YXRlbWVudF9ibG9jaycsICdyZXR1cm5fc3RhdGVtZW50JywgJ2V4cG9ydF9zdGF0ZW1lbnQnLCAnZXhwcmVzc2lvbl9zdGF0ZW1lbnQnLFxyXG4gICAgICAgICAgLy8gQSBjYWxsX3NpZ25hdHVyZSBjYW4gYWxzbyBiZSBhIG5vbi1jb250ZXh0dWFsIG5vZGVcclxuICAgICAgICAgICdjYWxsX3NpZ25hdHVyZScsXHJcbiAgICAgICAgICAnaW50ZXJuYWxfbW9kdWxlJ1xyXG4gICAgICAgICkpIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLnZpc2l0Tm9uVGVybWluYWwobm9kZSwgcHJvcGVydGllcylcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIE1hdGNoIHRlcm1pbmFscyAqL1xyXG4gICAgICAgIGlmIChtYXRjaChub2RlLFxyXG4gICAgICAgICAgJ2lkZW50aWZpZXInLCAnZXh0ZW5kcycsICdwcm9wZXJ0eV9pZGVudGlmaWVyJywgJ2FjY2Vzc2liaWxpdHlfbW9kaWZpZXInLFxyXG4gICAgICAgICAgJ3N0cmluZycsICd2b2lkJywgJ2Jvb2xlYW4nLCAnbnVsbCcsICd1bmRlZmluZWQnLCAnbnVtYmVyJywgJ3JldHVybicsXHJcbiAgICAgICAgICAnZ2V0JywgJ2Z1bmN0aW9uJywgJ25hbWVzcGFjZScsXHJcbiAgICAgICAgKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRUZXJtaW5hbChub2RlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgbG9nLnJlcG9ydCh0aGlzLnNvdXJjZSwgbm9kZSwgRXJyb3JUeXBlLk5vZGVUeXBlTm90WWV0U3VwcG9ydGVkKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHZpc2l0Q2hpbGRyZW4gPSAobm9kZXM6IFN5bnRheE5vZGVbXSk6IEFTVE5vZGVbXSA9PiB7XHJcbiAgICBsZXQgY2hpbGRyZW46IEFTVE5vZGVbXSA9IFtdO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBub2RlID0gbm9kZXNbaV07XHJcbiAgICAgIGlmICghbm9kZS50eXBlLm1hdGNoKC9bPD4oKXt9LDo7XFxbXFxdJnw9XFwrXFwtXFwqXFwvXS8pICYmIG5vZGUudHlwZSAhPT0gJy4uLicpIHtcclxuICAgICAgICBjb25zdCBjaGlsZCA9IHRoaXMudmlzaXROb2RlKG5vZGUpO1xyXG4gICAgICAgIGlmIChjaGlsZCkgY2hpbGRyZW4ucHVzaChjaGlsZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjaGlsZHJlbjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdmlzaXRQcm9ncmFtID0gKG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlW10gPT4ge1xyXG4gICAgbGV0IHZpc2l0ZWQgPSB7fSxcclxuICAgICAgZ2V0U3RhcnRMb2NhdGlvbiA9IChuOiBBU1ROb2RlKSA9PiBgJHtuLmxvY2F0aW9uLnJvdy5zdGFydH06JHtuLmxvY2F0aW9uLmNvbHVtbi5zdGFydH1gO1xyXG4gICAgLy8gQSBwcm9ncmFtIGNhbiBoYXZlIG1vZHVsZXMsIG5hbWVzcGFjZXMsIGNvbW1lbnRzIGFzIGl0cyBjaGlsZHJlblxyXG4gICAgLy8gVGhlIGZpcnN0IHN0ZXAgaXMgdG8gcGFyc2UgYWxsIHRoZSBjb21tZW50cyBpbiB0aGUgcm9vdCBub2RlXHJcbiAgICBsZXQgY29tbWVudHMgPSB0aGlzLnZpc2l0Q2hpbGRyZW4odGhpcy5maWx0ZXJUeXBlKG5vZGUsICdjb21tZW50JykpO1xyXG4gICAgLy8gUGFyc2UgdGhlIG5hbWVzcGFjZXMgaW4gZXhwcmVzc2lvbl9zdGF0ZW1lbnRcclxuICAgIC8vIGxldCBuYW1lc3BhY2VzID0gdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShub2RlLCAnZXhwcmVzc2lvbl9zdGF0ZW1lbnQnKSk7XHJcbiAgICAvLyBQYXJzZSB0aGUgZXhwb3J0IHN0YXRlbWVudHMgaW4gdGhlIHJvb3Qgbm9kZVxyXG4gICAgbGV0IGV4cG9ydHMgPSB0aGlzLnZpc2l0Q2hpbGRyZW4odGhpcy5maWx0ZXJUeXBlKG5vZGUsICdleHBvcnRfc3RhdGVtZW50JykpO1xyXG5cclxuICAgIC8vIEdldCB0aGUgdmlzaXRlZCBjb250ZXh0IG5vZGVzXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGNvbW1lbnQgPSBjb21tZW50c1tpXTtcclxuICAgICAgY29uc3QgY29udGV4dCA9IGNvbW1lbnQ7XHJcbiAgICAgIHZpc2l0ZWRbZ2V0U3RhcnRMb2NhdGlvbihjb250ZXh0KV0gPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEV4cG9ydHMgYXJlIG9kZGJhbGxzIHNpbmNlIHNvbWUgZXhwb3J0cyBtYXkgcmVmZXJlbmNlXHJcbiAgICAvLyBhIHR5cGUvbm9kZSB0aGF0IG1heSBoYXZlIGJlZW4gY29tbWVudGVkLlxyXG4gICAgLy8gV2UnbGwgZmlyc3QgbmVlZCB0byBmaWx0ZXIgdGhlIG9uZXMgd2UgaGF2ZSB2aXNpdGVkXHJcbiAgICBfLnJlbW92ZShleHBvcnRzLCB4ID0+IHZpc2l0ZWRbZ2V0U3RhcnRMb2NhdGlvbih4KV0pO1xyXG5cclxuICAgIC8vIEZyb20gdGhlIG9uZXMgd2UgaGF2ZSBub3QgdmlzaXRlZCwgd2UnbGwgbmVlZCB0byBtb2RpZnlcclxuICAgIC8vIHRoZSBub2RlIHByb3BlcnRpZXMgb2YgZWFjaCBjb250ZXh0IGluIGEgY29tbWVudCBub2RlIHRoYXRcclxuICAgIC8vIG1hdGNoZXMgdGhlIG9uZXMgd2UgaGF2ZSBub3QgdmlzaXRlZC5cclxuICAgIGNvbnN0IG1hdGNoZWQgPSB7fTtcclxuICAgIGNvbW1lbnRzID0gXy5jb21wYWN0KFxyXG4gICAgICBjb21tZW50cy5tYXAoY29tbWVudCA9PiB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBvcnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBjb25zdCBleHBvcnRfID0gZXhwb3J0c1tpXTtcclxuICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSBjb21tZW50LmNvbnRleHQ7XHJcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbnRleHQuY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRleHQuY2hpbGRyZW5baV0udHlwZSA9PT0gZXhwb3J0Xy50eXBlKSB7XHJcbiAgICAgICAgICAgICAgbWF0Y2hlZFtnZXRTdGFydExvY2F0aW9uKGV4cG9ydF8pXSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgY29tbWVudC5jb250ZXh0LnByb3BlcnRpZXMgPSBPYmplY3QuYXNzaWduKFxyXG4gICAgICAgICAgICAgICAgY29tbWVudC5jb250ZXh0LnByb3BlcnRpZXMgfHwge30sXHJcbiAgICAgICAgICAgICAgICBleHBvcnRfLnByb3BlcnRpZXNcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb21tZW50O1xyXG4gICAgICB9KSk7XHJcblxyXG4gICAgLy8gUmVtb3ZlZCB0aGUgbWF0Y2hlZCBleHBvcnRzXHJcbiAgICBfLnJlbW92ZShleHBvcnRzLCB4ID0+IG1hdGNoZWRbZ2V0U3RhcnRMb2NhdGlvbih4KV0pXHJcblxyXG4gICAgcmV0dXJuIFtdLmNvbmNhdChjb21tZW50cykuY29uY2F0KGV4cG9ydHMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB2aXNpdENvbW1lbnQgPSAobm9kZTogU3ludGF4Tm9kZSk6IEFTVE5vZGUgPT4ge1xyXG4gICAgaWYgKGlzSmF2YURvY0NvbW1lbnQodGhpcy5zb3VyY2UsIG5vZGUpKSB7XHJcbiAgICAgIGNvbnN0IG5leHRTaWJsaW5nID0gc2libGluZyhub2RlKTtcclxuICAgICAgaWYgKG5leHRTaWJsaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIHRoaXMudmlzaXRDb250ZXh0KG5leHRTaWJsaW5nLCB7fSksIHRydWUpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFZpc2l0IHRoZSBjb250ZXh0dWFsIG5vZGVcclxuICAgKiBcclxuICAgKiAjIFJlbWFya1xyXG4gICAqIFxyXG4gICAqIEEgbm9kZSBpcyBjb25zaWRlcmVkIGNvbnRleHR1YWwgd2hlbiBhIGNvbW1lbnQgaXMgdmlzaXRlZCBhbmQgdGhlIG5vZGUgaXMgaXRzIHNpYmxpbmcuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB2aXNpdENvbnRleHQgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XHJcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xyXG4gICAgICBjYXNlICdleHBvcnRfc3RhdGVtZW50JzpcclxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdEV4cG9ydFN0YXRlbWVudChub2RlLCBwcm9wZXJ0aWVzKTtcclxuICAgICAgY2FzZSAnZXhwcmVzc2lvbl9zdGF0ZW1lbnQnOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChub2RlLCBwcm9wZXJ0aWVzKTtcclxuICAgICAgY2FzZSAnY2xhc3MnOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0Q2xhc3Mobm9kZSwgcHJvcGVydGllcylcclxuICAgICAgY2FzZSAnZnVuY3Rpb24nOlxyXG4gICAgICBjYXNlICdjYWxsX3NpZ25hdHVyZSc6XHJcbiAgICAgIGNhc2UgJ21ldGhvZF9zaWduYXR1cmUnOlxyXG4gICAgICBjYXNlICdwcm9wZXJ0eV9zaWduYXR1cmUnOlxyXG4gICAgICBjYXNlICdwdWJsaWNfZmllbGRfZGVmaW5pdGlvbic6XHJcbiAgICAgIGNhc2UgJ21ldGhvZF9kZWZpbml0aW9uJzpcclxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdE5vblRlcm1pbmFsKG5vZGUsIHByb3BlcnRpZXMpO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGxvZy5yZXBvcnQodGhpcy5zb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFlldFN1cHBvcnRlZCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiBTdGF0ZW1lbnRzICovXHJcblxyXG4gIHByaXZhdGUgdmlzaXRFeHBvcnRTdGF0ZW1lbnQgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XHJcbiAgICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuLCBkZWZhdWx0RXhwb3J0ID0gZmFsc2U7XHJcbiAgICAvLyBSZW1vdmUgJ2V4cG9ydCcgc2luY2UgaXQncyBhbHdheXMgZmlyc3QgaW4gdGhlIGFycmF5XHJcbiAgICBjaGlsZHJlbi5zaGlmdCgpO1xyXG4gICAgaWYgKHRoaXMuaGFzRGVmYXVsdEV4cG9ydChub2RlKSkge1xyXG4gICAgICBkZWZhdWx0RXhwb3J0ID0gdHJ1ZTtcclxuICAgICAgLy8gUmVtb3ZlICdkZWZhdWx0JyBleHBvcnRcclxuICAgICAgY2hpbGRyZW4uc2hpZnQoKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW4uc2hpZnQoKTtcclxuICAgIHJldHVybiB0aGlzLnZpc2l0Tm9kZShjaGlsZCwgeyBleHBvcnRzOiB7IGV4cG9ydDogdHJ1ZSwgZGVmYXVsdDogZGVmYXVsdEV4cG9ydCB9IH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllczogUGFydGlhbDxOb2RlUHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcclxuICAgIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XHJcbiAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuLnNoaWZ0KCk7XHJcbiAgICBpZiAobWF0Y2goY2hpbGQsICdpbnRlcm5hbF9tb2R1bGUnKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy52aXNpdEludGVybmFsTW9kdWxlKGNoaWxkLCBwcm9wZXJ0aWVzKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMudmlzaXROb25UZXJtaW5hbChub2RlKTtcclxuICB9XHJcblxyXG4gIC8qIE1vZHVsZXMgKi9cclxuXHJcbiAgcHJpdmF0ZSB2aXNpdEludGVybmFsTW9kdWxlID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xyXG4gICAgbGV0IGNoaWxkcmVuOiBBU1ROb2RlW10gPSBub2RlLmNoaWxkcmVuLm1hcChjaGlsZCA9PiB7XHJcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ3N0YXRlbWVudF9ibG9jaycpKSB7XHJcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIHRoaXMudmlzaXRDaGlsZHJlbih0aGlzLmZpbHRlclR5cGUoY2hpbGQsICdjb21tZW50JykpKVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzLnZpc2l0Tm9kZShjaGlsZCk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCBjaGlsZHJlbiwgT2JqZWN0LmFzc2lnbihwcm9wZXJ0aWVzIHx8IHt9LCB7IG5hbWVzcGFjZTogdHJ1ZSB9KSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyogRGVjbGFyYXRpb25zICovXHJcblxyXG4gIHByaXZhdGUgdmlzaXRDbGFzcyA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcclxuICAgIC8vIFNpbmNlICdpbnRlcmZhY2UnIG9yICdjbGFzcycgaXMgYWx3YXlzIGZpcnN0IGluIHRoZSBhcnJheVxyXG4gICAgLy8gd2UnbGwgbmVlZCB0byByZW1vdmUgaXQgZnJvbSB0aGUgYXJyYXkuXHJcbiAgICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xyXG4gICAgY29uc3QgaW50ZXJmYWNlXyA9IGNoaWxkcmVuLnNoaWZ0KCk7XHJcbiAgICBsZXQgZXh0ZW5kc18gPSBmYWxzZSwgaW1wbGVtZW50c18gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLmhhc0luaGVyaXRhbmNlKG5vZGUpKSB7XHJcbiAgICAgIGNvbnN0IGluaGVyaXRhbmNlID0gdGhpcy5nZXRJbmhlcml0YW5jZVR5cGUobm9kZSlcclxuICAgICAgZXh0ZW5kc18gPSBpbmhlcml0YW5jZSA9PT0gJ2V4dGVuZHMnO1xyXG4gICAgICBpbXBsZW1lbnRzXyA9IGluaGVyaXRhbmNlID09PSAnaW1wbGVtZW50cyc7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgbm9kZV8gPSBjcmVhdGVBU1ROb2RlKFxyXG4gICAgICB0aGlzLnNvdXJjZSxcclxuICAgICAgbm9kZSxcclxuICAgICAgdGhpcy52aXNpdENoaWxkcmVuKGNoaWxkcmVuKSxcclxuICAgICAgT2JqZWN0LmFzc2lnbihwcm9wZXJ0aWVzIHx8IHt9LCB7XHJcbiAgICAgICAgaW5oZXJpdGFuY2U6IHtcclxuICAgICAgICAgIGltcGxlbWVudHM6IGltcGxlbWVudHNfLFxyXG4gICAgICAgICAgZXh0ZW5kczogZXh0ZW5kc19cclxuICAgICAgICB9IGFzIE5vZGVJbmhlcml0YW5jZVxyXG4gICAgICB9KSk7XHJcblxyXG4gICAgaWYgKG1hdGNoKG5vZGUsICdjbGFzcycpKSB7XHJcbiAgICAgIHJldHVybiBub2RlXztcclxuICAgIH1cclxuICAgIC8vIE92ZXJ3cml0ZSB0aGUgbm9kZSB0eXBlIGZyb20gJ2ludGVyZmFjZV9kZWNsYXJhdGlvbicgdG8gJ2ludGVyZmFjZSdcclxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5vZGVfLCB7IHR5cGU6IGludGVyZmFjZV8udHlwZSB9KVxyXG4gIH1cclxuXHJcbiAgLyogTm9uLXRlcm1pbmFscyAqL1xyXG5cclxuICBwcml2YXRlIHZpc2l0Tm9uVGVybWluYWwgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XHJcbiAgICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xyXG4gICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZXMgd2hlcmUgc29tZSBub24tdGVybWluYWxzXHJcbiAgICAvLyBjb250YWluIGNvbW1lbnRzIHdoaWNoIGlzIHdoYXQgd2UgY2FyZSBhYm91dFxyXG4gICAgaWYgKG1hdGNoKG5vZGUsICdjbGFzc19ib2R5JywgJ29iamVjdF90eXBlJykpIHtcclxuICAgICAgY2hpbGRyZW4gPSB0aGlzLmZpbHRlclR5cGUobm9kZSwgJ2NvbW1lbnQnKTtcclxuICAgIH1cclxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2VzIHdoZXJlIGV4cG9ydCBzdGF0ZW1lbnRzIGhhdmUgbm9kZSBwcm9wZXJ0aWVzXHJcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2V4cG9ydF9zdGF0ZW1lbnQnKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy52aXNpdEV4cG9ydFN0YXRlbWVudChub2RlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBhbiBpbnRlcm5hbCBtb2R1bGUgY29udGFpbnMgb3RoZXIgbm9kZXNcclxuICAgIGlmIChtYXRjaChub2RlLCAnaW50ZXJuYWxfbW9kdWxlJykpIHtcclxuICAgICAgcmV0dXJuIHRoaXMudmlzaXRJbnRlcm5hbE1vZHVsZShub2RlLCBwcm9wZXJ0aWVzKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBhbiBpbnRlcm1hbF9tb2R1bGUgY2FuIGV4aXN0IGluIGFuIGV4cHJlc3Npb25fc3RhdGVtZW50XHJcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2V4cHJlc3Npb25fc3RhdGVtZW50JykpIHtcclxuICAgICAgcmV0dXJuIHRoaXMudmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KG5vZGUsIHByb3BlcnRpZXMpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENoaWxkcmVuKGNoaWxkcmVuKSwgcHJvcGVydGllcyk7XHJcbiAgfVxyXG5cclxuICAvKiBUZXJtaW5hbHMgKi9cclxuXHJcbiAgcHJpdmF0ZSB2aXNpdFRlcm1pbmFsID0gKG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlID0+IHtcclxuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlKVxyXG4gIH1cclxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2phdmFzY3JpcHQvdmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHVDQUF1RDtBQUN2RCxpREFBdUQ7QUFHdkQsaURBQThDO0FBRTlDLDRCQUE0QjtBQUM1Qix5Q0FBaUQ7QUFDakQsNkNBQXNDO0FBR3RDOztHQUVHO0FBQ0gsTUFBYSxpQkFBaUI7SUFHNUIsWUFBWSxNQUFjO1FBRmxCLFFBQUcsR0FBYyxFQUFFLENBQUE7UUFxRTNCLGVBQWU7UUFFZixjQUFTLEdBQUcsQ0FDVixJQUFnQixFQUNoQixVQUFvQyxFQUNwQyxFQUFFO1lBQ0YsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNqQixLQUFLLFNBQVM7b0JBQ1osSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNuQyxNQUFNO2dCQUNSLEtBQUssU0FBUztvQkFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pDLEtBQUssU0FBUyxDQUFDO2dCQUNmLEtBQUssT0FBTztvQkFDVixhQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO29CQUM5RCxNQUFNO2dCQUNSO29CQUVFLCtCQUErQjtvQkFFL0IsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUNaLFlBQVksRUFDWixtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFDM0QsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQ3pFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQ3RFLG1CQUFtQixFQUFFLFlBQVksRUFDakMsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSwwQkFBMEIsRUFBRSxtQkFBbUIsRUFDeEYsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsc0JBQXNCO29CQUNqRixxREFBcUQ7b0JBQ3JELGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsY0FBYyxDQUNmLEVBQUU7d0JBQ0QsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFBO3FCQUMvQztvQkFFRCxxQkFBcUI7b0JBQ3JCLElBQUksZUFBSyxDQUFDLElBQUksRUFDWixZQUFZLEVBQUUsU0FBUyxFQUFFLHFCQUFxQixFQUFFLHdCQUF3QixFQUN4RSxNQUFNLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFDN0IsS0FBSyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FDOUMsRUFBRTt3QkFDRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQ2pDO29CQUVELGFBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsZUFBUyxDQUFDLHVCQUF1QixDQUFDLENBQUM7b0JBQ2pFLE9BQU87YUFDVjtRQUNILENBQUMsQ0FBQTtRQUVELGtCQUFhLEdBQUcsQ0FBQyxLQUFtQixFQUFhLEVBQUU7WUFDakQsSUFBSSxRQUFRLEdBQWMsRUFBRSxDQUFDO1lBQzdCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNyQyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssS0FBSyxFQUFFO29CQUMzRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNuQyxJQUFJLEtBQUs7d0JBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDakM7YUFDRjtZQUNELE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUMsQ0FBQTtRQUVPLGlCQUFZLEdBQUcsQ0FBQyxJQUFnQixFQUFhLEVBQUU7WUFDckQsSUFBSSxPQUFPLEdBQUcsRUFBRSxFQUNkLGdCQUFnQixHQUFHLENBQUMsQ0FBVSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMxRixtRUFBbUU7WUFDbkUsK0RBQStEO1lBQy9ELElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNwRSwrQ0FBK0M7WUFDL0Msc0ZBQXNGO1lBQ3RGLCtDQUErQztZQUMvQyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQztZQUU1RSxnQ0FBZ0M7WUFDaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3hDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUIsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDO2dCQUN4QixPQUFPLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7YUFDM0M7WUFFRCx3REFBd0Q7WUFDeEQsNENBQTRDO1lBQzVDLHNEQUFzRDtZQUN0RCxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFckQsMERBQTBEO1lBQzFELDZEQUE2RDtZQUM3RCx3Q0FBd0M7WUFDeEMsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ25CLFFBQVEsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUNsQixRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNyQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDdkMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMzQixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO29CQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO3dCQUMzRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLElBQUksRUFBRTs0QkFDcEUsT0FBTyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDOzRCQUMxQyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUN4QyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsSUFBSSxFQUFFLEVBQ2hDLE9BQU8sQ0FBQyxVQUFVLENBQ25CLENBQUM7eUJBQ0g7cUJBQ0Y7aUJBQ0Y7Z0JBQ0QsT0FBTyxPQUFPLENBQUM7WUFDakIsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVOLDhCQUE4QjtZQUM5QixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFFcEQsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUE7UUFFTyxpQkFBWSxHQUFHLENBQUMsSUFBZ0IsRUFBVyxFQUFFO1lBQ25ELElBQUksMEJBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDdkMsTUFBTSxXQUFXLEdBQUcsaUJBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbEMsSUFBSSxXQUFXLEVBQUU7b0JBQ2YsT0FBTyxtQkFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBO2lCQUNsRjthQUNGO1FBQ0gsQ0FBQyxDQUFBO1FBRUQ7Ozs7OztXQU1HO1FBQ0ssaUJBQVksR0FBRyxDQUFDLElBQWdCLEVBQUUsVUFBb0MsRUFBVyxFQUFFO1lBQ3pGLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDakIsS0FBSyxrQkFBa0I7b0JBQ3JCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDckQsS0FBSyxzQkFBc0I7b0JBQ3pCLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDekQsS0FBSyxPQUFPO29CQUNWLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUE7Z0JBQzFDLEtBQUssVUFBVSxDQUFDO2dCQUNoQixLQUFLLGdCQUFnQixDQUFDO2dCQUN0QixLQUFLLGtCQUFrQixDQUFDO2dCQUN4QixLQUFLLG9CQUFvQixDQUFDO2dCQUMxQixLQUFLLHlCQUF5QixDQUFDO2dCQUMvQixLQUFLLG1CQUFtQixDQUFDO2dCQUN6QixLQUFLLHFCQUFxQjtvQkFDeEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUNqRDtvQkFDRSxhQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO29CQUNqRSxPQUFPO2FBQ1Y7UUFDSCxDQUFDLENBQUE7UUFFRCxnQkFBZ0I7UUFFUix5QkFBb0IsR0FBRyxDQUFDLElBQWdCLEVBQUUsVUFBb0MsRUFBVyxFQUFFO1lBQ2pHLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsYUFBYSxHQUFHLEtBQUssQ0FBQztZQUNwRCx1REFBdUQ7WUFDdkQsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2pCLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUMvQixhQUFhLEdBQUcsSUFBSSxDQUFDO2dCQUNyQiwwQkFBMEI7Z0JBQzFCLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQzthQUNsQjtZQUNELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMvQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RGLENBQUMsQ0FBQTtRQUVPLDZCQUF3QixHQUFHLENBQUMsSUFBZ0IsRUFBRSxVQUFtQyxFQUFXLEVBQUU7WUFDcEcsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUM3QixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFL0IsSUFBSSxlQUFLLENBQUMsS0FBSyxFQUFFLGlCQUFpQixDQUFDLEVBQUU7Z0JBQ25DLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQTthQUNuRDtZQUVELElBQUksZUFBSyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsRUFBRTtnQkFDNUIsSUFBSSxVQUFVO29CQUFFLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNqRDtZQUVELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3JDLENBQUMsQ0FBQTtRQUVELGFBQWE7UUFFTCx3QkFBbUIsR0FBRyxDQUFDLElBQWdCLEVBQUUsVUFBb0MsRUFBVyxFQUFFO1lBQ2hHLElBQUksUUFBUSxHQUFjLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNsRCxJQUFJLGVBQUssQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLENBQUMsRUFBRTtvQkFDbkMsT0FBTyxtQkFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFBO2lCQUMvRjtnQkFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0IsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLG1CQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDMUcsQ0FBQyxDQUFBO1FBR0Qsa0JBQWtCO1FBRVYsZUFBVSxHQUFHLENBQUMsSUFBZ0IsRUFBRSxVQUFvQyxFQUFXLEVBQUU7WUFDdkYsNERBQTREO1lBQzVELDBDQUEwQztZQUMxQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQzdCLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNwQyxJQUFJLFFBQVEsR0FBRyxLQUFLLEVBQUUsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUMxQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzdCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFDakQsUUFBUSxHQUFHLFdBQVcsS0FBSyxTQUFTLENBQUM7Z0JBQ3JDLFdBQVcsR0FBRyxXQUFXLEtBQUssWUFBWSxDQUFDO2FBQzVDO1lBRUQsTUFBTSxLQUFLLEdBQUcsbUJBQWEsQ0FDekIsSUFBSSxDQUFDLE1BQU0sRUFDWCxJQUFJLEVBQ0osSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFDNUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksRUFBRSxFQUFFO2dCQUM5QixXQUFXLEVBQUU7b0JBQ1gsVUFBVSxFQUFFLFdBQVc7b0JBQ3ZCLE9BQU8sRUFBRSxRQUFRO2lCQUNDO2FBQ3JCLENBQUMsQ0FBQyxDQUFDO1lBRU4sSUFBSSxlQUFLLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxFQUFFO2dCQUN4QixPQUFPLEtBQUssQ0FBQzthQUNkO1lBQ0Qsc0VBQXNFO1lBQ3RFLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7UUFDeEQsQ0FBQyxDQUFBO1FBRUQsbUJBQW1CO1FBRVgscUJBQWdCLEdBQUcsQ0FBQyxJQUFnQixFQUFFLFVBQW9DLEVBQVcsRUFBRTtZQUM3RixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQzdCLGdEQUFnRDtZQUNoRCwrQ0FBK0M7WUFDL0MsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxhQUFhLENBQUMsRUFBRTtnQkFDNUMsUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2FBQzdDO1lBQ0Qsb0VBQW9FO1lBQ3BFLElBQUksZUFBSyxDQUFDLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxFQUFFO2dCQUNuQyxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN4QztZQUVELHFFQUFxRTtZQUNyRSxJQUFJLGVBQUssQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsRUFBRTtnQkFDbEMsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2FBQ25EO1lBRUQscUZBQXFGO1lBQ3JGLElBQUksZUFBSyxDQUFDLElBQUksRUFBRSxzQkFBc0IsQ0FBQyxFQUFFO2dCQUN2QyxPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7YUFDeEQ7WUFFRCw4REFBOEQ7WUFDOUQsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxFQUFFO2dCQUMzQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLGVBQUssQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFBO2dCQUM1RCxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN0QixPQUFPLG1CQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQzthQUNuRjtZQUVELE9BQU8sbUJBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3BGLENBQUMsQ0FBQTtRQUVELGVBQWU7UUFFUCxrQkFBYSxHQUFHLENBQUMsSUFBZ0IsRUFBVyxFQUFFO1lBQ3BELE9BQU8sbUJBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ3pDLENBQUMsQ0FBQTtRQTVVQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSyxjQUFjLENBQUMsSUFBZ0I7UUFDckMsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM3QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksZUFBSyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLEVBQUU7Z0JBQ3pDLFFBQVEsR0FBRyxJQUFJLENBQUM7YUFDakI7U0FDRjtRQUNELE9BQU8sUUFBUSxDQUFBO0lBQ2pCLENBQUM7SUFFRDs7T0FFRztJQUNLLGtCQUFrQixDQUFDLElBQWdCO1FBQ3pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM3QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksZUFBSyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsRUFBRTtnQkFDM0IsT0FBTyxTQUFTLENBQUM7YUFDbEI7WUFFRCxJQUFJLGVBQUssQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLEVBQUU7Z0JBQzlCLE9BQU8sWUFBWSxDQUFDO2FBQ3JCO1NBQ0Y7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxnQkFBZ0IsQ0FBQyxJQUFnQjtRQUN2QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLGVBQUssQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLEVBQUU7Z0JBQzNCLE9BQU8sSUFBSSxDQUFDO2FBQ2I7U0FDRjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0ssVUFBVSxDQUFDLElBQWdCLEVBQUUsSUFBWTtRQUMvQyw2QkFBNkI7UUFDN0IsSUFBSSxRQUFRLEdBQWlCLEVBQUUsQ0FBQztRQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLGVBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ3RCLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDdEI7U0FDRjtRQUNELGdDQUFnQztRQUNoQyxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsTUFBTTtRQUNKLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQixDQUFDO0NBNlFGO0FBalZELDhDQWlWQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUFTVE5vZGUsIEFTVE5vZGUgfSBmcm9tIFwiLi4vY29tbW9uL2FzdFwiO1xuaW1wb3J0IHsgaXNKYXZhRG9jQ29tbWVudCB9IGZyb20gXCIuLi8uLi91dGlscy9jb21tZW50XCI7XG5pbXBvcnQgeyBOb2RlUHJvcGVydGllcywgTm9kZUluaGVyaXRhbmNlIH0gZnJvbSBcIi4uL2NvbW1vbi9lbWNhXCI7XG5pbXBvcnQgeyBOb2RlVmlzaXRvciB9IGZyb20gXCIuLi9jb21tb24vbm9kZVwiO1xuaW1wb3J0IHsgc2libGluZyB9IGZyb20gXCIuLi8uLi91dGlscy9zaWJsaW5nXCI7XG5pbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbG9nLCB7IEVycm9yVHlwZSB9IGZyb20gXCIuLi8uLi91dGlscy9sb2dcIjtcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi4vLi4vdXRpbHMvbWF0Y2hcIjtcbmltcG9ydCBTb3VyY2UgZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvU291cmNlXCI7XG5cbi8qKlxuICogQSBjbGFzcyB0aGF0IHZpc2l0cyBBU1ROb2RlcyBmcm9tIGEgVHlwZVNjcmlwdCB0cmVlLlxuICovXG5leHBvcnQgY2xhc3MgSmF2YVNjcmlwdFZpc2l0b3IgaW1wbGVtZW50cyBOb2RlVmlzaXRvciB7XG4gIHByaXZhdGUgYXN0OiBBU1ROb2RlW10gPSBbXVxuICBwcml2YXRlIHNvdXJjZTogU291cmNlXG4gIGNvbnN0cnVjdG9yKHNvdXJjZTogU291cmNlKSB7XG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgbm9kZSBoYXMgaW5oZXJpdGFuY2VcbiAgICovXG4gIHByaXZhdGUgaGFzSW5oZXJpdGFuY2Uobm9kZTogU3ludGF4Tm9kZSkge1xuICAgIGxldCBpbmhlcml0cyA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgaWYgKG1hdGNoKGNoaWxkLCAnZXh0ZW5kcycsICdpbXBsZW1lbnRzJykpIHtcbiAgICAgICAgaW5oZXJpdHMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW5oZXJpdHNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbm9kZSdzIGluaGVyaXRhbmNlIHR5cGVcbiAgICovXG4gIHByaXZhdGUgZ2V0SW5oZXJpdGFuY2VUeXBlKG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXTtcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ2V4dGVuZHMnKSkge1xuICAgICAgICByZXR1cm4gJ2V4dGVuZHMnO1xuICAgICAgfVxuXG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdpbXBsZW1lbnRzJykpIHtcbiAgICAgICAgcmV0dXJuICdpbXBsZW1lbnRzJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGV4cG9ydCBpcyBkZWZhdWx0XG4gICAqL1xuICBwcml2YXRlIGhhc0RlZmF1bHRFeHBvcnQobm9kZTogU3ludGF4Tm9kZSk6IGJvb2xlYW4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgaWYgKG1hdGNoKGNoaWxkLCAnZGVmYXVsdCcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBvbmx5IHRoZSBjb21tZW50cyBmcm9tIGEgbm9kZSdzIGNoaWxkcmVuLlxuICAgKi9cbiAgcHJpdmF0ZSBmaWx0ZXJUeXBlKG5vZGU6IFN5bnRheE5vZGUsIHR5cGU6IHN0cmluZyk6IFN5bnRheE5vZGVbXSB7XG4gICAgLy8gY29uc29sZS50aW1lKCdmaWx0ZXJUeXBlJylcbiAgICBsZXQgY2hpbGRyZW46IFN5bnRheE5vZGVbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgaWYgKG1hdGNoKGNoaWxkLCB0eXBlKSkge1xuICAgICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gY29uc29sZS50aW1lRW5kKCdmaWx0ZXJUeXBlJylcbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cblxuICBnZXRBU1QoKTogQVNUTm9kZVtdIHtcbiAgICByZXR1cm4gdGhpcy5hc3Q7XG4gIH1cblxuICAvKiBWaXNpdG9ycyAgKi9cblxuICB2aXNpdE5vZGUgPSAoXG4gICAgbm9kZTogU3ludGF4Tm9kZSxcbiAgICBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz5cbiAgKSA9PiB7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgJ3Byb2dyYW0nOlxuICAgICAgICB0aGlzLmFzdCA9IHRoaXMudmlzaXRQcm9ncmFtKG5vZGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NvbW1lbnQnOlxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdENvbW1lbnQobm9kZSk7XG4gICAgICBjYXNlICdNSVNTSU5HJzpcbiAgICAgIGNhc2UgJ0VSUk9SJzpcbiAgICAgICAgbG9nLnJlcG9ydCh0aGlzLnNvdXJjZSwgbm9kZSwgRXJyb3JUeXBlLlRyZWVTaXR0ZXJQYXJzZUVycm9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuXG4gICAgICAgIC8qIE1hdGNoIG90aGVyIG5vbi10ZXJtaW5hbHMgKi9cblxuICAgICAgICBpZiAobWF0Y2gobm9kZSxcbiAgICAgICAgICAnY29uc3RyYWludCcsXG4gICAgICAgICAgJ2Zvcm1hbF9wYXJhbWV0ZXJzJywgJ3JlcXVpcmVkX3BhcmFtZXRlcicsICdyZXN0X3BhcmFtZXRlcicsXG4gICAgICAgICAgJ3R5cGVfaWRlbnRpZmllcicsICd0eXBlX3BhcmFtZXRlcnMnLCAndHlwZV9wYXJhbWV0ZXInLCAndHlwZV9hbm5vdGF0aW9uJyxcbiAgICAgICAgICAnb2JqZWN0X3R5cGUnLCAncHJlZGVmaW5lZF90eXBlJywgJ3BhcmVudGhlc2l6ZWRfdHlwZScsICdsaXRlcmFsX3R5cGUnLFxuICAgICAgICAgICdpbnRlcnNlY3Rpb25fdHlwZScsICd1bmlvbl90eXBlJyxcbiAgICAgICAgICAnY2xhc3NfYm9keScsXG4gICAgICAgICAgJ2V4dGVuZHNfY2xhdXNlJyxcbiAgICAgICAgICAndW5hcnlfZXhwcmVzc2lvbicsICdiaW5hcnlfZXhwcmVzc2lvbicsICdwYXJlbnRoZXNpemVkX2V4cHJlc3Npb24nLCAnbWVtYmVyX2V4cHJlc3Npb24nLFxuICAgICAgICAgICdzdGF0ZW1lbnRfYmxvY2snLCAncmV0dXJuX3N0YXRlbWVudCcsICdleHBvcnRfc3RhdGVtZW50JywgJ2V4cHJlc3Npb25fc3RhdGVtZW50JyxcbiAgICAgICAgICAvLyBBIGNhbGxfc2lnbmF0dXJlIGNhbiBhbHNvIGJlIGEgbm9uLWNvbnRleHR1YWwgbm9kZVxuICAgICAgICAgICdjYWxsX3NpZ25hdHVyZScsXG4gICAgICAgICAgJ2ludGVybmFsX21vZHVsZScsXG4gICAgICAgICAgJ2lmX3N0YXRlbWVudCdcbiAgICAgICAgKSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnZpc2l0Tm9uVGVybWluYWwobm9kZSwgcHJvcGVydGllcylcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIE1hdGNoIHRlcm1pbmFscyAqL1xuICAgICAgICBpZiAobWF0Y2gobm9kZSxcbiAgICAgICAgICAnaWRlbnRpZmllcicsICdleHRlbmRzJywgJ3Byb3BlcnR5X2lkZW50aWZpZXInLCAnYWNjZXNzaWJpbGl0eV9tb2RpZmllcicsXG4gICAgICAgICAgJ251bGwnLCAndW5kZWZpbmVkJywgJ3JldHVybicsXG4gICAgICAgICAgJ2dldCcsICdmdW5jdGlvbicsICduYW1lc3BhY2UnLCAnaWYnLCAnY29uc3QnXG4gICAgICAgICkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdFRlcm1pbmFsKG5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nLnJlcG9ydCh0aGlzLnNvdXJjZSwgbm9kZSwgRXJyb3JUeXBlLk5vZGVUeXBlTm90WWV0U3VwcG9ydGVkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHZpc2l0Q2hpbGRyZW4gPSAobm9kZXM6IFN5bnRheE5vZGVbXSk6IEFTVE5vZGVbXSA9PiB7XG4gICAgbGV0IGNoaWxkcmVuOiBBU1ROb2RlW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBub2RlID0gbm9kZXNbaV07XG4gICAgICBpZiAoIW5vZGUudHlwZS5tYXRjaCgvWzw+KCl7fSw6O1xcW1xcXSZ8PVxcK1xcLVxcKlxcLyEuXS8pICYmIG5vZGUudHlwZSAhPT0gJy4uLicpIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSB0aGlzLnZpc2l0Tm9kZShub2RlKTtcbiAgICAgICAgaWYgKGNoaWxkKSBjaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG5cbiAgcHJpdmF0ZSB2aXNpdFByb2dyYW0gPSAobm9kZTogU3ludGF4Tm9kZSk6IEFTVE5vZGVbXSA9PiB7XG4gICAgbGV0IHZpc2l0ZWQgPSB7fSxcbiAgICAgIGdldFN0YXJ0TG9jYXRpb24gPSAobjogQVNUTm9kZSkgPT4gYCR7bi5sb2NhdGlvbi5yb3cuc3RhcnR9OiR7bi5sb2NhdGlvbi5jb2x1bW4uc3RhcnR9YDtcbiAgICAvLyBBIHByb2dyYW0gY2FuIGhhdmUgbW9kdWxlcywgbmFtZXNwYWNlcywgY29tbWVudHMgYXMgaXRzIGNoaWxkcmVuXG4gICAgLy8gVGhlIGZpcnN0IHN0ZXAgaXMgdG8gcGFyc2UgYWxsIHRoZSBjb21tZW50cyBpbiB0aGUgcm9vdCBub2RlXG4gICAgbGV0IGNvbW1lbnRzID0gdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShub2RlLCAnY29tbWVudCcpKTtcbiAgICAvLyBQYXJzZSB0aGUgbmFtZXNwYWNlcyBpbiBleHByZXNzaW9uX3N0YXRlbWVudFxuICAgIC8vIGxldCBuYW1lc3BhY2VzID0gdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShub2RlLCAnZXhwcmVzc2lvbl9zdGF0ZW1lbnQnKSk7XG4gICAgLy8gUGFyc2UgdGhlIGV4cG9ydCBzdGF0ZW1lbnRzIGluIHRoZSByb290IG5vZGVcbiAgICBsZXQgZXhwb3J0cyA9IHRoaXMudmlzaXRDaGlsZHJlbih0aGlzLmZpbHRlclR5cGUobm9kZSwgJ2V4cG9ydF9zdGF0ZW1lbnQnKSk7XG5cbiAgICAvLyBHZXQgdGhlIHZpc2l0ZWQgY29udGV4dCBub2Rlc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNvbW1lbnQgPSBjb21tZW50c1tpXTtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBjb21tZW50O1xuICAgICAgdmlzaXRlZFtnZXRTdGFydExvY2F0aW9uKGNvbnRleHQpXSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gRXhwb3J0cyBhcmUgb2RkYmFsbHMgc2luY2Ugc29tZSBleHBvcnRzIG1heSByZWZlcmVuY2VcbiAgICAvLyBhIHR5cGUvbm9kZSB0aGF0IG1heSBoYXZlIGJlZW4gY29tbWVudGVkLlxuICAgIC8vIFdlJ2xsIGZpcnN0IG5lZWQgdG8gZmlsdGVyIHRoZSBvbmVzIHdlIGhhdmUgdmlzaXRlZFxuICAgIF8ucmVtb3ZlKGV4cG9ydHMsIHggPT4gdmlzaXRlZFtnZXRTdGFydExvY2F0aW9uKHgpXSk7XG5cbiAgICAvLyBGcm9tIHRoZSBvbmVzIHdlIGhhdmUgbm90IHZpc2l0ZWQsIHdlJ2xsIG5lZWQgdG8gbW9kaWZ5XG4gICAgLy8gdGhlIG5vZGUgcHJvcGVydGllcyBvZiBlYWNoIGNvbnRleHQgaW4gYSBjb21tZW50IG5vZGUgdGhhdFxuICAgIC8vIG1hdGNoZXMgdGhlIG9uZXMgd2UgaGF2ZSBub3QgdmlzaXRlZC5cbiAgICBjb25zdCBtYXRjaGVkID0ge307XG4gICAgY29tbWVudHMgPSBfLmNvbXBhY3QoXG4gICAgICBjb21tZW50cy5tYXAoY29tbWVudCA9PiB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwb3J0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGV4cG9ydF8gPSBleHBvcnRzW2ldO1xuICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSBjb21tZW50LmNvbnRleHQ7XG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGNvbnRleHQgJiYgaiA8IGNvbnRleHQuY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChjb250ZXh0LmNoaWxkcmVuW2ldICYmIGNvbnRleHQuY2hpbGRyZW5baV0udHlwZSA9PT0gZXhwb3J0Xy50eXBlKSB7XG4gICAgICAgICAgICAgIG1hdGNoZWRbZ2V0U3RhcnRMb2NhdGlvbihleHBvcnRfKV0gPSB0cnVlO1xuICAgICAgICAgICAgICBjb21tZW50LmNvbnRleHQucHJvcGVydGllcyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgICAgY29tbWVudC5jb250ZXh0LnByb3BlcnRpZXMgfHwge30sXG4gICAgICAgICAgICAgICAgZXhwb3J0Xy5wcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21tZW50O1xuICAgICAgfSkpO1xuXG4gICAgLy8gUmVtb3ZlZCB0aGUgbWF0Y2hlZCBleHBvcnRzXG4gICAgXy5yZW1vdmUoZXhwb3J0cywgeCA9PiBtYXRjaGVkW2dldFN0YXJ0TG9jYXRpb24oeCldKVxuXG4gICAgcmV0dXJuIFtdLmNvbmNhdChjb21tZW50cykuY29uY2F0KGV4cG9ydHMpO1xuICB9XG5cbiAgcHJpdmF0ZSB2aXNpdENvbW1lbnQgPSAobm9kZTogU3ludGF4Tm9kZSk6IEFTVE5vZGUgPT4ge1xuICAgIGlmIChpc0phdmFEb2NDb21tZW50KHRoaXMuc291cmNlLCBub2RlKSkge1xuICAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSBzaWJsaW5nKG5vZGUpO1xuICAgICAgaWYgKG5leHRTaWJsaW5nKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q29udGV4dChuZXh0U2libGluZywge30pLCB0cnVlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWaXNpdCB0aGUgY29udGV4dHVhbCBub2RlXG4gICAqIFxuICAgKiAjIFJlbWFya1xuICAgKiBcbiAgICogQSBub2RlIGlzIGNvbnNpZGVyZWQgY29udGV4dHVhbCB3aGVuIGEgY29tbWVudCBpcyB2aXNpdGVkIGFuZCB0aGUgbm9kZSBpcyBpdHMgc2libGluZy5cbiAgICovXG4gIHByaXZhdGUgdmlzaXRDb250ZXh0ID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICBjYXNlICdleHBvcnRfc3RhdGVtZW50JzpcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRFeHBvcnRTdGF0ZW1lbnQobm9kZSwgcHJvcGVydGllcyk7XG4gICAgICBjYXNlICdleHByZXNzaW9uX3N0YXRlbWVudCc6XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChub2RlLCBwcm9wZXJ0aWVzKTtcbiAgICAgIGNhc2UgJ2NsYXNzJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRDbGFzcyhub2RlLCBwcm9wZXJ0aWVzKVxuICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgY2FzZSAnY2FsbF9zaWduYXR1cmUnOlxuICAgICAgY2FzZSAnbWV0aG9kX3NpZ25hdHVyZSc6XG4gICAgICBjYXNlICdwcm9wZXJ0eV9zaWduYXR1cmUnOlxuICAgICAgY2FzZSAncHVibGljX2ZpZWxkX2RlZmluaXRpb24nOlxuICAgICAgY2FzZSAnbWV0aG9kX2RlZmluaXRpb24nOlxuICAgICAgY2FzZSAnbGV4aWNhbF9kZWNsYXJhdGlvbic6XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0Tm9uVGVybWluYWwobm9kZSwgcHJvcGVydGllcyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgLyogU3RhdGVtZW50cyAqL1xuXG4gIHByaXZhdGUgdmlzaXRFeHBvcnRTdGF0ZW1lbnQgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XG4gICAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiwgZGVmYXVsdEV4cG9ydCA9IGZhbHNlO1xuICAgIC8vIFJlbW92ZSAnZXhwb3J0JyBzaW5jZSBpdCdzIGFsd2F5cyBmaXJzdCBpbiB0aGUgYXJyYXlcbiAgICBjaGlsZHJlbi5zaGlmdCgpO1xuICAgIGlmICh0aGlzLmhhc0RlZmF1bHRFeHBvcnQobm9kZSkpIHtcbiAgICAgIGRlZmF1bHRFeHBvcnQgPSB0cnVlO1xuICAgICAgLy8gUmVtb3ZlICdkZWZhdWx0JyBleHBvcnRcbiAgICAgIGNoaWxkcmVuLnNoaWZ0KCk7XG4gICAgfVxuICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW4uc2hpZnQoKTtcbiAgICByZXR1cm4gdGhpcy52aXNpdE5vZGUoY2hpbGQsIHsgZXhwb3J0czogeyBleHBvcnQ6IHRydWUsIGRlZmF1bHQ6IGRlZmF1bHRFeHBvcnQgfSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50ID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM6IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XG4gICAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuLnNoaWZ0KCk7XG5cbiAgICBpZiAobWF0Y2goY2hpbGQsICdpbnRlcm5hbF9tb2R1bGUnKSkge1xuICAgICAgcmV0dXJuIHRoaXMudmlzaXRJbnRlcm5hbE1vZHVsZShjaGlsZCwgcHJvcGVydGllcylcbiAgICB9XG4gICAgXG4gICAgaWYgKG1hdGNoKGNoaWxkLCAnZnVuY3Rpb24nKSkge1xuICAgICAgaWYgKHByb3BlcnRpZXMpIHJldHVybiB0aGlzLnZpc2l0Q29udGV4dChjaGlsZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudmlzaXROb25UZXJtaW5hbChjaGlsZClcbiAgfVxuXG4gIC8qIE1vZHVsZXMgKi9cblxuICBwcml2YXRlIHZpc2l0SW50ZXJuYWxNb2R1bGUgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XG4gICAgbGV0IGNoaWxkcmVuOiBBU1ROb2RlW10gPSBub2RlLmNoaWxkcmVuLm1hcChjaGlsZCA9PiB7XG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdzdGF0ZW1lbnRfYmxvY2snKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShjaGlsZCwgJ2NvbW1lbnQnKSkpXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy52aXNpdE5vZGUoY2hpbGQpO1xuICAgIH0pO1xuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCBjaGlsZHJlbiwgT2JqZWN0LmFzc2lnbihwcm9wZXJ0aWVzIHx8IHt9LCB7IG5hbWVzcGFjZTogdHJ1ZSB9KSk7XG4gIH1cblxuXG4gIC8qIERlY2xhcmF0aW9ucyAqL1xuXG4gIHByaXZhdGUgdmlzaXRDbGFzcyA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcbiAgICAvLyBTaW5jZSAnaW50ZXJmYWNlJyBvciAnY2xhc3MnIGlzIGFsd2F5cyBmaXJzdCBpbiB0aGUgYXJyYXlcbiAgICAvLyB3ZSdsbCBuZWVkIHRvIHJlbW92ZSBpdCBmcm9tIHRoZSBhcnJheS5cbiAgICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuICAgIGNvbnN0IGludGVyZmFjZV8gPSBjaGlsZHJlbi5zaGlmdCgpO1xuICAgIGxldCBleHRlbmRzXyA9IGZhbHNlLCBpbXBsZW1lbnRzXyA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmhhc0luaGVyaXRhbmNlKG5vZGUpKSB7XG4gICAgICBjb25zdCBpbmhlcml0YW5jZSA9IHRoaXMuZ2V0SW5oZXJpdGFuY2VUeXBlKG5vZGUpXG4gICAgICBleHRlbmRzXyA9IGluaGVyaXRhbmNlID09PSAnZXh0ZW5kcyc7XG4gICAgICBpbXBsZW1lbnRzXyA9IGluaGVyaXRhbmNlID09PSAnaW1wbGVtZW50cyc7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZV8gPSBjcmVhdGVBU1ROb2RlKFxuICAgICAgdGhpcy5zb3VyY2UsXG4gICAgICBub2RlLFxuICAgICAgdGhpcy52aXNpdENoaWxkcmVuKGNoaWxkcmVuKSxcbiAgICAgIE9iamVjdC5hc3NpZ24ocHJvcGVydGllcyB8fCB7fSwge1xuICAgICAgICBpbmhlcml0YW5jZToge1xuICAgICAgICAgIGltcGxlbWVudHM6IGltcGxlbWVudHNfLFxuICAgICAgICAgIGV4dGVuZHM6IGV4dGVuZHNfXG4gICAgICAgIH0gYXMgTm9kZUluaGVyaXRhbmNlXG4gICAgICB9KSk7XG5cbiAgICBpZiAobWF0Y2gobm9kZSwgJ2NsYXNzJykpIHtcbiAgICAgIHJldHVybiBub2RlXztcbiAgICB9XG4gICAgLy8gT3ZlcndyaXRlIHRoZSBub2RlIHR5cGUgZnJvbSAnaW50ZXJmYWNlX2RlY2xhcmF0aW9uJyB0byAnaW50ZXJmYWNlJ1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5vZGVfLCB7IHR5cGU6IGludGVyZmFjZV8udHlwZSB9KVxuICB9XG5cbiAgLyogTm9uLXRlcm1pbmFscyAqL1xuXG4gIHByaXZhdGUgdmlzaXROb25UZXJtaW5hbCA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcbiAgICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2VzIHdoZXJlIHNvbWUgbm9uLXRlcm1pbmFsc1xuICAgIC8vIGNvbnRhaW4gY29tbWVudHMgd2hpY2ggaXMgd2hhdCB3ZSBjYXJlIGFib3V0XG4gICAgaWYgKG1hdGNoKG5vZGUsICdjbGFzc19ib2R5JywgJ29iamVjdF90eXBlJykpIHtcbiAgICAgIGNoaWxkcmVuID0gdGhpcy5maWx0ZXJUeXBlKG5vZGUsICdjb21tZW50Jyk7XG4gICAgfVxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2VzIHdoZXJlIGV4cG9ydCBzdGF0ZW1lbnRzIGhhdmUgbm9kZSBwcm9wZXJ0aWVzXG4gICAgaWYgKG1hdGNoKG5vZGUsICdleHBvcnRfc3RhdGVtZW50JykpIHtcbiAgICAgIHJldHVybiB0aGlzLnZpc2l0RXhwb3J0U3RhdGVtZW50KG5vZGUpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2VzIHdoZXJlIGFuIGludGVybmFsIG1vZHVsZSBjb250YWlucyBvdGhlciBub2Rlc1xuICAgIGlmIChtYXRjaChub2RlLCAnaW50ZXJuYWxfbW9kdWxlJykpIHtcbiAgICAgIHJldHVybiB0aGlzLnZpc2l0SW50ZXJuYWxNb2R1bGUobm9kZSwgcHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZXMgd2hlcmUgYW4gaW50ZXJtYWxfbW9kdWxlIGNhbiBleGlzdCBpbiBhbiBleHByZXNzaW9uX3N0YXRlbWVudFxuICAgIGlmIChtYXRjaChub2RlLCAnZXhwcmVzc2lvbl9zdGF0ZW1lbnQnKSkge1xuICAgICAgcmV0dXJuIHRoaXMudmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KG5vZGUsIHByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2VzIHdoZXJlIGEgZnVuY3Rpb24gaGFzIGEgc3RhdGVtZW50X2Jsb2NrXG4gICAgaWYgKG1hdGNoKG5vZGUsICdmdW5jdGlvbicpKSB7XG4gICAgICBfLnJlbW92ZShjaGlsZHJlbiwgY2hpbGQgPT4gbWF0Y2goY2hpbGQsICdzdGF0ZW1lbnRfYmxvY2snKSlcbiAgICAgIGNvbnNvbGUubG9nKGNoaWxkcmVuKTtcbiAgICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q2hpbGRyZW4oY2hpbGRyZW4pLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENoaWxkcmVuKGNoaWxkcmVuKSwgcHJvcGVydGllcyk7XG4gIH1cblxuICAvKiBUZXJtaW5hbHMgKi9cblxuICBwcml2YXRlIHZpc2l0VGVybWluYWwgPSAobm9kZTogU3ludGF4Tm9kZSk6IEFTVE5vZGUgPT4ge1xuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlKVxuICB9XG59Il19 \ No newline at end of file diff --git a/build/src/lang/typescript/index.js b/build/src/lang/typescript/index.js index f601683..5da52fa 100644 --- a/build/src/lang/typescript/index.js +++ b/build/src/lang/typescript/index.js @@ -19,7 +19,7 @@ class TypeScriptParser { constructor(source, options) { this.parse = () => { const visitor = new visitor_1.TypeScriptVisitor(this.source); - const root = walk_1.default(this.tree.rootNode); + const root = walk_1.default(this.tree_.rootNode); // console.time('visit') root.visit(visitor); // console.timeEnd('visit') @@ -32,8 +32,8 @@ class TypeScriptParser { this.tree_ = this.parser.parse(this.source.text); } get tree() { - return this.tree; + return this.tree_; } } exports.default = TypeScriptParser; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy90eXBlc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNDO0FBQ3RDLHFEQUFxRDtBQUdyRCwyQ0FBb0M7QUFDcEMsdUNBQThDO0FBSTlDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFxQixnQkFBZ0I7SUFLbkMsWUFBWSxNQUFjLEVBQUUsT0FBWTtRQU94QyxVQUFLLEdBQUcsR0FBRyxFQUFFO1lBQ1gsTUFBTSxPQUFPLEdBQUcsSUFBSSwyQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbkQsTUFBTSxJQUFJLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEMsd0JBQXdCO1lBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDbkIsMkJBQTJCO1lBQzNCLE9BQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzFCLENBQUMsQ0FBQTtRQWJDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQVVELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0NBQ0Y7QUF4QkQsbUNBd0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcclxuaW1wb3J0ICogYXMgVHlwZVNjcmlwdCBmcm9tICd0cmVlLXNpdHRlci10eXBlc2NyaXB0JztcclxuaW1wb3J0IFBhcnNlckludGVyZmFjZSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL1BhcnNlckludGVyZmFjZSc7XHJcbmltcG9ydCBTb3VyY2UgZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2UnO1xyXG5pbXBvcnQgd2FsayBmcm9tICcuLi8uLi91dGlscy93YWxrJztcclxuaW1wb3J0IHsgVHlwZVNjcmlwdFZpc2l0b3IgfSBmcm9tICcuL3Zpc2l0b3InO1xyXG5pbXBvcnQgbG9nIGZyb20gJy4uLy4uL3V0aWxzL2xvZyc7XHJcblxyXG5cclxuLyoqXHJcbiAqIEEgY2xhc3MgdGhhdCBwYXJzZXMgSmF2YVNjcmlwdCBjb21tZW50cy5cclxuICogXHJcbiAqICMgQVBJXHJcbiAqIFxyXG4gKiBgYGBcclxuICogQGNsYXNzIEphdmFTY3JpcHRQYXJzZXJcclxuICogQGltcGxlbWVudHMgSVBhcnNlclxyXG4gKiBAZXhwb3J0IGRlZmF1bHRcclxuICogYGBgXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUeXBlU2NyaXB0UGFyc2VyIGltcGxlbWVudHMgUGFyc2VySW50ZXJmYWNlIHtcclxuICBwcml2YXRlIHNvdXJjZTogU291cmNlO1xyXG4gIHByaXZhdGUgb3B0aW9uczogYW55O1xyXG4gIHByaXZhdGUgcGFyc2VyOiBQYXJzZXI7XHJcbiAgcHJpdmF0ZSB0cmVlXzogUGFyc2VyLlRyZWU7XHJcbiAgY29uc3RydWN0b3Ioc291cmNlOiBTb3VyY2UsIG9wdGlvbnM6IGFueSkge1xyXG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XHJcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucyA9IHt9LCBvcHRpb25zIHx8IHt9KTtcclxuICAgIHRoaXMucGFyc2VyID0gbmV3IFBhcnNlcigpO1xyXG4gICAgdGhpcy5wYXJzZXIuc2V0TGFuZ3VhZ2UoVHlwZVNjcmlwdCk7XHJcbiAgICB0aGlzLnRyZWVfID0gdGhpcy5wYXJzZXIucGFyc2UodGhpcy5zb3VyY2UudGV4dCk7XHJcbiAgfVxyXG4gIHBhcnNlID0gKCkgPT4ge1xyXG4gICAgY29uc3QgdmlzaXRvciA9IG5ldyBUeXBlU2NyaXB0VmlzaXRvcih0aGlzLnNvdXJjZSk7XHJcbiAgICBjb25zdCByb290ID0gd2Fsayh0aGlzLnRyZWUucm9vdE5vZGUpO1xyXG4gICAgLy8gY29uc29sZS50aW1lKCd2aXNpdCcpXHJcbiAgICByb290LnZpc2l0KHZpc2l0b3IpXHJcbiAgICAvLyBjb25zb2xlLnRpbWVFbmQoJ3Zpc2l0JylcclxuICAgIHJldHVybiB2aXNpdG9yLmdldEFTVCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRyZWUgKCk6IFBhcnNlci5UcmVlIHtcclxuICAgIHJldHVybiB0aGlzLnRyZWU7XHJcbiAgfVxyXG59XHJcbiJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy90eXBlc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNDO0FBQ3RDLHFEQUFxRDtBQUdyRCwyQ0FBb0M7QUFDcEMsdUNBQThDO0FBRzlDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFxQixnQkFBZ0I7SUFLbkMsWUFBWSxNQUFjLEVBQUUsT0FBWTtRQU94QyxVQUFLLEdBQUcsR0FBRyxFQUFFO1lBQ1gsTUFBTSxPQUFPLEdBQUcsSUFBSSwyQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbkQsTUFBTSxJQUFJLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdkMsd0JBQXdCO1lBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDbkIsMkJBQTJCO1lBQzNCLE9BQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzFCLENBQUMsQ0FBQTtRQWJDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQVVELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0NBQ0Y7QUF4QkQsbUNBd0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcbmltcG9ydCAqIGFzIFR5cGVTY3JpcHQgZnJvbSAndHJlZS1zaXR0ZXItdHlwZXNjcmlwdCc7XG5pbXBvcnQgUGFyc2VySW50ZXJmYWNlIGZyb20gJy4uLy4uL2ludGVyZmFjZXMvUGFyc2VySW50ZXJmYWNlJztcbmltcG9ydCBTb3VyY2UgZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2UnO1xuaW1wb3J0IHdhbGsgZnJvbSAnLi4vLi4vdXRpbHMvd2Fsayc7XG5pbXBvcnQgeyBUeXBlU2NyaXB0VmlzaXRvciB9IGZyb20gJy4vdmlzaXRvcic7XG5cblxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgcGFyc2VzIEphdmFTY3JpcHQgY29tbWVudHMuXG4gKiBcbiAqICMgQVBJXG4gKiBcbiAqIGBgYFxuICogQGNsYXNzIEphdmFTY3JpcHRQYXJzZXJcbiAqIEBpbXBsZW1lbnRzIElQYXJzZXJcbiAqIEBleHBvcnQgZGVmYXVsdFxuICogYGBgXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFR5cGVTY3JpcHRQYXJzZXIgaW1wbGVtZW50cyBQYXJzZXJJbnRlcmZhY2Uge1xuICBwcml2YXRlIHNvdXJjZTogU291cmNlO1xuICBwcml2YXRlIG9wdGlvbnM6IGFueTtcbiAgcHJpdmF0ZSBwYXJzZXI6IFBhcnNlcjtcbiAgcHJpdmF0ZSB0cmVlXzogUGFyc2VyLlRyZWU7XG4gIGNvbnN0cnVjdG9yKHNvdXJjZTogU291cmNlLCBvcHRpb25zOiBhbnkpIHtcbiAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucyA9IHt9LCBvcHRpb25zIHx8IHt9KTtcbiAgICB0aGlzLnBhcnNlciA9IG5ldyBQYXJzZXIoKTtcbiAgICB0aGlzLnBhcnNlci5zZXRMYW5ndWFnZShUeXBlU2NyaXB0KTtcbiAgICB0aGlzLnRyZWVfID0gdGhpcy5wYXJzZXIucGFyc2UodGhpcy5zb3VyY2UudGV4dCk7XG4gIH1cbiAgcGFyc2UgPSAoKSA9PiB7XG4gICAgY29uc3QgdmlzaXRvciA9IG5ldyBUeXBlU2NyaXB0VmlzaXRvcih0aGlzLnNvdXJjZSk7XG4gICAgY29uc3Qgcm9vdCA9IHdhbGsodGhpcy50cmVlXy5yb290Tm9kZSk7XG4gICAgLy8gY29uc29sZS50aW1lKCd2aXNpdCcpXG4gICAgcm9vdC52aXNpdCh2aXNpdG9yKVxuICAgIC8vIGNvbnNvbGUudGltZUVuZCgndmlzaXQnKVxuICAgIHJldHVybiB2aXNpdG9yLmdldEFTVCgpO1xuICB9XG5cbiAgZ2V0IHRyZWUgKCk6IFBhcnNlci5UcmVlIHtcbiAgICByZXR1cm4gdGhpcy50cmVlXztcbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/build/src/lang/typescript/visitor.js b/build/src/lang/typescript/visitor.js index 2916aaf..a1eaa83 100644 --- a/build/src/lang/typescript/visitor.js +++ b/build/src/lang/typescript/visitor.js @@ -26,13 +26,13 @@ class TypeScriptVisitor { break; default: /* Match other non-terminals */ - if (match_1.default(node, 'constraint', 'formal_parameters', 'required_parameter', 'rest_parameter', 'type_identifier', 'type_parameters', 'type_parameter', 'type_annotation', 'object_type', 'predefined_type', 'parenthesized_type', 'literal_type', 'intersection_type', 'union_type', 'class_body', 'extends_clause', 'unary_expression', 'binary_expression', 'statement_block', 'return_statement', 'export_statement', 'expression_statement', + if (match_1.default(node, 'constraint', 'formal_parameters', 'required_parameter', 'rest_parameter', 'type_identifier', 'type_parameters', 'type_parameter', 'type_annotation', 'object_type', 'predefined_type', 'parenthesized_type', 'literal_type', 'intersection_type', 'union_type', 'class_body', 'extends_clause', 'unary_expression', 'binary_expression', 'member_expression', 'statement_block', 'return_statement', 'export_statement', 'expression_statement', // A call_signature can also be a non-contextual node - 'call_signature', 'internal_module')) { + 'call_signature', 'internal_module', 'variable_declarator', 'object')) { return this.visitNonTerminal(node, properties); } /* Match terminals */ - if (match_1.default(node, 'identifier', 'extends', 'property_identifier', 'accessibility_modifier', 'string', 'void', 'boolean', 'null', 'undefined', 'number', 'return', 'get', 'function', 'namespace')) { + if (match_1.default(node, 'identifier', 'extends', 'property_identifier', 'accessibility_modifier', 'string', 'void', 'boolean', 'null', 'undefined', 'number', 'return', 'get', 'function', 'namespace', 'const')) { return this.visitTerminal(node); } log_1.default.report(this.source, node, log_1.ErrorType.NodeTypeNotYetSupported); @@ -80,8 +80,8 @@ class TypeScriptVisitor { for (let i = 0; i < exports.length; i++) { const export_ = exports[i]; const context = comment.context; - for (let j = 0; j < context.children.length; j++) { - if (context.children[i].type === export_.type) { + for (let j = 0; context && j < context.children.length; j++) { + if (context.children[i] && context.children[i].type === export_.type) { matched[getStartLocation(export_)] = true; comment.context.properties = Object.assign(comment.context.properties || {}, export_.properties); } @@ -94,7 +94,7 @@ class TypeScriptVisitor { return [].concat(comments).concat(namespaces).concat(exports); }; this.visitComment = (node) => { - if (comment_1.isJavaDocComment(this.source, node)) { + if (comment_1.isJavaDocComment(this.source, node) && !comment_1.isLegalComment(this.source, node)) { const nextSibling = sibling_1.sibling(node); if (nextSibling) { return ast_1.createASTNode(this.source, node, this.visitContext(nextSibling, {}), true); @@ -123,6 +123,7 @@ class TypeScriptVisitor { case 'property_signature': case 'public_field_definition': case 'method_definition': + case 'lexical_declaration': return this.visitNonTerminal(node, properties); default: log_1.default.report(this.source, node, log_1.ErrorType.NodeTypeNotYetSupported); @@ -148,7 +149,11 @@ class TypeScriptVisitor { if (match_1.default(child, 'internal_module')) { return this.visitInternalModule(child, properties); } - return this.visitNonTerminal(node); + if (match_1.default(child, 'function')) { + if (properties) + return this.visitContext(child, properties); + } + return this.visitNonTerminal(child); }; /* Modules */ this.visitInternalModule = (node, properties) => { @@ -204,6 +209,10 @@ class TypeScriptVisitor { if (match_1.default(node, 'expression_statement')) { return this.visitExpressionStatement(node, properties); } + if (match_1.default(node, 'function')) { + _.remove(children, child => match_1.default(child, 'statement_block')); + return ast_1.createASTNode(this.source, node, this.visitChildren(children), properties); + } return ast_1.createASTNode(this.source, node, this.visitChildren(children), properties); }; /* Terminals */ @@ -271,4 +280,4 @@ class TypeScriptVisitor { } } exports.TypeScriptVisitor = TypeScriptVisitor; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHVDQUF1RDtBQUN2RCxpREFBdUQ7QUFHdkQsaURBQThDO0FBRTlDLDRCQUE0QjtBQUM1Qix5Q0FBaUQ7QUFDakQsNkNBQXNDO0FBR3RDOztHQUVHO0FBQ0gsTUFBYSxpQkFBaUI7SUFHNUIsWUFBWSxNQUFjO1FBRmxCLFFBQUcsR0FBYyxFQUFFLENBQUE7UUFxRTNCLGVBQWU7UUFFZixjQUFTLEdBQUcsQ0FDVixJQUFnQixFQUNoQixVQUFvQyxFQUNwQyxFQUFFO1lBQ0YsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNqQixLQUFLLFNBQVM7b0JBQ1osSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNuQyxNQUFNO2dCQUNSLEtBQUssU0FBUztvQkFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pDLEtBQUssU0FBUyxDQUFDO2dCQUNmLEtBQUssT0FBTztvQkFDVixhQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO29CQUM5RCxNQUFNO2dCQUNSO29CQUVFLCtCQUErQjtvQkFFL0IsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUNaLFlBQVksRUFDWixtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFDM0QsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQ3pFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQ3RFLG1CQUFtQixFQUFFLFlBQVksRUFDakMsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixrQkFBa0Is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LE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM3QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksZUFBSyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDdEIsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN0QjtTQUNGO1FBQ0QsZ0NBQWdDO1FBQ2hDLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxNQUFNO1FBQ0osT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2xCLENBQUM7Q0FrUUY7QUF0VUQsOENBc1VDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlQVNUTm9kZSwgQVNUTm9kZSB9IGZyb20gXCIuLi9jb21tb24vYXN0XCI7XHJcbmltcG9ydCB7IGlzSmF2YURvY0NvbW1lbnQgfSBmcm9tIFwiLi4vLi4vdXRpbHMvY29tbWVudFwiO1xyXG5pbXBvcnQgeyBOb2RlUHJvcGVydGllcywgTm9kZUluaGVyaXRhbmNlIH0gZnJvbSBcIi4uL2NvbW1vbi9lbWNhXCI7XHJcbmltcG9ydCB7IE5vZGVWaXNpdG9yIH0gZnJvbSBcIi4uL2NvbW1vbi9ub2RlXCI7XHJcbmltcG9ydCB7IHNpYmxpbmcgfSBmcm9tIFwiLi4vLi4vdXRpbHMvc2libGluZ1wiO1xyXG5pbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XHJcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcclxuaW1wb3J0IGxvZywgeyBFcnJvclR5cGUgfSBmcm9tIFwiLi4vLi4vdXRpbHMvbG9nXCI7XHJcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi4vLi4vdXRpbHMvbWF0Y2hcIjtcclxuaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2VcIjtcclxuXHJcbi8qKlxyXG4gKiBBIGNsYXNzIHRoYXQgdmlzaXRzIEFTVE5vZGVzIGZyb20gYSBUeXBlU2NyaXB0IHRyZWUuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVHlwZVNjcmlwdFZpc2l0b3IgaW1wbGVtZW50cyBOb2RlVmlzaXRvciB7XHJcbiAgcHJpdmF0ZSBhc3Q6IEFTVE5vZGVbXSA9IFtdXHJcbiAgcHJpdmF0ZSBzb3VyY2U6IFNvdXJjZVxyXG4gIGNvbnN0cnVjdG9yKHNvdXJjZTogU291cmNlKSB7XHJcbiAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgd2hldGhlciBhIG5vZGUgaGFzIGluaGVyaXRhbmNlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoYXNJbmhlcml0YW5jZShub2RlOiBTeW50YXhOb2RlKSB7XHJcbiAgICBsZXQgaW5oZXJpdHMgPSBmYWxzZTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XHJcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ2V4dGVuZHMnLCAnaW1wbGVtZW50cycpKSB7XHJcbiAgICAgICAgaW5oZXJpdHMgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaW5oZXJpdHNcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBub2RlJ3MgaW5oZXJpdGFuY2UgdHlwZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0SW5oZXJpdGFuY2VUeXBlKG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XHJcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ2V4dGVuZHMnKSkge1xyXG4gICAgICAgIHJldHVybiAnZXh0ZW5kcyc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ2ltcGxlbWVudHMnKSkge1xyXG4gICAgICAgIHJldHVybiAnaW1wbGVtZW50cyc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgd2hldGhlciBhbiBleHBvcnQgaXMgZGVmYXVsdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgaGFzRGVmYXVsdEV4cG9ydChub2RlOiBTeW50YXhOb2RlKTogYm9vbGVhbiB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xyXG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdkZWZhdWx0JykpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBvbmx5IHRoZSBjb21tZW50cyBmcm9tIGEgbm9kZSdzIGNoaWxkcmVuLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZmlsdGVyVHlwZShub2RlOiBTeW50YXhOb2RlLCB0eXBlOiBzdHJpbmcpOiBTeW50YXhOb2RlW10ge1xyXG4gICAgLy8gY29uc29sZS50aW1lKCdmaWx0ZXJUeXBlJylcclxuICAgIGxldCBjaGlsZHJlbjogU3ludGF4Tm9kZVtdID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xyXG4gICAgICBpZiAobWF0Y2goY2hpbGQsIHR5cGUpKSB7XHJcbiAgICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGNvbnNvbGUudGltZUVuZCgnZmlsdGVyVHlwZScpXHJcbiAgICByZXR1cm4gY2hpbGRyZW47XHJcbiAgfVxyXG5cclxuICBnZXRBU1QoKTogQVNUTm9kZVtdIHtcclxuICAgIHJldHVybiB0aGlzLmFzdDtcclxuICB9XHJcblxyXG4gIC8qIFZpc2l0b3JzICAqL1xyXG5cclxuICB2aXNpdE5vZGUgPSAoXHJcbiAgICBub2RlOiBTeW50YXhOb2RlLFxyXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+XHJcbiAgKSA9PiB7XHJcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xyXG4gICAgICBjYXNlICdwcm9ncmFtJzpcclxuICAgICAgICB0aGlzLmFzdCA9IHRoaXMudmlzaXRQcm9ncmFtKG5vZGUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdjb21tZW50JzpcclxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdENvbW1lbnQobm9kZSk7XHJcbiAgICAgIGNhc2UgJ01JU1NJTkcnOlxyXG4gICAgICBjYXNlICdFUlJPUic6XHJcbiAgICAgICAgbG9nLnJlcG9ydCh0aGlzLnNvdXJjZSwgbm9kZSwgRXJyb3JUeXBlLlRyZWVTaXR0ZXJQYXJzZUVycm9yKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuXHJcbiAgICAgICAgLyogTWF0Y2ggb3RoZXIgbm9uLXRlcm1pbmFscyAqL1xyXG5cclxuICAgICAgICBpZiAobWF0Y2gobm9kZSxcclxuICAgICAgICAgICdjb25zdHJhaW50JyxcclxuICAgICAgICAgICdmb3JtYWxfcGFyYW1ldGVycycsICdyZXF1aXJlZF9wYXJhbWV0ZXInLCAncmVzdF9wYXJhbWV0ZXInLFxyXG4gICAgICAgICAgJ3R5cGVfaWRlbnRpZmllcicsICd0eXBlX3BhcmFtZXRlcnMnLCAndHlwZV9wYXJhbWV0ZXInLCAndHlwZV9hbm5vdGF0aW9uJyxcclxuICAgICAgICAgICdvYmplY3RfdHlwZScsICdwcmVkZWZpbmVkX3R5cGUnLCAncGFyZW50aGVzaXplZF90eXBlJywgJ2xpdGVyYWxfdHlwZScsXHJcbiAgICAgICAgICAnaW50ZXJzZWN0aW9uX3R5cGUnLCAndW5pb25fdHlwZScsXHJcbiAgICAgICAgICAnY2xhc3NfYm9keScsXHJcbiAgICAgICAgICAnZXh0ZW5kc19jbGF1c2UnLFxyXG4gICAgICAgICAgJ3VuYXJ5X2V4cHJlc3Npb24nLCAnYmluYXJ5X2V4cHJlc3Npb24nLFxyXG4gICAgICAgICAgJ3N0YXRlbWVudF9ibG9jaycsICdyZXR1cm5fc3RhdGVtZW50JywgJ2V4cG9ydF9zdGF0ZW1lbnQnLCAnZXhwcmVzc2lvbl9zdGF0ZW1lbnQnLFxyXG4gICAgICAgICAgLy8gQSBjYWxsX3NpZ25hdHVyZSBjYW4gYWxzbyBiZSBhIG5vbi1jb250ZXh0dWFsIG5vZGVcclxuICAgICAgICAgICdjYWxsX3NpZ25hdHVyZScsXHJcbiAgICAgICAgICAnaW50ZXJuYWxfbW9kdWxlJ1xyXG4gICAgICAgICkpIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLnZpc2l0Tm9uVGVybWluYWwobm9kZSwgcHJvcGVydGllcylcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIE1hdGNoIHRlcm1pbmFscyAqL1xyXG4gICAgICAgIGlmIChtYXRjaChub2RlLFxyXG4gICAgICAgICAgJ2lkZW50aWZpZXInLCAnZXh0ZW5kcycsICdwcm9wZXJ0eV9pZGVudGlmaWVyJywgJ2FjY2Vzc2liaWxpdHlfbW9kaWZpZXInLFxyXG4gICAgICAgICAgJ3N0cmluZycsICd2b2lkJywgJ2Jvb2xlYW4nLCAnbnVsbCcsICd1bmRlZmluZWQnLCAnbnVtYmVyJywgJ3JldHVybicsXHJcbiAgICAgICAgICAnZ2V0JywgJ2Z1bmN0aW9uJywgJ25hbWVzcGFjZSdcclxuICAgICAgICApKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdFRlcm1pbmFsKG5vZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdmlzaXRDaGlsZHJlbiA9IChub2RlczogU3ludGF4Tm9kZVtdKTogQVNUTm9kZVtdID0+IHtcclxuICAgIGxldCBjaGlsZHJlbjogQVNUTm9kZVtdID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpXTtcclxuICAgICAgaWYgKCFub2RlLnR5cGUubWF0Y2goL1s8Pigpe30sOjtcXFtcXF0mfD1cXCtcXC1cXCpcXC9dLykgJiYgbm9kZS50eXBlICE9PSAnLi4uJykge1xyXG4gICAgICAgIGNvbnN0IGNoaWxkID0gdGhpcy52aXNpdE5vZGUobm9kZSk7XHJcbiAgICAgICAgaWYgKGNoaWxkKSBjaGlsZHJlbi5wdXNoKGNoaWxkKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNoaWxkcmVuO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB2aXNpdFByb2dyYW0gPSAobm9kZTogU3ludGF4Tm9kZSk6IEFTVE5vZGVbXSA9PiB7XHJcbiAgICBsZXQgdmlzaXRlZCA9IHt9LFxyXG4gICAgICBnZXRTdGFydExvY2F0aW9uID0gKG46IEFTVE5vZGUpID0+IGAke24ubG9jYXRpb24ucm93LnN0YXJ0fToke24ubG9jYXRpb24uY29sdW1uLnN0YXJ0fWA7XHJcbiAgICAvLyBBIHByb2dyYW0gY2FuIGhhdmUgbW9kdWxlcywgbmFtZXNwYWNlcywgY29tbWVudHMgYXMgaXRzIGNoaWxkcmVuXHJcbiAgICAvLyBUaGUgZmlyc3Qgc3RlcCBpcyB0byBwYXJzZSBhbGwgdGhlIGNvbW1lbnRzIGluIHRoZSByb290IG5vZGVcclxuICAgIGxldCBjb21tZW50cyA9IHRoaXMudmlzaXRDaGlsZHJlbih0aGlzLmZpbHRlclR5cGUobm9kZSwgJ2NvbW1lbnQnKSk7XHJcbiAgICAvLyBQYXJzZSB0aGUgbmFtZXNwYWNlcyBpbiBleHByZXNzaW9uX3N0YXRlbWVudFxyXG4gICAgbGV0IG5hbWVzcGFjZXMgPSB0aGlzLnZpc2l0Q2hpbGRyZW4odGhpcy5maWx0ZXJUeXBlKG5vZGUsICdleHByZXNzaW9uX3N0YXRlbWVudCcpKTtcclxuICAgIC8vIFBhcnNlIHRoZSBleHBvcnQgc3RhdGVtZW50cyBpbiB0aGUgcm9vdCBub2RlXHJcbiAgICBsZXQgZXhwb3J0cyA9IHRoaXMudmlzaXRDaGlsZHJlbih0aGlzLmZpbHRlclR5cGUobm9kZSwgJ2V4cG9ydF9zdGF0ZW1lbnQnKSk7XHJcblxyXG4gICAgLy8gR2V0IHRoZSB2aXNpdGVkIGNvbnRleHQgbm9kZXNcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgY29tbWVudCA9IGNvbW1lbnRzW2ldO1xyXG4gICAgICBjb25zdCBjb250ZXh0ID0gY29tbWVudDtcclxuICAgICAgdmlzaXRlZFtnZXRTdGFydExvY2F0aW9uKGNvbnRleHQpXSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVtb3ZlIHRoZSB2aXNpdGVkIG5vZGVzIGZyb20gbmFtZXNwYWNlcyBhcnJheVxyXG4gICAgXy5yZW1vdmUobmFtZXNwYWNlcywgeCA9PiB2aXNpdGVkW2dldFN0YXJ0TG9jYXRpb24oeCldKTtcclxuXHJcbiAgICAvLyBFeHBvcnRzIGFyZSBvZGRiYWxscyBzaW5jZSBzb21lIGV4cG9ydHMgbWF5IHJlZmVyZW5jZVxyXG4gICAgLy8gYSB0eXBlL25vZGUgdGhhdCBtYXkgaGF2ZSBiZWVuIGNvbW1lbnRlZC5cclxuICAgIC8vIFdlJ2xsIGZpcnN0IG5lZWQgdG8gZmlsdGVyIHRoZSBvbmVzIHdlIGhhdmUgdmlzaXRlZFxyXG4gICAgXy5yZW1vdmUoZXhwb3J0cywgeCA9PiB2aXNpdGVkW2dldFN0YXJ0TG9jYXRpb24oeCldKTtcclxuXHJcbiAgICAvLyBGcm9tIHRoZSBvbmVzIHdlIGhhdmUgbm90IHZpc2l0ZWQsIHdlJ2xsIG5lZWQgdG8gbW9kaWZ5XHJcbiAgICAvLyB0aGUgbm9kZSBwcm9wZXJ0aWVzIG9mIGVhY2ggY29udGV4dCBpbiBhIGNvbW1lbnQgbm9kZSB0aGF0XHJcbiAgICAvLyBtYXRjaGVzIHRoZSBvbmVzIHdlIGhhdmUgbm90IHZpc2l0ZWQuXHJcbiAgICBjb25zdCBtYXRjaGVkID0ge307XHJcbiAgICBjb21tZW50cyA9IF8uY29tcGFjdChcclxuICAgICAgY29tbWVudHMubWFwKGNvbW1lbnQgPT4ge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwb3J0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgY29uc3QgZXhwb3J0XyA9IGV4cG9ydHNbaV07XHJcbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0gY29tbWVudC5jb250ZXh0O1xyXG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb250ZXh0LmNoaWxkcmVuLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgIGlmIChjb250ZXh0LmNoaWxkcmVuW2ldLnR5cGUgPT09IGV4cG9ydF8udHlwZSkge1xyXG4gICAgICAgICAgICAgIG1hdGNoZWRbZ2V0U3RhcnRMb2NhdGlvbihleHBvcnRfKV0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGNvbW1lbnQuY29udGV4dC5wcm9wZXJ0aWVzID0gT2JqZWN0LmFzc2lnbihcclxuICAgICAgICAgICAgICAgIGNvbW1lbnQuY29udGV4dC5wcm9wZXJ0aWVzIHx8IHt9LFxyXG4gICAgICAgICAgICAgICAgZXhwb3J0Xy5wcm9wZXJ0aWVzXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29tbWVudDtcclxuICAgICAgfSkpO1xyXG5cclxuICAgIC8vIFJlbW92ZWQgdGhlIG1hdGNoZWQgZXhwb3J0c1xyXG4gICAgXy5yZW1vdmUoZXhwb3J0cywgeCA9PiBtYXRjaGVkW2dldFN0YXJ0TG9jYXRpb24oeCldKVxyXG5cclxuICAgIHJldHVybiBbXS5jb25jYXQoY29tbWVudHMpLmNvbmNhdChuYW1lc3BhY2VzKS5jb25jYXQoZXhwb3J0cyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHZpc2l0Q29tbWVudCA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZSA9PiB7XHJcbiAgICBpZiAoaXNKYXZhRG9jQ29tbWVudCh0aGlzLnNvdXJjZSwgbm9kZSkpIHtcclxuICAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSBzaWJsaW5nKG5vZGUpO1xyXG4gICAgICBpZiAobmV4dFNpYmxpbmcpIHtcclxuICAgICAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENvbnRleHQobmV4dFNpYmxpbmcsIHt9KSwgdHJ1ZSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmlzaXQgdGhlIGNvbnRleHR1YWwgbm9kZVxyXG4gICAqIFxyXG4gICAqICMgUmVtYXJrXHJcbiAgICogXHJcbiAgICogQSBub2RlIGlzIGNvbnNpZGVyZWQgY29udGV4dHVhbCB3aGVuIGEgY29tbWVudCBpcyB2aXNpdGVkIGFuZCB0aGUgbm9kZSBpcyBpdHMgc2libGluZy5cclxuICAgKi9cclxuICBwcml2YXRlIHZpc2l0Q29udGV4dCA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcclxuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XHJcbiAgICAgIGNhc2UgJ2V4cG9ydF9zdGF0ZW1lbnQnOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0RXhwb3J0U3RhdGVtZW50KG5vZGUsIHByb3BlcnRpZXMpO1xyXG4gICAgICBjYXNlICdleHByZXNzaW9uX3N0YXRlbWVudCc6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KG5vZGUsIHByb3BlcnRpZXMpO1xyXG4gICAgICBjYXNlICdjbGFzcyc6XHJcbiAgICAgIGNhc2UgJ2ludGVyZmFjZV9kZWNsYXJhdGlvbic6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRDbGFzc09ySW50ZXJmYWNlKG5vZGUsIHByb3BlcnRpZXMpXHJcbiAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcclxuICAgICAgY2FzZSAnY2FsbF9zaWduYXR1cmUnOlxyXG4gICAgICBjYXNlICdtZXRob2Rfc2lnbmF0dXJlJzpcclxuICAgICAgY2FzZSAncHJvcGVydHlfc2lnbmF0dXJlJzpcclxuICAgICAgY2FzZSAncHVibGljX2ZpZWxkX2RlZmluaXRpb24nOlxyXG4gICAgICBjYXNlICdtZXRob2RfZGVmaW5pdGlvbic6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXROb25UZXJtaW5hbChub2RlLCBwcm9wZXJ0aWVzKTtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyogU3RhdGVtZW50cyAqL1xyXG5cclxuICBwcml2YXRlIHZpc2l0RXhwb3J0U3RhdGVtZW50ID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xyXG4gICAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiwgZGVmYXVsdEV4cG9ydCA9IGZhbHNlO1xyXG4gICAgLy8gUmVtb3ZlICdleHBvcnQnIHNpbmNlIGl0J3MgYWx3YXlzIGZpcnN0IGluIHRoZSBhcnJheVxyXG4gICAgY2hpbGRyZW4uc2hpZnQoKTtcclxuICAgIGlmICh0aGlzLmhhc0RlZmF1bHRFeHBvcnQobm9kZSkpIHtcclxuICAgICAgZGVmYXVsdEV4cG9ydCA9IHRydWU7XHJcbiAgICAgIC8vIFJlbW92ZSAnZGVmYXVsdCcgZXhwb3J0XHJcbiAgICAgIGNoaWxkcmVuLnNoaWZ0KCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuLnNoaWZ0KCk7XHJcbiAgICByZXR1cm4gdGhpcy52aXNpdE5vZGUoY2hpbGQsIHsgZXhwb3J0czogeyBleHBvcnQ6IHRydWUsIGRlZmF1bHQ6IGRlZmF1bHRFeHBvcnQgfSB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50ID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM6IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XHJcbiAgICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xyXG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbi5zaGlmdCgpO1xyXG4gICAgaWYgKG1hdGNoKGNoaWxkLCAnaW50ZXJuYWxfbW9kdWxlJykpIHtcclxuICAgICAgcmV0dXJuIHRoaXMudmlzaXRJbnRlcm5hbE1vZHVsZShjaGlsZCwgcHJvcGVydGllcylcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnZpc2l0Tm9uVGVybWluYWwobm9kZSk7XHJcbiAgfVxyXG5cclxuICAvKiBNb2R1bGVzICovXHJcblxyXG4gIHByaXZhdGUgdmlzaXRJbnRlcm5hbE1vZHVsZSA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcclxuICAgIGxldCBjaGlsZHJlbjogQVNUTm9kZVtdID0gbm9kZS5jaGlsZHJlbi5tYXAoY2hpbGQgPT4ge1xyXG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdzdGF0ZW1lbnRfYmxvY2snKSkge1xyXG4gICAgICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q2hpbGRyZW4odGhpcy5maWx0ZXJUeXBlKGNoaWxkLCAnY29tbWVudCcpKSlcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy52aXNpdE5vZGUoY2hpbGQpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgY2hpbGRyZW4sIE9iamVjdC5hc3NpZ24ocHJvcGVydGllcyB8fCB7fSwgeyBuYW1lc3BhY2U6IHRydWUgfSkpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qIERlY2xhcmF0aW9ucyAqL1xyXG5cclxuICBwcml2YXRlIHZpc2l0Q2xhc3NPckludGVyZmFjZSA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcclxuICAgIC8vIFNpbmNlICdpbnRlcmZhY2UnIG9yICdjbGFzcycgaXMgYWx3YXlzIGZpcnN0IGluIHRoZSBhcnJheVxyXG4gICAgLy8gd2UnbGwgbmVlZCB0byByZW1vdmUgaXQgZnJvbSB0aGUgYXJyYXkuXHJcbiAgICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xyXG4gICAgY29uc3QgaW50ZXJmYWNlXyA9IGNoaWxkcmVuLnNoaWZ0KCk7XHJcbiAgICBsZXQgZXh0ZW5kc18gPSBmYWxzZSwgaW1wbGVtZW50c18gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLmhhc0luaGVyaXRhbmNlKG5vZGUpKSB7XHJcbiAgICAgIGNvbnN0IGluaGVyaXRhbmNlID0gdGhpcy5nZXRJbmhlcml0YW5jZVR5cGUobm9kZSlcclxuICAgICAgZXh0ZW5kc18gPSBpbmhlcml0YW5jZSA9PT0gJ2V4dGVuZHMnO1xyXG4gICAgICBpbXBsZW1lbnRzXyA9IGluaGVyaXRhbmNlID09PSAnaW1wbGVtZW50cyc7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgbm9kZV8gPSBjcmVhdGVBU1ROb2RlKFxyXG4gICAgICB0aGlzLnNvdXJjZSxcclxuICAgICAgbm9kZSxcclxuICAgICAgdGhpcy52aXNpdENoaWxkcmVuKGNoaWxkcmVuKSxcclxuICAgICAgT2JqZWN0LmFzc2lnbihwcm9wZXJ0aWVzIHx8IHt9LCB7XHJcbiAgICAgICAgaW5oZXJpdGFuY2U6IHtcclxuICAgICAgICAgIGltcGxlbWVudHM6IGltcGxlbWVudHNfLFxyXG4gICAgICAgICAgZXh0ZW5kczogZXh0ZW5kc19cclxuICAgICAgICB9IGFzIE5vZGVJbmhlcml0YW5jZVxyXG4gICAgICB9KSk7XHJcblxyXG4gICAgaWYgKG1hdGNoKG5vZGUsICdjbGFzcycpKSB7XHJcbiAgICAgIHJldHVybiBub2RlXztcclxuICAgIH1cclxuICAgIC8vIE92ZXJ3cml0ZSB0aGUgbm9kZSB0eXBlIGZyb20gJ2ludGVyZmFjZV9kZWNsYXJhdGlvbicgdG8gJ2ludGVyZmFjZSdcclxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5vZGVfLCB7IHR5cGU6IGludGVyZmFjZV8udHlwZSB9KVxyXG4gIH1cclxuXHJcbiAgLyogTm9uLXRlcm1pbmFscyAqL1xyXG5cclxuICBwcml2YXRlIHZpc2l0Tm9uVGVybWluYWwgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XHJcbiAgICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xyXG4gICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZXMgd2hlcmUgc29tZSBub24tdGVybWluYWxzXHJcbiAgICAvLyBjb250YWluIGNvbW1lbnRzIHdoaWNoIGlzIHdoYXQgd2UgY2FyZSBhYm91dFxyXG4gICAgaWYgKG1hdGNoKG5vZGUsICdjbGFzc19ib2R5JywgJ29iamVjdF90eXBlJykpIHtcclxuICAgICAgY2hpbGRyZW4gPSB0aGlzLmZpbHRlclR5cGUobm9kZSwgJ2NvbW1lbnQnKTtcclxuICAgIH1cclxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2VzIHdoZXJlIGV4cG9ydCBzdGF0ZW1lbnRzIGhhdmUgbm9kZSBwcm9wZXJ0aWVzXHJcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2V4cG9ydF9zdGF0ZW1lbnQnKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy52aXNpdEV4cG9ydFN0YXRlbWVudChub2RlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBhbiBpbnRlcm5hbCBtb2R1bGUgY29udGFpbnMgb3RoZXIgbm9kZXNcclxuICAgIGlmIChtYXRjaChub2RlLCAnaW50ZXJuYWxfbW9kdWxlJykpIHtcclxuICAgICAgcmV0dXJuIHRoaXMudmlzaXRJbnRlcm5hbE1vZHVsZShub2RlLCBwcm9wZXJ0aWVzKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBhbiBpbnRlcm1hbF9tb2R1bGUgY2FuIGV4aXN0IGluIGFuIGV4cHJlc3Npb25fc3RhdGVtZW50XHJcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2V4cHJlc3Npb25fc3RhdGVtZW50JykpIHtcclxuICAgICAgcmV0dXJuIHRoaXMudmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KG5vZGUsIHByb3BlcnRpZXMpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENoaWxkcmVuKGNoaWxkcmVuKSwgcHJvcGVydGllcyk7XHJcbiAgfVxyXG5cclxuICAvKiBUZXJtaW5hbHMgKi9cclxuXHJcbiAgcHJpdmF0ZSB2aXNpdFRlcm1pbmFsID0gKG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlID0+IHtcclxuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlKVxyXG4gIH1cclxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHVDQUF1RDtBQUN2RCxpREFBdUU7QUFHdkUsaURBQThDO0FBRTlDLDRCQUE0QjtBQUM1Qix5Q0FBaUQ7QUFDakQsNkNBQXNDO0FBR3RDOztHQUVHO0FBQ0gsTUFBYSxpQkFBaUI7SUFHNUIsWUFBWSxNQUFjO1FBRmxCLFFBQUcsR0FBYyxFQUFFLENBQUE7UUFxRTNCLGVBQWU7UUFFZixjQUFTLEdBQUcsQ0FDVixJQUFnQixFQUNoQixVQUFvQyxFQUNwQyxFQUFFO1lBQ0YsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNqQixLQUFLLFNBQVM7b0JBQ1osSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNuQyxNQUFNO2dCQUNSLEtBQUssU0FBUztvQkFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pDLEtBQUssU0FBUyxDQUFDO2dCQUNmLEtBQUssT0FBTztvQkFDVixhQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO29CQUM5RCxNQUFNO2dCQUNSO29CQUVFLCtCQUErQjtvQkFFL0IsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUNaLFlBQVksRUFDWixtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFDM0QsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQ3pFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQ3RFLG1CQUFtQixFQUFFLFlBQVksRUFDakMsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixrQkFBa0Is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L2NvbW1vbi9hc3RcIjtcbmltcG9ydCB7IGlzSmF2YURvY0NvbW1lbnQsIGlzTGVnYWxDb21tZW50IH0gZnJvbSBcIi4uLy4uL3V0aWxzL2NvbW1lbnRcIjtcbmltcG9ydCB7IE5vZGVQcm9wZXJ0aWVzLCBOb2RlSW5oZXJpdGFuY2UgfSBmcm9tIFwiLi4vY29tbW9uL2VtY2FcIjtcbmltcG9ydCB7IE5vZGVWaXNpdG9yIH0gZnJvbSBcIi4uL2NvbW1vbi9ub2RlXCI7XG5pbXBvcnQgeyBzaWJsaW5nIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3NpYmxpbmdcIjtcbmltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBsb2csIHsgRXJyb3JUeXBlIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2xvZ1wiO1xuaW1wb3J0IG1hdGNoIGZyb20gXCIuLi8uLi91dGlscy9tYXRjaFwiO1xuaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2VcIjtcblxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgdmlzaXRzIEFTVE5vZGVzIGZyb20gYSBUeXBlU2NyaXB0IHRyZWUuXG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlU2NyaXB0VmlzaXRvciBpbXBsZW1lbnRzIE5vZGVWaXNpdG9yIHtcbiAgcHJpdmF0ZSBhc3Q6IEFTVE5vZGVbXSA9IFtdXG4gIHByaXZhdGUgc291cmNlOiBTb3VyY2VcbiAgY29uc3RydWN0b3Ioc291cmNlOiBTb3VyY2UpIHtcbiAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBub2RlIGhhcyBpbmhlcml0YW5jZVxuICAgKi9cbiAgcHJpdmF0ZSBoYXNJbmhlcml0YW5jZShub2RlOiBTeW50YXhOb2RlKSB7XG4gICAgbGV0IGluaGVyaXRzID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdleHRlbmRzJywgJ2ltcGxlbWVudHMnKSkge1xuICAgICAgICBpbmhlcml0cyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbmhlcml0c1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBub2RlJ3MgaW5oZXJpdGFuY2UgdHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRJbmhlcml0YW5jZVR5cGUobm9kZTogU3ludGF4Tm9kZSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgaWYgKG1hdGNoKGNoaWxkLCAnZXh0ZW5kcycpKSB7XG4gICAgICAgIHJldHVybiAnZXh0ZW5kcyc7XG4gICAgICB9XG5cbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ2ltcGxlbWVudHMnKSkge1xuICAgICAgICByZXR1cm4gJ2ltcGxlbWVudHMnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gZXhwb3J0IGlzIGRlZmF1bHRcbiAgICovXG4gIHByaXZhdGUgaGFzRGVmYXVsdEV4cG9ydChub2RlOiBTeW50YXhOb2RlKTogYm9vbGVhbiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdkZWZhdWx0JykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG9ubHkgdGhlIGNvbW1lbnRzIGZyb20gYSBub2RlJ3MgY2hpbGRyZW4uXG4gICAqL1xuICBwcml2YXRlIGZpbHRlclR5cGUobm9kZTogU3ludGF4Tm9kZSwgdHlwZTogc3RyaW5nKTogU3ludGF4Tm9kZVtdIHtcbiAgICAvLyBjb25zb2xlLnRpbWUoJ2ZpbHRlclR5cGUnKVxuICAgIGxldCBjaGlsZHJlbjogU3ludGF4Tm9kZVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XG4gICAgICBpZiAobWF0Y2goY2hpbGQsIHR5cGUpKSB7XG4gICAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBjb25zb2xlLnRpbWVFbmQoJ2ZpbHRlclR5cGUnKVxuICAgIHJldHVybiBjaGlsZHJlbjtcbiAgfVxuXG4gIGdldEFTVCgpOiBBU1ROb2RlW10ge1xuICAgIHJldHVybiB0aGlzLmFzdDtcbiAgfVxuXG4gIC8qIFZpc2l0b3JzICAqL1xuXG4gIHZpc2l0Tm9kZSA9IChcbiAgICBub2RlOiBTeW50YXhOb2RlLFxuICAgIHByb3BlcnRpZXM/OiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPlxuICApID0+IHtcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSAncHJvZ3JhbSc6XG4gICAgICAgIHRoaXMuYXN0ID0gdGhpcy52aXNpdFByb2dyYW0obm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY29tbWVudCc6XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0Q29tbWVudChub2RlKTtcbiAgICAgIGNhc2UgJ01JU1NJTkcnOlxuICAgICAgY2FzZSAnRVJST1InOlxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuVHJlZVNpdHRlclBhcnNlRXJyb3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG5cbiAgICAgICAgLyogTWF0Y2ggb3RoZXIgbm9uLXRlcm1pbmFscyAqL1xuXG4gICAgICAgIGlmIChtYXRjaChub2RlLFxuICAgICAgICAgICdjb25zdHJhaW50JyxcbiAgICAgICAgICAnZm9ybWFsX3BhcmFtZXRlcnMnLCAncmVxdWlyZWRfcGFyYW1ldGVyJywgJ3Jlc3RfcGFyYW1ldGVyJyxcbiAgICAgICAgICAndHlwZV9pZGVudGlmaWVyJywgJ3R5cGVfcGFyYW1ldGVycycsICd0eXBlX3BhcmFtZXRlcicsICd0eXBlX2Fubm90YXRpb24nLFxuICAgICAgICAgICdvYmplY3RfdHlwZScsICdwcmVkZWZpbmVkX3R5cGUnLCAncGFyZW50aGVzaXplZF90eXBlJywgJ2xpdGVyYWxfdHlwZScsXG4gICAgICAgICAgJ2ludGVyc2VjdGlvbl90eXBlJywgJ3VuaW9uX3R5cGUnLFxuICAgICAgICAgICdjbGFzc19ib2R5JyxcbiAgICAgICAgICAnZXh0ZW5kc19jbGF1c2UnLFxuICAgICAgICAgICd1bmFyeV9leHByZXNzaW9uJywgJ2JpbmFyeV9leHByZXNzaW9uJywgJ21lbWJlcl9leHByZXNzaW9uJyxcbiAgICAgICAgICAnc3RhdGVtZW50X2Jsb2NrJywgJ3JldHVybl9zdGF0ZW1lbnQnLCAnZXhwb3J0X3N0YXRlbWVudCcsICdleHByZXNzaW9uX3N0YXRlbWVudCcsXG4gICAgICAgICAgLy8gQSBjYWxsX3NpZ25hdHVyZSBjYW4gYWxzbyBiZSBhIG5vbi1jb250ZXh0dWFsIG5vZGVcbiAgICAgICAgICAnY2FsbF9zaWduYXR1cmUnLFxuICAgICAgICAgICdpbnRlcm5hbF9tb2R1bGUnLFxuICAgICAgICAgICd2YXJpYWJsZV9kZWNsYXJhdG9yJyxcbiAgICAgICAgICAnb2JqZWN0J1xuICAgICAgICApKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudmlzaXROb25UZXJtaW5hbChub2RlLCBwcm9wZXJ0aWVzKVxuICAgICAgICB9XG5cbiAgICAgICAgLyogTWF0Y2ggdGVybWluYWxzICovXG4gICAgICAgIGlmIChtYXRjaChub2RlLFxuICAgICAgICAgICdpZGVudGlmaWVyJywgJ2V4dGVuZHMnLCAncHJvcGVydHlfaWRlbnRpZmllcicsICdhY2Nlc3NpYmlsaXR5X21vZGlmaWVyJyxcbiAgICAgICAgICAnc3RyaW5nJywgJ3ZvaWQnLCAnYm9vbGVhbicsICdudWxsJywgJ3VuZGVmaW5lZCcsICdudW1iZXInLCAncmV0dXJuJyxcbiAgICAgICAgICAnZ2V0JywgJ2Z1bmN0aW9uJywgJ25hbWVzcGFjZScsICdjb25zdCdcbiAgICAgICAgKSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnZpc2l0VGVybWluYWwobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nLnJlcG9ydCh0aGlzLnNvdXJjZSwgbm9kZSwgRXJyb3JUeXBlLk5vZGVUeXBlTm90WWV0U3VwcG9ydGVkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmlzaXRDaGlsZHJlbiA9IChub2RlczogU3ludGF4Tm9kZVtdKTogQVNUTm9kZVtdID0+IHtcbiAgICBsZXQgY2hpbGRyZW46IEFTVE5vZGVbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgIGlmICghbm9kZS50eXBlLm1hdGNoKC9bPD4oKXt9LDo7XFxbXFxdJnw9XFwrXFwtXFwqXFwvXS8pICYmIG5vZGUudHlwZSAhPT0gJy4uLicpIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSB0aGlzLnZpc2l0Tm9kZShub2RlKTtcbiAgICAgICAgaWYgKGNoaWxkKSBjaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG5cbiAgcHJpdmF0ZSB2aXNpdFByb2dyYW0gPSAobm9kZTogU3ludGF4Tm9kZSk6IEFTVE5vZGVbXSA9PiB7XG4gICAgbGV0IHZpc2l0ZWQgPSB7fSxcbiAgICAgIGdldFN0YXJ0TG9jYXRpb24gPSAobjogQVNUTm9kZSkgPT4gYCR7bi5sb2NhdGlvbi5yb3cuc3RhcnR9OiR7bi5sb2NhdGlvbi5jb2x1bW4uc3RhcnR9YDtcbiAgICAvLyBBIHByb2dyYW0gY2FuIGhhdmUgbW9kdWxlcywgbmFtZXNwYWNlcywgY29tbWVudHMgYXMgaXRzIGNoaWxkcmVuXG4gICAgLy8gVGhlIGZpcnN0IHN0ZXAgaXMgdG8gcGFyc2UgYWxsIHRoZSBjb21tZW50cyBpbiB0aGUgcm9vdCBub2RlXG4gICAgbGV0IGNvbW1lbnRzID0gdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShub2RlLCAnY29tbWVudCcpKTtcbiAgICAvLyBQYXJzZSB0aGUgbmFtZXNwYWNlcyBpbiBleHByZXNzaW9uX3N0YXRlbWVudFxuICAgIGxldCBuYW1lc3BhY2VzID0gdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShub2RlLCAnZXhwcmVzc2lvbl9zdGF0ZW1lbnQnKSk7XG4gICAgLy8gUGFyc2UgdGhlIGV4cG9ydCBzdGF0ZW1lbnRzIGluIHRoZSByb290IG5vZGVcbiAgICBsZXQgZXhwb3J0cyA9IHRoaXMudmlzaXRDaGlsZHJlbih0aGlzLmZpbHRlclR5cGUobm9kZSwgJ2V4cG9ydF9zdGF0ZW1lbnQnKSk7XG5cbiAgICAvLyBHZXQgdGhlIHZpc2l0ZWQgY29udGV4dCBub2Rlc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNvbW1lbnQgPSBjb21tZW50c1tpXTtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBjb21tZW50O1xuICAgICAgdmlzaXRlZFtnZXRTdGFydExvY2F0aW9uKGNvbnRleHQpXSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHRoZSB2aXNpdGVkIG5vZGVzIGZyb20gbmFtZXNwYWNlcyBhcnJheVxuICAgIF8ucmVtb3ZlKG5hbWVzcGFjZXMsIHggPT4gdmlzaXRlZFtnZXRTdGFydExvY2F0aW9uKHgpXSk7XG5cbiAgICAvLyBFeHBvcnRzIGFyZSBvZGRiYWxscyBzaW5jZSBzb21lIGV4cG9ydHMgbWF5IHJlZmVyZW5jZVxuICAgIC8vIGEgdHlwZS9ub2RlIHRoYXQgbWF5IGhhdmUgYmVlbiBjb21tZW50ZWQuXG4gICAgLy8gV2UnbGwgZmlyc3QgbmVlZCB0byBmaWx0ZXIgdGhlIG9uZXMgd2UgaGF2ZSB2aXNpdGVkXG4gICAgXy5yZW1vdmUoZXhwb3J0cywgeCA9PiB2aXNpdGVkW2dldFN0YXJ0TG9jYXRpb24oeCldKTtcblxuICAgIC8vIEZyb20gdGhlIG9uZXMgd2UgaGF2ZSBub3QgdmlzaXRlZCwgd2UnbGwgbmVlZCB0byBtb2RpZnlcbiAgICAvLyB0aGUgbm9kZSBwcm9wZXJ0aWVzIG9mIGVhY2ggY29udGV4dCBpbiBhIGNvbW1lbnQgbm9kZSB0aGF0XG4gICAgLy8gbWF0Y2hlcyB0aGUgb25lcyB3ZSBoYXZlIG5vdCB2aXNpdGVkLlxuICAgIGNvbnN0IG1hdGNoZWQgPSB7fTtcbiAgICBjb21tZW50cyA9IF8uY29tcGFjdChcbiAgICAgIGNvbW1lbnRzLm1hcChjb21tZW50ID0+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBvcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZXhwb3J0XyA9IGV4cG9ydHNbaV07XG4gICAgICAgICAgY29uc3QgY29udGV4dCA9IGNvbW1lbnQuY29udGV4dDtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgY29udGV4dCAmJiBqIDwgY29udGV4dC5jaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKGNvbnRleHQuY2hpbGRyZW5baV0gJiYgY29udGV4dC5jaGlsZHJlbltpXS50eXBlID09PSBleHBvcnRfLnR5cGUpIHtcbiAgICAgICAgICAgICAgbWF0Y2hlZFtnZXRTdGFydExvY2F0aW9uKGV4cG9ydF8pXSA9IHRydWU7XG4gICAgICAgICAgICAgIGNvbW1lbnQuY29udGV4dC5wcm9wZXJ0aWVzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICBjb21tZW50LmNvbnRleHQucHJvcGVydGllcyB8fCB7fSxcbiAgICAgICAgICAgICAgICBleHBvcnRfLnByb3BlcnRpZXNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbW1lbnQ7XG4gICAgICB9KSk7XG5cbiAgICAvLyBSZW1vdmVkIHRoZSBtYXRjaGVkIGV4cG9ydHNcbiAgICBfLnJlbW92ZShleHBvcnRzLCB4ID0+IG1hdGNoZWRbZ2V0U3RhcnRMb2NhdGlvbih4KV0pXG5cbiAgICByZXR1cm4gW10uY29uY2F0KGNvbW1lbnRzKS5jb25jYXQobmFtZXNwYWNlcykuY29uY2F0KGV4cG9ydHMpO1xuICB9XG5cbiAgcHJpdmF0ZSB2aXNpdENvbW1lbnQgPSAobm9kZTogU3ludGF4Tm9kZSk6IEFTVE5vZGUgPT4ge1xuICAgIGlmIChpc0phdmFEb2NDb21tZW50KHRoaXMuc291cmNlLCBub2RlKSAmJiAhaXNMZWdhbENvbW1lbnQodGhpcy5zb3VyY2UsIG5vZGUpKSB7XG4gICAgICBjb25zdCBuZXh0U2libGluZyA9IHNpYmxpbmcobm9kZSk7XG4gICAgICBpZiAobmV4dFNpYmxpbmcpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIHRoaXMudmlzaXRDb250ZXh0KG5leHRTaWJsaW5nLCB7fSksIHRydWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZpc2l0IHRoZSBjb250ZXh0dWFsIG5vZGVcbiAgICogXG4gICAqICMgUmVtYXJrXG4gICAqIFxuICAgKiBBIG5vZGUgaXMgY29uc2lkZXJlZCBjb250ZXh0dWFsIHdoZW4gYSBjb21tZW50IGlzIHZpc2l0ZWQgYW5kIHRoZSBub2RlIGlzIGl0cyBzaWJsaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSB2aXNpdENvbnRleHQgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2V4cG9ydF9zdGF0ZW1lbnQnOlxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdEV4cG9ydFN0YXRlbWVudChub2RlLCBwcm9wZXJ0aWVzKTtcbiAgICAgIGNhc2UgJ2V4cHJlc3Npb25fc3RhdGVtZW50JzpcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KG5vZGUsIHByb3BlcnRpZXMpO1xuICAgICAgY2FzZSAnY2xhc3MnOlxuICAgICAgY2FzZSAnaW50ZXJmYWNlX2RlY2xhcmF0aW9uJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRDbGFzc09ySW50ZXJmYWNlKG5vZGUsIHByb3BlcnRpZXMpXG4gICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICBjYXNlICdjYWxsX3NpZ25hdHVyZSc6XG4gICAgICBjYXNlICdtZXRob2Rfc2lnbmF0dXJlJzpcbiAgICAgIGNhc2UgJ3Byb3BlcnR5X3NpZ25hdHVyZSc6XG4gICAgICBjYXNlICdwdWJsaWNfZmllbGRfZGVmaW5pdGlvbic6XG4gICAgICBjYXNlICdtZXRob2RfZGVmaW5pdGlvbic6XG4gICAgICBjYXNlICdsZXhpY2FsX2RlY2xhcmF0aW9uJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXROb25UZXJtaW5hbChub2RlLCBwcm9wZXJ0aWVzKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGxvZy5yZXBvcnQodGhpcy5zb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFlldFN1cHBvcnRlZCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qIFN0YXRlbWVudHMgKi9cblxuICBwcml2YXRlIHZpc2l0RXhwb3J0U3RhdGVtZW50ID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xuICAgIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4sIGRlZmF1bHRFeHBvcnQgPSBmYWxzZTtcbiAgICAvLyBSZW1vdmUgJ2V4cG9ydCcgc2luY2UgaXQncyBhbHdheXMgZmlyc3QgaW4gdGhlIGFycmF5XG4gICAgY2hpbGRyZW4uc2hpZnQoKTtcbiAgICBpZiAodGhpcy5oYXNEZWZhdWx0RXhwb3J0KG5vZGUpKSB7XG4gICAgICBkZWZhdWx0RXhwb3J0ID0gdHJ1ZTtcbiAgICAgIC8vIFJlbW92ZSAnZGVmYXVsdCcgZXhwb3J0XG4gICAgICBjaGlsZHJlbi5zaGlmdCgpO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuLnNoaWZ0KCk7XG4gICAgcmV0dXJuIHRoaXMudmlzaXROb2RlKGNoaWxkLCB7IGV4cG9ydHM6IHsgZXhwb3J0OiB0cnVlLCBkZWZhdWx0OiBkZWZhdWx0RXhwb3J0IH0gfSk7XG4gIH1cblxuICBwcml2YXRlIHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudCA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzOiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xuICAgIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbi5zaGlmdCgpO1xuXG4gICAgaWYgKG1hdGNoKGNoaWxkLCAnaW50ZXJuYWxfbW9kdWxlJykpIHtcbiAgICAgIHJldHVybiB0aGlzLnZpc2l0SW50ZXJuYWxNb2R1bGUoY2hpbGQsIHByb3BlcnRpZXMpXG4gICAgfVxuXG4gICAgaWYgKG1hdGNoKGNoaWxkLCAnZnVuY3Rpb24nKSkge1xuICAgICAgaWYgKHByb3BlcnRpZXMpIHJldHVybiB0aGlzLnZpc2l0Q29udGV4dChjaGlsZCwgcHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudmlzaXROb25UZXJtaW5hbChjaGlsZClcbiAgfVxuXG4gIC8qIE1vZHVsZXMgKi9cblxuICBwcml2YXRlIHZpc2l0SW50ZXJuYWxNb2R1bGUgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XG4gICAgbGV0IGNoaWxkcmVuOiBBU1ROb2RlW10gPSBub2RlLmNoaWxkcmVuLm1hcChjaGlsZCA9PiB7XG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdzdGF0ZW1lbnRfYmxvY2snKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShjaGlsZCwgJ2NvbW1lbnQnKSkpXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy52aXNpdE5vZGUoY2hpbGQpO1xuICAgIH0pO1xuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCBjaGlsZHJlbiwgT2JqZWN0LmFzc2lnbihwcm9wZXJ0aWVzIHx8IHt9LCB7IG5hbWVzcGFjZTogdHJ1ZSB9KSk7XG4gIH1cblxuXG4gIC8qIERlY2xhcmF0aW9ucyAqL1xuXG4gIHByaXZhdGUgdmlzaXRDbGFzc09ySW50ZXJmYWNlID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xuICAgIC8vIFNpbmNlICdpbnRlcmZhY2UnIG9yICdjbGFzcycgaXMgYWx3YXlzIGZpcnN0IGluIHRoZSBhcnJheVxuICAgIC8vIHdlJ2xsIG5lZWQgdG8gcmVtb3ZlIGl0IGZyb20gdGhlIGFycmF5LlxuICAgIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XG4gICAgY29uc3QgaW50ZXJmYWNlXyA9IGNoaWxkcmVuLnNoaWZ0KCk7XG4gICAgbGV0IGV4dGVuZHNfID0gZmFsc2UsIGltcGxlbWVudHNfID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuaGFzSW5oZXJpdGFuY2Uobm9kZSkpIHtcbiAgICAgIGNvbnN0IGluaGVyaXRhbmNlID0gdGhpcy5nZXRJbmhlcml0YW5jZVR5cGUobm9kZSlcbiAgICAgIGV4dGVuZHNfID0gaW5oZXJpdGFuY2UgPT09ICdleHRlbmRzJztcbiAgICAgIGltcGxlbWVudHNfID0gaW5oZXJpdGFuY2UgPT09ICdpbXBsZW1lbnRzJztcbiAgICB9XG5cbiAgICBjb25zdCBub2RlXyA9IGNyZWF0ZUFTVE5vZGUoXG4gICAgICB0aGlzLnNvdXJjZSxcbiAgICAgIG5vZGUsXG4gICAgICB0aGlzLnZpc2l0Q2hpbGRyZW4oY2hpbGRyZW4pLFxuICAgICAgT2JqZWN0LmFzc2lnbihwcm9wZXJ0aWVzIHx8IHt9LCB7XG4gICAgICAgIGluaGVyaXRhbmNlOiB7XG4gICAgICAgICAgaW1wbGVtZW50czogaW1wbGVtZW50c18sXG4gICAgICAgICAgZXh0ZW5kczogZXh0ZW5kc19cbiAgICAgICAgfSBhcyBOb2RlSW5oZXJpdGFuY2VcbiAgICAgIH0pKTtcblxuICAgIGlmIChtYXRjaChub2RlLCAnY2xhc3MnKSkge1xuICAgICAgcmV0dXJuIG5vZGVfO1xuICAgIH1cbiAgICAvLyBPdmVyd3JpdGUgdGhlIG5vZGUgdHlwZSBmcm9tICdpbnRlcmZhY2VfZGVjbGFyYXRpb24nIHRvICdpbnRlcmZhY2UnXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obm9kZV8sIHsgdHlwZTogaW50ZXJmYWNlXy50eXBlIH0pXG4gIH1cblxuICAvKiBOb24tdGVybWluYWxzICovXG5cbiAgcHJpdmF0ZSB2aXNpdE5vblRlcm1pbmFsID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xuICAgIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XG4gICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZXMgd2hlcmUgc29tZSBub24tdGVybWluYWxzXG4gICAgLy8gY29udGFpbiBjb21tZW50cyB3aGljaCBpcyB3aGF0IHdlIGNhcmUgYWJvdXRcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2NsYXNzX2JvZHknLCAnb2JqZWN0X3R5cGUnKSkge1xuICAgICAgY2hpbGRyZW4gPSB0aGlzLmZpbHRlclR5cGUobm9kZSwgJ2NvbW1lbnQnKTtcbiAgICB9XG4gICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZXMgd2hlcmUgZXhwb3J0IHN0YXRlbWVudHMgaGF2ZSBub2RlIHByb3BlcnRpZXNcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2V4cG9ydF9zdGF0ZW1lbnQnKSkge1xuICAgICAgcmV0dXJuIHRoaXMudmlzaXRFeHBvcnRTdGF0ZW1lbnQobm9kZSk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZXMgd2hlcmUgYW4gaW50ZXJuYWwgbW9kdWxlIGNvbnRhaW5zIG90aGVyIG5vZGVzXG4gICAgaWYgKG1hdGNoKG5vZGUsICdpbnRlcm5hbF9tb2R1bGUnKSkge1xuICAgICAgcmV0dXJuIHRoaXMudmlzaXRJbnRlcm5hbE1vZHVsZShub2RlLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBhbiBpbnRlcm1hbF9tb2R1bGUgY2FuIGV4aXN0IGluIGFuIGV4cHJlc3Npb25fc3RhdGVtZW50XG4gICAgaWYgKG1hdGNoKG5vZGUsICdleHByZXNzaW9uX3N0YXRlbWVudCcpKSB7XG4gICAgICByZXR1cm4gdGhpcy52aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQobm9kZSwgcHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgaWYgKG1hdGNoKG5vZGUsICdmdW5jdGlvbicpKSB7XG4gICAgICBfLnJlbW92ZShjaGlsZHJlbiwgY2hpbGQgPT4gbWF0Y2goY2hpbGQsICdzdGF0ZW1lbnRfYmxvY2snKSlcbiAgICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q2hpbGRyZW4oY2hpbGRyZW4pLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENoaWxkcmVuKGNoaWxkcmVuKSwgcHJvcGVydGllcyk7XG4gIH1cblxuICAvKiBUZXJtaW5hbHMgKi9cblxuICBwcml2YXRlIHZpc2l0VGVybWluYWwgPSAobm9kZTogU3ludGF4Tm9kZSk6IEFTVE5vZGUgPT4ge1xuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlKVxuICB9XG59Il19 \ No newline at end of file diff --git a/build/src/utils/benchmark.js b/build/src/utils/benchmark.js index 61900e9..a6e49e6 100644 --- a/build/src/utils/benchmark.js +++ b/build/src/utils/benchmark.js @@ -7,4 +7,4 @@ function benchmark(label, f, ...args) { return result; } exports.default = benchmark; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVuY2htYXJrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2JlbmNobWFyay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLFNBQXdCLFNBQVMsQ0FDL0IsS0FBYSxFQUNiLENBQWUsRUFDZixHQUFHLElBQVU7SUFFYixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ25CLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ25DLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQVRELDRCQVNDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYmVuY2htYXJrPFQsIFQyPihcclxuICBsYWJlbDogc3RyaW5nLFxyXG4gIGY6ICh4OiBUMikgPT4gVCxcclxuICAuLi5hcmdzOiBUMltdXHJcbik6IFQge1xyXG4gIGNvbnNvbGUudGltZShsYWJlbClcclxuICBjb25zdCByZXN1bHQgPSBmLmFwcGx5KG51bGwsIGFyZ3MpO1xyXG4gIGNvbnNvbGUudGltZUVuZChsYWJlbCk7XHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVuY2htYXJrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2JlbmNobWFyay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLFNBQXdCLFNBQVMsQ0FDL0IsS0FBYSxFQUNiLENBQWUsRUFDZixHQUFHLElBQVU7SUFFYixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ25CLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ25DLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQVRELDRCQVNDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYmVuY2htYXJrPFQsIFQyPihcbiAgbGFiZWw6IHN0cmluZyxcbiAgZjogKHg6IFQyKSA9PiBULFxuICAuLi5hcmdzOiBUMltdXG4pOiBUIHtcbiAgY29uc29sZS50aW1lKGxhYmVsKVxuICBjb25zdCByZXN1bHQgPSBmLmFwcGx5KG51bGwsIGFyZ3MpO1xuICBjb25zb2xlLnRpbWVFbmQobGFiZWwpO1xuICByZXR1cm4gcmVzdWx0O1xufSJdfQ== \ No newline at end of file diff --git a/build/src/utils/comment.js b/build/src/utils/comment.js index d67c1c8..dd61fb4 100644 --- a/build/src/utils/comment.js +++ b/build/src/utils/comment.js @@ -39,4 +39,4 @@ function isXDocCommentFragment(source, node) { return !isXDocCommentBlock(source, node) && isXDocComment(source, node); } exports.isXDocCommentFragment = isXDocCommentFragment; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9jb21tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsbUNBQTRCO0FBR2YsUUFBQSxTQUFTLEdBQUcsOEVBQThFLENBQUM7QUFFeEcsU0FBZ0IsY0FBYyxDQUFFLE1BQWMsRUFBRSxJQUFnQjtJQUM5RCxNQUFNLGFBQWEsR0FBRztRQUNwQixXQUFXO1FBQ1gsc0JBQXNCO1FBQ3RCLFNBQVM7UUFDVCxxQkFBcUI7S0FDdEIsQ0FBQztJQUNGLElBQUksZUFBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRTtRQUMxQixPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDOUIsTUFBTSxDQUFDLElBQUk7YUFDUixTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQ3pDLFdBQVcsRUFBRTthQUNiLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FDbEIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDbEI7QUFDSCxDQUFDO0FBZkQsd0NBZUM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDL0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEUsbUJBQW1CO0lBQ25CLE9BQU8saUNBQWlDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQ3hELENBQUM7QUFKRCw0Q0FJQztBQUVELFNBQWdCLGFBQWEsQ0FBQyxNQUFhLEVBQUUsSUFBaUI7SUFDNUQsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQ3JCLElBQUksSUFBSTtRQUFFLE9BQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JFLE9BQU8saUJBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUpELHNDQUlDO0FBRUQsU0FBZ0Isa0JBQWtCLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQ2pFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDM0QsQ0FBQztBQUhELGdEQUdDO0FBRUQsU0FBZ0IscUJBQXFCLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQ3BFLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRkQsc0RBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XHJcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi9tYXRjaFwiO1xyXG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xyXG5cclxuZXhwb3J0IGNvbnN0IFhEb2NSZWdleCA9IC9AKFxcdyspKFtee1soXFxuXSopPyhbXFx7XFxbXFwoXVtcXHNcXFNdKltcXH1cXF1cXCldKFtcXHNdKig9fC0pPi4qKT8pPyhbXFxzXSotKC4pKik/L2dtaTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0xlZ2FsQ29tbWVudCAoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICBjb25zdCBwb3NzaWJsZVRleHRzID0gW1xyXG4gICAgJ2NvcHlyaWdodCcsXHJcbiAgICAndGVybXMgYW5kIGNvbmRpdGlvbnMnLFxyXG4gICAgJ2xpY2Vuc2UnLFxyXG4gICAgJ2FsbCByaWdodHMgcmVzZXJ2ZWQnXHJcbiAgXTtcclxuICBpZiAobWF0Y2gobm9kZSwgJ2NvbW1lbnQnKSkge1xyXG4gICAgcmV0dXJuIHBvc3NpYmxlVGV4dHMubWFwKHRleHQgPT5cclxuICAgICAgc291cmNlLnRleHRcclxuICAgICAgICAuc3Vic3RyaW5nKG5vZGUuc3RhcnRJbmRleCwgbm9kZS5lbmRJbmRleClcclxuICAgICAgICAudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgIC5pbmNsdWRlcyh0ZXh0KVxyXG4gICAgKS5pbmNsdWRlcyh0cnVlKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0phdmFEb2NDb21tZW50KHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlKSB7XHJcbiAgY29uc3QgY29tbWVudCA9IHNvdXJjZS50ZXh0LnN1YnN0cmluZyhub2RlLnN0YXJ0SW5kZXgsIG5vZGUuZW5kSW5kZXgpO1xyXG4gIC8vIHJlZ2V4ci5jb20vM2VqdmJcclxuICByZXR1cm4gLyhcXC9cXCpcXCopKChcXHMqKSguKj8pKFxccykpKihcXCpcXC8pLy50ZXN0KGNvbW1lbnQpXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1hEb2NDb21tZW50KHNvdXJjZTpzdHJpbmcsIG5vZGU/OiBTeW50YXhOb2RlKSB7XHJcbiAgbGV0IGNvbW1lbnQgPSBzb3VyY2U7XHJcbiAgaWYgKG5vZGUpIGNvbW1lbnQgPSBzb3VyY2Uuc3Vic3RyaW5nKG5vZGUuc3RhcnRJbmRleCwgbm9kZS5lbmRJbmRleCk7XHJcbiAgcmV0dXJuIFhEb2NSZWdleC50ZXN0KGNvbW1lbnQpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNYRG9jQ29tbWVudEJsb2NrKHNvdXJjZTogc3RyaW5nLCBub2RlOiBTeW50YXhOb2RlKSB7XHJcbiAgY29uc3QgY29tbWVudCA9IHNvdXJjZS5zdWJzdHJpbmcobm9kZS5zdGFydEluZGV4LCBub2RlLmVuZEluZGV4KTtcclxuICByZXR1cm4gLyNBUEkvLnRlc3QoY29tbWVudCkgfHwgL1xcYFxcYFxcYHhkb2MvLnRlc3QoY29tbWVudClcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzWERvY0NvbW1lbnRGcmFnbWVudChzb3VyY2U6IHN0cmluZywgbm9kZTogU3ludGF4Tm9kZSkge1xyXG4gIHJldHVybiAhaXNYRG9jQ29tbWVudEJsb2NrKHNvdXJjZSwgbm9kZSkgJiYgaXNYRG9jQ29tbWVudChzb3VyY2UsIG5vZGUpO1xyXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9jb21tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsbUNBQTRCO0FBR2YsUUFBQSxTQUFTLEdBQUcsOEVBQThFLENBQUM7QUFFeEcsU0FBZ0IsY0FBYyxDQUFFLE1BQWMsRUFBRSxJQUFnQjtJQUM5RCxNQUFNLGFBQWEsR0FBRztRQUNwQixXQUFXO1FBQ1gsc0JBQXNCO1FBQ3RCLFNBQVM7UUFDVCxxQkFBcUI7S0FDdEIsQ0FBQztJQUNGLElBQUksZUFBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRTtRQUMxQixPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDOUIsTUFBTSxDQUFDLElBQUk7YUFDUixTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQ3pDLFdBQVcsRUFBRTthQUNiLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FDbEIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDbEI7QUFDSCxDQUFDO0FBZkQsd0NBZUM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDL0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEUsbUJBQW1CO0lBQ25CLE9BQU8saUNBQWlDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQ3hELENBQUM7QUFKRCw0Q0FJQztBQUVELFNBQWdCLGFBQWEsQ0FBQyxNQUFhLEVBQUUsSUFBaUI7SUFDNUQsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQ3JCLElBQUksSUFBSTtRQUFFLE9BQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JFLE9BQU8saUJBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUpELHNDQUlDO0FBRUQsU0FBZ0Isa0JBQWtCLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQ2pFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDM0QsQ0FBQztBQUhELGdEQUdDO0FBRUQsU0FBZ0IscUJBQXFCLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQ3BFLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRkQsc0RBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgbWF0Y2ggZnJvbSBcIi4vbWF0Y2hcIjtcbmltcG9ydCBTb3VyY2UgZnJvbSBcIi4uL2ludGVyZmFjZXMvU291cmNlXCI7XG5cbmV4cG9ydCBjb25zdCBYRG9jUmVnZXggPSAvQChcXHcrKShbXntbKFxcbl0qKT8oW1xce1xcW1xcKF1bXFxzXFxTXSpbXFx9XFxdXFwpXShbXFxzXSooPXwtKT4uKik/KT8oW1xcc10qLSguKSopPy9nbWk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xlZ2FsQ29tbWVudCAoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgY29uc3QgcG9zc2libGVUZXh0cyA9IFtcbiAgICAnY29weXJpZ2h0JyxcbiAgICAndGVybXMgYW5kIGNvbmRpdGlvbnMnLFxuICAgICdsaWNlbnNlJyxcbiAgICAnYWxsIHJpZ2h0cyByZXNlcnZlZCdcbiAgXTtcbiAgaWYgKG1hdGNoKG5vZGUsICdjb21tZW50JykpIHtcbiAgICByZXR1cm4gcG9zc2libGVUZXh0cy5tYXAodGV4dCA9PlxuICAgICAgc291cmNlLnRleHRcbiAgICAgICAgLnN1YnN0cmluZyhub2RlLnN0YXJ0SW5kZXgsIG5vZGUuZW5kSW5kZXgpXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgIC5pbmNsdWRlcyh0ZXh0KVxuICAgICkuaW5jbHVkZXModHJ1ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSmF2YURvY0NvbW1lbnQoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgY29uc3QgY29tbWVudCA9IHNvdXJjZS50ZXh0LnN1YnN0cmluZyhub2RlLnN0YXJ0SW5kZXgsIG5vZGUuZW5kSW5kZXgpO1xuICAvLyByZWdleHIuY29tLzNlanZiXG4gIHJldHVybiAvKFxcL1xcKlxcKikoKFxccyopKC4qPykoXFxzKSkqKFxcKlxcLykvLnRlc3QoY29tbWVudClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzWERvY0NvbW1lbnQoc291cmNlOnN0cmluZywgbm9kZT86IFN5bnRheE5vZGUpIHtcbiAgbGV0IGNvbW1lbnQgPSBzb3VyY2U7XG4gIGlmIChub2RlKSBjb21tZW50ID0gc291cmNlLnN1YnN0cmluZyhub2RlLnN0YXJ0SW5kZXgsIG5vZGUuZW5kSW5kZXgpO1xuICByZXR1cm4gWERvY1JlZ2V4LnRlc3QoY29tbWVudCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1hEb2NDb21tZW50QmxvY2soc291cmNlOiBzdHJpbmcsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgY29uc3QgY29tbWVudCA9IHNvdXJjZS5zdWJzdHJpbmcobm9kZS5zdGFydEluZGV4LCBub2RlLmVuZEluZGV4KTtcbiAgcmV0dXJuIC8jQVBJLy50ZXN0KGNvbW1lbnQpIHx8IC9cXGBcXGBcXGB4ZG9jLy50ZXN0KGNvbW1lbnQpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1hEb2NDb21tZW50RnJhZ21lbnQoc291cmNlOiBzdHJpbmcsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgcmV0dXJuICFpc1hEb2NDb21tZW50QmxvY2soc291cmNlLCBub2RlKSAmJiBpc1hEb2NDb21tZW50KHNvdXJjZSwgbm9kZSk7XG59Il19 \ No newline at end of file diff --git a/build/src/utils/log.js b/build/src/utils/log.js index 47f9527..75c3cfb 100644 --- a/build/src/utils/log.js +++ b/build/src/utils/log.js @@ -29,4 +29,4 @@ class ParserLog extends mr_doc_utils_1.Log { } const log = new ParserLog('mr-doc::parser'); exports.default = log; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtDQUFtQztBQUduQyxtQ0FBNEI7QUFFNUIsSUFBWSxTQUdYO0FBSEQsV0FBWSxTQUFTO0lBQ2pCLCtFQUF1QixDQUFBO0lBQ3ZCLHlFQUFvQixDQUFBO0FBQ3hCLENBQUMsRUFIVyxTQUFTLEdBQVQsaUJBQVMsS0FBVCxpQkFBUyxRQUdwQjtBQUVELE1BQU0sU0FBVSxTQUFRLGtCQUFHO0lBQTNCOztRQUNJLFdBQU0sR0FBRyxDQUFDLE1BQWMsRUFBRSxJQUFnQixFQUFFLEtBQWdCLEVBQVEsRUFBRTtZQUNsRSxNQUFNLFFBQVEsR0FBRyxlQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ3RDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQ3pELE1BQU0sWUFBWSxHQUFHLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNySCxNQUFNLE9BQU8sR0FBRyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksWUFBWSxFQUFFLFFBQVEsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDO1lBQ25GLFFBQVEsS0FBSyxFQUFFO2dCQUNYLEtBQUssU0FBUyxDQUFDLHVCQUF1QjtvQkFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsNEJBQTRCLE9BQU8sRUFBRSxDQUFDLENBQUE7b0JBQ2xGLE1BQU07Z0JBQ1YsS0FBSyxTQUFTLENBQUMsb0JBQW9CO29CQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLHFEQUFxRCxPQUFPLEVBQUUsQ0FBQyxDQUFBO2dCQUM5RTtvQkFDSSxNQUFNO2FBQ2I7UUFDTCxDQUFDLENBQUE7SUFDTCxDQUFDO0NBQUE7QUFHRCxNQUFNLEdBQUcsR0FBRyxJQUFJLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRTVDLGtCQUFlLEdBQUcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvZyB9IGZyb20gJ21yLWRvYy11dGlscyc7XHJcbmltcG9ydCBTb3VyY2UgZnJvbSAnLi4vaW50ZXJmYWNlcy9Tb3VyY2UnO1xyXG5pbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSAndHJlZS1zaXR0ZXInO1xyXG5pbXBvcnQgcmFuZ2UgZnJvbSAnLi9yYW5nZSc7XHJcblxyXG5leHBvcnQgZW51bSBFcnJvclR5cGUge1xyXG4gICAgTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQsXHJcbiAgICBUcmVlU2l0dGVyUGFyc2VFcnJvclxyXG59XHJcblxyXG5jbGFzcyBQYXJzZXJMb2cgZXh0ZW5kcyBMb2cge1xyXG4gICAgcmVwb3J0ID0gKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlLCBlcnJvcjogRXJyb3JUeXBlKTogdm9pZCA9PiB7XHJcbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSByYW5nZShub2RlKS5sb2NhdGlvbjtcclxuICAgICAgICBjb25zdCBzYW1lTGluZSA9IGxvY2F0aW9uLnJvdy5zdGFydCA9PT0gbG9jYXRpb24ucm93LmVuZDtcclxuICAgICAgICBjb25zdCBnZXRMaW5lUmFuZ2UgPSAoKSA9PiBzYW1lTGluZSA/IGxvY2F0aW9uLnJvdy5zdGFydCArIDEgOiBsb2NhdGlvbi5yb3cuc3RhcnQgKyAxICsgJyAtICcgKyBsb2NhdGlvbi5yb3cuZW5kICsgMTtcclxuICAgICAgICBjb25zdCBjdWxwcml0ID0gYExpbmUke3NhbWVMaW5lID8gJycgOiAncyd9ICR7Z2V0TGluZVJhbmdlKCl9IGluICcke3NvdXJjZS5wYXRofSdgO1xyXG4gICAgICAgIHN3aXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY2FzZSBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQ6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluZm8oYCcke25vZGUudHlwZS5yZXBsYWNlKC9bX10vZywgJyAnKX0nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkOlxcbiR7Y3VscHJpdH1gKVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgRXJyb3JUeXBlLlRyZWVTaXR0ZXJQYXJzZUVycm9yOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvcihgJ3RyZWUtc2l0dGVyJyB3YXMgbm90IGFibGUgdG8gcGFyc2UgdGhlIHByb2dyYW06XFxuJHtjdWxwcml0fWApXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5jb25zdCBsb2cgPSBuZXcgUGFyc2VyTG9nKCdtci1kb2M6OnBhcnNlcicpO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbG9nOyJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtDQUFtQztBQUduQyxtQ0FBNEI7QUFFNUIsSUFBWSxTQUdYO0FBSEQsV0FBWSxTQUFTO0lBQ2pCLCtFQUF1QixDQUFBO0lBQ3ZCLHlFQUFvQixDQUFBO0FBQ3hCLENBQUMsRUFIVyxTQUFTLEdBQVQsaUJBQVMsS0FBVCxpQkFBUyxRQUdwQjtBQUVELE1BQU0sU0FBVSxTQUFRLGtCQUFHO0lBQTNCOztRQUNJLFdBQU0sR0FBRyxDQUFDLE1BQWMsRUFBRSxJQUFnQixFQUFFLEtBQWdCLEVBQVEsRUFBRTtZQUNsRSxNQUFNLFFBQVEsR0FBRyxlQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ3RDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQ3pELE1BQU0sWUFBWSxHQUFHLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNySCxNQUFNLE9BQU8sR0FBRyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksWUFBWSxFQUFFLFFBQVEsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDO1lBQ25GLFFBQVEsS0FBSyxFQUFFO2dCQUNYLEtBQUssU0FBUyxDQUFDLHVCQUF1QjtvQkFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsNEJBQTRCLE9BQU8sRUFBRSxDQUFDLENBQUE7b0JBQ2xGLE1BQU07Z0JBQ1YsS0FBSyxTQUFTLENBQUMsb0JBQW9CO29CQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLHFEQUFxRCxPQUFPLEVBQUUsQ0FBQyxDQUFBO2dCQUM5RTtvQkFDSSxNQUFNO2FBQ2I7UUFDTCxDQUFDLENBQUE7SUFDTCxDQUFDO0NBQUE7QUFHRCxNQUFNLEdBQUcsR0FBRyxJQUFJLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRTVDLGtCQUFlLEdBQUcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvZyB9IGZyb20gJ21yLWRvYy11dGlscyc7XG5pbXBvcnQgU291cmNlIGZyb20gJy4uL2ludGVyZmFjZXMvU291cmNlJztcbmltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tICd0cmVlLXNpdHRlcic7XG5pbXBvcnQgcmFuZ2UgZnJvbSAnLi9yYW5nZSc7XG5cbmV4cG9ydCBlbnVtIEVycm9yVHlwZSB7XG4gICAgTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQsXG4gICAgVHJlZVNpdHRlclBhcnNlRXJyb3Jcbn1cblxuY2xhc3MgUGFyc2VyTG9nIGV4dGVuZHMgTG9nIHtcbiAgICByZXBvcnQgPSAoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUsIGVycm9yOiBFcnJvclR5cGUpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSByYW5nZShub2RlKS5sb2NhdGlvbjtcbiAgICAgICAgY29uc3Qgc2FtZUxpbmUgPSBsb2NhdGlvbi5yb3cuc3RhcnQgPT09IGxvY2F0aW9uLnJvdy5lbmQ7XG4gICAgICAgIGNvbnN0IGdldExpbmVSYW5nZSA9ICgpID0+IHNhbWVMaW5lID8gbG9jYXRpb24ucm93LnN0YXJ0ICsgMSA6IGxvY2F0aW9uLnJvdy5zdGFydCArIDEgKyAnIC0gJyArIGxvY2F0aW9uLnJvdy5lbmQgKyAxO1xuICAgICAgICBjb25zdCBjdWxwcml0ID0gYExpbmUke3NhbWVMaW5lID8gJycgOiAncyd9ICR7Z2V0TGluZVJhbmdlKCl9IGluICcke3NvdXJjZS5wYXRofSdgO1xuICAgICAgICBzd2l0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXNlIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFlldFN1cHBvcnRlZDpcbiAgICAgICAgICAgICAgICB0aGlzLmluZm8oYCcke25vZGUudHlwZS5yZXBsYWNlKC9bX10vZywgJyAnKX0nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkOlxcbiR7Y3VscHJpdH1gKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBFcnJvclR5cGUuVHJlZVNpdHRlclBhcnNlRXJyb3I6XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvcihgJ3RyZWUtc2l0dGVyJyB3YXMgbm90IGFibGUgdG8gcGFyc2UgdGhlIHByb2dyYW06XFxuJHtjdWxwcml0fWApXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cbmNvbnN0IGxvZyA9IG5ldyBQYXJzZXJMb2coJ21yLWRvYzo6cGFyc2VyJyk7XG5cbmV4cG9ydCBkZWZhdWx0IGxvZzsiXX0= \ No newline at end of file diff --git a/build/src/utils/match.js b/build/src/utils/match.js index 58a09da..74e0c8d 100644 --- a/build/src/utils/match.js +++ b/build/src/utils/match.js @@ -18,4 +18,4 @@ function match(node, ...types) { return false; } exports.default = match; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvbWF0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQTs7Ozs7OztHQU9HO0FBQ0gsU0FBd0IsS0FBSyxDQUFDLElBQWdCLEVBQUUsR0FBRyxLQUFlO0lBQ2hFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3JDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQ3RCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7S0FDRjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQVJELHdCQVFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5cclxuLyoqXHJcbiAqIERldGVybWluZXMgd2hldGhlciBhIG5vZGUgaXMgYSBjZXJ0YWluIHR5cGUuXHJcbiAqIGBgYFxyXG4gKiBAcGFyYW0gbm9kZTogU3ludGF4Tm9kZSAtIFRoZSBub2RlIHRvIGNvbXBhcmUuXHJcbiAqIEBwYXJhbSB0eXBlOiBzdHJpbmcgIC0gVGhlIG5vZGUgdHlwZSB0byBtYXRjaC5cclxuICogQHJldHVybjogYm9vbGVhblxyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1hdGNoKG5vZGU6IFN5bnRheE5vZGUsIC4uLnR5cGVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHtcclxuICAgIGNvbnN0IHR5cGUgPSB0eXBlc1tpXTtcclxuICAgIGlmIChub2RlLnR5cGUgPT09IHR5cGUpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBmYWxzZTtcclxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvbWF0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQTs7Ozs7OztHQU9HO0FBQ0gsU0FBd0IsS0FBSyxDQUFDLElBQWdCLEVBQUUsR0FBRyxLQUFlO0lBQ2hFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3JDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQ3RCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7S0FDRjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQVJELHdCQVFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIG5vZGUgaXMgYSBjZXJ0YWluIHR5cGUuXG4gKiBgYGBcbiAqIEBwYXJhbSBub2RlOiBTeW50YXhOb2RlIC0gVGhlIG5vZGUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB0eXBlOiBzdHJpbmcgIC0gVGhlIG5vZGUgdHlwZSB0byBtYXRjaC5cbiAqIEByZXR1cm46IGJvb2xlYW5cbiAqIGBgYFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYXRjaChub2RlOiBTeW50YXhOb2RlLCAuLi50eXBlczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlc1tpXTtcbiAgICBpZiAobm9kZS50eXBlID09PSB0eXBlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufSJdfQ== \ No newline at end of file diff --git a/build/src/utils/range.js b/build/src/utils/range.js index 4adeddb..e8ee5d6 100644 --- a/build/src/utils/range.js +++ b/build/src/utils/range.js @@ -13,4 +13,4 @@ function range(node) { }; } exports.default = range; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvcmFuZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxTQUF3QixLQUFLLENBQUMsSUFBdUI7SUFDbkQsT0FBTztRQUNMLFFBQVEsRUFBRTtZQUNSLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVTtZQUN0QixHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDbkI7UUFDRCxRQUFRLEVBQUU7WUFDUixHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQ2pFLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7U0FDM0U7S0FDRixDQUFBO0FBQ0gsQ0FBQztBQVhELHdCQVdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcclxuaW1wb3J0IFRleHRSYW5nZSBmcm9tICcuLi9pbnRlcmZhY2VzL1RleHRSYW5nZSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByYW5nZShub2RlOiBQYXJzZXIuU3ludGF4Tm9kZSk6IFRleHRSYW5nZSB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHBvc2l0aW9uOiB7XHJcbiAgICAgIHN0YXJ0OiBub2RlLnN0YXJ0SW5kZXgsXHJcbiAgICAgIGVuZDogbm9kZS5lbmRJbmRleFxyXG4gICAgfSxcclxuICAgIGxvY2F0aW9uOiB7XHJcbiAgICAgIHJvdzogeyBzdGFydDogbm9kZS5zdGFydFBvc2l0aW9uLnJvdywgZW5kOiBub2RlLmVuZFBvc2l0aW9uLnJvdyB9LFxyXG4gICAgICBjb2x1bW46IHsgc3RhcnQ6IG5vZGUuc3RhcnRQb3NpdGlvbi5jb2x1bW4sIGVuZDogbm9kZS5lbmRQb3NpdGlvbi5jb2x1bW4gfVxyXG4gICAgfVxyXG4gIH1cclxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvcmFuZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxTQUF3QixLQUFLLENBQUMsSUFBdUI7SUFDbkQsT0FBTztRQUNMLFFBQVEsRUFBRTtZQUNSLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVTtZQUN0QixHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDbkI7UUFDRCxRQUFRLEVBQUU7WUFDUixHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQ2pFLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7U0FDM0U7S0FDRixDQUFBO0FBQ0gsQ0FBQztBQVhELHdCQVdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcbmltcG9ydCBUZXh0UmFuZ2UgZnJvbSAnLi4vaW50ZXJmYWNlcy9UZXh0UmFuZ2UnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByYW5nZShub2RlOiBQYXJzZXIuU3ludGF4Tm9kZSk6IFRleHRSYW5nZSB7XG4gIHJldHVybiB7XG4gICAgcG9zaXRpb246IHtcbiAgICAgIHN0YXJ0OiBub2RlLnN0YXJ0SW5kZXgsXG4gICAgICBlbmQ6IG5vZGUuZW5kSW5kZXhcbiAgICB9LFxuICAgIGxvY2F0aW9uOiB7XG4gICAgICByb3c6IHsgc3RhcnQ6IG5vZGUuc3RhcnRQb3NpdGlvbi5yb3csIGVuZDogbm9kZS5lbmRQb3NpdGlvbi5yb3cgfSxcbiAgICAgIGNvbHVtbjogeyBzdGFydDogbm9kZS5zdGFydFBvc2l0aW9uLmNvbHVtbiwgZW5kOiBub2RlLmVuZFBvc2l0aW9uLmNvbHVtbiB9XG4gICAgfVxuICB9XG59Il19 \ No newline at end of file diff --git a/build/src/utils/sibling.js b/build/src/utils/sibling.js index 66420fd..fe01442 100644 --- a/build/src/utils/sibling.js +++ b/build/src/utils/sibling.js @@ -12,4 +12,4 @@ function sibling(node, children, filter) { } } exports.sibling = sibling; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2libGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9zaWJsaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsU0FBZ0IsT0FBTyxDQUNyQixJQUFnQixFQUNoQixRQUF1QixFQUN2QixNQUFzQjtJQUV0QixJQUFJLElBQUksRUFBRTtRQUNSLElBQUksUUFBUSxFQUFFO1lBQ1osTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUM7Z0JBQ3BCLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsT0FBTyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzVCO1FBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0tBQ3pCO0FBQ0gsQ0FBQztBQWRELDBCQWNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNpYmxpbmcoXHJcbiAgbm9kZTogU3ludGF4Tm9kZSxcclxuICBjaGlsZHJlbj86IFN5bnRheE5vZGVbXSxcclxuICBmaWx0ZXI/OiAoKSA9PiBib29sZWFuXHJcbikge1xyXG4gIGlmIChub2RlKSB7XHJcbiAgICBpZiAoY2hpbGRyZW4pIHtcclxuICAgICAgY29uc3QgaW5kZXggPSBmaWx0ZXIgP1xyXG4gICAgICAgIGNoaWxkcmVuLmZpbHRlcihmaWx0ZXIpLmluZGV4T2Yobm9kZSkgOlxyXG4gICAgICAgIGNoaWxkcmVuLmluZGV4T2Yobm9kZSk7XHJcbiAgICAgIHJldHVybiBjaGlsZHJlbltpbmRleCArIDFdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7XHJcbiAgfVxyXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2libGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9zaWJsaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsU0FBZ0IsT0FBTyxDQUNyQixJQUFnQixFQUNoQixRQUF1QixFQUN2QixNQUFzQjtJQUV0QixJQUFJLElBQUksRUFBRTtRQUNSLElBQUksUUFBUSxFQUFFO1lBQ1osTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUM7Z0JBQ3BCLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsT0FBTyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzVCO1FBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0tBQ3pCO0FBQ0gsQ0FBQztBQWRELDBCQWNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuXG5leHBvcnQgZnVuY3Rpb24gc2libGluZyhcbiAgbm9kZTogU3ludGF4Tm9kZSxcbiAgY2hpbGRyZW4/OiBTeW50YXhOb2RlW10sXG4gIGZpbHRlcj86ICgpID0+IGJvb2xlYW5cbikge1xuICBpZiAobm9kZSkge1xuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgY29uc3QgaW5kZXggPSBmaWx0ZXIgP1xuICAgICAgICBjaGlsZHJlbi5maWx0ZXIoZmlsdGVyKS5pbmRleE9mKG5vZGUpIDpcbiAgICAgICAgY2hpbGRyZW4uaW5kZXhPZihub2RlKTtcbiAgICAgIHJldHVybiBjaGlsZHJlbltpbmRleCArIDFdO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZS5uZXh0U2libGluZztcbiAgfVxufSJdfQ== \ No newline at end of file diff --git a/build/src/utils/text.js b/build/src/utils/text.js index 2727251..c4b2bc3 100644 --- a/build/src/utils/text.js +++ b/build/src/utils/text.js @@ -12,4 +12,4 @@ function text(source, node) { return source.text.substring(node.startIndex, node.endIndex); } exports.text = text; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy90ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0E7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLElBQUksQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDbkQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRkQsb0JBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XHJcbmltcG9ydCBTb3VyY2UgZnJvbSBcIi4uL2ludGVyZmFjZXMvU291cmNlXCI7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgY29udGV4dCBzdHJpbmdcclxuICogXHJcbiAqICMgQVBJXHJcbiAqIFxyXG4gKiBAcGFyYW0gc291cmNlOiBJRmlsZSAtIFRoZSBzb3VyY2UgZmlsZS5cclxuICogQHBhcmFtIG5vZGU6IFN5bnRheE5vZGUgLSBUaGUgc3ludGF4IG5vZGUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdGV4dChzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSkge1xyXG4gIHJldHVybiBzb3VyY2UudGV4dC5zdWJzdHJpbmcobm9kZS5zdGFydEluZGV4LCBub2RlLmVuZEluZGV4KTtcclxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy90ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0E7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLElBQUksQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDbkQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRkQsb0JBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGNvbnRleHQgc3RyaW5nXG4gKiBcbiAqICMgQVBJXG4gKiBcbiAqIEBwYXJhbSBzb3VyY2U6IElGaWxlIC0gVGhlIHNvdXJjZSBmaWxlLlxuICogQHBhcmFtIG5vZGU6IFN5bnRheE5vZGUgLSBUaGUgc3ludGF4IG5vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXh0KHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlKSB7XG4gIHJldHVybiBzb3VyY2UudGV4dC5zdWJzdHJpbmcobm9kZS5zdGFydEluZGV4LCBub2RlLmVuZEluZGV4KTtcbn0iXX0= \ No newline at end of file diff --git a/build/src/utils/walk.js b/build/src/utils/walk.js index cc60803..d2e0acd 100644 --- a/build/src/utils/walk.js +++ b/build/src/utils/walk.js @@ -7,4 +7,4 @@ function walk(node) { return node_; } exports.default = walk; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Fsay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy93YWxrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsOENBQTBDO0FBQzFDLFNBQXdCLElBQUksQ0FBQyxJQUFnQjtJQUMzQyxJQUFJLEtBQUssR0FBRyxJQUFJLFdBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUNuRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFKRCx1QkFJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcclxuaW1wb3J0IHsgTm9kZSB9IGZyb20gJy4uL2xhbmcvY29tbW9uL25vZGUnXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHdhbGsobm9kZTogU3ludGF4Tm9kZSkge1xyXG4gIGxldCBub2RlXyA9IG5ldyBOb2RlKG5vZGUpO1xyXG4gIG5vZGVfLnN5bnRheE5vZGUuY2hpbGRyZW4ubWFwKGNoaWxkID0+IHdhbGsoY2hpbGQpKVxyXG4gIHJldHVybiBub2RlXztcclxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Fsay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy93YWxrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsOENBQTBDO0FBQzFDLFNBQXdCLElBQUksQ0FBQyxJQUFnQjtJQUMzQyxJQUFJLEtBQUssR0FBRyxJQUFJLFdBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUNuRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFKRCx1QkFJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcbmltcG9ydCB7IE5vZGUgfSBmcm9tICcuLi9sYW5nL2NvbW1vbi9ub2RlJ1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gd2Fsayhub2RlOiBTeW50YXhOb2RlKSB7XG4gIGxldCBub2RlXyA9IG5ldyBOb2RlKG5vZGUpO1xuICBub2RlXy5zeW50YXhOb2RlLmNoaWxkcmVuLm1hcChjaGlsZCA9PiB3YWxrKGNoaWxkKSlcbiAgcmV0dXJuIG5vZGVfO1xufSJdfQ== \ No newline at end of file diff --git a/corpus/ReactElementValidator.txt b/corpus/ReactElementValidator.txt new file mode 100644 index 0000000..6132f57 --- /dev/null +++ b/corpus/ReactElementValidator.txt @@ -0,0 +1,367 @@ +/** + * Copyright (c) 2014-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * ReactElementValidator provides a wrapper around a element factory + * which validates the props passed to the element. This is intended to be + * used only in DEV and could be replaced by a static type checker for languages + * that support it. + */ + +import lowPriorityWarning from 'shared/lowPriorityWarning'; +import isValidElementType from 'shared/isValidElementType'; +import getComponentName from 'shared/getComponentName'; +import { + getIteratorFn, + REACT_FORWARD_REF_TYPE, + REACT_FRAGMENT_TYPE, + REACT_ELEMENT_TYPE, +} from 'shared/ReactSymbols'; +import checkPropTypes from 'prop-types/checkPropTypes'; +import warning from 'shared/warning'; +import warningWithoutStack from 'shared/warningWithoutStack'; + +import ReactCurrentOwner from './ReactCurrentOwner'; +import {isValidElement, createElement, cloneElement} from './ReactElement'; +import ReactDebugCurrentFrame, { + setCurrentlyValidatingElement, +} from './ReactDebugCurrentFrame'; + +let propTypesMisspellWarningShown; + +if (__DEV__) { + propTypesMisspellWarningShown = false; +} + +function getDeclarationErrorAddendum() { + if (ReactCurrentOwner.current) { + const name = getComponentName(ReactCurrentOwner.current.type); + if (name) { + return '\n\nCheck the render method of `' + name + '`.'; + } + } + return ''; +} + +function getSourceInfoErrorAddendum(elementProps) { + if ( + elementProps !== null && + elementProps !== undefined && + elementProps.__source !== undefined + ) { + const source = elementProps.__source; + const fileName = source.fileName.replace(/^.*[\\\/]/, ''); + const lineNumber = source.lineNumber; + return '\n\nCheck your code at ' + fileName + ':' + lineNumber + '.'; + } + return ''; +} + +/** + * Warn if there's no key explicitly set on dynamic arrays of children or + * object keys are not valid. This allows us to keep track of children between + * updates. + */ +const ownerHasKeyUseWarning = {}; + +function getCurrentComponentErrorInfo(parentType) { + let info = getDeclarationErrorAddendum(); + + if (!info) { + const parentName = + typeof parentType === 'string' + ? parentType + : parentType.displayName || parentType.name; + if (parentName) { + info = `\n\nCheck the top-level render call using <${parentName}>.`; + } + } + return info; +} + +/** + * Warn if the element doesn't have an explicit key assigned to it. + * This element is in an array. The array could grow and shrink or be + * reordered. All children that haven't already been validated are required to + * have a "key" property assigned to it. Error statuses are cached so a warning + * will only be shown once. + * + * @internal + * @param element: ReactElement - Element that requires a key. + * @param parentType: any - element's parent's type. + */ +function validateExplicitKey(element, parentType) { + if (!element._store || element._store.validated || element.key != null) { + return; + } + element._store.validated = true; + + const currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType); + if (ownerHasKeyUseWarning[currentComponentErrorInfo]) { + return; + } + ownerHasKeyUseWarning[currentComponentErrorInfo] = true; + + // Usually the current owner is the offender, but if it accepts children as a + // property, it may be the creator of the child that's responsible for + // assigning it a key. + let childOwner = ''; + if ( + element && + element._owner && + element._owner !== ReactCurrentOwner.current + ) { + // Give the component that originally created this child. + childOwner = ` It was passed a child from ${getComponentName( + element._owner.type, + )}.`; + } + + setCurrentlyValidatingElement(element); + if (__DEV__) { + warning( + false, + 'Each child in an array or iterator should have a unique "key" prop.' + + '%s%s See https://fb.me/react-warning-keys for more information.', + currentComponentErrorInfo, + childOwner, + ); + } + setCurrentlyValidatingElement(null); +} + +/** + * Ensure that every element either is passed in a static location, in an + * array with an explicit keys property defined, or in an object literal + * with valid key property. + * + * @internal + * @param node: ReactNode - Statically passed child of any type. + * @param parentType: any - node's parent's type. + */ +function validateChildKeys(node, parentType) { + if (typeof node !== 'object') { + return; + } + if (Array.isArray(node)) { + for (let i = 0; i < node.length; i++) { + const child = node[i]; + if (isValidElement(child)) { + validateExplicitKey(child, parentType); + } + } + } else if (isValidElement(node)) { + // This element was passed in a valid location. + if (node._store) { + node._store.validated = true; + } + } else if (node) { + const iteratorFn = getIteratorFn(node); + if (typeof iteratorFn === 'function') { + // Entry iterators used to provide implicit keys, + // but now we print a separate warning for them later. + if (iteratorFn !== node.entries) { + const iterator = iteratorFn.call(node); + let step; + while (!(step = iterator.next()).done) { + if (isValidElement(step.value)) { + validateExplicitKey(step.value, parentType); + } + } + } + } + } +} + +/** + * Given an element, validate that its props follow the propTypes definition, + * provided by the type. + * + * @param element: ReactElement + */ +function validatePropTypes(element) { + const type = element.type; + let name, propTypes; + if (typeof type === 'function') { + // Class or functional component + name = type.displayName || type.name; + propTypes = type.propTypes; + } else if ( + typeof type === 'object' && + type !== null && + type.$$typeof === REACT_FORWARD_REF_TYPE + ) { + // ForwardRef + const functionName = type.render.displayName || type.render.name || ''; + name = functionName !== '' ? `ForwardRef(${functionName})` : 'ForwardRef'; + propTypes = type.propTypes; + } else { + return; + } + if (propTypes) { + setCurrentlyValidatingElement(element); + checkPropTypes( + propTypes, + element.props, + 'prop', + name, + ReactDebugCurrentFrame.getStackAddendum, + ); + setCurrentlyValidatingElement(null); + } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) { + propTypesMisspellWarningShown = true; + warningWithoutStack( + false, + 'Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', + name || 'Unknown', + ); + } + if (typeof type.getDefaultProps === 'function') { + warningWithoutStack( + type.getDefaultProps.isReactClassApproved, + 'getDefaultProps is only used on classic React.createClass ' + + 'definitions. Use a static property named `defaultProps` instead.', + ); + } +} + +/** + * Given a fragment, validate that it can only be provided with fragment props + * @param fragment: ReactElement + */ +function validateFragmentProps(fragment) { + setCurrentlyValidatingElement(fragment); + + const keys = Object.keys(fragment.props); + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + if (key !== 'children' && key !== 'key') { + warning( + false, + 'Invalid prop `%s` supplied to `React.Fragment`. ' + + 'React.Fragment can only have `key` and `children` props.', + key, + ); + break; + } + } + + if (fragment.ref !== null) { + warning(false, 'Invalid attribute `ref` supplied to `React.Fragment`.'); + } + + setCurrentlyValidatingElement(null); +} + +export function createElementWithValidation(type, props, children) { + const validType = isValidElementType(type); + + // We warn in this case but don't throw. We expect the element creation to + // succeed and there will likely be errors in render. + if (!validType) { + let info = ''; + if ( + type === undefined || + (typeof type === 'object' && + type !== null && + Object.keys(type).length === 0) + ) { + info += + ' You likely forgot to export your component from the file ' + + "it's defined in, or you might have mixed up default and named imports."; + } + + const sourceInfo = getSourceInfoErrorAddendum(props); + if (sourceInfo) { + info += sourceInfo; + } else { + info += getDeclarationErrorAddendum(); + } + + let typeString; + if (type === null) { + typeString = 'null'; + } else if (Array.isArray(type)) { + typeString = 'array'; + } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) { + typeString = `<${getComponentName(type.type) || 'Unknown'} />`; + info = + ' Did you accidentally export a JSX literal instead of a component?'; + } else { + typeString = typeof type; + } + + warning( + false, + 'React.createElement: type is invalid -- expected a string (for ' + + 'built-in components) or a class/function (for composite ' + + 'components) but got: %s.%s', + typeString, + info, + ); + } + + const element = createElement.apply(this, arguments); + + // The result can be nullish if a mock or a custom function is used. + // TODO: Drop this when these are no longer allowed as the type argument. + if (element == null) { + return element; + } + + // Skip key warning if the type isn't valid since our key validation logic + // doesn't expect a non-string/function type and can throw confusing errors. + // We don't want exception behavior to differ between dev and prod. + // (Rendering will throw with a helpful message and as soon as the type is + // fixed, the key warnings will appear.) + if (validType) { + for (let i = 2; i < arguments.length; i++) { + validateChildKeys(arguments[i], type); + } + } + + if (type === REACT_FRAGMENT_TYPE) { + validateFragmentProps(element); + } else { + validatePropTypes(element); + } + + return element; +} + +export function createFactoryWithValidation(type) { + const validatedFactory = createElementWithValidation.bind(null, type); + validatedFactory.type = type; + // Legacy hook: remove it + if (__DEV__) { + Object.defineProperty(validatedFactory, 'type', { + enumerable: false, + get: function() { + lowPriorityWarning( + false, + 'Factory.type is deprecated. Access the class directly ' + + 'before passing it to createFactory.', + ); + Object.defineProperty(this, 'type', { + value: type, + }); + return type; + }, + }); + } + + return validatedFactory; +} + +export function cloneElementWithValidation(element, props, children) { + const newElement = cloneElement.apply(this, arguments); + for (let i = 2; i < arguments.length; i++) { + validateChildKeys(arguments[i], newElement.type); + } + validatePropTypes(newElement); + return newElement; +} \ No newline at end of file diff --git a/corpus/nodes.txt b/corpus/nodes.txt new file mode 100644 index 0000000..250e0e3 --- /dev/null +++ b/corpus/nodes.txt @@ -0,0 +1,97 @@ +/** + * Copyright 2018 The AMP HTML Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS-IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { TransferrableNode } from '../transfer/TransferrableNodes'; +import { RenderableElement } from './RenderableElement'; +import { TransferrableKeys } from '../transfer/TransferrableKeys'; +import { getString } from './strings'; +import { NodeType } from '../worker-thread/dom/Node'; + +let NODES: Map; +let BASE_ELEMENT: HTMLElement; + +export function prepare(baseElement: Element): void { + NODES = new Map([[1, baseElement as RenderableElement], [2, baseElement as RenderableElement]]); + BASE_ELEMENT = baseElement as HTMLElement; +} + +export function isTextNode(node: Node | TransferrableNode): boolean { + return ('nodeType' in node ? node.nodeType : node[TransferrableKeys.nodeType]) === NodeType.TEXT_NODE; +} + +/** + * Create a real DOM Node from a skeleton Object (`{ nodeType, nodeName, attributes, children, data }`) + * @example Text node + * createNode({ nodeType:3, data:'foo' }) + * @example Element node + * createNode({ nodeType:1, nodeName:'div', attributes:[{ name:'a', value:'b' }], childNodes:[ ... ] }) + */ +export function createNode(skeleton: TransferrableNode): RenderableElement { + if (isTextNode(skeleton)) { + const node = document.createTextNode(getString(skeleton[TransferrableKeys.textContent] as number)); + storeNode(node, skeleton[TransferrableKeys._index_]); + return node as RenderableElement; + } + + const namespace: string | undefined = + skeleton[TransferrableKeys.namespaceURI] !== undefined ? getString(skeleton[TransferrableKeys.namespaceURI] as number) : undefined; + const node: HTMLElement | SVGElement = namespace + ? (document.createElementNS(namespace, getString(skeleton[TransferrableKeys.nodeName])) as SVGElement) + : document.createElement(getString(skeleton[TransferrableKeys.nodeName])); + // TODO(KB): Restore Properties + // skeleton.properties.forEach(property => { + // node[`${property.name}`] = property.value; + // }); + // ((skeleton as TransferrableElement)[TransferrableKeys.childNodes] || []).forEach(childNode => { + // if (childNode[TransferrableKeys.transferred] === NumericBoolean.FALSE) { + // node.appendChild(createNode(childNode as TransferrableNode)); + // } + // }); + + storeNode(node, skeleton[TransferrableKeys._index_]); + return node as RenderableElement; +} + +/** + * Returns the real DOM Element corresponding to a serialized Element object. + * @param id + * @return + */ +export function getNode(id: number): RenderableElement { + const node = NODES.get(id); + + if (node && node.nodeName === 'BODY') { + // If the node requested is the "BODY" + // Then we return the base node this specific comes from. + // This encapsulates each node. + return BASE_ELEMENT as RenderableElement; + } + return node as RenderableElement; +} + +/** + * Establish link between DOM `node` and worker-generated identifier `id`. + * + * These _shouldn't_ collide between instances of since + * each element creates it's own pool on both sides of the worker + * communication bridge. + * @param node + * @param id + */ +export function storeNode(node: HTMLElement | SVGElement | Text, id: number): void { + (node as RenderableElement)._index_ = id; + NODES.set(id, node as RenderableElement); +} \ No newline at end of file diff --git a/index.ts b/index.ts index ff08cba..ddaafdf 100644 --- a/index.ts +++ b/index.ts @@ -37,13 +37,13 @@ export default class Parser implements ParserInterface { } } -const path = `${process.cwd()}/corpus/example.js`; +const path = `${process.cwd()}/corpus/ReactElementValidator.txt`; const result = new Parser({ name: 'index.ts', path: path, text: FS.readFileSync(path, 'utf-8') }, { - language: 'javascript' + language: 'ts' }).parse(); -console.log(result); +// console.log(result); diff --git a/src/lang/common/ast.ts b/src/lang/common/ast.ts index 02f5f55..b90127d 100644 --- a/src/lang/common/ast.ts +++ b/src/lang/common/ast.ts @@ -6,6 +6,7 @@ import range from "../../utils/range"; import Source from "../../interfaces/Source"; import TextRange from "../../interfaces/TextRange"; import xdoc from 'xdoc-parser'; +import * as _ from 'lodash' export interface ASTNode extends TextRange { @@ -38,17 +39,28 @@ export interface ASTNode extends TextRange { } } +export function isASTNode(object: object): object is ASTNode { + return object && 'type' in object && 'text' in object && 'children' in object; +} + export function createASTNode(source: Source, node: SyntaxNode): ASTNode +export function createASTNode(source: Source, node: SyntaxNode, properties: object) export function createASTNode(source: Source, node: SyntaxNode, children: object[]): ASTNode export function createASTNode(source: Source, node: SyntaxNode, children: object[], properties: object) -export function createASTNode(source: Source, node: SyntaxNode, context: ASTNode, document: boolean): ASTNode +export function createASTNode(source: Source, node: SyntaxNode, context: ASTNode, document: boolean): ASTNode export function createASTNode(source: Source, node: SyntaxNode, arg1?: any, arg2?: any): ASTNode { let context, children = [], document = typeof arg2 === 'boolean' && arg2 === true, properties; - if (Array.isArray(arg1)) children = arg1; - else context = arg1; - if (typeof arg2 === 'object') { + if (_.isPlainObject(arg1) && !isASTNode(arg1)) { + properties = arg1; + } else if (_.isPlainObject(arg1) && isASTNode(arg1)) { + context = arg1; + } else if (_.isArray(arg1)) { + children = arg1; + } + + if (_.isPlainObject(arg2)) { properties = arg2; } diff --git a/src/lang/javascript/index.ts b/src/lang/javascript/index.ts index 2ad1445..ad9a038 100644 --- a/src/lang/javascript/index.ts +++ b/src/lang/javascript/index.ts @@ -32,7 +32,7 @@ export default class JavaScriptParser implements ParserInterface { } parse(): ASTNode[] { const visitor = new JavaScriptVisitor(this.source); - const root = walk(this.tree.rootNode); + const root = walk(this.tree_.rootNode); // console.time('visit') root.visit(visitor) // console.timeEnd('visit') diff --git a/src/lang/javascript/visitor.ts b/src/lang/javascript/visitor.ts index a7848b9..1036878 100644 --- a/src/lang/javascript/visitor.ts +++ b/src/lang/javascript/visitor.ts @@ -110,11 +110,12 @@ export class JavaScriptVisitor implements NodeVisitor { 'intersection_type', 'union_type', 'class_body', 'extends_clause', - 'unary_expression', 'binary_expression', + 'unary_expression', 'binary_expression', 'parenthesized_expression', 'member_expression', 'statement_block', 'return_statement', 'export_statement', 'expression_statement', // A call_signature can also be a non-contextual node 'call_signature', - 'internal_module' + 'internal_module', + 'if_statement' )) { return this.visitNonTerminal(node, properties) } @@ -123,13 +124,13 @@ export class JavaScriptVisitor implements NodeVisitor { if (match(node, 'identifier', 'extends', 'property_identifier', 'accessibility_modifier', 'null', 'undefined', 'return', - 'get', 'function', 'namespace', + 'get', 'function', 'namespace', 'if', 'const' )) { return this.visitTerminal(node); } - + log.report(this.source, node, ErrorType.NodeTypeNotYetSupported); - break; + return; } } @@ -137,7 +138,7 @@ export class JavaScriptVisitor implements NodeVisitor { let children: ASTNode[] = []; for (let i = 0; i < nodes.length; i++) { const node = nodes[i]; - if (!node.type.match(/[<>(){},:;\[\]&|=\+\-\*\/]/) && node.type !== '...') { + if (!node.type.match(/[<>(){},:;\[\]&|=\+\-\*\/!.]/) && node.type !== '...') { const child = this.visitNode(node); if (child) children.push(child); } @@ -177,8 +178,8 @@ export class JavaScriptVisitor implements NodeVisitor { for (let i = 0; i < exports.length; i++) { const export_ = exports[i]; const context = comment.context; - for (let j = 0; j < context.children.length; j++) { - if (context.children[i].type === export_.type) { + for (let j = 0; context && j < context.children.length; j++) { + if (context.children[i] && context.children[i].type === export_.type) { matched[getStartLocation(export_)] = true; comment.context.properties = Object.assign( comment.context.properties || {}, @@ -226,10 +227,11 @@ export class JavaScriptVisitor implements NodeVisitor { case 'property_signature': case 'public_field_definition': case 'method_definition': + case 'lexical_declaration': return this.visitNonTerminal(node, properties); default: log.report(this.source, node, ErrorType.NodeTypeNotYetSupported); - break; + return; } } @@ -251,10 +253,16 @@ export class JavaScriptVisitor implements NodeVisitor { private visitExpressionStatement = (node: SyntaxNode, properties: Partial): ASTNode => { let children = node.children; const child = children.shift(); + if (match(child, 'internal_module')) { return this.visitInternalModule(child, properties) } - return this.visitNonTerminal(node); + + if (match(child, 'function')) { + if (properties) return this.visitContext(child); + } + + return this.visitNonTerminal(child) } /* Modules */ @@ -326,6 +334,13 @@ export class JavaScriptVisitor implements NodeVisitor { return this.visitExpressionStatement(node, properties); } + // Handle special cases where a function has a statement_block + if (match(node, 'function')) { + _.remove(children, child => match(child, 'statement_block')) + console.log(children); + return createASTNode(this.source, node, this.visitChildren(children), properties); + } + return createASTNode(this.source, node, this.visitChildren(children), properties); } diff --git a/src/lang/typescript/index.ts b/src/lang/typescript/index.ts index b4337f8..260e7c0 100644 --- a/src/lang/typescript/index.ts +++ b/src/lang/typescript/index.ts @@ -4,7 +4,6 @@ import ParserInterface from '../../interfaces/ParserInterface'; import Source from '../../interfaces/Source'; import walk from '../../utils/walk'; import { TypeScriptVisitor } from './visitor'; -import log from '../../utils/log'; /** @@ -32,7 +31,7 @@ export default class TypeScriptParser implements ParserInterface { } parse = () => { const visitor = new TypeScriptVisitor(this.source); - const root = walk(this.tree.rootNode); + const root = walk(this.tree_.rootNode); // console.time('visit') root.visit(visitor) // console.timeEnd('visit') @@ -40,6 +39,6 @@ export default class TypeScriptParser implements ParserInterface { } get tree (): Parser.Tree { - return this.tree; + return this.tree_; } } diff --git a/src/lang/typescript/visitor.ts b/src/lang/typescript/visitor.ts index 2064f8f..a98edba 100644 --- a/src/lang/typescript/visitor.ts +++ b/src/lang/typescript/visitor.ts @@ -1,5 +1,5 @@ import { createASTNode, ASTNode } from "../common/ast"; -import { isJavaDocComment } from "../../utils/comment"; +import { isJavaDocComment, isLegalComment } from "../../utils/comment"; import { NodeProperties, NodeInheritance } from "../common/emca"; import { NodeVisitor } from "../common/node"; import { sibling } from "../../utils/sibling"; @@ -110,11 +110,13 @@ export class TypeScriptVisitor implements NodeVisitor { 'intersection_type', 'union_type', 'class_body', 'extends_clause', - 'unary_expression', 'binary_expression', + 'unary_expression', 'binary_expression', 'member_expression', 'statement_block', 'return_statement', 'export_statement', 'expression_statement', // A call_signature can also be a non-contextual node 'call_signature', - 'internal_module' + 'internal_module', + 'variable_declarator', + 'object' )) { return this.visitNonTerminal(node, properties) } @@ -123,7 +125,7 @@ export class TypeScriptVisitor implements NodeVisitor { if (match(node, 'identifier', 'extends', 'property_identifier', 'accessibility_modifier', 'string', 'void', 'boolean', 'null', 'undefined', 'number', 'return', - 'get', 'function', 'namespace' + 'get', 'function', 'namespace', 'const' )) { return this.visitTerminal(node); } @@ -179,8 +181,8 @@ export class TypeScriptVisitor implements NodeVisitor { for (let i = 0; i < exports.length; i++) { const export_ = exports[i]; const context = comment.context; - for (let j = 0; j < context.children.length; j++) { - if (context.children[i].type === export_.type) { + for (let j = 0; context && j < context.children.length; j++) { + if (context.children[i] && context.children[i].type === export_.type) { matched[getStartLocation(export_)] = true; comment.context.properties = Object.assign( comment.context.properties || {}, @@ -199,7 +201,7 @@ export class TypeScriptVisitor implements NodeVisitor { } private visitComment = (node: SyntaxNode): ASTNode => { - if (isJavaDocComment(this.source, node)) { + if (isJavaDocComment(this.source, node) && !isLegalComment(this.source, node)) { const nextSibling = sibling(node); if (nextSibling) { return createASTNode(this.source, node, this.visitContext(nextSibling, {}), true) @@ -229,6 +231,7 @@ export class TypeScriptVisitor implements NodeVisitor { case 'property_signature': case 'public_field_definition': case 'method_definition': + case 'lexical_declaration': return this.visitNonTerminal(node, properties); default: log.report(this.source, node, ErrorType.NodeTypeNotYetSupported); @@ -254,10 +257,16 @@ export class TypeScriptVisitor implements NodeVisitor { private visitExpressionStatement = (node: SyntaxNode, properties: Partial): ASTNode => { let children = node.children; const child = children.shift(); + if (match(child, 'internal_module')) { return this.visitInternalModule(child, properties) } - return this.visitNonTerminal(node); + + if (match(child, 'function')) { + if (properties) return this.visitContext(child, properties); + } + + return this.visitNonTerminal(child) } /* Modules */ @@ -329,6 +338,11 @@ export class TypeScriptVisitor implements NodeVisitor { return this.visitExpressionStatement(node, properties); } + if (match(node, 'function')) { + _.remove(children, child => match(child, 'statement_block')) + return createASTNode(this.source, node, this.visitChildren(children), properties); + } + return createASTNode(this.source, node, this.visitChildren(children), properties); } From 74e513d03e9b889d4cc7db9daa75972048ede916 Mon Sep 17 00:00:00 2001 From: Takeshi Date: Thu, 23 Aug 2018 14:48:27 -0600 Subject: [PATCH 18/32] Update: Replace return type --- build/src/lang/typescript/index.d.ts | 5 ++--- build/src/lang/typescript/index.js | 4 +--- src/lang/typescript/index.ts | 9 ++++----- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/build/src/lang/typescript/index.d.ts b/build/src/lang/typescript/index.d.ts index 3f98f69..0203ee3 100644 --- a/build/src/lang/typescript/index.d.ts +++ b/build/src/lang/typescript/index.d.ts @@ -1,16 +1,15 @@ import * as Parser from 'tree-sitter'; import ParserInterface from '../../interfaces/ParserInterface'; import Source from '../../interfaces/Source'; +import { ASTNode } from '../common/ast'; /** * A class that parses JavaScript comments. * * # API * - * ``` * @class JavaScriptParser * @implements IParser * @export default - * ``` */ export default class TypeScriptParser implements ParserInterface { private source; @@ -18,6 +17,6 @@ export default class TypeScriptParser implements ParserInterface { private parser; private tree_; constructor(source: Source, options: any); - parse: () => import("../common/ast").ASTNode[]; + parse: () => ASTNode[]; readonly tree: Parser.Tree; } diff --git a/build/src/lang/typescript/index.js b/build/src/lang/typescript/index.js index 5da52fa..8d06c9e 100644 --- a/build/src/lang/typescript/index.js +++ b/build/src/lang/typescript/index.js @@ -9,11 +9,9 @@ const visitor_1 = require("./visitor"); * * # API * - * ``` * @class JavaScriptParser * @implements IParser * @export default - * ``` */ class TypeScriptParser { constructor(source, options) { @@ -36,4 +34,4 @@ class TypeScriptParser { } } exports.default = TypeScriptParser; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy90eXBlc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNDO0FBQ3RDLHFEQUFxRDtBQUdyRCwyQ0FBb0M7QUFDcEMsdUNBQThDO0FBRzlDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFxQixnQkFBZ0I7SUFLbkMsWUFBWSxNQUFjLEVBQUUsT0FBWTtRQU94QyxVQUFLLEdBQUcsR0FBRyxFQUFFO1lBQ1gsTUFBTSxPQUFPLEdBQUcsSUFBSSwyQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbkQsTUFBTSxJQUFJLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdkMsd0JBQXdCO1lBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDbkIsMkJBQTJCO1lBQzNCLE9BQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzFCLENBQUMsQ0FBQTtRQWJDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQVVELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0NBQ0Y7QUF4QkQsbUNBd0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcbmltcG9ydCAqIGFzIFR5cGVTY3JpcHQgZnJvbSAndHJlZS1zaXR0ZXItdHlwZXNjcmlwdCc7XG5pbXBvcnQgUGFyc2VySW50ZXJmYWNlIGZyb20gJy4uLy4uL2ludGVyZmFjZXMvUGFyc2VySW50ZXJmYWNlJztcbmltcG9ydCBTb3VyY2UgZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2UnO1xuaW1wb3J0IHdhbGsgZnJvbSAnLi4vLi4vdXRpbHMvd2Fsayc7XG5pbXBvcnQgeyBUeXBlU2NyaXB0VmlzaXRvciB9IGZyb20gJy4vdmlzaXRvcic7XG5cblxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgcGFyc2VzIEphdmFTY3JpcHQgY29tbWVudHMuXG4gKiBcbiAqICMgQVBJXG4gKiBcbiAqIGBgYFxuICogQGNsYXNzIEphdmFTY3JpcHRQYXJzZXJcbiAqIEBpbXBsZW1lbnRzIElQYXJzZXJcbiAqIEBleHBvcnQgZGVmYXVsdFxuICogYGBgXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFR5cGVTY3JpcHRQYXJzZXIgaW1wbGVtZW50cyBQYXJzZXJJbnRlcmZhY2Uge1xuICBwcml2YXRlIHNvdXJjZTogU291cmNlO1xuICBwcml2YXRlIG9wdGlvbnM6IGFueTtcbiAgcHJpdmF0ZSBwYXJzZXI6IFBhcnNlcjtcbiAgcHJpdmF0ZSB0cmVlXzogUGFyc2VyLlRyZWU7XG4gIGNvbnN0cnVjdG9yKHNvdXJjZTogU291cmNlLCBvcHRpb25zOiBhbnkpIHtcbiAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucyA9IHt9LCBvcHRpb25zIHx8IHt9KTtcbiAgICB0aGlzLnBhcnNlciA9IG5ldyBQYXJzZXIoKTtcbiAgICB0aGlzLnBhcnNlci5zZXRMYW5ndWFnZShUeXBlU2NyaXB0KTtcbiAgICB0aGlzLnRyZWVfID0gdGhpcy5wYXJzZXIucGFyc2UodGhpcy5zb3VyY2UudGV4dCk7XG4gIH1cbiAgcGFyc2UgPSAoKSA9PiB7XG4gICAgY29uc3QgdmlzaXRvciA9IG5ldyBUeXBlU2NyaXB0VmlzaXRvcih0aGlzLnNvdXJjZSk7XG4gICAgY29uc3Qgcm9vdCA9IHdhbGsodGhpcy50cmVlXy5yb290Tm9kZSk7XG4gICAgLy8gY29uc29sZS50aW1lKCd2aXNpdCcpXG4gICAgcm9vdC52aXNpdCh2aXNpdG9yKVxuICAgIC8vIGNvbnNvbGUudGltZUVuZCgndmlzaXQnKVxuICAgIHJldHVybiB2aXNpdG9yLmdldEFTVCgpO1xuICB9XG5cbiAgZ2V0IHRyZWUgKCk6IFBhcnNlci5UcmVlIHtcbiAgICByZXR1cm4gdGhpcy50cmVlXztcbiAgfVxufVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy90eXBlc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNDO0FBQ3RDLHFEQUFxRDtBQUdyRCwyQ0FBb0M7QUFDcEMsdUNBQThDO0FBSTlDOzs7Ozs7OztHQVFHO0FBQ0gsTUFBcUIsZ0JBQWdCO0lBS25DLFlBQVksTUFBYyxFQUFFLE9BQVk7UUFPeEMsVUFBSyxHQUFHLEdBQWMsRUFBRTtZQUN0QixNQUFNLE9BQU8sR0FBRyxJQUFJLDJCQUFpQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuRCxNQUFNLElBQUksR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN2Qyx3QkFBd0I7WUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUNuQiwyQkFBMkI7WUFDM0IsT0FBTyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDMUIsQ0FBQyxDQUFBO1FBYkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBVUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7Q0FDRjtBQXhCRCxtQ0F3QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBQYXJzZXIgZnJvbSAndHJlZS1zaXR0ZXInO1xuaW1wb3J0ICogYXMgVHlwZVNjcmlwdCBmcm9tICd0cmVlLXNpdHRlci10eXBlc2NyaXB0JztcbmltcG9ydCBQYXJzZXJJbnRlcmZhY2UgZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9QYXJzZXJJbnRlcmZhY2UnO1xuaW1wb3J0IFNvdXJjZSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZSc7XG5pbXBvcnQgd2FsayBmcm9tICcuLi8uLi91dGlscy93YWxrJztcbmltcG9ydCB7IFR5cGVTY3JpcHRWaXNpdG9yIH0gZnJvbSAnLi92aXNpdG9yJztcbmltcG9ydCB7IEFTVE5vZGUgfSBmcm9tICcuLi9jb21tb24vYXN0JztcblxuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCBwYXJzZXMgSmF2YVNjcmlwdCBjb21tZW50cy5cbiAqXG4gKiAjIEFQSVxuICpcbiAqIEBjbGFzcyBKYXZhU2NyaXB0UGFyc2VyXG4gKiBAaW1wbGVtZW50cyBJUGFyc2VyXG4gKiBAZXhwb3J0IGRlZmF1bHRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVHlwZVNjcmlwdFBhcnNlciBpbXBsZW1lbnRzIFBhcnNlckludGVyZmFjZSB7XG4gIHByaXZhdGUgc291cmNlOiBTb3VyY2U7XG4gIHByaXZhdGUgb3B0aW9uczogYW55O1xuICBwcml2YXRlIHBhcnNlcjogUGFyc2VyO1xuICBwcml2YXRlIHRyZWVfOiBQYXJzZXIuVHJlZTtcbiAgY29uc3RydWN0b3Ioc291cmNlOiBTb3VyY2UsIG9wdGlvbnM6IGFueSkge1xuICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5vcHRpb25zID0ge30sIG9wdGlvbnMgfHwge30pO1xuICAgIHRoaXMucGFyc2VyID0gbmV3IFBhcnNlcigpO1xuICAgIHRoaXMucGFyc2VyLnNldExhbmd1YWdlKFR5cGVTY3JpcHQpO1xuICAgIHRoaXMudHJlZV8gPSB0aGlzLnBhcnNlci5wYXJzZSh0aGlzLnNvdXJjZS50ZXh0KTtcbiAgfVxuICBwYXJzZSA9ICgpOiBBU1ROb2RlW10gPT4ge1xuICAgIGNvbnN0IHZpc2l0b3IgPSBuZXcgVHlwZVNjcmlwdFZpc2l0b3IodGhpcy5zb3VyY2UpO1xuICAgIGNvbnN0IHJvb3QgPSB3YWxrKHRoaXMudHJlZV8ucm9vdE5vZGUpO1xuICAgIC8vIGNvbnNvbGUudGltZSgndmlzaXQnKVxuICAgIHJvb3QudmlzaXQodmlzaXRvcilcbiAgICAvLyBjb25zb2xlLnRpbWVFbmQoJ3Zpc2l0JylcbiAgICByZXR1cm4gdmlzaXRvci5nZXRBU1QoKTtcbiAgfVxuXG4gIGdldCB0cmVlICgpOiBQYXJzZXIuVHJlZSB7XG4gICAgcmV0dXJuIHRoaXMudHJlZV87XG4gIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/src/lang/typescript/index.ts b/src/lang/typescript/index.ts index 260e7c0..1a034fd 100644 --- a/src/lang/typescript/index.ts +++ b/src/lang/typescript/index.ts @@ -4,18 +4,17 @@ import ParserInterface from '../../interfaces/ParserInterface'; import Source from '../../interfaces/Source'; import walk from '../../utils/walk'; import { TypeScriptVisitor } from './visitor'; +import { ASTNode } from '../common/ast'; /** * A class that parses JavaScript comments. - * + * * # API - * - * ``` + * * @class JavaScriptParser * @implements IParser * @export default - * ``` */ export default class TypeScriptParser implements ParserInterface { private source: Source; @@ -29,7 +28,7 @@ export default class TypeScriptParser implements ParserInterface { this.parser.setLanguage(TypeScript); this.tree_ = this.parser.parse(this.source.text); } - parse = () => { + parse = (): ASTNode[] => { const visitor = new TypeScriptVisitor(this.source); const root = walk(this.tree_.rootNode); // console.time('visit') From 7739bab09ecb51ccb72d31ab2adfdd97556ddc0c Mon Sep 17 00:00:00 2001 From: Takeshi Date: Thu, 23 Aug 2018 21:50:19 -0600 Subject: [PATCH 19/32] Update: Refactor and Doc (WIP) --- README.md | 43 ++++++++++++++++--- index.ts | 13 +++--- src/ParserFactory.ts | 4 +- src/interfaces/ASTNode.ts | 33 ++++++++++++++ .../{ParserInterface.ts => BaseParser.ts} | 7 ++- src/lang/common/ast.ts | 35 +-------------- src/lang/common/emca.ts | 16 ------- src/lang/common/node.ts | 15 +++---- src/lang/common/parser.ts | 14 ++++++ src/lang/common/visitor.ts | 8 ++++ src/lang/javascript/index.ts | 28 +++++------- src/lang/javascript/properties.ts | 16 +++++++ src/lang/javascript/visitor.ts | 27 ++++++------ src/lang/typescript/index.ts | 27 +++++------- src/lang/typescript/properties.ts | 16 +++++++ src/lang/typescript/visitor.ts | 25 +++++------ 16 files changed, 195 insertions(+), 132 deletions(-) create mode 100644 src/interfaces/ASTNode.ts rename src/interfaces/{ParserInterface.ts => BaseParser.ts} (63%) delete mode 100644 src/lang/common/emca.ts create mode 100644 src/lang/common/parser.ts create mode 100644 src/lang/common/visitor.ts create mode 100644 src/lang/javascript/properties.ts create mode 100644 src/lang/typescript/properties.ts diff --git a/README.md b/README.md index e55abb2..c645efa 100644 --- a/README.md +++ b/README.md @@ -2,17 +2,50 @@ [![Build Status](https://travis-ci.org/mr-doc/mr-doc-parser.svg?branch=master)](https://travis-ci.org/mr-doc/mr-doc-parser) -## Specification +# Introduction -A parser must implement the following interface: +This is the official parser for Mr. Doc. The parser uses [node-tree-sitter](https://github.com/tree-sitter/node-tree-sitter) to parse many types of programming languages. It also uses [xdoc-parser](https://github.com/iwatakeshi/xdoc-parser) to parse JSDoc-like syntaxes in a comment. Note that `mr-doc-parser` is in alpha. Thus, the algorithms may change over time. At the moment, there are two languages that are supported by `mr-doc-parser`: JavaScript and TypeScript. More languages can be added as long as [tree-sitter](https://github.com/tree-sitter) can parse them. + +# Creating a Language Parser + +## Extend the Language Parser + +To create a parser, simply extend an abstract class named `Parser` in `src/lang/common/parser.ts`: ```typescript -interface IParser { - parse: (file: IFile) => IParseResult +abstract class Parser { + constructor(source: Source, options: any) {/* ... */} + abstract parse(): ASTNode[] + abstract get tree(): Tree } ``` - +## Implement the Language Visitor + +The next step is to walk the tree that parsed by `tree-sitter` and to wrap each node as an `ASTNode` type. +Bear in mind that `tree-sitter` keeps its tree as a DOM-like structure. + +It may seem like an additional step to re-wrap the nodes, but it is a necessary step to make visiting each node a bit easier: + +```ts +// Example for JavaScript +import * as Parser from 'tree-sitter'; +import * as JavaScript from 'tree-sitter-javascript'; +import walk from 'path to [src/utils/walk]' + +// Create the parser +const parser = new Parser(); +// Set the langauge +parser.setLangauge(JavaScript); +// Parse the source code +const tree = parser.parse('...'); +// Walk the tree +const nodes = walk(tree); + +``` + +Once the tree is wrapped, we need to extend the visitor + The output should be in the following format: diff --git a/index.ts b/index.ts index ddaafdf..cba3d21 100644 --- a/index.ts +++ b/index.ts @@ -1,6 +1,6 @@ import Source from './src/interfaces/Source'; import ParserFactory from './src/ParserFactory'; -import ParserInterface from './src/interfaces/ParserInterface'; +import Parser from './src/lang/common/parser'; import * as FS from 'fs'; import { Tree } from 'tree-sitter'; // import { ASTNode } from './src/lang/common/ast'; @@ -23,11 +23,12 @@ import { Tree } from 'tree-sitter'; * * ``` */ -export default class Parser implements ParserInterface { +export default class MainParser extends Parser { - private parser: ParserInterface; - constructor(file: Source, options: any = {}) { - this.parser = (new ParserFactory(file, options)).getParser(); + private parser: Parser; + constructor(source: Source, options: any) { + super(source, options) + this.parser = (new ParserFactory(this.source, this.options)).getParser(); } parse = () => { return this.parser.parse() @@ -38,7 +39,7 @@ export default class Parser implements ParserInterface { } const path = `${process.cwd()}/corpus/ReactElementValidator.txt`; -const result = new Parser({ +const result = new MainParser({ name: 'index.ts', path: path, text: FS.readFileSync(path, 'utf-8') diff --git a/src/ParserFactory.ts b/src/ParserFactory.ts index 86eeed6..cdd7814 100644 --- a/src/ParserFactory.ts +++ b/src/ParserFactory.ts @@ -1,5 +1,5 @@ import Source from "./interfaces/Source"; -import ParserInterface from "./interfaces/ParserInterface"; +import Parser from "./lang/common/base.parser"; import JavaScriptParser from "./lang/javascript"; import TypeScriptParser from './lang/typescript'; @@ -13,7 +13,7 @@ export default class ParserFactory { Object.assign(this.options, options) } - getParser = (): ParserInterface => { + getParser = (): Parser => { switch (this.options.language.toLowerCase()) { case 'js': case 'javascript': diff --git a/src/interfaces/ASTNode.ts b/src/interfaces/ASTNode.ts new file mode 100644 index 0000000..7b253b3 --- /dev/null +++ b/src/interfaces/ASTNode.ts @@ -0,0 +1,33 @@ +import TextRange from "./TextRange"; +import { RemarkNode } from "xdoc-parser/src/XDocParser"; +import { DocumentationNode } from "xdoc-parser/src/XDocASTNode"; + +export default interface ASTNode extends TextRange { + /** + * @property - The type of node. + */ + type: string, + /** + * @property - The context string. + */ + text: string, + /** + * @property - The node's children. + */ + children: ASTNode[] | undefined[], + /** + * @property - The context node that a comment node refers to. + */ + context: ASTNode, + /** + * @property - The properties that a ASTNode may possess. + */ + properties?: object + /** + * @property - The parsed XDoc comment. + */ + comment?: { + markdown: RemarkNode, + documentation: Partial + } +} \ No newline at end of file diff --git a/src/interfaces/ParserInterface.ts b/src/interfaces/BaseParser.ts similarity index 63% rename from src/interfaces/ParserInterface.ts rename to src/interfaces/BaseParser.ts index 9485cc1..655333c 100644 --- a/src/interfaces/ParserInterface.ts +++ b/src/interfaces/BaseParser.ts @@ -3,9 +3,12 @@ import { ASTNode } from "../lang/common/ast"; import { Tree } from "tree-sitter"; // import IResult from "./IResult"; -export default abstract class ParserInterface { +export default abstract class Parser { + protected source: Source + protected options: any constructor(source: Source, options: any) { - + this.source = source; + this.options = options || {}; } abstract parse(): ASTNode[] abstract get tree(): Tree diff --git a/src/lang/common/ast.ts b/src/lang/common/ast.ts index b90127d..9806619 100644 --- a/src/lang/common/ast.ts +++ b/src/lang/common/ast.ts @@ -1,43 +1,10 @@ -import { DocumentationNode } from 'xdoc-parser/src/XDocASTNode'; -import { RemarkNode } from 'xdoc-parser/src/XDocParser'; import { SyntaxNode } from "tree-sitter"; import { text } from "../../utils/text"; import range from "../../utils/range"; import Source from "../../interfaces/Source"; -import TextRange from "../../interfaces/TextRange"; import xdoc from 'xdoc-parser'; import * as _ from 'lodash' - - -export interface ASTNode extends TextRange { - /** - * @property - The type of node. - */ - type: string, - /** - * @property - The context string. - */ - text: string, - /** - * @property - The node's children. - */ - children: ASTNode[] | undefined[], - /** - * @property - The context node that a comment node refers to. - */ - context: ASTNode, - /** - * @property - The properties that a ASTNode may possess. - */ - properties?: object - /** - * @property - The parsed XDoc comment. - */ - comment?: { - markdown: RemarkNode, - documentation: Partial - } -} +import ASTNode from "../../interfaces/ASTNode"; export function isASTNode(object: object): object is ASTNode { return object && 'type' in object && 'text' in object && 'children' in object; diff --git a/src/lang/common/emca.ts b/src/lang/common/emca.ts deleted file mode 100644 index 79ee683..0000000 --- a/src/lang/common/emca.ts +++ /dev/null @@ -1,16 +0,0 @@ -export interface NodeProperties { - exports: Partial - inheritance: Partial - namespace: boolean, - module: boolean -} - -export interface NodeExports { - export: boolean, - default: boolean -} - -export interface NodeInheritance { - extends: boolean, - implements: boolean -} \ No newline at end of file diff --git a/src/lang/common/node.ts b/src/lang/common/node.ts index e1a40ee..1bfa183 100644 --- a/src/lang/common/node.ts +++ b/src/lang/common/node.ts @@ -1,19 +1,16 @@ -import { ASTNode } from "./ast"; import { SyntaxNode } from "tree-sitter"; +import Visitor from "./visitor"; export interface TreeSitterNode { - visit(visitor: NodeVisitor): void -} - -export interface NodeVisitor { - getAST(): ASTNode[] - visitNode(node: SyntaxNode, properties?: object): ASTNode - visitChildren(nodes: SyntaxNode[], properties?: object): ASTNode[] + visit(visitor: Visitor): void } +/** + * A class that wraps a SyntaxNode as a Node + */ export class Node implements TreeSitterNode { constructor(public syntaxNode: SyntaxNode) { } - visit = (visitor: NodeVisitor): void => { + visit = (visitor: Visitor): void => { visitor.visitNode(this.syntaxNode); } } \ No newline at end of file diff --git a/src/lang/common/parser.ts b/src/lang/common/parser.ts new file mode 100644 index 0000000..355da6a --- /dev/null +++ b/src/lang/common/parser.ts @@ -0,0 +1,14 @@ +import Source from "../../interfaces/Source"; +import { Tree } from "tree-sitter"; +import ASTNode from "../../interfaces/ASTNode"; + +export default abstract class Parser { + protected source: Source + protected options: any + constructor(source: Source, options: any) { + this.source = source; + this.options = options || {}; + } + abstract parse(): ASTNode[] + abstract get tree(): Tree +} \ No newline at end of file diff --git a/src/lang/common/visitor.ts b/src/lang/common/visitor.ts new file mode 100644 index 0000000..eba44fe --- /dev/null +++ b/src/lang/common/visitor.ts @@ -0,0 +1,8 @@ +import { SyntaxNode } from "tree-sitter"; +import ASTNode from "../../interfaces/ASTNode"; + +export default abstract class Visitor { + abstract getAST(): ASTNode[] + abstract visitNode(node: SyntaxNode, properties?: object): ASTNode + abstract visitChildren(nodes: SyntaxNode[], properties?: object): ASTNode[] +} \ No newline at end of file diff --git a/src/lang/javascript/index.ts b/src/lang/javascript/index.ts index ad9a038..196a3d8 100644 --- a/src/lang/javascript/index.ts +++ b/src/lang/javascript/index.ts @@ -1,10 +1,10 @@ -import * as Parser from 'tree-sitter'; +import * as TreeSitter from 'tree-sitter'; import * as JavaScript from 'tree-sitter-javascript'; -import ParserInterface from '../../interfaces/ParserInterface'; +import Parser from '../common/parser'; import Source from '../../interfaces/Source'; -import { ASTNode } from '../common/ast'; import { JavaScriptVisitor } from './visitor'; import walk from '../../utils/walk'; +import ASTNode from '../../interfaces/ASTNode'; /** * A class that parses JavaScript comments. @@ -17,28 +17,22 @@ import walk from '../../utils/walk'; * @export default * ``` */ -export default class JavaScriptParser implements ParserInterface { - - private source: Source; - private options: any; - private parser: Parser; - private tree_: Parser.Tree; +export default class JavaScriptParser extends Parser { + private parser: TreeSitter; + private tree_: TreeSitter.Tree; constructor(source: Source, options: any) { - this.source = source; - Object.assign(this.options = {}, options || {}); - this.parser = new Parser(); + super(source, options); + this.parser = new TreeSitter(); this.parser.setLanguage(JavaScript); this.tree_ = this.parser.parse(this.source.text); } parse(): ASTNode[] { const visitor = new JavaScriptVisitor(this.source); - const root = walk(this.tree_.rootNode); - // console.time('visit') - root.visit(visitor) - // console.timeEnd('visit') + const nodes = walk(this.tree_.rootNode); + nodes.visit(visitor) return visitor.getAST(); } - get tree (): Parser.Tree { + get tree (): TreeSitter.Tree { return this.tree_; } } \ No newline at end of file diff --git a/src/lang/javascript/properties.ts b/src/lang/javascript/properties.ts new file mode 100644 index 0000000..c4aa4e7 --- /dev/null +++ b/src/lang/javascript/properties.ts @@ -0,0 +1,16 @@ +export interface JavaScriptProperties { + exports: Partial + inheritance: Partial + namespace: boolean, + module: boolean +} + +export interface JavaScriptExports { + export: boolean, + default: boolean +} + +export interface JavaScriptInheritance { + extends: boolean, + implements: boolean +} \ No newline at end of file diff --git a/src/lang/javascript/visitor.ts b/src/lang/javascript/visitor.ts index 1036878..d6e1284 100644 --- a/src/lang/javascript/visitor.ts +++ b/src/lang/javascript/visitor.ts @@ -1,18 +1,19 @@ -import { createASTNode, ASTNode } from "../common/ast"; +import { createASTNode } from "../common/ast"; import { isJavaDocComment } from "../../utils/comment"; -import { NodeProperties, NodeInheritance } from "../common/emca"; -import { NodeVisitor } from "../common/node"; import { sibling } from "../../utils/sibling"; import { SyntaxNode } from "tree-sitter"; import * as _ from 'lodash'; import log, { ErrorType } from "../../utils/log"; import match from "../../utils/match"; import Source from "../../interfaces/Source"; +import Visitor from "../common/visitor"; +import ASTNode from "../../interfaces/ASTNode"; +import { JavaScriptProperties, JavaScriptInheritance } from "./properties"; /** * A class that visits ASTNodes from a TypeScript tree. */ -export class JavaScriptVisitor implements NodeVisitor { +export class JavaScriptVisitor implements Visitor { private ast: ASTNode[] = [] private source: Source constructor(source: Source) { @@ -86,7 +87,7 @@ export class JavaScriptVisitor implements NodeVisitor { visitNode = ( node: SyntaxNode, - properties?: Partial + properties?: Partial ) => { switch (node.type) { case 'program': @@ -213,7 +214,7 @@ export class JavaScriptVisitor implements NodeVisitor { * * A node is considered contextual when a comment is visited and the node is its sibling. */ - private visitContext = (node: SyntaxNode, properties?: Partial): ASTNode => { + private visitContext = (node: SyntaxNode, properties?: Partial): ASTNode => { switch (node.type) { case 'export_statement': return this.visitExportStatement(node, properties); @@ -237,7 +238,7 @@ export class JavaScriptVisitor implements NodeVisitor { /* Statements */ - private visitExportStatement = (node: SyntaxNode, properties?: Partial): ASTNode => { + private visitExportStatement = (node: SyntaxNode, properties?: Partial): ASTNode => { let children = node.children, defaultExport = false; // Remove 'export' since it's always first in the array children.shift(); @@ -250,14 +251,14 @@ export class JavaScriptVisitor implements NodeVisitor { return this.visitNode(child, { exports: { export: true, default: defaultExport } }); } - private visitExpressionStatement = (node: SyntaxNode, properties: Partial): ASTNode => { + private visitExpressionStatement = (node: SyntaxNode, properties: Partial): ASTNode => { let children = node.children; const child = children.shift(); if (match(child, 'internal_module')) { return this.visitInternalModule(child, properties) } - + if (match(child, 'function')) { if (properties) return this.visitContext(child); } @@ -267,7 +268,7 @@ export class JavaScriptVisitor implements NodeVisitor { /* Modules */ - private visitInternalModule = (node: SyntaxNode, properties?: Partial): ASTNode => { + private visitInternalModule = (node: SyntaxNode, properties?: Partial): ASTNode => { let children: ASTNode[] = node.children.map(child => { if (match(child, 'statement_block')) { return createASTNode(this.source, node, this.visitChildren(this.filterType(child, 'comment'))) @@ -280,7 +281,7 @@ export class JavaScriptVisitor implements NodeVisitor { /* Declarations */ - private visitClass = (node: SyntaxNode, properties?: Partial): ASTNode => { + private visitClass = (node: SyntaxNode, properties?: Partial): ASTNode => { // Since 'interface' or 'class' is always first in the array // we'll need to remove it from the array. let children = node.children; @@ -300,7 +301,7 @@ export class JavaScriptVisitor implements NodeVisitor { inheritance: { implements: implements_, extends: extends_ - } as NodeInheritance + } as JavaScriptInheritance })); if (match(node, 'class')) { @@ -312,7 +313,7 @@ export class JavaScriptVisitor implements NodeVisitor { /* Non-terminals */ - private visitNonTerminal = (node: SyntaxNode, properties?: Partial): ASTNode => { + private visitNonTerminal = (node: SyntaxNode, properties?: Partial): ASTNode => { let children = node.children; // Handle special cases where some non-terminals // contain comments which is what we care about diff --git a/src/lang/typescript/index.ts b/src/lang/typescript/index.ts index 1a034fd..64faad5 100644 --- a/src/lang/typescript/index.ts +++ b/src/lang/typescript/index.ts @@ -1,10 +1,10 @@ -import * as Parser from 'tree-sitter'; +import * as TreeSitter from 'tree-sitter'; import * as TypeScript from 'tree-sitter-typescript'; -import ParserInterface from '../../interfaces/ParserInterface'; +import Parser from '../common/parser'; import Source from '../../interfaces/Source'; import walk from '../../utils/walk'; import { TypeScriptVisitor } from './visitor'; -import { ASTNode } from '../common/ast'; +import ASTNode from '../../interfaces/ASTNode'; /** @@ -16,28 +16,23 @@ import { ASTNode } from '../common/ast'; * @implements IParser * @export default */ -export default class TypeScriptParser implements ParserInterface { - private source: Source; - private options: any; - private parser: Parser; - private tree_: Parser.Tree; +export default class TypeScriptParser extends Parser { + private parser: TreeSitter; + private tree_: TreeSitter.Tree; constructor(source: Source, options: any) { - this.source = source; - Object.assign(this.options = {}, options || {}); - this.parser = new Parser(); + super(source, options); + this.parser = new TreeSitter(); this.parser.setLanguage(TypeScript); this.tree_ = this.parser.parse(this.source.text); } parse = (): ASTNode[] => { const visitor = new TypeScriptVisitor(this.source); - const root = walk(this.tree_.rootNode); - // console.time('visit') - root.visit(visitor) - // console.timeEnd('visit') + const nodes = walk(this.tree_.rootNode); + nodes.visit(visitor) return visitor.getAST(); } - get tree (): Parser.Tree { + get tree (): TreeSitter.Tree { return this.tree_; } } diff --git a/src/lang/typescript/properties.ts b/src/lang/typescript/properties.ts new file mode 100644 index 0000000..da562f0 --- /dev/null +++ b/src/lang/typescript/properties.ts @@ -0,0 +1,16 @@ +export interface TypeScriptProperties { + exports: Partial + inheritance: Partial + namespace: boolean, + module: boolean +} + +export interface TypeScriptExports { + export: boolean, + default: boolean +} + +export interface TypeScriptInheritance { + extends: boolean, + implements: boolean +} \ No newline at end of file diff --git a/src/lang/typescript/visitor.ts b/src/lang/typescript/visitor.ts index a98edba..ad3aa50 100644 --- a/src/lang/typescript/visitor.ts +++ b/src/lang/typescript/visitor.ts @@ -1,18 +1,19 @@ -import { createASTNode, ASTNode } from "../common/ast"; import { isJavaDocComment, isLegalComment } from "../../utils/comment"; -import { NodeProperties, NodeInheritance } from "../common/emca"; -import { NodeVisitor } from "../common/node"; import { sibling } from "../../utils/sibling"; import { SyntaxNode } from "tree-sitter"; import * as _ from 'lodash'; import log, { ErrorType } from "../../utils/log"; import match from "../../utils/match"; import Source from "../../interfaces/Source"; +import Visitor from "../common/visitor"; +import ASTNode from "../../interfaces/ASTNode"; +import { createASTNode } from "../common/ast"; +import { TypeScriptProperties, TypeScriptInheritance } from "./properties"; /** * A class that visits ASTNodes from a TypeScript tree. */ -export class TypeScriptVisitor implements NodeVisitor { +export class TypeScriptVisitor implements Visitor { private ast: ASTNode[] = [] private source: Source constructor(source: Source) { @@ -86,7 +87,7 @@ export class TypeScriptVisitor implements NodeVisitor { visitNode = ( node: SyntaxNode, - properties?: Partial + properties?: Partial ) => { switch (node.type) { case 'program': @@ -216,7 +217,7 @@ export class TypeScriptVisitor implements NodeVisitor { * * A node is considered contextual when a comment is visited and the node is its sibling. */ - private visitContext = (node: SyntaxNode, properties?: Partial): ASTNode => { + private visitContext = (node: SyntaxNode, properties?: Partial): ASTNode => { switch (node.type) { case 'export_statement': return this.visitExportStatement(node, properties); @@ -241,7 +242,7 @@ export class TypeScriptVisitor implements NodeVisitor { /* Statements */ - private visitExportStatement = (node: SyntaxNode, properties?: Partial): ASTNode => { + private visitExportStatement = (node: SyntaxNode, properties?: Partial): ASTNode => { let children = node.children, defaultExport = false; // Remove 'export' since it's always first in the array children.shift(); @@ -254,7 +255,7 @@ export class TypeScriptVisitor implements NodeVisitor { return this.visitNode(child, { exports: { export: true, default: defaultExport } }); } - private visitExpressionStatement = (node: SyntaxNode, properties: Partial): ASTNode => { + private visitExpressionStatement = (node: SyntaxNode, properties: Partial): ASTNode => { let children = node.children; const child = children.shift(); @@ -271,7 +272,7 @@ export class TypeScriptVisitor implements NodeVisitor { /* Modules */ - private visitInternalModule = (node: SyntaxNode, properties?: Partial): ASTNode => { + private visitInternalModule = (node: SyntaxNode, properties?: Partial): ASTNode => { let children: ASTNode[] = node.children.map(child => { if (match(child, 'statement_block')) { return createASTNode(this.source, node, this.visitChildren(this.filterType(child, 'comment'))) @@ -284,7 +285,7 @@ export class TypeScriptVisitor implements NodeVisitor { /* Declarations */ - private visitClassOrInterface = (node: SyntaxNode, properties?: Partial): ASTNode => { + private visitClassOrInterface = (node: SyntaxNode, properties?: Partial): ASTNode => { // Since 'interface' or 'class' is always first in the array // we'll need to remove it from the array. let children = node.children; @@ -304,7 +305,7 @@ export class TypeScriptVisitor implements NodeVisitor { inheritance: { implements: implements_, extends: extends_ - } as NodeInheritance + } as TypeScriptInheritance })); if (match(node, 'class')) { @@ -316,7 +317,7 @@ export class TypeScriptVisitor implements NodeVisitor { /* Non-terminals */ - private visitNonTerminal = (node: SyntaxNode, properties?: Partial): ASTNode => { + private visitNonTerminal = (node: SyntaxNode, properties?: Partial): ASTNode => { let children = node.children; // Handle special cases where some non-terminals // contain comments which is what we care about From 8d14cca43966abe77467876aa29dd3b79eaf0664 Mon Sep 17 00:00:00 2001 From: Takeshi Date: Thu, 23 Aug 2018 22:13:14 -0600 Subject: [PATCH 20/32] Update: Build and WIP --- build/corpus/example.js | 2 +- build/index.d.ts | 8 +++--- build/index.js | 14 +++++----- build/src/ParserFactory.d.ts | 4 +-- build/src/ParserFactory.js | 2 +- build/src/interfaces/ASTNode.d.ts | 32 ++++++++++++++++++++++ build/src/interfaces/ASTNode.js | 3 +++ build/src/interfaces/BaseParser.d.ts | 10 +++++++ build/src/interfaces/BaseParser.js | 11 ++++++++ build/src/interfaces/Source.js | 2 +- build/src/interfaces/TextRange.js | 2 +- build/src/lang/common/ast.d.ts | 33 +---------------------- build/src/lang/common/ast.js | 2 +- build/src/lang/common/node.d.ts | 14 +++++----- build/src/lang/common/node.js | 5 +++- build/src/lang/common/parser.d.ts | 10 +++++++ build/src/lang/common/parser.js | 10 +++++++ build/src/lang/common/visitor.d.ts | 7 +++++ build/src/lang/common/visitor.js | 6 +++++ build/src/lang/javascript/index.d.ts | 14 ++++------ build/src/lang/javascript/index.js | 20 ++++++-------- build/src/lang/javascript/properties.d.ts | 14 ++++++++++ build/src/lang/javascript/properties.js | 3 +++ build/src/lang/javascript/visitor.d.ts | 10 +++---- build/src/lang/javascript/visitor.js | 2 +- build/src/lang/typescript/index.d.ts | 12 ++++----- build/src/lang/typescript/index.js | 18 ++++++------- build/src/lang/typescript/properties.d.ts | 14 ++++++++++ build/src/lang/typescript/properties.js | 3 +++ build/src/lang/typescript/visitor.d.ts | 10 +++---- build/src/lang/typescript/visitor.js | 4 +-- build/src/utils/benchmark.js | 2 +- build/src/utils/comment.js | 2 +- build/src/utils/log.js | 2 +- build/src/utils/match.js | 2 +- build/src/utils/range.js | 2 +- build/src/utils/sibling.js | 2 +- build/src/utils/text.js | 2 +- build/src/utils/walk.js | 2 +- src/ParserFactory.ts | 2 +- src/interfaces/BaseParser.ts | 15 ----------- src/lang/javascript/index.ts | 2 -- 42 files changed, 201 insertions(+), 135 deletions(-) create mode 100644 build/src/interfaces/ASTNode.d.ts create mode 100644 build/src/interfaces/ASTNode.js create mode 100644 build/src/interfaces/BaseParser.d.ts create mode 100644 build/src/interfaces/BaseParser.js create mode 100644 build/src/lang/common/parser.d.ts create mode 100644 build/src/lang/common/parser.js create mode 100644 build/src/lang/common/visitor.d.ts create mode 100644 build/src/lang/common/visitor.js create mode 100644 build/src/lang/javascript/properties.d.ts create mode 100644 build/src/lang/javascript/properties.js create mode 100644 build/src/lang/typescript/properties.d.ts create mode 100644 build/src/lang/typescript/properties.js delete mode 100644 src/interfaces/BaseParser.ts diff --git a/build/corpus/example.js b/build/corpus/example.js index 7204ff3..c7a4dba 100644 --- a/build/corpus/example.js +++ b/build/corpus/example.js @@ -9,4 +9,4 @@ var X; } X.name = name; })(X = exports.X || (exports.X = {})); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhhbXBsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2NvcnB1cy9leGFtcGxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsSUFBaUIsQ0FBQyxDQU9qQjtBQVBELFdBQWlCLENBQUM7SUFDaEI7O09BRUc7SUFDSCxTQUFnQixJQUFJLENBQUMsR0FBRyxJQUFJO0lBRTVCLENBQUM7SUFGZSxNQUFJLE9BRW5CLENBQUE7QUFDSCxDQUFDLEVBUGdCLENBQUMsR0FBRCxTQUFDLEtBQUQsU0FBQyxRQU9qQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBuYW1lc3BhY2UgWCB7XG4gIC8qKlxuICAgKiBcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBuYW1lKC4uLmFyZ3MpIHtcbiAgICBcbiAgfVxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhhbXBsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2NvcnB1cy9leGFtcGxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsSUFBaUIsQ0FBQyxDQU9qQjtBQVBELFdBQWlCLENBQUM7SUFDaEI7O09BRUc7SUFDSCxTQUFnQixJQUFJLENBQUMsR0FBRyxJQUFJO0lBRTVCLENBQUM7SUFGZSxNQUFJLE9BRW5CLENBQUE7QUFDSCxDQUFDLEVBUGdCLENBQUMsR0FBRCxTQUFDLEtBQUQsU0FBQyxRQU9qQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBuYW1lc3BhY2UgWCB7XHJcbiAgLyoqXHJcbiAgICogXHJcbiAgICovXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIG5hbWUoLi4uYXJncykge1xyXG4gICAgXHJcbiAgfVxyXG59Il19 \ No newline at end of file diff --git a/build/index.d.ts b/build/index.d.ts index de1f7d2..c92de1f 100644 --- a/build/index.d.ts +++ b/build/index.d.ts @@ -1,5 +1,5 @@ import Source from './src/interfaces/Source'; -import ParserInterface from './src/interfaces/ParserInterface'; +import Parser from './src/lang/common/parser'; import { Tree } from 'tree-sitter'; /** * A class that parses a source code and generates an AST. @@ -20,9 +20,9 @@ import { Tree } from 'tree-sitter'; * * ``` */ -export default class Parser implements ParserInterface { +export default class MainParser extends Parser { private parser; - constructor(file: Source, options?: any); - parse: () => import("./src/lang/common/ast").ASTNode[]; + constructor(source: Source, options: any); + parse: () => import("./src/interfaces/ASTNode").default[]; readonly tree: Tree; } diff --git a/build/index.js b/build/index.js index c437708..ad63496 100644 --- a/build/index.js +++ b/build/index.js @@ -1,6 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const ParserFactory_1 = require("./src/ParserFactory"); +const parser_1 = require("./src/lang/common/parser"); const FS = require("fs"); // import { ASTNode } from './src/lang/common/ast'; /** @@ -22,20 +23,21 @@ const FS = require("fs"); * * ``` */ -class Parser { - constructor(file, options = {}) { +class MainParser extends parser_1.default { + constructor(source, options) { + super(source, options); this.parse = () => { return this.parser.parse(); }; - this.parser = (new ParserFactory_1.default(file, options)).getParser(); + this.parser = (new ParserFactory_1.default(this.source, this.options)).getParser(); } get tree() { return this.parser.tree; } } -exports.default = Parser; +exports.default = MainParser; const path = `${process.cwd()}/corpus/ReactElementValidator.txt`; -const result = new Parser({ +const result = new MainParser({ name: 'index.ts', path: path, text: FS.readFileSync(path, 'utf-8') @@ -43,4 +45,4 @@ const result = new Parser({ language: 'ts' }).parse(); // console.log(result); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLHVEQUFnRDtBQUVoRCx5QkFBeUI7QUFFekIsbURBQW1EO0FBQ25EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFxQixNQUFNO0lBR3pCLFlBQVksSUFBWSxFQUFFLFVBQWUsRUFBRTtRQUczQyxVQUFLLEdBQUcsR0FBRyxFQUFFO1lBQ1gsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQzVCLENBQUMsQ0FBQTtRQUpDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLHVCQUFhLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDL0QsQ0FBQztJQUlELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDMUIsQ0FBQztDQUNGO0FBWkQseUJBWUM7QUFFRCxNQUFNLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsbUNBQW1DLENBQUM7QUFDakUsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUM7SUFDeEIsSUFBSSxFQUFFLFVBQVU7SUFDaEIsSUFBSSxFQUFFLElBQUk7SUFDVixJQUFJLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDO0NBQ3JDLEVBQUU7SUFDRCxRQUFRLEVBQUUsSUFBSTtDQUNmLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUVYLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTb3VyY2UgZnJvbSAnLi9zcmMvaW50ZXJmYWNlcy9Tb3VyY2UnO1xuaW1wb3J0IFBhcnNlckZhY3RvcnkgZnJvbSAnLi9zcmMvUGFyc2VyRmFjdG9yeSc7XG5pbXBvcnQgUGFyc2VySW50ZXJmYWNlIGZyb20gJy4vc3JjL2ludGVyZmFjZXMvUGFyc2VySW50ZXJmYWNlJztcbmltcG9ydCAqIGFzIEZTIGZyb20gJ2ZzJztcbmltcG9ydCB7IFRyZWUgfSBmcm9tICd0cmVlLXNpdHRlcic7XG4vLyBpbXBvcnQgeyBBU1ROb2RlIH0gZnJvbSAnLi9zcmMvbGFuZy9jb21tb24vYXN0Jztcbi8qKlxuICogQSBjbGFzcyB0aGF0IHBhcnNlcyBhIHNvdXJjZSBjb2RlIGFuZCBnZW5lcmF0ZXMgYW4gQVNULlxuICogXG4gKiBAY2xhc3MgUGFyc2VyXG4gKiBAaW1wbGVtZW50cyBJUGFyc2VyXG4gKiBcbiAqICMgRXhhbXBsZVxuICogXG4gKiBgYGBqc1xuICogY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcih7XG4gKiAgbmFtZTogJy4uLicsXG4gKiAgcGF0aDogJy4uLi4nLFxuICogIHRleHQ6ICcuLi4nXG4gKiB9LCB7IGxhbmd1YWdlOiAndHlwZXNjcmlwdCcgfSk7XG4gKiBcbiAqIGNvbnN0IHJlc3VsdCA9IHBhcnNlci5wYXJzZSgpO1xuICogXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFyc2VyIGltcGxlbWVudHMgUGFyc2VySW50ZXJmYWNlIHtcblxuICBwcml2YXRlIHBhcnNlcjogUGFyc2VySW50ZXJmYWNlO1xuICBjb25zdHJ1Y3RvcihmaWxlOiBTb3VyY2UsIG9wdGlvbnM6IGFueSA9IHt9KSB7XG4gICAgdGhpcy5wYXJzZXIgPSAobmV3IFBhcnNlckZhY3RvcnkoZmlsZSwgb3B0aW9ucykpLmdldFBhcnNlcigpO1xuICB9XG4gIHBhcnNlID0gKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5wYXJzZSgpXG4gIH1cbiAgZ2V0IHRyZWUgKCk6IFRyZWUge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci50cmVlO1xuICB9XG59XG5cbmNvbnN0IHBhdGggPSBgJHtwcm9jZXNzLmN3ZCgpfS9jb3JwdXMvUmVhY3RFbGVtZW50VmFsaWRhdG9yLnR4dGA7XG5jb25zdCByZXN1bHQgPSBuZXcgUGFyc2VyKHtcbiAgbmFtZTogJ2luZGV4LnRzJyxcbiAgcGF0aDogcGF0aCxcbiAgdGV4dDogRlMucmVhZEZpbGVTeW5jKHBhdGgsICd1dGYtOCcpXG59LCB7XG4gIGxhbmd1YWdlOiAndHMnXG59KS5wYXJzZSgpO1xuXG4vLyBjb25zb2xlLmxvZyhyZXN1bHQpO1xuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLHVEQUFnRDtBQUNoRCxxREFBOEM7QUFDOUMseUJBQXlCO0FBRXpCLG1EQUFtRDtBQUNuRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBcUIsVUFBVyxTQUFRLGdCQUFNO0lBRzVDLFlBQVksTUFBYyxFQUFFLE9BQVk7UUFDdEMsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUd4QixVQUFLLEdBQUcsR0FBRyxFQUFFO1lBQ1gsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQzVCLENBQUMsQ0FBQTtRQUpDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLHVCQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMzRSxDQUFDO0lBSUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztJQUMxQixDQUFDO0NBQ0Y7QUFiRCw2QkFhQztBQUVELE1BQU0sSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxtQ0FBbUMsQ0FBQztBQUNqRSxNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsQ0FBQztJQUM1QixJQUFJLEVBQUUsVUFBVTtJQUNoQixJQUFJLEVBQUUsSUFBSTtJQUNWLElBQUksRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUM7Q0FDckMsRUFBRTtJQUNELFFBQVEsRUFBRSxJQUFJO0NBQ2YsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0FBRVgsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNvdXJjZSBmcm9tICcuL3NyYy9pbnRlcmZhY2VzL1NvdXJjZSc7XHJcbmltcG9ydCBQYXJzZXJGYWN0b3J5IGZyb20gJy4vc3JjL1BhcnNlckZhY3RvcnknO1xyXG5pbXBvcnQgUGFyc2VyIGZyb20gJy4vc3JjL2xhbmcvY29tbW9uL3BhcnNlcic7XHJcbmltcG9ydCAqIGFzIEZTIGZyb20gJ2ZzJztcclxuaW1wb3J0IHsgVHJlZSB9IGZyb20gJ3RyZWUtc2l0dGVyJztcclxuLy8gaW1wb3J0IHsgQVNUTm9kZSB9IGZyb20gJy4vc3JjL2xhbmcvY29tbW9uL2FzdCc7XHJcbi8qKlxyXG4gKiBBIGNsYXNzIHRoYXQgcGFyc2VzIGEgc291cmNlIGNvZGUgYW5kIGdlbmVyYXRlcyBhbiBBU1QuXHJcbiAqIFxyXG4gKiBAY2xhc3MgUGFyc2VyXHJcbiAqIEBpbXBsZW1lbnRzIElQYXJzZXJcclxuICogXHJcbiAqICMgRXhhbXBsZVxyXG4gKiBcclxuICogYGBganNcclxuICogY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcih7XHJcbiAqICBuYW1lOiAnLi4uJyxcclxuICogIHBhdGg6ICcuLi4uJyxcclxuICogIHRleHQ6ICcuLi4nXHJcbiAqIH0sIHsgbGFuZ3VhZ2U6ICd0eXBlc2NyaXB0JyB9KTtcclxuICogXHJcbiAqIGNvbnN0IHJlc3VsdCA9IHBhcnNlci5wYXJzZSgpO1xyXG4gKiBcclxuICogYGBgXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYWluUGFyc2VyIGV4dGVuZHMgUGFyc2VyIHtcclxuXHJcbiAgcHJpdmF0ZSBwYXJzZXI6IFBhcnNlcjtcclxuICBjb25zdHJ1Y3Rvcihzb3VyY2U6IFNvdXJjZSwgb3B0aW9uczogYW55KSB7XHJcbiAgICBzdXBlcihzb3VyY2UsIG9wdGlvbnMpXHJcbiAgICB0aGlzLnBhcnNlciA9IChuZXcgUGFyc2VyRmFjdG9yeSh0aGlzLnNvdXJjZSwgdGhpcy5vcHRpb25zKSkuZ2V0UGFyc2VyKCk7XHJcbiAgfVxyXG4gIHBhcnNlID0gKCkgPT4ge1xyXG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLnBhcnNlKClcclxuICB9XHJcbiAgZ2V0IHRyZWUgKCk6IFRyZWUge1xyXG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLnRyZWU7XHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBwYXRoID0gYCR7cHJvY2Vzcy5jd2QoKX0vY29ycHVzL1JlYWN0RWxlbWVudFZhbGlkYXRvci50eHRgO1xyXG5jb25zdCByZXN1bHQgPSBuZXcgTWFpblBhcnNlcih7XHJcbiAgbmFtZTogJ2luZGV4LnRzJyxcclxuICBwYXRoOiBwYXRoLFxyXG4gIHRleHQ6IEZTLnJlYWRGaWxlU3luYyhwYXRoLCAndXRmLTgnKVxyXG59LCB7XHJcbiAgbGFuZ3VhZ2U6ICd0cydcclxufSkucGFyc2UoKTtcclxuXHJcbi8vIGNvbnNvbGUubG9nKHJlc3VsdCk7XHJcbiJdfQ== \ No newline at end of file diff --git a/build/src/ParserFactory.d.ts b/build/src/ParserFactory.d.ts index 77fb292..2b72713 100644 --- a/build/src/ParserFactory.d.ts +++ b/build/src/ParserFactory.d.ts @@ -1,8 +1,8 @@ import Source from "./interfaces/Source"; -import ParserInterface from "./interfaces/ParserInterface"; +import Parser from "./lang/common/parser"; export default class ParserFactory { private file; private options; constructor(file: Source, options?: any); - getParser: () => ParserInterface; + getParser: () => Parser; } diff --git a/build/src/ParserFactory.js b/build/src/ParserFactory.js index 3489ae1..8ab1f91 100644 --- a/build/src/ParserFactory.js +++ b/build/src/ParserFactory.js @@ -25,4 +25,4 @@ class ParserFactory { } } exports.default = ParserFactory; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFyc2VyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9QYXJzZXJGYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsa0RBQWlEO0FBQ2pELGtEQUFpRDtBQUVqRCxNQUFxQixhQUFhO0lBS2hDLFlBQVksSUFBWSxFQUFFLFVBQWUsRUFBRTtRQUhuQyxZQUFPLEdBQUc7WUFDaEIsUUFBUSxFQUFFLFlBQVk7U0FDdkIsQ0FBQTtRQU1ELGNBQVMsR0FBRyxHQUFvQixFQUFFO1lBQ2hDLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEVBQUU7Z0JBQzNDLEtBQUssSUFBSSxDQUFDO2dCQUNWLEtBQUssWUFBWTtvQkFDZixPQUFPLElBQUksb0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3ZELEtBQUssSUFBSSxDQUFDO2dCQUNWLEtBQUssWUFBWTtvQkFDZixPQUFPLElBQUksb0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3ZEO29CQUNBLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxVQUFVLENBQUMsQ0FBQTtvQkFDckUsTUFBTTthQUNUO1FBQ0gsQ0FBQyxDQUFBO1FBaEJDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUN0QyxDQUFDO0NBZ0JGO0FBeEJELGdDQXdCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTb3VyY2UgZnJvbSBcIi4vaW50ZXJmYWNlcy9Tb3VyY2VcIjtcbmltcG9ydCBQYXJzZXJJbnRlcmZhY2UgZnJvbSBcIi4vaW50ZXJmYWNlcy9QYXJzZXJJbnRlcmZhY2VcIjtcbmltcG9ydCBKYXZhU2NyaXB0UGFyc2VyIGZyb20gXCIuL2xhbmcvamF2YXNjcmlwdFwiO1xuaW1wb3J0IFR5cGVTY3JpcHRQYXJzZXIgZnJvbSAnLi9sYW5nL3R5cGVzY3JpcHQnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYXJzZXJGYWN0b3J5IHtcbiAgcHJpdmF0ZSBmaWxlOiBTb3VyY2VcbiAgcHJpdmF0ZSBvcHRpb25zID0ge1xuICAgIGxhbmd1YWdlOiAnSmF2YVNjcmlwdCdcbiAgfVxuICBjb25zdHJ1Y3RvcihmaWxlOiBTb3VyY2UsIG9wdGlvbnM6IGFueSA9IHt9KSB7XG4gICAgdGhpcy5maWxlID0gZmlsZTtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucywgb3B0aW9ucylcbiAgfVxuXG4gIGdldFBhcnNlciA9ICgpOiBQYXJzZXJJbnRlcmZhY2UgPT4ge1xuICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLmxhbmd1YWdlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNhc2UgJ2pzJzpcbiAgICAgIGNhc2UgJ2phdmFzY3JpcHQnOlxuICAgICAgICByZXR1cm4gbmV3IEphdmFTY3JpcHRQYXJzZXIodGhpcy5maWxlLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgY2FzZSAndHMnOlxuICAgICAgY2FzZSAndHlwZXNjcmlwdCc6XG4gICAgICAgIHJldHVybiBuZXcgVHlwZVNjcmlwdFBhcnNlcih0aGlzLmZpbGUsIHRoaXMub3B0aW9ucyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgY29uc29sZS5sb2coYFttci1kb2NdOiBObyBwYXJzZXIgZm9yICR7dGhpcy5vcHRpb25zLmxhbmd1YWdlfSBleGlzdHMuYClcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbn0iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFyc2VyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9QYXJzZXJGYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0Esa0RBQWlEO0FBQ2pELGtEQUFpRDtBQUdqRCxNQUFxQixhQUFhO0lBS2hDLFlBQVksSUFBWSxFQUFFLFVBQWUsRUFBRTtRQUhuQyxZQUFPLEdBQUc7WUFDaEIsUUFBUSxFQUFFLFlBQVk7U0FDdkIsQ0FBQTtRQU1ELGNBQVMsR0FBRyxHQUFXLEVBQUU7WUFDdkIsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDM0MsS0FBSyxJQUFJLENBQUM7Z0JBQ1YsS0FBSyxZQUFZO29CQUNmLE9BQU8sSUFBSSxvQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkQsS0FBSyxJQUFJLENBQUM7Z0JBQ1YsS0FBSyxZQUFZO29CQUNmLE9BQU8sSUFBSSxvQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkQ7b0JBQ0EsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLFVBQVUsQ0FBQyxDQUFBO29CQUNyRSxNQUFNO2FBQ1Q7UUFDSCxDQUFDLENBQUE7UUFoQkMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3RDLENBQUM7Q0FnQkY7QUF4QkQsZ0NBd0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xyXG5pbXBvcnQgSmF2YVNjcmlwdFBhcnNlciBmcm9tIFwiLi9sYW5nL2phdmFzY3JpcHRcIjtcclxuaW1wb3J0IFR5cGVTY3JpcHRQYXJzZXIgZnJvbSAnLi9sYW5nL3R5cGVzY3JpcHQnO1xyXG5pbXBvcnQgUGFyc2VyIGZyb20gXCIuL2xhbmcvY29tbW9uL3BhcnNlclwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFyc2VyRmFjdG9yeSB7XHJcbiAgcHJpdmF0ZSBmaWxlOiBTb3VyY2VcclxuICBwcml2YXRlIG9wdGlvbnMgPSB7XHJcbiAgICBsYW5ndWFnZTogJ0phdmFTY3JpcHQnXHJcbiAgfVxyXG4gIGNvbnN0cnVjdG9yKGZpbGU6IFNvdXJjZSwgb3B0aW9uczogYW55ID0ge30pIHtcclxuICAgIHRoaXMuZmlsZSA9IGZpbGU7XHJcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucywgb3B0aW9ucylcclxuICB9XHJcblxyXG4gIGdldFBhcnNlciA9ICgpOiBQYXJzZXIgPT4ge1xyXG4gICAgc3dpdGNoICh0aGlzLm9wdGlvbnMubGFuZ3VhZ2UudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICBjYXNlICdqcyc6XHJcbiAgICAgIGNhc2UgJ2phdmFzY3JpcHQnOlxyXG4gICAgICAgIHJldHVybiBuZXcgSmF2YVNjcmlwdFBhcnNlcih0aGlzLmZpbGUsIHRoaXMub3B0aW9ucyk7XHJcbiAgICAgIGNhc2UgJ3RzJzpcclxuICAgICAgY2FzZSAndHlwZXNjcmlwdCc6XHJcbiAgICAgICAgcmV0dXJuIG5ldyBUeXBlU2NyaXB0UGFyc2VyKHRoaXMuZmlsZSwgdGhpcy5vcHRpb25zKTtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgY29uc29sZS5sb2coYFttci1kb2NdOiBObyBwYXJzZXIgZm9yICR7dGhpcy5vcHRpb25zLmxhbmd1YWdlfSBleGlzdHMuYClcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG59Il19 \ No newline at end of file diff --git a/build/src/interfaces/ASTNode.d.ts b/build/src/interfaces/ASTNode.d.ts new file mode 100644 index 0000000..9fa1bc6 --- /dev/null +++ b/build/src/interfaces/ASTNode.d.ts @@ -0,0 +1,32 @@ +import TextRange from "./TextRange"; +import { RemarkNode } from "xdoc-parser/src/XDocParser"; +import { DocumentationNode } from "xdoc-parser/src/XDocASTNode"; +export default interface ASTNode extends TextRange { + /** + * @property - The type of node. + */ + type: string; + /** + * @property - The context string. + */ + text: string; + /** + * @property - The node's children. + */ + children: ASTNode[] | undefined[]; + /** + * @property - The context node that a comment node refers to. + */ + context: ASTNode; + /** + * @property - The properties that a ASTNode may possess. + */ + properties?: object; + /** + * @property - The parsed XDoc comment. + */ + comment?: { + markdown: RemarkNode; + documentation: Partial; + }; +} diff --git a/build/src/interfaces/ASTNode.js b/build/src/interfaces/ASTNode.js new file mode 100644 index 0000000..39acd36 --- /dev/null +++ b/build/src/interfaces/ASTNode.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQVNUTm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbnRlcmZhY2VzL0FTVE5vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZXh0UmFuZ2UgZnJvbSBcIi4vVGV4dFJhbmdlXCI7XHJcbmltcG9ydCB7IFJlbWFya05vZGUgfSBmcm9tIFwieGRvYy1wYXJzZXIvc3JjL1hEb2NQYXJzZXJcIjtcclxuaW1wb3J0IHsgRG9jdW1lbnRhdGlvbk5vZGUgfSBmcm9tIFwieGRvYy1wYXJzZXIvc3JjL1hEb2NBU1ROb2RlXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBpbnRlcmZhY2UgQVNUTm9kZSBleHRlbmRzIFRleHRSYW5nZSB7XHJcbiAgLyoqXHJcbiAgICogQHByb3BlcnR5IC0gVGhlIHR5cGUgb2Ygbm9kZS5cclxuICAgKi9cclxuICB0eXBlOiBzdHJpbmcsXHJcbiAgLyoqXHJcbiAgICogQHByb3BlcnR5IC0gVGhlIGNvbnRleHQgc3RyaW5nLlxyXG4gICAqL1xyXG4gIHRleHQ6IHN0cmluZyxcclxuICAvKipcclxuICAgKiBAcHJvcGVydHkgLSBUaGUgbm9kZSdzIGNoaWxkcmVuLlxyXG4gICAqL1xyXG4gIGNoaWxkcmVuOiBBU1ROb2RlW10gfCB1bmRlZmluZWRbXSxcclxuICAvKipcclxuICAgKiBAcHJvcGVydHkgLSBUaGUgY29udGV4dCBub2RlIHRoYXQgYSBjb21tZW50IG5vZGUgcmVmZXJzIHRvLlxyXG4gICAqL1xyXG4gIGNvbnRleHQ6IEFTVE5vZGUsXHJcbiAgLyoqXHJcbiAgICogQHByb3BlcnR5IC0gVGhlIHByb3BlcnRpZXMgdGhhdCBhIEFTVE5vZGUgbWF5IHBvc3Nlc3MuXHJcbiAgICovXHJcbiAgcHJvcGVydGllcz86IG9iamVjdFxyXG4gIC8qKlxyXG4gICAqIEBwcm9wZXJ0eSAtIFRoZSBwYXJzZWQgWERvYyBjb21tZW50LlxyXG4gICAqL1xyXG4gIGNvbW1lbnQ/OiB7XHJcbiAgICBtYXJrZG93bjogUmVtYXJrTm9kZSxcclxuICAgIGRvY3VtZW50YXRpb246IFBhcnRpYWw8RG9jdW1lbnRhdGlvbk5vZGU+XHJcbiAgfVxyXG59Il19 \ No newline at end of file diff --git a/build/src/interfaces/BaseParser.d.ts b/build/src/interfaces/BaseParser.d.ts new file mode 100644 index 0000000..e88510e --- /dev/null +++ b/build/src/interfaces/BaseParser.d.ts @@ -0,0 +1,10 @@ +import Source from "./Source"; +import { ASTNode } from "../lang/common/ast"; +import { Tree } from "tree-sitter"; +export default abstract class Parser { + protected source: Source; + protected options: any; + constructor(source: Source, options: any); + abstract parse(): ASTNode[]; + abstract readonly tree: Tree; +} diff --git a/build/src/interfaces/BaseParser.js b/build/src/interfaces/BaseParser.js new file mode 100644 index 0000000..20b13b0 --- /dev/null +++ b/build/src/interfaces/BaseParser.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +// import IResult from "./IResult"; +class Parser { + constructor(source, options) { + this.source = source; + this.options = options || {}; + } +} +exports.default = Parser; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZVBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbnRlcmZhY2VzL0Jhc2VQYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxtQ0FBbUM7QUFFbkMsTUFBOEIsTUFBTTtJQUdsQyxZQUFZLE1BQWMsRUFBRSxPQUFZO1FBQ3RDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztJQUMvQixDQUFDO0NBR0Y7QUFURCx5QkFTQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTb3VyY2UgZnJvbSBcIi4vU291cmNlXCI7XHJcbmltcG9ydCB7IEFTVE5vZGUgfSBmcm9tIFwiLi4vbGFuZy9jb21tb24vYXN0XCI7XHJcbmltcG9ydCB7IFRyZWUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcclxuLy8gaW1wb3J0IElSZXN1bHQgZnJvbSBcIi4vSVJlc3VsdFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgYWJzdHJhY3QgY2xhc3MgUGFyc2VyIHtcclxuICBwcm90ZWN0ZWQgc291cmNlOiBTb3VyY2VcclxuICBwcm90ZWN0ZWQgb3B0aW9uczogYW55XHJcbiAgY29uc3RydWN0b3Ioc291cmNlOiBTb3VyY2UsIG9wdGlvbnM6IGFueSkge1xyXG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xyXG4gIH1cclxuICBhYnN0cmFjdCBwYXJzZSgpOiBBU1ROb2RlW11cclxuICBhYnN0cmFjdCBnZXQgdHJlZSgpOiBUcmVlXHJcbn0iXX0= \ No newline at end of file diff --git a/build/src/interfaces/Source.js b/build/src/interfaces/Source.js index 0d8ff4e..6590b1a 100644 --- a/build/src/interfaces/Source.js +++ b/build/src/interfaces/Source.js @@ -1,3 +1,3 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvU291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBpbnRlcmZhY2UgU291cmNlIHtcbiAgbmFtZTogc3RyaW5nLFxuICBwYXRoOiBzdHJpbmcsXG4gIHRleHQ6IHN0cmluZ1xufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvU291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBpbnRlcmZhY2UgU291cmNlIHtcclxuICBuYW1lOiBzdHJpbmcsXHJcbiAgcGF0aDogc3RyaW5nLFxyXG4gIHRleHQ6IHN0cmluZ1xyXG59Il19 \ No newline at end of file diff --git a/build/src/interfaces/TextRange.js b/build/src/interfaces/TextRange.js index 51ef572..015edef 100644 --- a/build/src/interfaces/TextRange.js +++ b/build/src/interfaces/TextRange.js @@ -1,3 +1,3 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGV4dFJhbmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvVGV4dFJhbmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogQW4gaW50ZXJmYWNlIHRoYXQgcmVwcmVzZW50cyBhIHJhbmdlLlxuICogXG4gKiBAaW50ZXJmYWNlIFJhbmdlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmFuZ2Uge1xuICBzdGFydDogbnVtYmVyLFxuICBlbmQ6IG51bWJlclxufVxuXG4vKipcbiAqIEFuIGludGVyZmFjZSB0aGF0IHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uYWwgXG4gKiBhbmQgbG9jYXRpb25hbCByYW5nZXMgb2YgYSBzb3VyY2UgY29kZS5cbiAqIFxuICogQGludGVyZmFjZSBUZXh0UmFuZ2VcbiAqL1xuZXhwb3J0IGRlZmF1bHQgaW50ZXJmYWNlIFRleHRSYW5nZSB7XG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGEgY29udGV4dCdzIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb24uXG4gICAqIEBwcm9wZXJ0eSBwb3NpdGlvbjoge1xuICAgKiAgc3RhcnQ6IG51bWJlcixcbiAgICogIGVuZDogbnVtYmVyXG4gICAqIH1cbiAgICovXG4gIHBvc2l0aW9uOiBSYW5nZVxuICAvKipcbiAgICogUmVwcmVzZW50cyBhIGNvbnRleHQncyByb3cgYW5kIGNvbHVtbiBsb2NhdGlvbi5cbiAgICogXG4gICAqIEBsb2NhdGlvbjoge1xuICAgKiAgcm93OiBSYW5nZSxcbiAgICogIGNvbHVtbjogUmFuZ2VcbiAgICogfVxuICAgKi9cbiAgbG9jYXRpb246IHtcbiAgICByb3c6IFJhbmdlLFxuICAgIGNvbHVtbjogUmFuZ2VcbiAgfVxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGV4dFJhbmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvVGV4dFJhbmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuLyoqXHJcbiAqIEFuIGludGVyZmFjZSB0aGF0IHJlcHJlc2VudHMgYSByYW5nZS5cclxuICogXHJcbiAqIEBpbnRlcmZhY2UgUmFuZ2VcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmFuZ2Uge1xyXG4gIHN0YXJ0OiBudW1iZXIsXHJcbiAgZW5kOiBudW1iZXJcclxufVxyXG5cclxuLyoqXHJcbiAqIEFuIGludGVyZmFjZSB0aGF0IHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uYWwgXHJcbiAqIGFuZCBsb2NhdGlvbmFsIHJhbmdlcyBvZiBhIHNvdXJjZSBjb2RlLlxyXG4gKiBcclxuICogQGludGVyZmFjZSBUZXh0UmFuZ2VcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGludGVyZmFjZSBUZXh0UmFuZ2Uge1xyXG4gIC8qKlxyXG4gICAqIFJlcHJlc2VudHMgYSBjb250ZXh0J3Mgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbi5cclxuICAgKiBAcHJvcGVydHkgcG9zaXRpb246IHtcclxuICAgKiAgc3RhcnQ6IG51bWJlcixcclxuICAgKiAgZW5kOiBudW1iZXJcclxuICAgKiB9XHJcbiAgICovXHJcbiAgcG9zaXRpb246IFJhbmdlXHJcbiAgLyoqXHJcbiAgICogUmVwcmVzZW50cyBhIGNvbnRleHQncyByb3cgYW5kIGNvbHVtbiBsb2NhdGlvbi5cclxuICAgKiBcclxuICAgKiBAbG9jYXRpb246IHtcclxuICAgKiAgcm93OiBSYW5nZSxcclxuICAgKiAgY29sdW1uOiBSYW5nZVxyXG4gICAqIH1cclxuICAgKi9cclxuICBsb2NhdGlvbjoge1xyXG4gICAgcm93OiBSYW5nZSxcclxuICAgIGNvbHVtbjogUmFuZ2VcclxuICB9XHJcbn0iXX0= \ No newline at end of file diff --git a/build/src/lang/common/ast.d.ts b/build/src/lang/common/ast.d.ts index 4fafe1d..428c5c2 100644 --- a/build/src/lang/common/ast.d.ts +++ b/build/src/lang/common/ast.d.ts @@ -1,37 +1,6 @@ -import { DocumentationNode } from 'xdoc-parser/src/XDocASTNode'; -import { RemarkNode } from 'xdoc-parser/src/XDocParser'; import { SyntaxNode } from "tree-sitter"; import Source from "../../interfaces/Source"; -import TextRange from "../../interfaces/TextRange"; -export interface ASTNode extends TextRange { - /** - * @property - The type of node. - */ - type: string; - /** - * @property - The context string. - */ - text: string; - /** - * @property - The node's children. - */ - children: ASTNode[] | undefined[]; - /** - * @property - The context node that a comment node refers to. - */ - context: ASTNode; - /** - * @property - The properties that a ASTNode may possess. - */ - properties?: object; - /** - * @property - The parsed XDoc comment. - */ - comment?: { - markdown: RemarkNode; - documentation: Partial; - }; -} +import ASTNode from "../../interfaces/ASTNode"; export declare function isASTNode(object: object): object is ASTNode; export declare function createASTNode(source: Source, node: SyntaxNode): ASTNode; export declare function createASTNode(source: Source, node: SyntaxNode, properties: object): any; diff --git a/build/src/lang/common/ast.js b/build/src/lang/common/ast.js index 85ba9da..3225caf 100644 --- a/build/src/lang/common/ast.js +++ b/build/src/lang/common/ast.js @@ -26,4 +26,4 @@ function createASTNode(source, node, arg1, arg2) { children, comment: document ? xdoc_parser_1.default(source.text).parse() : undefined, properties }); } exports.createASTNode = createASTNode; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xhbmcvY29tbW9uL2FzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUdBLDJDQUF3QztBQUN4Qyw2Q0FBc0M7QUFHdEMsNkNBQStCO0FBQy9CLDRCQUEyQjtBQWlDM0IsU0FBZ0IsU0FBUyxDQUFDLE1BQWM7SUFDdEMsT0FBTyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLFVBQVUsSUFBSSxNQUFNLENBQUM7QUFDaEYsQ0FBQztBQUZELDhCQUVDO0FBT0QsU0FBZ0IsYUFBYSxDQUFDLE1BQWMsRUFBRSxJQUFnQixFQUFFLElBQVUsRUFBRSxJQUFVO0lBRXBGLElBQUksT0FBTyxFQUFFLFFBQVEsR0FBRyxFQUFFLEVBQUUsUUFBUSxHQUFHLE9BQU8sSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFLFVBQVUsQ0FBQztJQUU5RixJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDN0MsVUFBVSxHQUFHLElBQUksQ0FBQztLQUNuQjtTQUFNLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDbkQsT0FBTyxHQUFHLElBQUksQ0FBQztLQUNoQjtTQUFNLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUMxQixRQUFRLEdBQUcsSUFBSSxDQUFDO0tBQ2pCO0lBRUQsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3pCLFVBQVUsR0FBRyxJQUFJLENBQUM7S0FDbkI7SUFFRCx1QkFDRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFDZixJQUFJLEVBQUUsV0FBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFDckIsZUFBSyxDQUFDLElBQUksQ0FBQyxJQUNkLE9BQU87UUFDUCxRQUFRLEVBQ1IsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMscUJBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFDekQsVUFBVSxJQUNYO0FBQ0gsQ0FBQztBQXpCRCxzQ0F5QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEb2N1bWVudGF0aW9uTm9kZSB9IGZyb20gJ3hkb2MtcGFyc2VyL3NyYy9YRG9jQVNUTm9kZSc7XG5pbXBvcnQgeyBSZW1hcmtOb2RlIH0gZnJvbSAneGRvYy1wYXJzZXIvc3JjL1hEb2NQYXJzZXInO1xuaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuaW1wb3J0IHsgdGV4dCB9IGZyb20gXCIuLi8uLi91dGlscy90ZXh0XCI7XG5pbXBvcnQgcmFuZ2UgZnJvbSBcIi4uLy4uL3V0aWxzL3JhbmdlXCI7XG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuaW1wb3J0IFRleHRSYW5nZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9UZXh0UmFuZ2VcIjtcbmltcG9ydCB4ZG9jIGZyb20gJ3hkb2MtcGFyc2VyJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJ1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQVNUTm9kZSBleHRlbmRzIFRleHRSYW5nZSB7XG4gIC8qKlxuICAgKiBAcHJvcGVydHkgLSBUaGUgdHlwZSBvZiBub2RlLlxuICAgKi9cbiAgdHlwZTogc3RyaW5nLFxuICAvKipcbiAgICogQHByb3BlcnR5IC0gVGhlIGNvbnRleHQgc3RyaW5nLlxuICAgKi9cbiAgdGV4dDogc3RyaW5nLFxuICAvKipcbiAgICogQHByb3BlcnR5IC0gVGhlIG5vZGUncyBjaGlsZHJlbi5cbiAgICovXG4gIGNoaWxkcmVuOiBBU1ROb2RlW10gfCB1bmRlZmluZWRbXSxcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSAtIFRoZSBjb250ZXh0IG5vZGUgdGhhdCBhIGNvbW1lbnQgbm9kZSByZWZlcnMgdG8uXG4gICAqL1xuICBjb250ZXh0OiBBU1ROb2RlLFxuICAvKipcbiAgICogQHByb3BlcnR5IC0gVGhlIHByb3BlcnRpZXMgdGhhdCBhIEFTVE5vZGUgbWF5IHBvc3Nlc3MuXG4gICAqL1xuICBwcm9wZXJ0aWVzPzogb2JqZWN0XG4gIC8qKlxuICAgKiBAcHJvcGVydHkgLSBUaGUgcGFyc2VkIFhEb2MgY29tbWVudC5cbiAgICovXG4gIGNvbW1lbnQ/OiB7XG4gICAgbWFya2Rvd246IFJlbWFya05vZGUsXG4gICAgZG9jdW1lbnRhdGlvbjogUGFydGlhbDxEb2N1bWVudGF0aW9uTm9kZT5cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNBU1ROb2RlKG9iamVjdDogb2JqZWN0KTogb2JqZWN0IGlzIEFTVE5vZGUge1xuICByZXR1cm4gb2JqZWN0ICYmICd0eXBlJyBpbiBvYmplY3QgJiYgJ3RleHQnIGluIG9iamVjdCAmJiAnY2hpbGRyZW4nIGluIG9iamVjdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFTVE5vZGUoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQVNUTm9kZShzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllczogb2JqZWN0KVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFTVE5vZGUoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUsIGNoaWxkcmVuOiBvYmplY3RbXSk6IEFTVE5vZGVcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBU1ROb2RlKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlLCBjaGlsZHJlbjogb2JqZWN0W10sIHByb3BlcnRpZXM6IG9iamVjdClcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBU1ROb2RlKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlLCBjb250ZXh0OiBBU1ROb2RlLCBkb2N1bWVudDogYm9vbGVhbik6IEFTVE5vZGVcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBU1ROb2RlKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlLCBhcmcxPzogYW55LCBhcmcyPzogYW55KTogQVNUTm9kZSB7XG5cbiAgbGV0IGNvbnRleHQsIGNoaWxkcmVuID0gW10sIGRvY3VtZW50ID0gdHlwZW9mIGFyZzIgPT09ICdib29sZWFuJyAmJiBhcmcyID09PSB0cnVlLCBwcm9wZXJ0aWVzO1xuXG4gIGlmIChfLmlzUGxhaW5PYmplY3QoYXJnMSkgJiYgIWlzQVNUTm9kZShhcmcxKSkge1xuICAgIHByb3BlcnRpZXMgPSBhcmcxO1xuICB9IGVsc2UgaWYgKF8uaXNQbGFpbk9iamVjdChhcmcxKSAmJiBpc0FTVE5vZGUoYXJnMSkpIHtcbiAgICBjb250ZXh0ID0gYXJnMTtcbiAgfSBlbHNlIGlmIChfLmlzQXJyYXkoYXJnMSkpIHtcbiAgICBjaGlsZHJlbiA9IGFyZzE7XG4gIH1cblxuICBpZiAoXy5pc1BsYWluT2JqZWN0KGFyZzIpKSB7XG4gICAgcHJvcGVydGllcyA9IGFyZzI7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6IG5vZGUudHlwZSxcbiAgICB0ZXh0OiB0ZXh0KHNvdXJjZSwgbm9kZSksXG4gICAgLi4ucmFuZ2Uobm9kZSksXG4gICAgY29udGV4dCxcbiAgICBjaGlsZHJlbixcbiAgICBjb21tZW50OiBkb2N1bWVudCA/IHhkb2Moc291cmNlLnRleHQpLnBhcnNlKCkgOiB1bmRlZmluZWQsXG4gICAgcHJvcGVydGllcyxcbiAgfVxufVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xhbmcvY29tbW9uL2FzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLDJDQUF3QztBQUN4Qyw2Q0FBc0M7QUFFdEMsNkNBQStCO0FBQy9CLDRCQUEyQjtBQUczQixTQUFnQixTQUFTLENBQUMsTUFBYztJQUN0QyxPQUFPLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksVUFBVSxJQUFJLE1BQU0sQ0FBQztBQUNoRixDQUFDO0FBRkQsOEJBRUM7QUFPRCxTQUFnQixhQUFhLENBQUMsTUFBYyxFQUFFLElBQWdCLEVBQUUsSUFBVSxFQUFFLElBQVU7SUFFcEYsSUFBSSxPQUFPLEVBQUUsUUFBUSxHQUFHLEVBQUUsRUFBRSxRQUFRLEdBQUcsT0FBTyxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUUsVUFBVSxDQUFDO0lBRTlGLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUM3QyxVQUFVLEdBQUcsSUFBSSxDQUFDO0tBQ25CO1NBQU0sSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNuRCxPQUFPLEdBQUcsSUFBSSxDQUFDO0tBQ2hCO1NBQU0sSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQzFCLFFBQVEsR0FBRyxJQUFJLENBQUM7S0FDakI7SUFFRCxJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDekIsVUFBVSxHQUFHLElBQUksQ0FBQztLQUNuQjtJQUVELHVCQUNFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUNmLElBQUksRUFBRSxXQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUNyQixlQUFLLENBQUMsSUFBSSxDQUFDLElBQ2QsT0FBTztRQUNQLFFBQVEsRUFDUixPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxxQkFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUN6RCxVQUFVLElBQ1g7QUFDSCxDQUFDO0FBekJELHNDQXlCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcclxuaW1wb3J0IHsgdGV4dCB9IGZyb20gXCIuLi8uLi91dGlscy90ZXh0XCI7XHJcbmltcG9ydCByYW5nZSBmcm9tIFwiLi4vLi4vdXRpbHMvcmFuZ2VcIjtcclxuaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2VcIjtcclxuaW1wb3J0IHhkb2MgZnJvbSAneGRvYy1wYXJzZXInO1xyXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCdcclxuaW1wb3J0IEFTVE5vZGUgZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvQVNUTm9kZVwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzQVNUTm9kZShvYmplY3Q6IG9iamVjdCk6IG9iamVjdCBpcyBBU1ROb2RlIHtcclxuICByZXR1cm4gb2JqZWN0ICYmICd0eXBlJyBpbiBvYmplY3QgJiYgJ3RleHQnIGluIG9iamVjdCAmJiAnY2hpbGRyZW4nIGluIG9iamVjdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFTVE5vZGUoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBU1ROb2RlKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzOiBvYmplY3QpXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBU1ROb2RlKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlLCBjaGlsZHJlbjogb2JqZWN0W10pOiBBU1ROb2RlXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBU1ROb2RlKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlLCBjaGlsZHJlbjogb2JqZWN0W10sIHByb3BlcnRpZXM6IG9iamVjdClcclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFTVE5vZGUoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUsIGNvbnRleHQ6IEFTVE5vZGUsIGRvY3VtZW50OiBib29sZWFuKTogQVNUTm9kZVxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQVNUTm9kZShzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSwgYXJnMT86IGFueSwgYXJnMj86IGFueSk6IEFTVE5vZGUge1xyXG5cclxuICBsZXQgY29udGV4dCwgY2hpbGRyZW4gPSBbXSwgZG9jdW1lbnQgPSB0eXBlb2YgYXJnMiA9PT0gJ2Jvb2xlYW4nICYmIGFyZzIgPT09IHRydWUsIHByb3BlcnRpZXM7XHJcblxyXG4gIGlmIChfLmlzUGxhaW5PYmplY3QoYXJnMSkgJiYgIWlzQVNUTm9kZShhcmcxKSkge1xyXG4gICAgcHJvcGVydGllcyA9IGFyZzE7XHJcbiAgfSBlbHNlIGlmIChfLmlzUGxhaW5PYmplY3QoYXJnMSkgJiYgaXNBU1ROb2RlKGFyZzEpKSB7XHJcbiAgICBjb250ZXh0ID0gYXJnMTtcclxuICB9IGVsc2UgaWYgKF8uaXNBcnJheShhcmcxKSkge1xyXG4gICAgY2hpbGRyZW4gPSBhcmcxO1xyXG4gIH1cclxuXHJcbiAgaWYgKF8uaXNQbGFpbk9iamVjdChhcmcyKSkge1xyXG4gICAgcHJvcGVydGllcyA9IGFyZzI7XHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgdHlwZTogbm9kZS50eXBlLFxyXG4gICAgdGV4dDogdGV4dChzb3VyY2UsIG5vZGUpLFxyXG4gICAgLi4ucmFuZ2Uobm9kZSksXHJcbiAgICBjb250ZXh0LFxyXG4gICAgY2hpbGRyZW4sXHJcbiAgICBjb21tZW50OiBkb2N1bWVudCA/IHhkb2Moc291cmNlLnRleHQpLnBhcnNlKCkgOiB1bmRlZmluZWQsXHJcbiAgICBwcm9wZXJ0aWVzLFxyXG4gIH1cclxufVxyXG4iXX0= \ No newline at end of file diff --git a/build/src/lang/common/node.d.ts b/build/src/lang/common/node.d.ts index 82e071a..9509b1f 100644 --- a/build/src/lang/common/node.d.ts +++ b/build/src/lang/common/node.d.ts @@ -1,15 +1,13 @@ -import { ASTNode } from "./ast"; import { SyntaxNode } from "tree-sitter"; +import Visitor from "./visitor"; export interface TreeSitterNode { - visit(visitor: NodeVisitor): void; -} -export interface NodeVisitor { - getAST(): ASTNode[]; - visitNode(node: SyntaxNode, properties?: object): ASTNode; - visitChildren(nodes: SyntaxNode[], properties?: object): ASTNode[]; + visit(visitor: Visitor): void; } +/** + * A class that wraps a SyntaxNode as a Node + */ export declare class Node implements TreeSitterNode { syntaxNode: SyntaxNode; constructor(syntaxNode: SyntaxNode); - visit: (visitor: NodeVisitor) => void; + visit: (visitor: Visitor) => void; } diff --git a/build/src/lang/common/node.js b/build/src/lang/common/node.js index b90d3ee..5285539 100644 --- a/build/src/lang/common/node.js +++ b/build/src/lang/common/node.js @@ -1,5 +1,8 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); +/** + * A class that wraps a SyntaxNode as a Node + */ class Node { constructor(syntaxNode) { this.syntaxNode = syntaxNode; @@ -9,4 +12,4 @@ class Node { } } exports.Node = Node; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2NvbW1vbi9ub2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBYUEsTUFBYSxJQUFJO0lBQ2YsWUFBbUIsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN6QyxVQUFLLEdBQUcsQ0FBQyxPQUFvQixFQUFRLEVBQUU7WUFDckMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFBO0lBSDRDLENBQUM7Q0FJL0M7QUFMRCxvQkFLQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFTVE5vZGUgfSBmcm9tIFwiLi9hc3RcIjtcbmltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBUcmVlU2l0dGVyTm9kZSB7XG4gIHZpc2l0KHZpc2l0b3I6IE5vZGVWaXNpdG9yKTogdm9pZFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vZGVWaXNpdG9yIHtcbiAgZ2V0QVNUKCk6IEFTVE5vZGVbXVxuICB2aXNpdE5vZGUobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IG9iamVjdCk6IEFTVE5vZGVcbiAgdmlzaXRDaGlsZHJlbihub2RlczogU3ludGF4Tm9kZVtdLCBwcm9wZXJ0aWVzPzogb2JqZWN0KTogQVNUTm9kZVtdXG59XG5cbmV4cG9ydCBjbGFzcyBOb2RlIGltcGxlbWVudHMgVHJlZVNpdHRlck5vZGUge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgc3ludGF4Tm9kZTogU3ludGF4Tm9kZSkgeyB9XG4gIHZpc2l0ID0gKHZpc2l0b3I6IE5vZGVWaXNpdG9yKTogdm9pZCA9PiB7XG4gICAgdmlzaXRvci52aXNpdE5vZGUodGhpcy5zeW50YXhOb2RlKTtcbiAgfVxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2NvbW1vbi9ub2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBT0E7O0dBRUc7QUFDSCxNQUFhLElBQUk7SUFDZixZQUFtQixVQUFzQjtRQUF0QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3pDLFVBQUssR0FBRyxDQUFDLE9BQWdCLEVBQVEsRUFBRTtZQUNqQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUE7SUFINEMsQ0FBQztDQUkvQztBQUxELG9CQUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5pbXBvcnQgVmlzaXRvciBmcm9tIFwiLi92aXNpdG9yXCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRyZWVTaXR0ZXJOb2RlIHtcclxuICB2aXNpdCh2aXNpdG9yOiBWaXNpdG9yKTogdm9pZFxyXG59XHJcblxyXG4vKipcclxuICogQSBjbGFzcyB0aGF0IHdyYXBzIGEgU3ludGF4Tm9kZSBhcyBhIE5vZGVcclxuICovXHJcbmV4cG9ydCBjbGFzcyBOb2RlIGltcGxlbWVudHMgVHJlZVNpdHRlck5vZGUge1xyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBzeW50YXhOb2RlOiBTeW50YXhOb2RlKSB7IH1cclxuICB2aXNpdCA9ICh2aXNpdG9yOiBWaXNpdG9yKTogdm9pZCA9PiB7XHJcbiAgICB2aXNpdG9yLnZpc2l0Tm9kZSh0aGlzLnN5bnRheE5vZGUpO1xyXG4gIH1cclxufSJdfQ== \ No newline at end of file diff --git a/build/src/lang/common/parser.d.ts b/build/src/lang/common/parser.d.ts new file mode 100644 index 0000000..73a49df --- /dev/null +++ b/build/src/lang/common/parser.d.ts @@ -0,0 +1,10 @@ +import Source from "../../interfaces/Source"; +import { Tree } from "tree-sitter"; +import ASTNode from "../../interfaces/ASTNode"; +export default abstract class Parser { + protected source: Source; + protected options: any; + constructor(source: Source, options: any); + abstract parse(): ASTNode[]; + abstract readonly tree: Tree; +} diff --git a/build/src/lang/common/parser.js b/build/src/lang/common/parser.js new file mode 100644 index 0000000..5455493 --- /dev/null +++ b/build/src/lang/common/parser.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class Parser { + constructor(source, options) { + this.source = source; + this.options = options || {}; + } +} +exports.default = Parser; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xhbmcvY29tbW9uL3BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUlBLE1BQThCLE1BQU07SUFHbEMsWUFBWSxNQUFjLEVBQUUsT0FBWTtRQUN0QyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDL0IsQ0FBQztDQUdGO0FBVEQseUJBU0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU291cmNlIGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xyXG5pbXBvcnQgeyBUcmVlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XHJcbmltcG9ydCBBU1ROb2RlIGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL0FTVE5vZGVcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGFic3RyYWN0IGNsYXNzIFBhcnNlciB7XHJcbiAgcHJvdGVjdGVkIHNvdXJjZTogU291cmNlXHJcbiAgcHJvdGVjdGVkIG9wdGlvbnM6IGFueVxyXG4gIGNvbnN0cnVjdG9yKHNvdXJjZTogU291cmNlLCBvcHRpb25zOiBhbnkpIHtcclxuICAgIHRoaXMuc291cmNlID0gc291cmNlO1xyXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcclxuICB9XHJcbiAgYWJzdHJhY3QgcGFyc2UoKTogQVNUTm9kZVtdXHJcbiAgYWJzdHJhY3QgZ2V0IHRyZWUoKTogVHJlZVxyXG59Il19 \ No newline at end of file diff --git a/build/src/lang/common/visitor.d.ts b/build/src/lang/common/visitor.d.ts new file mode 100644 index 0000000..87d1c92 --- /dev/null +++ b/build/src/lang/common/visitor.d.ts @@ -0,0 +1,7 @@ +import { SyntaxNode } from "tree-sitter"; +import ASTNode from "../../interfaces/ASTNode"; +export default abstract class Visitor { + abstract getAST(): ASTNode[]; + abstract visitNode(node: SyntaxNode, properties?: object): ASTNode; + abstract visitChildren(nodes: SyntaxNode[], properties?: object): ASTNode[]; +} diff --git a/build/src/lang/common/visitor.js b/build/src/lang/common/visitor.js new file mode 100644 index 0000000..d5f3307 --- /dev/null +++ b/build/src/lang/common/visitor.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class Visitor { +} +exports.default = Visitor; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2NvbW1vbi92aXNpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0EsTUFBOEIsT0FBTztDQUlwQztBQUpELDBCQUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5pbXBvcnQgQVNUTm9kZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9BU1ROb2RlXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBhYnN0cmFjdCBjbGFzcyBWaXNpdG9yIHtcclxuICBhYnN0cmFjdCBnZXRBU1QoKTogQVNUTm9kZVtdXHJcbiAgYWJzdHJhY3QgdmlzaXROb2RlKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBvYmplY3QpOiBBU1ROb2RlXHJcbiAgYWJzdHJhY3QgdmlzaXRDaGlsZHJlbihub2RlczogU3ludGF4Tm9kZVtdLCBwcm9wZXJ0aWVzPzogb2JqZWN0KTogQVNUTm9kZVtdXHJcbn0iXX0= \ No newline at end of file diff --git a/build/src/lang/javascript/index.d.ts b/build/src/lang/javascript/index.d.ts index 524581c..6a7e4a6 100644 --- a/build/src/lang/javascript/index.d.ts +++ b/build/src/lang/javascript/index.d.ts @@ -1,24 +1,20 @@ -import * as Parser from 'tree-sitter'; -import ParserInterface from '../../interfaces/ParserInterface'; +import * as TreeSitter from 'tree-sitter'; +import Parser from '../common/parser'; import Source from '../../interfaces/Source'; -import { ASTNode } from '../common/ast'; +import ASTNode from '../../interfaces/ASTNode'; /** * A class that parses JavaScript comments. * * # API * - * ``` * @class JavaScriptParser * @implements IParser * @export default - * ``` */ -export default class JavaScriptParser implements ParserInterface { - private source; - private options; +export default class JavaScriptParser extends Parser { private parser; private tree_; constructor(source: Source, options: any); parse(): ASTNode[]; - readonly tree: Parser.Tree; + readonly tree: TreeSitter.Tree; } diff --git a/build/src/lang/javascript/index.js b/build/src/lang/javascript/index.js index eadd75b..62bcb33 100644 --- a/build/src/lang/javascript/index.js +++ b/build/src/lang/javascript/index.js @@ -1,7 +1,8 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const Parser = require("tree-sitter"); +const TreeSitter = require("tree-sitter"); const JavaScript = require("tree-sitter-javascript"); +const parser_1 = require("../common/parser"); const visitor_1 = require("./visitor"); const walk_1 = require("../../utils/walk"); /** @@ -9,26 +10,21 @@ const walk_1 = require("../../utils/walk"); * * # API * - * ``` * @class JavaScriptParser * @implements IParser * @export default - * ``` */ -class JavaScriptParser { +class JavaScriptParser extends parser_1.default { constructor(source, options) { - this.source = source; - Object.assign(this.options = {}, options || {}); - this.parser = new Parser(); + super(source, options); + this.parser = new TreeSitter(); this.parser.setLanguage(JavaScript); this.tree_ = this.parser.parse(this.source.text); } parse() { const visitor = new visitor_1.JavaScriptVisitor(this.source); - const root = walk_1.default(this.tree_.rootNode); - // console.time('visit') - root.visit(visitor); - // console.timeEnd('visit') + const nodes = walk_1.default(this.tree_.rootNode); + nodes.visit(visitor); return visitor.getAST(); } get tree() { @@ -36,4 +32,4 @@ class JavaScriptParser { } } exports.default = JavaScriptParser; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy9qYXZhc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNDO0FBQ3RDLHFEQUFxRDtBQUlyRCx1Q0FBOEM7QUFDOUMsMkNBQW9DO0FBRXBDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFxQixnQkFBZ0I7SUFNbkMsWUFBWSxNQUFjLEVBQUUsT0FBWTtRQUN0QyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFDRCxLQUFLO1FBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSwyQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkQsTUFBTSxJQUFJLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsd0JBQXdCO1FBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDbkIsMkJBQTJCO1FBQzNCLE9BQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFDRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztDQUNGO0FBeEJELG1DQXdCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFBhcnNlciBmcm9tICd0cmVlLXNpdHRlcic7XG5pbXBvcnQgKiBhcyBKYXZhU2NyaXB0IGZyb20gJ3RyZWUtc2l0dGVyLWphdmFzY3JpcHQnO1xuaW1wb3J0IFBhcnNlckludGVyZmFjZSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL1BhcnNlckludGVyZmFjZSc7XG5pbXBvcnQgU291cmNlIGZyb20gJy4uLy4uL2ludGVyZmFjZXMvU291cmNlJztcbmltcG9ydCB7IEFTVE5vZGUgfSBmcm9tICcuLi9jb21tb24vYXN0JztcbmltcG9ydCB7IEphdmFTY3JpcHRWaXNpdG9yIH0gZnJvbSAnLi92aXNpdG9yJztcbmltcG9ydCB3YWxrIGZyb20gJy4uLy4uL3V0aWxzL3dhbGsnO1xuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCBwYXJzZXMgSmF2YVNjcmlwdCBjb21tZW50cy5cbiAqIFxuICogIyBBUElcbiAqIFxuICogYGBgXG4gKiBAY2xhc3MgSmF2YVNjcmlwdFBhcnNlclxuICogQGltcGxlbWVudHMgSVBhcnNlclxuICogQGV4cG9ydCBkZWZhdWx0XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSmF2YVNjcmlwdFBhcnNlciBpbXBsZW1lbnRzIFBhcnNlckludGVyZmFjZSB7XG4gIFxuICBwcml2YXRlIHNvdXJjZTogU291cmNlO1xuICBwcml2YXRlIG9wdGlvbnM6IGFueTtcbiAgcHJpdmF0ZSBwYXJzZXI6IFBhcnNlcjtcbiAgcHJpdmF0ZSB0cmVlXzogUGFyc2VyLlRyZWU7XG4gIGNvbnN0cnVjdG9yKHNvdXJjZTogU291cmNlLCBvcHRpb25zOiBhbnkpIHtcbiAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucyA9IHt9LCBvcHRpb25zIHx8IHt9KTtcbiAgICB0aGlzLnBhcnNlciA9IG5ldyBQYXJzZXIoKTtcbiAgICB0aGlzLnBhcnNlci5zZXRMYW5ndWFnZShKYXZhU2NyaXB0KTtcbiAgICB0aGlzLnRyZWVfID0gdGhpcy5wYXJzZXIucGFyc2UodGhpcy5zb3VyY2UudGV4dCk7XG4gIH1cbiAgcGFyc2UoKTogQVNUTm9kZVtdIHtcbiAgICBjb25zdCB2aXNpdG9yID0gbmV3IEphdmFTY3JpcHRWaXNpdG9yKHRoaXMuc291cmNlKTtcbiAgICBjb25zdCByb290ID0gd2Fsayh0aGlzLnRyZWVfLnJvb3ROb2RlKTtcbiAgICAvLyBjb25zb2xlLnRpbWUoJ3Zpc2l0JylcbiAgICByb290LnZpc2l0KHZpc2l0b3IpXG4gICAgLy8gY29uc29sZS50aW1lRW5kKCd2aXNpdCcpXG4gICAgcmV0dXJuIHZpc2l0b3IuZ2V0QVNUKCk7XG4gIH1cbiAgZ2V0IHRyZWUgKCk6IFBhcnNlci5UcmVlIHtcbiAgICByZXR1cm4gdGhpcy50cmVlXztcbiAgfVxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy9qYXZhc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsMENBQTBDO0FBQzFDLHFEQUFxRDtBQUNyRCw2Q0FBc0M7QUFFdEMsdUNBQThDO0FBQzlDLDJDQUFvQztBQUdwQzs7Ozs7Ozs7R0FRRztBQUNILE1BQXFCLGdCQUFpQixTQUFRLGdCQUFNO0lBR2xELFlBQVksTUFBYyxFQUFFLE9BQVk7UUFDdEMsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFDRCxLQUFLO1FBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSwyQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkQsTUFBTSxLQUFLLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNwQixPQUFPLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBQ0QsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7Q0FDRjtBQWxCRCxtQ0FrQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBUcmVlU2l0dGVyIGZyb20gJ3RyZWUtc2l0dGVyJztcclxuaW1wb3J0ICogYXMgSmF2YVNjcmlwdCBmcm9tICd0cmVlLXNpdHRlci1qYXZhc2NyaXB0JztcclxuaW1wb3J0IFBhcnNlciBmcm9tICcuLi9jb21tb24vcGFyc2VyJztcclxuaW1wb3J0IFNvdXJjZSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZSc7XHJcbmltcG9ydCB7IEphdmFTY3JpcHRWaXNpdG9yIH0gZnJvbSAnLi92aXNpdG9yJztcclxuaW1wb3J0IHdhbGsgZnJvbSAnLi4vLi4vdXRpbHMvd2Fsayc7XHJcbmltcG9ydCBBU1ROb2RlIGZyb20gJy4uLy4uL2ludGVyZmFjZXMvQVNUTm9kZSc7XHJcblxyXG4vKipcclxuICogQSBjbGFzcyB0aGF0IHBhcnNlcyBKYXZhU2NyaXB0IGNvbW1lbnRzLlxyXG4gKiBcclxuICogIyBBUElcclxuICogXHJcbiAqIEBjbGFzcyBKYXZhU2NyaXB0UGFyc2VyXHJcbiAqIEBpbXBsZW1lbnRzIElQYXJzZXJcclxuICogQGV4cG9ydCBkZWZhdWx0XHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBKYXZhU2NyaXB0UGFyc2VyIGV4dGVuZHMgUGFyc2VyIHtcclxuICBwcml2YXRlIHBhcnNlcjogVHJlZVNpdHRlcjtcclxuICBwcml2YXRlIHRyZWVfOiBUcmVlU2l0dGVyLlRyZWU7XHJcbiAgY29uc3RydWN0b3Ioc291cmNlOiBTb3VyY2UsIG9wdGlvbnM6IGFueSkge1xyXG4gICAgc3VwZXIoc291cmNlLCBvcHRpb25zKTtcclxuICAgIHRoaXMucGFyc2VyID0gbmV3IFRyZWVTaXR0ZXIoKTtcclxuICAgIHRoaXMucGFyc2VyLnNldExhbmd1YWdlKEphdmFTY3JpcHQpO1xyXG4gICAgdGhpcy50cmVlXyA9IHRoaXMucGFyc2VyLnBhcnNlKHRoaXMuc291cmNlLnRleHQpO1xyXG4gIH1cclxuICBwYXJzZSgpOiBBU1ROb2RlW10ge1xyXG4gICAgY29uc3QgdmlzaXRvciA9IG5ldyBKYXZhU2NyaXB0VmlzaXRvcih0aGlzLnNvdXJjZSk7XHJcbiAgICBjb25zdCBub2RlcyA9IHdhbGsodGhpcy50cmVlXy5yb290Tm9kZSk7XHJcbiAgICBub2Rlcy52aXNpdCh2aXNpdG9yKVxyXG4gICAgcmV0dXJuIHZpc2l0b3IuZ2V0QVNUKCk7XHJcbiAgfVxyXG4gIGdldCB0cmVlICgpOiBUcmVlU2l0dGVyLlRyZWUge1xyXG4gICAgcmV0dXJuIHRoaXMudHJlZV87XHJcbiAgfVxyXG59Il19 \ No newline at end of file diff --git a/build/src/lang/javascript/properties.d.ts b/build/src/lang/javascript/properties.d.ts new file mode 100644 index 0000000..474457c --- /dev/null +++ b/build/src/lang/javascript/properties.d.ts @@ -0,0 +1,14 @@ +export interface JavaScriptProperties { + exports: Partial; + inheritance: Partial; + namespace: boolean; + module: boolean; +} +export interface JavaScriptExports { + export: boolean; + default: boolean; +} +export interface JavaScriptInheritance { + extends: boolean; + implements: boolean; +} diff --git a/build/src/lang/javascript/properties.js b/build/src/lang/javascript/properties.js new file mode 100644 index 0000000..aa7c462 --- /dev/null +++ b/build/src/lang/javascript/properties.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2phdmFzY3JpcHQvcHJvcGVydGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBKYXZhU2NyaXB0UHJvcGVydGllcyB7XHJcbiAgZXhwb3J0czogUGFydGlhbDxKYXZhU2NyaXB0RXhwb3J0cz5cclxuICBpbmhlcml0YW5jZTogUGFydGlhbDxKYXZhU2NyaXB0SW5oZXJpdGFuY2U+XHJcbiAgbmFtZXNwYWNlOiBib29sZWFuLFxyXG4gIG1vZHVsZTogYm9vbGVhblxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEphdmFTY3JpcHRFeHBvcnRzIHtcclxuICBleHBvcnQ6IGJvb2xlYW4sXHJcbiAgZGVmYXVsdDogYm9vbGVhblxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEphdmFTY3JpcHRJbmhlcml0YW5jZSB7XHJcbiAgZXh0ZW5kczogYm9vbGVhbixcclxuICBpbXBsZW1lbnRzOiBib29sZWFuXHJcbn0iXX0= \ No newline at end of file diff --git a/build/src/lang/javascript/visitor.d.ts b/build/src/lang/javascript/visitor.d.ts index 82236b7..a9a2f36 100644 --- a/build/src/lang/javascript/visitor.d.ts +++ b/build/src/lang/javascript/visitor.d.ts @@ -1,12 +1,12 @@ -import { ASTNode } from "../common/ast"; -import { NodeProperties } from "../common/emca"; -import { NodeVisitor } from "../common/node"; import { SyntaxNode } from "tree-sitter"; import Source from "../../interfaces/Source"; +import Visitor from "../common/visitor"; +import ASTNode from "../../interfaces/ASTNode"; +import { JavaScriptProperties } from "./properties"; /** * A class that visits ASTNodes from a TypeScript tree. */ -export declare class JavaScriptVisitor implements NodeVisitor { +export declare class JavaScriptVisitor implements Visitor { private ast; private source; constructor(source: Source); @@ -27,7 +27,7 @@ export declare class JavaScriptVisitor implements NodeVisitor { */ private filterType; getAST(): ASTNode[]; - visitNode: (node: SyntaxNode, properties?: Partial) => ASTNode; + visitNode: (node: SyntaxNode, properties?: Partial) => ASTNode; visitChildren: (nodes: SyntaxNode[]) => ASTNode[]; private visitProgram; private visitComment; diff --git a/build/src/lang/javascript/visitor.js b/build/src/lang/javascript/visitor.js index d7b7de4..1d09325 100644 --- a/build/src/lang/javascript/visitor.js +++ b/build/src/lang/javascript/visitor.js @@ -279,4 +279,4 @@ class JavaScriptVisitor { } } exports.JavaScriptVisitor = JavaScriptVisitor; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2phdmFzY3JpcHQvdmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHVDQUF1RDtBQUN2RCxpREFBdUQ7QUFHdkQsaURBQThDO0FBRTlDLDRCQUE0QjtBQUM1Qix5Q0FBaUQ7QUFDakQsNkNBQXNDO0FBR3RDOztHQUVHO0FBQ0gsTUFBYSxpQkFBaUI7SUFHNUIsWUFBWSxNQUFjO1FBRmxCLFFBQUcsR0FBYyxFQUFFLENBQUE7UUFxRTNCLGVBQWU7UUFFZixjQUFTLEdBQUcsQ0FDVixJQUFnQixFQUNoQixVQUFvQyxFQUNwQyxFQUFFO1lBQ0YsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNqQixLQUFLLFNBQVM7b0JBQ1osSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNuQyxNQUFNO2dCQUNSLEtBQUssU0FBUztvQkFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pDLEtBQUssU0FBUyxDQUFDO2dCQUNmLEtBQUssT0FBTztvQkFDVixhQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO29CQUM5RCxNQUFNO2dCQUNSO29CQUVFLCtCQUErQjtvQkFFL0IsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUNaLFlBQVksRUFDWixtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFDM0QsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQ3pFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQ3RFLG1CQUFtQixFQUFFLFlBQVksRUFDakMsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixrQkFBa0Is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QixJQUFJLGVBQUssQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLEVBQUU7Z0JBQzNCLE9BQU8sSUFBSSxDQUFDO2FBQ2I7U0FDRjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0ssVUFBVSxDQUFDLElBQWdCLEVBQUUsSUFBWTtRQUMvQyw2QkFBNkI7UUFDN0IsSUFBSSxRQUFRLEdBQWlCLEVBQUUsQ0FBQztRQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLGVBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ3RCLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDdEI7U0FDRjtRQUNELGdDQUFnQztRQUNoQyxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsTUFBTTtRQUNKLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQixDQUFDO0NBNlFGO0FBalZELDhDQWlWQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUFTVE5vZGUsIEFTVE5vZGUgfSBmcm9tIFwiLi4vY29tbW9uL2FzdFwiO1xuaW1wb3J0IHsgaXNKYXZhRG9jQ29tbWVudCB9IGZyb20gXCIuLi8uLi91dGlscy9jb21tZW50XCI7XG5pbXBvcnQgeyBOb2RlUHJvcGVydGllcywgTm9kZUluaGVyaXRhbmNlIH0gZnJvbSBcIi4uL2NvbW1vbi9lbWNhXCI7XG5pbXBvcnQgeyBOb2RlVmlzaXRvciB9IGZyb20gXCIuLi9jb21tb24vbm9kZVwiO1xuaW1wb3J0IHsgc2libGluZyB9IGZyb20gXCIuLi8uLi91dGlscy9zaWJsaW5nXCI7XG5pbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbG9nLCB7IEVycm9yVHlwZSB9IGZyb20gXCIuLi8uLi91dGlscy9sb2dcIjtcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi4vLi4vdXRpbHMvbWF0Y2hcIjtcbmltcG9ydCBTb3VyY2UgZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvU291cmNlXCI7XG5cbi8qKlxuICogQSBjbGFzcyB0aGF0IHZpc2l0cyBBU1ROb2RlcyBmcm9tIGEgVHlwZVNjcmlwdCB0cmVlLlxuICovXG5leHBvcnQgY2xhc3MgSmF2YVNjcmlwdFZpc2l0b3IgaW1wbGVtZW50cyBOb2RlVmlzaXRvciB7XG4gIHByaXZhdGUgYXN0OiBBU1ROb2RlW10gPSBbXVxuICBwcml2YXRlIHNvdXJjZTogU291cmNlXG4gIGNvbnN0cnVjdG9yKHNvdXJjZTogU291cmNlKSB7XG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgbm9kZSBoYXMgaW5oZXJpdGFuY2VcbiAgICovXG4gIHByaXZhdGUgaGFzSW5oZXJpdGFuY2Uobm9kZTogU3ludGF4Tm9kZSkge1xuICAgIGxldCBpbmhlcml0cyA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgaWYgKG1hdGNoKGNoaWxkLCAnZXh0ZW5kcycsICdpbXBsZW1lbnRzJykpIHtcbiAgICAgICAgaW5oZXJpdHMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW5oZXJpdHNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbm9kZSdzIGluaGVyaXRhbmNlIHR5cGVcbiAgICovXG4gIHByaXZhdGUgZ2V0SW5oZXJpdGFuY2VUeXBlKG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXTtcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ2V4dGVuZHMnKSkge1xuICAgICAgICByZXR1cm4gJ2V4dGVuZHMnO1xuICAgICAgfVxuXG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdpbXBsZW1lbnRzJykpIHtcbiAgICAgICAgcmV0dXJuICdpbXBsZW1lbnRzJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGV4cG9ydCBpcyBkZWZhdWx0XG4gICAqL1xuICBwcml2YXRlIGhhc0RlZmF1bHRFeHBvcnQobm9kZTogU3ludGF4Tm9kZSk6IGJvb2xlYW4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgaWYgKG1hdGNoKGNoaWxkLCAnZGVmYXVsdCcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBvbmx5IHRoZSBjb21tZW50cyBmcm9tIGEgbm9kZSdzIGNoaWxkcmVuLlxuICAgKi9cbiAgcHJpdmF0ZSBmaWx0ZXJUeXBlKG5vZGU6IFN5bnRheE5vZGUsIHR5cGU6IHN0cmluZyk6IFN5bnRheE5vZGVbXSB7XG4gICAgLy8gY29uc29sZS50aW1lKCdmaWx0ZXJUeXBlJylcbiAgICBsZXQgY2hpbGRyZW46IFN5bnRheE5vZGVbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgaWYgKG1hdGNoKGNoaWxkLCB0eXBlKSkge1xuICAgICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gY29uc29sZS50aW1lRW5kKCdmaWx0ZXJUeXBlJylcbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cblxuICBnZXRBU1QoKTogQVNUTm9kZVtdIHtcbiAgICByZXR1cm4gdGhpcy5hc3Q7XG4gIH1cblxuICAvKiBWaXNpdG9ycyAgKi9cblxuICB2aXNpdE5vZGUgPSAoXG4gICAgbm9kZTogU3ludGF4Tm9kZSxcbiAgICBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz5cbiAgKSA9PiB7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgJ3Byb2dyYW0nOlxuICAgICAgICB0aGlzLmFzdCA9IHRoaXMudmlzaXRQcm9ncmFtKG5vZGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NvbW1lbnQnOlxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdENvbW1lbnQobm9kZSk7XG4gICAgICBjYXNlICdNSVNTSU5HJzpcbiAgICAgIGNhc2UgJ0VSUk9SJzpcbiAgICAgICAgbG9nLnJlcG9ydCh0aGlzLnNvdXJjZSwgbm9kZSwgRXJyb3JUeXBlLlRyZWVTaXR0ZXJQYXJzZUVycm9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuXG4gICAgICAgIC8qIE1hdGNoIG90aGVyIG5vbi10ZXJtaW5hbHMgKi9cblxuICAgICAgICBpZiAobWF0Y2gobm9kZSxcbiAgICAgICAgICAnY29uc3RyYWludCcsXG4gICAgICAgICAgJ2Zvcm1hbF9wYXJhbWV0ZXJzJywgJ3JlcXVpcmVkX3BhcmFtZXRlcicsICdyZXN0X3BhcmFtZXRlcicsXG4gICAgICAgICAgJ3R5cGVfaWRlbnRpZmllcicsICd0eXBlX3BhcmFtZXRlcnMnLCAndHlwZV9wYXJhbWV0ZXInLCAndHlwZV9hbm5vdGF0aW9uJyxcbiAgICAgICAgICAnb2JqZWN0X3R5cGUnLCAncHJlZGVmaW5lZF90eXBlJywgJ3BhcmVudGhlc2l6ZWRfdHlwZScsICdsaXRlcmFsX3R5cGUnLFxuICAgICAgICAgICdpbnRlcnNlY3Rpb25fdHlwZScsICd1bmlvbl90eXBlJyxcbiAgICAgICAgICAnY2xhc3NfYm9keScsXG4gICAgICAgICAgJ2V4dGVuZHNfY2xhdXNlJyxcbiAgICAgICAgICAndW5hcnlfZXhwcmVzc2lvbicsICdiaW5hcnlfZXhwcmVzc2lvbicsICdwYXJlbnRoZXNpemVkX2V4cHJlc3Npb24nLCAnbWVtYmVyX2V4cHJlc3Npb24nLFxuICAgICAgICAgICdzdGF0ZW1lbnRfYmxvY2snLCAncmV0dXJuX3N0YXRlbWVudCcsICdleHBvcnRfc3RhdGVtZW50JywgJ2V4cHJlc3Npb25fc3RhdGVtZW50JyxcbiAgICAgICAgICAvLyBBIGNhbGxfc2lnbmF0dXJlIGNhbiBhbHNvIGJlIGEgbm9uLWNvbnRleHR1YWwgbm9kZVxuICAgICAgICAgICdjYWxsX3NpZ25hdHVyZScsXG4gICAgICAgICAgJ2ludGVybmFsX21vZHVsZScsXG4gICAgICAgICAgJ2lmX3N0YXRlbWVudCdcbiAgICAgICAgKSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnZpc2l0Tm9uVGVybWluYWwobm9kZSwgcHJvcGVydGllcylcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIE1hdGNoIHRlcm1pbmFscyAqL1xuICAgICAgICBpZiAobWF0Y2gobm9kZSxcbiAgICAgICAgICAnaWRlbnRpZmllcicsICdleHRlbmRzJywgJ3Byb3BlcnR5X2lkZW50aWZpZXInLCAnYWNjZXNzaWJpbGl0eV9tb2RpZmllcicsXG4gICAgICAgICAgJ251bGwnLCAndW5kZWZpbmVkJywgJ3JldHVybicsXG4gICAgICAgICAgJ2dldCcsICdmdW5jdGlvbicsICduYW1lc3BhY2UnLCAnaWYnLCAnY29uc3QnXG4gICAgICAgICkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdFRlcm1pbmFsKG5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nLnJlcG9ydCh0aGlzLnNvdXJjZSwgbm9kZSwgRXJyb3JUeXBlLk5vZGVUeXBlTm90WWV0U3VwcG9ydGVkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHZpc2l0Q2hpbGRyZW4gPSAobm9kZXM6IFN5bnRheE5vZGVbXSk6IEFTVE5vZGVbXSA9PiB7XG4gICAgbGV0IGNoaWxkcmVuOiBBU1ROb2RlW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBub2RlID0gbm9kZXNbaV07XG4gICAgICBpZiAoIW5vZGUudHlwZS5tYXRjaCgvWzw+KCl7fSw6O1xcW1xcXSZ8PVxcK1xcLVxcKlxcLyEuXS8pICYmIG5vZGUudHlwZSAhPT0gJy4uLicpIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSB0aGlzLnZpc2l0Tm9kZShub2RlKTtcbiAgICAgICAgaWYgKGNoaWxkKSBjaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG5cbiAgcHJpdmF0ZSB2aXNpdFByb2dyYW0gPSAobm9kZTogU3ludGF4Tm9kZSk6IEFTVE5vZGVbXSA9PiB7XG4gICAgbGV0IHZpc2l0ZWQgPSB7fSxcbiAgICAgIGdldFN0YXJ0TG9jYXRpb24gPSAobjogQVNUTm9kZSkgPT4gYCR7bi5sb2NhdGlvbi5yb3cuc3RhcnR9OiR7bi5sb2NhdGlvbi5jb2x1bW4uc3RhcnR9YDtcbiAgICAvLyBBIHByb2dyYW0gY2FuIGhhdmUgbW9kdWxlcywgbmFtZXNwYWNlcywgY29tbWVudHMgYXMgaXRzIGNoaWxkcmVuXG4gICAgLy8gVGhlIGZpcnN0IHN0ZXAgaXMgdG8gcGFyc2UgYWxsIHRoZSBjb21tZW50cyBpbiB0aGUgcm9vdCBub2RlXG4gICAgbGV0IGNvbW1lbnRzID0gdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShub2RlLCAnY29tbWVudCcpKTtcbiAgICAvLyBQYXJzZSB0aGUgbmFtZXNwYWNlcyBpbiBleHByZXNzaW9uX3N0YXRlbWVudFxuICAgIC8vIGxldCBuYW1lc3BhY2VzID0gdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShub2RlLCAnZXhwcmVzc2lvbl9zdGF0ZW1lbnQnKSk7XG4gICAgLy8gUGFyc2UgdGhlIGV4cG9ydCBzdGF0ZW1lbnRzIGluIHRoZSByb290IG5vZGVcbiAgICBsZXQgZXhwb3J0cyA9IHRoaXMudmlzaXRDaGlsZHJlbih0aGlzLmZpbHRlclR5cGUobm9kZSwgJ2V4cG9ydF9zdGF0ZW1lbnQnKSk7XG5cbiAgICAvLyBHZXQgdGhlIHZpc2l0ZWQgY29udGV4dCBub2Rlc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNvbW1lbnQgPSBjb21tZW50c1tpXTtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBjb21tZW50O1xuICAgICAgdmlzaXRlZFtnZXRTdGFydExvY2F0aW9uKGNvbnRleHQpXSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gRXhwb3J0cyBhcmUgb2RkYmFsbHMgc2luY2Ugc29tZSBleHBvcnRzIG1heSByZWZlcmVuY2VcbiAgICAvLyBhIHR5cGUvbm9kZSB0aGF0IG1heSBoYXZlIGJlZW4gY29tbWVudGVkLlxuICAgIC8vIFdlJ2xsIGZpcnN0IG5lZWQgdG8gZmlsdGVyIHRoZSBvbmVzIHdlIGhhdmUgdmlzaXRlZFxuICAgIF8ucmVtb3ZlKGV4cG9ydHMsIHggPT4gdmlzaXRlZFtnZXRTdGFydExvY2F0aW9uKHgpXSk7XG5cbiAgICAvLyBGcm9tIHRoZSBvbmVzIHdlIGhhdmUgbm90IHZpc2l0ZWQsIHdlJ2xsIG5lZWQgdG8gbW9kaWZ5XG4gICAgLy8gdGhlIG5vZGUgcHJvcGVydGllcyBvZiBlYWNoIGNvbnRleHQgaW4gYSBjb21tZW50IG5vZGUgdGhhdFxuICAgIC8vIG1hdGNoZXMgdGhlIG9uZXMgd2UgaGF2ZSBub3QgdmlzaXRlZC5cbiAgICBjb25zdCBtYXRjaGVkID0ge307XG4gICAgY29tbWVudHMgPSBfLmNvbXBhY3QoXG4gICAgICBjb21tZW50cy5tYXAoY29tbWVudCA9PiB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwb3J0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGV4cG9ydF8gPSBleHBvcnRzW2ldO1xuICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSBjb21tZW50LmNvbnRleHQ7XG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGNvbnRleHQgJiYgaiA8IGNvbnRleHQuY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChjb250ZXh0LmNoaWxkcmVuW2ldICYmIGNvbnRleHQuY2hpbGRyZW5baV0udHlwZSA9PT0gZXhwb3J0Xy50eXBlKSB7XG4gICAgICAgICAgICAgIG1hdGNoZWRbZ2V0U3RhcnRMb2NhdGlvbihleHBvcnRfKV0gPSB0cnVlO1xuICAgICAgICAgICAgICBjb21tZW50LmNvbnRleHQucHJvcGVydGllcyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgICAgY29tbWVudC5jb250ZXh0LnByb3BlcnRpZXMgfHwge30sXG4gICAgICAgICAgICAgICAgZXhwb3J0Xy5wcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21tZW50O1xuICAgICAgfSkpO1xuXG4gICAgLy8gUmVtb3ZlZCB0aGUgbWF0Y2hlZCBleHBvcnRzXG4gICAgXy5yZW1vdmUoZXhwb3J0cywgeCA9PiBtYXRjaGVkW2dldFN0YXJ0TG9jYXRpb24oeCldKVxuXG4gICAgcmV0dXJuIFtdLmNvbmNhdChjb21tZW50cykuY29uY2F0KGV4cG9ydHMpO1xuICB9XG5cbiAgcHJpdmF0ZSB2aXNpdENvbW1lbnQgPSAobm9kZTogU3ludGF4Tm9kZSk6IEFTVE5vZGUgPT4ge1xuICAgIGlmIChpc0phdmFEb2NDb21tZW50KHRoaXMuc291cmNlLCBub2RlKSkge1xuICAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSBzaWJsaW5nKG5vZGUpO1xuICAgICAgaWYgKG5leHRTaWJsaW5nKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q29udGV4dChuZXh0U2libGluZywge30pLCB0cnVlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWaXNpdCB0aGUgY29udGV4dHVhbCBub2RlXG4gICAqIFxuICAgKiAjIFJlbWFya1xuICAgKiBcbiAgICogQSBub2RlIGlzIGNvbnNpZGVyZWQgY29udGV4dHVhbCB3aGVuIGEgY29tbWVudCBpcyB2aXNpdGVkIGFuZCB0aGUgbm9kZSBpcyBpdHMgc2libGluZy5cbiAgICovXG4gIHByaXZhdGUgdmlzaXRDb250ZXh0ID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICBjYXNlICdleHBvcnRfc3RhdGVtZW50JzpcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRFeHBvcnRTdGF0ZW1lbnQobm9kZSwgcHJvcGVydGllcyk7XG4gICAgICBjYXNlICdleHByZXNzaW9uX3N0YXRlbWVudCc6XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChub2RlLCBwcm9wZXJ0aWVzKTtcbiAgICAgIGNhc2UgJ2NsYXNzJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRDbGFzcyhub2RlLCBwcm9wZXJ0aWVzKVxuICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgY2FzZSAnY2FsbF9zaWduYXR1cmUnOlxuICAgICAgY2FzZSAnbWV0aG9kX3NpZ25hdHVyZSc6XG4gICAgICBjYXNlICdwcm9wZXJ0eV9zaWduYXR1cmUnOlxuICAgICAgY2FzZSAncHVibGljX2ZpZWxkX2RlZmluaXRpb24nOlxuICAgICAgY2FzZSAnbWV0aG9kX2RlZmluaXRpb24nOlxuICAgICAgY2FzZSAnbGV4aWNhbF9kZWNsYXJhdGlvbic6XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0Tm9uVGVybWluYWwobm9kZSwgcHJvcGVydGllcyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgLyogU3RhdGVtZW50cyAqL1xuXG4gIHByaXZhdGUgdmlzaXRFeHBvcnRTdGF0ZW1lbnQgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XG4gICAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiwgZGVmYXVsdEV4cG9ydCA9IGZhbHNlO1xuICAgIC8vIFJlbW92ZSAnZXhwb3J0JyBzaW5jZSBpdCdzIGFsd2F5cyBmaXJzdCBpbiB0aGUgYXJyYXlcbiAgICBjaGlsZHJlbi5zaGlmdCgpO1xuICAgIGlmICh0aGlzLmhhc0RlZmF1bHRFeHBvcnQobm9kZSkpIHtcbiAgICAgIGRlZmF1bHRFeHBvcnQgPSB0cnVlO1xuICAgICAgLy8gUmVtb3ZlICdkZWZhdWx0JyBleHBvcnRcbiAgICAgIGNoaWxkcmVuLnNoaWZ0KCk7XG4gICAgfVxuICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW4uc2hpZnQoKTtcbiAgICByZXR1cm4gdGhpcy52aXNpdE5vZGUoY2hpbGQsIHsgZXhwb3J0czogeyBleHBvcnQ6IHRydWUsIGRlZmF1bHQ6IGRlZmF1bHRFeHBvcnQgfSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50ID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM6IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XG4gICAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuLnNoaWZ0KCk7XG5cbiAgICBpZiAobWF0Y2goY2hpbGQsICdpbnRlcm5hbF9tb2R1bGUnKSkge1xuICAgICAgcmV0dXJuIHRoaXMudmlzaXRJbnRlcm5hbE1vZHVsZShjaGlsZCwgcHJvcGVydGllcylcbiAgICB9XG4gICAgXG4gICAgaWYgKG1hdGNoKGNoaWxkLCAnZnVuY3Rpb24nKSkge1xuICAgICAgaWYgKHByb3BlcnRpZXMpIHJldHVybiB0aGlzLnZpc2l0Q29udGV4dChjaGlsZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudmlzaXROb25UZXJtaW5hbChjaGlsZClcbiAgfVxuXG4gIC8qIE1vZHVsZXMgKi9cblxuICBwcml2YXRlIHZpc2l0SW50ZXJuYWxNb2R1bGUgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XG4gICAgbGV0IGNoaWxkcmVuOiBBU1ROb2RlW10gPSBub2RlLmNoaWxkcmVuLm1hcChjaGlsZCA9PiB7XG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdzdGF0ZW1lbnRfYmxvY2snKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShjaGlsZCwgJ2NvbW1lbnQnKSkpXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy52aXNpdE5vZGUoY2hpbGQpO1xuICAgIH0pO1xuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCBjaGlsZHJlbiwgT2JqZWN0LmFzc2lnbihwcm9wZXJ0aWVzIHx8IHt9LCB7IG5hbWVzcGFjZTogdHJ1ZSB9KSk7XG4gIH1cblxuXG4gIC8qIERlY2xhcmF0aW9ucyAqL1xuXG4gIHByaXZhdGUgdmlzaXRDbGFzcyA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcbiAgICAvLyBTaW5jZSAnaW50ZXJmYWNlJyBvciAnY2xhc3MnIGlzIGFsd2F5cyBmaXJzdCBpbiB0aGUgYXJyYXlcbiAgICAvLyB3ZSdsbCBuZWVkIHRvIHJlbW92ZSBpdCBmcm9tIHRoZSBhcnJheS5cbiAgICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuICAgIGNvbnN0IGludGVyZmFjZV8gPSBjaGlsZHJlbi5zaGlmdCgpO1xuICAgIGxldCBleHRlbmRzXyA9IGZhbHNlLCBpbXBsZW1lbnRzXyA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmhhc0luaGVyaXRhbmNlKG5vZGUpKSB7XG4gICAgICBjb25zdCBpbmhlcml0YW5jZSA9IHRoaXMuZ2V0SW5oZXJpdGFuY2VUeXBlKG5vZGUpXG4gICAgICBleHRlbmRzXyA9IGluaGVyaXRhbmNlID09PSAnZXh0ZW5kcyc7XG4gICAgICBpbXBsZW1lbnRzXyA9IGluaGVyaXRhbmNlID09PSAnaW1wbGVtZW50cyc7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZV8gPSBjcmVhdGVBU1ROb2RlKFxuICAgICAgdGhpcy5zb3VyY2UsXG4gICAgICBub2RlLFxuICAgICAgdGhpcy52aXNpdENoaWxkcmVuKGNoaWxkcmVuKSxcbiAgICAgIE9iamVjdC5hc3NpZ24ocHJvcGVydGllcyB8fCB7fSwge1xuICAgICAgICBpbmhlcml0YW5jZToge1xuICAgICAgICAgIGltcGxlbWVudHM6IGltcGxlbWVudHNfLFxuICAgICAgICAgIGV4dGVuZHM6IGV4dGVuZHNfXG4gICAgICAgIH0gYXMgTm9kZUluaGVyaXRhbmNlXG4gICAgICB9KSk7XG5cbiAgICBpZiAobWF0Y2gobm9kZSwgJ2NsYXNzJykpIHtcbiAgICAgIHJldHVybiBub2RlXztcbiAgICB9XG4gICAgLy8gT3ZlcndyaXRlIHRoZSBub2RlIHR5cGUgZnJvbSAnaW50ZXJmYWNlX2RlY2xhcmF0aW9uJyB0byAnaW50ZXJmYWNlJ1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5vZGVfLCB7IHR5cGU6IGludGVyZmFjZV8udHlwZSB9KVxuICB9XG5cbiAgLyogTm9uLXRlcm1pbmFscyAqL1xuXG4gIHByaXZhdGUgdmlzaXROb25UZXJtaW5hbCA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxOb2RlUHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcbiAgICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2VzIHdoZXJlIHNvbWUgbm9uLXRlcm1pbmFsc1xuICAgIC8vIGNvbnRhaW4gY29tbWVudHMgd2hpY2ggaXMgd2hhdCB3ZSBjYXJlIGFib3V0XG4gICAgaWYgKG1hdGNoKG5vZGUsICdjbGFzc19ib2R5JywgJ29iamVjdF90eXBlJykpIHtcbiAgICAgIGNoaWxkcmVuID0gdGhpcy5maWx0ZXJUeXBlKG5vZGUsICdjb21tZW50Jyk7XG4gICAgfVxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2VzIHdoZXJlIGV4cG9ydCBzdGF0ZW1lbnRzIGhhdmUgbm9kZSBwcm9wZXJ0aWVzXG4gICAgaWYgKG1hdGNoKG5vZGUsICdleHBvcnRfc3RhdGVtZW50JykpIHtcbiAgICAgIHJldHVybiB0aGlzLnZpc2l0RXhwb3J0U3RhdGVtZW50KG5vZGUpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2VzIHdoZXJlIGFuIGludGVybmFsIG1vZHVsZSBjb250YWlucyBvdGhlciBub2Rlc1xuICAgIGlmIChtYXRjaChub2RlLCAnaW50ZXJuYWxfbW9kdWxlJykpIHtcbiAgICAgIHJldHVybiB0aGlzLnZpc2l0SW50ZXJuYWxNb2R1bGUobm9kZSwgcHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZXMgd2hlcmUgYW4gaW50ZXJtYWxfbW9kdWxlIGNhbiBleGlzdCBpbiBhbiBleHByZXNzaW9uX3N0YXRlbWVudFxuICAgIGlmIChtYXRjaChub2RlLCAnZXhwcmVzc2lvbl9zdGF0ZW1lbnQnKSkge1xuICAgICAgcmV0dXJuIHRoaXMudmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KG5vZGUsIHByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2VzIHdoZXJlIGEgZnVuY3Rpb24gaGFzIGEgc3RhdGVtZW50X2Jsb2NrXG4gICAgaWYgKG1hdGNoKG5vZGUsICdmdW5jdGlvbicpKSB7XG4gICAgICBfLnJlbW92ZShjaGlsZHJlbiwgY2hpbGQgPT4gbWF0Y2goY2hpbGQsICdzdGF0ZW1lbnRfYmxvY2snKSlcbiAgICAgIGNvbnNvbGUubG9nKGNoaWxkcmVuKTtcbiAgICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q2hpbGRyZW4oY2hpbGRyZW4pLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENoaWxkcmVuKGNoaWxkcmVuKSwgcHJvcGVydGllcyk7XG4gIH1cblxuICAvKiBUZXJtaW5hbHMgKi9cblxuICBwcml2YXRlIHZpc2l0VGVybWluYWwgPSAobm9kZTogU3ludGF4Tm9kZSk6IEFTVE5vZGUgPT4ge1xuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlKVxuICB9XG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2phdmFzY3JpcHQvdmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHVDQUE4QztBQUM5QyxpREFBdUQ7QUFDdkQsaURBQThDO0FBRTlDLDRCQUE0QjtBQUM1Qix5Q0FBaUQ7QUFDakQsNkNBQXNDO0FBTXRDOztHQUVHO0FBQ0gsTUFBYSxpQkFBaUI7SUFHNUIsWUFBWSxNQUFjO1FBRmxCLFFBQUcsR0FBYyxFQUFFLENBQUE7UUFxRTNCLGVBQWU7UUFFZixjQUFTLEdBQUcsQ0FDVixJQUFnQixFQUNoQixVQUEwQyxFQUMxQyxFQUFFO1lBQ0YsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNqQixLQUFLLFNBQVM7b0JBQ1osSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNuQyxNQUFNO2dCQUNSLEtBQUssU0FBUztvQkFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pDLEtBQUssU0FBUyxDQUFDO2dCQUNmLEtBQUssT0FBTztvQkFDVixhQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO29CQUM5RCxNQUFNO2dCQUNSO29CQUVFLCtCQUErQjtvQkFFL0IsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUNaLFlBQVksRUFDWixtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFDM0QsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQ3pFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQ3RFLG1CQUFtQixFQUFFLFlBQVksRUFDakMsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixrQkFBa0Is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QixJQUFJLGVBQUssQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLEVBQUU7Z0JBQzNCLE9BQU8sSUFBSSxDQUFDO2FBQ2I7U0FDRjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0ssVUFBVSxDQUFDLElBQWdCLEVBQUUsSUFBWTtRQUMvQyw2QkFBNkI7UUFDN0IsSUFBSSxRQUFRLEdBQWlCLEVBQUUsQ0FBQztRQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLGVBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ3RCLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDdEI7U0FDRjtRQUNELGdDQUFnQztRQUNoQyxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsTUFBTTtRQUNKLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQixDQUFDO0NBNlFGO0FBalZELDhDQWlWQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUFTVE5vZGUgfSBmcm9tIFwiLi4vY29tbW9uL2FzdFwiO1xyXG5pbXBvcnQgeyBpc0phdmFEb2NDb21tZW50IH0gZnJvbSBcIi4uLy4uL3V0aWxzL2NvbW1lbnRcIjtcclxuaW1wb3J0IHsgc2libGluZyB9IGZyb20gXCIuLi8uLi91dGlscy9zaWJsaW5nXCI7XHJcbmltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcclxuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xyXG5pbXBvcnQgbG9nLCB7IEVycm9yVHlwZSB9IGZyb20gXCIuLi8uLi91dGlscy9sb2dcIjtcclxuaW1wb3J0IG1hdGNoIGZyb20gXCIuLi8uLi91dGlscy9tYXRjaFwiO1xyXG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xyXG5pbXBvcnQgVmlzaXRvciBmcm9tIFwiLi4vY29tbW9uL3Zpc2l0b3JcIjtcclxuaW1wb3J0IEFTVE5vZGUgZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvQVNUTm9kZVwiO1xyXG5pbXBvcnQgeyBKYXZhU2NyaXB0UHJvcGVydGllcywgSmF2YVNjcmlwdEluaGVyaXRhbmNlIH0gZnJvbSBcIi4vcHJvcGVydGllc1wiO1xyXG5cclxuLyoqXHJcbiAqIEEgY2xhc3MgdGhhdCB2aXNpdHMgQVNUTm9kZXMgZnJvbSBhIFR5cGVTY3JpcHQgdHJlZS5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBKYXZhU2NyaXB0VmlzaXRvciBpbXBsZW1lbnRzIFZpc2l0b3Ige1xyXG4gIHByaXZhdGUgYXN0OiBBU1ROb2RlW10gPSBbXVxyXG4gIHByaXZhdGUgc291cmNlOiBTb3VyY2VcclxuICBjb25zdHJ1Y3Rvcihzb3VyY2U6IFNvdXJjZSkge1xyXG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBub2RlIGhhcyBpbmhlcml0YW5jZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgaGFzSW5oZXJpdGFuY2Uobm9kZTogU3ludGF4Tm9kZSkge1xyXG4gICAgbGV0IGluaGVyaXRzID0gZmFsc2U7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xyXG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdleHRlbmRzJywgJ2ltcGxlbWVudHMnKSkge1xyXG4gICAgICAgIGluaGVyaXRzID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGluaGVyaXRzXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIGEgbm9kZSdzIGluaGVyaXRhbmNlIHR5cGVcclxuICAgKi9cclxuICBwcml2YXRlIGdldEluaGVyaXRhbmNlVHlwZShub2RlOiBTeW50YXhOb2RlKSB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xyXG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdleHRlbmRzJykpIHtcclxuICAgICAgICByZXR1cm4gJ2V4dGVuZHMnO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdpbXBsZW1lbnRzJykpIHtcclxuICAgICAgICByZXR1cm4gJ2ltcGxlbWVudHMnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gZXhwb3J0IGlzIGRlZmF1bHRcclxuICAgKi9cclxuICBwcml2YXRlIGhhc0RlZmF1bHRFeHBvcnQobm9kZTogU3ludGF4Tm9kZSk6IGJvb2xlYW4ge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXTtcclxuICAgICAgaWYgKG1hdGNoKGNoaWxkLCAnZGVmYXVsdCcpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgb25seSB0aGUgY29tbWVudHMgZnJvbSBhIG5vZGUncyBjaGlsZHJlbi5cclxuICAgKi9cclxuICBwcml2YXRlIGZpbHRlclR5cGUobm9kZTogU3ludGF4Tm9kZSwgdHlwZTogc3RyaW5nKTogU3ludGF4Tm9kZVtdIHtcclxuICAgIC8vIGNvbnNvbGUudGltZSgnZmlsdGVyVHlwZScpXHJcbiAgICBsZXQgY2hpbGRyZW46IFN5bnRheE5vZGVbXSA9IFtdO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXTtcclxuICAgICAgaWYgKG1hdGNoKGNoaWxkLCB0eXBlKSkge1xyXG4gICAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBjb25zb2xlLnRpbWVFbmQoJ2ZpbHRlclR5cGUnKVxyXG4gICAgcmV0dXJuIGNoaWxkcmVuO1xyXG4gIH1cclxuXHJcbiAgZ2V0QVNUKCk6IEFTVE5vZGVbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5hc3Q7XHJcbiAgfVxyXG5cclxuICAvKiBWaXNpdG9ycyAgKi9cclxuXHJcbiAgdmlzaXROb2RlID0gKFxyXG4gICAgbm9kZTogU3ludGF4Tm9kZSxcclxuICAgIHByb3BlcnRpZXM/OiBQYXJ0aWFsPEphdmFTY3JpcHRQcm9wZXJ0aWVzPlxyXG4gICkgPT4ge1xyXG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcclxuICAgICAgY2FzZSAncHJvZ3JhbSc6XHJcbiAgICAgICAgdGhpcy5hc3QgPSB0aGlzLnZpc2l0UHJvZ3JhbShub2RlKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnY29tbWVudCc6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRDb21tZW50KG5vZGUpO1xyXG4gICAgICBjYXNlICdNSVNTSU5HJzpcclxuICAgICAgY2FzZSAnRVJST1InOlxyXG4gICAgICAgIGxvZy5yZXBvcnQodGhpcy5zb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5UcmVlU2l0dGVyUGFyc2VFcnJvcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcblxyXG4gICAgICAgIC8qIE1hdGNoIG90aGVyIG5vbi10ZXJtaW5hbHMgKi9cclxuXHJcbiAgICAgICAgaWYgKG1hdGNoKG5vZGUsXHJcbiAgICAgICAgICAnY29uc3RyYWludCcsXHJcbiAgICAgICAgICAnZm9ybWFsX3BhcmFtZXRlcnMnLCAncmVxdWlyZWRfcGFyYW1ldGVyJywgJ3Jlc3RfcGFyYW1ldGVyJyxcclxuICAgICAgICAgICd0eXBlX2lkZW50aWZpZXInLCAndHlwZV9wYXJhbWV0ZXJzJywgJ3R5cGVfcGFyYW1ldGVyJywgJ3R5cGVfYW5ub3RhdGlvbicsXHJcbiAgICAgICAgICAnb2JqZWN0X3R5cGUnLCAncHJlZGVmaW5lZF90eXBlJywgJ3BhcmVudGhlc2l6ZWRfdHlwZScsICdsaXRlcmFsX3R5cGUnLFxyXG4gICAgICAgICAgJ2ludGVyc2VjdGlvbl90eXBlJywgJ3VuaW9uX3R5cGUnLFxyXG4gICAgICAgICAgJ2NsYXNzX2JvZHknLFxyXG4gICAgICAgICAgJ2V4dGVuZHNfY2xhdXNlJyxcclxuICAgICAgICAgICd1bmFyeV9leHByZXNzaW9uJywgJ2JpbmFyeV9leHByZXNzaW9uJywgJ3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbicsICdtZW1iZXJfZXhwcmVzc2lvbicsXHJcbiAgICAgICAgICAnc3RhdGVtZW50X2Jsb2NrJywgJ3JldHVybl9zdGF0ZW1lbnQnLCAnZXhwb3J0X3N0YXRlbWVudCcsICdleHByZXNzaW9uX3N0YXRlbWVudCcsXHJcbiAgICAgICAgICAvLyBBIGNhbGxfc2lnbmF0dXJlIGNhbiBhbHNvIGJlIGEgbm9uLWNvbnRleHR1YWwgbm9kZVxyXG4gICAgICAgICAgJ2NhbGxfc2lnbmF0dXJlJyxcclxuICAgICAgICAgICdpbnRlcm5hbF9tb2R1bGUnLFxyXG4gICAgICAgICAgJ2lmX3N0YXRlbWVudCdcclxuICAgICAgICApKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdE5vblRlcm1pbmFsKG5vZGUsIHByb3BlcnRpZXMpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBNYXRjaCB0ZXJtaW5hbHMgKi9cclxuICAgICAgICBpZiAobWF0Y2gobm9kZSxcclxuICAgICAgICAgICdpZGVudGlmaWVyJywgJ2V4dGVuZHMnLCAncHJvcGVydHlfaWRlbnRpZmllcicsICdhY2Nlc3NpYmlsaXR5X21vZGlmaWVyJyxcclxuICAgICAgICAgICdudWxsJywgJ3VuZGVmaW5lZCcsICdyZXR1cm4nLFxyXG4gICAgICAgICAgJ2dldCcsICdmdW5jdGlvbicsICduYW1lc3BhY2UnLCAnaWYnLCAnY29uc3QnXHJcbiAgICAgICAgKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRUZXJtaW5hbChub2RlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxvZy5yZXBvcnQodGhpcy5zb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFlldFN1cHBvcnRlZCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdmlzaXRDaGlsZHJlbiA9IChub2RlczogU3ludGF4Tm9kZVtdKTogQVNUTm9kZVtdID0+IHtcclxuICAgIGxldCBjaGlsZHJlbjogQVNUTm9kZVtdID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpXTtcclxuICAgICAgaWYgKCFub2RlLnR5cGUubWF0Y2goL1s8Pigpe30sOjtcXFtcXF0mfD1cXCtcXC1cXCpcXC8hLl0vKSAmJiBub2RlLnR5cGUgIT09ICcuLi4nKSB7XHJcbiAgICAgICAgY29uc3QgY2hpbGQgPSB0aGlzLnZpc2l0Tm9kZShub2RlKTtcclxuICAgICAgICBpZiAoY2hpbGQpIGNoaWxkcmVuLnB1c2goY2hpbGQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2hpbGRyZW47XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHZpc2l0UHJvZ3JhbSA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZVtdID0+IHtcclxuICAgIGxldCB2aXNpdGVkID0ge30sXHJcbiAgICAgIGdldFN0YXJ0TG9jYXRpb24gPSAobjogQVNUTm9kZSkgPT4gYCR7bi5sb2NhdGlvbi5yb3cuc3RhcnR9OiR7bi5sb2NhdGlvbi5jb2x1bW4uc3RhcnR9YDtcclxuICAgIC8vIEEgcHJvZ3JhbSBjYW4gaGF2ZSBtb2R1bGVzLCBuYW1lc3BhY2VzLCBjb21tZW50cyBhcyBpdHMgY2hpbGRyZW5cclxuICAgIC8vIFRoZSBmaXJzdCBzdGVwIGlzIHRvIHBhcnNlIGFsbCB0aGUgY29tbWVudHMgaW4gdGhlIHJvb3Qgbm9kZVxyXG4gICAgbGV0IGNvbW1lbnRzID0gdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShub2RlLCAnY29tbWVudCcpKTtcclxuICAgIC8vIFBhcnNlIHRoZSBuYW1lc3BhY2VzIGluIGV4cHJlc3Npb25fc3RhdGVtZW50XHJcbiAgICAvLyBsZXQgbmFtZXNwYWNlcyA9IHRoaXMudmlzaXRDaGlsZHJlbih0aGlzLmZpbHRlclR5cGUobm9kZSwgJ2V4cHJlc3Npb25fc3RhdGVtZW50JykpO1xyXG4gICAgLy8gUGFyc2UgdGhlIGV4cG9ydCBzdGF0ZW1lbnRzIGluIHRoZSByb290IG5vZGVcclxuICAgIGxldCBleHBvcnRzID0gdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShub2RlLCAnZXhwb3J0X3N0YXRlbWVudCcpKTtcclxuXHJcbiAgICAvLyBHZXQgdGhlIHZpc2l0ZWQgY29udGV4dCBub2Rlc1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21tZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBjb21tZW50ID0gY29tbWVudHNbaV07XHJcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBjb21tZW50O1xyXG4gICAgICB2aXNpdGVkW2dldFN0YXJ0TG9jYXRpb24oY29udGV4dCldID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBFeHBvcnRzIGFyZSBvZGRiYWxscyBzaW5jZSBzb21lIGV4cG9ydHMgbWF5IHJlZmVyZW5jZVxyXG4gICAgLy8gYSB0eXBlL25vZGUgdGhhdCBtYXkgaGF2ZSBiZWVuIGNvbW1lbnRlZC5cclxuICAgIC8vIFdlJ2xsIGZpcnN0IG5lZWQgdG8gZmlsdGVyIHRoZSBvbmVzIHdlIGhhdmUgdmlzaXRlZFxyXG4gICAgXy5yZW1vdmUoZXhwb3J0cywgeCA9PiB2aXNpdGVkW2dldFN0YXJ0TG9jYXRpb24oeCldKTtcclxuXHJcbiAgICAvLyBGcm9tIHRoZSBvbmVzIHdlIGhhdmUgbm90IHZpc2l0ZWQsIHdlJ2xsIG5lZWQgdG8gbW9kaWZ5XHJcbiAgICAvLyB0aGUgbm9kZSBwcm9wZXJ0aWVzIG9mIGVhY2ggY29udGV4dCBpbiBhIGNvbW1lbnQgbm9kZSB0aGF0XHJcbiAgICAvLyBtYXRjaGVzIHRoZSBvbmVzIHdlIGhhdmUgbm90IHZpc2l0ZWQuXHJcbiAgICBjb25zdCBtYXRjaGVkID0ge307XHJcbiAgICBjb21tZW50cyA9IF8uY29tcGFjdChcclxuICAgICAgY29tbWVudHMubWFwKGNvbW1lbnQgPT4ge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwb3J0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgY29uc3QgZXhwb3J0XyA9IGV4cG9ydHNbaV07XHJcbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0gY29tbWVudC5jb250ZXh0O1xyXG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGNvbnRleHQgJiYgaiA8IGNvbnRleHQuY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRleHQuY2hpbGRyZW5baV0gJiYgY29udGV4dC5jaGlsZHJlbltpXS50eXBlID09PSBleHBvcnRfLnR5cGUpIHtcclxuICAgICAgICAgICAgICBtYXRjaGVkW2dldFN0YXJ0TG9jYXRpb24oZXhwb3J0XyldID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBjb21tZW50LmNvbnRleHQucHJvcGVydGllcyA9IE9iamVjdC5hc3NpZ24oXHJcbiAgICAgICAgICAgICAgICBjb21tZW50LmNvbnRleHQucHJvcGVydGllcyB8fCB7fSxcclxuICAgICAgICAgICAgICAgIGV4cG9ydF8ucHJvcGVydGllc1xyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbW1lbnQ7XHJcbiAgICAgIH0pKTtcclxuXHJcbiAgICAvLyBSZW1vdmVkIHRoZSBtYXRjaGVkIGV4cG9ydHNcclxuICAgIF8ucmVtb3ZlKGV4cG9ydHMsIHggPT4gbWF0Y2hlZFtnZXRTdGFydExvY2F0aW9uKHgpXSlcclxuXHJcbiAgICByZXR1cm4gW10uY29uY2F0KGNvbW1lbnRzKS5jb25jYXQoZXhwb3J0cyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHZpc2l0Q29tbWVudCA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZSA9PiB7XHJcbiAgICBpZiAoaXNKYXZhRG9jQ29tbWVudCh0aGlzLnNvdXJjZSwgbm9kZSkpIHtcclxuICAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSBzaWJsaW5nKG5vZGUpO1xyXG4gICAgICBpZiAobmV4dFNpYmxpbmcpIHtcclxuICAgICAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENvbnRleHQobmV4dFNpYmxpbmcsIHt9KSwgdHJ1ZSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmlzaXQgdGhlIGNvbnRleHR1YWwgbm9kZVxyXG4gICAqIFxyXG4gICAqICMgUmVtYXJrXHJcbiAgICogXHJcbiAgICogQSBub2RlIGlzIGNvbnNpZGVyZWQgY29udGV4dHVhbCB3aGVuIGEgY29tbWVudCBpcyB2aXNpdGVkIGFuZCB0aGUgbm9kZSBpcyBpdHMgc2libGluZy5cclxuICAgKi9cclxuICBwcml2YXRlIHZpc2l0Q29udGV4dCA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxKYXZhU2NyaXB0UHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcclxuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XHJcbiAgICAgIGNhc2UgJ2V4cG9ydF9zdGF0ZW1lbnQnOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0RXhwb3J0U3RhdGVtZW50KG5vZGUsIHByb3BlcnRpZXMpO1xyXG4gICAgICBjYXNlICdleHByZXNzaW9uX3N0YXRlbWVudCc6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KG5vZGUsIHByb3BlcnRpZXMpO1xyXG4gICAgICBjYXNlICdjbGFzcyc6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRDbGFzcyhub2RlLCBwcm9wZXJ0aWVzKVxyXG4gICAgICBjYXNlICdmdW5jdGlvbic6XHJcbiAgICAgIGNhc2UgJ2NhbGxfc2lnbmF0dXJlJzpcclxuICAgICAgY2FzZSAnbWV0aG9kX3NpZ25hdHVyZSc6XHJcbiAgICAgIGNhc2UgJ3Byb3BlcnR5X3NpZ25hdHVyZSc6XHJcbiAgICAgIGNhc2UgJ3B1YmxpY19maWVsZF9kZWZpbml0aW9uJzpcclxuICAgICAgY2FzZSAnbWV0aG9kX2RlZmluaXRpb24nOlxyXG4gICAgICBjYXNlICdsZXhpY2FsX2RlY2xhcmF0aW9uJzpcclxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdE5vblRlcm1pbmFsKG5vZGUsIHByb3BlcnRpZXMpO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGxvZy5yZXBvcnQodGhpcy5zb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFlldFN1cHBvcnRlZCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyogU3RhdGVtZW50cyAqL1xyXG5cclxuICBwcml2YXRlIHZpc2l0RXhwb3J0U3RhdGVtZW50ID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPEphdmFTY3JpcHRQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xyXG4gICAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiwgZGVmYXVsdEV4cG9ydCA9IGZhbHNlO1xyXG4gICAgLy8gUmVtb3ZlICdleHBvcnQnIHNpbmNlIGl0J3MgYWx3YXlzIGZpcnN0IGluIHRoZSBhcnJheVxyXG4gICAgY2hpbGRyZW4uc2hpZnQoKTtcclxuICAgIGlmICh0aGlzLmhhc0RlZmF1bHRFeHBvcnQobm9kZSkpIHtcclxuICAgICAgZGVmYXVsdEV4cG9ydCA9IHRydWU7XHJcbiAgICAgIC8vIFJlbW92ZSAnZGVmYXVsdCcgZXhwb3J0XHJcbiAgICAgIGNoaWxkcmVuLnNoaWZ0KCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuLnNoaWZ0KCk7XHJcbiAgICByZXR1cm4gdGhpcy52aXNpdE5vZGUoY2hpbGQsIHsgZXhwb3J0czogeyBleHBvcnQ6IHRydWUsIGRlZmF1bHQ6IGRlZmF1bHRFeHBvcnQgfSB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50ID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM6IFBhcnRpYWw8SmF2YVNjcmlwdFByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XHJcbiAgICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xyXG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbi5zaGlmdCgpO1xyXG5cclxuICAgIGlmIChtYXRjaChjaGlsZCwgJ2ludGVybmFsX21vZHVsZScpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnZpc2l0SW50ZXJuYWxNb2R1bGUoY2hpbGQsIHByb3BlcnRpZXMpXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG1hdGNoKGNoaWxkLCAnZnVuY3Rpb24nKSkge1xyXG4gICAgICBpZiAocHJvcGVydGllcykgcmV0dXJuIHRoaXMudmlzaXRDb250ZXh0KGNoaWxkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy52aXNpdE5vblRlcm1pbmFsKGNoaWxkKVxyXG4gIH1cclxuXHJcbiAgLyogTW9kdWxlcyAqL1xyXG5cclxuICBwcml2YXRlIHZpc2l0SW50ZXJuYWxNb2R1bGUgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8SmF2YVNjcmlwdFByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XHJcbiAgICBsZXQgY2hpbGRyZW46IEFTVE5vZGVbXSA9IG5vZGUuY2hpbGRyZW4ubWFwKGNoaWxkID0+IHtcclxuICAgICAgaWYgKG1hdGNoKGNoaWxkLCAnc3RhdGVtZW50X2Jsb2NrJykpIHtcclxuICAgICAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShjaGlsZCwgJ2NvbW1lbnQnKSkpXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMudmlzaXROb2RlKGNoaWxkKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIGNoaWxkcmVuLCBPYmplY3QuYXNzaWduKHByb3BlcnRpZXMgfHwge30sIHsgbmFtZXNwYWNlOiB0cnVlIH0pKTtcclxuICB9XHJcblxyXG5cclxuICAvKiBEZWNsYXJhdGlvbnMgKi9cclxuXHJcbiAgcHJpdmF0ZSB2aXNpdENsYXNzID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPEphdmFTY3JpcHRQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xyXG4gICAgLy8gU2luY2UgJ2ludGVyZmFjZScgb3IgJ2NsYXNzJyBpcyBhbHdheXMgZmlyc3QgaW4gdGhlIGFycmF5XHJcbiAgICAvLyB3ZSdsbCBuZWVkIHRvIHJlbW92ZSBpdCBmcm9tIHRoZSBhcnJheS5cclxuICAgIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XHJcbiAgICBjb25zdCBpbnRlcmZhY2VfID0gY2hpbGRyZW4uc2hpZnQoKTtcclxuICAgIGxldCBleHRlbmRzXyA9IGZhbHNlLCBpbXBsZW1lbnRzXyA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuaGFzSW5oZXJpdGFuY2Uobm9kZSkpIHtcclxuICAgICAgY29uc3QgaW5oZXJpdGFuY2UgPSB0aGlzLmdldEluaGVyaXRhbmNlVHlwZShub2RlKVxyXG4gICAgICBleHRlbmRzXyA9IGluaGVyaXRhbmNlID09PSAnZXh0ZW5kcyc7XHJcbiAgICAgIGltcGxlbWVudHNfID0gaW5oZXJpdGFuY2UgPT09ICdpbXBsZW1lbnRzJztcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBub2RlXyA9IGNyZWF0ZUFTVE5vZGUoXHJcbiAgICAgIHRoaXMuc291cmNlLFxyXG4gICAgICBub2RlLFxyXG4gICAgICB0aGlzLnZpc2l0Q2hpbGRyZW4oY2hpbGRyZW4pLFxyXG4gICAgICBPYmplY3QuYXNzaWduKHByb3BlcnRpZXMgfHwge30sIHtcclxuICAgICAgICBpbmhlcml0YW5jZToge1xyXG4gICAgICAgICAgaW1wbGVtZW50czogaW1wbGVtZW50c18sXHJcbiAgICAgICAgICBleHRlbmRzOiBleHRlbmRzX1xyXG4gICAgICAgIH0gYXMgSmF2YVNjcmlwdEluaGVyaXRhbmNlXHJcbiAgICAgIH0pKTtcclxuXHJcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2NsYXNzJykpIHtcclxuICAgICAgcmV0dXJuIG5vZGVfO1xyXG4gICAgfVxyXG4gICAgLy8gT3ZlcndyaXRlIHRoZSBub2RlIHR5cGUgZnJvbSAnaW50ZXJmYWNlX2RlY2xhcmF0aW9uJyB0byAnaW50ZXJmYWNlJ1xyXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obm9kZV8sIHsgdHlwZTogaW50ZXJmYWNlXy50eXBlIH0pXHJcbiAgfVxyXG5cclxuICAvKiBOb24tdGVybWluYWxzICovXHJcblxyXG4gIHByaXZhdGUgdmlzaXROb25UZXJtaW5hbCA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxKYXZhU2NyaXB0UHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcclxuICAgIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XHJcbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBzb21lIG5vbi10ZXJtaW5hbHNcclxuICAgIC8vIGNvbnRhaW4gY29tbWVudHMgd2hpY2ggaXMgd2hhdCB3ZSBjYXJlIGFib3V0XHJcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2NsYXNzX2JvZHknLCAnb2JqZWN0X3R5cGUnKSkge1xyXG4gICAgICBjaGlsZHJlbiA9IHRoaXMuZmlsdGVyVHlwZShub2RlLCAnY29tbWVudCcpO1xyXG4gICAgfVxyXG4gICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZXMgd2hlcmUgZXhwb3J0IHN0YXRlbWVudHMgaGF2ZSBub2RlIHByb3BlcnRpZXNcclxuICAgIGlmIChtYXRjaChub2RlLCAnZXhwb3J0X3N0YXRlbWVudCcpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnZpc2l0RXhwb3J0U3RhdGVtZW50KG5vZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2VzIHdoZXJlIGFuIGludGVybmFsIG1vZHVsZSBjb250YWlucyBvdGhlciBub2Rlc1xyXG4gICAgaWYgKG1hdGNoKG5vZGUsICdpbnRlcm5hbF9tb2R1bGUnKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy52aXNpdEludGVybmFsTW9kdWxlKG5vZGUsIHByb3BlcnRpZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2VzIHdoZXJlIGFuIGludGVybWFsX21vZHVsZSBjYW4gZXhpc3QgaW4gYW4gZXhwcmVzc2lvbl9zdGF0ZW1lbnRcclxuICAgIGlmIChtYXRjaChub2RlLCAnZXhwcmVzc2lvbl9zdGF0ZW1lbnQnKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy52aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQobm9kZSwgcHJvcGVydGllcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZXMgd2hlcmUgYSBmdW5jdGlvbiBoYXMgYSBzdGF0ZW1lbnRfYmxvY2tcclxuICAgIGlmIChtYXRjaChub2RlLCAnZnVuY3Rpb24nKSkge1xyXG4gICAgICBfLnJlbW92ZShjaGlsZHJlbiwgY2hpbGQgPT4gbWF0Y2goY2hpbGQsICdzdGF0ZW1lbnRfYmxvY2snKSlcclxuICAgICAgY29uc29sZS5sb2coY2hpbGRyZW4pO1xyXG4gICAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENoaWxkcmVuKGNoaWxkcmVuKSwgcHJvcGVydGllcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIHRoaXMudmlzaXRDaGlsZHJlbihjaGlsZHJlbiksIHByb3BlcnRpZXMpO1xyXG4gIH1cclxuXHJcbiAgLyogVGVybWluYWxzICovXHJcblxyXG4gIHByaXZhdGUgdmlzaXRUZXJtaW5hbCA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZSA9PiB7XHJcbiAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSlcclxuICB9XHJcbn0iXX0= \ No newline at end of file diff --git a/build/src/lang/typescript/index.d.ts b/build/src/lang/typescript/index.d.ts index 0203ee3..f0cec92 100644 --- a/build/src/lang/typescript/index.d.ts +++ b/build/src/lang/typescript/index.d.ts @@ -1,7 +1,7 @@ -import * as Parser from 'tree-sitter'; -import ParserInterface from '../../interfaces/ParserInterface'; +import * as TreeSitter from 'tree-sitter'; +import Parser from '../common/parser'; import Source from '../../interfaces/Source'; -import { ASTNode } from '../common/ast'; +import ASTNode from '../../interfaces/ASTNode'; /** * A class that parses JavaScript comments. * @@ -11,12 +11,10 @@ import { ASTNode } from '../common/ast'; * @implements IParser * @export default */ -export default class TypeScriptParser implements ParserInterface { - private source; - private options; +export default class TypeScriptParser extends Parser { private parser; private tree_; constructor(source: Source, options: any); parse: () => ASTNode[]; - readonly tree: Parser.Tree; + readonly tree: TreeSitter.Tree; } diff --git a/build/src/lang/typescript/index.js b/build/src/lang/typescript/index.js index 8d06c9e..7dab783 100644 --- a/build/src/lang/typescript/index.js +++ b/build/src/lang/typescript/index.js @@ -1,7 +1,8 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const Parser = require("tree-sitter"); +const TreeSitter = require("tree-sitter"); const TypeScript = require("tree-sitter-typescript"); +const parser_1 = require("../common/parser"); const walk_1 = require("../../utils/walk"); const visitor_1 = require("./visitor"); /** @@ -13,19 +14,16 @@ const visitor_1 = require("./visitor"); * @implements IParser * @export default */ -class TypeScriptParser { +class TypeScriptParser extends parser_1.default { constructor(source, options) { + super(source, options); this.parse = () => { const visitor = new visitor_1.TypeScriptVisitor(this.source); - const root = walk_1.default(this.tree_.rootNode); - // console.time('visit') - root.visit(visitor); - // console.timeEnd('visit') + const nodes = walk_1.default(this.tree_.rootNode); + nodes.visit(visitor); return visitor.getAST(); }; - this.source = source; - Object.assign(this.options = {}, options || {}); - this.parser = new Parser(); + this.parser = new TreeSitter(); this.parser.setLanguage(TypeScript); this.tree_ = this.parser.parse(this.source.text); } @@ -34,4 +32,4 @@ class TypeScriptParser { } } exports.default = TypeScriptParser; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy90eXBlc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNDO0FBQ3RDLHFEQUFxRDtBQUdyRCwyQ0FBb0M7QUFDcEMsdUNBQThDO0FBSTlDOzs7Ozs7OztHQVFHO0FBQ0gsTUFBcUIsZ0JBQWdCO0lBS25DLFlBQVksTUFBYyxFQUFFLE9BQVk7UUFPeEMsVUFBSyxHQUFHLEdBQWMsRUFBRTtZQUN0QixNQUFNLE9BQU8sR0FBRyxJQUFJLDJCQUFpQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuRCxNQUFNLElBQUksR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN2Qyx3QkFBd0I7WUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUNuQiwyQkFBMkI7WUFDM0IsT0FBTyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDMUIsQ0FBQyxDQUFBO1FBYkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBVUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7Q0FDRjtBQXhCRCxtQ0F3QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBQYXJzZXIgZnJvbSAndHJlZS1zaXR0ZXInO1xuaW1wb3J0ICogYXMgVHlwZVNjcmlwdCBmcm9tICd0cmVlLXNpdHRlci10eXBlc2NyaXB0JztcbmltcG9ydCBQYXJzZXJJbnRlcmZhY2UgZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9QYXJzZXJJbnRlcmZhY2UnO1xuaW1wb3J0IFNvdXJjZSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZSc7XG5pbXBvcnQgd2FsayBmcm9tICcuLi8uLi91dGlscy93YWxrJztcbmltcG9ydCB7IFR5cGVTY3JpcHRWaXNpdG9yIH0gZnJvbSAnLi92aXNpdG9yJztcbmltcG9ydCB7IEFTVE5vZGUgfSBmcm9tICcuLi9jb21tb24vYXN0JztcblxuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCBwYXJzZXMgSmF2YVNjcmlwdCBjb21tZW50cy5cbiAqXG4gKiAjIEFQSVxuICpcbiAqIEBjbGFzcyBKYXZhU2NyaXB0UGFyc2VyXG4gKiBAaW1wbGVtZW50cyBJUGFyc2VyXG4gKiBAZXhwb3J0IGRlZmF1bHRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVHlwZVNjcmlwdFBhcnNlciBpbXBsZW1lbnRzIFBhcnNlckludGVyZmFjZSB7XG4gIHByaXZhdGUgc291cmNlOiBTb3VyY2U7XG4gIHByaXZhdGUgb3B0aW9uczogYW55O1xuICBwcml2YXRlIHBhcnNlcjogUGFyc2VyO1xuICBwcml2YXRlIHRyZWVfOiBQYXJzZXIuVHJlZTtcbiAgY29uc3RydWN0b3Ioc291cmNlOiBTb3VyY2UsIG9wdGlvbnM6IGFueSkge1xuICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5vcHRpb25zID0ge30sIG9wdGlvbnMgfHwge30pO1xuICAgIHRoaXMucGFyc2VyID0gbmV3IFBhcnNlcigpO1xuICAgIHRoaXMucGFyc2VyLnNldExhbmd1YWdlKFR5cGVTY3JpcHQpO1xuICAgIHRoaXMudHJlZV8gPSB0aGlzLnBhcnNlci5wYXJzZSh0aGlzLnNvdXJjZS50ZXh0KTtcbiAgfVxuICBwYXJzZSA9ICgpOiBBU1ROb2RlW10gPT4ge1xuICAgIGNvbnN0IHZpc2l0b3IgPSBuZXcgVHlwZVNjcmlwdFZpc2l0b3IodGhpcy5zb3VyY2UpO1xuICAgIGNvbnN0IHJvb3QgPSB3YWxrKHRoaXMudHJlZV8ucm9vdE5vZGUpO1xuICAgIC8vIGNvbnNvbGUudGltZSgndmlzaXQnKVxuICAgIHJvb3QudmlzaXQodmlzaXRvcilcbiAgICAvLyBjb25zb2xlLnRpbWVFbmQoJ3Zpc2l0JylcbiAgICByZXR1cm4gdmlzaXRvci5nZXRBU1QoKTtcbiAgfVxuXG4gIGdldCB0cmVlICgpOiBQYXJzZXIuVHJlZSB7XG4gICAgcmV0dXJuIHRoaXMudHJlZV87XG4gIH1cbn1cbiJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy90eXBlc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsMENBQTBDO0FBQzFDLHFEQUFxRDtBQUNyRCw2Q0FBc0M7QUFFdEMsMkNBQW9DO0FBQ3BDLHVDQUE4QztBQUk5Qzs7Ozs7Ozs7R0FRRztBQUNILE1BQXFCLGdCQUFpQixTQUFRLGdCQUFNO0lBR2xELFlBQVksTUFBYyxFQUFFLE9BQVk7UUFDdEMsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUt6QixVQUFLLEdBQUcsR0FBYyxFQUFFO1lBQ3RCLE1BQU0sT0FBTyxHQUFHLElBQUksMkJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ25ELE1BQU0sS0FBSyxHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3hDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDcEIsT0FBTyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDMUIsQ0FBQyxDQUFBO1FBVEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBUUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7Q0FDRjtBQW5CRCxtQ0FtQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBUcmVlU2l0dGVyIGZyb20gJ3RyZWUtc2l0dGVyJztcclxuaW1wb3J0ICogYXMgVHlwZVNjcmlwdCBmcm9tICd0cmVlLXNpdHRlci10eXBlc2NyaXB0JztcclxuaW1wb3J0IFBhcnNlciBmcm9tICcuLi9jb21tb24vcGFyc2VyJztcclxuaW1wb3J0IFNvdXJjZSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZSc7XHJcbmltcG9ydCB3YWxrIGZyb20gJy4uLy4uL3V0aWxzL3dhbGsnO1xyXG5pbXBvcnQgeyBUeXBlU2NyaXB0VmlzaXRvciB9IGZyb20gJy4vdmlzaXRvcic7XHJcbmltcG9ydCBBU1ROb2RlIGZyb20gJy4uLy4uL2ludGVyZmFjZXMvQVNUTm9kZSc7XHJcblxyXG5cclxuLyoqXHJcbiAqIEEgY2xhc3MgdGhhdCBwYXJzZXMgSmF2YVNjcmlwdCBjb21tZW50cy5cclxuICpcclxuICogIyBBUElcclxuICpcclxuICogQGNsYXNzIEphdmFTY3JpcHRQYXJzZXJcclxuICogQGltcGxlbWVudHMgSVBhcnNlclxyXG4gKiBAZXhwb3J0IGRlZmF1bHRcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFR5cGVTY3JpcHRQYXJzZXIgZXh0ZW5kcyBQYXJzZXIge1xyXG4gIHByaXZhdGUgcGFyc2VyOiBUcmVlU2l0dGVyO1xyXG4gIHByaXZhdGUgdHJlZV86IFRyZWVTaXR0ZXIuVHJlZTtcclxuICBjb25zdHJ1Y3Rvcihzb3VyY2U6IFNvdXJjZSwgb3B0aW9uczogYW55KSB7XHJcbiAgICBzdXBlcihzb3VyY2UsIG9wdGlvbnMpO1xyXG4gICAgdGhpcy5wYXJzZXIgPSBuZXcgVHJlZVNpdHRlcigpO1xyXG4gICAgdGhpcy5wYXJzZXIuc2V0TGFuZ3VhZ2UoVHlwZVNjcmlwdCk7XHJcbiAgICB0aGlzLnRyZWVfID0gdGhpcy5wYXJzZXIucGFyc2UodGhpcy5zb3VyY2UudGV4dCk7XHJcbiAgfVxyXG4gIHBhcnNlID0gKCk6IEFTVE5vZGVbXSA9PiB7XHJcbiAgICBjb25zdCB2aXNpdG9yID0gbmV3IFR5cGVTY3JpcHRWaXNpdG9yKHRoaXMuc291cmNlKTtcclxuICAgIGNvbnN0IG5vZGVzID0gd2Fsayh0aGlzLnRyZWVfLnJvb3ROb2RlKTtcclxuICAgIG5vZGVzLnZpc2l0KHZpc2l0b3IpXHJcbiAgICByZXR1cm4gdmlzaXRvci5nZXRBU1QoKTtcclxuICB9XHJcblxyXG4gIGdldCB0cmVlICgpOiBUcmVlU2l0dGVyLlRyZWUge1xyXG4gICAgcmV0dXJuIHRoaXMudHJlZV87XHJcbiAgfVxyXG59XHJcbiJdfQ== \ No newline at end of file diff --git a/build/src/lang/typescript/properties.d.ts b/build/src/lang/typescript/properties.d.ts new file mode 100644 index 0000000..9477f9c --- /dev/null +++ b/build/src/lang/typescript/properties.d.ts @@ -0,0 +1,14 @@ +export interface TypeScriptProperties { + exports: Partial; + inheritance: Partial; + namespace: boolean; + module: boolean; +} +export interface TypeScriptExports { + export: boolean; + default: boolean; +} +export interface TypeScriptInheritance { + extends: boolean; + implements: boolean; +} diff --git a/build/src/lang/typescript/properties.js b/build/src/lang/typescript/properties.js new file mode 100644 index 0000000..446e17b --- /dev/null +++ b/build/src/lang/typescript/properties.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvcHJvcGVydGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBUeXBlU2NyaXB0UHJvcGVydGllcyB7XHJcbiAgZXhwb3J0czogUGFydGlhbDxUeXBlU2NyaXB0RXhwb3J0cz5cclxuICBpbmhlcml0YW5jZTogUGFydGlhbDxUeXBlU2NyaXB0SW5oZXJpdGFuY2U+XHJcbiAgbmFtZXNwYWNlOiBib29sZWFuLFxyXG4gIG1vZHVsZTogYm9vbGVhblxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVTY3JpcHRFeHBvcnRzIHtcclxuICBleHBvcnQ6IGJvb2xlYW4sXHJcbiAgZGVmYXVsdDogYm9vbGVhblxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVTY3JpcHRJbmhlcml0YW5jZSB7XHJcbiAgZXh0ZW5kczogYm9vbGVhbixcclxuICBpbXBsZW1lbnRzOiBib29sZWFuXHJcbn0iXX0= \ No newline at end of file diff --git a/build/src/lang/typescript/visitor.d.ts b/build/src/lang/typescript/visitor.d.ts index 11f7488..0b0784f 100644 --- a/build/src/lang/typescript/visitor.d.ts +++ b/build/src/lang/typescript/visitor.d.ts @@ -1,12 +1,12 @@ -import { ASTNode } from "../common/ast"; -import { NodeProperties } from "../common/emca"; -import { NodeVisitor } from "../common/node"; import { SyntaxNode } from "tree-sitter"; import Source from "../../interfaces/Source"; +import Visitor from "../common/visitor"; +import ASTNode from "../../interfaces/ASTNode"; +import { TypeScriptProperties } from "./properties"; /** * A class that visits ASTNodes from a TypeScript tree. */ -export declare class TypeScriptVisitor implements NodeVisitor { +export declare class TypeScriptVisitor implements Visitor { private ast; private source; constructor(source: Source); @@ -27,7 +27,7 @@ export declare class TypeScriptVisitor implements NodeVisitor { */ private filterType; getAST(): ASTNode[]; - visitNode: (node: SyntaxNode, properties?: Partial) => ASTNode; + visitNode: (node: SyntaxNode, properties?: Partial) => ASTNode; visitChildren: (nodes: SyntaxNode[]) => ASTNode[]; private visitProgram; private visitComment; diff --git a/build/src/lang/typescript/visitor.js b/build/src/lang/typescript/visitor.js index a1eaa83..49149f4 100644 --- a/build/src/lang/typescript/visitor.js +++ b/build/src/lang/typescript/visitor.js @@ -1,11 +1,11 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const ast_1 = require("../common/ast"); const comment_1 = require("../../utils/comment"); const sibling_1 = require("../../utils/sibling"); const _ = require("lodash"); const log_1 = require("../../utils/log"); const match_1 = require("../../utils/match"); +const ast_1 = require("../common/ast"); /** * A class that visits ASTNodes from a TypeScript tree. */ @@ -280,4 +280,4 @@ class TypeScriptVisitor { } } exports.TypeScriptVisitor = TypeScriptVisitor; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHVDQUF1RDtBQUN2RCxpREFBdUU7QUFHdkUsaURBQThDO0FBRTlDLDRCQUE0QjtBQUM1Qix5Q0FBaUQ7QUFDakQsNkNBQXNDO0FBR3RDOztHQUVHO0FBQ0gsTUFBYSxpQkFBaUI7SUFHNUIsWUFBWSxNQUFjO1FBRmxCLFFBQUcsR0FBYyxFQUFFLENBQUE7UUFxRTNCLGVBQWU7UUFFZixjQUFTLEdBQUcsQ0FDVixJQUFnQixFQUNoQixVQUFvQyxFQUNwQyxFQUFFO1lBQ0YsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNqQixLQUFLLFNBQVM7b0JBQ1osSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNuQyxNQUFNO2dCQUNSLEtBQUssU0FBUztvQkFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pDLEtBQUssU0FBUyxDQUFDO2dCQUNmLEtBQUssT0FBTztvQkFDVixhQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO29CQUM5RCxNQUFNO2dCQUNSO29CQUVFLCtCQUErQjtvQkFFL0IsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUNaLFlBQVksRUFDWixtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFDM0QsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQ3pFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQ3RFLG1CQUFtQixFQUFFLFlBQVksRUFDakMsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixrQkFBa0Is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L2NvbW1vbi9hc3RcIjtcbmltcG9ydCB7IGlzSmF2YURvY0NvbW1lbnQsIGlzTGVnYWxDb21tZW50IH0gZnJvbSBcIi4uLy4uL3V0aWxzL2NvbW1lbnRcIjtcbmltcG9ydCB7IE5vZGVQcm9wZXJ0aWVzLCBOb2RlSW5oZXJpdGFuY2UgfSBmcm9tIFwiLi4vY29tbW9uL2VtY2FcIjtcbmltcG9ydCB7IE5vZGVWaXNpdG9yIH0gZnJvbSBcIi4uL2NvbW1vbi9ub2RlXCI7XG5pbXBvcnQgeyBzaWJsaW5nIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3NpYmxpbmdcIjtcbmltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBsb2csIHsgRXJyb3JUeXBlIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2xvZ1wiO1xuaW1wb3J0IG1hdGNoIGZyb20gXCIuLi8uLi91dGlscy9tYXRjaFwiO1xuaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2VcIjtcblxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgdmlzaXRzIEFTVE5vZGVzIGZyb20gYSBUeXBlU2NyaXB0IHRyZWUuXG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlU2NyaXB0VmlzaXRvciBpbXBsZW1lbnRzIE5vZGVWaXNpdG9yIHtcbiAgcHJpdmF0ZSBhc3Q6IEFTVE5vZGVbXSA9IFtdXG4gIHByaXZhdGUgc291cmNlOiBTb3VyY2VcbiAgY29uc3RydWN0b3Ioc291cmNlOiBTb3VyY2UpIHtcbiAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBub2RlIGhhcyBpbmhlcml0YW5jZVxuICAgKi9cbiAgcHJpdmF0ZSBoYXNJbmhlcml0YW5jZShub2RlOiBTeW50YXhOb2RlKSB7XG4gICAgbGV0IGluaGVyaXRzID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdleHRlbmRzJywgJ2ltcGxlbWVudHMnKSkge1xuICAgICAgICBpbmhlcml0cyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbmhlcml0c1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBub2RlJ3MgaW5oZXJpdGFuY2UgdHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRJbmhlcml0YW5jZVR5cGUobm9kZTogU3ludGF4Tm9kZSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgaWYgKG1hdGNoKGNoaWxkLCAnZXh0ZW5kcycpKSB7XG4gICAgICAgIHJldHVybiAnZXh0ZW5kcyc7XG4gICAgICB9XG5cbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ2ltcGxlbWVudHMnKSkge1xuICAgICAgICByZXR1cm4gJ2ltcGxlbWVudHMnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gZXhwb3J0IGlzIGRlZmF1bHRcbiAgICovXG4gIHByaXZhdGUgaGFzRGVmYXVsdEV4cG9ydChub2RlOiBTeW50YXhOb2RlKTogYm9vbGVhbiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdkZWZhdWx0JykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG9ubHkgdGhlIGNvbW1lbnRzIGZyb20gYSBub2RlJ3MgY2hpbGRyZW4uXG4gICAqL1xuICBwcml2YXRlIGZpbHRlclR5cGUobm9kZTogU3ludGF4Tm9kZSwgdHlwZTogc3RyaW5nKTogU3ludGF4Tm9kZVtdIHtcbiAgICAvLyBjb25zb2xlLnRpbWUoJ2ZpbHRlclR5cGUnKVxuICAgIGxldCBjaGlsZHJlbjogU3ludGF4Tm9kZVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XG4gICAgICBpZiAobWF0Y2goY2hpbGQsIHR5cGUpKSB7XG4gICAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBjb25zb2xlLnRpbWVFbmQoJ2ZpbHRlclR5cGUnKVxuICAgIHJldHVybiBjaGlsZHJlbjtcbiAgfVxuXG4gIGdldEFTVCgpOiBBU1ROb2RlW10ge1xuICAgIHJldHVybiB0aGlzLmFzdDtcbiAgfVxuXG4gIC8qIFZpc2l0b3JzICAqL1xuXG4gIHZpc2l0Tm9kZSA9IChcbiAgICBub2RlOiBTeW50YXhOb2RlLFxuICAgIHByb3BlcnRpZXM/OiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPlxuICApID0+IHtcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSAncHJvZ3JhbSc6XG4gICAgICAgIHRoaXMuYXN0ID0gdGhpcy52aXNpdFByb2dyYW0obm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY29tbWVudCc6XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0Q29tbWVudChub2RlKTtcbiAgICAgIGNhc2UgJ01JU1NJTkcnOlxuICAgICAgY2FzZSAnRVJST1InOlxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuVHJlZVNpdHRlclBhcnNlRXJyb3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG5cbiAgICAgICAgLyogTWF0Y2ggb3RoZXIgbm9uLXRlcm1pbmFscyAqL1xuXG4gICAgICAgIGlmIChtYXRjaChub2RlLFxuICAgICAgICAgICdjb25zdHJhaW50JyxcbiAgICAgICAgICAnZm9ybWFsX3BhcmFtZXRlcnMnLCAncmVxdWlyZWRfcGFyYW1ldGVyJywgJ3Jlc3RfcGFyYW1ldGVyJyxcbiAgICAgICAgICAndHlwZV9pZGVudGlmaWVyJywgJ3R5cGVfcGFyYW1ldGVycycsICd0eXBlX3BhcmFtZXRlcicsICd0eXBlX2Fubm90YXRpb24nLFxuICAgICAgICAgICdvYmplY3RfdHlwZScsICdwcmVkZWZpbmVkX3R5cGUnLCAncGFyZW50aGVzaXplZF90eXBlJywgJ2xpdGVyYWxfdHlwZScsXG4gICAgICAgICAgJ2ludGVyc2VjdGlvbl90eXBlJywgJ3VuaW9uX3R5cGUnLFxuICAgICAgICAgICdjbGFzc19ib2R5JyxcbiAgICAgICAgICAnZXh0ZW5kc19jbGF1c2UnLFxuICAgICAgICAgICd1bmFyeV9leHByZXNzaW9uJywgJ2JpbmFyeV9leHByZXNzaW9uJywgJ21lbWJlcl9leHByZXNzaW9uJyxcbiAgICAgICAgICAnc3RhdGVtZW50X2Jsb2NrJywgJ3JldHVybl9zdGF0ZW1lbnQnLCAnZXhwb3J0X3N0YXRlbWVudCcsICdleHByZXNzaW9uX3N0YXRlbWVudCcsXG4gICAgICAgICAgLy8gQSBjYWxsX3NpZ25hdHVyZSBjYW4gYWxzbyBiZSBhIG5vbi1jb250ZXh0dWFsIG5vZGVcbiAgICAgICAgICAnY2FsbF9zaWduYXR1cmUnLFxuICAgICAgICAgICdpbnRlcm5hbF9tb2R1bGUnLFxuICAgICAgICAgICd2YXJpYWJsZV9kZWNsYXJhdG9yJyxcbiAgICAgICAgICAnb2JqZWN0J1xuICAgICAgICApKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudmlzaXROb25UZXJtaW5hbChub2RlLCBwcm9wZXJ0aWVzKVxuICAgICAgICB9XG5cbiAgICAgICAgLyogTWF0Y2ggdGVybWluYWxzICovXG4gICAgICAgIGlmIChtYXRjaChub2RlLFxuICAgICAgICAgICdpZGVudGlmaWVyJywgJ2V4dGVuZHMnLCAncHJvcGVydHlfaWRlbnRpZmllcicsICdhY2Nlc3NpYmlsaXR5X21vZGlmaWVyJyxcbiAgICAgICAgICAnc3RyaW5nJywgJ3ZvaWQnLCAnYm9vbGVhbicsICdudWxsJywgJ3VuZGVmaW5lZCcsICdudW1iZXInLCAncmV0dXJuJyxcbiAgICAgICAgICAnZ2V0JywgJ2Z1bmN0aW9uJywgJ25hbWVzcGFjZScsICdjb25zdCdcbiAgICAgICAgKSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnZpc2l0VGVybWluYWwobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nLnJlcG9ydCh0aGlzLnNvdXJjZSwgbm9kZSwgRXJyb3JUeXBlLk5vZGVUeXBlTm90WWV0U3VwcG9ydGVkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmlzaXRDaGlsZHJlbiA9IChub2RlczogU3ludGF4Tm9kZVtdKTogQVNUTm9kZVtdID0+IHtcbiAgICBsZXQgY2hpbGRyZW46IEFTVE5vZGVbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgIGlmICghbm9kZS50eXBlLm1hdGNoKC9bPD4oKXt9LDo7XFxbXFxdJnw9XFwrXFwtXFwqXFwvXS8pICYmIG5vZGUudHlwZSAhPT0gJy4uLicpIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSB0aGlzLnZpc2l0Tm9kZShub2RlKTtcbiAgICAgICAgaWYgKGNoaWxkKSBjaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG5cbiAgcHJpdmF0ZSB2aXNpdFByb2dyYW0gPSAobm9kZTogU3ludGF4Tm9kZSk6IEFTVE5vZGVbXSA9PiB7XG4gICAgbGV0IHZpc2l0ZWQgPSB7fSxcbiAgICAgIGdldFN0YXJ0TG9jYXRpb24gPSAobjogQVNUTm9kZSkgPT4gYCR7bi5sb2NhdGlvbi5yb3cuc3RhcnR9OiR7bi5sb2NhdGlvbi5jb2x1bW4uc3RhcnR9YDtcbiAgICAvLyBBIHByb2dyYW0gY2FuIGhhdmUgbW9kdWxlcywgbmFtZXNwYWNlcywgY29tbWVudHMgYXMgaXRzIGNoaWxkcmVuXG4gICAgLy8gVGhlIGZpcnN0IHN0ZXAgaXMgdG8gcGFyc2UgYWxsIHRoZSBjb21tZW50cyBpbiB0aGUgcm9vdCBub2RlXG4gICAgbGV0IGNvbW1lbnRzID0gdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShub2RlLCAnY29tbWVudCcpKTtcbiAgICAvLyBQYXJzZSB0aGUgbmFtZXNwYWNlcyBpbiBleHByZXNzaW9uX3N0YXRlbWVudFxuICAgIGxldCBuYW1lc3BhY2VzID0gdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShub2RlLCAnZXhwcmVzc2lvbl9zdGF0ZW1lbnQnKSk7XG4gICAgLy8gUGFyc2UgdGhlIGV4cG9ydCBzdGF0ZW1lbnRzIGluIHRoZSByb290IG5vZGVcbiAgICBsZXQgZXhwb3J0cyA9IHRoaXMudmlzaXRDaGlsZHJlbih0aGlzLmZpbHRlclR5cGUobm9kZSwgJ2V4cG9ydF9zdGF0ZW1lbnQnKSk7XG5cbiAgICAvLyBHZXQgdGhlIHZpc2l0ZWQgY29udGV4dCBub2Rlc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNvbW1lbnQgPSBjb21tZW50c1tpXTtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBjb21tZW50O1xuICAgICAgdmlzaXRlZFtnZXRTdGFydExvY2F0aW9uKGNvbnRleHQpXSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHRoZSB2aXNpdGVkIG5vZGVzIGZyb20gbmFtZXNwYWNlcyBhcnJheVxuICAgIF8ucmVtb3ZlKG5hbWVzcGFjZXMsIHggPT4gdmlzaXRlZFtnZXRTdGFydExvY2F0aW9uKHgpXSk7XG5cbiAgICAvLyBFeHBvcnRzIGFyZSBvZGRiYWxscyBzaW5jZSBzb21lIGV4cG9ydHMgbWF5IHJlZmVyZW5jZVxuICAgIC8vIGEgdHlwZS9ub2RlIHRoYXQgbWF5IGhhdmUgYmVlbiBjb21tZW50ZWQuXG4gICAgLy8gV2UnbGwgZmlyc3QgbmVlZCB0byBmaWx0ZXIgdGhlIG9uZXMgd2UgaGF2ZSB2aXNpdGVkXG4gICAgXy5yZW1vdmUoZXhwb3J0cywgeCA9PiB2aXNpdGVkW2dldFN0YXJ0TG9jYXRpb24oeCldKTtcblxuICAgIC8vIEZyb20gdGhlIG9uZXMgd2UgaGF2ZSBub3QgdmlzaXRlZCwgd2UnbGwgbmVlZCB0byBtb2RpZnlcbiAgICAvLyB0aGUgbm9kZSBwcm9wZXJ0aWVzIG9mIGVhY2ggY29udGV4dCBpbiBhIGNvbW1lbnQgbm9kZSB0aGF0XG4gICAgLy8gbWF0Y2hlcyB0aGUgb25lcyB3ZSBoYXZlIG5vdCB2aXNpdGVkLlxuICAgIGNvbnN0IG1hdGNoZWQgPSB7fTtcbiAgICBjb21tZW50cyA9IF8uY29tcGFjdChcbiAgICAgIGNvbW1lbnRzLm1hcChjb21tZW50ID0+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBvcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZXhwb3J0XyA9IGV4cG9ydHNbaV07XG4gICAgICAgICAgY29uc3QgY29udGV4dCA9IGNvbW1lbnQuY29udGV4dDtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgY29udGV4dCAmJiBqIDwgY29udGV4dC5jaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKGNvbnRleHQuY2hpbGRyZW5baV0gJiYgY29udGV4dC5jaGlsZHJlbltpXS50eXBlID09PSBleHBvcnRfLnR5cGUpIHtcbiAgICAgICAgICAgICAgbWF0Y2hlZFtnZXRTdGFydExvY2F0aW9uKGV4cG9ydF8pXSA9IHRydWU7XG4gICAgICAgICAgICAgIGNvbW1lbnQuY29udGV4dC5wcm9wZXJ0aWVzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICBjb21tZW50LmNvbnRleHQucHJvcGVydGllcyB8fCB7fSxcbiAgICAgICAgICAgICAgICBleHBvcnRfLnByb3BlcnRpZXNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbW1lbnQ7XG4gICAgICB9KSk7XG5cbiAgICAvLyBSZW1vdmVkIHRoZSBtYXRjaGVkIGV4cG9ydHNcbiAgICBfLnJlbW92ZShleHBvcnRzLCB4ID0+IG1hdGNoZWRbZ2V0U3RhcnRMb2NhdGlvbih4KV0pXG5cbiAgICByZXR1cm4gW10uY29uY2F0KGNvbW1lbnRzKS5jb25jYXQobmFtZXNwYWNlcykuY29uY2F0KGV4cG9ydHMpO1xuICB9XG5cbiAgcHJpdmF0ZSB2aXNpdENvbW1lbnQgPSAobm9kZTogU3ludGF4Tm9kZSk6IEFTVE5vZGUgPT4ge1xuICAgIGlmIChpc0phdmFEb2NDb21tZW50KHRoaXMuc291cmNlLCBub2RlKSAmJiAhaXNMZWdhbENvbW1lbnQodGhpcy5zb3VyY2UsIG5vZGUpKSB7XG4gICAgICBjb25zdCBuZXh0U2libGluZyA9IHNpYmxpbmcobm9kZSk7XG4gICAgICBpZiAobmV4dFNpYmxpbmcpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIHRoaXMudmlzaXRDb250ZXh0KG5leHRTaWJsaW5nLCB7fSksIHRydWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZpc2l0IHRoZSBjb250ZXh0dWFsIG5vZGVcbiAgICogXG4gICAqICMgUmVtYXJrXG4gICAqIFxuICAgKiBBIG5vZGUgaXMgY29uc2lkZXJlZCBjb250ZXh0dWFsIHdoZW4gYSBjb21tZW50IGlzIHZpc2l0ZWQgYW5kIHRoZSBub2RlIGlzIGl0cyBzaWJsaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSB2aXNpdENvbnRleHQgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2V4cG9ydF9zdGF0ZW1lbnQnOlxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdEV4cG9ydFN0YXRlbWVudChub2RlLCBwcm9wZXJ0aWVzKTtcbiAgICAgIGNhc2UgJ2V4cHJlc3Npb25fc3RhdGVtZW50JzpcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KG5vZGUsIHByb3BlcnRpZXMpO1xuICAgICAgY2FzZSAnY2xhc3MnOlxuICAgICAgY2FzZSAnaW50ZXJmYWNlX2RlY2xhcmF0aW9uJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRDbGFzc09ySW50ZXJmYWNlKG5vZGUsIHByb3BlcnRpZXMpXG4gICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICBjYXNlICdjYWxsX3NpZ25hdHVyZSc6XG4gICAgICBjYXNlICdtZXRob2Rfc2lnbmF0dXJlJzpcbiAgICAgIGNhc2UgJ3Byb3BlcnR5X3NpZ25hdHVyZSc6XG4gICAgICBjYXNlICdwdWJsaWNfZmllbGRfZGVmaW5pdGlvbic6XG4gICAgICBjYXNlICdtZXRob2RfZGVmaW5pdGlvbic6XG4gICAgICBjYXNlICdsZXhpY2FsX2RlY2xhcmF0aW9uJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXROb25UZXJtaW5hbChub2RlLCBwcm9wZXJ0aWVzKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGxvZy5yZXBvcnQodGhpcy5zb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFlldFN1cHBvcnRlZCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qIFN0YXRlbWVudHMgKi9cblxuICBwcml2YXRlIHZpc2l0RXhwb3J0U3RhdGVtZW50ID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xuICAgIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4sIGRlZmF1bHRFeHBvcnQgPSBmYWxzZTtcbiAgICAvLyBSZW1vdmUgJ2V4cG9ydCcgc2luY2UgaXQncyBhbHdheXMgZmlyc3QgaW4gdGhlIGFycmF5XG4gICAgY2hpbGRyZW4uc2hpZnQoKTtcbiAgICBpZiAodGhpcy5oYXNEZWZhdWx0RXhwb3J0KG5vZGUpKSB7XG4gICAgICBkZWZhdWx0RXhwb3J0ID0gdHJ1ZTtcbiAgICAgIC8vIFJlbW92ZSAnZGVmYXVsdCcgZXhwb3J0XG4gICAgICBjaGlsZHJlbi5zaGlmdCgpO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuLnNoaWZ0KCk7XG4gICAgcmV0dXJuIHRoaXMudmlzaXROb2RlKGNoaWxkLCB7IGV4cG9ydHM6IHsgZXhwb3J0OiB0cnVlLCBkZWZhdWx0OiBkZWZhdWx0RXhwb3J0IH0gfSk7XG4gIH1cblxuICBwcml2YXRlIHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudCA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzOiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xuICAgIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbi5zaGlmdCgpO1xuXG4gICAgaWYgKG1hdGNoKGNoaWxkLCAnaW50ZXJuYWxfbW9kdWxlJykpIHtcbiAgICAgIHJldHVybiB0aGlzLnZpc2l0SW50ZXJuYWxNb2R1bGUoY2hpbGQsIHByb3BlcnRpZXMpXG4gICAgfVxuXG4gICAgaWYgKG1hdGNoKGNoaWxkLCAnZnVuY3Rpb24nKSkge1xuICAgICAgaWYgKHByb3BlcnRpZXMpIHJldHVybiB0aGlzLnZpc2l0Q29udGV4dChjaGlsZCwgcHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudmlzaXROb25UZXJtaW5hbChjaGlsZClcbiAgfVxuXG4gIC8qIE1vZHVsZXMgKi9cblxuICBwcml2YXRlIHZpc2l0SW50ZXJuYWxNb2R1bGUgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8Tm9kZVByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XG4gICAgbGV0IGNoaWxkcmVuOiBBU1ROb2RlW10gPSBub2RlLmNoaWxkcmVuLm1hcChjaGlsZCA9PiB7XG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdzdGF0ZW1lbnRfYmxvY2snKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShjaGlsZCwgJ2NvbW1lbnQnKSkpXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy52aXNpdE5vZGUoY2hpbGQpO1xuICAgIH0pO1xuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCBjaGlsZHJlbiwgT2JqZWN0LmFzc2lnbihwcm9wZXJ0aWVzIHx8IHt9LCB7IG5hbWVzcGFjZTogdHJ1ZSB9KSk7XG4gIH1cblxuXG4gIC8qIERlY2xhcmF0aW9ucyAqL1xuXG4gIHByaXZhdGUgdmlzaXRDbGFzc09ySW50ZXJmYWNlID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xuICAgIC8vIFNpbmNlICdpbnRlcmZhY2UnIG9yICdjbGFzcycgaXMgYWx3YXlzIGZpcnN0IGluIHRoZSBhcnJheVxuICAgIC8vIHdlJ2xsIG5lZWQgdG8gcmVtb3ZlIGl0IGZyb20gdGhlIGFycmF5LlxuICAgIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XG4gICAgY29uc3QgaW50ZXJmYWNlXyA9IGNoaWxkcmVuLnNoaWZ0KCk7XG4gICAgbGV0IGV4dGVuZHNfID0gZmFsc2UsIGltcGxlbWVudHNfID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuaGFzSW5oZXJpdGFuY2Uobm9kZSkpIHtcbiAgICAgIGNvbnN0IGluaGVyaXRhbmNlID0gdGhpcy5nZXRJbmhlcml0YW5jZVR5cGUobm9kZSlcbiAgICAgIGV4dGVuZHNfID0gaW5oZXJpdGFuY2UgPT09ICdleHRlbmRzJztcbiAgICAgIGltcGxlbWVudHNfID0gaW5oZXJpdGFuY2UgPT09ICdpbXBsZW1lbnRzJztcbiAgICB9XG5cbiAgICBjb25zdCBub2RlXyA9IGNyZWF0ZUFTVE5vZGUoXG4gICAgICB0aGlzLnNvdXJjZSxcbiAgICAgIG5vZGUsXG4gICAgICB0aGlzLnZpc2l0Q2hpbGRyZW4oY2hpbGRyZW4pLFxuICAgICAgT2JqZWN0LmFzc2lnbihwcm9wZXJ0aWVzIHx8IHt9LCB7XG4gICAgICAgIGluaGVyaXRhbmNlOiB7XG4gICAgICAgICAgaW1wbGVtZW50czogaW1wbGVtZW50c18sXG4gICAgICAgICAgZXh0ZW5kczogZXh0ZW5kc19cbiAgICAgICAgfSBhcyBOb2RlSW5oZXJpdGFuY2VcbiAgICAgIH0pKTtcblxuICAgIGlmIChtYXRjaChub2RlLCAnY2xhc3MnKSkge1xuICAgICAgcmV0dXJuIG5vZGVfO1xuICAgIH1cbiAgICAvLyBPdmVyd3JpdGUgdGhlIG5vZGUgdHlwZSBmcm9tICdpbnRlcmZhY2VfZGVjbGFyYXRpb24nIHRvICdpbnRlcmZhY2UnXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obm9kZV8sIHsgdHlwZTogaW50ZXJmYWNlXy50eXBlIH0pXG4gIH1cblxuICAvKiBOb24tdGVybWluYWxzICovXG5cbiAgcHJpdmF0ZSB2aXNpdE5vblRlcm1pbmFsID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPE5vZGVQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xuICAgIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XG4gICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZXMgd2hlcmUgc29tZSBub24tdGVybWluYWxzXG4gICAgLy8gY29udGFpbiBjb21tZW50cyB3aGljaCBpcyB3aGF0IHdlIGNhcmUgYWJvdXRcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2NsYXNzX2JvZHknLCAnb2JqZWN0X3R5cGUnKSkge1xuICAgICAgY2hpbGRyZW4gPSB0aGlzLmZpbHRlclR5cGUobm9kZSwgJ2NvbW1lbnQnKTtcbiAgICB9XG4gICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZXMgd2hlcmUgZXhwb3J0IHN0YXRlbWVudHMgaGF2ZSBub2RlIHByb3BlcnRpZXNcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2V4cG9ydF9zdGF0ZW1lbnQnKSkge1xuICAgICAgcmV0dXJuIHRoaXMudmlzaXRFeHBvcnRTdGF0ZW1lbnQobm9kZSk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZXMgd2hlcmUgYW4gaW50ZXJuYWwgbW9kdWxlIGNvbnRhaW5zIG90aGVyIG5vZGVzXG4gICAgaWYgKG1hdGNoKG5vZGUsICdpbnRlcm5hbF9tb2R1bGUnKSkge1xuICAgICAgcmV0dXJuIHRoaXMudmlzaXRJbnRlcm5hbE1vZHVsZShub2RlLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBhbiBpbnRlcm1hbF9tb2R1bGUgY2FuIGV4aXN0IGluIGFuIGV4cHJlc3Npb25fc3RhdGVtZW50XG4gICAgaWYgKG1hdGNoKG5vZGUsICdleHByZXNzaW9uX3N0YXRlbWVudCcpKSB7XG4gICAgICByZXR1cm4gdGhpcy52aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQobm9kZSwgcHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgaWYgKG1hdGNoKG5vZGUsICdmdW5jdGlvbicpKSB7XG4gICAgICBfLnJlbW92ZShjaGlsZHJlbiwgY2hpbGQgPT4gbWF0Y2goY2hpbGQsICdzdGF0ZW1lbnRfYmxvY2snKSlcbiAgICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q2hpbGRyZW4oY2hpbGRyZW4pLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENoaWxkcmVuKGNoaWxkcmVuKSwgcHJvcGVydGllcyk7XG4gIH1cblxuICAvKiBUZXJtaW5hbHMgKi9cblxuICBwcml2YXRlIHZpc2l0VGVybWluYWwgPSAobm9kZTogU3ludGF4Tm9kZSk6IEFTVE5vZGUgPT4ge1xuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlKVxuICB9XG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGlEQUF1RTtBQUN2RSxpREFBOEM7QUFFOUMsNEJBQTRCO0FBQzVCLHlDQUFpRDtBQUNqRCw2Q0FBc0M7QUFJdEMsdUNBQThDO0FBRzlDOztHQUVHO0FBQ0gsTUFBYSxpQkFBaUI7SUFHNUIsWUFBWSxNQUFjO1FBRmxCLFFBQUcsR0FBYyxFQUFFLENBQUE7UUFxRTNCLGVBQWU7UUFFZixjQUFTLEdBQUcsQ0FDVixJQUFnQixFQUNoQixVQUEwQyxFQUMxQyxFQUFFO1lBQ0YsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNqQixLQUFLLFNBQVM7b0JBQ1osSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNuQyxNQUFNO2dCQUNSLEtBQUssU0FBUztvQkFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pDLEtBQUssU0FBUyxDQUFDO2dCQUNmLEtBQUssT0FBTztvQkFDVixhQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO29CQUM5RCxNQUFNO2dCQUNSO29CQUVFLCtCQUErQjtvQkFFL0IsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUNaLFlBQVksRUFDWixtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFDM0QsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQ3pFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQ3RFLG1CQUFtQixFQUFFLFlBQVksRUFDakMsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixrQkFBa0Is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IGZyb20gXCIuLi8uLi91dGlscy9jb21tZW50XCI7XHJcbmltcG9ydCB7IHNpYmxpbmcgfSBmcm9tIFwiLi4vLi4vdXRpbHMvc2libGluZ1wiO1xyXG5pbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XHJcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcclxuaW1wb3J0IGxvZywgeyBFcnJvclR5cGUgfSBmcm9tIFwiLi4vLi4vdXRpbHMvbG9nXCI7XHJcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi4vLi4vdXRpbHMvbWF0Y2hcIjtcclxuaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2VcIjtcclxuaW1wb3J0IFZpc2l0b3IgZnJvbSBcIi4uL2NvbW1vbi92aXNpdG9yXCI7XHJcbmltcG9ydCBBU1ROb2RlIGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL0FTVE5vZGVcIjtcclxuaW1wb3J0IHsgY3JlYXRlQVNUTm9kZSB9IGZyb20gXCIuLi9jb21tb24vYXN0XCI7XHJcbmltcG9ydCB7IFR5cGVTY3JpcHRQcm9wZXJ0aWVzLCBUeXBlU2NyaXB0SW5oZXJpdGFuY2UgfSBmcm9tIFwiLi9wcm9wZXJ0aWVzXCI7XHJcblxyXG4vKipcclxuICogQSBjbGFzcyB0aGF0IHZpc2l0cyBBU1ROb2RlcyBmcm9tIGEgVHlwZVNjcmlwdCB0cmVlLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFR5cGVTY3JpcHRWaXNpdG9yIGltcGxlbWVudHMgVmlzaXRvciB7XHJcbiAgcHJpdmF0ZSBhc3Q6IEFTVE5vZGVbXSA9IFtdXHJcbiAgcHJpdmF0ZSBzb3VyY2U6IFNvdXJjZVxyXG4gIGNvbnN0cnVjdG9yKHNvdXJjZTogU291cmNlKSB7XHJcbiAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgd2hldGhlciBhIG5vZGUgaGFzIGluaGVyaXRhbmNlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoYXNJbmhlcml0YW5jZShub2RlOiBTeW50YXhOb2RlKSB7XHJcbiAgICBsZXQgaW5oZXJpdHMgPSBmYWxzZTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XHJcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ2V4dGVuZHMnLCAnaW1wbGVtZW50cycpKSB7XHJcbiAgICAgICAgaW5oZXJpdHMgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaW5oZXJpdHNcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBub2RlJ3MgaW5oZXJpdGFuY2UgdHlwZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0SW5oZXJpdGFuY2VUeXBlKG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XHJcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ2V4dGVuZHMnKSkge1xyXG4gICAgICAgIHJldHVybiAnZXh0ZW5kcyc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ2ltcGxlbWVudHMnKSkge1xyXG4gICAgICAgIHJldHVybiAnaW1wbGVtZW50cyc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgd2hldGhlciBhbiBleHBvcnQgaXMgZGVmYXVsdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgaGFzRGVmYXVsdEV4cG9ydChub2RlOiBTeW50YXhOb2RlKTogYm9vbGVhbiB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xyXG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdkZWZhdWx0JykpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBvbmx5IHRoZSBjb21tZW50cyBmcm9tIGEgbm9kZSdzIGNoaWxkcmVuLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZmlsdGVyVHlwZShub2RlOiBTeW50YXhOb2RlLCB0eXBlOiBzdHJpbmcpOiBTeW50YXhOb2RlW10ge1xyXG4gICAgLy8gY29uc29sZS50aW1lKCdmaWx0ZXJUeXBlJylcclxuICAgIGxldCBjaGlsZHJlbjogU3ludGF4Tm9kZVtdID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xyXG4gICAgICBpZiAobWF0Y2goY2hpbGQsIHR5cGUpKSB7XHJcbiAgICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGNvbnNvbGUudGltZUVuZCgnZmlsdGVyVHlwZScpXHJcbiAgICByZXR1cm4gY2hpbGRyZW47XHJcbiAgfVxyXG5cclxuICBnZXRBU1QoKTogQVNUTm9kZVtdIHtcclxuICAgIHJldHVybiB0aGlzLmFzdDtcclxuICB9XHJcblxyXG4gIC8qIFZpc2l0b3JzICAqL1xyXG5cclxuICB2aXNpdE5vZGUgPSAoXHJcbiAgICBub2RlOiBTeW50YXhOb2RlLFxyXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8VHlwZVNjcmlwdFByb3BlcnRpZXM+XHJcbiAgKSA9PiB7XHJcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xyXG4gICAgICBjYXNlICdwcm9ncmFtJzpcclxuICAgICAgICB0aGlzLmFzdCA9IHRoaXMudmlzaXRQcm9ncmFtKG5vZGUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdjb21tZW50JzpcclxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdENvbW1lbnQobm9kZSk7XHJcbiAgICAgIGNhc2UgJ01JU1NJTkcnOlxyXG4gICAgICBjYXNlICdFUlJPUic6XHJcbiAgICAgICAgbG9nLnJlcG9ydCh0aGlzLnNvdXJjZSwgbm9kZSwgRXJyb3JUeXBlLlRyZWVTaXR0ZXJQYXJzZUVycm9yKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuXHJcbiAgICAgICAgLyogTWF0Y2ggb3RoZXIgbm9uLXRlcm1pbmFscyAqL1xyXG5cclxuICAgICAgICBpZiAobWF0Y2gobm9kZSxcclxuICAgICAgICAgICdjb25zdHJhaW50JyxcclxuICAgICAgICAgICdmb3JtYWxfcGFyYW1ldGVycycsICdyZXF1aXJlZF9wYXJhbWV0ZXInLCAncmVzdF9wYXJhbWV0ZXInLFxyXG4gICAgICAgICAgJ3R5cGVfaWRlbnRpZmllcicsICd0eXBlX3BhcmFtZXRlcnMnLCAndHlwZV9wYXJhbWV0ZXInLCAndHlwZV9hbm5vdGF0aW9uJyxcclxuICAgICAgICAgICdvYmplY3RfdHlwZScsICdwcmVkZWZpbmVkX3R5cGUnLCAncGFyZW50aGVzaXplZF90eXBlJywgJ2xpdGVyYWxfdHlwZScsXHJcbiAgICAgICAgICAnaW50ZXJzZWN0aW9uX3R5cGUnLCAndW5pb25fdHlwZScsXHJcbiAgICAgICAgICAnY2xhc3NfYm9keScsXHJcbiAgICAgICAgICAnZXh0ZW5kc19jbGF1c2UnLFxyXG4gICAgICAgICAgJ3VuYXJ5X2V4cHJlc3Npb24nLCAnYmluYXJ5X2V4cHJlc3Npb24nLCAnbWVtYmVyX2V4cHJlc3Npb24nLFxyXG4gICAgICAgICAgJ3N0YXRlbWVudF9ibG9jaycsICdyZXR1cm5fc3RhdGVtZW50JywgJ2V4cG9ydF9zdGF0ZW1lbnQnLCAnZXhwcmVzc2lvbl9zdGF0ZW1lbnQnLFxyXG4gICAgICAgICAgLy8gQSBjYWxsX3NpZ25hdHVyZSBjYW4gYWxzbyBiZSBhIG5vbi1jb250ZXh0dWFsIG5vZGVcclxuICAgICAgICAgICdjYWxsX3NpZ25hdHVyZScsXHJcbiAgICAgICAgICAnaW50ZXJuYWxfbW9kdWxlJyxcclxuICAgICAgICAgICd2YXJpYWJsZV9kZWNsYXJhdG9yJyxcclxuICAgICAgICAgICdvYmplY3QnXHJcbiAgICAgICAgKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMudmlzaXROb25UZXJtaW5hbChub2RlLCBwcm9wZXJ0aWVzKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyogTWF0Y2ggdGVybWluYWxzICovXHJcbiAgICAgICAgaWYgKG1hdGNoKG5vZGUsXHJcbiAgICAgICAgICAnaWRlbnRpZmllcicsICdleHRlbmRzJywgJ3Byb3BlcnR5X2lkZW50aWZpZXInLCAnYWNjZXNzaWJpbGl0eV9tb2RpZmllcicsXHJcbiAgICAgICAgICAnc3RyaW5nJywgJ3ZvaWQnLCAnYm9vbGVhbicsICdudWxsJywgJ3VuZGVmaW5lZCcsICdudW1iZXInLCAncmV0dXJuJyxcclxuICAgICAgICAgICdnZXQnLCAnZnVuY3Rpb24nLCAnbmFtZXNwYWNlJywgJ2NvbnN0J1xyXG4gICAgICAgICkpIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLnZpc2l0VGVybWluYWwobm9kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxvZy5yZXBvcnQodGhpcy5zb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFlldFN1cHBvcnRlZCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB2aXNpdENoaWxkcmVuID0gKG5vZGVzOiBTeW50YXhOb2RlW10pOiBBU1ROb2RlW10gPT4ge1xyXG4gICAgbGV0IGNoaWxkcmVuOiBBU1ROb2RlW10gPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xyXG4gICAgICBpZiAoIW5vZGUudHlwZS5tYXRjaCgvWzw+KCl7fSw6O1xcW1xcXSZ8PVxcK1xcLVxcKlxcL10vKSAmJiBub2RlLnR5cGUgIT09ICcuLi4nKSB7XHJcbiAgICAgICAgY29uc3QgY2hpbGQgPSB0aGlzLnZpc2l0Tm9kZShub2RlKTtcclxuICAgICAgICBpZiAoY2hpbGQpIGNoaWxkcmVuLnB1c2goY2hpbGQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2hpbGRyZW47XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHZpc2l0UHJvZ3JhbSA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZVtdID0+IHtcclxuICAgIGxldCB2aXNpdGVkID0ge30sXHJcbiAgICAgIGdldFN0YXJ0TG9jYXRpb24gPSAobjogQVNUTm9kZSkgPT4gYCR7bi5sb2NhdGlvbi5yb3cuc3RhcnR9OiR7bi5sb2NhdGlvbi5jb2x1bW4uc3RhcnR9YDtcclxuICAgIC8vIEEgcHJvZ3JhbSBjYW4gaGF2ZSBtb2R1bGVzLCBuYW1lc3BhY2VzLCBjb21tZW50cyBhcyBpdHMgY2hpbGRyZW5cclxuICAgIC8vIFRoZSBmaXJzdCBzdGVwIGlzIHRvIHBhcnNlIGFsbCB0aGUgY29tbWVudHMgaW4gdGhlIHJvb3Qgbm9kZVxyXG4gICAgbGV0IGNvbW1lbnRzID0gdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShub2RlLCAnY29tbWVudCcpKTtcclxuICAgIC8vIFBhcnNlIHRoZSBuYW1lc3BhY2VzIGluIGV4cHJlc3Npb25fc3RhdGVtZW50XHJcbiAgICBsZXQgbmFtZXNwYWNlcyA9IHRoaXMudmlzaXRDaGlsZHJlbih0aGlzLmZpbHRlclR5cGUobm9kZSwgJ2V4cHJlc3Npb25fc3RhdGVtZW50JykpO1xyXG4gICAgLy8gUGFyc2UgdGhlIGV4cG9ydCBzdGF0ZW1lbnRzIGluIHRoZSByb290IG5vZGVcclxuICAgIGxldCBleHBvcnRzID0gdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShub2RlLCAnZXhwb3J0X3N0YXRlbWVudCcpKTtcclxuXHJcbiAgICAvLyBHZXQgdGhlIHZpc2l0ZWQgY29udGV4dCBub2Rlc1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21tZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBjb21tZW50ID0gY29tbWVudHNbaV07XHJcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBjb21tZW50O1xyXG4gICAgICB2aXNpdGVkW2dldFN0YXJ0TG9jYXRpb24oY29udGV4dCldID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZW1vdmUgdGhlIHZpc2l0ZWQgbm9kZXMgZnJvbSBuYW1lc3BhY2VzIGFycmF5XHJcbiAgICBfLnJlbW92ZShuYW1lc3BhY2VzLCB4ID0+IHZpc2l0ZWRbZ2V0U3RhcnRMb2NhdGlvbih4KV0pO1xyXG5cclxuICAgIC8vIEV4cG9ydHMgYXJlIG9kZGJhbGxzIHNpbmNlIHNvbWUgZXhwb3J0cyBtYXkgcmVmZXJlbmNlXHJcbiAgICAvLyBhIHR5cGUvbm9kZSB0aGF0IG1heSBoYXZlIGJlZW4gY29tbWVudGVkLlxyXG4gICAgLy8gV2UnbGwgZmlyc3QgbmVlZCB0byBmaWx0ZXIgdGhlIG9uZXMgd2UgaGF2ZSB2aXNpdGVkXHJcbiAgICBfLnJlbW92ZShleHBvcnRzLCB4ID0+IHZpc2l0ZWRbZ2V0U3RhcnRMb2NhdGlvbih4KV0pO1xyXG5cclxuICAgIC8vIEZyb20gdGhlIG9uZXMgd2UgaGF2ZSBub3QgdmlzaXRlZCwgd2UnbGwgbmVlZCB0byBtb2RpZnlcclxuICAgIC8vIHRoZSBub2RlIHByb3BlcnRpZXMgb2YgZWFjaCBjb250ZXh0IGluIGEgY29tbWVudCBub2RlIHRoYXRcclxuICAgIC8vIG1hdGNoZXMgdGhlIG9uZXMgd2UgaGF2ZSBub3QgdmlzaXRlZC5cclxuICAgIGNvbnN0IG1hdGNoZWQgPSB7fTtcclxuICAgIGNvbW1lbnRzID0gXy5jb21wYWN0KFxyXG4gICAgICBjb21tZW50cy5tYXAoY29tbWVudCA9PiB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBvcnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBjb25zdCBleHBvcnRfID0gZXhwb3J0c1tpXTtcclxuICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSBjb21tZW50LmNvbnRleHQ7XHJcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgY29udGV4dCAmJiBqIDwgY29udGV4dC5jaGlsZHJlbi5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICBpZiAoY29udGV4dC5jaGlsZHJlbltpXSAmJiBjb250ZXh0LmNoaWxkcmVuW2ldLnR5cGUgPT09IGV4cG9ydF8udHlwZSkge1xyXG4gICAgICAgICAgICAgIG1hdGNoZWRbZ2V0U3RhcnRMb2NhdGlvbihleHBvcnRfKV0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGNvbW1lbnQuY29udGV4dC5wcm9wZXJ0aWVzID0gT2JqZWN0LmFzc2lnbihcclxuICAgICAgICAgICAgICAgIGNvbW1lbnQuY29udGV4dC5wcm9wZXJ0aWVzIHx8IHt9LFxyXG4gICAgICAgICAgICAgICAgZXhwb3J0Xy5wcm9wZXJ0aWVzXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29tbWVudDtcclxuICAgICAgfSkpO1xyXG5cclxuICAgIC8vIFJlbW92ZWQgdGhlIG1hdGNoZWQgZXhwb3J0c1xyXG4gICAgXy5yZW1vdmUoZXhwb3J0cywgeCA9PiBtYXRjaGVkW2dldFN0YXJ0TG9jYXRpb24oeCldKVxyXG5cclxuICAgIHJldHVybiBbXS5jb25jYXQoY29tbWVudHMpLmNvbmNhdChuYW1lc3BhY2VzKS5jb25jYXQoZXhwb3J0cyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHZpc2l0Q29tbWVudCA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZSA9PiB7XHJcbiAgICBpZiAoaXNKYXZhRG9jQ29tbWVudCh0aGlzLnNvdXJjZSwgbm9kZSkgJiYgIWlzTGVnYWxDb21tZW50KHRoaXMuc291cmNlLCBub2RlKSkge1xyXG4gICAgICBjb25zdCBuZXh0U2libGluZyA9IHNpYmxpbmcobm9kZSk7XHJcbiAgICAgIGlmIChuZXh0U2libGluZykge1xyXG4gICAgICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q29udGV4dChuZXh0U2libGluZywge30pLCB0cnVlKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWaXNpdCB0aGUgY29udGV4dHVhbCBub2RlXHJcbiAgICogXHJcbiAgICogIyBSZW1hcmtcclxuICAgKiBcclxuICAgKiBBIG5vZGUgaXMgY29uc2lkZXJlZCBjb250ZXh0dWFsIHdoZW4gYSBjb21tZW50IGlzIHZpc2l0ZWQgYW5kIHRoZSBub2RlIGlzIGl0cyBzaWJsaW5nLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgdmlzaXRDb250ZXh0ID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPFR5cGVTY3JpcHRQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xyXG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcclxuICAgICAgY2FzZSAnZXhwb3J0X3N0YXRlbWVudCc6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRFeHBvcnRTdGF0ZW1lbnQobm9kZSwgcHJvcGVydGllcyk7XHJcbiAgICAgIGNhc2UgJ2V4cHJlc3Npb25fc3RhdGVtZW50JzpcclxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQobm9kZSwgcHJvcGVydGllcyk7XHJcbiAgICAgIGNhc2UgJ2NsYXNzJzpcclxuICAgICAgY2FzZSAnaW50ZXJmYWNlX2RlY2xhcmF0aW9uJzpcclxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdENsYXNzT3JJbnRlcmZhY2Uobm9kZSwgcHJvcGVydGllcylcclxuICAgICAgY2FzZSAnZnVuY3Rpb24nOlxyXG4gICAgICBjYXNlICdjYWxsX3NpZ25hdHVyZSc6XHJcbiAgICAgIGNhc2UgJ21ldGhvZF9zaWduYXR1cmUnOlxyXG4gICAgICBjYXNlICdwcm9wZXJ0eV9zaWduYXR1cmUnOlxyXG4gICAgICBjYXNlICdwdWJsaWNfZmllbGRfZGVmaW5pdGlvbic6XHJcbiAgICAgIGNhc2UgJ21ldGhvZF9kZWZpbml0aW9uJzpcclxuICAgICAgY2FzZSAnbGV4aWNhbF9kZWNsYXJhdGlvbic6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXROb25UZXJtaW5hbChub2RlLCBwcm9wZXJ0aWVzKTtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyogU3RhdGVtZW50cyAqL1xyXG5cclxuICBwcml2YXRlIHZpc2l0RXhwb3J0U3RhdGVtZW50ID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPFR5cGVTY3JpcHRQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xyXG4gICAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiwgZGVmYXVsdEV4cG9ydCA9IGZhbHNlO1xyXG4gICAgLy8gUmVtb3ZlICdleHBvcnQnIHNpbmNlIGl0J3MgYWx3YXlzIGZpcnN0IGluIHRoZSBhcnJheVxyXG4gICAgY2hpbGRyZW4uc2hpZnQoKTtcclxuICAgIGlmICh0aGlzLmhhc0RlZmF1bHRFeHBvcnQobm9kZSkpIHtcclxuICAgICAgZGVmYXVsdEV4cG9ydCA9IHRydWU7XHJcbiAgICAgIC8vIFJlbW92ZSAnZGVmYXVsdCcgZXhwb3J0XHJcbiAgICAgIGNoaWxkcmVuLnNoaWZ0KCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuLnNoaWZ0KCk7XHJcbiAgICByZXR1cm4gdGhpcy52aXNpdE5vZGUoY2hpbGQsIHsgZXhwb3J0czogeyBleHBvcnQ6IHRydWUsIGRlZmF1bHQ6IGRlZmF1bHRFeHBvcnQgfSB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50ID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM6IFBhcnRpYWw8VHlwZVNjcmlwdFByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XHJcbiAgICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xyXG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbi5zaGlmdCgpO1xyXG5cclxuICAgIGlmIChtYXRjaChjaGlsZCwgJ2ludGVybmFsX21vZHVsZScpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnZpc2l0SW50ZXJuYWxNb2R1bGUoY2hpbGQsIHByb3BlcnRpZXMpXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG1hdGNoKGNoaWxkLCAnZnVuY3Rpb24nKSkge1xyXG4gICAgICBpZiAocHJvcGVydGllcykgcmV0dXJuIHRoaXMudmlzaXRDb250ZXh0KGNoaWxkLCBwcm9wZXJ0aWVzKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy52aXNpdE5vblRlcm1pbmFsKGNoaWxkKVxyXG4gIH1cclxuXHJcbiAgLyogTW9kdWxlcyAqL1xyXG5cclxuICBwcml2YXRlIHZpc2l0SW50ZXJuYWxNb2R1bGUgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8VHlwZVNjcmlwdFByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XHJcbiAgICBsZXQgY2hpbGRyZW46IEFTVE5vZGVbXSA9IG5vZGUuY2hpbGRyZW4ubWFwKGNoaWxkID0+IHtcclxuICAgICAgaWYgKG1hdGNoKGNoaWxkLCAnc3RhdGVtZW50X2Jsb2NrJykpIHtcclxuICAgICAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShjaGlsZCwgJ2NvbW1lbnQnKSkpXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMudmlzaXROb2RlKGNoaWxkKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIGNoaWxkcmVuLCBPYmplY3QuYXNzaWduKHByb3BlcnRpZXMgfHwge30sIHsgbmFtZXNwYWNlOiB0cnVlIH0pKTtcclxuICB9XHJcblxyXG5cclxuICAvKiBEZWNsYXJhdGlvbnMgKi9cclxuXHJcbiAgcHJpdmF0ZSB2aXNpdENsYXNzT3JJbnRlcmZhY2UgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8VHlwZVNjcmlwdFByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XHJcbiAgICAvLyBTaW5jZSAnaW50ZXJmYWNlJyBvciAnY2xhc3MnIGlzIGFsd2F5cyBmaXJzdCBpbiB0aGUgYXJyYXlcclxuICAgIC8vIHdlJ2xsIG5lZWQgdG8gcmVtb3ZlIGl0IGZyb20gdGhlIGFycmF5LlxyXG4gICAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcclxuICAgIGNvbnN0IGludGVyZmFjZV8gPSBjaGlsZHJlbi5zaGlmdCgpO1xyXG4gICAgbGV0IGV4dGVuZHNfID0gZmFsc2UsIGltcGxlbWVudHNfID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5oYXNJbmhlcml0YW5jZShub2RlKSkge1xyXG4gICAgICBjb25zdCBpbmhlcml0YW5jZSA9IHRoaXMuZ2V0SW5oZXJpdGFuY2VUeXBlKG5vZGUpXHJcbiAgICAgIGV4dGVuZHNfID0gaW5oZXJpdGFuY2UgPT09ICdleHRlbmRzJztcclxuICAgICAgaW1wbGVtZW50c18gPSBpbmhlcml0YW5jZSA9PT0gJ2ltcGxlbWVudHMnO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG5vZGVfID0gY3JlYXRlQVNUTm9kZShcclxuICAgICAgdGhpcy5zb3VyY2UsXHJcbiAgICAgIG5vZGUsXHJcbiAgICAgIHRoaXMudmlzaXRDaGlsZHJlbihjaGlsZHJlbiksXHJcbiAgICAgIE9iamVjdC5hc3NpZ24ocHJvcGVydGllcyB8fCB7fSwge1xyXG4gICAgICAgIGluaGVyaXRhbmNlOiB7XHJcbiAgICAgICAgICBpbXBsZW1lbnRzOiBpbXBsZW1lbnRzXyxcclxuICAgICAgICAgIGV4dGVuZHM6IGV4dGVuZHNfXHJcbiAgICAgICAgfSBhcyBUeXBlU2NyaXB0SW5oZXJpdGFuY2VcclxuICAgICAgfSkpO1xyXG5cclxuICAgIGlmIChtYXRjaChub2RlLCAnY2xhc3MnKSkge1xyXG4gICAgICByZXR1cm4gbm9kZV87XHJcbiAgICB9XHJcbiAgICAvLyBPdmVyd3JpdGUgdGhlIG5vZGUgdHlwZSBmcm9tICdpbnRlcmZhY2VfZGVjbGFyYXRpb24nIHRvICdpbnRlcmZhY2UnXHJcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihub2RlXywgeyB0eXBlOiBpbnRlcmZhY2VfLnR5cGUgfSlcclxuICB9XHJcblxyXG4gIC8qIE5vbi10ZXJtaW5hbHMgKi9cclxuXHJcbiAgcHJpdmF0ZSB2aXNpdE5vblRlcm1pbmFsID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPFR5cGVTY3JpcHRQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xyXG4gICAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcclxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2VzIHdoZXJlIHNvbWUgbm9uLXRlcm1pbmFsc1xyXG4gICAgLy8gY29udGFpbiBjb21tZW50cyB3aGljaCBpcyB3aGF0IHdlIGNhcmUgYWJvdXRcclxuICAgIGlmIChtYXRjaChub2RlLCAnY2xhc3NfYm9keScsICdvYmplY3RfdHlwZScpKSB7XHJcbiAgICAgIGNoaWxkcmVuID0gdGhpcy5maWx0ZXJUeXBlKG5vZGUsICdjb21tZW50Jyk7XHJcbiAgICB9XHJcbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBleHBvcnQgc3RhdGVtZW50cyBoYXZlIG5vZGUgcHJvcGVydGllc1xyXG4gICAgaWYgKG1hdGNoKG5vZGUsICdleHBvcnRfc3RhdGVtZW50JykpIHtcclxuICAgICAgcmV0dXJuIHRoaXMudmlzaXRFeHBvcnRTdGF0ZW1lbnQobm9kZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZXMgd2hlcmUgYW4gaW50ZXJuYWwgbW9kdWxlIGNvbnRhaW5zIG90aGVyIG5vZGVzXHJcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2ludGVybmFsX21vZHVsZScpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnZpc2l0SW50ZXJuYWxNb2R1bGUobm9kZSwgcHJvcGVydGllcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZXMgd2hlcmUgYW4gaW50ZXJtYWxfbW9kdWxlIGNhbiBleGlzdCBpbiBhbiBleHByZXNzaW9uX3N0YXRlbWVudFxyXG4gICAgaWYgKG1hdGNoKG5vZGUsICdleHByZXNzaW9uX3N0YXRlbWVudCcpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChub2RlLCBwcm9wZXJ0aWVzKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2Z1bmN0aW9uJykpIHtcclxuICAgICAgXy5yZW1vdmUoY2hpbGRyZW4sIGNoaWxkID0+IG1hdGNoKGNoaWxkLCAnc3RhdGVtZW50X2Jsb2NrJykpXHJcbiAgICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q2hpbGRyZW4oY2hpbGRyZW4pLCBwcm9wZXJ0aWVzKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENoaWxkcmVuKGNoaWxkcmVuKSwgcHJvcGVydGllcyk7XHJcbiAgfVxyXG5cclxuICAvKiBUZXJtaW5hbHMgKi9cclxuXHJcbiAgcHJpdmF0ZSB2aXNpdFRlcm1pbmFsID0gKG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlID0+IHtcclxuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlKVxyXG4gIH1cclxufSJdfQ== \ No newline at end of file diff --git a/build/src/utils/benchmark.js b/build/src/utils/benchmark.js index a6e49e6..61900e9 100644 --- a/build/src/utils/benchmark.js +++ b/build/src/utils/benchmark.js @@ -7,4 +7,4 @@ function benchmark(label, f, ...args) { return result; } exports.default = benchmark; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVuY2htYXJrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2JlbmNobWFyay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLFNBQXdCLFNBQVMsQ0FDL0IsS0FBYSxFQUNiLENBQWUsRUFDZixHQUFHLElBQVU7SUFFYixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ25CLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ25DLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQVRELDRCQVNDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYmVuY2htYXJrPFQsIFQyPihcbiAgbGFiZWw6IHN0cmluZyxcbiAgZjogKHg6IFQyKSA9PiBULFxuICAuLi5hcmdzOiBUMltdXG4pOiBUIHtcbiAgY29uc29sZS50aW1lKGxhYmVsKVxuICBjb25zdCByZXN1bHQgPSBmLmFwcGx5KG51bGwsIGFyZ3MpO1xuICBjb25zb2xlLnRpbWVFbmQobGFiZWwpO1xuICByZXR1cm4gcmVzdWx0O1xufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVuY2htYXJrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2JlbmNobWFyay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLFNBQXdCLFNBQVMsQ0FDL0IsS0FBYSxFQUNiLENBQWUsRUFDZixHQUFHLElBQVU7SUFFYixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ25CLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ25DLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQVRELDRCQVNDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYmVuY2htYXJrPFQsIFQyPihcclxuICBsYWJlbDogc3RyaW5nLFxyXG4gIGY6ICh4OiBUMikgPT4gVCxcclxuICAuLi5hcmdzOiBUMltdXHJcbik6IFQge1xyXG4gIGNvbnNvbGUudGltZShsYWJlbClcclxuICBjb25zdCByZXN1bHQgPSBmLmFwcGx5KG51bGwsIGFyZ3MpO1xyXG4gIGNvbnNvbGUudGltZUVuZChsYWJlbCk7XHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufSJdfQ== \ No newline at end of file diff --git a/build/src/utils/comment.js b/build/src/utils/comment.js index dd61fb4..d67c1c8 100644 --- a/build/src/utils/comment.js +++ b/build/src/utils/comment.js @@ -39,4 +39,4 @@ function isXDocCommentFragment(source, node) { return !isXDocCommentBlock(source, node) && isXDocComment(source, node); } exports.isXDocCommentFragment = isXDocCommentFragment; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9jb21tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsbUNBQTRCO0FBR2YsUUFBQSxTQUFTLEdBQUcsOEVBQThFLENBQUM7QUFFeEcsU0FBZ0IsY0FBYyxDQUFFLE1BQWMsRUFBRSxJQUFnQjtJQUM5RCxNQUFNLGFBQWEsR0FBRztRQUNwQixXQUFXO1FBQ1gsc0JBQXNCO1FBQ3RCLFNBQVM7UUFDVCxxQkFBcUI7S0FDdEIsQ0FBQztJQUNGLElBQUksZUFBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRTtRQUMxQixPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDOUIsTUFBTSxDQUFDLElBQUk7YUFDUixTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQ3pDLFdBQVcsRUFBRTthQUNiLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FDbEIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDbEI7QUFDSCxDQUFDO0FBZkQsd0NBZUM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDL0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEUsbUJBQW1CO0lBQ25CLE9BQU8saUNBQWlDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQ3hELENBQUM7QUFKRCw0Q0FJQztBQUVELFNBQWdCLGFBQWEsQ0FBQyxNQUFhLEVBQUUsSUFBaUI7SUFDNUQsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQ3JCLElBQUksSUFBSTtRQUFFLE9BQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JFLE9BQU8saUJBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUpELHNDQUlDO0FBRUQsU0FBZ0Isa0JBQWtCLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQ2pFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDM0QsQ0FBQztBQUhELGdEQUdDO0FBRUQsU0FBZ0IscUJBQXFCLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQ3BFLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRkQsc0RBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgbWF0Y2ggZnJvbSBcIi4vbWF0Y2hcIjtcbmltcG9ydCBTb3VyY2UgZnJvbSBcIi4uL2ludGVyZmFjZXMvU291cmNlXCI7XG5cbmV4cG9ydCBjb25zdCBYRG9jUmVnZXggPSAvQChcXHcrKShbXntbKFxcbl0qKT8oW1xce1xcW1xcKF1bXFxzXFxTXSpbXFx9XFxdXFwpXShbXFxzXSooPXwtKT4uKik/KT8oW1xcc10qLSguKSopPy9nbWk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xlZ2FsQ29tbWVudCAoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgY29uc3QgcG9zc2libGVUZXh0cyA9IFtcbiAgICAnY29weXJpZ2h0JyxcbiAgICAndGVybXMgYW5kIGNvbmRpdGlvbnMnLFxuICAgICdsaWNlbnNlJyxcbiAgICAnYWxsIHJpZ2h0cyByZXNlcnZlZCdcbiAgXTtcbiAgaWYgKG1hdGNoKG5vZGUsICdjb21tZW50JykpIHtcbiAgICByZXR1cm4gcG9zc2libGVUZXh0cy5tYXAodGV4dCA9PlxuICAgICAgc291cmNlLnRleHRcbiAgICAgICAgLnN1YnN0cmluZyhub2RlLnN0YXJ0SW5kZXgsIG5vZGUuZW5kSW5kZXgpXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgIC5pbmNsdWRlcyh0ZXh0KVxuICAgICkuaW5jbHVkZXModHJ1ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSmF2YURvY0NvbW1lbnQoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgY29uc3QgY29tbWVudCA9IHNvdXJjZS50ZXh0LnN1YnN0cmluZyhub2RlLnN0YXJ0SW5kZXgsIG5vZGUuZW5kSW5kZXgpO1xuICAvLyByZWdleHIuY29tLzNlanZiXG4gIHJldHVybiAvKFxcL1xcKlxcKikoKFxccyopKC4qPykoXFxzKSkqKFxcKlxcLykvLnRlc3QoY29tbWVudClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzWERvY0NvbW1lbnQoc291cmNlOnN0cmluZywgbm9kZT86IFN5bnRheE5vZGUpIHtcbiAgbGV0IGNvbW1lbnQgPSBzb3VyY2U7XG4gIGlmIChub2RlKSBjb21tZW50ID0gc291cmNlLnN1YnN0cmluZyhub2RlLnN0YXJ0SW5kZXgsIG5vZGUuZW5kSW5kZXgpO1xuICByZXR1cm4gWERvY1JlZ2V4LnRlc3QoY29tbWVudCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1hEb2NDb21tZW50QmxvY2soc291cmNlOiBzdHJpbmcsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgY29uc3QgY29tbWVudCA9IHNvdXJjZS5zdWJzdHJpbmcobm9kZS5zdGFydEluZGV4LCBub2RlLmVuZEluZGV4KTtcbiAgcmV0dXJuIC8jQVBJLy50ZXN0KGNvbW1lbnQpIHx8IC9cXGBcXGBcXGB4ZG9jLy50ZXN0KGNvbW1lbnQpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1hEb2NDb21tZW50RnJhZ21lbnQoc291cmNlOiBzdHJpbmcsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgcmV0dXJuICFpc1hEb2NDb21tZW50QmxvY2soc291cmNlLCBub2RlKSAmJiBpc1hEb2NDb21tZW50KHNvdXJjZSwgbm9kZSk7XG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9jb21tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsbUNBQTRCO0FBR2YsUUFBQSxTQUFTLEdBQUcsOEVBQThFLENBQUM7QUFFeEcsU0FBZ0IsY0FBYyxDQUFFLE1BQWMsRUFBRSxJQUFnQjtJQUM5RCxNQUFNLGFBQWEsR0FBRztRQUNwQixXQUFXO1FBQ1gsc0JBQXNCO1FBQ3RCLFNBQVM7UUFDVCxxQkFBcUI7S0FDdEIsQ0FBQztJQUNGLElBQUksZUFBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRTtRQUMxQixPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDOUIsTUFBTSxDQUFDLElBQUk7YUFDUixTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQ3pDLFdBQVcsRUFBRTthQUNiLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FDbEIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDbEI7QUFDSCxDQUFDO0FBZkQsd0NBZUM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDL0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEUsbUJBQW1CO0lBQ25CLE9BQU8saUNBQWlDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQ3hELENBQUM7QUFKRCw0Q0FJQztBQUVELFNBQWdCLGFBQWEsQ0FBQyxNQUFhLEVBQUUsSUFBaUI7SUFDNUQsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQ3JCLElBQUksSUFBSTtRQUFFLE9BQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JFLE9BQU8saUJBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUpELHNDQUlDO0FBRUQsU0FBZ0Isa0JBQWtCLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQ2pFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDM0QsQ0FBQztBQUhELGdEQUdDO0FBRUQsU0FBZ0IscUJBQXFCLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQ3BFLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRkQsc0RBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XHJcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi9tYXRjaFwiO1xyXG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xyXG5cclxuZXhwb3J0IGNvbnN0IFhEb2NSZWdleCA9IC9AKFxcdyspKFtee1soXFxuXSopPyhbXFx7XFxbXFwoXVtcXHNcXFNdKltcXH1cXF1cXCldKFtcXHNdKig9fC0pPi4qKT8pPyhbXFxzXSotKC4pKik/L2dtaTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0xlZ2FsQ29tbWVudCAoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICBjb25zdCBwb3NzaWJsZVRleHRzID0gW1xyXG4gICAgJ2NvcHlyaWdodCcsXHJcbiAgICAndGVybXMgYW5kIGNvbmRpdGlvbnMnLFxyXG4gICAgJ2xpY2Vuc2UnLFxyXG4gICAgJ2FsbCByaWdodHMgcmVzZXJ2ZWQnXHJcbiAgXTtcclxuICBpZiAobWF0Y2gobm9kZSwgJ2NvbW1lbnQnKSkge1xyXG4gICAgcmV0dXJuIHBvc3NpYmxlVGV4dHMubWFwKHRleHQgPT5cclxuICAgICAgc291cmNlLnRleHRcclxuICAgICAgICAuc3Vic3RyaW5nKG5vZGUuc3RhcnRJbmRleCwgbm9kZS5lbmRJbmRleClcclxuICAgICAgICAudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgIC5pbmNsdWRlcyh0ZXh0KVxyXG4gICAgKS5pbmNsdWRlcyh0cnVlKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0phdmFEb2NDb21tZW50KHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlKSB7XHJcbiAgY29uc3QgY29tbWVudCA9IHNvdXJjZS50ZXh0LnN1YnN0cmluZyhub2RlLnN0YXJ0SW5kZXgsIG5vZGUuZW5kSW5kZXgpO1xyXG4gIC8vIHJlZ2V4ci5jb20vM2VqdmJcclxuICByZXR1cm4gLyhcXC9cXCpcXCopKChcXHMqKSguKj8pKFxccykpKihcXCpcXC8pLy50ZXN0KGNvbW1lbnQpXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1hEb2NDb21tZW50KHNvdXJjZTpzdHJpbmcsIG5vZGU/OiBTeW50YXhOb2RlKSB7XHJcbiAgbGV0IGNvbW1lbnQgPSBzb3VyY2U7XHJcbiAgaWYgKG5vZGUpIGNvbW1lbnQgPSBzb3VyY2Uuc3Vic3RyaW5nKG5vZGUuc3RhcnRJbmRleCwgbm9kZS5lbmRJbmRleCk7XHJcbiAgcmV0dXJuIFhEb2NSZWdleC50ZXN0KGNvbW1lbnQpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNYRG9jQ29tbWVudEJsb2NrKHNvdXJjZTogc3RyaW5nLCBub2RlOiBTeW50YXhOb2RlKSB7XHJcbiAgY29uc3QgY29tbWVudCA9IHNvdXJjZS5zdWJzdHJpbmcobm9kZS5zdGFydEluZGV4LCBub2RlLmVuZEluZGV4KTtcclxuICByZXR1cm4gLyNBUEkvLnRlc3QoY29tbWVudCkgfHwgL1xcYFxcYFxcYHhkb2MvLnRlc3QoY29tbWVudClcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzWERvY0NvbW1lbnRGcmFnbWVudChzb3VyY2U6IHN0cmluZywgbm9kZTogU3ludGF4Tm9kZSkge1xyXG4gIHJldHVybiAhaXNYRG9jQ29tbWVudEJsb2NrKHNvdXJjZSwgbm9kZSkgJiYgaXNYRG9jQ29tbWVudChzb3VyY2UsIG5vZGUpO1xyXG59Il19 \ No newline at end of file diff --git a/build/src/utils/log.js b/build/src/utils/log.js index 75c3cfb..47f9527 100644 --- a/build/src/utils/log.js +++ b/build/src/utils/log.js @@ -29,4 +29,4 @@ class ParserLog extends mr_doc_utils_1.Log { } const log = new ParserLog('mr-doc::parser'); exports.default = log; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtDQUFtQztBQUduQyxtQ0FBNEI7QUFFNUIsSUFBWSxTQUdYO0FBSEQsV0FBWSxTQUFTO0lBQ2pCLCtFQUF1QixDQUFBO0lBQ3ZCLHlFQUFvQixDQUFBO0FBQ3hCLENBQUMsRUFIVyxTQUFTLEdBQVQsaUJBQVMsS0FBVCxpQkFBUyxRQUdwQjtBQUVELE1BQU0sU0FBVSxTQUFRLGtCQUFHO0lBQTNCOztRQUNJLFdBQU0sR0FBRyxDQUFDLE1BQWMsRUFBRSxJQUFnQixFQUFFLEtBQWdCLEVBQVEsRUFBRTtZQUNsRSxNQUFNLFFBQVEsR0FBRyxlQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ3RDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQ3pELE1BQU0sWUFBWSxHQUFHLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNySCxNQUFNLE9BQU8sR0FBRyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksWUFBWSxFQUFFLFFBQVEsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDO1lBQ25GLFFBQVEsS0FBSyxFQUFFO2dCQUNYLEtBQUssU0FBUyxDQUFDLHVCQUF1QjtvQkFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsNEJBQTRCLE9BQU8sRUFBRSxDQUFDLENBQUE7b0JBQ2xGLE1BQU07Z0JBQ1YsS0FBSyxTQUFTLENBQUMsb0JBQW9CO29CQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLHFEQUFxRCxPQUFPLEVBQUUsQ0FBQyxDQUFBO2dCQUM5RTtvQkFDSSxNQUFNO2FBQ2I7UUFDTCxDQUFDLENBQUE7SUFDTCxDQUFDO0NBQUE7QUFHRCxNQUFNLEdBQUcsR0FBRyxJQUFJLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRTVDLGtCQUFlLEdBQUcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvZyB9IGZyb20gJ21yLWRvYy11dGlscyc7XG5pbXBvcnQgU291cmNlIGZyb20gJy4uL2ludGVyZmFjZXMvU291cmNlJztcbmltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tICd0cmVlLXNpdHRlcic7XG5pbXBvcnQgcmFuZ2UgZnJvbSAnLi9yYW5nZSc7XG5cbmV4cG9ydCBlbnVtIEVycm9yVHlwZSB7XG4gICAgTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQsXG4gICAgVHJlZVNpdHRlclBhcnNlRXJyb3Jcbn1cblxuY2xhc3MgUGFyc2VyTG9nIGV4dGVuZHMgTG9nIHtcbiAgICByZXBvcnQgPSAoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUsIGVycm9yOiBFcnJvclR5cGUpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSByYW5nZShub2RlKS5sb2NhdGlvbjtcbiAgICAgICAgY29uc3Qgc2FtZUxpbmUgPSBsb2NhdGlvbi5yb3cuc3RhcnQgPT09IGxvY2F0aW9uLnJvdy5lbmQ7XG4gICAgICAgIGNvbnN0IGdldExpbmVSYW5nZSA9ICgpID0+IHNhbWVMaW5lID8gbG9jYXRpb24ucm93LnN0YXJ0ICsgMSA6IGxvY2F0aW9uLnJvdy5zdGFydCArIDEgKyAnIC0gJyArIGxvY2F0aW9uLnJvdy5lbmQgKyAxO1xuICAgICAgICBjb25zdCBjdWxwcml0ID0gYExpbmUke3NhbWVMaW5lID8gJycgOiAncyd9ICR7Z2V0TGluZVJhbmdlKCl9IGluICcke3NvdXJjZS5wYXRofSdgO1xuICAgICAgICBzd2l0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXNlIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFlldFN1cHBvcnRlZDpcbiAgICAgICAgICAgICAgICB0aGlzLmluZm8oYCcke25vZGUudHlwZS5yZXBsYWNlKC9bX10vZywgJyAnKX0nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkOlxcbiR7Y3VscHJpdH1gKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBFcnJvclR5cGUuVHJlZVNpdHRlclBhcnNlRXJyb3I6XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvcihgJ3RyZWUtc2l0dGVyJyB3YXMgbm90IGFibGUgdG8gcGFyc2UgdGhlIHByb2dyYW06XFxuJHtjdWxwcml0fWApXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cbmNvbnN0IGxvZyA9IG5ldyBQYXJzZXJMb2coJ21yLWRvYzo6cGFyc2VyJyk7XG5cbmV4cG9ydCBkZWZhdWx0IGxvZzsiXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtDQUFtQztBQUduQyxtQ0FBNEI7QUFFNUIsSUFBWSxTQUdYO0FBSEQsV0FBWSxTQUFTO0lBQ2pCLCtFQUF1QixDQUFBO0lBQ3ZCLHlFQUFvQixDQUFBO0FBQ3hCLENBQUMsRUFIVyxTQUFTLEdBQVQsaUJBQVMsS0FBVCxpQkFBUyxRQUdwQjtBQUVELE1BQU0sU0FBVSxTQUFRLGtCQUFHO0lBQTNCOztRQUNJLFdBQU0sR0FBRyxDQUFDLE1BQWMsRUFBRSxJQUFnQixFQUFFLEtBQWdCLEVBQVEsRUFBRTtZQUNsRSxNQUFNLFFBQVEsR0FBRyxlQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ3RDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQ3pELE1BQU0sWUFBWSxHQUFHLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNySCxNQUFNLE9BQU8sR0FBRyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksWUFBWSxFQUFFLFFBQVEsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDO1lBQ25GLFFBQVEsS0FBSyxFQUFFO2dCQUNYLEtBQUssU0FBUyxDQUFDLHVCQUF1QjtvQkFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsNEJBQTRCLE9BQU8sRUFBRSxDQUFDLENBQUE7b0JBQ2xGLE1BQU07Z0JBQ1YsS0FBSyxTQUFTLENBQUMsb0JBQW9CO29CQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLHFEQUFxRCxPQUFPLEVBQUUsQ0FBQyxDQUFBO2dCQUM5RTtvQkFDSSxNQUFNO2FBQ2I7UUFDTCxDQUFDLENBQUE7SUFDTCxDQUFDO0NBQUE7QUFHRCxNQUFNLEdBQUcsR0FBRyxJQUFJLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRTVDLGtCQUFlLEdBQUcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvZyB9IGZyb20gJ21yLWRvYy11dGlscyc7XHJcbmltcG9ydCBTb3VyY2UgZnJvbSAnLi4vaW50ZXJmYWNlcy9Tb3VyY2UnO1xyXG5pbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSAndHJlZS1zaXR0ZXInO1xyXG5pbXBvcnQgcmFuZ2UgZnJvbSAnLi9yYW5nZSc7XHJcblxyXG5leHBvcnQgZW51bSBFcnJvclR5cGUge1xyXG4gICAgTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQsXHJcbiAgICBUcmVlU2l0dGVyUGFyc2VFcnJvclxyXG59XHJcblxyXG5jbGFzcyBQYXJzZXJMb2cgZXh0ZW5kcyBMb2cge1xyXG4gICAgcmVwb3J0ID0gKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlLCBlcnJvcjogRXJyb3JUeXBlKTogdm9pZCA9PiB7XHJcbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSByYW5nZShub2RlKS5sb2NhdGlvbjtcclxuICAgICAgICBjb25zdCBzYW1lTGluZSA9IGxvY2F0aW9uLnJvdy5zdGFydCA9PT0gbG9jYXRpb24ucm93LmVuZDtcclxuICAgICAgICBjb25zdCBnZXRMaW5lUmFuZ2UgPSAoKSA9PiBzYW1lTGluZSA/IGxvY2F0aW9uLnJvdy5zdGFydCArIDEgOiBsb2NhdGlvbi5yb3cuc3RhcnQgKyAxICsgJyAtICcgKyBsb2NhdGlvbi5yb3cuZW5kICsgMTtcclxuICAgICAgICBjb25zdCBjdWxwcml0ID0gYExpbmUke3NhbWVMaW5lID8gJycgOiAncyd9ICR7Z2V0TGluZVJhbmdlKCl9IGluICcke3NvdXJjZS5wYXRofSdgO1xyXG4gICAgICAgIHN3aXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY2FzZSBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQ6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluZm8oYCcke25vZGUudHlwZS5yZXBsYWNlKC9bX10vZywgJyAnKX0nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkOlxcbiR7Y3VscHJpdH1gKVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgRXJyb3JUeXBlLlRyZWVTaXR0ZXJQYXJzZUVycm9yOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvcihgJ3RyZWUtc2l0dGVyJyB3YXMgbm90IGFibGUgdG8gcGFyc2UgdGhlIHByb2dyYW06XFxuJHtjdWxwcml0fWApXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5jb25zdCBsb2cgPSBuZXcgUGFyc2VyTG9nKCdtci1kb2M6OnBhcnNlcicpO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbG9nOyJdfQ== \ No newline at end of file diff --git a/build/src/utils/match.js b/build/src/utils/match.js index 74e0c8d..58a09da 100644 --- a/build/src/utils/match.js +++ b/build/src/utils/match.js @@ -18,4 +18,4 @@ function match(node, ...types) { return false; } exports.default = match; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvbWF0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQTs7Ozs7OztHQU9HO0FBQ0gsU0FBd0IsS0FBSyxDQUFDLElBQWdCLEVBQUUsR0FBRyxLQUFlO0lBQ2hFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3JDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQ3RCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7S0FDRjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQVJELHdCQVFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIG5vZGUgaXMgYSBjZXJ0YWluIHR5cGUuXG4gKiBgYGBcbiAqIEBwYXJhbSBub2RlOiBTeW50YXhOb2RlIC0gVGhlIG5vZGUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB0eXBlOiBzdHJpbmcgIC0gVGhlIG5vZGUgdHlwZSB0byBtYXRjaC5cbiAqIEByZXR1cm46IGJvb2xlYW5cbiAqIGBgYFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYXRjaChub2RlOiBTeW50YXhOb2RlLCAuLi50eXBlczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlc1tpXTtcbiAgICBpZiAobm9kZS50eXBlID09PSB0eXBlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvbWF0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQTs7Ozs7OztHQU9HO0FBQ0gsU0FBd0IsS0FBSyxDQUFDLElBQWdCLEVBQUUsR0FBRyxLQUFlO0lBQ2hFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3JDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQ3RCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7S0FDRjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQVJELHdCQVFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5cclxuLyoqXHJcbiAqIERldGVybWluZXMgd2hldGhlciBhIG5vZGUgaXMgYSBjZXJ0YWluIHR5cGUuXHJcbiAqIGBgYFxyXG4gKiBAcGFyYW0gbm9kZTogU3ludGF4Tm9kZSAtIFRoZSBub2RlIHRvIGNvbXBhcmUuXHJcbiAqIEBwYXJhbSB0eXBlOiBzdHJpbmcgIC0gVGhlIG5vZGUgdHlwZSB0byBtYXRjaC5cclxuICogQHJldHVybjogYm9vbGVhblxyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1hdGNoKG5vZGU6IFN5bnRheE5vZGUsIC4uLnR5cGVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHtcclxuICAgIGNvbnN0IHR5cGUgPSB0eXBlc1tpXTtcclxuICAgIGlmIChub2RlLnR5cGUgPT09IHR5cGUpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBmYWxzZTtcclxufSJdfQ== \ No newline at end of file diff --git a/build/src/utils/range.js b/build/src/utils/range.js index e8ee5d6..4adeddb 100644 --- a/build/src/utils/range.js +++ b/build/src/utils/range.js @@ -13,4 +13,4 @@ function range(node) { }; } exports.default = range; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvcmFuZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxTQUF3QixLQUFLLENBQUMsSUFBdUI7SUFDbkQsT0FBTztRQUNMLFFBQVEsRUFBRTtZQUNSLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVTtZQUN0QixHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDbkI7UUFDRCxRQUFRLEVBQUU7WUFDUixHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQ2pFLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7U0FDM0U7S0FDRixDQUFBO0FBQ0gsQ0FBQztBQVhELHdCQVdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcbmltcG9ydCBUZXh0UmFuZ2UgZnJvbSAnLi4vaW50ZXJmYWNlcy9UZXh0UmFuZ2UnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByYW5nZShub2RlOiBQYXJzZXIuU3ludGF4Tm9kZSk6IFRleHRSYW5nZSB7XG4gIHJldHVybiB7XG4gICAgcG9zaXRpb246IHtcbiAgICAgIHN0YXJ0OiBub2RlLnN0YXJ0SW5kZXgsXG4gICAgICBlbmQ6IG5vZGUuZW5kSW5kZXhcbiAgICB9LFxuICAgIGxvY2F0aW9uOiB7XG4gICAgICByb3c6IHsgc3RhcnQ6IG5vZGUuc3RhcnRQb3NpdGlvbi5yb3csIGVuZDogbm9kZS5lbmRQb3NpdGlvbi5yb3cgfSxcbiAgICAgIGNvbHVtbjogeyBzdGFydDogbm9kZS5zdGFydFBvc2l0aW9uLmNvbHVtbiwgZW5kOiBub2RlLmVuZFBvc2l0aW9uLmNvbHVtbiB9XG4gICAgfVxuICB9XG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvcmFuZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxTQUF3QixLQUFLLENBQUMsSUFBdUI7SUFDbkQsT0FBTztRQUNMLFFBQVEsRUFBRTtZQUNSLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVTtZQUN0QixHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDbkI7UUFDRCxRQUFRLEVBQUU7WUFDUixHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQ2pFLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7U0FDM0U7S0FDRixDQUFBO0FBQ0gsQ0FBQztBQVhELHdCQVdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcclxuaW1wb3J0IFRleHRSYW5nZSBmcm9tICcuLi9pbnRlcmZhY2VzL1RleHRSYW5nZSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByYW5nZShub2RlOiBQYXJzZXIuU3ludGF4Tm9kZSk6IFRleHRSYW5nZSB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHBvc2l0aW9uOiB7XHJcbiAgICAgIHN0YXJ0OiBub2RlLnN0YXJ0SW5kZXgsXHJcbiAgICAgIGVuZDogbm9kZS5lbmRJbmRleFxyXG4gICAgfSxcclxuICAgIGxvY2F0aW9uOiB7XHJcbiAgICAgIHJvdzogeyBzdGFydDogbm9kZS5zdGFydFBvc2l0aW9uLnJvdywgZW5kOiBub2RlLmVuZFBvc2l0aW9uLnJvdyB9LFxyXG4gICAgICBjb2x1bW46IHsgc3RhcnQ6IG5vZGUuc3RhcnRQb3NpdGlvbi5jb2x1bW4sIGVuZDogbm9kZS5lbmRQb3NpdGlvbi5jb2x1bW4gfVxyXG4gICAgfVxyXG4gIH1cclxufSJdfQ== \ No newline at end of file diff --git a/build/src/utils/sibling.js b/build/src/utils/sibling.js index fe01442..66420fd 100644 --- a/build/src/utils/sibling.js +++ b/build/src/utils/sibling.js @@ -12,4 +12,4 @@ function sibling(node, children, filter) { } } exports.sibling = sibling; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2libGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9zaWJsaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsU0FBZ0IsT0FBTyxDQUNyQixJQUFnQixFQUNoQixRQUF1QixFQUN2QixNQUFzQjtJQUV0QixJQUFJLElBQUksRUFBRTtRQUNSLElBQUksUUFBUSxFQUFFO1lBQ1osTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUM7Z0JBQ3BCLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsT0FBTyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzVCO1FBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0tBQ3pCO0FBQ0gsQ0FBQztBQWRELDBCQWNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuXG5leHBvcnQgZnVuY3Rpb24gc2libGluZyhcbiAgbm9kZTogU3ludGF4Tm9kZSxcbiAgY2hpbGRyZW4/OiBTeW50YXhOb2RlW10sXG4gIGZpbHRlcj86ICgpID0+IGJvb2xlYW5cbikge1xuICBpZiAobm9kZSkge1xuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgY29uc3QgaW5kZXggPSBmaWx0ZXIgP1xuICAgICAgICBjaGlsZHJlbi5maWx0ZXIoZmlsdGVyKS5pbmRleE9mKG5vZGUpIDpcbiAgICAgICAgY2hpbGRyZW4uaW5kZXhPZihub2RlKTtcbiAgICAgIHJldHVybiBjaGlsZHJlbltpbmRleCArIDFdO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZS5uZXh0U2libGluZztcbiAgfVxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2libGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9zaWJsaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsU0FBZ0IsT0FBTyxDQUNyQixJQUFnQixFQUNoQixRQUF1QixFQUN2QixNQUFzQjtJQUV0QixJQUFJLElBQUksRUFBRTtRQUNSLElBQUksUUFBUSxFQUFFO1lBQ1osTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUM7Z0JBQ3BCLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsT0FBTyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzVCO1FBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0tBQ3pCO0FBQ0gsQ0FBQztBQWRELDBCQWNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNpYmxpbmcoXHJcbiAgbm9kZTogU3ludGF4Tm9kZSxcclxuICBjaGlsZHJlbj86IFN5bnRheE5vZGVbXSxcclxuICBmaWx0ZXI/OiAoKSA9PiBib29sZWFuXHJcbikge1xyXG4gIGlmIChub2RlKSB7XHJcbiAgICBpZiAoY2hpbGRyZW4pIHtcclxuICAgICAgY29uc3QgaW5kZXggPSBmaWx0ZXIgP1xyXG4gICAgICAgIGNoaWxkcmVuLmZpbHRlcihmaWx0ZXIpLmluZGV4T2Yobm9kZSkgOlxyXG4gICAgICAgIGNoaWxkcmVuLmluZGV4T2Yobm9kZSk7XHJcbiAgICAgIHJldHVybiBjaGlsZHJlbltpbmRleCArIDFdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7XHJcbiAgfVxyXG59Il19 \ No newline at end of file diff --git a/build/src/utils/text.js b/build/src/utils/text.js index c4b2bc3..2727251 100644 --- a/build/src/utils/text.js +++ b/build/src/utils/text.js @@ -12,4 +12,4 @@ function text(source, node) { return source.text.substring(node.startIndex, node.endIndex); } exports.text = text; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy90ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0E7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLElBQUksQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDbkQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRkQsb0JBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGNvbnRleHQgc3RyaW5nXG4gKiBcbiAqICMgQVBJXG4gKiBcbiAqIEBwYXJhbSBzb3VyY2U6IElGaWxlIC0gVGhlIHNvdXJjZSBmaWxlLlxuICogQHBhcmFtIG5vZGU6IFN5bnRheE5vZGUgLSBUaGUgc3ludGF4IG5vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXh0KHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlKSB7XG4gIHJldHVybiBzb3VyY2UudGV4dC5zdWJzdHJpbmcobm9kZS5zdGFydEluZGV4LCBub2RlLmVuZEluZGV4KTtcbn0iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy90ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0E7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLElBQUksQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDbkQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRkQsb0JBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XHJcbmltcG9ydCBTb3VyY2UgZnJvbSBcIi4uL2ludGVyZmFjZXMvU291cmNlXCI7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgY29udGV4dCBzdHJpbmdcclxuICogXHJcbiAqICMgQVBJXHJcbiAqIFxyXG4gKiBAcGFyYW0gc291cmNlOiBJRmlsZSAtIFRoZSBzb3VyY2UgZmlsZS5cclxuICogQHBhcmFtIG5vZGU6IFN5bnRheE5vZGUgLSBUaGUgc3ludGF4IG5vZGUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdGV4dChzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSkge1xyXG4gIHJldHVybiBzb3VyY2UudGV4dC5zdWJzdHJpbmcobm9kZS5zdGFydEluZGV4LCBub2RlLmVuZEluZGV4KTtcclxufSJdfQ== \ No newline at end of file diff --git a/build/src/utils/walk.js b/build/src/utils/walk.js index d2e0acd..cc60803 100644 --- a/build/src/utils/walk.js +++ b/build/src/utils/walk.js @@ -7,4 +7,4 @@ function walk(node) { return node_; } exports.default = walk; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Fsay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy93YWxrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsOENBQTBDO0FBQzFDLFNBQXdCLElBQUksQ0FBQyxJQUFnQjtJQUMzQyxJQUFJLEtBQUssR0FBRyxJQUFJLFdBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUNuRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFKRCx1QkFJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcbmltcG9ydCB7IE5vZGUgfSBmcm9tICcuLi9sYW5nL2NvbW1vbi9ub2RlJ1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gd2Fsayhub2RlOiBTeW50YXhOb2RlKSB7XG4gIGxldCBub2RlXyA9IG5ldyBOb2RlKG5vZGUpO1xuICBub2RlXy5zeW50YXhOb2RlLmNoaWxkcmVuLm1hcChjaGlsZCA9PiB3YWxrKGNoaWxkKSlcbiAgcmV0dXJuIG5vZGVfO1xufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Fsay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy93YWxrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsOENBQTBDO0FBQzFDLFNBQXdCLElBQUksQ0FBQyxJQUFnQjtJQUMzQyxJQUFJLEtBQUssR0FBRyxJQUFJLFdBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUNuRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFKRCx1QkFJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcclxuaW1wb3J0IHsgTm9kZSB9IGZyb20gJy4uL2xhbmcvY29tbW9uL25vZGUnXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHdhbGsobm9kZTogU3ludGF4Tm9kZSkge1xyXG4gIGxldCBub2RlXyA9IG5ldyBOb2RlKG5vZGUpO1xyXG4gIG5vZGVfLnN5bnRheE5vZGUuY2hpbGRyZW4ubWFwKGNoaWxkID0+IHdhbGsoY2hpbGQpKVxyXG4gIHJldHVybiBub2RlXztcclxufSJdfQ== \ No newline at end of file diff --git a/src/ParserFactory.ts b/src/ParserFactory.ts index cdd7814..78a2668 100644 --- a/src/ParserFactory.ts +++ b/src/ParserFactory.ts @@ -1,7 +1,7 @@ import Source from "./interfaces/Source"; -import Parser from "./lang/common/base.parser"; import JavaScriptParser from "./lang/javascript"; import TypeScriptParser from './lang/typescript'; +import Parser from "./lang/common/parser"; export default class ParserFactory { private file: Source diff --git a/src/interfaces/BaseParser.ts b/src/interfaces/BaseParser.ts deleted file mode 100644 index 655333c..0000000 --- a/src/interfaces/BaseParser.ts +++ /dev/null @@ -1,15 +0,0 @@ -import Source from "./Source"; -import { ASTNode } from "../lang/common/ast"; -import { Tree } from "tree-sitter"; -// import IResult from "./IResult"; - -export default abstract class Parser { - protected source: Source - protected options: any - constructor(source: Source, options: any) { - this.source = source; - this.options = options || {}; - } - abstract parse(): ASTNode[] - abstract get tree(): Tree -} \ No newline at end of file diff --git a/src/lang/javascript/index.ts b/src/lang/javascript/index.ts index 196a3d8..02763eb 100644 --- a/src/lang/javascript/index.ts +++ b/src/lang/javascript/index.ts @@ -11,11 +11,9 @@ import ASTNode from '../../interfaces/ASTNode'; * * # API * - * ``` * @class JavaScriptParser * @implements IParser * @export default - * ``` */ export default class JavaScriptParser extends Parser { private parser: TreeSitter; From 4b631d02c958ec3ee703754769f4dfcb94e18a7c Mon Sep 17 00:00:00 2001 From: Takeshi Date: Fri, 24 Aug 2018 00:18:54 -0600 Subject: [PATCH 21/32] Update: Refactor and finish README --- README.md | 53 +++++++++++++++++++++++++++++------- build/src/ParserFactory.d.ts | 2 +- build/src/ParserFactory.js | 8 +++--- index.ts | 14 +--------- src/ParserFactory.ts | 9 +++--- 5 files changed, 53 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index c645efa..60f407b 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ # Introduction -This is the official parser for Mr. Doc. The parser uses [node-tree-sitter](https://github.com/tree-sitter/node-tree-sitter) to parse many types of programming languages. It also uses [xdoc-parser](https://github.com/iwatakeshi/xdoc-parser) to parse JSDoc-like syntaxes in a comment. Note that `mr-doc-parser` is in alpha. Thus, the algorithms may change over time. At the moment, there are two languages that are supported by `mr-doc-parser`: JavaScript and TypeScript. More languages can be added as long as [tree-sitter](https://github.com/tree-sitter) can parse them. +This is the official parser for Mr. Doc. The parser uses [node-tree-sitter](https://github.com/tree-sitter/node-tree-sitter) to parse different programming languages. It also uses [xdoc-parser](https://github.com/iwatakeshi/xdoc-parser) to parse JSDoc-like syntaxes in a comment. Note that `mr-doc-parser` is in alpha. Thus, the algorithms may change over time. At the moment, there are two languages that are supported by `mr-doc-parser`: JavaScript and TypeScript. More languages can be added as long as [tree-sitter](https://github.com/tree-sitter) can parse them. # Creating a Language Parser @@ -22,7 +22,7 @@ abstract class Parser { ## Implement the Language Visitor -The next step is to walk the tree that parsed by `tree-sitter` and to wrap each node as an `ASTNode` type. +The next step is to walk the tree that parsed by `tree-sitter` and to wrap each node as an `Node` type. Bear in mind that `tree-sitter` keeps its tree as a DOM-like structure. It may seem like an additional step to re-wrap the nodes, but it is a necessary step to make visiting each node a bit easier: @@ -44,19 +44,52 @@ const nodes = walk(tree); ``` -Once the tree is wrapped, we need to extend the visitor +Once the tree is wrapped, we need to implement the abstract `Visitor` visitor: +```ts +abstract class Visitor { + abstract getAST(): ASTNode[] + abstract visitNode(node: SyntaxNode, properties?: object): ASTNode + abstract visitChildren(nodes: SyntaxNode[], properties?: object): ASTNode[] +} +``` + +**Note**: See the [JavaScript visitor](./src/lang/javascript/visitor.ts) for an example. -The output should be in the following format: +## Return the AST + +The last step is to return the AST. To do so, simply use the `createNode` function and return an array of `ASTNode` type: ```typescript -interface IParseResult { - comments: IComment[], +interface ASTNode extends TextRange { + /** + * @property - The type of node. + */ type: string, - file: IFile + /** + * @property - The context string. + */ + text: string, + /** + * @property - The node's children. + */ + children: ASTNode[] | undefined[], + /** + * @property - The context node that a comment node refers to. + */ + context: ASTNode, + /** + * @property - The properties that a ASTNode may possess. + */ + properties?: object + /** + * @property - The parsed XDoc comment. + */ + comment?: { + markdown: RemarkNode, + documentation: Partial + } } -``` - -These interfaces are defined in `parser/interface.ts`. \ No newline at end of file +``` \ No newline at end of file diff --git a/build/src/ParserFactory.d.ts b/build/src/ParserFactory.d.ts index 2b72713..fb0bf8c 100644 --- a/build/src/ParserFactory.d.ts +++ b/build/src/ParserFactory.d.ts @@ -1,7 +1,7 @@ import Source from "./interfaces/Source"; import Parser from "./lang/common/parser"; export default class ParserFactory { - private file; + private source; private options; constructor(file: Source, options?: any); getParser: () => Parser; diff --git a/build/src/ParserFactory.js b/build/src/ParserFactory.js index 8ab1f91..f33be9e 100644 --- a/build/src/ParserFactory.js +++ b/build/src/ParserFactory.js @@ -11,18 +11,18 @@ class ParserFactory { switch (this.options.language.toLowerCase()) { case 'js': case 'javascript': - return new javascript_1.default(this.file, this.options); + return new javascript_1.default(this.source, this.options); case 'ts': case 'typescript': - return new typescript_1.default(this.file, this.options); + return new typescript_1.default(this.source, this.options); default: console.log(`[mr-doc]: No parser for ${this.options.language} exists.`); break; } }; - this.file = file; + this.source = file; Object.assign(this.options, options); } } exports.default = ParserFactory; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFyc2VyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9QYXJzZXJGYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0Esa0RBQWlEO0FBQ2pELGtEQUFpRDtBQUdqRCxNQUFxQixhQUFhO0lBS2hDLFlBQVksSUFBWSxFQUFFLFVBQWUsRUFBRTtRQUhuQyxZQUFPLEdBQUc7WUFDaEIsUUFBUSxFQUFFLFlBQVk7U0FDdkIsQ0FBQTtRQU1ELGNBQVMsR0FBRyxHQUFXLEVBQUU7WUFDdkIsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDM0MsS0FBSyxJQUFJLENBQUM7Z0JBQ1YsS0FBSyxZQUFZO29CQUNmLE9BQU8sSUFBSSxvQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkQsS0FBSyxJQUFJLENBQUM7Z0JBQ1YsS0FBSyxZQUFZO29CQUNmLE9BQU8sSUFBSSxvQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkQ7b0JBQ0EsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLFVBQVUsQ0FBQyxDQUFBO29CQUNyRSxNQUFNO2FBQ1Q7UUFDSCxDQUFDLENBQUE7UUFoQkMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3RDLENBQUM7Q0FnQkY7QUF4QkQsZ0NBd0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xyXG5pbXBvcnQgSmF2YVNjcmlwdFBhcnNlciBmcm9tIFwiLi9sYW5nL2phdmFzY3JpcHRcIjtcclxuaW1wb3J0IFR5cGVTY3JpcHRQYXJzZXIgZnJvbSAnLi9sYW5nL3R5cGVzY3JpcHQnO1xyXG5pbXBvcnQgUGFyc2VyIGZyb20gXCIuL2xhbmcvY29tbW9uL3BhcnNlclwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFyc2VyRmFjdG9yeSB7XHJcbiAgcHJpdmF0ZSBmaWxlOiBTb3VyY2VcclxuICBwcml2YXRlIG9wdGlvbnMgPSB7XHJcbiAgICBsYW5ndWFnZTogJ0phdmFTY3JpcHQnXHJcbiAgfVxyXG4gIGNvbnN0cnVjdG9yKGZpbGU6IFNvdXJjZSwgb3B0aW9uczogYW55ID0ge30pIHtcclxuICAgIHRoaXMuZmlsZSA9IGZpbGU7XHJcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucywgb3B0aW9ucylcclxuICB9XHJcblxyXG4gIGdldFBhcnNlciA9ICgpOiBQYXJzZXIgPT4ge1xyXG4gICAgc3dpdGNoICh0aGlzLm9wdGlvbnMubGFuZ3VhZ2UudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICBjYXNlICdqcyc6XHJcbiAgICAgIGNhc2UgJ2phdmFzY3JpcHQnOlxyXG4gICAgICAgIHJldHVybiBuZXcgSmF2YVNjcmlwdFBhcnNlcih0aGlzLmZpbGUsIHRoaXMub3B0aW9ucyk7XHJcbiAgICAgIGNhc2UgJ3RzJzpcclxuICAgICAgY2FzZSAndHlwZXNjcmlwdCc6XHJcbiAgICAgICAgcmV0dXJuIG5ldyBUeXBlU2NyaXB0UGFyc2VyKHRoaXMuZmlsZSwgdGhpcy5vcHRpb25zKTtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgY29uc29sZS5sb2coYFttci1kb2NdOiBObyBwYXJzZXIgZm9yICR7dGhpcy5vcHRpb25zLmxhbmd1YWdlfSBleGlzdHMuYClcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFyc2VyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9QYXJzZXJGYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0Esa0RBQWlEO0FBQ2pELGtEQUFpRDtBQUdqRCxNQUFxQixhQUFhO0lBS2hDLFlBQVksSUFBWSxFQUFFLFVBQWUsRUFBRTtRQUhuQyxZQUFPLEdBQUc7WUFDaEIsUUFBUSxFQUFFLFlBQVk7U0FDdkIsQ0FBQTtRQU1ELGNBQVMsR0FBRyxHQUFXLEVBQUU7WUFDdkIsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDM0MsS0FBSyxJQUFJLENBQUM7Z0JBQ1YsS0FBSyxZQUFZO29CQUNmLE9BQU8sSUFBSSxvQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDekQsS0FBSyxJQUFJLENBQUM7Z0JBQ1YsS0FBSyxZQUFZO29CQUNmLE9BQU8sSUFBSSxvQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDekQ7b0JBQ0EsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLFVBQVUsQ0FBQyxDQUFBO29CQUNyRSxNQUFNO2FBQ1Q7UUFDSCxDQUFDLENBQUE7UUFoQkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3RDLENBQUM7Q0FlRjtBQXZCRCxnQ0F1QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU291cmNlIGZyb20gXCIuL2ludGVyZmFjZXMvU291cmNlXCI7XHJcbmltcG9ydCBKYXZhU2NyaXB0UGFyc2VyIGZyb20gXCIuL2xhbmcvamF2YXNjcmlwdFwiO1xyXG5pbXBvcnQgVHlwZVNjcmlwdFBhcnNlciBmcm9tICcuL2xhbmcvdHlwZXNjcmlwdCc7XHJcbmltcG9ydCBQYXJzZXIgZnJvbSBcIi4vbGFuZy9jb21tb24vcGFyc2VyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYXJzZXJGYWN0b3J5IHtcclxuICBwcml2YXRlIHNvdXJjZTogU291cmNlXHJcbiAgcHJpdmF0ZSBvcHRpb25zID0ge1xyXG4gICAgbGFuZ3VhZ2U6ICdKYXZhU2NyaXB0J1xyXG4gIH1cclxuICBjb25zdHJ1Y3RvcihmaWxlOiBTb3VyY2UsIG9wdGlvbnM6IGFueSA9IHt9KSB7XHJcbiAgICB0aGlzLnNvdXJjZSA9IGZpbGU7XHJcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucywgb3B0aW9ucylcclxuICB9XHJcblxyXG4gIGdldFBhcnNlciA9ICgpOiBQYXJzZXIgPT4ge1xyXG4gICAgc3dpdGNoICh0aGlzLm9wdGlvbnMubGFuZ3VhZ2UudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICBjYXNlICdqcyc6XHJcbiAgICAgIGNhc2UgJ2phdmFzY3JpcHQnOlxyXG4gICAgICAgIHJldHVybiBuZXcgSmF2YVNjcmlwdFBhcnNlcih0aGlzLnNvdXJjZSwgdGhpcy5vcHRpb25zKTtcclxuICAgICAgY2FzZSAndHMnOlxyXG4gICAgICBjYXNlICd0eXBlc2NyaXB0JzpcclxuICAgICAgICByZXR1cm4gbmV3IFR5cGVTY3JpcHRQYXJzZXIodGhpcy5zb3VyY2UsIHRoaXMub3B0aW9ucyk7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgIGNvbnNvbGUubG9nKGBbbXItZG9jXTogTm8gcGFyc2VyIGZvciAke3RoaXMub3B0aW9ucy5sYW5ndWFnZX0gZXhpc3RzLmApXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG59Il19 \ No newline at end of file diff --git a/index.ts b/index.ts index cba3d21..e6c7ad3 100644 --- a/index.ts +++ b/index.ts @@ -1,7 +1,6 @@ import Source from './src/interfaces/Source'; import ParserFactory from './src/ParserFactory'; import Parser from './src/lang/common/parser'; -import * as FS from 'fs'; import { Tree } from 'tree-sitter'; // import { ASTNode } from './src/lang/common/ast'; /** @@ -23,7 +22,7 @@ import { Tree } from 'tree-sitter'; * * ``` */ -export default class MainParser extends Parser { +export default class DocParser extends Parser { private parser: Parser; constructor(source: Source, options: any) { @@ -37,14 +36,3 @@ export default class MainParser extends Parser { return this.parser.tree; } } - -const path = `${process.cwd()}/corpus/ReactElementValidator.txt`; -const result = new MainParser({ - name: 'index.ts', - path: path, - text: FS.readFileSync(path, 'utf-8') -}, { - language: 'ts' -}).parse(); - -// console.log(result); diff --git a/src/ParserFactory.ts b/src/ParserFactory.ts index 78a2668..dbd08cf 100644 --- a/src/ParserFactory.ts +++ b/src/ParserFactory.ts @@ -4,12 +4,12 @@ import TypeScriptParser from './lang/typescript'; import Parser from "./lang/common/parser"; export default class ParserFactory { - private file: Source + private source: Source private options = { language: 'JavaScript' } constructor(file: Source, options: any = {}) { - this.file = file; + this.source = file; Object.assign(this.options, options) } @@ -17,14 +17,13 @@ export default class ParserFactory { switch (this.options.language.toLowerCase()) { case 'js': case 'javascript': - return new JavaScriptParser(this.file, this.options); + return new JavaScriptParser(this.source, this.options); case 'ts': case 'typescript': - return new TypeScriptParser(this.file, this.options); + return new TypeScriptParser(this.source, this.options); default: console.log(`[mr-doc]: No parser for ${this.options.language} exists.`) break; } } - } \ No newline at end of file From d7b7725e57aec93c30db44e935ab115169efe160 Mon Sep 17 00:00:00 2001 From: Takeshi Date: Fri, 24 Aug 2018 00:20:32 -0600 Subject: [PATCH 22/32] Update: README --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 60f407b..63a9bd9 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,13 @@ [![Build Status](https://travis-ci.org/mr-doc/mr-doc-parser.svg?branch=master)](https://travis-ci.org/mr-doc/mr-doc-parser) -# Introduction +## Introduction This is the official parser for Mr. Doc. The parser uses [node-tree-sitter](https://github.com/tree-sitter/node-tree-sitter) to parse different programming languages. It also uses [xdoc-parser](https://github.com/iwatakeshi/xdoc-parser) to parse JSDoc-like syntaxes in a comment. Note that `mr-doc-parser` is in alpha. Thus, the algorithms may change over time. At the moment, there are two languages that are supported by `mr-doc-parser`: JavaScript and TypeScript. More languages can be added as long as [tree-sitter](https://github.com/tree-sitter) can parse them. -# Creating a Language Parser +## Creating a Language Parser -## Extend the Language Parser +### Extend the Language Parser To create a parser, simply extend an abstract class named `Parser` in `src/lang/common/parser.ts`: @@ -20,7 +20,7 @@ abstract class Parser { } ``` -## Implement the Language Visitor +### Implement the Language Visitor The next step is to walk the tree that parsed by `tree-sitter` and to wrap each node as an `Node` type. Bear in mind that `tree-sitter` keeps its tree as a DOM-like structure. @@ -56,7 +56,7 @@ abstract class Visitor { **Note**: See the [JavaScript visitor](./src/lang/javascript/visitor.ts) for an example. -## Return the AST +### Return the AST The last step is to return the AST. To do so, simply use the `createNode` function and return an array of `ASTNode` type: @@ -92,4 +92,4 @@ interface ASTNode extends TextRange { } } -``` \ No newline at end of file +``` From f44e8fef406c5b91246683dec988c8d0d3effe02 Mon Sep 17 00:00:00 2001 From: Takeshi Date: Fri, 24 Aug 2018 00:21:02 -0600 Subject: [PATCH 23/32] Doc: Change title --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 63a9bd9..a704c76 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Parser +# mr-doc-parser [![Build Status](https://travis-ci.org/mr-doc/mr-doc-parser.svg?branch=master)](https://travis-ci.org/mr-doc/mr-doc-parser) From ade842b7305a81de03fb7e63f9e11331b4e44254 Mon Sep 17 00:00:00 2001 From: Takeshi Date: Fri, 24 Aug 2018 00:23:35 -0600 Subject: [PATCH 24/32] Doc: Add note --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index a704c76..663c49e 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,8 @@ abstract class Parser { } ``` +**Note**: See the [JavaScript parser](./src/lang/javascript/index.ts) for an example. + ### Implement the Language Visitor The next step is to walk the tree that parsed by `tree-sitter` and to wrap each node as an `Node` type. From 2a615199879ba6570f8c29c45e17a697eb30e069 Mon Sep 17 00:00:00 2001 From: Takeshi Date: Fri, 24 Aug 2018 00:33:33 -0600 Subject: [PATCH 25/32] Build: Remove test for now --- .travis.yml | 2 +- package.json | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 45b11a5..5b394e5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,4 +2,4 @@ language: node_js node_js: - 8 -before_install: npm i -g gulp \ No newline at end of file +# before_install: npm i -g gulp \ No newline at end of file diff --git a/package.json b/package.json index 5965ea1..d64482a 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,6 @@ "description": "The official parser for Mr. Doc", "main": "./build/index.js", "scripts": { - "test": "gulp" }, "repository": { "type": "git", From 0d563c13b57d120dba30a94b37cf665feabafb59 Mon Sep 17 00:00:00 2001 From: Takeshi Date: Fri, 24 Aug 2018 09:38:04 -0600 Subject: [PATCH 26/32] Update: Remove statement_block from method_definition --- build/corpus/example.js | 2 +- build/index.d.ts | 4 ++-- build/index.js | 17 +++-------------- build/src/ParserFactory.js | 2 +- build/src/interfaces/ASTNode.js | 2 +- build/src/interfaces/Source.js | 2 +- build/src/interfaces/TextRange.js | 2 +- build/src/lang/common/ast.js | 2 +- build/src/lang/common/node.js | 2 +- build/src/lang/common/parser.js | 2 +- build/src/lang/common/visitor.js | 2 +- build/src/lang/javascript/index.js | 2 +- build/src/lang/javascript/properties.js | 2 +- build/src/lang/javascript/visitor.js | 7 ++----- build/src/lang/typescript/index.js | 2 +- build/src/lang/typescript/properties.js | 2 +- build/src/lang/typescript/visitor.js | 6 ++---- build/src/utils/benchmark.js | 2 +- build/src/utils/comment.js | 2 +- build/src/utils/log.js | 2 +- build/src/utils/match.js | 2 +- build/src/utils/range.js | 2 +- build/src/utils/sibling.js | 2 +- build/src/utils/text.js | 2 +- build/src/utils/walk.js | 2 +- corpus/example.js | 10 ++++++++-- index.ts | 4 ++-- src/lang/javascript/visitor.ts | 5 +---- src/lang/typescript/visitor.ts | 4 +--- 29 files changed, 42 insertions(+), 57 deletions(-) diff --git a/build/corpus/example.js b/build/corpus/example.js index c7a4dba..7204ff3 100644 --- a/build/corpus/example.js +++ b/build/corpus/example.js @@ -9,4 +9,4 @@ var X; } X.name = name; })(X = exports.X || (exports.X = {})); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhhbXBsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2NvcnB1cy9leGFtcGxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsSUFBaUIsQ0FBQyxDQU9qQjtBQVBELFdBQWlCLENBQUM7SUFDaEI7O09BRUc7SUFDSCxTQUFnQixJQUFJLENBQUMsR0FBRyxJQUFJO0lBRTVCLENBQUM7SUFGZSxNQUFJLE9BRW5CLENBQUE7QUFDSCxDQUFDLEVBUGdCLENBQUMsR0FBRCxTQUFDLEtBQUQsU0FBQyxRQU9qQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBuYW1lc3BhY2UgWCB7XHJcbiAgLyoqXHJcbiAgICogXHJcbiAgICovXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIG5hbWUoLi4uYXJncykge1xyXG4gICAgXHJcbiAgfVxyXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhhbXBsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2NvcnB1cy9leGFtcGxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsSUFBaUIsQ0FBQyxDQU9qQjtBQVBELFdBQWlCLENBQUM7SUFDaEI7O09BRUc7SUFDSCxTQUFnQixJQUFJLENBQUMsR0FBRyxJQUFJO0lBRTVCLENBQUM7SUFGZSxNQUFJLE9BRW5CLENBQUE7QUFDSCxDQUFDLEVBUGdCLENBQUMsR0FBRCxTQUFDLEtBQUQsU0FBQyxRQU9qQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBuYW1lc3BhY2UgWCB7XG4gIC8qKlxuICAgKiBcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBuYW1lKC4uLmFyZ3MpIHtcbiAgICBcbiAgfVxufSJdfQ== \ No newline at end of file diff --git a/build/index.d.ts b/build/index.d.ts index c92de1f..e76644c 100644 --- a/build/index.d.ts +++ b/build/index.d.ts @@ -20,9 +20,9 @@ import { Tree } from 'tree-sitter'; * * ``` */ -export default class MainParser extends Parser { +export default class DocParser extends Parser { private parser; - constructor(source: Source, options: any); + constructor(source: Source, options?: object); parse: () => import("./src/interfaces/ASTNode").default[]; readonly tree: Tree; } diff --git a/build/index.js b/build/index.js index ad63496..6b0193d 100644 --- a/build/index.js +++ b/build/index.js @@ -2,8 +2,6 @@ Object.defineProperty(exports, "__esModule", { value: true }); const ParserFactory_1 = require("./src/ParserFactory"); const parser_1 = require("./src/lang/common/parser"); -const FS = require("fs"); -// import { ASTNode } from './src/lang/common/ast'; /** * A class that parses a source code and generates an AST. * @@ -23,7 +21,7 @@ const FS = require("fs"); * * ``` */ -class MainParser extends parser_1.default { +class DocParser extends parser_1.default { constructor(source, options) { super(source, options); this.parse = () => { @@ -35,14 +33,5 @@ class MainParser extends parser_1.default { return this.parser.tree; } } -exports.default = MainParser; -const path = `${process.cwd()}/corpus/ReactElementValidator.txt`; -const result = new MainParser({ - name: 'index.ts', - path: path, - text: FS.readFileSync(path, 'utf-8') -}, { - language: 'ts' -}).parse(); -// console.log(result); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLHVEQUFnRDtBQUNoRCxxREFBOEM7QUFDOUMseUJBQXlCO0FBRXpCLG1EQUFtRDtBQUNuRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBcUIsVUFBVyxTQUFRLGdCQUFNO0lBRzVDLFlBQVksTUFBYyxFQUFFLE9BQVk7UUFDdEMsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUd4QixVQUFLLEdBQUcsR0FBRyxFQUFFO1lBQ1gsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQzVCLENBQUMsQ0FBQTtRQUpDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLHVCQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMzRSxDQUFDO0lBSUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztJQUMxQixDQUFDO0NBQ0Y7QUFiRCw2QkFhQztBQUVELE1BQU0sSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxtQ0FBbUMsQ0FBQztBQUNqRSxNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsQ0FBQztJQUM1QixJQUFJLEVBQUUsVUFBVTtJQUNoQixJQUFJLEVBQUUsSUFBSTtJQUNWLElBQUksRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUM7Q0FDckMsRUFBRTtJQUNELFFBQVEsRUFBRSxJQUFJO0NBQ2YsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0FBRVgsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNvdXJjZSBmcm9tICcuL3NyYy9pbnRlcmZhY2VzL1NvdXJjZSc7XHJcbmltcG9ydCBQYXJzZXJGYWN0b3J5IGZyb20gJy4vc3JjL1BhcnNlckZhY3RvcnknO1xyXG5pbXBvcnQgUGFyc2VyIGZyb20gJy4vc3JjL2xhbmcvY29tbW9uL3BhcnNlcic7XHJcbmltcG9ydCAqIGFzIEZTIGZyb20gJ2ZzJztcclxuaW1wb3J0IHsgVHJlZSB9IGZyb20gJ3RyZWUtc2l0dGVyJztcclxuLy8gaW1wb3J0IHsgQVNUTm9kZSB9IGZyb20gJy4vc3JjL2xhbmcvY29tbW9uL2FzdCc7XHJcbi8qKlxyXG4gKiBBIGNsYXNzIHRoYXQgcGFyc2VzIGEgc291cmNlIGNvZGUgYW5kIGdlbmVyYXRlcyBhbiBBU1QuXHJcbiAqIFxyXG4gKiBAY2xhc3MgUGFyc2VyXHJcbiAqIEBpbXBsZW1lbnRzIElQYXJzZXJcclxuICogXHJcbiAqICMgRXhhbXBsZVxyXG4gKiBcclxuICogYGBganNcclxuICogY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcih7XHJcbiAqICBuYW1lOiAnLi4uJyxcclxuICogIHBhdGg6ICcuLi4uJyxcclxuICogIHRleHQ6ICcuLi4nXHJcbiAqIH0sIHsgbGFuZ3VhZ2U6ICd0eXBlc2NyaXB0JyB9KTtcclxuICogXHJcbiAqIGNvbnN0IHJlc3VsdCA9IHBhcnNlci5wYXJzZSgpO1xyXG4gKiBcclxuICogYGBgXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYWluUGFyc2VyIGV4dGVuZHMgUGFyc2VyIHtcclxuXHJcbiAgcHJpdmF0ZSBwYXJzZXI6IFBhcnNlcjtcclxuICBjb25zdHJ1Y3Rvcihzb3VyY2U6IFNvdXJjZSwgb3B0aW9uczogYW55KSB7XHJcbiAgICBzdXBlcihzb3VyY2UsIG9wdGlvbnMpXHJcbiAgICB0aGlzLnBhcnNlciA9IChuZXcgUGFyc2VyRmFjdG9yeSh0aGlzLnNvdXJjZSwgdGhpcy5vcHRpb25zKSkuZ2V0UGFyc2VyKCk7XHJcbiAgfVxyXG4gIHBhcnNlID0gKCkgPT4ge1xyXG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLnBhcnNlKClcclxuICB9XHJcbiAgZ2V0IHRyZWUgKCk6IFRyZWUge1xyXG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLnRyZWU7XHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBwYXRoID0gYCR7cHJvY2Vzcy5jd2QoKX0vY29ycHVzL1JlYWN0RWxlbWVudFZhbGlkYXRvci50eHRgO1xyXG5jb25zdCByZXN1bHQgPSBuZXcgTWFpblBhcnNlcih7XHJcbiAgbmFtZTogJ2luZGV4LnRzJyxcclxuICBwYXRoOiBwYXRoLFxyXG4gIHRleHQ6IEZTLnJlYWRGaWxlU3luYyhwYXRoLCAndXRmLTgnKVxyXG59LCB7XHJcbiAgbGFuZ3VhZ2U6ICd0cydcclxufSkucGFyc2UoKTtcclxuXHJcbi8vIGNvbnNvbGUubG9nKHJlc3VsdCk7XHJcbiJdfQ== \ No newline at end of file +exports.default = DocParser; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLHVEQUFnRDtBQUNoRCxxREFBOEM7QUFHOUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQXFCLFNBQVUsU0FBUSxnQkFBTTtJQUczQyxZQUFZLE1BQWMsRUFBRSxPQUFnQjtRQUMxQyxLQUFLLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBR3hCLFVBQUssR0FBRyxHQUFHLEVBQUU7WUFDWCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDNUIsQ0FBQyxDQUFBO1FBSkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksdUJBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzNFLENBQUM7SUFJRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQzFCLENBQUM7Q0FDRjtBQWJELDRCQWFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNvdXJjZSBmcm9tICcuL3NyYy9pbnRlcmZhY2VzL1NvdXJjZSc7XG5pbXBvcnQgUGFyc2VyRmFjdG9yeSBmcm9tICcuL3NyYy9QYXJzZXJGYWN0b3J5JztcbmltcG9ydCBQYXJzZXIgZnJvbSAnLi9zcmMvbGFuZy9jb21tb24vcGFyc2VyJztcbmltcG9ydCB7IFRyZWUgfSBmcm9tICd0cmVlLXNpdHRlcic7XG5cbi8qKlxuICogQSBjbGFzcyB0aGF0IHBhcnNlcyBhIHNvdXJjZSBjb2RlIGFuZCBnZW5lcmF0ZXMgYW4gQVNULlxuICogXG4gKiBAY2xhc3MgUGFyc2VyXG4gKiBAaW1wbGVtZW50cyBJUGFyc2VyXG4gKiBcbiAqICMgRXhhbXBsZVxuICogXG4gKiBgYGBqc1xuICogY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcih7XG4gKiAgbmFtZTogJy4uLicsXG4gKiAgcGF0aDogJy4uLi4nLFxuICogIHRleHQ6ICcuLi4nXG4gKiB9LCB7IGxhbmd1YWdlOiAndHlwZXNjcmlwdCcgfSk7XG4gKiBcbiAqIGNvbnN0IHJlc3VsdCA9IHBhcnNlci5wYXJzZSgpO1xuICogXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRG9jUGFyc2VyIGV4dGVuZHMgUGFyc2VyIHtcblxuICBwcml2YXRlIHBhcnNlcjogUGFyc2VyO1xuICBjb25zdHJ1Y3Rvcihzb3VyY2U6IFNvdXJjZSwgb3B0aW9ucz86IG9iamVjdCkge1xuICAgIHN1cGVyKHNvdXJjZSwgb3B0aW9ucylcbiAgICB0aGlzLnBhcnNlciA9IChuZXcgUGFyc2VyRmFjdG9yeSh0aGlzLnNvdXJjZSwgdGhpcy5vcHRpb25zKSkuZ2V0UGFyc2VyKCk7XG4gIH1cbiAgcGFyc2UgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLnBhcnNlKClcbiAgfVxuICBnZXQgdHJlZSAoKTogVHJlZSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLnRyZWU7XG4gIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/build/src/ParserFactory.js b/build/src/ParserFactory.js index f33be9e..9a0b6b3 100644 --- a/build/src/ParserFactory.js +++ b/build/src/ParserFactory.js @@ -25,4 +25,4 @@ class ParserFactory { } } exports.default = ParserFactory; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFyc2VyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9QYXJzZXJGYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0Esa0RBQWlEO0FBQ2pELGtEQUFpRDtBQUdqRCxNQUFxQixhQUFhO0lBS2hDLFlBQVksSUFBWSxFQUFFLFVBQWUsRUFBRTtRQUhuQyxZQUFPLEdBQUc7WUFDaEIsUUFBUSxFQUFFLFlBQVk7U0FDdkIsQ0FBQTtRQU1ELGNBQVMsR0FBRyxHQUFXLEVBQUU7WUFDdkIsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDM0MsS0FBSyxJQUFJLENBQUM7Z0JBQ1YsS0FBSyxZQUFZO29CQUNmLE9BQU8sSUFBSSxvQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDekQsS0FBSyxJQUFJLENBQUM7Z0JBQ1YsS0FBSyxZQUFZO29CQUNmLE9BQU8sSUFBSSxvQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDekQ7b0JBQ0EsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLFVBQVUsQ0FBQyxDQUFBO29CQUNyRSxNQUFNO2FBQ1Q7UUFDSCxDQUFDLENBQUE7UUFoQkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3RDLENBQUM7Q0FlRjtBQXZCRCxnQ0F1QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU291cmNlIGZyb20gXCIuL2ludGVyZmFjZXMvU291cmNlXCI7XHJcbmltcG9ydCBKYXZhU2NyaXB0UGFyc2VyIGZyb20gXCIuL2xhbmcvamF2YXNjcmlwdFwiO1xyXG5pbXBvcnQgVHlwZVNjcmlwdFBhcnNlciBmcm9tICcuL2xhbmcvdHlwZXNjcmlwdCc7XHJcbmltcG9ydCBQYXJzZXIgZnJvbSBcIi4vbGFuZy9jb21tb24vcGFyc2VyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYXJzZXJGYWN0b3J5IHtcclxuICBwcml2YXRlIHNvdXJjZTogU291cmNlXHJcbiAgcHJpdmF0ZSBvcHRpb25zID0ge1xyXG4gICAgbGFuZ3VhZ2U6ICdKYXZhU2NyaXB0J1xyXG4gIH1cclxuICBjb25zdHJ1Y3RvcihmaWxlOiBTb3VyY2UsIG9wdGlvbnM6IGFueSA9IHt9KSB7XHJcbiAgICB0aGlzLnNvdXJjZSA9IGZpbGU7XHJcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucywgb3B0aW9ucylcclxuICB9XHJcblxyXG4gIGdldFBhcnNlciA9ICgpOiBQYXJzZXIgPT4ge1xyXG4gICAgc3dpdGNoICh0aGlzLm9wdGlvbnMubGFuZ3VhZ2UudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICBjYXNlICdqcyc6XHJcbiAgICAgIGNhc2UgJ2phdmFzY3JpcHQnOlxyXG4gICAgICAgIHJldHVybiBuZXcgSmF2YVNjcmlwdFBhcnNlcih0aGlzLnNvdXJjZSwgdGhpcy5vcHRpb25zKTtcclxuICAgICAgY2FzZSAndHMnOlxyXG4gICAgICBjYXNlICd0eXBlc2NyaXB0JzpcclxuICAgICAgICByZXR1cm4gbmV3IFR5cGVTY3JpcHRQYXJzZXIodGhpcy5zb3VyY2UsIHRoaXMub3B0aW9ucyk7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgIGNvbnNvbGUubG9nKGBbbXItZG9jXTogTm8gcGFyc2VyIGZvciAke3RoaXMub3B0aW9ucy5sYW5ndWFnZX0gZXhpc3RzLmApXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFyc2VyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9QYXJzZXJGYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0Esa0RBQWlEO0FBQ2pELGtEQUFpRDtBQUdqRCxNQUFxQixhQUFhO0lBS2hDLFlBQVksSUFBWSxFQUFFLFVBQWUsRUFBRTtRQUhuQyxZQUFPLEdBQUc7WUFDaEIsUUFBUSxFQUFFLFlBQVk7U0FDdkIsQ0FBQTtRQU1ELGNBQVMsR0FBRyxHQUFXLEVBQUU7WUFDdkIsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDM0MsS0FBSyxJQUFJLENBQUM7Z0JBQ1YsS0FBSyxZQUFZO29CQUNmLE9BQU8sSUFBSSxvQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDekQsS0FBSyxJQUFJLENBQUM7Z0JBQ1YsS0FBSyxZQUFZO29CQUNmLE9BQU8sSUFBSSxvQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDekQ7b0JBQ0EsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLFVBQVUsQ0FBQyxDQUFBO29CQUNyRSxNQUFNO2FBQ1Q7UUFDSCxDQUFDLENBQUE7UUFoQkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3RDLENBQUM7Q0FlRjtBQXZCRCxnQ0F1QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU291cmNlIGZyb20gXCIuL2ludGVyZmFjZXMvU291cmNlXCI7XG5pbXBvcnQgSmF2YVNjcmlwdFBhcnNlciBmcm9tIFwiLi9sYW5nL2phdmFzY3JpcHRcIjtcbmltcG9ydCBUeXBlU2NyaXB0UGFyc2VyIGZyb20gJy4vbGFuZy90eXBlc2NyaXB0JztcbmltcG9ydCBQYXJzZXIgZnJvbSBcIi4vbGFuZy9jb21tb24vcGFyc2VyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhcnNlckZhY3Rvcnkge1xuICBwcml2YXRlIHNvdXJjZTogU291cmNlXG4gIHByaXZhdGUgb3B0aW9ucyA9IHtcbiAgICBsYW5ndWFnZTogJ0phdmFTY3JpcHQnXG4gIH1cbiAgY29uc3RydWN0b3IoZmlsZTogU291cmNlLCBvcHRpb25zOiBhbnkgPSB7fSkge1xuICAgIHRoaXMuc291cmNlID0gZmlsZTtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucywgb3B0aW9ucylcbiAgfVxuXG4gIGdldFBhcnNlciA9ICgpOiBQYXJzZXIgPT4ge1xuICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLmxhbmd1YWdlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNhc2UgJ2pzJzpcbiAgICAgIGNhc2UgJ2phdmFzY3JpcHQnOlxuICAgICAgICByZXR1cm4gbmV3IEphdmFTY3JpcHRQYXJzZXIodGhpcy5zb3VyY2UsIHRoaXMub3B0aW9ucyk7XG4gICAgICBjYXNlICd0cyc6XG4gICAgICBjYXNlICd0eXBlc2NyaXB0JzpcbiAgICAgICAgcmV0dXJuIG5ldyBUeXBlU2NyaXB0UGFyc2VyKHRoaXMuc291cmNlLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgIGNvbnNvbGUubG9nKGBbbXItZG9jXTogTm8gcGFyc2VyIGZvciAke3RoaXMub3B0aW9ucy5sYW5ndWFnZX0gZXhpc3RzLmApXG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufSJdfQ== \ No newline at end of file diff --git a/build/src/interfaces/ASTNode.js b/build/src/interfaces/ASTNode.js index 39acd36..06d8a70 100644 --- a/build/src/interfaces/ASTNode.js +++ b/build/src/interfaces/ASTNode.js @@ -1,3 +1,3 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQVNUTm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbnRlcmZhY2VzL0FTVE5vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZXh0UmFuZ2UgZnJvbSBcIi4vVGV4dFJhbmdlXCI7XHJcbmltcG9ydCB7IFJlbWFya05vZGUgfSBmcm9tIFwieGRvYy1wYXJzZXIvc3JjL1hEb2NQYXJzZXJcIjtcclxuaW1wb3J0IHsgRG9jdW1lbnRhdGlvbk5vZGUgfSBmcm9tIFwieGRvYy1wYXJzZXIvc3JjL1hEb2NBU1ROb2RlXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBpbnRlcmZhY2UgQVNUTm9kZSBleHRlbmRzIFRleHRSYW5nZSB7XHJcbiAgLyoqXHJcbiAgICogQHByb3BlcnR5IC0gVGhlIHR5cGUgb2Ygbm9kZS5cclxuICAgKi9cclxuICB0eXBlOiBzdHJpbmcsXHJcbiAgLyoqXHJcbiAgICogQHByb3BlcnR5IC0gVGhlIGNvbnRleHQgc3RyaW5nLlxyXG4gICAqL1xyXG4gIHRleHQ6IHN0cmluZyxcclxuICAvKipcclxuICAgKiBAcHJvcGVydHkgLSBUaGUgbm9kZSdzIGNoaWxkcmVuLlxyXG4gICAqL1xyXG4gIGNoaWxkcmVuOiBBU1ROb2RlW10gfCB1bmRlZmluZWRbXSxcclxuICAvKipcclxuICAgKiBAcHJvcGVydHkgLSBUaGUgY29udGV4dCBub2RlIHRoYXQgYSBjb21tZW50IG5vZGUgcmVmZXJzIHRvLlxyXG4gICAqL1xyXG4gIGNvbnRleHQ6IEFTVE5vZGUsXHJcbiAgLyoqXHJcbiAgICogQHByb3BlcnR5IC0gVGhlIHByb3BlcnRpZXMgdGhhdCBhIEFTVE5vZGUgbWF5IHBvc3Nlc3MuXHJcbiAgICovXHJcbiAgcHJvcGVydGllcz86IG9iamVjdFxyXG4gIC8qKlxyXG4gICAqIEBwcm9wZXJ0eSAtIFRoZSBwYXJzZWQgWERvYyBjb21tZW50LlxyXG4gICAqL1xyXG4gIGNvbW1lbnQ/OiB7XHJcbiAgICBtYXJrZG93bjogUmVtYXJrTm9kZSxcclxuICAgIGRvY3VtZW50YXRpb246IFBhcnRpYWw8RG9jdW1lbnRhdGlvbk5vZGU+XHJcbiAgfVxyXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQVNUTm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbnRlcmZhY2VzL0FTVE5vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZXh0UmFuZ2UgZnJvbSBcIi4vVGV4dFJhbmdlXCI7XG5pbXBvcnQgeyBSZW1hcmtOb2RlIH0gZnJvbSBcInhkb2MtcGFyc2VyL3NyYy9YRG9jUGFyc2VyXCI7XG5pbXBvcnQgeyBEb2N1bWVudGF0aW9uTm9kZSB9IGZyb20gXCJ4ZG9jLXBhcnNlci9zcmMvWERvY0FTVE5vZGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgaW50ZXJmYWNlIEFTVE5vZGUgZXh0ZW5kcyBUZXh0UmFuZ2Uge1xuICAvKipcbiAgICogQHByb3BlcnR5IC0gVGhlIHR5cGUgb2Ygbm9kZS5cbiAgICovXG4gIHR5cGU6IHN0cmluZyxcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSAtIFRoZSBjb250ZXh0IHN0cmluZy5cbiAgICovXG4gIHRleHQ6IHN0cmluZyxcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSAtIFRoZSBub2RlJ3MgY2hpbGRyZW4uXG4gICAqL1xuICBjaGlsZHJlbjogQVNUTm9kZVtdIHwgdW5kZWZpbmVkW10sXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgLSBUaGUgY29udGV4dCBub2RlIHRoYXQgYSBjb21tZW50IG5vZGUgcmVmZXJzIHRvLlxuICAgKi9cbiAgY29udGV4dDogQVNUTm9kZSxcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0aWVzIHRoYXQgYSBBU1ROb2RlIG1heSBwb3NzZXNzLlxuICAgKi9cbiAgcHJvcGVydGllcz86IG9iamVjdFxuICAvKipcbiAgICogQHByb3BlcnR5IC0gVGhlIHBhcnNlZCBYRG9jIGNvbW1lbnQuXG4gICAqL1xuICBjb21tZW50Pzoge1xuICAgIG1hcmtkb3duOiBSZW1hcmtOb2RlLFxuICAgIGRvY3VtZW50YXRpb246IFBhcnRpYWw8RG9jdW1lbnRhdGlvbk5vZGU+XG4gIH1cbn0iXX0= \ No newline at end of file diff --git a/build/src/interfaces/Source.js b/build/src/interfaces/Source.js index 6590b1a..0d8ff4e 100644 --- a/build/src/interfaces/Source.js +++ b/build/src/interfaces/Source.js @@ -1,3 +1,3 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvU291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBpbnRlcmZhY2UgU291cmNlIHtcclxuICBuYW1lOiBzdHJpbmcsXHJcbiAgcGF0aDogc3RyaW5nLFxyXG4gIHRleHQ6IHN0cmluZ1xyXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvU291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBpbnRlcmZhY2UgU291cmNlIHtcbiAgbmFtZTogc3RyaW5nLFxuICBwYXRoOiBzdHJpbmcsXG4gIHRleHQ6IHN0cmluZ1xufSJdfQ== \ No newline at end of file diff --git a/build/src/interfaces/TextRange.js b/build/src/interfaces/TextRange.js index 015edef..51ef572 100644 --- a/build/src/interfaces/TextRange.js +++ b/build/src/interfaces/TextRange.js @@ -1,3 +1,3 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGV4dFJhbmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvVGV4dFJhbmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuLyoqXHJcbiAqIEFuIGludGVyZmFjZSB0aGF0IHJlcHJlc2VudHMgYSByYW5nZS5cclxuICogXHJcbiAqIEBpbnRlcmZhY2UgUmFuZ2VcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmFuZ2Uge1xyXG4gIHN0YXJ0OiBudW1iZXIsXHJcbiAgZW5kOiBudW1iZXJcclxufVxyXG5cclxuLyoqXHJcbiAqIEFuIGludGVyZmFjZSB0aGF0IHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uYWwgXHJcbiAqIGFuZCBsb2NhdGlvbmFsIHJhbmdlcyBvZiBhIHNvdXJjZSBjb2RlLlxyXG4gKiBcclxuICogQGludGVyZmFjZSBUZXh0UmFuZ2VcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGludGVyZmFjZSBUZXh0UmFuZ2Uge1xyXG4gIC8qKlxyXG4gICAqIFJlcHJlc2VudHMgYSBjb250ZXh0J3Mgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbi5cclxuICAgKiBAcHJvcGVydHkgcG9zaXRpb246IHtcclxuICAgKiAgc3RhcnQ6IG51bWJlcixcclxuICAgKiAgZW5kOiBudW1iZXJcclxuICAgKiB9XHJcbiAgICovXHJcbiAgcG9zaXRpb246IFJhbmdlXHJcbiAgLyoqXHJcbiAgICogUmVwcmVzZW50cyBhIGNvbnRleHQncyByb3cgYW5kIGNvbHVtbiBsb2NhdGlvbi5cclxuICAgKiBcclxuICAgKiBAbG9jYXRpb246IHtcclxuICAgKiAgcm93OiBSYW5nZSxcclxuICAgKiAgY29sdW1uOiBSYW5nZVxyXG4gICAqIH1cclxuICAgKi9cclxuICBsb2NhdGlvbjoge1xyXG4gICAgcm93OiBSYW5nZSxcclxuICAgIGNvbHVtbjogUmFuZ2VcclxuICB9XHJcbn0iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGV4dFJhbmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvVGV4dFJhbmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogQW4gaW50ZXJmYWNlIHRoYXQgcmVwcmVzZW50cyBhIHJhbmdlLlxuICogXG4gKiBAaW50ZXJmYWNlIFJhbmdlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmFuZ2Uge1xuICBzdGFydDogbnVtYmVyLFxuICBlbmQ6IG51bWJlclxufVxuXG4vKipcbiAqIEFuIGludGVyZmFjZSB0aGF0IHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uYWwgXG4gKiBhbmQgbG9jYXRpb25hbCByYW5nZXMgb2YgYSBzb3VyY2UgY29kZS5cbiAqIFxuICogQGludGVyZmFjZSBUZXh0UmFuZ2VcbiAqL1xuZXhwb3J0IGRlZmF1bHQgaW50ZXJmYWNlIFRleHRSYW5nZSB7XG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGEgY29udGV4dCdzIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb24uXG4gICAqIEBwcm9wZXJ0eSBwb3NpdGlvbjoge1xuICAgKiAgc3RhcnQ6IG51bWJlcixcbiAgICogIGVuZDogbnVtYmVyXG4gICAqIH1cbiAgICovXG4gIHBvc2l0aW9uOiBSYW5nZVxuICAvKipcbiAgICogUmVwcmVzZW50cyBhIGNvbnRleHQncyByb3cgYW5kIGNvbHVtbiBsb2NhdGlvbi5cbiAgICogXG4gICAqIEBsb2NhdGlvbjoge1xuICAgKiAgcm93OiBSYW5nZSxcbiAgICogIGNvbHVtbjogUmFuZ2VcbiAgICogfVxuICAgKi9cbiAgbG9jYXRpb246IHtcbiAgICByb3c6IFJhbmdlLFxuICAgIGNvbHVtbjogUmFuZ2VcbiAgfVxufSJdfQ== \ No newline at end of file diff --git a/build/src/lang/common/ast.js b/build/src/lang/common/ast.js index 3225caf..380f1e9 100644 --- a/build/src/lang/common/ast.js +++ b/build/src/lang/common/ast.js @@ -26,4 +26,4 @@ function createASTNode(source, node, arg1, arg2) { children, comment: document ? xdoc_parser_1.default(source.text).parse() : undefined, properties }); } exports.createASTNode = createASTNode; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xhbmcvY29tbW9uL2FzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLDJDQUF3QztBQUN4Qyw2Q0FBc0M7QUFFdEMsNkNBQStCO0FBQy9CLDRCQUEyQjtBQUczQixTQUFnQixTQUFTLENBQUMsTUFBYztJQUN0QyxPQUFPLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksVUFBVSxJQUFJLE1BQU0sQ0FBQztBQUNoRixDQUFDO0FBRkQsOEJBRUM7QUFPRCxTQUFnQixhQUFhLENBQUMsTUFBYyxFQUFFLElBQWdCLEVBQUUsSUFBVSxFQUFFLElBQVU7SUFFcEYsSUFBSSxPQUFPLEVBQUUsUUFBUSxHQUFHLEVBQUUsRUFBRSxRQUFRLEdBQUcsT0FBTyxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUUsVUFBVSxDQUFDO0lBRTlGLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUM3QyxVQUFVLEdBQUcsSUFBSSxDQUFDO0tBQ25CO1NBQU0sSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNuRCxPQUFPLEdBQUcsSUFBSSxDQUFDO0tBQ2hCO1NBQU0sSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQzFCLFFBQVEsR0FBRyxJQUFJLENBQUM7S0FDakI7SUFFRCxJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDekIsVUFBVSxHQUFHLElBQUksQ0FBQztLQUNuQjtJQUVELHVCQUNFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUNmLElBQUksRUFBRSxXQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUNyQixlQUFLLENBQUMsSUFBSSxDQUFDLElBQ2QsT0FBTztRQUNQLFFBQVEsRUFDUixPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxxQkFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUN6RCxVQUFVLElBQ1g7QUFDSCxDQUFDO0FBekJELHNDQXlCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcclxuaW1wb3J0IHsgdGV4dCB9IGZyb20gXCIuLi8uLi91dGlscy90ZXh0XCI7XHJcbmltcG9ydCByYW5nZSBmcm9tIFwiLi4vLi4vdXRpbHMvcmFuZ2VcIjtcclxuaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2VcIjtcclxuaW1wb3J0IHhkb2MgZnJvbSAneGRvYy1wYXJzZXInO1xyXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCdcclxuaW1wb3J0IEFTVE5vZGUgZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvQVNUTm9kZVwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzQVNUTm9kZShvYmplY3Q6IG9iamVjdCk6IG9iamVjdCBpcyBBU1ROb2RlIHtcclxuICByZXR1cm4gb2JqZWN0ICYmICd0eXBlJyBpbiBvYmplY3QgJiYgJ3RleHQnIGluIG9iamVjdCAmJiAnY2hpbGRyZW4nIGluIG9iamVjdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFTVE5vZGUoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBU1ROb2RlKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzOiBvYmplY3QpXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBU1ROb2RlKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlLCBjaGlsZHJlbjogb2JqZWN0W10pOiBBU1ROb2RlXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBU1ROb2RlKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlLCBjaGlsZHJlbjogb2JqZWN0W10sIHByb3BlcnRpZXM6IG9iamVjdClcclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFTVE5vZGUoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUsIGNvbnRleHQ6IEFTVE5vZGUsIGRvY3VtZW50OiBib29sZWFuKTogQVNUTm9kZVxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQVNUTm9kZShzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSwgYXJnMT86IGFueSwgYXJnMj86IGFueSk6IEFTVE5vZGUge1xyXG5cclxuICBsZXQgY29udGV4dCwgY2hpbGRyZW4gPSBbXSwgZG9jdW1lbnQgPSB0eXBlb2YgYXJnMiA9PT0gJ2Jvb2xlYW4nICYmIGFyZzIgPT09IHRydWUsIHByb3BlcnRpZXM7XHJcblxyXG4gIGlmIChfLmlzUGxhaW5PYmplY3QoYXJnMSkgJiYgIWlzQVNUTm9kZShhcmcxKSkge1xyXG4gICAgcHJvcGVydGllcyA9IGFyZzE7XHJcbiAgfSBlbHNlIGlmIChfLmlzUGxhaW5PYmplY3QoYXJnMSkgJiYgaXNBU1ROb2RlKGFyZzEpKSB7XHJcbiAgICBjb250ZXh0ID0gYXJnMTtcclxuICB9IGVsc2UgaWYgKF8uaXNBcnJheShhcmcxKSkge1xyXG4gICAgY2hpbGRyZW4gPSBhcmcxO1xyXG4gIH1cclxuXHJcbiAgaWYgKF8uaXNQbGFpbk9iamVjdChhcmcyKSkge1xyXG4gICAgcHJvcGVydGllcyA9IGFyZzI7XHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgdHlwZTogbm9kZS50eXBlLFxyXG4gICAgdGV4dDogdGV4dChzb3VyY2UsIG5vZGUpLFxyXG4gICAgLi4ucmFuZ2Uobm9kZSksXHJcbiAgICBjb250ZXh0LFxyXG4gICAgY2hpbGRyZW4sXHJcbiAgICBjb21tZW50OiBkb2N1bWVudCA/IHhkb2Moc291cmNlLnRleHQpLnBhcnNlKCkgOiB1bmRlZmluZWQsXHJcbiAgICBwcm9wZXJ0aWVzLFxyXG4gIH1cclxufVxyXG4iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xhbmcvY29tbW9uL2FzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLDJDQUF3QztBQUN4Qyw2Q0FBc0M7QUFFdEMsNkNBQStCO0FBQy9CLDRCQUEyQjtBQUczQixTQUFnQixTQUFTLENBQUMsTUFBYztJQUN0QyxPQUFPLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksVUFBVSxJQUFJLE1BQU0sQ0FBQztBQUNoRixDQUFDO0FBRkQsOEJBRUM7QUFPRCxTQUFnQixhQUFhLENBQUMsTUFBYyxFQUFFLElBQWdCLEVBQUUsSUFBVSxFQUFFLElBQVU7SUFFcEYsSUFBSSxPQUFPLEVBQUUsUUFBUSxHQUFHLEVBQUUsRUFBRSxRQUFRLEdBQUcsT0FBTyxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUUsVUFBVSxDQUFDO0lBRTlGLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUM3QyxVQUFVLEdBQUcsSUFBSSxDQUFDO0tBQ25CO1NBQU0sSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNuRCxPQUFPLEdBQUcsSUFBSSxDQUFDO0tBQ2hCO1NBQU0sSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQzFCLFFBQVEsR0FBRyxJQUFJLENBQUM7S0FDakI7SUFFRCxJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDekIsVUFBVSxHQUFHLElBQUksQ0FBQztLQUNuQjtJQUVELHVCQUNFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUNmLElBQUksRUFBRSxXQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUNyQixlQUFLLENBQUMsSUFBSSxDQUFDLElBQ2QsT0FBTztRQUNQLFFBQVEsRUFDUixPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxxQkFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUN6RCxVQUFVLElBQ1g7QUFDSCxDQUFDO0FBekJELHNDQXlCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcbmltcG9ydCB7IHRleHQgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdGV4dFwiO1xuaW1wb3J0IHJhbmdlIGZyb20gXCIuLi8uLi91dGlscy9yYW5nZVwiO1xuaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2VcIjtcbmltcG9ydCB4ZG9jIGZyb20gJ3hkb2MtcGFyc2VyJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJ1xuaW1wb3J0IEFTVE5vZGUgZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvQVNUTm9kZVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNBU1ROb2RlKG9iamVjdDogb2JqZWN0KTogb2JqZWN0IGlzIEFTVE5vZGUge1xuICByZXR1cm4gb2JqZWN0ICYmICd0eXBlJyBpbiBvYmplY3QgJiYgJ3RleHQnIGluIG9iamVjdCAmJiAnY2hpbGRyZW4nIGluIG9iamVjdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFTVE5vZGUoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQVNUTm9kZShzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllczogb2JqZWN0KVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFTVE5vZGUoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUsIGNoaWxkcmVuOiBvYmplY3RbXSk6IEFTVE5vZGVcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBU1ROb2RlKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlLCBjaGlsZHJlbjogb2JqZWN0W10sIHByb3BlcnRpZXM6IG9iamVjdClcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBU1ROb2RlKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlLCBjb250ZXh0OiBBU1ROb2RlLCBkb2N1bWVudDogYm9vbGVhbik6IEFTVE5vZGVcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBU1ROb2RlKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlLCBhcmcxPzogYW55LCBhcmcyPzogYW55KTogQVNUTm9kZSB7XG5cbiAgbGV0IGNvbnRleHQsIGNoaWxkcmVuID0gW10sIGRvY3VtZW50ID0gdHlwZW9mIGFyZzIgPT09ICdib29sZWFuJyAmJiBhcmcyID09PSB0cnVlLCBwcm9wZXJ0aWVzO1xuXG4gIGlmIChfLmlzUGxhaW5PYmplY3QoYXJnMSkgJiYgIWlzQVNUTm9kZShhcmcxKSkge1xuICAgIHByb3BlcnRpZXMgPSBhcmcxO1xuICB9IGVsc2UgaWYgKF8uaXNQbGFpbk9iamVjdChhcmcxKSAmJiBpc0FTVE5vZGUoYXJnMSkpIHtcbiAgICBjb250ZXh0ID0gYXJnMTtcbiAgfSBlbHNlIGlmIChfLmlzQXJyYXkoYXJnMSkpIHtcbiAgICBjaGlsZHJlbiA9IGFyZzE7XG4gIH1cblxuICBpZiAoXy5pc1BsYWluT2JqZWN0KGFyZzIpKSB7XG4gICAgcHJvcGVydGllcyA9IGFyZzI7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6IG5vZGUudHlwZSxcbiAgICB0ZXh0OiB0ZXh0KHNvdXJjZSwgbm9kZSksXG4gICAgLi4ucmFuZ2Uobm9kZSksXG4gICAgY29udGV4dCxcbiAgICBjaGlsZHJlbixcbiAgICBjb21tZW50OiBkb2N1bWVudCA/IHhkb2Moc291cmNlLnRleHQpLnBhcnNlKCkgOiB1bmRlZmluZWQsXG4gICAgcHJvcGVydGllcyxcbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/build/src/lang/common/node.js b/build/src/lang/common/node.js index 5285539..59098b1 100644 --- a/build/src/lang/common/node.js +++ b/build/src/lang/common/node.js @@ -12,4 +12,4 @@ class Node { } } exports.Node = Node; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2NvbW1vbi9ub2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBT0E7O0dBRUc7QUFDSCxNQUFhLElBQUk7SUFDZixZQUFtQixVQUFzQjtRQUF0QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3pDLFVBQUssR0FBRyxDQUFDLE9BQWdCLEVBQVEsRUFBRTtZQUNqQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUE7SUFINEMsQ0FBQztDQUkvQztBQUxELG9CQUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5pbXBvcnQgVmlzaXRvciBmcm9tIFwiLi92aXNpdG9yXCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRyZWVTaXR0ZXJOb2RlIHtcclxuICB2aXNpdCh2aXNpdG9yOiBWaXNpdG9yKTogdm9pZFxyXG59XHJcblxyXG4vKipcclxuICogQSBjbGFzcyB0aGF0IHdyYXBzIGEgU3ludGF4Tm9kZSBhcyBhIE5vZGVcclxuICovXHJcbmV4cG9ydCBjbGFzcyBOb2RlIGltcGxlbWVudHMgVHJlZVNpdHRlck5vZGUge1xyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBzeW50YXhOb2RlOiBTeW50YXhOb2RlKSB7IH1cclxuICB2aXNpdCA9ICh2aXNpdG9yOiBWaXNpdG9yKTogdm9pZCA9PiB7XHJcbiAgICB2aXNpdG9yLnZpc2l0Tm9kZSh0aGlzLnN5bnRheE5vZGUpO1xyXG4gIH1cclxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2NvbW1vbi9ub2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBT0E7O0dBRUc7QUFDSCxNQUFhLElBQUk7SUFDZixZQUFtQixVQUFzQjtRQUF0QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3pDLFVBQUssR0FBRyxDQUFDLE9BQWdCLEVBQVEsRUFBRTtZQUNqQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUE7SUFINEMsQ0FBQztDQUkvQztBQUxELG9CQUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuaW1wb3J0IFZpc2l0b3IgZnJvbSBcIi4vdmlzaXRvclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyZWVTaXR0ZXJOb2RlIHtcbiAgdmlzaXQodmlzaXRvcjogVmlzaXRvcik6IHZvaWRcbn1cblxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgd3JhcHMgYSBTeW50YXhOb2RlIGFzIGEgTm9kZVxuICovXG5leHBvcnQgY2xhc3MgTm9kZSBpbXBsZW1lbnRzIFRyZWVTaXR0ZXJOb2RlIHtcbiAgY29uc3RydWN0b3IocHVibGljIHN5bnRheE5vZGU6IFN5bnRheE5vZGUpIHsgfVxuICB2aXNpdCA9ICh2aXNpdG9yOiBWaXNpdG9yKTogdm9pZCA9PiB7XG4gICAgdmlzaXRvci52aXNpdE5vZGUodGhpcy5zeW50YXhOb2RlKTtcbiAgfVxufSJdfQ== \ No newline at end of file diff --git a/build/src/lang/common/parser.js b/build/src/lang/common/parser.js index 5455493..25128d6 100644 --- a/build/src/lang/common/parser.js +++ b/build/src/lang/common/parser.js @@ -7,4 +7,4 @@ class Parser { } } exports.default = Parser; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xhbmcvY29tbW9uL3BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUlBLE1BQThCLE1BQU07SUFHbEMsWUFBWSxNQUFjLEVBQUUsT0FBWTtRQUN0QyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDL0IsQ0FBQztDQUdGO0FBVEQseUJBU0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU291cmNlIGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xyXG5pbXBvcnQgeyBUcmVlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XHJcbmltcG9ydCBBU1ROb2RlIGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL0FTVE5vZGVcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGFic3RyYWN0IGNsYXNzIFBhcnNlciB7XHJcbiAgcHJvdGVjdGVkIHNvdXJjZTogU291cmNlXHJcbiAgcHJvdGVjdGVkIG9wdGlvbnM6IGFueVxyXG4gIGNvbnN0cnVjdG9yKHNvdXJjZTogU291cmNlLCBvcHRpb25zOiBhbnkpIHtcclxuICAgIHRoaXMuc291cmNlID0gc291cmNlO1xyXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcclxuICB9XHJcbiAgYWJzdHJhY3QgcGFyc2UoKTogQVNUTm9kZVtdXHJcbiAgYWJzdHJhY3QgZ2V0IHRyZWUoKTogVHJlZVxyXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xhbmcvY29tbW9uL3BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUlBLE1BQThCLE1BQU07SUFHbEMsWUFBWSxNQUFjLEVBQUUsT0FBWTtRQUN0QyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDL0IsQ0FBQztDQUdGO0FBVEQseUJBU0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU291cmNlIGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuaW1wb3J0IHsgVHJlZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuaW1wb3J0IEFTVE5vZGUgZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvQVNUTm9kZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBhYnN0cmFjdCBjbGFzcyBQYXJzZXIge1xuICBwcm90ZWN0ZWQgc291cmNlOiBTb3VyY2VcbiAgcHJvdGVjdGVkIG9wdGlvbnM6IGFueVxuICBjb25zdHJ1Y3Rvcihzb3VyY2U6IFNvdXJjZSwgb3B0aW9uczogYW55KSB7XG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgfVxuICBhYnN0cmFjdCBwYXJzZSgpOiBBU1ROb2RlW11cbiAgYWJzdHJhY3QgZ2V0IHRyZWUoKTogVHJlZVxufSJdfQ== \ No newline at end of file diff --git a/build/src/lang/common/visitor.js b/build/src/lang/common/visitor.js index d5f3307..391e1eb 100644 --- a/build/src/lang/common/visitor.js +++ b/build/src/lang/common/visitor.js @@ -3,4 +3,4 @@ Object.defineProperty(exports, "__esModule", { value: true }); class Visitor { } exports.default = Visitor; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2NvbW1vbi92aXNpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0EsTUFBOEIsT0FBTztDQUlwQztBQUpELDBCQUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5pbXBvcnQgQVNUTm9kZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9BU1ROb2RlXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBhYnN0cmFjdCBjbGFzcyBWaXNpdG9yIHtcclxuICBhYnN0cmFjdCBnZXRBU1QoKTogQVNUTm9kZVtdXHJcbiAgYWJzdHJhY3QgdmlzaXROb2RlKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBvYmplY3QpOiBBU1ROb2RlXHJcbiAgYWJzdHJhY3QgdmlzaXRDaGlsZHJlbihub2RlczogU3ludGF4Tm9kZVtdLCBwcm9wZXJ0aWVzPzogb2JqZWN0KTogQVNUTm9kZVtdXHJcbn0iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2NvbW1vbi92aXNpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0EsTUFBOEIsT0FBTztDQUlwQztBQUpELDBCQUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuaW1wb3J0IEFTVE5vZGUgZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvQVNUTm9kZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBhYnN0cmFjdCBjbGFzcyBWaXNpdG9yIHtcbiAgYWJzdHJhY3QgZ2V0QVNUKCk6IEFTVE5vZGVbXVxuICBhYnN0cmFjdCB2aXNpdE5vZGUobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IG9iamVjdCk6IEFTVE5vZGVcbiAgYWJzdHJhY3QgdmlzaXRDaGlsZHJlbihub2RlczogU3ludGF4Tm9kZVtdLCBwcm9wZXJ0aWVzPzogb2JqZWN0KTogQVNUTm9kZVtdXG59Il19 \ No newline at end of file diff --git a/build/src/lang/javascript/index.js b/build/src/lang/javascript/index.js index 62bcb33..a678515 100644 --- a/build/src/lang/javascript/index.js +++ b/build/src/lang/javascript/index.js @@ -32,4 +32,4 @@ class JavaScriptParser extends parser_1.default { } } exports.default = JavaScriptParser; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy9qYXZhc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsMENBQTBDO0FBQzFDLHFEQUFxRDtBQUNyRCw2Q0FBc0M7QUFFdEMsdUNBQThDO0FBQzlDLDJDQUFvQztBQUdwQzs7Ozs7Ozs7R0FRRztBQUNILE1BQXFCLGdCQUFpQixTQUFRLGdCQUFNO0lBR2xELFlBQVksTUFBYyxFQUFFLE9BQVk7UUFDdEMsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFDRCxLQUFLO1FBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSwyQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkQsTUFBTSxLQUFLLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNwQixPQUFPLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBQ0QsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7Q0FDRjtBQWxCRCxtQ0FrQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBUcmVlU2l0dGVyIGZyb20gJ3RyZWUtc2l0dGVyJztcclxuaW1wb3J0ICogYXMgSmF2YVNjcmlwdCBmcm9tICd0cmVlLXNpdHRlci1qYXZhc2NyaXB0JztcclxuaW1wb3J0IFBhcnNlciBmcm9tICcuLi9jb21tb24vcGFyc2VyJztcclxuaW1wb3J0IFNvdXJjZSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZSc7XHJcbmltcG9ydCB7IEphdmFTY3JpcHRWaXNpdG9yIH0gZnJvbSAnLi92aXNpdG9yJztcclxuaW1wb3J0IHdhbGsgZnJvbSAnLi4vLi4vdXRpbHMvd2Fsayc7XHJcbmltcG9ydCBBU1ROb2RlIGZyb20gJy4uLy4uL2ludGVyZmFjZXMvQVNUTm9kZSc7XHJcblxyXG4vKipcclxuICogQSBjbGFzcyB0aGF0IHBhcnNlcyBKYXZhU2NyaXB0IGNvbW1lbnRzLlxyXG4gKiBcclxuICogIyBBUElcclxuICogXHJcbiAqIEBjbGFzcyBKYXZhU2NyaXB0UGFyc2VyXHJcbiAqIEBpbXBsZW1lbnRzIElQYXJzZXJcclxuICogQGV4cG9ydCBkZWZhdWx0XHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBKYXZhU2NyaXB0UGFyc2VyIGV4dGVuZHMgUGFyc2VyIHtcclxuICBwcml2YXRlIHBhcnNlcjogVHJlZVNpdHRlcjtcclxuICBwcml2YXRlIHRyZWVfOiBUcmVlU2l0dGVyLlRyZWU7XHJcbiAgY29uc3RydWN0b3Ioc291cmNlOiBTb3VyY2UsIG9wdGlvbnM6IGFueSkge1xyXG4gICAgc3VwZXIoc291cmNlLCBvcHRpb25zKTtcclxuICAgIHRoaXMucGFyc2VyID0gbmV3IFRyZWVTaXR0ZXIoKTtcclxuICAgIHRoaXMucGFyc2VyLnNldExhbmd1YWdlKEphdmFTY3JpcHQpO1xyXG4gICAgdGhpcy50cmVlXyA9IHRoaXMucGFyc2VyLnBhcnNlKHRoaXMuc291cmNlLnRleHQpO1xyXG4gIH1cclxuICBwYXJzZSgpOiBBU1ROb2RlW10ge1xyXG4gICAgY29uc3QgdmlzaXRvciA9IG5ldyBKYXZhU2NyaXB0VmlzaXRvcih0aGlzLnNvdXJjZSk7XHJcbiAgICBjb25zdCBub2RlcyA9IHdhbGsodGhpcy50cmVlXy5yb290Tm9kZSk7XHJcbiAgICBub2Rlcy52aXNpdCh2aXNpdG9yKVxyXG4gICAgcmV0dXJuIHZpc2l0b3IuZ2V0QVNUKCk7XHJcbiAgfVxyXG4gIGdldCB0cmVlICgpOiBUcmVlU2l0dGVyLlRyZWUge1xyXG4gICAgcmV0dXJuIHRoaXMudHJlZV87XHJcbiAgfVxyXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy9qYXZhc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsMENBQTBDO0FBQzFDLHFEQUFxRDtBQUNyRCw2Q0FBc0M7QUFFdEMsdUNBQThDO0FBQzlDLDJDQUFvQztBQUdwQzs7Ozs7Ozs7R0FRRztBQUNILE1BQXFCLGdCQUFpQixTQUFRLGdCQUFNO0lBR2xELFlBQVksTUFBYyxFQUFFLE9BQVk7UUFDdEMsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFDRCxLQUFLO1FBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSwyQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkQsTUFBTSxLQUFLLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNwQixPQUFPLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBQ0QsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7Q0FDRjtBQWxCRCxtQ0FrQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBUcmVlU2l0dGVyIGZyb20gJ3RyZWUtc2l0dGVyJztcbmltcG9ydCAqIGFzIEphdmFTY3JpcHQgZnJvbSAndHJlZS1zaXR0ZXItamF2YXNjcmlwdCc7XG5pbXBvcnQgUGFyc2VyIGZyb20gJy4uL2NvbW1vbi9wYXJzZXInO1xuaW1wb3J0IFNvdXJjZSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZSc7XG5pbXBvcnQgeyBKYXZhU2NyaXB0VmlzaXRvciB9IGZyb20gJy4vdmlzaXRvcic7XG5pbXBvcnQgd2FsayBmcm9tICcuLi8uLi91dGlscy93YWxrJztcbmltcG9ydCBBU1ROb2RlIGZyb20gJy4uLy4uL2ludGVyZmFjZXMvQVNUTm9kZSc7XG5cbi8qKlxuICogQSBjbGFzcyB0aGF0IHBhcnNlcyBKYXZhU2NyaXB0IGNvbW1lbnRzLlxuICogXG4gKiAjIEFQSVxuICogXG4gKiBAY2xhc3MgSmF2YVNjcmlwdFBhcnNlclxuICogQGltcGxlbWVudHMgSVBhcnNlclxuICogQGV4cG9ydCBkZWZhdWx0XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEphdmFTY3JpcHRQYXJzZXIgZXh0ZW5kcyBQYXJzZXIge1xuICBwcml2YXRlIHBhcnNlcjogVHJlZVNpdHRlcjtcbiAgcHJpdmF0ZSB0cmVlXzogVHJlZVNpdHRlci5UcmVlO1xuICBjb25zdHJ1Y3Rvcihzb3VyY2U6IFNvdXJjZSwgb3B0aW9uczogYW55KSB7XG4gICAgc3VwZXIoc291cmNlLCBvcHRpb25zKTtcbiAgICB0aGlzLnBhcnNlciA9IG5ldyBUcmVlU2l0dGVyKCk7XG4gICAgdGhpcy5wYXJzZXIuc2V0TGFuZ3VhZ2UoSmF2YVNjcmlwdCk7XG4gICAgdGhpcy50cmVlXyA9IHRoaXMucGFyc2VyLnBhcnNlKHRoaXMuc291cmNlLnRleHQpO1xuICB9XG4gIHBhcnNlKCk6IEFTVE5vZGVbXSB7XG4gICAgY29uc3QgdmlzaXRvciA9IG5ldyBKYXZhU2NyaXB0VmlzaXRvcih0aGlzLnNvdXJjZSk7XG4gICAgY29uc3Qgbm9kZXMgPSB3YWxrKHRoaXMudHJlZV8ucm9vdE5vZGUpO1xuICAgIG5vZGVzLnZpc2l0KHZpc2l0b3IpXG4gICAgcmV0dXJuIHZpc2l0b3IuZ2V0QVNUKCk7XG4gIH1cbiAgZ2V0IHRyZWUgKCk6IFRyZWVTaXR0ZXIuVHJlZSB7XG4gICAgcmV0dXJuIHRoaXMudHJlZV87XG4gIH1cbn0iXX0= \ No newline at end of file diff --git a/build/src/lang/javascript/properties.js b/build/src/lang/javascript/properties.js index aa7c462..87e17b1 100644 --- a/build/src/lang/javascript/properties.js +++ b/build/src/lang/javascript/properties.js @@ -1,3 +1,3 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2phdmFzY3JpcHQvcHJvcGVydGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBKYXZhU2NyaXB0UHJvcGVydGllcyB7XHJcbiAgZXhwb3J0czogUGFydGlhbDxKYXZhU2NyaXB0RXhwb3J0cz5cclxuICBpbmhlcml0YW5jZTogUGFydGlhbDxKYXZhU2NyaXB0SW5oZXJpdGFuY2U+XHJcbiAgbmFtZXNwYWNlOiBib29sZWFuLFxyXG4gIG1vZHVsZTogYm9vbGVhblxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEphdmFTY3JpcHRFeHBvcnRzIHtcclxuICBleHBvcnQ6IGJvb2xlYW4sXHJcbiAgZGVmYXVsdDogYm9vbGVhblxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEphdmFTY3JpcHRJbmhlcml0YW5jZSB7XHJcbiAgZXh0ZW5kczogYm9vbGVhbixcclxuICBpbXBsZW1lbnRzOiBib29sZWFuXHJcbn0iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2phdmFzY3JpcHQvcHJvcGVydGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBKYXZhU2NyaXB0UHJvcGVydGllcyB7XG4gIGV4cG9ydHM6IFBhcnRpYWw8SmF2YVNjcmlwdEV4cG9ydHM+XG4gIGluaGVyaXRhbmNlOiBQYXJ0aWFsPEphdmFTY3JpcHRJbmhlcml0YW5jZT5cbiAgbmFtZXNwYWNlOiBib29sZWFuLFxuICBtb2R1bGU6IGJvb2xlYW5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBKYXZhU2NyaXB0RXhwb3J0cyB7XG4gIGV4cG9ydDogYm9vbGVhbixcbiAgZGVmYXVsdDogYm9vbGVhblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEphdmFTY3JpcHRJbmhlcml0YW5jZSB7XG4gIGV4dGVuZHM6IGJvb2xlYW4sXG4gIGltcGxlbWVudHM6IGJvb2xlYW5cbn0iXX0= \ No newline at end of file diff --git a/build/src/lang/javascript/visitor.js b/build/src/lang/javascript/visitor.js index 1d09325..3871d9e 100644 --- a/build/src/lang/javascript/visitor.js +++ b/build/src/lang/javascript/visitor.js @@ -207,9 +207,8 @@ class JavaScriptVisitor { return this.visitExpressionStatement(node, properties); } // Handle special cases where a function has a statement_block - if (match_1.default(node, 'function')) { + if (match_1.default(node, 'function') || match_1.default(node, 'method_definition')) { _.remove(children, child => match_1.default(child, 'statement_block')); - console.log(children); return ast_1.createASTNode(this.source, node, this.visitChildren(children), properties); } return ast_1.createASTNode(this.source, node, this.visitChildren(children), properties); @@ -263,7 +262,6 @@ class JavaScriptVisitor { * Returns only the comments from a node's children. */ filterType(node, type) { - // console.time('filterType') let children = []; for (let i = 0; i < node.children.length; i++) { const child = node.children[i]; @@ -271,7 +269,6 @@ class JavaScriptVisitor { children.push(child); } } - // console.timeEnd('filterType') return children; } getAST() { @@ -279,4 +276,4 @@ class JavaScriptVisitor { } } exports.JavaScriptVisitor = JavaScriptVisitor; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2phdmFzY3JpcHQvdmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHVDQUE4QztBQUM5QyxpREFBdUQ7QUFDdkQsaURBQThDO0FBRTlDLDRCQUE0QjtBQUM1Qix5Q0FBaUQ7QUFDakQsNkNBQXNDO0FBTXRDOztHQUVHO0FBQ0gsTUFBYSxpQkFBaUI7SUFHNUIsWUFBWSxNQUFjO1FBRmxCLFFBQUcsR0FBYyxFQUFFLENBQUE7UUFxRTNCLGVBQWU7UUFFZixjQUFTLEdBQUcsQ0FDVixJQUFnQixFQUNoQixVQUEwQyxFQUMxQyxFQUFFO1lBQ0YsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNqQixLQUFLLFNBQVM7b0JBQ1osSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNuQyxNQUFNO2dCQUNSLEtBQUssU0FBUztvQkFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pDLEtBQUssU0FBUyxDQUFDO2dCQUNmLEtBQUssT0FBTztvQkFDVixhQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO29CQUM5RCxNQUFNO2dCQUNSO29CQUVFLCtCQUErQjtvQkFFL0IsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUNaLFlBQVksRUFDWixtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFDM0QsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQ3pFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQ3RFLG1CQUFtQixFQUFFLFlBQVksRUFDakMsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixrQkFBa0Is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QixJQUFJLGVBQUssQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLEVBQUU7Z0JBQzNCLE9BQU8sSUFBSSxDQUFDO2FBQ2I7U0FDRjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0ssVUFBVSxDQUFDLElBQWdCLEVBQUUsSUFBWTtRQUMvQyw2QkFBNkI7UUFDN0IsSUFBSSxRQUFRLEdBQWlCLEVBQUUsQ0FBQztRQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLGVBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ3RCLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDdEI7U0FDRjtRQUNELGdDQUFnQztRQUNoQyxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsTUFBTTtRQUNKLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQixDQUFDO0NBNlFGO0FBalZELDhDQWlWQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUFTVE5vZGUgfSBmcm9tIFwiLi4vY29tbW9uL2FzdFwiO1xyXG5pbXBvcnQgeyBpc0phdmFEb2NDb21tZW50IH0gZnJvbSBcIi4uLy4uL3V0aWxzL2NvbW1lbnRcIjtcclxuaW1wb3J0IHsgc2libGluZyB9IGZyb20gXCIuLi8uLi91dGlscy9zaWJsaW5nXCI7XHJcbmltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcclxuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xyXG5pbXBvcnQgbG9nLCB7IEVycm9yVHlwZSB9IGZyb20gXCIuLi8uLi91dGlscy9sb2dcIjtcclxuaW1wb3J0IG1hdGNoIGZyb20gXCIuLi8uLi91dGlscy9tYXRjaFwiO1xyXG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xyXG5pbXBvcnQgVmlzaXRvciBmcm9tIFwiLi4vY29tbW9uL3Zpc2l0b3JcIjtcclxuaW1wb3J0IEFTVE5vZGUgZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvQVNUTm9kZVwiO1xyXG5pbXBvcnQgeyBKYXZhU2NyaXB0UHJvcGVydGllcywgSmF2YVNjcmlwdEluaGVyaXRhbmNlIH0gZnJvbSBcIi4vcHJvcGVydGllc1wiO1xyXG5cclxuLyoqXHJcbiAqIEEgY2xhc3MgdGhhdCB2aXNpdHMgQVNUTm9kZXMgZnJvbSBhIFR5cGVTY3JpcHQgdHJlZS5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBKYXZhU2NyaXB0VmlzaXRvciBpbXBsZW1lbnRzIFZpc2l0b3Ige1xyXG4gIHByaXZhdGUgYXN0OiBBU1ROb2RlW10gPSBbXVxyXG4gIHByaXZhdGUgc291cmNlOiBTb3VyY2VcclxuICBjb25zdHJ1Y3Rvcihzb3VyY2U6IFNvdXJjZSkge1xyXG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBub2RlIGhhcyBpbmhlcml0YW5jZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgaGFzSW5oZXJpdGFuY2Uobm9kZTogU3ludGF4Tm9kZSkge1xyXG4gICAgbGV0IGluaGVyaXRzID0gZmFsc2U7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xyXG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdleHRlbmRzJywgJ2ltcGxlbWVudHMnKSkge1xyXG4gICAgICAgIGluaGVyaXRzID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGluaGVyaXRzXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIGEgbm9kZSdzIGluaGVyaXRhbmNlIHR5cGVcclxuICAgKi9cclxuICBwcml2YXRlIGdldEluaGVyaXRhbmNlVHlwZShub2RlOiBTeW50YXhOb2RlKSB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xyXG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdleHRlbmRzJykpIHtcclxuICAgICAgICByZXR1cm4gJ2V4dGVuZHMnO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdpbXBsZW1lbnRzJykpIHtcclxuICAgICAgICByZXR1cm4gJ2ltcGxlbWVudHMnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gZXhwb3J0IGlzIGRlZmF1bHRcclxuICAgKi9cclxuICBwcml2YXRlIGhhc0RlZmF1bHRFeHBvcnQobm9kZTogU3ludGF4Tm9kZSk6IGJvb2xlYW4ge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXTtcclxuICAgICAgaWYgKG1hdGNoKGNoaWxkLCAnZGVmYXVsdCcpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgb25seSB0aGUgY29tbWVudHMgZnJvbSBhIG5vZGUncyBjaGlsZHJlbi5cclxuICAgKi9cclxuICBwcml2YXRlIGZpbHRlclR5cGUobm9kZTogU3ludGF4Tm9kZSwgdHlwZTogc3RyaW5nKTogU3ludGF4Tm9kZVtdIHtcclxuICAgIC8vIGNvbnNvbGUudGltZSgnZmlsdGVyVHlwZScpXHJcbiAgICBsZXQgY2hpbGRyZW46IFN5bnRheE5vZGVbXSA9IFtdO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXTtcclxuICAgICAgaWYgKG1hdGNoKGNoaWxkLCB0eXBlKSkge1xyXG4gICAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBjb25zb2xlLnRpbWVFbmQoJ2ZpbHRlclR5cGUnKVxyXG4gICAgcmV0dXJuIGNoaWxkcmVuO1xyXG4gIH1cclxuXHJcbiAgZ2V0QVNUKCk6IEFTVE5vZGVbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5hc3Q7XHJcbiAgfVxyXG5cclxuICAvKiBWaXNpdG9ycyAgKi9cclxuXHJcbiAgdmlzaXROb2RlID0gKFxyXG4gICAgbm9kZTogU3ludGF4Tm9kZSxcclxuICAgIHByb3BlcnRpZXM/OiBQYXJ0aWFsPEphdmFTY3JpcHRQcm9wZXJ0aWVzPlxyXG4gICkgPT4ge1xyXG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcclxuICAgICAgY2FzZSAncHJvZ3JhbSc6XHJcbiAgICAgICAgdGhpcy5hc3QgPSB0aGlzLnZpc2l0UHJvZ3JhbShub2RlKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnY29tbWVudCc6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRDb21tZW50KG5vZGUpO1xyXG4gICAgICBjYXNlICdNSVNTSU5HJzpcclxuICAgICAgY2FzZSAnRVJST1InOlxyXG4gICAgICAgIGxvZy5yZXBvcnQodGhpcy5zb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5UcmVlU2l0dGVyUGFyc2VFcnJvcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcblxyXG4gICAgICAgIC8qIE1hdGNoIG90aGVyIG5vbi10ZXJtaW5hbHMgKi9cclxuXHJcbiAgICAgICAgaWYgKG1hdGNoKG5vZGUsXHJcbiAgICAgICAgICAnY29uc3RyYWludCcsXHJcbiAgICAgICAgICAnZm9ybWFsX3BhcmFtZXRlcnMnLCAncmVxdWlyZWRfcGFyYW1ldGVyJywgJ3Jlc3RfcGFyYW1ldGVyJyxcclxuICAgICAgICAgICd0eXBlX2lkZW50aWZpZXInLCAndHlwZV9wYXJhbWV0ZXJzJywgJ3R5cGVfcGFyYW1ldGVyJywgJ3R5cGVfYW5ub3RhdGlvbicsXHJcbiAgICAgICAgICAnb2JqZWN0X3R5cGUnLCAncHJlZGVmaW5lZF90eXBlJywgJ3BhcmVudGhlc2l6ZWRfdHlwZScsICdsaXRlcmFsX3R5cGUnLFxyXG4gICAgICAgICAgJ2ludGVyc2VjdGlvbl90eXBlJywgJ3VuaW9uX3R5cGUnLFxyXG4gICAgICAgICAgJ2NsYXNzX2JvZHknLFxyXG4gICAgICAgICAgJ2V4dGVuZHNfY2xhdXNlJyxcclxuICAgICAgICAgICd1bmFyeV9leHByZXNzaW9uJywgJ2JpbmFyeV9leHByZXNzaW9uJywgJ3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbicsICdtZW1iZXJfZXhwcmVzc2lvbicsXHJcbiAgICAgICAgICAnc3RhdGVtZW50X2Jsb2NrJywgJ3JldHVybl9zdGF0ZW1lbnQnLCAnZXhwb3J0X3N0YXRlbWVudCcsICdleHByZXNzaW9uX3N0YXRlbWVudCcsXHJcbiAgICAgICAgICAvLyBBIGNhbGxfc2lnbmF0dXJlIGNhbiBhbHNvIGJlIGEgbm9uLWNvbnRleHR1YWwgbm9kZVxyXG4gICAgICAgICAgJ2NhbGxfc2lnbmF0dXJlJyxcclxuICAgICAgICAgICdpbnRlcm5hbF9tb2R1bGUnLFxyXG4gICAgICAgICAgJ2lmX3N0YXRlbWVudCdcclxuICAgICAgICApKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdE5vblRlcm1pbmFsKG5vZGUsIHByb3BlcnRpZXMpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBNYXRjaCB0ZXJtaW5hbHMgKi9cclxuICAgICAgICBpZiAobWF0Y2gobm9kZSxcclxuICAgICAgICAgICdpZGVudGlmaWVyJywgJ2V4dGVuZHMnLCAncHJvcGVydHlfaWRlbnRpZmllcicsICdhY2Nlc3NpYmlsaXR5X21vZGlmaWVyJyxcclxuICAgICAgICAgICdudWxsJywgJ3VuZGVmaW5lZCcsICdyZXR1cm4nLFxyXG4gICAgICAgICAgJ2dldCcsICdmdW5jdGlvbicsICduYW1lc3BhY2UnLCAnaWYnLCAnY29uc3QnXHJcbiAgICAgICAgKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRUZXJtaW5hbChub2RlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxvZy5yZXBvcnQodGhpcy5zb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFlldFN1cHBvcnRlZCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdmlzaXRDaGlsZHJlbiA9IChub2RlczogU3ludGF4Tm9kZVtdKTogQVNUTm9kZVtdID0+IHtcclxuICAgIGxldCBjaGlsZHJlbjogQVNUTm9kZVtdID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpXTtcclxuICAgICAgaWYgKCFub2RlLnR5cGUubWF0Y2goL1s8Pigpe30sOjtcXFtcXF0mfD1cXCtcXC1cXCpcXC8hLl0vKSAmJiBub2RlLnR5cGUgIT09ICcuLi4nKSB7XHJcbiAgICAgICAgY29uc3QgY2hpbGQgPSB0aGlzLnZpc2l0Tm9kZShub2RlKTtcclxuICAgICAgICBpZiAoY2hpbGQpIGNoaWxkcmVuLnB1c2goY2hpbGQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2hpbGRyZW47XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHZpc2l0UHJvZ3JhbSA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZVtdID0+IHtcclxuICAgIGxldCB2aXNpdGVkID0ge30sXHJcbiAgICAgIGdldFN0YXJ0TG9jYXRpb24gPSAobjogQVNUTm9kZSkgPT4gYCR7bi5sb2NhdGlvbi5yb3cuc3RhcnR9OiR7bi5sb2NhdGlvbi5jb2x1bW4uc3RhcnR9YDtcclxuICAgIC8vIEEgcHJvZ3JhbSBjYW4gaGF2ZSBtb2R1bGVzLCBuYW1lc3BhY2VzLCBjb21tZW50cyBhcyBpdHMgY2hpbGRyZW5cclxuICAgIC8vIFRoZSBmaXJzdCBzdGVwIGlzIHRvIHBhcnNlIGFsbCB0aGUgY29tbWVudHMgaW4gdGhlIHJvb3Qgbm9kZVxyXG4gICAgbGV0IGNvbW1lbnRzID0gdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShub2RlLCAnY29tbWVudCcpKTtcclxuICAgIC8vIFBhcnNlIHRoZSBuYW1lc3BhY2VzIGluIGV4cHJlc3Npb25fc3RhdGVtZW50XHJcbiAgICAvLyBsZXQgbmFtZXNwYWNlcyA9IHRoaXMudmlzaXRDaGlsZHJlbih0aGlzLmZpbHRlclR5cGUobm9kZSwgJ2V4cHJlc3Npb25fc3RhdGVtZW50JykpO1xyXG4gICAgLy8gUGFyc2UgdGhlIGV4cG9ydCBzdGF0ZW1lbnRzIGluIHRoZSByb290IG5vZGVcclxuICAgIGxldCBleHBvcnRzID0gdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShub2RlLCAnZXhwb3J0X3N0YXRlbWVudCcpKTtcclxuXHJcbiAgICAvLyBHZXQgdGhlIHZpc2l0ZWQgY29udGV4dCBub2Rlc1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21tZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBjb21tZW50ID0gY29tbWVudHNbaV07XHJcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBjb21tZW50O1xyXG4gICAgICB2aXNpdGVkW2dldFN0YXJ0TG9jYXRpb24oY29udGV4dCldID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBFeHBvcnRzIGFyZSBvZGRiYWxscyBzaW5jZSBzb21lIGV4cG9ydHMgbWF5IHJlZmVyZW5jZVxyXG4gICAgLy8gYSB0eXBlL25vZGUgdGhhdCBtYXkgaGF2ZSBiZWVuIGNvbW1lbnRlZC5cclxuICAgIC8vIFdlJ2xsIGZpcnN0IG5lZWQgdG8gZmlsdGVyIHRoZSBvbmVzIHdlIGhhdmUgdmlzaXRlZFxyXG4gICAgXy5yZW1vdmUoZXhwb3J0cywgeCA9PiB2aXNpdGVkW2dldFN0YXJ0TG9jYXRpb24oeCldKTtcclxuXHJcbiAgICAvLyBGcm9tIHRoZSBvbmVzIHdlIGhhdmUgbm90IHZpc2l0ZWQsIHdlJ2xsIG5lZWQgdG8gbW9kaWZ5XHJcbiAgICAvLyB0aGUgbm9kZSBwcm9wZXJ0aWVzIG9mIGVhY2ggY29udGV4dCBpbiBhIGNvbW1lbnQgbm9kZSB0aGF0XHJcbiAgICAvLyBtYXRjaGVzIHRoZSBvbmVzIHdlIGhhdmUgbm90IHZpc2l0ZWQuXHJcbiAgICBjb25zdCBtYXRjaGVkID0ge307XHJcbiAgICBjb21tZW50cyA9IF8uY29tcGFjdChcclxuICAgICAgY29tbWVudHMubWFwKGNvbW1lbnQgPT4ge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwb3J0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgY29uc3QgZXhwb3J0XyA9IGV4cG9ydHNbaV07XHJcbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0gY29tbWVudC5jb250ZXh0O1xyXG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGNvbnRleHQgJiYgaiA8IGNvbnRleHQuY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRleHQuY2hpbGRyZW5baV0gJiYgY29udGV4dC5jaGlsZHJlbltpXS50eXBlID09PSBleHBvcnRfLnR5cGUpIHtcclxuICAgICAgICAgICAgICBtYXRjaGVkW2dldFN0YXJ0TG9jYXRpb24oZXhwb3J0XyldID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBjb21tZW50LmNvbnRleHQucHJvcGVydGllcyA9IE9iamVjdC5hc3NpZ24oXHJcbiAgICAgICAgICAgICAgICBjb21tZW50LmNvbnRleHQucHJvcGVydGllcyB8fCB7fSxcclxuICAgICAgICAgICAgICAgIGV4cG9ydF8ucHJvcGVydGllc1xyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbW1lbnQ7XHJcbiAgICAgIH0pKTtcclxuXHJcbiAgICAvLyBSZW1vdmVkIHRoZSBtYXRjaGVkIGV4cG9ydHNcclxuICAgIF8ucmVtb3ZlKGV4cG9ydHMsIHggPT4gbWF0Y2hlZFtnZXRTdGFydExvY2F0aW9uKHgpXSlcclxuXHJcbiAgICByZXR1cm4gW10uY29uY2F0KGNvbW1lbnRzKS5jb25jYXQoZXhwb3J0cyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHZpc2l0Q29tbWVudCA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZSA9PiB7XHJcbiAgICBpZiAoaXNKYXZhRG9jQ29tbWVudCh0aGlzLnNvdXJjZSwgbm9kZSkpIHtcclxuICAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSBzaWJsaW5nKG5vZGUpO1xyXG4gICAgICBpZiAobmV4dFNpYmxpbmcpIHtcclxuICAgICAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENvbnRleHQobmV4dFNpYmxpbmcsIHt9KSwgdHJ1ZSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmlzaXQgdGhlIGNvbnRleHR1YWwgbm9kZVxyXG4gICAqIFxyXG4gICAqICMgUmVtYXJrXHJcbiAgICogXHJcbiAgICogQSBub2RlIGlzIGNvbnNpZGVyZWQgY29udGV4dHVhbCB3aGVuIGEgY29tbWVudCBpcyB2aXNpdGVkIGFuZCB0aGUgbm9kZSBpcyBpdHMgc2libGluZy5cclxuICAgKi9cclxuICBwcml2YXRlIHZpc2l0Q29udGV4dCA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxKYXZhU2NyaXB0UHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcclxuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XHJcbiAgICAgIGNhc2UgJ2V4cG9ydF9zdGF0ZW1lbnQnOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0RXhwb3J0U3RhdGVtZW50KG5vZGUsIHByb3BlcnRpZXMpO1xyXG4gICAgICBjYXNlICdleHByZXNzaW9uX3N0YXRlbWVudCc6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KG5vZGUsIHByb3BlcnRpZXMpO1xyXG4gICAgICBjYXNlICdjbGFzcyc6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRDbGFzcyhub2RlLCBwcm9wZXJ0aWVzKVxyXG4gICAgICBjYXNlICdmdW5jdGlvbic6XHJcbiAgICAgIGNhc2UgJ2NhbGxfc2lnbmF0dXJlJzpcclxuICAgICAgY2FzZSAnbWV0aG9kX3NpZ25hdHVyZSc6XHJcbiAgICAgIGNhc2UgJ3Byb3BlcnR5X3NpZ25hdHVyZSc6XHJcbiAgICAgIGNhc2UgJ3B1YmxpY19maWVsZF9kZWZpbml0aW9uJzpcclxuICAgICAgY2FzZSAnbWV0aG9kX2RlZmluaXRpb24nOlxyXG4gICAgICBjYXNlICdsZXhpY2FsX2RlY2xhcmF0aW9uJzpcclxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdE5vblRlcm1pbmFsKG5vZGUsIHByb3BlcnRpZXMpO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGxvZy5yZXBvcnQodGhpcy5zb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFlldFN1cHBvcnRlZCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyogU3RhdGVtZW50cyAqL1xyXG5cclxuICBwcml2YXRlIHZpc2l0RXhwb3J0U3RhdGVtZW50ID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPEphdmFTY3JpcHRQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xyXG4gICAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiwgZGVmYXVsdEV4cG9ydCA9IGZhbHNlO1xyXG4gICAgLy8gUmVtb3ZlICdleHBvcnQnIHNpbmNlIGl0J3MgYWx3YXlzIGZpcnN0IGluIHRoZSBhcnJheVxyXG4gICAgY2hpbGRyZW4uc2hpZnQoKTtcclxuICAgIGlmICh0aGlzLmhhc0RlZmF1bHRFeHBvcnQobm9kZSkpIHtcclxuICAgICAgZGVmYXVsdEV4cG9ydCA9IHRydWU7XHJcbiAgICAgIC8vIFJlbW92ZSAnZGVmYXVsdCcgZXhwb3J0XHJcbiAgICAgIGNoaWxkcmVuLnNoaWZ0KCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuLnNoaWZ0KCk7XHJcbiAgICByZXR1cm4gdGhpcy52aXNpdE5vZGUoY2hpbGQsIHsgZXhwb3J0czogeyBleHBvcnQ6IHRydWUsIGRlZmF1bHQ6IGRlZmF1bHRFeHBvcnQgfSB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50ID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM6IFBhcnRpYWw8SmF2YVNjcmlwdFByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XHJcbiAgICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xyXG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbi5zaGlmdCgpO1xyXG5cclxuICAgIGlmIChtYXRjaChjaGlsZCwgJ2ludGVybmFsX21vZHVsZScpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnZpc2l0SW50ZXJuYWxNb2R1bGUoY2hpbGQsIHByb3BlcnRpZXMpXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG1hdGNoKGNoaWxkLCAnZnVuY3Rpb24nKSkge1xyXG4gICAgICBpZiAocHJvcGVydGllcykgcmV0dXJuIHRoaXMudmlzaXRDb250ZXh0KGNoaWxkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy52aXNpdE5vblRlcm1pbmFsKGNoaWxkKVxyXG4gIH1cclxuXHJcbiAgLyogTW9kdWxlcyAqL1xyXG5cclxuICBwcml2YXRlIHZpc2l0SW50ZXJuYWxNb2R1bGUgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8SmF2YVNjcmlwdFByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XHJcbiAgICBsZXQgY2hpbGRyZW46IEFTVE5vZGVbXSA9IG5vZGUuY2hpbGRyZW4ubWFwKGNoaWxkID0+IHtcclxuICAgICAgaWYgKG1hdGNoKGNoaWxkLCAnc3RhdGVtZW50X2Jsb2NrJykpIHtcclxuICAgICAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShjaGlsZCwgJ2NvbW1lbnQnKSkpXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMudmlzaXROb2RlKGNoaWxkKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIGNoaWxkcmVuLCBPYmplY3QuYXNzaWduKHByb3BlcnRpZXMgfHwge30sIHsgbmFtZXNwYWNlOiB0cnVlIH0pKTtcclxuICB9XHJcblxyXG5cclxuICAvKiBEZWNsYXJhdGlvbnMgKi9cclxuXHJcbiAgcHJpdmF0ZSB2aXNpdENsYXNzID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPEphdmFTY3JpcHRQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xyXG4gICAgLy8gU2luY2UgJ2ludGVyZmFjZScgb3IgJ2NsYXNzJyBpcyBhbHdheXMgZmlyc3QgaW4gdGhlIGFycmF5XHJcbiAgICAvLyB3ZSdsbCBuZWVkIHRvIHJlbW92ZSBpdCBmcm9tIHRoZSBhcnJheS5cclxuICAgIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XHJcbiAgICBjb25zdCBpbnRlcmZhY2VfID0gY2hpbGRyZW4uc2hpZnQoKTtcclxuICAgIGxldCBleHRlbmRzXyA9IGZhbHNlLCBpbXBsZW1lbnRzXyA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuaGFzSW5oZXJpdGFuY2Uobm9kZSkpIHtcclxuICAgICAgY29uc3QgaW5oZXJpdGFuY2UgPSB0aGlzLmdldEluaGVyaXRhbmNlVHlwZShub2RlKVxyXG4gICAgICBleHRlbmRzXyA9IGluaGVyaXRhbmNlID09PSAnZXh0ZW5kcyc7XHJcbiAgICAgIGltcGxlbWVudHNfID0gaW5oZXJpdGFuY2UgPT09ICdpbXBsZW1lbnRzJztcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBub2RlXyA9IGNyZWF0ZUFTVE5vZGUoXHJcbiAgICAgIHRoaXMuc291cmNlLFxyXG4gICAgICBub2RlLFxyXG4gICAgICB0aGlzLnZpc2l0Q2hpbGRyZW4oY2hpbGRyZW4pLFxyXG4gICAgICBPYmplY3QuYXNzaWduKHByb3BlcnRpZXMgfHwge30sIHtcclxuICAgICAgICBpbmhlcml0YW5jZToge1xyXG4gICAgICAgICAgaW1wbGVtZW50czogaW1wbGVtZW50c18sXHJcbiAgICAgICAgICBleHRlbmRzOiBleHRlbmRzX1xyXG4gICAgICAgIH0gYXMgSmF2YVNjcmlwdEluaGVyaXRhbmNlXHJcbiAgICAgIH0pKTtcclxuXHJcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2NsYXNzJykpIHtcclxuICAgICAgcmV0dXJuIG5vZGVfO1xyXG4gICAgfVxyXG4gICAgLy8gT3ZlcndyaXRlIHRoZSBub2RlIHR5cGUgZnJvbSAnaW50ZXJmYWNlX2RlY2xhcmF0aW9uJyB0byAnaW50ZXJmYWNlJ1xyXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obm9kZV8sIHsgdHlwZTogaW50ZXJmYWNlXy50eXBlIH0pXHJcbiAgfVxyXG5cclxuICAvKiBOb24tdGVybWluYWxzICovXHJcblxyXG4gIHByaXZhdGUgdmlzaXROb25UZXJtaW5hbCA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxKYXZhU2NyaXB0UHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcclxuICAgIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XHJcbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBzb21lIG5vbi10ZXJtaW5hbHNcclxuICAgIC8vIGNvbnRhaW4gY29tbWVudHMgd2hpY2ggaXMgd2hhdCB3ZSBjYXJlIGFib3V0XHJcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2NsYXNzX2JvZHknLCAnb2JqZWN0X3R5cGUnKSkge1xyXG4gICAgICBjaGlsZHJlbiA9IHRoaXMuZmlsdGVyVHlwZShub2RlLCAnY29tbWVudCcpO1xyXG4gICAgfVxyXG4gICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZXMgd2hlcmUgZXhwb3J0IHN0YXRlbWVudHMgaGF2ZSBub2RlIHByb3BlcnRpZXNcclxuICAgIGlmIChtYXRjaChub2RlLCAnZXhwb3J0X3N0YXRlbWVudCcpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnZpc2l0RXhwb3J0U3RhdGVtZW50KG5vZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2VzIHdoZXJlIGFuIGludGVybmFsIG1vZHVsZSBjb250YWlucyBvdGhlciBub2Rlc1xyXG4gICAgaWYgKG1hdGNoKG5vZGUsICdpbnRlcm5hbF9tb2R1bGUnKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy52aXNpdEludGVybmFsTW9kdWxlKG5vZGUsIHByb3BlcnRpZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2VzIHdoZXJlIGFuIGludGVybWFsX21vZHVsZSBjYW4gZXhpc3QgaW4gYW4gZXhwcmVzc2lvbl9zdGF0ZW1lbnRcclxuICAgIGlmIChtYXRjaChub2RlLCAnZXhwcmVzc2lvbl9zdGF0ZW1lbnQnKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy52aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQobm9kZSwgcHJvcGVydGllcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZXMgd2hlcmUgYSBmdW5jdGlvbiBoYXMgYSBzdGF0ZW1lbnRfYmxvY2tcclxuICAgIGlmIChtYXRjaChub2RlLCAnZnVuY3Rpb24nKSkge1xyXG4gICAgICBfLnJlbW92ZShjaGlsZHJlbiwgY2hpbGQgPT4gbWF0Y2goY2hpbGQsICdzdGF0ZW1lbnRfYmxvY2snKSlcclxuICAgICAgY29uc29sZS5sb2coY2hpbGRyZW4pO1xyXG4gICAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENoaWxkcmVuKGNoaWxkcmVuKSwgcHJvcGVydGllcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIHRoaXMudmlzaXRDaGlsZHJlbihjaGlsZHJlbiksIHByb3BlcnRpZXMpO1xyXG4gIH1cclxuXHJcbiAgLyogVGVybWluYWxzICovXHJcblxyXG4gIHByaXZhdGUgdmlzaXRUZXJtaW5hbCA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZSA9PiB7XHJcbiAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSlcclxuICB9XHJcbn0iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2phdmFzY3JpcHQvdmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHVDQUE4QztBQUM5QyxpREFBdUQ7QUFDdkQsaURBQThDO0FBRTlDLDRCQUE0QjtBQUM1Qix5Q0FBaUQ7QUFDakQsNkNBQXNDO0FBTXRDOztHQUVHO0FBQ0gsTUFBYSxpQkFBaUI7SUFHNUIsWUFBWSxNQUFjO1FBRmxCLFFBQUcsR0FBYyxFQUFFLENBQUE7UUFtRTNCLGVBQWU7UUFFZixjQUFTLEdBQUcsQ0FDVixJQUFnQixFQUNoQixVQUEwQyxFQUMxQyxFQUFFO1lBQ0YsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNqQixLQUFLLFNBQVM7b0JBQ1osSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNuQyxNQUFNO2dCQUNSLEtBQUssU0FBUztvQkFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pDLEtBQUssU0FBUyxDQUFDO2dCQUNmLEtBQUssT0FBTztvQkFDVixhQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO29CQUM5RCxNQUFNO2dCQUNSO29CQUVFLCtCQUErQjtvQkFFL0IsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUNaLFlBQVksRUFDWixtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFDM0QsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQ3pFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQ3RFLG1CQUFtQixFQUFFLFlBQVksRUFDakMsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixrQkFBa0Is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SSxlQUFLLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxFQUFFO2dCQUMzQixPQUFPLElBQUksQ0FBQzthQUNiO1NBQ0Y7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNLLFVBQVUsQ0FBQyxJQUFnQixFQUFFLElBQVk7UUFDL0MsSUFBSSxRQUFRLEdBQWlCLEVBQUUsQ0FBQztRQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLGVBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ3RCLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDdEI7U0FDRjtRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxNQUFNO1FBQ0osT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2xCLENBQUM7Q0E0UUY7QUE5VUQsOENBOFVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlQVNUTm9kZSB9IGZyb20gXCIuLi9jb21tb24vYXN0XCI7XG5pbXBvcnQgeyBpc0phdmFEb2NDb21tZW50IH0gZnJvbSBcIi4uLy4uL3V0aWxzL2NvbW1lbnRcIjtcbmltcG9ydCB7IHNpYmxpbmcgfSBmcm9tIFwiLi4vLi4vdXRpbHMvc2libGluZ1wiO1xuaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGxvZywgeyBFcnJvclR5cGUgfSBmcm9tIFwiLi4vLi4vdXRpbHMvbG9nXCI7XG5pbXBvcnQgbWF0Y2ggZnJvbSBcIi4uLy4uL3V0aWxzL21hdGNoXCI7XG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuaW1wb3J0IFZpc2l0b3IgZnJvbSBcIi4uL2NvbW1vbi92aXNpdG9yXCI7XG5pbXBvcnQgQVNUTm9kZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9BU1ROb2RlXCI7XG5pbXBvcnQgeyBKYXZhU2NyaXB0UHJvcGVydGllcywgSmF2YVNjcmlwdEluaGVyaXRhbmNlIH0gZnJvbSBcIi4vcHJvcGVydGllc1wiO1xuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCB2aXNpdHMgQVNUTm9kZXMgZnJvbSBhIFR5cGVTY3JpcHQgdHJlZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEphdmFTY3JpcHRWaXNpdG9yIGltcGxlbWVudHMgVmlzaXRvciB7XG4gIHByaXZhdGUgYXN0OiBBU1ROb2RlW10gPSBbXVxuICBwcml2YXRlIHNvdXJjZTogU291cmNlXG4gIGNvbnN0cnVjdG9yKHNvdXJjZTogU291cmNlKSB7XG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgbm9kZSBoYXMgaW5oZXJpdGFuY2VcbiAgICovXG4gIHByaXZhdGUgaGFzSW5oZXJpdGFuY2Uobm9kZTogU3ludGF4Tm9kZSkge1xuICAgIGxldCBpbmhlcml0cyA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgaWYgKG1hdGNoKGNoaWxkLCAnZXh0ZW5kcycsICdpbXBsZW1lbnRzJykpIHtcbiAgICAgICAgaW5oZXJpdHMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW5oZXJpdHNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbm9kZSdzIGluaGVyaXRhbmNlIHR5cGVcbiAgICovXG4gIHByaXZhdGUgZ2V0SW5oZXJpdGFuY2VUeXBlKG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXTtcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ2V4dGVuZHMnKSkge1xuICAgICAgICByZXR1cm4gJ2V4dGVuZHMnO1xuICAgICAgfVxuXG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdpbXBsZW1lbnRzJykpIHtcbiAgICAgICAgcmV0dXJuICdpbXBsZW1lbnRzJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGV4cG9ydCBpcyBkZWZhdWx0XG4gICAqL1xuICBwcml2YXRlIGhhc0RlZmF1bHRFeHBvcnQobm9kZTogU3ludGF4Tm9kZSk6IGJvb2xlYW4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgaWYgKG1hdGNoKGNoaWxkLCAnZGVmYXVsdCcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBvbmx5IHRoZSBjb21tZW50cyBmcm9tIGEgbm9kZSdzIGNoaWxkcmVuLlxuICAgKi9cbiAgcHJpdmF0ZSBmaWx0ZXJUeXBlKG5vZGU6IFN5bnRheE5vZGUsIHR5cGU6IHN0cmluZyk6IFN5bnRheE5vZGVbXSB7XG4gICAgbGV0IGNoaWxkcmVuOiBTeW50YXhOb2RlW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXTtcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgdHlwZSkpIHtcbiAgICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjaGlsZHJlbjtcbiAgfVxuXG4gIGdldEFTVCgpOiBBU1ROb2RlW10ge1xuICAgIHJldHVybiB0aGlzLmFzdDtcbiAgfVxuXG4gIC8qIFZpc2l0b3JzICAqL1xuXG4gIHZpc2l0Tm9kZSA9IChcbiAgICBub2RlOiBTeW50YXhOb2RlLFxuICAgIHByb3BlcnRpZXM/OiBQYXJ0aWFsPEphdmFTY3JpcHRQcm9wZXJ0aWVzPlxuICApID0+IHtcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSAncHJvZ3JhbSc6XG4gICAgICAgIHRoaXMuYXN0ID0gdGhpcy52aXNpdFByb2dyYW0obm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY29tbWVudCc6XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0Q29tbWVudChub2RlKTtcbiAgICAgIGNhc2UgJ01JU1NJTkcnOlxuICAgICAgY2FzZSAnRVJST1InOlxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuVHJlZVNpdHRlclBhcnNlRXJyb3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG5cbiAgICAgICAgLyogTWF0Y2ggb3RoZXIgbm9uLXRlcm1pbmFscyAqL1xuXG4gICAgICAgIGlmIChtYXRjaChub2RlLFxuICAgICAgICAgICdjb25zdHJhaW50JyxcbiAgICAgICAgICAnZm9ybWFsX3BhcmFtZXRlcnMnLCAncmVxdWlyZWRfcGFyYW1ldGVyJywgJ3Jlc3RfcGFyYW1ldGVyJyxcbiAgICAgICAgICAndHlwZV9pZGVudGlmaWVyJywgJ3R5cGVfcGFyYW1ldGVycycsICd0eXBlX3BhcmFtZXRlcicsICd0eXBlX2Fubm90YXRpb24nLFxuICAgICAgICAgICdvYmplY3RfdHlwZScsICdwcmVkZWZpbmVkX3R5cGUnLCAncGFyZW50aGVzaXplZF90eXBlJywgJ2xpdGVyYWxfdHlwZScsXG4gICAgICAgICAgJ2ludGVyc2VjdGlvbl90eXBlJywgJ3VuaW9uX3R5cGUnLFxuICAgICAgICAgICdjbGFzc19ib2R5JyxcbiAgICAgICAgICAnZXh0ZW5kc19jbGF1c2UnLFxuICAgICAgICAgICd1bmFyeV9leHByZXNzaW9uJywgJ2JpbmFyeV9leHByZXNzaW9uJywgJ3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbicsICdtZW1iZXJfZXhwcmVzc2lvbicsXG4gICAgICAgICAgJ3N0YXRlbWVudF9ibG9jaycsICdyZXR1cm5fc3RhdGVtZW50JywgJ2V4cG9ydF9zdGF0ZW1lbnQnLCAnZXhwcmVzc2lvbl9zdGF0ZW1lbnQnLFxuICAgICAgICAgIC8vIEEgY2FsbF9zaWduYXR1cmUgY2FuIGFsc28gYmUgYSBub24tY29udGV4dHVhbCBub2RlXG4gICAgICAgICAgJ2NhbGxfc2lnbmF0dXJlJyxcbiAgICAgICAgICAnaW50ZXJuYWxfbW9kdWxlJyxcbiAgICAgICAgICAnaWZfc3RhdGVtZW50J1xuICAgICAgICApKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudmlzaXROb25UZXJtaW5hbChub2RlLCBwcm9wZXJ0aWVzKVxuICAgICAgICB9XG5cbiAgICAgICAgLyogTWF0Y2ggdGVybWluYWxzICovXG4gICAgICAgIGlmIChtYXRjaChub2RlLFxuICAgICAgICAgICdpZGVudGlmaWVyJywgJ2V4dGVuZHMnLCAncHJvcGVydHlfaWRlbnRpZmllcicsICdhY2Nlc3NpYmlsaXR5X21vZGlmaWVyJyxcbiAgICAgICAgICAnbnVsbCcsICd1bmRlZmluZWQnLCAncmV0dXJuJyxcbiAgICAgICAgICAnZ2V0JywgJ2Z1bmN0aW9uJywgJ25hbWVzcGFjZScsICdpZicsICdjb25zdCdcbiAgICAgICAgKSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnZpc2l0VGVybWluYWwobm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgdmlzaXRDaGlsZHJlbiA9IChub2RlczogU3ludGF4Tm9kZVtdKTogQVNUTm9kZVtdID0+IHtcbiAgICBsZXQgY2hpbGRyZW46IEFTVE5vZGVbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgIGlmICghbm9kZS50eXBlLm1hdGNoKC9bPD4oKXt9LDo7XFxbXFxdJnw9XFwrXFwtXFwqXFwvIS5dLykgJiYgbm9kZS50eXBlICE9PSAnLi4uJykge1xuICAgICAgICBjb25zdCBjaGlsZCA9IHRoaXMudmlzaXROb2RlKG5vZGUpO1xuICAgICAgICBpZiAoY2hpbGQpIGNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cblxuICBwcml2YXRlIHZpc2l0UHJvZ3JhbSA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZVtdID0+IHtcbiAgICBsZXQgdmlzaXRlZCA9IHt9LFxuICAgICAgZ2V0U3RhcnRMb2NhdGlvbiA9IChuOiBBU1ROb2RlKSA9PiBgJHtuLmxvY2F0aW9uLnJvdy5zdGFydH06JHtuLmxvY2F0aW9uLmNvbHVtbi5zdGFydH1gO1xuICAgIC8vIEEgcHJvZ3JhbSBjYW4gaGF2ZSBtb2R1bGVzLCBuYW1lc3BhY2VzLCBjb21tZW50cyBhcyBpdHMgY2hpbGRyZW5cbiAgICAvLyBUaGUgZmlyc3Qgc3RlcCBpcyB0byBwYXJzZSBhbGwgdGhlIGNvbW1lbnRzIGluIHRoZSByb290IG5vZGVcbiAgICBsZXQgY29tbWVudHMgPSB0aGlzLnZpc2l0Q2hpbGRyZW4odGhpcy5maWx0ZXJUeXBlKG5vZGUsICdjb21tZW50JykpO1xuICAgIC8vIFBhcnNlIHRoZSBuYW1lc3BhY2VzIGluIGV4cHJlc3Npb25fc3RhdGVtZW50XG4gICAgLy8gbGV0IG5hbWVzcGFjZXMgPSB0aGlzLnZpc2l0Q2hpbGRyZW4odGhpcy5maWx0ZXJUeXBlKG5vZGUsICdleHByZXNzaW9uX3N0YXRlbWVudCcpKTtcbiAgICAvLyBQYXJzZSB0aGUgZXhwb3J0IHN0YXRlbWVudHMgaW4gdGhlIHJvb3Qgbm9kZVxuICAgIGxldCBleHBvcnRzID0gdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShub2RlLCAnZXhwb3J0X3N0YXRlbWVudCcpKTtcblxuICAgIC8vIEdldCB0aGUgdmlzaXRlZCBjb250ZXh0IG5vZGVzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21tZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY29tbWVudCA9IGNvbW1lbnRzW2ldO1xuICAgICAgY29uc3QgY29udGV4dCA9IGNvbW1lbnQ7XG4gICAgICB2aXNpdGVkW2dldFN0YXJ0TG9jYXRpb24oY29udGV4dCldID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBFeHBvcnRzIGFyZSBvZGRiYWxscyBzaW5jZSBzb21lIGV4cG9ydHMgbWF5IHJlZmVyZW5jZVxuICAgIC8vIGEgdHlwZS9ub2RlIHRoYXQgbWF5IGhhdmUgYmVlbiBjb21tZW50ZWQuXG4gICAgLy8gV2UnbGwgZmlyc3QgbmVlZCB0byBmaWx0ZXIgdGhlIG9uZXMgd2UgaGF2ZSB2aXNpdGVkXG4gICAgXy5yZW1vdmUoZXhwb3J0cywgeCA9PiB2aXNpdGVkW2dldFN0YXJ0TG9jYXRpb24oeCldKTtcblxuICAgIC8vIEZyb20gdGhlIG9uZXMgd2UgaGF2ZSBub3QgdmlzaXRlZCwgd2UnbGwgbmVlZCB0byBtb2RpZnlcbiAgICAvLyB0aGUgbm9kZSBwcm9wZXJ0aWVzIG9mIGVhY2ggY29udGV4dCBpbiBhIGNvbW1lbnQgbm9kZSB0aGF0XG4gICAgLy8gbWF0Y2hlcyB0aGUgb25lcyB3ZSBoYXZlIG5vdCB2aXNpdGVkLlxuICAgIGNvbnN0IG1hdGNoZWQgPSB7fTtcbiAgICBjb21tZW50cyA9IF8uY29tcGFjdChcbiAgICAgIGNvbW1lbnRzLm1hcChjb21tZW50ID0+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBvcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZXhwb3J0XyA9IGV4cG9ydHNbaV07XG4gICAgICAgICAgY29uc3QgY29udGV4dCA9IGNvbW1lbnQuY29udGV4dDtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgY29udGV4dCAmJiBqIDwgY29udGV4dC5jaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKGNvbnRleHQuY2hpbGRyZW5baV0gJiYgY29udGV4dC5jaGlsZHJlbltpXS50eXBlID09PSBleHBvcnRfLnR5cGUpIHtcbiAgICAgICAgICAgICAgbWF0Y2hlZFtnZXRTdGFydExvY2F0aW9uKGV4cG9ydF8pXSA9IHRydWU7XG4gICAgICAgICAgICAgIGNvbW1lbnQuY29udGV4dC5wcm9wZXJ0aWVzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICBjb21tZW50LmNvbnRleHQucHJvcGVydGllcyB8fCB7fSxcbiAgICAgICAgICAgICAgICBleHBvcnRfLnByb3BlcnRpZXNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbW1lbnQ7XG4gICAgICB9KSk7XG5cbiAgICAvLyBSZW1vdmVkIHRoZSBtYXRjaGVkIGV4cG9ydHNcbiAgICBfLnJlbW92ZShleHBvcnRzLCB4ID0+IG1hdGNoZWRbZ2V0U3RhcnRMb2NhdGlvbih4KV0pXG5cbiAgICByZXR1cm4gW10uY29uY2F0KGNvbW1lbnRzKS5jb25jYXQoZXhwb3J0cyk7XG4gIH1cblxuICBwcml2YXRlIHZpc2l0Q29tbWVudCA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZSA9PiB7XG4gICAgaWYgKGlzSmF2YURvY0NvbW1lbnQodGhpcy5zb3VyY2UsIG5vZGUpKSB7XG4gICAgICBjb25zdCBuZXh0U2libGluZyA9IHNpYmxpbmcobm9kZSk7XG4gICAgICBpZiAobmV4dFNpYmxpbmcpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIHRoaXMudmlzaXRDb250ZXh0KG5leHRTaWJsaW5nLCB7fSksIHRydWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZpc2l0IHRoZSBjb250ZXh0dWFsIG5vZGVcbiAgICogXG4gICAqICMgUmVtYXJrXG4gICAqIFxuICAgKiBBIG5vZGUgaXMgY29uc2lkZXJlZCBjb250ZXh0dWFsIHdoZW4gYSBjb21tZW50IGlzIHZpc2l0ZWQgYW5kIHRoZSBub2RlIGlzIGl0cyBzaWJsaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSB2aXNpdENvbnRleHQgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8SmF2YVNjcmlwdFByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2V4cG9ydF9zdGF0ZW1lbnQnOlxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdEV4cG9ydFN0YXRlbWVudChub2RlLCBwcm9wZXJ0aWVzKTtcbiAgICAgIGNhc2UgJ2V4cHJlc3Npb25fc3RhdGVtZW50JzpcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KG5vZGUsIHByb3BlcnRpZXMpO1xuICAgICAgY2FzZSAnY2xhc3MnOlxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdENsYXNzKG5vZGUsIHByb3BlcnRpZXMpXG4gICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICBjYXNlICdjYWxsX3NpZ25hdHVyZSc6XG4gICAgICBjYXNlICdtZXRob2Rfc2lnbmF0dXJlJzpcbiAgICAgIGNhc2UgJ3Byb3BlcnR5X3NpZ25hdHVyZSc6XG4gICAgICBjYXNlICdwdWJsaWNfZmllbGRfZGVmaW5pdGlvbic6XG4gICAgICBjYXNlICdtZXRob2RfZGVmaW5pdGlvbic6XG4gICAgICBjYXNlICdsZXhpY2FsX2RlY2xhcmF0aW9uJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXROb25UZXJtaW5hbChub2RlLCBwcm9wZXJ0aWVzKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGxvZy5yZXBvcnQodGhpcy5zb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFlldFN1cHBvcnRlZCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICAvKiBTdGF0ZW1lbnRzICovXG5cbiAgcHJpdmF0ZSB2aXNpdEV4cG9ydFN0YXRlbWVudCA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxKYXZhU2NyaXB0UHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcbiAgICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuLCBkZWZhdWx0RXhwb3J0ID0gZmFsc2U7XG4gICAgLy8gUmVtb3ZlICdleHBvcnQnIHNpbmNlIGl0J3MgYWx3YXlzIGZpcnN0IGluIHRoZSBhcnJheVxuICAgIGNoaWxkcmVuLnNoaWZ0KCk7XG4gICAgaWYgKHRoaXMuaGFzRGVmYXVsdEV4cG9ydChub2RlKSkge1xuICAgICAgZGVmYXVsdEV4cG9ydCA9IHRydWU7XG4gICAgICAvLyBSZW1vdmUgJ2RlZmF1bHQnIGV4cG9ydFxuICAgICAgY2hpbGRyZW4uc2hpZnQoKTtcbiAgICB9XG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbi5zaGlmdCgpO1xuICAgIHJldHVybiB0aGlzLnZpc2l0Tm9kZShjaGlsZCwgeyBleHBvcnRzOiB7IGV4cG9ydDogdHJ1ZSwgZGVmYXVsdDogZGVmYXVsdEV4cG9ydCB9IH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllczogUGFydGlhbDxKYXZhU2NyaXB0UHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcbiAgICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW4uc2hpZnQoKTtcblxuICAgIGlmIChtYXRjaChjaGlsZCwgJ2ludGVybmFsX21vZHVsZScpKSB7XG4gICAgICByZXR1cm4gdGhpcy52aXNpdEludGVybmFsTW9kdWxlKGNoaWxkLCBwcm9wZXJ0aWVzKVxuICAgIH1cblxuICAgIGlmIChtYXRjaChjaGlsZCwgJ2Z1bmN0aW9uJykpIHtcbiAgICAgIGlmIChwcm9wZXJ0aWVzKSByZXR1cm4gdGhpcy52aXNpdENvbnRleHQoY2hpbGQpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnZpc2l0Tm9uVGVybWluYWwoY2hpbGQpXG4gIH1cblxuICAvKiBNb2R1bGVzICovXG5cbiAgcHJpdmF0ZSB2aXNpdEludGVybmFsTW9kdWxlID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPEphdmFTY3JpcHRQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xuICAgIGxldCBjaGlsZHJlbjogQVNUTm9kZVtdID0gbm9kZS5jaGlsZHJlbi5tYXAoY2hpbGQgPT4ge1xuICAgICAgaWYgKG1hdGNoKGNoaWxkLCAnc3RhdGVtZW50X2Jsb2NrJykpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIHRoaXMudmlzaXRDaGlsZHJlbih0aGlzLmZpbHRlclR5cGUoY2hpbGQsICdjb21tZW50JykpKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMudmlzaXROb2RlKGNoaWxkKTtcbiAgICB9KTtcbiAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgY2hpbGRyZW4sIE9iamVjdC5hc3NpZ24ocHJvcGVydGllcyB8fCB7fSwgeyBuYW1lc3BhY2U6IHRydWUgfSkpO1xuICB9XG5cblxuICAvKiBEZWNsYXJhdGlvbnMgKi9cblxuICBwcml2YXRlIHZpc2l0Q2xhc3MgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8SmF2YVNjcmlwdFByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XG4gICAgLy8gU2luY2UgJ2ludGVyZmFjZScgb3IgJ2NsYXNzJyBpcyBhbHdheXMgZmlyc3QgaW4gdGhlIGFycmF5XG4gICAgLy8gd2UnbGwgbmVlZCB0byByZW1vdmUgaXQgZnJvbSB0aGUgYXJyYXkuXG4gICAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgICBjb25zdCBpbnRlcmZhY2VfID0gY2hpbGRyZW4uc2hpZnQoKTtcbiAgICBsZXQgZXh0ZW5kc18gPSBmYWxzZSwgaW1wbGVtZW50c18gPSBmYWxzZTtcbiAgICBpZiAodGhpcy5oYXNJbmhlcml0YW5jZShub2RlKSkge1xuICAgICAgY29uc3QgaW5oZXJpdGFuY2UgPSB0aGlzLmdldEluaGVyaXRhbmNlVHlwZShub2RlKVxuICAgICAgZXh0ZW5kc18gPSBpbmhlcml0YW5jZSA9PT0gJ2V4dGVuZHMnO1xuICAgICAgaW1wbGVtZW50c18gPSBpbmhlcml0YW5jZSA9PT0gJ2ltcGxlbWVudHMnO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGVfID0gY3JlYXRlQVNUTm9kZShcbiAgICAgIHRoaXMuc291cmNlLFxuICAgICAgbm9kZSxcbiAgICAgIHRoaXMudmlzaXRDaGlsZHJlbihjaGlsZHJlbiksXG4gICAgICBPYmplY3QuYXNzaWduKHByb3BlcnRpZXMgfHwge30sIHtcbiAgICAgICAgaW5oZXJpdGFuY2U6IHtcbiAgICAgICAgICBpbXBsZW1lbnRzOiBpbXBsZW1lbnRzXyxcbiAgICAgICAgICBleHRlbmRzOiBleHRlbmRzX1xuICAgICAgICB9IGFzIEphdmFTY3JpcHRJbmhlcml0YW5jZVxuICAgICAgfSkpO1xuXG4gICAgaWYgKG1hdGNoKG5vZGUsICdjbGFzcycpKSB7XG4gICAgICByZXR1cm4gbm9kZV87XG4gICAgfVxuICAgIC8vIE92ZXJ3cml0ZSB0aGUgbm9kZSB0eXBlIGZyb20gJ2ludGVyZmFjZV9kZWNsYXJhdGlvbicgdG8gJ2ludGVyZmFjZSdcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihub2RlXywgeyB0eXBlOiBpbnRlcmZhY2VfLnR5cGUgfSlcbiAgfVxuXG4gIC8qIE5vbi10ZXJtaW5hbHMgKi9cblxuICBwcml2YXRlIHZpc2l0Tm9uVGVybWluYWwgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8SmF2YVNjcmlwdFByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XG4gICAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBzb21lIG5vbi10ZXJtaW5hbHNcbiAgICAvLyBjb250YWluIGNvbW1lbnRzIHdoaWNoIGlzIHdoYXQgd2UgY2FyZSBhYm91dFxuICAgIGlmIChtYXRjaChub2RlLCAnY2xhc3NfYm9keScsICdvYmplY3RfdHlwZScpKSB7XG4gICAgICBjaGlsZHJlbiA9IHRoaXMuZmlsdGVyVHlwZShub2RlLCAnY29tbWVudCcpO1xuICAgIH1cbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBleHBvcnQgc3RhdGVtZW50cyBoYXZlIG5vZGUgcHJvcGVydGllc1xuICAgIGlmIChtYXRjaChub2RlLCAnZXhwb3J0X3N0YXRlbWVudCcpKSB7XG4gICAgICByZXR1cm4gdGhpcy52aXNpdEV4cG9ydFN0YXRlbWVudChub2RlKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBhbiBpbnRlcm5hbCBtb2R1bGUgY29udGFpbnMgb3RoZXIgbm9kZXNcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2ludGVybmFsX21vZHVsZScpKSB7XG4gICAgICByZXR1cm4gdGhpcy52aXNpdEludGVybmFsTW9kdWxlKG5vZGUsIHByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2VzIHdoZXJlIGFuIGludGVybWFsX21vZHVsZSBjYW4gZXhpc3QgaW4gYW4gZXhwcmVzc2lvbl9zdGF0ZW1lbnRcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2V4cHJlc3Npb25fc3RhdGVtZW50JykpIHtcbiAgICAgIHJldHVybiB0aGlzLnZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChub2RlLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBhIGZ1bmN0aW9uIGhhcyBhIHN0YXRlbWVudF9ibG9ja1xuICAgIGlmIChtYXRjaChub2RlLCAnZnVuY3Rpb24nKSB8fCBtYXRjaChub2RlLCAnbWV0aG9kX2RlZmluaXRpb24nKSkge1xuICAgICAgXy5yZW1vdmUoY2hpbGRyZW4sIGNoaWxkID0+IG1hdGNoKGNoaWxkLCAnc3RhdGVtZW50X2Jsb2NrJykpXG4gICAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENoaWxkcmVuKGNoaWxkcmVuKSwgcHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIHRoaXMudmlzaXRDaGlsZHJlbihjaGlsZHJlbiksIHByb3BlcnRpZXMpO1xuICB9XG5cbiAgLyogVGVybWluYWxzICovXG5cbiAgcHJpdmF0ZSB2aXNpdFRlcm1pbmFsID0gKG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlID0+IHtcbiAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSlcbiAgfVxufSJdfQ== \ No newline at end of file diff --git a/build/src/lang/typescript/index.js b/build/src/lang/typescript/index.js index 7dab783..673484d 100644 --- a/build/src/lang/typescript/index.js +++ b/build/src/lang/typescript/index.js @@ -32,4 +32,4 @@ class TypeScriptParser extends parser_1.default { } } exports.default = TypeScriptParser; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy90eXBlc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsMENBQTBDO0FBQzFDLHFEQUFxRDtBQUNyRCw2Q0FBc0M7QUFFdEMsMkNBQW9DO0FBQ3BDLHVDQUE4QztBQUk5Qzs7Ozs7Ozs7R0FRRztBQUNILE1BQXFCLGdCQUFpQixTQUFRLGdCQUFNO0lBR2xELFlBQVksTUFBYyxFQUFFLE9BQVk7UUFDdEMsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUt6QixVQUFLLEdBQUcsR0FBYyxFQUFFO1lBQ3RCLE1BQU0sT0FBTyxHQUFHLElBQUksMkJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ25ELE1BQU0sS0FBSyxHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3hDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDcEIsT0FBTyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDMUIsQ0FBQyxDQUFBO1FBVEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBUUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7Q0FDRjtBQW5CRCxtQ0FtQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBUcmVlU2l0dGVyIGZyb20gJ3RyZWUtc2l0dGVyJztcclxuaW1wb3J0ICogYXMgVHlwZVNjcmlwdCBmcm9tICd0cmVlLXNpdHRlci10eXBlc2NyaXB0JztcclxuaW1wb3J0IFBhcnNlciBmcm9tICcuLi9jb21tb24vcGFyc2VyJztcclxuaW1wb3J0IFNvdXJjZSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZSc7XHJcbmltcG9ydCB3YWxrIGZyb20gJy4uLy4uL3V0aWxzL3dhbGsnO1xyXG5pbXBvcnQgeyBUeXBlU2NyaXB0VmlzaXRvciB9IGZyb20gJy4vdmlzaXRvcic7XHJcbmltcG9ydCBBU1ROb2RlIGZyb20gJy4uLy4uL2ludGVyZmFjZXMvQVNUTm9kZSc7XHJcblxyXG5cclxuLyoqXHJcbiAqIEEgY2xhc3MgdGhhdCBwYXJzZXMgSmF2YVNjcmlwdCBjb21tZW50cy5cclxuICpcclxuICogIyBBUElcclxuICpcclxuICogQGNsYXNzIEphdmFTY3JpcHRQYXJzZXJcclxuICogQGltcGxlbWVudHMgSVBhcnNlclxyXG4gKiBAZXhwb3J0IGRlZmF1bHRcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFR5cGVTY3JpcHRQYXJzZXIgZXh0ZW5kcyBQYXJzZXIge1xyXG4gIHByaXZhdGUgcGFyc2VyOiBUcmVlU2l0dGVyO1xyXG4gIHByaXZhdGUgdHJlZV86IFRyZWVTaXR0ZXIuVHJlZTtcclxuICBjb25zdHJ1Y3Rvcihzb3VyY2U6IFNvdXJjZSwgb3B0aW9uczogYW55KSB7XHJcbiAgICBzdXBlcihzb3VyY2UsIG9wdGlvbnMpO1xyXG4gICAgdGhpcy5wYXJzZXIgPSBuZXcgVHJlZVNpdHRlcigpO1xyXG4gICAgdGhpcy5wYXJzZXIuc2V0TGFuZ3VhZ2UoVHlwZVNjcmlwdCk7XHJcbiAgICB0aGlzLnRyZWVfID0gdGhpcy5wYXJzZXIucGFyc2UodGhpcy5zb3VyY2UudGV4dCk7XHJcbiAgfVxyXG4gIHBhcnNlID0gKCk6IEFTVE5vZGVbXSA9PiB7XHJcbiAgICBjb25zdCB2aXNpdG9yID0gbmV3IFR5cGVTY3JpcHRWaXNpdG9yKHRoaXMuc291cmNlKTtcclxuICAgIGNvbnN0IG5vZGVzID0gd2Fsayh0aGlzLnRyZWVfLnJvb3ROb2RlKTtcclxuICAgIG5vZGVzLnZpc2l0KHZpc2l0b3IpXHJcbiAgICByZXR1cm4gdmlzaXRvci5nZXRBU1QoKTtcclxuICB9XHJcblxyXG4gIGdldCB0cmVlICgpOiBUcmVlU2l0dGVyLlRyZWUge1xyXG4gICAgcmV0dXJuIHRoaXMudHJlZV87XHJcbiAgfVxyXG59XHJcbiJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy90eXBlc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsMENBQTBDO0FBQzFDLHFEQUFxRDtBQUNyRCw2Q0FBc0M7QUFFdEMsMkNBQW9DO0FBQ3BDLHVDQUE4QztBQUk5Qzs7Ozs7Ozs7R0FRRztBQUNILE1BQXFCLGdCQUFpQixTQUFRLGdCQUFNO0lBR2xELFlBQVksTUFBYyxFQUFFLE9BQVk7UUFDdEMsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUt6QixVQUFLLEdBQUcsR0FBYyxFQUFFO1lBQ3RCLE1BQU0sT0FBTyxHQUFHLElBQUksMkJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ25ELE1BQU0sS0FBSyxHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3hDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDcEIsT0FBTyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDMUIsQ0FBQyxDQUFBO1FBVEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBUUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7Q0FDRjtBQW5CRCxtQ0FtQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBUcmVlU2l0dGVyIGZyb20gJ3RyZWUtc2l0dGVyJztcbmltcG9ydCAqIGFzIFR5cGVTY3JpcHQgZnJvbSAndHJlZS1zaXR0ZXItdHlwZXNjcmlwdCc7XG5pbXBvcnQgUGFyc2VyIGZyb20gJy4uL2NvbW1vbi9wYXJzZXInO1xuaW1wb3J0IFNvdXJjZSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZSc7XG5pbXBvcnQgd2FsayBmcm9tICcuLi8uLi91dGlscy93YWxrJztcbmltcG9ydCB7IFR5cGVTY3JpcHRWaXNpdG9yIH0gZnJvbSAnLi92aXNpdG9yJztcbmltcG9ydCBBU1ROb2RlIGZyb20gJy4uLy4uL2ludGVyZmFjZXMvQVNUTm9kZSc7XG5cblxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgcGFyc2VzIEphdmFTY3JpcHQgY29tbWVudHMuXG4gKlxuICogIyBBUElcbiAqXG4gKiBAY2xhc3MgSmF2YVNjcmlwdFBhcnNlclxuICogQGltcGxlbWVudHMgSVBhcnNlclxuICogQGV4cG9ydCBkZWZhdWx0XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFR5cGVTY3JpcHRQYXJzZXIgZXh0ZW5kcyBQYXJzZXIge1xuICBwcml2YXRlIHBhcnNlcjogVHJlZVNpdHRlcjtcbiAgcHJpdmF0ZSB0cmVlXzogVHJlZVNpdHRlci5UcmVlO1xuICBjb25zdHJ1Y3Rvcihzb3VyY2U6IFNvdXJjZSwgb3B0aW9uczogYW55KSB7XG4gICAgc3VwZXIoc291cmNlLCBvcHRpb25zKTtcbiAgICB0aGlzLnBhcnNlciA9IG5ldyBUcmVlU2l0dGVyKCk7XG4gICAgdGhpcy5wYXJzZXIuc2V0TGFuZ3VhZ2UoVHlwZVNjcmlwdCk7XG4gICAgdGhpcy50cmVlXyA9IHRoaXMucGFyc2VyLnBhcnNlKHRoaXMuc291cmNlLnRleHQpO1xuICB9XG4gIHBhcnNlID0gKCk6IEFTVE5vZGVbXSA9PiB7XG4gICAgY29uc3QgdmlzaXRvciA9IG5ldyBUeXBlU2NyaXB0VmlzaXRvcih0aGlzLnNvdXJjZSk7XG4gICAgY29uc3Qgbm9kZXMgPSB3YWxrKHRoaXMudHJlZV8ucm9vdE5vZGUpO1xuICAgIG5vZGVzLnZpc2l0KHZpc2l0b3IpXG4gICAgcmV0dXJuIHZpc2l0b3IuZ2V0QVNUKCk7XG4gIH1cblxuICBnZXQgdHJlZSAoKTogVHJlZVNpdHRlci5UcmVlIHtcbiAgICByZXR1cm4gdGhpcy50cmVlXztcbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/build/src/lang/typescript/properties.js b/build/src/lang/typescript/properties.js index 446e17b..4b4df35 100644 --- a/build/src/lang/typescript/properties.js +++ b/build/src/lang/typescript/properties.js @@ -1,3 +1,3 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvcHJvcGVydGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBUeXBlU2NyaXB0UHJvcGVydGllcyB7XHJcbiAgZXhwb3J0czogUGFydGlhbDxUeXBlU2NyaXB0RXhwb3J0cz5cclxuICBpbmhlcml0YW5jZTogUGFydGlhbDxUeXBlU2NyaXB0SW5oZXJpdGFuY2U+XHJcbiAgbmFtZXNwYWNlOiBib29sZWFuLFxyXG4gIG1vZHVsZTogYm9vbGVhblxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVTY3JpcHRFeHBvcnRzIHtcclxuICBleHBvcnQ6IGJvb2xlYW4sXHJcbiAgZGVmYXVsdDogYm9vbGVhblxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVTY3JpcHRJbmhlcml0YW5jZSB7XHJcbiAgZXh0ZW5kczogYm9vbGVhbixcclxuICBpbXBsZW1lbnRzOiBib29sZWFuXHJcbn0iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvcHJvcGVydGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBUeXBlU2NyaXB0UHJvcGVydGllcyB7XG4gIGV4cG9ydHM6IFBhcnRpYWw8VHlwZVNjcmlwdEV4cG9ydHM+XG4gIGluaGVyaXRhbmNlOiBQYXJ0aWFsPFR5cGVTY3JpcHRJbmhlcml0YW5jZT5cbiAgbmFtZXNwYWNlOiBib29sZWFuLFxuICBtb2R1bGU6IGJvb2xlYW5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBUeXBlU2NyaXB0RXhwb3J0cyB7XG4gIGV4cG9ydDogYm9vbGVhbixcbiAgZGVmYXVsdDogYm9vbGVhblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVTY3JpcHRJbmhlcml0YW5jZSB7XG4gIGV4dGVuZHM6IGJvb2xlYW4sXG4gIGltcGxlbWVudHM6IGJvb2xlYW5cbn0iXX0= \ No newline at end of file diff --git a/build/src/lang/typescript/visitor.js b/build/src/lang/typescript/visitor.js index 49149f4..5d4add1 100644 --- a/build/src/lang/typescript/visitor.js +++ b/build/src/lang/typescript/visitor.js @@ -209,7 +209,7 @@ class TypeScriptVisitor { if (match_1.default(node, 'expression_statement')) { return this.visitExpressionStatement(node, properties); } - if (match_1.default(node, 'function')) { + if (match_1.default(node, 'function') || match_1.default(node, 'method_definition')) { _.remove(children, child => match_1.default(child, 'statement_block')); return ast_1.createASTNode(this.source, node, this.visitChildren(children), properties); } @@ -264,7 +264,6 @@ class TypeScriptVisitor { * Returns only the comments from a node's children. */ filterType(node, type) { - // console.time('filterType') let children = []; for (let i = 0; i < node.children.length; i++) { const child = node.children[i]; @@ -272,7 +271,6 @@ class TypeScriptVisitor { children.push(child); } } - // console.timeEnd('filterType') return children; } getAST() { @@ -280,4 +278,4 @@ class TypeScriptVisitor { } } exports.TypeScriptVisitor = TypeScriptVisitor; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGlEQUF1RTtBQUN2RSxpREFBOEM7QUFFOUMsNEJBQTRCO0FBQzVCLHlDQUFpRDtBQUNqRCw2Q0FBc0M7QUFJdEMsdUNBQThDO0FBRzlDOztHQUVHO0FBQ0gsTUFBYSxpQkFBaUI7SUFHNUIsWUFBWSxNQUFjO1FBRmxCLFFBQUcsR0FBYyxFQUFFLENBQUE7UUFxRTNCLGVBQWU7UUFFZixjQUFTLEdBQUcsQ0FDVixJQUFnQixFQUNoQixVQUEwQyxFQUMxQyxFQUFFO1lBQ0YsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNqQixLQUFLLFNBQVM7b0JBQ1osSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNuQyxNQUFNO2dCQUNSLEtBQUssU0FBUztvQkFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pDLEtBQUssU0FBUyxDQUFDO2dCQUNmLEtBQUssT0FBTztvQkFDVixhQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO29CQUM5RCxNQUFNO2dCQUNSO29CQUVFLCtCQUErQjtvQkFFL0IsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUNaLFlBQVksRUFDWixtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFDM0QsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQ3pFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQ3RFLG1CQUFtQixFQUFFLFlBQVksRUFDakMsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixrQkFBa0Is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IGZyb20gXCIuLi8uLi91dGlscy9jb21tZW50XCI7XHJcbmltcG9ydCB7IHNpYmxpbmcgfSBmcm9tIFwiLi4vLi4vdXRpbHMvc2libGluZ1wiO1xyXG5pbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XHJcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcclxuaW1wb3J0IGxvZywgeyBFcnJvclR5cGUgfSBmcm9tIFwiLi4vLi4vdXRpbHMvbG9nXCI7XHJcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi4vLi4vdXRpbHMvbWF0Y2hcIjtcclxuaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9Tb3VyY2VcIjtcclxuaW1wb3J0IFZpc2l0b3IgZnJvbSBcIi4uL2NvbW1vbi92aXNpdG9yXCI7XHJcbmltcG9ydCBBU1ROb2RlIGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL0FTVE5vZGVcIjtcclxuaW1wb3J0IHsgY3JlYXRlQVNUTm9kZSB9IGZyb20gXCIuLi9jb21tb24vYXN0XCI7XHJcbmltcG9ydCB7IFR5cGVTY3JpcHRQcm9wZXJ0aWVzLCBUeXBlU2NyaXB0SW5oZXJpdGFuY2UgfSBmcm9tIFwiLi9wcm9wZXJ0aWVzXCI7XHJcblxyXG4vKipcclxuICogQSBjbGFzcyB0aGF0IHZpc2l0cyBBU1ROb2RlcyBmcm9tIGEgVHlwZVNjcmlwdCB0cmVlLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFR5cGVTY3JpcHRWaXNpdG9yIGltcGxlbWVudHMgVmlzaXRvciB7XHJcbiAgcHJpdmF0ZSBhc3Q6IEFTVE5vZGVbXSA9IFtdXHJcbiAgcHJpdmF0ZSBzb3VyY2U6IFNvdXJjZVxyXG4gIGNvbnN0cnVjdG9yKHNvdXJjZTogU291cmNlKSB7XHJcbiAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgd2hldGhlciBhIG5vZGUgaGFzIGluaGVyaXRhbmNlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoYXNJbmhlcml0YW5jZShub2RlOiBTeW50YXhOb2RlKSB7XHJcbiAgICBsZXQgaW5oZXJpdHMgPSBmYWxzZTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XHJcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ2V4dGVuZHMnLCAnaW1wbGVtZW50cycpKSB7XHJcbiAgICAgICAgaW5oZXJpdHMgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaW5oZXJpdHNcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBub2RlJ3MgaW5oZXJpdGFuY2UgdHlwZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0SW5oZXJpdGFuY2VUeXBlKG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XHJcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ2V4dGVuZHMnKSkge1xyXG4gICAgICAgIHJldHVybiAnZXh0ZW5kcyc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ2ltcGxlbWVudHMnKSkge1xyXG4gICAgICAgIHJldHVybiAnaW1wbGVtZW50cyc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgd2hldGhlciBhbiBleHBvcnQgaXMgZGVmYXVsdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgaGFzRGVmYXVsdEV4cG9ydChub2RlOiBTeW50YXhOb2RlKTogYm9vbGVhbiB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xyXG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdkZWZhdWx0JykpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBvbmx5IHRoZSBjb21tZW50cyBmcm9tIGEgbm9kZSdzIGNoaWxkcmVuLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZmlsdGVyVHlwZShub2RlOiBTeW50YXhOb2RlLCB0eXBlOiBzdHJpbmcpOiBTeW50YXhOb2RlW10ge1xyXG4gICAgLy8gY29uc29sZS50aW1lKCdmaWx0ZXJUeXBlJylcclxuICAgIGxldCBjaGlsZHJlbjogU3ludGF4Tm9kZVtdID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xyXG4gICAgICBpZiAobWF0Y2goY2hpbGQsIHR5cGUpKSB7XHJcbiAgICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGNvbnNvbGUudGltZUVuZCgnZmlsdGVyVHlwZScpXHJcbiAgICByZXR1cm4gY2hpbGRyZW47XHJcbiAgfVxyXG5cclxuICBnZXRBU1QoKTogQVNUTm9kZVtdIHtcclxuICAgIHJldHVybiB0aGlzLmFzdDtcclxuICB9XHJcblxyXG4gIC8qIFZpc2l0b3JzICAqL1xyXG5cclxuICB2aXNpdE5vZGUgPSAoXHJcbiAgICBub2RlOiBTeW50YXhOb2RlLFxyXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8VHlwZVNjcmlwdFByb3BlcnRpZXM+XHJcbiAgKSA9PiB7XHJcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xyXG4gICAgICBjYXNlICdwcm9ncmFtJzpcclxuICAgICAgICB0aGlzLmFzdCA9IHRoaXMudmlzaXRQcm9ncmFtKG5vZGUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdjb21tZW50JzpcclxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdENvbW1lbnQobm9kZSk7XHJcbiAgICAgIGNhc2UgJ01JU1NJTkcnOlxyXG4gICAgICBjYXNlICdFUlJPUic6XHJcbiAgICAgICAgbG9nLnJlcG9ydCh0aGlzLnNvdXJjZSwgbm9kZSwgRXJyb3JUeXBlLlRyZWVTaXR0ZXJQYXJzZUVycm9yKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuXHJcbiAgICAgICAgLyogTWF0Y2ggb3RoZXIgbm9uLXRlcm1pbmFscyAqL1xyXG5cclxuICAgICAgICBpZiAobWF0Y2gobm9kZSxcclxuICAgICAgICAgICdjb25zdHJhaW50JyxcclxuICAgICAgICAgICdmb3JtYWxfcGFyYW1ldGVycycsICdyZXF1aXJlZF9wYXJhbWV0ZXInLCAncmVzdF9wYXJhbWV0ZXInLFxyXG4gICAgICAgICAgJ3R5cGVfaWRlbnRpZmllcicsICd0eXBlX3BhcmFtZXRlcnMnLCAndHlwZV9wYXJhbWV0ZXInLCAndHlwZV9hbm5vdGF0aW9uJyxcclxuICAgICAgICAgICdvYmplY3RfdHlwZScsICdwcmVkZWZpbmVkX3R5cGUnLCAncGFyZW50aGVzaXplZF90eXBlJywgJ2xpdGVyYWxfdHlwZScsXHJcbiAgICAgICAgICAnaW50ZXJzZWN0aW9uX3R5cGUnLCAndW5pb25fdHlwZScsXHJcbiAgICAgICAgICAnY2xhc3NfYm9keScsXHJcbiAgICAgICAgICAnZXh0ZW5kc19jbGF1c2UnLFxyXG4gICAgICAgICAgJ3VuYXJ5X2V4cHJlc3Npb24nLCAnYmluYXJ5X2V4cHJlc3Npb24nLCAnbWVtYmVyX2V4cHJlc3Npb24nLFxyXG4gICAgICAgICAgJ3N0YXRlbWVudF9ibG9jaycsICdyZXR1cm5fc3RhdGVtZW50JywgJ2V4cG9ydF9zdGF0ZW1lbnQnLCAnZXhwcmVzc2lvbl9zdGF0ZW1lbnQnLFxyXG4gICAgICAgICAgLy8gQSBjYWxsX3NpZ25hdHVyZSBjYW4gYWxzbyBiZSBhIG5vbi1jb250ZXh0dWFsIG5vZGVcclxuICAgICAgICAgICdjYWxsX3NpZ25hdHVyZScsXHJcbiAgICAgICAgICAnaW50ZXJuYWxfbW9kdWxlJyxcclxuICAgICAgICAgICd2YXJpYWJsZV9kZWNsYXJhdG9yJyxcclxuICAgICAgICAgICdvYmplY3QnXHJcbiAgICAgICAgKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMudmlzaXROb25UZXJtaW5hbChub2RlLCBwcm9wZXJ0aWVzKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyogTWF0Y2ggdGVybWluYWxzICovXHJcbiAgICAgICAgaWYgKG1hdGNoKG5vZGUsXHJcbiAgICAgICAgICAnaWRlbnRpZmllcicsICdleHRlbmRzJywgJ3Byb3BlcnR5X2lkZW50aWZpZXInLCAnYWNjZXNzaWJpbGl0eV9tb2RpZmllcicsXHJcbiAgICAgICAgICAnc3RyaW5nJywgJ3ZvaWQnLCAnYm9vbGVhbicsICdudWxsJywgJ3VuZGVmaW5lZCcsICdudW1iZXInLCAncmV0dXJuJyxcclxuICAgICAgICAgICdnZXQnLCAnZnVuY3Rpb24nLCAnbmFtZXNwYWNlJywgJ2NvbnN0J1xyXG4gICAgICAgICkpIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLnZpc2l0VGVybWluYWwobm9kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxvZy5yZXBvcnQodGhpcy5zb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFlldFN1cHBvcnRlZCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB2aXNpdENoaWxkcmVuID0gKG5vZGVzOiBTeW50YXhOb2RlW10pOiBBU1ROb2RlW10gPT4ge1xyXG4gICAgbGV0IGNoaWxkcmVuOiBBU1ROb2RlW10gPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xyXG4gICAgICBpZiAoIW5vZGUudHlwZS5tYXRjaCgvWzw+KCl7fSw6O1xcW1xcXSZ8PVxcK1xcLVxcKlxcL10vKSAmJiBub2RlLnR5cGUgIT09ICcuLi4nKSB7XHJcbiAgICAgICAgY29uc3QgY2hpbGQgPSB0aGlzLnZpc2l0Tm9kZShub2RlKTtcclxuICAgICAgICBpZiAoY2hpbGQpIGNoaWxkcmVuLnB1c2goY2hpbGQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2hpbGRyZW47XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHZpc2l0UHJvZ3JhbSA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZVtdID0+IHtcclxuICAgIGxldCB2aXNpdGVkID0ge30sXHJcbiAgICAgIGdldFN0YXJ0TG9jYXRpb24gPSAobjogQVNUTm9kZSkgPT4gYCR7bi5sb2NhdGlvbi5yb3cuc3RhcnR9OiR7bi5sb2NhdGlvbi5jb2x1bW4uc3RhcnR9YDtcclxuICAgIC8vIEEgcHJvZ3JhbSBjYW4gaGF2ZSBtb2R1bGVzLCBuYW1lc3BhY2VzLCBjb21tZW50cyBhcyBpdHMgY2hpbGRyZW5cclxuICAgIC8vIFRoZSBmaXJzdCBzdGVwIGlzIHRvIHBhcnNlIGFsbCB0aGUgY29tbWVudHMgaW4gdGhlIHJvb3Qgbm9kZVxyXG4gICAgbGV0IGNvbW1lbnRzID0gdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShub2RlLCAnY29tbWVudCcpKTtcclxuICAgIC8vIFBhcnNlIHRoZSBuYW1lc3BhY2VzIGluIGV4cHJlc3Npb25fc3RhdGVtZW50XHJcbiAgICBsZXQgbmFtZXNwYWNlcyA9IHRoaXMudmlzaXRDaGlsZHJlbih0aGlzLmZpbHRlclR5cGUobm9kZSwgJ2V4cHJlc3Npb25fc3RhdGVtZW50JykpO1xyXG4gICAgLy8gUGFyc2UgdGhlIGV4cG9ydCBzdGF0ZW1lbnRzIGluIHRoZSByb290IG5vZGVcclxuICAgIGxldCBleHBvcnRzID0gdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShub2RlLCAnZXhwb3J0X3N0YXRlbWVudCcpKTtcclxuXHJcbiAgICAvLyBHZXQgdGhlIHZpc2l0ZWQgY29udGV4dCBub2Rlc1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21tZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBjb21tZW50ID0gY29tbWVudHNbaV07XHJcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBjb21tZW50O1xyXG4gICAgICB2aXNpdGVkW2dldFN0YXJ0TG9jYXRpb24oY29udGV4dCldID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZW1vdmUgdGhlIHZpc2l0ZWQgbm9kZXMgZnJvbSBuYW1lc3BhY2VzIGFycmF5XHJcbiAgICBfLnJlbW92ZShuYW1lc3BhY2VzLCB4ID0+IHZpc2l0ZWRbZ2V0U3RhcnRMb2NhdGlvbih4KV0pO1xyXG5cclxuICAgIC8vIEV4cG9ydHMgYXJlIG9kZGJhbGxzIHNpbmNlIHNvbWUgZXhwb3J0cyBtYXkgcmVmZXJlbmNlXHJcbiAgICAvLyBhIHR5cGUvbm9kZSB0aGF0IG1heSBoYXZlIGJlZW4gY29tbWVudGVkLlxyXG4gICAgLy8gV2UnbGwgZmlyc3QgbmVlZCB0byBmaWx0ZXIgdGhlIG9uZXMgd2UgaGF2ZSB2aXNpdGVkXHJcbiAgICBfLnJlbW92ZShleHBvcnRzLCB4ID0+IHZpc2l0ZWRbZ2V0U3RhcnRMb2NhdGlvbih4KV0pO1xyXG5cclxuICAgIC8vIEZyb20gdGhlIG9uZXMgd2UgaGF2ZSBub3QgdmlzaXRlZCwgd2UnbGwgbmVlZCB0byBtb2RpZnlcclxuICAgIC8vIHRoZSBub2RlIHByb3BlcnRpZXMgb2YgZWFjaCBjb250ZXh0IGluIGEgY29tbWVudCBub2RlIHRoYXRcclxuICAgIC8vIG1hdGNoZXMgdGhlIG9uZXMgd2UgaGF2ZSBub3QgdmlzaXRlZC5cclxuICAgIGNvbnN0IG1hdGNoZWQgPSB7fTtcclxuICAgIGNvbW1lbnRzID0gXy5jb21wYWN0KFxyXG4gICAgICBjb21tZW50cy5tYXAoY29tbWVudCA9PiB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBvcnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBjb25zdCBleHBvcnRfID0gZXhwb3J0c1tpXTtcclxuICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSBjb21tZW50LmNvbnRleHQ7XHJcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgY29udGV4dCAmJiBqIDwgY29udGV4dC5jaGlsZHJlbi5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICBpZiAoY29udGV4dC5jaGlsZHJlbltpXSAmJiBjb250ZXh0LmNoaWxkcmVuW2ldLnR5cGUgPT09IGV4cG9ydF8udHlwZSkge1xyXG4gICAgICAgICAgICAgIG1hdGNoZWRbZ2V0U3RhcnRMb2NhdGlvbihleHBvcnRfKV0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGNvbW1lbnQuY29udGV4dC5wcm9wZXJ0aWVzID0gT2JqZWN0LmFzc2lnbihcclxuICAgICAgICAgICAgICAgIGNvbW1lbnQuY29udGV4dC5wcm9wZXJ0aWVzIHx8IHt9LFxyXG4gICAgICAgICAgICAgICAgZXhwb3J0Xy5wcm9wZXJ0aWVzXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29tbWVudDtcclxuICAgICAgfSkpO1xyXG5cclxuICAgIC8vIFJlbW92ZWQgdGhlIG1hdGNoZWQgZXhwb3J0c1xyXG4gICAgXy5yZW1vdmUoZXhwb3J0cywgeCA9PiBtYXRjaGVkW2dldFN0YXJ0TG9jYXRpb24oeCldKVxyXG5cclxuICAgIHJldHVybiBbXS5jb25jYXQoY29tbWVudHMpLmNvbmNhdChuYW1lc3BhY2VzKS5jb25jYXQoZXhwb3J0cyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHZpc2l0Q29tbWVudCA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZSA9PiB7XHJcbiAgICBpZiAoaXNKYXZhRG9jQ29tbWVudCh0aGlzLnNvdXJjZSwgbm9kZSkgJiYgIWlzTGVnYWxDb21tZW50KHRoaXMuc291cmNlLCBub2RlKSkge1xyXG4gICAgICBjb25zdCBuZXh0U2libGluZyA9IHNpYmxpbmcobm9kZSk7XHJcbiAgICAgIGlmIChuZXh0U2libGluZykge1xyXG4gICAgICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q29udGV4dChuZXh0U2libGluZywge30pLCB0cnVlKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWaXNpdCB0aGUgY29udGV4dHVhbCBub2RlXHJcbiAgICogXHJcbiAgICogIyBSZW1hcmtcclxuICAgKiBcclxuICAgKiBBIG5vZGUgaXMgY29uc2lkZXJlZCBjb250ZXh0dWFsIHdoZW4gYSBjb21tZW50IGlzIHZpc2l0ZWQgYW5kIHRoZSBub2RlIGlzIGl0cyBzaWJsaW5nLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgdmlzaXRDb250ZXh0ID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPFR5cGVTY3JpcHRQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xyXG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcclxuICAgICAgY2FzZSAnZXhwb3J0X3N0YXRlbWVudCc6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRFeHBvcnRTdGF0ZW1lbnQobm9kZSwgcHJvcGVydGllcyk7XHJcbiAgICAgIGNhc2UgJ2V4cHJlc3Npb25fc3RhdGVtZW50JzpcclxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQobm9kZSwgcHJvcGVydGllcyk7XHJcbiAgICAgIGNhc2UgJ2NsYXNzJzpcclxuICAgICAgY2FzZSAnaW50ZXJmYWNlX2RlY2xhcmF0aW9uJzpcclxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdENsYXNzT3JJbnRlcmZhY2Uobm9kZSwgcHJvcGVydGllcylcclxuICAgICAgY2FzZSAnZnVuY3Rpb24nOlxyXG4gICAgICBjYXNlICdjYWxsX3NpZ25hdHVyZSc6XHJcbiAgICAgIGNhc2UgJ21ldGhvZF9zaWduYXR1cmUnOlxyXG4gICAgICBjYXNlICdwcm9wZXJ0eV9zaWduYXR1cmUnOlxyXG4gICAgICBjYXNlICdwdWJsaWNfZmllbGRfZGVmaW5pdGlvbic6XHJcbiAgICAgIGNhc2UgJ21ldGhvZF9kZWZpbml0aW9uJzpcclxuICAgICAgY2FzZSAnbGV4aWNhbF9kZWNsYXJhdGlvbic6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXROb25UZXJtaW5hbChub2RlLCBwcm9wZXJ0aWVzKTtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyogU3RhdGVtZW50cyAqL1xyXG5cclxuICBwcml2YXRlIHZpc2l0RXhwb3J0U3RhdGVtZW50ID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPFR5cGVTY3JpcHRQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xyXG4gICAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiwgZGVmYXVsdEV4cG9ydCA9IGZhbHNlO1xyXG4gICAgLy8gUmVtb3ZlICdleHBvcnQnIHNpbmNlIGl0J3MgYWx3YXlzIGZpcnN0IGluIHRoZSBhcnJheVxyXG4gICAgY2hpbGRyZW4uc2hpZnQoKTtcclxuICAgIGlmICh0aGlzLmhhc0RlZmF1bHRFeHBvcnQobm9kZSkpIHtcclxuICAgICAgZGVmYXVsdEV4cG9ydCA9IHRydWU7XHJcbiAgICAgIC8vIFJlbW92ZSAnZGVmYXVsdCcgZXhwb3J0XHJcbiAgICAgIGNoaWxkcmVuLnNoaWZ0KCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuLnNoaWZ0KCk7XHJcbiAgICByZXR1cm4gdGhpcy52aXNpdE5vZGUoY2hpbGQsIHsgZXhwb3J0czogeyBleHBvcnQ6IHRydWUsIGRlZmF1bHQ6IGRlZmF1bHRFeHBvcnQgfSB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50ID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM6IFBhcnRpYWw8VHlwZVNjcmlwdFByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XHJcbiAgICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xyXG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbi5zaGlmdCgpO1xyXG5cclxuICAgIGlmIChtYXRjaChjaGlsZCwgJ2ludGVybmFsX21vZHVsZScpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnZpc2l0SW50ZXJuYWxNb2R1bGUoY2hpbGQsIHByb3BlcnRpZXMpXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG1hdGNoKGNoaWxkLCAnZnVuY3Rpb24nKSkge1xyXG4gICAgICBpZiAocHJvcGVydGllcykgcmV0dXJuIHRoaXMudmlzaXRDb250ZXh0KGNoaWxkLCBwcm9wZXJ0aWVzKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy52aXNpdE5vblRlcm1pbmFsKGNoaWxkKVxyXG4gIH1cclxuXHJcbiAgLyogTW9kdWxlcyAqL1xyXG5cclxuICBwcml2YXRlIHZpc2l0SW50ZXJuYWxNb2R1bGUgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8VHlwZVNjcmlwdFByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XHJcbiAgICBsZXQgY2hpbGRyZW46IEFTVE5vZGVbXSA9IG5vZGUuY2hpbGRyZW4ubWFwKGNoaWxkID0+IHtcclxuICAgICAgaWYgKG1hdGNoKGNoaWxkLCAnc3RhdGVtZW50X2Jsb2NrJykpIHtcclxuICAgICAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShjaGlsZCwgJ2NvbW1lbnQnKSkpXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMudmlzaXROb2RlKGNoaWxkKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIGNoaWxkcmVuLCBPYmplY3QuYXNzaWduKHByb3BlcnRpZXMgfHwge30sIHsgbmFtZXNwYWNlOiB0cnVlIH0pKTtcclxuICB9XHJcblxyXG5cclxuICAvKiBEZWNsYXJhdGlvbnMgKi9cclxuXHJcbiAgcHJpdmF0ZSB2aXNpdENsYXNzT3JJbnRlcmZhY2UgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8VHlwZVNjcmlwdFByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XHJcbiAgICAvLyBTaW5jZSAnaW50ZXJmYWNlJyBvciAnY2xhc3MnIGlzIGFsd2F5cyBmaXJzdCBpbiB0aGUgYXJyYXlcclxuICAgIC8vIHdlJ2xsIG5lZWQgdG8gcmVtb3ZlIGl0IGZyb20gdGhlIGFycmF5LlxyXG4gICAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcclxuICAgIGNvbnN0IGludGVyZmFjZV8gPSBjaGlsZHJlbi5zaGlmdCgpO1xyXG4gICAgbGV0IGV4dGVuZHNfID0gZmFsc2UsIGltcGxlbWVudHNfID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5oYXNJbmhlcml0YW5jZShub2RlKSkge1xyXG4gICAgICBjb25zdCBpbmhlcml0YW5jZSA9IHRoaXMuZ2V0SW5oZXJpdGFuY2VUeXBlKG5vZGUpXHJcbiAgICAgIGV4dGVuZHNfID0gaW5oZXJpdGFuY2UgPT09ICdleHRlbmRzJztcclxuICAgICAgaW1wbGVtZW50c18gPSBpbmhlcml0YW5jZSA9PT0gJ2ltcGxlbWVudHMnO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG5vZGVfID0gY3JlYXRlQVNUTm9kZShcclxuICAgICAgdGhpcy5zb3VyY2UsXHJcbiAgICAgIG5vZGUsXHJcbiAgICAgIHRoaXMudmlzaXRDaGlsZHJlbihjaGlsZHJlbiksXHJcbiAgICAgIE9iamVjdC5hc3NpZ24ocHJvcGVydGllcyB8fCB7fSwge1xyXG4gICAgICAgIGluaGVyaXRhbmNlOiB7XHJcbiAgICAgICAgICBpbXBsZW1lbnRzOiBpbXBsZW1lbnRzXyxcclxuICAgICAgICAgIGV4dGVuZHM6IGV4dGVuZHNfXHJcbiAgICAgICAgfSBhcyBUeXBlU2NyaXB0SW5oZXJpdGFuY2VcclxuICAgICAgfSkpO1xyXG5cclxuICAgIGlmIChtYXRjaChub2RlLCAnY2xhc3MnKSkge1xyXG4gICAgICByZXR1cm4gbm9kZV87XHJcbiAgICB9XHJcbiAgICAvLyBPdmVyd3JpdGUgdGhlIG5vZGUgdHlwZSBmcm9tICdpbnRlcmZhY2VfZGVjbGFyYXRpb24nIHRvICdpbnRlcmZhY2UnXHJcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihub2RlXywgeyB0eXBlOiBpbnRlcmZhY2VfLnR5cGUgfSlcclxuICB9XHJcblxyXG4gIC8qIE5vbi10ZXJtaW5hbHMgKi9cclxuXHJcbiAgcHJpdmF0ZSB2aXNpdE5vblRlcm1pbmFsID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPFR5cGVTY3JpcHRQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xyXG4gICAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcclxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2VzIHdoZXJlIHNvbWUgbm9uLXRlcm1pbmFsc1xyXG4gICAgLy8gY29udGFpbiBjb21tZW50cyB3aGljaCBpcyB3aGF0IHdlIGNhcmUgYWJvdXRcclxuICAgIGlmIChtYXRjaChub2RlLCAnY2xhc3NfYm9keScsICdvYmplY3RfdHlwZScpKSB7XHJcbiAgICAgIGNoaWxkcmVuID0gdGhpcy5maWx0ZXJUeXBlKG5vZGUsICdjb21tZW50Jyk7XHJcbiAgICB9XHJcbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBleHBvcnQgc3RhdGVtZW50cyBoYXZlIG5vZGUgcHJvcGVydGllc1xyXG4gICAgaWYgKG1hdGNoKG5vZGUsICdleHBvcnRfc3RhdGVtZW50JykpIHtcclxuICAgICAgcmV0dXJuIHRoaXMudmlzaXRFeHBvcnRTdGF0ZW1lbnQobm9kZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZXMgd2hlcmUgYW4gaW50ZXJuYWwgbW9kdWxlIGNvbnRhaW5zIG90aGVyIG5vZGVzXHJcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2ludGVybmFsX21vZHVsZScpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnZpc2l0SW50ZXJuYWxNb2R1bGUobm9kZSwgcHJvcGVydGllcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZXMgd2hlcmUgYW4gaW50ZXJtYWxfbW9kdWxlIGNhbiBleGlzdCBpbiBhbiBleHByZXNzaW9uX3N0YXRlbWVudFxyXG4gICAgaWYgKG1hdGNoKG5vZGUsICdleHByZXNzaW9uX3N0YXRlbWVudCcpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChub2RlLCBwcm9wZXJ0aWVzKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2Z1bmN0aW9uJykpIHtcclxuICAgICAgXy5yZW1vdmUoY2hpbGRyZW4sIGNoaWxkID0+IG1hdGNoKGNoaWxkLCAnc3RhdGVtZW50X2Jsb2NrJykpXHJcbiAgICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q2hpbGRyZW4oY2hpbGRyZW4pLCBwcm9wZXJ0aWVzKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENoaWxkcmVuKGNoaWxkcmVuKSwgcHJvcGVydGllcyk7XHJcbiAgfVxyXG5cclxuICAvKiBUZXJtaW5hbHMgKi9cclxuXHJcbiAgcHJpdmF0ZSB2aXNpdFRlcm1pbmFsID0gKG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlID0+IHtcclxuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlKVxyXG4gIH1cclxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGlEQUF1RTtBQUN2RSxpREFBOEM7QUFFOUMsNEJBQTRCO0FBQzVCLHlDQUFpRDtBQUNqRCw2Q0FBc0M7QUFJdEMsdUNBQThDO0FBRzlDOztHQUVHO0FBQ0gsTUFBYSxpQkFBaUI7SUFHNUIsWUFBWSxNQUFjO1FBRmxCLFFBQUcsR0FBYyxFQUFFLENBQUE7UUFtRTNCLGVBQWU7UUFFZixjQUFTLEdBQUcsQ0FDVixJQUFnQixFQUNoQixVQUEwQyxFQUMxQyxFQUFFO1lBQ0YsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNqQixLQUFLLFNBQVM7b0JBQ1osSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNuQyxNQUFNO2dCQUNSLEtBQUssU0FBUztvQkFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pDLEtBQUssU0FBUyxDQUFDO2dCQUNmLEtBQUssT0FBTztvQkFDVixhQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO29CQUM5RCxNQUFNO2dCQUNSO29CQUVFLCtCQUErQjtvQkFFL0IsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUNaLFlBQVksRUFDWixtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFDM0QsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQ3pFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQ3RFLG1CQUFtQixFQUFFLFlBQVksRUFDakMsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixrQkFBa0Is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YWxDb21tZW50IH0gZnJvbSBcIi4uLy4uL3V0aWxzL2NvbW1lbnRcIjtcbmltcG9ydCB7IHNpYmxpbmcgfSBmcm9tIFwiLi4vLi4vdXRpbHMvc2libGluZ1wiO1xuaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGxvZywgeyBFcnJvclR5cGUgfSBmcm9tIFwiLi4vLi4vdXRpbHMvbG9nXCI7XG5pbXBvcnQgbWF0Y2ggZnJvbSBcIi4uLy4uL3V0aWxzL21hdGNoXCI7XG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuaW1wb3J0IFZpc2l0b3IgZnJvbSBcIi4uL2NvbW1vbi92aXNpdG9yXCI7XG5pbXBvcnQgQVNUTm9kZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9BU1ROb2RlXCI7XG5pbXBvcnQgeyBjcmVhdGVBU1ROb2RlIH0gZnJvbSBcIi4uL2NvbW1vbi9hc3RcIjtcbmltcG9ydCB7IFR5cGVTY3JpcHRQcm9wZXJ0aWVzLCBUeXBlU2NyaXB0SW5oZXJpdGFuY2UgfSBmcm9tIFwiLi9wcm9wZXJ0aWVzXCI7XG5cbi8qKlxuICogQSBjbGFzcyB0aGF0IHZpc2l0cyBBU1ROb2RlcyBmcm9tIGEgVHlwZVNjcmlwdCB0cmVlLlxuICovXG5leHBvcnQgY2xhc3MgVHlwZVNjcmlwdFZpc2l0b3IgaW1wbGVtZW50cyBWaXNpdG9yIHtcbiAgcHJpdmF0ZSBhc3Q6IEFTVE5vZGVbXSA9IFtdXG4gIHByaXZhdGUgc291cmNlOiBTb3VyY2VcbiAgY29uc3RydWN0b3Ioc291cmNlOiBTb3VyY2UpIHtcbiAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBub2RlIGhhcyBpbmhlcml0YW5jZVxuICAgKi9cbiAgcHJpdmF0ZSBoYXNJbmhlcml0YW5jZShub2RlOiBTeW50YXhOb2RlKSB7XG4gICAgbGV0IGluaGVyaXRzID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdleHRlbmRzJywgJ2ltcGxlbWVudHMnKSkge1xuICAgICAgICBpbmhlcml0cyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbmhlcml0c1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBub2RlJ3MgaW5oZXJpdGFuY2UgdHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRJbmhlcml0YW5jZVR5cGUobm9kZTogU3ludGF4Tm9kZSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgaWYgKG1hdGNoKGNoaWxkLCAnZXh0ZW5kcycpKSB7XG4gICAgICAgIHJldHVybiAnZXh0ZW5kcyc7XG4gICAgICB9XG5cbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ2ltcGxlbWVudHMnKSkge1xuICAgICAgICByZXR1cm4gJ2ltcGxlbWVudHMnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gZXhwb3J0IGlzIGRlZmF1bHRcbiAgICovXG4gIHByaXZhdGUgaGFzRGVmYXVsdEV4cG9ydChub2RlOiBTeW50YXhOb2RlKTogYm9vbGVhbiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdkZWZhdWx0JykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG9ubHkgdGhlIGNvbW1lbnRzIGZyb20gYSBub2RlJ3MgY2hpbGRyZW4uXG4gICAqL1xuICBwcml2YXRlIGZpbHRlclR5cGUobm9kZTogU3ludGF4Tm9kZSwgdHlwZTogc3RyaW5nKTogU3ludGF4Tm9kZVtdIHtcbiAgICBsZXQgY2hpbGRyZW46IFN5bnRheE5vZGVbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgaWYgKG1hdGNoKGNoaWxkLCB0eXBlKSkge1xuICAgICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG5cbiAgZ2V0QVNUKCk6IEFTVE5vZGVbXSB7XG4gICAgcmV0dXJuIHRoaXMuYXN0O1xuICB9XG5cbiAgLyogVmlzaXRvcnMgICovXG5cbiAgdmlzaXROb2RlID0gKFxuICAgIG5vZGU6IFN5bnRheE5vZGUsXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8VHlwZVNjcmlwdFByb3BlcnRpZXM+XG4gICkgPT4ge1xuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICBjYXNlICdwcm9ncmFtJzpcbiAgICAgICAgdGhpcy5hc3QgPSB0aGlzLnZpc2l0UHJvZ3JhbShub2RlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRDb21tZW50KG5vZGUpO1xuICAgICAgY2FzZSAnTUlTU0lORyc6XG4gICAgICBjYXNlICdFUlJPUic6XG4gICAgICAgIGxvZy5yZXBvcnQodGhpcy5zb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5UcmVlU2l0dGVyUGFyc2VFcnJvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcblxuICAgICAgICAvKiBNYXRjaCBvdGhlciBub24tdGVybWluYWxzICovXG5cbiAgICAgICAgaWYgKG1hdGNoKG5vZGUsXG4gICAgICAgICAgJ2NvbnN0cmFpbnQnLFxuICAgICAgICAgICdmb3JtYWxfcGFyYW1ldGVycycsICdyZXF1aXJlZF9wYXJhbWV0ZXInLCAncmVzdF9wYXJhbWV0ZXInLFxuICAgICAgICAgICd0eXBlX2lkZW50aWZpZXInLCAndHlwZV9wYXJhbWV0ZXJzJywgJ3R5cGVfcGFyYW1ldGVyJywgJ3R5cGVfYW5ub3RhdGlvbicsXG4gICAgICAgICAgJ29iamVjdF90eXBlJywgJ3ByZWRlZmluZWRfdHlwZScsICdwYXJlbnRoZXNpemVkX3R5cGUnLCAnbGl0ZXJhbF90eXBlJyxcbiAgICAgICAgICAnaW50ZXJzZWN0aW9uX3R5cGUnLCAndW5pb25fdHlwZScsXG4gICAgICAgICAgJ2NsYXNzX2JvZHknLFxuICAgICAgICAgICdleHRlbmRzX2NsYXVzZScsXG4gICAgICAgICAgJ3VuYXJ5X2V4cHJlc3Npb24nLCAnYmluYXJ5X2V4cHJlc3Npb24nLCAnbWVtYmVyX2V4cHJlc3Npb24nLFxuICAgICAgICAgICdzdGF0ZW1lbnRfYmxvY2snLCAncmV0dXJuX3N0YXRlbWVudCcsICdleHBvcnRfc3RhdGVtZW50JywgJ2V4cHJlc3Npb25fc3RhdGVtZW50JyxcbiAgICAgICAgICAvLyBBIGNhbGxfc2lnbmF0dXJlIGNhbiBhbHNvIGJlIGEgbm9uLWNvbnRleHR1YWwgbm9kZVxuICAgICAgICAgICdjYWxsX3NpZ25hdHVyZScsXG4gICAgICAgICAgJ2ludGVybmFsX21vZHVsZScsXG4gICAgICAgICAgJ3ZhcmlhYmxlX2RlY2xhcmF0b3InLFxuICAgICAgICAgICdvYmplY3QnXG4gICAgICAgICkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdE5vblRlcm1pbmFsKG5vZGUsIHByb3BlcnRpZXMpXG4gICAgICAgIH1cblxuICAgICAgICAvKiBNYXRjaCB0ZXJtaW5hbHMgKi9cbiAgICAgICAgaWYgKG1hdGNoKG5vZGUsXG4gICAgICAgICAgJ2lkZW50aWZpZXInLCAnZXh0ZW5kcycsICdwcm9wZXJ0eV9pZGVudGlmaWVyJywgJ2FjY2Vzc2liaWxpdHlfbW9kaWZpZXInLFxuICAgICAgICAgICdzdHJpbmcnLCAndm9pZCcsICdib29sZWFuJywgJ251bGwnLCAndW5kZWZpbmVkJywgJ251bWJlcicsICdyZXR1cm4nLFxuICAgICAgICAgICdnZXQnLCAnZnVuY3Rpb24nLCAnbmFtZXNwYWNlJywgJ2NvbnN0J1xuICAgICAgICApKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRUZXJtaW5hbChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2aXNpdENoaWxkcmVuID0gKG5vZGVzOiBTeW50YXhOb2RlW10pOiBBU1ROb2RlW10gPT4ge1xuICAgIGxldCBjaGlsZHJlbjogQVNUTm9kZVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgaWYgKCFub2RlLnR5cGUubWF0Y2goL1s8Pigpe30sOjtcXFtcXF0mfD1cXCtcXC1cXCpcXC9dLykgJiYgbm9kZS50eXBlICE9PSAnLi4uJykge1xuICAgICAgICBjb25zdCBjaGlsZCA9IHRoaXMudmlzaXROb2RlKG5vZGUpO1xuICAgICAgICBpZiAoY2hpbGQpIGNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cblxuICBwcml2YXRlIHZpc2l0UHJvZ3JhbSA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZVtdID0+IHtcbiAgICBsZXQgdmlzaXRlZCA9IHt9LFxuICAgICAgZ2V0U3RhcnRMb2NhdGlvbiA9IChuOiBBU1ROb2RlKSA9PiBgJHtuLmxvY2F0aW9uLnJvdy5zdGFydH06JHtuLmxvY2F0aW9uLmNvbHVtbi5zdGFydH1gO1xuICAgIC8vIEEgcHJvZ3JhbSBjYW4gaGF2ZSBtb2R1bGVzLCBuYW1lc3BhY2VzLCBjb21tZW50cyBhcyBpdHMgY2hpbGRyZW5cbiAgICAvLyBUaGUgZmlyc3Qgc3RlcCBpcyB0byBwYXJzZSBhbGwgdGhlIGNvbW1lbnRzIGluIHRoZSByb290IG5vZGVcbiAgICBsZXQgY29tbWVudHMgPSB0aGlzLnZpc2l0Q2hpbGRyZW4odGhpcy5maWx0ZXJUeXBlKG5vZGUsICdjb21tZW50JykpO1xuICAgIC8vIFBhcnNlIHRoZSBuYW1lc3BhY2VzIGluIGV4cHJlc3Npb25fc3RhdGVtZW50XG4gICAgbGV0IG5hbWVzcGFjZXMgPSB0aGlzLnZpc2l0Q2hpbGRyZW4odGhpcy5maWx0ZXJUeXBlKG5vZGUsICdleHByZXNzaW9uX3N0YXRlbWVudCcpKTtcbiAgICAvLyBQYXJzZSB0aGUgZXhwb3J0IHN0YXRlbWVudHMgaW4gdGhlIHJvb3Qgbm9kZVxuICAgIGxldCBleHBvcnRzID0gdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShub2RlLCAnZXhwb3J0X3N0YXRlbWVudCcpKTtcblxuICAgIC8vIEdldCB0aGUgdmlzaXRlZCBjb250ZXh0IG5vZGVzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21tZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY29tbWVudCA9IGNvbW1lbnRzW2ldO1xuICAgICAgY29uc3QgY29udGV4dCA9IGNvbW1lbnQ7XG4gICAgICB2aXNpdGVkW2dldFN0YXJ0TG9jYXRpb24oY29udGV4dCldID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgdGhlIHZpc2l0ZWQgbm9kZXMgZnJvbSBuYW1lc3BhY2VzIGFycmF5XG4gICAgXy5yZW1vdmUobmFtZXNwYWNlcywgeCA9PiB2aXNpdGVkW2dldFN0YXJ0TG9jYXRpb24oeCldKTtcblxuICAgIC8vIEV4cG9ydHMgYXJlIG9kZGJhbGxzIHNpbmNlIHNvbWUgZXhwb3J0cyBtYXkgcmVmZXJlbmNlXG4gICAgLy8gYSB0eXBlL25vZGUgdGhhdCBtYXkgaGF2ZSBiZWVuIGNvbW1lbnRlZC5cbiAgICAvLyBXZSdsbCBmaXJzdCBuZWVkIHRvIGZpbHRlciB0aGUgb25lcyB3ZSBoYXZlIHZpc2l0ZWRcbiAgICBfLnJlbW92ZShleHBvcnRzLCB4ID0+IHZpc2l0ZWRbZ2V0U3RhcnRMb2NhdGlvbih4KV0pO1xuXG4gICAgLy8gRnJvbSB0aGUgb25lcyB3ZSBoYXZlIG5vdCB2aXNpdGVkLCB3ZSdsbCBuZWVkIHRvIG1vZGlmeVxuICAgIC8vIHRoZSBub2RlIHByb3BlcnRpZXMgb2YgZWFjaCBjb250ZXh0IGluIGEgY29tbWVudCBub2RlIHRoYXRcbiAgICAvLyBtYXRjaGVzIHRoZSBvbmVzIHdlIGhhdmUgbm90IHZpc2l0ZWQuXG4gICAgY29uc3QgbWF0Y2hlZCA9IHt9O1xuICAgIGNvbW1lbnRzID0gXy5jb21wYWN0KFxuICAgICAgY29tbWVudHMubWFwKGNvbW1lbnQgPT4ge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cG9ydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBleHBvcnRfID0gZXhwb3J0c1tpXTtcbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0gY29tbWVudC5jb250ZXh0O1xuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBjb250ZXh0ICYmIGogPCBjb250ZXh0LmNoaWxkcmVuLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAoY29udGV4dC5jaGlsZHJlbltpXSAmJiBjb250ZXh0LmNoaWxkcmVuW2ldLnR5cGUgPT09IGV4cG9ydF8udHlwZSkge1xuICAgICAgICAgICAgICBtYXRjaGVkW2dldFN0YXJ0TG9jYXRpb24oZXhwb3J0XyldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgY29tbWVudC5jb250ZXh0LnByb3BlcnRpZXMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICAgIGNvbW1lbnQuY29udGV4dC5wcm9wZXJ0aWVzIHx8IHt9LFxuICAgICAgICAgICAgICAgIGV4cG9ydF8ucHJvcGVydGllc1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tbWVudDtcbiAgICAgIH0pKTtcblxuICAgIC8vIFJlbW92ZWQgdGhlIG1hdGNoZWQgZXhwb3J0c1xuICAgIF8ucmVtb3ZlKGV4cG9ydHMsIHggPT4gbWF0Y2hlZFtnZXRTdGFydExvY2F0aW9uKHgpXSlcblxuICAgIHJldHVybiBbXS5jb25jYXQoY29tbWVudHMpLmNvbmNhdChuYW1lc3BhY2VzKS5jb25jYXQoZXhwb3J0cyk7XG4gIH1cblxuICBwcml2YXRlIHZpc2l0Q29tbWVudCA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZSA9PiB7XG4gICAgaWYgKGlzSmF2YURvY0NvbW1lbnQodGhpcy5zb3VyY2UsIG5vZGUpICYmICFpc0xlZ2FsQ29tbWVudCh0aGlzLnNvdXJjZSwgbm9kZSkpIHtcbiAgICAgIGNvbnN0IG5leHRTaWJsaW5nID0gc2libGluZyhub2RlKTtcbiAgICAgIGlmIChuZXh0U2libGluZykge1xuICAgICAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENvbnRleHQobmV4dFNpYmxpbmcsIHt9KSwgdHJ1ZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmlzaXQgdGhlIGNvbnRleHR1YWwgbm9kZVxuICAgKiBcbiAgICogIyBSZW1hcmtcbiAgICogXG4gICAqIEEgbm9kZSBpcyBjb25zaWRlcmVkIGNvbnRleHR1YWwgd2hlbiBhIGNvbW1lbnQgaXMgdmlzaXRlZCBhbmQgdGhlIG5vZGUgaXMgaXRzIHNpYmxpbmcuXG4gICAqL1xuICBwcml2YXRlIHZpc2l0Q29udGV4dCA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxUeXBlU2NyaXB0UHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSAnZXhwb3J0X3N0YXRlbWVudCc6XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0RXhwb3J0U3RhdGVtZW50KG5vZGUsIHByb3BlcnRpZXMpO1xuICAgICAgY2FzZSAnZXhwcmVzc2lvbl9zdGF0ZW1lbnQnOlxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQobm9kZSwgcHJvcGVydGllcyk7XG4gICAgICBjYXNlICdjbGFzcyc6XG4gICAgICBjYXNlICdpbnRlcmZhY2VfZGVjbGFyYXRpb24nOlxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdENsYXNzT3JJbnRlcmZhY2Uobm9kZSwgcHJvcGVydGllcylcbiAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIGNhc2UgJ2NhbGxfc2lnbmF0dXJlJzpcbiAgICAgIGNhc2UgJ21ldGhvZF9zaWduYXR1cmUnOlxuICAgICAgY2FzZSAncHJvcGVydHlfc2lnbmF0dXJlJzpcbiAgICAgIGNhc2UgJ3B1YmxpY19maWVsZF9kZWZpbml0aW9uJzpcbiAgICAgIGNhc2UgJ21ldGhvZF9kZWZpbml0aW9uJzpcbiAgICAgIGNhc2UgJ2xleGljYWxfZGVjbGFyYXRpb24nOlxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdE5vblRlcm1pbmFsKG5vZGUsIHByb3BlcnRpZXMpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgbG9nLnJlcG9ydCh0aGlzLnNvdXJjZSwgbm9kZSwgRXJyb3JUeXBlLk5vZGVUeXBlTm90WWV0U3VwcG9ydGVkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLyogU3RhdGVtZW50cyAqL1xuXG4gIHByaXZhdGUgdmlzaXRFeHBvcnRTdGF0ZW1lbnQgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8VHlwZVNjcmlwdFByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XG4gICAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiwgZGVmYXVsdEV4cG9ydCA9IGZhbHNlO1xuICAgIC8vIFJlbW92ZSAnZXhwb3J0JyBzaW5jZSBpdCdzIGFsd2F5cyBmaXJzdCBpbiB0aGUgYXJyYXlcbiAgICBjaGlsZHJlbi5zaGlmdCgpO1xuICAgIGlmICh0aGlzLmhhc0RlZmF1bHRFeHBvcnQobm9kZSkpIHtcbiAgICAgIGRlZmF1bHRFeHBvcnQgPSB0cnVlO1xuICAgICAgLy8gUmVtb3ZlICdkZWZhdWx0JyBleHBvcnRcbiAgICAgIGNoaWxkcmVuLnNoaWZ0KCk7XG4gICAgfVxuICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW4uc2hpZnQoKTtcbiAgICByZXR1cm4gdGhpcy52aXNpdE5vZGUoY2hpbGQsIHsgZXhwb3J0czogeyBleHBvcnQ6IHRydWUsIGRlZmF1bHQ6IGRlZmF1bHRFeHBvcnQgfSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50ID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM6IFBhcnRpYWw8VHlwZVNjcmlwdFByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XG4gICAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuLnNoaWZ0KCk7XG5cbiAgICBpZiAobWF0Y2goY2hpbGQsICdpbnRlcm5hbF9tb2R1bGUnKSkge1xuICAgICAgcmV0dXJuIHRoaXMudmlzaXRJbnRlcm5hbE1vZHVsZShjaGlsZCwgcHJvcGVydGllcylcbiAgICB9XG5cbiAgICBpZiAobWF0Y2goY2hpbGQsICdmdW5jdGlvbicpKSB7XG4gICAgICBpZiAocHJvcGVydGllcykgcmV0dXJuIHRoaXMudmlzaXRDb250ZXh0KGNoaWxkLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy52aXNpdE5vblRlcm1pbmFsKGNoaWxkKVxuICB9XG5cbiAgLyogTW9kdWxlcyAqL1xuXG4gIHByaXZhdGUgdmlzaXRJbnRlcm5hbE1vZHVsZSA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxUeXBlU2NyaXB0UHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcbiAgICBsZXQgY2hpbGRyZW46IEFTVE5vZGVbXSA9IG5vZGUuY2hpbGRyZW4ubWFwKGNoaWxkID0+IHtcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ3N0YXRlbWVudF9ibG9jaycpKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q2hpbGRyZW4odGhpcy5maWx0ZXJUeXBlKGNoaWxkLCAnY29tbWVudCcpKSlcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnZpc2l0Tm9kZShjaGlsZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIGNoaWxkcmVuLCBPYmplY3QuYXNzaWduKHByb3BlcnRpZXMgfHwge30sIHsgbmFtZXNwYWNlOiB0cnVlIH0pKTtcbiAgfVxuXG5cbiAgLyogRGVjbGFyYXRpb25zICovXG5cbiAgcHJpdmF0ZSB2aXNpdENsYXNzT3JJbnRlcmZhY2UgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8VHlwZVNjcmlwdFByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XG4gICAgLy8gU2luY2UgJ2ludGVyZmFjZScgb3IgJ2NsYXNzJyBpcyBhbHdheXMgZmlyc3QgaW4gdGhlIGFycmF5XG4gICAgLy8gd2UnbGwgbmVlZCB0byByZW1vdmUgaXQgZnJvbSB0aGUgYXJyYXkuXG4gICAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgICBjb25zdCBpbnRlcmZhY2VfID0gY2hpbGRyZW4uc2hpZnQoKTtcbiAgICBsZXQgZXh0ZW5kc18gPSBmYWxzZSwgaW1wbGVtZW50c18gPSBmYWxzZTtcbiAgICBpZiAodGhpcy5oYXNJbmhlcml0YW5jZShub2RlKSkge1xuICAgICAgY29uc3QgaW5oZXJpdGFuY2UgPSB0aGlzLmdldEluaGVyaXRhbmNlVHlwZShub2RlKVxuICAgICAgZXh0ZW5kc18gPSBpbmhlcml0YW5jZSA9PT0gJ2V4dGVuZHMnO1xuICAgICAgaW1wbGVtZW50c18gPSBpbmhlcml0YW5jZSA9PT0gJ2ltcGxlbWVudHMnO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGVfID0gY3JlYXRlQVNUTm9kZShcbiAgICAgIHRoaXMuc291cmNlLFxuICAgICAgbm9kZSxcbiAgICAgIHRoaXMudmlzaXRDaGlsZHJlbihjaGlsZHJlbiksXG4gICAgICBPYmplY3QuYXNzaWduKHByb3BlcnRpZXMgfHwge30sIHtcbiAgICAgICAgaW5oZXJpdGFuY2U6IHtcbiAgICAgICAgICBpbXBsZW1lbnRzOiBpbXBsZW1lbnRzXyxcbiAgICAgICAgICBleHRlbmRzOiBleHRlbmRzX1xuICAgICAgICB9IGFzIFR5cGVTY3JpcHRJbmhlcml0YW5jZVxuICAgICAgfSkpO1xuXG4gICAgaWYgKG1hdGNoKG5vZGUsICdjbGFzcycpKSB7XG4gICAgICByZXR1cm4gbm9kZV87XG4gICAgfVxuICAgIC8vIE92ZXJ3cml0ZSB0aGUgbm9kZSB0eXBlIGZyb20gJ2ludGVyZmFjZV9kZWNsYXJhdGlvbicgdG8gJ2ludGVyZmFjZSdcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihub2RlXywgeyB0eXBlOiBpbnRlcmZhY2VfLnR5cGUgfSlcbiAgfVxuXG4gIC8qIE5vbi10ZXJtaW5hbHMgKi9cblxuICBwcml2YXRlIHZpc2l0Tm9uVGVybWluYWwgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8VHlwZVNjcmlwdFByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XG4gICAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBzb21lIG5vbi10ZXJtaW5hbHNcbiAgICAvLyBjb250YWluIGNvbW1lbnRzIHdoaWNoIGlzIHdoYXQgd2UgY2FyZSBhYm91dFxuICAgIGlmIChtYXRjaChub2RlLCAnY2xhc3NfYm9keScsICdvYmplY3RfdHlwZScpKSB7XG4gICAgICBjaGlsZHJlbiA9IHRoaXMuZmlsdGVyVHlwZShub2RlLCAnY29tbWVudCcpO1xuICAgIH1cbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBleHBvcnQgc3RhdGVtZW50cyBoYXZlIG5vZGUgcHJvcGVydGllc1xuICAgIGlmIChtYXRjaChub2RlLCAnZXhwb3J0X3N0YXRlbWVudCcpKSB7XG4gICAgICByZXR1cm4gdGhpcy52aXNpdEV4cG9ydFN0YXRlbWVudChub2RlKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBhbiBpbnRlcm5hbCBtb2R1bGUgY29udGFpbnMgb3RoZXIgbm9kZXNcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2ludGVybmFsX21vZHVsZScpKSB7XG4gICAgICByZXR1cm4gdGhpcy52aXNpdEludGVybmFsTW9kdWxlKG5vZGUsIHByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2VzIHdoZXJlIGFuIGludGVybWFsX21vZHVsZSBjYW4gZXhpc3QgaW4gYW4gZXhwcmVzc2lvbl9zdGF0ZW1lbnRcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2V4cHJlc3Npb25fc3RhdGVtZW50JykpIHtcbiAgICAgIHJldHVybiB0aGlzLnZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChub2RlLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICBpZiAobWF0Y2gobm9kZSwgJ2Z1bmN0aW9uJykgfHwgbWF0Y2gobm9kZSwgJ21ldGhvZF9kZWZpbml0aW9uJykpIHtcbiAgICAgIF8ucmVtb3ZlKGNoaWxkcmVuLCBjaGlsZCA9PiBtYXRjaChjaGlsZCwgJ3N0YXRlbWVudF9ibG9jaycpKVxuICAgICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIHRoaXMudmlzaXRDaGlsZHJlbihjaGlsZHJlbiksIHByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q2hpbGRyZW4oY2hpbGRyZW4pLCBwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIC8qIFRlcm1pbmFscyAqL1xuXG4gIHByaXZhdGUgdmlzaXRUZXJtaW5hbCA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZSA9PiB7XG4gICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUpXG4gIH1cbn0iXX0= \ No newline at end of file diff --git a/build/src/utils/benchmark.js b/build/src/utils/benchmark.js index 61900e9..a6e49e6 100644 --- a/build/src/utils/benchmark.js +++ b/build/src/utils/benchmark.js @@ -7,4 +7,4 @@ function benchmark(label, f, ...args) { return result; } exports.default = benchmark; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVuY2htYXJrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2JlbmNobWFyay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLFNBQXdCLFNBQVMsQ0FDL0IsS0FBYSxFQUNiLENBQWUsRUFDZixHQUFHLElBQVU7SUFFYixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ25CLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ25DLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQVRELDRCQVNDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYmVuY2htYXJrPFQsIFQyPihcclxuICBsYWJlbDogc3RyaW5nLFxyXG4gIGY6ICh4OiBUMikgPT4gVCxcclxuICAuLi5hcmdzOiBUMltdXHJcbik6IFQge1xyXG4gIGNvbnNvbGUudGltZShsYWJlbClcclxuICBjb25zdCByZXN1bHQgPSBmLmFwcGx5KG51bGwsIGFyZ3MpO1xyXG4gIGNvbnNvbGUudGltZUVuZChsYWJlbCk7XHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVuY2htYXJrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2JlbmNobWFyay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLFNBQXdCLFNBQVMsQ0FDL0IsS0FBYSxFQUNiLENBQWUsRUFDZixHQUFHLElBQVU7SUFFYixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ25CLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ25DLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQVRELDRCQVNDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYmVuY2htYXJrPFQsIFQyPihcbiAgbGFiZWw6IHN0cmluZyxcbiAgZjogKHg6IFQyKSA9PiBULFxuICAuLi5hcmdzOiBUMltdXG4pOiBUIHtcbiAgY29uc29sZS50aW1lKGxhYmVsKVxuICBjb25zdCByZXN1bHQgPSBmLmFwcGx5KG51bGwsIGFyZ3MpO1xuICBjb25zb2xlLnRpbWVFbmQobGFiZWwpO1xuICByZXR1cm4gcmVzdWx0O1xufSJdfQ== \ No newline at end of file diff --git a/build/src/utils/comment.js b/build/src/utils/comment.js index d67c1c8..dd61fb4 100644 --- a/build/src/utils/comment.js +++ b/build/src/utils/comment.js @@ -39,4 +39,4 @@ function isXDocCommentFragment(source, node) { return !isXDocCommentBlock(source, node) && isXDocComment(source, node); } exports.isXDocCommentFragment = isXDocCommentFragment; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9jb21tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsbUNBQTRCO0FBR2YsUUFBQSxTQUFTLEdBQUcsOEVBQThFLENBQUM7QUFFeEcsU0FBZ0IsY0FBYyxDQUFFLE1BQWMsRUFBRSxJQUFnQjtJQUM5RCxNQUFNLGFBQWEsR0FBRztRQUNwQixXQUFXO1FBQ1gsc0JBQXNCO1FBQ3RCLFNBQVM7UUFDVCxxQkFBcUI7S0FDdEIsQ0FBQztJQUNGLElBQUksZUFBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRTtRQUMxQixPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDOUIsTUFBTSxDQUFDLElBQUk7YUFDUixTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQ3pDLFdBQVcsRUFBRTthQUNiLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FDbEIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDbEI7QUFDSCxDQUFDO0FBZkQsd0NBZUM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDL0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEUsbUJBQW1CO0lBQ25CLE9BQU8saUNBQWlDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQ3hELENBQUM7QUFKRCw0Q0FJQztBQUVELFNBQWdCLGFBQWEsQ0FBQyxNQUFhLEVBQUUsSUFBaUI7SUFDNUQsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQ3JCLElBQUksSUFBSTtRQUFFLE9BQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JFLE9BQU8saUJBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUpELHNDQUlDO0FBRUQsU0FBZ0Isa0JBQWtCLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQ2pFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDM0QsQ0FBQztBQUhELGdEQUdDO0FBRUQsU0FBZ0IscUJBQXFCLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQ3BFLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRkQsc0RBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XHJcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi9tYXRjaFwiO1xyXG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xyXG5cclxuZXhwb3J0IGNvbnN0IFhEb2NSZWdleCA9IC9AKFxcdyspKFtee1soXFxuXSopPyhbXFx7XFxbXFwoXVtcXHNcXFNdKltcXH1cXF1cXCldKFtcXHNdKig9fC0pPi4qKT8pPyhbXFxzXSotKC4pKik/L2dtaTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0xlZ2FsQ29tbWVudCAoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpIHtcclxuICBjb25zdCBwb3NzaWJsZVRleHRzID0gW1xyXG4gICAgJ2NvcHlyaWdodCcsXHJcbiAgICAndGVybXMgYW5kIGNvbmRpdGlvbnMnLFxyXG4gICAgJ2xpY2Vuc2UnLFxyXG4gICAgJ2FsbCByaWdodHMgcmVzZXJ2ZWQnXHJcbiAgXTtcclxuICBpZiAobWF0Y2gobm9kZSwgJ2NvbW1lbnQnKSkge1xyXG4gICAgcmV0dXJuIHBvc3NpYmxlVGV4dHMubWFwKHRleHQgPT5cclxuICAgICAgc291cmNlLnRleHRcclxuICAgICAgICAuc3Vic3RyaW5nKG5vZGUuc3RhcnRJbmRleCwgbm9kZS5lbmRJbmRleClcclxuICAgICAgICAudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgIC5pbmNsdWRlcyh0ZXh0KVxyXG4gICAgKS5pbmNsdWRlcyh0cnVlKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0phdmFEb2NDb21tZW50KHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlKSB7XHJcbiAgY29uc3QgY29tbWVudCA9IHNvdXJjZS50ZXh0LnN1YnN0cmluZyhub2RlLnN0YXJ0SW5kZXgsIG5vZGUuZW5kSW5kZXgpO1xyXG4gIC8vIHJlZ2V4ci5jb20vM2VqdmJcclxuICByZXR1cm4gLyhcXC9cXCpcXCopKChcXHMqKSguKj8pKFxccykpKihcXCpcXC8pLy50ZXN0KGNvbW1lbnQpXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1hEb2NDb21tZW50KHNvdXJjZTpzdHJpbmcsIG5vZGU/OiBTeW50YXhOb2RlKSB7XHJcbiAgbGV0IGNvbW1lbnQgPSBzb3VyY2U7XHJcbiAgaWYgKG5vZGUpIGNvbW1lbnQgPSBzb3VyY2Uuc3Vic3RyaW5nKG5vZGUuc3RhcnRJbmRleCwgbm9kZS5lbmRJbmRleCk7XHJcbiAgcmV0dXJuIFhEb2NSZWdleC50ZXN0KGNvbW1lbnQpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNYRG9jQ29tbWVudEJsb2NrKHNvdXJjZTogc3RyaW5nLCBub2RlOiBTeW50YXhOb2RlKSB7XHJcbiAgY29uc3QgY29tbWVudCA9IHNvdXJjZS5zdWJzdHJpbmcobm9kZS5zdGFydEluZGV4LCBub2RlLmVuZEluZGV4KTtcclxuICByZXR1cm4gLyNBUEkvLnRlc3QoY29tbWVudCkgfHwgL1xcYFxcYFxcYHhkb2MvLnRlc3QoY29tbWVudClcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzWERvY0NvbW1lbnRGcmFnbWVudChzb3VyY2U6IHN0cmluZywgbm9kZTogU3ludGF4Tm9kZSkge1xyXG4gIHJldHVybiAhaXNYRG9jQ29tbWVudEJsb2NrKHNvdXJjZSwgbm9kZSkgJiYgaXNYRG9jQ29tbWVudChzb3VyY2UsIG5vZGUpO1xyXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9jb21tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsbUNBQTRCO0FBR2YsUUFBQSxTQUFTLEdBQUcsOEVBQThFLENBQUM7QUFFeEcsU0FBZ0IsY0FBYyxDQUFFLE1BQWMsRUFBRSxJQUFnQjtJQUM5RCxNQUFNLGFBQWEsR0FBRztRQUNwQixXQUFXO1FBQ1gsc0JBQXNCO1FBQ3RCLFNBQVM7UUFDVCxxQkFBcUI7S0FDdEIsQ0FBQztJQUNGLElBQUksZUFBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRTtRQUMxQixPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDOUIsTUFBTSxDQUFDLElBQUk7YUFDUixTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQ3pDLFdBQVcsRUFBRTthQUNiLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FDbEIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDbEI7QUFDSCxDQUFDO0FBZkQsd0NBZUM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDL0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEUsbUJBQW1CO0lBQ25CLE9BQU8saUNBQWlDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQ3hELENBQUM7QUFKRCw0Q0FJQztBQUVELFNBQWdCLGFBQWEsQ0FBQyxNQUFhLEVBQUUsSUFBaUI7SUFDNUQsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQ3JCLElBQUksSUFBSTtRQUFFLE9BQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JFLE9BQU8saUJBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUpELHNDQUlDO0FBRUQsU0FBZ0Isa0JBQWtCLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQ2pFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDM0QsQ0FBQztBQUhELGdEQUdDO0FBRUQsU0FBZ0IscUJBQXFCLENBQUMsTUFBYyxFQUFFLElBQWdCO0lBQ3BFLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRkQsc0RBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgbWF0Y2ggZnJvbSBcIi4vbWF0Y2hcIjtcbmltcG9ydCBTb3VyY2UgZnJvbSBcIi4uL2ludGVyZmFjZXMvU291cmNlXCI7XG5cbmV4cG9ydCBjb25zdCBYRG9jUmVnZXggPSAvQChcXHcrKShbXntbKFxcbl0qKT8oW1xce1xcW1xcKF1bXFxzXFxTXSpbXFx9XFxdXFwpXShbXFxzXSooPXwtKT4uKik/KT8oW1xcc10qLSguKSopPy9nbWk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xlZ2FsQ29tbWVudCAoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgY29uc3QgcG9zc2libGVUZXh0cyA9IFtcbiAgICAnY29weXJpZ2h0JyxcbiAgICAndGVybXMgYW5kIGNvbmRpdGlvbnMnLFxuICAgICdsaWNlbnNlJyxcbiAgICAnYWxsIHJpZ2h0cyByZXNlcnZlZCdcbiAgXTtcbiAgaWYgKG1hdGNoKG5vZGUsICdjb21tZW50JykpIHtcbiAgICByZXR1cm4gcG9zc2libGVUZXh0cy5tYXAodGV4dCA9PlxuICAgICAgc291cmNlLnRleHRcbiAgICAgICAgLnN1YnN0cmluZyhub2RlLnN0YXJ0SW5kZXgsIG5vZGUuZW5kSW5kZXgpXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgIC5pbmNsdWRlcyh0ZXh0KVxuICAgICkuaW5jbHVkZXModHJ1ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSmF2YURvY0NvbW1lbnQoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgY29uc3QgY29tbWVudCA9IHNvdXJjZS50ZXh0LnN1YnN0cmluZyhub2RlLnN0YXJ0SW5kZXgsIG5vZGUuZW5kSW5kZXgpO1xuICAvLyByZWdleHIuY29tLzNlanZiXG4gIHJldHVybiAvKFxcL1xcKlxcKikoKFxccyopKC4qPykoXFxzKSkqKFxcKlxcLykvLnRlc3QoY29tbWVudClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzWERvY0NvbW1lbnQoc291cmNlOnN0cmluZywgbm9kZT86IFN5bnRheE5vZGUpIHtcbiAgbGV0IGNvbW1lbnQgPSBzb3VyY2U7XG4gIGlmIChub2RlKSBjb21tZW50ID0gc291cmNlLnN1YnN0cmluZyhub2RlLnN0YXJ0SW5kZXgsIG5vZGUuZW5kSW5kZXgpO1xuICByZXR1cm4gWERvY1JlZ2V4LnRlc3QoY29tbWVudCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1hEb2NDb21tZW50QmxvY2soc291cmNlOiBzdHJpbmcsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgY29uc3QgY29tbWVudCA9IHNvdXJjZS5zdWJzdHJpbmcobm9kZS5zdGFydEluZGV4LCBub2RlLmVuZEluZGV4KTtcbiAgcmV0dXJuIC8jQVBJLy50ZXN0KGNvbW1lbnQpIHx8IC9cXGBcXGBcXGB4ZG9jLy50ZXN0KGNvbW1lbnQpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1hEb2NDb21tZW50RnJhZ21lbnQoc291cmNlOiBzdHJpbmcsIG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgcmV0dXJuICFpc1hEb2NDb21tZW50QmxvY2soc291cmNlLCBub2RlKSAmJiBpc1hEb2NDb21tZW50KHNvdXJjZSwgbm9kZSk7XG59Il19 \ No newline at end of file diff --git a/build/src/utils/log.js b/build/src/utils/log.js index 47f9527..75c3cfb 100644 --- a/build/src/utils/log.js +++ b/build/src/utils/log.js @@ -29,4 +29,4 @@ class ParserLog extends mr_doc_utils_1.Log { } const log = new ParserLog('mr-doc::parser'); exports.default = log; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtDQUFtQztBQUduQyxtQ0FBNEI7QUFFNUIsSUFBWSxTQUdYO0FBSEQsV0FBWSxTQUFTO0lBQ2pCLCtFQUF1QixDQUFBO0lBQ3ZCLHlFQUFvQixDQUFBO0FBQ3hCLENBQUMsRUFIVyxTQUFTLEdBQVQsaUJBQVMsS0FBVCxpQkFBUyxRQUdwQjtBQUVELE1BQU0sU0FBVSxTQUFRLGtCQUFHO0lBQTNCOztRQUNJLFdBQU0sR0FBRyxDQUFDLE1BQWMsRUFBRSxJQUFnQixFQUFFLEtBQWdCLEVBQVEsRUFBRTtZQUNsRSxNQUFNLFFBQVEsR0FBRyxlQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ3RDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQ3pELE1BQU0sWUFBWSxHQUFHLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNySCxNQUFNLE9BQU8sR0FBRyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksWUFBWSxFQUFFLFFBQVEsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDO1lBQ25GLFFBQVEsS0FBSyxFQUFFO2dCQUNYLEtBQUssU0FBUyxDQUFDLHVCQUF1QjtvQkFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsNEJBQTRCLE9BQU8sRUFBRSxDQUFDLENBQUE7b0JBQ2xGLE1BQU07Z0JBQ1YsS0FBSyxTQUFTLENBQUMsb0JBQW9CO29CQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLHFEQUFxRCxPQUFPLEVBQUUsQ0FBQyxDQUFBO2dCQUM5RTtvQkFDSSxNQUFNO2FBQ2I7UUFDTCxDQUFDLENBQUE7SUFDTCxDQUFDO0NBQUE7QUFHRCxNQUFNLEdBQUcsR0FBRyxJQUFJLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRTVDLGtCQUFlLEdBQUcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvZyB9IGZyb20gJ21yLWRvYy11dGlscyc7XHJcbmltcG9ydCBTb3VyY2UgZnJvbSAnLi4vaW50ZXJmYWNlcy9Tb3VyY2UnO1xyXG5pbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSAndHJlZS1zaXR0ZXInO1xyXG5pbXBvcnQgcmFuZ2UgZnJvbSAnLi9yYW5nZSc7XHJcblxyXG5leHBvcnQgZW51bSBFcnJvclR5cGUge1xyXG4gICAgTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQsXHJcbiAgICBUcmVlU2l0dGVyUGFyc2VFcnJvclxyXG59XHJcblxyXG5jbGFzcyBQYXJzZXJMb2cgZXh0ZW5kcyBMb2cge1xyXG4gICAgcmVwb3J0ID0gKHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlLCBlcnJvcjogRXJyb3JUeXBlKTogdm9pZCA9PiB7XHJcbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSByYW5nZShub2RlKS5sb2NhdGlvbjtcclxuICAgICAgICBjb25zdCBzYW1lTGluZSA9IGxvY2F0aW9uLnJvdy5zdGFydCA9PT0gbG9jYXRpb24ucm93LmVuZDtcclxuICAgICAgICBjb25zdCBnZXRMaW5lUmFuZ2UgPSAoKSA9PiBzYW1lTGluZSA/IGxvY2F0aW9uLnJvdy5zdGFydCArIDEgOiBsb2NhdGlvbi5yb3cuc3RhcnQgKyAxICsgJyAtICcgKyBsb2NhdGlvbi5yb3cuZW5kICsgMTtcclxuICAgICAgICBjb25zdCBjdWxwcml0ID0gYExpbmUke3NhbWVMaW5lID8gJycgOiAncyd9ICR7Z2V0TGluZVJhbmdlKCl9IGluICcke3NvdXJjZS5wYXRofSdgO1xyXG4gICAgICAgIHN3aXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY2FzZSBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQ6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluZm8oYCcke25vZGUudHlwZS5yZXBsYWNlKC9bX10vZywgJyAnKX0nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkOlxcbiR7Y3VscHJpdH1gKVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgRXJyb3JUeXBlLlRyZWVTaXR0ZXJQYXJzZUVycm9yOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvcihgJ3RyZWUtc2l0dGVyJyB3YXMgbm90IGFibGUgdG8gcGFyc2UgdGhlIHByb2dyYW06XFxuJHtjdWxwcml0fWApXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5jb25zdCBsb2cgPSBuZXcgUGFyc2VyTG9nKCdtci1kb2M6OnBhcnNlcicpO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbG9nOyJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtDQUFtQztBQUduQyxtQ0FBNEI7QUFFNUIsSUFBWSxTQUdYO0FBSEQsV0FBWSxTQUFTO0lBQ2pCLCtFQUF1QixDQUFBO0lBQ3ZCLHlFQUFvQixDQUFBO0FBQ3hCLENBQUMsRUFIVyxTQUFTLEdBQVQsaUJBQVMsS0FBVCxpQkFBUyxRQUdwQjtBQUVELE1BQU0sU0FBVSxTQUFRLGtCQUFHO0lBQTNCOztRQUNJLFdBQU0sR0FBRyxDQUFDLE1BQWMsRUFBRSxJQUFnQixFQUFFLEtBQWdCLEVBQVEsRUFBRTtZQUNsRSxNQUFNLFFBQVEsR0FBRyxlQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ3RDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQ3pELE1BQU0sWUFBWSxHQUFHLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNySCxNQUFNLE9BQU8sR0FBRyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksWUFBWSxFQUFFLFFBQVEsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDO1lBQ25GLFFBQVEsS0FBSyxFQUFFO2dCQUNYLEtBQUssU0FBUyxDQUFDLHVCQUF1QjtvQkFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsNEJBQTRCLE9BQU8sRUFBRSxDQUFDLENBQUE7b0JBQ2xGLE1BQU07Z0JBQ1YsS0FBSyxTQUFTLENBQUMsb0JBQW9CO29CQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLHFEQUFxRCxPQUFPLEVBQUUsQ0FBQyxDQUFBO2dCQUM5RTtvQkFDSSxNQUFNO2FBQ2I7UUFDTCxDQUFDLENBQUE7SUFDTCxDQUFDO0NBQUE7QUFHRCxNQUFNLEdBQUcsR0FBRyxJQUFJLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRTVDLGtCQUFlLEdBQUcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvZyB9IGZyb20gJ21yLWRvYy11dGlscyc7XG5pbXBvcnQgU291cmNlIGZyb20gJy4uL2ludGVyZmFjZXMvU291cmNlJztcbmltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tICd0cmVlLXNpdHRlcic7XG5pbXBvcnQgcmFuZ2UgZnJvbSAnLi9yYW5nZSc7XG5cbmV4cG9ydCBlbnVtIEVycm9yVHlwZSB7XG4gICAgTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQsXG4gICAgVHJlZVNpdHRlclBhcnNlRXJyb3Jcbn1cblxuY2xhc3MgUGFyc2VyTG9nIGV4dGVuZHMgTG9nIHtcbiAgICByZXBvcnQgPSAoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUsIGVycm9yOiBFcnJvclR5cGUpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSByYW5nZShub2RlKS5sb2NhdGlvbjtcbiAgICAgICAgY29uc3Qgc2FtZUxpbmUgPSBsb2NhdGlvbi5yb3cuc3RhcnQgPT09IGxvY2F0aW9uLnJvdy5lbmQ7XG4gICAgICAgIGNvbnN0IGdldExpbmVSYW5nZSA9ICgpID0+IHNhbWVMaW5lID8gbG9jYXRpb24ucm93LnN0YXJ0ICsgMSA6IGxvY2F0aW9uLnJvdy5zdGFydCArIDEgKyAnIC0gJyArIGxvY2F0aW9uLnJvdy5lbmQgKyAxO1xuICAgICAgICBjb25zdCBjdWxwcml0ID0gYExpbmUke3NhbWVMaW5lID8gJycgOiAncyd9ICR7Z2V0TGluZVJhbmdlKCl9IGluICcke3NvdXJjZS5wYXRofSdgO1xuICAgICAgICBzd2l0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXNlIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFlldFN1cHBvcnRlZDpcbiAgICAgICAgICAgICAgICB0aGlzLmluZm8oYCcke25vZGUudHlwZS5yZXBsYWNlKC9bX10vZywgJyAnKX0nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkOlxcbiR7Y3VscHJpdH1gKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBFcnJvclR5cGUuVHJlZVNpdHRlclBhcnNlRXJyb3I6XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvcihgJ3RyZWUtc2l0dGVyJyB3YXMgbm90IGFibGUgdG8gcGFyc2UgdGhlIHByb2dyYW06XFxuJHtjdWxwcml0fWApXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cbmNvbnN0IGxvZyA9IG5ldyBQYXJzZXJMb2coJ21yLWRvYzo6cGFyc2VyJyk7XG5cbmV4cG9ydCBkZWZhdWx0IGxvZzsiXX0= \ No newline at end of file diff --git a/build/src/utils/match.js b/build/src/utils/match.js index 58a09da..74e0c8d 100644 --- a/build/src/utils/match.js +++ b/build/src/utils/match.js @@ -18,4 +18,4 @@ function match(node, ...types) { return false; } exports.default = match; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvbWF0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQTs7Ozs7OztHQU9HO0FBQ0gsU0FBd0IsS0FBSyxDQUFDLElBQWdCLEVBQUUsR0FBRyxLQUFlO0lBQ2hFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3JDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQ3RCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7S0FDRjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQVJELHdCQVFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5cclxuLyoqXHJcbiAqIERldGVybWluZXMgd2hldGhlciBhIG5vZGUgaXMgYSBjZXJ0YWluIHR5cGUuXHJcbiAqIGBgYFxyXG4gKiBAcGFyYW0gbm9kZTogU3ludGF4Tm9kZSAtIFRoZSBub2RlIHRvIGNvbXBhcmUuXHJcbiAqIEBwYXJhbSB0eXBlOiBzdHJpbmcgIC0gVGhlIG5vZGUgdHlwZSB0byBtYXRjaC5cclxuICogQHJldHVybjogYm9vbGVhblxyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1hdGNoKG5vZGU6IFN5bnRheE5vZGUsIC4uLnR5cGVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHtcclxuICAgIGNvbnN0IHR5cGUgPSB0eXBlc1tpXTtcclxuICAgIGlmIChub2RlLnR5cGUgPT09IHR5cGUpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBmYWxzZTtcclxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvbWF0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQTs7Ozs7OztHQU9HO0FBQ0gsU0FBd0IsS0FBSyxDQUFDLElBQWdCLEVBQUUsR0FBRyxLQUFlO0lBQ2hFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3JDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQ3RCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7S0FDRjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQVJELHdCQVFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIG5vZGUgaXMgYSBjZXJ0YWluIHR5cGUuXG4gKiBgYGBcbiAqIEBwYXJhbSBub2RlOiBTeW50YXhOb2RlIC0gVGhlIG5vZGUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB0eXBlOiBzdHJpbmcgIC0gVGhlIG5vZGUgdHlwZSB0byBtYXRjaC5cbiAqIEByZXR1cm46IGJvb2xlYW5cbiAqIGBgYFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYXRjaChub2RlOiBTeW50YXhOb2RlLCAuLi50eXBlczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlc1tpXTtcbiAgICBpZiAobm9kZS50eXBlID09PSB0eXBlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufSJdfQ== \ No newline at end of file diff --git a/build/src/utils/range.js b/build/src/utils/range.js index 4adeddb..e8ee5d6 100644 --- a/build/src/utils/range.js +++ b/build/src/utils/range.js @@ -13,4 +13,4 @@ function range(node) { }; } exports.default = range; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvcmFuZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxTQUF3QixLQUFLLENBQUMsSUFBdUI7SUFDbkQsT0FBTztRQUNMLFFBQVEsRUFBRTtZQUNSLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVTtZQUN0QixHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDbkI7UUFDRCxRQUFRLEVBQUU7WUFDUixHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQ2pFLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7U0FDM0U7S0FDRixDQUFBO0FBQ0gsQ0FBQztBQVhELHdCQVdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcclxuaW1wb3J0IFRleHRSYW5nZSBmcm9tICcuLi9pbnRlcmZhY2VzL1RleHRSYW5nZSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByYW5nZShub2RlOiBQYXJzZXIuU3ludGF4Tm9kZSk6IFRleHRSYW5nZSB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHBvc2l0aW9uOiB7XHJcbiAgICAgIHN0YXJ0OiBub2RlLnN0YXJ0SW5kZXgsXHJcbiAgICAgIGVuZDogbm9kZS5lbmRJbmRleFxyXG4gICAgfSxcclxuICAgIGxvY2F0aW9uOiB7XHJcbiAgICAgIHJvdzogeyBzdGFydDogbm9kZS5zdGFydFBvc2l0aW9uLnJvdywgZW5kOiBub2RlLmVuZFBvc2l0aW9uLnJvdyB9LFxyXG4gICAgICBjb2x1bW46IHsgc3RhcnQ6IG5vZGUuc3RhcnRQb3NpdGlvbi5jb2x1bW4sIGVuZDogbm9kZS5lbmRQb3NpdGlvbi5jb2x1bW4gfVxyXG4gICAgfVxyXG4gIH1cclxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvcmFuZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxTQUF3QixLQUFLLENBQUMsSUFBdUI7SUFDbkQsT0FBTztRQUNMLFFBQVEsRUFBRTtZQUNSLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVTtZQUN0QixHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDbkI7UUFDRCxRQUFRLEVBQUU7WUFDUixHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQ2pFLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7U0FDM0U7S0FDRixDQUFBO0FBQ0gsQ0FBQztBQVhELHdCQVdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUGFyc2VyIGZyb20gJ3RyZWUtc2l0dGVyJztcbmltcG9ydCBUZXh0UmFuZ2UgZnJvbSAnLi4vaW50ZXJmYWNlcy9UZXh0UmFuZ2UnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByYW5nZShub2RlOiBQYXJzZXIuU3ludGF4Tm9kZSk6IFRleHRSYW5nZSB7XG4gIHJldHVybiB7XG4gICAgcG9zaXRpb246IHtcbiAgICAgIHN0YXJ0OiBub2RlLnN0YXJ0SW5kZXgsXG4gICAgICBlbmQ6IG5vZGUuZW5kSW5kZXhcbiAgICB9LFxuICAgIGxvY2F0aW9uOiB7XG4gICAgICByb3c6IHsgc3RhcnQ6IG5vZGUuc3RhcnRQb3NpdGlvbi5yb3csIGVuZDogbm9kZS5lbmRQb3NpdGlvbi5yb3cgfSxcbiAgICAgIGNvbHVtbjogeyBzdGFydDogbm9kZS5zdGFydFBvc2l0aW9uLmNvbHVtbiwgZW5kOiBub2RlLmVuZFBvc2l0aW9uLmNvbHVtbiB9XG4gICAgfVxuICB9XG59Il19 \ No newline at end of file diff --git a/build/src/utils/sibling.js b/build/src/utils/sibling.js index 66420fd..fe01442 100644 --- a/build/src/utils/sibling.js +++ b/build/src/utils/sibling.js @@ -12,4 +12,4 @@ function sibling(node, children, filter) { } } exports.sibling = sibling; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2libGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9zaWJsaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsU0FBZ0IsT0FBTyxDQUNyQixJQUFnQixFQUNoQixRQUF1QixFQUN2QixNQUFzQjtJQUV0QixJQUFJLElBQUksRUFBRTtRQUNSLElBQUksUUFBUSxFQUFFO1lBQ1osTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUM7Z0JBQ3BCLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsT0FBTyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzVCO1FBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0tBQ3pCO0FBQ0gsQ0FBQztBQWRELDBCQWNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNpYmxpbmcoXHJcbiAgbm9kZTogU3ludGF4Tm9kZSxcclxuICBjaGlsZHJlbj86IFN5bnRheE5vZGVbXSxcclxuICBmaWx0ZXI/OiAoKSA9PiBib29sZWFuXHJcbikge1xyXG4gIGlmIChub2RlKSB7XHJcbiAgICBpZiAoY2hpbGRyZW4pIHtcclxuICAgICAgY29uc3QgaW5kZXggPSBmaWx0ZXIgP1xyXG4gICAgICAgIGNoaWxkcmVuLmZpbHRlcihmaWx0ZXIpLmluZGV4T2Yobm9kZSkgOlxyXG4gICAgICAgIGNoaWxkcmVuLmluZGV4T2Yobm9kZSk7XHJcbiAgICAgIHJldHVybiBjaGlsZHJlbltpbmRleCArIDFdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7XHJcbiAgfVxyXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2libGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9zaWJsaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsU0FBZ0IsT0FBTyxDQUNyQixJQUFnQixFQUNoQixRQUF1QixFQUN2QixNQUFzQjtJQUV0QixJQUFJLElBQUksRUFBRTtRQUNSLElBQUksUUFBUSxFQUFFO1lBQ1osTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUM7Z0JBQ3BCLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsT0FBTyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzVCO1FBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0tBQ3pCO0FBQ0gsQ0FBQztBQWRELDBCQWNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuXG5leHBvcnQgZnVuY3Rpb24gc2libGluZyhcbiAgbm9kZTogU3ludGF4Tm9kZSxcbiAgY2hpbGRyZW4/OiBTeW50YXhOb2RlW10sXG4gIGZpbHRlcj86ICgpID0+IGJvb2xlYW5cbikge1xuICBpZiAobm9kZSkge1xuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgY29uc3QgaW5kZXggPSBmaWx0ZXIgP1xuICAgICAgICBjaGlsZHJlbi5maWx0ZXIoZmlsdGVyKS5pbmRleE9mKG5vZGUpIDpcbiAgICAgICAgY2hpbGRyZW4uaW5kZXhPZihub2RlKTtcbiAgICAgIHJldHVybiBjaGlsZHJlbltpbmRleCArIDFdO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZS5uZXh0U2libGluZztcbiAgfVxufSJdfQ== \ No newline at end of file diff --git a/build/src/utils/text.js b/build/src/utils/text.js index 2727251..c4b2bc3 100644 --- a/build/src/utils/text.js +++ b/build/src/utils/text.js @@ -12,4 +12,4 @@ function text(source, node) { return source.text.substring(node.startIndex, node.endIndex); } exports.text = text; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy90ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0E7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLElBQUksQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDbkQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRkQsb0JBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XHJcbmltcG9ydCBTb3VyY2UgZnJvbSBcIi4uL2ludGVyZmFjZXMvU291cmNlXCI7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgY29udGV4dCBzdHJpbmdcclxuICogXHJcbiAqICMgQVBJXHJcbiAqIFxyXG4gKiBAcGFyYW0gc291cmNlOiBJRmlsZSAtIFRoZSBzb3VyY2UgZmlsZS5cclxuICogQHBhcmFtIG5vZGU6IFN5bnRheE5vZGUgLSBUaGUgc3ludGF4IG5vZGUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdGV4dChzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSkge1xyXG4gIHJldHVybiBzb3VyY2UudGV4dC5zdWJzdHJpbmcobm9kZS5zdGFydEluZGV4LCBub2RlLmVuZEluZGV4KTtcclxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy90ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0E7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLElBQUksQ0FBQyxNQUFjLEVBQUUsSUFBZ0I7SUFDbkQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRkQsb0JBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGNvbnRleHQgc3RyaW5nXG4gKiBcbiAqICMgQVBJXG4gKiBcbiAqIEBwYXJhbSBzb3VyY2U6IElGaWxlIC0gVGhlIHNvdXJjZSBmaWxlLlxuICogQHBhcmFtIG5vZGU6IFN5bnRheE5vZGUgLSBUaGUgc3ludGF4IG5vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXh0KHNvdXJjZTogU291cmNlLCBub2RlOiBTeW50YXhOb2RlKSB7XG4gIHJldHVybiBzb3VyY2UudGV4dC5zdWJzdHJpbmcobm9kZS5zdGFydEluZGV4LCBub2RlLmVuZEluZGV4KTtcbn0iXX0= \ No newline at end of file diff --git a/build/src/utils/walk.js b/build/src/utils/walk.js index cc60803..d2e0acd 100644 --- a/build/src/utils/walk.js +++ b/build/src/utils/walk.js @@ -7,4 +7,4 @@ function walk(node) { return node_; } exports.default = walk; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Fsay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy93YWxrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsOENBQTBDO0FBQzFDLFNBQXdCLElBQUksQ0FBQyxJQUFnQjtJQUMzQyxJQUFJLEtBQUssR0FBRyxJQUFJLFdBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUNuRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFKRCx1QkFJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcclxuaW1wb3J0IHsgTm9kZSB9IGZyb20gJy4uL2xhbmcvY29tbW9uL25vZGUnXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHdhbGsobm9kZTogU3ludGF4Tm9kZSkge1xyXG4gIGxldCBub2RlXyA9IG5ldyBOb2RlKG5vZGUpO1xyXG4gIG5vZGVfLnN5bnRheE5vZGUuY2hpbGRyZW4ubWFwKGNoaWxkID0+IHdhbGsoY2hpbGQpKVxyXG4gIHJldHVybiBub2RlXztcclxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Fsay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy93YWxrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsOENBQTBDO0FBQzFDLFNBQXdCLElBQUksQ0FBQyxJQUFnQjtJQUMzQyxJQUFJLEtBQUssR0FBRyxJQUFJLFdBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUNuRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFKRCx1QkFJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcbmltcG9ydCB7IE5vZGUgfSBmcm9tICcuLi9sYW5nL2NvbW1vbi9ub2RlJ1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gd2Fsayhub2RlOiBTeW50YXhOb2RlKSB7XG4gIGxldCBub2RlXyA9IG5ldyBOb2RlKG5vZGUpO1xuICBub2RlXy5zeW50YXhOb2RlLmNoaWxkcmVuLm1hcChjaGlsZCA9PiB3YWxrKGNoaWxkKSlcbiAgcmV0dXJuIG5vZGVfO1xufSJdfQ== \ No newline at end of file diff --git a/corpus/example.js b/corpus/example.js index a6051ac..4a9c33f 100644 --- a/corpus/example.js +++ b/corpus/example.js @@ -2,6 +2,12 @@ * * @param x - description */ -function name(...args) { - +class A { + /** + * @method method + */ + method () { + /* Some method */ + const x = 1; + } } \ No newline at end of file diff --git a/index.ts b/index.ts index e6c7ad3..4aed94c 100644 --- a/index.ts +++ b/index.ts @@ -2,7 +2,7 @@ import Source from './src/interfaces/Source'; import ParserFactory from './src/ParserFactory'; import Parser from './src/lang/common/parser'; import { Tree } from 'tree-sitter'; -// import { ASTNode } from './src/lang/common/ast'; + /** * A class that parses a source code and generates an AST. * @@ -25,7 +25,7 @@ import { Tree } from 'tree-sitter'; export default class DocParser extends Parser { private parser: Parser; - constructor(source: Source, options: any) { + constructor(source: Source, options?: object) { super(source, options) this.parser = (new ParserFactory(this.source, this.options)).getParser(); } diff --git a/src/lang/javascript/visitor.ts b/src/lang/javascript/visitor.ts index d6e1284..c17bdfa 100644 --- a/src/lang/javascript/visitor.ts +++ b/src/lang/javascript/visitor.ts @@ -67,7 +67,6 @@ export class JavaScriptVisitor implements Visitor { * Returns only the comments from a node's children. */ private filterType(node: SyntaxNode, type: string): SyntaxNode[] { - // console.time('filterType') let children: SyntaxNode[] = []; for (let i = 0; i < node.children.length; i++) { const child = node.children[i]; @@ -75,7 +74,6 @@ export class JavaScriptVisitor implements Visitor { children.push(child); } } - // console.timeEnd('filterType') return children; } @@ -336,9 +334,8 @@ export class JavaScriptVisitor implements Visitor { } // Handle special cases where a function has a statement_block - if (match(node, 'function')) { + if (match(node, 'function') || match(node, 'method_definition')) { _.remove(children, child => match(child, 'statement_block')) - console.log(children); return createASTNode(this.source, node, this.visitChildren(children), properties); } diff --git a/src/lang/typescript/visitor.ts b/src/lang/typescript/visitor.ts index ad3aa50..e83beed 100644 --- a/src/lang/typescript/visitor.ts +++ b/src/lang/typescript/visitor.ts @@ -67,7 +67,6 @@ export class TypeScriptVisitor implements Visitor { * Returns only the comments from a node's children. */ private filterType(node: SyntaxNode, type: string): SyntaxNode[] { - // console.time('filterType') let children: SyntaxNode[] = []; for (let i = 0; i < node.children.length; i++) { const child = node.children[i]; @@ -75,7 +74,6 @@ export class TypeScriptVisitor implements Visitor { children.push(child); } } - // console.timeEnd('filterType') return children; } @@ -339,7 +337,7 @@ export class TypeScriptVisitor implements Visitor { return this.visitExpressionStatement(node, properties); } - if (match(node, 'function')) { + if (match(node, 'function') || match(node, 'method_definition')) { _.remove(children, child => match(child, 'statement_block')) return createASTNode(this.source, node, this.visitChildren(children), properties); } From 0120391e0aa007cc242a9f6921afca91ecdce4e4 Mon Sep 17 00:00:00 2001 From: Takeshi Date: Fri, 24 Aug 2018 14:44:10 -0600 Subject: [PATCH 27/32] Update: Logger is now available across all visitors. --- README.md | 4 ++-- build/corpus/nodes.d.ts | 0 build/corpus/nodes.js | 2 -- build/src/interfaces/BaseParser.d.ts | 10 ---------- build/src/interfaces/BaseParser.js | 11 ----------- build/src/interfaces/IParser.d.ts | 6 ------ build/src/interfaces/IParser.js | 9 --------- build/src/interfaces/ParserInterface.d.ts | 8 -------- build/src/interfaces/ParserInterface.js | 9 --------- build/src/lang/common/emca.d.ts | 14 -------------- build/src/lang/common/emca.js | 3 --- build/src/lang/common/parser.d.ts | 10 ++++++++-- build/src/lang/common/parser.js | 10 ++++++++-- build/src/lang/common/visitor.d.ts | 10 ++++++++++ build/src/lang/common/visitor.js | 7 ++++++- build/src/lang/javascript/index.js | 4 ++-- build/src/lang/javascript/visitor.d.ts | 6 +++--- build/src/lang/javascript/visitor.js | 14 ++++++++------ build/src/lang/typescript/index.js | 4 ++-- build/src/lang/typescript/visitor.d.ts | 6 +++--- build/src/lang/typescript/visitor.js | 14 ++++++++------ build/src/utils/log.d.ts | 7 +++---- build/src/utils/log.js | 11 +++++------ package-lock.json | 14 +++++++------- package.json | 7 +++---- src/lang/common/parser.ts | 20 +++++++++++++++++--- src/lang/common/visitor.ts | 14 ++++++++++++++ src/lang/javascript/index.ts | 2 +- src/lang/javascript/visitor.ts | 13 +++++++------ src/lang/typescript/index.ts | 2 +- src/lang/typescript/visitor.ts | 13 +++++++------ src/utils/log.ts | 14 ++++++-------- 32 files changed, 131 insertions(+), 147 deletions(-) delete mode 100644 build/corpus/nodes.d.ts delete mode 100644 build/corpus/nodes.js delete mode 100644 build/src/interfaces/BaseParser.d.ts delete mode 100644 build/src/interfaces/BaseParser.js delete mode 100644 build/src/interfaces/IParser.d.ts delete mode 100644 build/src/interfaces/IParser.js delete mode 100644 build/src/interfaces/ParserInterface.d.ts delete mode 100644 build/src/interfaces/ParserInterface.js delete mode 100644 build/src/lang/common/emca.d.ts delete mode 100644 build/src/lang/common/emca.js diff --git a/README.md b/README.md index 663c49e..6b2847a 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ abstract class Parser { **Note**: See the [JavaScript parser](./src/lang/javascript/index.ts) for an example. -### Implement the Language Visitor +### Extend the Language Visitor The next step is to walk the tree that parsed by `tree-sitter` and to wrap each node as an `Node` type. Bear in mind that `tree-sitter` keeps its tree as a DOM-like structure. @@ -46,7 +46,7 @@ const nodes = walk(tree); ``` -Once the tree is wrapped, we need to implement the abstract `Visitor` visitor: +Once the tree is wrapped, we need to extend the abstract `Visitor` visitor: ```ts abstract class Visitor { diff --git a/build/corpus/nodes.d.ts b/build/corpus/nodes.d.ts deleted file mode 100644 index e69de29..0000000 diff --git a/build/corpus/nodes.js b/build/corpus/nodes.js deleted file mode 100644 index 3e4f897..0000000 --- a/build/corpus/nodes.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9jb3JwdXMvbm9kZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIiJdfQ== \ No newline at end of file diff --git a/build/src/interfaces/BaseParser.d.ts b/build/src/interfaces/BaseParser.d.ts deleted file mode 100644 index e88510e..0000000 --- a/build/src/interfaces/BaseParser.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import Source from "./Source"; -import { ASTNode } from "../lang/common/ast"; -import { Tree } from "tree-sitter"; -export default abstract class Parser { - protected source: Source; - protected options: any; - constructor(source: Source, options: any); - abstract parse(): ASTNode[]; - abstract readonly tree: Tree; -} diff --git a/build/src/interfaces/BaseParser.js b/build/src/interfaces/BaseParser.js deleted file mode 100644 index 20b13b0..0000000 --- a/build/src/interfaces/BaseParser.js +++ /dev/null @@ -1,11 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -// import IResult from "./IResult"; -class Parser { - constructor(source, options) { - this.source = source; - this.options = options || {}; - } -} -exports.default = Parser; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZVBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbnRlcmZhY2VzL0Jhc2VQYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxtQ0FBbUM7QUFFbkMsTUFBOEIsTUFBTTtJQUdsQyxZQUFZLE1BQWMsRUFBRSxPQUFZO1FBQ3RDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztJQUMvQixDQUFDO0NBR0Y7QUFURCx5QkFTQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTb3VyY2UgZnJvbSBcIi4vU291cmNlXCI7XHJcbmltcG9ydCB7IEFTVE5vZGUgfSBmcm9tIFwiLi4vbGFuZy9jb21tb24vYXN0XCI7XHJcbmltcG9ydCB7IFRyZWUgfSBmcm9tIFwidHJlZS1zaXR0ZXJcIjtcclxuLy8gaW1wb3J0IElSZXN1bHQgZnJvbSBcIi4vSVJlc3VsdFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgYWJzdHJhY3QgY2xhc3MgUGFyc2VyIHtcclxuICBwcm90ZWN0ZWQgc291cmNlOiBTb3VyY2VcclxuICBwcm90ZWN0ZWQgb3B0aW9uczogYW55XHJcbiAgY29uc3RydWN0b3Ioc291cmNlOiBTb3VyY2UsIG9wdGlvbnM6IGFueSkge1xyXG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xyXG4gIH1cclxuICBhYnN0cmFjdCBwYXJzZSgpOiBBU1ROb2RlW11cclxuICBhYnN0cmFjdCBnZXQgdHJlZSgpOiBUcmVlXHJcbn0iXX0= \ No newline at end of file diff --git a/build/src/interfaces/IParser.d.ts b/build/src/interfaces/IParser.d.ts deleted file mode 100644 index 89e7362..0000000 --- a/build/src/interfaces/IParser.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import Source from "./Source"; -import { ASTNode } from "../lang/common/ast"; -export default abstract class IParser { - constructor(file: Source, options: any); - abstract parse(): ASTNode[]; -} diff --git a/build/src/interfaces/IParser.js b/build/src/interfaces/IParser.js deleted file mode 100644 index 4a61442..0000000 --- a/build/src/interfaces/IParser.js +++ /dev/null @@ -1,9 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -// import IResult from "./IResult"; -class IParser { - constructor(file, options) { - } -} -exports.default = IParser; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSVBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbnRlcmZhY2VzL0lQYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQSxtQ0FBbUM7QUFFbkMsTUFBOEIsT0FBTztJQUNuQyxZQUFZLElBQVksRUFBRSxPQUFZO0lBRXRDLENBQUM7Q0FFRjtBQUxELDBCQUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNvdXJjZSBmcm9tIFwiLi9Tb3VyY2VcIjtcclxuaW1wb3J0IHsgQVNUTm9kZSB9IGZyb20gXCIuLi9sYW5nL2NvbW1vbi9hc3RcIjtcclxuLy8gaW1wb3J0IElSZXN1bHQgZnJvbSBcIi4vSVJlc3VsdFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgYWJzdHJhY3QgY2xhc3MgSVBhcnNlciB7XHJcbiAgY29uc3RydWN0b3IoZmlsZTogU291cmNlLCBvcHRpb25zOiBhbnkpIHtcclxuXHJcbiAgfVxyXG4gIGFic3RyYWN0IHBhcnNlKCk6IEFTVE5vZGVbXVxyXG59Il19 \ No newline at end of file diff --git a/build/src/interfaces/ParserInterface.d.ts b/build/src/interfaces/ParserInterface.d.ts deleted file mode 100644 index 320ea04..0000000 --- a/build/src/interfaces/ParserInterface.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import Source from "./Source"; -import { ASTNode } from "../lang/common/ast"; -import { Tree } from "tree-sitter"; -export default abstract class ParserInterface { - constructor(source: Source, options: any); - abstract parse(): ASTNode[]; - abstract readonly tree: Tree; -} diff --git a/build/src/interfaces/ParserInterface.js b/build/src/interfaces/ParserInterface.js deleted file mode 100644 index 4755ee4..0000000 --- a/build/src/interfaces/ParserInterface.js +++ /dev/null @@ -1,9 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -// import IResult from "./IResult"; -class ParserInterface { - constructor(source, options) { - } -} -exports.default = ParserInterface; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFyc2VySW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvUGFyc2VySW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0EsbUNBQW1DO0FBRW5DLE1BQThCLGVBQWU7SUFDM0MsWUFBWSxNQUFjLEVBQUUsT0FBWTtJQUV4QyxDQUFDO0NBR0Y7QUFORCxrQ0FNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTb3VyY2UgZnJvbSBcIi4vU291cmNlXCI7XG5pbXBvcnQgeyBBU1ROb2RlIH0gZnJvbSBcIi4uL2xhbmcvY29tbW9uL2FzdFwiO1xuaW1wb3J0IHsgVHJlZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuLy8gaW1wb3J0IElSZXN1bHQgZnJvbSBcIi4vSVJlc3VsdFwiO1xuXG5leHBvcnQgZGVmYXVsdCBhYnN0cmFjdCBjbGFzcyBQYXJzZXJJbnRlcmZhY2Uge1xuICBjb25zdHJ1Y3Rvcihzb3VyY2U6IFNvdXJjZSwgb3B0aW9uczogYW55KSB7XG5cbiAgfVxuICBhYnN0cmFjdCBwYXJzZSgpOiBBU1ROb2RlW11cbiAgYWJzdHJhY3QgZ2V0IHRyZWUoKTogVHJlZVxufSJdfQ== \ No newline at end of file diff --git a/build/src/lang/common/emca.d.ts b/build/src/lang/common/emca.d.ts deleted file mode 100644 index 55435f1..0000000 --- a/build/src/lang/common/emca.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -export interface NodeProperties { - exports: Partial; - inheritance: Partial; - namespace: boolean; - module: boolean; -} -export interface NodeExports { - export: boolean; - default: boolean; -} -export interface NodeInheritance { - extends: boolean; - implements: boolean; -} diff --git a/build/src/lang/common/emca.js b/build/src/lang/common/emca.js deleted file mode 100644 index 6291930..0000000 --- a/build/src/lang/common/emca.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1jYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2NvbW1vbi9lbWNhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIE5vZGVQcm9wZXJ0aWVzIHtcbiAgZXhwb3J0czogUGFydGlhbDxOb2RlRXhwb3J0cz5cbiAgaW5oZXJpdGFuY2U6IFBhcnRpYWw8Tm9kZUluaGVyaXRhbmNlPlxuICBuYW1lc3BhY2U6IGJvb2xlYW4sXG4gIG1vZHVsZTogYm9vbGVhblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vZGVFeHBvcnRzIHtcbiAgZXhwb3J0OiBib29sZWFuLFxuICBkZWZhdWx0OiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9kZUluaGVyaXRhbmNlIHtcbiAgZXh0ZW5kczogYm9vbGVhbixcbiAgaW1wbGVtZW50czogYm9vbGVhblxufSJdfQ== \ No newline at end of file diff --git a/build/src/lang/common/parser.d.ts b/build/src/lang/common/parser.d.ts index 73a49df..229feee 100644 --- a/build/src/lang/common/parser.d.ts +++ b/build/src/lang/common/parser.d.ts @@ -1,10 +1,16 @@ import Source from "../../interfaces/Source"; import { Tree } from "tree-sitter"; import ASTNode from "../../interfaces/ASTNode"; +import { LogOptions } from "mr-doc-utils"; +import { XDocParserOptions } from "xdoc-parser/src/XDocParser"; +export interface ParserOptions { + log: LogOptions; + documentation: XDocParserOptions; +} export default abstract class Parser { protected source: Source; - protected options: any; - constructor(source: Source, options: any); + protected options: ParserOptions; + constructor(source: Source, options: Partial); abstract parse(): ASTNode[]; abstract readonly tree: Tree; } diff --git a/build/src/lang/common/parser.js b/build/src/lang/common/parser.js index 25128d6..525435c 100644 --- a/build/src/lang/common/parser.js +++ b/build/src/lang/common/parser.js @@ -3,8 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true }); class Parser { constructor(source, options) { this.source = source; - this.options = options || {}; + this.options = Object.assign((options || {}), { + log: { + enabled: true, + levels: ['info', 'warn', 'error'] + }, + documentation: {} + }); } } exports.default = Parser; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xhbmcvY29tbW9uL3BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUlBLE1BQThCLE1BQU07SUFHbEMsWUFBWSxNQUFjLEVBQUUsT0FBWTtRQUN0QyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDL0IsQ0FBQztDQUdGO0FBVEQseUJBU0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU291cmNlIGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuaW1wb3J0IHsgVHJlZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuaW1wb3J0IEFTVE5vZGUgZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvQVNUTm9kZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBhYnN0cmFjdCBjbGFzcyBQYXJzZXIge1xuICBwcm90ZWN0ZWQgc291cmNlOiBTb3VyY2VcbiAgcHJvdGVjdGVkIG9wdGlvbnM6IGFueVxuICBjb25zdHJ1Y3Rvcihzb3VyY2U6IFNvdXJjZSwgb3B0aW9uczogYW55KSB7XG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgfVxuICBhYnN0cmFjdCBwYXJzZSgpOiBBU1ROb2RlW11cbiAgYWJzdHJhY3QgZ2V0IHRyZWUoKTogVHJlZVxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xhbmcvY29tbW9uL3BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVdBLE1BQThCLE1BQU07SUFHbEMsWUFBWSxNQUFjLEVBQUUsT0FBK0I7UUFDekQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxFQUFFO1lBQzVDLEdBQUcsRUFBRTtnQkFDSCxPQUFPLEVBQUUsSUFBSTtnQkFDYixNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQzthQUNwQjtZQUNmLGFBQWEsRUFBRSxFQUNPO1NBQ3ZCLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FHRjtBQWhCRCx5QkFnQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU291cmNlIGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuaW1wb3J0IHsgVHJlZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuaW1wb3J0IEFTVE5vZGUgZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvQVNUTm9kZVwiO1xuaW1wb3J0IHsgTG9nT3B0aW9ucyB9IGZyb20gXCJtci1kb2MtdXRpbHNcIjtcbmltcG9ydCB7IFhEb2NQYXJzZXJPcHRpb25zIH0gZnJvbSBcInhkb2MtcGFyc2VyL3NyYy9YRG9jUGFyc2VyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VyT3B0aW9ucyB7XG4gIGxvZzogTG9nT3B0aW9ucyxcbiAgZG9jdW1lbnRhdGlvbjogWERvY1BhcnNlck9wdGlvbnNcbn1cblxuZXhwb3J0IGRlZmF1bHQgYWJzdHJhY3QgY2xhc3MgUGFyc2VyIHtcbiAgcHJvdGVjdGVkIHNvdXJjZTogU291cmNlXG4gIHByb3RlY3RlZCBvcHRpb25zOiBQYXJzZXJPcHRpb25zXG4gIGNvbnN0cnVjdG9yKHNvdXJjZTogU291cmNlLCBvcHRpb25zOiBQYXJ0aWFsPFBhcnNlck9wdGlvbnM+KSB7XG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbigob3B0aW9ucyB8fCB7fSksIHtcbiAgICAgIGxvZzoge1xuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICBsZXZlbHM6IFsnaW5mbycsICd3YXJuJywgJ2Vycm9yJ11cbiAgICAgIH0gYXMgTG9nT3B0aW9ucyxcbiAgICAgIGRvY3VtZW50YXRpb246IHtcbiAgICAgIH0gYXMgWERvY1BhcnNlck9wdGlvbnNcbiAgICB9KTtcbiAgfVxuICBhYnN0cmFjdCBwYXJzZSgpOiBBU1ROb2RlW11cbiAgYWJzdHJhY3QgZ2V0IHRyZWUoKTogVHJlZVxufSJdfQ== \ No newline at end of file diff --git a/build/src/lang/common/visitor.d.ts b/build/src/lang/common/visitor.d.ts index 87d1c92..74c8f51 100644 --- a/build/src/lang/common/visitor.d.ts +++ b/build/src/lang/common/visitor.d.ts @@ -1,6 +1,16 @@ import { SyntaxNode } from "tree-sitter"; import ASTNode from "../../interfaces/ASTNode"; +import { LogOptions } from "mr-doc-utils"; +import { XDocParserOptions } from "xdoc-parser/src/XDocParser"; +import ParserLogger from "../../utils/log"; +export interface VisitorOptions { + log: LogOptions; + documentation: XDocParserOptions; +} export default abstract class Visitor { + protected options: Partial; + protected logger: ParserLogger; + constructor(options?: Partial); abstract getAST(): ASTNode[]; abstract visitNode(node: SyntaxNode, properties?: object): ASTNode; abstract visitChildren(nodes: SyntaxNode[], properties?: object): ASTNode[]; diff --git a/build/src/lang/common/visitor.js b/build/src/lang/common/visitor.js index 391e1eb..406eae4 100644 --- a/build/src/lang/common/visitor.js +++ b/build/src/lang/common/visitor.js @@ -1,6 +1,11 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); +const log_1 = require("../../utils/log"); class Visitor { + constructor(options) { + this.options = options; + this.logger = new log_1.default('mr-doc-parser::parser', this.options.log); + } } exports.default = Visitor; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2NvbW1vbi92aXNpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0EsTUFBOEIsT0FBTztDQUlwQztBQUpELDBCQUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuaW1wb3J0IEFTVE5vZGUgZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvQVNUTm9kZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBhYnN0cmFjdCBjbGFzcyBWaXNpdG9yIHtcbiAgYWJzdHJhY3QgZ2V0QVNUKCk6IEFTVE5vZGVbXVxuICBhYnN0cmFjdCB2aXNpdE5vZGUobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IG9iamVjdCk6IEFTVE5vZGVcbiAgYWJzdHJhY3QgdmlzaXRDaGlsZHJlbihub2RlczogU3ludGF4Tm9kZVtdLCBwcm9wZXJ0aWVzPzogb2JqZWN0KTogQVNUTm9kZVtdXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2NvbW1vbi92aXNpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBSUEseUNBQTJDO0FBTzNDLE1BQThCLE9BQU87SUFHbkMsWUFBWSxPQUFpQztRQUMzQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksYUFBWSxDQUFDLHVCQUF1QixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUUsQ0FBQztDQUlGO0FBVkQsMEJBVUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgQVNUTm9kZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9BU1ROb2RlXCI7XG5pbXBvcnQgeyBMb2dPcHRpb25zLCBMb2dJbnRlcmZhY2UgfSBmcm9tIFwibXItZG9jLXV0aWxzXCI7XG5pbXBvcnQgeyBYRG9jUGFyc2VyT3B0aW9ucyB9IGZyb20gXCJ4ZG9jLXBhcnNlci9zcmMvWERvY1BhcnNlclwiO1xuaW1wb3J0IFBhcnNlckxvZ2dlciBmcm9tIFwiLi4vLi4vdXRpbHMvbG9nXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmlzaXRvck9wdGlvbnMge1xuICBsb2c6IExvZ09wdGlvbnMsXG4gIGRvY3VtZW50YXRpb246IFhEb2NQYXJzZXJPcHRpb25zXG59XG5cbmV4cG9ydCBkZWZhdWx0IGFic3RyYWN0IGNsYXNzIFZpc2l0b3Ige1xuICBwcm90ZWN0ZWQgb3B0aW9uczogUGFydGlhbDxWaXNpdG9yT3B0aW9ucz5cbiAgcHJvdGVjdGVkIGxvZ2dlcjogUGFyc2VyTG9nZ2VyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBQYXJ0aWFsPFZpc2l0b3JPcHRpb25zPikge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5sb2dnZXIgPSBuZXcgUGFyc2VyTG9nZ2VyKCdtci1kb2MtcGFyc2VyOjpwYXJzZXInLCB0aGlzLm9wdGlvbnMubG9nKTtcbiAgfVxuICBhYnN0cmFjdCBnZXRBU1QoKTogQVNUTm9kZVtdXG4gIGFic3RyYWN0IHZpc2l0Tm9kZShub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogb2JqZWN0KTogQVNUTm9kZVxuICBhYnN0cmFjdCB2aXNpdENoaWxkcmVuKG5vZGVzOiBTeW50YXhOb2RlW10sIHByb3BlcnRpZXM/OiBvYmplY3QpOiBBU1ROb2RlW11cbn0iXX0= \ No newline at end of file diff --git a/build/src/lang/javascript/index.js b/build/src/lang/javascript/index.js index a678515..864d113 100644 --- a/build/src/lang/javascript/index.js +++ b/build/src/lang/javascript/index.js @@ -22,7 +22,7 @@ class JavaScriptParser extends parser_1.default { this.tree_ = this.parser.parse(this.source.text); } parse() { - const visitor = new visitor_1.JavaScriptVisitor(this.source); + const visitor = new visitor_1.JavaScriptVisitor(this.source, this.options); const nodes = walk_1.default(this.tree_.rootNode); nodes.visit(visitor); return visitor.getAST(); @@ -32,4 +32,4 @@ class JavaScriptParser extends parser_1.default { } } exports.default = JavaScriptParser; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy9qYXZhc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsMENBQTBDO0FBQzFDLHFEQUFxRDtBQUNyRCw2Q0FBc0M7QUFFdEMsdUNBQThDO0FBQzlDLDJDQUFvQztBQUdwQzs7Ozs7Ozs7R0FRRztBQUNILE1BQXFCLGdCQUFpQixTQUFRLGdCQUFNO0lBR2xELFlBQVksTUFBYyxFQUFFLE9BQVk7UUFDdEMsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFDRCxLQUFLO1FBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSwyQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkQsTUFBTSxLQUFLLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNwQixPQUFPLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBQ0QsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7Q0FDRjtBQWxCRCxtQ0FrQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBUcmVlU2l0dGVyIGZyb20gJ3RyZWUtc2l0dGVyJztcbmltcG9ydCAqIGFzIEphdmFTY3JpcHQgZnJvbSAndHJlZS1zaXR0ZXItamF2YXNjcmlwdCc7XG5pbXBvcnQgUGFyc2VyIGZyb20gJy4uL2NvbW1vbi9wYXJzZXInO1xuaW1wb3J0IFNvdXJjZSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZSc7XG5pbXBvcnQgeyBKYXZhU2NyaXB0VmlzaXRvciB9IGZyb20gJy4vdmlzaXRvcic7XG5pbXBvcnQgd2FsayBmcm9tICcuLi8uLi91dGlscy93YWxrJztcbmltcG9ydCBBU1ROb2RlIGZyb20gJy4uLy4uL2ludGVyZmFjZXMvQVNUTm9kZSc7XG5cbi8qKlxuICogQSBjbGFzcyB0aGF0IHBhcnNlcyBKYXZhU2NyaXB0IGNvbW1lbnRzLlxuICogXG4gKiAjIEFQSVxuICogXG4gKiBAY2xhc3MgSmF2YVNjcmlwdFBhcnNlclxuICogQGltcGxlbWVudHMgSVBhcnNlclxuICogQGV4cG9ydCBkZWZhdWx0XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEphdmFTY3JpcHRQYXJzZXIgZXh0ZW5kcyBQYXJzZXIge1xuICBwcml2YXRlIHBhcnNlcjogVHJlZVNpdHRlcjtcbiAgcHJpdmF0ZSB0cmVlXzogVHJlZVNpdHRlci5UcmVlO1xuICBjb25zdHJ1Y3Rvcihzb3VyY2U6IFNvdXJjZSwgb3B0aW9uczogYW55KSB7XG4gICAgc3VwZXIoc291cmNlLCBvcHRpb25zKTtcbiAgICB0aGlzLnBhcnNlciA9IG5ldyBUcmVlU2l0dGVyKCk7XG4gICAgdGhpcy5wYXJzZXIuc2V0TGFuZ3VhZ2UoSmF2YVNjcmlwdCk7XG4gICAgdGhpcy50cmVlXyA9IHRoaXMucGFyc2VyLnBhcnNlKHRoaXMuc291cmNlLnRleHQpO1xuICB9XG4gIHBhcnNlKCk6IEFTVE5vZGVbXSB7XG4gICAgY29uc3QgdmlzaXRvciA9IG5ldyBKYXZhU2NyaXB0VmlzaXRvcih0aGlzLnNvdXJjZSk7XG4gICAgY29uc3Qgbm9kZXMgPSB3YWxrKHRoaXMudHJlZV8ucm9vdE5vZGUpO1xuICAgIG5vZGVzLnZpc2l0KHZpc2l0b3IpXG4gICAgcmV0dXJuIHZpc2l0b3IuZ2V0QVNUKCk7XG4gIH1cbiAgZ2V0IHRyZWUgKCk6IFRyZWVTaXR0ZXIuVHJlZSB7XG4gICAgcmV0dXJuIHRoaXMudHJlZV87XG4gIH1cbn0iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy9qYXZhc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsMENBQTBDO0FBQzFDLHFEQUFxRDtBQUNyRCw2Q0FBc0M7QUFFdEMsdUNBQThDO0FBQzlDLDJDQUFvQztBQUdwQzs7Ozs7Ozs7R0FRRztBQUNILE1BQXFCLGdCQUFpQixTQUFRLGdCQUFNO0lBR2xELFlBQVksTUFBYyxFQUFFLE9BQVk7UUFDdEMsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFDRCxLQUFLO1FBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSwyQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqRSxNQUFNLEtBQUssR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4QyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3BCLE9BQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFDRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztDQUNGO0FBbEJELG1DQWtCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFRyZWVTaXR0ZXIgZnJvbSAndHJlZS1zaXR0ZXInO1xuaW1wb3J0ICogYXMgSmF2YVNjcmlwdCBmcm9tICd0cmVlLXNpdHRlci1qYXZhc2NyaXB0JztcbmltcG9ydCBQYXJzZXIgZnJvbSAnLi4vY29tbW9uL3BhcnNlcic7XG5pbXBvcnQgU291cmNlIGZyb20gJy4uLy4uL2ludGVyZmFjZXMvU291cmNlJztcbmltcG9ydCB7IEphdmFTY3JpcHRWaXNpdG9yIH0gZnJvbSAnLi92aXNpdG9yJztcbmltcG9ydCB3YWxrIGZyb20gJy4uLy4uL3V0aWxzL3dhbGsnO1xuaW1wb3J0IEFTVE5vZGUgZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9BU1ROb2RlJztcblxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgcGFyc2VzIEphdmFTY3JpcHQgY29tbWVudHMuXG4gKiBcbiAqICMgQVBJXG4gKiBcbiAqIEBjbGFzcyBKYXZhU2NyaXB0UGFyc2VyXG4gKiBAaW1wbGVtZW50cyBJUGFyc2VyXG4gKiBAZXhwb3J0IGRlZmF1bHRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSmF2YVNjcmlwdFBhcnNlciBleHRlbmRzIFBhcnNlciB7XG4gIHByaXZhdGUgcGFyc2VyOiBUcmVlU2l0dGVyO1xuICBwcml2YXRlIHRyZWVfOiBUcmVlU2l0dGVyLlRyZWU7XG4gIGNvbnN0cnVjdG9yKHNvdXJjZTogU291cmNlLCBvcHRpb25zOiBhbnkpIHtcbiAgICBzdXBlcihzb3VyY2UsIG9wdGlvbnMpO1xuICAgIHRoaXMucGFyc2VyID0gbmV3IFRyZWVTaXR0ZXIoKTtcbiAgICB0aGlzLnBhcnNlci5zZXRMYW5ndWFnZShKYXZhU2NyaXB0KTtcbiAgICB0aGlzLnRyZWVfID0gdGhpcy5wYXJzZXIucGFyc2UodGhpcy5zb3VyY2UudGV4dCk7XG4gIH1cbiAgcGFyc2UoKTogQVNUTm9kZVtdIHtcbiAgICBjb25zdCB2aXNpdG9yID0gbmV3IEphdmFTY3JpcHRWaXNpdG9yKHRoaXMuc291cmNlLCB0aGlzLm9wdGlvbnMpO1xuICAgIGNvbnN0IG5vZGVzID0gd2Fsayh0aGlzLnRyZWVfLnJvb3ROb2RlKTtcbiAgICBub2Rlcy52aXNpdCh2aXNpdG9yKVxuICAgIHJldHVybiB2aXNpdG9yLmdldEFTVCgpO1xuICB9XG4gIGdldCB0cmVlICgpOiBUcmVlU2l0dGVyLlRyZWUge1xuICAgIHJldHVybiB0aGlzLnRyZWVfO1xuICB9XG59Il19 \ No newline at end of file diff --git a/build/src/lang/javascript/visitor.d.ts b/build/src/lang/javascript/visitor.d.ts index a9a2f36..173dc59 100644 --- a/build/src/lang/javascript/visitor.d.ts +++ b/build/src/lang/javascript/visitor.d.ts @@ -1,15 +1,15 @@ import { SyntaxNode } from "tree-sitter"; import Source from "../../interfaces/Source"; -import Visitor from "../common/visitor"; +import Visitor, { VisitorOptions } from "../common/visitor"; import ASTNode from "../../interfaces/ASTNode"; import { JavaScriptProperties } from "./properties"; /** * A class that visits ASTNodes from a TypeScript tree. */ -export declare class JavaScriptVisitor implements Visitor { +export declare class JavaScriptVisitor extends Visitor { private ast; private source; - constructor(source: Source); + constructor(source: Source, options: Partial); /** * Determines whether a node has inheritance */ diff --git a/build/src/lang/javascript/visitor.js b/build/src/lang/javascript/visitor.js index 3871d9e..e685162 100644 --- a/build/src/lang/javascript/visitor.js +++ b/build/src/lang/javascript/visitor.js @@ -6,11 +6,13 @@ const sibling_1 = require("../../utils/sibling"); const _ = require("lodash"); const log_1 = require("../../utils/log"); const match_1 = require("../../utils/match"); +const visitor_1 = require("../common/visitor"); /** * A class that visits ASTNodes from a TypeScript tree. */ -class JavaScriptVisitor { - constructor(source) { +class JavaScriptVisitor extends visitor_1.default { + constructor(source, options) { + super(options); this.ast = []; /* Visitors */ this.visitNode = (node, properties) => { @@ -22,7 +24,7 @@ class JavaScriptVisitor { return this.visitComment(node); case 'MISSING': case 'ERROR': - log_1.default.report(this.source, node, log_1.ErrorType.TreeSitterParseError); + this.logger.report(this.source, node, log_1.ErrorType.TreeSitterParseError); break; default: /* Match other non-terminals */ @@ -35,7 +37,7 @@ class JavaScriptVisitor { if (match_1.default(node, 'identifier', 'extends', 'property_identifier', 'accessibility_modifier', 'null', 'undefined', 'return', 'get', 'function', 'namespace', 'if', 'const')) { return this.visitTerminal(node); } - log_1.default.report(this.source, node, log_1.ErrorType.NodeTypeNotYetSupported); + this.logger.report(this.source, node, log_1.ErrorType.NodeTypeNotYetSupported); return; } }; @@ -123,7 +125,7 @@ class JavaScriptVisitor { case 'lexical_declaration': return this.visitNonTerminal(node, properties); default: - log_1.default.report(this.source, node, log_1.ErrorType.NodeTypeNotYetSupported); + this.logger.report(this.source, node, log_1.ErrorType.NodeTypeNotYetSupported); return; } }; @@ -276,4 +278,4 @@ class JavaScriptVisitor { } } exports.JavaScriptVisitor = JavaScriptVisitor; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2phdmFzY3JpcHQvdmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHVDQUE4QztBQUM5QyxpREFBdUQ7QUFDdkQsaURBQThDO0FBRTlDLDRCQUE0QjtBQUM1Qix5Q0FBaUQ7QUFDakQsNkNBQXNDO0FBTXRDOztHQUVHO0FBQ0gsTUFBYSxpQkFBaUI7SUFHNUIsWUFBWSxNQUFjO1FBRmxCLFFBQUcsR0FBYyxFQUFFLENBQUE7UUFtRTNCLGVBQWU7UUFFZixjQUFTLEdBQUcsQ0FDVixJQUFnQixFQUNoQixVQUEwQyxFQUMxQyxFQUFFO1lBQ0YsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNqQixLQUFLLFNBQVM7b0JBQ1osSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNuQyxNQUFNO2dCQUNSLEtBQUssU0FBUztvQkFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pDLEtBQUssU0FBUyxDQUFDO2dCQUNmLEtBQUssT0FBTztvQkFDVixhQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO29CQUM5RCxNQUFNO2dCQUNSO29CQUVFLCtCQUErQjtvQkFFL0IsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUNaLFlBQVksRUFDWixtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFDM0QsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQ3pFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQ3RFLG1CQUFtQixFQUFFLFlBQVksRUFDakMsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixrQkFBa0Is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SSxlQUFLLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxFQUFFO2dCQUMzQixPQUFPLElBQUksQ0FBQzthQUNiO1NBQ0Y7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNLLFVBQVUsQ0FBQyxJQUFnQixFQUFFLElBQVk7UUFDL0MsSUFBSSxRQUFRLEdBQWlCLEVBQUUsQ0FBQztRQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLGVBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ3RCLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDdEI7U0FDRjtRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxNQUFNO1FBQ0osT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2xCLENBQUM7Q0E0UUY7QUE5VUQsOENBOFVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlQVNUTm9kZSB9IGZyb20gXCIuLi9jb21tb24vYXN0XCI7XG5pbXBvcnQgeyBpc0phdmFEb2NDb21tZW50IH0gZnJvbSBcIi4uLy4uL3V0aWxzL2NvbW1lbnRcIjtcbmltcG9ydCB7IHNpYmxpbmcgfSBmcm9tIFwiLi4vLi4vdXRpbHMvc2libGluZ1wiO1xuaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGxvZywgeyBFcnJvclR5cGUgfSBmcm9tIFwiLi4vLi4vdXRpbHMvbG9nXCI7XG5pbXBvcnQgbWF0Y2ggZnJvbSBcIi4uLy4uL3V0aWxzL21hdGNoXCI7XG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuaW1wb3J0IFZpc2l0b3IgZnJvbSBcIi4uL2NvbW1vbi92aXNpdG9yXCI7XG5pbXBvcnQgQVNUTm9kZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9BU1ROb2RlXCI7XG5pbXBvcnQgeyBKYXZhU2NyaXB0UHJvcGVydGllcywgSmF2YVNjcmlwdEluaGVyaXRhbmNlIH0gZnJvbSBcIi4vcHJvcGVydGllc1wiO1xuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCB2aXNpdHMgQVNUTm9kZXMgZnJvbSBhIFR5cGVTY3JpcHQgdHJlZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEphdmFTY3JpcHRWaXNpdG9yIGltcGxlbWVudHMgVmlzaXRvciB7XG4gIHByaXZhdGUgYXN0OiBBU1ROb2RlW10gPSBbXVxuICBwcml2YXRlIHNvdXJjZTogU291cmNlXG4gIGNvbnN0cnVjdG9yKHNvdXJjZTogU291cmNlKSB7XG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgbm9kZSBoYXMgaW5oZXJpdGFuY2VcbiAgICovXG4gIHByaXZhdGUgaGFzSW5oZXJpdGFuY2Uobm9kZTogU3ludGF4Tm9kZSkge1xuICAgIGxldCBpbmhlcml0cyA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgaWYgKG1hdGNoKGNoaWxkLCAnZXh0ZW5kcycsICdpbXBsZW1lbnRzJykpIHtcbiAgICAgICAgaW5oZXJpdHMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW5oZXJpdHNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbm9kZSdzIGluaGVyaXRhbmNlIHR5cGVcbiAgICovXG4gIHByaXZhdGUgZ2V0SW5oZXJpdGFuY2VUeXBlKG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXTtcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ2V4dGVuZHMnKSkge1xuICAgICAgICByZXR1cm4gJ2V4dGVuZHMnO1xuICAgICAgfVxuXG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdpbXBsZW1lbnRzJykpIHtcbiAgICAgICAgcmV0dXJuICdpbXBsZW1lbnRzJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGV4cG9ydCBpcyBkZWZhdWx0XG4gICAqL1xuICBwcml2YXRlIGhhc0RlZmF1bHRFeHBvcnQobm9kZTogU3ludGF4Tm9kZSk6IGJvb2xlYW4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgaWYgKG1hdGNoKGNoaWxkLCAnZGVmYXVsdCcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBvbmx5IHRoZSBjb21tZW50cyBmcm9tIGEgbm9kZSdzIGNoaWxkcmVuLlxuICAgKi9cbiAgcHJpdmF0ZSBmaWx0ZXJUeXBlKG5vZGU6IFN5bnRheE5vZGUsIHR5cGU6IHN0cmluZyk6IFN5bnRheE5vZGVbXSB7XG4gICAgbGV0IGNoaWxkcmVuOiBTeW50YXhOb2RlW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXTtcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgdHlwZSkpIHtcbiAgICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjaGlsZHJlbjtcbiAgfVxuXG4gIGdldEFTVCgpOiBBU1ROb2RlW10ge1xuICAgIHJldHVybiB0aGlzLmFzdDtcbiAgfVxuXG4gIC8qIFZpc2l0b3JzICAqL1xuXG4gIHZpc2l0Tm9kZSA9IChcbiAgICBub2RlOiBTeW50YXhOb2RlLFxuICAgIHByb3BlcnRpZXM/OiBQYXJ0aWFsPEphdmFTY3JpcHRQcm9wZXJ0aWVzPlxuICApID0+IHtcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSAncHJvZ3JhbSc6XG4gICAgICAgIHRoaXMuYXN0ID0gdGhpcy52aXNpdFByb2dyYW0obm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY29tbWVudCc6XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0Q29tbWVudChub2RlKTtcbiAgICAgIGNhc2UgJ01JU1NJTkcnOlxuICAgICAgY2FzZSAnRVJST1InOlxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuVHJlZVNpdHRlclBhcnNlRXJyb3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG5cbiAgICAgICAgLyogTWF0Y2ggb3RoZXIgbm9uLXRlcm1pbmFscyAqL1xuXG4gICAgICAgIGlmIChtYXRjaChub2RlLFxuICAgICAgICAgICdjb25zdHJhaW50JyxcbiAgICAgICAgICAnZm9ybWFsX3BhcmFtZXRlcnMnLCAncmVxdWlyZWRfcGFyYW1ldGVyJywgJ3Jlc3RfcGFyYW1ldGVyJyxcbiAgICAgICAgICAndHlwZV9pZGVudGlmaWVyJywgJ3R5cGVfcGFyYW1ldGVycycsICd0eXBlX3BhcmFtZXRlcicsICd0eXBlX2Fubm90YXRpb24nLFxuICAgICAgICAgICdvYmplY3RfdHlwZScsICdwcmVkZWZpbmVkX3R5cGUnLCAncGFyZW50aGVzaXplZF90eXBlJywgJ2xpdGVyYWxfdHlwZScsXG4gICAgICAgICAgJ2ludGVyc2VjdGlvbl90eXBlJywgJ3VuaW9uX3R5cGUnLFxuICAgICAgICAgICdjbGFzc19ib2R5JyxcbiAgICAgICAgICAnZXh0ZW5kc19jbGF1c2UnLFxuICAgICAgICAgICd1bmFyeV9leHByZXNzaW9uJywgJ2JpbmFyeV9leHByZXNzaW9uJywgJ3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbicsICdtZW1iZXJfZXhwcmVzc2lvbicsXG4gICAgICAgICAgJ3N0YXRlbWVudF9ibG9jaycsICdyZXR1cm5fc3RhdGVtZW50JywgJ2V4cG9ydF9zdGF0ZW1lbnQnLCAnZXhwcmVzc2lvbl9zdGF0ZW1lbnQnLFxuICAgICAgICAgIC8vIEEgY2FsbF9zaWduYXR1cmUgY2FuIGFsc28gYmUgYSBub24tY29udGV4dHVhbCBub2RlXG4gICAgICAgICAgJ2NhbGxfc2lnbmF0dXJlJyxcbiAgICAgICAgICAnaW50ZXJuYWxfbW9kdWxlJyxcbiAgICAgICAgICAnaWZfc3RhdGVtZW50J1xuICAgICAgICApKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudmlzaXROb25UZXJtaW5hbChub2RlLCBwcm9wZXJ0aWVzKVxuICAgICAgICB9XG5cbiAgICAgICAgLyogTWF0Y2ggdGVybWluYWxzICovXG4gICAgICAgIGlmIChtYXRjaChub2RlLFxuICAgICAgICAgICdpZGVudGlmaWVyJywgJ2V4dGVuZHMnLCAncHJvcGVydHlfaWRlbnRpZmllcicsICdhY2Nlc3NpYmlsaXR5X21vZGlmaWVyJyxcbiAgICAgICAgICAnbnVsbCcsICd1bmRlZmluZWQnLCAncmV0dXJuJyxcbiAgICAgICAgICAnZ2V0JywgJ2Z1bmN0aW9uJywgJ25hbWVzcGFjZScsICdpZicsICdjb25zdCdcbiAgICAgICAgKSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnZpc2l0VGVybWluYWwobm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgdmlzaXRDaGlsZHJlbiA9IChub2RlczogU3ludGF4Tm9kZVtdKTogQVNUTm9kZVtdID0+IHtcbiAgICBsZXQgY2hpbGRyZW46IEFTVE5vZGVbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgIGlmICghbm9kZS50eXBlLm1hdGNoKC9bPD4oKXt9LDo7XFxbXFxdJnw9XFwrXFwtXFwqXFwvIS5dLykgJiYgbm9kZS50eXBlICE9PSAnLi4uJykge1xuICAgICAgICBjb25zdCBjaGlsZCA9IHRoaXMudmlzaXROb2RlKG5vZGUpO1xuICAgICAgICBpZiAoY2hpbGQpIGNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cblxuICBwcml2YXRlIHZpc2l0UHJvZ3JhbSA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZVtdID0+IHtcbiAgICBsZXQgdmlzaXRlZCA9IHt9LFxuICAgICAgZ2V0U3RhcnRMb2NhdGlvbiA9IChuOiBBU1ROb2RlKSA9PiBgJHtuLmxvY2F0aW9uLnJvdy5zdGFydH06JHtuLmxvY2F0aW9uLmNvbHVtbi5zdGFydH1gO1xuICAgIC8vIEEgcHJvZ3JhbSBjYW4gaGF2ZSBtb2R1bGVzLCBuYW1lc3BhY2VzLCBjb21tZW50cyBhcyBpdHMgY2hpbGRyZW5cbiAgICAvLyBUaGUgZmlyc3Qgc3RlcCBpcyB0byBwYXJzZSBhbGwgdGhlIGNvbW1lbnRzIGluIHRoZSByb290IG5vZGVcbiAgICBsZXQgY29tbWVudHMgPSB0aGlzLnZpc2l0Q2hpbGRyZW4odGhpcy5maWx0ZXJUeXBlKG5vZGUsICdjb21tZW50JykpO1xuICAgIC8vIFBhcnNlIHRoZSBuYW1lc3BhY2VzIGluIGV4cHJlc3Npb25fc3RhdGVtZW50XG4gICAgLy8gbGV0IG5hbWVzcGFjZXMgPSB0aGlzLnZpc2l0Q2hpbGRyZW4odGhpcy5maWx0ZXJUeXBlKG5vZGUsICdleHByZXNzaW9uX3N0YXRlbWVudCcpKTtcbiAgICAvLyBQYXJzZSB0aGUgZXhwb3J0IHN0YXRlbWVudHMgaW4gdGhlIHJvb3Qgbm9kZVxuICAgIGxldCBleHBvcnRzID0gdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShub2RlLCAnZXhwb3J0X3N0YXRlbWVudCcpKTtcblxuICAgIC8vIEdldCB0aGUgdmlzaXRlZCBjb250ZXh0IG5vZGVzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21tZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY29tbWVudCA9IGNvbW1lbnRzW2ldO1xuICAgICAgY29uc3QgY29udGV4dCA9IGNvbW1lbnQ7XG4gICAgICB2aXNpdGVkW2dldFN0YXJ0TG9jYXRpb24oY29udGV4dCldID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBFeHBvcnRzIGFyZSBvZGRiYWxscyBzaW5jZSBzb21lIGV4cG9ydHMgbWF5IHJlZmVyZW5jZVxuICAgIC8vIGEgdHlwZS9ub2RlIHRoYXQgbWF5IGhhdmUgYmVlbiBjb21tZW50ZWQuXG4gICAgLy8gV2UnbGwgZmlyc3QgbmVlZCB0byBmaWx0ZXIgdGhlIG9uZXMgd2UgaGF2ZSB2aXNpdGVkXG4gICAgXy5yZW1vdmUoZXhwb3J0cywgeCA9PiB2aXNpdGVkW2dldFN0YXJ0TG9jYXRpb24oeCldKTtcblxuICAgIC8vIEZyb20gdGhlIG9uZXMgd2UgaGF2ZSBub3QgdmlzaXRlZCwgd2UnbGwgbmVlZCB0byBtb2RpZnlcbiAgICAvLyB0aGUgbm9kZSBwcm9wZXJ0aWVzIG9mIGVhY2ggY29udGV4dCBpbiBhIGNvbW1lbnQgbm9kZSB0aGF0XG4gICAgLy8gbWF0Y2hlcyB0aGUgb25lcyB3ZSBoYXZlIG5vdCB2aXNpdGVkLlxuICAgIGNvbnN0IG1hdGNoZWQgPSB7fTtcbiAgICBjb21tZW50cyA9IF8uY29tcGFjdChcbiAgICAgIGNvbW1lbnRzLm1hcChjb21tZW50ID0+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBvcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZXhwb3J0XyA9IGV4cG9ydHNbaV07XG4gICAgICAgICAgY29uc3QgY29udGV4dCA9IGNvbW1lbnQuY29udGV4dDtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgY29udGV4dCAmJiBqIDwgY29udGV4dC5jaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKGNvbnRleHQuY2hpbGRyZW5baV0gJiYgY29udGV4dC5jaGlsZHJlbltpXS50eXBlID09PSBleHBvcnRfLnR5cGUpIHtcbiAgICAgICAgICAgICAgbWF0Y2hlZFtnZXRTdGFydExvY2F0aW9uKGV4cG9ydF8pXSA9IHRydWU7XG4gICAgICAgICAgICAgIGNvbW1lbnQuY29udGV4dC5wcm9wZXJ0aWVzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICBjb21tZW50LmNvbnRleHQucHJvcGVydGllcyB8fCB7fSxcbiAgICAgICAgICAgICAgICBleHBvcnRfLnByb3BlcnRpZXNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbW1lbnQ7XG4gICAgICB9KSk7XG5cbiAgICAvLyBSZW1vdmVkIHRoZSBtYXRjaGVkIGV4cG9ydHNcbiAgICBfLnJlbW92ZShleHBvcnRzLCB4ID0+IG1hdGNoZWRbZ2V0U3RhcnRMb2NhdGlvbih4KV0pXG5cbiAgICByZXR1cm4gW10uY29uY2F0KGNvbW1lbnRzKS5jb25jYXQoZXhwb3J0cyk7XG4gIH1cblxuICBwcml2YXRlIHZpc2l0Q29tbWVudCA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZSA9PiB7XG4gICAgaWYgKGlzSmF2YURvY0NvbW1lbnQodGhpcy5zb3VyY2UsIG5vZGUpKSB7XG4gICAgICBjb25zdCBuZXh0U2libGluZyA9IHNpYmxpbmcobm9kZSk7XG4gICAgICBpZiAobmV4dFNpYmxpbmcpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIHRoaXMudmlzaXRDb250ZXh0KG5leHRTaWJsaW5nLCB7fSksIHRydWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZpc2l0IHRoZSBjb250ZXh0dWFsIG5vZGVcbiAgICogXG4gICAqICMgUmVtYXJrXG4gICAqIFxuICAgKiBBIG5vZGUgaXMgY29uc2lkZXJlZCBjb250ZXh0dWFsIHdoZW4gYSBjb21tZW50IGlzIHZpc2l0ZWQgYW5kIHRoZSBub2RlIGlzIGl0cyBzaWJsaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSB2aXNpdENvbnRleHQgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8SmF2YVNjcmlwdFByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2V4cG9ydF9zdGF0ZW1lbnQnOlxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdEV4cG9ydFN0YXRlbWVudChub2RlLCBwcm9wZXJ0aWVzKTtcbiAgICAgIGNhc2UgJ2V4cHJlc3Npb25fc3RhdGVtZW50JzpcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KG5vZGUsIHByb3BlcnRpZXMpO1xuICAgICAgY2FzZSAnY2xhc3MnOlxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdENsYXNzKG5vZGUsIHByb3BlcnRpZXMpXG4gICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICBjYXNlICdjYWxsX3NpZ25hdHVyZSc6XG4gICAgICBjYXNlICdtZXRob2Rfc2lnbmF0dXJlJzpcbiAgICAgIGNhc2UgJ3Byb3BlcnR5X3NpZ25hdHVyZSc6XG4gICAgICBjYXNlICdwdWJsaWNfZmllbGRfZGVmaW5pdGlvbic6XG4gICAgICBjYXNlICdtZXRob2RfZGVmaW5pdGlvbic6XG4gICAgICBjYXNlICdsZXhpY2FsX2RlY2xhcmF0aW9uJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXROb25UZXJtaW5hbChub2RlLCBwcm9wZXJ0aWVzKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGxvZy5yZXBvcnQodGhpcy5zb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFlldFN1cHBvcnRlZCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICAvKiBTdGF0ZW1lbnRzICovXG5cbiAgcHJpdmF0ZSB2aXNpdEV4cG9ydFN0YXRlbWVudCA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxKYXZhU2NyaXB0UHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcbiAgICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuLCBkZWZhdWx0RXhwb3J0ID0gZmFsc2U7XG4gICAgLy8gUmVtb3ZlICdleHBvcnQnIHNpbmNlIGl0J3MgYWx3YXlzIGZpcnN0IGluIHRoZSBhcnJheVxuICAgIGNoaWxkcmVuLnNoaWZ0KCk7XG4gICAgaWYgKHRoaXMuaGFzRGVmYXVsdEV4cG9ydChub2RlKSkge1xuICAgICAgZGVmYXVsdEV4cG9ydCA9IHRydWU7XG4gICAgICAvLyBSZW1vdmUgJ2RlZmF1bHQnIGV4cG9ydFxuICAgICAgY2hpbGRyZW4uc2hpZnQoKTtcbiAgICB9XG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbi5zaGlmdCgpO1xuICAgIHJldHVybiB0aGlzLnZpc2l0Tm9kZShjaGlsZCwgeyBleHBvcnRzOiB7IGV4cG9ydDogdHJ1ZSwgZGVmYXVsdDogZGVmYXVsdEV4cG9ydCB9IH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllczogUGFydGlhbDxKYXZhU2NyaXB0UHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcbiAgICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW4uc2hpZnQoKTtcblxuICAgIGlmIChtYXRjaChjaGlsZCwgJ2ludGVybmFsX21vZHVsZScpKSB7XG4gICAgICByZXR1cm4gdGhpcy52aXNpdEludGVybmFsTW9kdWxlKGNoaWxkLCBwcm9wZXJ0aWVzKVxuICAgIH1cblxuICAgIGlmIChtYXRjaChjaGlsZCwgJ2Z1bmN0aW9uJykpIHtcbiAgICAgIGlmIChwcm9wZXJ0aWVzKSByZXR1cm4gdGhpcy52aXNpdENvbnRleHQoY2hpbGQpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnZpc2l0Tm9uVGVybWluYWwoY2hpbGQpXG4gIH1cblxuICAvKiBNb2R1bGVzICovXG5cbiAgcHJpdmF0ZSB2aXNpdEludGVybmFsTW9kdWxlID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPEphdmFTY3JpcHRQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xuICAgIGxldCBjaGlsZHJlbjogQVNUTm9kZVtdID0gbm9kZS5jaGlsZHJlbi5tYXAoY2hpbGQgPT4ge1xuICAgICAgaWYgKG1hdGNoKGNoaWxkLCAnc3RhdGVtZW50X2Jsb2NrJykpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIHRoaXMudmlzaXRDaGlsZHJlbih0aGlzLmZpbHRlclR5cGUoY2hpbGQsICdjb21tZW50JykpKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMudmlzaXROb2RlKGNoaWxkKTtcbiAgICB9KTtcbiAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgY2hpbGRyZW4sIE9iamVjdC5hc3NpZ24ocHJvcGVydGllcyB8fCB7fSwgeyBuYW1lc3BhY2U6IHRydWUgfSkpO1xuICB9XG5cblxuICAvKiBEZWNsYXJhdGlvbnMgKi9cblxuICBwcml2YXRlIHZpc2l0Q2xhc3MgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8SmF2YVNjcmlwdFByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XG4gICAgLy8gU2luY2UgJ2ludGVyZmFjZScgb3IgJ2NsYXNzJyBpcyBhbHdheXMgZmlyc3QgaW4gdGhlIGFycmF5XG4gICAgLy8gd2UnbGwgbmVlZCB0byByZW1vdmUgaXQgZnJvbSB0aGUgYXJyYXkuXG4gICAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgICBjb25zdCBpbnRlcmZhY2VfID0gY2hpbGRyZW4uc2hpZnQoKTtcbiAgICBsZXQgZXh0ZW5kc18gPSBmYWxzZSwgaW1wbGVtZW50c18gPSBmYWxzZTtcbiAgICBpZiAodGhpcy5oYXNJbmhlcml0YW5jZShub2RlKSkge1xuICAgICAgY29uc3QgaW5oZXJpdGFuY2UgPSB0aGlzLmdldEluaGVyaXRhbmNlVHlwZShub2RlKVxuICAgICAgZXh0ZW5kc18gPSBpbmhlcml0YW5jZSA9PT0gJ2V4dGVuZHMnO1xuICAgICAgaW1wbGVtZW50c18gPSBpbmhlcml0YW5jZSA9PT0gJ2ltcGxlbWVudHMnO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGVfID0gY3JlYXRlQVNUTm9kZShcbiAgICAgIHRoaXMuc291cmNlLFxuICAgICAgbm9kZSxcbiAgICAgIHRoaXMudmlzaXRDaGlsZHJlbihjaGlsZHJlbiksXG4gICAgICBPYmplY3QuYXNzaWduKHByb3BlcnRpZXMgfHwge30sIHtcbiAgICAgICAgaW5oZXJpdGFuY2U6IHtcbiAgICAgICAgICBpbXBsZW1lbnRzOiBpbXBsZW1lbnRzXyxcbiAgICAgICAgICBleHRlbmRzOiBleHRlbmRzX1xuICAgICAgICB9IGFzIEphdmFTY3JpcHRJbmhlcml0YW5jZVxuICAgICAgfSkpO1xuXG4gICAgaWYgKG1hdGNoKG5vZGUsICdjbGFzcycpKSB7XG4gICAgICByZXR1cm4gbm9kZV87XG4gICAgfVxuICAgIC8vIE92ZXJ3cml0ZSB0aGUgbm9kZSB0eXBlIGZyb20gJ2ludGVyZmFjZV9kZWNsYXJhdGlvbicgdG8gJ2ludGVyZmFjZSdcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihub2RlXywgeyB0eXBlOiBpbnRlcmZhY2VfLnR5cGUgfSlcbiAgfVxuXG4gIC8qIE5vbi10ZXJtaW5hbHMgKi9cblxuICBwcml2YXRlIHZpc2l0Tm9uVGVybWluYWwgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8SmF2YVNjcmlwdFByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XG4gICAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBzb21lIG5vbi10ZXJtaW5hbHNcbiAgICAvLyBjb250YWluIGNvbW1lbnRzIHdoaWNoIGlzIHdoYXQgd2UgY2FyZSBhYm91dFxuICAgIGlmIChtYXRjaChub2RlLCAnY2xhc3NfYm9keScsICdvYmplY3RfdHlwZScpKSB7XG4gICAgICBjaGlsZHJlbiA9IHRoaXMuZmlsdGVyVHlwZShub2RlLCAnY29tbWVudCcpO1xuICAgIH1cbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBleHBvcnQgc3RhdGVtZW50cyBoYXZlIG5vZGUgcHJvcGVydGllc1xuICAgIGlmIChtYXRjaChub2RlLCAnZXhwb3J0X3N0YXRlbWVudCcpKSB7XG4gICAgICByZXR1cm4gdGhpcy52aXNpdEV4cG9ydFN0YXRlbWVudChub2RlKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBhbiBpbnRlcm5hbCBtb2R1bGUgY29udGFpbnMgb3RoZXIgbm9kZXNcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2ludGVybmFsX21vZHVsZScpKSB7XG4gICAgICByZXR1cm4gdGhpcy52aXNpdEludGVybmFsTW9kdWxlKG5vZGUsIHByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2VzIHdoZXJlIGFuIGludGVybWFsX21vZHVsZSBjYW4gZXhpc3QgaW4gYW4gZXhwcmVzc2lvbl9zdGF0ZW1lbnRcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2V4cHJlc3Npb25fc3RhdGVtZW50JykpIHtcbiAgICAgIHJldHVybiB0aGlzLnZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChub2RlLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBhIGZ1bmN0aW9uIGhhcyBhIHN0YXRlbWVudF9ibG9ja1xuICAgIGlmIChtYXRjaChub2RlLCAnZnVuY3Rpb24nKSB8fCBtYXRjaChub2RlLCAnbWV0aG9kX2RlZmluaXRpb24nKSkge1xuICAgICAgXy5yZW1vdmUoY2hpbGRyZW4sIGNoaWxkID0+IG1hdGNoKGNoaWxkLCAnc3RhdGVtZW50X2Jsb2NrJykpXG4gICAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENoaWxkcmVuKGNoaWxkcmVuKSwgcHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIHRoaXMudmlzaXRDaGlsZHJlbihjaGlsZHJlbiksIHByb3BlcnRpZXMpO1xuICB9XG5cbiAgLyogVGVybWluYWxzICovXG5cbiAgcHJpdmF0ZSB2aXNpdFRlcm1pbmFsID0gKG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlID0+IHtcbiAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSlcbiAgfVxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2phdmFzY3JpcHQvdmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHVDQUE4QztBQUM5QyxpREFBdUQ7QUFDdkQsaURBQThDO0FBRTlDLDRCQUE0QjtBQUM1Qix5Q0FBaUQ7QUFDakQsNkNBQXNDO0FBRXRDLCtDQUE0RDtBQUk1RDs7R0FFRztBQUNILE1BQWEsaUJBQWtCLFNBQVEsaUJBQU87SUFHNUMsWUFBWSxNQUFjLEVBQUUsT0FBZ0M7UUFDMUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBSFQsUUFBRyxHQUFjLEVBQUUsQ0FBQTtRQW9FM0IsZUFBZTtRQUVmLGNBQVMsR0FBRyxDQUNWLElBQWdCLEVBQ2hCLFVBQTBDLEVBQzFDLEVBQUU7WUFDRixRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ2pCLEtBQUssU0FBUztvQkFDWixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ25DLE1BQU07Z0JBQ1IsS0FBSyxTQUFTO29CQUNaLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDakMsS0FBSyxTQUFTLENBQUM7Z0JBQ2YsS0FBSyxPQUFPO29CQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO29CQUN0RSxNQUFNO2dCQUNSO29CQUVFLCtCQUErQjtvQkFFL0IsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUNaLFlBQVksRUFDWixtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFDM0QsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQ3pFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxv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Q0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLGVBQUssQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLEVBQUU7Z0JBQzNCLE9BQU8sSUFBSSxDQUFDO2FBQ2I7U0FDRjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0ssVUFBVSxDQUFDLElBQWdCLEVBQUUsSUFBWTtRQUMvQyxJQUFJLFFBQVEsR0FBaUIsRUFBRSxDQUFDO1FBQ2hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM3QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksZUFBSyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDdEIsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN0QjtTQUNGO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDbEIsQ0FBQztDQTRRRjtBQS9VRCw4Q0ErVUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVBU1ROb2RlIH0gZnJvbSBcIi4uL2NvbW1vbi9hc3RcIjtcbmltcG9ydCB7IGlzSmF2YURvY0NvbW1lbnQgfSBmcm9tIFwiLi4vLi4vdXRpbHMvY29tbWVudFwiO1xuaW1wb3J0IHsgc2libGluZyB9IGZyb20gXCIuLi8uLi91dGlscy9zaWJsaW5nXCI7XG5pbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbG9nLCB7IEVycm9yVHlwZSB9IGZyb20gXCIuLi8uLi91dGlscy9sb2dcIjtcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi4vLi4vdXRpbHMvbWF0Y2hcIjtcbmltcG9ydCBTb3VyY2UgZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvU291cmNlXCI7XG5pbXBvcnQgVmlzaXRvciwgeyBWaXNpdG9yT3B0aW9ucyB9IGZyb20gXCIuLi9jb21tb24vdmlzaXRvclwiO1xuaW1wb3J0IEFTVE5vZGUgZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvQVNUTm9kZVwiO1xuaW1wb3J0IHsgSmF2YVNjcmlwdFByb3BlcnRpZXMsIEphdmFTY3JpcHRJbmhlcml0YW5jZSB9IGZyb20gXCIuL3Byb3BlcnRpZXNcIjtcblxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgdmlzaXRzIEFTVE5vZGVzIGZyb20gYSBUeXBlU2NyaXB0IHRyZWUuXG4gKi9cbmV4cG9ydCBjbGFzcyBKYXZhU2NyaXB0VmlzaXRvciBleHRlbmRzIFZpc2l0b3Ige1xuICBwcml2YXRlIGFzdDogQVNUTm9kZVtdID0gW11cbiAgcHJpdmF0ZSBzb3VyY2U6IFNvdXJjZVxuICBjb25zdHJ1Y3Rvcihzb3VyY2U6IFNvdXJjZSwgb3B0aW9uczogUGFydGlhbDxWaXNpdG9yT3B0aW9ucz4pIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBub2RlIGhhcyBpbmhlcml0YW5jZVxuICAgKi9cbiAgcHJpdmF0ZSBoYXNJbmhlcml0YW5jZShub2RlOiBTeW50YXhOb2RlKSB7XG4gICAgbGV0IGluaGVyaXRzID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdleHRlbmRzJywgJ2ltcGxlbWVudHMnKSkge1xuICAgICAgICBpbmhlcml0cyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbmhlcml0c1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBub2RlJ3MgaW5oZXJpdGFuY2UgdHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRJbmhlcml0YW5jZVR5cGUobm9kZTogU3ludGF4Tm9kZSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgaWYgKG1hdGNoKGNoaWxkLCAnZXh0ZW5kcycpKSB7XG4gICAgICAgIHJldHVybiAnZXh0ZW5kcyc7XG4gICAgICB9XG5cbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ2ltcGxlbWVudHMnKSkge1xuICAgICAgICByZXR1cm4gJ2ltcGxlbWVudHMnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gZXhwb3J0IGlzIGRlZmF1bHRcbiAgICovXG4gIHByaXZhdGUgaGFzRGVmYXVsdEV4cG9ydChub2RlOiBTeW50YXhOb2RlKTogYm9vbGVhbiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdkZWZhdWx0JykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG9ubHkgdGhlIGNvbW1lbnRzIGZyb20gYSBub2RlJ3MgY2hpbGRyZW4uXG4gICAqL1xuICBwcml2YXRlIGZpbHRlclR5cGUobm9kZTogU3ludGF4Tm9kZSwgdHlwZTogc3RyaW5nKTogU3ludGF4Tm9kZVtdIHtcbiAgICBsZXQgY2hpbGRyZW46IFN5bnRheE5vZGVbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgaWYgKG1hdGNoKGNoaWxkLCB0eXBlKSkge1xuICAgICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG5cbiAgZ2V0QVNUKCk6IEFTVE5vZGVbXSB7XG4gICAgcmV0dXJuIHRoaXMuYXN0O1xuICB9XG5cbiAgLyogVmlzaXRvcnMgICovXG5cbiAgdmlzaXROb2RlID0gKFxuICAgIG5vZGU6IFN5bnRheE5vZGUsXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8SmF2YVNjcmlwdFByb3BlcnRpZXM+XG4gICkgPT4ge1xuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICBjYXNlICdwcm9ncmFtJzpcbiAgICAgICAgdGhpcy5hc3QgPSB0aGlzLnZpc2l0UHJvZ3JhbShub2RlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRDb21tZW50KG5vZGUpO1xuICAgICAgY2FzZSAnTUlTU0lORyc6XG4gICAgICBjYXNlICdFUlJPUic6XG4gICAgICAgIHRoaXMubG9nZ2VyLnJlcG9ydCh0aGlzLnNvdXJjZSwgbm9kZSwgRXJyb3JUeXBlLlRyZWVTaXR0ZXJQYXJzZUVycm9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuXG4gICAgICAgIC8qIE1hdGNoIG90aGVyIG5vbi10ZXJtaW5hbHMgKi9cblxuICAgICAgICBpZiAobWF0Y2gobm9kZSxcbiAgICAgICAgICAnY29uc3RyYWludCcsXG4gICAgICAgICAgJ2Zvcm1hbF9wYXJhbWV0ZXJzJywgJ3JlcXVpcmVkX3BhcmFtZXRlcicsICdyZXN0X3BhcmFtZXRlcicsXG4gICAgICAgICAgJ3R5cGVfaWRlbnRpZmllcicsICd0eXBlX3BhcmFtZXRlcnMnLCAndHlwZV9wYXJhbWV0ZXInLCAndHlwZV9hbm5vdGF0aW9uJyxcbiAgICAgICAgICAnb2JqZWN0X3R5cGUnLCAncHJlZGVmaW5lZF90eXBlJywgJ3BhcmVudGhlc2l6ZWRfdHlwZScsICdsaXRlcmFsX3R5cGUnLFxuICAgICAgICAgICdpbnRlcnNlY3Rpb25fdHlwZScsICd1bmlvbl90eXBlJyxcbiAgICAgICAgICAnY2xhc3NfYm9keScsXG4gICAgICAgICAgJ2V4dGVuZHNfY2xhdXNlJyxcbiAgICAgICAgICAndW5hcnlfZXhwcmVzc2lvbicsICdiaW5hcnlfZXhwcmVzc2lvbicsICdwYXJlbnRoZXNpemVkX2V4cHJlc3Npb24nLCAnbWVtYmVyX2V4cHJlc3Npb24nLFxuICAgICAgICAgICdzdGF0ZW1lbnRfYmxvY2snLCAncmV0dXJuX3N0YXRlbWVudCcsICdleHBvcnRfc3RhdGVtZW50JywgJ2V4cHJlc3Npb25fc3RhdGVtZW50JyxcbiAgICAgICAgICAvLyBBIGNhbGxfc2lnbmF0dXJlIGNhbiBhbHNvIGJlIGEgbm9uLWNvbnRleHR1YWwgbm9kZVxuICAgICAgICAgICdjYWxsX3NpZ25hdHVyZScsXG4gICAgICAgICAgJ2ludGVybmFsX21vZHVsZScsXG4gICAgICAgICAgJ2lmX3N0YXRlbWVudCdcbiAgICAgICAgKSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnZpc2l0Tm9uVGVybWluYWwobm9kZSwgcHJvcGVydGllcylcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIE1hdGNoIHRlcm1pbmFscyAqL1xuICAgICAgICBpZiAobWF0Y2gobm9kZSxcbiAgICAgICAgICAnaWRlbnRpZmllcicsICdleHRlbmRzJywgJ3Byb3BlcnR5X2lkZW50aWZpZXInLCAnYWNjZXNzaWJpbGl0eV9tb2RpZmllcicsXG4gICAgICAgICAgJ251bGwnLCAndW5kZWZpbmVkJywgJ3JldHVybicsXG4gICAgICAgICAgJ2dldCcsICdmdW5jdGlvbicsICduYW1lc3BhY2UnLCAnaWYnLCAnY29uc3QnXG4gICAgICAgICkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdFRlcm1pbmFsKG5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2dnZXIucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgdmlzaXRDaGlsZHJlbiA9IChub2RlczogU3ludGF4Tm9kZVtdKTogQVNUTm9kZVtdID0+IHtcbiAgICBsZXQgY2hpbGRyZW46IEFTVE5vZGVbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgIGlmICghbm9kZS50eXBlLm1hdGNoKC9bPD4oKXt9LDo7XFxbXFxdJnw9XFwrXFwtXFwqXFwvIS5dLykgJiYgbm9kZS50eXBlICE9PSAnLi4uJykge1xuICAgICAgICBjb25zdCBjaGlsZCA9IHRoaXMudmlzaXROb2RlKG5vZGUpO1xuICAgICAgICBpZiAoY2hpbGQpIGNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cblxuICBwcml2YXRlIHZpc2l0UHJvZ3JhbSA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZVtdID0+IHtcbiAgICBsZXQgdmlzaXRlZCA9IHt9LFxuICAgICAgZ2V0U3RhcnRMb2NhdGlvbiA9IChuOiBBU1ROb2RlKSA9PiBgJHtuLmxvY2F0aW9uLnJvdy5zdGFydH06JHtuLmxvY2F0aW9uLmNvbHVtbi5zdGFydH1gO1xuICAgIC8vIEEgcHJvZ3JhbSBjYW4gaGF2ZSBtb2R1bGVzLCBuYW1lc3BhY2VzLCBjb21tZW50cyBhcyBpdHMgY2hpbGRyZW5cbiAgICAvLyBUaGUgZmlyc3Qgc3RlcCBpcyB0byBwYXJzZSBhbGwgdGhlIGNvbW1lbnRzIGluIHRoZSByb290IG5vZGVcbiAgICBsZXQgY29tbWVudHMgPSB0aGlzLnZpc2l0Q2hpbGRyZW4odGhpcy5maWx0ZXJUeXBlKG5vZGUsICdjb21tZW50JykpO1xuICAgIC8vIFBhcnNlIHRoZSBuYW1lc3BhY2VzIGluIGV4cHJlc3Npb25fc3RhdGVtZW50XG4gICAgLy8gbGV0IG5hbWVzcGFjZXMgPSB0aGlzLnZpc2l0Q2hpbGRyZW4odGhpcy5maWx0ZXJUeXBlKG5vZGUsICdleHByZXNzaW9uX3N0YXRlbWVudCcpKTtcbiAgICAvLyBQYXJzZSB0aGUgZXhwb3J0IHN0YXRlbWVudHMgaW4gdGhlIHJvb3Qgbm9kZVxuICAgIGxldCBleHBvcnRzID0gdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShub2RlLCAnZXhwb3J0X3N0YXRlbWVudCcpKTtcblxuICAgIC8vIEdldCB0aGUgdmlzaXRlZCBjb250ZXh0IG5vZGVzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21tZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY29tbWVudCA9IGNvbW1lbnRzW2ldO1xuICAgICAgY29uc3QgY29udGV4dCA9IGNvbW1lbnQ7XG4gICAgICB2aXNpdGVkW2dldFN0YXJ0TG9jYXRpb24oY29udGV4dCldID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBFeHBvcnRzIGFyZSBvZGRiYWxscyBzaW5jZSBzb21lIGV4cG9ydHMgbWF5IHJlZmVyZW5jZVxuICAgIC8vIGEgdHlwZS9ub2RlIHRoYXQgbWF5IGhhdmUgYmVlbiBjb21tZW50ZWQuXG4gICAgLy8gV2UnbGwgZmlyc3QgbmVlZCB0byBmaWx0ZXIgdGhlIG9uZXMgd2UgaGF2ZSB2aXNpdGVkXG4gICAgXy5yZW1vdmUoZXhwb3J0cywgeCA9PiB2aXNpdGVkW2dldFN0YXJ0TG9jYXRpb24oeCldKTtcblxuICAgIC8vIEZyb20gdGhlIG9uZXMgd2UgaGF2ZSBub3QgdmlzaXRlZCwgd2UnbGwgbmVlZCB0byBtb2RpZnlcbiAgICAvLyB0aGUgbm9kZSBwcm9wZXJ0aWVzIG9mIGVhY2ggY29udGV4dCBpbiBhIGNvbW1lbnQgbm9kZSB0aGF0XG4gICAgLy8gbWF0Y2hlcyB0aGUgb25lcyB3ZSBoYXZlIG5vdCB2aXNpdGVkLlxuICAgIGNvbnN0IG1hdGNoZWQgPSB7fTtcbiAgICBjb21tZW50cyA9IF8uY29tcGFjdChcbiAgICAgIGNvbW1lbnRzLm1hcChjb21tZW50ID0+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBvcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZXhwb3J0XyA9IGV4cG9ydHNbaV07XG4gICAgICAgICAgY29uc3QgY29udGV4dCA9IGNvbW1lbnQuY29udGV4dDtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgY29udGV4dCAmJiBqIDwgY29udGV4dC5jaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKGNvbnRleHQuY2hpbGRyZW5baV0gJiYgY29udGV4dC5jaGlsZHJlbltpXS50eXBlID09PSBleHBvcnRfLnR5cGUpIHtcbiAgICAgICAgICAgICAgbWF0Y2hlZFtnZXRTdGFydExvY2F0aW9uKGV4cG9ydF8pXSA9IHRydWU7XG4gICAgICAgICAgICAgIGNvbW1lbnQuY29udGV4dC5wcm9wZXJ0aWVzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICBjb21tZW50LmNvbnRleHQucHJvcGVydGllcyB8fCB7fSxcbiAgICAgICAgICAgICAgICBleHBvcnRfLnByb3BlcnRpZXNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbW1lbnQ7XG4gICAgICB9KSk7XG5cbiAgICAvLyBSZW1vdmVkIHRoZSBtYXRjaGVkIGV4cG9ydHNcbiAgICBfLnJlbW92ZShleHBvcnRzLCB4ID0+IG1hdGNoZWRbZ2V0U3RhcnRMb2NhdGlvbih4KV0pXG5cbiAgICByZXR1cm4gW10uY29uY2F0KGNvbW1lbnRzKS5jb25jYXQoZXhwb3J0cyk7XG4gIH1cblxuICBwcml2YXRlIHZpc2l0Q29tbWVudCA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZSA9PiB7XG4gICAgaWYgKGlzSmF2YURvY0NvbW1lbnQodGhpcy5zb3VyY2UsIG5vZGUpKSB7XG4gICAgICBjb25zdCBuZXh0U2libGluZyA9IHNpYmxpbmcobm9kZSk7XG4gICAgICBpZiAobmV4dFNpYmxpbmcpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIHRoaXMudmlzaXRDb250ZXh0KG5leHRTaWJsaW5nLCB7fSksIHRydWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZpc2l0IHRoZSBjb250ZXh0dWFsIG5vZGVcbiAgICogXG4gICAqICMgUmVtYXJrXG4gICAqIFxuICAgKiBBIG5vZGUgaXMgY29uc2lkZXJlZCBjb250ZXh0dWFsIHdoZW4gYSBjb21tZW50IGlzIHZpc2l0ZWQgYW5kIHRoZSBub2RlIGlzIGl0cyBzaWJsaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSB2aXNpdENvbnRleHQgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8SmF2YVNjcmlwdFByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2V4cG9ydF9zdGF0ZW1lbnQnOlxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdEV4cG9ydFN0YXRlbWVudChub2RlLCBwcm9wZXJ0aWVzKTtcbiAgICAgIGNhc2UgJ2V4cHJlc3Npb25fc3RhdGVtZW50JzpcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KG5vZGUsIHByb3BlcnRpZXMpO1xuICAgICAgY2FzZSAnY2xhc3MnOlxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdENsYXNzKG5vZGUsIHByb3BlcnRpZXMpXG4gICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICBjYXNlICdjYWxsX3NpZ25hdHVyZSc6XG4gICAgICBjYXNlICdtZXRob2Rfc2lnbmF0dXJlJzpcbiAgICAgIGNhc2UgJ3Byb3BlcnR5X3NpZ25hdHVyZSc6XG4gICAgICBjYXNlICdwdWJsaWNfZmllbGRfZGVmaW5pdGlvbic6XG4gICAgICBjYXNlICdtZXRob2RfZGVmaW5pdGlvbic6XG4gICAgICBjYXNlICdsZXhpY2FsX2RlY2xhcmF0aW9uJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXROb25UZXJtaW5hbChub2RlLCBwcm9wZXJ0aWVzKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMubG9nZ2VyLnJlcG9ydCh0aGlzLnNvdXJjZSwgbm9kZSwgRXJyb3JUeXBlLk5vZGVUeXBlTm90WWV0U3VwcG9ydGVkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIC8qIFN0YXRlbWVudHMgKi9cblxuICBwcml2YXRlIHZpc2l0RXhwb3J0U3RhdGVtZW50ID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPEphdmFTY3JpcHRQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xuICAgIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4sIGRlZmF1bHRFeHBvcnQgPSBmYWxzZTtcbiAgICAvLyBSZW1vdmUgJ2V4cG9ydCcgc2luY2UgaXQncyBhbHdheXMgZmlyc3QgaW4gdGhlIGFycmF5XG4gICAgY2hpbGRyZW4uc2hpZnQoKTtcbiAgICBpZiAodGhpcy5oYXNEZWZhdWx0RXhwb3J0KG5vZGUpKSB7XG4gICAgICBkZWZhdWx0RXhwb3J0ID0gdHJ1ZTtcbiAgICAgIC8vIFJlbW92ZSAnZGVmYXVsdCcgZXhwb3J0XG4gICAgICBjaGlsZHJlbi5zaGlmdCgpO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuLnNoaWZ0KCk7XG4gICAgcmV0dXJuIHRoaXMudmlzaXROb2RlKGNoaWxkLCB7IGV4cG9ydHM6IHsgZXhwb3J0OiB0cnVlLCBkZWZhdWx0OiBkZWZhdWx0RXhwb3J0IH0gfSk7XG4gIH1cblxuICBwcml2YXRlIHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudCA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzOiBQYXJ0aWFsPEphdmFTY3JpcHRQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xuICAgIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbi5zaGlmdCgpO1xuXG4gICAgaWYgKG1hdGNoKGNoaWxkLCAnaW50ZXJuYWxfbW9kdWxlJykpIHtcbiAgICAgIHJldHVybiB0aGlzLnZpc2l0SW50ZXJuYWxNb2R1bGUoY2hpbGQsIHByb3BlcnRpZXMpXG4gICAgfVxuXG4gICAgaWYgKG1hdGNoKGNoaWxkLCAnZnVuY3Rpb24nKSkge1xuICAgICAgaWYgKHByb3BlcnRpZXMpIHJldHVybiB0aGlzLnZpc2l0Q29udGV4dChjaGlsZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudmlzaXROb25UZXJtaW5hbChjaGlsZClcbiAgfVxuXG4gIC8qIE1vZHVsZXMgKi9cblxuICBwcml2YXRlIHZpc2l0SW50ZXJuYWxNb2R1bGUgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8SmF2YVNjcmlwdFByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XG4gICAgbGV0IGNoaWxkcmVuOiBBU1ROb2RlW10gPSBub2RlLmNoaWxkcmVuLm1hcChjaGlsZCA9PiB7XG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdzdGF0ZW1lbnRfYmxvY2snKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShjaGlsZCwgJ2NvbW1lbnQnKSkpXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy52aXNpdE5vZGUoY2hpbGQpO1xuICAgIH0pO1xuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCBjaGlsZHJlbiwgT2JqZWN0LmFzc2lnbihwcm9wZXJ0aWVzIHx8IHt9LCB7IG5hbWVzcGFjZTogdHJ1ZSB9KSk7XG4gIH1cblxuXG4gIC8qIERlY2xhcmF0aW9ucyAqL1xuXG4gIHByaXZhdGUgdmlzaXRDbGFzcyA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxKYXZhU2NyaXB0UHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcbiAgICAvLyBTaW5jZSAnaW50ZXJmYWNlJyBvciAnY2xhc3MnIGlzIGFsd2F5cyBmaXJzdCBpbiB0aGUgYXJyYXlcbiAgICAvLyB3ZSdsbCBuZWVkIHRvIHJlbW92ZSBpdCBmcm9tIHRoZSBhcnJheS5cbiAgICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuICAgIGNvbnN0IGludGVyZmFjZV8gPSBjaGlsZHJlbi5zaGlmdCgpO1xuICAgIGxldCBleHRlbmRzXyA9IGZhbHNlLCBpbXBsZW1lbnRzXyA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmhhc0luaGVyaXRhbmNlKG5vZGUpKSB7XG4gICAgICBjb25zdCBpbmhlcml0YW5jZSA9IHRoaXMuZ2V0SW5oZXJpdGFuY2VUeXBlKG5vZGUpXG4gICAgICBleHRlbmRzXyA9IGluaGVyaXRhbmNlID09PSAnZXh0ZW5kcyc7XG4gICAgICBpbXBsZW1lbnRzXyA9IGluaGVyaXRhbmNlID09PSAnaW1wbGVtZW50cyc7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZV8gPSBjcmVhdGVBU1ROb2RlKFxuICAgICAgdGhpcy5zb3VyY2UsXG4gICAgICBub2RlLFxuICAgICAgdGhpcy52aXNpdENoaWxkcmVuKGNoaWxkcmVuKSxcbiAgICAgIE9iamVjdC5hc3NpZ24ocHJvcGVydGllcyB8fCB7fSwge1xuICAgICAgICBpbmhlcml0YW5jZToge1xuICAgICAgICAgIGltcGxlbWVudHM6IGltcGxlbWVudHNfLFxuICAgICAgICAgIGV4dGVuZHM6IGV4dGVuZHNfXG4gICAgICAgIH0gYXMgSmF2YVNjcmlwdEluaGVyaXRhbmNlXG4gICAgICB9KSk7XG5cbiAgICBpZiAobWF0Y2gobm9kZSwgJ2NsYXNzJykpIHtcbiAgICAgIHJldHVybiBub2RlXztcbiAgICB9XG4gICAgLy8gT3ZlcndyaXRlIHRoZSBub2RlIHR5cGUgZnJvbSAnaW50ZXJmYWNlX2RlY2xhcmF0aW9uJyB0byAnaW50ZXJmYWNlJ1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5vZGVfLCB7IHR5cGU6IGludGVyZmFjZV8udHlwZSB9KVxuICB9XG5cbiAgLyogTm9uLXRlcm1pbmFscyAqL1xuXG4gIHByaXZhdGUgdmlzaXROb25UZXJtaW5hbCA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxKYXZhU2NyaXB0UHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcbiAgICBsZXQgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2VzIHdoZXJlIHNvbWUgbm9uLXRlcm1pbmFsc1xuICAgIC8vIGNvbnRhaW4gY29tbWVudHMgd2hpY2ggaXMgd2hhdCB3ZSBjYXJlIGFib3V0XG4gICAgaWYgKG1hdGNoKG5vZGUsICdjbGFzc19ib2R5JywgJ29iamVjdF90eXBlJykpIHtcbiAgICAgIGNoaWxkcmVuID0gdGhpcy5maWx0ZXJUeXBlKG5vZGUsICdjb21tZW50Jyk7XG4gICAgfVxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2VzIHdoZXJlIGV4cG9ydCBzdGF0ZW1lbnRzIGhhdmUgbm9kZSBwcm9wZXJ0aWVzXG4gICAgaWYgKG1hdGNoKG5vZGUsICdleHBvcnRfc3RhdGVtZW50JykpIHtcbiAgICAgIHJldHVybiB0aGlzLnZpc2l0RXhwb3J0U3RhdGVtZW50KG5vZGUpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2VzIHdoZXJlIGFuIGludGVybmFsIG1vZHVsZSBjb250YWlucyBvdGhlciBub2Rlc1xuICAgIGlmIChtYXRjaChub2RlLCAnaW50ZXJuYWxfbW9kdWxlJykpIHtcbiAgICAgIHJldHVybiB0aGlzLnZpc2l0SW50ZXJuYWxNb2R1bGUobm9kZSwgcHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZXMgd2hlcmUgYW4gaW50ZXJtYWxfbW9kdWxlIGNhbiBleGlzdCBpbiBhbiBleHByZXNzaW9uX3N0YXRlbWVudFxuICAgIGlmIChtYXRjaChub2RlLCAnZXhwcmVzc2lvbl9zdGF0ZW1lbnQnKSkge1xuICAgICAgcmV0dXJuIHRoaXMudmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KG5vZGUsIHByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2VzIHdoZXJlIGEgZnVuY3Rpb24gaGFzIGEgc3RhdGVtZW50X2Jsb2NrXG4gICAgaWYgKG1hdGNoKG5vZGUsICdmdW5jdGlvbicpIHx8IG1hdGNoKG5vZGUsICdtZXRob2RfZGVmaW5pdGlvbicpKSB7XG4gICAgICBfLnJlbW92ZShjaGlsZHJlbiwgY2hpbGQgPT4gbWF0Y2goY2hpbGQsICdzdGF0ZW1lbnRfYmxvY2snKSlcbiAgICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q2hpbGRyZW4oY2hpbGRyZW4pLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENoaWxkcmVuKGNoaWxkcmVuKSwgcHJvcGVydGllcyk7XG4gIH1cblxuICAvKiBUZXJtaW5hbHMgKi9cblxuICBwcml2YXRlIHZpc2l0VGVybWluYWwgPSAobm9kZTogU3ludGF4Tm9kZSk6IEFTVE5vZGUgPT4ge1xuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlKVxuICB9XG59Il19 \ No newline at end of file diff --git a/build/src/lang/typescript/index.js b/build/src/lang/typescript/index.js index 673484d..740e298 100644 --- a/build/src/lang/typescript/index.js +++ b/build/src/lang/typescript/index.js @@ -18,7 +18,7 @@ class TypeScriptParser extends parser_1.default { constructor(source, options) { super(source, options); this.parse = () => { - const visitor = new visitor_1.TypeScriptVisitor(this.source); + const visitor = new visitor_1.TypeScriptVisitor(this.source, this.options); const nodes = walk_1.default(this.tree_.rootNode); nodes.visit(visitor); return visitor.getAST(); @@ -32,4 +32,4 @@ class TypeScriptParser extends parser_1.default { } } exports.default = TypeScriptParser; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy90eXBlc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsMENBQTBDO0FBQzFDLHFEQUFxRDtBQUNyRCw2Q0FBc0M7QUFFdEMsMkNBQW9DO0FBQ3BDLHVDQUE4QztBQUk5Qzs7Ozs7Ozs7R0FRRztBQUNILE1BQXFCLGdCQUFpQixTQUFRLGdCQUFNO0lBR2xELFlBQVksTUFBYyxFQUFFLE9BQVk7UUFDdEMsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUt6QixVQUFLLEdBQUcsR0FBYyxFQUFFO1lBQ3RCLE1BQU0sT0FBTyxHQUFHLElBQUksMkJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ25ELE1BQU0sS0FBSyxHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3hDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDcEIsT0FBTyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDMUIsQ0FBQyxDQUFBO1FBVEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBUUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7Q0FDRjtBQW5CRCxtQ0FtQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBUcmVlU2l0dGVyIGZyb20gJ3RyZWUtc2l0dGVyJztcbmltcG9ydCAqIGFzIFR5cGVTY3JpcHQgZnJvbSAndHJlZS1zaXR0ZXItdHlwZXNjcmlwdCc7XG5pbXBvcnQgUGFyc2VyIGZyb20gJy4uL2NvbW1vbi9wYXJzZXInO1xuaW1wb3J0IFNvdXJjZSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZSc7XG5pbXBvcnQgd2FsayBmcm9tICcuLi8uLi91dGlscy93YWxrJztcbmltcG9ydCB7IFR5cGVTY3JpcHRWaXNpdG9yIH0gZnJvbSAnLi92aXNpdG9yJztcbmltcG9ydCBBU1ROb2RlIGZyb20gJy4uLy4uL2ludGVyZmFjZXMvQVNUTm9kZSc7XG5cblxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgcGFyc2VzIEphdmFTY3JpcHQgY29tbWVudHMuXG4gKlxuICogIyBBUElcbiAqXG4gKiBAY2xhc3MgSmF2YVNjcmlwdFBhcnNlclxuICogQGltcGxlbWVudHMgSVBhcnNlclxuICogQGV4cG9ydCBkZWZhdWx0XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFR5cGVTY3JpcHRQYXJzZXIgZXh0ZW5kcyBQYXJzZXIge1xuICBwcml2YXRlIHBhcnNlcjogVHJlZVNpdHRlcjtcbiAgcHJpdmF0ZSB0cmVlXzogVHJlZVNpdHRlci5UcmVlO1xuICBjb25zdHJ1Y3Rvcihzb3VyY2U6IFNvdXJjZSwgb3B0aW9uczogYW55KSB7XG4gICAgc3VwZXIoc291cmNlLCBvcHRpb25zKTtcbiAgICB0aGlzLnBhcnNlciA9IG5ldyBUcmVlU2l0dGVyKCk7XG4gICAgdGhpcy5wYXJzZXIuc2V0TGFuZ3VhZ2UoVHlwZVNjcmlwdCk7XG4gICAgdGhpcy50cmVlXyA9IHRoaXMucGFyc2VyLnBhcnNlKHRoaXMuc291cmNlLnRleHQpO1xuICB9XG4gIHBhcnNlID0gKCk6IEFTVE5vZGVbXSA9PiB7XG4gICAgY29uc3QgdmlzaXRvciA9IG5ldyBUeXBlU2NyaXB0VmlzaXRvcih0aGlzLnNvdXJjZSk7XG4gICAgY29uc3Qgbm9kZXMgPSB3YWxrKHRoaXMudHJlZV8ucm9vdE5vZGUpO1xuICAgIG5vZGVzLnZpc2l0KHZpc2l0b3IpXG4gICAgcmV0dXJuIHZpc2l0b3IuZ2V0QVNUKCk7XG4gIH1cblxuICBnZXQgdHJlZSAoKTogVHJlZVNpdHRlci5UcmVlIHtcbiAgICByZXR1cm4gdGhpcy50cmVlXztcbiAgfVxufVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGFuZy90eXBlc2NyaXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsMENBQTBDO0FBQzFDLHFEQUFxRDtBQUNyRCw2Q0FBc0M7QUFFdEMsMkNBQW9DO0FBQ3BDLHVDQUE4QztBQUk5Qzs7Ozs7Ozs7R0FRRztBQUNILE1BQXFCLGdCQUFpQixTQUFRLGdCQUFNO0lBR2xELFlBQVksTUFBYyxFQUFFLE9BQVk7UUFDdEMsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUt6QixVQUFLLEdBQUcsR0FBYyxFQUFFO1lBQ3RCLE1BQU0sT0FBTyxHQUFHLElBQUksMkJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDakUsTUFBTSxLQUFLLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDeEMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUNwQixPQUFPLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMxQixDQUFDLENBQUE7UUFUQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFRRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztDQUNGO0FBbkJELG1DQW1CQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFRyZWVTaXR0ZXIgZnJvbSAndHJlZS1zaXR0ZXInO1xuaW1wb3J0ICogYXMgVHlwZVNjcmlwdCBmcm9tICd0cmVlLXNpdHRlci10eXBlc2NyaXB0JztcbmltcG9ydCBQYXJzZXIgZnJvbSAnLi4vY29tbW9uL3BhcnNlcic7XG5pbXBvcnQgU291cmNlIGZyb20gJy4uLy4uL2ludGVyZmFjZXMvU291cmNlJztcbmltcG9ydCB3YWxrIGZyb20gJy4uLy4uL3V0aWxzL3dhbGsnO1xuaW1wb3J0IHsgVHlwZVNjcmlwdFZpc2l0b3IgfSBmcm9tICcuL3Zpc2l0b3InO1xuaW1wb3J0IEFTVE5vZGUgZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9BU1ROb2RlJztcblxuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCBwYXJzZXMgSmF2YVNjcmlwdCBjb21tZW50cy5cbiAqXG4gKiAjIEFQSVxuICpcbiAqIEBjbGFzcyBKYXZhU2NyaXB0UGFyc2VyXG4gKiBAaW1wbGVtZW50cyBJUGFyc2VyXG4gKiBAZXhwb3J0IGRlZmF1bHRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVHlwZVNjcmlwdFBhcnNlciBleHRlbmRzIFBhcnNlciB7XG4gIHByaXZhdGUgcGFyc2VyOiBUcmVlU2l0dGVyO1xuICBwcml2YXRlIHRyZWVfOiBUcmVlU2l0dGVyLlRyZWU7XG4gIGNvbnN0cnVjdG9yKHNvdXJjZTogU291cmNlLCBvcHRpb25zOiBhbnkpIHtcbiAgICBzdXBlcihzb3VyY2UsIG9wdGlvbnMpO1xuICAgIHRoaXMucGFyc2VyID0gbmV3IFRyZWVTaXR0ZXIoKTtcbiAgICB0aGlzLnBhcnNlci5zZXRMYW5ndWFnZShUeXBlU2NyaXB0KTtcbiAgICB0aGlzLnRyZWVfID0gdGhpcy5wYXJzZXIucGFyc2UodGhpcy5zb3VyY2UudGV4dCk7XG4gIH1cbiAgcGFyc2UgPSAoKTogQVNUTm9kZVtdID0+IHtcbiAgICBjb25zdCB2aXNpdG9yID0gbmV3IFR5cGVTY3JpcHRWaXNpdG9yKHRoaXMuc291cmNlLCB0aGlzLm9wdGlvbnMpO1xuICAgIGNvbnN0IG5vZGVzID0gd2Fsayh0aGlzLnRyZWVfLnJvb3ROb2RlKTtcbiAgICBub2Rlcy52aXNpdCh2aXNpdG9yKVxuICAgIHJldHVybiB2aXNpdG9yLmdldEFTVCgpO1xuICB9XG5cbiAgZ2V0IHRyZWUgKCk6IFRyZWVTaXR0ZXIuVHJlZSB7XG4gICAgcmV0dXJuIHRoaXMudHJlZV87XG4gIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/build/src/lang/typescript/visitor.d.ts b/build/src/lang/typescript/visitor.d.ts index 0b0784f..ebdb198 100644 --- a/build/src/lang/typescript/visitor.d.ts +++ b/build/src/lang/typescript/visitor.d.ts @@ -1,15 +1,15 @@ import { SyntaxNode } from "tree-sitter"; import Source from "../../interfaces/Source"; -import Visitor from "../common/visitor"; +import Visitor, { VisitorOptions } from "../common/visitor"; import ASTNode from "../../interfaces/ASTNode"; import { TypeScriptProperties } from "./properties"; /** * A class that visits ASTNodes from a TypeScript tree. */ -export declare class TypeScriptVisitor implements Visitor { +export declare class TypeScriptVisitor extends Visitor { private ast; private source; - constructor(source: Source); + constructor(source: Source, options: Partial); /** * Determines whether a node has inheritance */ diff --git a/build/src/lang/typescript/visitor.js b/build/src/lang/typescript/visitor.js index 5d4add1..945893f 100644 --- a/build/src/lang/typescript/visitor.js +++ b/build/src/lang/typescript/visitor.js @@ -5,12 +5,14 @@ const sibling_1 = require("../../utils/sibling"); const _ = require("lodash"); const log_1 = require("../../utils/log"); const match_1 = require("../../utils/match"); +const visitor_1 = require("../common/visitor"); const ast_1 = require("../common/ast"); /** * A class that visits ASTNodes from a TypeScript tree. */ -class TypeScriptVisitor { - constructor(source) { +class TypeScriptVisitor extends visitor_1.default { + constructor(source, options) { + super(options); this.ast = []; /* Visitors */ this.visitNode = (node, properties) => { @@ -22,7 +24,7 @@ class TypeScriptVisitor { return this.visitComment(node); case 'MISSING': case 'ERROR': - log_1.default.report(this.source, node, log_1.ErrorType.TreeSitterParseError); + this.logger.report(this.source, node, log_1.ErrorType.TreeSitterParseError); break; default: /* Match other non-terminals */ @@ -35,7 +37,7 @@ class TypeScriptVisitor { if (match_1.default(node, 'identifier', 'extends', 'property_identifier', 'accessibility_modifier', 'string', 'void', 'boolean', 'null', 'undefined', 'number', 'return', 'get', 'function', 'namespace', 'const')) { return this.visitTerminal(node); } - log_1.default.report(this.source, node, log_1.ErrorType.NodeTypeNotYetSupported); + this.logger.report(this.source, node, log_1.ErrorType.NodeTypeNotYetSupported); break; } }; @@ -126,7 +128,7 @@ class TypeScriptVisitor { case 'lexical_declaration': return this.visitNonTerminal(node, properties); default: - log_1.default.report(this.source, node, log_1.ErrorType.NodeTypeNotYetSupported); + this.logger.report(this.source, node, log_1.ErrorType.NodeTypeNotYetSupported); break; } }; @@ -278,4 +280,4 @@ class TypeScriptVisitor { } } exports.TypeScriptVisitor = TypeScriptVisitor; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGlEQUF1RTtBQUN2RSxpREFBOEM7QUFFOUMsNEJBQTRCO0FBQzVCLHlDQUFpRDtBQUNqRCw2Q0FBc0M7QUFJdEMsdUNBQThDO0FBRzlDOztHQUVHO0FBQ0gsTUFBYSxpQkFBaUI7SUFHNUIsWUFBWSxNQUFjO1FBRmxCLFFBQUcsR0FBYyxFQUFFLENBQUE7UUFtRTNCLGVBQWU7UUFFZixjQUFTLEdBQUcsQ0FDVixJQUFnQixFQUNoQixVQUEwQyxFQUMxQyxFQUFFO1lBQ0YsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNqQixLQUFLLFNBQVM7b0JBQ1osSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNuQyxNQUFNO2dCQUNSLEtBQUssU0FBUztvQkFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pDLEtBQUssU0FBUyxDQUFDO2dCQUNmLEtBQUssT0FBTztvQkFDVixhQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO29CQUM5RCxNQUFNO2dCQUNSO29CQUVFLCtCQUErQjtvQkFFL0IsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUNaLFlBQVksRUFDWixtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFDM0QsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQ3pFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQ3RFLG1CQUFtQixFQUFFLFlBQVksRUFDakMsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixrQkFBa0Is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YWxDb21tZW50IH0gZnJvbSBcIi4uLy4uL3V0aWxzL2NvbW1lbnRcIjtcbmltcG9ydCB7IHNpYmxpbmcgfSBmcm9tIFwiLi4vLi4vdXRpbHMvc2libGluZ1wiO1xuaW1wb3J0IHsgU3ludGF4Tm9kZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGxvZywgeyBFcnJvclR5cGUgfSBmcm9tIFwiLi4vLi4vdXRpbHMvbG9nXCI7XG5pbXBvcnQgbWF0Y2ggZnJvbSBcIi4uLy4uL3V0aWxzL21hdGNoXCI7XG5pbXBvcnQgU291cmNlIGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuaW1wb3J0IFZpc2l0b3IgZnJvbSBcIi4uL2NvbW1vbi92aXNpdG9yXCI7XG5pbXBvcnQgQVNUTm9kZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9BU1ROb2RlXCI7XG5pbXBvcnQgeyBjcmVhdGVBU1ROb2RlIH0gZnJvbSBcIi4uL2NvbW1vbi9hc3RcIjtcbmltcG9ydCB7IFR5cGVTY3JpcHRQcm9wZXJ0aWVzLCBUeXBlU2NyaXB0SW5oZXJpdGFuY2UgfSBmcm9tIFwiLi9wcm9wZXJ0aWVzXCI7XG5cbi8qKlxuICogQSBjbGFzcyB0aGF0IHZpc2l0cyBBU1ROb2RlcyBmcm9tIGEgVHlwZVNjcmlwdCB0cmVlLlxuICovXG5leHBvcnQgY2xhc3MgVHlwZVNjcmlwdFZpc2l0b3IgaW1wbGVtZW50cyBWaXNpdG9yIHtcbiAgcHJpdmF0ZSBhc3Q6IEFTVE5vZGVbXSA9IFtdXG4gIHByaXZhdGUgc291cmNlOiBTb3VyY2VcbiAgY29uc3RydWN0b3Ioc291cmNlOiBTb3VyY2UpIHtcbiAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBub2RlIGhhcyBpbmhlcml0YW5jZVxuICAgKi9cbiAgcHJpdmF0ZSBoYXNJbmhlcml0YW5jZShub2RlOiBTeW50YXhOb2RlKSB7XG4gICAgbGV0IGluaGVyaXRzID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdleHRlbmRzJywgJ2ltcGxlbWVudHMnKSkge1xuICAgICAgICBpbmhlcml0cyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbmhlcml0c1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBub2RlJ3MgaW5oZXJpdGFuY2UgdHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRJbmhlcml0YW5jZVR5cGUobm9kZTogU3ludGF4Tm9kZSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgaWYgKG1hdGNoKGNoaWxkLCAnZXh0ZW5kcycpKSB7XG4gICAgICAgIHJldHVybiAnZXh0ZW5kcyc7XG4gICAgICB9XG5cbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ2ltcGxlbWVudHMnKSkge1xuICAgICAgICByZXR1cm4gJ2ltcGxlbWVudHMnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gZXhwb3J0IGlzIGRlZmF1bHRcbiAgICovXG4gIHByaXZhdGUgaGFzRGVmYXVsdEV4cG9ydChub2RlOiBTeW50YXhOb2RlKTogYm9vbGVhbiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdkZWZhdWx0JykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG9ubHkgdGhlIGNvbW1lbnRzIGZyb20gYSBub2RlJ3MgY2hpbGRyZW4uXG4gICAqL1xuICBwcml2YXRlIGZpbHRlclR5cGUobm9kZTogU3ludGF4Tm9kZSwgdHlwZTogc3RyaW5nKTogU3ludGF4Tm9kZVtdIHtcbiAgICBsZXQgY2hpbGRyZW46IFN5bnRheE5vZGVbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgaWYgKG1hdGNoKGNoaWxkLCB0eXBlKSkge1xuICAgICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG5cbiAgZ2V0QVNUKCk6IEFTVE5vZGVbXSB7XG4gICAgcmV0dXJuIHRoaXMuYXN0O1xuICB9XG5cbiAgLyogVmlzaXRvcnMgICovXG5cbiAgdmlzaXROb2RlID0gKFxuICAgIG5vZGU6IFN5bnRheE5vZGUsXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8VHlwZVNjcmlwdFByb3BlcnRpZXM+XG4gICkgPT4ge1xuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICBjYXNlICdwcm9ncmFtJzpcbiAgICAgICAgdGhpcy5hc3QgPSB0aGlzLnZpc2l0UHJvZ3JhbShub2RlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRDb21tZW50KG5vZGUpO1xuICAgICAgY2FzZSAnTUlTU0lORyc6XG4gICAgICBjYXNlICdFUlJPUic6XG4gICAgICAgIGxvZy5yZXBvcnQodGhpcy5zb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5UcmVlU2l0dGVyUGFyc2VFcnJvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcblxuICAgICAgICAvKiBNYXRjaCBvdGhlciBub24tdGVybWluYWxzICovXG5cbiAgICAgICAgaWYgKG1hdGNoKG5vZGUsXG4gICAgICAgICAgJ2NvbnN0cmFpbnQnLFxuICAgICAgICAgICdmb3JtYWxfcGFyYW1ldGVycycsICdyZXF1aXJlZF9wYXJhbWV0ZXInLCAncmVzdF9wYXJhbWV0ZXInLFxuICAgICAgICAgICd0eXBlX2lkZW50aWZpZXInLCAndHlwZV9wYXJhbWV0ZXJzJywgJ3R5cGVfcGFyYW1ldGVyJywgJ3R5cGVfYW5ub3RhdGlvbicsXG4gICAgICAgICAgJ29iamVjdF90eXBlJywgJ3ByZWRlZmluZWRfdHlwZScsICdwYXJlbnRoZXNpemVkX3R5cGUnLCAnbGl0ZXJhbF90eXBlJyxcbiAgICAgICAgICAnaW50ZXJzZWN0aW9uX3R5cGUnLCAndW5pb25fdHlwZScsXG4gICAgICAgICAgJ2NsYXNzX2JvZHknLFxuICAgICAgICAgICdleHRlbmRzX2NsYXVzZScsXG4gICAgICAgICAgJ3VuYXJ5X2V4cHJlc3Npb24nLCAnYmluYXJ5X2V4cHJlc3Npb24nLCAnbWVtYmVyX2V4cHJlc3Npb24nLFxuICAgICAgICAgICdzdGF0ZW1lbnRfYmxvY2snLCAncmV0dXJuX3N0YXRlbWVudCcsICdleHBvcnRfc3RhdGVtZW50JywgJ2V4cHJlc3Npb25fc3RhdGVtZW50JyxcbiAgICAgICAgICAvLyBBIGNhbGxfc2lnbmF0dXJlIGNhbiBhbHNvIGJlIGEgbm9uLWNvbnRleHR1YWwgbm9kZVxuICAgICAgICAgICdjYWxsX3NpZ25hdHVyZScsXG4gICAgICAgICAgJ2ludGVybmFsX21vZHVsZScsXG4gICAgICAgICAgJ3ZhcmlhYmxlX2RlY2xhcmF0b3InLFxuICAgICAgICAgICdvYmplY3QnXG4gICAgICAgICkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdE5vblRlcm1pbmFsKG5vZGUsIHByb3BlcnRpZXMpXG4gICAgICAgIH1cblxuICAgICAgICAvKiBNYXRjaCB0ZXJtaW5hbHMgKi9cbiAgICAgICAgaWYgKG1hdGNoKG5vZGUsXG4gICAgICAgICAgJ2lkZW50aWZpZXInLCAnZXh0ZW5kcycsICdwcm9wZXJ0eV9pZGVudGlmaWVyJywgJ2FjY2Vzc2liaWxpdHlfbW9kaWZpZXInLFxuICAgICAgICAgICdzdHJpbmcnLCAndm9pZCcsICdib29sZWFuJywgJ251bGwnLCAndW5kZWZpbmVkJywgJ251bWJlcicsICdyZXR1cm4nLFxuICAgICAgICAgICdnZXQnLCAnZnVuY3Rpb24nLCAnbmFtZXNwYWNlJywgJ2NvbnN0J1xuICAgICAgICApKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRUZXJtaW5hbChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBsb2cucmVwb3J0KHRoaXMuc291cmNlLCBub2RlLCBFcnJvclR5cGUuTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2aXNpdENoaWxkcmVuID0gKG5vZGVzOiBTeW50YXhOb2RlW10pOiBBU1ROb2RlW10gPT4ge1xuICAgIGxldCBjaGlsZHJlbjogQVNUTm9kZVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgaWYgKCFub2RlLnR5cGUubWF0Y2goL1s8Pigpe30sOjtcXFtcXF0mfD1cXCtcXC1cXCpcXC9dLykgJiYgbm9kZS50eXBlICE9PSAnLi4uJykge1xuICAgICAgICBjb25zdCBjaGlsZCA9IHRoaXMudmlzaXROb2RlKG5vZGUpO1xuICAgICAgICBpZiAoY2hpbGQpIGNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cblxuICBwcml2YXRlIHZpc2l0UHJvZ3JhbSA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZVtdID0+IHtcbiAgICBsZXQgdmlzaXRlZCA9IHt9LFxuICAgICAgZ2V0U3RhcnRMb2NhdGlvbiA9IChuOiBBU1ROb2RlKSA9PiBgJHtuLmxvY2F0aW9uLnJvdy5zdGFydH06JHtuLmxvY2F0aW9uLmNvbHVtbi5zdGFydH1gO1xuICAgIC8vIEEgcHJvZ3JhbSBjYW4gaGF2ZSBtb2R1bGVzLCBuYW1lc3BhY2VzLCBjb21tZW50cyBhcyBpdHMgY2hpbGRyZW5cbiAgICAvLyBUaGUgZmlyc3Qgc3RlcCBpcyB0byBwYXJzZSBhbGwgdGhlIGNvbW1lbnRzIGluIHRoZSByb290IG5vZGVcbiAgICBsZXQgY29tbWVudHMgPSB0aGlzLnZpc2l0Q2hpbGRyZW4odGhpcy5maWx0ZXJUeXBlKG5vZGUsICdjb21tZW50JykpO1xuICAgIC8vIFBhcnNlIHRoZSBuYW1lc3BhY2VzIGluIGV4cHJlc3Npb25fc3RhdGVtZW50XG4gICAgbGV0IG5hbWVzcGFjZXMgPSB0aGlzLnZpc2l0Q2hpbGRyZW4odGhpcy5maWx0ZXJUeXBlKG5vZGUsICdleHByZXNzaW9uX3N0YXRlbWVudCcpKTtcbiAgICAvLyBQYXJzZSB0aGUgZXhwb3J0IHN0YXRlbWVudHMgaW4gdGhlIHJvb3Qgbm9kZVxuICAgIGxldCBleHBvcnRzID0gdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShub2RlLCAnZXhwb3J0X3N0YXRlbWVudCcpKTtcblxuICAgIC8vIEdldCB0aGUgdmlzaXRlZCBjb250ZXh0IG5vZGVzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21tZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY29tbWVudCA9IGNvbW1lbnRzW2ldO1xuICAgICAgY29uc3QgY29udGV4dCA9IGNvbW1lbnQ7XG4gICAgICB2aXNpdGVkW2dldFN0YXJ0TG9jYXRpb24oY29udGV4dCldID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgdGhlIHZpc2l0ZWQgbm9kZXMgZnJvbSBuYW1lc3BhY2VzIGFycmF5XG4gICAgXy5yZW1vdmUobmFtZXNwYWNlcywgeCA9PiB2aXNpdGVkW2dldFN0YXJ0TG9jYXRpb24oeCldKTtcblxuICAgIC8vIEV4cG9ydHMgYXJlIG9kZGJhbGxzIHNpbmNlIHNvbWUgZXhwb3J0cyBtYXkgcmVmZXJlbmNlXG4gICAgLy8gYSB0eXBlL25vZGUgdGhhdCBtYXkgaGF2ZSBiZWVuIGNvbW1lbnRlZC5cbiAgICAvLyBXZSdsbCBmaXJzdCBuZWVkIHRvIGZpbHRlciB0aGUgb25lcyB3ZSBoYXZlIHZpc2l0ZWRcbiAgICBfLnJlbW92ZShleHBvcnRzLCB4ID0+IHZpc2l0ZWRbZ2V0U3RhcnRMb2NhdGlvbih4KV0pO1xuXG4gICAgLy8gRnJvbSB0aGUgb25lcyB3ZSBoYXZlIG5vdCB2aXNpdGVkLCB3ZSdsbCBuZWVkIHRvIG1vZGlmeVxuICAgIC8vIHRoZSBub2RlIHByb3BlcnRpZXMgb2YgZWFjaCBjb250ZXh0IGluIGEgY29tbWVudCBub2RlIHRoYXRcbiAgICAvLyBtYXRjaGVzIHRoZSBvbmVzIHdlIGhhdmUgbm90IHZpc2l0ZWQuXG4gICAgY29uc3QgbWF0Y2hlZCA9IHt9O1xuICAgIGNvbW1lbnRzID0gXy5jb21wYWN0KFxuICAgICAgY29tbWVudHMubWFwKGNvbW1lbnQgPT4ge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cG9ydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBleHBvcnRfID0gZXhwb3J0c1tpXTtcbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0gY29tbWVudC5jb250ZXh0O1xuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBjb250ZXh0ICYmIGogPCBjb250ZXh0LmNoaWxkcmVuLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAoY29udGV4dC5jaGlsZHJlbltpXSAmJiBjb250ZXh0LmNoaWxkcmVuW2ldLnR5cGUgPT09IGV4cG9ydF8udHlwZSkge1xuICAgICAgICAgICAgICBtYXRjaGVkW2dldFN0YXJ0TG9jYXRpb24oZXhwb3J0XyldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgY29tbWVudC5jb250ZXh0LnByb3BlcnRpZXMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICAgIGNvbW1lbnQuY29udGV4dC5wcm9wZXJ0aWVzIHx8IHt9LFxuICAgICAgICAgICAgICAgIGV4cG9ydF8ucHJvcGVydGllc1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tbWVudDtcbiAgICAgIH0pKTtcblxuICAgIC8vIFJlbW92ZWQgdGhlIG1hdGNoZWQgZXhwb3J0c1xuICAgIF8ucmVtb3ZlKGV4cG9ydHMsIHggPT4gbWF0Y2hlZFtnZXRTdGFydExvY2F0aW9uKHgpXSlcblxuICAgIHJldHVybiBbXS5jb25jYXQoY29tbWVudHMpLmNvbmNhdChuYW1lc3BhY2VzKS5jb25jYXQoZXhwb3J0cyk7XG4gIH1cblxuICBwcml2YXRlIHZpc2l0Q29tbWVudCA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZSA9PiB7XG4gICAgaWYgKGlzSmF2YURvY0NvbW1lbnQodGhpcy5zb3VyY2UsIG5vZGUpICYmICFpc0xlZ2FsQ29tbWVudCh0aGlzLnNvdXJjZSwgbm9kZSkpIHtcbiAgICAgIGNvbnN0IG5leHRTaWJsaW5nID0gc2libGluZyhub2RlKTtcbiAgICAgIGlmIChuZXh0U2libGluZykge1xuICAgICAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENvbnRleHQobmV4dFNpYmxpbmcsIHt9KSwgdHJ1ZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmlzaXQgdGhlIGNvbnRleHR1YWwgbm9kZVxuICAgKiBcbiAgICogIyBSZW1hcmtcbiAgICogXG4gICAqIEEgbm9kZSBpcyBjb25zaWRlcmVkIGNvbnRleHR1YWwgd2hlbiBhIGNvbW1lbnQgaXMgdmlzaXRlZCBhbmQgdGhlIG5vZGUgaXMgaXRzIHNpYmxpbmcuXG4gICAqL1xuICBwcml2YXRlIHZpc2l0Q29udGV4dCA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxUeXBlU2NyaXB0UHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSAnZXhwb3J0X3N0YXRlbWVudCc6XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0RXhwb3J0U3RhdGVtZW50KG5vZGUsIHByb3BlcnRpZXMpO1xuICAgICAgY2FzZSAnZXhwcmVzc2lvbl9zdGF0ZW1lbnQnOlxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQobm9kZSwgcHJvcGVydGllcyk7XG4gICAgICBjYXNlICdjbGFzcyc6XG4gICAgICBjYXNlICdpbnRlcmZhY2VfZGVjbGFyYXRpb24nOlxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdENsYXNzT3JJbnRlcmZhY2Uobm9kZSwgcHJvcGVydGllcylcbiAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIGNhc2UgJ2NhbGxfc2lnbmF0dXJlJzpcbiAgICAgIGNhc2UgJ21ldGhvZF9zaWduYXR1cmUnOlxuICAgICAgY2FzZSAncHJvcGVydHlfc2lnbmF0dXJlJzpcbiAgICAgIGNhc2UgJ3B1YmxpY19maWVsZF9kZWZpbml0aW9uJzpcbiAgICAgIGNhc2UgJ21ldGhvZF9kZWZpbml0aW9uJzpcbiAgICAgIGNhc2UgJ2xleGljYWxfZGVjbGFyYXRpb24nOlxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdE5vblRlcm1pbmFsKG5vZGUsIHByb3BlcnRpZXMpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgbG9nLnJlcG9ydCh0aGlzLnNvdXJjZSwgbm9kZSwgRXJyb3JUeXBlLk5vZGVUeXBlTm90WWV0U3VwcG9ydGVkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLyogU3RhdGVtZW50cyAqL1xuXG4gIHByaXZhdGUgdmlzaXRFeHBvcnRTdGF0ZW1lbnQgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8VHlwZVNjcmlwdFByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XG4gICAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiwgZGVmYXVsdEV4cG9ydCA9IGZhbHNlO1xuICAgIC8vIFJlbW92ZSAnZXhwb3J0JyBzaW5jZSBpdCdzIGFsd2F5cyBmaXJzdCBpbiB0aGUgYXJyYXlcbiAgICBjaGlsZHJlbi5zaGlmdCgpO1xuICAgIGlmICh0aGlzLmhhc0RlZmF1bHRFeHBvcnQobm9kZSkpIHtcbiAgICAgIGRlZmF1bHRFeHBvcnQgPSB0cnVlO1xuICAgICAgLy8gUmVtb3ZlICdkZWZhdWx0JyBleHBvcnRcbiAgICAgIGNoaWxkcmVuLnNoaWZ0KCk7XG4gICAgfVxuICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW4uc2hpZnQoKTtcbiAgICByZXR1cm4gdGhpcy52aXNpdE5vZGUoY2hpbGQsIHsgZXhwb3J0czogeyBleHBvcnQ6IHRydWUsIGRlZmF1bHQ6IGRlZmF1bHRFeHBvcnQgfSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50ID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM6IFBhcnRpYWw8VHlwZVNjcmlwdFByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XG4gICAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuLnNoaWZ0KCk7XG5cbiAgICBpZiAobWF0Y2goY2hpbGQsICdpbnRlcm5hbF9tb2R1bGUnKSkge1xuICAgICAgcmV0dXJuIHRoaXMudmlzaXRJbnRlcm5hbE1vZHVsZShjaGlsZCwgcHJvcGVydGllcylcbiAgICB9XG5cbiAgICBpZiAobWF0Y2goY2hpbGQsICdmdW5jdGlvbicpKSB7XG4gICAgICBpZiAocHJvcGVydGllcykgcmV0dXJuIHRoaXMudmlzaXRDb250ZXh0KGNoaWxkLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy52aXNpdE5vblRlcm1pbmFsKGNoaWxkKVxuICB9XG5cbiAgLyogTW9kdWxlcyAqL1xuXG4gIHByaXZhdGUgdmlzaXRJbnRlcm5hbE1vZHVsZSA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogUGFydGlhbDxUeXBlU2NyaXB0UHJvcGVydGllcz4pOiBBU1ROb2RlID0+IHtcbiAgICBsZXQgY2hpbGRyZW46IEFTVE5vZGVbXSA9IG5vZGUuY2hpbGRyZW4ubWFwKGNoaWxkID0+IHtcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ3N0YXRlbWVudF9ibG9jaycpKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q2hpbGRyZW4odGhpcy5maWx0ZXJUeXBlKGNoaWxkLCAnY29tbWVudCcpKSlcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnZpc2l0Tm9kZShjaGlsZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIGNoaWxkcmVuLCBPYmplY3QuYXNzaWduKHByb3BlcnRpZXMgfHwge30sIHsgbmFtZXNwYWNlOiB0cnVlIH0pKTtcbiAgfVxuXG5cbiAgLyogRGVjbGFyYXRpb25zICovXG5cbiAgcHJpdmF0ZSB2aXNpdENsYXNzT3JJbnRlcmZhY2UgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8VHlwZVNjcmlwdFByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XG4gICAgLy8gU2luY2UgJ2ludGVyZmFjZScgb3IgJ2NsYXNzJyBpcyBhbHdheXMgZmlyc3QgaW4gdGhlIGFycmF5XG4gICAgLy8gd2UnbGwgbmVlZCB0byByZW1vdmUgaXQgZnJvbSB0aGUgYXJyYXkuXG4gICAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgICBjb25zdCBpbnRlcmZhY2VfID0gY2hpbGRyZW4uc2hpZnQoKTtcbiAgICBsZXQgZXh0ZW5kc18gPSBmYWxzZSwgaW1wbGVtZW50c18gPSBmYWxzZTtcbiAgICBpZiAodGhpcy5oYXNJbmhlcml0YW5jZShub2RlKSkge1xuICAgICAgY29uc3QgaW5oZXJpdGFuY2UgPSB0aGlzLmdldEluaGVyaXRhbmNlVHlwZShub2RlKVxuICAgICAgZXh0ZW5kc18gPSBpbmhlcml0YW5jZSA9PT0gJ2V4dGVuZHMnO1xuICAgICAgaW1wbGVtZW50c18gPSBpbmhlcml0YW5jZSA9PT0gJ2ltcGxlbWVudHMnO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGVfID0gY3JlYXRlQVNUTm9kZShcbiAgICAgIHRoaXMuc291cmNlLFxuICAgICAgbm9kZSxcbiAgICAgIHRoaXMudmlzaXRDaGlsZHJlbihjaGlsZHJlbiksXG4gICAgICBPYmplY3QuYXNzaWduKHByb3BlcnRpZXMgfHwge30sIHtcbiAgICAgICAgaW5oZXJpdGFuY2U6IHtcbiAgICAgICAgICBpbXBsZW1lbnRzOiBpbXBsZW1lbnRzXyxcbiAgICAgICAgICBleHRlbmRzOiBleHRlbmRzX1xuICAgICAgICB9IGFzIFR5cGVTY3JpcHRJbmhlcml0YW5jZVxuICAgICAgfSkpO1xuXG4gICAgaWYgKG1hdGNoKG5vZGUsICdjbGFzcycpKSB7XG4gICAgICByZXR1cm4gbm9kZV87XG4gICAgfVxuICAgIC8vIE92ZXJ3cml0ZSB0aGUgbm9kZSB0eXBlIGZyb20gJ2ludGVyZmFjZV9kZWNsYXJhdGlvbicgdG8gJ2ludGVyZmFjZSdcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihub2RlXywgeyB0eXBlOiBpbnRlcmZhY2VfLnR5cGUgfSlcbiAgfVxuXG4gIC8qIE5vbi10ZXJtaW5hbHMgKi9cblxuICBwcml2YXRlIHZpc2l0Tm9uVGVybWluYWwgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8VHlwZVNjcmlwdFByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XG4gICAgbGV0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBzb21lIG5vbi10ZXJtaW5hbHNcbiAgICAvLyBjb250YWluIGNvbW1lbnRzIHdoaWNoIGlzIHdoYXQgd2UgY2FyZSBhYm91dFxuICAgIGlmIChtYXRjaChub2RlLCAnY2xhc3NfYm9keScsICdvYmplY3RfdHlwZScpKSB7XG4gICAgICBjaGlsZHJlbiA9IHRoaXMuZmlsdGVyVHlwZShub2RlLCAnY29tbWVudCcpO1xuICAgIH1cbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBleHBvcnQgc3RhdGVtZW50cyBoYXZlIG5vZGUgcHJvcGVydGllc1xuICAgIGlmIChtYXRjaChub2RlLCAnZXhwb3J0X3N0YXRlbWVudCcpKSB7XG4gICAgICByZXR1cm4gdGhpcy52aXNpdEV4cG9ydFN0YXRlbWVudChub2RlKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBhbiBpbnRlcm5hbCBtb2R1bGUgY29udGFpbnMgb3RoZXIgbm9kZXNcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2ludGVybmFsX21vZHVsZScpKSB7XG4gICAgICByZXR1cm4gdGhpcy52aXNpdEludGVybmFsTW9kdWxlKG5vZGUsIHByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2VzIHdoZXJlIGFuIGludGVybWFsX21vZHVsZSBjYW4gZXhpc3QgaW4gYW4gZXhwcmVzc2lvbl9zdGF0ZW1lbnRcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2V4cHJlc3Npb25fc3RhdGVtZW50JykpIHtcbiAgICAgIHJldHVybiB0aGlzLnZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChub2RlLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICBpZiAobWF0Y2gobm9kZSwgJ2Z1bmN0aW9uJykgfHwgbWF0Y2gobm9kZSwgJ21ldGhvZF9kZWZpbml0aW9uJykpIHtcbiAgICAgIF8ucmVtb3ZlKGNoaWxkcmVuLCBjaGlsZCA9PiBtYXRjaChjaGlsZCwgJ3N0YXRlbWVudF9ibG9jaycpKVxuICAgICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUsIHRoaXMudmlzaXRDaGlsZHJlbihjaGlsZHJlbiksIHByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q2hpbGRyZW4oY2hpbGRyZW4pLCBwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIC8qIFRlcm1pbmFscyAqL1xuXG4gIHByaXZhdGUgdmlzaXRUZXJtaW5hbCA9IChub2RlOiBTeW50YXhOb2RlKTogQVNUTm9kZSA9PiB7XG4gICAgcmV0dXJuIGNyZWF0ZUFTVE5vZGUodGhpcy5zb3VyY2UsIG5vZGUpXG4gIH1cbn0iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL3R5cGVzY3JpcHQvdmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGlEQUF1RTtBQUN2RSxpREFBOEM7QUFFOUMsNEJBQTRCO0FBQzVCLHlDQUFpRDtBQUNqRCw2Q0FBc0M7QUFFdEMsK0NBQTREO0FBRTVELHVDQUE4QztBQUc5Qzs7R0FFRztBQUNILE1BQWEsaUJBQWtCLFNBQVEsaUJBQU87SUFHNUMsWUFBWSxNQUFjLEVBQUUsT0FBZ0M7UUFDMUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBSFIsUUFBRyxHQUFjLEVBQUUsQ0FBQTtRQW9FM0IsZUFBZTtRQUVmLGNBQVMsR0FBRyxDQUNWLElBQWdCLEVBQ2hCLFVBQTBDLEVBQzFDLEVBQUU7WUFDRixRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ2pCLEtBQUssU0FBUztvQkFDWixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ25DLE1BQU07Z0JBQ1IsS0FBSyxTQUFTO29CQUNaLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDakMsS0FBSyxTQUFTLENBQUM7Z0JBQ2YsS0FBSyxPQUFPO29CQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO29CQUN0RSxNQUFNO2dCQUNSO29CQUVFLCtCQUErQjtvQkFFL0IsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUNaLFlBQVksRUFDWixtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFDM0QsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQ3pFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxv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QUMsR0FBRyxDQUFDO0lBQ2xCLENBQUM7Q0ErUUY7QUFsVkQsOENBa1ZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNKYXZhRG9jQ29tbWVudCwgaXNMZWdhbENvbW1lbnQgfSBmcm9tIFwiLi4vLi4vdXRpbHMvY29tbWVudFwiO1xuaW1wb3J0IHsgc2libGluZyB9IGZyb20gXCIuLi8uLi91dGlscy9zaWJsaW5nXCI7XG5pbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbG9nLCB7IEVycm9yVHlwZSB9IGZyb20gXCIuLi8uLi91dGlscy9sb2dcIjtcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi4vLi4vdXRpbHMvbWF0Y2hcIjtcbmltcG9ydCBTb3VyY2UgZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvU291cmNlXCI7XG5pbXBvcnQgVmlzaXRvciwgeyBWaXNpdG9yT3B0aW9ucyB9IGZyb20gXCIuLi9jb21tb24vdmlzaXRvclwiO1xuaW1wb3J0IEFTVE5vZGUgZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvQVNUTm9kZVwiO1xuaW1wb3J0IHsgY3JlYXRlQVNUTm9kZSB9IGZyb20gXCIuLi9jb21tb24vYXN0XCI7XG5pbXBvcnQgeyBUeXBlU2NyaXB0UHJvcGVydGllcywgVHlwZVNjcmlwdEluaGVyaXRhbmNlIH0gZnJvbSBcIi4vcHJvcGVydGllc1wiO1xuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCB2aXNpdHMgQVNUTm9kZXMgZnJvbSBhIFR5cGVTY3JpcHQgdHJlZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFR5cGVTY3JpcHRWaXNpdG9yIGV4dGVuZHMgVmlzaXRvciB7XG4gIHByaXZhdGUgYXN0OiBBU1ROb2RlW10gPSBbXVxuICBwcml2YXRlIHNvdXJjZTogU291cmNlXG4gIGNvbnN0cnVjdG9yKHNvdXJjZTogU291cmNlLCBvcHRpb25zOiBQYXJ0aWFsPFZpc2l0b3JPcHRpb25zPikge1xuICAgIHN1cGVyKG9wdGlvbnMpXG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgbm9kZSBoYXMgaW5oZXJpdGFuY2VcbiAgICovXG4gIHByaXZhdGUgaGFzSW5oZXJpdGFuY2Uobm9kZTogU3ludGF4Tm9kZSkge1xuICAgIGxldCBpbmhlcml0cyA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgaWYgKG1hdGNoKGNoaWxkLCAnZXh0ZW5kcycsICdpbXBsZW1lbnRzJykpIHtcbiAgICAgICAgaW5oZXJpdHMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW5oZXJpdHNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbm9kZSdzIGluaGVyaXRhbmNlIHR5cGVcbiAgICovXG4gIHByaXZhdGUgZ2V0SW5oZXJpdGFuY2VUeXBlKG5vZGU6IFN5bnRheE5vZGUpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXTtcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgJ2V4dGVuZHMnKSkge1xuICAgICAgICByZXR1cm4gJ2V4dGVuZHMnO1xuICAgICAgfVxuXG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdpbXBsZW1lbnRzJykpIHtcbiAgICAgICAgcmV0dXJuICdpbXBsZW1lbnRzJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGV4cG9ydCBpcyBkZWZhdWx0XG4gICAqL1xuICBwcml2YXRlIGhhc0RlZmF1bHRFeHBvcnQobm9kZTogU3ludGF4Tm9kZSk6IGJvb2xlYW4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgaWYgKG1hdGNoKGNoaWxkLCAnZGVmYXVsdCcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBvbmx5IHRoZSBjb21tZW50cyBmcm9tIGEgbm9kZSdzIGNoaWxkcmVuLlxuICAgKi9cbiAgcHJpdmF0ZSBmaWx0ZXJUeXBlKG5vZGU6IFN5bnRheE5vZGUsIHR5cGU6IHN0cmluZyk6IFN5bnRheE5vZGVbXSB7XG4gICAgbGV0IGNoaWxkcmVuOiBTeW50YXhOb2RlW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXTtcbiAgICAgIGlmIChtYXRjaChjaGlsZCwgdHlwZSkpIHtcbiAgICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjaGlsZHJlbjtcbiAgfVxuXG4gIGdldEFTVCgpOiBBU1ROb2RlW10ge1xuICAgIHJldHVybiB0aGlzLmFzdDtcbiAgfVxuXG4gIC8qIFZpc2l0b3JzICAqL1xuXG4gIHZpc2l0Tm9kZSA9IChcbiAgICBub2RlOiBTeW50YXhOb2RlLFxuICAgIHByb3BlcnRpZXM/OiBQYXJ0aWFsPFR5cGVTY3JpcHRQcm9wZXJ0aWVzPlxuICApID0+IHtcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSAncHJvZ3JhbSc6XG4gICAgICAgIHRoaXMuYXN0ID0gdGhpcy52aXNpdFByb2dyYW0obm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY29tbWVudCc6XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0Q29tbWVudChub2RlKTtcbiAgICAgIGNhc2UgJ01JU1NJTkcnOlxuICAgICAgY2FzZSAnRVJST1InOlxuICAgICAgICB0aGlzLmxvZ2dlci5yZXBvcnQodGhpcy5zb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5UcmVlU2l0dGVyUGFyc2VFcnJvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcblxuICAgICAgICAvKiBNYXRjaCBvdGhlciBub24tdGVybWluYWxzICovXG5cbiAgICAgICAgaWYgKG1hdGNoKG5vZGUsXG4gICAgICAgICAgJ2NvbnN0cmFpbnQnLFxuICAgICAgICAgICdmb3JtYWxfcGFyYW1ldGVycycsICdyZXF1aXJlZF9wYXJhbWV0ZXInLCAncmVzdF9wYXJhbWV0ZXInLFxuICAgICAgICAgICd0eXBlX2lkZW50aWZpZXInLCAndHlwZV9wYXJhbWV0ZXJzJywgJ3R5cGVfcGFyYW1ldGVyJywgJ3R5cGVfYW5ub3RhdGlvbicsXG4gICAgICAgICAgJ29iamVjdF90eXBlJywgJ3ByZWRlZmluZWRfdHlwZScsICdwYXJlbnRoZXNpemVkX3R5cGUnLCAnbGl0ZXJhbF90eXBlJyxcbiAgICAgICAgICAnaW50ZXJzZWN0aW9uX3R5cGUnLCAndW5pb25fdHlwZScsXG4gICAgICAgICAgJ2NsYXNzX2JvZHknLFxuICAgICAgICAgICdleHRlbmRzX2NsYXVzZScsXG4gICAgICAgICAgJ3VuYXJ5X2V4cHJlc3Npb24nLCAnYmluYXJ5X2V4cHJlc3Npb24nLCAnbWVtYmVyX2V4cHJlc3Npb24nLFxuICAgICAgICAgICdzdGF0ZW1lbnRfYmxvY2snLCAncmV0dXJuX3N0YXRlbWVudCcsICdleHBvcnRfc3RhdGVtZW50JywgJ2V4cHJlc3Npb25fc3RhdGVtZW50JyxcbiAgICAgICAgICAvLyBBIGNhbGxfc2lnbmF0dXJlIGNhbiBhbHNvIGJlIGEgbm9uLWNvbnRleHR1YWwgbm9kZVxuICAgICAgICAgICdjYWxsX3NpZ25hdHVyZScsXG4gICAgICAgICAgJ2ludGVybmFsX21vZHVsZScsXG4gICAgICAgICAgJ3ZhcmlhYmxlX2RlY2xhcmF0b3InLFxuICAgICAgICAgICdvYmplY3QnXG4gICAgICAgICkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdE5vblRlcm1pbmFsKG5vZGUsIHByb3BlcnRpZXMpXG4gICAgICAgIH1cblxuICAgICAgICAvKiBNYXRjaCB0ZXJtaW5hbHMgKi9cbiAgICAgICAgaWYgKG1hdGNoKG5vZGUsXG4gICAgICAgICAgJ2lkZW50aWZpZXInLCAnZXh0ZW5kcycsICdwcm9wZXJ0eV9pZGVudGlmaWVyJywgJ2FjY2Vzc2liaWxpdHlfbW9kaWZpZXInLFxuICAgICAgICAgICdzdHJpbmcnLCAndm9pZCcsICdib29sZWFuJywgJ251bGwnLCAndW5kZWZpbmVkJywgJ251bWJlcicsICdyZXR1cm4nLFxuICAgICAgICAgICdnZXQnLCAnZnVuY3Rpb24nLCAnbmFtZXNwYWNlJywgJ2NvbnN0J1xuICAgICAgICApKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRUZXJtaW5hbChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZ2dlci5yZXBvcnQodGhpcy5zb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFlldFN1cHBvcnRlZCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZpc2l0Q2hpbGRyZW4gPSAobm9kZXM6IFN5bnRheE5vZGVbXSk6IEFTVE5vZGVbXSA9PiB7XG4gICAgbGV0IGNoaWxkcmVuOiBBU1ROb2RlW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBub2RlID0gbm9kZXNbaV07XG4gICAgICBpZiAoIW5vZGUudHlwZS5tYXRjaCgvWzw+KCl7fSw6O1xcW1xcXSZ8PVxcK1xcLVxcKlxcL10vKSAmJiBub2RlLnR5cGUgIT09ICcuLi4nKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gdGhpcy52aXNpdE5vZGUobm9kZSk7XG4gICAgICAgIGlmIChjaGlsZCkgY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjaGlsZHJlbjtcbiAgfVxuXG4gIHByaXZhdGUgdmlzaXRQcm9ncmFtID0gKG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlW10gPT4ge1xuICAgIGxldCB2aXNpdGVkID0ge30sXG4gICAgICBnZXRTdGFydExvY2F0aW9uID0gKG46IEFTVE5vZGUpID0+IGAke24ubG9jYXRpb24ucm93LnN0YXJ0fToke24ubG9jYXRpb24uY29sdW1uLnN0YXJ0fWA7XG4gICAgLy8gQSBwcm9ncmFtIGNhbiBoYXZlIG1vZHVsZXMsIG5hbWVzcGFjZXMsIGNvbW1lbnRzIGFzIGl0cyBjaGlsZHJlblxuICAgIC8vIFRoZSBmaXJzdCBzdGVwIGlzIHRvIHBhcnNlIGFsbCB0aGUgY29tbWVudHMgaW4gdGhlIHJvb3Qgbm9kZVxuICAgIGxldCBjb21tZW50cyA9IHRoaXMudmlzaXRDaGlsZHJlbih0aGlzLmZpbHRlclR5cGUobm9kZSwgJ2NvbW1lbnQnKSk7XG4gICAgLy8gUGFyc2UgdGhlIG5hbWVzcGFjZXMgaW4gZXhwcmVzc2lvbl9zdGF0ZW1lbnRcbiAgICBsZXQgbmFtZXNwYWNlcyA9IHRoaXMudmlzaXRDaGlsZHJlbih0aGlzLmZpbHRlclR5cGUobm9kZSwgJ2V4cHJlc3Npb25fc3RhdGVtZW50JykpO1xuICAgIC8vIFBhcnNlIHRoZSBleHBvcnQgc3RhdGVtZW50cyBpbiB0aGUgcm9vdCBub2RlXG4gICAgbGV0IGV4cG9ydHMgPSB0aGlzLnZpc2l0Q2hpbGRyZW4odGhpcy5maWx0ZXJUeXBlKG5vZGUsICdleHBvcnRfc3RhdGVtZW50JykpO1xuXG4gICAgLy8gR2V0IHRoZSB2aXNpdGVkIGNvbnRleHQgbm9kZXNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjb21tZW50ID0gY29tbWVudHNbaV07XG4gICAgICBjb25zdCBjb250ZXh0ID0gY29tbWVudDtcbiAgICAgIHZpc2l0ZWRbZ2V0U3RhcnRMb2NhdGlvbihjb250ZXh0KV0gPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aGUgdmlzaXRlZCBub2RlcyBmcm9tIG5hbWVzcGFjZXMgYXJyYXlcbiAgICBfLnJlbW92ZShuYW1lc3BhY2VzLCB4ID0+IHZpc2l0ZWRbZ2V0U3RhcnRMb2NhdGlvbih4KV0pO1xuXG4gICAgLy8gRXhwb3J0cyBhcmUgb2RkYmFsbHMgc2luY2Ugc29tZSBleHBvcnRzIG1heSByZWZlcmVuY2VcbiAgICAvLyBhIHR5cGUvbm9kZSB0aGF0IG1heSBoYXZlIGJlZW4gY29tbWVudGVkLlxuICAgIC8vIFdlJ2xsIGZpcnN0IG5lZWQgdG8gZmlsdGVyIHRoZSBvbmVzIHdlIGhhdmUgdmlzaXRlZFxuICAgIF8ucmVtb3ZlKGV4cG9ydHMsIHggPT4gdmlzaXRlZFtnZXRTdGFydExvY2F0aW9uKHgpXSk7XG5cbiAgICAvLyBGcm9tIHRoZSBvbmVzIHdlIGhhdmUgbm90IHZpc2l0ZWQsIHdlJ2xsIG5lZWQgdG8gbW9kaWZ5XG4gICAgLy8gdGhlIG5vZGUgcHJvcGVydGllcyBvZiBlYWNoIGNvbnRleHQgaW4gYSBjb21tZW50IG5vZGUgdGhhdFxuICAgIC8vIG1hdGNoZXMgdGhlIG9uZXMgd2UgaGF2ZSBub3QgdmlzaXRlZC5cbiAgICBjb25zdCBtYXRjaGVkID0ge307XG4gICAgY29tbWVudHMgPSBfLmNvbXBhY3QoXG4gICAgICBjb21tZW50cy5tYXAoY29tbWVudCA9PiB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwb3J0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGV4cG9ydF8gPSBleHBvcnRzW2ldO1xuICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSBjb21tZW50LmNvbnRleHQ7XG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGNvbnRleHQgJiYgaiA8IGNvbnRleHQuY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChjb250ZXh0LmNoaWxkcmVuW2ldICYmIGNvbnRleHQuY2hpbGRyZW5baV0udHlwZSA9PT0gZXhwb3J0Xy50eXBlKSB7XG4gICAgICAgICAgICAgIG1hdGNoZWRbZ2V0U3RhcnRMb2NhdGlvbihleHBvcnRfKV0gPSB0cnVlO1xuICAgICAgICAgICAgICBjb21tZW50LmNvbnRleHQucHJvcGVydGllcyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgICAgY29tbWVudC5jb250ZXh0LnByb3BlcnRpZXMgfHwge30sXG4gICAgICAgICAgICAgICAgZXhwb3J0Xy5wcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21tZW50O1xuICAgICAgfSkpO1xuXG4gICAgLy8gUmVtb3ZlZCB0aGUgbWF0Y2hlZCBleHBvcnRzXG4gICAgXy5yZW1vdmUoZXhwb3J0cywgeCA9PiBtYXRjaGVkW2dldFN0YXJ0TG9jYXRpb24oeCldKVxuXG4gICAgcmV0dXJuIFtdLmNvbmNhdChjb21tZW50cykuY29uY2F0KG5hbWVzcGFjZXMpLmNvbmNhdChleHBvcnRzKTtcbiAgfVxuXG4gIHByaXZhdGUgdmlzaXRDb21tZW50ID0gKG5vZGU6IFN5bnRheE5vZGUpOiBBU1ROb2RlID0+IHtcbiAgICBpZiAoaXNKYXZhRG9jQ29tbWVudCh0aGlzLnNvdXJjZSwgbm9kZSkgJiYgIWlzTGVnYWxDb21tZW50KHRoaXMuc291cmNlLCBub2RlKSkge1xuICAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSBzaWJsaW5nKG5vZGUpO1xuICAgICAgaWYgKG5leHRTaWJsaW5nKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q29udGV4dChuZXh0U2libGluZywge30pLCB0cnVlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWaXNpdCB0aGUgY29udGV4dHVhbCBub2RlXG4gICAqIFxuICAgKiAjIFJlbWFya1xuICAgKiBcbiAgICogQSBub2RlIGlzIGNvbnNpZGVyZWQgY29udGV4dHVhbCB3aGVuIGEgY29tbWVudCBpcyB2aXNpdGVkIGFuZCB0aGUgbm9kZSBpcyBpdHMgc2libGluZy5cbiAgICovXG4gIHByaXZhdGUgdmlzaXRDb250ZXh0ID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPFR5cGVTY3JpcHRQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICBjYXNlICdleHBvcnRfc3RhdGVtZW50JzpcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRFeHBvcnRTdGF0ZW1lbnQobm9kZSwgcHJvcGVydGllcyk7XG4gICAgICBjYXNlICdleHByZXNzaW9uX3N0YXRlbWVudCc6XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChub2RlLCBwcm9wZXJ0aWVzKTtcbiAgICAgIGNhc2UgJ2NsYXNzJzpcbiAgICAgIGNhc2UgJ2ludGVyZmFjZV9kZWNsYXJhdGlvbic6XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0Q2xhc3NPckludGVyZmFjZShub2RlLCBwcm9wZXJ0aWVzKVxuICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgY2FzZSAnY2FsbF9zaWduYXR1cmUnOlxuICAgICAgY2FzZSAnbWV0aG9kX3NpZ25hdHVyZSc6XG4gICAgICBjYXNlICdwcm9wZXJ0eV9zaWduYXR1cmUnOlxuICAgICAgY2FzZSAncHVibGljX2ZpZWxkX2RlZmluaXRpb24nOlxuICAgICAgY2FzZSAnbWV0aG9kX2RlZmluaXRpb24nOlxuICAgICAgY2FzZSAnbGV4aWNhbF9kZWNsYXJhdGlvbic6XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0Tm9uVGVybWluYWwobm9kZSwgcHJvcGVydGllcyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmxvZ2dlci5yZXBvcnQodGhpcy5zb3VyY2UsIG5vZGUsIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFlldFN1cHBvcnRlZCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qIFN0YXRlbWVudHMgKi9cblxuICBwcml2YXRlIHZpc2l0RXhwb3J0U3RhdGVtZW50ID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPFR5cGVTY3JpcHRQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xuICAgIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4sIGRlZmF1bHRFeHBvcnQgPSBmYWxzZTtcbiAgICAvLyBSZW1vdmUgJ2V4cG9ydCcgc2luY2UgaXQncyBhbHdheXMgZmlyc3QgaW4gdGhlIGFycmF5XG4gICAgY2hpbGRyZW4uc2hpZnQoKTtcbiAgICBpZiAodGhpcy5oYXNEZWZhdWx0RXhwb3J0KG5vZGUpKSB7XG4gICAgICBkZWZhdWx0RXhwb3J0ID0gdHJ1ZTtcbiAgICAgIC8vIFJlbW92ZSAnZGVmYXVsdCcgZXhwb3J0XG4gICAgICBjaGlsZHJlbi5zaGlmdCgpO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuLnNoaWZ0KCk7XG4gICAgcmV0dXJuIHRoaXMudmlzaXROb2RlKGNoaWxkLCB7IGV4cG9ydHM6IHsgZXhwb3J0OiB0cnVlLCBkZWZhdWx0OiBkZWZhdWx0RXhwb3J0IH0gfSk7XG4gIH1cblxuICBwcml2YXRlIHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudCA9IChub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzOiBQYXJ0aWFsPFR5cGVTY3JpcHRQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xuICAgIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbi5zaGlmdCgpO1xuXG4gICAgaWYgKG1hdGNoKGNoaWxkLCAnaW50ZXJuYWxfbW9kdWxlJykpIHtcbiAgICAgIHJldHVybiB0aGlzLnZpc2l0SW50ZXJuYWxNb2R1bGUoY2hpbGQsIHByb3BlcnRpZXMpXG4gICAgfVxuXG4gICAgaWYgKG1hdGNoKGNoaWxkLCAnZnVuY3Rpb24nKSkge1xuICAgICAgaWYgKHByb3BlcnRpZXMpIHJldHVybiB0aGlzLnZpc2l0Q29udGV4dChjaGlsZCwgcHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudmlzaXROb25UZXJtaW5hbChjaGlsZClcbiAgfVxuXG4gIC8qIE1vZHVsZXMgKi9cblxuICBwcml2YXRlIHZpc2l0SW50ZXJuYWxNb2R1bGUgPSAobm9kZTogU3ludGF4Tm9kZSwgcHJvcGVydGllcz86IFBhcnRpYWw8VHlwZVNjcmlwdFByb3BlcnRpZXM+KTogQVNUTm9kZSA9PiB7XG4gICAgbGV0IGNoaWxkcmVuOiBBU1ROb2RlW10gPSBub2RlLmNoaWxkcmVuLm1hcChjaGlsZCA9PiB7XG4gICAgICBpZiAobWF0Y2goY2hpbGQsICdzdGF0ZW1lbnRfYmxvY2snKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENoaWxkcmVuKHRoaXMuZmlsdGVyVHlwZShjaGlsZCwgJ2NvbW1lbnQnKSkpXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy52aXNpdE5vZGUoY2hpbGQpO1xuICAgIH0pO1xuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCBjaGlsZHJlbiwgT2JqZWN0LmFzc2lnbihwcm9wZXJ0aWVzIHx8IHt9LCB7IG5hbWVzcGFjZTogdHJ1ZSB9KSk7XG4gIH1cblxuXG4gIC8qIERlY2xhcmF0aW9ucyAqL1xuXG4gIHByaXZhdGUgdmlzaXRDbGFzc09ySW50ZXJmYWNlID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPFR5cGVTY3JpcHRQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xuICAgIC8vIFNpbmNlICdpbnRlcmZhY2UnIG9yICdjbGFzcycgaXMgYWx3YXlzIGZpcnN0IGluIHRoZSBhcnJheVxuICAgIC8vIHdlJ2xsIG5lZWQgdG8gcmVtb3ZlIGl0IGZyb20gdGhlIGFycmF5LlxuICAgIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XG4gICAgY29uc3QgaW50ZXJmYWNlXyA9IGNoaWxkcmVuLnNoaWZ0KCk7XG4gICAgbGV0IGV4dGVuZHNfID0gZmFsc2UsIGltcGxlbWVudHNfID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuaGFzSW5oZXJpdGFuY2Uobm9kZSkpIHtcbiAgICAgIGNvbnN0IGluaGVyaXRhbmNlID0gdGhpcy5nZXRJbmhlcml0YW5jZVR5cGUobm9kZSlcbiAgICAgIGV4dGVuZHNfID0gaW5oZXJpdGFuY2UgPT09ICdleHRlbmRzJztcbiAgICAgIGltcGxlbWVudHNfID0gaW5oZXJpdGFuY2UgPT09ICdpbXBsZW1lbnRzJztcbiAgICB9XG5cbiAgICBjb25zdCBub2RlXyA9IGNyZWF0ZUFTVE5vZGUoXG4gICAgICB0aGlzLnNvdXJjZSxcbiAgICAgIG5vZGUsXG4gICAgICB0aGlzLnZpc2l0Q2hpbGRyZW4oY2hpbGRyZW4pLFxuICAgICAgT2JqZWN0LmFzc2lnbihwcm9wZXJ0aWVzIHx8IHt9LCB7XG4gICAgICAgIGluaGVyaXRhbmNlOiB7XG4gICAgICAgICAgaW1wbGVtZW50czogaW1wbGVtZW50c18sXG4gICAgICAgICAgZXh0ZW5kczogZXh0ZW5kc19cbiAgICAgICAgfSBhcyBUeXBlU2NyaXB0SW5oZXJpdGFuY2VcbiAgICAgIH0pKTtcblxuICAgIGlmIChtYXRjaChub2RlLCAnY2xhc3MnKSkge1xuICAgICAgcmV0dXJuIG5vZGVfO1xuICAgIH1cbiAgICAvLyBPdmVyd3JpdGUgdGhlIG5vZGUgdHlwZSBmcm9tICdpbnRlcmZhY2VfZGVjbGFyYXRpb24nIHRvICdpbnRlcmZhY2UnXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obm9kZV8sIHsgdHlwZTogaW50ZXJmYWNlXy50eXBlIH0pXG4gIH1cblxuICAvKiBOb24tdGVybWluYWxzICovXG5cbiAgcHJpdmF0ZSB2aXNpdE5vblRlcm1pbmFsID0gKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBQYXJ0aWFsPFR5cGVTY3JpcHRQcm9wZXJ0aWVzPik6IEFTVE5vZGUgPT4ge1xuICAgIGxldCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XG4gICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZXMgd2hlcmUgc29tZSBub24tdGVybWluYWxzXG4gICAgLy8gY29udGFpbiBjb21tZW50cyB3aGljaCBpcyB3aGF0IHdlIGNhcmUgYWJvdXRcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2NsYXNzX2JvZHknLCAnb2JqZWN0X3R5cGUnKSkge1xuICAgICAgY2hpbGRyZW4gPSB0aGlzLmZpbHRlclR5cGUobm9kZSwgJ2NvbW1lbnQnKTtcbiAgICB9XG4gICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZXMgd2hlcmUgZXhwb3J0IHN0YXRlbWVudHMgaGF2ZSBub2RlIHByb3BlcnRpZXNcbiAgICBpZiAobWF0Y2gobm9kZSwgJ2V4cG9ydF9zdGF0ZW1lbnQnKSkge1xuICAgICAgcmV0dXJuIHRoaXMudmlzaXRFeHBvcnRTdGF0ZW1lbnQobm9kZSk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZXMgd2hlcmUgYW4gaW50ZXJuYWwgbW9kdWxlIGNvbnRhaW5zIG90aGVyIG5vZGVzXG4gICAgaWYgKG1hdGNoKG5vZGUsICdpbnRlcm5hbF9tb2R1bGUnKSkge1xuICAgICAgcmV0dXJuIHRoaXMudmlzaXRJbnRlcm5hbE1vZHVsZShub2RlLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBhbiBpbnRlcm1hbF9tb2R1bGUgY2FuIGV4aXN0IGluIGFuIGV4cHJlc3Npb25fc3RhdGVtZW50XG4gICAgaWYgKG1hdGNoKG5vZGUsICdleHByZXNzaW9uX3N0YXRlbWVudCcpKSB7XG4gICAgICByZXR1cm4gdGhpcy52aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQobm9kZSwgcHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgaWYgKG1hdGNoKG5vZGUsICdmdW5jdGlvbicpIHx8IG1hdGNoKG5vZGUsICdtZXRob2RfZGVmaW5pdGlvbicpKSB7XG4gICAgICBfLnJlbW92ZShjaGlsZHJlbiwgY2hpbGQgPT4gbWF0Y2goY2hpbGQsICdzdGF0ZW1lbnRfYmxvY2snKSlcbiAgICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlLCB0aGlzLnZpc2l0Q2hpbGRyZW4oY2hpbGRyZW4pLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlQVNUTm9kZSh0aGlzLnNvdXJjZSwgbm9kZSwgdGhpcy52aXNpdENoaWxkcmVuKGNoaWxkcmVuKSwgcHJvcGVydGllcyk7XG4gIH1cblxuICAvKiBUZXJtaW5hbHMgKi9cblxuICBwcml2YXRlIHZpc2l0VGVybWluYWwgPSAobm9kZTogU3ludGF4Tm9kZSk6IEFTVE5vZGUgPT4ge1xuICAgIHJldHVybiBjcmVhdGVBU1ROb2RlKHRoaXMuc291cmNlLCBub2RlKVxuICB9XG59Il19 \ No newline at end of file diff --git a/build/src/utils/log.d.ts b/build/src/utils/log.d.ts index 1b43d53..b5ab26e 100644 --- a/build/src/utils/log.d.ts +++ b/build/src/utils/log.d.ts @@ -1,12 +1,11 @@ -import { Log } from 'mr-doc-utils'; +import { Log, LogOptions } from 'mr-doc-utils'; import Source from '../interfaces/Source'; import { SyntaxNode } from 'tree-sitter'; export declare enum ErrorType { NodeTypeNotYetSupported = 0, TreeSitterParseError = 1 } -declare class ParserLog extends Log { +export default class ParserLogger extends Log { + constructor(namespace?: string, options?: LogOptions); report: (source: Source, node: SyntaxNode, error: ErrorType) => void; } -declare const log: ParserLog; -export default log; diff --git a/build/src/utils/log.js b/build/src/utils/log.js index 75c3cfb..df893b7 100644 --- a/build/src/utils/log.js +++ b/build/src/utils/log.js @@ -7,9 +7,9 @@ var ErrorType; ErrorType[ErrorType["NodeTypeNotYetSupported"] = 0] = "NodeTypeNotYetSupported"; ErrorType[ErrorType["TreeSitterParseError"] = 1] = "TreeSitterParseError"; })(ErrorType = exports.ErrorType || (exports.ErrorType = {})); -class ParserLog extends mr_doc_utils_1.Log { - constructor() { - super(...arguments); +class ParserLogger extends mr_doc_utils_1.Log { + constructor(namespace, options) { + super(namespace, options); this.report = (source, node, error) => { const location = range_1.default(node).location; const sameLine = location.row.start === location.row.end; @@ -27,6 +27,5 @@ class ParserLog extends mr_doc_utils_1.Log { }; } } -const log = new ParserLog('mr-doc::parser'); -exports.default = log; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtDQUFtQztBQUduQyxtQ0FBNEI7QUFFNUIsSUFBWSxTQUdYO0FBSEQsV0FBWSxTQUFTO0lBQ2pCLCtFQUF1QixDQUFBO0lBQ3ZCLHlFQUFvQixDQUFBO0FBQ3hCLENBQUMsRUFIVyxTQUFTLEdBQVQsaUJBQVMsS0FBVCxpQkFBUyxRQUdwQjtBQUVELE1BQU0sU0FBVSxTQUFRLGtCQUFHO0lBQTNCOztRQUNJLFdBQU0sR0FBRyxDQUFDLE1BQWMsRUFBRSxJQUFnQixFQUFFLEtBQWdCLEVBQVEsRUFBRTtZQUNsRSxNQUFNLFFBQVEsR0FBRyxlQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ3RDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQ3pELE1BQU0sWUFBWSxHQUFHLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNySCxNQUFNLE9BQU8sR0FBRyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksWUFBWSxFQUFFLFFBQVEsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDO1lBQ25GLFFBQVEsS0FBSyxFQUFFO2dCQUNYLEtBQUssU0FBUyxDQUFDLHVCQUF1QjtvQkFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsNEJBQTRCLE9BQU8sRUFBRSxDQUFDLENBQUE7b0JBQ2xGLE1BQU07Z0JBQ1YsS0FBSyxTQUFTLENBQUMsb0JBQW9CO29CQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLHFEQUFxRCxPQUFPLEVBQUUsQ0FBQyxDQUFBO2dCQUM5RTtvQkFDSSxNQUFNO2FBQ2I7UUFDTCxDQUFDLENBQUE7SUFDTCxDQUFDO0NBQUE7QUFHRCxNQUFNLEdBQUcsR0FBRyxJQUFJLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRTVDLGtCQUFlLEdBQUcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvZyB9IGZyb20gJ21yLWRvYy11dGlscyc7XG5pbXBvcnQgU291cmNlIGZyb20gJy4uL2ludGVyZmFjZXMvU291cmNlJztcbmltcG9ydCB7IFN5bnRheE5vZGUgfSBmcm9tICd0cmVlLXNpdHRlcic7XG5pbXBvcnQgcmFuZ2UgZnJvbSAnLi9yYW5nZSc7XG5cbmV4cG9ydCBlbnVtIEVycm9yVHlwZSB7XG4gICAgTm9kZVR5cGVOb3RZZXRTdXBwb3J0ZWQsXG4gICAgVHJlZVNpdHRlclBhcnNlRXJyb3Jcbn1cblxuY2xhc3MgUGFyc2VyTG9nIGV4dGVuZHMgTG9nIHtcbiAgICByZXBvcnQgPSAoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUsIGVycm9yOiBFcnJvclR5cGUpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSByYW5nZShub2RlKS5sb2NhdGlvbjtcbiAgICAgICAgY29uc3Qgc2FtZUxpbmUgPSBsb2NhdGlvbi5yb3cuc3RhcnQgPT09IGxvY2F0aW9uLnJvdy5lbmQ7XG4gICAgICAgIGNvbnN0IGdldExpbmVSYW5nZSA9ICgpID0+IHNhbWVMaW5lID8gbG9jYXRpb24ucm93LnN0YXJ0ICsgMSA6IGxvY2F0aW9uLnJvdy5zdGFydCArIDEgKyAnIC0gJyArIGxvY2F0aW9uLnJvdy5lbmQgKyAxO1xuICAgICAgICBjb25zdCBjdWxwcml0ID0gYExpbmUke3NhbWVMaW5lID8gJycgOiAncyd9ICR7Z2V0TGluZVJhbmdlKCl9IGluICcke3NvdXJjZS5wYXRofSdgO1xuICAgICAgICBzd2l0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXNlIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFlldFN1cHBvcnRlZDpcbiAgICAgICAgICAgICAgICB0aGlzLmluZm8oYCcke25vZGUudHlwZS5yZXBsYWNlKC9bX10vZywgJyAnKX0nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkOlxcbiR7Y3VscHJpdH1gKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBFcnJvclR5cGUuVHJlZVNpdHRlclBhcnNlRXJyb3I6XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvcihgJ3RyZWUtc2l0dGVyJyB3YXMgbm90IGFibGUgdG8gcGFyc2UgdGhlIHByb2dyYW06XFxuJHtjdWxwcml0fWApXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cbmNvbnN0IGxvZyA9IG5ldyBQYXJzZXJMb2coJ21yLWRvYzo6cGFyc2VyJyk7XG5cbmV4cG9ydCBkZWZhdWx0IGxvZzsiXX0= \ No newline at end of file +exports.default = ParserLogger; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtDQUErQztBQUcvQyxtQ0FBNEI7QUFFNUIsSUFBWSxTQUdYO0FBSEQsV0FBWSxTQUFTO0lBQ2pCLCtFQUF1QixDQUFBO0lBQ3ZCLHlFQUFvQixDQUFBO0FBQ3hCLENBQUMsRUFIVyxTQUFTLEdBQVQsaUJBQVMsS0FBVCxpQkFBUyxRQUdwQjtBQUVELE1BQXFCLFlBQWEsU0FBUSxrQkFBRztJQUN6QyxZQUFZLFNBQWtCLEVBQUUsT0FBb0I7UUFDaEQsS0FBSyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUU5QixXQUFNLEdBQUcsQ0FBQyxNQUFjLEVBQUUsSUFBZ0IsRUFBRSxLQUFnQixFQUFRLEVBQUU7WUFDbEUsTUFBTSxRQUFRLEdBQUcsZUFBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUN0QyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUN6RCxNQUFNLFlBQVksR0FBRyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFHLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDckgsTUFBTSxPQUFPLEdBQUcsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLFlBQVksRUFBRSxRQUFRLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQztZQUNuRixRQUFRLEtBQUssRUFBRTtnQkFDWCxLQUFLLFNBQVMsQ0FBQyx1QkFBdUI7b0JBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLDRCQUE0QixPQUFPLEVBQUUsQ0FBQyxDQUFBO29CQUNsRixNQUFNO2dCQUNWLEtBQUssU0FBUyxDQUFDLG9CQUFvQjtvQkFDL0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxxREFBcUQsT0FBTyxFQUFFLENBQUMsQ0FBQTtnQkFDOUU7b0JBQ0ksTUFBTTthQUNiO1FBQ0wsQ0FBQyxDQUFBO0lBZkQsQ0FBQztDQWdCSjtBQW5CRCwrQkFtQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2csIExvZ09wdGlvbnMgfSBmcm9tICdtci1kb2MtdXRpbHMnO1xuaW1wb3J0IFNvdXJjZSBmcm9tICcuLi9pbnRlcmZhY2VzL1NvdXJjZSc7XG5pbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSAndHJlZS1zaXR0ZXInO1xuaW1wb3J0IHJhbmdlIGZyb20gJy4vcmFuZ2UnO1xuXG5leHBvcnQgZW51bSBFcnJvclR5cGUge1xuICAgIE5vZGVUeXBlTm90WWV0U3VwcG9ydGVkLFxuICAgIFRyZWVTaXR0ZXJQYXJzZUVycm9yXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhcnNlckxvZ2dlciBleHRlbmRzIExvZyB7XG4gICAgY29uc3RydWN0b3IobmFtZXNwYWNlPzogc3RyaW5nLCBvcHRpb25zPzogTG9nT3B0aW9ucykge1xuICAgICAgICBzdXBlcihuYW1lc3BhY2UsIG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXBvcnQgPSAoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUsIGVycm9yOiBFcnJvclR5cGUpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSByYW5nZShub2RlKS5sb2NhdGlvbjtcbiAgICAgICAgY29uc3Qgc2FtZUxpbmUgPSBsb2NhdGlvbi5yb3cuc3RhcnQgPT09IGxvY2F0aW9uLnJvdy5lbmQ7XG4gICAgICAgIGNvbnN0IGdldExpbmVSYW5nZSA9ICgpID0+IHNhbWVMaW5lID8gbG9jYXRpb24ucm93LnN0YXJ0ICsgMSA6IGxvY2F0aW9uLnJvdy5zdGFydCArIDEgKyAnIC0gJyArIGxvY2F0aW9uLnJvdy5lbmQgKyAxO1xuICAgICAgICBjb25zdCBjdWxwcml0ID0gYExpbmUke3NhbWVMaW5lID8gJycgOiAncyd9ICR7Z2V0TGluZVJhbmdlKCl9IGluICcke3NvdXJjZS5wYXRofSdgO1xuICAgICAgICBzd2l0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXNlIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFlldFN1cHBvcnRlZDpcbiAgICAgICAgICAgICAgICB0aGlzLmluZm8oYCcke25vZGUudHlwZS5yZXBsYWNlKC9bX10vZywgJyAnKX0nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkOlxcbiR7Y3VscHJpdH1gKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBFcnJvclR5cGUuVHJlZVNpdHRlclBhcnNlRXJyb3I6XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvcihgJ3RyZWUtc2l0dGVyJyB3YXMgbm90IGFibGUgdG8gcGFyc2UgdGhlIHByb2dyYW06XFxuJHtjdWxwcml0fWApXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxufSJdfQ== \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index a34eb8e..a8f9949 100644 --- a/package-lock.json +++ b/package-lock.json @@ -66,9 +66,9 @@ "dev": true }, "@types/node": { - "version": "8.10.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.26.tgz", - "integrity": "sha512-opk6bLLErLSwyVVJeSH5Ek7ZWOBSsN0JrvXTNVGLXLAXKB9xlTYajrplR44xVyMrmbut94H6uJ9jqzM/12jxkA==", + "version": "8.10.27", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.27.tgz", + "integrity": "sha512-MNRS6EyHl3XbqoJfog2atvSq6nYBFbyQYcw3v6H9AURtA0NYr28Zo/pB2NQ48zev4/KqLkyYTpY8AZZhOg/X7g==", "dev": true }, "ansi-regex": { @@ -830,7 +830,7 @@ } }, "mr-doc-utils": { - "version": "github:iwatakeshi/mr-doc-utils#6caf13c5aa74160d9649909aaf63ebede8a5ce98", + "version": "github:iwatakeshi/mr-doc-utils#d56b77b857f9cdb08a42686a871391f6f8408350", "from": "github:iwatakeshi/mr-doc-utils", "requires": { "chalk": "^2.4.1", @@ -1271,9 +1271,9 @@ "integrity": "sha512-iGxq6nMcZ2PCRQOHykbhM5nMBiErA9iVfWvfatKlfAZ4O4t/46BfrbZfTcoNM6H6o6TYHQvxHtPWEnvPqH7rDA==" }, "tree-sitter": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.13.7.tgz", - "integrity": "sha512-yHUI2QK52l5v1jru+oO29o1LAmgPFhGAFChfknWWFdqinPdNOIuWCBhvpIEu6Cf4/s9PdxWfinkSNbLBoHTxXA==", + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.13.8.tgz", + "integrity": "sha512-LfKtMRxRjYfVSnrkwAMfwO8MH493G05fnw8QHaiB6p2iSjP9RHOLnXP1VxR4FlhQqyYRIbdUx/VCBoyntzB5Pg==", "requires": { "nan": "^2.10.0", "prebuild-install": "^5.0.0" diff --git a/package.json b/package.json index d64482a..fb55dc6 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,7 @@ "version": "1.0.0", "description": "The official parser for Mr. Doc", "main": "./build/index.js", - "scripts": { - }, + "scripts": {}, "repository": { "type": "git", "url": "git+https://github.com/mr-doc/parser.git" @@ -17,7 +16,7 @@ "homepage": "https://github.com/mr-doc/parser#readme", "devDependencies": { "@types/mocha": "^2.2.48", - "@types/node": "^8.10.26", + "@types/node": "^8.10.27", "chai": "^4.1.2", "mocha": "^4.1.0" }, @@ -30,7 +29,7 @@ "lodash": "^4.17.10", "mr-doc-utils": "github:iwatakeshi/mr-doc-utils", "tree-crawl": "^1.0.5", - "tree-sitter": "^0.13.7", + "tree-sitter": "^0.13.8", "tree-sitter-javascript": "^0.13.5", "tree-sitter-typescript": "^0.13.3", "xdoc-parser": "^3.2.1" diff --git a/src/lang/common/parser.ts b/src/lang/common/parser.ts index 355da6a..87d4659 100644 --- a/src/lang/common/parser.ts +++ b/src/lang/common/parser.ts @@ -1,13 +1,27 @@ import Source from "../../interfaces/Source"; import { Tree } from "tree-sitter"; import ASTNode from "../../interfaces/ASTNode"; +import { LogOptions } from "mr-doc-utils"; +import { XDocParserOptions } from "xdoc-parser/src/XDocParser"; + +export interface ParserOptions { + log: LogOptions, + documentation: XDocParserOptions +} export default abstract class Parser { protected source: Source - protected options: any - constructor(source: Source, options: any) { + protected options: ParserOptions + constructor(source: Source, options: Partial) { this.source = source; - this.options = options || {}; + this.options = Object.assign((options || {}), { + log: { + enabled: true, + levels: ['info', 'warn', 'error'] + } as LogOptions, + documentation: { + } as XDocParserOptions + }); } abstract parse(): ASTNode[] abstract get tree(): Tree diff --git a/src/lang/common/visitor.ts b/src/lang/common/visitor.ts index eba44fe..607bb75 100644 --- a/src/lang/common/visitor.ts +++ b/src/lang/common/visitor.ts @@ -1,7 +1,21 @@ import { SyntaxNode } from "tree-sitter"; import ASTNode from "../../interfaces/ASTNode"; +import { LogOptions, LogInterface } from "mr-doc-utils"; +import { XDocParserOptions } from "xdoc-parser/src/XDocParser"; +import ParserLogger from "../../utils/log"; + +export interface VisitorOptions { + log: LogOptions, + documentation: XDocParserOptions +} export default abstract class Visitor { + protected options: Partial + protected logger: ParserLogger + constructor(options?: Partial) { + this.options = options; + this.logger = new ParserLogger('mr-doc-parser::parser', this.options.log); + } abstract getAST(): ASTNode[] abstract visitNode(node: SyntaxNode, properties?: object): ASTNode abstract visitChildren(nodes: SyntaxNode[], properties?: object): ASTNode[] diff --git a/src/lang/javascript/index.ts b/src/lang/javascript/index.ts index 02763eb..1f8c10f 100644 --- a/src/lang/javascript/index.ts +++ b/src/lang/javascript/index.ts @@ -25,7 +25,7 @@ export default class JavaScriptParser extends Parser { this.tree_ = this.parser.parse(this.source.text); } parse(): ASTNode[] { - const visitor = new JavaScriptVisitor(this.source); + const visitor = new JavaScriptVisitor(this.source, this.options); const nodes = walk(this.tree_.rootNode); nodes.visit(visitor) return visitor.getAST(); diff --git a/src/lang/javascript/visitor.ts b/src/lang/javascript/visitor.ts index c17bdfa..555f6f9 100644 --- a/src/lang/javascript/visitor.ts +++ b/src/lang/javascript/visitor.ts @@ -6,17 +6,18 @@ import * as _ from 'lodash'; import log, { ErrorType } from "../../utils/log"; import match from "../../utils/match"; import Source from "../../interfaces/Source"; -import Visitor from "../common/visitor"; +import Visitor, { VisitorOptions } from "../common/visitor"; import ASTNode from "../../interfaces/ASTNode"; import { JavaScriptProperties, JavaScriptInheritance } from "./properties"; /** * A class that visits ASTNodes from a TypeScript tree. */ -export class JavaScriptVisitor implements Visitor { +export class JavaScriptVisitor extends Visitor { private ast: ASTNode[] = [] private source: Source - constructor(source: Source) { + constructor(source: Source, options: Partial) { + super(options); this.source = source; } @@ -95,7 +96,7 @@ export class JavaScriptVisitor implements Visitor { return this.visitComment(node); case 'MISSING': case 'ERROR': - log.report(this.source, node, ErrorType.TreeSitterParseError); + this.logger.report(this.source, node, ErrorType.TreeSitterParseError); break; default: @@ -128,7 +129,7 @@ export class JavaScriptVisitor implements Visitor { return this.visitTerminal(node); } - log.report(this.source, node, ErrorType.NodeTypeNotYetSupported); + this.logger.report(this.source, node, ErrorType.NodeTypeNotYetSupported); return; } } @@ -229,7 +230,7 @@ export class JavaScriptVisitor implements Visitor { case 'lexical_declaration': return this.visitNonTerminal(node, properties); default: - log.report(this.source, node, ErrorType.NodeTypeNotYetSupported); + this.logger.report(this.source, node, ErrorType.NodeTypeNotYetSupported); return; } } diff --git a/src/lang/typescript/index.ts b/src/lang/typescript/index.ts index 64faad5..afa0e24 100644 --- a/src/lang/typescript/index.ts +++ b/src/lang/typescript/index.ts @@ -26,7 +26,7 @@ export default class TypeScriptParser extends Parser { this.tree_ = this.parser.parse(this.source.text); } parse = (): ASTNode[] => { - const visitor = new TypeScriptVisitor(this.source); + const visitor = new TypeScriptVisitor(this.source, this.options); const nodes = walk(this.tree_.rootNode); nodes.visit(visitor) return visitor.getAST(); diff --git a/src/lang/typescript/visitor.ts b/src/lang/typescript/visitor.ts index e83beed..7839dfd 100644 --- a/src/lang/typescript/visitor.ts +++ b/src/lang/typescript/visitor.ts @@ -5,7 +5,7 @@ import * as _ from 'lodash'; import log, { ErrorType } from "../../utils/log"; import match from "../../utils/match"; import Source from "../../interfaces/Source"; -import Visitor from "../common/visitor"; +import Visitor, { VisitorOptions } from "../common/visitor"; import ASTNode from "../../interfaces/ASTNode"; import { createASTNode } from "../common/ast"; import { TypeScriptProperties, TypeScriptInheritance } from "./properties"; @@ -13,10 +13,11 @@ import { TypeScriptProperties, TypeScriptInheritance } from "./properties"; /** * A class that visits ASTNodes from a TypeScript tree. */ -export class TypeScriptVisitor implements Visitor { +export class TypeScriptVisitor extends Visitor { private ast: ASTNode[] = [] private source: Source - constructor(source: Source) { + constructor(source: Source, options: Partial) { + super(options) this.source = source; } @@ -95,7 +96,7 @@ export class TypeScriptVisitor implements Visitor { return this.visitComment(node); case 'MISSING': case 'ERROR': - log.report(this.source, node, ErrorType.TreeSitterParseError); + this.logger.report(this.source, node, ErrorType.TreeSitterParseError); break; default: @@ -128,7 +129,7 @@ export class TypeScriptVisitor implements Visitor { )) { return this.visitTerminal(node); } - log.report(this.source, node, ErrorType.NodeTypeNotYetSupported); + this.logger.report(this.source, node, ErrorType.NodeTypeNotYetSupported); break; } } @@ -233,7 +234,7 @@ export class TypeScriptVisitor implements Visitor { case 'lexical_declaration': return this.visitNonTerminal(node, properties); default: - log.report(this.source, node, ErrorType.NodeTypeNotYetSupported); + this.logger.report(this.source, node, ErrorType.NodeTypeNotYetSupported); break; } } diff --git a/src/utils/log.ts b/src/utils/log.ts index f0bd75c..cbf47d5 100644 --- a/src/utils/log.ts +++ b/src/utils/log.ts @@ -1,4 +1,4 @@ -import { Log } from 'mr-doc-utils'; +import { Log, LogOptions } from 'mr-doc-utils'; import Source from '../interfaces/Source'; import { SyntaxNode } from 'tree-sitter'; import range from './range'; @@ -8,7 +8,10 @@ export enum ErrorType { TreeSitterParseError } -class ParserLog extends Log { +export default class ParserLogger extends Log { + constructor(namespace?: string, options?: LogOptions) { + super(namespace, options); + } report = (source: Source, node: SyntaxNode, error: ErrorType): void => { const location = range(node).location; const sameLine = location.row.start === location.row.end; @@ -24,9 +27,4 @@ class ParserLog extends Log { break; } } -} - - -const log = new ParserLog('mr-doc::parser'); - -export default log; \ No newline at end of file +} \ No newline at end of file From 558648d8604277f091457dc02a7e5de0dc923e60 Mon Sep 17 00:00:00 2001 From: Takeshi Date: Fri, 24 Aug 2018 21:00:55 -0600 Subject: [PATCH 28/32] Update: Only options are needed for the ParserLogger --- src/lang/common/visitor.ts | 2 +- src/utils/log.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lang/common/visitor.ts b/src/lang/common/visitor.ts index 607bb75..ffac09c 100644 --- a/src/lang/common/visitor.ts +++ b/src/lang/common/visitor.ts @@ -14,7 +14,7 @@ export default abstract class Visitor { protected logger: ParserLogger constructor(options?: Partial) { this.options = options; - this.logger = new ParserLogger('mr-doc-parser::parser', this.options.log); + this.logger = new ParserLogger(this.options.log); } abstract getAST(): ASTNode[] abstract visitNode(node: SyntaxNode, properties?: object): ASTNode diff --git a/src/utils/log.ts b/src/utils/log.ts index cbf47d5..7b3b887 100644 --- a/src/utils/log.ts +++ b/src/utils/log.ts @@ -9,8 +9,8 @@ export enum ErrorType { } export default class ParserLogger extends Log { - constructor(namespace?: string, options?: LogOptions) { - super(namespace, options); + constructor(options?: LogOptions) { + super('mr-doc::parser', options); } report = (source: Source, node: SyntaxNode, error: ErrorType): void => { const location = range(node).location; From 51734c460bda2555f01ed01181e4951b72bac9ec Mon Sep 17 00:00:00 2001 From: Takeshi Date: Sun, 26 Aug 2018 19:47:18 -0600 Subject: [PATCH 29/32] Upgrade: Package.json --- package-lock.json | 12 ++++++------ package.json | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index a8f9949..669b465 100644 --- a/package-lock.json +++ b/package-lock.json @@ -66,9 +66,9 @@ "dev": true }, "@types/node": { - "version": "8.10.27", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.27.tgz", - "integrity": "sha512-MNRS6EyHl3XbqoJfog2atvSq6nYBFbyQYcw3v6H9AURtA0NYr28Zo/pB2NQ48zev4/KqLkyYTpY8AZZhOg/X7g==", + "version": "8.10.28", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.28.tgz", + "integrity": "sha512-iHsAzDg3OLH7JP+wipniUULHoDSWLgEDYOvsar6/mpAkTJd9/n23Ap8ikruMlvRTqMv/LXrflH9v/AfiEqaBGg==", "dev": true }, "ansi-regex": { @@ -1443,9 +1443,9 @@ "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=" }, "xdoc-parser": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/xdoc-parser/-/xdoc-parser-3.2.2.tgz", - "integrity": "sha512-P0ESzdcb8sujsRwRyKVvjyvAO7gm1tXID4s5v7snUXW3LvN2dJHnH9+d+T6C25FxEdoAbp+WzBbdkVT/uv81kQ==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/xdoc-parser/-/xdoc-parser-3.2.3.tgz", + "integrity": "sha512-aP6TjzEX6liIoeIkZZRS4nNxJzMcQAea9S0gGjSW/hOmBc1Z6IrCIY/ehQUkguy7OI4VouJP7G2geSgvZSSYRQ==", "requires": { "antlr4ts": "^0.4.1-alpha.0", "lodash": "^4.17.10", diff --git a/package.json b/package.json index fb55dc6..d61a4f5 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "homepage": "https://github.com/mr-doc/parser#readme", "devDependencies": { "@types/mocha": "^2.2.48", - "@types/node": "^8.10.27", + "@types/node": "^8.10.28", "chai": "^4.1.2", "mocha": "^4.1.0" }, @@ -32,6 +32,6 @@ "tree-sitter": "^0.13.8", "tree-sitter-javascript": "^0.13.5", "tree-sitter-typescript": "^0.13.3", - "xdoc-parser": "^3.2.1" + "xdoc-parser": "^3.2.3" } } From 55de90021381bc7190c08365a84c066892210255 Mon Sep 17 00:00:00 2001 From: Takeshi Date: Sun, 26 Aug 2018 19:56:28 -0600 Subject: [PATCH 30/32] Update: Source is now publicly available --- build/src/lang/common/parser.d.ts | 3 ++- build/src/lang/common/parser.js | 5 +++-- build/src/lang/common/visitor.js | 4 ++-- build/src/utils/log.d.ts | 2 +- build/src/utils/log.js | 6 +++--- src/lang/common/parser.ts | 5 +++-- 6 files changed, 14 insertions(+), 11 deletions(-) diff --git a/build/src/lang/common/parser.d.ts b/build/src/lang/common/parser.d.ts index 229feee..8a8be91 100644 --- a/build/src/lang/common/parser.d.ts +++ b/build/src/lang/common/parser.d.ts @@ -8,9 +8,10 @@ export interface ParserOptions { documentation: XDocParserOptions; } export default abstract class Parser { - protected source: Source; + private source_; protected options: ParserOptions; constructor(source: Source, options: Partial); + readonly source: Source; abstract parse(): ASTNode[]; abstract readonly tree: Tree; } diff --git a/build/src/lang/common/parser.js b/build/src/lang/common/parser.js index 525435c..ce225c7 100644 --- a/build/src/lang/common/parser.js +++ b/build/src/lang/common/parser.js @@ -2,7 +2,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); class Parser { constructor(source, options) { - this.source = source; + this.source_ = source; this.options = Object.assign((options || {}), { log: { enabled: true, @@ -11,6 +11,7 @@ class Parser { documentation: {} }); } + get source() { return this.source_; } } exports.default = Parser; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xhbmcvY29tbW9uL3BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVdBLE1BQThCLE1BQU07SUFHbEMsWUFBWSxNQUFjLEVBQUUsT0FBK0I7UUFDekQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxFQUFFO1lBQzVDLEdBQUcsRUFBRTtnQkFDSCxPQUFPLEVBQUUsSUFBSTtnQkFDYixNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQzthQUNwQjtZQUNmLGFBQWEsRUFBRSxFQUNPO1NBQ3ZCLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FHRjtBQWhCRCx5QkFnQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU291cmNlIGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL1NvdXJjZVwiO1xuaW1wb3J0IHsgVHJlZSB9IGZyb20gXCJ0cmVlLXNpdHRlclwiO1xuaW1wb3J0IEFTVE5vZGUgZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvQVNUTm9kZVwiO1xuaW1wb3J0IHsgTG9nT3B0aW9ucyB9IGZyb20gXCJtci1kb2MtdXRpbHNcIjtcbmltcG9ydCB7IFhEb2NQYXJzZXJPcHRpb25zIH0gZnJvbSBcInhkb2MtcGFyc2VyL3NyYy9YRG9jUGFyc2VyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VyT3B0aW9ucyB7XG4gIGxvZzogTG9nT3B0aW9ucyxcbiAgZG9jdW1lbnRhdGlvbjogWERvY1BhcnNlck9wdGlvbnNcbn1cblxuZXhwb3J0IGRlZmF1bHQgYWJzdHJhY3QgY2xhc3MgUGFyc2VyIHtcbiAgcHJvdGVjdGVkIHNvdXJjZTogU291cmNlXG4gIHByb3RlY3RlZCBvcHRpb25zOiBQYXJzZXJPcHRpb25zXG4gIGNvbnN0cnVjdG9yKHNvdXJjZTogU291cmNlLCBvcHRpb25zOiBQYXJ0aWFsPFBhcnNlck9wdGlvbnM+KSB7XG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbigob3B0aW9ucyB8fCB7fSksIHtcbiAgICAgIGxvZzoge1xuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICBsZXZlbHM6IFsnaW5mbycsICd3YXJuJywgJ2Vycm9yJ11cbiAgICAgIH0gYXMgTG9nT3B0aW9ucyxcbiAgICAgIGRvY3VtZW50YXRpb246IHtcbiAgICAgIH0gYXMgWERvY1BhcnNlck9wdGlvbnNcbiAgICB9KTtcbiAgfVxuICBhYnN0cmFjdCBwYXJzZSgpOiBBU1ROb2RlW11cbiAgYWJzdHJhY3QgZ2V0IHRyZWUoKTogVHJlZVxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xhbmcvY29tbW9uL3BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVdBLE1BQThCLE1BQU07SUFHbEMsWUFBWSxNQUFjLEVBQUUsT0FBK0I7UUFDekQsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDdEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxFQUFFO1lBQzVDLEdBQUcsRUFBRTtnQkFDSCxPQUFPLEVBQUUsSUFBSTtnQkFDYixNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQzthQUNwQjtZQUNmLGFBQWEsRUFBRSxFQUNPO1NBQ3ZCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxJQUFJLE1BQU0sS0FBYSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0NBRzlDO0FBakJELHlCQWlCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTb3VyY2UgZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvU291cmNlXCI7XG5pbXBvcnQgeyBUcmVlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgQVNUTm9kZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9BU1ROb2RlXCI7XG5pbXBvcnQgeyBMb2dPcHRpb25zIH0gZnJvbSBcIm1yLWRvYy11dGlsc1wiO1xuaW1wb3J0IHsgWERvY1BhcnNlck9wdGlvbnMgfSBmcm9tIFwieGRvYy1wYXJzZXIvc3JjL1hEb2NQYXJzZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBQYXJzZXJPcHRpb25zIHtcbiAgbG9nOiBMb2dPcHRpb25zLFxuICBkb2N1bWVudGF0aW9uOiBYRG9jUGFyc2VyT3B0aW9uc1xufVxuXG5leHBvcnQgZGVmYXVsdCBhYnN0cmFjdCBjbGFzcyBQYXJzZXIge1xuICBwcml2YXRlIHNvdXJjZV86IFNvdXJjZVxuICBwcm90ZWN0ZWQgb3B0aW9uczogUGFyc2VyT3B0aW9uc1xuICBjb25zdHJ1Y3Rvcihzb3VyY2U6IFNvdXJjZSwgb3B0aW9uczogUGFydGlhbDxQYXJzZXJPcHRpb25zPikge1xuICAgIHRoaXMuc291cmNlXyA9IHNvdXJjZTtcbiAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKChvcHRpb25zIHx8IHt9KSwge1xuICAgICAgbG9nOiB7XG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGxldmVsczogWydpbmZvJywgJ3dhcm4nLCAnZXJyb3InXVxuICAgICAgfSBhcyBMb2dPcHRpb25zLFxuICAgICAgZG9jdW1lbnRhdGlvbjoge1xuICAgICAgfSBhcyBYRG9jUGFyc2VyT3B0aW9uc1xuICAgIH0pO1xuICB9XG4gIGdldCBzb3VyY2UoKTogU291cmNlIHsgcmV0dXJuIHRoaXMuc291cmNlXzsgfVxuICBhYnN0cmFjdCBwYXJzZSgpOiBBU1ROb2RlW11cbiAgYWJzdHJhY3QgZ2V0IHRyZWUoKTogVHJlZVxufSJdfQ== \ No newline at end of file diff --git a/build/src/lang/common/visitor.js b/build/src/lang/common/visitor.js index 406eae4..32762f1 100644 --- a/build/src/lang/common/visitor.js +++ b/build/src/lang/common/visitor.js @@ -4,8 +4,8 @@ const log_1 = require("../../utils/log"); class Visitor { constructor(options) { this.options = options; - this.logger = new log_1.default('mr-doc-parser::parser', this.options.log); + this.logger = new log_1.default(this.options.log); } } exports.default = Visitor; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2NvbW1vbi92aXNpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBSUEseUNBQTJDO0FBTzNDLE1BQThCLE9BQU87SUFHbkMsWUFBWSxPQUFpQztRQUMzQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksYUFBWSxDQUFDLHVCQUF1QixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUUsQ0FBQztDQUlGO0FBVkQsMEJBVUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgQVNUTm9kZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9BU1ROb2RlXCI7XG5pbXBvcnQgeyBMb2dPcHRpb25zLCBMb2dJbnRlcmZhY2UgfSBmcm9tIFwibXItZG9jLXV0aWxzXCI7XG5pbXBvcnQgeyBYRG9jUGFyc2VyT3B0aW9ucyB9IGZyb20gXCJ4ZG9jLXBhcnNlci9zcmMvWERvY1BhcnNlclwiO1xuaW1wb3J0IFBhcnNlckxvZ2dlciBmcm9tIFwiLi4vLi4vdXRpbHMvbG9nXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmlzaXRvck9wdGlvbnMge1xuICBsb2c6IExvZ09wdGlvbnMsXG4gIGRvY3VtZW50YXRpb246IFhEb2NQYXJzZXJPcHRpb25zXG59XG5cbmV4cG9ydCBkZWZhdWx0IGFic3RyYWN0IGNsYXNzIFZpc2l0b3Ige1xuICBwcm90ZWN0ZWQgb3B0aW9uczogUGFydGlhbDxWaXNpdG9yT3B0aW9ucz5cbiAgcHJvdGVjdGVkIGxvZ2dlcjogUGFyc2VyTG9nZ2VyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBQYXJ0aWFsPFZpc2l0b3JPcHRpb25zPikge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5sb2dnZXIgPSBuZXcgUGFyc2VyTG9nZ2VyKCdtci1kb2MtcGFyc2VyOjpwYXJzZXInLCB0aGlzLm9wdGlvbnMubG9nKTtcbiAgfVxuICBhYnN0cmFjdCBnZXRBU1QoKTogQVNUTm9kZVtdXG4gIGFic3RyYWN0IHZpc2l0Tm9kZShub2RlOiBTeW50YXhOb2RlLCBwcm9wZXJ0aWVzPzogb2JqZWN0KTogQVNUTm9kZVxuICBhYnN0cmFjdCB2aXNpdENoaWxkcmVuKG5vZGVzOiBTeW50YXhOb2RlW10sIHByb3BlcnRpZXM/OiBvYmplY3QpOiBBU1ROb2RlW11cbn0iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9sYW5nL2NvbW1vbi92aXNpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBSUEseUNBQTJDO0FBTzNDLE1BQThCLE9BQU87SUFHbkMsWUFBWSxPQUFpQztRQUMzQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksYUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkQsQ0FBQztDQUlGO0FBVkQsMEJBVUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgQVNUTm9kZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9BU1ROb2RlXCI7XG5pbXBvcnQgeyBMb2dPcHRpb25zLCBMb2dJbnRlcmZhY2UgfSBmcm9tIFwibXItZG9jLXV0aWxzXCI7XG5pbXBvcnQgeyBYRG9jUGFyc2VyT3B0aW9ucyB9IGZyb20gXCJ4ZG9jLXBhcnNlci9zcmMvWERvY1BhcnNlclwiO1xuaW1wb3J0IFBhcnNlckxvZ2dlciBmcm9tIFwiLi4vLi4vdXRpbHMvbG9nXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmlzaXRvck9wdGlvbnMge1xuICBsb2c6IExvZ09wdGlvbnMsXG4gIGRvY3VtZW50YXRpb246IFhEb2NQYXJzZXJPcHRpb25zXG59XG5cbmV4cG9ydCBkZWZhdWx0IGFic3RyYWN0IGNsYXNzIFZpc2l0b3Ige1xuICBwcm90ZWN0ZWQgb3B0aW9uczogUGFydGlhbDxWaXNpdG9yT3B0aW9ucz5cbiAgcHJvdGVjdGVkIGxvZ2dlcjogUGFyc2VyTG9nZ2VyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBQYXJ0aWFsPFZpc2l0b3JPcHRpb25zPikge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5sb2dnZXIgPSBuZXcgUGFyc2VyTG9nZ2VyKHRoaXMub3B0aW9ucy5sb2cpO1xuICB9XG4gIGFic3RyYWN0IGdldEFTVCgpOiBBU1ROb2RlW11cbiAgYWJzdHJhY3QgdmlzaXROb2RlKG5vZGU6IFN5bnRheE5vZGUsIHByb3BlcnRpZXM/OiBvYmplY3QpOiBBU1ROb2RlXG4gIGFic3RyYWN0IHZpc2l0Q2hpbGRyZW4obm9kZXM6IFN5bnRheE5vZGVbXSwgcHJvcGVydGllcz86IG9iamVjdCk6IEFTVE5vZGVbXVxufSJdfQ== \ No newline at end of file diff --git a/build/src/utils/log.d.ts b/build/src/utils/log.d.ts index b5ab26e..d0dade9 100644 --- a/build/src/utils/log.d.ts +++ b/build/src/utils/log.d.ts @@ -6,6 +6,6 @@ export declare enum ErrorType { TreeSitterParseError = 1 } export default class ParserLogger extends Log { - constructor(namespace?: string, options?: LogOptions); + constructor(options?: LogOptions); report: (source: Source, node: SyntaxNode, error: ErrorType) => void; } diff --git a/build/src/utils/log.js b/build/src/utils/log.js index df893b7..7a12499 100644 --- a/build/src/utils/log.js +++ b/build/src/utils/log.js @@ -8,8 +8,8 @@ var ErrorType; ErrorType[ErrorType["TreeSitterParseError"] = 1] = "TreeSitterParseError"; })(ErrorType = exports.ErrorType || (exports.ErrorType = {})); class ParserLogger extends mr_doc_utils_1.Log { - constructor(namespace, options) { - super(namespace, options); + constructor(options) { + super('mr-doc::parser', options); this.report = (source, node, error) => { const location = range_1.default(node).location; const sameLine = location.row.start === location.row.end; @@ -28,4 +28,4 @@ class ParserLogger extends mr_doc_utils_1.Log { } } exports.default = ParserLogger; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtDQUErQztBQUcvQyxtQ0FBNEI7QUFFNUIsSUFBWSxTQUdYO0FBSEQsV0FBWSxTQUFTO0lBQ2pCLCtFQUF1QixDQUFBO0lBQ3ZCLHlFQUFvQixDQUFBO0FBQ3hCLENBQUMsRUFIVyxTQUFTLEdBQVQsaUJBQVMsS0FBVCxpQkFBUyxRQUdwQjtBQUVELE1BQXFCLFlBQWEsU0FBUSxrQkFBRztJQUN6QyxZQUFZLFNBQWtCLEVBQUUsT0FBb0I7UUFDaEQsS0FBSyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUU5QixXQUFNLEdBQUcsQ0FBQyxNQUFjLEVBQUUsSUFBZ0IsRUFBRSxLQUFnQixFQUFRLEVBQUU7WUFDbEUsTUFBTSxRQUFRLEdBQUcsZUFBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUN0QyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUN6RCxNQUFNLFlBQVksR0FBRyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFHLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDckgsTUFBTSxPQUFPLEdBQUcsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLFlBQVksRUFBRSxRQUFRLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQztZQUNuRixRQUFRLEtBQUssRUFBRTtnQkFDWCxLQUFLLFNBQVMsQ0FBQyx1QkFBdUI7b0JBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLDRCQUE0QixPQUFPLEVBQUUsQ0FBQyxDQUFBO29CQUNsRixNQUFNO2dCQUNWLEtBQUssU0FBUyxDQUFDLG9CQUFvQjtvQkFDL0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxxREFBcUQsT0FBTyxFQUFFLENBQUMsQ0FBQTtnQkFDOUU7b0JBQ0ksTUFBTTthQUNiO1FBQ0wsQ0FBQyxDQUFBO0lBZkQsQ0FBQztDQWdCSjtBQW5CRCwrQkFtQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2csIExvZ09wdGlvbnMgfSBmcm9tICdtci1kb2MtdXRpbHMnO1xuaW1wb3J0IFNvdXJjZSBmcm9tICcuLi9pbnRlcmZhY2VzL1NvdXJjZSc7XG5pbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSAndHJlZS1zaXR0ZXInO1xuaW1wb3J0IHJhbmdlIGZyb20gJy4vcmFuZ2UnO1xuXG5leHBvcnQgZW51bSBFcnJvclR5cGUge1xuICAgIE5vZGVUeXBlTm90WWV0U3VwcG9ydGVkLFxuICAgIFRyZWVTaXR0ZXJQYXJzZUVycm9yXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhcnNlckxvZ2dlciBleHRlbmRzIExvZyB7XG4gICAgY29uc3RydWN0b3IobmFtZXNwYWNlPzogc3RyaW5nLCBvcHRpb25zPzogTG9nT3B0aW9ucykge1xuICAgICAgICBzdXBlcihuYW1lc3BhY2UsIG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXBvcnQgPSAoc291cmNlOiBTb3VyY2UsIG5vZGU6IFN5bnRheE5vZGUsIGVycm9yOiBFcnJvclR5cGUpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSByYW5nZShub2RlKS5sb2NhdGlvbjtcbiAgICAgICAgY29uc3Qgc2FtZUxpbmUgPSBsb2NhdGlvbi5yb3cuc3RhcnQgPT09IGxvY2F0aW9uLnJvdy5lbmQ7XG4gICAgICAgIGNvbnN0IGdldExpbmVSYW5nZSA9ICgpID0+IHNhbWVMaW5lID8gbG9jYXRpb24ucm93LnN0YXJ0ICsgMSA6IGxvY2F0aW9uLnJvdy5zdGFydCArIDEgKyAnIC0gJyArIGxvY2F0aW9uLnJvdy5lbmQgKyAxO1xuICAgICAgICBjb25zdCBjdWxwcml0ID0gYExpbmUke3NhbWVMaW5lID8gJycgOiAncyd9ICR7Z2V0TGluZVJhbmdlKCl9IGluICcke3NvdXJjZS5wYXRofSdgO1xuICAgICAgICBzd2l0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXNlIEVycm9yVHlwZS5Ob2RlVHlwZU5vdFlldFN1cHBvcnRlZDpcbiAgICAgICAgICAgICAgICB0aGlzLmluZm8oYCcke25vZGUudHlwZS5yZXBsYWNlKC9bX10vZywgJyAnKX0nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkOlxcbiR7Y3VscHJpdH1gKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBFcnJvclR5cGUuVHJlZVNpdHRlclBhcnNlRXJyb3I6XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvcihgJ3RyZWUtc2l0dGVyJyB3YXMgbm90IGFibGUgdG8gcGFyc2UgdGhlIHByb2dyYW06XFxuJHtjdWxwcml0fWApXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtDQUErQztBQUcvQyxtQ0FBNEI7QUFFNUIsSUFBWSxTQUdYO0FBSEQsV0FBWSxTQUFTO0lBQ2pCLCtFQUF1QixDQUFBO0lBQ3ZCLHlFQUFvQixDQUFBO0FBQ3hCLENBQUMsRUFIVyxTQUFTLEdBQVQsaUJBQVMsS0FBVCxpQkFBUyxRQUdwQjtBQUVELE1BQXFCLFlBQWEsU0FBUSxrQkFBRztJQUN6QyxZQUFZLE9BQW9CO1FBQzVCLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUVyQyxXQUFNLEdBQUcsQ0FBQyxNQUFjLEVBQUUsSUFBZ0IsRUFBRSxLQUFnQixFQUFRLEVBQUU7WUFDbEUsTUFBTSxRQUFRLEdBQUcsZUFBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUN0QyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUN6RCxNQUFNLFlBQVksR0FBRyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFHLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDckgsTUFBTSxPQUFPLEdBQUcsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLFlBQVksRUFBRSxRQUFRLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQztZQUNuRixRQUFRLEtBQUssRUFBRTtnQkFDWCxLQUFLLFNBQVMsQ0FBQyx1QkFBdUI7b0JBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLDRCQUE0QixPQUFPLEVBQUUsQ0FBQyxDQUFBO29CQUNsRixNQUFNO2dCQUNWLEtBQUssU0FBUyxDQUFDLG9CQUFvQjtvQkFDL0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxxREFBcUQsT0FBTyxFQUFFLENBQUMsQ0FBQTtnQkFDOUU7b0JBQ0ksTUFBTTthQUNiO1FBQ0wsQ0FBQyxDQUFBO0lBZkQsQ0FBQztDQWdCSjtBQW5CRCwrQkFtQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2csIExvZ09wdGlvbnMgfSBmcm9tICdtci1kb2MtdXRpbHMnO1xuaW1wb3J0IFNvdXJjZSBmcm9tICcuLi9pbnRlcmZhY2VzL1NvdXJjZSc7XG5pbXBvcnQgeyBTeW50YXhOb2RlIH0gZnJvbSAndHJlZS1zaXR0ZXInO1xuaW1wb3J0IHJhbmdlIGZyb20gJy4vcmFuZ2UnO1xuXG5leHBvcnQgZW51bSBFcnJvclR5cGUge1xuICAgIE5vZGVUeXBlTm90WWV0U3VwcG9ydGVkLFxuICAgIFRyZWVTaXR0ZXJQYXJzZUVycm9yXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhcnNlckxvZ2dlciBleHRlbmRzIExvZyB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucz86IExvZ09wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoJ21yLWRvYzo6cGFyc2VyJywgb3B0aW9ucyk7XG4gICAgfVxuICAgIHJlcG9ydCA9IChzb3VyY2U6IFNvdXJjZSwgbm9kZTogU3ludGF4Tm9kZSwgZXJyb3I6IEVycm9yVHlwZSk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCBsb2NhdGlvbiA9IHJhbmdlKG5vZGUpLmxvY2F0aW9uO1xuICAgICAgICBjb25zdCBzYW1lTGluZSA9IGxvY2F0aW9uLnJvdy5zdGFydCA9PT0gbG9jYXRpb24ucm93LmVuZDtcbiAgICAgICAgY29uc3QgZ2V0TGluZVJhbmdlID0gKCkgPT4gc2FtZUxpbmUgPyBsb2NhdGlvbi5yb3cuc3RhcnQgKyAxIDogbG9jYXRpb24ucm93LnN0YXJ0ICsgMSArICcgLSAnICsgbG9jYXRpb24ucm93LmVuZCArIDE7XG4gICAgICAgIGNvbnN0IGN1bHByaXQgPSBgTGluZSR7c2FtZUxpbmUgPyAnJyA6ICdzJ30gJHtnZXRMaW5lUmFuZ2UoKX0gaW4gJyR7c291cmNlLnBhdGh9J2A7XG4gICAgICAgIHN3aXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhc2UgRXJyb3JUeXBlLk5vZGVUeXBlTm90WWV0U3VwcG9ydGVkOlxuICAgICAgICAgICAgICAgIHRoaXMuaW5mbyhgJyR7bm9kZS50eXBlLnJlcGxhY2UoL1tfXS9nLCAnICcpfScgaXMgbm90IHlldCBzdXBwb3J0ZWQ6XFxuJHtjdWxwcml0fWApXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEVycm9yVHlwZS5UcmVlU2l0dGVyUGFyc2VFcnJvcjpcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yKGAndHJlZS1zaXR0ZXInIHdhcyBub3QgYWJsZSB0byBwYXJzZSB0aGUgcHJvZ3JhbTpcXG4ke2N1bHByaXR9YClcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG59Il19 \ No newline at end of file diff --git a/src/lang/common/parser.ts b/src/lang/common/parser.ts index 87d4659..598ce68 100644 --- a/src/lang/common/parser.ts +++ b/src/lang/common/parser.ts @@ -10,10 +10,10 @@ export interface ParserOptions { } export default abstract class Parser { - protected source: Source + private source_: Source protected options: ParserOptions constructor(source: Source, options: Partial) { - this.source = source; + this.source_ = source; this.options = Object.assign((options || {}), { log: { enabled: true, @@ -23,6 +23,7 @@ export default abstract class Parser { } as XDocParserOptions }); } + get source(): Source { return this.source_; } abstract parse(): ASTNode[] abstract get tree(): Tree } \ No newline at end of file From 64dfeeb2ccbea88a3a62e589c9a38c82c7a355d2 Mon Sep 17 00:00:00 2001 From: Takeshi Date: Mon, 27 Aug 2018 12:32:06 -0600 Subject: [PATCH 31/32] Update: Add language getter to abstract parser --- src/lang/common/parser.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/lang/common/parser.ts b/src/lang/common/parser.ts index 598ce68..de5da0a 100644 --- a/src/lang/common/parser.ts +++ b/src/lang/common/parser.ts @@ -6,7 +6,8 @@ import { XDocParserOptions } from "xdoc-parser/src/XDocParser"; export interface ParserOptions { log: LogOptions, - documentation: XDocParserOptions + documentation: XDocParserOptions, + language?: string } export default abstract class Parser { @@ -20,10 +21,11 @@ export default abstract class Parser { levels: ['info', 'warn', 'error'] } as LogOptions, documentation: { - } as XDocParserOptions + } as XDocParserOptions, }); } get source(): Source { return this.source_; } + get language(): string { return this.options.language; } abstract parse(): ASTNode[] abstract get tree(): Tree } \ No newline at end of file From c66d3c7ee4e5090ef0d424eb40f0e7a79c61b3ef Mon Sep 17 00:00:00 2001 From: Takeshi Date: Mon, 27 Aug 2018 12:33:07 -0600 Subject: [PATCH 32/32] Chore: Build files --- build/src/lang/common/parser.d.ts | 2 ++ build/src/lang/common/parser.js | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/build/src/lang/common/parser.d.ts b/build/src/lang/common/parser.d.ts index 8a8be91..185028f 100644 --- a/build/src/lang/common/parser.d.ts +++ b/build/src/lang/common/parser.d.ts @@ -6,12 +6,14 @@ import { XDocParserOptions } from "xdoc-parser/src/XDocParser"; export interface ParserOptions { log: LogOptions; documentation: XDocParserOptions; + language?: string; } export default abstract class Parser { private source_; protected options: ParserOptions; constructor(source: Source, options: Partial); readonly source: Source; + readonly language: string; abstract parse(): ASTNode[]; abstract readonly tree: Tree; } diff --git a/build/src/lang/common/parser.js b/build/src/lang/common/parser.js index ce225c7..4be1694 100644 --- a/build/src/lang/common/parser.js +++ b/build/src/lang/common/parser.js @@ -8,10 +8,11 @@ class Parser { enabled: true, levels: ['info', 'warn', 'error'] }, - documentation: {} + documentation: {}, }); } get source() { return this.source_; } + get language() { return this.options.language; } } exports.default = Parser; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xhbmcvY29tbW9uL3BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVdBLE1BQThCLE1BQU07SUFHbEMsWUFBWSxNQUFjLEVBQUUsT0FBK0I7UUFDekQsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDdEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxFQUFFO1lBQzVDLEdBQUcsRUFBRTtnQkFDSCxPQUFPLEVBQUUsSUFBSTtnQkFDYixNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQzthQUNwQjtZQUNmLGFBQWEsRUFBRSxFQUNPO1NBQ3ZCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxJQUFJLE1BQU0sS0FBYSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0NBRzlDO0FBakJELHlCQWlCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTb3VyY2UgZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvU291cmNlXCI7XG5pbXBvcnQgeyBUcmVlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgQVNUTm9kZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9BU1ROb2RlXCI7XG5pbXBvcnQgeyBMb2dPcHRpb25zIH0gZnJvbSBcIm1yLWRvYy11dGlsc1wiO1xuaW1wb3J0IHsgWERvY1BhcnNlck9wdGlvbnMgfSBmcm9tIFwieGRvYy1wYXJzZXIvc3JjL1hEb2NQYXJzZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBQYXJzZXJPcHRpb25zIHtcbiAgbG9nOiBMb2dPcHRpb25zLFxuICBkb2N1bWVudGF0aW9uOiBYRG9jUGFyc2VyT3B0aW9uc1xufVxuXG5leHBvcnQgZGVmYXVsdCBhYnN0cmFjdCBjbGFzcyBQYXJzZXIge1xuICBwcml2YXRlIHNvdXJjZV86IFNvdXJjZVxuICBwcm90ZWN0ZWQgb3B0aW9uczogUGFyc2VyT3B0aW9uc1xuICBjb25zdHJ1Y3Rvcihzb3VyY2U6IFNvdXJjZSwgb3B0aW9uczogUGFydGlhbDxQYXJzZXJPcHRpb25zPikge1xuICAgIHRoaXMuc291cmNlXyA9IHNvdXJjZTtcbiAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKChvcHRpb25zIHx8IHt9KSwge1xuICAgICAgbG9nOiB7XG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGxldmVsczogWydpbmZvJywgJ3dhcm4nLCAnZXJyb3InXVxuICAgICAgfSBhcyBMb2dPcHRpb25zLFxuICAgICAgZG9jdW1lbnRhdGlvbjoge1xuICAgICAgfSBhcyBYRG9jUGFyc2VyT3B0aW9uc1xuICAgIH0pO1xuICB9XG4gIGdldCBzb3VyY2UoKTogU291cmNlIHsgcmV0dXJuIHRoaXMuc291cmNlXzsgfVxuICBhYnN0cmFjdCBwYXJzZSgpOiBBU1ROb2RlW11cbiAgYWJzdHJhY3QgZ2V0IHRyZWUoKTogVHJlZVxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xhbmcvY29tbW9uL3BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVlBLE1BQThCLE1BQU07SUFHbEMsWUFBWSxNQUFjLEVBQUUsT0FBK0I7UUFDekQsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDdEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxFQUFFO1lBQzVDLEdBQUcsRUFBRTtnQkFDSCxPQUFPLEVBQUUsSUFBSTtnQkFDYixNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQzthQUNwQjtZQUNmLGFBQWEsRUFBRSxFQUNPO1NBQ3ZCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxJQUFJLE1BQU0sS0FBYSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzdDLElBQUksUUFBUSxLQUFhLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0NBR3pEO0FBbEJELHlCQWtCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTb3VyY2UgZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvU291cmNlXCI7XG5pbXBvcnQgeyBUcmVlIH0gZnJvbSBcInRyZWUtc2l0dGVyXCI7XG5pbXBvcnQgQVNUTm9kZSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9BU1ROb2RlXCI7XG5pbXBvcnQgeyBMb2dPcHRpb25zIH0gZnJvbSBcIm1yLWRvYy11dGlsc1wiO1xuaW1wb3J0IHsgWERvY1BhcnNlck9wdGlvbnMgfSBmcm9tIFwieGRvYy1wYXJzZXIvc3JjL1hEb2NQYXJzZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBQYXJzZXJPcHRpb25zIHtcbiAgbG9nOiBMb2dPcHRpb25zLFxuICBkb2N1bWVudGF0aW9uOiBYRG9jUGFyc2VyT3B0aW9ucyxcbiAgbGFuZ3VhZ2U/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGRlZmF1bHQgYWJzdHJhY3QgY2xhc3MgUGFyc2VyIHtcbiAgcHJpdmF0ZSBzb3VyY2VfOiBTb3VyY2VcbiAgcHJvdGVjdGVkIG9wdGlvbnM6IFBhcnNlck9wdGlvbnNcbiAgY29uc3RydWN0b3Ioc291cmNlOiBTb3VyY2UsIG9wdGlvbnM6IFBhcnRpYWw8UGFyc2VyT3B0aW9ucz4pIHtcbiAgICB0aGlzLnNvdXJjZV8gPSBzb3VyY2U7XG4gICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbigob3B0aW9ucyB8fCB7fSksIHtcbiAgICAgIGxvZzoge1xuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICBsZXZlbHM6IFsnaW5mbycsICd3YXJuJywgJ2Vycm9yJ11cbiAgICAgIH0gYXMgTG9nT3B0aW9ucyxcbiAgICAgIGRvY3VtZW50YXRpb246IHtcbiAgICAgIH0gYXMgWERvY1BhcnNlck9wdGlvbnMsXG4gICAgfSk7XG4gIH1cbiAgZ2V0IHNvdXJjZSgpOiBTb3VyY2UgeyByZXR1cm4gdGhpcy5zb3VyY2VfOyB9XG4gIGdldCBsYW5ndWFnZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5vcHRpb25zLmxhbmd1YWdlOyB9XG4gIGFic3RyYWN0IHBhcnNlKCk6IEFTVE5vZGVbXVxuICBhYnN0cmFjdCBnZXQgdHJlZSgpOiBUcmVlXG59Il19 \ No newline at end of file