246 lines
6.7 KiB
JavaScript
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)")
|
|
})
|