{
  "Node": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "reference",
        "name": "string"
      },
      "loc": {
        "kind": "union",
        "types": [
          {
            "kind": "reference",
            "name": "SourceLocation"
          },
          {
            "kind": "literal",
            "value": null
          }
        ]
      }
    },
    "base": []
  },
  "SourceLocation": {
    "kind": "interface",
    "props": {
      "source": {
        "kind": "union",
        "types": [
          {
            "kind": "reference",
            "name": "string"
          },
          {
            "kind": "literal",
            "value": null
          }
        ]
      },
      "start": {
        "kind": "reference",
        "name": "Position"
      },
      "end": {
        "kind": "reference",
        "name": "Position"
      }
    },
    "base": []
  },
  "Position": {
    "kind": "interface",
    "props": {
      "line": {
        "kind": "reference",
        "name": "number"
      },
      "column": {
        "kind": "reference",
        "name": "number"
      }
    },
    "base": []
  },
  "Identifier": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "Identifier"
      },
      "name": {
        "kind": "reference",
        "name": "string"
      }
    },
    "base": [
      "Expression",
      "Pattern"
    ]
  },
  "Literal": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "Literal"
      },
      "value": {
        "kind": "union",
        "types": [
          {
            "kind": "reference",
            "name": "string"
          },
          {
            "kind": "reference",
            "name": "boolean"
          },
          {
            "kind": "literal",
            "value": null
          },
          {
            "kind": "reference",
            "name": "number"
          },
          {
            "kind": "reference",
            "name": "RegExp"
          }
        ]
      }
    },
    "base": [
      "Expression"
    ]
  },
  "RegExpLiteral": {
    "kind": "interface",
    "props": {
      "regex": {
        "kind": "object",
        "items": {
          "pattern": {
            "kind": "reference",
            "name": "string"
          },
          "flags": {
            "kind": "reference",
            "name": "string"
          }
        }
      }
    },
    "base": [
      "Literal"
    ]
  },
  "Program": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "Program"
      },
      "body": {
        "kind": "array",
        "base": {
          "kind": "union",
          "types": [
            {
              "kind": "reference",
              "name": "Directive"
            },
            {
              "kind": "reference",
              "name": "Statement"
            }
          ]
        }
      }
    },
    "base": [
      "Node"
    ]
  },
  "Function": {
    "kind": "interface",
    "props": {
      "id": {
        "kind": "union",
        "types": [
          {
            "kind": "reference",
            "name": "Identifier"
          },
          {
            "kind": "literal",
            "value": null
          }
        ]
      },
      "params": {
        "kind": "array",
        "base": {
          "kind": "reference",
          "name": "Pattern"
        }
      },
      "body": {
        "kind": "reference",
        "name": "FunctionBody"
      }
    },
    "base": [
      "Node"
    ]
  },
  "Statement": {
    "kind": "interface",
    "props": {},
    "base": [
      "Node"
    ]
  },
  "ExpressionStatement": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "ExpressionStatement"
      },
      "expression": {
        "kind": "reference",
        "name": "Expression"
      }
    },
    "base": [
      "Statement"
    ]
  },
  "Directive": {
    "kind": "interface",
    "props": {
      "expression": {
        "kind": "reference",
        "name": "Literal"
      },
      "directive": {
        "kind": "reference",
        "name": "string"
      }
    },
    "base": [
      "ExpressionStatement"
    ]
  },
  "BlockStatement": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "BlockStatement"
      },
      "body": {
        "kind": "array",
        "base": {
          "kind": "reference",
          "name": "Statement"
        }
      }
    },
    "base": [
      "Statement"
    ]
  },
  "FunctionBody": {
    "kind": "interface",
    "props": {
      "body": {
        "kind": "array",
        "base": {
          "kind": "union",
          "types": [
            {
              "kind": "reference",
              "name": "Directive"
            },
            {
              "kind": "reference",
              "name": "Statement"
            }
          ]
        }
      }
    },
    "base": [
      "BlockStatement"
    ]
  },
  "EmptyStatement": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "EmptyStatement"
      }
    },
    "base": [
      "Statement"
    ]
  },
  "DebuggerStatement": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "DebuggerStatement"
      }
    },
    "base": [
      "Statement"
    ]
  },
  "WithStatement": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "WithStatement"
      },
      "object": {
        "kind": "reference",
        "name": "Expression"
      },
      "body": {
        "kind": "reference",
        "name": "Statement"
      }
    },
    "base": [
      "Statement"
    ]
  },
  "ReturnStatement": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "ReturnStatement"
      },
      "argument": {
        "kind": "union",
        "types": [
          {
            "kind": "reference",
            "name": "Expression"
          },
          {
            "kind": "literal",
            "value": null
          }
        ]
      }
    },
    "base": [
      "Statement"
    ]
  },
  "LabeledStatement": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "LabeledStatement"
      },
      "label": {
        "kind": "reference",
        "name": "Identifier"
      },
      "body": {
        "kind": "reference",
        "name": "Statement"
      }
    },
    "base": [
      "Statement"
    ]
  },
  "BreakStatement": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "BreakStatement"
      },
      "label": {
        "kind": "union",
        "types": [
          {
            "kind": "reference",
            "name": "Identifier"
          },
          {
            "kind": "literal",
            "value": null
          }
        ]
      }
    },
    "base": [
      "Statement"
    ]
  },
  "ContinueStatement": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "ContinueStatement"
      },
      "label": {
        "kind": "union",
        "types": [
          {
            "kind": "reference",
            "name": "Identifier"
          },
          {
            "kind": "literal",
            "value": null
          }
        ]
      }
    },
    "base": [
      "Statement"
    ]
  },
  "IfStatement": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "IfStatement"
      },
      "test": {
        "kind": "reference",
        "name": "Expression"
      },
      "consequent": {
        "kind": "reference",
        "name": "Statement"
      },
      "alternate": {
        "kind": "union",
        "types": [
          {
            "kind": "reference",
            "name": "Statement"
          },
          {
            "kind": "literal",
            "value": null
          }
        ]
      }
    },
    "base": [
      "Statement"
    ]
  },
  "SwitchStatement": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "SwitchStatement"
      },
      "discriminant": {
        "kind": "reference",
        "name": "Expression"
      },
      "cases": {
        "kind": "array",
        "base": {
          "kind": "reference",
          "name": "SwitchCase"
        }
      }
    },
    "base": [
      "Statement"
    ]
  },
  "SwitchCase": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "SwitchCase"
      },
      "test": {
        "kind": "union",
        "types": [
          {
            "kind": "reference",
            "name": "Expression"
          },
          {
            "kind": "literal",
            "value": null
          }
        ]
      },
      "consequent": {
        "kind": "array",
        "base": {
          "kind": "reference",
          "name": "Statement"
        }
      }
    },
    "base": [
      "Node"
    ]
  },
  "ThrowStatement": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "ThrowStatement"
      },
      "argument": {
        "kind": "reference",
        "name": "Expression"
      }
    },
    "base": [
      "Statement"
    ]
  },
  "TryStatement": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "TryStatement"
      },
      "block": {
        "kind": "reference",
        "name": "BlockStatement"
      },
      "handler": {
        "kind": "union",
        "types": [
          {
            "kind": "reference",
            "name": "CatchClause"
          },
          {
            "kind": "literal",
            "value": null
          }
        ]
      },
      "finalizer": {
        "kind": "union",
        "types": [
          {
            "kind": "reference",
            "name": "BlockStatement"
          },
          {
            "kind": "literal",
            "value": null
          }
        ]
      }
    },
    "base": [
      "Statement"
    ]
  },
  "CatchClause": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "CatchClause"
      },
      "param": {
        "kind": "reference",
        "name": "Pattern"
      },
      "body": {
        "kind": "reference",
        "name": "BlockStatement"
      }
    },
    "base": [
      "Node"
    ]
  },
  "WhileStatement": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "WhileStatement"
      },
      "test": {
        "kind": "reference",
        "name": "Expression"
      },
      "body": {
        "kind": "reference",
        "name": "Statement"
      }
    },
    "base": [
      "Statement"
    ]
  },
  "DoWhileStatement": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "DoWhileStatement"
      },
      "body": {
        "kind": "reference",
        "name": "Statement"
      },
      "test": {
        "kind": "reference",
        "name": "Expression"
      }
    },
    "base": [
      "Statement"
    ]
  },
  "ForStatement": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "ForStatement"
      },
      "init": {
        "kind": "union",
        "types": [
          {
            "kind": "reference",
            "name": "VariableDeclaration"
          },
          {
            "kind": "reference",
            "name": "Expression"
          },
          {
            "kind": "literal",
            "value": null
          }
        ]
      },
      "test": {
        "kind": "union",
        "types": [
          {
            "kind": "reference",
            "name": "Expression"
          },
          {
            "kind": "literal",
            "value": null
          }
        ]
      },
      "update": {
        "kind": "union",
        "types": [
          {
            "kind": "reference",
            "name": "Expression"
          },
          {
            "kind": "literal",
            "value": null
          }
        ]
      },
      "body": {
        "kind": "reference",
        "name": "Statement"
      }
    },
    "base": [
      "Statement"
    ]
  },
  "ForInStatement": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "ForInStatement"
      },
      "left": {
        "kind": "union",
        "types": [
          {
            "kind": "reference",
            "name": "VariableDeclaration"
          },
          {
            "kind": "reference",
            "name": "Pattern"
          }
        ]
      },
      "right": {
        "kind": "reference",
        "name": "Expression"
      },
      "body": {
        "kind": "reference",
        "name": "Statement"
      }
    },
    "base": [
      "Statement"
    ]
  },
  "Declaration": {
    "kind": "interface",
    "props": {},
    "base": [
      "Statement"
    ]
  },
  "FunctionDeclaration": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "FunctionDeclaration"
      },
      "id": {
        "kind": "reference",
        "name": "Identifier"
      }
    },
    "base": [
      "Function",
      "Declaration"
    ]
  },
  "VariableDeclaration": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "VariableDeclaration"
      },
      "declarations": {
        "kind": "array",
        "base": {
          "kind": "reference",
          "name": "VariableDeclarator"
        }
      },
      "kind": {
        "kind": "literal",
        "value": "var"
      }
    },
    "base": [
      "Declaration"
    ]
  },
  "VariableDeclarator": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "VariableDeclarator"
      },
      "id": {
        "kind": "reference",
        "name": "Pattern"
      },
      "init": {
        "kind": "union",
        "types": [
          {
            "kind": "reference",
            "name": "Expression"
          },
          {
            "kind": "literal",
            "value": null
          }
        ]
      }
    },
    "base": [
      "Node"
    ]
  },
  "Expression": {
    "kind": "interface",
    "props": {},
    "base": [
      "Node"
    ]
  },
  "ThisExpression": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "ThisExpression"
      }
    },
    "base": [
      "Expression"
    ]
  },
  "ArrayExpression": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "ArrayExpression"
      },
      "elements": {
        "kind": "array",
        "base": {
          "kind": "union",
          "types": [
            {
              "kind": "reference",
              "name": "Expression"
            },
            {
              "kind": "literal",
              "value": null
            }
          ]
        }
      }
    },
    "base": [
      "Expression"
    ]
  },
  "ObjectExpression": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "ObjectExpression"
      },
      "properties": {
        "kind": "array",
        "base": {
          "kind": "reference",
          "name": "Property"
        }
      }
    },
    "base": [
      "Expression"
    ]
  },
  "Property": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "Property"
      },
      "key": {
        "kind": "union",
        "types": [
          {
            "kind": "reference",
            "name": "Literal"
          },
          {
            "kind": "reference",
            "name": "Identifier"
          }
        ]
      },
      "value": {
        "kind": "reference",
        "name": "Expression"
      },
      "kind": {
        "kind": "union",
        "types": [
          {
            "kind": "literal",
            "value": "init"
          },
          {
            "kind": "literal",
            "value": "get"
          },
          {
            "kind": "literal",
            "value": "set"
          }
        ]
      }
    },
    "base": [
      "Node"
    ]
  },
  "FunctionExpression": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "FunctionExpression"
      }
    },
    "base": [
      "Function",
      "Expression"
    ]
  },
  "UnaryExpression": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "UnaryExpression"
      },
      "operator": {
        "kind": "reference",
        "name": "UnaryOperator"
      },
      "prefix": {
        "kind": "reference",
        "name": "boolean"
      },
      "argument": {
        "kind": "reference",
        "name": "Expression"
      }
    },
    "base": [
      "Expression"
    ]
  },
  "UnaryOperator": {
    "kind": "enum",
    "values": [
      "-",
      "+",
      "!",
      "~",
      "typeof",
      "void",
      "delete"
    ]
  },
  "UpdateExpression": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "UpdateExpression"
      },
      "operator": {
        "kind": "reference",
        "name": "UpdateOperator"
      },
      "argument": {
        "kind": "reference",
        "name": "Expression"
      },
      "prefix": {
        "kind": "reference",
        "name": "boolean"
      }
    },
    "base": [
      "Expression"
    ]
  },
  "UpdateOperator": {
    "kind": "enum",
    "values": [
      "++",
      "--"
    ]
  },
  "BinaryExpression": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "BinaryExpression"
      },
      "operator": {
        "kind": "reference",
        "name": "BinaryOperator"
      },
      "left": {
        "kind": "reference",
        "name": "Expression"
      },
      "right": {
        "kind": "reference",
        "name": "Expression"
      }
    },
    "base": [
      "Expression"
    ]
  },
  "BinaryOperator": {
    "kind": "enum",
    "values": [
      "==",
      "!=",
      "===",
      "!==",
      "<",
      "<=",
      ">",
      ">=",
      "<<",
      ">>",
      ">>>",
      "+",
      "-",
      "*",
      "/",
      "%",
      "|",
      "^",
      "&",
      "in",
      "instanceof"
    ]
  },
  "AssignmentExpression": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "AssignmentExpression"
      },
      "operator": {
        "kind": "reference",
        "name": "AssignmentOperator"
      },
      "left": {
        "kind": "union",
        "types": [
          {
            "kind": "reference",
            "name": "Pattern"
          },
          {
            "kind": "reference",
            "name": "Expression"
          }
        ]
      },
      "right": {
        "kind": "reference",
        "name": "Expression"
      }
    },
    "base": [
      "Expression"
    ]
  },
  "AssignmentOperator": {
    "kind": "enum",
    "values": [
      "=",
      "+=",
      "-=",
      "*=",
      "/=",
      "%=",
      "<<=",
      ">>=",
      ">>>=",
      "|=",
      "^=",
      "&="
    ]
  },
  "LogicalExpression": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "LogicalExpression"
      },
      "operator": {
        "kind": "reference",
        "name": "LogicalOperator"
      },
      "left": {
        "kind": "reference",
        "name": "Expression"
      },
      "right": {
        "kind": "reference",
        "name": "Expression"
      }
    },
    "base": [
      "Expression"
    ]
  },
  "LogicalOperator": {
    "kind": "enum",
    "values": [
      "||",
      "&&"
    ]
  },
  "MemberExpression": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "MemberExpression"
      },
      "object": {
        "kind": "reference",
        "name": "Expression"
      },
      "property": {
        "kind": "reference",
        "name": "Expression"
      },
      "computed": {
        "kind": "reference",
        "name": "boolean"
      }
    },
    "base": [
      "Expression",
      "Pattern"
    ]
  },
  "ConditionalExpression": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "ConditionalExpression"
      },
      "test": {
        "kind": "reference",
        "name": "Expression"
      },
      "alternate": {
        "kind": "reference",
        "name": "Expression"
      },
      "consequent": {
        "kind": "reference",
        "name": "Expression"
      }
    },
    "base": [
      "Expression"
    ]
  },
  "CallExpression": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "CallExpression"
      },
      "callee": {
        "kind": "reference",
        "name": "Expression"
      },
      "arguments": {
        "kind": "array",
        "base": {
          "kind": "reference",
          "name": "Expression"
        }
      }
    },
    "base": [
      "Expression"
    ]
  },
  "NewExpression": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "NewExpression"
      },
      "callee": {
        "kind": "reference",
        "name": "Expression"
      },
      "arguments": {
        "kind": "array",
        "base": {
          "kind": "reference",
          "name": "Expression"
        }
      }
    },
    "base": [
      "Expression"
    ]
  },
  "SequenceExpression": {
    "kind": "interface",
    "props": {
      "type": {
        "kind": "literal",
        "value": "SequenceExpression"
      },
      "expressions": {
        "kind": "array",
        "base": {
          "kind": "reference",
          "name": "Expression"
        }
      }
    },
    "base": [
      "Expression"
    ]
  },
  "Pattern": {
    "kind": "interface",
    "props": {},
    "base": [
      "Node"
    ]
  }
}