diff options
| author | ruki <waruqi@gmail.com> | 2018-11-08 00:38:48 +0800 |
|---|---|---|
| committer | ruki <waruqi@gmail.com> | 2018-11-07 21:53:09 +0800 |
| commit | 26105034da4fcce7ac883c899d781f016559310d (patch) | |
| tree | c459a5dc4e3aa0972d9919033ece511ce76dd129 /node_modules/babylon | |
| parent | 2c77f00f1a7ecb6c8192f9c16d3b2001b254a107 (diff) | |
| download | xmake-docs-26105034da4fcce7ac883c899d781f016559310d.tar.gz xmake-docs-26105034da4fcce7ac883c899d781f016559310d.zip | |
switch to vuepress
Diffstat (limited to 'node_modules/babylon')
| l--------- | node_modules/babylon/.bin/babylon | 1 | ||||
| -rw-r--r-- | node_modules/babylon/CHANGELOG.md | 1073 | ||||
| -rw-r--r-- | node_modules/babylon/LICENSE | 19 | ||||
| -rw-r--r-- | node_modules/babylon/README.md | 167 | ||||
| -rwxr-xr-x | node_modules/babylon/bin/babylon.js | 16 | ||||
| -rw-r--r-- | node_modules/babylon/lib/index.js | 10167 | ||||
| -rw-r--r-- | node_modules/babylon/package.json | 36 |
7 files changed, 11479 insertions, 0 deletions
diff --git a/node_modules/babylon/.bin/babylon b/node_modules/babylon/.bin/babylon new file mode 120000 index 00000000..cb0f94c5 --- /dev/null +++ b/node_modules/babylon/.bin/babylon @@ -0,0 +1 @@ +../bin/babylon.js
\ No newline at end of file diff --git a/node_modules/babylon/CHANGELOG.md b/node_modules/babylon/CHANGELOG.md new file mode 100644 index 00000000..1e2bbac6 --- /dev/null +++ b/node_modules/babylon/CHANGELOG.md @@ -0,0 +1,1073 @@ +# Changelog + +> **Tags:** +> - :boom: [Breaking Change] +> - :eyeglasses: [Spec Compliancy] +> - :rocket: [New Feature] +> - :bug: [Bug Fix] +> - :memo: [Documentation] +> - :house: [Internal] +> - :nail_care: [Polish] + +> Semver Policy: https://github.com/babel/babylon#semver + +_Note: Gaps between patch versions are faulty, broken or test releases._ + +See the [Babel Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md) for the pre-6.8.0 version Changelog. + +## 6.17.1 (2017-05-10) + +### :bug: Bug Fix + * Fix typo in flow spread operator error (Brian Ng) + * Fixed invalid number literal parsing ([#473](https://github.com/babel/babylon/pull/473)) (Alex Kuzmenko) + * Fix number parser ([#433](https://github.com/babel/babylon/pull/433)) (Alex Kuzmenko) + * Ensure non pattern shorthand props are checked for reserved words ([#479](https://github.com/babel/babylon/pull/479)) (Brian Ng) + * Remove jsx context when parsing arrow functions ([#475](https://github.com/babel/babylon/pull/475)) (Brian Ng) + * Allow super in class properties ([#499](https://github.com/babel/babylon/pull/499)) (Brian Ng) + * Allow flow class field to be named constructor ([#510](https://github.com/babel/babylon/pull/510)) (Brian Ng) + +## 6.17.0 (2017-04-20) + +### :bug: Bug Fix + * Cherry-pick #418 to 6.x ([#476](https://github.com/babel/babylon/pull/476)) (Sebastian McKenzie) + * Add support for invalid escapes in tagged templates ([#274](https://github.com/babel/babylon/pull/274)) (Kevin Gibbons) + * Throw error if new.target is used outside of a function ([#402](https://github.com/babel/babylon/pull/402)) (Brian Ng) + * Fix parsing of class properties ([#351](https://github.com/babel/babylon/pull/351)) (Kevin Gibbons) + * Fix parsing yield with dynamicImport ([#383](https://github.com/babel/babylon/pull/383)) (Brian Ng) + * Ensure consistent start args for parseParenItem ([#386](https://github.com/babel/babylon/pull/386)) (Brian Ng) + +## 7.0.0-beta.8 (2017-04-04) + +### New Feature +* Add support for flow type spread (#418) (Conrad Buck) +* Allow statics in flow interfaces (#427) (Brian Ng) + +### Bug Fix +* Fix predicate attachment to match flow parser (#428) (Brian Ng) +* Add extra.raw back to JSXText and JSXAttribute (#344) (Alex Rattray) +* Fix rest parameters with array and objects (#424) (Brian Ng) +* Fix number parser (#433) (Alex Kuzmenko) + +### Docs +* Fix CONTRIBUTING.md [skip ci] (#432) (Alex Kuzmenko) + +### Internal +* Use babel-register script when running babel smoke tests (#442) (Brian Ng) + +## 7.0.0-beta.7 (2017-03-22) + +### Spec Compliancy +* Remove babylon plugin for template revision since it's stage-4 (#426) (Henry Zhu) + +### Bug Fix + +* Fix push-pop logic in flow (#405) (Daniel Tschinder) + +## 7.0.0-beta.6 (2017-03-21) + +### New Feature +* Add support for invalid escapes in tagged templates (#274) (Kevin Gibbons) + +### Polish +* Improves error message when super is called outside of constructor (#408) (Arshabh Kumar Agarwal) + +### Docs + +* [7.0] Moved value field in spec from ObjectMember to ObjectProperty as ObjectMethod's don't have it (#415) [skip ci] (James Browning) + +## 7.0.0-beta.5 (2017-03-21) + +### Bug Fix +* Throw error if new.target is used outside of a function (#402) (Brian Ng) +* Fix parsing of class properties (#351) (Kevin Gibbons) + +### Other + * Test runner: Detect extra property in 'actual' but not in 'expected'. (#407) (Andy) + * Optimize travis builds (#419) (Daniel Tschinder) + * Update codecov to 2.0 (#412) (Daniel Tschinder) + * Fix spec for ClassMethod: It doesn't have a function, it *is* a function. (#406) [skip ci] (Andy) + * Changed Non-existent RestPattern to RestElement which is what is actually parsed (#409) [skip ci] (James Browning) + * Upgrade flow to 0.41 (Daniel Tschinder) + * Fix watch command (#403) (Brian Ng) + * Update yarn lock (Daniel Tschinder) + * Fix watch command (#403) (Brian Ng) + * chore(package): update flow-bin to version 0.41.0 (#395) (greenkeeper[bot]) + * Add estree test for correct order of directives (Daniel Tschinder) + * Add DoExpression to spec (#364) (Alex Kuzmenko) + * Mention cloning of repository in CONTRIBUTING.md (#391) [skip ci] (Sumedh Nimkarde) + * Explain how to run only one test (#389) [skip ci] (Aaron Ang) + + ## 7.0.0-beta.4 (2017-03-01) + +* Don't consume async when checking for async func decl (#377) (Brian Ng) +* add `ranges` option [skip ci] (Henry Zhu) +* Don't parse class properties without initializers when classProperties is disabled and Flow is enabled (#300) (Andrew Levine) + +## 7.0.0-beta.3 (2017-02-28) + +- [7.0] Change RestProperty/SpreadProperty to RestElement/SpreadElement (#384) +- Merge changes from 6.x + +## 7.0.0-beta.2 (2017-02-20) + +- estree: correctly change literals in all cases (#368) (Daniel Tschinder) + +## 7.0.0-beta.1 (2017-02-20) + +- Fix negative number literal typeannotations (#366) (Daniel Tschinder) +- Update contributing with more test info [skip ci] (#355) (Brian Ng) + +## 7.0.0-beta.0 (2017-02-15) + +- Reintroduce Variance node (#333) (Daniel Tschinder) +- Rename NumericLiteralTypeAnnotation to NumberLiteralTypeAnnotation (#332) (Charles Pick) +- [7.0] Remove ForAwaitStatement, add await flag to ForOfStatement (#349) (Brandon Dail) +- chore(package): update ava to version 0.18.0 (#345) (greenkeeper[bot]) +- chore(package): update babel-plugin-istanbul to version 4.0.0 (#350) (greenkeeper[bot]) +- Change location of ObjectTypeIndexer to match flow (#228) (Daniel Tschinder) +- Rename flow AST Type ExistentialTypeParam to ExistsTypeAnnotation (#322) (Toru Kobayashi) +- Revert "Temporary rollback for erroring on trailing comma with spread (#154)" (#290) (Daniel Tschinder) +- Remove classConstructorCall plugin (#291) (Brian Ng) +- Update yarn.lock (Daniel Tschinder) +- Update cross-env to 3.x (Daniel Tschinder) +- [7.0] Remove node 0.10, 0.12 and 5 from Travis (#284) (Sergey Rubanov) +- Remove `String.fromCodePoint` shim (#279) (Mathias Bynens) + +## 6.16.1 (2017-02-23) + +### :bug: Regression + +- Revert "Fix export default async function to be FunctionDeclaration" ([#375](https://github.com/babel/babylon/pull/375)) + +Need to modify Babel for this AST node change, so moving to 7.0. + +- Revert "Don't parse class properties without initializers when classProperties plugin is disabled, and Flow is enabled" ([#376](https://github.com/babel/babylon/pull/376)) + +[react-native](https://github.com/facebook/react-native/issues/12542) broke with this so we reverted. + +## 6.16.0 (2017-02-23) + +### :rocket: New Feature + +***ESTree*** compatibility as plugin ([#277](https://github.com/babel/babylon/pull/277)) (Daniel Tschinder) + +We finally introduce a new compatibility layer for ESTree. To put babylon into ESTree-compatible mode the new plugin `estree` can be enabled. In this mode the parser will output an AST that is compliant to the specs of [ESTree](https://github.com/estree/estree/) + +We highly recommend everyone who uses babylon outside of babel to use this plugin. This will make it much easier for users to switch between different ESTree-compatible parsers. We so far tested several projects with different parsers and exchanged their parser to babylon and in nearly all cases it worked out of the box. Some other estree-compatible parsers include `acorn`, `esprima`, `espree`, `flow-parser`, etc. + +To enable `estree` mode simply add the plugin in the config: +```json +{ + "plugins": [ "estree" ] +} +``` + +If you want to migrate your project from non-ESTree mode to ESTree, have a look at our [Readme](https://github.com/babel/babylon/#output), where all deviations are mentioned. + +Add a parseExpression public method ([#213](https://github.com/babel/babylon/pull/213)) (jeromew) + +Babylon exports a new function to parse a single expression + +```js +import { parseExpression } from 'babylon'; + +const ast = parseExpression('x || y && z', options); +``` + +The returned AST will only consist of the expression. The options are the same as for `parse()` + +Add startLine option ([#346](https://github.com/babel/babylon/pull/346)) (Raphael Mu) + +A new option was added to babylon allowing to change the intial linenumber for the first line which is usually `1`. +Changing this for example to `100` will make line `1` of the input source to be marked as line `100`, line `2` as `101`, line `3` as `102`, ... + +Function predicate declaration ([#103](https://github.com/babel/babylon/pull/103)) (Panagiotis Vekris) + +Added support for function predicates which flow introduced in version 0.33.0 + +```js +declare function is_number(x: mixed): boolean %checks(typeof x === "number"); +``` + +Allow imports in declare module ([#315](https://github.com/babel/babylon/pull/315)) (Daniel Tschinder) + +Added support for imports within module declarations which flow introduced in version 0.37.0 + +```js +declare module "C" { + import type { DT } from "D"; + declare export type CT = { D: DT }; +} +``` + +### :eyeglasses: Spec Compliancy + +Forbid semicolons after decorators in classes ([#352](https://github.com/babel/babylon/pull/352)) (Kevin Gibbons) + +This example now correctly throws an error when there is a semicolon after the decorator: + +```js +class A { +@a; +foo(){} +} +``` + +Keywords are not allowed as local specifier ([#307](https://github.com/babel/babylon/pull/307)) (Daniel Tschinder) + +Using keywords in imports is not allowed anymore: + +```js +import { default } from "foo"; +import { a as debugger } from "foo"; +``` + +Do not allow overwritting of primitive types ([#314](https://github.com/babel/babylon/pull/314)) (Daniel Tschinder) + +In flow it is now forbidden to overwrite the primitve types `"any"`, `"mixed"`, `"empty"`, `"bool"`, `"boolean"`, `"number"`, `"string"`, `"void"` and `"null"` with your own type declaration. + +Disallow import type { type a } from … ([#305](https://github.com/babel/babylon/pull/305)) (Daniel Tschinder) + +The following code now correctly throws an error + +```js +import type { type a } from "foo"; +``` + +Don't parse class properties without initializers when classProperties is disabled and Flow is enabled ([#300](https://github.com/babel/babylon/pull/300)) (Andrew Levine) + +Ensure that you enable the `classProperties` plugin in order to enable correct parsing of class properties. Prior to this version it was possible to parse them by enabling the `flow` plugin but this was not intended the behaviour. + +If you enable the flow plugin you can only define the type of the class properties, but not initialize them. + +Fix export default async function to be FunctionDeclaration ([#324](https://github.com/babel/babylon/pull/324)) (Daniel Tschinder) + +Parsing the following code now returns a `FunctionDeclaration` AST node instead of `FunctionExpression`. + +```js +export default async function bar() {}; +``` + +### :nail_care: Polish + +Improve error message on attempt to destructure named import ([#288](https://github.com/babel/babylon/pull/288)) (Brian Ng) + +### :bug: Bug Fix + +Fix negative number literal typeannotations ([#366](https://github.com/babel/babylon/pull/366)) (Daniel Tschinder) + +Ensure takeDecorators is called on exported class ([#358](https://github.com/babel/babylon/pull/358)) (Brian Ng) + +ESTree: correctly change literals in all cases ([#368](https://github.com/babel/babylon/pull/368)) (Daniel Tschinder) + +Correctly convert RestProperty to Assignable ([#339](https://github.com/babel/babylon/pull/339)) (Daniel Tschinder) + +Fix #321 by allowing question marks in type params ([#338](https://github.com/babel/babylon/pull/338)) (Daniel Tschinder) + +Fix #336 by correctly setting arrow-param ([#337](https://github.com/babel/babylon/pull/337)) (Daniel Tschinder) + +Fix parse error when destructuring `set` with default value ([#317](https://github.com/babel/babylon/pull/317)) (Brian Ng) + +Fix ObjectTypeCallProperty static ([#298](https://github.com/babel/babylon/pull/298)) (Dan Harper) + + +### :house: Internal + +Fix generator-method-with-computed-name spec ([#360](https://github.com/babel/babylon/pull/360)) (Alex Rattray) + +Fix flow type-parameter-declaration test with unintended semantic ([#361](https://github.com/babel/babylon/pull/361)) (Alex Rattray) + +Cleanup and splitup parser functions ([#295](https://github.com/babel/babylon/pull/295)) (Daniel Tschinder) + +chore(package): update flow-bin to version 0.38.0 ([#313](https://github.com/babel/babylon/pull/313)) (greenkeeper[bot]) + +Call inner function instead of 1:1 copy to plugin ([#294](https://github.com/babel/babylon/pull/294)) (Daniel Tschinder) + +Update eslint-config-babel to the latest version 🚀 ([#299](https://github.com/babel/babylon/pull/299)) (greenkeeper[bot]) + +Update eslint-config-babel to the latest version 🚀 ([#293](https://github.com/babel/babylon/pull/293)) (greenkeeper[bot]) + +devDeps: remove eslint-plugin-babel ([#292](https://github.com/babel/babylon/pull/292)) (Kai Cataldo) + +Correct indent eslint rule config ([#276](https://github.com/babel/babylon/pull/276)) (Daniel Tschinder) + +Fail tests that have expected.json and throws-option ([#285](https://github.com/babel/babylon/pull/285)) (Daniel Tschinder) + +### :memo: Documentation + +Update contributing with more test info [skip ci] ([#355](https://github.com/babel/babylon/pull/355)) (Brian Ng) + +Update API documentation ([#330](https://github.com/babel/babylon/pull/330)) (Timothy Gu) + +Added keywords to package.json ([#323](https://github.com/babel/babylon/pull/323)) (Dmytro) + +AST spec: fix casing of `RegExpLiteral` ([#318](https://github.com/babel/babylon/pull/318)) (Mathias Bynens) + +## 6.15.0 (2017-01-10) + +### :eyeglasses: Spec Compliancy + +Add support for Flow shorthand import type ([#267](https://github.com/babel/babylon/pull/267)) (Jeff Morrison) + +This change implements flows new shorthand import syntax +and where previously you had to write this code: + +```js +import {someValue} from "blah"; +import type {someType} from "blah"; +import typeof {someOtherValue} from "blah"; +``` + +you can now write it like this: + +```js +import { + someValue, + type someType, + typeof someOtherValue, +} from "blah"; +``` + +For more information look at [this](https://github.com/facebook/flow/pull/2890) pull request. + +flow: allow leading pipes in all positions ([#256](https://github.com/babel/babylon/pull/256)) (Vladimir Kurchatkin) + +This change now allows a leading pipe everywhere types can be used: +```js +var f = (x): | 1 | 2 => 1; +``` + +Throw error when exporting non-declaration ([#241](https://github.com/babel/babylon/pull/241)) (Kai Cataldo) + +Previously babylon parsed the following exports, although they are not valid: +```js +export typeof foo; +export new Foo(); +export function() {}; +export for (;;); +export while(foo); +``` + +### :bug: Bug Fix + +Don't set inType flag when parsing property names ([#266](https://github.com/babel/babylon/pull/266)) (Vladimir Kurchatkin) + +This fixes parsing of this case: + +```js +const map = { + [age <= 17] : 'Too young' +}; +``` + +Fix source location for JSXEmptyExpression nodes (fixes #248) ([#249](https://github.com/babel/babylon/pull/249)) (James Long) + +The following case produced an invalid AST +```js +<div>{/* foo */}</div> +``` + +Use fromCodePoint to convert high value unicode entities ([#243](https://github.com/babel/babylon/pull/243)) (Ryan Duffy) + +When high value unicode entities (e.g. 💩) were used in the input source code they are now correctly encoded in the resulting AST. + +Rename folder to avoid Windows-illegal characters ([#281](https://github.com/babel/babylon/pull/281)) (Ryan Plant) + +Allow this.state.clone() when parsing decorators ([#262](https://github.com/babel/babylon/pull/262)) (Alex Rattray) + +### :house: Internal + +User external-helpers ([#254](https://github.com/babel/babylon/pull/254)) (Daniel Tschinder) + +Add watch script for dev ([#234](https://github.com/babel/babylon/pull/234)) (Kai Cataldo) + +Freeze current plugins list for "*" option, and remove from README.md ([#245](https://github.com/babel/babylon/pull/245)) (Andrew Levine) + +Prepare tests for multiple fixture runners. ([#240](https://github.com/babel/babylon/pull/240)) (Daniel Tschinder) + +Add some test coverage for decorators stage-0 plugin ([#250](https://github.com/babel/babylon/pull/250)) (Andrew Levine) + +Refactor tokenizer types file ([#263](https://github.com/babel/babylon/pull/263)) (Sven SAULEAU) + +Update eslint-config-babel to the latest version 🚀 ([#273](https://github.com/babel/babylon/pull/273)) (greenkeeper[bot]) + +chore(package): update rollup to version 0.41.0 ([#272](https://github.com/babel/babylon/pull/272)) (greenkeeper[bot]) + +chore(package): update flow-bin to version 0.37.0 ([#255](https://github.com/babel/babylon/pull/255)) (greenkeeper[bot]) + +## 6.14.1 (2016-11-17) + +### :bug: Bug Fix + +Allow `"plugins": ["*"]` ([#229](https://github.com/babel/babylon/pull/229)) (Daniel Tschinder) + +```js +{ + "plugins": ["*"] +} +``` + +Will include all parser plugins instead of specifying each one individually. Useful for tools like babel-eslint, jscodeshift, and ast-explorer. + +## 6.14.0 (2016-11-16) + +### :eyeglasses: Spec Compliancy + +Throw error for reserved words `enum` and `await` ([#195](https://github.com/babel/babylon/pull/195)) (Kai Cataldo) + +[11.6.2.2 Future Reserved Words](http://www.ecma-international.org/ecma-262/6.0/#sec-future-reserved-words) + +Babylon will throw for more reserved words such as `enum` or `await` (in strict mode). + +``` +class enum {} // throws +class await {} // throws in strict mode (module) +``` + +Optional names for function types and object type indexers ([#197](https://github.com/babel/babylon/pull/197)) (Gabe Levi) + +So where you used to have to write + +```js +type A = (x: string, y: boolean) => number; +type B = (z: string) => number; +type C = { [key: string]: number }; +``` + +you can now write (with flow 0.34.0) + +```js +type A = (string, boolean) => number; +type B = string => number; +type C = { [string]: number }; +``` + +Parse flow nested array type annotations like `number[][]` ([#219](https://github.com/babel/babylon/pull/219)) (Bernhard Häussner) + +Supports these form now of specifying array types: + +```js +var a: number[][][][]; +var b: string[][]; +``` + +### :bug: Bug Fix + +Correctly eat semicolon at the end of `DelcareModuleExports` ([#223](https://github.com/babel/babylon/pull/223)) (Daniel Tschinder) + +``` +declare module "foo" { declare module.exports: number } +declare module "foo" { declare module.exports: number; } // also allowed now +``` + +### :house: Internal + + * Count Babel tests towards Babylon code coverage ([#182](https://github.com/babel/babylon/pull/182)) (Moti Zilberman) + * Fix strange line endings ([#214](https://github.com/babel/babylon/pull/214)) (Thomas Grainger) + * Add node 7 (Daniel Tschinder) + * chore(package): update flow-bin to version 0.34.0 ([#204](https://github.com/babel/babylon/pull/204)) (Greenkeeper) + +## v6.13.1 (2016-10-26) + +### :nail_care: Polish + +- Use rollup for bundling to speed up startup time ([#190](https://github.com/babel/babylon/pull/190)) ([@drewml](https://github.com/DrewML)) + +```js +const babylon = require('babylon'); +const ast = babylon.parse('var foo = "lol";'); +``` + +With that test case, there was a ~95ms savings by removing the need for node to build/traverse the dependency graph. + +**Without bundling** + + +**With bundling** + + +- add clean command [skip ci] ([#201](https://github.com/babel/babylon/pull/201)) (Henry Zhu) +- add ForAwaitStatement (async generator already added) [skip ci] ([#196](https://github.com/babel/babylon/pull/196)) (Henry Zhu) + +## v6.13.0 (2016-10-21) + +### :eyeglasses: Spec Compliancy + +Property variance type annotations for Flow plugin ([#161](https://github.com/babel/babylon/pull/161)) (Sam Goldman) + +> See https://flowtype.org/docs/variance.html for more information + +```js +type T = { +p: T }; +interface T { -p: T }; +declare class T { +[k:K]: V }; +class T { -[k:K]: V }; +class C2 { +p: T = e }; +``` + +Raise error on duplicate definition of __proto__ ([#183](https://github.com/babel/babylon/pull/183)) (Moti Zilberman) + +```js +({ __proto__: 1, __proto__: 2 }) // Throws an error now +``` + +### :bug: Bug Fix + +Flow: Allow class properties to be named `static` ([#184](https://github.com/babel/babylon/pull/184)) (Moti Zilberman) + +```js +declare class A { + static: T; +} +``` + +Allow "async" as identifier for object literal property shorthand ([#187](https://github.com/babel/babylon/pull/187)) (Andrew Levine) + +```js +var foo = { async, bar }; +``` + +### :nail_care: Polish + +Fix flowtype and add inType to state ([#189](https://github.com/babel/babylon/pull/189)) (Daniel Tschinder) + +> This improves the performance slightly (because of hidden classes) + +### :house: Internal + +Fix .gitattributes line ending setting ([#191](https://github.com/babel/babylon/pull/191)) (Moti Zilberman) + +Increase test coverage ([#175](https://github.com/babel/babylon/pull/175) (Moti Zilberman) + +Readd missin .eslinignore for IDEs (Daniel Tschinder) + +Error on missing expected.json fixture in CI ([#188](https://github.com/babel/babylon/pull/188)) (Moti Zilberman) + +Add .gitattributes and .editorconfig for LF line endings ([#179](https://github.com/babel/babylon/pull/179)) (Moti Zilberman) + +Fixes two tests that are failing after the merge of #172 ([#177](https://github.com/babel/babylon/pull/177)) (Moti Zilberman) + +## v6.12.0 (2016-10-14) + +### :eyeglasses: Spec Compliancy + +Implement import() syntax ([#163](https://github.com/babel/babylon/pull/163)) (Jordan Gensler) + +#### Dynamic Import + +- Proposal Repo: https://github.com/domenic/proposal-dynamic-import +- Championed by [@domenic](https://github.com/domenic) +- stage-2 +- [sept-28 tc39 notes](https://github.com/rwaldron/tc39-notes/blob/master/es7/2016-09/sept-28.md#113a-import) + +> This repository contains a proposal for adding a "function-like" import() module loading syntactic form to JavaScript + +```js +import(`./section-modules/${link.dataset.entryModule}.js`) +.then(module => { + module.loadPageInto(main); +}) +``` + +Add EmptyTypeAnnotation ([#171](https://github.com/babel/babylon/pull/171)) (Sam Goldman) + +#### EmptyTypeAnnotation + +Just wasn't covered before. + +```js +type T = empty; +``` + +### :bug: Bug Fix + +Fix crash when exporting with destructuring and sparse array ([#170](https://github.com/babel/babylon/pull/170)) (Jeroen Engels) + +```js +// was failing due to sparse array +export const { foo: [ ,, qux7 ] } = bar; +``` + +Allow keyword in Flow object declaration property names with type parameters ([#146](https://github.com/babel/babylon/pull/146)) (Dan Harper) + +```js +declare class X { + foobar<T>(): void; + static foobar<T>(): void; +} +``` + +Allow keyword in object/class property names with Flow type parameters ([#145](https://github.com/babel/babylon/pull/145)) (Dan Harper) + +```js +class Foo { + delete<T>(item: T): T { + return item; + } +} +``` + +Allow typeAnnotations for yield expressions ([#174](https://github.com/babel/babylon/pull/174))) (Daniel Tschinder) + +```js +function *foo() { + const x = (yield 5: any); +} +``` + +### :nail_care: Polish + +Annotate more errors with expected token ([#172](https://github.com/babel/babylon/pull/172))) (Moti Zilberman) + +```js +// Unexpected token, expected ; (1:6) +{ set 1 } +``` + +### :house: Internal + +Remove kcheck ([#173](https://github.com/babel/babylon/pull/173))) (Daniel Tschinder) + +Also run flow, linting, babel tests on seperate instances (add back node 0.10) + +## v6.11.6 (2016-10-12) + +### :bug: Bug Fix/Regression + +Fix crash when exporting with destructuring and sparse array ([#170](https://github.com/babel/babylon/pull/170)) (Jeroen Engels) + +```js +// was failing with `Cannot read property 'type' of null` because of null identifiers +export const { foo: [ ,, qux7 ] } = bar; +``` + +## v6.11.5 (2016-10-12) + +### :eyeglasses: Spec Compliancy + +Fix: Check for duplicate named exports in exported destructuring assignments ([#144](https://github.com/babel/babylon/pull/144)) (Kai Cataldo) + +```js +// `foo` has already been exported. Exported identifiers must be unique. (2:20) +export function foo() {}; +export const { a: [{foo}] } = bar; +``` + +Fix: Check for duplicate named exports in exported rest elements/properties ([#164](https://github.com/babel/babylon/pull/164)) (Kai Cataldo) + +```js +// `foo` has already been exported. Exported identifiers must be unique. (2:22) +export const foo = 1; +export const [bar, ...foo] = baz; +``` + +### :bug: Bug Fix + +Fix: Allow identifier `async` for default param in arrow expression ([#165](https://github.com/babel/babylon/pull/165)) (Kai Cataldo) + +```js +// this is ok now +const test = ({async = true}) => {}; +``` + +### :nail_care: Polish + +Babylon will now print out the token it's expecting if there's a `SyntaxError` ([#150](https://github.com/babel/babylon/pull/150)) (Daniel Tschinder) + +```bash +# So in the case of a missing ending curly (`}`) +Module build failed: SyntaxError: Unexpected token, expected } (30:0) + 28 | } + 29 | +> 30 | + | ^ +``` + +## v6.11.4 (2016-10-03) + +Temporary rollback for erroring on trailing comma with spread (#154) (Henry Zhu) + +## v6.11.3 (2016-10-01) + +### :eyeglasses: Spec Compliancy + +Add static errors for object rest (#149) ([@danez](https://github.com/danez)) + +> https://github.com/sebmarkbage/ecmascript-rest-spread + +Object rest copies the *rest* of properties from the right hand side `obj` starting from the left to right. + +```js +let { x, y, ...z } = { x: 1, y: 2, z: 3 }; +// x = 1 +// y = 2 +// z = { z: 3 } +``` + +#### New Syntax Errors: + +**SyntaxError**: The rest element has to be the last element when destructuring (1:10) +```bash +> 1 | let { ...x, y, z } = { x: 1, y: 2, z: 3}; + | ^ +# Previous behavior: +# x = { x: 1, y: 2, z: 3 } +# y = 2 +# z = 3 +``` + +Before, this was just a more verbose way of shallow copying `obj` since it doesn't actually do what you think. + +**SyntaxError**: Cannot have multiple rest elements when destructuring (1:13) + +```bash +> 1 | let { x, ...y, ...z } = { x: 1, y: 2, z: 3}; + | ^ +# Previous behavior: +# x = 1 +# y = { y: 2, z: 3 } +# z = { y: 2, z: 3 } +``` + +Before y and z would just be the same value anyway so there is no reason to need to have both. + +**SyntaxError**: A trailing comma is not permitted after the rest element (1:16) + +```js +let { x, y, ...z, } = obj; +``` + +The rationale for this is that the use case for trailing comma is that you can add something at the end without affecting the line above. Since a RestProperty always has to be the last property it doesn't make sense. + +--- + +get / set are valid property names in default assignment (#142) ([@jezell](https://github.com/jezell)) + +```js +// valid +function something({ set = null, get = null }) {} +``` + +## v6.11.2 (2016-09-23) + +### Bug Fix + +- [#139](https://github.com/babel/babylon/issues/139) Don't do the duplicate check if not an identifier (#140) @hzoo + +```js +// regression with duplicate export check +SyntaxError: ./typography.js: `undefined` has already been exported. Exported identifiers must be unique. (22:13) + 20 | + 21 | export const { rhythm } = typography; +> 22 | export const { TypographyStyle } = typography +``` + +Bail out for now, and make a change to account for destructuring in the next release. + +## 6.11.1 (2016-09-22) + +### Bug Fix +- [#137](https://github.com/babel/babylon/pull/137) - Fix a regression with duplicate exports - it was erroring on all keys in `Object.prototype`. @danez + +```javascript +export toString from './toString'; +``` + +```bash +`toString` has already been exported. Exported identifiers must be unique. (1:7) +> 1 | export toString from './toString'; + | ^ + 2 | +``` + +## 6.11.0 (2016-09-22) + +### Spec Compliancy (will break CI) + +- Disallow duplicate named exports ([#107](https://github.com/babel/babylon/pull/107)) @kaicataldo + +```js +// Only one default export allowed per module. (2:9) +export default function() {}; +export { foo as default }; + +// Only one default export allowed per module. (2:0) +export default {}; +export default function() {}; + +// `Foo` has already been exported. Exported identifiers must be unique. (2:0) +export { Foo }; +export class Foo {}; +``` + +### New Feature (Syntax) + +- Add support for computed class property names ([#121](https://github.com/babel/babylon/pull/121)) @motiz88 + +```js +// AST +interface ClassProperty <: Node { + type: "ClassProperty"; + key: Identifier; + value: Expression; + computed: boolean; // added +} +``` + +```js +// with "plugins": ["classProperties"] +class Foo { + [x] + ['y'] +} + +class Bar { + [p] + [m] () {} +} + ``` + +### Bug Fix + +- Fix `static` property falling through in the declare class Flow AST ([#135](https://github.com/babel/babylon/pull/135)) @danharper + +```js +declare class X { + a: number; + static b: number; // static + c: number; // this was being marked as static in the AST as well +} +``` + +### Polish + +- Rephrase "assigning/binding to rvalue" errors to include context ([#119](https://github.com/babel/babylon/pull/119)) @motiz88 + +```js +// Used to error with: +// SyntaxError: Assigning to rvalue (1:0) + +// Now: +// Invalid left-hand side in assignment expression (1:0) +3 = 4 + +// Invalid left-hand side in for-in statement (1:5) +for (+i in {}); +``` + +### Internal + +- Fix call to `this.parseMaybeAssign` with correct arguments ([#133](https://github.com/babel/babylon/pull/133)) @danez +- Add semver note to changelog ([#131](https://github.com/babel/babylon/pull/131)) @hzoo + +## 6.10.0 (2016-09-19) + +> We plan to include some spec compliancy bugs in patch versions. An example was the multiple default exports issue. + +### Spec Compliancy + +* Implement ES2016 check for simple parameter list in strict mode ([#106](https://github.com/babel/babylon/pull/106)) (Timothy Gu) + +> It is a Syntax Error if ContainsUseStrict of FunctionBody is true and IsSimpleParameterList of FormalParameters is false. https://tc39.github.io/ecma262/2016/#sec-function-definitions-static-semantics-early-errors + +More Context: [tc39-notes](https://github.com/rwaldron/tc39-notes/blob/master/es7/2015-07/july-29.md#611-the-scope-of-use-strict-with-respect-to-destructuring-in-parameter-lists) + +For example: + +```js +// this errors because it uses destructuring and default parameters +// in a function with a "use strict" directive +function a([ option1, option2 ] = []) { + "use strict"; +} + ``` + +The solution would be to use a top level "use strict" or to remove the destructuring or default parameters when using a function + "use strict" or to. + +### New Feature + +* Exact object type annotations for Flow plugin ([#104](https://github.com/babel/babylon/pull/104)) (Basil Hosmer) + +Added to flow in https://github.com/facebook/flow/commit/c710c40aa2a115435098d6c0dfeaadb023cd39b8 + +Looks like: + +```js +var a : {| x: number, y: string |} = { x: 0, y: 'foo' }; +``` + +### Bug Fixes + +* Include `typeParameter` location in `ArrowFunctionExpression` ([#126](https://github.com/babel/babylon/pull/126)) (Daniel Tschinder) +* Error on invalid flow type annotation with default assignment ([#122](https://github.com/babel/babylon/pull/122)) (Dan Harper) +* Fix Flow return types on arrow functions ([#124](https://github.com/babel/babylon/pull/124)) (Dan Harper) + +### Misc + +* Add tests for export extensions ([#127](https://github.com/babel/babylon/pull/127)) (Daniel Tschinder) +* Fix Contributing guidelines [skip ci] (Daniel Tschinder) + +## 6.9.2 (2016-09-09) + +The only change is to remove the `babel-runtime` dependency by compiling with Babel's ES2015 loose mode. So using babylon standalone should be smaller. + +## 6.9.1 (2016-08-23) + +This release contains mainly small bugfixes but also updates babylons default mode to es2017. The features for `exponentiationOperator`, `asyncFunctions` and `trailingFunctionCommas` which previously needed to be activated via plugin are now enabled by default and the plugins are now no-ops. + +### Bug Fixes + +- Fix issues with default object params in async functions ([#96](https://github.com/babel/babylon/pull/96)) @danez +- Fix issues with flow-types and async function ([#95](https://github.com/babel/babylon/pull/95)) @danez +- Fix arrow functions with destructuring, types & default value ([#94](https://github.com/babel/babylon/pull/94)) @danharper +- Fix declare class with qualified type identifier ([#97](https://github.com/babel/babylon/pull/97)) @danez +- Remove exponentiationOperator, asyncFunctions, trailingFunctionCommas plugins and enable them by default ([#98](https://github.com/babel/babylon/pull/98)) @danez + +## 6.9.0 (2016-08-16) + +### New syntax support + +- Add JSX spread children ([#42](https://github.com/babel/babylon/pull/42)) @calebmer + +(Be aware that React is not going to support this syntax) + +```js +<div> + {...todos.map(todo => <Todo key={todo.id} todo={todo}/>)} +</div> +``` + +- Add support for declare module.exports ([#72](https://github.com/babel/babylon/pull/72)) @danez + +```js +declare module "foo" { + declare module.exports: {} +} +``` + +### New Features + +- If supplied, attach filename property to comment node loc. ([#80](https://github.com/babel/babylon/pull/80)) @divmain +- Add identifier name to node loc field ([#90](https://github.com/babel/babylon/pull/90)) @kittens + +### Bug Fixes + +- Fix exponential operator to behave according to spec ([#75](https://github.com/babel/babylon/pull/75)) @danez +- Fix lookahead to not add comments to arrays which are not cloned ([#76](https://github.com/babel/babylon/pull/76)) @danez +- Fix accidental fall-through in Flow type parsing. ([#82](https://github.com/babel/babylon/pull/82)) @xiemaisi +- Only allow declares inside declare module ([#73](https://github.com/babel/babylon/pull/73)) @danez +- Small fix for parsing type parameter declarations ([#83](https://github.com/babel/babylon/pull/83)) @gabelevi +- Fix arrow param locations with flow types ([#57](https://github.com/babel/babylon/pull/57)) @danez +- Fixes SyntaxError position with flow optional type ([#65](https://github.com/babel/babylon/pull/65)) @danez + +### Internal + +- Add codecoverage to tests @danez +- Fix tests to not save expected output if we expect the test to fail @danez +- Make a shallow clone of babel for testing @danez +- chore(package): update cross-env to version 2.0.0 ([#77](https://github.com/babel/babylon/pull/77)) @greenkeeperio-bot +- chore(package): update ava to version 0.16.0 ([#86](https://github.com/babel/babylon/pull/86)) @greenkeeperio-bot +- chore(package): update babel-plugin-istanbul to version 2.0.0 ([#89](https://github.com/babel/babylon/pull/89)) @greenkeeperio-bot +- chore(package): update nyc to version 8.0.0 ([#88](https://github.com/babel/babylon/pull/88)) @greenkeeperio-bot + +## 6.8.4 (2016-07-06) + +### Bug Fixes + +- Fix the location of params, when flow and default value used ([#68](https://github.com/babel/babylon/pull/68)) @danez + +## 6.8.3 (2016-07-02) + +### Bug Fixes + +- Fix performance regression introduced in 6.8.2 with conditionals ([#63](https://github.com/babel/babylon/pull/63)) @danez + +## 6.8.2 (2016-06-24) + +### Bug Fixes + +- Fix parse error with yielding jsx elements in generators `function* it() { yield <a></a>; }` ([#31](https://github.com/babel/babylon/pull/31)) @eldereal +- When cloning nodes do not clone its comments ([#24](https://github.com/babel/babylon/pull/24)) @danez +- Fix parse errors when using arrow functions with an spread element and return type `(...props): void => {}` ([#10](https://github.com/babel/babylon/pull/10)) @danez +- Fix leading comments added from previous node ([#23](https://github.com/babel/babylon/pull/23)) @danez +- Fix parse errors with flow's optional arguments `(arg?) => {}` ([#19](https://github.com/babel/babylon/pull/19)) @danez +- Support negative numeric type literals @kittens +- Remove line terminator restriction after await keyword @kittens +- Remove grouped type arrow restriction as it seems flow no longer has it @kittens +- Fix parse error with generic methods that have the name `get` or `set` `class foo { get() {} }` ([#55](https://github.com/babel/babylon/pull/55)) @vkurchatkin +- Fix parse error with arrow functions that have flow type parameter declarations `<T>(x: T): T => x;` ([#54](https://github.com/babel/babylon/pull/54)) @gabelevi + +### Documentation + +- Document AST differences from ESTree ([#41](https://github.com/babel/babylon/pull/41)) @nene +- Move ast spec from babel/babel ([#46](https://github.com/babel/babylon/pull/46)) @hzoo + +### Internal + +- Enable skipped tests ([#16](https://github.com/babel/babylon/pull/16)) @danez +- Add script to test latest version of babylon with babel ([#21](https://github.com/babel/babylon/pull/21)) @danez +- Upgrade test runner ava @kittens +- Add missing generate-identifier-regex script @kittens +- Rename parser context types @kittens +- Add node v6 to travis testing @hzoo +- Update to Unicode v9 ([#45](https://github.com/babel/babylon/pull/45)) @mathiasbynens + +## 6.8.1 (2016-06-06) + +### New Feature + +- Parse type parameter declarations with defaults like `type Foo<T = string> = T` + +### Bug Fixes +- Type parameter declarations need 1 or more type parameters. +- The existential type `*` is not a valid type parameter. +- The existential type `*` is a primary type + +### Spec Compliancy +- The param list for type parameter declarations now consists of `TypeParameter` nodes +- New `TypeParameter` AST Node (replaces using the `Identifier` node before) + +``` +interface TypeParameter <: Node { + bound: TypeAnnotation; + default: TypeAnnotation; + name: string; + variance: "plus" | "minus"; +} +``` + +## 6.8.0 (2016-05-02) + +#### New Feature + +##### Parse Method Parameter Decorators ([#12](https://github.com/babel/babylon/pull/12)) + +> [Method Parameter Decorators](https://goo.gl/8MmCMG) is now a TC39 [stage 0 proposal](https://github.com/tc39/ecma262/blob/master/stage0.md). + +Examples: + +```js +class Foo { + constructor(@foo() x, @bar({ a: 123 }) @baz() y) {} +} + +export default function func(@foo() x, @bar({ a: 123 }) @baz() y) {} + +var obj = { + method(@foo() x, @bar({ a: 123 }) @baz() y) {} +}; +``` + +##### Parse for-await statements (w/ `asyncGenerators` plugin) ([#17](https://github.com/babel/babylon/pull/17)) + +There is also a new node type, `ForAwaitStatement`. + +> [Async generators and for-await](https://github.com/tc39/proposal-async-iteration) are now a [stage 2 proposal](https://github.com/tc39/ecma262#current-proposals). + +Example: + +```js +async function f() { + for await (let x of y); +} +``` diff --git a/node_modules/babylon/LICENSE b/node_modules/babylon/LICENSE new file mode 100644 index 00000000..d4c7fc58 --- /dev/null +++ b/node_modules/babylon/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2012-2014 by various contributors (see AUTHORS) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/babylon/README.md b/node_modules/babylon/README.md new file mode 100644 index 00000000..e0bac2b8 --- /dev/null +++ b/node_modules/babylon/README.md @@ -0,0 +1,167 @@ +<p align="center"> + <img alt="babylon" src="https://raw.githubusercontent.com/babel/logo/master/babylon.png" width="700"> +</p> + +<p align="center"> + Babylon is a JavaScript parser used in <a href="https://github.com/babel/babel">Babel</a>. +</p> + + - The latest ECMAScript version enabled by default (ES2017). + - Comment attachment. + - Support for JSX, Flow, Typescript. + - Support for experimental language proposals (accepting PRs for anything at least [stage-0](https://github.com/tc39/proposals/blob/master/stage-0-proposals.md)). + +## Credits + +Heavily based on [acorn](https://github.com/marijnh/acorn) and [acorn-jsx](https://github.com/RReverser/acorn-jsx), +thanks to the awesome work of [@RReverser](https://github.com/RReverser) and [@marijnh](https://github.com/marijnh). + +## API + +### `babylon.parse(code, [options])` + +### `babylon.parseExpression(code, [options])` + +`parse()` parses the provided `code` as an entire ECMAScript program, while +`parseExpression()` tries to parse a single Expression with performance in +mind. When in doubt, use `.parse()`. + +### Options + +- **allowImportExportEverywhere**: By default, `import` and `export` + declarations can only appear at a program's top level. Setting this + option to `true` allows them anywhere where a statement is allowed. + +- **allowAwaitOutsideFunction**: By default, `await` use is not allowed + outside of an async function. Set this to `true` to accept such + code. + +- **allowReturnOutsideFunction**: By default, a return statement at + the top level raises an error. Set this to `true` to accept such + code. + +- **allowSuperOutsideMethod**: TODO + +- **sourceType**: Indicate the mode the code should be parsed in. Can be + one of `"script"`, `"module"`, or `"unambiguous"`. Defaults to `"script"`. `"unambiguous"` will make Babylon attempt to _guess_, based on the presence of ES6 `import` or `export` statements. Files with ES6 `import`s and `export`s are considered `"module"` and are otherwise `"script"`. + +- **sourceFilename**: Correlate output AST nodes with their source filename. Useful when generating code and source maps from the ASTs of multiple input files. + +- **startLine**: By default, the first line of code parsed is treated as line 1. You can provide a line number to alternatively start with. Useful for integration with other source tools. + +- **plugins**: Array containing the plugins that you want to enable. + +- **strictMode**: TODO + +- **ranges**: Adds a `ranges` property to each node: `[node.start, node.end]` + +- **tokens**: Adds all parsed tokens to a `tokens` property on the `File` node + +### Output + +Babylon generates AST according to [Babel AST format][]. +It is based on [ESTree spec][] with the following deviations: + +> There is now an `estree` plugin which reverts these deviations + +- [Literal][] token is replaced with [StringLiteral][], [NumericLiteral][], [BooleanLiteral][], [NullLiteral][], [RegExpLiteral][] +- [Property][] token is replaced with [ObjectProperty][] and [ObjectMethod][] +- [MethodDefinition][] is replaced with [ClassMethod][] +- [Program][] and [BlockStatement][] contain additional `directives` field with [Directive][] and [DirectiveLiteral][] +- [ClassMethod][], [ObjectProperty][], and [ObjectMethod][] value property's properties in [FunctionExpression][] is coerced/brought into the main method node. + +AST for JSX code is based on [Facebook JSX AST][]. + +[Babel AST format]: https://github.com/babel/babylon/blob/master/ast/spec.md +[ESTree spec]: https://github.com/estree/estree + +[Literal]: https://github.com/estree/estree/blob/master/es5.md#literal +[Property]: https://github.com/estree/estree/blob/master/es5.md#property +[MethodDefinition]: https://github.com/estree/estree/blob/master/es2015.md#methoddefinition + +[StringLiteral]: https://github.com/babel/babel/tree/master/packages/babylon/ast/spec.md#stringliteral +[NumericLiteral]: https://github.com/babel/babel/tree/master/packages/babylon/ast/spec.md#numericliteral +[BooleanLiteral]: https://github.com/babel/babel/tree/master/packages/babylon/ast/spec.md#booleanliteral +[NullLiteral]: https://github.com/babel/babel/tree/master/packages/babylon/ast/spec.md#nullliteral +[RegExpLiteral]: https://github.com/babel/babel/tree/master/packages/babylon/ast/spec.md#regexpliteral +[ObjectProperty]: https://github.com/babel/babel/tree/master/packages/babylon/ast/spec.md#objectproperty +[ObjectMethod]: https://github.com/babel/babel/tree/master/packages/babylon/ast/spec.md#objectmethod +[ClassMethod]: https://github.com/babel/babel/tree/master/packages/babylon/ast/spec.md#classmethod +[Program]: https://github.com/babel/babel/tree/master/packages/babylon/ast/spec.md#programs +[BlockStatement]: https://github.com/babel/babel/tree/master/packages/babylon/ast/spec.md#blockstatement +[Directive]: https://github.com/babel/babel/tree/master/packages/babylon/ast/spec.md#directive +[DirectiveLiteral]: https://github.com/babel/babel/tree/master/packages/babylon/ast/spec.md#directiveliteral +[FunctionExpression]: https://github.com/babel/babel/tree/master/packages/babylon/ast/spec.md#functionexpression + +[Facebook JSX AST]: https://github.com/facebook/jsx/blob/master/AST.md + +### Semver + +Babylon follows semver in most situations. The only thing to note is that some spec-compliancy bug fixes may be released under patch versions. + +For example: We push a fix to early error on something like [#107](https://github.com/babel/babylon/pull/107) - multiple default exports per file. That would be considered a bug fix even though it would cause a build to fail. + +### Example + +```javascript +require("babylon").parse("code", { + // parse in strict mode and allow module declarations + sourceType: "module", + + plugins: [ + // enable jsx and flow syntax + "jsx", + "flow" + ] +}); +``` + +### Plugins + +| Name | Code Example | +|------|--------------| +| `estree` ([repo](https://github.com/estree/estree)) | n/a | +| `jsx` ([repo](https://facebook.github.io/jsx/)) | `<a attr="b">{s}</a>` | +| `flow` ([repo](https://github.com/facebook/flow)) | `var a: string = "";` | +| `flowComments` ([docs](https://flow.org/en/docs/types/comments/)) | `/*:: type Foo = {...}; */` | +| `typescript` ([repo](https://github.com/Microsoft/TypeScript)) | `var a: string = "";` | +| `doExpressions` | `var a = do { if (true) { 'hi'; } };` | +| `objectRestSpread` ([proposal](https://github.com/tc39/proposal-object-rest-spread)) | `var a = { b, ...c };` | +| `decorators` (Stage 1) and `decorators2` (Stage 2 [proposal](https://github.com/tc39/proposal-decorators)) | `@a class A {}` | +| `classProperties` ([proposal](https://github.com/tc39/proposal-class-public-fields)) | `class A { b = 1; }` | +| `classPrivateProperties` ([proposal](https://github.com/tc39/proposal-private-fields)) | `class A { #b = 1; }` | +| `classPrivateMethods` ([proposal](https://github.com/tc39/proposal-private-methods)) | `class A { #c() {} }` | +| `exportDefaultFrom` ([proposal](https://github.com/leebyron/ecmascript-export-default-from)) | `export v from "mod"` | +| `exportNamespaceFrom` ([proposal](https://github.com/leebyron/ecmascript-export-ns-from)) | `export * as ns from "mod"` | +| `asyncGenerators` ([proposal](https://github.com/tc39/proposal-async-iteration)) | `async function*() {}`, `for await (let a of b) {}` | +| `functionBind` ([proposal](https://github.com/zenparsing/es-function-bind)) | `a::b`, `::console.log` | +| `functionSent` | `function.sent` | +| `dynamicImport` ([proposal](https://github.com/tc39/proposal-dynamic-import)) | `import('./guy').then(a)` | +| `numericSeparator` ([proposal](https://github.com/samuelgoto/proposal-numeric-separator)) | `1_000_000` | +| `optionalChaining` ([proposal](https://github.com/tc39/proposal-optional-chaining)) | `a?.b` | +| `importMeta` ([proposal](https://github.com/tc39/proposal-import-meta)) | `import.meta.url` | +| `bigInt` ([proposal](https://github.com/tc39/proposal-bigint)) | `100n` | +| `optionalCatchBinding` ([proposal](https://github.com/babel/proposals/issues/7)) | `try {throw 0;} catch{do();}` | +| `throwExpressions` ([proposal](https://github.com/babel/proposals/issues/23)) | `() => throw new Error("")` | +| `pipelineOperator` ([proposal](https://github.com/babel/proposals/issues/29)) | `a \|> b` | +| `nullishCoalescingOperator` ([proposal](https://github.com/babel/proposals/issues/14)) | `a ?? b` | + +### FAQ + +#### Will Babylon support a plugin system? + +Previous issues: [#1351](https://github.com/babel/babel/issues/1351), [#6694](https://github.com/babel/babel/issues/6694). + +We currently aren't willing to commit to supporting the API for plugins or the resulting ecosystem (there is already enough work maintaining Babel's own plugin system). It's not clear how to make that API effective, and it would limit our ability to refactor and optimize the codebase. + +Our current recommendation for those that want to create their own custom syntax is for users to fork Babylon. + +To consume your custom parser, you can add to your `.babelrc` via its npm package name or require it if using JavaScript, + +```json +{ + "parserOpts": { + "parser": "custom-fork-of-babylon-on-npm-here" + } +} +``` diff --git a/node_modules/babylon/bin/babylon.js b/node_modules/babylon/bin/babylon.js new file mode 100755 index 00000000..440eef35 --- /dev/null +++ b/node_modules/babylon/bin/babylon.js @@ -0,0 +1,16 @@ +#!/usr/bin/env node +/* eslint no-var: 0 */ + +var babylon = require(".."); +var fs = require("fs"); + +var filename = process.argv[2]; +if (!filename) { + console.error("no filename specified"); + process.exit(0); +} + +var file = fs.readFileSync(filename, "utf8"); +var ast = babylon.parse(file); + +console.log(JSON.stringify(ast, null, " ")); diff --git a/node_modules/babylon/lib/index.js b/node_modules/babylon/lib/index.js new file mode 100644 index 00000000..854fc603 --- /dev/null +++ b/node_modules/babylon/lib/index.js @@ -0,0 +1,10167 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +function _AwaitValue(value) { + this.wrapped = value; +} + +function _AsyncGenerator(gen) { + var front, back; + + function send(key, arg) { + return new Promise(function (resolve, reject) { + var request = { + key: key, + arg: arg, + resolve: resolve, + reject: reject, + next: null + }; + + if (back) { + back = back.next = request; + } else { + front = back = request; + resume(key, arg); + } + }); + } + + function resume(key, arg) { + try { + var result = gen[key](arg); + var value = result.value; + var wrappedAwait = value instanceof _AwaitValue; + Promise.resolve(wrappedAwait ? value.wrapped : value).then(function (arg) { + if (wrappedAwait) { + resume("next", arg); + return; + } + + settle(result.done ? "return" : "normal", arg); + }, function (err) { + resume("throw", err); + }); + } catch (err) { + settle("throw", err); + } + } + + function settle(type, value) { + switch (type) { + case "return": + front.resolve({ + value: value, + done: true + }); + break; + + case "throw": + front.reject(value); + break; + + default: + front.resolve({ + value: value, + done: false + }); + break; + } + + front = front.next; + + if (front) { + resume(front.key, front.arg); + } else { + back = null; + } + } + + this._invoke = send; + + if (typeof gen.return !== "function") { + this.return = undefined; + } +} + +if (typeof Symbol === "function" && Symbol.asyncIterator) { + _AsyncGenerator.prototype[Symbol.asyncIterator] = function () { + return this; + }; +} + +_AsyncGenerator.prototype.next = function (arg) { + return this._invoke("next", arg); +}; + +_AsyncGenerator.prototype.throw = function (arg) { + return this._invoke("throw", arg); +}; + +_AsyncGenerator.prototype.return = function (arg) { + return this._invoke("return", arg); +}; + +function _inheritsLoose(subClass, superClass) { + subClass.prototype.__proto__ = superClass && superClass.prototype; + subClass.__proto__ = superClass; +} + +var defaultOptions = { + sourceType: "script", + sourceFilename: undefined, + startLine: 1, + allowAwaitOutsideFunction: false, + allowReturnOutsideFunction: false, + allowImportExportEverywhere: false, + allowSuperOutsideMethod: false, + plugins: [], + strictMode: null, + ranges: false, + tokens: false +}; +function getOptions(opts) { + var options = {}; + + for (var key in defaultOptions) { + options[key] = opts && opts[key] != null ? opts[key] : defaultOptions[key]; + } + + return options; +} + +var beforeExpr = true; +var startsExpr = true; +var isLoop = true; +var isAssign = true; +var prefix = true; +var postfix = true; +var TokenType = function TokenType(label, conf) { + if (conf === void 0) { + conf = {}; + } + + this.label = label; + this.keyword = conf.keyword; + this.beforeExpr = !!conf.beforeExpr; + this.startsExpr = !!conf.startsExpr; + this.rightAssociative = !!conf.rightAssociative; + this.isLoop = !!conf.isLoop; + this.isAssign = !!conf.isAssign; + this.prefix = !!conf.prefix; + this.postfix = !!conf.postfix; + this.binop = conf.binop === 0 ? 0 : conf.binop || null; + this.updateContext = null; +}; + +var KeywordTokenType = function (_TokenType) { + function KeywordTokenType(name, options) { + if (options === void 0) { + options = {}; + } + + options.keyword = name; + return _TokenType.call(this, name, options) || this; + } + + _inheritsLoose(KeywordTokenType, _TokenType); + + return KeywordTokenType; +}(TokenType); + +var BinopTokenType = function (_TokenType2) { + function BinopTokenType(name, prec) { + return _TokenType2.call(this, name, { + beforeExpr: beforeExpr, + binop: prec + }) || this; + } + + _inheritsLoose(BinopTokenType, _TokenType2); + + return BinopTokenType; +}(TokenType); +var types = { + num: new TokenType("num", { + startsExpr: startsExpr + }), + bigint: new TokenType("bigint", { + startsExpr: startsExpr + }), + regexp: new TokenType("regexp", { + startsExpr: startsExpr + }), + string: new TokenType("string", { + startsExpr: startsExpr + }), + name: new TokenType("name", { + startsExpr: startsExpr + }), + eof: new TokenType("eof"), + bracketL: new TokenType("[", { + beforeExpr: beforeExpr, + startsExpr: startsExpr + }), + bracketR: new TokenType("]"), + braceL: new TokenType("{", { + beforeExpr: beforeExpr, + startsExpr: startsExpr + }), + braceBarL: new TokenType("{|", { + beforeExpr: beforeExpr, + startsExpr: startsExpr + }), + braceR: new TokenType("}"), + braceBarR: new TokenType("|}"), + parenL: new TokenType("(", { + beforeExpr: beforeExpr, + startsExpr: startsExpr + }), + parenR: new TokenType(")"), + comma: new TokenType(",", { + beforeExpr: beforeExpr + }), + semi: new TokenType(";", { + beforeExpr: beforeExpr + }), + colon: new TokenType(":", { + beforeExpr: beforeExpr + }), + doubleColon: new TokenType("::", { + beforeExpr: beforeExpr + }), + dot: new TokenType("."), + question: new TokenType("?", { + beforeExpr: beforeExpr + }), + questionDot: new TokenType("?."), + arrow: new TokenType("=>", { + beforeExpr: beforeExpr + }), + template: new TokenType("template"), + ellipsis: new TokenType("...", { + beforeExpr: beforeExpr + }), + backQuote: new TokenType("`", { + startsExpr: startsExpr + }), + dollarBraceL: new TokenType("${", { + beforeExpr: beforeExpr, + startsExpr: startsExpr + }), + at: new TokenType("@"), + hash: new TokenType("#"), + eq: new TokenType("=", { + beforeExpr: beforeExpr, + isAssign: isAssign + }), + assign: new TokenType("_=", { + beforeExpr: beforeExpr, + isAssign: isAssign + }), + incDec: new TokenType("++/--", { + prefix: prefix, + postfix: postfix, + startsExpr: startsExpr + }), + bang: new TokenType("!", { + beforeExpr: beforeExpr, + prefix: prefix, + startsExpr: startsExpr + }), + tilde: new TokenType("~", { + beforeExpr: beforeExpr, + prefix: prefix, + startsExpr: startsExpr + }), + pipeline: new BinopTokenType("|>", 0), + nullishCoalescing: new BinopTokenType("??", 1), + logicalOR: new BinopTokenType("||", 1), + logicalAND: new BinopTokenType("&&", 2), + bitwiseOR: new BinopTokenType("|", 3), + bitwiseXOR: new BinopTokenType("^", 4), + bitwiseAND: new BinopTokenType("&", 5), + equality: new BinopTokenType("==/!=", 6), + relational: new BinopTokenType("</>", 7), + bitShift: new BinopTokenType("<</>>", 8), + plusMin: new TokenType("+/-", { + beforeExpr: beforeExpr, + binop: 9, + prefix: prefix, + startsExpr: startsExpr + }), + modulo: new BinopTokenType("%", 10), + star: new BinopTokenType("*", 10), + slash: new BinopTokenType("/", 10), + exponent: new TokenType("**", { + beforeExpr: beforeExpr, + binop: 11, + rightAssociative: true + }) +}; +var keywords = { + break: new KeywordTokenType("break"), + case: new KeywordTokenType("case", { + beforeExpr: beforeExpr + }), + catch: new KeywordTokenType("catch"), + continue: new KeywordTokenType("continue"), + debugger: new KeywordTokenType("debugger"), + default: new KeywordTokenType("default", { + beforeExpr: beforeExpr + }), + do: new KeywordTokenType("do", { + isLoop: isLoop, + beforeExpr: beforeExpr + }), + else: new KeywordTokenType("else", { + beforeExpr: beforeExpr + }), + finally: new KeywordTokenType("finally"), + for: new KeywordTokenType("for", { + isLoop: isLoop + }), + function: new KeywordTokenType("function", { + startsExpr: startsExpr + }), + if: new KeywordTokenType("if"), + return: new KeywordTokenType("return", { + beforeExpr: beforeExpr + }), + switch: new KeywordTokenType("switch"), + throw: new KeywordTokenType("throw", { + beforeExpr: beforeExpr, + prefix: prefix, + startsExpr: startsExpr + }), + try: new KeywordTokenType("try"), + var: new KeywordTokenType("var"), + let: new KeywordTokenType("let"), + const: new KeywordTokenType("const"), + while: new KeywordTokenType("while", { + isLoop: isLoop + }), + with: new KeywordTokenType("with"), + new: new KeywordTokenType("new", { + beforeExpr: beforeExpr, + startsExpr: startsExpr + }), + this: new KeywordTokenType("this", { + startsExpr: startsExpr + }), + super: new KeywordTokenType("super", { + startsExpr: startsExpr + }), + class: new KeywordTokenType("class"), + extends: new KeywordTokenType("extends", { + beforeExpr: beforeExpr + }), + export: new KeywordTokenType("export"), + import: new KeywordTokenType("import", { + startsExpr: startsExpr + }), + yield: new KeywordTokenType("yield", { + beforeExpr: beforeExpr, + startsExpr: startsExpr + }), + null: new KeywordTokenType("null", { + startsExpr: startsExpr + }), + true: new KeywordTokenType("true", { + startsExpr: startsExpr + }), + false: new KeywordTokenType("false", { + startsExpr: startsExpr + }), + in: new KeywordTokenType("in", { + beforeExpr: beforeExpr, + binop: 7 + }), + instanceof: new KeywordTokenType("instanceof", { + beforeExpr: beforeExpr, + binop: 7 + }), + typeof: new KeywordTokenType("typeof", { + beforeExpr: beforeExpr, + prefix: prefix, + startsExpr: startsExpr + }), + void: new KeywordTokenType("void", { + beforeExpr: beforeExpr, + prefix: prefix, + startsExpr: startsExpr + }), + delete: new KeywordTokenType("delete", { + beforeExpr: beforeExpr, + prefix: prefix, + startsExpr: startsExpr + }) +}; +Object.keys(keywords).forEach(function (name) { + types["_" + name] = keywords[name]; +}); + +function makePredicate(words) { + var wordsArr = words.split(" "); + return function (str) { + return wordsArr.indexOf(str) >= 0; + }; +} + +var reservedWords = { + "6": makePredicate("enum await"), + strict: makePredicate("implements interface let package private protected public static yield"), + strictBind: makePredicate("eval arguments") +}; +var isKeyword = makePredicate("break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this let const class extends export import yield super"); +var nonASCIIidentifierStartChars = "\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC"; +var nonASCIIidentifierChars = "\u200C\u200D\xB7\u0300-\u036F\u0387\u0483-\u0487\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u0669\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u06F0-\u06F9\u0711\u0730-\u074A\u07A6-\u07B0\u07C0-\u07C9\u07EB-\u07F3\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D4-\u08E1\u08E3-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0966-\u096F\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u09E6-\u09EF\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A66-\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0AE6-\u0AEF\u0AFA-\u0AFF\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B66-\u0B6F\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0CE6-\u0CEF\u0D00-\u0D03\u0D3B\u0D3C\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D66-\u0D6F\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0E50-\u0E59\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0ED0-\u0ED9\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1040-\u1049\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F-\u109D\u135D-\u135F\u1369-\u1371\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u18A9\u1920-\u192B\u1930-\u193B\u1946-\u194F\u19D0-\u19DA\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AB0-\u1ABD\u1B00-\u1B04\u1B34-\u1B44\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BB0-\u1BB9\u1BE6-\u1BF3\u1C24-\u1C37\u1C40-\u1C49\u1C50-\u1C59\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF7-\u1CF9\u1DC0-\u1DF9\u1DFB-\u1DFF\u203F\u2040\u2054\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA620-\uA629\uA66F\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F1\uA900-\uA909\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9D0-\uA9D9\uA9E5\uA9F0-\uA9F9\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA50-\uAA59\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uABF0-\uABF9\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFF10-\uFF19\uFF3F"; +var nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]"); +var nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]"); +nonASCIIidentifierStartChars = nonASCIIidentifierChars = null; +var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 157, 310, 10, 21, 11, 7, 153, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 26, 45, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 785, 52, 76, 44, 33, 24, 27, 35, 42, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 85, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 159, 52, 19, 3, 54, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 86, 25, 391, 63, 32, 0, 257, 0, 11, 39, 8, 0, 22, 0, 12, 39, 3, 3, 55, 56, 264, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 698, 921, 103, 110, 18, 195, 2749, 1070, 4050, 582, 8634, 568, 8, 30, 114, 29, 19, 47, 17, 3, 32, 20, 6, 18, 881, 68, 12, 0, 67, 12, 65, 1, 31, 6124, 20, 754, 9486, 286, 82, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 4149, 196, 60, 67, 1213, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42710, 42, 4148, 12, 221, 3, 5761, 15, 7472, 3104, 541]; +var astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 1306, 2, 54, 14, 32, 9, 16, 3, 46, 10, 54, 9, 7, 2, 37, 13, 2, 9, 52, 0, 13, 2, 49, 13, 10, 2, 4, 9, 83, 11, 7, 0, 161, 11, 6, 9, 7, 3, 57, 0, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 193, 17, 10, 9, 87, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 84, 14, 5, 9, 423, 9, 280, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 406, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 19719, 9, 135, 4, 60, 6, 26, 9, 1016, 45, 17, 3, 19723, 1, 5319, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 2214, 6, 110, 6, 6, 9, 792487, 239]; + +function isInAstralSet(code, set) { + var pos = 0x10000; + + for (var i = 0; i < set.length; i += 2) { + pos += set[i]; + if (pos > code) return false; + pos += set[i + 1]; + if (pos >= code) return true; + } + + return false; +} + +function isIdentifierStart(code) { + if (code < 65) return code === 36; + if (code < 91) return true; + if (code < 97) return code === 95; + if (code < 123) return true; + + if (code <= 0xffff) { + return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code)); + } + + return isInAstralSet(code, astralIdentifierStartCodes); +} +function isIteratorStart(current, next) { + return current === 64 && next === 64; +} +function isIdentifierChar(code) { + if (code < 48) return code === 36; + if (code < 58) return true; + if (code < 65) return false; + if (code < 91) return true; + if (code < 97) return code === 95; + if (code < 123) return true; + + if (code <= 0xffff) { + return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code)); + } + + return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes); +} + +var lineBreak = /\r\n?|\n|\u2028|\u2029/; +var lineBreakG = new RegExp(lineBreak.source, "g"); +function isNewLine(code) { + return code === 10 || code === 13 || code === 0x2028 || code === 0x2029; +} +var nonASCIIwhitespace = /[\u1680\u180e\u2000-\u200a\u202f\u205f\u3000\ufeff]/; + +var TokContext = function TokContext(token, isExpr, preserveSpace, override) { + this.token = token; + this.isExpr = !!isExpr; + this.preserveSpace = !!preserveSpace; + this.override = override; +}; +var types$1 = { + braceStatement: new TokContext("{", false), + braceExpression: new TokContext("{", true), + templateQuasi: new TokContext("${", true), + parenStatement: new TokContext("(", false), + parenExpression: new TokContext("(", true), + template: new TokContext("`", true, true, function (p) { + return p.readTmplToken(); + }), + functionExpression: new TokContext("function", true) +}; + +types.parenR.updateContext = types.braceR.updateContext = function () { + if (this.state.context.length === 1) { + this.state.exprAllowed = true; + return; + } + + var out = this.state.context.pop(); + + if (out === types$1.braceStatement && this.curContext() === types$1.functionExpression) { + this.state.context.pop(); + this.state.exprAllowed = false; + } else if (out === types$1.templateQuasi) { + this.state.exprAllowed = true; + } else { + this.state.exprAllowed = !out.isExpr; + } +}; + +types.name.updateContext = function (prevType) { + if (this.state.value === "of" && this.curContext() === types$1.parenStatement) { + this.state.exprAllowed = !prevType.beforeExpr; + return; + } + + this.state.exprAllowed = false; + + if (prevType === types._let || prevType === types._const || prevType === types._var) { + if (lineBreak.test(this.input.slice(this.state.end))) { + this.state.exprAllowed = true; + } + } + + if (this.state.isIterator) { + this.state.isIterator = false; + } +}; + +types.braceL.updateContext = function (prevType) { + this.state.context.push(this.braceIsBlock(prevType) ? types$1.braceStatement : types$1.braceExpression); + this.state.exprAllowed = true; +}; + +types.dollarBraceL.updateContext = function () { + this.state.context.push(types$1.templateQuasi); + this.state.exprAllowed = true; +}; + +types.parenL.updateContext = function (prevType) { + var statementParens = prevType === types._if || prevType === types._for || prevType === types._with || prevType === types._while; + this.state.context.push(statementParens ? types$1.parenStatement : types$1.parenExpression); + this.state.exprAllowed = true; +}; + +types.incDec.updateContext = function () {}; + +types._function.updateContext = function (prevType) { + if (this.state.exprAllowed && !this.braceIsBlock(prevType)) { + this.state.context.push(types$1.functionExpression); + } + + this.state.exprAllowed = false; +}; + +types.backQuote.updateContext = function () { + if (this.curContext() === types$1.template) { + this.state.context.pop(); + } else { + this.state.context.push(types$1.template); + } + + this.state.exprAllowed = false; +}; + +var Position = function Position(line, col) { + this.line = line; + this.column = col; +}; +var SourceLocation = function SourceLocation(start, end) { + this.start = start; + this.end = end; +}; +function getLineInfo(input, offset) { + for (var line = 1, cur = 0;;) { + lineBreakG.lastIndex = cur; + var match = lineBreakG.exec(input); + + if (match && match.index < offset) { + ++line; + cur = match.index + match[0].length; + } else { + return new Position(line, offset - cur); + } + } + + throw new Error("Unreachable"); +} + +var BaseParser = function () { + function BaseParser() { + this.sawUnambiguousESM = false; + } + + var _proto = BaseParser.prototype; + + _proto.isReservedWord = function isReservedWord(word) { + if (word === "await") { + return this.inModule; + } else { + return reservedWords[6](word); + } + }; + + _proto.hasPlugin = function hasPlugin(name) { + return !!this.plugins[name]; + }; + + return BaseParser; +}(); + +function last(stack) { + return stack[stack.length - 1]; +} + +var CommentsParser = function (_BaseParser) { + function CommentsParser() { + return _BaseParser.apply(this, arguments) || this; + } + + var _proto = CommentsParser.prototype; + + _proto.addComment = function addComment(comment) { + if (this.filename) comment.loc.filename = this.filename; + this.state.trailingComments.push(comment); + this.state.leadingComments.push(comment); + }; + + _proto.processComment = function processComment(node) { + if (node.type === "Program" && node.body.length > 0) return; + var stack = this.state.commentStack; + var firstChild, lastChild, trailingComments, i, j; + + if (this.state.trailingComments.length > 0) { + if (this.state.trailingComments[0].start >= node.end) { + trailingComments = this.state.trailingComments; + this.state.trailingComments = []; + } else { + this.state.trailingComments.length = 0; + } + } else if (stack.length > 0) { + var lastInStack = last(stack); + + if (lastInStack.trailingComments && lastInStack.trailingComments[0].start >= node.end) { + trailingComments = lastInStack.trailingComments; + delete lastInStack.trailingComments; + } + } + + if (stack.length > 0 && last(stack).start >= node.start) { + firstChild = stack.pop(); + } + + while (stack.length > 0 && last(stack).start >= node.start) { + lastChild = stack.pop(); + } + + if (!lastChild && firstChild) lastChild = firstChild; + + if (firstChild && this.state.leadingComments.length > 0) { + var lastComment = last(this.state.leadingComments); + + if (firstChild.type === "ObjectProperty") { + if (lastComment.start >= node.start) { + if (this.state.commentPreviousNode) { + for (j = 0; j < this.state.leadingComments.length; j++) { + if (this.state.leadingComments[j].end < this.state.commentPreviousNode.end) { + this.state.leadingComments.splice(j, 1); + j--; + } + } + + if (this.state.leadingComments.length > 0) { + firstChild.trailingComments = this.state.leadingComments; + this.state.leadingComments = []; + } + } + } + } else if (node.type === "CallExpression" && node.arguments && node.arguments.length) { + var lastArg = last(node.arguments); + + if (lastArg && lastComment.start >= lastArg.start && lastComment.end <= node.end) { + if (this.state.commentPreviousNode) { + if (this.state.leadingComments.length > 0) { + lastArg.trailingComments = this.state.leadingComments; + this.state.leadingComments = []; + } + } + } + } + } + + if (lastChild) { + if (lastChild.leadingComments) { + if (lastChild !== node && lastChild.leadingComments.length > 0 && last(lastChild.leadingComments).end <= node.start) { + node.leadingComments = lastChild.leadingComments; + delete lastChild.leadingComments; + } else { + for (i = lastChild.leadingComments.length - 2; i >= 0; --i) { + if (lastChild.leadingComments[i].end <= node.start) { + node.leadingComments = lastChild.leadingComments.splice(0, i + 1); + break; + } + } + } + } + } else if (this.state.leadingComments.length > 0) { + if (last(this.state.leadingComments).end <= node.start) { + if (this.state.commentPreviousNode) { + for (j = 0; j < this.state.leadingComments.length; j++) { + if (this.state.leadingComments[j].end < this.state.commentPreviousNode.end) { + this.state.leadingComments.splice(j, 1); + j--; + } + } + } + + if (this.state.leadingComments.length > 0) { + node.leadingComments = this.state.leadingComments; + this.state.leadingComments = []; + } + } else { + for (i = 0; i < this.state.leadingComments.length; i++) { + if (this.state.leadingComments[i].end > node.start) { + break; + } + } + + var leadingComments = this.state.leadingComments.slice(0, i); + + if (leadingComments.length) { + node.leadingComments = leadingComments; + } + + trailingComments = this.state.leadingComments.slice(i); + + if (trailingComments.length === 0) { + trailingComments = null; + } + } + } + + this.state.commentPreviousNode = node; + + if (trailingComments) { + if (trailingComments.length && trailingComments[0].start >= node.start && last(trailingComments).end <= node.end) { + node.innerComments = trailingComments; + } else { + node.trailingComments = trailingComments; + } + } + + stack.push(node); + }; + + _inheritsLoose(CommentsParser, _BaseParser); + + return CommentsParser; +}(BaseParser); + +var LocationParser = function (_CommentsParser) { + function LocationParser() { + return _CommentsParser.apply(this, arguments) || this; + } + + var _proto = LocationParser.prototype; + + _proto.raise = function raise(pos, message, _temp) { + var _ref = _temp === void 0 ? {} : _temp, + missingPluginNames = _ref.missingPluginNames, + code = _ref.code; + + var loc = getLineInfo(this.input, pos); + message += " (" + loc.line + ":" + loc.column + ")"; + var err = new SyntaxError(message); + err.pos = pos; + err.loc = loc; + + if (missingPluginNames) { + err.missingPlugin = missingPluginNames; + } + + if (code !== undefined) { + err.code = code; + } + + throw err; + }; + + _inheritsLoose(LocationParser, _CommentsParser); + + return LocationParser; +}(CommentsParser); + +var State = function () { + function State() {} + + var _proto = State.prototype; + + _proto.init = function init(options, input) { + this.strict = options.strictMode === false ? false : options.sourceType === "module"; + this.input = input; + this.potentialArrowAt = -1; + this.noArrowAt = []; + this.noArrowParamsConversionAt = []; + this.inMethod = false; + this.inFunction = false; + this.inParameters = false; + this.maybeInArrowParameters = false; + this.inGenerator = false; + this.inAsync = false; + this.inPropertyName = false; + this.inType = false; + this.inClassProperty = false; + this.noAnonFunctionType = false; + this.hasFlowComment = false; + this.isIterator = false; + this.classLevel = 0; + this.labels = []; + this.decoratorStack = [[]]; + this.yieldInPossibleArrowParameters = null; + this.tokens = []; + this.comments = []; + this.trailingComments = []; + this.leadingComments = []; + this.commentStack = []; + this.commentPreviousNode = null; + this.pos = this.lineStart = 0; + this.curLine = options.startLine; + this.type = types.eof; + this.value = null; + this.start = this.end = this.pos; + this.startLoc = this.endLoc = this.curPosition(); + this.lastTokEndLoc = this.lastTokStartLoc = null; + this.lastTokStart = this.lastTokEnd = this.pos; + this.context = [types$1.braceStatement]; + this.exprAllowed = true; + this.containsEsc = this.containsOctal = false; + this.octalPosition = null; + this.invalidTemplateEscapePosition = null; + this.exportedIdentifiers = []; + }; + + _proto.curPosition = function curPosition() { + return new Position(this.curLine, this.pos - this.lineStart); + }; + + _proto.clone = function clone(skipArrays) { + var _this = this; + + var state = new State(); + Object.keys(this).forEach(function (key) { + var val = _this[key]; + + if ((!skipArrays || key === "context") && Array.isArray(val)) { + val = val.slice(); + } + + state[key] = val; + }); + return state; + }; + + return State; +}(); + +var _isDigit = function isDigit(code) { + return code >= 48 && code <= 57; +}; + +var VALID_REGEX_FLAGS = "gmsiyu"; +var forbiddenNumericSeparatorSiblings = { + decBinOct: [46, 66, 69, 79, 95, 98, 101, 111], + hex: [46, 88, 95, 120] +}; +var allowedNumericSeparatorSiblings = {}; +allowedNumericSeparatorSiblings.bin = [48, 49]; +allowedNumericSeparatorSiblings.oct = allowedNumericSeparatorSiblings.bin.concat([50, 51, 52, 53, 54, 55]); +allowedNumericSeparatorSiblings.dec = allowedNumericSeparatorSiblings.oct.concat([56, 57]); +allowedNumericSeparatorSiblings.hex = allowedNumericSeparatorSiblings.dec.concat([65, 66, 67, 68, 69, 70, 97, 98, 99, 100, 101, 102]); +var Token = function Token(state) { + this.type = state.type; + this.value = state.value; + this.start = state.start; + this.end = state.end; + this.loc = new SourceLocation(state.startLoc, state.endLoc); +}; + +function codePointToString(code) { + if (code <= 0xffff) { + return String.fromCharCode(code); + } else { + return String.fromCharCode((code - 0x10000 >> 10) + 0xd800, (code - 0x10000 & 1023) + 0xdc00); + } +} + +var Tokenizer = function (_LocationParser) { + function Tokenizer(options, input) { + var _this; + + _this = _LocationParser.call(this) || this; + _this.state = new State(); + + _this.state.init(options, input); + + _this.isLookahead = false; + return _this; + } + + var _proto = Tokenizer.prototype; + + _proto.next = function next() { + if (this.options.tokens && !this.isLookahead) { + this.state.tokens.push(new Token(this.state)); + } + + this.state.lastTokEnd = this.state.end; + this.state.lastTokStart = this.state.start; + this.state.lastTokEndLoc = this.state.endLoc; + this.state.lastTokStartLoc = this.state.startLoc; + this.nextToken(); + }; + + _proto.eat = function eat(type) { + if (this.match(type)) { + this.next(); + return true; + } else { + return false; + } + }; + + _proto.match = function match(type) { + return this.state.type === type; + }; + + _proto.isKeyword = function isKeyword$$1(word) { + return isKeyword(word); + }; + + _proto.lookahead = function lookahead() { + var old = this.state; + this.state = old.clone(true); + this.isLookahead = true; + this.next(); + this.isLookahead = false; + var curr = this.state; + this.state = old; + return curr; + }; + + _proto.setStrict = function setStrict(strict) { + this.state.strict = strict; + if (!this.match(types.num) && !this.match(types.string)) return; + this.state.pos = this.state.start; + + while (this.state.pos < this.state.lineStart) { + this.state.lineStart = this.input.lastIndexOf("\n", this.state.lineStart - 2) + 1; + --this.state.curLine; + } + + this.nextToken(); + }; + + _proto.curContext = function curContext() { + return this.state.context[this.state.context.length - 1]; + }; + + _proto.nextToken = function nextToken() { + var curContext = this.curContext(); + if (!curContext || !curContext.preserveSpace) this.skipSpace(); + this.state.containsOctal = false; + this.state.octalPosition = null; + this.state.start = this.state.pos; + this.state.startLoc = this.state.curPosition(); + + if (this.state.pos >= this.input.length) { + this.finishToken(types.eof); + return; + } + + if (curContext.override) { + curContext.override(this); + } else { + this.readToken(this.fullCharCodeAtPos()); + } + }; + + _proto.readToken = function readToken(code) { + if (isIdentifierStart(code) || code === 92) { + this.readWord(); + } else { + this.getTokenFromCode(code); + } + }; + + _proto.fullCharCodeAtPos = function fullCharCodeAtPos() { + var code = this.input.charCodeAt(this.state.pos); + if (code <= 0xd7ff || code >= 0xe000) return code; + var next = this.input.charCodeAt(this.state.pos + 1); + return (code << 10) + next - 0x35fdc00; + }; + + _proto.pushComment = function pushComment(block, text, start, end, startLoc, endLoc) { + var comment = { + type: block ? "CommentBlock" : "CommentLine", + value: text, + start: start, + end: end, + loc: new SourceLocation(startLoc, endLoc) + }; + + if (!this.isLookahead) { + if (this.options.tokens) this.state.tokens.push(comment); + this.state.comments.push(comment); + this.addComment(comment); + } + }; + + _proto.skipBlockComment = function skipBlockComment() { + var startLoc = this.state.curPosition(); + var start = this.state.pos; + var end = this.input.indexOf("*/", this.state.pos += 2); + if (end === -1) this.raise(this.state.pos - 2, "Unterminated comment"); + this.state.pos = end + 2; + lineBreakG.lastIndex = start; + var match; + + while ((match = lineBreakG.exec(this.input)) && match.index < this.state.pos) { + ++this.state.curLine; + this.state.lineStart = match.index + match[0].length; + } + + this.pushComment(true, this.input.slice(start + 2, end), start, this.state.pos, startLoc, this.state.curPosition()); + }; + + _proto.skipLineComment = function skipLineComment(startSkip) { + var start = this.state.pos; + var startLoc = this.state.curPosition(); + var ch = this.input.charCodeAt(this.state.pos += startSkip); + + if (this.state.pos < this.input.length) { + while (ch !== 10 && ch !== 13 && ch !== 8232 && ch !== 8233 && ++this.state.pos < this.input.length) { + ch = this.input.charCodeAt(this.state.pos); + } + } + + this.pushComment(false, this.input.slice(start + startSkip, this.state.pos), start, this.state.pos, startLoc, this.state.curPosition()); + }; + + _proto.skipSpace = function skipSpace() { + loop: while (this.state.pos < this.input.length) { + var ch = this.input.charCodeAt(this.state.pos); + + switch (ch) { + case 32: + case 160: + ++this.state.pos; + break; + + case 13: + if (this.input.charCodeAt(this.state.pos + 1) === 10) { + ++this.state.pos; + } + + case 10: + case 8232: + case 8233: + ++this.state.pos; + ++this.state.curLine; + this.state.lineStart = this.state.pos; + break; + + case 47: + switch (this.input.charCodeAt(this.state.pos + 1)) { + case 42: + this.skipBlockComment(); + break; + + case 47: + this.skipLineComment(2); + break; + + default: + break loop; + } + + break; + + default: + if (ch > 8 && ch < 14 || ch >= 5760 && nonASCIIwhitespace.test(String.fromCharCode(ch))) { + ++this.state.pos; + } else { + break loop; + } + + } + } + }; + + _proto.finishToken = function finishToken(type, val) { + this.state.end = this.state.pos; + this.state.endLoc = this.state.curPosition(); + var prevType = this.state.type; + this.state.type = type; + this.state.value = val; + this.updateContext(prevType); + }; + + _proto.readToken_dot = function readToken_dot() { + var next = this.input.charCodeAt(this.state.pos + 1); + + if (next >= 48 && next <= 57) { + this.readNumber(true); + return; + } + + var next2 = this.input.charCodeAt(this.state.pos + 2); + + if (next === 46 && next2 === 46) { + this.state.pos += 3; + this.finishToken(types.ellipsis); + } else { + ++this.state.pos; + this.finishToken(types.dot); + } + }; + + _proto.readToken_slash = function readToken_slash() { + if (this.state.exprAllowed) { + ++this.state.pos; + this.readRegexp(); + return; + } + + var next = this.input.charCodeAt(this.state.pos + 1); + + if (next === 61) { + this.finishOp(types.assign, 2); + } else { + this.finishOp(types.slash, 1); + } + }; + + _proto.readToken_mult_modulo = function readToken_mult_modulo(code) { + var type = code === 42 ? types.star : types.modulo; + var width = 1; + var next = this.input.charCodeAt(this.state.pos + 1); + var exprAllowed = this.state.exprAllowed; + + if (code === 42 && next === 42) { + width++; + next = this.input.charCodeAt(this.state.pos + 2); + type = types.exponent; + } + + if (next === 61 && !exprAllowed) { + width++; + type = types.assign; + } + + this.finishOp(type, width); + }; + + _proto.readToken_pipe_amp = function readToken_pipe_amp(code) { + var next = this.input.charCodeAt(this.state.pos + 1); + + if (next === code) { + if (this.input.charCodeAt(this.state.pos + 2) === 61) { + this.finishOp(types.assign, 3); + } else { + this.finishOp(code === 124 ? types.logicalOR : types.logicalAND, 2); + } + + return; + } + + if (code === 124) { + if (next === 62) { + this.finishOp(types.pipeline, 2); + return; + } else if (next === 125 && this.hasPlugin("flow")) { + this.finishOp(types.braceBarR, 2); + return; + } + } + + if (next === 61) { + this.finishOp(types.assign, 2); + return; + } + + this.finishOp(code === 124 ? types.bitwiseOR : types.bitwiseAND, 1); + }; + + _proto.readToken_caret = function readToken_caret() { + var next = this.input.charCodeAt(this.state.pos + 1); + + if (next === 61) { + this.finishOp(types.assign, 2); + } else { + this.finishOp(types.bitwiseXOR, 1); + } + }; + + _proto.readToken_plus_min = function readToken_plus_min(code) { + var next = this.input.charCodeAt(this.state.pos + 1); + + if (next === code) { + if (next === 45 && !this.inModule && this.input.charCodeAt(this.state.pos + 2) === 62 && lineBreak.test(this.input.slice(this.state.lastTokEnd, this.state.pos))) { + this.skipLineComment(3); + this.skipSpace(); + this.nextToken(); + return; + } + + this.finishOp(types.incDec, 2); + return; + } + + if (next === 61) { + this.finishOp(types.assign, 2); + } else { + this.finishOp(types.plusMin, 1); + } + }; + + _proto.readToken_lt_gt = function readToken_lt_gt(code) { + var next = this.input.charCodeAt(this.state.pos + 1); + var size = 1; + + if (next === code) { + size = code === 62 && this.input.charCodeAt(this.state.pos + 2) === 62 ? 3 : 2; + + if (this.input.charCodeAt(this.state.pos + size) === 61) { + this.finishOp(types.assign, size + 1); + return; + } + + this.finishOp(types.bitShift, size); + return; + } + + if (next === 33 && code === 60 && !this.inModule && this.input.charCodeAt(this.state.pos + 2) === 45 && this.input.charCodeAt(this.state.pos + 3) === 45) { + this.skipLineComment(4); + this.skipSpace(); + this.nextToken(); + return; + } + + if (next === 61) { + size = 2; + } + + this.finishOp(types.relational, size); + }; + + _proto.readToken_eq_excl = function readToken_eq_excl(code) { + var next = this.input.charCodeAt(this.state.pos + 1); + + if (next === 61) { + this.finishOp(types.equality, this.input.charCodeAt(this.state.pos + 2) === 61 ? 3 : 2); + return; + } + + if (code === 61 && next === 62) { + this.state.pos += 2; + this.finishToken(types.arrow); + return; + } + + this.finishOp(code === 61 ? types.eq : types.bang, 1); + }; + + _proto.readToken_question = function readToken_question() { + var next = this.input.charCodeAt(this.state.pos + 1); + var next2 = this.input.charCodeAt(this.state.pos + 2); + + if (next === 63) { + if (next2 === 61) { + this.finishOp(types.assign, 3); + } else { + this.finishOp(types.nullishCoalescing, 2); + } + } else if (next === 46 && !(next2 >= 48 && next2 <= 57)) { + this.state.pos += 2; + this.finishToken(types.questionDot); + } else { + ++this.state.pos; + this.finishToken(types.question); + } + }; + + _proto.getTokenFromCode = function getTokenFromCode(code) { + switch (code) { + case 35: + if ((this.hasPlugin("classPrivateProperties") || this.hasPlugin("classPrivateMethods")) && this.state.classLevel > 0) { + ++this.state.pos; + this.finishToken(types.hash); + return; + } else { + this.raise(this.state.pos, "Unexpected character '" + codePointToString(code) + "'"); + } + + case 46: + this.readToken_dot(); + return; + + case 40: + ++this.state.pos; + this.finishToken(types.parenL); + return; + + case 41: + ++this.state.pos; + this.finishToken(types.parenR); + return; + + case 59: + ++this.state.pos; + this.finishToken(types.semi); + return; + + case 44: + ++this.state.pos; + this.finishToken(types.comma); + return; + + case 91: + ++this.state.pos; + this.finishToken(types.bracketL); + return; + + case 93: + ++this.state.pos; + this.finishToken(types.bracketR); + return; + + case 123: + if (this.hasPlugin("flow") && this.input.charCodeAt(this.state.pos + 1) === 124) { + this.finishOp(types.braceBarL, 2); + } else { + ++this.state.pos; + this.finishToken(types.braceL); + } + + return; + + case 125: + ++this.state.pos; + this.finishToken(types.braceR); + return; + + case 58: + if (this.hasPlugin("functionBind") && this.input.charCodeAt(this.state.pos + 1) === 58) { + this.finishOp(types.doubleColon, 2); + } else { + ++this.state.pos; + this.finishToken(types.colon); + } + + return; + + case 63: + this.readToken_question(); + return; + + case 64: + ++this.state.pos; + this.finishToken(types.at); + return; + + case 96: + ++this.state.pos; + this.finishToken(types.backQuote); + return; + + case 48: + { + var next = this.input.charCodeAt(this.state.pos + 1); + + if (next === 120 || next === 88) { + this.readRadixNumber(16); + return; + } + + if (next === 111 || next === 79) { + this.readRadixNumber(8); + return; + } + + if (next === 98 || next === 66) { + this.readRadixNumber(2); + return; + } + } + + case 49: + case 50: + case 51: + case 52: + case 53: + case 54: + case 55: + case 56: + case 57: + this.readNumber(false); + return; + + case 34: + case 39: + this.readString(code); + return; + + case 47: + this.readToken_slash(); + return; + + case 37: + case 42: + this.readToken_mult_modulo(code); + return; + + case 124: + case 38: + this.readToken_pipe_amp(code); + return; + + case 94: + this.readToken_caret(); + return; + + case 43: + case 45: + this.readToken_plus_min(code); + return; + + case 60: + case 62: + this.readToken_lt_gt(code); + return; + + case 61: + case 33: + this.readToken_eq_excl(code); + return; + + case 126: + this.finishOp(types.tilde, 1); + return; + } + + this.raise(this.state.pos, "Unexpected character '" + codePointToString(code) + "'"); + }; + + _proto.finishOp = function finishOp(type, size) { + var str = this.input.slice(this.state.pos, this.state.pos + size); + this.state.pos += size; + this.finishToken(type, str); + }; + + _proto.readRegexp = function readRegexp() { + var start = this.state.pos; + var escaped, inClass; + + for (;;) { + if (this.state.pos >= this.input.length) { + this.raise(start, "Unterminated regular expression"); + } + + var ch = this.input.charAt(this.state.pos); + + if (lineBreak.test(ch)) { + this.raise(start, "Unterminated regular expression"); + } + + if (escaped) { + escaped = false; + } else { + if (ch === "[") { + inClass = true; + } else if (ch === "]" && inClass) { + inClass = false; + } else if (ch === "/" && !inClass) { + break; + } + + escaped = ch === "\\"; + } + + ++this.state.pos; + } + + var content = this.input.slice(start, this.state.pos); + ++this.state.pos; + var mods = ""; + + while (this.state.pos < this.input.length) { + var char = this.input[this.state.pos]; + var charCode = this.fullCharCodeAtPos(); + + if (VALID_REGEX_FLAGS.indexOf(char) > -1) { + if (mods.indexOf(char) > -1) { + this.raise(this.state.pos + 1, "Duplicate regular expression flag"); + } + + ++this.state.pos; + mods += char; + } else if (isIdentifierChar(charCode) || charCode === 92) { + this.raise(this.state.pos + 1, "Invalid regular expression flag"); + } else { + break; + } + } + + this.finishToken(types.regexp, { + pattern: content, + flags: mods + }); + }; + + _proto.readInt = function readInt(radix, len) { + var start = this.state.pos; + var forbiddenSiblings = radix === 16 ? forbiddenNumericSeparatorSiblings.hex : forbiddenNumericSeparatorSiblings.decBinOct; + var allowedSiblings = radix === 16 ? allowedNumericSeparatorSiblings.hex : radix === 10 ? allowedNumericSeparatorSiblings.dec : radix === 8 ? allowedNumericSeparatorSiblings.oct : allowedNumericSeparatorSiblings.bin; + var total = 0; + + for (var i = 0, e = len == null ? Infinity : len; i < e; ++i) { + var code = this.input.charCodeAt(this.state.pos); + var val = void 0; + + if (this.hasPlugin("numericSeparator")) { + var prev = this.input.charCodeAt(this.state.pos - 1); + var next = this.input.charCodeAt(this.state.pos + 1); + + if (code === 95) { + if (allowedSiblings.indexOf(next) === -1) { + this.raise(this.state.pos, "Invalid or unexpected token"); + } + + if (forbiddenSiblings.indexOf(prev) > -1 || forbiddenSiblings.indexOf(next) > -1 || Number.isNaN(next)) { + this.raise(this.state.pos, "Invalid or unexpected token"); + } + + ++this.state.pos; + continue; + } + } + + if (code >= 97) { + val = code - 97 + 10; + } else if (code >= 65) { + val = code - 65 + 10; + } else if (_isDigit(code)) { + val = code - 48; + } else { + val = Infinity; + } + + if (val >= radix) break; + ++this.state.pos; + total = total * radix + val; + } + + if (this.state.pos === start || len != null && this.state.pos - start !== len) { + return null; + } + + return total; + }; + + _proto.readRadixNumber = function readRadixNumber(radix) { + var start = this.state.pos; + var isBigInt = false; + this.state.pos += 2; + var val = this.readInt(radix); + + if (val == null) { + this.raise(this.state.start + 2, "Expected number in radix " + radix); + } + + if (this.hasPlugin("bigInt")) { + if (this.input.charCodeAt(this.state.pos) === 110) { + ++this.state.pos; + isBigInt = true; + } + } + + if (isIdentifierStart(this.fullCharCodeAtPos())) { + this.raise(this.state.pos, "Identifier directly after number"); + } + + if (isBigInt) { + var str = this.input.slice(start, this.state.pos).replace(/[_n]/g, ""); + this.finishToken(types.bigint, str); + return; + } + + this.finishToken(types.num, val); + }; + + _proto.readNumber = function readNumber(startsWithDot) { + var start = this.state.pos; + var octal = this.input.charCodeAt(start) === 48; + var isFloat = false; + var isBigInt = false; + + if (!startsWithDot && this.readInt(10) === null) { + this.raise(start, "Invalid number"); + } + + if (octal && this.state.pos == start + 1) octal = false; + var next = this.input.charCodeAt(this.state.pos); + + if (next === 46 && !octal) { + ++this.state.pos; + this.readInt(10); + isFloat = true; + next = this.input.charCodeAt(this.state.pos); + } + + if ((next === 69 || next === 101) && !octal) { + next = this.input.charCodeAt(++this.state.pos); + + if (next === 43 || next === 45) { + ++this.state.pos; + } + + if (this.readInt(10) === null) this.raise(start, "Invalid number"); + isFloat = true; + next = this.input.charCodeAt(this.state.pos); + } + + if (this.hasPlugin("bigInt")) { + if (next === 110) { + if (isFloat || octal) this.raise(start, "Invalid BigIntLiteral"); + ++this.state.pos; + isBigInt = true; + } + } + + if (isIdentifierStart(this.fullCharCodeAtPos())) { + this.raise(this.state.pos, "Identifier directly after number"); + } + + var str = this.input.slice(start, this.state.pos).replace(/[_n]/g, ""); + + if (isBigInt) { + this.finishToken(types.bigint, str); + return; + } + + var val; + + if (isFloat) { + val = parseFloat(str); + } else if (!octal || str.length === 1) { + val = parseInt(str, 10); + } else if (this.state.strict) { + this.raise(start, "Invalid number"); + } else if (/[89]/.test(str)) { + val = parseInt(str, 10); + } else { + val = parseInt(str, 8); + } + + this.finishToken(types.num, val); + }; + + _proto.readCodePoint = function readCodePoint(throwOnInvalid) { + var ch = this.input.charCodeAt(this.state.pos); + var code; + + if (ch === 123) { + var codePos = ++this.state.pos; + code = this.readHexChar(this.input.indexOf("}", this.state.pos) - this.state.pos, throwOnInvalid); + ++this.state.pos; + + if (code === null) { + --this.state.invalidTemplateEscapePosition; + } else if (code > 0x10ffff) { + if (throwOnInvalid) { + this.raise(codePos, "Code point out of bounds"); + } else { + this.state.invalidTemplateEscapePosition = codePos - 2; + return null; + } + } + } else { + code = this.readHexChar(4, throwOnInvalid); + } + + return code; + }; + + _proto.readString = function readString(quote) { + var out = "", + chunkStart = ++this.state.pos; + + for (;;) { + if (this.state.pos >= this.input.length) { + this.raise(this.state.start, "Unterminated string constant"); + } + + var ch = this.input.charCodeAt(this.state.pos); + if (ch === quote) break; + + if (ch === 92) { + out += this.input.slice(chunkStart, this.state.pos); + out += this.readEscapedChar(false); + chunkStart = this.state.pos; + } else { + if (isNewLine(ch)) { + this.raise(this.state.start, "Unterminated string constant"); + } + + ++this.state.pos; + } + } + + out += this.input.slice(chunkStart, this.state.pos++); + this.finishToken(types.string, out); + }; + + _proto.readTmplToken = function readTmplToken() { + var out = "", + chunkStart = this.state.pos, + containsInvalid = false; + + for (;;) { + if (this.state.pos >= this.input.length) { + this.raise(this.state.start, "Unterminated template"); + } + + var ch = this.input.charCodeAt(this.state.pos); + + if (ch === 96 || ch === 36 && this.input.charCodeAt(this.state.pos + 1) === 123) { + if (this.state.pos === this.state.start && this.match(types.template)) { + if (ch === 36) { + this.state.pos += 2; + this.finishToken(types.dollarBraceL); + return; + } else { + ++this.state.pos; + this.finishToken(types.backQuote); + return; + } + } + + out += this.input.slice(chunkStart, this.state.pos); + this.finishToken(types.template, containsInvalid ? null : out); + return; + } + + if (ch === 92) { + out += this.input.slice(chunkStart, this.state.pos); + var escaped = this.readEscapedChar(true); + + if (escaped === null) { + containsInvalid = true; + } else { + out += escaped; + } + + chunkStart = this.state.pos; + } else if (isNewLine(ch)) { + out += this.input.slice(chunkStart, this.state.pos); + ++this.state.pos; + + switch (ch) { + case 13: + if (this.input.charCodeAt(this.state.pos) === 10) { + ++this.state.pos; + } + + case 10: + out += "\n"; + break; + + default: + out += String.fromCharCode(ch); + break; + } + + ++this.state.curLine; + this.state.lineStart = this.state.pos; + chunkStart = this.state.pos; + } else { + ++this.state.pos; + } + } + }; + + _proto.readEscapedChar = function readEscapedChar(inTemplate) { + var throwOnInvalid = !inTemplate; + var ch = this.input.charCodeAt(++this.state.pos); + ++this.state.pos; + + switch (ch) { + case 110: + return "\n"; + + case 114: + return "\r"; + + case 120: + { + var code = this.readHexChar(2, throwOnInvalid); + return code === null ? null : String.fromCharCode(code); + } + + case 117: + { + var _code = this.readCodePoint(throwOnInvalid); + + return _code === null ? null : codePointToString(_code); + } + + case 116: + return "\t"; + + case 98: + return "\b"; + + case 118: + return "\x0B"; + + case 102: + return "\f"; + + case 13: + if (this.input.charCodeAt(this.state.pos) === 10) { + ++this.state.pos; + } + + case 10: + this.state.lineStart = this.state.pos; + ++this.state.curLine; + return ""; + + default: + if (ch >= 48 && ch <= 55) { + var codePos = this.state.pos - 1; + var octalStr = this.input.substr(this.state.pos - 1, 3).match(/^[0-7]+/)[0]; + var octal = parseInt(octalStr, 8); + + if (octal > 255) { + octalStr = octalStr.slice(0, -1); + octal = parseInt(octalStr, 8); + } + + if (octal > 0) { + if (inTemplate) { + this.state.invalidTemplateEscapePosition = codePos; + return null; + } else if (this.state.strict) { + this.raise(codePos, "Octal literal in strict mode"); + } else if (!this.state.containsOctal) { + this.state.containsOctal = true; + this.state.octalPosition = codePos; + } + } + + this.state.pos += octalStr.length - 1; + return String.fromCharCode(octal); + } + + return String.fromCharCode(ch); + } + }; + + _proto.readHexChar = function readHexChar(len, throwOnInvalid) { + var codePos = this.state.pos; + var n = this.readInt(16, len); + + if (n === null) { + if (throwOnInvalid) { + this.raise(codePos, "Bad character escape sequence"); + } else { + this.state.pos = codePos - 1; + this.state.invalidTemplateEscapePosition = codePos - 1; + } + } + + return n; + }; + + _proto.readWord1 = function readWord1() { + this.state.containsEsc = false; + var word = "", + first = true, + chunkStart = this.state.pos; + + while (this.state.pos < this.input.length) { + var ch = this.fullCharCodeAtPos(); + + if (isIdentifierChar(ch)) { + this.state.pos += ch <= 0xffff ? 1 : 2; + } else if (this.state.isIterator && ch === 64) { + this.state.pos += 1; + } else if (ch === 92) { + this.state.containsEsc = true; + word += this.input.slice(chunkStart, this.state.pos); + var escStart = this.state.pos; + + if (this.input.charCodeAt(++this.state.pos) !== 117) { + this.raise(this.state.pos, "Expecting Unicode escape sequence \\uXXXX"); + } + + ++this.state.pos; + var esc = this.readCodePoint(true); + + if (!(first ? isIdentifierStart : isIdentifierChar)(esc, true)) { + this.raise(escStart, "Invalid Unicode escape"); + } + + word += codePointToString(esc); + chunkStart = this.state.pos; + } else { + break; + } + + first = false; + } + + return word + this.input.slice(chunkStart, this.state.pos); + }; + + _proto.isIterator = function isIterator(word) { + return word === "@@iterator" || word === "@@asyncIterator"; + }; + + _proto.readWord = function readWord() { + var word = this.readWord1(); + var type = types.name; + + if (this.isKeyword(word)) { + if (this.state.containsEsc) { + this.raise(this.state.pos, "Escape sequence in keyword " + word); + } + + type = keywords[word]; + } + + if (this.state.isIterator && (!this.isIterator(word) || !this.state.inType)) { + this.raise(this.state.pos, "Invalid identifier " + word); + } + + this.finishToken(type, word); + }; + + _proto.braceIsBlock = function braceIsBlock(prevType) { + if (prevType === types.colon) { + var parent = this.curContext(); + + if (parent === types$1.braceStatement || parent === types$1.braceExpression) { + return !parent.isExpr; + } + } + + if (prevType === types._return) { + return lineBreak.test(this.input.slice(this.state.lastTokEnd, this.state.start)); + } + + if (prevType === types._else || prevType === types.semi || prevType === types.eof || prevType === types.parenR) { + return true; + } + + if (prevType === types.braceL) { + return this.curContext() === types$1.braceStatement; + } + + if (prevType === types.relational) { + return true; + } + + return !this.state.exprAllowed; + }; + + _proto.updateContext = function updateContext(prevType) { + var type = this.state.type; + var update; + + if (type.keyword && (prevType === types.dot || prevType === types.questionDot)) { + this.state.exprAllowed = false; + } else if (update = type.updateContext) { + update.call(this, prevType); + } else { + this.state.exprAllowed = type.beforeExpr; + } + }; + + _inheritsLoose(Tokenizer, _LocationParser); + + return Tokenizer; +}(LocationParser); + +var UtilParser = function (_Tokenizer) { + function UtilParser() { + return _Tokenizer.apply(this, arguments) || this; + } + + var _proto = UtilParser.prototype; + + _proto.addExtra = function addExtra(node, key, val) { + if (!node) return; + var extra = node.extra = node.extra || {}; + extra[key] = val; + }; + + _proto.isRelational = function isRelational(op) { + return this.match(types.relational) && this.state.value === op; + }; + + _proto.expectRelational = function expectRelational(op) { + if (this.isRelational(op)) { + this.next(); + } else { + this.unexpected(null, types.relational); + } + }; + + _proto.eatRelational = function eatRelational(op) { + if (this.isRelational(op)) { + this.next(); + return true; + } + + return false; + }; + + _proto.isContextual = function isContextual(name) { + return this.match(types.name) && this.state.value === name && !this.state.containsEsc; + }; + + _proto.isLookaheadContextual = function isLookaheadContextual(name) { + var l = this.lookahead(); + return l.type === types.name && l.value === name; + }; + + _proto.eatContextual = function eatContextual(name) { + return this.isContextual(name) && this.eat(types.name); + }; + + _proto.expectContextual = function expectContextual(name, message) { + if (!this.eatContextual(name)) this.unexpected(null, message); + }; + + _proto.canInsertSemicolon = function canInsertSemicolon() { + return this.match(types.eof) || this.match(types.braceR) || this.hasPrecedingLineBreak(); + }; + + _proto.hasPrecedingLineBreak = function hasPrecedingLineBreak() { + return lineBreak.test(this.input.slice(this.state.lastTokEnd, this.state.start)); + }; + + _proto.isLineTerminator = function isLineTerminator() { + return this.eat(types.semi) || this.canInsertSemicolon(); + }; + + _proto.semicolon = function semicolon() { + if (!this.isLineTerminator()) this.unexpected(null, types.semi); + }; + + _proto.expect = function expect(type, pos) { + this.eat(type) || this.unexpected(pos, type); + }; + + _proto.unexpected = function unexpected(pos, messageOrType) { + if (messageOrType === void 0) { + messageOrType = "Unexpected token"; + } + + if (typeof messageOrType !== "string") { + messageOrType = "Unexpected token, expected \"" + messageOrType.label + "\""; + } + + throw this.raise(pos != null ? pos : this.state.start, messageOrType); + }; + + _proto.expectPlugin = function expectPlugin(name, pos) { + if (!this.hasPlugin(name)) { + throw this.raise(pos != null ? pos : this.state.start, "This experimental syntax requires enabling the parser plugin: '" + name + "'", { + missingPluginNames: [name] + }); + } + + return true; + }; + + _proto.expectOnePlugin = function expectOnePlugin(names, pos) { + var _this = this; + + if (!names.some(function (n) { + return _this.hasPlugin(n); + })) { + throw this.raise(pos != null ? pos : this.state.start, "This experimental syntax requires enabling one of the following parser plugin(s): '" + names.join(", ") + "'", { + missingPluginNames: names + }); + } + }; + + _inheritsLoose(UtilParser, _Tokenizer); + + return UtilParser; +}(Tokenizer); + +var commentKeys = ["leadingComments", "trailingComments", "innerComments"]; + +var Node = function () { + function Node(parser, pos, loc) { + this.type = ""; + this.start = pos; + this.end = 0; + this.loc = new SourceLocation(loc); + if (parser && parser.options.ranges) this.range = [pos, 0]; + if (parser && parser.filename) this.loc.filename = parser.filename; + } + + var _proto = Node.prototype; + + _proto.__clone = function __clone() { + var _this = this; + + var node2 = new Node(); + Object.keys(this).forEach(function (key) { + if (commentKeys.indexOf(key) < 0) { + node2[key] = _this[key]; + } + }); + return node2; + }; + + return Node; +}(); + +var NodeUtils = function (_UtilParser) { + function NodeUtils() { + return _UtilParser.apply(this, arguments) || this; + } + + var _proto2 = NodeUtils.prototype; + + _proto2.startNode = function startNode() { + return new Node(this, this.state.start, this.state.startLoc); + }; + + _proto2.startNodeAt = function startNodeAt(pos, loc) { + return new Node(this, pos, loc); + }; + + _proto2.startNodeAtNode = function startNodeAtNode(type) { + return this.startNodeAt(type.start, type.loc.start); + }; + + _proto2.finishNode = function finishNode(node, type) { + return this.finishNodeAt(node, type, this.state.lastTokEnd, this.state.lastTokEndLoc); + }; + + _proto2.finishNodeAt = function finishNodeAt(node, type, pos, loc) { + node.type = type; + node.end = pos; + node.loc.end = loc; + if (this.options.ranges) node.range[1] = pos; + this.processComment(node); + return node; + }; + + _proto2.resetStartLocationFromNode = function resetStartLocationFromNode(node, locationNode) { + node.start = locationNode.start; + node.loc.start = locationNode.loc.start; + if (this.options.ranges) node.range[0] = locationNode.range[0]; + }; + + _inheritsLoose(NodeUtils, _UtilParser); + + return NodeUtils; +}(UtilParser); + +var LValParser = function (_NodeUtils) { + function LValParser() { + return _NodeUtils.apply(this, arguments) || this; + } + + var _proto = LValParser.prototype; + + _proto.toAssignable = function toAssignable(node, isBinding, contextDescription) { + if (node) { + switch (node.type) { + case "Identifier": + case "ObjectPattern": + case "ArrayPattern": + case "AssignmentPattern": + break; + + case "ObjectExpression": + node.type = "ObjectPattern"; + + for (var index = 0; index < node.properties.length; index++) { + var prop = node.properties[index]; + var isLast = index === node.properties.length - 1; + this.toAssignableObjectExpressionProp(prop, isBinding, isLast); + } + + break; + + case "ObjectProperty": + this.toAssignable(node.value, isBinding, contextDescription); + break; + + case "SpreadElement": + { + this.checkToRestConversion(node); + node.type = "RestElement"; + var arg = node.argument; + this.toAssignable(arg, isBinding, contextDescription); + break; + } + + case "ArrayExpression": + node.type = "ArrayPattern"; + this.toAssignableList(node.elements, isBinding, contextDescription); + break; + + case "AssignmentExpression": + if (node.operator === "=") { + node.type = "AssignmentPattern"; + delete node.operator; + } else { + this.raise(node.left.end, "Only '=' operator can be used for specifying default value."); + } + + break; + + case "MemberExpression": + if (!isBinding) break; + + default: + { + var message = "Invalid left-hand side" + (contextDescription ? " in " + contextDescription : "expression"); + this.raise(node.start, message); + } + } + } + + return node; + }; + + _proto.toAssignableObjectExpressionProp = function toAssignableObjectExpressionProp(prop, isBinding, isLast) { + if (prop.type === "ObjectMethod") { + var error = prop.kind === "get" || prop.kind === "set" ? "Object pattern can't contain getter or setter" : "Object pattern can't contain methods"; + this.raise(prop.key.start, error); + } else if (prop.type === "SpreadElement" && !isLast) { + this.raise(prop.start, "The rest element has to be the last element when destructuring"); + } else { + this.toAssignable(prop, isBinding, "object destructuring pattern"); + } + }; + + _proto.toAssignableList = function toAssignableList(exprList, isBinding, contextDescription) { + var end = exprList.length; + + if (end) { + var last = exprList[end - 1]; + + if (last && last.type === "RestElement") { + --end; + } else if (last && last.type === "SpreadElement") { + last.type = "RestElement"; + var arg = last.argument; + this.toAssignable(arg, isBinding, contextDescription); + + if (["Identifier", "MemberExpression", "ArrayPattern", "ObjectPattern"].indexOf(arg.type) === -1) { + this.unexpected(arg.start); + } + + --end; + } + } + + for (var i = 0; i < end; i++) { + var elt = exprList[i]; + + if (elt && elt.type === "SpreadElement") { + this.raise(elt.start, "The rest element has to be the last element when destructuring"); + } + + if (elt) this.toAssignable(elt, isBinding, contextDescription); + } + + return exprList; + }; + + _proto.toReferencedList = function toReferencedList(exprList) { + return exprList; + }; + + _proto.parseSpread = function parseSpread(refShorthandDefaultPos, refNeedsArrowPos) { + var node = this.startNode(); + this.next(); + node.argument = this.parseMaybeAssign(false, refShorthandDefaultPos, undefined, refNeedsArrowPos); + return this.finishNode(node, "SpreadElement"); + }; + + _proto.parseRest = function parseRest() { + var node = this.startNode(); + this.next(); + node.argument = this.parseBindingAtom(); + return this.finishNode(node, "RestElement"); + }; + + _proto.shouldAllowYieldIdentifier = function shouldAllowYieldIdentifier() { + return this.match(types._yield) && !this.state.strict && !this.state.inGenerator; + }; + + _proto.parseBindingIdentifier = function parseBindingIdentifier() { + return this.parseIdentifier(this.shouldAllowYieldIdentifier()); + }; + + _proto.parseBindingAtom = function parseBindingAtom() { + switch (this.state.type) { + case types._yield: + case types.name: + return this.parseBindingIdentifier(); + + case types.bracketL: + { + var node = this.startNode(); + this.next(); + node.elements = this.parseBindingList(types.bracketR, true); + return this.finishNode(node, "ArrayPattern"); + } + + case types.braceL: + return this.parseObj(true); + + default: + throw this.unexpected(); + } + }; + + _proto.parseBindingList = function parseBindingList(close, allowEmpty, allowModifiers) { + var elts = []; + var first = true; + + while (!this.eat(close)) { + if (first) { + first = false; + } else { + this.expect(types.comma); + } + + if (allowEmpty && this.match(types.comma)) { + elts.push(null); + } else if (this.eat(close)) { + break; + } else if (this.match(types.ellipsis)) { + elts.push(this.parseAssignableListItemTypes(this.parseRest())); + this.expect(close); + break; + } else { + var decorators = []; + + if (this.match(types.at) && this.hasPlugin("decorators")) { + this.raise(this.state.start, "Stage 2 decorators cannot be used to decorate parameters"); + } + + while (this.match(types.at)) { + decorators.push(this.parseDecorator()); + } + + elts.push(this.parseAssignableListItem(allowModifiers, decorators)); + } + } + + return elts; + }; + + _proto.parseAssignableListItem = function parseAssignableListItem(allowModifiers, decorators) { + var left = this.parseMaybeDefault(); + this.parseAssignableListItemTypes(left); + var elt = this.parseMaybeDefault(left.start, left.loc.start, left); + + if (decorators.length) { + left.decorators = decorators; + } + + return elt; + }; + + _proto.parseAssignableListItemTypes = function parseAssignableListItemTypes(param) { + return param; + }; + + _proto.parseMaybeDefault = function parseMaybeDefault(startPos, startLoc, left) { + startLoc = startLoc || this.state.startLoc; + startPos = startPos || this.state.start; + left = left || this.parseBindingAtom(); + if (!this.eat(types.eq)) return left; + var node = this.startNodeAt(startPos, startLoc); + node.left = left; + node.right = this.parseMaybeAssign(); + return this.finishNode(node, "AssignmentPattern"); + }; + + _proto.checkLVal = function checkLVal(expr, isBinding, checkClashes, contextDescription) { + switch (expr.type) { + case "Identifier": + this.checkReservedWord(expr.name, expr.start, false, true); + + if (checkClashes) { + var _key = "_" + expr.name; + + if (checkClashes[_key]) { + this.raise(expr.start, "Argument name clash in strict mode"); + } else { + checkClashes[_key] = true; + } + } + + break; + + case "MemberExpression": + if (isBinding) this.raise(expr.start, "Binding member expression"); + break; + + case "ObjectPattern": + for (var _i2 = 0, _expr$properties2 = expr.properties; _i2 < _expr$properties2.length; _i2++) { + var prop = _expr$properties2[_i2]; + if (prop.type === "ObjectProperty") prop = prop.value; + this.checkLVal(prop, isBinding, checkClashes, "object destructuring pattern"); + } + + break; + + case "ArrayPattern": + for (var _i4 = 0, _expr$elements2 = expr.elements; _i4 < _expr$elements2.length; _i4++) { + var elem = _expr$elements2[_i4]; + + if (elem) { + this.checkLVal(elem, isBinding, checkClashes, "array destructuring pattern"); + } + } + + break; + + case "AssignmentPattern": + this.checkLVal(expr.left, isBinding, checkClashes, "assignment pattern"); + break; + + case "RestElement": + this.checkLVal(expr.argument, isBinding, checkClashes, "rest element"); + break; + + default: + { + var message = (isBinding ? "Binding invalid" : "Invalid") + " left-hand side" + (contextDescription ? " in " + contextDescription : "expression"); + this.raise(expr.start, message); + } + } + }; + + _proto.checkToRestConversion = function checkToRestConversion(node) { + var validArgumentTypes = ["Identifier", "MemberExpression"]; + + if (validArgumentTypes.indexOf(node.argument.type) !== -1) { + return; + } + + this.raise(node.argument.start, "Invalid rest operator's argument"); + }; + + _inheritsLoose(LValParser, _NodeUtils); + + return LValParser; +}(NodeUtils); + +var ExpressionParser = function (_LValParser) { + function ExpressionParser() { + return _LValParser.apply(this, arguments) || this; + } + + var _proto = ExpressionParser.prototype; + + _proto.checkPropClash = function checkPropClash(prop, propHash) { + if (prop.computed || prop.kind) return; + var key = prop.key; + var name = key.type === "Identifier" ? key.name : String(key.value); + + if (name === "__proto__") { + if (propHash.proto) { + this.raise(key.start, "Redefinition of __proto__ property"); + } + + propHash.proto = true; + } + }; + + _proto.getExpression = function getExpression() { + this.nextToken(); + var expr = this.parseExpression(); + + if (!this.match(types.eof)) { + this.unexpected(); + } + + expr.comments = this.state.comments; + return expr; + }; + + _proto.parseExpression = function parseExpression(noIn, refShorthandDefaultPos) { + var startPos = this.state.start; + var startLoc = this.state.startLoc; + var expr = this.parseMaybeAssign(noIn, refShorthandDefaultPos); + + if (this.match(types.comma)) { + var _node = this.startNodeAt(startPos, startLoc); + + _node.expressions = [expr]; + + while (this.eat(types.comma)) { + _node.expressions.push(this.parseMaybeAssign(noIn, refShorthandDefaultPos)); + } + + this.toReferencedList(_node.expressions); + return this.finishNode(_node, "SequenceExpression"); + } + + return expr; + }; + + _proto.parseMaybeAssign = function parseMaybeAssign(noIn, refShorthandDefaultPos, afterLeftParse, refNeedsArrowPos) { + var startPos = this.state.start; + var startLoc = this.state.startLoc; + + if (this.match(types._yield) && this.state.inGenerator) { + var _left = this.parseYield(); + + if (afterLeftParse) { + _left = afterLeftParse.call(this, _left, startPos, startLoc); + } + + return _left; + } + + var failOnShorthandAssign; + + if (refShorthandDefaultPos) { + failOnShorthandAssign = false; + } else { + refShorthandDefaultPos = { + start: 0 + }; + failOnShorthandAssign = true; + } + + if (this.match(types.parenL) || this.match(types.name) || this.match(types._yield)) { + this.state.potentialArrowAt = this.state.start; + } + + var left = this.parseMaybeConditional(noIn, refShorthandDefaultPos, refNeedsArrowPos); + + if (afterLeftParse) { + left = afterLeftParse.call(this, left, startPos, startLoc); + } + + if (this.state.type.isAssign) { + var _node2 = this.startNodeAt(startPos, startLoc); + + var operator = this.state.value; + _node2.operator = operator; + + if (operator === "??=") { + this.expectPlugin("nullishCoalescingOperator"); + this.expectPlugin("logicalAssignment"); + } + + if (operator === "||=" || operator === "&&=") { + this.expectPlugin("logicalAssignment"); + } + + _node2.left = this.match(types.eq) ? this.toAssignable(left, undefined, "assignment expression") : left; + refShorthandDefaultPos.start = 0; + this.checkLVal(left, undefined, undefined, "assignment expression"); + + if (left.extra && left.extra.parenthesized) { + var errorMsg; + + if (left.type === "ObjectPattern") { + errorMsg = "`({a}) = 0` use `({a} = 0)`"; + } else if (left.type === "ArrayPattern") { + errorMsg = "`([a]) = 0` use `([a] = 0)`"; + } + + if (errorMsg) { + this.raise(left.start, "You're trying to assign to a parenthesized expression, eg. instead of " + errorMsg); + } + } + + this.next(); + _node2.right = this.parseMaybeAssign(noIn); + return this.finishNode(_node2, "AssignmentExpression"); + } else if (failOnShorthandAssign && refShorthandDefaultPos.start) { + this.unexpected(refShorthandDefaultPos.start); + } + + return left; + }; + + _proto.parseMaybeConditional = function parseMaybeConditional(noIn, refShorthandDefaultPos, refNeedsArrowPos) { + var startPos = this.state.start; + var startLoc = this.state.startLoc; + var potentialArrowAt = this.state.potentialArrowAt; + var expr = this.parseExprOps(noIn, refShorthandDefaultPos); + + if (expr.type === "ArrowFunctionExpression" && expr.start === potentialArrowAt) { + return expr; + } + + if (refShorthandDefaultPos && refShorthandDefaultPos.start) return expr; + return this.parseConditional(expr, noIn, startPos, startLoc, refNeedsArrowPos); + }; + + _proto.parseConditional = function parseConditional(expr, noIn, startPos, startLoc, refNeedsArrowPos) { + if (this.eat(types.question)) { + var _node3 = this.startNodeAt(startPos, startLoc); + + _node3.test = expr; + _node3.consequent = this.parseMaybeAssign(); + this.expect(types.colon); + _node3.alternate = this.parseMaybeAssign(noIn); + return this.finishNode(_node3, "ConditionalExpression"); + } + + return expr; + }; + + _proto.parseExprOps = function parseExprOps(noIn, refShorthandDefaultPos) { + var startPos = this.state.start; + var startLoc = this.state.startLoc; + var potentialArrowAt = this.state.potentialArrowAt; + var expr = this.parseMaybeUnary(refShorthandDefaultPos); + + if (expr.type === "ArrowFunctionExpression" && expr.start === potentialArrowAt) { + return expr; + } + + if (refShorthandDefaultPos && refShorthandDefaultPos.start) { + return expr; + } + + return this.parseExprOp(expr, startPos, startLoc, -1, noIn); + }; + + _proto.parseExprOp = function parseExprOp(left, leftStartPos, leftStartLoc, minPrec, noIn) { + var prec = this.state.type.binop; + + if (prec != null && (!noIn || !this.match(types._in))) { + if (prec > minPrec) { + var _node4 = this.startNodeAt(leftStartPos, leftStartLoc); + + var operator = this.state.value; + _node4.left = left; + _node4.operator = operator; + + if (operator === "**" && left.type === "UnaryExpression" && left.extra && !left.extra.parenthesizedArgument && !left.extra.parenthesized) { + this.raise(left.argument.start, "Illegal expression. Wrap left hand side or entire exponentiation in parentheses."); + } + + var op = this.state.type; + + if (op === types.nullishCoalescing) { + this.expectPlugin("nullishCoalescingOperator"); + } else if (op === types.pipeline) { + this.expectPlugin("pipelineOperator"); + } + + this.next(); + var startPos = this.state.start; + var startLoc = this.state.startLoc; + + if (op === types.pipeline) { + if (this.match(types.name) && this.state.value === "await" && this.state.inAsync) { + throw this.raise(this.state.start, "Unexpected \"await\" after pipeline body; await must have parentheses in minimal proposal"); + } + } + + _node4.right = this.parseExprOp(this.parseMaybeUnary(), startPos, startLoc, op.rightAssociative ? prec - 1 : prec, noIn); + this.finishNode(_node4, op === types.logicalOR || op === types.logicalAND || op === types.nullishCoalescing ? "LogicalExpression" : "BinaryExpression"); + return this.parseExprOp(_node4, leftStartPos, leftStartLoc, minPrec, noIn); + } + } + + return left; + }; + + _proto.parseMaybeUnary = function parseMaybeUnary(refShorthandDefaultPos) { + if (this.state.type.prefix) { + var _node5 = this.startNode(); + + var update = this.match(types.incDec); + _node5.operator = this.state.value; + _node5.prefix = true; + + if (_node5.operator === "throw") { + this.expectPlugin("throwExpressions"); + } + + this.next(); + var argType = this.state.type; + _node5.argument = this.parseMaybeUnary(); + this.addExtra(_node5, "parenthesizedArgument", argType === types.parenL && (!_node5.argument.extra || !_node5.argument.extra.parenthesized)); + + if (refShorthandDefaultPos && refShorthandDefaultPos.start) { + this.unexpected(refShorthandDefaultPos.start); + } + + if (update) { + this.checkLVal(_node5.argument, undefined, undefined, "prefix operation"); + } else if (this.state.strict && _node5.operator === "delete") { + var arg = _node5.argument; + + if (arg.type === "Identifier") { + this.raise(_node5.start, "Deleting local variable in strict mode"); + } else if (arg.type === "MemberExpression" && arg.property.type === "PrivateName") { + this.raise(_node5.start, "Deleting a private field is not allowed"); + } + } + + return this.finishNode(_node5, update ? "UpdateExpression" : "UnaryExpression"); + } + + var startPos = this.state.start; + var startLoc = this.state.startLoc; + var expr = this.parseExprSubscripts(refShorthandDefaultPos); + if (refShorthandDefaultPos && refShorthandDefaultPos.start) return expr; + + while (this.state.type.postfix && !this.canInsertSemicolon()) { + var _node6 = this.startNodeAt(startPos, startLoc); + + _node6.operator = this.state.value; + _node6.prefix = false; + _node6.argument = expr; + this.checkLVal(expr, undefined, undefined, "postfix operation"); + this.next(); + expr = this.finishNode(_node6, "UpdateExpression"); + } + + return expr; + }; + + _proto.parseExprSubscripts = function parseExprSubscripts(refShorthandDefaultPos) { + var startPos = this.state.start; + var startLoc = this.state.startLoc; + var potentialArrowAt = this.state.potentialArrowAt; + var expr = this.parseExprAtom(refShorthandDefaultPos); + + if (expr.type === "ArrowFunctionExpression" && expr.start === potentialArrowAt) { + return expr; + } + + if (refShorthandDefaultPos && refShorthandDefaultPos.start) { + return expr; + } + + return this.parseSubscripts(expr, startPos, startLoc); + }; + + _proto.parseSubscripts = function parseSubscripts(base, startPos, startLoc, noCalls) { + var state = { + optionalChainMember: false, + stop: false + }; + + do { + base = this.parseSubscript(base, startPos, startLoc, noCalls, state); + } while (!state.stop); + + return base; + }; + + _proto.parseSubscript = function parseSubscript(base, startPos, startLoc, noCalls, state) { + if (!noCalls && this.eat(types.doubleColon)) { + var _node7 = this.startNodeAt(startPos, startLoc); + + _node7.object = base; + _node7.callee = this.parseNoCallExpr(); + state.stop = true; + return this.parseSubscripts(this.finishNode(_node7, "BindExpression"), startPos, startLoc, noCalls); + } else if (this.match(types.questionDot)) { + this.expectPlugin("optionalChaining"); + state.optionalChainMember = true; + + if (noCalls && this.lookahead().type == types.parenL) { + state.stop = true; + return base; + } + + this.next(); + + var _node8 = this.startNodeAt(startPos, startLoc); + + if (this.eat(types.bracketL)) { + _node8.object = base; + _node8.property = this.parseExpression(); + _node8.computed = true; + _node8.optional = true; + this.expect(types.bracketR); + return this.finishNode(_node8, "OptionalMemberExpression"); + } else if (this.eat(types.parenL)) { + var possibleAsync = this.atPossibleAsync(base); + _node8.callee = base; + _node8.arguments = this.parseCallExpressionArguments(types.parenR, possibleAsync); + _node8.optional = true; + return this.finishNode(_node8, "OptionalCallExpression"); + } else { + _node8.object = base; + _node8.property = this.parseIdentifier(true); + _node8.computed = false; + _node8.optional = true; + return this.finishNode(_node8, "OptionalMemberExpression"); + } + } else if (this.eat(types.dot)) { + var _node9 = this.startNodeAt(startPos, startLoc); + + _node9.object = base; + _node9.property = this.parseMaybePrivateName(); + _node9.computed = false; + + if (state.optionalChainMember) { + _node9.optional = false; + return this.finishNode(_node9, "OptionalMemberExpression"); + } + + return this.finishNode(_node9, "MemberExpression"); + } else if (this.eat(types.bracketL)) { + var _node10 = this.startNodeAt(startPos, startLoc); + + _node10.object = base; + _node10.property = this.parseExpression(); + _node10.computed = true; + this.expect(types.bracketR); + + if (state.optionalChainMember) { + _node10.optional = false; + return this.finishNode(_node10, "OptionalMemberExpression"); + } + + return this.finishNode(_node10, "MemberExpression"); + } else if (!noCalls && this.match(types.parenL)) { + var _possibleAsync = this.atPossibleAsync(base); + + this.next(); + + var _node11 = this.startNodeAt(startPos, startLoc); + + _node11.callee = base; + var refTrailingCommaPos = { + start: -1 + }; + _node11.arguments = this.parseCallExpressionArguments(types.parenR, _possibleAsync, refTrailingCommaPos); + + if (!state.optionalChainMember) { + this.finishCallExpression(_node11); + } else { + this.finishOptionalCallExpression(_node11); + } + + if (_possibleAsync && this.shouldParseAsyncArrow()) { + state.stop = true; + + if (refTrailingCommaPos.start > -1) { + this.raise(refTrailingCommaPos.start, "A trailing comma is not permitted after the rest element"); + } + + return this.parseAsyncArrowFromCallExpression(this.startNodeAt(startPos, startLoc), _node11); + } else { + this.toReferencedList(_node11.arguments); + } + + return _node11; + } else if (this.match(types.backQuote)) { + var _node12 = this.startNodeAt(startPos, startLoc); + + _node12.tag = base; + _node12.quasi = this.parseTemplate(true); + + if (state.optionalChainMember) { + this.raise(startPos, "Tagged Template Literals are not allowed in optionalChain"); + } + + return this.finishNode(_node12, "TaggedTemplateExpression"); + } else { + state.stop = true; + return base; + } + }; + + _proto.atPossibleAsync = function atPossibleAsync(base) { + return !this.state.containsEsc && this.state.potentialArrowAt === base.start && base.type === "Identifier" && base.name === "async" && !this.canInsertSemicolon(); + }; + + _proto.finishCallExpression = function finishCallExpression(node) { + if (node.callee.type === "Import") { + if (node.arguments.length !== 1) { + this.raise(node.start, "import() requires exactly one argument"); + } + + var importArg = node.arguments[0]; + + if (importArg && importArg.type === "SpreadElement") { + this.raise(importArg.start, "... is not allowed in import()"); + } + } + + return this.finishNode(node, "CallExpression"); + }; + + _proto.finishOptionalCallExpression = function finishOptionalCallExpression(node) { + if (node.callee.type === "Import") { + if (node.arguments.length !== 1) { + this.raise(node.start, "import() requires exactly one argument"); + } + + var importArg = node.arguments[0]; + + if (importArg && importArg.type === "SpreadElement") { + this.raise(importArg.start, "... is not allowed in import()"); + } + } + + return this.finishNode(node, "OptionalCallExpression"); + }; + + _proto.parseCallExpressionArguments = function parseCallExpressionArguments(close, possibleAsyncArrow, refTrailingCommaPos) { + var elts = []; + var innerParenStart; + var first = true; + + while (!this.eat(close)) { + if (first) { + first = false; + } else { + this.expect(types.comma); + if (this.eat(close)) break; + } + + if (this.match(types.parenL) && !innerParenStart) { + innerParenStart = this.state.start; + } + + elts.push(this.parseExprListItem(false, possibleAsyncArrow ? { + start: 0 + } : undefined, possibleAsyncArrow ? { + start: 0 + } : undefined, possibleAsyncArrow ? refTrailingCommaPos : undefined)); + } + + if (possibleAsyncArrow && innerParenStart && this.shouldParseAsyncArrow()) { + this.unexpected(); + } + + return elts; + }; + + _proto.shouldParseAsyncArrow = function shouldParseAsyncArrow() { + return this.match(types.arrow); + }; + + _proto.parseAsyncArrowFromCallExpression = function parseAsyncArrowFromCallExpression(node, call) { + var oldYield = this.state.yieldInPossibleArrowParameters; + this.state.yieldInPossibleArrowParameters = null; + this.expect(types.arrow); + this.parseArrowExpression(node, call.arguments, true); + this.state.yieldInPossibleArrowParameters = oldYield; + return node; + }; + + _proto.parseNoCallExpr = function parseNoCallExpr() { + var startPos = this.state.start; + var startLoc = this.state.startLoc; + return this.parseSubscripts(this.parseExprAtom(), startPos, startLoc, true); + }; + + _proto.parseExprAtom = function parseExprAtom(refShorthandDefaultPos) { + var canBeArrow = this.state.potentialArrowAt === this.state.start; + var node; + + switch (this.state.type) { + case types._super: + if (!this.state.inMethod && !this.state.inClassProperty && !this.options.allowSuperOutsideMethod) { + this.raise(this.state.start, "super is only allowed in object methods and classes"); + } + + node = this.startNode(); + this.next(); + + if (!this.match(types.parenL) && !this.match(types.bracketL) && !this.match(types.dot)) { + this.unexpected(); + } + + if (this.match(types.parenL) && this.state.inMethod !== "constructor" && !this.options.allowSuperOutsideMethod) { + this.raise(node.start, "super() is only valid inside a class constructor. " + "Make sure the method name is spelled exactly as 'constructor'."); + } + + return this.finishNode(node, "Super"); + + case types._import: + if (this.lookahead().type === types.dot) { + return this.parseImportMetaProperty(); + } + + this.expectPlugin("dynamicImport"); + node = this.startNode(); + this.next(); + + if (!this.match(types.parenL)) { + this.unexpected(null, types.parenL); + } + + return this.finishNode(node, "Import"); + + case types._this: + node = this.startNode(); + this.next(); + return this.finishNode(node, "ThisExpression"); + + case types._yield: + if (this.state.inGenerator) this.unexpected(); + + case types.name: + { + node = this.startNode(); + var allowAwait = this.state.value === "await" && (this.state.inAsync || !this.state.inFunction && this.options.allowAwaitOutsideFunction); + var containsEsc = this.state.containsEsc; + var allowYield = this.shouldAllowYieldIdentifier(); + var id = this.parseIdentifier(allowAwait || allowYield); + + if (id.name === "await") { + if (this.state.inAsync || this.inModule || !this.state.inFunction && this.options.allowAwaitOutsideFunction) { + return this.parseAwait(node); + } + } else if (!containsEsc && id.name === "async" && this.match(types._function) && !this.canInsertSemicolon()) { + this.next(); + return this.parseFunction(node, false, false, true); + } else if (canBeArrow && id.name === "async" && this.match(types.name)) { + var oldYield = this.state.yieldInPossibleArrowParameters; + this.state.yieldInPossibleArrowParameters = null; + var params = [this.parseIdentifier()]; + this.expect(types.arrow); + this.parseArrowExpression(node, params, true); + this.state.yieldInPossibleArrowParameters = oldYield; + return node; + } + + if (canBeArrow && !this.canInsertSemicolon() && this.eat(types.arrow)) { + var _oldYield = this.state.yieldInPossibleArrowParameters; + this.state.yieldInPossibleArrowParameters = null; + this.parseArrowExpression(node, [id]); + this.state.yieldInPossibleArrowParameters = _oldYield; + return node; + } + + return id; + } + + case types._do: + { + this.expectPlugin("doExpressions"); + + var _node13 = this.startNode(); + + this.next(); + var oldInFunction = this.state.inFunction; + var oldLabels = this.state.labels; + this.state.labels = []; + this.state.inFunction = false; + _node13.body = this.parseBlock(false); + this.state.inFunction = oldInFunction; + this.state.labels = oldLabels; + return this.finishNode(_node13, "DoExpression"); + } + + case types.regexp: + { + var value = this.state.value; + node = this.parseLiteral(value.value, "RegExpLiteral"); + node.pattern = value.pattern; + node.flags = value.flags; + return node; + } + + case types.num: + return this.parseLiteral(this.state.value, "NumericLiteral"); + + case types.bigint: + return this.parseLiteral(this.state.value, "BigIntLiteral"); + + case types.string: + return this.parseLiteral(this.state.value, "StringLiteral"); + + case types._null: + node = this.startNode(); + this.next(); + return this.finishNode(node, "NullLiteral"); + + case types._true: + case types._false: + return this.parseBooleanLiteral(); + + case types.parenL: + return this.parseParenAndDistinguishExpression(canBeArrow); + + case types.bracketL: + node = this.startNode(); + this.next(); + node.elements = this.parseExprList(types.bracketR, true, refShorthandDefaultPos); + this.toReferencedList(node.elements); + return this.finishNode(node, "ArrayExpression"); + + case types.braceL: + return this.parseObj(false, refShorthandDefaultPos); + + case types._function: + return this.parseFunctionExpression(); + + case types.at: + this.parseDecorators(); + + case types._class: + node = this.startNode(); + this.takeDecorators(node); + return this.parseClass(node, false); + + case types._new: + return this.parseNew(); + + case types.backQuote: + return this.parseTemplate(false); + + case types.doubleColon: + { + node = this.startNode(); + this.next(); + node.object = null; + var callee = node.callee = this.parseNoCallExpr(); + + if (callee.type === "MemberExpression") { + return this.finishNode(node, "BindExpression"); + } else { + throw this.raise(callee.start, "Binding should be performed on object property."); + } + } + + default: + throw this.unexpected(); + } + }; + + _proto.parseBooleanLiteral = function parseBooleanLiteral() { + var node = this.startNode(); + node.value = this.match(types._true); + this.next(); + return this.finishNode(node, "BooleanLiteral"); + }; + + _proto.parseMaybePrivateName = function parseMaybePrivateName() { + var isPrivate = this.match(types.hash); + + if (isPrivate) { + this.expectOnePlugin(["classPrivateProperties", "classPrivateMethods"]); + + var _node14 = this.startNode(); + + this.next(); + _node14.id = this.parseIdentifier(true); + return this.finishNode(_node14, "PrivateName"); + } else { + return this.parseIdentifier(true); + } + }; + + _proto.parseFunctionExpression = function parseFunctionExpression() { + var node = this.startNode(); + var meta = this.parseIdentifier(true); + + if (this.state.inGenerator && this.eat(types.dot)) { + return this.parseMetaProperty(node, meta, "sent"); + } + + return this.parseFunction(node, false); + }; + + _proto.parseMetaProperty = function parseMetaProperty(node, meta, propertyName) { + node.meta = meta; + + if (meta.name === "function" && propertyName === "sent") { + if (this.isContextual(propertyName)) { + this.expectPlugin("functionSent"); + } else if (!this.hasPlugin("functionSent")) { + this.unexpected(); + } + } + + var containsEsc = this.state.containsEsc; + node.property = this.parseIdentifier(true); + + if (node.property.name !== propertyName || containsEsc) { + this.raise(node.property.start, "The only valid meta property for " + meta.name + " is " + meta.name + "." + propertyName); + } + + return this.finishNode(node, "MetaProperty"); + }; + + _proto.parseImportMetaProperty = function parseImportMetaProperty() { + var node = this.startNode(); + var id = this.parseIdentifier(true); + this.expect(types.dot); + + if (id.name === "import") { + if (this.isContextual("meta")) { + this.expectPlugin("importMeta"); + } else if (!this.hasPlugin("importMeta")) { + this.raise(id.start, "Dynamic imports require a parameter: import('a.js').then"); + } + } + + if (!this.inModule) { + this.raise(id.start, "import.meta may appear only with 'sourceType: \"module\"'", { + code: "BABEL_PARSER_SOURCETYPE_MODULE_REQUIRED" + }); + } + + this.sawUnambiguousESM = true; + return this.parseMetaProperty(node, id, "meta"); + }; + + _proto.parseLiteral = function parseLiteral(value, type, startPos, startLoc) { + startPos = startPos || this.state.start; + startLoc = startLoc || this.state.startLoc; + var node = this.startNodeAt(startPos, startLoc); + this.addExtra(node, "rawValue", value); + this.addExtra(node, "raw", this.input.slice(startPos, this.state.end)); + node.value = value; + this.next(); + return this.finishNode(node, type); + }; + + _proto.parseParenExpression = function parseParenExpression() { + this.expect(types.parenL); + var val = this.parseExpression(); + this.expect(types.parenR); + return val; + }; + + _proto.parseParenAndDistinguishExpression = function parseParenAndDistinguishExpression(canBeArrow) { + var startPos = this.state.start; + var startLoc = this.state.startLoc; + var val; + this.expect(types.parenL); + var oldMaybeInArrowParameters = this.state.maybeInArrowParameters; + var oldYield = this.state.yieldInPossibleArrowParameters; + this.state.maybeInArrowParameters = true; + this.state.yieldInPossibleArrowParameters = null; + var innerStartPos = this.state.start; + var innerStartLoc = this.state.startLoc; + var exprList = []; + var refShorthandDefaultPos = { + start: 0 + }; + var refNeedsArrowPos = { + start: 0 + }; + var first = true; + var spreadStart; + var optionalCommaStart; + + while (!this.match(types.parenR)) { + if (first) { + first = false; + } else { + this.expect(types.comma, refNeedsArrowPos.start || null); + + if (this.match(types.parenR)) { + optionalCommaStart = this.state.start; + break; + } + } + + if (this.match(types.ellipsis)) { + var spreadNodeStartPos = this.state.start; + var spreadNodeStartLoc = this.state.startLoc; + spreadStart = this.state.start; + exprList.push(this.parseParenItem(this.parseRest(), spreadNodeStartPos, spreadNodeStartLoc)); + + if (this.match(types.comma) && this.lookahead().type === types.parenR) { + this.raise(this.state.start, "A trailing comma is not permitted after the rest element"); + } + + break; + } else { + exprList.push(this.parseMaybeAssign(false, refShorthandDefaultPos, this.parseParenItem, refNeedsArrowPos)); + } + } + + var innerEndPos = this.state.start; + var innerEndLoc = this.state.startLoc; + this.expect(types.parenR); + this.state.maybeInArrowParameters = oldMaybeInArrowParameters; + var arrowNode = this.startNodeAt(startPos, startLoc); + + if (canBeArrow && this.shouldParseArrow() && (arrowNode = this.parseArrow(arrowNode))) { + for (var _i2 = 0; _i2 < exprList.length; _i2++) { + var param = exprList[_i2]; + + if (param.extra && param.extra.parenthesized) { + this.unexpected(param.extra.parenStart); + } + } + + this.parseArrowExpression(arrowNode, exprList); + this.state.yieldInPossibleArrowParameters = oldYield; + return arrowNode; + } + + this.state.yieldInPossibleArrowParameters = oldYield; + + if (!exprList.length) { + this.unexpected(this.state.lastTokStart); + } + + if (optionalCommaStart) this.unexpected(optionalCommaStart); + if (spreadStart) this.unexpected(spreadStart); + + if (refShorthandDefaultPos.start) { + this.unexpected(refShorthandDefaultPos.start); + } + + if (refNeedsArrowPos.start) this.unexpected(refNeedsArrowPos.start); + + if (exprList.length > 1) { + val = this.startNodeAt(innerStartPos, innerStartLoc); + val.expressions = exprList; + this.toReferencedList(val.expressions); + this.finishNodeAt(val, "SequenceExpression", innerEndPos, innerEndLoc); + } else { + val = exprList[0]; + } + + this.addExtra(val, "parenthesized", true); + this.addExtra(val, "parenStart", startPos); + return val; + }; + + _proto.shouldParseArrow = function shouldParseArrow() { + return !this.canInsertSemicolon(); + }; + + _proto.parseArrow = function parseArrow(node) { + if (this.eat(types.arrow)) { + return node; + } + }; + + _proto.parseParenItem = function parseParenItem(node, startPos, startLoc) { + return node; + }; + + _proto.parseNew = function parseNew() { + var node = this.startNode(); + var meta = this.parseIdentifier(true); + + if (this.eat(types.dot)) { + var metaProp = this.parseMetaProperty(node, meta, "target"); + + if (!this.state.inFunction && !this.state.inClassProperty) { + var error = "new.target can only be used in functions"; + + if (this.hasPlugin("classProperties")) { + error += " or class properties"; + } + + this.raise(metaProp.start, error); + } + + return metaProp; + } + + node.callee = this.parseNoCallExpr(); + + if (node.callee.type === "OptionalMemberExpression" || node.callee.type === "OptionalCallExpression") { + this.raise(this.state.lastTokEnd, "constructors in/after an Optional Chain are not allowed"); + } + + if (this.eat(types.questionDot)) { + this.raise(this.state.start, "constructors in/after an Optional Chain are not allowed"); + } + + this.parseNewArguments(node); + return this.finishNode(node, "NewExpression"); + }; + + _proto.parseNewArguments = function parseNewArguments(node) { + if (this.eat(types.parenL)) { + var args = this.parseExprList(types.parenR); + this.toReferencedList(args); + node.arguments = args; + } else { + node.arguments = []; + } + }; + + _proto.parseTemplateElement = function parseTemplateElement(isTagged) { + var elem = this.startNode(); + + if (this.state.value === null) { + if (!isTagged) { + this.raise(this.state.invalidTemplateEscapePosition || 0, "Invalid escape sequence in template"); + } else { + this.state.invalidTemplateEscapePosition = null; + } + } + + elem.value = { + raw: this.input.slice(this.state.start, this.state.end).replace(/\r\n?/g, "\n"), + cooked: this.state.value + }; + this.next(); + elem.tail = this.match(types.backQuote); + return this.finishNode(elem, "TemplateElement"); + }; + + _proto.parseTemplate = function parseTemplate(isTagged) { + var node = this.startNode(); + this.next(); + node.expressions = []; + var curElt = this.parseTemplateElement(isTagged); + node.quasis = [curElt]; + + while (!curElt.tail) { + this.expect(types.dollarBraceL); + node.expressions.push(this.parseExpression()); + this.expect(types.braceR); + node.quasis.push(curElt = this.parseTemplateElement(isTagged)); + } + + this.next(); + return this.finishNode(node, "TemplateLiteral"); + }; + + _proto.parseObj = function parseObj(isPattern, refShorthandDefaultPos) { + var decorators = []; + var propHash = Object.create(null); + var first = true; + var node = this.startNode(); + node.properties = []; + this.next(); + var firstRestLocation = null; + + while (!this.eat(types.braceR)) { + if (first) { + first = false; + } else { + this.expect(types.comma); + if (this.eat(types.braceR)) break; + } + + if (this.match(types.at)) { + if (this.hasPlugin("decorators")) { + this.raise(this.state.start, "Stage 2 decorators disallow object literal property decorators"); + } else { + while (this.match(types.at)) { + decorators.push(this.parseDecorator()); + } + } + } + + var prop = this.startNode(), + isGenerator = false, + _isAsync = false, + startPos = void 0, + startLoc = void 0; + + if (decorators.length) { + prop.decorators = decorators; + decorators = []; + } + + if (this.match(types.ellipsis)) { + this.expectPlugin("objectRestSpread"); + prop = this.parseSpread(isPattern ? { + start: 0 + } : undefined); + + if (isPattern) { + this.toAssignable(prop, true, "object pattern"); + } + + node.properties.push(prop); + + if (isPattern) { + var position = this.state.start; + + if (firstRestLocation !== null) { + this.unexpected(firstRestLocation, "Cannot have multiple rest elements when destructuring"); + } else if (this.eat(types.braceR)) { + break; + } else if (this.match(types.comma) && this.lookahead().type === types.braceR) { + this.unexpected(position, "A trailing comma is not permitted after the rest element"); + } else { + firstRestLocation = position; + continue; + } + } else { + continue; + } + } + + prop.method = false; + + if (isPattern || refShorthandDefaultPos) { + startPos = this.state.start; + startLoc = this.state.startLoc; + } + + if (!isPattern) { + isGenerator = this.eat(types.star); + } + + var containsEsc = this.state.containsEsc; + + if (!isPattern && this.isContextual("async")) { + if (isGenerator) this.unexpected(); + var asyncId = this.parseIdentifier(); + + if (this.match(types.colon) || this.match(types.parenL) || this.match(types.braceR) || this.match(types.eq) || this.match(types.comma)) { + prop.key = asyncId; + prop.computed = false; + } else { + _isAsync = true; + + if (this.match(types.star)) { + this.expectPlugin("asyncGenerators"); + this.next(); + isGenerator = true; + } + + this.parsePropertyName(prop); + } + } else { + this.parsePropertyName(prop); + } + + this.parseObjPropValue(prop, startPos, startLoc, isGenerator, _isAsync, isPattern, refShorthandDefaultPos, containsEsc); + this.checkPropClash(prop, propHash); + + if (prop.shorthand) { + this.addExtra(prop, "shorthand", true); + } + + node.properties.push(prop); + } + + if (firstRestLocation !== null) { + this.unexpected(firstRestLocation, "The rest element has to be the last element when destructuring"); + } + + if (decorators.length) { + this.raise(this.state.start, "You have trailing decorators with no property"); + } + + return this.finishNode(node, isPattern ? "ObjectPattern" : "ObjectExpression"); + }; + + _proto.isGetterOrSetterMethod = function isGetterOrSetterMethod(prop, isPattern) { + return !isPattern && !prop.computed && prop.key.type === "Identifier" && (prop.key.name === "get" || prop.key.name === "set") && (this.match(types.string) || this.match(types.num) || this.match(types.bracketL) || this.match(types.name) || !!this.state.type.keyword); + }; + + _proto.checkGetterSetterParams = function checkGetterSetterParams(method) { + var paramCount = method.kind === "get" ? 0 : 1; + var start = method.start; + + if (method.params.length !== paramCount) { + if (method.kind === "get") { + this.raise(start, "getter must not have any formal parameters"); + } else { + this.raise(start, "setter must have exactly one formal parameter"); + } + } + + if (method.kind === "set" && method.params[0].type === "RestElement") { + this.raise(start, "setter function argument must not be a rest parameter"); + } + }; + + _proto.parseObjectMethod = function parseObjectMethod(prop, isGenerator, isAsync, isPattern, containsEsc) { + if (isAsync || isGenerator || this.match(types.parenL)) { + if (isPattern) this.unexpected(); + prop.kind = "method"; + prop.method = true; + return this.parseMethod(prop, isGenerator, isAsync, false, "ObjectMethod"); + } + + if (!containsEsc && this.isGetterOrSetterMethod(prop, isPattern)) { + if (isGenerator || isAsync) this.unexpected(); + prop.kind = prop.key.name; + this.parsePropertyName(prop); + this.parseMethod(prop, false, false, false, "ObjectMethod"); + this.checkGetterSetterParams(prop); + return prop; + } + }; + + _proto.parseObjectProperty = function parseObjectProperty(prop, startPos, startLoc, isPattern, refShorthandDefaultPos) { + prop.shorthand = false; + + if (this.eat(types.colon)) { + prop.value = isPattern ? this.parseMaybeDefault(this.state.start, this.state.startLoc) : this.parseMaybeAssign(false, refShorthandDefaultPos); + return this.finishNode(prop, "ObjectProperty"); + } + + if (!prop.computed && prop.key.type === "Identifier") { + this.checkReservedWord(prop.key.name, prop.key.start, true, true); + + if (isPattern) { + prop.value = this.parseMaybeDefault(startPos, startLoc, prop.key.__clone()); + } else if (this.match(types.eq) && refShorthandDefaultPos) { + if (!refShorthandDefaultPos.start) { + refShorthandDefaultPos.start = this.state.start; + } + + prop.value = this.parseMaybeDefault(startPos, startLoc, prop.key.__clone()); + } else { + prop.value = prop.key.__clone(); + } + + prop.shorthand = true; + return this.finishNode(prop, "ObjectProperty"); + } + }; + + _proto.parseObjPropValue = function parseObjPropValue(prop, startPos, startLoc, isGenerator, isAsync, isPattern, refShorthandDefaultPos, containsEsc) { + var node = this.parseObjectMethod(prop, isGenerator, isAsync, isPattern, containsEsc) || this.parseObjectProperty(prop, startPos, startLoc, isPattern, refShorthandDefaultPos); + if (!node) this.unexpected(); + return node; + }; + + _proto.parsePropertyName = function parsePropertyName(prop) { + if (this.eat(types.bracketL)) { + prop.computed = true; + prop.key = this.parseMaybeAssign(); + this.expect(types.bracketR); + } else { + var oldInPropertyName = this.state.inPropertyName; + this.state.inPropertyName = true; + prop.key = this.match(types.num) || this.match(types.string) ? this.parseExprAtom() : this.parseMaybePrivateName(); + + if (prop.key.type !== "PrivateName") { + prop.computed = false; + } + + this.state.inPropertyName = oldInPropertyName; + } + + return prop.key; + }; + + _proto.initFunction = function initFunction(node, isAsync) { + node.id = null; + node.generator = false; + node.async = !!isAsync; + }; + + _proto.parseMethod = function parseMethod(node, isGenerator, isAsync, isConstructor, type) { + var oldInFunc = this.state.inFunction; + var oldInMethod = this.state.inMethod; + var oldInGenerator = this.state.inGenerator; + this.state.inFunction = true; + this.state.inMethod = node.kind || true; + this.state.inGenerator = isGenerator; + this.initFunction(node, isAsync); + node.generator = !!isGenerator; + var allowModifiers = isConstructor; + this.parseFunctionParams(node, allowModifiers); + this.parseFunctionBodyAndFinish(node, type); + this.state.inFunction = oldInFunc; + this.state.inMethod = oldInMethod; + this.state.inGenerator = oldInGenerator; + return node; + }; + + _proto.parseArrowExpression = function parseArrowExpression(node, params, isAsync) { + if (this.state.yieldInPossibleArrowParameters) { + this.raise(this.state.yieldInPossibleArrowParameters.start, "yield is not allowed in the parameters of an arrow function" + " inside a generator"); + } + + var oldInFunc = this.state.inFunction; + this.state.inFunction = true; + this.initFunction(node, isAsync); + if (params) this.setArrowFunctionParameters(node, params); + var oldInGenerator = this.state.inGenerator; + var oldMaybeInArrowParameters = this.state.maybeInArrowParameters; + this.state.inGenerator = false; + this.state.maybeInArrowParameters = false; + this.parseFunctionBody(node, true); + this.state.inGenerator = oldInGenerator; + this.state.inFunction = oldInFunc; + this.state.maybeInArrowParameters = oldMaybeInArrowParameters; + return this.finishNode(node, "ArrowFunctionExpression"); + }; + + _proto.setArrowFunctionParameters = function setArrowFunctionParameters(node, params) { + node.params = this.toAssignableList(params, true, "arrow function parameters"); + }; + + _proto.isStrictBody = function isStrictBody(node) { + var isBlockStatement = node.body.type === "BlockStatement"; + + if (isBlockStatement && node.body.directives.length) { + for (var _i4 = 0, _node$body$directives2 = node.body.directives; _i4 < _node$body$directives2.length; _i4++) { + var directive = _node$body$directives2[_i4]; + + if (directive.value.value === "use strict") { + return true; + } + } + } + + return false; + }; + + _proto.parseFunctionBodyAndFinish = function parseFunctionBodyAndFinish(node, type, allowExpressionBody) { + this.parseFunctionBody(node, allowExpressionBody); + this.finishNode(node, type); + }; + + _proto.parseFunctionBody = function parseFunctionBody(node, allowExpression) { + var isExpression = allowExpression && !this.match(types.braceL); + var oldInParameters = this.state.inParameters; + var oldInAsync = this.state.inAsync; + this.state.inParameters = false; + this.state.inAsync = node.async; + + if (isExpression) { + node.body = this.parseMaybeAssign(); + } else { + var oldInGen = this.state.inGenerator; + var oldInFunc = this.state.inFunction; + var oldLabels = this.state.labels; + this.state.inGenerator = node.generator; + this.state.inFunction = true; + this.state.labels = []; + node.body = this.parseBlock(true); + this.state.inFunction = oldInFunc; + this.state.inGenerator = oldInGen; + this.state.labels = oldLabels; + } + + this.state.inAsync = oldInAsync; + this.checkFunctionNameAndParams(node, allowExpression); + this.state.inParameters = oldInParameters; + }; + + _proto.checkFunctionNameAndParams = function checkFunctionNameAndParams(node, isArrowFunction) { + var isStrict = this.isStrictBody(node); + var checkLVal = this.state.strict || isStrict || isArrowFunction; + var oldStrict = this.state.strict; + if (isStrict) this.state.strict = isStrict; + + if (checkLVal) { + var nameHash = Object.create(null); + + if (node.id) { + this.checkLVal(node.id, true, undefined, "function name"); + } + + for (var _i6 = 0, _node$params2 = node.params; _i6 < _node$params2.length; _i6++) { + var param = _node$params2[_i6]; + + if (isStrict && param.type !== "Identifier") { + this.raise(param.start, "Non-simple parameter in strict mode"); + } + + this.checkLVal(param, true, nameHash, "function parameter list"); + } + } + + this.state.strict = oldStrict; + }; + + _proto.parseExprList = function parseExprList(close, allowEmpty, refShorthandDefaultPos) { + var elts = []; + var first = true; + + while (!this.eat(close)) { + if (first) { + first = false; + } else { + this.expect(types.comma); + if (this.eat(close)) break; + } + + elts.push(this.parseExprListItem(allowEmpty, refShorthandDefaultPos)); + } + + return elts; + }; + + _proto.parseExprListItem = function parseExprListItem(allowEmpty, refShorthandDefaultPos, refNeedsArrowPos, refTrailingCommaPos) { + var elt; + + if (allowEmpty && this.match(types.comma)) { + elt = null; + } else if (this.match(types.ellipsis)) { + var spreadNodeStartPos = this.state.start; + var spreadNodeStartLoc = this.state.startLoc; + elt = this.parseParenItem(this.parseSpread(refShorthandDefaultPos, refNeedsArrowPos), spreadNodeStartPos, spreadNodeStartLoc); + + if (refTrailingCommaPos && this.match(types.comma)) { + refTrailingCommaPos.start = this.state.start; + } + } else { + elt = this.parseMaybeAssign(false, refShorthandDefaultPos, this.parseParenItem, refNeedsArrowPos); + } + + return elt; + }; + + _proto.parseIdentifier = function parseIdentifier(liberal) { + var node = this.startNode(); + var name = this.parseIdentifierName(node.start, liberal); + node.name = name; + node.loc.identifierName = name; + return this.finishNode(node, "Identifier"); + }; + + _proto.parseIdentifierName = function parseIdentifierName(pos, liberal) { + if (!liberal) { + this.checkReservedWord(this.state.value, this.state.start, !!this.state.type.keyword, false); + } + + var name; + + if (this.match(types.name)) { + name = this.state.value; + } else if (this.state.type.keyword) { + name = this.state.type.keyword; + } else { + throw this.unexpected(); + } + + if (!liberal && name === "await" && this.state.inAsync) { + this.raise(pos, "invalid use of await inside of an async function"); + } + + this.next(); + return name; + }; + + _proto.checkReservedWord = function checkReservedWord(word, startLoc, checkKeywords, isBinding) { + if (this.state.strict && (reservedWords.strict(word) || isBinding && reservedWords.strictBind(word))) { + this.raise(startLoc, word + " is a reserved word in strict mode"); + } + + if (this.state.inGenerator && word === "yield") { + this.raise(startLoc, "yield is a reserved word inside generator functions"); + } + + if (this.state.inClassProperty && word === "arguments") { + this.raise(startLoc, "'arguments' is not allowed in class field initializer"); + } + + if (this.isReservedWord(word) || checkKeywords && this.isKeyword(word)) { + this.raise(startLoc, word + " is a reserved word"); + } + }; + + _proto.parseAwait = function parseAwait(node) { + if (!this.state.inAsync && (this.state.inFunction || !this.options.allowAwaitOutsideFunction)) { + this.unexpected(); + } + + if (this.match(types.star)) { + this.raise(node.start, "await* has been removed from the async functions proposal. Use Promise.all() instead."); + } + + node.argument = this.parseMaybeUnary(); + return this.finishNode(node, "AwaitExpression"); + }; + + _proto.parseYield = function parseYield() { + var node = this.startNode(); + + if (this.state.inParameters) { + this.raise(node.start, "yield is not allowed in generator parameters"); + } + + if (this.state.maybeInArrowParameters && !this.state.yieldInPossibleArrowParameters) { + this.state.yieldInPossibleArrowParameters = node; + } + + this.next(); + + if (this.match(types.semi) || this.canInsertSemicolon() || !this.match(types.star) && !this.state.type.startsExpr) { + node.delegate = false; + node.argument = null; + } else { + node.delegate = this.eat(types.star); + node.argument = this.parseMaybeAssign(); + } + + return this.finishNode(node, "YieldExpression"); + }; + + _inheritsLoose(ExpressionParser, _LValParser); + + return ExpressionParser; +}(LValParser); + +var empty = []; +var loopLabel = { + kind: "loop" +}; +var switchLabel = { + kind: "switch" +}; + +var StatementParser = function (_ExpressionParser) { + function StatementParser() { + return _ExpressionParser.apply(this, arguments) || this; + } + + var _proto = StatementParser.prototype; + + _proto.parseTopLevel = function parseTopLevel(file, program) { + program.sourceType = this.options.sourceType; + this.parseBlockBody(program, true, true, types.eof); + file.program = this.finishNode(program, "Program"); + file.comments = this.state.comments; + if (this.options.tokens) file.tokens = this.state.tokens; + return this.finishNode(file, "File"); + }; + + _proto.stmtToDirective = function stmtToDirective(stmt) { + var expr = stmt.expression; + var directiveLiteral = this.startNodeAt(expr.start, expr.loc.start); + var directive = this.startNodeAt(stmt.start, stmt.loc.start); + var raw = this.input.slice(expr.start, expr.end); + var val = directiveLiteral.value = raw.slice(1, -1); + this.addExtra(directiveLiteral, "raw", raw); + this.addExtra(directiveLiteral, "rawValue", val); + directive.value = this.finishNodeAt(directiveLiteral, "DirectiveLiteral", expr.end, expr.loc.end); + return this.finishNodeAt(directive, "Directive", stmt.end, stmt.loc.end); + }; + + _proto.parseStatement = function parseStatement(declaration, topLevel) { + if (this.match(types.at)) { + this.parseDecorators(true); + } + + return this.parseStatementContent(declaration, topLevel); + }; + + _proto.parseStatementContent = function parseStatementContent(declaration, topLevel) { + var starttype = this.state.type; + var node = this.startNode(); + + switch (starttype) { + case types._break: + case types._continue: + return this.parseBreakContinueStatement(node, starttype.keyword); + + case types._debugger: + return this.parseDebuggerStatement(node); + + case types._do: + return this.parseDoStatement(node); + + case types._for: + return this.parseForStatement(node); + + case types._function: + if (this.lookahead().type === types.dot) break; + if (!declaration) this.unexpected(); + return this.parseFunctionStatement(node); + + case types._class: + if (!declaration) this.unexpected(); + return this.parseClass(node, true); + + case types._if: + return this.parseIfStatement(node); + + case types._return: + return this.parseReturnStatement(node); + + case types._switch: + return this.parseSwitchStatement(node); + + case types._throw: + return this.parseThrowStatement(node); + + case types._try: + return this.parseTryStatement(node); + + case types._let: + case types._const: + if (!declaration) this.unexpected(); + + case types._var: + return this.parseVarStatement(node, starttype); + + case types._while: + return this.parseWhileStatement(node); + + case types._with: + return this.parseWithStatement(node); + + case types.braceL: + return this.parseBlock(); + + case types.semi: + return this.parseEmptyStatement(node); + + case types._export: + case types._import: + { + var nextToken = this.lookahead(); + + if (nextToken.type === types.parenL || nextToken.type === types.dot) { + break; + } + + if (!this.options.allowImportExportEverywhere && !topLevel) { + this.raise(this.state.start, "'import' and 'export' may only appear at the top level"); + } + + this.next(); + var result; + + if (starttype == types._import) { + result = this.parseImport(node); + + if (result.type === "ImportDeclaration" && (!result.importKind || result.importKind === "value")) { + this.sawUnambiguousESM = true; + } + } else { + result = this.parseExport(node); + + if (result.type === "ExportNamedDeclaration" && (!result.exportKind || result.exportKind === "value") || result.type === "ExportAllDeclaration" && (!result.exportKind || result.exportKind === "value") || result.type === "ExportDefaultDeclaration") { + this.sawUnambiguousESM = true; + } + } + + this.assertModuleNodeAllowed(node); + return result; + } + + case types.name: + if (this.isContextual("async")) { + var state = this.state.clone(); + this.next(); + + if (this.match(types._function) && !this.canInsertSemicolon()) { + this.expect(types._function); + return this.parseFunction(node, true, false, true); + } else { + this.state = state; + } + } + + } + + var maybeName = this.state.value; + var expr = this.parseExpression(); + + if (starttype === types.name && expr.type === "Identifier" && this.eat(types.colon)) { + return this.parseLabeledStatement(node, maybeName, expr); + } else { + return this.parseExpressionStatement(node, expr); + } + }; + + _proto.assertModuleNodeAllowed = function assertModuleNodeAllowed(node) { + if (!this.options.allowImportExportEverywhere && !this.inModule) { + this.raise(node.start, "'import' and 'export' may appear only with 'sourceType: \"module\"'", { + code: "BABEL_PARSER_SOURCETYPE_MODULE_REQUIRED" + }); + } + }; + + _proto.takeDecorators = function takeDecorators(node) { + var decorators = this.state.decoratorStack[this.state.decoratorStack.length - 1]; + + if (decorators.length) { + node.decorators = decorators; + this.resetStartLocationFromNode(node, decorators[0]); + this.state.decoratorStack[this.state.decoratorStack.length - 1] = []; + } + }; + + _proto.canHaveLeadingDecorator = function canHaveLeadingDecorator() { + return this.match(types._class); + }; + + _proto.parseDecorators = function parseDecorators(allowExport) { + if (this.hasPlugin("decorators")) { + allowExport = false; + } + + var currentContextDecorators = this.state.decoratorStack[this.state.decoratorStack.length - 1]; + + while (this.match(types.at)) { + var decorator = this.parseDecorator(); + currentContextDecorators.push(decorator); + } + + if (this.match(types._export)) { + if (allowExport) { + return; + } else { + this.raise(this.state.start, "Using the export keyword between a decorator and a class is not allowed. " + "Please use `export @dec class` instead"); + } + } + + if (!this.canHaveLeadingDecorator()) { + this.raise(this.state.start, "Leading decorators must be attached to a class declaration"); + } + }; + + _proto.parseDecorator = function parseDecorator() { + this.expectOnePlugin(["decorators-legacy", "decorators"]); + var node = this.startNode(); + this.next(); + + if (this.hasPlugin("decorators")) { + this.state.decoratorStack.push([]); + + if (this.eat(types.parenL)) { + node.callee = this.parseExpression(); + this.expect(types.parenR); + } else { + var startPos = this.state.start; + var startLoc = this.state.startLoc; + var expr = this.parseIdentifier(false); + + while (this.eat(types.dot)) { + var _node = this.startNodeAt(startPos, startLoc); + + _node.object = expr; + _node.property = this.parseIdentifier(true); + _node.computed = false; + expr = this.finishNode(_node, "MemberExpression"); + } + + node.callee = expr; + } + + if (this.eat(types.parenL)) { + node.arguments = this.parseCallExpressionArguments(types.parenR, false); + this.toReferencedList(node.arguments); + } + + this.state.decoratorStack.pop(); + } else { + node.callee = this.parseMaybeAssign(); + } + + return this.finishNode(node, "Decorator"); + }; + + _proto.parseBreakContinueStatement = function parseBreakContinueStatement(node, keyword) { + var isBreak = keyword === "break"; + this.next(); + + if (this.isLineTerminator()) { + node.label = null; + } else if (!this.match(types.name)) { + this.unexpected(); + } else { + node.label = this.parseIdentifier(); + this.semicolon(); + } + + var i; + + for (i = 0; i < this.state.labels.length; ++i) { + var lab = this.state.labels[i]; + + if (node.label == null || lab.name === node.label.name) { + if (lab.kind != null && (isBreak || lab.kind === "loop")) break; + if (node.label && isBreak) break; + } + } + + if (i === this.state.labels.length) { + this.raise(node.start, "Unsyntactic " + keyword); + } + + return this.finishNode(node, isBreak ? "BreakStatement" : "ContinueStatement"); + }; + + _proto.parseDebuggerStatement = function parseDebuggerStatement(node) { + this.next(); + this.semicolon(); + return this.finishNode(node, "DebuggerStatement"); + }; + + _proto.parseDoStatement = function parseDoStatement(node) { + this.next(); + this.state.labels.push(loopLabel); + node.body = this.parseStatement(false); + this.state.labels.pop(); + this.expect(types._while); + node.test = this.parseParenExpression(); + this.eat(types.semi); + return this.finishNode(node, "DoWhileStatement"); + }; + + _proto.parseForStatement = function parseForStatement(node) { + this.next(); + this.state.labels.push(loopLabel); + var forAwait = false; + + if (this.state.inAsync && this.isContextual("await")) { + this.expectPlugin("asyncGenerators"); + forAwait = true; + this.next(); + } + + this.expect(types.parenL); + + if (this.match(types.semi)) { + if (forAwait) { + this.unexpected(); + } + + return this.parseFor(node, null); + } + + if (this.match(types._var) || this.match(types._let) || this.match(types._const)) { + var _init = this.startNode(); + + var varKind = this.state.type; + this.next(); + this.parseVar(_init, true, varKind); + this.finishNode(_init, "VariableDeclaration"); + + if (this.match(types._in) || this.isContextual("of")) { + if (_init.declarations.length === 1) { + var declaration = _init.declarations[0]; + var isForInInitializer = varKind === types._var && declaration.init && declaration.id.type != "ObjectPattern" && declaration.id.type != "ArrayPattern" && !this.isContextual("of"); + + if (this.state.strict && isForInInitializer) { + this.raise(this.state.start, "for-in initializer in strict mode"); + } else if (isForInInitializer || !declaration.init) { + return this.parseForIn(node, _init, forAwait); + } + } + } + + if (forAwait) { + this.unexpected(); + } + + return this.parseFor(node, _init); + } + + var refShorthandDefaultPos = { + start: 0 + }; + var init = this.parseExpression(true, refShorthandDefaultPos); + + if (this.match(types._in) || this.isContextual("of")) { + var description = this.isContextual("of") ? "for-of statement" : "for-in statement"; + this.toAssignable(init, undefined, description); + this.checkLVal(init, undefined, undefined, description); + return this.parseForIn(node, init, forAwait); + } else if (refShorthandDefaultPos.start) { + this.unexpected(refShorthandDefaultPos.start); + } + + if (forAwait) { + this.unexpected(); + } + + return this.parseFor(node, init); + }; + + _proto.parseFunctionStatement = function parseFunctionStatement(node) { + this.next(); + return this.parseFunction(node, true); + }; + + _proto.parseIfStatement = function parseIfStatement(node) { + this.next(); + node.test = this.parseParenExpression(); + node.consequent = this.parseStatement(false); + node.alternate = this.eat(types._else) ? this.parseStatement(false) : null; + return this.finishNode(node, "IfStatement"); + }; + + _proto.parseReturnStatement = function parseReturnStatement(node) { + if (!this.state.inFunction && !this.options.allowReturnOutsideFunction) { + this.raise(this.state.start, "'return' outside of function"); + } + + this.next(); + + if (this.isLineTerminator()) { + node.argument = null; + } else { + node.argument = this.parseExpression(); + this.semicolon(); + } + + return this.finishNode(node, "ReturnStatement"); + }; + + _proto.parseSwitchStatement = function parseSwitchStatement(node) { + this.next(); + node.discriminant = this.parseParenExpression(); + var cases = node.cases = []; + this.expect(types.braceL); + this.state.labels.push(switchLabel); + var cur; + + for (var sawDefault; !this.match(types.braceR);) { + if (this.match(types._case) || this.match(types._default)) { + var isCase = this.match(types._case); + if (cur) this.finishNode(cur, "SwitchCase"); + cases.push(cur = this.startNode()); + cur.consequent = []; + this.next(); + + if (isCase) { + cur.test = this.parseExpression(); + } else { + if (sawDefault) { + this.raise(this.state.lastTokStart, "Multiple default clauses"); + } + + sawDefault = true; + cur.test = null; + } + + this.expect(types.colon); + } else { + if (cur) { + cur.consequent.push(this.parseStatement(true)); + } else { + this.unexpected(); + } + } + } + + if (cur) this.finishNode(cur, "SwitchCase"); + this.next(); + this.state.labels.pop(); + return this.finishNode(node, "SwitchStatement"); + }; + + _proto.parseThrowStatement = function parseThrowStatement(node) { + this.next(); + + if (lineBreak.test(this.input.slice(this.state.lastTokEnd, this.state.start))) { + this.raise(this.state.lastTokEnd, "Illegal newline after throw"); + } + + node.argument = this.parseExpression(); + this.semicolon(); + return this.finishNode(node, "ThrowStatement"); + }; + + _proto.parseTryStatement = function parseTryStatement(node) { + this.next(); + node.block = this.parseBlock(); + node.handler = null; + + if (this.match(types._catch)) { + var clause = this.startNode(); + this.next(); + + if (this.match(types.parenL)) { + this.expect(types.parenL); + clause.param = this.parseBindingAtom(); + var clashes = Object.create(null); + this.checkLVal(clause.param, true, clashes, "catch clause"); + this.expect(types.parenR); + } else { + this.expectPlugin("optionalCatchBinding"); + clause.param = null; + } + + clause.body = this.parseBlock(); + node.handler = this.finishNode(clause, "CatchClause"); + } + + node.guardedHandlers = empty; + node.finalizer = this.eat(types._finally) ? this.parseBlock() : null; + + if (!node.handler && !node.finalizer) { + this.raise(node.start, "Missing catch or finally clause"); + } + + return this.finishNode(node, "TryStatement"); + }; + + _proto.parseVarStatement = function parseVarStatement(node, kind) { + this.next(); + this.parseVar(node, false, kind); + this.semicolon(); + return this.finishNode(node, "VariableDeclaration"); + }; + + _proto.parseWhileStatement = function parseWhileStatement(node) { + this.next(); + node.test = this.parseParenExpression(); + this.state.labels.push(loopLabel); + node.body = this.parseStatement(false); + this.state.labels.pop(); + return this.finishNode(node, "WhileStatement"); + }; + + _proto.parseWithStatement = function parseWithStatement(node) { + if (this.state.strict) { + this.raise(this.state.start, "'with' in strict mode"); + } + + this.next(); + node.object = this.parseParenExpression(); + node.body = this.parseStatement(false); + return this.finishNode(node, "WithStatement"); + }; + + _proto.parseEmptyStatement = function parseEmptyStatement(node) { + this.next(); + return this.finishNode(node, "EmptyStatement"); + }; + + _proto.parseLabeledStatement = function parseLabeledStatement(node, maybeName, expr) { + for (var _i2 = 0, _this$state$labels2 = this.state.labels; _i2 < _this$state$labels2.length; _i2++) { + var label = _this$state$labels2[_i2]; + + if (label.name === maybeName) { + this.raise(expr.start, "Label '" + maybeName + "' is already declared"); + } + } + + var kind = this.state.type.isLoop ? "loop" : this.match(types._switch) ? "switch" : null; + + for (var i = this.state.labels.length - 1; i >= 0; i--) { + var _label = this.state.labels[i]; + + if (_label.statementStart === node.start) { + _label.statementStart = this.state.start; + _label.kind = kind; + } else { + break; + } + } + + this.state.labels.push({ + name: maybeName, + kind: kind, + statementStart: this.state.start + }); + node.body = this.parseStatement(true); + + if (node.body.type == "ClassDeclaration" || node.body.type == "VariableDeclaration" && node.body.kind !== "var" || node.body.type == "FunctionDeclaration" && (this.state.strict || node.body.generator || node.body.async)) { + this.raise(node.body.start, "Invalid labeled declaration"); + } + + this.state.labels.pop(); + node.label = expr; + return this.finishNode(node, "LabeledStatement"); + }; + + _proto.parseExpressionStatement = function parseExpressionStatement(node, expr) { + node.expression = expr; + this.semicolon(); + return this.finishNode(node, "ExpressionStatement"); + }; + + _proto.parseBlock = function parseBlock(allowDirectives) { + var node = this.startNode(); + this.expect(types.braceL); + this.parseBlockBody(node, allowDirectives, false, types.braceR); + return this.finishNode(node, "BlockStatement"); + }; + + _proto.isValidDirective = function isValidDirective(stmt) { + return stmt.type === "ExpressionStatement" && stmt.expression.type === "StringLiteral" && !stmt.expression.extra.parenthesized; + }; + + _proto.parseBlockBody = function parseBlockBody(node, allowDirectives, topLevel, end) { + var body = node.body = []; + var directives = node.directives = []; + this.parseBlockOrModuleBlockBody(body, allowDirectives ? directives : undefined, topLevel, end); + }; + + _proto.parseBlockOrModuleBlockBody = function parseBlockOrModuleBlockBody(body, directives, topLevel, end) { + var parsedNonDirective = false; + var oldStrict; + var octalPosition; + + while (!this.eat(end)) { + if (!parsedNonDirective && this.state.containsOctal && !octalPosition) { + octalPosition = this.state.octalPosition; + } + + var stmt = this.parseStatement(true, topLevel); + + if (directives && !parsedNonDirective && this.isValidDirective(stmt)) { + var directive = this.stmtToDirective(stmt); + directives.push(directive); + + if (oldStrict === undefined && directive.value.value === "use strict") { + oldStrict = this.state.strict; + this.setStrict(true); + + if (octalPosition) { + this.raise(octalPosition, "Octal literal in strict mode"); + } + } + + continue; + } + + parsedNonDirective = true; + body.push(stmt); + } + + if (oldStrict === false) { + this.setStrict(false); + } + }; + + _proto.parseFor = function parseFor(node, init) { + node.init = init; + this.expect(types.semi); + node.test = this.match(types.semi) ? null : this.parseExpression(); + this.expect(types.semi); + node.update = this.match(types.parenR) ? null : this.parseExpression(); + this.expect(types.parenR); + node.body = this.parseStatement(false); + this.state.labels.pop(); + return this.finishNode(node, "ForStatement"); + }; + + _proto.parseForIn = function parseForIn(node, init, forAwait) { + var type = this.match(types._in) ? "ForInStatement" : "ForOfStatement"; + + if (forAwait) { + this.eatContextual("of"); + } else { + this.next(); + } + + if (type === "ForOfStatement") { + node.await = !!forAwait; + } + + node.left = init; + node.right = this.parseExpression(); + this.expect(types.parenR); + node.body = this.parseStatement(false); + this.state.labels.pop(); + return this.finishNode(node, type); + }; + + _proto.parseVar = function parseVar(node, isFor, kind) { + var declarations = node.declarations = []; + node.kind = kind.keyword; + + for (;;) { + var decl = this.startNode(); + this.parseVarHead(decl); + + if (this.eat(types.eq)) { + decl.init = this.parseMaybeAssign(isFor); + } else { + if (kind === types._const && !(this.match(types._in) || this.isContextual("of"))) { + if (!this.hasPlugin("typescript")) { + this.unexpected(); + } + } else if (decl.id.type !== "Identifier" && !(isFor && (this.match(types._in) || this.isContextual("of")))) { + this.raise(this.state.lastTokEnd, "Complex binding patterns require an initialization value"); + } + + decl.init = null; + } + + declarations.push(this.finishNode(decl, "VariableDeclarator")); + if (!this.eat(types.comma)) break; + } + + return node; + }; + + _proto.parseVarHead = function parseVarHead(decl) { + decl.id = this.parseBindingAtom(); + this.checkLVal(decl.id, true, undefined, "variable declaration"); + }; + + _proto.parseFunction = function parseFunction(node, isStatement, allowExpressionBody, isAsync, optionalId) { + var oldInFunc = this.state.inFunction; + var oldInMethod = this.state.inMethod; + var oldInGenerator = this.state.inGenerator; + var oldInClassProperty = this.state.inClassProperty; + this.state.inFunction = true; + this.state.inMethod = false; + this.state.inClassProperty = false; + this.initFunction(node, isAsync); + + if (this.match(types.star)) { + if (node.async) { + this.expectPlugin("asyncGenerators"); + } + + node.generator = true; + this.next(); + } + + if (isStatement && !optionalId && !this.match(types.name) && !this.match(types._yield)) { + this.unexpected(); + } + + if (!isStatement) this.state.inGenerator = node.generator; + + if (this.match(types.name) || this.match(types._yield)) { + node.id = this.parseBindingIdentifier(); + } + + if (isStatement) this.state.inGenerator = node.generator; + this.parseFunctionParams(node); + this.parseFunctionBodyAndFinish(node, isStatement ? "FunctionDeclaration" : "FunctionExpression", allowExpressionBody); + this.state.inFunction = oldInFunc; + this.state.inMethod = oldInMethod; + this.state.inGenerator = oldInGenerator; + this.state.inClassProperty = oldInClassProperty; + return node; + }; + + _proto.parseFunctionParams = function parseFunctionParams(node, allowModifiers) { + var oldInParameters = this.state.inParameters; + this.state.inParameters = true; + this.expect(types.parenL); + node.params = this.parseBindingList(types.parenR, false, allowModifiers); + this.state.inParameters = oldInParameters; + }; + + _proto.parseClass = function parseClass(node, isStatement, optionalId) { + this.next(); + this.takeDecorators(node); + this.parseClassId(node, isStatement, optionalId); + this.parseClassSuper(node); + this.parseClassBody(node); + return this.finishNode(node, isStatement ? "ClassDeclaration" : "ClassExpression"); + }; + + _proto.isClassProperty = function isClassProperty() { + return this.match(types.eq) || this.match(types.semi) || this.match(types.braceR); + }; + + _proto.isClassMethod = function isClassMethod() { + return this.match(types.parenL); + }; + + _proto.isNonstaticConstructor = function isNonstaticConstructor(method) { + return !method.computed && !method.static && (method.key.name === "constructor" || method.key.value === "constructor"); + }; + + _proto.parseClassBody = function parseClassBody(node) { + var oldStrict = this.state.strict; + this.state.strict = true; + this.state.classLevel++; + var state = { + hadConstructor: false + }; + var decorators = []; + var classBody = this.startNode(); + classBody.body = []; + this.expect(types.braceL); + + while (!this.eat(types.braceR)) { + if (this.eat(types.semi)) { + if (decorators.length > 0) { + this.raise(this.state.lastTokEnd, "Decorators must not be followed by a semicolon"); + } + + continue; + } + + if (this.match(types.at)) { + decorators.push(this.parseDecorator()); + continue; + } + + var member = this.startNode(); + + if (decorators.length) { + member.decorators = decorators; + this.resetStartLocationFromNode(member, decorators[0]); + decorators = []; + } + + this.parseClassMember(classBody, member, state); + + if (member.kind === "constructor" && member.decorators && member.decorators.length > 0) { + this.raise(member.start, "Decorators can't be used with a constructor. Did you mean '@dec class { ... }'?"); + } + } + + if (decorators.length) { + this.raise(this.state.start, "You have trailing decorators with no method"); + } + + node.body = this.finishNode(classBody, "ClassBody"); + this.state.classLevel--; + this.state.strict = oldStrict; + }; + + _proto.parseClassMember = function parseClassMember(classBody, member, state) { + var isStatic = false; + var containsEsc = this.state.containsEsc; + + if (this.match(types.name) && this.state.value === "static") { + var key = this.parseIdentifier(true); + + if (this.isClassMethod()) { + var method = member; + method.kind = "method"; + method.computed = false; + method.key = key; + method.static = false; + this.pushClassMethod(classBody, method, false, false, false); + return; + } else if (this.isClassProperty()) { + var prop = member; + prop.computed = false; + prop.key = key; + prop.static = false; + classBody.body.push(this.parseClassProperty(prop)); + return; + } else if (containsEsc) { + throw this.unexpected(); + } + + isStatic = true; + } + + this.parseClassMemberWithIsStatic(classBody, member, state, isStatic); + }; + + _proto.parseClassMemberWithIsStatic = function parseClassMemberWithIsStatic(classBody, member, state, isStatic) { + var publicMethod = member; + var privateMethod = member; + var publicProp = member; + var privateProp = member; + var method = publicMethod; + var publicMember = publicMethod; + member.static = isStatic; + + if (this.eat(types.star)) { + method.kind = "method"; + this.parseClassPropertyName(method); + + if (method.key.type === "PrivateName") { + this.pushClassPrivateMethod(classBody, privateMethod, true, false); + return; + } + + if (this.isNonstaticConstructor(publicMethod)) { + this.raise(publicMethod.key.start, "Constructor can't be a generator"); + } + + this.pushClassMethod(classBody, publicMethod, true, false, false); + return; + } + + var key = this.parseClassPropertyName(member); + var isPrivate = key.type === "PrivateName"; + var isSimple = key.type === "Identifier"; + this.parsePostMemberNameModifiers(publicMember); + + if (this.isClassMethod()) { + method.kind = "method"; + + if (isPrivate) { + this.pushClassPrivateMethod(classBody, privateMethod, false, false); + return; + } + + var isConstructor = this.isNonstaticConstructor(publicMethod); + + if (isConstructor) { + publicMethod.kind = "constructor"; + + if (publicMethod.decorators) { + this.raise(publicMethod.start, "You can't attach decorators to a class constructor"); + } + + if (state.hadConstructor && !this.hasPlugin("typescript")) { + this.raise(key.start, "Duplicate constructor in the same class"); + } + + state.hadConstructor = true; + } + + this.pushClassMethod(classBody, publicMethod, false, false, isConstructor); + } else if (this.isClassProperty()) { + if (isPrivate) { + this.pushClassPrivateProperty(classBody, privateProp); + } else { + this.pushClassProperty(classBody, publicProp); + } + } else if (isSimple && key.name === "async" && !this.isLineTerminator()) { + var isGenerator = this.match(types.star); + + if (isGenerator) { + this.expectPlugin("asyncGenerators"); + this.next(); + } + + method.kind = "method"; + this.parseClassPropertyName(method); + + if (method.key.type === "PrivateName") { + this.pushClassPrivateMethod(classBody, privateMethod, isGenerator, true); + } else { + if (this.isNonstaticConstructor(publicMethod)) { + this.raise(publicMethod.key.start, "Constructor can't be an async function"); + } + + this.pushClassMethod(classBody, publicMethod, isGenerator, true, false); + } + } else if (isSimple && (key.name === "get" || key.name === "set") && !(this.isLineTerminator() && this.match(types.star))) { + method.kind = key.name; + this.parseClassPropertyName(publicMethod); + + if (method.key.type === "PrivateName") { + this.pushClassPrivateMethod(classBody, privateMethod, false, false); + } else { + if (this.isNonstaticConstructor(publicMethod)) { + this.raise(publicMethod.key.start, "Constructor can't have get/set modifier"); + } + + this.pushClassMethod(classBody, publicMethod, false, false, false); + } + + this.checkGetterSetterParams(publicMethod); + } else if (this.isLineTerminator()) { + if (isPrivate) { + this.pushClassPrivateProperty(classBody, privateProp); + } else { + this.pushClassProperty(classBody, publicProp); + } + } else { + this.unexpected(); + } + }; + + _proto.parseClassPropertyName = function parseClassPropertyName(member) { + var key = this.parsePropertyName(member); + + if (!member.computed && member.static && (key.name === "prototype" || key.value === "prototype")) { + this.raise(key.start, "Classes may not have static property named prototype"); + } + + if (key.type === "PrivateName" && key.id.name === "constructor") { + this.raise(key.start, "Classes may not have a private field named '#constructor'"); + } + + return key; + }; + + _proto.pushClassProperty = function pushClassProperty(classBody, prop) { + if (this.isNonstaticConstructor(prop)) { + this.raise(prop.key.start, "Classes may not have a non-static field named 'constructor'"); + } + + classBody.body.push(this.parseClassProperty(prop)); + }; + + _proto.pushClassPrivateProperty = function pushClassPrivateProperty(classBody, prop) { + this.expectPlugin("classPrivateProperties", prop.key.start); + classBody.body.push(this.parseClassPrivateProperty(prop)); + }; + + _proto.pushClassMethod = function pushClassMethod(classBody, method, isGenerator, isAsync, isConstructor) { + classBody.body.push(this.parseMethod(method, isGenerator, isAsync, isConstructor, "ClassMethod")); + }; + + _proto.pushClassPrivateMethod = function pushClassPrivateMethod(classBody, method, isGenerator, isAsync) { + this.expectPlugin("classPrivateMethods", method.key.start); + classBody.body.push(this.parseMethod(method, isGenerator, isAsync, false, "ClassPrivateMethod")); + }; + + _proto.parsePostMemberNameModifiers = function parsePostMemberNameModifiers(methodOrProp) {}; + + _proto.parseAccessModifier = function parseAccessModifier() { + return undefined; + }; + + _proto.parseClassPrivateProperty = function parseClassPrivateProperty(node) { + var oldInMethod = this.state.inMethod; + this.state.inMethod = false; + this.state.inClassProperty = true; + node.value = this.eat(types.eq) ? this.parseMaybeAssign() : null; + this.semicolon(); + this.state.inClassProperty = false; + this.state.inMethod = oldInMethod; + return this.finishNode(node, "ClassPrivateProperty"); + }; + + _proto.parseClassProperty = function parseClassProperty(node) { + if (!node.typeAnnotation) { + this.expectPlugin("classProperties"); + } + + var oldInMethod = this.state.inMethod; + this.state.inMethod = false; + this.state.inClassProperty = true; + + if (this.match(types.eq)) { + this.expectPlugin("classProperties"); + this.next(); + node.value = this.parseMaybeAssign(); + } else { + node.value = null; + } + + this.semicolon(); + this.state.inClassProperty = false; + this.state.inMethod = oldInMethod; + return this.finishNode(node, "ClassProperty"); + }; + + _proto.parseClassId = function parseClassId(node, isStatement, optionalId) { + if (this.match(types.name)) { + node.id = this.parseIdentifier(); + } else { + if (optionalId || !isStatement) { + node.id = null; + } else { + this.unexpected(null, "A class name is required"); + } + } + }; + + _proto.parseClassSuper = function parseClassSuper(node) { + node.superClass = this.eat(types._extends) ? this.parseExprSubscripts() : null; + }; + + _proto.parseExport = function parseExport(node) { + if (this.shouldParseExportStar()) { + this.parseExportStar(node); + if (node.type === "ExportAllDeclaration") return node; + } else if (this.isExportDefaultSpecifier()) { + this.expectPlugin("exportDefaultFrom"); + var specifier = this.startNode(); + specifier.exported = this.parseIdentifier(true); + var specifiers = [this.finishNode(specifier, "ExportDefaultSpecifier")]; + node.specifiers = specifiers; + + if (this.match(types.comma) && this.lookahead().type === types.star) { + this.expect(types.comma); + + var _specifier = this.startNode(); + + this.expect(types.star); + this.expectContextual("as"); + _specifier.exported = this.parseIdentifier(); + specifiers.push(this.finishNode(_specifier, "ExportNamespaceSpecifier")); + } else { + this.parseExportSpecifiersMaybe(node); + } + + this.parseExportFrom(node, true); + } else if (this.eat(types._default)) { + node.declaration = this.parseExportDefaultExpression(); + this.checkExport(node, true, true); + return this.finishNode(node, "ExportDefaultDeclaration"); + } else if (this.shouldParseExportDeclaration()) { + if (this.isContextual("async")) { + var next = this.lookahead(); + + if (next.type !== types._function) { + this.unexpected(next.start, "Unexpected token, expected \"function\""); + } + } + + node.specifiers = []; + node.source = null; + node.declaration = this.parseExportDeclaration(node); + } else { + node.declaration = null; + node.specifiers = this.parseExportSpecifiers(); + this.parseExportFrom(node); + } + + this.checkExport(node, true); + return this.finishNode(node, "ExportNamedDeclaration"); + }; + + _proto.parseExportDefaultExpression = function parseExportDefaultExpression() { + var expr = this.startNode(); + + if (this.eat(types._function)) { + return this.parseFunction(expr, true, false, false, true); + } else if (this.isContextual("async") && this.lookahead().type === types._function) { + this.eatContextual("async"); + this.eat(types._function); + return this.parseFunction(expr, true, false, true, true); + } else if (this.match(types._class)) { + return this.parseClass(expr, true, true); + } else if (this.match(types.at)) { + this.parseDecorators(false); + return this.parseClass(expr, true, true); + } else if (this.match(types._let) || this.match(types._const) || this.match(types._var)) { + return this.raise(this.state.start, "Only expressions, functions or classes are allowed as the `default` export."); + } else { + var res = this.parseMaybeAssign(); + this.semicolon(); + return res; + } + }; + + _proto.parseExportDeclaration = function parseExportDeclaration(node) { + return this.parseStatement(true); + }; + + _proto.isExportDefaultSpecifier = function isExportDefaultSpecifier() { + if (this.match(types.name)) { + return this.state.value !== "async"; + } + + if (!this.match(types._default)) { + return false; + } + + var lookahead = this.lookahead(); + return lookahead.type === types.comma || lookahead.type === types.name && lookahead.value === "from"; + }; + + _proto.parseExportSpecifiersMaybe = function parseExportSpecifiersMaybe(node) { + if (this.eat(types.comma)) { + node.specifiers = node.specifiers.concat(this.parseExportSpecifiers()); + } + }; + + _proto.parseExportFrom = function parseExportFrom(node, expect) { + if (this.eatContextual("from")) { + node.source = this.match(types.string) ? this.parseExprAtom() : this.unexpected(); + this.checkExport(node); + } else { + if (expect) { + this.unexpected(); + } else { + node.source = null; + } + } + + this.semicolon(); + }; + + _proto.shouldParseExportStar = function shouldParseExportStar() { + return this.match(types.star); + }; + + _proto.parseExportStar = function parseExportStar(node) { + this.expect(types.star); + + if (this.isContextual("as")) { + this.parseExportNamespace(node); + } else { + this.parseExportFrom(node, true); + this.finishNode(node, "ExportAllDeclaration"); + } + }; + + _proto.parseExportNamespace = function parseExportNamespace(node) { + this.expectPlugin("exportNamespaceFrom"); + var specifier = this.startNodeAt(this.state.lastTokStart, this.state.lastTokStartLoc); + this.next(); + specifier.exported = this.parseIdentifier(true); + node.specifiers = [this.finishNode(specifier, "ExportNamespaceSpecifier")]; + this.parseExportSpecifiersMaybe(node); + this.parseExportFrom(node, true); + }; + + _proto.shouldParseExportDeclaration = function shouldParseExportDeclaration() { + return this.state.type.keyword === "var" || this.state.type.keyword === "const" || this.state.type.keyword === "let" || this.state.type.keyword === "function" || this.state.type.keyword === "class" || this.isContextual("async") || this.match(types.at) && this.expectPlugin("decorators"); + }; + + _proto.checkExport = function checkExport(node, checkNames, isDefault) { + if (checkNames) { + if (isDefault) { + this.checkDuplicateExports(node, "default"); + } else if (node.specifiers && node.specifiers.length) { + for (var _i4 = 0, _node$specifiers2 = node.specifiers; _i4 < _node$specifiers2.length; _i4++) { + var specifier = _node$specifiers2[_i4]; + this.checkDuplicateExports(specifier, specifier.exported.name); + } + } else if (node.declaration) { + if (node.declaration.type === "FunctionDeclaration" || node.declaration.type === "ClassDeclaration") { + var id = node.declaration.id; + if (!id) throw new Error("Assertion failure"); + this.checkDuplicateExports(node, id.name); + } else if (node.declaration.type === "VariableDeclaration") { + for (var _i6 = 0, _node$declaration$dec2 = node.declaration.declarations; _i6 < _node$declaration$dec2.length; _i6++) { + var declaration = _node$declaration$dec2[_i6]; + this.checkDeclaration(declaration.id); + } + } + } + } + + var currentContextDecorators = this.state.decoratorStack[this.state.decoratorStack.length - 1]; + + if (currentContextDecorators.length) { + var isClass = node.declaration && (node.declaration.type === "ClassDeclaration" || node.declaration.type === "ClassExpression"); + + if (!node.declaration || !isClass) { + throw this.raise(node.start, "You can only use decorators on an export when exporting a class"); + } + + this.takeDecorators(node.declaration); + } + }; + + _proto.checkDeclaration = function checkDeclaration(node) { + if (node.type === "ObjectPattern") { + for (var _i8 = 0, _node$properties2 = node.properties; _i8 < _node$properties2.length; _i8++) { + var prop = _node$properties2[_i8]; + this.checkDeclaration(prop); + } + } else if (node.type === "ArrayPattern") { + for (var _i10 = 0, _node$elements2 = node.elements; _i10 < _node$elements2.length; _i10++) { + var elem = _node$elements2[_i10]; + + if (elem) { + this.checkDeclaration(elem); + } + } + } else if (node.type === "ObjectProperty") { + this.checkDeclaration(node.value); + } else if (node.type === "RestElement") { + this.checkDeclaration(node.argument); + } else if (node.type === "Identifier") { + this.checkDuplicateExports(node, node.name); + } + }; + + _proto.checkDuplicateExports = function checkDuplicateExports(node, name) { + if (this.state.exportedIdentifiers.indexOf(name) > -1) { + this.raiseDuplicateExportError(node, name); + } + + this.state.exportedIdentifiers.push(name); + }; + + _proto.raiseDuplicateExportError = function raiseDuplicateExportError(node, name) { + throw this.raise(node.start, name === "default" ? "Only one default export allowed per module." : "`" + name + "` has already been exported. Exported identifiers must be unique."); + }; + + _proto.parseExportSpecifiers = function parseExportSpecifiers() { + var nodes = []; + var first = true; + var needsFrom; + this.expect(types.braceL); + + while (!this.eat(types.braceR)) { + if (first) { + first = false; + } else { + this.expect(types.comma); + if (this.eat(types.braceR)) break; + } + + var isDefault = this.match(types._default); + if (isDefault && !needsFrom) needsFrom = true; + var node = this.startNode(); + node.local = this.parseIdentifier(isDefault); + node.exported = this.eatContextual("as") ? this.parseIdentifier(true) : node.local.__clone(); + nodes.push(this.finishNode(node, "ExportSpecifier")); + } + + if (needsFrom && !this.isContextual("from")) { + this.unexpected(); + } + + return nodes; + }; + + _proto.parseImport = function parseImport(node) { + if (this.match(types.string)) { + node.specifiers = []; + node.source = this.parseExprAtom(); + } else { + node.specifiers = []; + this.parseImportSpecifiers(node); + this.expectContextual("from"); + node.source = this.match(types.string) ? this.parseExprAtom() : this.unexpected(); + } + + this.semicolon(); + return this.finishNode(node, "ImportDeclaration"); + }; + + _proto.shouldParseDefaultImport = function shouldParseDefaultImport(node) { + return this.match(types.name); + }; + + _proto.parseImportSpecifierLocal = function parseImportSpecifierLocal(node, specifier, type, contextDescription) { + specifier.local = this.parseIdentifier(); + this.checkLVal(specifier.local, true, undefined, contextDescription); + node.specifiers.push(this.finishNode(specifier, type)); + }; + + _proto.parseImportSpecifiers = function parseImportSpecifiers(node) { + var first = true; + + if (this.shouldParseDefaultImport(node)) { + this.parseImportSpecifierLocal(node, this.startNode(), "ImportDefaultSpecifier", "default import specifier"); + if (!this.eat(types.comma)) return; + } + + if (this.match(types.star)) { + var specifier = this.startNode(); + this.next(); + this.expectContextual("as"); + this.parseImportSpecifierLocal(node, specifier, "ImportNamespaceSpecifier", "import namespace specifier"); + return; + } + + this.expect(types.braceL); + + while (!this.eat(types.braceR)) { + if (first) { + first = false; + } else { + if (this.eat(types.colon)) { + this.unexpected(null, "ES2015 named imports do not destructure. " + "Use another statement for destructuring after the import."); + } + + this.expect(types.comma); + if (this.eat(types.braceR)) break; + } + + this.parseImportSpecifier(node); + } + }; + + _proto.parseImportSpecifier = function parseImportSpecifier(node) { + var specifier = this.startNode(); + specifier.imported = this.parseIdentifier(true); + + if (this.eatContextual("as")) { + specifier.local = this.parseIdentifier(); + } else { + this.checkReservedWord(specifier.imported.name, specifier.start, true, true); + specifier.local = specifier.imported.__clone(); + } + + this.checkLVal(specifier.local, true, undefined, "import specifier"); + node.specifiers.push(this.finishNode(specifier, "ImportSpecifier")); + }; + + _inheritsLoose(StatementParser, _ExpressionParser); + + return StatementParser; +}(ExpressionParser); + +var plugins = {}; + +var Parser = function (_StatementParser) { + function Parser(options, input) { + var _this; + + options = getOptions(options); + _this = _StatementParser.call(this, options, input) || this; + _this.options = options; + _this.inModule = _this.options.sourceType === "module"; + _this.input = input; + _this.plugins = pluginsMap(_this.options.plugins); + _this.filename = options.sourceFilename; + + if (_this.state.pos === 0 && _this.input[0] === "#" && _this.input[1] === "!") { + _this.skipLineComment(2); + } + + return _this; + } + + var _proto = Parser.prototype; + + _proto.parse = function parse() { + var file = this.startNode(); + var program = this.startNode(); + this.nextToken(); + return this.parseTopLevel(file, program); + }; + + _inheritsLoose(Parser, _StatementParser); + + return Parser; +}(StatementParser); + +function pluginsMap(pluginList) { + var pluginMap = {}; + + for (var _i2 = 0; _i2 < pluginList.length; _i2++) { + var _name = pluginList[_i2]; + pluginMap[_name] = true; + } + + return pluginMap; +} + +function isSimpleProperty(node) { + return node != null && node.type === "Property" && node.kind === "init" && node.method === false; +} + +var estreePlugin = (function (superClass) { + return function (_superClass) { + function _class() { + return _superClass.apply(this, arguments) || this; + } + + var _proto = _class.prototype; + + _proto.estreeParseRegExpLiteral = function estreeParseRegExpLiteral(_ref) { + var pattern = _ref.pattern, + flags = _ref.flags; + var regex = null; + + try { + regex = new RegExp(pattern, flags); + } catch (e) {} + + var node = this.estreeParseLiteral(regex); + node.regex = { + pattern: pattern, + flags: flags + }; + return node; + }; + + _proto.estreeParseLiteral = function estreeParseLiteral(value) { + return this.parseLiteral(value, "Literal"); + }; + + _proto.directiveToStmt = function directiveToStmt(directive) { + var directiveLiteral = directive.value; + var stmt = this.startNodeAt(directive.start, directive.loc.start); + var expression = this.startNodeAt(directiveLiteral.start, directiveLiteral.loc.start); + expression.value = directiveLiteral.value; + expression.raw = directiveLiteral.extra.raw; + stmt.expression = this.finishNodeAt(expression, "Literal", directiveLiteral.end, directiveLiteral.loc.end); + stmt.directive = directiveLiteral.extra.raw.slice(1, -1); + return this.finishNodeAt(stmt, "ExpressionStatement", directive.end, directive.loc.end); + }; + + _proto.initFunction = function initFunction(node, isAsync) { + _superClass.prototype.initFunction.call(this, node, isAsync); + + node.expression = false; + }; + + _proto.checkDeclaration = function checkDeclaration(node) { + if (isSimpleProperty(node)) { + this.checkDeclaration(node.value); + } else { + _superClass.prototype.checkDeclaration.call(this, node); + } + }; + + _proto.checkGetterSetterParams = function checkGetterSetterParams(method) { + var prop = method; + var paramCount = prop.kind === "get" ? 0 : 1; + var start = prop.start; + + if (prop.value.params.length !== paramCount) { + if (prop.kind === "get") { + this.raise(start, "getter must not have any formal parameters"); + } else { + this.raise(start, "setter must have exactly one formal parameter"); + } + } + + if (prop.kind === "set" && prop.value.params[0].type === "RestElement") { + this.raise(start, "setter function argument must not be a rest parameter"); + } + }; + + _proto.checkLVal = function checkLVal(expr, isBinding, checkClashes, contextDescription) { + var _this = this; + + switch (expr.type) { + case "ObjectPattern": + expr.properties.forEach(function (prop) { + _this.checkLVal(prop.type === "Property" ? prop.value : prop, isBinding, checkClashes, "object destructuring pattern"); + }); + break; + + default: + _superClass.prototype.checkLVal.call(this, expr, isBinding, checkClashes, contextDescription); + + } + }; + + _proto.checkPropClash = function checkPropClash(prop, propHash) { + if (prop.computed || !isSimpleProperty(prop)) return; + var key = prop.key; + var name = key.type === "Identifier" ? key.name : String(key.value); + + if (name === "__proto__") { + if (propHash.proto) { + this.raise(key.start, "Redefinition of __proto__ property"); + } + + propHash.proto = true; + } + }; + + _proto.isStrictBody = function isStrictBody(node) { + var isBlockStatement = node.body.type === "BlockStatement"; + + if (isBlockStatement && node.body.body.length > 0) { + for (var _i2 = 0, _node$body$body2 = node.body.body; _i2 < _node$body$body2.length; _i2++) { + var directive = _node$body$body2[_i2]; + + if (directive.type === "ExpressionStatement" && directive.expression.type === "Literal") { + if (directive.expression.value === "use strict") return true; + } else { + break; + } + } + } + + return false; + }; + + _proto.isValidDirective = function isValidDirective(stmt) { + return stmt.type === "ExpressionStatement" && stmt.expression.type === "Literal" && typeof stmt.expression.value === "string" && (!stmt.expression.extra || !stmt.expression.extra.parenthesized); + }; + + _proto.stmtToDirective = function stmtToDirective(stmt) { + var directive = _superClass.prototype.stmtToDirective.call(this, stmt); + + var value = stmt.expression.value; + directive.value.value = value; + return directive; + }; + + _proto.parseBlockBody = function parseBlockBody(node, allowDirectives, topLevel, end) { + var _this2 = this; + + _superClass.prototype.parseBlockBody.call(this, node, allowDirectives, topLevel, end); + + var directiveStatements = node.directives.map(function (d) { + return _this2.directiveToStmt(d); + }); + node.body = directiveStatements.concat(node.body); + delete node.directives; + }; + + _proto.pushClassMethod = function pushClassMethod(classBody, method, isGenerator, isAsync, isConstructor) { + this.parseMethod(method, isGenerator, isAsync, isConstructor, "MethodDefinition"); + + if (method.typeParameters) { + method.value.typeParameters = method.typeParameters; + delete method.typeParameters; + } + + classBody.body.push(method); + }; + + _proto.parseExprAtom = function parseExprAtom(refShorthandDefaultPos) { + switch (this.state.type) { + case types.regexp: + return this.estreeParseRegExpLiteral(this.state.value); + + case types.num: + case types.string: + return this.estreeParseLiteral(this.state.value); + + case types._null: + return this.estreeParseLiteral(null); + + case types._true: + return this.estreeParseLiteral(true); + + case types._false: + return this.estreeParseLiteral(false); + + default: + return _superClass.prototype.parseExprAtom.call(this, refShorthandDefaultPos); + } + }; + + _proto.parseLiteral = function parseLiteral(value, type, startPos, startLoc) { + var node = _superClass.prototype.parseLiteral.call(this, value, type, startPos, startLoc); + + node.raw = node.extra.raw; + delete node.extra; + return node; + }; + + _proto.parseFunctionBody = function parseFunctionBody(node, allowExpression) { + _superClass.prototype.parseFunctionBody.call(this, node, allowExpression); + + node.expression = node.body.type !== "BlockStatement"; + }; + + _proto.parseMethod = function parseMethod(node, isGenerator, isAsync, isConstructor, type) { + var funcNode = this.startNode(); + funcNode.kind = node.kind; + funcNode = _superClass.prototype.parseMethod.call(this, funcNode, isGenerator, isAsync, isConstructor, "FunctionExpression"); + delete funcNode.kind; + node.value = funcNode; + return this.finishNode(node, type); + }; + + _proto.parseObjectMethod = function parseObjectMethod(prop, isGenerator, isAsync, isPattern, containsEsc) { + var node = _superClass.prototype.parseObjectMethod.call(this, prop, isGenerator, isAsync, isPattern, containsEsc); + + if (node) { + node.type = "Property"; + if (node.kind === "method") node.kind = "init"; + node.shorthand = false; + } + + return node; + }; + + _proto.parseObjectProperty = function parseObjectProperty(prop, startPos, startLoc, isPattern, refShorthandDefaultPos) { + var node = _superClass.prototype.parseObjectProperty.call(this, prop, startPos, startLoc, isPattern, refShorthandDefaultPos); + + if (node) { + node.kind = "init"; + node.type = "Property"; + } + + return node; + }; + + _proto.toAssignable = function toAssignable(node, isBinding, contextDescription) { + if (isSimpleProperty(node)) { + this.toAssignable(node.value, isBinding, contextDescription); + return node; + } + + return _superClass.prototype.toAssignable.call(this, node, isBinding, contextDescription); + }; + + _proto.toAssignableObjectExpressionProp = function toAssignableObjectExpressionProp(prop, isBinding, isLast) { + if (prop.kind === "get" || prop.kind === "set") { + this.raise(prop.key.start, "Object pattern can't contain getter or setter"); + } else if (prop.method) { + this.raise(prop.key.start, "Object pattern can't contain methods"); + } else { + _superClass.prototype.toAssignableObjectExpressionProp.call(this, prop, isBinding, isLast); + } + }; + + _inheritsLoose(_class, _superClass); + + return _class; + }(superClass); +}); + +var primitiveTypes = ["any", "bool", "boolean", "empty", "false", "mixed", "null", "number", "static", "string", "true", "typeof", "void"]; + +function isEsModuleType(bodyElement) { + return bodyElement.type === "DeclareExportAllDeclaration" || bodyElement.type === "DeclareExportDeclaration" && (!bodyElement.declaration || bodyElement.declaration.type !== "TypeAlias" && bodyElement.declaration.type !== "InterfaceDeclaration"); +} + +function hasTypeImportKind(node) { + return node.importKind === "type" || node.importKind === "typeof"; +} + +function isMaybeDefaultImport(state) { + return (state.type === types.name || !!state.type.keyword) && state.value !== "from"; +} + +var exportSuggestions = { + const: "declare export var", + let: "declare export var", + type: "export type", + interface: "export interface" +}; + +function partition(list, test) { + var list1 = []; + var list2 = []; + + for (var i = 0; i < list.length; i++) { + (test(list[i], i, list) ? list1 : list2).push(list[i]); + } + + return [list1, list2]; +} + +var flowPlugin = (function (superClass) { + return function (_superClass) { + function _class() { + return _superClass.apply(this, arguments) || this; + } + + var _proto = _class.prototype; + + _proto.flowParseTypeInitialiser = function flowParseTypeInitialiser(tok) { + var oldInType = this.state.inType; + this.state.inType = true; + this.expect(tok || types.colon); + var type = this.flowParseType(); + this.state.inType = oldInType; + return type; + }; + + _proto.flowParsePredicate = function flowParsePredicate() { + var node = this.startNode(); + var moduloLoc = this.state.startLoc; + var moduloPos = this.state.start; + this.expect(types.modulo); + var checksLoc = this.state.startLoc; + this.expectContextual("checks"); + + if (moduloLoc.line !== checksLoc.line || moduloLoc.column !== checksLoc.column - 1) { + this.raise(moduloPos, "Spaces between ´%´ and ´checks´ are not allowed here."); + } + + if (this.eat(types.parenL)) { + node.value = this.parseExpression(); + this.expect(types.parenR); + return this.finishNode(node, "DeclaredPredicate"); + } else { + return this.finishNode(node, "InferredPredicate"); + } + }; + + _proto.flowParseTypeAndPredicateInitialiser = function flowParseTypeAndPredicateInitialiser() { + var oldInType = this.state.inType; + this.state.inType = true; + this.expect(types.colon); + var type = null; + var predicate = null; + + if (this.match(types.modulo)) { + this.state.inType = oldInType; + predicate = this.flowParsePredicate(); + } else { + type = this.flowParseType(); + this.state.inType = oldInType; + + if (this.match(types.modulo)) { + predicate = this.flowParsePredicate(); + } + } + + return [type, predicate]; + }; + + _proto.flowParseDeclareClass = function flowParseDeclareClass(node) { + this.next(); + this.flowParseInterfaceish(node, true); + return this.finishNode(node, "DeclareClass"); + }; + + _proto.flowParseDeclareFunction = function flowParseDeclareFunction(node) { + this.next(); + var id = node.id = this.parseIdentifier(); + var typeNode = this.startNode(); + var typeContainer = this.startNode(); + + if (this.isRelational("<")) { + typeNode.typeParameters = this.flowParseTypeParameterDeclaration(); + } else { + typeNode.typeParameters = null; + } + + this.expect(types.parenL); + var tmp = this.flowParseFunctionTypeParams(); + typeNode.params = tmp.params; + typeNode.rest = tmp.rest; + this.expect(types.parenR); + + var _this$flowParseTypeAn = this.flowParseTypeAndPredicateInitialiser(); + + typeNode.returnType = _this$flowParseTypeAn[0]; + node.predicate = _this$flowParseTypeAn[1]; + typeContainer.typeAnnotation = this.finishNode(typeNode, "FunctionTypeAnnotation"); + id.typeAnnotation = this.finishNode(typeContainer, "TypeAnnotation"); + this.finishNode(id, id.type); + this.semicolon(); + return this.finishNode(node, "DeclareFunction"); + }; + + _proto.flowParseDeclare = function flowParseDeclare(node, insideModule) { + if (this.match(types._class)) { + return this.flowParseDeclareClass(node); + } else if (this.match(types._function)) { + return this.flowParseDeclareFunction(node); + } else if (this.match(types._var)) { + return this.flowParseDeclareVariable(node); + } else if (this.isContextual("module")) { + if (this.lookahead().type === types.dot) { + return this.flowParseDeclareModuleExports(node); + } else { + if (insideModule) { + this.unexpected(null, "`declare module` cannot be used inside another `declare module`"); + } + + return this.flowParseDeclareModule(node); + } + } else if (this.isContextual("type")) { + return this.flowParseDeclareTypeAlias(node); + } else if (this.isContextual("opaque")) { + return this.flowParseDeclareOpaqueType(node); + } else if (this.isContextual("interface")) { + return this.flowParseDeclareInterface(node); + } else if (this.match(types._export)) { + return this.flowParseDeclareExportDeclaration(node, insideModule); + } else { + throw this.unexpected(); + } + }; + + _proto.flowParseDeclareVariable = function flowParseDeclareVariable(node) { + this.next(); + node.id = this.flowParseTypeAnnotatableIdentifier(true); + this.semicolon(); + return this.finishNode(node, "DeclareVariable"); + }; + + _proto.flowParseDeclareModule = function flowParseDeclareModule(node) { + var _this = this; + + this.next(); + + if (this.match(types.string)) { + node.id = this.parseExprAtom(); + } else { + node.id = this.parseIdentifier(); + } + + var bodyNode = node.body = this.startNode(); + var body = bodyNode.body = []; + this.expect(types.braceL); + + while (!this.match(types.braceR)) { + var _bodyNode = this.startNode(); + + if (this.match(types._import)) { + var lookahead = this.lookahead(); + + if (lookahead.value !== "type" && lookahead.value !== "typeof") { + this.unexpected(null, "Imports within a `declare module` body must always be `import type` or `import typeof`"); + } + + this.next(); + this.parseImport(_bodyNode); + } else { + this.expectContextual("declare", "Only declares and type imports are allowed inside declare module"); + _bodyNode = this.flowParseDeclare(_bodyNode, true); + } + + body.push(_bodyNode); + } + + this.expect(types.braceR); + this.finishNode(bodyNode, "BlockStatement"); + var kind = null; + var hasModuleExport = false; + var errorMessage = "Found both `declare module.exports` and `declare export` in the same module. " + "Modules can only have 1 since they are either an ES module or they are a CommonJS module"; + body.forEach(function (bodyElement) { + if (isEsModuleType(bodyElement)) { + if (kind === "CommonJS") { + _this.unexpected(bodyElement.start, errorMessage); + } + + kind = "ES"; + } else if (bodyElement.type === "DeclareModuleExports") { + if (hasModuleExport) { + _this.unexpected(bodyElement.start, "Duplicate `declare module.exports` statement"); + } + + if (kind === "ES") _this.unexpected(bodyElement.start, errorMessage); + kind = "CommonJS"; + hasModuleExport = true; + } + }); + node.kind = kind || "CommonJS"; + return this.finishNode(node, "DeclareModule"); + }; + + _proto.flowParseDeclareExportDeclaration = function flowParseDeclareExportDeclaration(node, insideModule) { + this.expect(types._export); + + if (this.eat(types._default)) { + if (this.match(types._function) || this.match(types._class)) { + node.declaration = this.flowParseDeclare(this.startNode()); + } else { + node.declaration = this.flowParseType(); + this.semicolon(); + } + + node.default = true; + return this.finishNode(node, "DeclareExportDeclaration"); + } else { + if (this.match(types._const) || this.match(types._let) || (this.isContextual("type") || this.isContextual("interface")) && !insideModule) { + var label = this.state.value; + var suggestion = exportSuggestions[label]; + this.unexpected(this.state.start, "`declare export " + label + "` is not supported. Use `" + suggestion + "` instead"); + } + + if (this.match(types._var) || this.match(types._function) || this.match(types._class) || this.isContextual("opaque")) { + node.declaration = this.flowParseDeclare(this.startNode()); + node.default = false; + return this.finishNode(node, "DeclareExportDeclaration"); + } else if (this.match(types.star) || this.match(types.braceL) || this.isContextual("interface") || this.isContextual("type") || this.isContextual("opaque")) { + node = this.parseExport(node); + + if (node.type === "ExportNamedDeclaration") { + node.type = "ExportDeclaration"; + node.default = false; + delete node.exportKind; + } + + node.type = "Declare" + node.type; + return node; + } + } + + throw this.unexpected(); + }; + + _proto.flowParseDeclareModuleExports = function flowParseDeclareModuleExports(node) { + this.expectContextual("module"); + this.expect(types.dot); + this.expectContextual("exports"); + node.typeAnnotation = this.flowParseTypeAnnotation(); + this.semicolon(); + return this.finishNode(node, "DeclareModuleExports"); + }; + + _proto.flowParseDeclareTypeAlias = function flowParseDeclareTypeAlias(node) { + this.next(); + this.flowParseTypeAlias(node); + return this.finishNode(node, "DeclareTypeAlias"); + }; + + _proto.flowParseDeclareOpaqueType = function flowParseDeclareOpaqueType(node) { + this.next(); + this.flowParseOpaqueType(node, true); + return this.finishNode(node, "DeclareOpaqueType"); + }; + + _proto.flowParseDeclareInterface = function flowParseDeclareInterface(node) { + this.next(); + this.flowParseInterfaceish(node); + return this.finishNode(node, "DeclareInterface"); + }; + + _proto.flowParseInterfaceish = function flowParseInterfaceish(node, isClass) { + node.id = this.flowParseRestrictedIdentifier(!isClass); + + if (this.isRelational("<")) { + node.typeParameters = this.flowParseTypeParameterDeclaration(); + } else { + node.typeParameters = null; + } + + node.extends = []; + node.implements = []; + node.mixins = []; + + if (this.eat(types._extends)) { + do { + node.extends.push(this.flowParseInterfaceExtends()); + } while (!isClass && this.eat(types.comma)); + } + + if (this.isContextual("mixins")) { + this.next(); + + do { + node.mixins.push(this.flowParseInterfaceExtends()); + } while (this.eat(types.comma)); + } + + if (this.isContextual("implements")) { + this.next(); + + do { + node.implements.push(this.flowParseInterfaceExtends()); + } while (this.eat(types.comma)); + } + + node.body = this.flowParseObjectType(true, false, false); + }; + + _proto.flowParseInterfaceExtends = function flowParseInterfaceExtends() { + var node = this.startNode(); + node.id = this.flowParseQualifiedTypeIdentifier(); + + if (this.isRelational("<")) { + node.typeParameters = this.flowParseTypeParameterInstantiation(); + } else { + node.typeParameters = null; + } + + return this.finishNode(node, "InterfaceExtends"); + }; + + _proto.flowParseInterface = function flowParseInterface(node) { + this.flowParseInterfaceish(node); + return this.finishNode(node, "InterfaceDeclaration"); + }; + + _proto.checkReservedType = function checkReservedType(word, startLoc) { + if (primitiveTypes.indexOf(word) > -1) { + this.raise(startLoc, "Cannot overwrite primitive type " + word); + } + }; + + _proto.flowParseRestrictedIdentifier = function flowParseRestrictedIdentifier(liberal) { + this.checkReservedType(this.state.value, this.state.start); + return this.parseIdentifier(liberal); + }; + + _proto.flowParseTypeAlias = function flowParseTypeAlias(node) { + node.id = this.flowParseRestrictedIdentifier(); + + if (this.isRelational("<")) { + node.typeParameters = this.flowParseTypeParameterDeclaration(); + } else { + node.typeParameters = null; + } + + node.right = this.flowParseTypeInitialiser(types.eq); + this.semicolon(); + return this.finishNode(node, "TypeAlias"); + }; + + _proto.flowParseOpaqueType = function flowParseOpaqueType(node, declare) { + this.expectContextual("type"); + node.id = this.flowParseRestrictedIdentifier(true); + + if (this.isRelational("<")) { + node.typeParameters = this.flowParseTypeParameterDeclaration(); + } else { + node.typeParameters = null; + } + + node.supertype = null; + + if (this.match(types.colon)) { + node.supertype = this.flowParseTypeInitialiser(types.colon); + } + + node.impltype = null; + + if (!declare) { + node.impltype = this.flowParseTypeInitialiser(types.eq); + } + + this.semicolon(); + return this.finishNode(node, "OpaqueType"); + }; + + _proto.flowParseTypeParameter = function flowParseTypeParameter(allowDefault, requireDefault) { + if (allowDefault === void 0) { + allowDefault = true; + } + + if (requireDefault === void 0) { + requireDefault = false; + } + + if (!allowDefault && requireDefault) { + throw new Error("Cannot disallow a default value (`allowDefault`) while also requiring it (`requireDefault`)."); + } + + var nodeStart = this.state.start; + var node = this.startNode(); + var variance = this.flowParseVariance(); + var ident = this.flowParseTypeAnnotatableIdentifier(); + node.name = ident.name; + node.variance = variance; + node.bound = ident.typeAnnotation; + + if (this.match(types.eq)) { + if (allowDefault) { + this.eat(types.eq); + node.default = this.flowParseType(); + } else { + this.unexpected(); + } + } else { + if (requireDefault) { + this.unexpected(nodeStart, "Type parameter declaration needs a default, since a preceding type parameter declaration has a default."); + } + } + + return this.finishNode(node, "TypeParameter"); + }; + + _proto.flowParseTypeParameterDeclaration = function flowParseTypeParameterDeclaration(allowDefault) { + if (allowDefault === void 0) { + allowDefault = true; + } + + var oldInType = this.state.inType; + var node = this.startNode(); + node.params = []; + this.state.inType = true; + + if (this.isRelational("<") || this.match(types.jsxTagStart)) { + this.next(); + } else { + this.unexpected(); + } + + var defaultRequired = false; + + do { + var typeParameter = this.flowParseTypeParameter(allowDefault, defaultRequired); + node.params.push(typeParameter); + + if (typeParameter.default) { + defaultRequired = true; + } + + if (!this.isRelational(">")) { + this.expect(types.comma); + } + } while (!this.isRelational(">")); + + this.expectRelational(">"); + this.state.inType = oldInType; + return this.finishNode(node, "TypeParameterDeclaration"); + }; + + _proto.flowParseTypeParameterInstantiation = function flowParseTypeParameterInstantiation() { + var node = this.startNode(); + var oldInType = this.state.inType; + node.params = []; + this.state.inType = true; + this.expectRelational("<"); + + while (!this.isRelational(">")) { + node.params.push(this.flowParseType()); + + if (!this.isRelational(">")) { + this.expect(types.comma); + } + } + + this.expectRelational(">"); + this.state.inType = oldInType; + return this.finishNode(node, "TypeParameterInstantiation"); + }; + + _proto.flowParseObjectPropertyKey = function flowParseObjectPropertyKey() { + return this.match(types.num) || this.match(types.string) ? this.parseExprAtom() : this.parseIdentifier(true); + }; + + _proto.flowParseObjectTypeIndexer = function flowParseObjectTypeIndexer(node, isStatic, variance) { + node.static = isStatic; + this.expect(types.bracketL); + + if (this.lookahead().type === types.colon) { + node.id = this.flowParseObjectPropertyKey(); + node.key = this.flowParseTypeInitialiser(); + } else { + node.id = null; + node.key = this.flowParseType(); + } + + this.expect(types.bracketR); + node.value = this.flowParseTypeInitialiser(); + node.variance = variance; + return this.finishNode(node, "ObjectTypeIndexer"); + }; + + _proto.flowParseObjectTypeMethodish = function flowParseObjectTypeMethodish(node) { + node.params = []; + node.rest = null; + node.typeParameters = null; + + if (this.isRelational("<")) { + node.typeParameters = this.flowParseTypeParameterDeclaration(false); + } + + this.expect(types.parenL); + + while (!this.match(types.parenR) && !this.match(types.ellipsis)) { + node.params.push(this.flowParseFunctionTypeParam()); + + if (!this.match(types.parenR)) { + this.expect(types.comma); + } + } + + if (this.eat(types.ellipsis)) { + node.rest = this.flowParseFunctionTypeParam(); + } + + this.expect(types.parenR); + node.returnType = this.flowParseTypeInitialiser(); + return this.finishNode(node, "FunctionTypeAnnotation"); + }; + + _proto.flowParseObjectTypeCallProperty = function flowParseObjectTypeCallProperty(node, isStatic) { + var valueNode = this.startNode(); + node.static = isStatic; + node.value = this.flowParseObjectTypeMethodish(valueNode); + return this.finishNode(node, "ObjectTypeCallProperty"); + }; + + _proto.flowParseObjectType = function flowParseObjectType(allowStatic, allowExact, allowSpread) { + var oldInType = this.state.inType; + this.state.inType = true; + var nodeStart = this.startNode(); + nodeStart.callProperties = []; + nodeStart.properties = []; + nodeStart.indexers = []; + var endDelim; + var exact; + + if (allowExact && this.match(types.braceBarL)) { + this.expect(types.braceBarL); + endDelim = types.braceBarR; + exact = true; + } else { + this.expect(types.braceL); + endDelim = types.braceR; + exact = false; + } + + nodeStart.exact = exact; + + while (!this.match(endDelim)) { + var isStatic = false; + var node = this.startNode(); + + if (allowStatic && this.isContextual("static")) { + var lookahead = this.lookahead(); + + if (lookahead.type !== types.colon && lookahead.type !== types.question) { + this.next(); + isStatic = true; + } + } + + var variance = this.flowParseVariance(); + + if (this.match(types.bracketL)) { + nodeStart.indexers.push(this.flowParseObjectTypeIndexer(node, isStatic, variance)); + } else if (this.match(types.parenL) || this.isRelational("<")) { + if (variance) { + this.unexpected(variance.start); + } + + nodeStart.callProperties.push(this.flowParseObjectTypeCallProperty(node, isStatic)); + } else { + var kind = "init"; + + if (this.isContextual("get") || this.isContextual("set")) { + var _lookahead = this.lookahead(); + + if (_lookahead.type === types.name || _lookahead.type === types.string || _lookahead.type === types.num) { + kind = this.state.value; + this.next(); + } + } + + nodeStart.properties.push(this.flowParseObjectTypeProperty(node, isStatic, variance, kind, allowSpread)); + } + + this.flowObjectTypeSemicolon(); + } + + this.expect(endDelim); + var out = this.finishNode(nodeStart, "ObjectTypeAnnotation"); + this.state.inType = oldInType; + return out; + }; + + _proto.flowParseObjectTypeProperty = function flowParseObjectTypeProperty(node, isStatic, variance, kind, allowSpread) { + if (this.match(types.ellipsis)) { + if (!allowSpread) { + this.unexpected(null, "Spread operator cannot appear in class or interface definitions"); + } + + if (variance) { + this.unexpected(variance.start, "Spread properties cannot have variance"); + } + + this.expect(types.ellipsis); + node.argument = this.flowParseType(); + return this.finishNode(node, "ObjectTypeSpreadProperty"); + } else { + node.key = this.flowParseObjectPropertyKey(); + node.static = isStatic; + node.kind = kind; + var optional = false; + + if (this.isRelational("<") || this.match(types.parenL)) { + node.method = true; + + if (variance) { + this.unexpected(variance.start); + } + + node.value = this.flowParseObjectTypeMethodish(this.startNodeAt(node.start, node.loc.start)); + + if (kind === "get" || kind === "set") { + this.flowCheckGetterSetterParams(node); + } + } else { + if (kind !== "init") this.unexpected(); + node.method = false; + + if (this.eat(types.question)) { + optional = true; + } + + node.value = this.flowParseTypeInitialiser(); + node.variance = variance; + } + + node.optional = optional; + return this.finishNode(node, "ObjectTypeProperty"); + } + }; + + _proto.flowCheckGetterSetterParams = function flowCheckGetterSetterParams(property) { + var paramCount = property.kind === "get" ? 0 : 1; + var start = property.start; + var length = property.value.params.length + (property.value.rest ? 1 : 0); + + if (length !== paramCount) { + if (property.kind === "get") { + this.raise(start, "getter must not have any formal parameters"); + } else { + this.raise(start, "setter must have exactly one formal parameter"); + } + } + + if (property.kind === "set" && property.value.rest) { + this.raise(start, "setter function argument must not be a rest parameter"); + } + }; + + _proto.flowObjectTypeSemicolon = function flowObjectTypeSemicolon() { + if (!this.eat(types.semi) && !this.eat(types.comma) && !this.match(types.braceR) && !this.match(types.braceBarR)) { + this.unexpected(); + } + }; + + _proto.flowParseQualifiedTypeIdentifier = function flowParseQualifiedTypeIdentifier(startPos, startLoc, id) { + startPos = startPos || this.state.start; + startLoc = startLoc || this.state.startLoc; + var node = id || this.parseIdentifier(); + + while (this.eat(types.dot)) { + var node2 = this.startNodeAt(startPos, startLoc); + node2.qualification = node; + node2.id = this.parseIdentifier(); + node = this.finishNode(node2, "QualifiedTypeIdentifier"); + } + + return node; + }; + + _proto.flowParseGenericType = function flowParseGenericType(startPos, startLoc, id) { + var node = this.startNodeAt(startPos, startLoc); + node.typeParameters = null; + node.id = this.flowParseQualifiedTypeIdentifier(startPos, startLoc, id); + + if (this.isRelational("<")) { + node.typeParameters = this.flowParseTypeParameterInstantiation(); + } + + return this.finishNode(node, "GenericTypeAnnotation"); + }; + + _proto.flowParseTypeofType = function flowParseTypeofType() { + var node = this.startNode(); + this.expect(types._typeof); + node.argument = this.flowParsePrimaryType(); + return this.finishNode(node, "TypeofTypeAnnotation"); + }; + + _proto.flowParseTupleType = function flowParseTupleType() { + var node = this.startNode(); + node.types = []; + this.expect(types.bracketL); + + while (this.state.pos < this.input.length && !this.match(types.bracketR)) { + node.types.push(this.flowParseType()); + if (this.match(types.bracketR)) break; + this.expect(types.comma); + } + + this.expect(types.bracketR); + return this.finishNode(node, "TupleTypeAnnotation"); + }; + + _proto.flowParseFunctionTypeParam = function flowParseFunctionTypeParam() { + var name = null; + var optional = false; + var typeAnnotation = null; + var node = this.startNode(); + var lh = this.lookahead(); + + if (lh.type === types.colon || lh.type === types.question) { + name = this.parseIdentifier(); + + if (this.eat(types.question)) { + optional = true; + } + + typeAnnotation = this.flowParseTypeInitialiser(); + } else { + typeAnnotation = this.flowParseType(); + } + + node.name = name; + node.optional = optional; + node.typeAnnotation = typeAnnotation; + return this.finishNode(node, "FunctionTypeParam"); + }; + + _proto.reinterpretTypeAsFunctionTypeParam = function reinterpretTypeAsFunctionTypeParam(type) { + var node = this.startNodeAt(type.start, type.loc.start); + node.name = null; + node.optional = false; + node.typeAnnotation = type; + return this.finishNode(node, "FunctionTypeParam"); + }; + + _proto.flowParseFunctionTypeParams = function flowParseFunctionTypeParams(params) { + if (params === void 0) { + params = []; + } + + var rest = null; + + while (!this.match(types.parenR) && !this.match(types.ellipsis)) { + params.push(this.flowParseFunctionTypeParam()); + + if (!this.match(types.parenR)) { + this.expect(types.comma); + } + } + + if (this.eat(types.ellipsis)) { + rest = this.flowParseFunctionTypeParam(); + } + + return { + params: params, + rest: rest + }; + }; + + _proto.flowIdentToTypeAnnotation = function flowIdentToTypeAnnotation(startPos, startLoc, node, id) { + switch (id.name) { + case "any": + return this.finishNode(node, "AnyTypeAnnotation"); + + case "void": + return this.finishNode(node, "VoidTypeAnnotation"); + + case "bool": + case "boolean": + return this.finishNode(node, "BooleanTypeAnnotation"); + + case "mixed": + return this.finishNode(node, "MixedTypeAnnotation"); + + case "empty": + return this.finishNode(node, "EmptyTypeAnnotation"); + + case "number": + return this.finishNode(node, "NumberTypeAnnotation"); + + case "string": + return this.finishNode(node, "StringTypeAnnotation"); + + default: + return this.flowParseGenericType(startPos, startLoc, id); + } + }; + + _proto.flowParsePrimaryType = function flowParsePrimaryType() { + var startPos = this.state.start; + var startLoc = this.state.startLoc; + var node = this.startNode(); + var tmp; + var type; + var isGroupedType = false; + var oldNoAnonFunctionType = this.state.noAnonFunctionType; + + switch (this.state.type) { + case types.name: + return this.flowIdentToTypeAnnotation(startPos, startLoc, node, this.parseIdentifier()); + + case types.braceL: + return this.flowParseObjectType(false, false, true); + + case types.braceBarL: + return this.flowParseObjectType(false, true, true); + + case types.bracketL: + return this.flowParseTupleType(); + + case types.relational: + if (this.state.value === "<") { + node.typeParameters = this.flowParseTypeParameterDeclaration(false); + this.expect(types.parenL); + tmp = this.flowParseFunctionTypeParams(); + node.params = tmp.params; + node.rest = tmp.rest; + this.expect(types.parenR); + this.expect(types.arrow); + node.returnType = this.flowParseType(); + return this.finishNode(node, "FunctionTypeAnnotation"); + } + + break; + + case types.parenL: + this.next(); + + if (!this.match(types.parenR) && !this.match(types.ellipsis)) { + if (this.match(types.name)) { + var token = this.lookahead().type; + isGroupedType = token !== types.question && token !== types.colon; + } else { + isGroupedType = true; + } + } + + if (isGroupedType) { + this.state.noAnonFunctionType = false; + type = this.flowParseType(); + this.state.noAnonFunctionType = oldNoAnonFunctionType; + + if (this.state.noAnonFunctionType || !(this.match(types.comma) || this.match(types.parenR) && this.lookahead().type === types.arrow)) { + this.expect(types.parenR); + return type; + } else { + this.eat(types.comma); + } + } + + if (type) { + tmp = this.flowParseFunctionTypeParams([this.reinterpretTypeAsFunctionTypeParam(type)]); + } else { + tmp = this.flowParseFunctionTypeParams(); + } + + node.params = tmp.params; + node.rest = tmp.rest; + this.expect(types.parenR); + this.expect(types.arrow); + node.returnType = this.flowParseType(); + node.typeParameters = null; + return this.finishNode(node, "FunctionTypeAnnotation"); + + case types.string: + return this.parseLiteral(this.state.value, "StringLiteralTypeAnnotation"); + + case types._true: + case types._false: + node.value = this.match(types._true); + this.next(); + return this.finishNode(node, "BooleanLiteralTypeAnnotation"); + + case types.plusMin: + if (this.state.value === "-") { + this.next(); + + if (!this.match(types.num)) { + this.unexpected(null, "Unexpected token, expected \"number\""); + } + + return this.parseLiteral(-this.state.value, "NumberLiteralTypeAnnotation", node.start, node.loc.start); + } + + this.unexpected(); + + case types.num: + return this.parseLiteral(this.state.value, "NumberLiteralTypeAnnotation"); + + case types._null: + this.next(); + return this.finishNode(node, "NullLiteralTypeAnnotation"); + + case types._this: + this.next(); + return this.finishNode(node, "ThisTypeAnnotation"); + + case types.star: + this.next(); + return this.finishNode(node, "ExistsTypeAnnotation"); + + default: + if (this.state.type.keyword === "typeof") { + return this.flowParseTypeofType(); + } + + } + + throw this.unexpected(); + }; + + _proto.flowParsePostfixType = function flowParsePostfixType() { + var startPos = this.state.start, + startLoc = this.state.startLoc; + var type = this.flowParsePrimaryType(); + + while (!this.canInsertSemicolon() && this.match(types.bracketL)) { + var node = this.startNodeAt(startPos, startLoc); + node.elementType = type; + this.expect(types.bracketL); + this.expect(types.bracketR); + type = this.finishNode(node, "ArrayTypeAnnotation"); + } + + return type; + }; + + _proto.flowParsePrefixType = function flowParsePrefixType() { + var node = this.startNode(); + + if (this.eat(types.question)) { + node.typeAnnotation = this.flowParsePrefixType(); + return this.finishNode(node, "NullableTypeAnnotation"); + } else { + return this.flowParsePostfixType(); + } + }; + + _proto.flowParseAnonFunctionWithoutParens = function flowParseAnonFunctionWithoutParens() { + var param = this.flowParsePrefixType(); + + if (!this.state.noAnonFunctionType && this.eat(types.arrow)) { + var node = this.startNodeAt(param.start, param.loc.start); + node.params = [this.reinterpretTypeAsFunctionTypeParam(param)]; + node.rest = null; + node.returnType = this.flowParseType(); + node.typeParameters = null; + return this.finishNode(node, "FunctionTypeAnnotation"); + } + + return param; + }; + + _proto.flowParseIntersectionType = function flowParseIntersectionType() { + var node = this.startNode(); + this.eat(types.bitwiseAND); + var type = this.flowParseAnonFunctionWithoutParens(); + node.types = [type]; + + while (this.eat(types.bitwiseAND)) { + node.types.push(this.flowParseAnonFunctionWithoutParens()); + } + + return node.types.length === 1 ? type : this.finishNode(node, "IntersectionTypeAnnotation"); + }; + + _proto.flowParseUnionType = function flowParseUnionType() { + var node = this.startNode(); + this.eat(types.bitwiseOR); + var type = this.flowParseIntersectionType(); + node.types = [type]; + + while (this.eat(types.bitwiseOR)) { + node.types.push(this.flowParseIntersectionType()); + } + + return node.types.length === 1 ? type : this.finishNode(node, "UnionTypeAnnotation"); + }; + + _proto.flowParseType = function flowParseType() { + var oldInType = this.state.inType; + this.state.inType = true; + var type = this.flowParseUnionType(); + this.state.inType = oldInType; + this.state.exprAllowed = this.state.exprAllowed || this.state.noAnonFunctionType; + return type; + }; + + _proto.flowParseTypeAnnotation = function flowParseTypeAnnotation() { + var node = this.startNode(); + node.typeAnnotation = this.flowParseTypeInitialiser(); + return this.finishNode(node, "TypeAnnotation"); + }; + + _proto.flowParseTypeAnnotatableIdentifier = function flowParseTypeAnnotatableIdentifier(allowPrimitiveOverride) { + var ident = allowPrimitiveOverride ? this.parseIdentifier() : this.flowParseRestrictedIdentifier(); + + if (this.match(types.colon)) { + ident.typeAnnotation = this.flowParseTypeAnnotation(); + this.finishNode(ident, ident.type); + } + + return ident; + }; + + _proto.typeCastToParameter = function typeCastToParameter(node) { + node.expression.typeAnnotation = node.typeAnnotation; + return this.finishNodeAt(node.expression, node.expression.type, node.typeAnnotation.end, node.typeAnnotation.loc.end); + }; + + _proto.flowParseVariance = function flowParseVariance() { + var variance = null; + + if (this.match(types.plusMin)) { + variance = this.startNode(); + + if (this.state.value === "+") { + variance.kind = "plus"; + } else { + variance.kind = "minus"; + } + + this.next(); + this.finishNode(variance, "Variance"); + } + + return variance; + }; + + _proto.parseFunctionBody = function parseFunctionBody(node, allowExpressionBody) { + var _this2 = this; + + if (allowExpressionBody) { + return this.forwardNoArrowParamsConversionAt(node, function () { + return _superClass.prototype.parseFunctionBody.call(_this2, node, true); + }); + } + + return _superClass.prototype.parseFunctionBody.call(this, node, false); + }; + + _proto.parseFunctionBodyAndFinish = function parseFunctionBodyAndFinish(node, type, allowExpressionBody) { + if (!allowExpressionBody && this.match(types.colon)) { + var typeNode = this.startNode(); + + var _this$flowParseTypeAn2 = this.flowParseTypeAndPredicateInitialiser(); + + typeNode.typeAnnotation = _this$flowParseTypeAn2[0]; + node.predicate = _this$flowParseTypeAn2[1]; + node.returnType = typeNode.typeAnnotation ? this.finishNode(typeNode, "TypeAnnotation") : null; + } + + _superClass.prototype.parseFunctionBodyAndFinish.call(this, node, type, allowExpressionBody); + }; + + _proto.parseStatement = function parseStatement(declaration, topLevel) { + if (this.state.strict && this.match(types.name) && this.state.value === "interface") { + var node = this.startNode(); + this.next(); + return this.flowParseInterface(node); + } else { + return _superClass.prototype.parseStatement.call(this, declaration, topLevel); + } + }; + + _proto.parseExpressionStatement = function parseExpressionStatement(node, expr) { + if (expr.type === "Identifier") { + if (expr.name === "declare") { + if (this.match(types._class) || this.match(types.name) || this.match(types._function) || this.match(types._var) || this.match(types._export)) { + return this.flowParseDeclare(node); + } + } else if (this.match(types.name)) { + if (expr.name === "interface") { + return this.flowParseInterface(node); + } else if (expr.name === "type") { + return this.flowParseTypeAlias(node); + } else if (expr.name === "opaque") { + return this.flowParseOpaqueType(node, false); + } + } + } + + return _superClass.prototype.parseExpressionStatement.call(this, node, expr); + }; + + _proto.shouldParseExportDeclaration = function shouldParseExportDeclaration() { + return this.isContextual("type") || this.isContextual("interface") || this.isContextual("opaque") || _superClass.prototype.shouldParseExportDeclaration.call(this); + }; + + _proto.isExportDefaultSpecifier = function isExportDefaultSpecifier() { + if (this.match(types.name) && (this.state.value === "type" || this.state.value === "interface" || this.state.value == "opaque")) { + return false; + } + + return _superClass.prototype.isExportDefaultSpecifier.call(this); + }; + + _proto.parseConditional = function parseConditional(expr, noIn, startPos, startLoc, refNeedsArrowPos) { + var _this3 = this; + + if (!this.match(types.question)) return expr; + + if (refNeedsArrowPos) { + var _state = this.state.clone(); + + try { + return _superClass.prototype.parseConditional.call(this, expr, noIn, startPos, startLoc); + } catch (err) { + if (err instanceof SyntaxError) { + this.state = _state; + refNeedsArrowPos.start = err.pos || this.state.start; + return expr; + } else { + throw err; + } + } + } + + this.expect(types.question); + var state = this.state.clone(); + var originalNoArrowAt = this.state.noArrowAt; + var node = this.startNodeAt(startPos, startLoc); + + var _this$tryParseConditi = this.tryParseConditionalConsequent(), + consequent = _this$tryParseConditi.consequent, + failed = _this$tryParseConditi.failed; + + var _this$getArrowLikeExp = this.getArrowLikeExpressions(consequent), + valid = _this$getArrowLikeExp[0], + invalid = _this$getArrowLikeExp[1]; + + if (failed || invalid.length > 0) { + var noArrowAt = originalNoArrowAt.concat(); + + if (invalid.length > 0) { + this.state = state; + this.state.noArrowAt = noArrowAt; + + for (var i = 0; i < invalid.length; i++) { + noArrowAt.push(invalid[i].start); + } + + var _this$tryParseConditi2 = this.tryParseConditionalConsequent(); + + consequent = _this$tryParseConditi2.consequent; + failed = _this$tryParseConditi2.failed; + + var _this$getArrowLikeExp2 = this.getArrowLikeExpressions(consequent); + + valid = _this$getArrowLikeExp2[0]; + invalid = _this$getArrowLikeExp2[1]; + } + + if (failed && valid.length > 1) { + this.raise(state.start, "Ambiguous expression: wrap the arrow functions in parentheses to disambiguate."); + } + + if (failed && valid.length === 1) { + this.state = state; + this.state.noArrowAt = noArrowAt.concat(valid[0].start); + + var _this$tryParseConditi3 = this.tryParseConditionalConsequent(); + + consequent = _this$tryParseConditi3.consequent; + failed = _this$tryParseConditi3.failed; + } + + this.getArrowLikeExpressions(consequent, true); + } + + this.state.noArrowAt = originalNoArrowAt; + this.expect(types.colon); + node.test = expr; + node.consequent = consequent; + node.alternate = this.forwardNoArrowParamsConversionAt(node, function () { + return _this3.parseMaybeAssign(noIn, undefined, undefined, undefined); + }); + return this.finishNode(node, "ConditionalExpression"); + }; + + _proto.tryParseConditionalConsequent = function tryParseConditionalConsequent() { + this.state.noArrowParamsConversionAt.push(this.state.start); + var consequent = this.parseMaybeAssign(); + var failed = !this.match(types.colon); + this.state.noArrowParamsConversionAt.pop(); + return { + consequent: consequent, + failed: failed + }; + }; + + _proto.getArrowLikeExpressions = function getArrowLikeExpressions(node, disallowInvalid) { + var _this4 = this; + + var stack = [node]; + var arrows = []; + + while (stack.length !== 0) { + var _node = stack.pop(); + + if (_node.type === "ArrowFunctionExpression") { + if (_node.typeParameters || !_node.returnType) { + this.toAssignableList(_node.params, true, "arrow function parameters"); + + _superClass.prototype.checkFunctionNameAndParams.call(this, _node, true); + } else { + arrows.push(_node); + } + + stack.push(_node.body); + } else if (_node.type === "ConditionalExpression") { + stack.push(_node.consequent); + stack.push(_node.alternate); + } + } + + if (disallowInvalid) { + for (var i = 0; i < arrows.length; i++) { + this.toAssignableList(node.params, true, "arrow function parameters"); + } + + return [arrows, []]; + } + + return partition(arrows, function (node) { + try { + _this4.toAssignableList(node.params, true, "arrow function parameters"); + + return true; + } catch (err) { + return false; + } + }); + }; + + _proto.forwardNoArrowParamsConversionAt = function forwardNoArrowParamsConversionAt(node, parse) { + var result; + + if (this.state.noArrowParamsConversionAt.indexOf(node.start) !== -1) { + this.state.noArrowParamsConversionAt.push(this.state.start); + result = parse(); + this.state.noArrowParamsConversionAt.pop(); + } else { + result = parse(); + } + + return result; + }; + + _proto.parseParenItem = function parseParenItem(node, startPos, startLoc) { + node = _superClass.prototype.parseParenItem.call(this, node, startPos, startLoc); + + if (this.eat(types.question)) { + node.optional = true; + } + + if (this.match(types.colon)) { + var typeCastNode = this.startNodeAt(startPos, startLoc); + typeCastNode.expression = node; + typeCastNode.typeAnnotation = this.flowParseTypeAnnotation(); + return this.finishNode(typeCastNode, "TypeCastExpression"); + } + + return node; + }; + + _proto.assertModuleNodeAllowed = function assertModuleNodeAllowed(node) { + if (node.type === "ImportDeclaration" && (node.importKind === "type" || node.importKind === "typeof") || node.type === "ExportNamedDeclaration" && node.exportKind === "type" || node.type === "ExportAllDeclaration" && node.exportKind === "type") { + return; + } + + _superClass.prototype.assertModuleNodeAllowed.call(this, node); + }; + + _proto.parseExport = function parseExport(node) { + node = _superClass.prototype.parseExport.call(this, node); + + if (node.type === "ExportNamedDeclaration" || node.type === "ExportAllDeclaration") { + node.exportKind = node.exportKind || "value"; + } + + return node; + }; + + _proto.parseExportDeclaration = function parseExportDeclaration(node) { + if (this.isContextual("type")) { + node.exportKind = "type"; + var declarationNode = this.startNode(); + this.next(); + + if (this.match(types.braceL)) { + node.specifiers = this.parseExportSpecifiers(); + this.parseExportFrom(node); + return null; + } else { + return this.flowParseTypeAlias(declarationNode); + } + } else if (this.isContextual("opaque")) { + node.exportKind = "type"; + + var _declarationNode = this.startNode(); + + this.next(); + return this.flowParseOpaqueType(_declarationNode, false); + } else if (this.isContextual("interface")) { + node.exportKind = "type"; + + var _declarationNode2 = this.startNode(); + + this.next(); + return this.flowParseInterface(_declarationNode2); + } else { + return _superClass.prototype.parseExportDeclaration.call(this, node); + } + }; + + _proto.shouldParseExportStar = function shouldParseExportStar() { + return _superClass.prototype.shouldParseExportStar.call(this) || this.isContextual("type") && this.lookahead().type === types.star; + }; + + _proto.parseExportStar = function parseExportStar(node) { + if (this.eatContextual("type")) { + node.exportKind = "type"; + } + + return _superClass.prototype.parseExportStar.call(this, node); + }; + + _proto.parseExportNamespace = function parseExportNamespace(node) { + if (node.exportKind === "type") { + this.unexpected(); + } + + return _superClass.prototype.parseExportNamespace.call(this, node); + }; + + _proto.parseClassId = function parseClassId(node, isStatement, optionalId) { + _superClass.prototype.parseClassId.call(this, node, isStatement, optionalId); + + if (this.isRelational("<")) { + node.typeParameters = this.flowParseTypeParameterDeclaration(); + } + }; + + _proto.isKeyword = function isKeyword$$1(name) { + if (this.state.inType && name === "void") { + return false; + } else { + return _superClass.prototype.isKeyword.call(this, name); + } + }; + + _proto.readToken = function readToken(code) { + var next = this.input.charCodeAt(this.state.pos + 1); + + if (this.state.inType && (code === 62 || code === 60)) { + return this.finishOp(types.relational, 1); + } else if (isIteratorStart(code, next)) { + this.state.isIterator = true; + return _superClass.prototype.readWord.call(this); + } else { + return _superClass.prototype.readToken.call(this, code); + } + }; + + _proto.toAssignable = function toAssignable(node, isBinding, contextDescription) { + if (node.type === "TypeCastExpression") { + return _superClass.prototype.toAssignable.call(this, this.typeCastToParameter(node), isBinding, contextDescription); + } else { + return _superClass.prototype.toAssignable.call(this, node, isBinding, contextDescription); + } + }; + + _proto.toAssignableList = function toAssignableList(exprList, isBinding, contextDescription) { + for (var i = 0; i < exprList.length; i++) { + var expr = exprList[i]; + + if (expr && expr.type === "TypeCastExpression") { + exprList[i] = this.typeCastToParameter(expr); + } + } + + return _superClass.prototype.toAssignableList.call(this, exprList, isBinding, contextDescription); + }; + + _proto.toReferencedList = function toReferencedList(exprList) { + for (var i = 0; i < exprList.length; i++) { + var expr = exprList[i]; + + if (expr && expr._exprListItem && expr.type === "TypeCastExpression") { + this.raise(expr.start, "Unexpected type cast"); + } + } + + return exprList; + }; + + _proto.parseExprListItem = function parseExprListItem(allowEmpty, refShorthandDefaultPos, refNeedsArrowPos) { + var container = this.startNode(); + + var node = _superClass.prototype.parseExprListItem.call(this, allowEmpty, refShorthandDefaultPos, refNeedsArrowPos); + + if (this.match(types.colon)) { + container._exprListItem = true; + container.expression = node; + container.typeAnnotation = this.flowParseTypeAnnotation(); + return this.finishNode(container, "TypeCastExpression"); + } else { + return node; + } + }; + + _proto.checkLVal = function checkLVal(expr, isBinding, checkClashes, contextDescription) { + if (expr.type !== "TypeCastExpression") { + return _superClass.prototype.checkLVal.call(this, expr, isBinding, checkClashes, contextDescription); + } + }; + + _proto.parseClassProperty = function parseClassProperty(node) { + if (this.match(types.colon)) { + node.typeAnnotation = this.flowParseTypeAnnotation(); + } + + return _superClass.prototype.parseClassProperty.call(this, node); + }; + + _proto.isClassMethod = function isClassMethod() { + return this.isRelational("<") || _superClass.prototype.isClassMethod.call(this); + }; + + _proto.isClassProperty = function isClassProperty() { + return this.match(types.colon) || _superClass.prototype.isClassProperty.call(this); + }; + + _proto.isNonstaticConstructor = function isNonstaticConstructor(method) { + return !this.match(types.colon) && _superClass.prototype.isNonstaticConstructor.call(this, method); + }; + + _proto.pushClassMethod = function pushClassMethod(classBody, method, isGenerator, isAsync, isConstructor) { + if (method.variance) { + this.unexpected(method.variance.start); + } + + delete method.variance; + + if (this.isRelational("<")) { + method.typeParameters = this.flowParseTypeParameterDeclaration(false); + } + + _superClass.prototype.pushClassMethod.call(this, classBody, method, isGenerator, isAsync, isConstructor); + }; + + _proto.pushClassPrivateMethod = function pushClassPrivateMethod(classBody, method, isGenerator, isAsync) { + if (method.variance) { + this.unexpected(method.variance.start); + } + + delete method.variance; + + if (this.isRelational("<")) { + method.typeParameters = this.flowParseTypeParameterDeclaration(); + } + + _superClass.prototype.pushClassPrivateMethod.call(this, classBody, method, isGenerator, isAsync); + }; + + _proto.parseClassSuper = function parseClassSuper(node) { + _superClass.prototype.parseClassSuper.call(this, node); + + if (node.superClass && this.isRelational("<")) { + node.superTypeParameters = this.flowParseTypeParameterInstantiation(); + } + + if (this.isContextual("implements")) { + this.next(); + var implemented = node.implements = []; + + do { + var _node2 = this.startNode(); + + _node2.id = this.flowParseRestrictedIdentifier(true); + + if (this.isRelational("<")) { + _node2.typeParameters = this.flowParseTypeParameterInstantiation(); + } else { + _node2.typeParameters = null; + } + + implemented.push(this.finishNode(_node2, "ClassImplements")); + } while (this.eat(types.comma)); + } + }; + + _proto.parsePropertyName = function parsePropertyName(node) { + var variance = this.flowParseVariance(); + + var key = _superClass.prototype.parsePropertyName.call(this, node); + + node.variance = variance; + return key; + }; + + _proto.parseObjPropValue = function parseObjPropValue(prop, startPos, startLoc, isGenerator, isAsync, isPattern, refShorthandDefaultPos, containsEsc) { + if (prop.variance) { + this.unexpected(prop.variance.start); + } + + delete prop.variance; + var typeParameters; + + if (this.isRelational("<")) { + typeParameters = this.flowParseTypeParameterDeclaration(false); + if (!this.match(types.parenL)) this.unexpected(); + } + + _superClass.prototype.parseObjPropValue.call(this, prop, startPos, startLoc, isGenerator, isAsync, isPattern, refShorthandDefaultPos, containsEsc); + + if (typeParameters) { + (prop.value || prop).typeParameters = typeParameters; + } + }; + + _proto.parseAssignableListItemTypes = function parseAssignableListItemTypes(param) { + if (this.eat(types.question)) { + if (param.type !== "Identifier") { + throw this.raise(param.start, "A binding pattern parameter cannot be optional in an implementation signature."); + } + + param.optional = true; + } + + if (this.match(types.colon)) { + param.typeAnnotation = this.flowParseTypeAnnotation(); + } + + this.finishNode(param, param.type); + return param; + }; + + _proto.parseMaybeDefault = function parseMaybeDefault(startPos, startLoc, left) { + var node = _superClass.prototype.parseMaybeDefault.call(this, startPos, startLoc, left); + + if (node.type === "AssignmentPattern" && node.typeAnnotation && node.right.start < node.typeAnnotation.start) { + this.raise(node.typeAnnotation.start, "Type annotations must come before default assignments, " + "e.g. instead of `age = 25: number` use `age: number = 25`"); + } + + return node; + }; + + _proto.shouldParseDefaultImport = function shouldParseDefaultImport(node) { + if (!hasTypeImportKind(node)) { + return _superClass.prototype.shouldParseDefaultImport.call(this, node); + } + + return isMaybeDefaultImport(this.state); + }; + + _proto.parseImportSpecifierLocal = function parseImportSpecifierLocal(node, specifier, type, contextDescription) { + specifier.local = hasTypeImportKind(node) ? this.flowParseRestrictedIdentifier(true) : this.parseIdentifier(); + this.checkLVal(specifier.local, true, undefined, contextDescription); + node.specifiers.push(this.finishNode(specifier, type)); + }; + + _proto.parseImportSpecifiers = function parseImportSpecifiers(node) { + node.importKind = "value"; + var kind = null; + + if (this.match(types._typeof)) { + kind = "typeof"; + } else if (this.isContextual("type")) { + kind = "type"; + } + + if (kind) { + var lh = this.lookahead(); + + if (kind === "type" && lh.type === types.star) { + this.unexpected(lh.start); + } + + if (isMaybeDefaultImport(lh) || lh.type === types.braceL || lh.type === types.star) { + this.next(); + node.importKind = kind; + } + } + + _superClass.prototype.parseImportSpecifiers.call(this, node); + }; + + _proto.parseImportSpecifier = function parseImportSpecifier(node) { + var specifier = this.startNode(); + var firstIdentLoc = this.state.start; + var firstIdent = this.parseIdentifier(true); + var specifierTypeKind = null; + + if (firstIdent.name === "type") { + specifierTypeKind = "type"; + } else if (firstIdent.name === "typeof") { + specifierTypeKind = "typeof"; + } + + var isBinding = false; + + if (this.isContextual("as") && !this.isLookaheadContextual("as")) { + var as_ident = this.parseIdentifier(true); + + if (specifierTypeKind !== null && !this.match(types.name) && !this.state.type.keyword) { + specifier.imported = as_ident; + specifier.importKind = specifierTypeKind; + specifier.local = as_ident.__clone(); + } else { + specifier.imported = firstIdent; + specifier.importKind = null; + specifier.local = this.parseIdentifier(); + } + } else if (specifierTypeKind !== null && (this.match(types.name) || this.state.type.keyword)) { + specifier.imported = this.parseIdentifier(true); + specifier.importKind = specifierTypeKind; + + if (this.eatContextual("as")) { + specifier.local = this.parseIdentifier(); + } else { + isBinding = true; + specifier.local = specifier.imported.__clone(); + } + } else { + isBinding = true; + specifier.imported = firstIdent; + specifier.importKind = null; + specifier.local = specifier.imported.__clone(); + } + + var nodeIsTypeImport = hasTypeImportKind(node); + var specifierIsTypeImport = hasTypeImportKind(specifier); + + if (nodeIsTypeImport && specifierIsTypeImport) { + this.raise(firstIdentLoc, "The `type` and `typeof` keywords on named imports can only be used on regular " + "`import` statements. It cannot be used with `import type` or `import typeof` statements"); + } + + if (nodeIsTypeImport || specifierIsTypeImport) { + this.checkReservedType(specifier.local.name, specifier.local.start); + } + + if (isBinding && !nodeIsTypeImport && !specifierIsTypeImport) { + this.checkReservedWord(specifier.local.name, specifier.start, true, true); + } + + this.checkLVal(specifier.local, true, undefined, "import specifier"); + node.specifiers.push(this.finishNode(specifier, "ImportSpecifier")); + }; + + _proto.parseFunctionParams = function parseFunctionParams(node) { + var kind = node.kind; + + if (kind !== "get" && kind !== "set" && this.isRelational("<")) { + node.typeParameters = this.flowParseTypeParameterDeclaration(false); + } + + _superClass.prototype.parseFunctionParams.call(this, node); + }; + + _proto.parseVarHead = function parseVarHead(decl) { + _superClass.prototype.parseVarHead.call(this, decl); + + if (this.match(types.colon)) { + decl.id.typeAnnotation = this.flowParseTypeAnnotation(); + this.finishNode(decl.id, decl.id.type); + } + }; + + _proto.parseAsyncArrowFromCallExpression = function parseAsyncArrowFromCallExpression(node, call) { + if (this.match(types.colon)) { + var oldNoAnonFunctionType = this.state.noAnonFunctionType; + this.state.noAnonFunctionType = true; + node.returnType = this.flowParseTypeAnnotation(); + this.state.noAnonFunctionType = oldNoAnonFunctionType; + } + + return _superClass.prototype.parseAsyncArrowFromCallExpression.call(this, node, call); + }; + + _proto.shouldParseAsyncArrow = function shouldParseAsyncArrow() { + return this.match(types.colon) || _superClass.prototype.shouldParseAsyncArrow.call(this); + }; + + _proto.parseMaybeAssign = function parseMaybeAssign(noIn, refShorthandDefaultPos, afterLeftParse, refNeedsArrowPos) { + var _this5 = this; + + var jsxError = null; + + if (types.jsxTagStart && this.match(types.jsxTagStart)) { + var state = this.state.clone(); + + try { + return _superClass.prototype.parseMaybeAssign.call(this, noIn, refShorthandDefaultPos, afterLeftParse, refNeedsArrowPos); + } catch (err) { + if (err instanceof SyntaxError) { + this.state = state; + this.state.context.length -= 2; + jsxError = err; + } else { + throw err; + } + } + } + + if (jsxError != null || this.isRelational("<")) { + var arrowExpression; + var typeParameters; + + try { + typeParameters = this.flowParseTypeParameterDeclaration(); + arrowExpression = this.forwardNoArrowParamsConversionAt(typeParameters, function () { + return _superClass.prototype.parseMaybeAssign.call(_this5, noIn, refShorthandDefaultPos, afterLeftParse, refNeedsArrowPos); + }); + arrowExpression.typeParameters = typeParameters; + this.resetStartLocationFromNode(arrowExpression, typeParameters); + } catch (err) { + throw jsxError || err; + } + + if (arrowExpression.type === "ArrowFunctionExpression") { + return arrowExpression; + } else if (jsxError != null) { + throw jsxError; + } else { + this.raise(typeParameters.start, "Expected an arrow function after this type parameter declaration"); + } + } + + return _superClass.prototype.parseMaybeAssign.call(this, noIn, refShorthandDefaultPos, afterLeftParse, refNeedsArrowPos); + }; + + _proto.parseArrow = function parseArrow(node) { + if (this.match(types.colon)) { + var state = this.state.clone(); + + try { + var oldNoAnonFunctionType = this.state.noAnonFunctionType; + this.state.noAnonFunctionType = true; + var typeNode = this.startNode(); + + var _this$flowParseTypeAn3 = this.flowParseTypeAndPredicateInitialiser(); + + typeNode.typeAnnotation = _this$flowParseTypeAn3[0]; + node.predicate = _this$flowParseTypeAn3[1]; + this.state.noAnonFunctionType = oldNoAnonFunctionType; + if (this.canInsertSemicolon()) this.unexpected(); + if (!this.match(types.arrow)) this.unexpected(); + node.returnType = typeNode.typeAnnotation ? this.finishNode(typeNode, "TypeAnnotation") : null; + } catch (err) { + if (err instanceof SyntaxError) { + this.state = state; + } else { + throw err; + } + } + } + + return _superClass.prototype.parseArrow.call(this, node); + }; + + _proto.shouldParseArrow = function shouldParseArrow() { + return this.match(types.colon) || _superClass.prototype.shouldParseArrow.call(this); + }; + + _proto.setArrowFunctionParameters = function setArrowFunctionParameters(node, params) { + if (this.state.noArrowParamsConversionAt.indexOf(node.start) !== -1) { + node.params = params; + } else { + _superClass.prototype.setArrowFunctionParameters.call(this, node, params); + } + }; + + _proto.checkFunctionNameAndParams = function checkFunctionNameAndParams(node, isArrowFunction) { + if (isArrowFunction && this.state.noArrowParamsConversionAt.indexOf(node.start) !== -1) { + return; + } + + return _superClass.prototype.checkFunctionNameAndParams.call(this, node, isArrowFunction); + }; + + _proto.parseParenAndDistinguishExpression = function parseParenAndDistinguishExpression(canBeArrow) { + return _superClass.prototype.parseParenAndDistinguishExpression.call(this, canBeArrow && this.state.noArrowAt.indexOf(this.state.start) === -1); + }; + + _proto.parseSubscripts = function parseSubscripts(base, startPos, startLoc, noCalls) { + if (base.type === "Identifier" && base.name === "async" && this.state.noArrowAt.indexOf(startPos) !== -1) { + this.next(); + var node = this.startNodeAt(startPos, startLoc); + node.callee = base; + node.arguments = this.parseCallExpressionArguments(types.parenR, false); + base = this.finishNode(node, "CallExpression"); + } else if (base.type === "Identifier" && base.name === "async" && this.isRelational("<")) { + var state = this.state.clone(); + var error; + + try { + var _node3 = this.parseAsyncArrowWithTypeParameters(startPos, startLoc); + + if (_node3) return _node3; + } catch (e) { + error = e; + } + + this.state = state; + + try { + return _superClass.prototype.parseSubscripts.call(this, base, startPos, startLoc, noCalls); + } catch (e) { + throw error || e; + } + } + + return _superClass.prototype.parseSubscripts.call(this, base, startPos, startLoc, noCalls); + }; + + _proto.parseAsyncArrowWithTypeParameters = function parseAsyncArrowWithTypeParameters(startPos, startLoc) { + var node = this.startNodeAt(startPos, startLoc); + this.parseFunctionParams(node); + if (!this.parseArrow(node)) return; + return this.parseArrowExpression(node, undefined, true); + }; + + _proto.readToken_mult_modulo = function readToken_mult_modulo(code) { + var next = this.input.charCodeAt(this.state.pos + 1); + + if (code === 42 && next === 47 && this.state.hasFlowComment) { + this.state.hasFlowComment = false; + this.state.pos += 2; + this.nextToken(); + return; + } + + _superClass.prototype.readToken_mult_modulo.call(this, code); + }; + + _proto.skipBlockComment = function skipBlockComment() { + if (this.hasPlugin("flow") && this.hasPlugin("flowComments") && this.skipFlowComment()) { + this.hasFlowCommentCompletion(); + this.state.pos += this.skipFlowComment(); + this.state.hasFlowComment = true; + return; + } + + var end; + + if (this.hasPlugin("flow") && this.state.hasFlowComment) { + end = this.input.indexOf("*-/", this.state.pos += 2); + if (end === -1) this.raise(this.state.pos - 2, "Unterminated comment"); + this.state.pos = end + 3; + return; + } + + _superClass.prototype.skipBlockComment.call(this); + }; + + _proto.skipFlowComment = function skipFlowComment() { + var ch2 = this.input.charCodeAt(this.state.pos + 2); + var ch3 = this.input.charCodeAt(this.state.pos + 3); + + if (ch2 === 58 && ch3 === 58) { + return 4; + } + + if (this.input.slice(this.state.pos + 2, 14) === "flow-include") { + return 14; + } + + if (ch2 === 58 && ch3 !== 58 && 2) { + return 2; + } + + return false; + }; + + _proto.hasFlowCommentCompletion = function hasFlowCommentCompletion() { + var end = this.input.indexOf("*/", this.state.pos); + + if (end === -1) { + this.raise(this.state.pos, "Unterminated comment"); + } + }; + + _inheritsLoose(_class, _superClass); + + return _class; + }(superClass); +}); + +var entities = { + quot: "\"", + amp: "&", + apos: "'", + lt: "<", + gt: ">", + nbsp: "\xA0", + iexcl: "\xA1", + cent: "\xA2", + pound: "\xA3", + curren: "\xA4", + yen: "\xA5", + brvbar: "\xA6", + sect: "\xA7", + uml: "\xA8", + copy: "\xA9", + ordf: "\xAA", + laquo: "\xAB", + not: "\xAC", + shy: "\xAD", + reg: "\xAE", + macr: "\xAF", + deg: "\xB0", + plusmn: "\xB1", + sup2: "\xB2", + sup3: "\xB3", + acute: "\xB4", + micro: "\xB5", + para: "\xB6", + middot: "\xB7", + cedil: "\xB8", + sup1: "\xB9", + ordm: "\xBA", + raquo: "\xBB", + frac14: "\xBC", + frac12: "\xBD", + frac34: "\xBE", + iquest: "\xBF", + Agrave: "\xC0", + Aacute: "\xC1", + Acirc: "\xC2", + Atilde: "\xC3", + Auml: "\xC4", + Aring: "\xC5", + AElig: "\xC6", + Ccedil: "\xC7", + Egrave: "\xC8", + Eacute: "\xC9", + Ecirc: "\xCA", + Euml: "\xCB", + Igrave: "\xCC", + Iacute: "\xCD", + Icirc: "\xCE", + Iuml: "\xCF", + ETH: "\xD0", + Ntilde: "\xD1", + Ograve: "\xD2", + Oacute: "\xD3", + Ocirc: "\xD4", + Otilde: "\xD5", + Ouml: "\xD6", + times: "\xD7", + Oslash: "\xD8", + Ugrave: "\xD9", + Uacute: "\xDA", + Ucirc: "\xDB", + Uuml: "\xDC", + Yacute: "\xDD", + THORN: "\xDE", + szlig: "\xDF", + agrave: "\xE0", + aacute: "\xE1", + acirc: "\xE2", + atilde: "\xE3", + auml: "\xE4", + aring: "\xE5", + aelig: "\xE6", + ccedil: "\xE7", + egrave: "\xE8", + eacute: "\xE9", + ecirc: "\xEA", + euml: "\xEB", + igrave: "\xEC", + iacute: "\xED", + icirc: "\xEE", + iuml: "\xEF", + eth: "\xF0", + ntilde: "\xF1", + ograve: "\xF2", + oacute: "\xF3", + ocirc: "\xF4", + otilde: "\xF5", + ouml: "\xF6", + divide: "\xF7", + oslash: "\xF8", + ugrave: "\xF9", + uacute: "\xFA", + ucirc: "\xFB", + uuml: "\xFC", + yacute: "\xFD", + thorn: "\xFE", + yuml: "\xFF", + OElig: "\u0152", + oelig: "\u0153", + Scaron: "\u0160", + scaron: "\u0161", + Yuml: "\u0178", + fnof: "\u0192", + circ: "\u02C6", + tilde: "\u02DC", + Alpha: "\u0391", + Beta: "\u0392", + Gamma: "\u0393", + Delta: "\u0394", + Epsilon: "\u0395", + Zeta: "\u0396", + Eta: "\u0397", + Theta: "\u0398", + Iota: "\u0399", + Kappa: "\u039A", + Lambda: "\u039B", + Mu: "\u039C", + Nu: "\u039D", + Xi: "\u039E", + Omicron: "\u039F", + Pi: "\u03A0", + Rho: "\u03A1", + Sigma: "\u03A3", + Tau: "\u03A4", + Upsilon: "\u03A5", + Phi: "\u03A6", + Chi: "\u03A7", + Psi: "\u03A8", + Omega: "\u03A9", + alpha: "\u03B1", + beta: "\u03B2", + gamma: "\u03B3", + delta: "\u03B4", + epsilon: "\u03B5", + zeta: "\u03B6", + eta: "\u03B7", + theta: "\u03B8", + iota: "\u03B9", + kappa: "\u03BA", + lambda: "\u03BB", + mu: "\u03BC", + nu: "\u03BD", + xi: "\u03BE", + omicron: "\u03BF", + pi: "\u03C0", + rho: "\u03C1", + sigmaf: "\u03C2", + sigma: "\u03C3", + tau: "\u03C4", + upsilon: "\u03C5", + phi: "\u03C6", + chi: "\u03C7", + psi: "\u03C8", + omega: "\u03C9", + thetasym: "\u03D1", + upsih: "\u03D2", + piv: "\u03D6", + ensp: "\u2002", + emsp: "\u2003", + thinsp: "\u2009", + zwnj: "\u200C", + zwj: "\u200D", + lrm: "\u200E", + rlm: "\u200F", + ndash: "\u2013", + mdash: "\u2014", + lsquo: "\u2018", + rsquo: "\u2019", + sbquo: "\u201A", + ldquo: "\u201C", + rdquo: "\u201D", + bdquo: "\u201E", + dagger: "\u2020", + Dagger: "\u2021", + bull: "\u2022", + hellip: "\u2026", + permil: "\u2030", + prime: "\u2032", + Prime: "\u2033", + lsaquo: "\u2039", + rsaquo: "\u203A", + oline: "\u203E", + frasl: "\u2044", + euro: "\u20AC", + image: "\u2111", + weierp: "\u2118", + real: "\u211C", + trade: "\u2122", + alefsym: "\u2135", + larr: "\u2190", + uarr: "\u2191", + rarr: "\u2192", + darr: "\u2193", + harr: "\u2194", + crarr: "\u21B5", + lArr: "\u21D0", + uArr: "\u21D1", + rArr: "\u21D2", + dArr: "\u21D3", + hArr: "\u21D4", + forall: "\u2200", + part: "\u2202", + exist: "\u2203", + empty: "\u2205", + nabla: "\u2207", + isin: "\u2208", + notin: "\u2209", + ni: "\u220B", + prod: "\u220F", + sum: "\u2211", + minus: "\u2212", + lowast: "\u2217", + radic: "\u221A", + prop: "\u221D", + infin: "\u221E", + ang: "\u2220", + and: "\u2227", + or: "\u2228", + cap: "\u2229", + cup: "\u222A", + int: "\u222B", + there4: "\u2234", + sim: "\u223C", + cong: "\u2245", + asymp: "\u2248", + ne: "\u2260", + equiv: "\u2261", + le: "\u2264", + ge: "\u2265", + sub: "\u2282", + sup: "\u2283", + nsub: "\u2284", + sube: "\u2286", + supe: "\u2287", + oplus: "\u2295", + otimes: "\u2297", + perp: "\u22A5", + sdot: "\u22C5", + lceil: "\u2308", + rceil: "\u2309", + lfloor: "\u230A", + rfloor: "\u230B", + lang: "\u2329", + rang: "\u232A", + loz: "\u25CA", + spades: "\u2660", + clubs: "\u2663", + hearts: "\u2665", + diams: "\u2666" +}; + +var HEX_NUMBER = /^[\da-fA-F]+$/; +var DECIMAL_NUMBER = /^\d+$/; +types$1.j_oTag = new TokContext("<tag", false); +types$1.j_cTag = new TokContext("</tag", false); +types$1.j_expr = new TokContext("<tag>...</tag>", true, true); +types.jsxName = new TokenType("jsxName"); +types.jsxText = new TokenType("jsxText", { + beforeExpr: true +}); +types.jsxTagStart = new TokenType("jsxTagStart", { + startsExpr: true +}); +types.jsxTagEnd = new TokenType("jsxTagEnd"); + +types.jsxTagStart.updateContext = function () { + this.state.context.push(types$1.j_expr); + this.state.context.push(types$1.j_oTag); + this.state.exprAllowed = false; +}; + +types.jsxTagEnd.updateContext = function (prevType) { + var out = this.state.context.pop(); + + if (out === types$1.j_oTag && prevType === types.slash || out === types$1.j_cTag) { + this.state.context.pop(); + this.state.exprAllowed = this.curContext() === types$1.j_expr; + } else { + this.state.exprAllowed = true; + } +}; + +function isFragment(object) { + return object ? object.type === "JSXOpeningFragment" || object.type === "JSXClosingFragment" : false; +} + +function getQualifiedJSXName(object) { + if (object.type === "JSXIdentifier") { + return object.name; + } + + if (object.type === "JSXNamespacedName") { + return object.namespace.name + ":" + object.name.name; + } + + if (object.type === "JSXMemberExpression") { + return getQualifiedJSXName(object.object) + "." + getQualifiedJSXName(object.property); + } + + throw new Error("Node had unexpected type: " + object.type); +} + +var jsxPlugin = (function (superClass) { + return function (_superClass) { + function _class() { + return _superClass.apply(this, arguments) || this; + } + + var _proto = _class.prototype; + + _proto.jsxReadToken = function jsxReadToken() { + var out = ""; + var chunkStart = this.state.pos; + + for (;;) { + if (this.state.pos >= this.input.length) { + this.raise(this.state.start, "Unterminated JSX contents"); + } + + var ch = this.input.charCodeAt(this.state.pos); + + switch (ch) { + case 60: + case 123: + if (this.state.pos === this.state.start) { + if (ch === 60 && this.state.exprAllowed) { + ++this.state.pos; + return this.finishToken(types.jsxTagStart); + } + + return this.getTokenFromCode(ch); + } + + out += this.input.slice(chunkStart, this.state.pos); + return this.finishToken(types.jsxText, out); + + case 38: + out += this.input.slice(chunkStart, this.state.pos); + out += this.jsxReadEntity(); + chunkStart = this.state.pos; + break; + + default: + if (isNewLine(ch)) { + out += this.input.slice(chunkStart, this.state.pos); + out += this.jsxReadNewLine(true); + chunkStart = this.state.pos; + } else { + ++this.state.pos; + } + + } + } + }; + + _proto.jsxReadNewLine = function jsxReadNewLine(normalizeCRLF) { + var ch = this.input.charCodeAt(this.state.pos); + var out; + ++this.state.pos; + + if (ch === 13 && this.input.charCodeAt(this.state.pos) === 10) { + ++this.state.pos; + out = normalizeCRLF ? "\n" : "\r\n"; + } else { + out = String.fromCharCode(ch); + } + + ++this.state.curLine; + this.state.lineStart = this.state.pos; + return out; + }; + + _proto.jsxReadString = function jsxReadString(quote) { + var out = ""; + var chunkStart = ++this.state.pos; + + for (;;) { + if (this.state.pos >= this.input.length) { + this.raise(this.state.start, "Unterminated string constant"); + } + + var ch = this.input.charCodeAt(this.state.pos); + if (ch === quote) break; + + if (ch === 38) { + out += this.input.slice(chunkStart, this.state.pos); + out += this.jsxReadEntity(); + chunkStart = this.state.pos; + } else if (isNewLine(ch)) { + out += this.input.slice(chunkStart, this.state.pos); + out += this.jsxReadNewLine(false); + chunkStart = this.state.pos; + } else { + ++this.state.pos; + } + } + + out += this.input.slice(chunkStart, this.state.pos++); + return this.finishToken(types.string, out); + }; + + _proto.jsxReadEntity = function jsxReadEntity() { + var str = ""; + var count = 0; + var entity; + var ch = this.input[this.state.pos]; + var startPos = ++this.state.pos; + + while (this.state.pos < this.input.length && count++ < 10) { + ch = this.input[this.state.pos++]; + + if (ch === ";") { + if (str[0] === "#") { + if (str[1] === "x") { + str = str.substr(2); + + if (HEX_NUMBER.test(str)) { + entity = String.fromCodePoint(parseInt(str, 16)); + } + } else { + str = str.substr(1); + + if (DECIMAL_NUMBER.test(str)) { + entity = String.fromCodePoint(parseInt(str, 10)); + } + } + } else { + entity = entities[str]; + } + + break; + } + + str += ch; + } + + if (!entity) { + this.state.pos = startPos; + return "&"; + } + + return entity; + }; + + _proto.jsxReadWord = function jsxReadWord() { + var ch; + var start = this.state.pos; + + do { + ch = this.input.charCodeAt(++this.state.pos); + } while (isIdentifierChar(ch) || ch === 45); + + return this.finishToken(types.jsxName, this.input.slice(start, this.state.pos)); + }; + + _proto.jsxParseIdentifier = function jsxParseIdentifier() { + var node = this.startNode(); + + if (this.match(types.jsxName)) { + node.name = this.state.value; + } else if (this.state.type.keyword) { + node.name = this.state.type.keyword; + } else { + this.unexpected(); + } + + this.next(); + return this.finishNode(node, "JSXIdentifier"); + }; + + _proto.jsxParseNamespacedName = function jsxParseNamespacedName() { + var startPos = this.state.start; + var startLoc = this.state.startLoc; + var name = this.jsxParseIdentifier(); + if (!this.eat(types.colon)) return name; + var node = this.startNodeAt(startPos, startLoc); + node.namespace = name; + node.name = this.jsxParseIdentifier(); + return this.finishNode(node, "JSXNamespacedName"); + }; + + _proto.jsxParseElementName = function jsxParseElementName() { + var startPos = this.state.start; + var startLoc = this.state.startLoc; + var node = this.jsxParseNamespacedName(); + + while (this.eat(types.dot)) { + var newNode = this.startNodeAt(startPos, startLoc); + newNode.object = node; + newNode.property = this.jsxParseIdentifier(); + node = this.finishNode(newNode, "JSXMemberExpression"); + } + + return node; + }; + + _proto.jsxParseAttributeValue = function jsxParseAttributeValue() { + var node; + + switch (this.state.type) { + case types.braceL: + node = this.jsxParseExpressionContainer(); + + if (node.expression.type === "JSXEmptyExpression") { + throw this.raise(node.start, "JSX attributes must only be assigned a non-empty expression"); + } else { + return node; + } + + case types.jsxTagStart: + case types.string: + return this.parseExprAtom(); + + default: + throw this.raise(this.state.start, "JSX value should be either an expression or a quoted JSX text"); + } + }; + + _proto.jsxParseEmptyExpression = function jsxParseEmptyExpression() { + var node = this.startNodeAt(this.state.lastTokEnd, this.state.lastTokEndLoc); + return this.finishNodeAt(node, "JSXEmptyExpression", this.state.start, this.state.startLoc); + }; + + _proto.jsxParseSpreadChild = function jsxParseSpreadChild() { + var node = this.startNode(); + this.expect(types.braceL); + this.expect(types.ellipsis); + node.expression = this.parseExpression(); + this.expect(types.braceR); + return this.finishNode(node, "JSXSpreadChild"); + }; + + _proto.jsxParseExpressionContainer = function jsxParseExpressionContainer() { + var node = this.startNode(); + this.next(); + + if (this.match(types.braceR)) { + node.expression = this.jsxParseEmptyExpression(); + } else { + node.expression = this.parseExpression(); + } + + this.expect(types.braceR); + return this.finishNode(node, "JSXExpressionContainer"); + }; + + _proto.jsxParseAttribute = function jsxParseAttribute() { + var node = this.startNode(); + + if (this.eat(types.braceL)) { + this.expect(types.ellipsis); + node.argument = this.parseMaybeAssign(); + this.expect(types.braceR); + return this.finishNode(node, "JSXSpreadAttribute"); + } + + node.name = this.jsxParseNamespacedName(); + node.value = this.eat(types.eq) ? this.jsxParseAttributeValue() : null; + return this.finishNode(node, "JSXAttribute"); + }; + + _proto.jsxParseOpeningElementAt = function jsxParseOpeningElementAt(startPos, startLoc) { + var node = this.startNodeAt(startPos, startLoc); + + if (this.match(types.jsxTagEnd)) { + this.expect(types.jsxTagEnd); + return this.finishNode(node, "JSXOpeningFragment"); + } + + node.attributes = []; + node.name = this.jsxParseElementName(); + + while (!this.match(types.slash) && !this.match(types.jsxTagEnd)) { + node.attributes.push(this.jsxParseAttribute()); + } + + node.selfClosing = this.eat(types.slash); + this.expect(types.jsxTagEnd); + return this.finishNode(node, "JSXOpeningElement"); + }; + + _proto.jsxParseClosingElementAt = function jsxParseClosingElementAt(startPos, startLoc) { + var node = this.startNodeAt(startPos, startLoc); + + if (this.match(types.jsxTagEnd)) { + this.expect(types.jsxTagEnd); + return this.finishNode(node, "JSXClosingFragment"); + } + + node.name = this.jsxParseElementName(); + this.expect(types.jsxTagEnd); + return this.finishNode(node, "JSXClosingElement"); + }; + + _proto.jsxParseElementAt = function jsxParseElementAt(startPos, startLoc) { + var node = this.startNodeAt(startPos, startLoc); + var children = []; + var openingElement = this.jsxParseOpeningElementAt(startPos, startLoc); + var closingElement = null; + + if (!openingElement.selfClosing) { + contents: for (;;) { + switch (this.state.type) { + case types.jsxTagStart: + startPos = this.state.start; + startLoc = this.state.startLoc; + this.next(); + + if (this.eat(types.slash)) { + closingElement = this.jsxParseClosingElementAt(startPos, startLoc); + break contents; + } + + children.push(this.jsxParseElementAt(startPos, startLoc)); + break; + + case types.jsxText: + children.push(this.parseExprAtom()); + break; + + case types.braceL: + if (this.lookahead().type === types.ellipsis) { + children.push(this.jsxParseSpreadChild()); + } else { + children.push(this.jsxParseExpressionContainer()); + } + + break; + + default: + throw this.unexpected(); + } + } + + if (isFragment(openingElement) && !isFragment(closingElement)) { + this.raise(closingElement.start, "Expected corresponding JSX closing tag for <>"); + } else if (!isFragment(openingElement) && isFragment(closingElement)) { + this.raise(closingElement.start, "Expected corresponding JSX closing tag for <" + getQualifiedJSXName(openingElement.name) + ">"); + } else if (!isFragment(openingElement) && !isFragment(closingElement)) { + if (getQualifiedJSXName(closingElement.name) !== getQualifiedJSXName(openingElement.name)) { + this.raise(closingElement.start, "Expected corresponding JSX closing tag for <" + getQualifiedJSXName(openingElement.name) + ">"); + } + } + } + + if (isFragment(openingElement)) { + node.openingFragment = openingElement; + node.closingFragment = closingElement; + } else { + node.openingElement = openingElement; + node.closingElement = closingElement; + } + + node.children = children; + + if (this.match(types.relational) && this.state.value === "<") { + this.raise(this.state.start, "Adjacent JSX elements must be wrapped in an enclosing tag. " + "Did you want a JSX fragment <>...</>?"); + } + + return isFragment(openingElement) ? this.finishNode(node, "JSXFragment") : this.finishNode(node, "JSXElement"); + }; + + _proto.jsxParseElement = function jsxParseElement() { + var startPos = this.state.start; + var startLoc = this.state.startLoc; + this.next(); + return this.jsxParseElementAt(startPos, startLoc); + }; + + _proto.parseExprAtom = function parseExprAtom(refShortHandDefaultPos) { + if (this.match(types.jsxText)) { + return this.parseLiteral(this.state.value, "JSXText"); + } else if (this.match(types.jsxTagStart)) { + return this.jsxParseElement(); + } else { + return _superClass.prototype.parseExprAtom.call(this, refShortHandDefaultPos); + } + }; + + _proto.readToken = function readToken(code) { + if (this.state.inPropertyName) return _superClass.prototype.readToken.call(this, code); + var context = this.curContext(); + + if (context === types$1.j_expr) { + return this.jsxReadToken(); + } + + if (context === types$1.j_oTag || context === types$1.j_cTag) { + if (isIdentifierStart(code)) { + return this.jsxReadWord(); + } + + if (code === 62) { + ++this.state.pos; + return this.finishToken(types.jsxTagEnd); + } + + if ((code === 34 || code === 39) && context === types$1.j_oTag) { + return this.jsxReadString(code); + } + } + + if (code === 60 && this.state.exprAllowed) { + ++this.state.pos; + return this.finishToken(types.jsxTagStart); + } + + return _superClass.prototype.readToken.call(this, code); + }; + + _proto.updateContext = function updateContext(prevType) { + if (this.match(types.braceL)) { + var curContext = this.curContext(); + + if (curContext === types$1.j_oTag) { + this.state.context.push(types$1.braceExpression); + } else if (curContext === types$1.j_expr) { + this.state.context.push(types$1.templateQuasi); + } else { + _superClass.prototype.updateContext.call(this, prevType); + } + + this.state.exprAllowed = true; + } else if (this.match(types.slash) && prevType === types.jsxTagStart) { + this.state.context.length -= 2; + this.state.context.push(types$1.j_cTag); + this.state.exprAllowed = false; + } else { + return _superClass.prototype.updateContext.call(this, prevType); + } + }; + + _inheritsLoose(_class, _superClass); + + return _class; + }(superClass); +}); + +function nonNull(x) { + if (x == null) { + throw new Error("Unexpected " + x + " value."); + } + + return x; +} + +function assert(x) { + if (!x) { + throw new Error("Assert fail"); + } +} + +function keywordTypeFromName(value) { + switch (value) { + case "any": + return "TSAnyKeyword"; + + case "boolean": + return "TSBooleanKeyword"; + + case "never": + return "TSNeverKeyword"; + + case "number": + return "TSNumberKeyword"; + + case "object": + return "TSObjectKeyword"; + + case "string": + return "TSStringKeyword"; + + case "symbol": + return "TSSymbolKeyword"; + + case "undefined": + return "TSUndefinedKeyword"; + + default: + return undefined; + } +} + +var typescriptPlugin = (function (superClass) { + return function (_superClass) { + function _class() { + return _superClass.apply(this, arguments) || this; + } + + var _proto = _class.prototype; + + _proto.tsIsIdentifier = function tsIsIdentifier() { + return this.match(types.name); + }; + + _proto.tsNextTokenCanFollowModifier = function tsNextTokenCanFollowModifier() { + this.next(); + return !this.hasPrecedingLineBreak() && !this.match(types.parenL) && !this.match(types.colon) && !this.match(types.eq) && !this.match(types.question); + }; + + _proto.tsParseModifier = function tsParseModifier(allowedModifiers) { + if (!this.match(types.name)) { + return undefined; + } + + var modifier = this.state.value; + + if (allowedModifiers.indexOf(modifier) !== -1 && this.tsTryParse(this.tsNextTokenCanFollowModifier.bind(this))) { + return modifier; + } + + return undefined; + }; + + _proto.tsIsListTerminator = function tsIsListTerminator(kind) { + switch (kind) { + case "EnumMembers": + case "TypeMembers": + return this.match(types.braceR); + + case "HeritageClauseElement": + return this.match(types.braceL); + + case "TupleElementTypes": + return this.match(types.bracketR); + + case "TypeParametersOrArguments": + return this.isRelational(">"); + } + + throw new Error("Unreachable"); + }; + + _proto.tsParseList = function tsParseList(kind, parseElement) { + var result = []; + + while (!this.tsIsListTerminator(kind)) { + result.push(parseElement()); + } + + return result; + }; + + _proto.tsParseDelimitedList = function tsParseDelimitedList(kind, parseElement) { + return nonNull(this.tsParseDelimitedListWorker(kind, parseElement, true)); + }; + + _proto.tsTryParseDelimitedList = function tsTryParseDelimitedList(kind, parseElement) { + return this.tsParseDelimitedListWorker(kind, parseElement, false); + }; + + _proto.tsParseDelimitedListWorker = function tsParseDelimitedListWorker(kind, parseElement, expectSuccess) { + var result = []; + + while (true) { + if (this.tsIsListTerminator(kind)) { + break; + } + + var element = parseElement(); + + if (element == null) { + return undefined; + } + + result.push(element); + + if (this.eat(types.comma)) { + continue; + } + + if (this.tsIsListTerminator(kind)) { + break; + } + + if (expectSuccess) { + this.expect(types.comma); + } + + return undefined; + } + + return result; + }; + + _proto.tsParseBracketedList = function tsParseBracketedList(kind, parseElement, bracket, skipFirstToken) { + if (!skipFirstToken) { + if (bracket) { + this.expect(types.bracketL); + } else { + this.expectRelational("<"); + } + } + + var result = this.tsParseDelimitedList(kind, parseElement); + + if (bracket) { + this.expect(types.bracketR); + } else { + this.expectRelational(">"); + } + + return result; + }; + + _proto.tsParseEntityName = function tsParseEntityName(allowReservedWords) { + var entity = this.parseIdentifier(); + + while (this.eat(types.dot)) { + var node = this.startNodeAtNode(entity); + node.left = entity; + node.right = this.parseIdentifier(allowReservedWords); + entity = this.finishNode(node, "TSQualifiedName"); + } + + return entity; + }; + + _proto.tsParseTypeReference = function tsParseTypeReference() { + var node = this.startNode(); + node.typeName = this.tsParseEntityName(false); + + if (!this.hasPrecedingLineBreak() && this.isRelational("<")) { + node.typeParameters = this.tsParseTypeArguments(); + } + + return this.finishNode(node, "TSTypeReference"); + }; + + _proto.tsParseThisTypePredicate = function tsParseThisTypePredicate(lhs) { + this.next(); + var node = this.startNode(); + node.parameterName = lhs; + node.typeAnnotation = this.tsParseTypeAnnotation(false); + return this.finishNode(node, "TSTypePredicate"); + }; + + _proto.tsParseThisTypeNode = function tsParseThisTypeNode() { + var node = this.startNode(); + this.next(); + return this.finishNode(node, "TSThisType"); + }; + + _proto.tsParseTypeQuery = function tsParseTypeQuery() { + var node = this.startNode(); + this.expect(types._typeof); + node.exprName = this.tsParseEntityName(true); + return this.finishNode(node, "TSTypeQuery"); + }; + + _proto.tsParseTypeParameter = function tsParseTypeParameter() { + var node = this.startNode(); + node.name = this.parseIdentifierName(node.start); + node.constraint = this.tsEatThenParseType(types._extends); + node.default = this.tsEatThenParseType(types.eq); + return this.finishNode(node, "TSTypeParameter"); + }; + + _proto.tsTryParseTypeParameters = function tsTryParseTypeParameters() { + if (this.isRelational("<")) { + return this.tsParseTypeParameters(); + } + }; + + _proto.tsParseTypeParameters = function tsParseTypeParameters() { + var node = this.startNode(); + + if (this.isRelational("<") || this.match(types.jsxTagStart)) { + this.next(); + } else { + this.unexpected(); + } + + node.params = this.tsParseBracketedList("TypeParametersOrArguments", this.tsParseTypeParameter.bind(this), false, true); + return this.finishNode(node, "TSTypeParameterDeclaration"); + }; + + _proto.tsFillSignature = function tsFillSignature(returnToken, signature) { + var returnTokenRequired = returnToken === types.arrow; + signature.typeParameters = this.tsTryParseTypeParameters(); + this.expect(types.parenL); + signature.parameters = this.tsParseBindingListForSignature(); + + if (returnTokenRequired) { + signature.typeAnnotation = this.tsParseTypeOrTypePredicateAnnotation(returnToken); + } else if (this.match(returnToken)) { + signature.typeAnnotation = this.tsParseTypeOrTypePredicateAnnotation(returnToken); + } + }; + + _proto.tsParseBindingListForSignature = function tsParseBindingListForSignature() { + var _this = this; + + return this.parseBindingList(types.parenR).map(function (pattern) { + if (pattern.type !== "Identifier" && pattern.type !== "RestElement") { + throw _this.unexpected(pattern.start, "Name in a signature must be an Identifier."); + } + + return pattern; + }); + }; + + _proto.tsParseTypeMemberSemicolon = function tsParseTypeMemberSemicolon() { + if (!this.eat(types.comma)) { + this.semicolon(); + } + }; + + _proto.tsParseSignatureMember = function tsParseSignatureMember(kind) { + var node = this.startNode(); + + if (kind === "TSConstructSignatureDeclaration") { + this.expect(types._new); + } + + this.tsFillSignature(types.colon, node); + this.tsParseTypeMemberSemicolon(); + return this.finishNode(node, kind); + }; + + _proto.tsIsUnambiguouslyIndexSignature = function tsIsUnambiguouslyIndexSignature() { + this.next(); + return this.eat(types.name) && this.match(types.colon); + }; + + _proto.tsTryParseIndexSignature = function tsTryParseIndexSignature(node) { + if (!(this.match(types.bracketL) && this.tsLookAhead(this.tsIsUnambiguouslyIndexSignature.bind(this)))) { + return undefined; + } + + this.expect(types.bracketL); + var id = this.parseIdentifier(); + this.expect(types.colon); + id.typeAnnotation = this.tsParseTypeAnnotation(false); + this.expect(types.bracketR); + node.parameters = [id]; + var type = this.tsTryParseTypeAnnotation(); + if (type) node.typeAnnotation = type; + this.tsParseTypeMemberSemicolon(); + return this.finishNode(node, "TSIndexSignature"); + }; + + _proto.tsParsePropertyOrMethodSignature = function tsParsePropertyOrMethodSignature(node, readonly) { + this.parsePropertyName(node); + if (this.eat(types.question)) node.optional = true; + var nodeAny = node; + + if (!readonly && (this.match(types.parenL) || this.isRelational("<"))) { + var method = nodeAny; + this.tsFillSignature(types.colon, method); + this.tsParseTypeMemberSemicolon(); + return this.finishNode(method, "TSMethodSignature"); + } else { + var property = nodeAny; + if (readonly) property.readonly = true; + var type = this.tsTryParseTypeAnnotation(); + if (type) property.typeAnnotation = type; + this.tsParseTypeMemberSemicolon(); + return this.finishNode(property, "TSPropertySignature"); + } + }; + + _proto.tsParseTypeMember = function tsParseTypeMember() { + if (this.match(types.parenL) || this.isRelational("<")) { + return this.tsParseSignatureMember("TSCallSignatureDeclaration"); + } + + if (this.match(types._new) && this.tsLookAhead(this.tsIsStartOfConstructSignature.bind(this))) { + return this.tsParseSignatureMember("TSConstructSignatureDeclaration"); + } + + var node = this.startNode(); + var readonly = !!this.tsParseModifier(["readonly"]); + var idx = this.tsTryParseIndexSignature(node); + + if (idx) { + if (readonly) node.readonly = true; + return idx; + } + + return this.tsParsePropertyOrMethodSignature(node, readonly); + }; + + _proto.tsIsStartOfConstructSignature = function tsIsStartOfConstructSignature() { + this.next(); + return this.match(types.parenL) || this.isRelational("<"); + }; + + _proto.tsParseTypeLiteral = function tsParseTypeLiteral() { + var node = this.startNode(); + node.members = this.tsParseObjectTypeMembers(); + return this.finishNode(node, "TSTypeLiteral"); + }; + + _proto.tsParseObjectTypeMembers = function tsParseObjectTypeMembers() { + this.expect(types.braceL); + var members = this.tsParseList("TypeMembers", this.tsParseTypeMember.bind(this)); + this.expect(types.braceR); + return members; + }; + + _proto.tsIsStartOfMappedType = function tsIsStartOfMappedType() { + this.next(); + + if (this.eat(types.plusMin)) { + return this.isContextual("readonly"); + } + + if (this.isContextual("readonly")) { + this.next(); + } + + if (!this.match(types.bracketL)) { + return false; + } + + this.next(); + + if (!this.tsIsIdentifier()) { + return false; + } + + this.next(); + return this.match(types._in); + }; + + _proto.tsParseMappedTypeParameter = function tsParseMappedTypeParameter() { + var node = this.startNode(); + node.name = this.parseIdentifierName(node.start); + node.constraint = this.tsExpectThenParseType(types._in); + return this.finishNode(node, "TSTypeParameter"); + }; + + _proto.tsParseMappedType = function tsParseMappedType() { + var node = this.startNode(); + this.expect(types.braceL); + + if (this.match(types.plusMin)) { + node.readonly = this.state.value; + this.next(); + this.expectContextual("readonly"); + } else if (this.eatContextual("readonly")) { + node.readonly = true; + } + + this.expect(types.bracketL); + node.typeParameter = this.tsParseMappedTypeParameter(); + this.expect(types.bracketR); + + if (this.match(types.plusMin)) { + node.optional = this.state.value; + this.next(); + this.expect(types.question); + } else if (this.eat(types.question)) { + node.optional = true; + } + + node.typeAnnotation = this.tsTryParseType(); + this.semicolon(); + this.expect(types.braceR); + return this.finishNode(node, "TSMappedType"); + }; + + _proto.tsParseTupleType = function tsParseTupleType() { + var node = this.startNode(); + node.elementTypes = this.tsParseBracketedList("TupleElementTypes", this.tsParseType.bind(this), true, false); + return this.finishNode(node, "TSTupleType"); + }; + + _proto.tsParseParenthesizedType = function tsParseParenthesizedType() { + var node = this.startNode(); + this.expect(types.parenL); + node.typeAnnotation = this.tsParseType(); + this.expect(types.parenR); + return this.finishNode(node, "TSParenthesizedType"); + }; + + _proto.tsParseFunctionOrConstructorType = function tsParseFunctionOrConstructorType(type) { + var node = this.startNode(); + + if (type === "TSConstructorType") { + this.expect(types._new); + } + + this.tsFillSignature(types.arrow, node); + return this.finishNode(node, type); + }; + + _proto.tsParseLiteralTypeNode = function tsParseLiteralTypeNode() { + var _this2 = this; + + var node = this.startNode(); + + node.literal = function () { + switch (_this2.state.type) { + case types.num: + return _this2.parseLiteral(_this2.state.value, "NumericLiteral"); + + case types.string: + return _this2.parseLiteral(_this2.state.value, "StringLiteral"); + + case types._true: + case types._false: + return _this2.parseBooleanLiteral(); + + default: + throw _this2.unexpected(); + } + }(); + + return this.finishNode(node, "TSLiteralType"); + }; + + _proto.tsParseNonArrayType = function tsParseNonArrayType() { + switch (this.state.type) { + case types.name: + case types._void: + case types._null: + { + var type = this.match(types._void) ? "TSVoidKeyword" : this.match(types._null) ? "TSNullKeyword" : keywordTypeFromName(this.state.value); + + if (type !== undefined && this.lookahead().type !== types.dot) { + var node = this.startNode(); + this.next(); + return this.finishNode(node, type); + } + + return this.tsParseTypeReference(); + } + + case types.string: + case types.num: + case types._true: + case types._false: + return this.tsParseLiteralTypeNode(); + + case types.plusMin: + if (this.state.value === "-") { + var _node = this.startNode(); + + this.next(); + + if (!this.match(types.num)) { + throw this.unexpected(); + } + + _node.literal = this.parseLiteral(-this.state.value, "NumericLiteral", _node.start, _node.loc.start); + return this.finishNode(_node, "TSLiteralType"); + } + + break; + + case types._this: + { + var thisKeyword = this.tsParseThisTypeNode(); + + if (this.isContextual("is") && !this.hasPrecedingLineBreak()) { + return this.tsParseThisTypePredicate(thisKeyword); + } else { + return thisKeyword; + } + } + + case types._typeof: + return this.tsParseTypeQuery(); + + case types.braceL: + return this.tsLookAhead(this.tsIsStartOfMappedType.bind(this)) ? this.tsParseMappedType() : this.tsParseTypeLiteral(); + + case types.bracketL: + return this.tsParseTupleType(); + + case types.parenL: + return this.tsParseParenthesizedType(); + } + + throw this.unexpected(); + }; + + _proto.tsParseArrayTypeOrHigher = function tsParseArrayTypeOrHigher() { + var type = this.tsParseNonArrayType(); + + while (!this.hasPrecedingLineBreak() && this.eat(types.bracketL)) { + if (this.match(types.bracketR)) { + var node = this.startNodeAtNode(type); + node.elementType = type; + this.expect(types.bracketR); + type = this.finishNode(node, "TSArrayType"); + } else { + var _node2 = this.startNodeAtNode(type); + + _node2.objectType = type; + _node2.indexType = this.tsParseType(); + this.expect(types.bracketR); + type = this.finishNode(_node2, "TSIndexedAccessType"); + } + } + + return type; + }; + + _proto.tsParseTypeOperator = function tsParseTypeOperator(operator) { + var node = this.startNode(); + this.expectContextual(operator); + node.operator = operator; + node.typeAnnotation = this.tsParseTypeOperatorOrHigher(); + return this.finishNode(node, "TSTypeOperator"); + }; + + _proto.tsParseInferType = function tsParseInferType() { + var node = this.startNode(); + this.expectContextual("infer"); + var typeParameter = this.startNode(); + typeParameter.name = this.parseIdentifierName(typeParameter.start); + node.typeParameter = this.finishNode(typeParameter, "TypeParameter"); + return this.finishNode(node, "TSInferType"); + }; + + _proto.tsParseTypeOperatorOrHigher = function tsParseTypeOperatorOrHigher() { + var _this3 = this; + + var operator = ["keyof", "unique"].find(function (kw) { + return _this3.isContextual(kw); + }); + return operator ? this.tsParseTypeOperator(operator) : this.isContextual("infer") ? this.tsParseInferType() : this.tsParseArrayTypeOrHigher(); + }; + + _proto.tsParseUnionOrIntersectionType = function tsParseUnionOrIntersectionType(kind, parseConstituentType, operator) { + this.eat(operator); + var type = parseConstituentType(); + + if (this.match(operator)) { + var types$$1 = [type]; + + while (this.eat(operator)) { + types$$1.push(parseConstituentType()); + } + + var node = this.startNodeAtNode(type); + node.types = types$$1; + type = this.finishNode(node, kind); + } + + return type; + }; + + _proto.tsParseIntersectionTypeOrHigher = function tsParseIntersectionTypeOrHigher() { + return this.tsParseUnionOrIntersectionType("TSIntersectionType", this.tsParseTypeOperatorOrHigher.bind(this), types.bitwiseAND); + }; + + _proto.tsParseUnionTypeOrHigher = function tsParseUnionTypeOrHigher() { + return this.tsParseUnionOrIntersectionType("TSUnionType", this.tsParseIntersectionTypeOrHigher.bind(this), types.bitwiseOR); + }; + + _proto.tsIsStartOfFunctionType = function tsIsStartOfFunctionType() { + if (this.isRelational("<")) { + return true; + } + + return this.match(types.parenL) && this.tsLookAhead(this.tsIsUnambiguouslyStartOfFunctionType.bind(this)); + }; + + _proto.tsSkipParameterStart = function tsSkipParameterStart() { + if (this.match(types.name) || this.match(types._this)) { + this.next(); + return true; + } + + return false; + }; + + _proto.tsIsUnambiguouslyStartOfFunctionType = function tsIsUnambiguouslyStartOfFunctionType() { + this.next(); + + if (this.match(types.parenR) || this.match(types.ellipsis)) { + return true; + } + + if (this.tsSkipParameterStart()) { + if (this.match(types.colon) || this.match(types.comma) || this.match(types.question) || this.match(types.eq)) { + return true; + } + + if (this.match(types.parenR)) { + this.next(); + + if (this.match(types.arrow)) { + return true; + } + } + } + + return false; + }; + + _proto.tsParseTypeOrTypePredicateAnnotation = function tsParseTypeOrTypePredicateAnnotation(returnToken) { + var _this4 = this; + + return this.tsInType(function () { + var t = _this4.startNode(); + + _this4.expect(returnToken); + + var typePredicateVariable = _this4.tsIsIdentifier() && _this4.tsTryParse(_this4.tsParseTypePredicatePrefix.bind(_this4)); + + if (!typePredicateVariable) { + return _this4.tsParseTypeAnnotation(false, t); + } + + var type = _this4.tsParseTypeAnnotation(false); + + var node = _this4.startNodeAtNode(typePredicateVariable); + + node.parameterName = typePredicateVariable; + node.typeAnnotation = type; + t.typeAnnotation = _this4.finishNode(node, "TSTypePredicate"); + return _this4.finishNode(t, "TSTypeAnnotation"); + }); + }; + + _proto.tsTryParseTypeOrTypePredicateAnnotation = function tsTryParseTypeOrTypePredicateAnnotation() { + return this.match(types.colon) ? this.tsParseTypeOrTypePredicateAnnotation(types.colon) : undefined; + }; + + _proto.tsTryParseTypeAnnotation = function tsTryParseTypeAnnotation() { + return this.match(types.colon) ? this.tsParseTypeAnnotation() : undefined; + }; + + _proto.tsTryParseType = function tsTryParseType() { + return this.tsEatThenParseType(types.colon); + }; + + _proto.tsParseTypePredicatePrefix = function tsParseTypePredicatePrefix() { + var id = this.parseIdentifier(); + + if (this.isContextual("is") && !this.hasPrecedingLineBreak()) { + this.next(); + return id; + } + }; + + _proto.tsParseTypeAnnotation = function tsParseTypeAnnotation(eatColon, t) { + var _this5 = this; + + if (eatColon === void 0) { + eatColon = true; + } + + if (t === void 0) { + t = this.startNode(); + } + + this.tsInType(function () { + if (eatColon) _this5.expect(types.colon); + t.typeAnnotation = _this5.tsParseType(); + }); + return this.finishNode(t, "TSTypeAnnotation"); + }; + + _proto.tsParseType = function tsParseType() { + assert(this.state.inType); + var type = this.tsParseNonConditionalType(); + + if (this.hasPrecedingLineBreak() || !this.eat(types._extends)) { + return type; + } + + var node = this.startNodeAtNode(type); + node.checkType = type; + node.extendsType = this.tsParseNonConditionalType(); + this.expect(types.question); + node.trueType = this.tsParseType(); + this.expect(types.colon); + node.falseType = this.tsParseType(); + return this.finishNode(node, "TSConditionalType"); + }; + + _proto.tsParseNonConditionalType = function tsParseNonConditionalType() { + if (this.tsIsStartOfFunctionType()) { + return this.tsParseFunctionOrConstructorType("TSFunctionType"); + } + + if (this.match(types._new)) { + return this.tsParseFunctionOrConstructorType("TSConstructorType"); + } + + return this.tsParseUnionTypeOrHigher(); + }; + + _proto.tsParseTypeAssertion = function tsParseTypeAssertion() { + var _this6 = this; + + var node = this.startNode(); + node.typeAnnotation = this.tsInType(function () { + return _this6.tsParseType(); + }); + this.expectRelational(">"); + node.expression = this.parseMaybeUnary(); + return this.finishNode(node, "TSTypeAssertion"); + }; + + _proto.tsTryParseTypeArgumentsInExpression = function tsTryParseTypeArgumentsInExpression() { + var _this7 = this; + + return this.tsTryParseAndCatch(function () { + var res = _this7.tsParseTypeArguments(); + + _this7.expect(types.parenL); + + return res; + }); + }; + + _proto.tsParseHeritageClause = function tsParseHeritageClause() { + return this.tsParseDelimitedList("HeritageClauseElement", this.tsParseExpressionWithTypeArguments.bind(this)); + }; + + _proto.tsParseExpressionWithTypeArguments = function tsParseExpressionWithTypeArguments() { + var node = this.startNode(); + node.expression = this.tsParseEntityName(false); + + if (this.isRelational("<")) { + node.typeParameters = this.tsParseTypeArguments(); + } + + return this.finishNode(node, "TSExpressionWithTypeArguments"); + }; + + _proto.tsParseInterfaceDeclaration = function tsParseInterfaceDeclaration(node) { + node.id = this.parseIdentifier(); + node.typeParameters = this.tsTryParseTypeParameters(); + + if (this.eat(types._extends)) { + node.extends = this.tsParseHeritageClause(); + } + + var body = this.startNode(); + body.body = this.tsParseObjectTypeMembers(); + node.body = this.finishNode(body, "TSInterfaceBody"); + return this.finishNode(node, "TSInterfaceDeclaration"); + }; + + _proto.tsParseTypeAliasDeclaration = function tsParseTypeAliasDeclaration(node) { + node.id = this.parseIdentifier(); + node.typeParameters = this.tsTryParseTypeParameters(); + node.typeAnnotation = this.tsExpectThenParseType(types.eq); + this.semicolon(); + return this.finishNode(node, "TSTypeAliasDeclaration"); + }; + + _proto.tsInType = function tsInType(cb) { + var oldInType = this.state.inType; + this.state.inType = true; + + try { + return cb(); + } finally { + this.state.inType = oldInType; + } + }; + + _proto.tsEatThenParseType = function tsEatThenParseType(token) { + return !this.match(token) ? undefined : this.tsNextThenParseType(); + }; + + _proto.tsExpectThenParseType = function tsExpectThenParseType(token) { + var _this8 = this; + + return this.tsDoThenParseType(function () { + return _this8.expect(token); + }); + }; + + _proto.tsNextThenParseType = function tsNextThenParseType() { + var _this9 = this; + + return this.tsDoThenParseType(function () { + return _this9.next(); + }); + }; + + _proto.tsDoThenParseType = function tsDoThenParseType(cb) { + var _this10 = this; + + return this.tsInType(function () { + cb(); + return _this10.tsParseType(); + }); + }; + + _proto.tsParseEnumMember = function tsParseEnumMember() { + var node = this.startNode(); + node.id = this.match(types.string) ? this.parseLiteral(this.state.value, "StringLiteral") : this.parseIdentifier(true); + + if (this.eat(types.eq)) { + node.initializer = this.parseMaybeAssign(); + } + + return this.finishNode(node, "TSEnumMember"); + }; + + _proto.tsParseEnumDeclaration = function tsParseEnumDeclaration(node, isConst) { + if (isConst) node.const = true; + node.id = this.parseIdentifier(); + this.expect(types.braceL); + node.members = this.tsParseDelimitedList("EnumMembers", this.tsParseEnumMember.bind(this)); + this.expect(types.braceR); + return this.finishNode(node, "TSEnumDeclaration"); + }; + + _proto.tsParseModuleBlock = function tsParseModuleBlock() { + var node = this.startNode(); + this.expect(types.braceL); + this.parseBlockOrModuleBlockBody(node.body = [], undefined, true, types.braceR); + return this.finishNode(node, "TSModuleBlock"); + }; + + _proto.tsParseModuleOrNamespaceDeclaration = function tsParseModuleOrNamespaceDeclaration(node) { + node.id = this.parseIdentifier(); + + if (this.eat(types.dot)) { + var inner = this.startNode(); + this.tsParseModuleOrNamespaceDeclaration(inner); + node.body = inner; + } else { + node.body = this.tsParseModuleBlock(); + } + + return this.finishNode(node, "TSModuleDeclaration"); + }; + + _proto.tsParseAmbientExternalModuleDeclaration = function tsParseAmbientExternalModuleDeclaration(node) { + if (this.isContextual("global")) { + node.global = true; + node.id = this.parseIdentifier(); + } else if (this.match(types.string)) { + node.id = this.parseExprAtom(); + } else { + this.unexpected(); + } + + if (this.match(types.braceL)) { + node.body = this.tsParseModuleBlock(); + } else { + this.semicolon(); + } + + return this.finishNode(node, "TSModuleDeclaration"); + }; + + _proto.tsParseImportEqualsDeclaration = function tsParseImportEqualsDeclaration(node, isExport) { + node.isExport = isExport || false; + node.id = this.parseIdentifier(); + this.expect(types.eq); + node.moduleReference = this.tsParseModuleReference(); + this.semicolon(); + return this.finishNode(node, "TSImportEqualsDeclaration"); + }; + + _proto.tsIsExternalModuleReference = function tsIsExternalModuleReference() { + return this.isContextual("require") && this.lookahead().type === types.parenL; + }; + + _proto.tsParseModuleReference = function tsParseModuleReference() { + return this.tsIsExternalModuleReference() ? this.tsParseExternalModuleReference() : this.tsParseEntityName(false); + }; + + _proto.tsParseExternalModuleReference = function tsParseExternalModuleReference() { + var node = this.startNode(); + this.expectContextual("require"); + this.expect(types.parenL); + + if (!this.match(types.string)) { + throw this.unexpected(); + } + + node.expression = this.parseLiteral(this.state.value, "StringLiteral"); + this.expect(types.parenR); + return this.finishNode(node, "TSExternalModuleReference"); + }; + + _proto.tsLookAhead = function tsLookAhead(f) { + var state = this.state.clone(); + var res = f(); + this.state = state; + return res; + }; + + _proto.tsTryParseAndCatch = function tsTryParseAndCatch(f) { + var state = this.state.clone(); + + try { + return f(); + } catch (e) { + if (e instanceof SyntaxError) { + this.state = state; + return undefined; + } + + throw e; + } + }; + + _proto.tsTryParse = function tsTryParse(f) { + var state = this.state.clone(); + var result = f(); + + if (result !== undefined && result !== false) { + return result; + } else { + this.state = state; + return undefined; + } + }; + + _proto.nodeWithSamePosition = function nodeWithSamePosition(original, type) { + var node = this.startNodeAtNode(original); + node.type = type; + node.end = original.end; + node.loc.end = original.loc.end; + + if (original.leadingComments) { + node.leadingComments = original.leadingComments; + } + + if (original.trailingComments) { + node.trailingComments = original.trailingComments; + } + + if (original.innerComments) node.innerComments = original.innerComments; + return node; + }; + + _proto.tsTryParseDeclare = function tsTryParseDeclare(nany) { + switch (this.state.type) { + case types._function: + this.next(); + return this.parseFunction(nany, true); + + case types._class: + return this.parseClass(nany, true, false); + + case types._const: + if (this.match(types._const) && this.isLookaheadContextual("enum")) { + this.expect(types._const); + this.expectContextual("enum"); + return this.tsParseEnumDeclaration(nany, true); + } + + case types._var: + case types._let: + return this.parseVarStatement(nany, this.state.type); + + case types.name: + { + var value = this.state.value; + + if (value === "global") { + return this.tsParseAmbientExternalModuleDeclaration(nany); + } else { + return this.tsParseDeclaration(nany, value, true); + } + } + } + }; + + _proto.tsTryParseExportDeclaration = function tsTryParseExportDeclaration() { + return this.tsParseDeclaration(this.startNode(), this.state.value, true); + }; + + _proto.tsParseExpressionStatement = function tsParseExpressionStatement(node, expr) { + switch (expr.name) { + case "declare": + { + var declaration = this.tsTryParseDeclare(node); + + if (declaration) { + declaration.declare = true; + return declaration; + } + + break; + } + + case "global": + if (this.match(types.braceL)) { + var mod = node; + mod.global = true; + mod.id = expr; + mod.body = this.tsParseModuleBlock(); + return this.finishNode(mod, "TSModuleDeclaration"); + } + + break; + + default: + return this.tsParseDeclaration(node, expr.name, false); + } + }; + + _proto.tsParseDeclaration = function tsParseDeclaration(node, value, next) { + switch (value) { + case "abstract": + if (next || this.match(types._class)) { + var cls = node; + cls.abstract = true; + if (next) this.next(); + return this.parseClass(cls, true, false); + } + + break; + + case "enum": + if (next || this.match(types.name)) { + if (next) this.next(); + return this.tsParseEnumDeclaration(node, false); + } + + break; + + case "interface": + if (next || this.match(types.name)) { + if (next) this.next(); + return this.tsParseInterfaceDeclaration(node); + } + + break; + + case "module": + if (next) this.next(); + + if (this.match(types.string)) { + return this.tsParseAmbientExternalModuleDeclaration(node); + } else if (next || this.match(types.name)) { + return this.tsParseModuleOrNamespaceDeclaration(node); + } + + break; + + case "namespace": + if (next || this.match(types.name)) { + if (next) this.next(); + return this.tsParseModuleOrNamespaceDeclaration(node); + } + + break; + + case "type": + if (next || this.match(types.name)) { + if (next) this.next(); + return this.tsParseTypeAliasDeclaration(node); + } + + break; + } + }; + + _proto.tsTryParseGenericAsyncArrowFunction = function tsTryParseGenericAsyncArrowFunction(startPos, startLoc) { + var _this11 = this; + + var res = this.tsTryParseAndCatch(function () { + var node = _this11.startNodeAt(startPos, startLoc); + + node.typeParameters = _this11.tsParseTypeParameters(); + + _superClass.prototype.parseFunctionParams.call(_this11, node); + + node.returnType = _this11.tsTryParseTypeOrTypePredicateAnnotation(); + + _this11.expect(types.arrow); + + return node; + }); + + if (!res) { + return undefined; + } + + res.id = null; + res.generator = false; + res.expression = true; + res.async = true; + this.parseFunctionBody(res, true); + return this.finishNode(res, "ArrowFunctionExpression"); + }; + + _proto.tsParseTypeArguments = function tsParseTypeArguments() { + var _this12 = this; + + var node = this.startNode(); + node.params = this.tsInType(function () { + _this12.expectRelational("<"); + + return _this12.tsParseDelimitedList("TypeParametersOrArguments", _this12.tsParseType.bind(_this12)); + }); + this.expectRelational(">"); + return this.finishNode(node, "TSTypeParameterInstantiation"); + }; + + _proto.tsIsDeclarationStart = function tsIsDeclarationStart() { + if (this.match(types.name)) { + switch (this.state.value) { + case "abstract": + case "declare": + case "enum": + case "interface": + case "module": + case "namespace": + case "type": + return true; + } + } + + return false; + }; + + _proto.isExportDefaultSpecifier = function isExportDefaultSpecifier() { + if (this.tsIsDeclarationStart()) return false; + return _superClass.prototype.isExportDefaultSpecifier.call(this); + }; + + _proto.parseAssignableListItem = function parseAssignableListItem(allowModifiers, decorators) { + var accessibility; + var readonly = false; + + if (allowModifiers) { + accessibility = this.parseAccessModifier(); + readonly = !!this.tsParseModifier(["readonly"]); + } + + var left = this.parseMaybeDefault(); + this.parseAssignableListItemTypes(left); + var elt = this.parseMaybeDefault(left.start, left.loc.start, left); + + if (accessibility || readonly) { + var pp = this.startNodeAtNode(elt); + + if (decorators.length) { + pp.decorators = decorators; + } + + if (accessibility) pp.accessibility = accessibility; + if (readonly) pp.readonly = readonly; + + if (elt.type !== "Identifier" && elt.type !== "AssignmentPattern") { + throw this.raise(pp.start, "A parameter property may not be declared using a binding pattern."); + } + + pp.parameter = elt; + return this.finishNode(pp, "TSParameterProperty"); + } else { + if (decorators.length) { + left.decorators = decorators; + } + + return elt; + } + }; + + _proto.parseFunctionBodyAndFinish = function parseFunctionBodyAndFinish(node, type, allowExpressionBody) { + if (!allowExpressionBody && this.match(types.colon)) { + node.returnType = this.tsParseTypeOrTypePredicateAnnotation(types.colon); + } + + var bodilessType = type === "FunctionDeclaration" ? "TSDeclareFunction" : type === "ClassMethod" ? "TSDeclareMethod" : undefined; + + if (bodilessType && !this.match(types.braceL) && this.isLineTerminator()) { + this.finishNode(node, bodilessType); + return; + } + + _superClass.prototype.parseFunctionBodyAndFinish.call(this, node, type, allowExpressionBody); + }; + + _proto.parseSubscript = function parseSubscript(base, startPos, startLoc, noCalls, state) { + if (!this.hasPrecedingLineBreak() && this.eat(types.bang)) { + var nonNullExpression = this.startNodeAt(startPos, startLoc); + nonNullExpression.expression = base; + return this.finishNode(nonNullExpression, "TSNonNullExpression"); + } + + if (!noCalls && this.isRelational("<")) { + if (this.atPossibleAsync(base)) { + var asyncArrowFn = this.tsTryParseGenericAsyncArrowFunction(startPos, startLoc); + + if (asyncArrowFn) { + return asyncArrowFn; + } + } + + var node = this.startNodeAt(startPos, startLoc); + node.callee = base; + var typeArguments = this.tsTryParseTypeArgumentsInExpression(); + + if (typeArguments) { + node.arguments = this.parseCallExpressionArguments(types.parenR, false); + node.typeParameters = typeArguments; + return this.finishCallExpression(node); + } + } + + return _superClass.prototype.parseSubscript.call(this, base, startPos, startLoc, noCalls, state); + }; + + _proto.parseNewArguments = function parseNewArguments(node) { + var _this13 = this; + + if (this.isRelational("<")) { + var typeParameters = this.tsTryParseAndCatch(function () { + var args = _this13.tsParseTypeArguments(); + + if (!_this13.match(types.parenL)) _this13.unexpected(); + return args; + }); + + if (typeParameters) { + node.typeParameters = typeParameters; + } + } + + _superClass.prototype.parseNewArguments.call(this, node); + }; + + _proto.parseExprOp = function parseExprOp(left, leftStartPos, leftStartLoc, minPrec, noIn) { + if (nonNull(types._in.binop) > minPrec && !this.hasPrecedingLineBreak() && this.isContextual("as")) { + var node = this.startNodeAt(leftStartPos, leftStartLoc); + node.expression = left; + node.typeAnnotation = this.tsNextThenParseType(); + this.finishNode(node, "TSAsExpression"); + return this.parseExprOp(node, leftStartPos, leftStartLoc, minPrec, noIn); + } + + return _superClass.prototype.parseExprOp.call(this, left, leftStartPos, leftStartLoc, minPrec, noIn); + }; + + _proto.checkReservedWord = function checkReservedWord(word, startLoc, checkKeywords, isBinding) {}; + + _proto.checkDuplicateExports = function checkDuplicateExports() {}; + + _proto.parseImport = function parseImport(node) { + if (this.match(types.name) && this.lookahead().type === types.eq) { + return this.tsParseImportEqualsDeclaration(node); + } + + return _superClass.prototype.parseImport.call(this, node); + }; + + _proto.parseExport = function parseExport(node) { + if (this.match(types._import)) { + this.expect(types._import); + return this.tsParseImportEqualsDeclaration(node, true); + } else if (this.eat(types.eq)) { + var assign = node; + assign.expression = this.parseExpression(); + this.semicolon(); + return this.finishNode(assign, "TSExportAssignment"); + } else if (this.eatContextual("as")) { + var decl = node; + this.expectContextual("namespace"); + decl.id = this.parseIdentifier(); + this.semicolon(); + return this.finishNode(decl, "TSNamespaceExportDeclaration"); + } else { + return _superClass.prototype.parseExport.call(this, node); + } + }; + + _proto.isAbstractClass = function isAbstractClass() { + return this.isContextual("abstract") && this.lookahead().type === types._class; + }; + + _proto.parseExportDefaultExpression = function parseExportDefaultExpression() { + if (this.isAbstractClass()) { + var cls = this.startNode(); + this.next(); + this.parseClass(cls, true, true); + cls.abstract = true; + return cls; + } + + return _superClass.prototype.parseExportDefaultExpression.call(this); + }; + + _proto.parseStatementContent = function parseStatementContent(declaration, topLevel) { + if (this.state.type === types._const) { + var ahead = this.lookahead(); + + if (ahead.type === types.name && ahead.value === "enum") { + var node = this.startNode(); + this.expect(types._const); + this.expectContextual("enum"); + return this.tsParseEnumDeclaration(node, true); + } + } + + return _superClass.prototype.parseStatementContent.call(this, declaration, topLevel); + }; + + _proto.parseAccessModifier = function parseAccessModifier() { + return this.tsParseModifier(["public", "protected", "private"]); + }; + + _proto.parseClassMember = function parseClassMember(classBody, member, state) { + var accessibility = this.parseAccessModifier(); + if (accessibility) member.accessibility = accessibility; + + _superClass.prototype.parseClassMember.call(this, classBody, member, state); + }; + + _proto.parseClassMemberWithIsStatic = function parseClassMemberWithIsStatic(classBody, member, state, isStatic) { + var methodOrProp = member; + var prop = member; + var propOrIdx = member; + var abstract = false, + readonly = false; + var mod = this.tsParseModifier(["abstract", "readonly"]); + + switch (mod) { + case "readonly": + readonly = true; + abstract = !!this.tsParseModifier(["abstract"]); + break; + + case "abstract": + abstract = true; + readonly = !!this.tsParseModifier(["readonly"]); + break; + } + + if (abstract) methodOrProp.abstract = true; + if (readonly) propOrIdx.readonly = true; + + if (!abstract && !isStatic && !methodOrProp.accessibility) { + var idx = this.tsTryParseIndexSignature(member); + + if (idx) { + classBody.body.push(idx); + return; + } + } + + if (readonly) { + methodOrProp.static = isStatic; + this.parseClassPropertyName(prop); + this.parsePostMemberNameModifiers(methodOrProp); + this.pushClassProperty(classBody, prop); + return; + } + + _superClass.prototype.parseClassMemberWithIsStatic.call(this, classBody, member, state, isStatic); + }; + + _proto.parsePostMemberNameModifiers = function parsePostMemberNameModifiers(methodOrProp) { + var optional = this.eat(types.question); + if (optional) methodOrProp.optional = true; + }; + + _proto.parseExpressionStatement = function parseExpressionStatement(node, expr) { + var decl = expr.type === "Identifier" ? this.tsParseExpressionStatement(node, expr) : undefined; + return decl || _superClass.prototype.parseExpressionStatement.call(this, node, expr); + }; + + _proto.shouldParseExportDeclaration = function shouldParseExportDeclaration() { + if (this.tsIsDeclarationStart()) return true; + return _superClass.prototype.shouldParseExportDeclaration.call(this); + }; + + _proto.parseConditional = function parseConditional(expr, noIn, startPos, startLoc, refNeedsArrowPos) { + if (!refNeedsArrowPos || !this.match(types.question)) { + return _superClass.prototype.parseConditional.call(this, expr, noIn, startPos, startLoc, refNeedsArrowPos); + } + + var state = this.state.clone(); + + try { + return _superClass.prototype.parseConditional.call(this, expr, noIn, startPos, startLoc); + } catch (err) { + if (!(err instanceof SyntaxError)) { + throw err; + } + + this.state = state; + refNeedsArrowPos.start = err.pos || this.state.start; + return expr; + } + }; + + _proto.parseParenItem = function parseParenItem(node, startPos, startLoc) { + node = _superClass.prototype.parseParenItem.call(this, node, startPos, startLoc); + + if (this.eat(types.question)) { + node.optional = true; + } + + if (this.match(types.colon)) { + var typeCastNode = this.startNodeAt(startPos, startLoc); + typeCastNode.expression = node; + typeCastNode.typeAnnotation = this.tsParseTypeAnnotation(); + return this.finishNode(typeCastNode, "TSTypeCastExpression"); + } + + return node; + }; + + _proto.parseExportDeclaration = function parseExportDeclaration(node) { + var isDeclare = this.eatContextual("declare"); + var declaration; + + if (this.match(types.name)) { + declaration = this.tsTryParseExportDeclaration(); + } + + if (!declaration) { + declaration = _superClass.prototype.parseExportDeclaration.call(this, node); + } + + if (declaration && isDeclare) { + declaration.declare = true; + } + + return declaration; + }; + + _proto.parseClassId = function parseClassId(node, isStatement, optionalId) { + if ((!isStatement || optionalId) && this.isContextual("implements")) { + return; + } + + _superClass.prototype.parseClassId.apply(this, arguments); + + var typeParameters = this.tsTryParseTypeParameters(); + if (typeParameters) node.typeParameters = typeParameters; + }; + + _proto.parseClassProperty = function parseClassProperty(node) { + if (!node.optional && this.eat(types.bang)) { + node.definite = true; + } + + var type = this.tsTryParseTypeAnnotation(); + if (type) node.typeAnnotation = type; + return _superClass.prototype.parseClassProperty.call(this, node); + }; + + _proto.pushClassMethod = function pushClassMethod(classBody, method, isGenerator, isAsync, isConstructor) { + var typeParameters = this.tsTryParseTypeParameters(); + if (typeParameters) method.typeParameters = typeParameters; + + _superClass.prototype.pushClassMethod.call(this, classBody, method, isGenerator, isAsync, isConstructor); + }; + + _proto.pushClassPrivateMethod = function pushClassPrivateMethod(classBody, method, isGenerator, isAsync) { + var typeParameters = this.tsTryParseTypeParameters(); + if (typeParameters) method.typeParameters = typeParameters; + + _superClass.prototype.pushClassPrivateMethod.call(this, classBody, method, isGenerator, isAsync); + }; + + _proto.parseClassSuper = function parseClassSuper(node) { + _superClass.prototype.parseClassSuper.call(this, node); + + if (node.superClass && this.isRelational("<")) { + node.superTypeParameters = this.tsParseTypeArguments(); + } + + if (this.eatContextual("implements")) { + node.implements = this.tsParseHeritageClause(); + } + }; + + _proto.parseObjPropValue = function parseObjPropValue(prop) { + var _superClass$prototype; + + if (this.isRelational("<")) { + throw new Error("TODO"); + } + + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + (_superClass$prototype = _superClass.prototype.parseObjPropValue).call.apply(_superClass$prototype, [this, prop].concat(args)); + }; + + _proto.parseFunctionParams = function parseFunctionParams(node, allowModifiers) { + var typeParameters = this.tsTryParseTypeParameters(); + if (typeParameters) node.typeParameters = typeParameters; + + _superClass.prototype.parseFunctionParams.call(this, node, allowModifiers); + }; + + _proto.parseVarHead = function parseVarHead(decl) { + _superClass.prototype.parseVarHead.call(this, decl); + + if (decl.id.type === "Identifier" && this.eat(types.bang)) { + decl.definite = true; + } + + var type = this.tsTryParseTypeAnnotation(); + + if (type) { + decl.id.typeAnnotation = type; + this.finishNode(decl.id, decl.id.type); + } + }; + + _proto.parseAsyncArrowFromCallExpression = function parseAsyncArrowFromCallExpression(node, call) { + if (this.match(types.colon)) { + node.returnType = this.tsParseTypeAnnotation(); + } + + return _superClass.prototype.parseAsyncArrowFromCallExpression.call(this, node, call); + }; + + _proto.parseMaybeAssign = function parseMaybeAssign() { + var jsxError; + + for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + + if (this.match(types.jsxTagStart)) { + var context = this.curContext(); + assert(context === types$1.j_oTag); + assert(this.state.context[this.state.context.length - 2] === types$1.j_expr); + + var _state = this.state.clone(); + + try { + var _superClass$prototype2; + + return (_superClass$prototype2 = _superClass.prototype.parseMaybeAssign).call.apply(_superClass$prototype2, [this].concat(args)); + } catch (err) { + if (!(err instanceof SyntaxError)) { + throw err; + } + + this.state = _state; + assert(this.curContext() === types$1.j_oTag); + this.state.context.pop(); + assert(this.curContext() === types$1.j_expr); + this.state.context.pop(); + jsxError = err; + } + } + + if (jsxError === undefined && !this.isRelational("<")) { + var _superClass$prototype3; + + return (_superClass$prototype3 = _superClass.prototype.parseMaybeAssign).call.apply(_superClass$prototype3, [this].concat(args)); + } + + var arrowExpression; + var typeParameters; + var state = this.state.clone(); + + try { + var _superClass$prototype4; + + typeParameters = this.tsParseTypeParameters(); + arrowExpression = (_superClass$prototype4 = _superClass.prototype.parseMaybeAssign).call.apply(_superClass$prototype4, [this].concat(args)); + + if (arrowExpression.type !== "ArrowFunctionExpression") { + this.unexpected(); + } + } catch (err) { + var _superClass$prototype5; + + if (!(err instanceof SyntaxError)) { + throw err; + } + + if (jsxError) { + throw jsxError; + } + + assert(!this.hasPlugin("jsx")); + this.state = state; + return (_superClass$prototype5 = _superClass.prototype.parseMaybeAssign).call.apply(_superClass$prototype5, [this].concat(args)); + } + + if (typeParameters && typeParameters.params.length !== 0) { + this.resetStartLocationFromNode(arrowExpression, typeParameters.params[0]); + } + + arrowExpression.typeParameters = typeParameters; + return arrowExpression; + }; + + _proto.parseMaybeUnary = function parseMaybeUnary(refShorthandDefaultPos) { + if (!this.hasPlugin("jsx") && this.eatRelational("<")) { + return this.tsParseTypeAssertion(); + } else { + return _superClass.prototype.parseMaybeUnary.call(this, refShorthandDefaultPos); + } + }; + + _proto.parseArrow = function parseArrow(node) { + if (this.match(types.colon)) { + var state = this.state.clone(); + + try { + var returnType = this.tsParseTypeOrTypePredicateAnnotation(types.colon); + if (this.canInsertSemicolon()) this.unexpected(); + if (!this.match(types.arrow)) this.unexpected(); + node.returnType = returnType; + } catch (err) { + if (err instanceof SyntaxError) { + this.state = state; + } else { + throw err; + } + } + } + + return _superClass.prototype.parseArrow.call(this, node); + }; + + _proto.parseAssignableListItemTypes = function parseAssignableListItemTypes(param) { + if (this.eat(types.question)) { + if (param.type !== "Identifier") { + throw this.raise(param.start, "A binding pattern parameter cannot be optional in an implementation signature."); + } + + param.optional = true; + } + + var type = this.tsTryParseTypeAnnotation(); + if (type) param.typeAnnotation = type; + return this.finishNode(param, param.type); + }; + + _proto.toAssignable = function toAssignable(node, isBinding, contextDescription) { + switch (node.type) { + case "TSTypeCastExpression": + return _superClass.prototype.toAssignable.call(this, this.typeCastToParameter(node), isBinding, contextDescription); + + case "TSParameterProperty": + return _superClass.prototype.toAssignable.call(this, node, isBinding, contextDescription); + + case "TSAsExpression": + case "TSNonNullExpression": + case "TSTypeAssertion": + node.expression = this.toAssignable(node.expression, isBinding, contextDescription); + return node; + + default: + return _superClass.prototype.toAssignable.call(this, node, isBinding, contextDescription); + } + }; + + _proto.checkLVal = function checkLVal(expr, isBinding, checkClashes, contextDescription) { + switch (expr.type) { + case "TSTypeCastExpression": + return; + + case "TSParameterProperty": + this.checkLVal(expr.parameter, isBinding, checkClashes, "parameter property"); + return; + + case "TSAsExpression": + case "TSNonNullExpression": + case "TSTypeAssertion": + this.checkLVal(expr.expression, isBinding, checkClashes, contextDescription); + return; + + default: + _superClass.prototype.checkLVal.call(this, expr, isBinding, checkClashes, contextDescription); + + return; + } + }; + + _proto.parseBindingAtom = function parseBindingAtom() { + switch (this.state.type) { + case types._this: + return this.parseIdentifier(true); + + default: + return _superClass.prototype.parseBindingAtom.call(this); + } + }; + + _proto.isClassMethod = function isClassMethod() { + return this.isRelational("<") || _superClass.prototype.isClassMethod.call(this); + }; + + _proto.isClassProperty = function isClassProperty() { + return this.match(types.bang) || this.match(types.colon) || _superClass.prototype.isClassProperty.call(this); + }; + + _proto.parseMaybeDefault = function parseMaybeDefault() { + var _superClass$prototype6; + + for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + args[_key3] = arguments[_key3]; + } + + var node = (_superClass$prototype6 = _superClass.prototype.parseMaybeDefault).call.apply(_superClass$prototype6, [this].concat(args)); + + if (node.type === "AssignmentPattern" && node.typeAnnotation && node.right.start < node.typeAnnotation.start) { + this.raise(node.typeAnnotation.start, "Type annotations must come before default assignments, " + "e.g. instead of `age = 25: number` use `age: number = 25`"); + } + + return node; + }; + + _proto.readToken = function readToken(code) { + if (this.state.inType && (code === 62 || code === 60)) { + return this.finishOp(types.relational, 1); + } else { + return _superClass.prototype.readToken.call(this, code); + } + }; + + _proto.toAssignableList = function toAssignableList(exprList, isBinding, contextDescription) { + for (var i = 0; i < exprList.length; i++) { + var expr = exprList[i]; + + if (expr && expr.type === "TSTypeCastExpression") { + exprList[i] = this.typeCastToParameter(expr); + } + } + + return _superClass.prototype.toAssignableList.call(this, exprList, isBinding, contextDescription); + }; + + _proto.typeCastToParameter = function typeCastToParameter(node) { + node.expression.typeAnnotation = node.typeAnnotation; + return this.finishNodeAt(node.expression, node.expression.type, node.typeAnnotation.end, node.typeAnnotation.loc.end); + }; + + _proto.toReferencedList = function toReferencedList(exprList) { + for (var i = 0; i < exprList.length; i++) { + var expr = exprList[i]; + + if (expr && expr._exprListItem && expr.type === "TsTypeCastExpression") { + this.raise(expr.start, "Did not expect a type annotation here."); + } + } + + return exprList; + }; + + _proto.shouldParseArrow = function shouldParseArrow() { + return this.match(types.colon) || _superClass.prototype.shouldParseArrow.call(this); + }; + + _proto.shouldParseAsyncArrow = function shouldParseAsyncArrow() { + return this.match(types.colon) || _superClass.prototype.shouldParseAsyncArrow.call(this); + }; + + _proto.canHaveLeadingDecorator = function canHaveLeadingDecorator() { + return _superClass.prototype.canHaveLeadingDecorator.call(this) || this.isAbstractClass(); + }; + + _inheritsLoose(_class, _superClass); + + return _class; + }(superClass); +}); + +plugins.estree = estreePlugin; +plugins.flow = flowPlugin; +plugins.jsx = jsxPlugin; +plugins.typescript = typescriptPlugin; +function parse(input, options) { + if (options && options.sourceType === "unambiguous") { + options = Object.assign({}, options); + + try { + options.sourceType = "module"; + var parser = getParser(options, input); + var ast = parser.parse(); + if (!parser.sawUnambiguousESM) ast.program.sourceType = "script"; + return ast; + } catch (moduleError) { + try { + options.sourceType = "script"; + return getParser(options, input).parse(); + } catch (scriptError) {} + + throw moduleError; + } + } else { + return getParser(options, input).parse(); + } +} +function parseExpression(input, options) { + var parser = getParser(options, input); + + if (parser.options.strictMode) { + parser.state.strict = true; + } + + return parser.getExpression(); +} +function getParser(options, input) { + var cls = options && options.plugins ? getParserClass(options.plugins) : Parser; + return new cls(options, input); +} + +var parserClassCache = {}; + +function getParserClass(pluginsFromOptions) { + if (pluginsFromOptions.indexOf("decorators-legacy") >= 0 && pluginsFromOptions.indexOf("decorators") >= 0) { + throw new Error("Cannot use decorators and decorators2 plugin together"); + } + + var pluginList = pluginsFromOptions.filter(function (p) { + return p === "estree" || p === "flow" || p === "jsx" || p === "typescript"; + }); + + if (pluginList.indexOf("flow") >= 0) { + pluginList = pluginList.filter(function (plugin) { + return plugin !== "flow"; + }); + pluginList.push("flow"); + } + + if (pluginList.indexOf("flow") >= 0 && pluginList.indexOf("typescript") >= 0) { + throw new Error("Cannot combine flow and typescript plugins."); + } + + if (pluginList.indexOf("typescript") >= 0) { + pluginList = pluginList.filter(function (plugin) { + return plugin !== "typescript"; + }); + pluginList.push("typescript"); + } + + if (pluginList.indexOf("estree") >= 0) { + pluginList = pluginList.filter(function (plugin) { + return plugin !== "estree"; + }); + pluginList.unshift("estree"); + } + + var key = pluginList.join("/"); + var cls = parserClassCache[key]; + + if (!cls) { + cls = Parser; + + for (var _i2 = 0, _pluginList2 = pluginList; _i2 < _pluginList2.length; _i2++) { + var plugin = _pluginList2[_i2]; + cls = plugins[plugin](cls); + } + + parserClassCache[key] = cls; + } + + return cls; +} + +exports.parse = parse; +exports.parseExpression = parseExpression; +exports.tokTypes = types; diff --git a/node_modules/babylon/package.json b/node_modules/babylon/package.json new file mode 100644 index 00000000..d9fccb77 --- /dev/null +++ b/node_modules/babylon/package.json @@ -0,0 +1,36 @@ +{ + "name": "babylon", + "version": "7.0.0-beta.47", + "description": "A JavaScript parser", + "author": "Sebastian McKenzie <sebmck@gmail.com>", + "homepage": "https://babeljs.io/", + "license": "MIT", + "keywords": [ + "babel", + "javascript", + "parser", + "tc39", + "ecmascript", + "babylon" + ], + "repository": "https://github.com/babel/babel/tree/master/packages/babylon", + "main": "lib/index.js", + "files": [ + "bin", + "lib" + ], + "engines": { + "node": ">=6.0.0" + }, + "devDependencies": { + "@babel/helper-fixtures": "7.0.0-beta.47", + "charcodes": "0.1.0", + "unicode-10.0.0": "^0.7.4" + }, + "bin": { + "babylon": "./bin/babylon.js" + }, + "publishConfig": { + "tag": "next" + } +} |
