2017-06-03 04:04:36 +02:00
|
|
|
import jsdom from "jsdom";
|
|
|
|
import assert from "assert";
|
|
|
|
import * as fs from "fs";
|
2016-12-08 11:48:54 +01:00
|
|
|
|
2017-06-03 04:04:36 +02:00
|
|
|
import * as consoleGroup from "console-group";
|
2016-12-08 11:48:54 +01:00
|
|
|
consoleGroup.install();
|
|
|
|
|
2017-06-03 04:04:36 +02:00
|
|
|
import * as sourceMapSupport from "source-map-support";
|
2016-12-08 11:48:54 +01:00
|
|
|
sourceMapSupport.install();
|
|
|
|
|
|
|
|
// for coverage purposes, we need to test source files,
|
|
|
|
// but for sanity purposes, we need to test dist files
|
2017-06-03 04:04:36 +02:00
|
|
|
export function loadSvelte(test) {
|
|
|
|
if (test) global.__svelte_test = true;
|
2017-04-11 16:09:56 +02:00
|
|
|
|
2017-06-03 04:04:36 +02:00
|
|
|
const resolved = process.env.COVERAGE
|
|
|
|
? require.resolve("../src/index.js")
|
|
|
|
: require.resolve("../compiler/svelte.js");
|
2017-04-11 16:09:56 +02:00
|
|
|
|
2017-06-03 04:04:36 +02:00
|
|
|
delete require.cache[resolved];
|
|
|
|
return require(resolved);
|
2017-04-11 16:09:56 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
export const svelte = loadSvelte();
|
2016-12-08 11:48:54 +01:00
|
|
|
|
2017-06-03 04:04:36 +02:00
|
|
|
export function exists(path) {
|
2016-12-08 11:48:54 +01:00
|
|
|
try {
|
2017-06-03 04:04:36 +02:00
|
|
|
fs.statSync(path);
|
2016-12-08 11:48:54 +01:00
|
|
|
return true;
|
2017-06-03 04:04:36 +02:00
|
|
|
} catch (err) {
|
2016-12-08 11:48:54 +01:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-06-03 04:04:36 +02:00
|
|
|
export function tryToLoadJson(file) {
|
2016-12-08 11:48:54 +01:00
|
|
|
try {
|
2017-06-03 04:04:36 +02:00
|
|
|
return JSON.parse(fs.readFileSync(file));
|
|
|
|
} catch (err) {
|
|
|
|
if (err.code !== "ENOENT") throw err;
|
2016-12-08 11:48:54 +01:00
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-06-03 04:04:36 +02:00
|
|
|
export function tryToReadFile(file) {
|
2016-12-08 11:48:54 +01:00
|
|
|
try {
|
2017-06-03 04:04:36 +02:00
|
|
|
return fs.readFileSync(file, "utf-8");
|
|
|
|
} catch (err) {
|
|
|
|
if (err.code !== "ENOENT") throw err;
|
2016-12-08 11:48:54 +01:00
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-06-03 04:04:36 +02:00
|
|
|
export function env() {
|
|
|
|
return new Promise((fulfil, reject) => {
|
|
|
|
jsdom.env("<main></main>", (err, window) => {
|
|
|
|
if (err) {
|
|
|
|
reject(err);
|
2016-12-08 11:48:54 +01:00
|
|
|
} else {
|
|
|
|
global.document = window.document;
|
2017-06-03 04:04:36 +02:00
|
|
|
fulfil(window);
|
2016-12-08 11:48:54 +01:00
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2017-06-03 04:04:36 +02:00
|
|
|
function cleanChildren(node) {
|
2016-12-08 11:48:54 +01:00
|
|
|
let previous = null;
|
|
|
|
|
2017-06-03 04:04:36 +02:00
|
|
|
[...node.childNodes].forEach(child => {
|
|
|
|
if (child.nodeType === 8) {
|
2016-12-08 11:48:54 +01:00
|
|
|
// comment
|
2017-06-03 04:04:36 +02:00
|
|
|
node.removeChild(child);
|
2016-12-08 11:48:54 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2017-06-03 04:04:36 +02:00
|
|
|
if (child.nodeType === 3) {
|
|
|
|
if (
|
|
|
|
node.namespaceURI === "http://www.w3.org/2000/svg" &&
|
|
|
|
node.tagName !== "text" &&
|
|
|
|
node.tagName !== "tspan"
|
|
|
|
) {
|
|
|
|
node.removeChild(child);
|
2017-01-24 23:03:14 +01:00
|
|
|
}
|
|
|
|
|
2017-06-03 04:04:36 +02:00
|
|
|
child.data = child.data.replace(/\s{2,}/, "\n");
|
2016-12-08 11:48:54 +01:00
|
|
|
|
|
|
|
// text
|
2017-06-03 04:04:36 +02:00
|
|
|
if (previous && previous.nodeType === 3) {
|
2016-12-08 11:48:54 +01:00
|
|
|
previous.data += child.data;
|
2017-06-03 04:04:36 +02:00
|
|
|
previous.data = previous.data.replace(/\s{2,}/, "\n");
|
2016-12-08 11:48:54 +01:00
|
|
|
|
2017-06-03 04:04:36 +02:00
|
|
|
node.removeChild(child);
|
2017-05-05 18:10:37 +02:00
|
|
|
child = previous;
|
2016-12-08 11:48:54 +01:00
|
|
|
}
|
2017-06-03 04:04:36 +02:00
|
|
|
} else {
|
|
|
|
cleanChildren(child);
|
2016-12-08 11:48:54 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
previous = child;
|
|
|
|
});
|
|
|
|
|
|
|
|
// collapse whitespace
|
2017-06-03 04:04:36 +02:00
|
|
|
if (node.firstChild && node.firstChild.nodeType === 3) {
|
|
|
|
node.firstChild.data = node.firstChild.data.replace(/^\s+/, "");
|
|
|
|
if (!node.firstChild.data) node.removeChild(node.firstChild);
|
2016-12-08 11:48:54 +01:00
|
|
|
}
|
|
|
|
|
2017-06-03 04:04:36 +02:00
|
|
|
if (node.lastChild && node.lastChild.nodeType === 3) {
|
|
|
|
node.lastChild.data = node.lastChild.data.replace(/\s+$/, "");
|
|
|
|
if (!node.lastChild.data) node.removeChild(node.lastChild);
|
2016-12-08 11:48:54 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-06-03 04:04:36 +02:00
|
|
|
export function setupHtmlEqual() {
|
|
|
|
return env().then(window => {
|
|
|
|
assert.htmlEqual = (actual, expected, message) => {
|
|
|
|
window.document.body.innerHTML = actual
|
|
|
|
.replace(/>[\s\r\n]+</g, "><")
|
|
|
|
.trim();
|
|
|
|
cleanChildren(window.document.body, "");
|
2016-12-08 11:48:54 +01:00
|
|
|
actual = window.document.body.innerHTML;
|
|
|
|
|
2017-06-03 04:04:36 +02:00
|
|
|
window.document.body.innerHTML = expected
|
|
|
|
.replace(/>[\s\r\n]+</g, "><")
|
|
|
|
.trim();
|
|
|
|
cleanChildren(window.document.body, "");
|
2016-12-08 11:48:54 +01:00
|
|
|
expected = window.document.body.innerHTML;
|
|
|
|
|
2017-06-03 04:04:36 +02:00
|
|
|
assert.deepEqual(actual, expected, message);
|
2016-12-08 11:48:54 +01:00
|
|
|
};
|
|
|
|
});
|
|
|
|
}
|
2017-01-17 19:46:37 +01:00
|
|
|
|
2017-06-03 04:04:36 +02:00
|
|
|
export function loadConfig(file) {
|
2017-01-17 19:46:37 +01:00
|
|
|
try {
|
2017-06-03 04:04:36 +02:00
|
|
|
const resolved = require.resolve(file);
|
|
|
|
delete require.cache[resolved];
|
|
|
|
return require(resolved).default;
|
|
|
|
} catch (err) {
|
|
|
|
if (err.code === "E_NOT_FOUND") {
|
2017-01-17 19:46:37 +01:00
|
|
|
return {};
|
|
|
|
}
|
|
|
|
|
|
|
|
throw err;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-06-03 04:04:36 +02:00
|
|
|
export function addLineNumbers(code) {
|
|
|
|
return code
|
|
|
|
.split("\n")
|
|
|
|
.map((line, i) => {
|
|
|
|
i = String(i + 1);
|
|
|
|
while (i.length < 3) i = ` ${i}`;
|
|
|
|
|
|
|
|
return `${i}: ${line.replace(/^\t+/, match =>
|
|
|
|
match.split("\t").join(" ")
|
|
|
|
)}`;
|
|
|
|
})
|
|
|
|
.join("\n");
|
2017-01-17 19:46:37 +01:00
|
|
|
}
|