diff --git a/package-lock.json b/package-lock.json index 87d1b99100..cd9a83e04b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1580,6 +1580,18 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, + "globalyzer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.4.tgz", + "integrity": "sha512-LeguVWaxgHN0MNbWC6YljNMzHkrCny9fzjmEUdnF1kQ7wATFD1RHFRqA1qxaX2tgxGENlcxjOflopBwj3YZiXA==", + "dev": true + }, + "globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, "graceful-fs": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", @@ -3553,6 +3565,16 @@ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, + "tiny-glob": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.6.tgz", + "integrity": "sha512-A7ewMqPu1B5PWwC3m7KVgAu96Ch5LA0w4SnEN/LbDREj/gAD0nPWboRbn8YoP9ISZXqeNAlMvKSKoEuhcfK3Pw==", + "dev": true, + "requires": { + "globalyzer": "^0.1.0", + "globrex": "^0.1.1" + } + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", diff --git a/package.json b/package.json index 4f3478371d..adcc889e95 100644 --- a/package.json +++ b/package.json @@ -95,6 +95,7 @@ "rollup": "^1.27.14", "source-map": "^0.7.3", "source-map-support": "^0.5.13", + "tiny-glob": "^0.2.6", "tslib": "^1.10.0", "typescript": "^3.5.3" }, diff --git a/test/helpers.ts b/test/helpers.ts index 67636bc778..ce9821c251 100644 --- a/test/helpers.ts +++ b/test/helpers.ts @@ -1,6 +1,6 @@ import * as assert$1 from 'assert'; import * as jsdom from 'jsdom'; -import { glob } from './tiny-glob'; +import glob from 'tiny-glob/sync'; import * as path from 'path'; import * as fs from 'fs'; import * as colors from 'kleur'; @@ -258,4 +258,48 @@ export function mkdirp(dir) { } catch (err) { // do nothing } +} + +export function update_expected(run, cwd) { + const svelte = (function loadSvelte() { + const resolved = require.resolve("../compiler.js"); + delete require.cache[resolved]; + return require(resolved); + })(); + glob("samples/*/input.svelte", { cwd }).forEach((dir) => { + function compile(options) { + return svelte.compile( + fs.readFileSync(`${cwd}/${dir}`, "utf-8") + .replace(/\s+$/, "") + .replace(/\r/g, ""), + options + ); + } + function check(target, value) { + const path = `${cwd}/${dir.replace("input.svelte", target)}`; + try { + const previous = fs.readFileSync(path, "utf-8"); + if (typeof value === "object") { + assert.deepEqual( + JSON.parse(previous), + JSON.parse(JSON.stringify(value)) + ); + } else { + assert.equal( + previous.replace(/\s+$/, "").replace(/\r/g, ""), + (value = value.replace(/\s+$/, "").replace(/\r/g, "")) + ); + } + } catch (e) { + if (typeof value === "object") + value = JSON.stringify(value, null, "\t"); + fs.writeFileSync(path, value); + } + } + function get_relative(name) { + return `${cwd}/${dir.replace("input.svelte", name)}`; + } + + run(compile, check, get_relative); + }); } \ No newline at end of file diff --git a/test/js/index.ts b/test/js/index.ts index 3a3643de47..5293d562f8 100644 --- a/test/js/index.ts +++ b/test/js/index.ts @@ -3,6 +3,7 @@ import * as fs from "fs"; import * as path from "path"; import * as colors from "kleur"; import { loadConfig, svelte, shouldUpdateExpected } from "../helpers"; +import { sanitize } from "./update"; describe("js", () => { fs.readdirSync(`${__dirname}/samples`).forEach(dir => { @@ -32,7 +33,7 @@ describe("js", () => { try { const options = Object.assign(config.options || {}); - actual = svelte.compile(input, options).js.code.replace(/generated by Svelte v\d+\.\d+\.\d+(-\w+\.\d+)?/, 'generated by Svelte vX.Y.Z'); + actual = sanitize(svelte.compile(input, options)); } catch (err) { console.log(err.frame); throw err; diff --git a/test/js/update.ts b/test/js/update.ts index 5c4a16b2c0..da5681b72f 100644 --- a/test/js/update.ts +++ b/test/js/update.ts @@ -1,31 +1,18 @@ -import { update_expected } from "../update"; +import { loadConfig, update_expected } from "../helpers"; + +export function sanitize(compiled){ + return compiled.js.code.replace(/generated by Svelte v\d+\.\d+\.\d+(-\w+\.\d+)?/, 'generated by Svelte vX.Y.Z'); +} // this file will replace all the expected.js files with their _actual // equivalents. Only use it when you're sure that you haven't // broken anything! -function loadConfig(file) { - try { - const resolved = require.resolve(file); - delete require.cache[resolved]; - - const config = require(resolved); - return config.default || config; - } catch (err) { - if (err.code === "MODULE_NOT_FOUND") { - return {}; - } - - throw err; - } -} - -update_expected((compile, check, get_relative) => { - check( - "expected.js", - compile(loadConfig(get_relative("_config.js")).options).js.code.replace( - /generated by Svelte v\d+\.\d+\.\d+(-\w+\.\d+)?/, - "generated by Svelte vX.Y.Z" - ) - ); -}, __dirname); \ No newline at end of file +update_expected( + (compile, check, get_relative) => + check( + "expected.js", + sanitize(compile(loadConfig(get_relative("_config.js")).options)) + ), + __dirname +); diff --git a/test/parser/index.ts b/test/parser/index.ts index 32afcbbafc..fbfe4d7305 100644 --- a/test/parser/index.ts +++ b/test/parser/index.ts @@ -1,6 +1,7 @@ import * as assert from 'assert'; import * as fs from 'fs'; import { svelte, tryToLoadJson, shouldUpdateExpected } from '../helpers'; +import { sanitize_ast, sanitize_error } from './update'; describe('parse', () => { fs.readdirSync(`${__dirname}/samples`).forEach(dir => { @@ -25,9 +26,7 @@ describe('parse', () => { const expectedError = tryToLoadJson(`${__dirname}/samples/${dir}/error.json`); try { - const { ast } = svelte.compile(input, Object.assign(options, { - generate: false - })); + const ast = sanitize_ast(svelte.compile(input, { ...options, generate: false })); fs.writeFileSync(`${__dirname}/samples/${dir}/_actual.json`, JSON.stringify(ast, null, '\t')); @@ -38,9 +37,8 @@ describe('parse', () => { } catch (err) { if (err.name !== 'ParseError') throw err; if (!expectedError) throw err; - const { code, message, pos, start } = err; try { - assert.deepEqual({ code, message, pos, start }, expectedError); + assert.deepEqual(sanitize_error(err), expectedError); } catch (err2) { const e = err2.code === 'MODULE_NOT_FOUND' ? err : err2; throw e; diff --git a/test/parser/update.ts b/test/parser/update.ts index b5f5e89fc3..5dbd1b2473 100644 --- a/test/parser/update.ts +++ b/test/parser/update.ts @@ -1,19 +1,27 @@ import { update_expected } from "../update"; +export function sanitize_ast(compiled){ + return compiled.ast; +} + +export function sanitize_error(e){ + return { + code: e.code, + message: e.message, + start: e.start, + pos: e.pos + } +} + // this file will replace all the expected.js files with their _actual // equivalents. Only use it when you're sure that you haven't // broken anything! update_expected((compile, check) => { try { - check("output.json", compile({ generate: false }).ast); + check("output.json", sanitize_ast(compile({ generate: false }))); } catch (e) { if (e.name !== "ParseError") throw e; - check("error.json", { - code: e.code, - message: e.message, - start: e.start, - pos: e.pos, - }); + check("error.json", sanitize_error(e)); } }, __dirname); diff --git a/test/runtime/index.ts b/test/runtime/index.ts index 8809585a80..286ef71550 100644 --- a/test/runtime/index.ts +++ b/test/runtime/index.ts @@ -2,7 +2,7 @@ import * as path from "path"; import * as fs from "fs"; import { rollup } from 'rollup'; import virtual from '@rollup/plugin-virtual'; -import { glob } from '../tiny-glob'; +import glob from 'tiny-glob/sync'; import { clear_loops, flush, set_now, set_raf } from "../../internal"; import { diff --git a/test/server-side-rendering/index.ts b/test/server-side-rendering/index.ts index de3d11eeb5..40a833ca65 100644 --- a/test/server-side-rendering/index.ts +++ b/test/server-side-rendering/index.ts @@ -1,6 +1,6 @@ import * as fs from "fs"; import * as path from "path"; -import { glob } from '../tiny-glob'; +import glob from 'tiny-glob/sync'; import { assert, diff --git a/test/test.ts b/test/test.ts index e88e759db9..894740b1fd 100644 --- a/test/test.ts +++ b/test/test.ts @@ -1,4 +1,4 @@ -import { glob } from './tiny-glob'; +import glob from 'tiny-glob/sync'; import './setup';