import * as assert from 'assert'; import * as fs from 'fs'; import * as path from 'path'; import * as colors from 'kleur'; import { loadConfig, svelte, shouldUpdateExpected } from '../helpers'; describe('js', () => { fs.readdirSync(`${__dirname}/samples`).forEach((dir) => { if (dir[0] === '.') return; // add .solo to a sample directory name to only run that test const solo = /\.solo/.test(dir); if (solo && process.env.CI) { throw new Error('Forgot to remove `solo: true` from test'); } const resolved = path.resolve(`${__dirname}/samples`, dir); if (!fs.existsSync(`${resolved}/input.svelte`)) { console.log( colors .red() .bold( `Missing file ${dir}/input.svelte. If you recently switched branches you may need to delete this directory` ) ); return; } (solo ? it.only : it)(dir, () => { const config = loadConfig(`${resolved}/_config.js`); const input = fs .readFileSync(`${resolved}/input.svelte`, 'utf-8') .replace(/\s+$/, '') .replace(/\r/g, ''); let actual; 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' ); } catch (err) { console.log(err.frame); throw err; } const output = `${resolved}/_actual.js`; fs.writeFileSync(output, actual); const expectedPath = `${resolved}/expected.js`; let expected = ''; try { expected = fs.readFileSync(expectedPath, 'utf-8'); } catch (error) { console.log(error); if (error.code === 'ENOENT') { // missing expected.js fs.writeFileSync(expectedPath, actual); } } try { assert.equal( actual .trim() .replace(/^[ \t]+$/gm, '') .replace(/\r/g, ''), expected .trim() .replace(/^[ \t]+$/gm, '') .replace(/\r/g, '') ); } catch (error) { if (shouldUpdateExpected()) { fs.writeFileSync(expectedPath, actual); console.log(`Updated ${expectedPath}.`); } else { throw error; } } }); }); });