2018-01-19 19:03:17 +00:00
|
|
|
/* eslint-disable no-eval, no-process-exit */
|
|
|
|
import fs from 'fs-extra';
|
|
|
|
import path from 'path';
|
|
|
|
import browserify from 'browserify';
|
|
|
|
import getChallenges from './getChallenges';
|
|
|
|
import {UnpackedChallenge, ChallengeFile} from './unpackedChallenge';
|
|
|
|
|
|
|
|
// Unpack all challenges
|
|
|
|
// from all seed/challenges/00-foo/bar.json files
|
|
|
|
// into seed/unpacked/00-foo/bar/000-id.html files
|
|
|
|
//
|
|
|
|
// todo: unpack translations too
|
|
|
|
// todo: use common/app/routes/Challenges/utils/index.js:15 maps
|
|
|
|
// to determine format/style for non-JS tests
|
|
|
|
// todo: figure out embedded images etc. served from elsewhere in the project
|
|
|
|
// todo: prettier/clearer CSS
|
|
|
|
|
2018-03-26 18:20:54 +00:00
|
|
|
let unpackedDir = path.join(__dirname, 'unpacked');
|
|
|
|
|
2018-01-19 19:03:17 +00:00
|
|
|
// bundle up the test-running JS
|
|
|
|
function createUnpackedBundle() {
|
2018-03-23 19:53:59 +00:00
|
|
|
fs.mkdirp(unpackedDir, (err) => {
|
|
|
|
if (err && err.code !== 'EEXIST') {
|
|
|
|
console.log(err);
|
|
|
|
throw err;
|
|
|
|
}
|
|
|
|
|
|
|
|
let unpackedFile = path.join(__dirname, 'unpacked.js');
|
|
|
|
let b = browserify(unpackedFile).bundle();
|
|
|
|
b.on('error', console.error);
|
|
|
|
let unpackedBundleFile =
|
|
|
|
path.join(unpackedDir, 'unpacked-bundle.js');
|
|
|
|
const bundleFileStream = fs.createWriteStream(unpackedBundleFile);
|
|
|
|
bundleFileStream.on('finish', () => {
|
|
|
|
console.log('Wrote bundled JS into ' + unpackedBundleFile);
|
|
|
|
});
|
|
|
|
bundleFileStream.on('pipe', () => {
|
|
|
|
console.log('Writing bundled JS...');
|
|
|
|
});
|
|
|
|
bundleFileStream.on('error', console.error);
|
|
|
|
b.pipe(bundleFileStream);
|
|
|
|
// bundleFileStream.end(); // do not do this prematurely!
|
2018-01-19 19:03:17 +00:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
let currentlyUnpackingDir = null;
|
|
|
|
|
2018-03-26 18:20:54 +00:00
|
|
|
async function cleanUnpackedDir(unpackedChallengeBlockDir) {
|
|
|
|
let promiseToDelete = function(filePath) {
|
|
|
|
filePath = path.join(unpackedChallengeBlockDir, filePath);
|
|
|
|
return new Promise(() => fs.unlink(filePath));
|
|
|
|
};
|
|
|
|
let promises = fs.readdirSync(unpackedChallengeBlockDir)
|
|
|
|
.filter(filePath => (/\.html$/i).test(filePath))
|
|
|
|
.map(promiseToDelete);
|
|
|
|
await Promise.all(promises);
|
|
|
|
}
|
|
|
|
|
2018-01-19 19:03:17 +00:00
|
|
|
function unpackChallengeBlock(challengeBlock) {
|
|
|
|
let challengeBlockPath = path.parse(challengeBlock.fileName);
|
|
|
|
let unpackedChallengeBlockDir = path.join(
|
2018-03-26 18:20:54 +00:00
|
|
|
unpackedDir,
|
2018-01-19 19:03:17 +00:00
|
|
|
challengeBlockPath.dir,
|
|
|
|
challengeBlockPath.name
|
|
|
|
);
|
2018-03-26 18:20:54 +00:00
|
|
|
|
2018-01-19 19:03:17 +00:00
|
|
|
fs.mkdirp(unpackedChallengeBlockDir, (err) => {
|
|
|
|
if (err && err.code !== 'EEXIST') {
|
|
|
|
console.log(err);
|
|
|
|
throw err;
|
|
|
|
}
|
|
|
|
|
2018-03-26 18:20:54 +00:00
|
|
|
// remove existing unpacked files
|
|
|
|
cleanUnpackedDir(unpackedChallengeBlockDir);
|
|
|
|
|
2018-01-19 19:03:17 +00:00
|
|
|
if (currentlyUnpackingDir !== challengeBlockPath.dir) {
|
|
|
|
currentlyUnpackingDir = challengeBlockPath.dir;
|
|
|
|
console.log(`Unpacking into ${currentlyUnpackingDir}:`);
|
|
|
|
}
|
|
|
|
console.log(` ${challengeBlock.name}`);
|
|
|
|
|
|
|
|
// write a copy of the challenge block into unpacked dir
|
|
|
|
delete challengeBlock.fileName;
|
|
|
|
delete challengeBlock.superBlock;
|
|
|
|
delete challengeBlock.superOrder;
|
|
|
|
let challengeBlockCopy =
|
|
|
|
new ChallengeFile(
|
|
|
|
unpackedChallengeBlockDir,
|
|
|
|
challengeBlockPath.name,
|
|
|
|
'.json');
|
|
|
|
challengeBlockCopy.write(JSON.stringify(challengeBlock, null, 2));
|
|
|
|
|
|
|
|
// unpack each challenge into an HTML file
|
|
|
|
let index = 0;
|
|
|
|
challengeBlock.challenges.forEach(challenge => {
|
|
|
|
new UnpackedChallenge(
|
|
|
|
unpackedChallengeBlockDir,
|
|
|
|
challenge,
|
|
|
|
index
|
|
|
|
).unpack();
|
|
|
|
index += 1;
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
createUnpackedBundle();
|
|
|
|
let challenges = getChallenges();
|
|
|
|
challenges.forEach(challengeBlock => {
|
|
|
|
unpackChallengeBlock(challengeBlock);
|
|
|
|
});
|