Files
2020-05-26 10:37:57 +02:00

246 lines
6.7 KiB
JavaScript

"use strict"
const assert = require("assert")
const acorn = require("acorn")
const importMeta = require("..")
const Parser = acorn.Parser.extend(importMeta)
function testFail(text, expectedError, additionalOptions) {
it(text, function () {
let failed = false
try {
Parser.parse(text, Object.assign({ ecmaVersion: 9, sourceType: "module" }, additionalOptions))
} catch (e) {
if (expectedError) assert.strictEqual(e.message, expectedError)
failed = true
}
assert(failed)
})
}
function test(text, expectedResult, additionalOptions) {
it(text, function () {
const result = Parser.parse(text, Object.assign({ ecmaVersion: 9, sourceType: "module" }, additionalOptions))
assert.deepStrictEqual(result, expectedResult)
})
testFail(text, null, { sourceType: "script" })
}
const newNode = (start, props) => Object.assign(new acorn.Node({options: {}}, start), props)
describe("acorn-import-meta", function () {
test("const response = fetch(import.meta.url);", newNode(0, {
type: "Program",
end: 40,
body: [
newNode(0, {
type: "VariableDeclaration",
end: 40,
declarations: [
newNode(6, {
type: "VariableDeclarator",
end: 39,
id: newNode(6, {
type: "Identifier",
end: 14,
name: "response"
}),
init: newNode(17, {
type: "CallExpression",
end: 39,
callee: newNode(17, {
type: "Identifier",
end: 22,
name: "fetch"
}),
arguments: [
newNode(23, {
type: "MemberExpression",
end: 38,
object: newNode(23, {
type: "MetaProperty",
end: 34,
meta: newNode(23, {
type: "Identifier",
end: 29,
name: "import"
}),
property: newNode(30, {
type: "Identifier",
end: 34,
name: "meta"
})
}),
property: newNode(35, {
type: "Identifier",
end: 38,
name: "url"
}),
computed: false
})
]
})
})
],
kind: "const"
})
],
sourceType: "module"
}))
test("const size = import.meta.scriptElement.dataset.size || 300;", newNode(0, {
type: "Program",
end: 59,
body: [
newNode(0, {
type: "VariableDeclaration",
end: 59,
declarations: [
newNode(6, {
type: "VariableDeclarator",
end: 58,
id: newNode(6, {
type: "Identifier",
end: 10,
name: "size"
}),
init: newNode(13, {
type: "LogicalExpression",
end: 58,
left: newNode(13, {
type: "MemberExpression",
end: 51,
object: newNode(13, {
type: "MemberExpression",
end: 46,
object: newNode(13, {
type: "MemberExpression",
end: 38,
object: newNode(13, {
type: "MetaProperty",
end: 24,
meta: newNode(13, {
type: "Identifier",
end: 19,
name: "import"
}),
property: newNode(20, {
type: "Identifier",
end: 24,
name: "meta"
})
}),
property: newNode(25, {
type: "Identifier",
end: 38,
name: "scriptElement"
}),
computed: false
}),
property: newNode(39, {
type: "Identifier",
end: 46,
name: "dataset"
}),
computed: false
}),
property: newNode(47, {
type: "Identifier",
end: 51,
name: "size"
}),
computed: false
}),
operator: "||",
right: newNode(55, {
type: "Literal",
end: 58,
value: 300,
raw: "300"
})
})
})
],
kind: "const"
})
],
sourceType: "module"
}))
test("import.meta.resolve('something')", newNode(0, {
type: "Program",
end: 32,
body: [
newNode(0, {
type: "ExpressionStatement",
end: 32,
expression: newNode(0, {
type: "CallExpression",
end: 32,
callee: newNode(0, {
type: "MemberExpression",
end: 19,
object: newNode(0, {
type: "MetaProperty",
end: 11,
meta: newNode(0, {
type: "Identifier",
end: 6,
name: "import"
}),
property: newNode(7, {
type: "Identifier",
end: 11,
name: "meta"
})
}),
property: newNode(12, {
type: "Identifier",
end: 19,
name: "resolve"
}),
computed: false
}),
arguments: [
newNode(20, {
type: "Literal",
end: 31,
value: "something",
raw: "'something'"
})
]
})
})
],
sourceType: "module"
}))
test("import x from 'y'", newNode(0, {
type: "Program",
end: 17,
body: [
newNode(0, {
type: "ImportDeclaration",
end: 17,
specifiers: [
newNode(7, {
type: "ImportDefaultSpecifier",
end: 8,
local: newNode(7, {
type: "Identifier",
end: 8,
name: "x"
})
})
],
source: newNode(14, {
type: "Literal",
end: 17,
value: "y",
raw: "'y'"
})
})
],
sourceType: "module"
}))
testFail("let x = import.anotherMeta", "The only valid meta property for import is import.meta (1:15)")
testFail("import.m\\u0065ta;", "\"meta\" in import.meta must not contain escape sequences (1:7)")
})