feat save compiled output for test suites

pull/4251/head
Tan Li Hau 7 years ago committed by tanhauhau
parent bb83eddfc6
commit bc5a4ae688

@ -1,6 +1,5 @@
import * as assert$1 from 'assert'; import * as assert$1 from 'assert';
import * as jsdom from 'jsdom'; import * as jsdom from 'jsdom';
import glob from 'tiny-glob/sync';
import * as path from 'path'; import * as path from 'path';
import * as fs from 'fs'; import * as fs from 'fs';
import * as colors from 'kleur'; import * as colors from 'kleur';
@ -206,27 +205,6 @@ export function addLineNumbers(code) {
.join('\n'); .join('\n');
} }
export function showOutput(cwd, options = {}, compile = svelte.compile) {
glob('**/*.svelte', { cwd }).forEach(file => {
if (file[0] === '_') return;
try {
const { js } = compile(
fs.readFileSync(`${cwd}/${file}`, 'utf-8'),
Object.assign(options, {
filename: file
})
);
console.log( // eslint-disable-line no-console
`\n>> ${colors.cyan().bold(file)}\n${addLineNumbers(js.code)}\n<< ${colors.cyan().bold(file)}`
);
} catch (err) {
console.log(`failed to generate output: ${err.message}`);
}
});
}
export function shouldUpdateExpected() { export function shouldUpdateExpected() {
return process.argv.includes('--update'); return process.argv.includes('--update');
} }

