summaryrefslogtreecommitdiff
path: root/node_modules/sucrase/dist/parser/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/sucrase/dist/parser/plugins')
-rw-r--r--node_modules/sucrase/dist/parser/plugins/flow.js1105
-rw-r--r--node_modules/sucrase/dist/parser/plugins/jsx/index.js367
-rw-r--r--node_modules/sucrase/dist/parser/plugins/jsx/xhtml.js256
-rw-r--r--node_modules/sucrase/dist/parser/plugins/types.js37
-rw-r--r--node_modules/sucrase/dist/parser/plugins/typescript.js1632
5 files changed, 3397 insertions, 0 deletions
diff --git a/node_modules/sucrase/dist/parser/plugins/flow.js b/node_modules/sucrase/dist/parser/plugins/flow.js
new file mode 100644
index 0000000..9401895
--- /dev/null
+++ b/node_modules/sucrase/dist/parser/plugins/flow.js
@@ -0,0 +1,1105 @@
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});/* eslint max-len: 0 */
+
+
+
+
+
+
+
+
+
+
+var _index = require('../tokenizer/index');
+var _keywords = require('../tokenizer/keywords');
+var _types = require('../tokenizer/types');
+var _base = require('../traverser/base');
+
+
+
+
+
+
+
+
+
+
+
+
+
+var _expression = require('../traverser/expression');
+
+
+
+
+
+
+
+
+var _statement = require('../traverser/statement');
+
+
+
+
+
+
+
+
+
+var _util = require('../traverser/util');
+
+function isMaybeDefaultImport(lookahead) {
+ return (
+ (lookahead.type === _types.TokenType.name || !!(lookahead.type & _types.TokenType.IS_KEYWORD)) &&
+ lookahead.contextualKeyword !== _keywords.ContextualKeyword._from
+ );
+}
+
+function flowParseTypeInitialiser(tok) {
+ const oldIsType = _index.pushTypeContext.call(void 0, 0);
+ _util.expect.call(void 0, tok || _types.TokenType.colon);
+ flowParseType();
+ _index.popTypeContext.call(void 0, oldIsType);
+}
+
+function flowParsePredicate() {
+ _util.expect.call(void 0, _types.TokenType.modulo);
+ _util.expectContextual.call(void 0, _keywords.ContextualKeyword._checks);
+ if (_index.eat.call(void 0, _types.TokenType.parenL)) {
+ _expression.parseExpression.call(void 0, );
+ _util.expect.call(void 0, _types.TokenType.parenR);
+ }
+}
+
+function flowParseTypeAndPredicateInitialiser() {
+ const oldIsType = _index.pushTypeContext.call(void 0, 0);
+ _util.expect.call(void 0, _types.TokenType.colon);
+ if (_index.match.call(void 0, _types.TokenType.modulo)) {
+ flowParsePredicate();
+ } else {
+ flowParseType();
+ if (_index.match.call(void 0, _types.TokenType.modulo)) {
+ flowParsePredicate();
+ }
+ }
+ _index.popTypeContext.call(void 0, oldIsType);
+}
+
+function flowParseDeclareClass() {
+ _index.next.call(void 0, );
+ flowParseInterfaceish(/* isClass */ true);
+}
+
+function flowParseDeclareFunction() {
+ _index.next.call(void 0, );
+ _expression.parseIdentifier.call(void 0, );
+
+ if (_index.match.call(void 0, _types.TokenType.lessThan)) {
+ flowParseTypeParameterDeclaration();
+ }
+
+ _util.expect.call(void 0, _types.TokenType.parenL);
+ flowParseFunctionTypeParams();
+ _util.expect.call(void 0, _types.TokenType.parenR);
+
+ flowParseTypeAndPredicateInitialiser();
+
+ _util.semicolon.call(void 0, );
+}
+
+function flowParseDeclare() {
+ if (_index.match.call(void 0, _types.TokenType._class)) {
+ flowParseDeclareClass();
+ } else if (_index.match.call(void 0, _types.TokenType._function)) {
+ flowParseDeclareFunction();
+ } else if (_index.match.call(void 0, _types.TokenType._var)) {
+ flowParseDeclareVariable();
+ } else if (_util.eatContextual.call(void 0, _keywords.ContextualKeyword._module)) {
+ if (_index.eat.call(void 0, _types.TokenType.dot)) {
+ flowParseDeclareModuleExports();
+ } else {
+ flowParseDeclareModule();
+ }
+ } else if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._type)) {
+ flowParseDeclareTypeAlias();
+ } else if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._opaque)) {
+ flowParseDeclareOpaqueType();
+ } else if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._interface)) {
+ flowParseDeclareInterface();
+ } else if (_index.match.call(void 0, _types.TokenType._export)) {
+ flowParseDeclareExportDeclaration();
+ } else {
+ _util.unexpected.call(void 0, );
+ }
+}
+
+function flowParseDeclareVariable() {
+ _index.next.call(void 0, );
+ flowParseTypeAnnotatableIdentifier();
+ _util.semicolon.call(void 0, );
+}
+
+function flowParseDeclareModule() {
+ if (_index.match.call(void 0, _types.TokenType.string)) {
+ _expression.parseExprAtom.call(void 0, );
+ } else {
+ _expression.parseIdentifier.call(void 0, );
+ }
+
+ _util.expect.call(void 0, _types.TokenType.braceL);
+ while (!_index.match.call(void 0, _types.TokenType.braceR) && !_base.state.error) {
+ if (_index.match.call(void 0, _types.TokenType._import)) {
+ _index.next.call(void 0, );
+ _statement.parseImport.call(void 0, );
+ } else {
+ _util.unexpected.call(void 0, );
+ }
+ }
+ _util.expect.call(void 0, _types.TokenType.braceR);
+}
+
+function flowParseDeclareExportDeclaration() {
+ _util.expect.call(void 0, _types.TokenType._export);
+
+ if (_index.eat.call(void 0, _types.TokenType._default)) {
+ if (_index.match.call(void 0, _types.TokenType._function) || _index.match.call(void 0, _types.TokenType._class)) {
+ // declare export default class ...
+ // declare export default function ...
+ flowParseDeclare();
+ } else {
+ // declare export default [type];
+ flowParseType();
+ _util.semicolon.call(void 0, );
+ }
+ } else if (
+ _index.match.call(void 0, _types.TokenType._var) || // declare export var ...
+ _index.match.call(void 0, _types.TokenType._function) || // declare export function ...
+ _index.match.call(void 0, _types.TokenType._class) || // declare export class ...
+ _util.isContextual.call(void 0, _keywords.ContextualKeyword._opaque) // declare export opaque ..
+ ) {
+ flowParseDeclare();
+ } else if (
+ _index.match.call(void 0, _types.TokenType.star) || // declare export * from ''
+ _index.match.call(void 0, _types.TokenType.braceL) || // declare export {} ...
+ _util.isContextual.call(void 0, _keywords.ContextualKeyword._interface) || // declare export interface ...
+ _util.isContextual.call(void 0, _keywords.ContextualKeyword._type) || // declare export type ...
+ _util.isContextual.call(void 0, _keywords.ContextualKeyword._opaque) // declare export opaque type ...
+ ) {
+ _statement.parseExport.call(void 0, );
+ } else {
+ _util.unexpected.call(void 0, );
+ }
+}
+
+function flowParseDeclareModuleExports() {
+ _util.expectContextual.call(void 0, _keywords.ContextualKeyword._exports);
+ flowParseTypeAnnotation();
+ _util.semicolon.call(void 0, );
+}
+
+function flowParseDeclareTypeAlias() {
+ _index.next.call(void 0, );
+ flowParseTypeAlias();
+}
+
+function flowParseDeclareOpaqueType() {
+ _index.next.call(void 0, );
+ flowParseOpaqueType(true);
+}
+
+function flowParseDeclareInterface() {
+ _index.next.call(void 0, );
+ flowParseInterfaceish();
+}
+
+// Interfaces
+
+function flowParseInterfaceish(isClass = false) {
+ flowParseRestrictedIdentifier();
+
+ if (_index.match.call(void 0, _types.TokenType.lessThan)) {
+ flowParseTypeParameterDeclaration();
+ }
+
+ if (_index.eat.call(void 0, _types.TokenType._extends)) {
+ do {
+ flowParseInterfaceExtends();
+ } while (!isClass && _index.eat.call(void 0, _types.TokenType.comma));
+ }
+
+ if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._mixins)) {
+ _index.next.call(void 0, );
+ do {
+ flowParseInterfaceExtends();
+ } while (_index.eat.call(void 0, _types.TokenType.comma));
+ }
+
+ if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._implements)) {
+ _index.next.call(void 0, );
+ do {
+ flowParseInterfaceExtends();
+ } while (_index.eat.call(void 0, _types.TokenType.comma));
+ }
+
+ flowParseObjectType(isClass, false, isClass);
+}
+
+function flowParseInterfaceExtends() {
+ flowParseQualifiedTypeIdentifier(false);
+ if (_index.match.call(void 0, _types.TokenType.lessThan)) {
+ flowParseTypeParameterInstantiation();
+ }
+}
+
+function flowParseInterface() {
+ flowParseInterfaceish();
+}
+
+function flowParseRestrictedIdentifier() {
+ _expression.parseIdentifier.call(void 0, );
+}
+
+function flowParseTypeAlias() {
+ flowParseRestrictedIdentifier();
+
+ if (_index.match.call(void 0, _types.TokenType.lessThan)) {
+ flowParseTypeParameterDeclaration();
+ }
+
+ flowParseTypeInitialiser(_types.TokenType.eq);
+ _util.semicolon.call(void 0, );
+}
+
+function flowParseOpaqueType(declare) {
+ _util.expectContextual.call(void 0, _keywords.ContextualKeyword._type);
+ flowParseRestrictedIdentifier();
+
+ if (_index.match.call(void 0, _types.TokenType.lessThan)) {
+ flowParseTypeParameterDeclaration();
+ }
+
+ // Parse the supertype
+ if (_index.match.call(void 0, _types.TokenType.colon)) {
+ flowParseTypeInitialiser(_types.TokenType.colon);
+ }
+
+ if (!declare) {
+ flowParseTypeInitialiser(_types.TokenType.eq);
+ }
+ _util.semicolon.call(void 0, );
+}
+
+function flowParseTypeParameter() {
+ flowParseVariance();
+ flowParseTypeAnnotatableIdentifier();
+
+ if (_index.eat.call(void 0, _types.TokenType.eq)) {
+ flowParseType();
+ }
+}
+
+ function flowParseTypeParameterDeclaration() {
+ const oldIsType = _index.pushTypeContext.call(void 0, 0);
+ // istanbul ignore else: this condition is already checked at all call sites
+ if (_index.match.call(void 0, _types.TokenType.lessThan) || _index.match.call(void 0, _types.TokenType.typeParameterStart)) {
+ _index.next.call(void 0, );
+ } else {
+ _util.unexpected.call(void 0, );
+ }
+
+ do {
+ flowParseTypeParameter();
+ if (!_index.match.call(void 0, _types.TokenType.greaterThan)) {
+ _util.expect.call(void 0, _types.TokenType.comma);
+ }
+ } while (!_index.match.call(void 0, _types.TokenType.greaterThan) && !_base.state.error);
+ _util.expect.call(void 0, _types.TokenType.greaterThan);
+ _index.popTypeContext.call(void 0, oldIsType);
+} exports.flowParseTypeParameterDeclaration = flowParseTypeParameterDeclaration;
+
+function flowParseTypeParameterInstantiation() {
+ const oldIsType = _index.pushTypeContext.call(void 0, 0);
+ _util.expect.call(void 0, _types.TokenType.lessThan);
+ while (!_index.match.call(void 0, _types.TokenType.greaterThan) && !_base.state.error) {
+ flowParseType();
+ if (!_index.match.call(void 0, _types.TokenType.greaterThan)) {
+ _util.expect.call(void 0, _types.TokenType.comma);
+ }
+ }
+ _util.expect.call(void 0, _types.TokenType.greaterThan);
+ _index.popTypeContext.call(void 0, oldIsType);
+}
+
+function flowParseInterfaceType() {
+ _util.expectContextual.call(void 0, _keywords.ContextualKeyword._interface);
+ if (_index.eat.call(void 0, _types.TokenType._extends)) {
+ do {
+ flowParseInterfaceExtends();
+ } while (_index.eat.call(void 0, _types.TokenType.comma));
+ }
+ flowParseObjectType(false, false, false);
+}
+
+function flowParseObjectPropertyKey() {
+ if (_index.match.call(void 0, _types.TokenType.num) || _index.match.call(void 0, _types.TokenType.string)) {
+ _expression.parseExprAtom.call(void 0, );
+ } else {
+ _expression.parseIdentifier.call(void 0, );
+ }
+}
+
+function flowParseObjectTypeIndexer() {
+ // Note: bracketL has already been consumed
+ if (_index.lookaheadType.call(void 0, ) === _types.TokenType.colon) {
+ flowParseObjectPropertyKey();
+ flowParseTypeInitialiser();
+ } else {
+ flowParseType();
+ }
+ _util.expect.call(void 0, _types.TokenType.bracketR);
+ flowParseTypeInitialiser();
+}
+
+function flowParseObjectTypeInternalSlot() {
+ // Note: both bracketL have already been consumed
+ flowParseObjectPropertyKey();
+ _util.expect.call(void 0, _types.TokenType.bracketR);
+ _util.expect.call(void 0, _types.TokenType.bracketR);
+ if (_index.match.call(void 0, _types.TokenType.lessThan) || _index.match.call(void 0, _types.TokenType.parenL)) {
+ flowParseObjectTypeMethodish();
+ } else {
+ _index.eat.call(void 0, _types.TokenType.question);
+ flowParseTypeInitialiser();
+ }
+}
+
+function flowParseObjectTypeMethodish() {
+ if (_index.match.call(void 0, _types.TokenType.lessThan)) {
+ flowParseTypeParameterDeclaration();
+ }
+
+ _util.expect.call(void 0, _types.TokenType.parenL);
+ while (!_index.match.call(void 0, _types.TokenType.parenR) && !_index.match.call(void 0, _types.TokenType.ellipsis) && !_base.state.error) {
+ flowParseFunctionTypeParam();
+ if (!_index.match.call(void 0, _types.TokenType.parenR)) {
+ _util.expect.call(void 0, _types.TokenType.comma);
+ }
+ }
+
+ if (_index.eat.call(void 0, _types.TokenType.ellipsis)) {
+ flowParseFunctionTypeParam();
+ }
+ _util.expect.call(void 0, _types.TokenType.parenR);
+ flowParseTypeInitialiser();
+}
+
+function flowParseObjectTypeCallProperty() {
+ flowParseObjectTypeMethodish();
+}
+
+function flowParseObjectType(allowStatic, allowExact, allowProto) {
+ let endDelim;
+ if (allowExact && _index.match.call(void 0, _types.TokenType.braceBarL)) {
+ _util.expect.call(void 0, _types.TokenType.braceBarL);
+ endDelim = _types.TokenType.braceBarR;
+ } else {
+ _util.expect.call(void 0, _types.TokenType.braceL);
+ endDelim = _types.TokenType.braceR;
+ }
+
+ while (!_index.match.call(void 0, endDelim) && !_base.state.error) {
+ if (allowProto && _util.isContextual.call(void 0, _keywords.ContextualKeyword._proto)) {
+ const lookahead = _index.lookaheadType.call(void 0, );
+ if (lookahead !== _types.TokenType.colon && lookahead !== _types.TokenType.question) {
+ _index.next.call(void 0, );
+ allowStatic = false;
+ }
+ }
+ if (allowStatic && _util.isContextual.call(void 0, _keywords.ContextualKeyword._static)) {
+ const lookahead = _index.lookaheadType.call(void 0, );
+ if (lookahead !== _types.TokenType.colon && lookahead !== _types.TokenType.question) {
+ _index.next.call(void 0, );
+ }
+ }
+
+ flowParseVariance();
+
+ if (_index.eat.call(void 0, _types.TokenType.bracketL)) {
+ if (_index.eat.call(void 0, _types.TokenType.bracketL)) {
+ flowParseObjectTypeInternalSlot();
+ } else {
+ flowParseObjectTypeIndexer();
+ }
+ } else if (_index.match.call(void 0, _types.TokenType.parenL) || _index.match.call(void 0, _types.TokenType.lessThan)) {
+ flowParseObjectTypeCallProperty();
+ } else {
+ if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._get) || _util.isContextual.call(void 0, _keywords.ContextualKeyword._set)) {
+ const lookahead = _index.lookaheadType.call(void 0, );
+ if (lookahead === _types.TokenType.name || lookahead === _types.TokenType.string || lookahead === _types.TokenType.num) {
+ _index.next.call(void 0, );
+ }
+ }
+
+ flowParseObjectTypeProperty();
+ }
+
+ flowObjectTypeSemicolon();
+ }
+
+ _util.expect.call(void 0, endDelim);
+}
+
+function flowParseObjectTypeProperty() {
+ if (_index.match.call(void 0, _types.TokenType.ellipsis)) {
+ _util.expect.call(void 0, _types.TokenType.ellipsis);
+ if (!_index.eat.call(void 0, _types.TokenType.comma)) {
+ _index.eat.call(void 0, _types.TokenType.semi);
+ }
+ // Explicit inexact object syntax.
+ if (_index.match.call(void 0, _types.TokenType.braceR)) {
+ return;
+ }
+ flowParseType();
+ } else {
+ flowParseObjectPropertyKey();
+ if (_index.match.call(void 0, _types.TokenType.lessThan) || _index.match.call(void 0, _types.TokenType.parenL)) {
+ // This is a method property
+ flowParseObjectTypeMethodish();
+ } else {
+ _index.eat.call(void 0, _types.TokenType.question);
+ flowParseTypeInitialiser();
+ }
+ }
+}
+
+function flowObjectTypeSemicolon() {
+ if (!_index.eat.call(void 0, _types.TokenType.semi) && !_index.eat.call(void 0, _types.TokenType.comma) && !_index.match.call(void 0, _types.TokenType.braceR) && !_index.match.call(void 0, _types.TokenType.braceBarR)) {
+ _util.unexpected.call(void 0, );
+ }
+}
+
+function flowParseQualifiedTypeIdentifier(initialIdAlreadyParsed) {
+ if (!initialIdAlreadyParsed) {
+ _expression.parseIdentifier.call(void 0, );
+ }
+ while (_index.eat.call(void 0, _types.TokenType.dot)) {
+ _expression.parseIdentifier.call(void 0, );
+ }
+}
+
+function flowParseGenericType() {
+ flowParseQualifiedTypeIdentifier(true);
+ if (_index.match.call(void 0, _types.TokenType.lessThan)) {
+ flowParseTypeParameterInstantiation();
+ }
+}
+
+function flowParseTypeofType() {
+ _util.expect.call(void 0, _types.TokenType._typeof);
+ flowParsePrimaryType();
+}
+
+function flowParseTupleType() {
+ _util.expect.call(void 0, _types.TokenType.bracketL);
+ // We allow trailing commas
+ while (_base.state.pos < _base.input.length && !_index.match.call(void 0, _types.TokenType.bracketR)) {
+ flowParseType();
+ if (_index.match.call(void 0, _types.TokenType.bracketR)) {
+ break;
+ }
+ _util.expect.call(void 0, _types.TokenType.comma);
+ }
+ _util.expect.call(void 0, _types.TokenType.bracketR);
+}
+
+function flowParseFunctionTypeParam() {
+ const lookahead = _index.lookaheadType.call(void 0, );
+ if (lookahead === _types.TokenType.colon || lookahead === _types.TokenType.question) {
+ _expression.parseIdentifier.call(void 0, );
+ _index.eat.call(void 0, _types.TokenType.question);
+ flowParseTypeInitialiser();
+ } else {
+ flowParseType();
+ }
+}
+
+function flowParseFunctionTypeParams() {
+ while (!_index.match.call(void 0, _types.TokenType.parenR) && !_index.match.call(void 0, _types.TokenType.ellipsis) && !_base.state.error) {
+ flowParseFunctionTypeParam();
+ if (!_index.match.call(void 0, _types.TokenType.parenR)) {
+ _util.expect.call(void 0, _types.TokenType.comma);
+ }
+ }
+ if (_index.eat.call(void 0, _types.TokenType.ellipsis)) {
+ flowParseFunctionTypeParam();
+ }
+}
+
+// The parsing of types roughly parallels the parsing of expressions, and
+// primary types are kind of like primary expressions...they're the
+// primitives with which other types are constructed.
+function flowParsePrimaryType() {
+ let isGroupedType = false;
+ const oldNoAnonFunctionType = _base.state.noAnonFunctionType;
+
+ switch (_base.state.type) {
+ case _types.TokenType.name: {
+ if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._interface)) {
+ flowParseInterfaceType();
+ return;
+ }
+ _expression.parseIdentifier.call(void 0, );
+ flowParseGenericType();
+ return;
+ }
+
+ case _types.TokenType.braceL:
+ flowParseObjectType(false, false, false);
+ return;
+
+ case _types.TokenType.braceBarL:
+ flowParseObjectType(false, true, false);
+ return;
+
+ case _types.TokenType.bracketL:
+ flowParseTupleType();
+ return;
+
+ case _types.TokenType.lessThan:
+ flowParseTypeParameterDeclaration();
+ _util.expect.call(void 0, _types.TokenType.parenL);
+ flowParseFunctionTypeParams();
+ _util.expect.call(void 0, _types.TokenType.parenR);
+ _util.expect.call(void 0, _types.TokenType.arrow);
+ flowParseType();
+ return;
+
+ case _types.TokenType.parenL:
+ _index.next.call(void 0, );
+
+ // Check to see if this is actually a grouped type
+ if (!_index.match.call(void 0, _types.TokenType.parenR) && !_index.match.call(void 0, _types.TokenType.ellipsis)) {
+ if (_index.match.call(void 0, _types.TokenType.name)) {
+ const token = _index.lookaheadType.call(void 0, );
+ isGroupedType = token !== _types.TokenType.question && token !== _types.TokenType.colon;
+ } else {
+ isGroupedType = true;
+ }
+ }
+
+ if (isGroupedType) {
+ _base.state.noAnonFunctionType = false;
+ flowParseType();
+ _base.state.noAnonFunctionType = oldNoAnonFunctionType;
+
+ // A `,` or a `) =>` means this is an anonymous function type
+ if (
+ _base.state.noAnonFunctionType ||
+ !(_index.match.call(void 0, _types.TokenType.comma) || (_index.match.call(void 0, _types.TokenType.parenR) && _index.lookaheadType.call(void 0, ) === _types.TokenType.arrow))
+ ) {
+ _util.expect.call(void 0, _types.TokenType.parenR);
+ return;
+ } else {
+ // Eat a comma if there is one
+ _index.eat.call(void 0, _types.TokenType.comma);
+ }
+ }
+
+ flowParseFunctionTypeParams();
+
+ _util.expect.call(void 0, _types.TokenType.parenR);
+ _util.expect.call(void 0, _types.TokenType.arrow);
+ flowParseType();
+ return;
+
+ case _types.TokenType.minus:
+ _index.next.call(void 0, );
+ _expression.parseLiteral.call(void 0, );
+ return;
+
+ case _types.TokenType.string:
+ case _types.TokenType.num:
+ case _types.TokenType._true:
+ case _types.TokenType._false:
+ case _types.TokenType._null:
+ case _types.TokenType._this:
+ case _types.TokenType._void:
+ case _types.TokenType.star:
+ _index.next.call(void 0, );
+ return;
+
+ default:
+ if (_base.state.type === _types.TokenType._typeof) {
+ flowParseTypeofType();
+ return;
+ } else if (_base.state.type & _types.TokenType.IS_KEYWORD) {
+ _index.next.call(void 0, );
+ _base.state.tokens[_base.state.tokens.length - 1].type = _types.TokenType.name;
+ return;
+ }
+ }
+
+ _util.unexpected.call(void 0, );
+}
+
+function flowParsePostfixType() {
+ flowParsePrimaryType();
+ while (!_util.canInsertSemicolon.call(void 0, ) && (_index.match.call(void 0, _types.TokenType.bracketL) || _index.match.call(void 0, _types.TokenType.questionDot))) {
+ _index.eat.call(void 0, _types.TokenType.questionDot);
+ _util.expect.call(void 0, _types.TokenType.bracketL);
+ if (_index.eat.call(void 0, _types.TokenType.bracketR)) {
+ // Array type
+ } else {
+ // Indexed access type
+ flowParseType();
+ _util.expect.call(void 0, _types.TokenType.bracketR);
+ }
+ }
+}
+
+function flowParsePrefixType() {
+ if (_index.eat.call(void 0, _types.TokenType.question)) {
+ flowParsePrefixType();
+ } else {
+ flowParsePostfixType();
+ }
+}
+
+function flowParseAnonFunctionWithoutParens() {
+ flowParsePrefixType();
+ if (!_base.state.noAnonFunctionType && _index.eat.call(void 0, _types.TokenType.arrow)) {
+ flowParseType();
+ }
+}
+
+function flowParseIntersectionType() {
+ _index.eat.call(void 0, _types.TokenType.bitwiseAND);
+ flowParseAnonFunctionWithoutParens();
+ while (_index.eat.call(void 0, _types.TokenType.bitwiseAND)) {
+ flowParseAnonFunctionWithoutParens();
+ }
+}
+
+function flowParseUnionType() {
+ _index.eat.call(void 0, _types.TokenType.bitwiseOR);
+ flowParseIntersectionType();
+ while (_index.eat.call(void 0, _types.TokenType.bitwiseOR)) {
+ flowParseIntersectionType();
+ }
+}
+
+function flowParseType() {
+ flowParseUnionType();
+}
+
+ function flowParseTypeAnnotation() {
+ flowParseTypeInitialiser();
+} exports.flowParseTypeAnnotation = flowParseTypeAnnotation;
+
+function flowParseTypeAnnotatableIdentifier() {
+ _expression.parseIdentifier.call(void 0, );
+ if (_index.match.call(void 0, _types.TokenType.colon)) {
+ flowParseTypeAnnotation();
+ }
+}
+
+ function flowParseVariance() {
+ if (_index.match.call(void 0, _types.TokenType.plus) || _index.match.call(void 0, _types.TokenType.minus)) {
+ _index.next.call(void 0, );
+ _base.state.tokens[_base.state.tokens.length - 1].isType = true;
+ }
+} exports.flowParseVariance = flowParseVariance;
+
+// ==================================
+// Overrides
+// ==================================
+
+ function flowParseFunctionBodyAndFinish(funcContextId) {
+ // For arrow functions, `parseArrow` handles the return type itself.
+ if (_index.match.call(void 0, _types.TokenType.colon)) {
+ flowParseTypeAndPredicateInitialiser();
+ }
+
+ _expression.parseFunctionBody.call(void 0, false, funcContextId);
+} exports.flowParseFunctionBodyAndFinish = flowParseFunctionBodyAndFinish;
+
+ function flowParseSubscript(
+ startTokenIndex,
+ noCalls,
+ stopState,
+) {
+ if (_index.match.call(void 0, _types.TokenType.questionDot) && _index.lookaheadType.call(void 0, ) === _types.TokenType.lessThan) {
+ if (noCalls) {
+ stopState.stop = true;
+ return;
+ }
+ _index.next.call(void 0, );
+ flowParseTypeParameterInstantiation();
+ _util.expect.call(void 0, _types.TokenType.parenL);
+ _expression.parseCallExpressionArguments.call(void 0, );
+ return;
+ } else if (!noCalls && _index.match.call(void 0, _types.TokenType.lessThan)) {
+ const snapshot = _base.state.snapshot();
+ flowParseTypeParameterInstantiation();
+ _util.expect.call(void 0, _types.TokenType.parenL);
+ _expression.parseCallExpressionArguments.call(void 0, );
+ if (_base.state.error) {
+ _base.state.restoreFromSnapshot(snapshot);
+ } else {
+ return;
+ }
+ }
+ _expression.baseParseSubscript.call(void 0, startTokenIndex, noCalls, stopState);
+} exports.flowParseSubscript = flowParseSubscript;
+
+ function flowStartParseNewArguments() {
+ if (_index.match.call(void 0, _types.TokenType.lessThan)) {
+ const snapshot = _base.state.snapshot();
+ flowParseTypeParameterInstantiation();
+ if (_base.state.error) {
+ _base.state.restoreFromSnapshot(snapshot);
+ }
+ }
+} exports.flowStartParseNewArguments = flowStartParseNewArguments;
+
+// interfaces
+ function flowTryParseStatement() {
+ if (_index.match.call(void 0, _types.TokenType.name) && _base.state.contextualKeyword === _keywords.ContextualKeyword._interface) {
+ const oldIsType = _index.pushTypeContext.call(void 0, 0);
+ _index.next.call(void 0, );
+ flowParseInterface();
+ _index.popTypeContext.call(void 0, oldIsType);
+ return true;
+ } else if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._enum)) {
+ flowParseEnumDeclaration();
+ return true;
+ }
+ return false;
+} exports.flowTryParseStatement = flowTryParseStatement;
+
+ function flowTryParseExportDefaultExpression() {
+ if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._enum)) {
+ flowParseEnumDeclaration();
+ return true;
+ }
+ return false;
+} exports.flowTryParseExportDefaultExpression = flowTryParseExportDefaultExpression;
+
+// declares, interfaces and type aliases
+ function flowParseIdentifierStatement(contextualKeyword) {
+ if (contextualKeyword === _keywords.ContextualKeyword._declare) {
+ if (
+ _index.match.call(void 0, _types.TokenType._class) ||
+ _index.match.call(void 0, _types.TokenType.name) ||
+ _index.match.call(void 0, _types.TokenType._function) ||
+ _index.match.call(void 0, _types.TokenType._var) ||
+ _index.match.call(void 0, _types.TokenType._export)
+ ) {
+ const oldIsType = _index.pushTypeContext.call(void 0, 1);
+ flowParseDeclare();
+ _index.popTypeContext.call(void 0, oldIsType);
+ }
+ } else if (_index.match.call(void 0, _types.TokenType.name)) {
+ if (contextualKeyword === _keywords.ContextualKeyword._interface) {
+ const oldIsType = _index.pushTypeContext.call(void 0, 1);
+ flowParseInterface();
+ _index.popTypeContext.call(void 0, oldIsType);
+ } else if (contextualKeyword === _keywords.ContextualKeyword._type) {
+ const oldIsType = _index.pushTypeContext.call(void 0, 1);
+ flowParseTypeAlias();
+ _index.popTypeContext.call(void 0, oldIsType);
+ } else if (contextualKeyword === _keywords.ContextualKeyword._opaque) {
+ const oldIsType = _index.pushTypeContext.call(void 0, 1);
+ flowParseOpaqueType(false);
+ _index.popTypeContext.call(void 0, oldIsType);
+ }
+ }
+ _util.semicolon.call(void 0, );
+} exports.flowParseIdentifierStatement = flowParseIdentifierStatement;
+
+// export type
+ function flowShouldParseExportDeclaration() {
+ return (
+ _util.isContextual.call(void 0, _keywords.ContextualKeyword._type) ||
+ _util.isContextual.call(void 0, _keywords.ContextualKeyword._interface) ||
+ _util.isContextual.call(void 0, _keywords.ContextualKeyword._opaque) ||
+ _util.isContextual.call(void 0, _keywords.ContextualKeyword._enum)
+ );
+} exports.flowShouldParseExportDeclaration = flowShouldParseExportDeclaration;
+
+ function flowShouldDisallowExportDefaultSpecifier() {
+ return (
+ _index.match.call(void 0, _types.TokenType.name) &&
+ (_base.state.contextualKeyword === _keywords.ContextualKeyword._type ||
+ _base.state.contextualKeyword === _keywords.ContextualKeyword._interface ||
+ _base.state.contextualKeyword === _keywords.ContextualKeyword._opaque ||
+ _base.state.contextualKeyword === _keywords.ContextualKeyword._enum)
+ );
+} exports.flowShouldDisallowExportDefaultSpecifier = flowShouldDisallowExportDefaultSpecifier;
+
+ function flowParseExportDeclaration() {
+ if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._type)) {
+ const oldIsType = _index.pushTypeContext.call(void 0, 1);
+ _index.next.call(void 0, );
+
+ if (_index.match.call(void 0, _types.TokenType.braceL)) {
+ // export type { foo, bar };
+ _statement.parseExportSpecifiers.call(void 0, );
+ _statement.parseExportFrom.call(void 0, );
+ } else {
+ // export type Foo = Bar;
+ flowParseTypeAlias();
+ }
+ _index.popTypeContext.call(void 0, oldIsType);
+ } else if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._opaque)) {
+ const oldIsType = _index.pushTypeContext.call(void 0, 1);
+ _index.next.call(void 0, );
+ // export opaque type Foo = Bar;
+ flowParseOpaqueType(false);
+ _index.popTypeContext.call(void 0, oldIsType);
+ } else if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._interface)) {
+ const oldIsType = _index.pushTypeContext.call(void 0, 1);
+ _index.next.call(void 0, );
+ flowParseInterface();
+ _index.popTypeContext.call(void 0, oldIsType);
+ } else {
+ _statement.parseStatement.call(void 0, true);
+ }
+} exports.flowParseExportDeclaration = flowParseExportDeclaration;
+
+ function flowShouldParseExportStar() {
+ return _index.match.call(void 0, _types.TokenType.star) || (_util.isContextual.call(void 0, _keywords.ContextualKeyword._type) && _index.lookaheadType.call(void 0, ) === _types.TokenType.star);
+} exports.flowShouldParseExportStar = flowShouldParseExportStar;
+
+ function flowParseExportStar() {
+ if (_util.eatContextual.call(void 0, _keywords.ContextualKeyword._type)) {
+ const oldIsType = _index.pushTypeContext.call(void 0, 2);
+ _statement.baseParseExportStar.call(void 0, );
+ _index.popTypeContext.call(void 0, oldIsType);
+ } else {
+ _statement.baseParseExportStar.call(void 0, );
+ }
+} exports.flowParseExportStar = flowParseExportStar;
+
+// parse a the super class type parameters and implements
+ function flowAfterParseClassSuper(hasSuper) {
+ if (hasSuper && _index.match.call(void 0, _types.TokenType.lessThan)) {
+ flowParseTypeParameterInstantiation();
+ }
+ if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._implements)) {
+ const oldIsType = _index.pushTypeContext.call(void 0, 0);
+ _index.next.call(void 0, );
+ _base.state.tokens[_base.state.tokens.length - 1].type = _types.TokenType._implements;
+ do {
+ flowParseRestrictedIdentifier();
+ if (_index.match.call(void 0, _types.TokenType.lessThan)) {
+ flowParseTypeParameterInstantiation();
+ }
+ } while (_index.eat.call(void 0, _types.TokenType.comma));
+ _index.popTypeContext.call(void 0, oldIsType);
+ }
+} exports.flowAfterParseClassSuper = flowAfterParseClassSuper;
+
+// parse type parameters for object method shorthand
+ function flowStartParseObjPropValue() {
+ // method shorthand
+ if (_index.match.call(void 0, _types.TokenType.lessThan)) {
+ flowParseTypeParameterDeclaration();
+ if (!_index.match.call(void 0, _types.TokenType.parenL)) _util.unexpected.call(void 0, );
+ }
+} exports.flowStartParseObjPropValue = flowStartParseObjPropValue;
+
+ function flowParseAssignableListItemTypes() {
+ const oldIsType = _index.pushTypeContext.call(void 0, 0);
+ _index.eat.call(void 0, _types.TokenType.question);
+ if (_index.match.call(void 0, _types.TokenType.colon)) {
+ flowParseTypeAnnotation();
+ }
+ _index.popTypeContext.call(void 0, oldIsType);
+} exports.flowParseAssignableListItemTypes = flowParseAssignableListItemTypes;
+
+// parse typeof and type imports
+ function flowStartParseImportSpecifiers() {
+ if (_index.match.call(void 0, _types.TokenType._typeof) || _util.isContextual.call(void 0, _keywords.ContextualKeyword._type)) {
+ const lh = _index.lookaheadTypeAndKeyword.call(void 0, );
+ if (isMaybeDefaultImport(lh) || lh.type === _types.TokenType.braceL || lh.type === _types.TokenType.star) {
+ _index.next.call(void 0, );
+ }
+ }
+} exports.flowStartParseImportSpecifiers = flowStartParseImportSpecifiers;
+
+// parse import-type/typeof shorthand
+ function flowParseImportSpecifier() {
+ const isTypeKeyword =
+ _base.state.contextualKeyword === _keywords.ContextualKeyword._type || _base.state.type === _types.TokenType._typeof;
+ if (isTypeKeyword) {
+ _index.next.call(void 0, );
+ } else {
+ _expression.parseIdentifier.call(void 0, );
+ }
+
+ if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._as) && !_util.isLookaheadContextual.call(void 0, _keywords.ContextualKeyword._as)) {
+ _expression.parseIdentifier.call(void 0, );
+ if (isTypeKeyword && !_index.match.call(void 0, _types.TokenType.name) && !(_base.state.type & _types.TokenType.IS_KEYWORD)) {
+ // `import {type as ,` or `import {type as }`
+ } else {
+ // `import {type as foo`
+ _expression.parseIdentifier.call(void 0, );
+ }
+ } else {
+ if (isTypeKeyword && (_index.match.call(void 0, _types.TokenType.name) || !!(_base.state.type & _types.TokenType.IS_KEYWORD))) {
+ // `import {type foo`
+ _expression.parseIdentifier.call(void 0, );
+ }
+ if (_util.eatContextual.call(void 0, _keywords.ContextualKeyword._as)) {
+ _expression.parseIdentifier.call(void 0, );
+ }
+ }
+} exports.flowParseImportSpecifier = flowParseImportSpecifier;
+
+// parse function type parameters - function foo<T>() {}
+ function flowStartParseFunctionParams() {
+ // Originally this checked if the method is a getter/setter, but if it was, we'd crash soon
+ // anyway, so don't try to propagate that information.
+ if (_index.match.call(void 0, _types.TokenType.lessThan)) {
+ const oldIsType = _index.pushTypeContext.call(void 0, 0);
+ flowParseTypeParameterDeclaration();
+ _index.popTypeContext.call(void 0, oldIsType);
+ }
+} exports.flowStartParseFunctionParams = flowStartParseFunctionParams;
+
+// parse flow type annotations on variable declarator heads - let foo: string = bar
+ function flowAfterParseVarHead() {
+ if (_index.match.call(void 0, _types.TokenType.colon)) {
+ flowParseTypeAnnotation();
+ }
+} exports.flowAfterParseVarHead = flowAfterParseVarHead;
+
+// parse the return type of an async arrow function - let foo = (async (): number => {});
+ function flowStartParseAsyncArrowFromCallExpression() {
+ if (_index.match.call(void 0, _types.TokenType.colon)) {
+ const oldNoAnonFunctionType = _base.state.noAnonFunctionType;
+ _base.state.noAnonFunctionType = true;
+ flowParseTypeAnnotation();
+ _base.state.noAnonFunctionType = oldNoAnonFunctionType;
+ }
+} exports.flowStartParseAsyncArrowFromCallExpression = flowStartParseAsyncArrowFromCallExpression;
+
+// We need to support type parameter declarations for arrow functions. This
+// is tricky. There are three situations we need to handle
+//
+// 1. This is either JSX or an arrow function. We'll try JSX first. If that
+// fails, we'll try an arrow function. If that fails, we'll throw the JSX
+// error.
+// 2. This is an arrow function. We'll parse the type parameter declaration,
+// parse the rest, make sure the rest is an arrow function, and go from
+// there
+// 3. This is neither. Just call the super method
+ function flowParseMaybeAssign(noIn, isWithinParens) {
+ if (_index.match.call(void 0, _types.TokenType.lessThan)) {
+ const snapshot = _base.state.snapshot();
+ let wasArrow = _expression.baseParseMaybeAssign.call(void 0, noIn, isWithinParens);
+ if (_base.state.error) {
+ _base.state.restoreFromSnapshot(snapshot);
+ _base.state.type = _types.TokenType.typeParameterStart;
+ } else {
+ return wasArrow;
+ }
+
+ const oldIsType = _index.pushTypeContext.call(void 0, 0);
+ flowParseTypeParameterDeclaration();
+ _index.popTypeContext.call(void 0, oldIsType);
+ wasArrow = _expression.baseParseMaybeAssign.call(void 0, noIn, isWithinParens);
+ if (wasArrow) {
+ return true;
+ }
+ _util.unexpected.call(void 0, );
+ }
+
+ return _expression.baseParseMaybeAssign.call(void 0, noIn, isWithinParens);
+} exports.flowParseMaybeAssign = flowParseMaybeAssign;
+
+// handle return types for arrow functions
+ function flowParseArrow() {
+ if (_index.match.call(void 0, _types.TokenType.colon)) {
+ const oldIsType = _index.pushTypeContext.call(void 0, 0);
+ const snapshot = _base.state.snapshot();
+
+ const oldNoAnonFunctionType = _base.state.noAnonFunctionType;
+ _base.state.noAnonFunctionType = true;
+ flowParseTypeAndPredicateInitialiser();
+ _base.state.noAnonFunctionType = oldNoAnonFunctionType;
+
+ if (_util.canInsertSemicolon.call(void 0, )) _util.unexpected.call(void 0, );
+ if (!_index.match.call(void 0, _types.TokenType.arrow)) _util.unexpected.call(void 0, );
+
+ if (_base.state.error) {
+ _base.state.restoreFromSnapshot(snapshot);
+ }
+ _index.popTypeContext.call(void 0, oldIsType);
+ }
+ return _index.eat.call(void 0, _types.TokenType.arrow);
+} exports.flowParseArrow = flowParseArrow;
+
+ function flowParseSubscripts(startTokenIndex, noCalls = false) {
+ if (
+ _base.state.tokens[_base.state.tokens.length - 1].contextualKeyword === _keywords.ContextualKeyword._async &&
+ _index.match.call(void 0, _types.TokenType.lessThan)
+ ) {
+ const snapshot = _base.state.snapshot();
+ const wasArrow = parseAsyncArrowWithTypeParameters();
+ if (wasArrow && !_base.state.error) {
+ return;
+ }
+ _base.state.restoreFromSnapshot(snapshot);
+ }
+
+ _expression.baseParseSubscripts.call(void 0, startTokenIndex, noCalls);
+} exports.flowParseSubscripts = flowParseSubscripts;
+
+// Returns true if there was an arrow function here.
+function parseAsyncArrowWithTypeParameters() {
+ _base.state.scopeDepth++;
+ const startTokenIndex = _base.state.tokens.length;
+ _statement.parseFunctionParams.call(void 0, );
+ if (!_expression.parseArrow.call(void 0, )) {
+ return false;
+ }
+ _expression.parseArrowExpression.call(void 0, startTokenIndex);
+ return true;
+}
+
+function flowParseEnumDeclaration() {
+ _util.expectContextual.call(void 0, _keywords.ContextualKeyword._enum);
+ _base.state.tokens[_base.state.tokens.length - 1].type = _types.TokenType._enum;
+ _expression.parseIdentifier.call(void 0, );
+ flowParseEnumBody();
+}
+
+function flowParseEnumBody() {
+ if (_util.eatContextual.call(void 0, _keywords.ContextualKeyword._of)) {
+ _index.next.call(void 0, );
+ }
+ _util.expect.call(void 0, _types.TokenType.braceL);
+ flowParseEnumMembers();
+ _util.expect.call(void 0, _types.TokenType.braceR);
+}
+
+function flowParseEnumMembers() {
+ while (!_index.match.call(void 0, _types.TokenType.braceR) && !_base.state.error) {
+ if (_index.eat.call(void 0, _types.TokenType.ellipsis)) {
+ break;
+ }
+ flowParseEnumMember();
+ if (!_index.match.call(void 0, _types.TokenType.braceR)) {
+ _util.expect.call(void 0, _types.TokenType.comma);
+ }
+ }
+}
+
+function flowParseEnumMember() {
+ _expression.parseIdentifier.call(void 0, );
+ if (_index.eat.call(void 0, _types.TokenType.eq)) {
+ // Flow enum values are always just one token (a string, number, or boolean literal).
+ _index.next.call(void 0, );
+ }
+}
diff --git a/node_modules/sucrase/dist/parser/plugins/jsx/index.js b/node_modules/sucrase/dist/parser/plugins/jsx/index.js
new file mode 100644
index 0000000..41797de
--- /dev/null
+++ b/node_modules/sucrase/dist/parser/plugins/jsx/index.js
@@ -0,0 +1,367 @@
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});
+
+
+
+
+
+
+
+
+
+var _index = require('../../tokenizer/index');
+var _types = require('../../tokenizer/types');
+var _base = require('../../traverser/base');
+var _expression = require('../../traverser/expression');
+var _util = require('../../traverser/util');
+var _charcodes = require('../../util/charcodes');
+var _identifier = require('../../util/identifier');
+var _typescript = require('../typescript');
+
+/**
+ * Read token with JSX contents.
+ *
+ * In addition to detecting jsxTagStart and also regular tokens that might be
+ * part of an expression, this code detects the start and end of text ranges
+ * within JSX children. In order to properly count the number of children, we
+ * distinguish jsxText from jsxEmptyText, which is a text range that simplifies
+ * to the empty string after JSX whitespace trimming.
+ *
+ * It turns out that a JSX text range will simplify to the empty string if and
+ * only if both of these conditions hold:
+ * - The range consists entirely of whitespace characters (only counting space,
+ * tab, \r, and \n).
+ * - The range has at least one newline.
+ * This can be proven by analyzing any implementation of whitespace trimming,
+ * e.g. formatJSXTextLiteral in Sucrase or cleanJSXElementLiteralChild in Babel.
+ */
+function jsxReadToken() {
+ let sawNewline = false;
+ let sawNonWhitespace = false;
+ while (true) {
+ if (_base.state.pos >= _base.input.length) {
+ _util.unexpected.call(void 0, "Unterminated JSX contents");
+ return;
+ }
+
+ const ch = _base.input.charCodeAt(_base.state.pos);
+ if (ch === _charcodes.charCodes.lessThan || ch === _charcodes.charCodes.leftCurlyBrace) {
+ if (_base.state.pos === _base.state.start) {
+ if (ch === _charcodes.charCodes.lessThan) {
+ _base.state.pos++;
+ _index.finishToken.call(void 0, _types.TokenType.jsxTagStart);
+ return;
+ }
+ _index.getTokenFromCode.call(void 0, ch);
+ return;
+ }
+ if (sawNewline && !sawNonWhitespace) {
+ _index.finishToken.call(void 0, _types.TokenType.jsxEmptyText);
+ } else {
+ _index.finishToken.call(void 0, _types.TokenType.jsxText);
+ }
+ return;
+ }
+
+ // This is part of JSX text.
+ if (ch === _charcodes.charCodes.lineFeed) {
+ sawNewline = true;
+ } else if (ch !== _charcodes.charCodes.space && ch !== _charcodes.charCodes.carriageReturn && ch !== _charcodes.charCodes.tab) {
+ sawNonWhitespace = true;
+ }
+ _base.state.pos++;
+ }
+}
+
+function jsxReadString(quote) {
+ _base.state.pos++;
+ for (;;) {
+ if (_base.state.pos >= _base.input.length) {
+ _util.unexpected.call(void 0, "Unterminated string constant");
+ return;
+ }
+
+ const ch = _base.input.charCodeAt(_base.state.pos);
+ if (ch === quote) {
+ _base.state.pos++;
+ break;
+ }
+ _base.state.pos++;
+ }
+ _index.finishToken.call(void 0, _types.TokenType.string);
+}
+
+// Read a JSX identifier (valid tag or attribute name).
+//
+// Optimized version since JSX identifiers can't contain
+// escape characters and so can be read as single slice.
+// Also assumes that first character was already checked
+// by isIdentifierStart in readToken.
+
+function jsxReadWord() {
+ let ch;
+ do {
+ if (_base.state.pos > _base.input.length) {
+ _util.unexpected.call(void 0, "Unexpectedly reached the end of input.");
+ return;
+ }
+ ch = _base.input.charCodeAt(++_base.state.pos);
+ } while (_identifier.IS_IDENTIFIER_CHAR[ch] || ch === _charcodes.charCodes.dash);
+ _index.finishToken.call(void 0, _types.TokenType.jsxName);
+}
+
+// Parse next token as JSX identifier
+function jsxParseIdentifier() {
+ nextJSXTagToken();
+}
+
+// Parse namespaced identifier.
+function jsxParseNamespacedName(identifierRole) {
+ jsxParseIdentifier();
+ if (!_index.eat.call(void 0, _types.TokenType.colon)) {
+ // Plain identifier, so this is an access.
+ _base.state.tokens[_base.state.tokens.length - 1].identifierRole = identifierRole;
+ return;
+ }
+ // Process the second half of the namespaced name.
+ jsxParseIdentifier();
+}
+
+// Parses element name in any form - namespaced, member
+// or single identifier.
+function jsxParseElementName() {
+ const firstTokenIndex = _base.state.tokens.length;
+ jsxParseNamespacedName(_index.IdentifierRole.Access);
+ let hadDot = false;
+ while (_index.match.call(void 0, _types.TokenType.dot)) {
+ hadDot = true;
+ nextJSXTagToken();
+ jsxParseIdentifier();
+ }
+ // For tags like <div> with a lowercase letter and no dots, the name is
+ // actually *not* an identifier access, since it's referring to a built-in
+ // tag name. Remove the identifier role in this case so that it's not
+ // accidentally transformed by the imports transform when preserving JSX.
+ if (!hadDot) {
+ const firstToken = _base.state.tokens[firstTokenIndex];
+ const firstChar = _base.input.charCodeAt(firstToken.start);
+ if (firstChar >= _charcodes.charCodes.lowercaseA && firstChar <= _charcodes.charCodes.lowercaseZ) {
+ firstToken.identifierRole = null;
+ }
+ }
+}
+
+// Parses any type of JSX attribute value.
+function jsxParseAttributeValue() {
+ switch (_base.state.type) {
+ case _types.TokenType.braceL:
+ _index.next.call(void 0, );
+ _expression.parseExpression.call(void 0, );
+ nextJSXTagToken();
+ return;
+
+ case _types.TokenType.jsxTagStart:
+ jsxParseElement();
+ nextJSXTagToken();
+ return;
+
+ case _types.TokenType.string:
+ nextJSXTagToken();
+ return;
+
+ default:
+ _util.unexpected.call(void 0, "JSX value should be either an expression or a quoted JSX text");
+ }
+}
+
+// Parse JSX spread child, after already processing the {
+// Does not parse the closing }
+function jsxParseSpreadChild() {
+ _util.expect.call(void 0, _types.TokenType.ellipsis);
+ _expression.parseExpression.call(void 0, );
+}
+
+// Parses JSX opening tag starting after "<".
+// Returns true if the tag was self-closing.
+// Does not parse the last token.
+function jsxParseOpeningElement(initialTokenIndex) {
+ if (_index.match.call(void 0, _types.TokenType.jsxTagEnd)) {
+ // This is an open-fragment.
+ return false;
+ }
+ jsxParseElementName();
+ if (_base.isTypeScriptEnabled) {
+ _typescript.tsTryParseJSXTypeArgument.call(void 0, );
+ }
+ let hasSeenPropSpread = false;
+ while (!_index.match.call(void 0, _types.TokenType.slash) && !_index.match.call(void 0, _types.TokenType.jsxTagEnd) && !_base.state.error) {
+ if (_index.eat.call(void 0, _types.TokenType.braceL)) {
+ hasSeenPropSpread = true;
+ _util.expect.call(void 0, _types.TokenType.ellipsis);
+ _expression.parseMaybeAssign.call(void 0, );
+ // }
+ nextJSXTagToken();
+ continue;
+ }
+ if (
+ hasSeenPropSpread &&
+ _base.state.end - _base.state.start === 3 &&
+ _base.input.charCodeAt(_base.state.start) === _charcodes.charCodes.lowercaseK &&
+ _base.input.charCodeAt(_base.state.start + 1) === _charcodes.charCodes.lowercaseE &&
+ _base.input.charCodeAt(_base.state.start + 2) === _charcodes.charCodes.lowercaseY
+ ) {
+ _base.state.tokens[initialTokenIndex].jsxRole = _index.JSXRole.KeyAfterPropSpread;
+ }
+ jsxParseNamespacedName(_index.IdentifierRole.ObjectKey);
+ if (_index.match.call(void 0, _types.TokenType.eq)) {
+ nextJSXTagToken();
+ jsxParseAttributeValue();
+ }
+ }
+ const isSelfClosing = _index.match.call(void 0, _types.TokenType.slash);
+ if (isSelfClosing) {
+ // /
+ nextJSXTagToken();
+ }
+ return isSelfClosing;
+}
+
+// Parses JSX closing tag starting after "</".
+// Does not parse the last token.
+function jsxParseClosingElement() {
+ if (_index.match.call(void 0, _types.TokenType.jsxTagEnd)) {
+ // Fragment syntax, so we immediately have a tag end.
+ return;
+ }
+ jsxParseElementName();
+}
+
+// Parses entire JSX element, including its opening tag
+// (starting after "<"), attributes, contents and closing tag.
+// Does not parse the last token.
+function jsxParseElementAt() {
+ const initialTokenIndex = _base.state.tokens.length - 1;
+ _base.state.tokens[initialTokenIndex].jsxRole = _index.JSXRole.NoChildren;
+ let numExplicitChildren = 0;
+ const isSelfClosing = jsxParseOpeningElement(initialTokenIndex);
+ if (!isSelfClosing) {
+ nextJSXExprToken();
+ while (true) {
+ switch (_base.state.type) {
+ case _types.TokenType.jsxTagStart:
+ nextJSXTagToken();
+ if (_index.match.call(void 0, _types.TokenType.slash)) {
+ nextJSXTagToken();
+ jsxParseClosingElement();
+ // Key after prop spread takes precedence over number of children,
+ // since it means we switch to createElement, which doesn't care
+ // about number of children.
+ if (_base.state.tokens[initialTokenIndex].jsxRole !== _index.JSXRole.KeyAfterPropSpread) {
+ if (numExplicitChildren === 1) {
+ _base.state.tokens[initialTokenIndex].jsxRole = _index.JSXRole.OneChild;
+ } else if (numExplicitChildren > 1) {
+ _base.state.tokens[initialTokenIndex].jsxRole = _index.JSXRole.StaticChildren;
+ }
+ }
+ return;
+ }
+ numExplicitChildren++;
+ jsxParseElementAt();
+ nextJSXExprToken();
+ break;
+
+ case _types.TokenType.jsxText:
+ numExplicitChildren++;
+ nextJSXExprToken();
+ break;
+
+ case _types.TokenType.jsxEmptyText:
+ nextJSXExprToken();
+ break;
+
+ case _types.TokenType.braceL:
+ _index.next.call(void 0, );
+ if (_index.match.call(void 0, _types.TokenType.ellipsis)) {
+ jsxParseSpreadChild();
+ nextJSXExprToken();
+ // Spread children are a mechanism to explicitly mark children as
+ // static, so count it as 2 children to satisfy the "more than one
+ // child" condition.
+ numExplicitChildren += 2;
+ } else {
+ // If we see {}, this is an empty pseudo-expression that doesn't
+ // count as a child.
+ if (!_index.match.call(void 0, _types.TokenType.braceR)) {
+ numExplicitChildren++;
+ _expression.parseExpression.call(void 0, );
+ }
+ nextJSXExprToken();
+ }
+
+ break;
+
+ // istanbul ignore next - should never happen
+ default:
+ _util.unexpected.call(void 0, );
+ return;
+ }
+ }
+ }
+}
+
+// Parses entire JSX element from current position.
+// Does not parse the last token.
+ function jsxParseElement() {
+ nextJSXTagToken();
+ jsxParseElementAt();
+} exports.jsxParseElement = jsxParseElement;
+
+// ==================================
+// Overrides
+// ==================================
+
+ function nextJSXTagToken() {
+ _base.state.tokens.push(new (0, _index.Token)());
+ _index.skipSpace.call(void 0, );
+ _base.state.start = _base.state.pos;
+ const code = _base.input.charCodeAt(_base.state.pos);
+
+ if (_identifier.IS_IDENTIFIER_START[code]) {
+ jsxReadWord();
+ } else if (code === _charcodes.charCodes.quotationMark || code === _charcodes.charCodes.apostrophe) {
+ jsxReadString(code);
+ } else {
+ // The following tokens are just one character each.
+ ++_base.state.pos;
+ switch (code) {
+ case _charcodes.charCodes.greaterThan:
+ _index.finishToken.call(void 0, _types.TokenType.jsxTagEnd);
+ break;
+ case _charcodes.charCodes.lessThan:
+ _index.finishToken.call(void 0, _types.TokenType.jsxTagStart);
+ break;
+ case _charcodes.charCodes.slash:
+ _index.finishToken.call(void 0, _types.TokenType.slash);
+ break;
+ case _charcodes.charCodes.equalsTo:
+ _index.finishToken.call(void 0, _types.TokenType.eq);
+ break;
+ case _charcodes.charCodes.leftCurlyBrace:
+ _index.finishToken.call(void 0, _types.TokenType.braceL);
+ break;
+ case _charcodes.charCodes.dot:
+ _index.finishToken.call(void 0, _types.TokenType.dot);
+ break;
+ case _charcodes.charCodes.colon:
+ _index.finishToken.call(void 0, _types.TokenType.colon);
+ break;
+ default:
+ _util.unexpected.call(void 0, );
+ }
+ }
+} exports.nextJSXTagToken = nextJSXTagToken;
+
+function nextJSXExprToken() {
+ _base.state.tokens.push(new (0, _index.Token)());
+ _base.state.start = _base.state.pos;
+ jsxReadToken();
+}
diff --git a/node_modules/sucrase/dist/parser/plugins/jsx/xhtml.js b/node_modules/sucrase/dist/parser/plugins/jsx/xhtml.js
new file mode 100644
index 0000000..d8e91c5
--- /dev/null
+++ b/node_modules/sucrase/dist/parser/plugins/jsx/xhtml.js
@@ -0,0 +1,256 @@
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});// Use a Map rather than object to avoid unexpected __proto__ access.
+exports. default = new Map([
+ ["quot", "\u0022"],
+ ["amp", "&"],
+ ["apos", "\u0027"],
+ ["lt", "<"],
+ ["gt", ">"],
+ ["nbsp", "\u00A0"],
+ ["iexcl", "\u00A1"],
+ ["cent", "\u00A2"],
+ ["pound", "\u00A3"],
+ ["curren", "\u00A4"],
+ ["yen", "\u00A5"],
+ ["brvbar", "\u00A6"],
+ ["sect", "\u00A7"],
+ ["uml", "\u00A8"],
+ ["copy", "\u00A9"],
+ ["ordf", "\u00AA"],
+ ["laquo", "\u00AB"],
+ ["not", "\u00AC"],
+ ["shy", "\u00AD"],
+ ["reg", "\u00AE"],
+ ["macr", "\u00AF"],
+ ["deg", "\u00B0"],
+ ["plusmn", "\u00B1"],
+ ["sup2", "\u00B2"],
+ ["sup3", "\u00B3"],
+ ["acute", "\u00B4"],
+ ["micro", "\u00B5"],
+ ["para", "\u00B6"],
+ ["middot", "\u00B7"],
+ ["cedil", "\u00B8"],
+ ["sup1", "\u00B9"],
+ ["ordm", "\u00BA"],
+ ["raquo", "\u00BB"],
+ ["frac14", "\u00BC"],
+ ["frac12", "\u00BD"],
+ ["frac34", "\u00BE"],
+ ["iquest", "\u00BF"],
+ ["Agrave", "\u00C0"],
+ ["Aacute", "\u00C1"],
+ ["Acirc", "\u00C2"],
+ ["Atilde", "\u00C3"],
+ ["Auml", "\u00C4"],
+ ["Aring", "\u00C5"],
+ ["AElig", "\u00C6"],
+ ["Ccedil", "\u00C7"],
+ ["Egrave", "\u00C8"],
+ ["Eacute", "\u00C9"],
+ ["Ecirc", "\u00CA"],
+ ["Euml", "\u00CB"],
+ ["Igrave", "\u00CC"],
+ ["Iacute", "\u00CD"],
+ ["Icirc", "\u00CE"],
+ ["Iuml", "\u00CF"],
+ ["ETH", "\u00D0"],
+ ["Ntilde", "\u00D1"],
+ ["Ograve", "\u00D2"],
+ ["Oacute", "\u00D3"],
+ ["Ocirc", "\u00D4"],
+ ["Otilde", "\u00D5"],
+ ["Ouml", "\u00D6"],
+ ["times", "\u00D7"],
+ ["Oslash", "\u00D8"],
+ ["Ugrave", "\u00D9"],
+ ["Uacute", "\u00DA"],
+ ["Ucirc", "\u00DB"],
+ ["Uuml", "\u00DC"],
+ ["Yacute", "\u00DD"],
+ ["THORN", "\u00DE"],
+ ["szlig", "\u00DF"],
+ ["agrave", "\u00E0"],
+ ["aacute", "\u00E1"],
+ ["acirc", "\u00E2"],
+ ["atilde", "\u00E3"],
+ ["auml", "\u00E4"],
+ ["aring", "\u00E5"],
+ ["aelig", "\u00E6"],
+ ["ccedil", "\u00E7"],
+ ["egrave", "\u00E8"],
+ ["eacute", "\u00E9"],
+ ["ecirc", "\u00EA"],
+ ["euml", "\u00EB"],
+ ["igrave", "\u00EC"],
+ ["iacute", "\u00ED"],
+ ["icirc", "\u00EE"],
+ ["iuml", "\u00EF"],
+ ["eth", "\u00F0"],
+ ["ntilde", "\u00F1"],
+ ["ograve", "\u00F2"],
+ ["oacute", "\u00F3"],
+ ["ocirc", "\u00F4"],
+ ["otilde", "\u00F5"],
+ ["ouml", "\u00F6"],
+ ["divide", "\u00F7"],
+ ["oslash", "\u00F8"],
+ ["ugrave", "\u00F9"],
+ ["uacute", "\u00FA"],
+ ["ucirc", "\u00FB"],
+ ["uuml", "\u00FC"],
+ ["yacute", "\u00FD"],
+ ["thorn", "\u00FE"],
+ ["yuml", "\u00FF"],
+ ["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"],
+]);
diff --git a/node_modules/sucrase/dist/parser/plugins/types.js b/node_modules/sucrase/dist/parser/plugins/types.js
new file mode 100644
index 0000000..c892994
--- /dev/null
+++ b/node_modules/sucrase/dist/parser/plugins/types.js
@@ -0,0 +1,37 @@
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _index = require('../tokenizer/index');
+var _types = require('../tokenizer/types');
+var _base = require('../traverser/base');
+var _expression = require('../traverser/expression');
+var _flow = require('./flow');
+var _typescript = require('./typescript');
+
+/**
+ * Common parser code for TypeScript and Flow.
+ */
+
+// An apparent conditional expression could actually be an optional parameter in an arrow function.
+ function typedParseConditional(noIn) {
+ // If we see ?:, this can't possibly be a valid conditional. typedParseParenItem will be called
+ // later to finish off the arrow parameter. We also need to handle bare ? tokens for optional
+ // parameters without type annotations, i.e. ?, and ?) .
+ if (_index.match.call(void 0, _types.TokenType.question)) {
+ const nextType = _index.lookaheadType.call(void 0, );
+ if (nextType === _types.TokenType.colon || nextType === _types.TokenType.comma || nextType === _types.TokenType.parenR) {
+ return;
+ }
+ }
+ _expression.baseParseConditional.call(void 0, noIn);
+} exports.typedParseConditional = typedParseConditional;
+
+// Note: These "type casts" are *not* valid TS expressions.
+// But we parse them here and change them when completing the arrow function.
+ function typedParseParenItem() {
+ _index.eatTypeToken.call(void 0, _types.TokenType.question);
+ if (_index.match.call(void 0, _types.TokenType.colon)) {
+ if (_base.isTypeScriptEnabled) {
+ _typescript.tsParseTypeAnnotation.call(void 0, );
+ } else if (_base.isFlowEnabled) {
+ _flow.flowParseTypeAnnotation.call(void 0, );
+ }
+ }
+} exports.typedParseParenItem = typedParseParenItem;
diff --git a/node_modules/sucrase/dist/parser/plugins/typescript.js b/node_modules/sucrase/dist/parser/plugins/typescript.js
new file mode 100644
index 0000000..d1ec6d3
--- /dev/null
+++ b/node_modules/sucrase/dist/parser/plugins/typescript.js
@@ -0,0 +1,1632 @@
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});
+
+
+
+
+
+
+
+
+
+
+
+var _index = require('../tokenizer/index');
+var _keywords = require('../tokenizer/keywords');
+var _types = require('../tokenizer/types');
+var _base = require('../traverser/base');
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+var _expression = require('../traverser/expression');
+var _lval = require('../traverser/lval');
+
+
+
+
+
+
+
+
+var _statement = require('../traverser/statement');
+
+
+
+
+
+
+
+
+
+
+
+var _util = require('../traverser/util');
+var _jsx = require('./jsx');
+
+function tsIsIdentifier() {
+ // TODO: actually a bit more complex in TypeScript, but shouldn't matter.
+ // See https://github.com/Microsoft/TypeScript/issues/15008
+ return _index.match.call(void 0, _types.TokenType.name);
+}
+
+function isLiteralPropertyName() {
+ return (
+ _index.match.call(void 0, _types.TokenType.name) ||
+ Boolean(_base.state.type & _types.TokenType.IS_KEYWORD) ||
+ _index.match.call(void 0, _types.TokenType.string) ||
+ _index.match.call(void 0, _types.TokenType.num) ||
+ _index.match.call(void 0, _types.TokenType.bigint) ||
+ _index.match.call(void 0, _types.TokenType.decimal)
+ );
+}
+
+function tsNextTokenCanFollowModifier() {
+ // Note: TypeScript's implementation is much more complicated because
+ // more things are considered modifiers there.
+ // This implementation only handles modifiers not handled by babylon itself. And "static".
+ // TODO: Would be nice to avoid lookahead. Want a hasLineBreakUpNext() method...
+ const snapshot = _base.state.snapshot();
+
+ _index.next.call(void 0, );
+ const canFollowModifier =
+ (_index.match.call(void 0, _types.TokenType.bracketL) ||
+ _index.match.call(void 0, _types.TokenType.braceL) ||
+ _index.match.call(void 0, _types.TokenType.star) ||
+ _index.match.call(void 0, _types.TokenType.ellipsis) ||
+ _index.match.call(void 0, _types.TokenType.hash) ||
+ isLiteralPropertyName()) &&
+ !_util.hasPrecedingLineBreak.call(void 0, );
+
+ if (canFollowModifier) {
+ return true;
+ } else {
+ _base.state.restoreFromSnapshot(snapshot);
+ return false;
+ }
+}
+
+ function tsParseModifiers(allowedModifiers) {
+ while (true) {
+ const modifier = tsParseModifier(allowedModifiers);
+ if (modifier === null) {
+ break;
+ }
+ }
+} exports.tsParseModifiers = tsParseModifiers;
+
+/** Parses a modifier matching one the given modifier names. */
+ function tsParseModifier(
+ allowedModifiers,
+) {
+ if (!_index.match.call(void 0, _types.TokenType.name)) {
+ return null;
+ }
+
+ const modifier = _base.state.contextualKeyword;
+ if (allowedModifiers.indexOf(modifier) !== -1 && tsNextTokenCanFollowModifier()) {
+ switch (modifier) {
+ case _keywords.ContextualKeyword._readonly:
+ _base.state.tokens[_base.state.tokens.length - 1].type = _types.TokenType._readonly;
+ break;
+ case _keywords.ContextualKeyword._abstract:
+ _base.state.tokens[_base.state.tokens.length - 1].type = _types.TokenType._abstract;
+ break;
+ case _keywords.ContextualKeyword._static:
+ _base.state.tokens[_base.state.tokens.length - 1].type = _types.TokenType._static;
+ break;
+ case _keywords.ContextualKeyword._public:
+ _base.state.tokens[_base.state.tokens.length - 1].type = _types.TokenType._public;
+ break;
+ case _keywords.ContextualKeyword._private:
+ _base.state.tokens[_base.state.tokens.length - 1].type = _types.TokenType._private;
+ break;
+ case _keywords.ContextualKeyword._protected:
+ _base.state.tokens[_base.state.tokens.length - 1].type = _types.TokenType._protected;
+ break;
+ case _keywords.ContextualKeyword._override:
+ _base.state.tokens[_base.state.tokens.length - 1].type = _types.TokenType._override;
+ break;
+ case _keywords.ContextualKeyword._declare:
+ _base.state.tokens[_base.state.tokens.length - 1].type = _types.TokenType._declare;
+ break;
+ default:
+ break;
+ }
+ return modifier;
+ }
+ return null;
+} exports.tsParseModifier = tsParseModifier;
+
+function tsParseEntityName() {
+ _expression.parseIdentifier.call(void 0, );
+ while (_index.eat.call(void 0, _types.TokenType.dot)) {
+ _expression.parseIdentifier.call(void 0, );
+ }
+}
+
+function tsParseTypeReference() {
+ tsParseEntityName();
+ if (!_util.hasPrecedingLineBreak.call(void 0, ) && _index.match.call(void 0, _types.TokenType.lessThan)) {
+ tsParseTypeArguments();
+ }
+}
+
+function tsParseThisTypePredicate() {
+ _index.next.call(void 0, );
+ tsParseTypeAnnotation();
+}
+
+function tsParseThisTypeNode() {
+ _index.next.call(void 0, );
+}
+
+function tsParseTypeQuery() {
+ _util.expect.call(void 0, _types.TokenType._typeof);
+ if (_index.match.call(void 0, _types.TokenType._import)) {
+ tsParseImportType();
+ } else {
+ tsParseEntityName();
+ }
+ if (!_util.hasPrecedingLineBreak.call(void 0, ) && _index.match.call(void 0, _types.TokenType.lessThan)) {
+ tsParseTypeArguments();
+ }
+}
+
+function tsParseImportType() {
+ _util.expect.call(void 0, _types.TokenType._import);
+ _util.expect.call(void 0, _types.TokenType.parenL);
+ _util.expect.call(void 0, _types.TokenType.string);
+ _util.expect.call(void 0, _types.TokenType.parenR);
+ if (_index.eat.call(void 0, _types.TokenType.dot)) {
+ tsParseEntityName();
+ }
+ if (_index.match.call(void 0, _types.TokenType.lessThan)) {
+ tsParseTypeArguments();
+ }
+}
+
+function tsParseTypeParameter() {
+ _index.eat.call(void 0, _types.TokenType._const);
+ const hadIn = _index.eat.call(void 0, _types.TokenType._in);
+ const hadOut = _util.eatContextual.call(void 0, _keywords.ContextualKeyword._out);
+ _index.eat.call(void 0, _types.TokenType._const);
+ if ((hadIn || hadOut) && !_index.match.call(void 0, _types.TokenType.name)) {
+ // The "in" or "out" keyword must have actually been the type parameter
+ // name, so set it as the name.
+ _base.state.tokens[_base.state.tokens.length - 1].type = _types.TokenType.name;
+ } else {
+ _expression.parseIdentifier.call(void 0, );
+ }
+
+ if (_index.eat.call(void 0, _types.TokenType._extends)) {
+ tsParseType();
+ }
+ if (_index.eat.call(void 0, _types.TokenType.eq)) {
+ tsParseType();
+ }
+}
+
+ function tsTryParseTypeParameters() {
+ if (_index.match.call(void 0, _types.TokenType.lessThan)) {
+ tsParseTypeParameters();
+ }
+} exports.tsTryParseTypeParameters = tsTryParseTypeParameters;
+
+function tsParseTypeParameters() {
+ const oldIsType = _index.pushTypeContext.call(void 0, 0);
+ if (_index.match.call(void 0, _types.TokenType.lessThan) || _index.match.call(void 0, _types.TokenType.typeParameterStart)) {
+ _index.next.call(void 0, );
+ } else {
+ _util.unexpected.call(void 0, );
+ }
+
+ while (!_index.eat.call(void 0, _types.TokenType.greaterThan) && !_base.state.error) {
+ tsParseTypeParameter();
+ _index.eat.call(void 0, _types.TokenType.comma);
+ }
+ _index.popTypeContext.call(void 0, oldIsType);
+}
+
+// Note: In TypeScript implementation we must provide `yieldContext` and `awaitContext`,
+// but here it's always false, because this is only used for types.
+function tsFillSignature(returnToken) {
+ // Arrow fns *must* have return token (`=>`). Normal functions can omit it.
+ const returnTokenRequired = returnToken === _types.TokenType.arrow;
+ tsTryParseTypeParameters();
+ _util.expect.call(void 0, _types.TokenType.parenL);
+ // Create a scope even though we're doing type parsing so we don't accidentally
+ // treat params as top-level bindings.
+ _base.state.scopeDepth++;
+ tsParseBindingListForSignature(false /* isBlockScope */);
+ _base.state.scopeDepth--;
+ if (returnTokenRequired) {
+ tsParseTypeOrTypePredicateAnnotation(returnToken);
+ } else if (_index.match.call(void 0, returnToken)) {
+ tsParseTypeOrTypePredicateAnnotation(returnToken);
+ }
+}
+
+function tsParseBindingListForSignature(isBlockScope) {
+ _lval.parseBindingList.call(void 0, _types.TokenType.parenR, isBlockScope);
+}
+
+function tsParseTypeMemberSemicolon() {
+ if (!_index.eat.call(void 0, _types.TokenType.comma)) {
+ _util.semicolon.call(void 0, );
+ }
+}
+
+function tsParseSignatureMember() {
+ tsFillSignature(_types.TokenType.colon);
+ tsParseTypeMemberSemicolon();
+}
+
+function tsIsUnambiguouslyIndexSignature() {
+ const snapshot = _base.state.snapshot();
+ _index.next.call(void 0, ); // Skip '{'
+ const isIndexSignature = _index.eat.call(void 0, _types.TokenType.name) && _index.match.call(void 0, _types.TokenType.colon);
+ _base.state.restoreFromSnapshot(snapshot);
+ return isIndexSignature;
+}
+
+function tsTryParseIndexSignature() {
+ if (!(_index.match.call(void 0, _types.TokenType.bracketL) && tsIsUnambiguouslyIndexSignature())) {
+ return false;
+ }
+
+ const oldIsType = _index.pushTypeContext.call(void 0, 0);
+
+ _util.expect.call(void 0, _types.TokenType.bracketL);
+ _expression.parseIdentifier.call(void 0, );
+ tsParseTypeAnnotation();
+ _util.expect.call(void 0, _types.TokenType.bracketR);
+
+ tsTryParseTypeAnnotation();
+ tsParseTypeMemberSemicolon();
+
+ _index.popTypeContext.call(void 0, oldIsType);
+ return true;
+}
+
+function tsParsePropertyOrMethodSignature(isReadonly) {
+ _index.eat.call(void 0, _types.TokenType.question);
+
+ if (!isReadonly && (_index.match.call(void 0, _types.TokenType.parenL) || _index.match.call(void 0, _types.TokenType.lessThan))) {
+ tsFillSignature(_types.TokenType.colon);
+ tsParseTypeMemberSemicolon();
+ } else {
+ tsTryParseTypeAnnotation();
+ tsParseTypeMemberSemicolon();
+ }
+}
+
+function tsParseTypeMember() {
+ if (_index.match.call(void 0, _types.TokenType.parenL) || _index.match.call(void 0, _types.TokenType.lessThan)) {
+ // call signature
+ tsParseSignatureMember();
+ return;
+ }
+ if (_index.match.call(void 0, _types.TokenType._new)) {
+ _index.next.call(void 0, );
+ if (_index.match.call(void 0, _types.TokenType.parenL) || _index.match.call(void 0, _types.TokenType.lessThan)) {
+ // constructor signature
+ tsParseSignatureMember();
+ } else {
+ tsParsePropertyOrMethodSignature(false);
+ }
+ return;
+ }
+ const readonly = !!tsParseModifier([_keywords.ContextualKeyword._readonly]);
+
+ const found = tsTryParseIndexSignature();
+ if (found) {
+ return;
+ }
+ if (
+ (_util.isContextual.call(void 0, _keywords.ContextualKeyword._get) || _util.isContextual.call(void 0, _keywords.ContextualKeyword._set)) &&
+ tsNextTokenCanFollowModifier()
+ ) {
+ // This is a getter/setter on a type. The tsNextTokenCanFollowModifier
+ // function already called next() for us, so continue parsing the name.
+ }
+ _expression.parsePropertyName.call(void 0, -1 /* Types don't need context IDs. */);
+ tsParsePropertyOrMethodSignature(readonly);
+}
+
+function tsParseTypeLiteral() {
+ tsParseObjectTypeMembers();
+}
+
+function tsParseObjectTypeMembers() {
+ _util.expect.call(void 0, _types.TokenType.braceL);
+ while (!_index.eat.call(void 0, _types.TokenType.braceR) && !_base.state.error) {
+ tsParseTypeMember();
+ }
+}
+
+function tsLookaheadIsStartOfMappedType() {
+ const snapshot = _base.state.snapshot();
+ const isStartOfMappedType = tsIsStartOfMappedType();
+ _base.state.restoreFromSnapshot(snapshot);
+ return isStartOfMappedType;
+}
+
+function tsIsStartOfMappedType() {
+ _index.next.call(void 0, );
+ if (_index.eat.call(void 0, _types.TokenType.plus) || _index.eat.call(void 0, _types.TokenType.minus)) {
+ return _util.isContextual.call(void 0, _keywords.ContextualKeyword._readonly);
+ }
+ if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._readonly)) {
+ _index.next.call(void 0, );
+ }
+ if (!_index.match.call(void 0, _types.TokenType.bracketL)) {
+ return false;
+ }
+ _index.next.call(void 0, );
+ if (!tsIsIdentifier()) {
+ return false;
+ }
+ _index.next.call(void 0, );
+ return _index.match.call(void 0, _types.TokenType._in);
+}
+
+function tsParseMappedTypeParameter() {
+ _expression.parseIdentifier.call(void 0, );
+ _util.expect.call(void 0, _types.TokenType._in);
+ tsParseType();
+}
+
+function tsParseMappedType() {
+ _util.expect.call(void 0, _types.TokenType.braceL);
+ if (_index.match.call(void 0, _types.TokenType.plus) || _index.match.call(void 0, _types.TokenType.minus)) {
+ _index.next.call(void 0, );
+ _util.expectContextual.call(void 0, _keywords.ContextualKeyword._readonly);
+ } else {
+ _util.eatContextual.call(void 0, _keywords.ContextualKeyword._readonly);
+ }
+ _util.expect.call(void 0, _types.TokenType.bracketL);
+ tsParseMappedTypeParameter();
+ if (_util.eatContextual.call(void 0, _keywords.ContextualKeyword._as)) {
+ tsParseType();
+ }
+ _util.expect.call(void 0, _types.TokenType.bracketR);
+ if (_index.match.call(void 0, _types.TokenType.plus) || _index.match.call(void 0, _types.TokenType.minus)) {
+ _index.next.call(void 0, );
+ _util.expect.call(void 0, _types.TokenType.question);
+ } else {
+ _index.eat.call(void 0, _types.TokenType.question);
+ }
+ tsTryParseType();
+ _util.semicolon.call(void 0, );
+ _util.expect.call(void 0, _types.TokenType.braceR);
+}
+
+function tsParseTupleType() {
+ _util.expect.call(void 0, _types.TokenType.bracketL);
+ while (!_index.eat.call(void 0, _types.TokenType.bracketR) && !_base.state.error) {
+ // Do not validate presence of either none or only labeled elements
+ tsParseTupleElementType();
+ _index.eat.call(void 0, _types.TokenType.comma);
+ }
+}
+
+function tsParseTupleElementType() {
+ // parses `...TsType[]`
+ if (_index.eat.call(void 0, _types.TokenType.ellipsis)) {
+ tsParseType();
+ } else {
+ // parses `TsType?`
+ tsParseType();
+ _index.eat.call(void 0, _types.TokenType.question);
+ }
+
+ // The type we parsed above was actually a label
+ if (_index.eat.call(void 0, _types.TokenType.colon)) {
+ // Labeled tuple types must affix the label with `...` or `?`, so no need to handle those here
+ tsParseType();
+ }
+}
+
+function tsParseParenthesizedType() {
+ _util.expect.call(void 0, _types.TokenType.parenL);
+ tsParseType();
+ _util.expect.call(void 0, _types.TokenType.parenR);
+}
+
+function tsParseTemplateLiteralType() {
+ // Finish `, read quasi
+ _index.nextTemplateToken.call(void 0, );
+ // Finish quasi, read ${
+ _index.nextTemplateToken.call(void 0, );
+ while (!_index.match.call(void 0, _types.TokenType.backQuote) && !_base.state.error) {
+ _util.expect.call(void 0, _types.TokenType.dollarBraceL);
+ tsParseType();
+ // Finish }, read quasi
+ _index.nextTemplateToken.call(void 0, );
+ // Finish quasi, read either ${ or `
+ _index.nextTemplateToken.call(void 0, );
+ }
+ _index.next.call(void 0, );
+}
+
+var FunctionType; (function (FunctionType) {
+ const TSFunctionType = 0; FunctionType[FunctionType["TSFunctionType"] = TSFunctionType] = "TSFunctionType";
+ const TSConstructorType = TSFunctionType + 1; FunctionType[FunctionType["TSConstructorType"] = TSConstructorType] = "TSConstructorType";
+ const TSAbstractConstructorType = TSConstructorType + 1; FunctionType[FunctionType["TSAbstractConstructorType"] = TSAbstractConstructorType] = "TSAbstractConstructorType";
+})(FunctionType || (FunctionType = {}));
+
+function tsParseFunctionOrConstructorType(type) {
+ if (type === FunctionType.TSAbstractConstructorType) {
+ _util.expectContextual.call(void 0, _keywords.ContextualKeyword._abstract);
+ }
+ if (type === FunctionType.TSConstructorType || type === FunctionType.TSAbstractConstructorType) {
+ _util.expect.call(void 0, _types.TokenType._new);
+ }
+ const oldInDisallowConditionalTypesContext = _base.state.inDisallowConditionalTypesContext;
+ _base.state.inDisallowConditionalTypesContext = false;
+ tsFillSignature(_types.TokenType.arrow);
+ _base.state.inDisallowConditionalTypesContext = oldInDisallowConditionalTypesContext;
+}
+
+function tsParseNonArrayType() {
+ switch (_base.state.type) {
+ case _types.TokenType.name:
+ tsParseTypeReference();
+ return;
+ case _types.TokenType._void:
+ case _types.TokenType._null:
+ _index.next.call(void 0, );
+ return;
+ case _types.TokenType.string:
+ case _types.TokenType.num:
+ case _types.TokenType.bigint:
+ case _types.TokenType.decimal:
+ case _types.TokenType._true:
+ case _types.TokenType._false:
+ _expression.parseLiteral.call(void 0, );
+ return;
+ case _types.TokenType.minus:
+ _index.next.call(void 0, );
+ _expression.parseLiteral.call(void 0, );
+ return;
+ case _types.TokenType._this: {
+ tsParseThisTypeNode();
+ if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._is) && !_util.hasPrecedingLineBreak.call(void 0, )) {
+ tsParseThisTypePredicate();
+ }
+ return;
+ }
+ case _types.TokenType._typeof:
+ tsParseTypeQuery();
+ return;
+ case _types.TokenType._import:
+ tsParseImportType();
+ return;
+ case _types.TokenType.braceL:
+ if (tsLookaheadIsStartOfMappedType()) {
+ tsParseMappedType();
+ } else {
+ tsParseTypeLiteral();
+ }
+ return;
+ case _types.TokenType.bracketL:
+ tsParseTupleType();
+ return;
+ case _types.TokenType.parenL:
+ tsParseParenthesizedType();
+ return;
+ case _types.TokenType.backQuote:
+ tsParseTemplateLiteralType();
+ return;
+ default:
+ if (_base.state.type & _types.TokenType.IS_KEYWORD) {
+ _index.next.call(void 0, );
+ _base.state.tokens[_base.state.tokens.length - 1].type = _types.TokenType.name;
+ return;
+ }
+ break;
+ }
+
+ _util.unexpected.call(void 0, );
+}
+
+function tsParseArrayTypeOrHigher() {
+ tsParseNonArrayType();
+ while (!_util.hasPrecedingLineBreak.call(void 0, ) && _index.eat.call(void 0, _types.TokenType.bracketL)) {
+ if (!_index.eat.call(void 0, _types.TokenType.bracketR)) {
+ // If we hit ] immediately, this is an array type, otherwise it's an indexed access type.
+ tsParseType();
+ _util.expect.call(void 0, _types.TokenType.bracketR);
+ }
+ }
+}
+
+function tsParseInferType() {
+ _util.expectContextual.call(void 0, _keywords.ContextualKeyword._infer);
+ _expression.parseIdentifier.call(void 0, );
+ if (_index.match.call(void 0, _types.TokenType._extends)) {
+ // Infer type constraints introduce an ambiguity about whether the "extends"
+ // is a constraint for this infer type or is another conditional type.
+ const snapshot = _base.state.snapshot();
+ _util.expect.call(void 0, _types.TokenType._extends);
+ const oldInDisallowConditionalTypesContext = _base.state.inDisallowConditionalTypesContext;
+ _base.state.inDisallowConditionalTypesContext = true;
+ tsParseType();
+ _base.state.inDisallowConditionalTypesContext = oldInDisallowConditionalTypesContext;
+ if (_base.state.error || (!_base.state.inDisallowConditionalTypesContext && _index.match.call(void 0, _types.TokenType.question))) {
+ _base.state.restoreFromSnapshot(snapshot);
+ }
+ }
+}
+
+function tsParseTypeOperatorOrHigher() {
+ if (
+ _util.isContextual.call(void 0, _keywords.ContextualKeyword._keyof) ||
+ _util.isContextual.call(void 0, _keywords.ContextualKeyword._unique) ||
+ _util.isContextual.call(void 0, _keywords.ContextualKeyword._readonly)
+ ) {
+ _index.next.call(void 0, );
+ tsParseTypeOperatorOrHigher();
+ } else if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._infer)) {
+ tsParseInferType();
+ } else {
+ const oldInDisallowConditionalTypesContext = _base.state.inDisallowConditionalTypesContext;
+ _base.state.inDisallowConditionalTypesContext = false;
+ tsParseArrayTypeOrHigher();
+ _base.state.inDisallowConditionalTypesContext = oldInDisallowConditionalTypesContext;
+ }
+}
+
+function tsParseIntersectionTypeOrHigher() {
+ _index.eat.call(void 0, _types.TokenType.bitwiseAND);
+ tsParseTypeOperatorOrHigher();
+ if (_index.match.call(void 0, _types.TokenType.bitwiseAND)) {
+ while (_index.eat.call(void 0, _types.TokenType.bitwiseAND)) {
+ tsParseTypeOperatorOrHigher();
+ }
+ }
+}
+
+function tsParseUnionTypeOrHigher() {
+ _index.eat.call(void 0, _types.TokenType.bitwiseOR);
+ tsParseIntersectionTypeOrHigher();
+ if (_index.match.call(void 0, _types.TokenType.bitwiseOR)) {
+ while (_index.eat.call(void 0, _types.TokenType.bitwiseOR)) {
+ tsParseIntersectionTypeOrHigher();
+ }
+ }
+}
+
+function tsIsStartOfFunctionType() {
+ if (_index.match.call(void 0, _types.TokenType.lessThan)) {
+ return true;
+ }
+ return _index.match.call(void 0, _types.TokenType.parenL) && tsLookaheadIsUnambiguouslyStartOfFunctionType();
+}
+
+function tsSkipParameterStart() {
+ if (_index.match.call(void 0, _types.TokenType.name) || _index.match.call(void 0, _types.TokenType._this)) {
+ _index.next.call(void 0, );
+ return true;
+ }
+ // If this is a possible array/object destructure, walk to the matching bracket/brace.
+ // The next token after will tell us definitively whether this is a function param.
+ if (_index.match.call(void 0, _types.TokenType.braceL) || _index.match.call(void 0, _types.TokenType.bracketL)) {
+ let depth = 1;
+ _index.next.call(void 0, );
+ while (depth > 0 && !_base.state.error) {
+ if (_index.match.call(void 0, _types.TokenType.braceL) || _index.match.call(void 0, _types.TokenType.bracketL)) {
+ depth++;
+ } else if (_index.match.call(void 0, _types.TokenType.braceR) || _index.match.call(void 0, _types.TokenType.bracketR)) {
+ depth--;
+ }
+ _index.next.call(void 0, );
+ }
+ return true;
+ }
+ return false;
+}
+
+function tsLookaheadIsUnambiguouslyStartOfFunctionType() {
+ const snapshot = _base.state.snapshot();
+ const isUnambiguouslyStartOfFunctionType = tsIsUnambiguouslyStartOfFunctionType();
+ _base.state.restoreFromSnapshot(snapshot);
+ return isUnambiguouslyStartOfFunctionType;
+}
+
+function tsIsUnambiguouslyStartOfFunctionType() {
+ _index.next.call(void 0, );
+ if (_index.match.call(void 0, _types.TokenType.parenR) || _index.match.call(void 0, _types.TokenType.ellipsis)) {
+ // ( )
+ // ( ...
+ return true;
+ }
+ if (tsSkipParameterStart()) {
+ if (_index.match.call(void 0, _types.TokenType.colon) || _index.match.call(void 0, _types.TokenType.comma) || _index.match.call(void 0, _types.TokenType.question) || _index.match.call(void 0, _types.TokenType.eq)) {
+ // ( xxx :
+ // ( xxx ,
+ // ( xxx ?
+ // ( xxx =
+ return true;
+ }
+ if (_index.match.call(void 0, _types.TokenType.parenR)) {
+ _index.next.call(void 0, );
+ if (_index.match.call(void 0, _types.TokenType.arrow)) {
+ // ( xxx ) =>
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+function tsParseTypeOrTypePredicateAnnotation(returnToken) {
+ const oldIsType = _index.pushTypeContext.call(void 0, 0);
+ _util.expect.call(void 0, returnToken);
+ const finishedReturn = tsParseTypePredicateOrAssertsPrefix();
+ if (!finishedReturn) {
+ tsParseType();
+ }
+ _index.popTypeContext.call(void 0, oldIsType);
+}
+
+function tsTryParseTypeOrTypePredicateAnnotation() {
+ if (_index.match.call(void 0, _types.TokenType.colon)) {
+ tsParseTypeOrTypePredicateAnnotation(_types.TokenType.colon);
+ }
+}
+
+ function tsTryParseTypeAnnotation() {
+ if (_index.match.call(void 0, _types.TokenType.colon)) {
+ tsParseTypeAnnotation();
+ }
+} exports.tsTryParseTypeAnnotation = tsTryParseTypeAnnotation;
+
+function tsTryParseType() {
+ if (_index.eat.call(void 0, _types.TokenType.colon)) {
+ tsParseType();
+ }
+}
+
+/**
+ * Detect a few special return syntax cases: `x is T`, `asserts x`, `asserts x is T`,
+ * `asserts this is T`.
+ *
+ * Returns true if we parsed the return type, false if there's still a type to be parsed.
+ */
+function tsParseTypePredicateOrAssertsPrefix() {
+ const snapshot = _base.state.snapshot();
+ if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._asserts)) {
+ // Normally this is `asserts x is T`, but at this point, it might be `asserts is T` (a user-
+ // defined type guard on the `asserts` variable) or just a type called `asserts`.
+ _index.next.call(void 0, );
+ if (_util.eatContextual.call(void 0, _keywords.ContextualKeyword._is)) {
+ // If we see `asserts is`, then this must be of the form `asserts is T`, since
+ // `asserts is is T` isn't valid.
+ tsParseType();
+ return true;
+ } else if (tsIsIdentifier() || _index.match.call(void 0, _types.TokenType._this)) {
+ _index.next.call(void 0, );
+ if (_util.eatContextual.call(void 0, _keywords.ContextualKeyword._is)) {
+ // If we see `is`, then this is `asserts x is T`. Otherwise, it's `asserts x`.
+ tsParseType();
+ }
+ return true;
+ } else {
+ // Regular type, so bail out and start type parsing from scratch.
+ _base.state.restoreFromSnapshot(snapshot);
+ return false;
+ }
+ } else if (tsIsIdentifier() || _index.match.call(void 0, _types.TokenType._this)) {
+ // This is a regular identifier, which may or may not have "is" after it.
+ _index.next.call(void 0, );
+ if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._is) && !_util.hasPrecedingLineBreak.call(void 0, )) {
+ _index.next.call(void 0, );
+ tsParseType();
+ return true;
+ } else {
+ // Regular type, so bail out and start type parsing from scratch.
+ _base.state.restoreFromSnapshot(snapshot);
+ return false;
+ }
+ }
+ return false;
+}
+
+ function tsParseTypeAnnotation() {
+ const oldIsType = _index.pushTypeContext.call(void 0, 0);
+ _util.expect.call(void 0, _types.TokenType.colon);
+ tsParseType();
+ _index.popTypeContext.call(void 0, oldIsType);
+} exports.tsParseTypeAnnotation = tsParseTypeAnnotation;
+
+ function tsParseType() {
+ tsParseNonConditionalType();
+ if (_base.state.inDisallowConditionalTypesContext || _util.hasPrecedingLineBreak.call(void 0, ) || !_index.eat.call(void 0, _types.TokenType._extends)) {
+ return;
+ }
+ // extends type
+ const oldInDisallowConditionalTypesContext = _base.state.inDisallowConditionalTypesContext;
+ _base.state.inDisallowConditionalTypesContext = true;
+ tsParseNonConditionalType();
+ _base.state.inDisallowConditionalTypesContext = oldInDisallowConditionalTypesContext;
+
+ _util.expect.call(void 0, _types.TokenType.question);
+ // true type
+ tsParseType();
+ _util.expect.call(void 0, _types.TokenType.colon);
+ // false type
+ tsParseType();
+} exports.tsParseType = tsParseType;
+
+function isAbstractConstructorSignature() {
+ return _util.isContextual.call(void 0, _keywords.ContextualKeyword._abstract) && _index.lookaheadType.call(void 0, ) === _types.TokenType._new;
+}
+
+ function tsParseNonConditionalType() {
+ if (tsIsStartOfFunctionType()) {
+ tsParseFunctionOrConstructorType(FunctionType.TSFunctionType);
+ return;
+ }
+ if (_index.match.call(void 0, _types.TokenType._new)) {
+ // As in `new () => Date`
+ tsParseFunctionOrConstructorType(FunctionType.TSConstructorType);
+ return;
+ } else if (isAbstractConstructorSignature()) {
+ // As in `abstract new () => Date`
+ tsParseFunctionOrConstructorType(FunctionType.TSAbstractConstructorType);
+ return;
+ }
+ tsParseUnionTypeOrHigher();
+} exports.tsParseNonConditionalType = tsParseNonConditionalType;
+
+ function tsParseTypeAssertion() {
+ const oldIsType = _index.pushTypeContext.call(void 0, 1);
+ tsParseType();
+ _util.expect.call(void 0, _types.TokenType.greaterThan);
+ _index.popTypeContext.call(void 0, oldIsType);
+ _expression.parseMaybeUnary.call(void 0, );
+} exports.tsParseTypeAssertion = tsParseTypeAssertion;
+
+ function tsTryParseJSXTypeArgument() {
+ if (_index.eat.call(void 0, _types.TokenType.jsxTagStart)) {
+ _base.state.tokens[_base.state.tokens.length - 1].type = _types.TokenType.typeParameterStart;
+ const oldIsType = _index.pushTypeContext.call(void 0, 1);
+ while (!_index.match.call(void 0, _types.TokenType.greaterThan) && !_base.state.error) {
+ tsParseType();
+ _index.eat.call(void 0, _types.TokenType.comma);
+ }
+ // Process >, but the one after needs to be parsed JSX-style.
+ _jsx.nextJSXTagToken.call(void 0, );
+ _index.popTypeContext.call(void 0, oldIsType);
+ }
+} exports.tsTryParseJSXTypeArgument = tsTryParseJSXTypeArgument;
+
+function tsParseHeritageClause() {
+ while (!_index.match.call(void 0, _types.TokenType.braceL) && !_base.state.error) {
+ tsParseExpressionWithTypeArguments();
+ _index.eat.call(void 0, _types.TokenType.comma);
+ }
+}
+
+function tsParseExpressionWithTypeArguments() {
+ // Note: TS uses parseLeftHandSideExpressionOrHigher,
+ // then has grammar errors later if it's not an EntityName.
+ tsParseEntityName();
+ if (_index.match.call(void 0, _types.TokenType.lessThan)) {
+ tsParseTypeArguments();
+ }
+}
+
+function tsParseInterfaceDeclaration() {
+ _lval.parseBindingIdentifier.call(void 0, false);
+ tsTryParseTypeParameters();
+ if (_index.eat.call(void 0, _types.TokenType._extends)) {
+ tsParseHeritageClause();
+ }
+ tsParseObjectTypeMembers();
+}
+
+function tsParseTypeAliasDeclaration() {
+ _lval.parseBindingIdentifier.call(void 0, false);
+ tsTryParseTypeParameters();
+ _util.expect.call(void 0, _types.TokenType.eq);
+ tsParseType();
+ _util.semicolon.call(void 0, );
+}
+
+function tsParseEnumMember() {
+ // Computed property names are grammar errors in an enum, so accept just string literal or identifier.
+ if (_index.match.call(void 0, _types.TokenType.string)) {
+ _expression.parseLiteral.call(void 0, );
+ } else {
+ _expression.parseIdentifier.call(void 0, );
+ }
+ if (_index.eat.call(void 0, _types.TokenType.eq)) {
+ const eqIndex = _base.state.tokens.length - 1;
+ _expression.parseMaybeAssign.call(void 0, );
+ _base.state.tokens[eqIndex].rhsEndIndex = _base.state.tokens.length;
+ }
+}
+
+function tsParseEnumDeclaration() {
+ _lval.parseBindingIdentifier.call(void 0, false);
+ _util.expect.call(void 0, _types.TokenType.braceL);
+ while (!_index.eat.call(void 0, _types.TokenType.braceR) && !_base.state.error) {
+ tsParseEnumMember();
+ _index.eat.call(void 0, _types.TokenType.comma);
+ }
+}
+
+function tsParseModuleBlock() {
+ _util.expect.call(void 0, _types.TokenType.braceL);
+ _statement.parseBlockBody.call(void 0, /* end */ _types.TokenType.braceR);
+}
+
+function tsParseModuleOrNamespaceDeclaration() {
+ _lval.parseBindingIdentifier.call(void 0, false);
+ if (_index.eat.call(void 0, _types.TokenType.dot)) {
+ tsParseModuleOrNamespaceDeclaration();
+ } else {
+ tsParseModuleBlock();
+ }
+}
+
+function tsParseAmbientExternalModuleDeclaration() {
+ if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._global)) {
+ _expression.parseIdentifier.call(void 0, );
+ } else if (_index.match.call(void 0, _types.TokenType.string)) {
+ _expression.parseExprAtom.call(void 0, );
+ } else {
+ _util.unexpected.call(void 0, );
+ }
+
+ if (_index.match.call(void 0, _types.TokenType.braceL)) {
+ tsParseModuleBlock();
+ } else {
+ _util.semicolon.call(void 0, );
+ }
+}
+
+ function tsParseImportEqualsDeclaration() {
+ _lval.parseImportedIdentifier.call(void 0, );
+ _util.expect.call(void 0, _types.TokenType.eq);
+ tsParseModuleReference();
+ _util.semicolon.call(void 0, );
+} exports.tsParseImportEqualsDeclaration = tsParseImportEqualsDeclaration;
+
+function tsIsExternalModuleReference() {
+ return _util.isContextual.call(void 0, _keywords.ContextualKeyword._require) && _index.lookaheadType.call(void 0, ) === _types.TokenType.parenL;
+}
+
+function tsParseModuleReference() {
+ if (tsIsExternalModuleReference()) {
+ tsParseExternalModuleReference();
+ } else {
+ tsParseEntityName();
+ }
+}
+
+function tsParseExternalModuleReference() {
+ _util.expectContextual.call(void 0, _keywords.ContextualKeyword._require);
+ _util.expect.call(void 0, _types.TokenType.parenL);
+ if (!_index.match.call(void 0, _types.TokenType.string)) {
+ _util.unexpected.call(void 0, );
+ }
+ _expression.parseLiteral.call(void 0, );
+ _util.expect.call(void 0, _types.TokenType.parenR);
+}
+
+// Utilities
+
+// Returns true if a statement matched.
+function tsTryParseDeclare() {
+ if (_util.isLineTerminator.call(void 0, )) {
+ return false;
+ }
+ switch (_base.state.type) {
+ case _types.TokenType._function: {
+ const oldIsType = _index.pushTypeContext.call(void 0, 1);
+ _index.next.call(void 0, );
+ // We don't need to precisely get the function start here, since it's only used to mark
+ // the function as a type if it's bodiless, and it's already a type here.
+ const functionStart = _base.state.start;
+ _statement.parseFunction.call(void 0, functionStart, /* isStatement */ true);
+ _index.popTypeContext.call(void 0, oldIsType);
+ return true;
+ }
+ case _types.TokenType._class: {
+ const oldIsType = _index.pushTypeContext.call(void 0, 1);
+ _statement.parseClass.call(void 0, /* isStatement */ true, /* optionalId */ false);
+ _index.popTypeContext.call(void 0, oldIsType);
+ return true;
+ }
+ case _types.TokenType._const: {
+ if (_index.match.call(void 0, _types.TokenType._const) && _util.isLookaheadContextual.call(void 0, _keywords.ContextualKeyword._enum)) {
+ const oldIsType = _index.pushTypeContext.call(void 0, 1);
+ // `const enum = 0;` not allowed because "enum" is a strict mode reserved word.
+ _util.expect.call(void 0, _types.TokenType._const);
+ _util.expectContextual.call(void 0, _keywords.ContextualKeyword._enum);
+ _base.state.tokens[_base.state.tokens.length - 1].type = _types.TokenType._enum;
+ tsParseEnumDeclaration();
+ _index.popTypeContext.call(void 0, oldIsType);
+ return true;
+ }
+ }
+ // falls through
+ case _types.TokenType._var:
+ case _types.TokenType._let: {
+ const oldIsType = _index.pushTypeContext.call(void 0, 1);
+ _statement.parseVarStatement.call(void 0, _base.state.type !== _types.TokenType._var);
+ _index.popTypeContext.call(void 0, oldIsType);
+ return true;
+ }
+ case _types.TokenType.name: {
+ const oldIsType = _index.pushTypeContext.call(void 0, 1);
+ const contextualKeyword = _base.state.contextualKeyword;
+ let matched = false;
+ if (contextualKeyword === _keywords.ContextualKeyword._global) {
+ tsParseAmbientExternalModuleDeclaration();
+ matched = true;
+ } else {
+ matched = tsParseDeclaration(contextualKeyword, /* isBeforeToken */ true);
+ }
+ _index.popTypeContext.call(void 0, oldIsType);
+ return matched;
+ }
+ default:
+ return false;
+ }
+}
+
+// Note: this won't be called unless the keyword is allowed in `shouldParseExportDeclaration`.
+// Returns true if it matched a declaration.
+function tsTryParseExportDeclaration() {
+ return tsParseDeclaration(_base.state.contextualKeyword, /* isBeforeToken */ true);
+}
+
+// Returns true if it matched a statement.
+function tsParseExpressionStatement(contextualKeyword) {
+ switch (contextualKeyword) {
+ case _keywords.ContextualKeyword._declare: {
+ const declareTokenIndex = _base.state.tokens.length - 1;
+ const matched = tsTryParseDeclare();
+ if (matched) {
+ _base.state.tokens[declareTokenIndex].type = _types.TokenType._declare;
+ return true;
+ }
+ break;
+ }
+ case _keywords.ContextualKeyword._global:
+ // `global { }` (with no `declare`) may appear inside an ambient module declaration.
+ // Would like to use tsParseAmbientExternalModuleDeclaration here, but already ran past "global".
+ if (_index.match.call(void 0, _types.TokenType.braceL)) {
+ tsParseModuleBlock();
+ return true;
+ }
+ break;
+
+ default:
+ return tsParseDeclaration(contextualKeyword, /* isBeforeToken */ false);
+ }
+ return false;
+}
+
+/**
+ * Common code for parsing a declaration.
+ *
+ * isBeforeToken indicates that the current parser state is at the contextual
+ * keyword (and that it is not yet emitted) rather than reading the token after
+ * it. When isBeforeToken is true, we may be preceded by an `export` token and
+ * should include that token in a type context we create, e.g. to handle
+ * `export interface` or `export type`. (This is a bit of a hack and should be
+ * cleaned up at some point.)
+ *
+ * Returns true if it matched a declaration.
+ */
+function tsParseDeclaration(contextualKeyword, isBeforeToken) {
+ switch (contextualKeyword) {
+ case _keywords.ContextualKeyword._abstract:
+ if (tsCheckLineTerminator(isBeforeToken) && _index.match.call(void 0, _types.TokenType._class)) {
+ _base.state.tokens[_base.state.tokens.length - 1].type = _types.TokenType._abstract;
+ _statement.parseClass.call(void 0, /* isStatement */ true, /* optionalId */ false);
+ return true;
+ }
+ break;
+
+ case _keywords.ContextualKeyword._enum:
+ if (tsCheckLineTerminator(isBeforeToken) && _index.match.call(void 0, _types.TokenType.name)) {
+ _base.state.tokens[_base.state.tokens.length - 1].type = _types.TokenType._enum;
+ tsParseEnumDeclaration();
+ return true;
+ }
+ break;
+
+ case _keywords.ContextualKeyword._interface:
+ if (tsCheckLineTerminator(isBeforeToken) && _index.match.call(void 0, _types.TokenType.name)) {
+ // `next` is true in "export" and "declare" contexts, so we want to remove that token
+ // as well.
+ const oldIsType = _index.pushTypeContext.call(void 0, isBeforeToken ? 2 : 1);
+ tsParseInterfaceDeclaration();
+ _index.popTypeContext.call(void 0, oldIsType);
+ return true;
+ }
+ break;
+
+ case _keywords.ContextualKeyword._module:
+ if (tsCheckLineTerminator(isBeforeToken)) {
+ if (_index.match.call(void 0, _types.TokenType.string)) {
+ const oldIsType = _index.pushTypeContext.call(void 0, isBeforeToken ? 2 : 1);
+ tsParseAmbientExternalModuleDeclaration();
+ _index.popTypeContext.call(void 0, oldIsType);
+ return true;
+ } else if (_index.match.call(void 0, _types.TokenType.name)) {
+ const oldIsType = _index.pushTypeContext.call(void 0, isBeforeToken ? 2 : 1);
+ tsParseModuleOrNamespaceDeclaration();
+ _index.popTypeContext.call(void 0, oldIsType);
+ return true;
+ }
+ }
+ break;
+
+ case _keywords.ContextualKeyword._namespace:
+ if (tsCheckLineTerminator(isBeforeToken) && _index.match.call(void 0, _types.TokenType.name)) {
+ const oldIsType = _index.pushTypeContext.call(void 0, isBeforeToken ? 2 : 1);
+ tsParseModuleOrNamespaceDeclaration();
+ _index.popTypeContext.call(void 0, oldIsType);
+ return true;
+ }
+ break;
+
+ case _keywords.ContextualKeyword._type:
+ if (tsCheckLineTerminator(isBeforeToken) && _index.match.call(void 0, _types.TokenType.name)) {
+ const oldIsType = _index.pushTypeContext.call(void 0, isBeforeToken ? 2 : 1);
+ tsParseTypeAliasDeclaration();
+ _index.popTypeContext.call(void 0, oldIsType);
+ return true;
+ }
+ break;
+
+ default:
+ break;
+ }
+ return false;
+}
+
+function tsCheckLineTerminator(isBeforeToken) {
+ if (isBeforeToken) {
+ // Babel checks hasFollowingLineBreak here and returns false, but this
+ // doesn't actually come up, e.g. `export interface` can never be on its own
+ // line in valid code.
+ _index.next.call(void 0, );
+ return true;
+ } else {
+ return !_util.isLineTerminator.call(void 0, );
+ }
+}
+
+// Returns true if there was a generic async arrow function.
+function tsTryParseGenericAsyncArrowFunction() {
+ const snapshot = _base.state.snapshot();
+
+ tsParseTypeParameters();
+ _statement.parseFunctionParams.call(void 0, );
+ tsTryParseTypeOrTypePredicateAnnotation();
+ _util.expect.call(void 0, _types.TokenType.arrow);
+
+ if (_base.state.error) {
+ _base.state.restoreFromSnapshot(snapshot);
+ return false;
+ }
+
+ _expression.parseFunctionBody.call(void 0, true);
+ return true;
+}
+
+/**
+ * If necessary, hack the tokenizer state so that this bitshift was actually a
+ * less-than token, then keep parsing. This should only be used in situations
+ * where we restore from snapshot on error (which reverts this change) or
+ * where bitshift would be illegal anyway (e.g. in a class "extends" clause).
+ *
+ * This hack is useful to handle situations like foo<<T>() => void>() where
+ * there can legitimately be two open-angle-brackets in a row in TS.
+ */
+function tsParseTypeArgumentsWithPossibleBitshift() {
+ if (_base.state.type === _types.TokenType.bitShiftL) {
+ _base.state.pos -= 1;
+ _index.finishToken.call(void 0, _types.TokenType.lessThan);
+ }
+ tsParseTypeArguments();
+}
+
+function tsParseTypeArguments() {
+ const oldIsType = _index.pushTypeContext.call(void 0, 0);
+ _util.expect.call(void 0, _types.TokenType.lessThan);
+ while (!_index.match.call(void 0, _types.TokenType.greaterThan) && !_base.state.error) {
+ tsParseType();
+ _index.eat.call(void 0, _types.TokenType.comma);
+ }
+ if (!oldIsType) {
+ // If the type arguments are present in an expression context, e.g.
+ // f<number>(), then the > sign should be tokenized as a non-type token.
+ // In particular, f(a < b, c >= d) should parse the >= as a single token,
+ // resulting in a syntax error and fallback to the non-type-args
+ // interpretation. In the success case, even though the > is tokenized as a
+ // non-type token, it still must be marked as a type token so that it is
+ // erased.
+ _index.popTypeContext.call(void 0, oldIsType);
+ _index.rescan_gt.call(void 0, );
+ _util.expect.call(void 0, _types.TokenType.greaterThan);
+ _base.state.tokens[_base.state.tokens.length - 1].isType = true;
+ } else {
+ _util.expect.call(void 0, _types.TokenType.greaterThan);
+ _index.popTypeContext.call(void 0, oldIsType);
+ }
+}
+
+ function tsIsDeclarationStart() {
+ if (_index.match.call(void 0, _types.TokenType.name)) {
+ switch (_base.state.contextualKeyword) {
+ case _keywords.ContextualKeyword._abstract:
+ case _keywords.ContextualKeyword._declare:
+ case _keywords.ContextualKeyword._enum:
+ case _keywords.ContextualKeyword._interface:
+ case _keywords.ContextualKeyword._module:
+ case _keywords.ContextualKeyword._namespace:
+ case _keywords.ContextualKeyword._type:
+ return true;
+ default:
+ break;
+ }
+ }
+
+ return false;
+} exports.tsIsDeclarationStart = tsIsDeclarationStart;
+
+// ======================================================
+// OVERRIDES
+// ======================================================
+
+ function tsParseFunctionBodyAndFinish(functionStart, funcContextId) {
+ // For arrow functions, `parseArrow` handles the return type itself.
+ if (_index.match.call(void 0, _types.TokenType.colon)) {
+ tsParseTypeOrTypePredicateAnnotation(_types.TokenType.colon);
+ }
+
+ // The original code checked the node type to make sure this function type allows a missing
+ // body, but we skip that to avoid sending around the node type. We instead just use the
+ // allowExpressionBody boolean to make sure it's not an arrow function.
+ if (!_index.match.call(void 0, _types.TokenType.braceL) && _util.isLineTerminator.call(void 0, )) {
+ // Retroactively mark the function declaration as a type.
+ let i = _base.state.tokens.length - 1;
+ while (
+ i >= 0 &&
+ (_base.state.tokens[i].start >= functionStart ||
+ _base.state.tokens[i].type === _types.TokenType._default ||
+ _base.state.tokens[i].type === _types.TokenType._export)
+ ) {
+ _base.state.tokens[i].isType = true;
+ i--;
+ }
+ return;
+ }
+
+ _expression.parseFunctionBody.call(void 0, false, funcContextId);
+} exports.tsParseFunctionBodyAndFinish = tsParseFunctionBodyAndFinish;
+
+ function tsParseSubscript(
+ startTokenIndex,
+ noCalls,
+ stopState,
+) {
+ if (!_util.hasPrecedingLineBreak.call(void 0, ) && _index.eat.call(void 0, _types.TokenType.bang)) {
+ _base.state.tokens[_base.state.tokens.length - 1].type = _types.TokenType.nonNullAssertion;
+ return;
+ }
+
+ if (_index.match.call(void 0, _types.TokenType.lessThan) || _index.match.call(void 0, _types.TokenType.bitShiftL)) {
+ // There are number of things we are going to "maybe" parse, like type arguments on
+ // tagged template expressions. If any of them fail, walk it back and continue.
+ const snapshot = _base.state.snapshot();
+
+ if (!noCalls && _expression.atPossibleAsync.call(void 0, )) {
+ // Almost certainly this is a generic async function `async <T>() => ...
+ // But it might be a call with a type argument `async<T>();`
+ const asyncArrowFn = tsTryParseGenericAsyncArrowFunction();
+ if (asyncArrowFn) {
+ return;
+ }
+ }
+ tsParseTypeArgumentsWithPossibleBitshift();
+ if (!noCalls && _index.eat.call(void 0, _types.TokenType.parenL)) {
+ // With f<T>(), the subscriptStartIndex marker is on the ( token.
+ _base.state.tokens[_base.state.tokens.length - 1].subscriptStartIndex = startTokenIndex;
+ _expression.parseCallExpressionArguments.call(void 0, );
+ } else if (_index.match.call(void 0, _types.TokenType.backQuote)) {
+ // Tagged template with a type argument.
+ _expression.parseTemplate.call(void 0, );
+ } else if (
+ // The remaining possible case is an instantiation expression, e.g.
+ // Array<number> . Check for a few cases that would disqualify it and
+ // cause us to bail out.
+ // a<b>>c is not (a<b>)>c, but a<(b>>c)
+ _base.state.type === _types.TokenType.greaterThan ||
+ // a<b>c is (a<b)>c
+ (_base.state.type !== _types.TokenType.parenL &&
+ Boolean(_base.state.type & _types.TokenType.IS_EXPRESSION_START) &&
+ !_util.hasPrecedingLineBreak.call(void 0, ))
+ ) {
+ // Bail out. We have something like a<b>c, which is not an expression with
+ // type arguments but an (a < b) > c comparison.
+ _util.unexpected.call(void 0, );
+ }
+
+ if (_base.state.error) {
+ _base.state.restoreFromSnapshot(snapshot);
+ } else {
+ return;
+ }
+ } else if (!noCalls && _index.match.call(void 0, _types.TokenType.questionDot) && _index.lookaheadType.call(void 0, ) === _types.TokenType.lessThan) {
+ // If we see f?.<, then this must be an optional call with a type argument.
+ _index.next.call(void 0, );
+ _base.state.tokens[startTokenIndex].isOptionalChainStart = true;
+ // With f?.<T>(), the subscriptStartIndex marker is on the ?. token.
+ _base.state.tokens[_base.state.tokens.length - 1].subscriptStartIndex = startTokenIndex;
+
+ tsParseTypeArguments();
+ _util.expect.call(void 0, _types.TokenType.parenL);
+ _expression.parseCallExpressionArguments.call(void 0, );
+ }
+ _expression.baseParseSubscript.call(void 0, startTokenIndex, noCalls, stopState);
+} exports.tsParseSubscript = tsParseSubscript;
+
+ function tsTryParseExport() {
+ if (_index.eat.call(void 0, _types.TokenType._import)) {
+ // One of these cases:
+ // export import A = B;
+ // export import type A = require("A");
+ if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._type) && _index.lookaheadType.call(void 0, ) !== _types.TokenType.eq) {
+ // Eat a `type` token, unless it's actually an identifier name.
+ _util.expectContextual.call(void 0, _keywords.ContextualKeyword._type);
+ }
+ tsParseImportEqualsDeclaration();
+ return true;
+ } else if (_index.eat.call(void 0, _types.TokenType.eq)) {
+ // `export = x;`
+ _expression.parseExpression.call(void 0, );
+ _util.semicolon.call(void 0, );
+ return true;
+ } else if (_util.eatContextual.call(void 0, _keywords.ContextualKeyword._as)) {
+ // `export as namespace A;`
+ // See `parseNamespaceExportDeclaration` in TypeScript's own parser
+ _util.expectContextual.call(void 0, _keywords.ContextualKeyword._namespace);
+ _expression.parseIdentifier.call(void 0, );
+ _util.semicolon.call(void 0, );
+ return true;
+ } else {
+ if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._type)) {
+ const nextType = _index.lookaheadType.call(void 0, );
+ // export type {foo} from 'a';
+ // export type * from 'a';'
+ // export type * as ns from 'a';'
+ if (nextType === _types.TokenType.braceL || nextType === _types.TokenType.star) {
+ _index.next.call(void 0, );
+ }
+ }
+ return false;
+ }
+} exports.tsTryParseExport = tsTryParseExport;
+
+/**
+ * Parse a TS import specifier, which may be prefixed with "type" and may be of
+ * the form `foo as bar`.
+ *
+ * The number of identifier-like tokens we see happens to be enough to uniquely
+ * identify the form, so simply count the number of identifiers rather than
+ * matching the words `type` or `as`. This is particularly important because
+ * `type` and `as` could each actually be plain identifiers rather than
+ * keywords.
+ */
+ function tsParseImportSpecifier() {
+ _expression.parseIdentifier.call(void 0, );
+ if (_index.match.call(void 0, _types.TokenType.comma) || _index.match.call(void 0, _types.TokenType.braceR)) {
+ // import {foo}
+ _base.state.tokens[_base.state.tokens.length - 1].identifierRole = _index.IdentifierRole.ImportDeclaration;
+ return;
+ }
+ _expression.parseIdentifier.call(void 0, );
+ if (_index.match.call(void 0, _types.TokenType.comma) || _index.match.call(void 0, _types.TokenType.braceR)) {
+ // import {type foo}
+ _base.state.tokens[_base.state.tokens.length - 1].identifierRole = _index.IdentifierRole.ImportDeclaration;
+ _base.state.tokens[_base.state.tokens.length - 2].isType = true;
+ _base.state.tokens[_base.state.tokens.length - 1].isType = true;
+ return;
+ }
+ _expression.parseIdentifier.call(void 0, );
+ if (_index.match.call(void 0, _types.TokenType.comma) || _index.match.call(void 0, _types.TokenType.braceR)) {
+ // import {foo as bar}
+ _base.state.tokens[_base.state.tokens.length - 3].identifierRole = _index.IdentifierRole.ImportAccess;
+ _base.state.tokens[_base.state.tokens.length - 1].identifierRole = _index.IdentifierRole.ImportDeclaration;
+ return;
+ }
+ _expression.parseIdentifier.call(void 0, );
+ // import {type foo as bar}
+ _base.state.tokens[_base.state.tokens.length - 3].identifierRole = _index.IdentifierRole.ImportAccess;
+ _base.state.tokens[_base.state.tokens.length - 1].identifierRole = _index.IdentifierRole.ImportDeclaration;
+ _base.state.tokens[_base.state.tokens.length - 4].isType = true;
+ _base.state.tokens[_base.state.tokens.length - 3].isType = true;
+ _base.state.tokens[_base.state.tokens.length - 2].isType = true;
+ _base.state.tokens[_base.state.tokens.length - 1].isType = true;
+} exports.tsParseImportSpecifier = tsParseImportSpecifier;
+
+/**
+ * Just like named import specifiers, export specifiers can have from 1 to 4
+ * tokens, inclusive, and the number of tokens determines the role of each token.
+ */
+ function tsParseExportSpecifier() {
+ _expression.parseIdentifier.call(void 0, );
+ if (_index.match.call(void 0, _types.TokenType.comma) || _index.match.call(void 0, _types.TokenType.braceR)) {
+ // export {foo}
+ _base.state.tokens[_base.state.tokens.length - 1].identifierRole = _index.IdentifierRole.ExportAccess;
+ return;
+ }
+ _expression.parseIdentifier.call(void 0, );
+ if (_index.match.call(void 0, _types.TokenType.comma) || _index.match.call(void 0, _types.TokenType.braceR)) {
+ // export {type foo}
+ _base.state.tokens[_base.state.tokens.length - 1].identifierRole = _index.IdentifierRole.ExportAccess;
+ _base.state.tokens[_base.state.tokens.length - 2].isType = true;
+ _base.state.tokens[_base.state.tokens.length - 1].isType = true;
+ return;
+ }
+ _expression.parseIdentifier.call(void 0, );
+ if (_index.match.call(void 0, _types.TokenType.comma) || _index.match.call(void 0, _types.TokenType.braceR)) {
+ // export {foo as bar}
+ _base.state.tokens[_base.state.tokens.length - 3].identifierRole = _index.IdentifierRole.ExportAccess;
+ return;
+ }
+ _expression.parseIdentifier.call(void 0, );
+ // export {type foo as bar}
+ _base.state.tokens[_base.state.tokens.length - 3].identifierRole = _index.IdentifierRole.ExportAccess;
+ _base.state.tokens[_base.state.tokens.length - 4].isType = true;
+ _base.state.tokens[_base.state.tokens.length - 3].isType = true;
+ _base.state.tokens[_base.state.tokens.length - 2].isType = true;
+ _base.state.tokens[_base.state.tokens.length - 1].isType = true;
+} exports.tsParseExportSpecifier = tsParseExportSpecifier;
+
+ function tsTryParseExportDefaultExpression() {
+ if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._abstract) && _index.lookaheadType.call(void 0, ) === _types.TokenType._class) {
+ _base.state.type = _types.TokenType._abstract;
+ _index.next.call(void 0, ); // Skip "abstract"
+ _statement.parseClass.call(void 0, true, true);
+ return true;
+ }
+ if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._interface)) {
+ // Make sure "export default" are considered type tokens so the whole thing is removed.
+ const oldIsType = _index.pushTypeContext.call(void 0, 2);
+ tsParseDeclaration(_keywords.ContextualKeyword._interface, true);
+ _index.popTypeContext.call(void 0, oldIsType);
+ return true;
+ }
+ return false;
+} exports.tsTryParseExportDefaultExpression = tsTryParseExportDefaultExpression;
+
+ function tsTryParseStatementContent() {
+ if (_base.state.type === _types.TokenType._const) {
+ const ahead = _index.lookaheadTypeAndKeyword.call(void 0, );
+ if (ahead.type === _types.TokenType.name && ahead.contextualKeyword === _keywords.ContextualKeyword._enum) {
+ _util.expect.call(void 0, _types.TokenType._const);
+ _util.expectContextual.call(void 0, _keywords.ContextualKeyword._enum);
+ _base.state.tokens[_base.state.tokens.length - 1].type = _types.TokenType._enum;
+ tsParseEnumDeclaration();
+ return true;
+ }
+ }
+ return false;
+} exports.tsTryParseStatementContent = tsTryParseStatementContent;
+
+ function tsTryParseClassMemberWithIsStatic(isStatic) {
+ const memberStartIndexAfterStatic = _base.state.tokens.length;
+ tsParseModifiers([
+ _keywords.ContextualKeyword._abstract,
+ _keywords.ContextualKeyword._readonly,
+ _keywords.ContextualKeyword._declare,
+ _keywords.ContextualKeyword._static,
+ _keywords.ContextualKeyword._override,
+ ]);
+
+ const modifiersEndIndex = _base.state.tokens.length;
+ const found = tsTryParseIndexSignature();
+ if (found) {
+ // Index signatures are type declarations, so set the modifier tokens as
+ // type tokens. Most tokens could be assumed to be type tokens, but `static`
+ // is ambiguous unless we set it explicitly here.
+ const memberStartIndex = isStatic
+ ? memberStartIndexAfterStatic - 1
+ : memberStartIndexAfterStatic;
+ for (let i = memberStartIndex; i < modifiersEndIndex; i++) {
+ _base.state.tokens[i].isType = true;
+ }
+ return true;
+ }
+ return false;
+} exports.tsTryParseClassMemberWithIsStatic = tsTryParseClassMemberWithIsStatic;
+
+// Note: The reason we do this in `parseIdentifierStatement` and not `parseStatement`
+// is that e.g. `type()` is valid JS, so we must try parsing that first.
+// If it's really a type, we will parse `type` as the statement, and can correct it here
+// by parsing the rest.
+ function tsParseIdentifierStatement(contextualKeyword) {
+ const matched = tsParseExpressionStatement(contextualKeyword);
+ if (!matched) {
+ _util.semicolon.call(void 0, );
+ }
+} exports.tsParseIdentifierStatement = tsParseIdentifierStatement;
+
+ function tsParseExportDeclaration() {
+ // "export declare" is equivalent to just "export".
+ const isDeclare = _util.eatContextual.call(void 0, _keywords.ContextualKeyword._declare);
+ if (isDeclare) {
+ _base.state.tokens[_base.state.tokens.length - 1].type = _types.TokenType._declare;
+ }
+
+ let matchedDeclaration = false;
+ if (_index.match.call(void 0, _types.TokenType.name)) {
+ if (isDeclare) {
+ const oldIsType = _index.pushTypeContext.call(void 0, 2);
+ matchedDeclaration = tsTryParseExportDeclaration();
+ _index.popTypeContext.call(void 0, oldIsType);
+ } else {
+ matchedDeclaration = tsTryParseExportDeclaration();
+ }
+ }
+ if (!matchedDeclaration) {
+ if (isDeclare) {
+ const oldIsType = _index.pushTypeContext.call(void 0, 2);
+ _statement.parseStatement.call(void 0, true);
+ _index.popTypeContext.call(void 0, oldIsType);
+ } else {
+ _statement.parseStatement.call(void 0, true);
+ }
+ }
+} exports.tsParseExportDeclaration = tsParseExportDeclaration;
+
+ function tsAfterParseClassSuper(hasSuper) {
+ if (hasSuper && (_index.match.call(void 0, _types.TokenType.lessThan) || _index.match.call(void 0, _types.TokenType.bitShiftL))) {
+ tsParseTypeArgumentsWithPossibleBitshift();
+ }
+ if (_util.eatContextual.call(void 0, _keywords.ContextualKeyword._implements)) {
+ _base.state.tokens[_base.state.tokens.length - 1].type = _types.TokenType._implements;
+ const oldIsType = _index.pushTypeContext.call(void 0, 1);
+ tsParseHeritageClause();
+ _index.popTypeContext.call(void 0, oldIsType);
+ }
+} exports.tsAfterParseClassSuper = tsAfterParseClassSuper;
+
+ function tsStartParseObjPropValue() {
+ tsTryParseTypeParameters();
+} exports.tsStartParseObjPropValue = tsStartParseObjPropValue;
+
+ function tsStartParseFunctionParams() {
+ tsTryParseTypeParameters();
+} exports.tsStartParseFunctionParams = tsStartParseFunctionParams;
+
+// `let x: number;`
+ function tsAfterParseVarHead() {
+ const oldIsType = _index.pushTypeContext.call(void 0, 0);
+ if (!_util.hasPrecedingLineBreak.call(void 0, )) {
+ _index.eat.call(void 0, _types.TokenType.bang);
+ }
+ tsTryParseTypeAnnotation();
+ _index.popTypeContext.call(void 0, oldIsType);
+} exports.tsAfterParseVarHead = tsAfterParseVarHead;
+
+// parse the return type of an async arrow function - let foo = (async (): number => {});
+ function tsStartParseAsyncArrowFromCallExpression() {
+ if (_index.match.call(void 0, _types.TokenType.colon)) {
+ tsParseTypeAnnotation();
+ }
+} exports.tsStartParseAsyncArrowFromCallExpression = tsStartParseAsyncArrowFromCallExpression;
+
+// Returns true if the expression was an arrow function.
+ function tsParseMaybeAssign(noIn, isWithinParens) {
+ // Note: When the JSX plugin is on, type assertions (`<T> x`) aren't valid syntax.
+ if (_base.isJSXEnabled) {
+ return tsParseMaybeAssignWithJSX(noIn, isWithinParens);
+ } else {
+ return tsParseMaybeAssignWithoutJSX(noIn, isWithinParens);
+ }
+} exports.tsParseMaybeAssign = tsParseMaybeAssign;
+
+ function tsParseMaybeAssignWithJSX(noIn, isWithinParens) {
+ if (!_index.match.call(void 0, _types.TokenType.lessThan)) {
+ return _expression.baseParseMaybeAssign.call(void 0, noIn, isWithinParens);
+ }
+
+ // Prefer to parse JSX if possible. But may be an arrow fn.
+ const snapshot = _base.state.snapshot();
+ let wasArrow = _expression.baseParseMaybeAssign.call(void 0, noIn, isWithinParens);
+ if (_base.state.error) {
+ _base.state.restoreFromSnapshot(snapshot);
+ } else {
+ return wasArrow;
+ }
+
+ // Otherwise, try as type-parameterized arrow function.
+ _base.state.type = _types.TokenType.typeParameterStart;
+ // This is similar to TypeScript's `tryParseParenthesizedArrowFunctionExpression`.
+ tsParseTypeParameters();
+ wasArrow = _expression.baseParseMaybeAssign.call(void 0, noIn, isWithinParens);
+ if (!wasArrow) {
+ _util.unexpected.call(void 0, );
+ }
+
+ return wasArrow;
+} exports.tsParseMaybeAssignWithJSX = tsParseMaybeAssignWithJSX;
+
+ function tsParseMaybeAssignWithoutJSX(noIn, isWithinParens) {
+ if (!_index.match.call(void 0, _types.TokenType.lessThan)) {
+ return _expression.baseParseMaybeAssign.call(void 0, noIn, isWithinParens);
+ }
+
+ const snapshot = _base.state.snapshot();
+ // This is similar to TypeScript's `tryParseParenthesizedArrowFunctionExpression`.
+ tsParseTypeParameters();
+ const wasArrow = _expression.baseParseMaybeAssign.call(void 0, noIn, isWithinParens);
+ if (!wasArrow) {
+ _util.unexpected.call(void 0, );
+ }
+ if (_base.state.error) {
+ _base.state.restoreFromSnapshot(snapshot);
+ } else {
+ return wasArrow;
+ }
+
+ // Try parsing a type cast instead of an arrow function.
+ // This will start with a type assertion (via parseMaybeUnary).
+ // But don't directly call `tsParseTypeAssertion` because we want to handle any binary after it.
+ return _expression.baseParseMaybeAssign.call(void 0, noIn, isWithinParens);
+} exports.tsParseMaybeAssignWithoutJSX = tsParseMaybeAssignWithoutJSX;
+
+ function tsParseArrow() {
+ if (_index.match.call(void 0, _types.TokenType.colon)) {
+ // This is different from how the TS parser does it.
+ // TS uses lookahead. Babylon parses it as a parenthesized expression and converts.
+ const snapshot = _base.state.snapshot();
+
+ tsParseTypeOrTypePredicateAnnotation(_types.TokenType.colon);
+ if (_util.canInsertSemicolon.call(void 0, )) _util.unexpected.call(void 0, );
+ if (!_index.match.call(void 0, _types.TokenType.arrow)) _util.unexpected.call(void 0, );
+
+ if (_base.state.error) {
+ _base.state.restoreFromSnapshot(snapshot);
+ }
+ }
+ return _index.eat.call(void 0, _types.TokenType.arrow);
+} exports.tsParseArrow = tsParseArrow;
+
+// Allow type annotations inside of a parameter list.
+ function tsParseAssignableListItemTypes() {
+ const oldIsType = _index.pushTypeContext.call(void 0, 0);
+ _index.eat.call(void 0, _types.TokenType.question);
+ tsTryParseTypeAnnotation();
+ _index.popTypeContext.call(void 0, oldIsType);
+} exports.tsParseAssignableListItemTypes = tsParseAssignableListItemTypes;
+
+ function tsParseMaybeDecoratorArguments() {
+ if (_index.match.call(void 0, _types.TokenType.lessThan) || _index.match.call(void 0, _types.TokenType.bitShiftL)) {
+ tsParseTypeArgumentsWithPossibleBitshift();
+ }
+ _statement.baseParseMaybeDecoratorArguments.call(void 0, );
+} exports.tsParseMaybeDecoratorArguments = tsParseMaybeDecoratorArguments;