load(libdir + "match.js"); load(libdir + "asserts.js"); var { Pattern, MatchError } = Match; program = (elts) => Pattern({ type: "Program", body: elts }) importDeclaration = (specifiers, source) => Pattern({ type: "ImportDeclaration", specifiers: specifiers, source: source }); importSpecifier = (id, name) => Pattern({ type: "ImportSpecifier", id: id, name: name }); ident = (name) => Pattern({ type: "Identifier", name: name }) lit = (val) => Pattern({ type: "Literal", value: val }) function parseAsModule(source) { return Reflect.parse(source, {target: "module"}); } program([ importDeclaration( [ importSpecifier( ident("default"), ident("a") ) ], lit("b") ) ]).assert(parseAsModule("import a from 'b'")); program([ importDeclaration( [ importSpecifier( ident("*"), ident("a") ) ], lit("b") ) ]).assert(parseAsModule("import * as a from 'b'")); program([ importDeclaration( [], lit("a") ) ]).assert(parseAsModule("import {} from 'a'")); program([ importDeclaration( [ importSpecifier( ident("a"), ident("a") ) ], lit("b") ) ]).assert(parseAsModule("import { a } from 'b'")); program([ importDeclaration( [ importSpecifier( ident("a"), ident("a") ) ], lit("b") ) ]).assert(parseAsModule("import { a, } from 'b'")); program([ importDeclaration( [ importSpecifier( ident("a"), ident("b") ) ], lit("c") ) ]).assert(parseAsModule("import { a as b } from 'c'")); program([ importDeclaration( [ importSpecifier( ident("as"), ident("as") ) ], lit("a") ) ]).assert(parseAsModule("import { as as as } from 'a'")); program([ importDeclaration( [ importSpecifier( ident("default"), ident("a") ), importSpecifier( ident("*"), ident("b") ) ], lit("c") ) ]).assert(parseAsModule("import a, * as b from 'c'")); program([ importDeclaration( [ importSpecifier( ident("default"), ident("d") ) ], lit("a") ) ]).assert(parseAsModule("import d, {} from 'a'")); program([ importDeclaration( [ importSpecifier( ident("default"), ident("d") ), importSpecifier( ident("a"), ident("a") ) ], lit("b") ) ]).assert(parseAsModule("import d, { a } from 'b'")); program([ importDeclaration( [ importSpecifier( ident("default"), ident("d") ), importSpecifier( ident("a"), ident("b") ) ], lit("c") ) ]).assert(parseAsModule("import d, { a as b } from 'c'")); program([ importDeclaration( [ importSpecifier( ident("default"), ident("d") ), importSpecifier( ident("a"), ident("a") ), importSpecifier( ident("b"), ident("b") ), ], lit("c") ) ]).assert(parseAsModule("import d, { a, b } from 'c'")); program([ importDeclaration( [ importSpecifier( ident("default"), ident("d") ), importSpecifier( ident("a"), ident("b") ), importSpecifier( ident("c"), ident("f") ), ], lit("e") ) ]).assert(parseAsModule("import d, { a as b, c as f } from 'e'")); program([ importDeclaration( [ importSpecifier( ident("true"), ident("a") ) ], lit("b") ) ]).assert(parseAsModule("import { true as a } from 'b'")); program([ importDeclaration( [ importSpecifier( ident("a"), ident("a") ), importSpecifier( ident("b"), ident("b") ), ], lit("c") ) ]).assert(parseAsModule("import { a, b } from 'c'")); program([ importDeclaration( [ importSpecifier( ident("a"), ident("b") ), importSpecifier( ident("c"), ident("d") ), ], lit("e") ) ]).assert(parseAsModule("import { a as b, c as d } from 'e'")); program([ importDeclaration( [], lit("a") ) ]).assert(parseAsModule("import 'a'")); var loc = parseAsModule("import { a as b } from 'c'", { loc: true }).body[0].loc; assertEq(loc.start.line, 1); assertEq(loc.start.column, 0); assertEq(loc.start.line, 1); assertEq(loc.end.column, 26); assertThrowsInstanceOf(function () { parseAsModule("function f() { import a from 'b' }"); }, SyntaxError); assertThrowsInstanceOf(function () { parseAsModule("if (true) import a from 'b'"); }, SyntaxError); assertThrowsInstanceOf(function() { parseAsModule("import {"); }, SyntaxError); assertThrowsInstanceOf(function() { parseAsModule("import {}"); }, SyntaxError); assertThrowsInstanceOf(function() { parseAsModule("import {} from"); }, SyntaxError); assertThrowsInstanceOf(function() { parseAsModule("import {,} from 'a'"); }, SyntaxError); assertThrowsInstanceOf(function() { parseAsModule("import { a as true } from 'b'"); }, SyntaxError); assertThrowsInstanceOf(function() { parseAsModule("import { true } from 'a'"); }, SyntaxError); assertThrowsInstanceOf(function() { parseAsModule("import a,"); }, SyntaxError); assertThrowsInstanceOf(function() { parseAsModule("import a, b from 'a'"); }, SyntaxError); assertThrowsInstanceOf(function() { parseAsModule("import * as a,"); }, SyntaxError); assertThrowsInstanceOf(function() { parseAsModule("import * as a, {} from 'a'"); }, SyntaxError); assertThrowsInstanceOf(function() { parseAsModule("import as a from 'a'"); }, SyntaxError); assertThrowsInstanceOf(function() { parseAsModule("import * a from 'a'"); }, SyntaxError); assertThrowsInstanceOf(function() { parseAsModule("import * as from 'a'"); }, SyntaxError); assertThrowsInstanceOf(function() { parseAsModule("import , {} from 'a'"); }, SyntaxError); assertThrowsInstanceOf(function() { parseAsModule("import d, from 'a'"); }, SyntaxError); assertThrowsInstanceOf(function() { parseAsModule("import * as true from 'b'"); }, SyntaxError);