@ -1,9 +1,9 @@
import * as path from 'path'; import * as path from 'path';
import * as fs from 'fs'; import * as fs from 'fs';
import * as register from '../register';
import { import {
assert, assert,
showOutput,
loadConfig, loadConfig,
loadSvelte, loadSvelte,
env, env,
@ -11,34 +11,16 @@ import {
shouldUpdateExpected shouldUpdateExpected
} from '../helpers'; } from '../helpers';
let compileOptions = null; let svelte;
const sveltePath = process.cwd();
describe('hydration', () => { describe('hydration', () => {
before(() => { before(() => {
const svelte = loadSvelte(); svelte = loadSvelte();
require.extensions['.svelte'] = function(module, filename) {
const options = Object.assign(
{
filename,
hydratable: true,
format: 'cjs',
sveltePath
},
compileOptions
);
const { js } = svelte.compile(fs.readFileSync(filename, 'utf-8'), options);
return module._compile(js.code, filename);
};
return setupHtmlEqual(); return setupHtmlEqual();
}); });
function runTest(dir) { function runTest(dir: string) {
if (dir[0] === '.') return; if (dir[0] === '.') return;
const config = loadConfig(`./hydration/samples/${dir}/_config.js`); const config = loadConfig(`./hydration/samples/${dir}/_config.js`);
@ -51,12 +33,16 @@ describe('hydration', () => {
(config.skip ? it.skip : solo ? it.only : it)(dir, () => { (config.skip ? it.skip : solo ? it.only : it)(dir, () => {
const cwd = path.resolve(`${__dirname}/samples/${dir}`); const cwd = path.resolve(`${__dirname}/samples/${dir}`);
compileOptions = config.compileOptions || {}; register.setCompileOptions({
compileOptions.accessors = 'accessors' in config ? config.accessors : true; ...config.compileOptions,
accessors: 'accessors' in config ? config.accessors : true,
hydratable: true
});
register.setCompile(svelte.compile);
register.setOutputFolderName('hydratable');
const window = env(); const window = env();
try {
global.window = window; global.window = window;
const SvelteComponent = require(`${cwd}/main.svelte`).default; const SvelteComponent = require(`${cwd}/main.svelte`).default;
@ -112,22 +98,10 @@ describe('hydration', () => {
component.$destroy(); component.$destroy();
assert.equal(target.innerHTML, ''); assert.equal(target.innerHTML, '');
} }
} catch (err) {
showOutput(cwd, {
hydratable: true
});
throw err;
}
if (config.show) {
showOutput(cwd, {
hydratable: true
});
}
}); });
} }
fs.readdirSync(`${__dirname}/samples`).forEach(dir => { fs.readdirSync(`${__dirname}/samples`).forEach(dir => {
runTest(dir, null); runTest(dir);
}); });
}); });

@ -0,0 +1,77 @@
import * as fs from 'fs';
import * as path from 'path';
import { mkdirp } from './helpers';
import * as svelte from 'svelte/compiler';
type Compile = typeof svelte.compile;
type CompileOptions = Parameters<Compile>[1];
const extensions = ['.svelte', '.html'];
let compileOptions = {};
let compile;
let folderName = 'normal';
const sveltePath = process.cwd().split('\\').join('/');
function capitalise(name: string) {
return name[0].toUpperCase() + name.slice(1);
}
export function setCompileOptions(_compileOptions: CompileOptions) {
compileOptions = _compileOptions;
}
export function setCompile(_compile: Compile) {
compile = _compile;
}
export function setOutputFolderName(_folderName: string) {
folderName = _folderName;
}
export function clearRequireCache() {
Object.keys(require.cache)
.filter(x => x.endsWith('.svelte'))
.forEach(file => {
delete require.cache[file];
});
}
function registerExtension(extension: string) {
require.extensions[extension] = function(module, filename) {
const name = path
.parse(filename)
.name.replace(/^\d/, '_$&')
.replace(/[^a-zA-Z0-9_$]/g, '');
const options = Object.assign({}, compileOptions, {
filename,
sveltePath,
name: capitalise(name),
format: 'cjs'
});
const {
js: { code }
} = compile(fs.readFileSync(filename, 'utf-8'), options);
if (!process.env.CI) {
saveGeneratedOutput(code, filename);
}
return module._compile(code, filename);
};
}
function saveGeneratedOutput(code: string, filename: string) {
filename = filename.split('\\').join('/');
filename = filename.replace(
/samples\/([^/]+)\/(.*)\.svelte$/,
`samples/$1/_output/${folderName}/$2.js`
);
mkdirp(path.dirname(filename));
fs.writeFileSync(filename, code, 'utf8');
}
extensions.forEach(registerExtension);

@ -2,28 +2,21 @@ import * as path from 'path';
import * as fs from 'fs'; import * as fs from 'fs';
import { rollup } from 'rollup'; import { rollup } from 'rollup';
import virtual from '@rollup/plugin-virtual'; import virtual from '@rollup/plugin-virtual';
import glob from 'tiny-glob/sync.js';
import { clear_loops, flush, set_now, set_raf } from '../../internal'; import { clear_loops, flush, set_now, set_raf } from '../../internal';
import * as register from '../register';
import { import {
assert, assert,
showOutput,
loadConfig, loadConfig,
loadSvelte, loadSvelte,
cleanRequireCache, cleanRequireCache,
env, env,
setupHtmlEqual, setupHtmlEqual
mkdirp
} from '../helpers'; } from '../helpers';
let svelte$; let svelte$;
let svelte; let svelte;
let compileOptions = null;
let compile = null;
const sveltePath = process.cwd().split('\\').join('/');
let unhandled_rejection = false; let unhandled_rejection = false;
function unhandledRejection_handler(err) { function unhandledRejection_handler(err) {
unhandled_rejection = err; unhandled_rejection = err;
@ -35,16 +28,6 @@ describe('runtime', () => {
svelte = loadSvelte(false); svelte = loadSvelte(false);
svelte$ = loadSvelte(true); svelte$ = loadSvelte(true);
require.extensions['.svelte'] = function(module, filename) {
const options = Object.assign({
filename
}, compileOptions);
const { js: { code } } = compile(fs.readFileSync(filename, 'utf-8').replace(/\r/g, ''), options);
return module._compile(code, filename);
};
return setupHtmlEqual(); return setupHtmlEqual();
}); });
after(() => process.removeListener('unhandledRejection', unhandledRejection_handler)); after(() => process.removeListener('unhandledRejection', unhandledRejection_handler));
@ -73,18 +56,19 @@ describe('runtime', () => {
unhandled_rejection = null; unhandled_rejection = null;
compile = (config.preserveIdentifiers ? svelte : svelte$).compile;
const cwd = path.resolve(`${__dirname}/samples/${dir}`); const cwd = path.resolve(`${__dirname}/samples/${dir}`);
compileOptions = config.compileOptions || {}; const compileOptions = {
compileOptions.format = 'cjs'; ...config.compileOptions,
compileOptions.sveltePath = sveltePath; hydratable: hydrate,
compileOptions.hydratable = hydrate; immutable: config.immutable,
compileOptions.immutable = config.immutable; accessors: 'accessors' in config ? config.accessors : true
compileOptions.accessors = 'accessors' in config ? config.accessors : true; };
cleanRequireCache(); register.clearRequireCache();
register.setCompile((config.preserveIdentifiers ? svelte : svelte$).compile);
register.setCompileOptions(compileOptions);
register.setOutputFolderName(hydrate ? 'hydratable' : 'normal');
let mod; let mod;
let SvelteComponent; let SvelteComponent;
@ -93,34 +77,7 @@ describe('runtime', () => {
const window = env(); const window = env();
glob('**/*.svelte', { cwd }).forEach(file => { return Promise.resolve()
if (file[0] === '_') return;
const dir = `${cwd}/_output/${hydrate ? 'hydratable' : 'normal'}`;
const out = `${dir}/${file.replace(/\.svelte$/, '.js')}`;
if (fs.existsSync(out)) {
fs.unlinkSync(out);
}
mkdirp(dir);
try {
const { js } = compile(
fs.readFileSync(`${cwd}/${file}`, 'utf-8').replace(/\r/g, ''),
{
...compileOptions,
filename: file
}
);
fs.writeFileSync(out, js.code);
} catch (err) {
// do nothing
}
});
Promise.resolve()
.then(() => { .then(() => {
// hack to support transition tests // hack to support transition tests
clear_loops(); clear_loops();
@ -142,13 +99,8 @@ describe('runtime', () => {
}; };
}); });
try {
mod = require(`./samples/${dir}/main.svelte`); mod = require(`./samples/${dir}/main.svelte`);
SvelteComponent = mod.default; SvelteComponent = mod.default;
} catch (err) {
showOutput(cwd, compileOptions, compile); // eslint-disable-line no-console
throw err;
}
// Put things we need on window for testing // Put things we need on window for testing
window.SvelteComponent = SvelteComponent; window.SvelteComponent = SvelteComponent;
@ -239,7 +191,6 @@ describe('runtime', () => {
} }
}).catch(err => { }).catch(err => {
failed.add(dir); failed.add(dir);
showOutput(cwd, compileOptions, compile); // eslint-disable-line no-console
throw err; throw err;
}) })
.catch(err => { .catch(err => {
@ -249,10 +200,6 @@ describe('runtime', () => {
throw err; throw err;
}) })
.then(() => { .then(() => {
if (config.show) {
showOutput(cwd, compileOptions, compile);
}
flush(); flush();
if (config.after_test) config.after_test(); if (config.after_test) config.after_test();

@ -1,17 +1,15 @@
import * as fs from 'fs'; import * as fs from 'fs';
import * as path from 'path'; import * as path from 'path';
import glob from 'tiny-glob/sync.js'; import * as register from '../register';
import { import {
assert, assert,
showOutput,
loadConfig, loadConfig,
loadSvelte, loadSvelte,
setupHtmlEqual, setupHtmlEqual,
tryToLoadJson, tryToLoadJson,
cleanRequireCache, cleanRequireCache,
shouldUpdateExpected, shouldUpdateExpected
mkdirp
} from '../helpers'; } from '../helpers';
import { set_current_component } from '../../internal'; import { set_current_component } from '../../internal';
@ -25,11 +23,14 @@ function tryToReadFile(file) {
} }
const sveltePath = process.cwd().split('\\').join('/'); const sveltePath = process.cwd().split('\\').join('/');
let compile = null;
describe('ssr', () => { describe('ssr', () => {
before(() => { before(() => {
compile = loadSvelte(true).compile; register.setCompileOptions({
generate: 'ssr'
});
register.setCompile(loadSvelte(true).compile);
register.setOutputFolderName('ssr');
return setupHtmlEqual(); return setupHtmlEqual();
}); });
@ -46,7 +47,6 @@ describe('ssr', () => {
// add .solo to a sample directory name to only run that test, or // add .solo to a sample directory name to only run that test, or
// .show to always show the output. or both // .show to always show the output. or both
const solo = config.solo || /\.solo/.test(dir); const solo = config.solo || /\.solo/.test(dir);
const show = /\.show/.test(dir);
if (solo && process.env.CI) { if (solo && process.env.CI) {
throw new Error('Forgot to remove `solo: true` from test'); throw new Error('Forgot to remove `solo: true` from test');
@ -131,10 +131,8 @@ describe('ssr', () => {
} }
} }
if (show) showOutput(dir, { generate: 'ssr', format: 'cjs' });
done(); done();
} catch (err) { } catch (err) {
showOutput(dir, { generate: 'ssr', format: 'cjs' });
err.stack += `\n\ncmd-click: ${path.relative(process.cwd(), dir)}/main.svelte`; err.stack += `\n\ncmd-click: ${path.relative(process.cwd(), dir)}/main.svelte`;
done(err); done(err);
} finally { } finally {
@ -163,46 +161,17 @@ describe('ssr', () => {
(config.skip ? it.skip : solo ? it.only : it)(dir, () => { (config.skip ? it.skip : solo ? it.only : it)(dir, () => {
const cwd = path.resolve(`test/${suite}/samples`, dir); const cwd = path.resolve(`test/${suite}/samples`, dir);
cleanRequireCache();
delete global.window; delete global.window;
register.clearRequireCache();
const compileOptions = { register.setCompileOptions({
sveltePath, sveltePath,
...config.compileOptions, ...config.compileOptions,
generate: 'ssr', generate: 'ssr',
format: 'cjs' format: 'cjs'
};
require('../../register')(compileOptions);
glob('**/*.svelte', { cwd }).forEach(file => {
if (file[0] === '_') return;
const dir = `${cwd}/_output/ssr`;
const out = `${dir}/${file.replace(/\.svelte$/, '.js')}`;
if (fs.existsSync(out)) {
fs.unlinkSync(out);
}
mkdirp(dir);
try {
const { js } = compile(
fs.readFileSync(`${cwd}/${file}`, 'utf-8'),
{
...compileOptions,
filename: file
}
);
fs.writeFileSync(out, js.code);
} catch (err) {
// do nothing
}
}); });
register.setOutputFolderName('ssr');
try { try {
if (config.before_test) config.before_test(); if (config.before_test) config.before_test();
@ -222,10 +191,6 @@ describe('ssr', () => {
} }
if (config.after_test) config.after_test(); if (config.after_test) config.after_test();
if (config.show) {
showOutput(cwd, compileOptions);
}
} catch (err) { } catch (err) {
err.stack += `\n\ncmd-click: ${path.relative(process.cwd(), cwd)}/main.svelte`; err.stack += `\n\ncmd-click: ${path.relative(process.cwd(), cwd)}/main.svelte`;
@ -236,7 +201,6 @@ describe('ssr', () => {
assert.equal(err.message, config.error); assert.equal(err.message, config.error);
} }
} else { } else {
showOutput(cwd, compileOptions);
throw err; throw err;
} }
} finally { } finally {

Loading…
Cancel
Save