2019-01-09 03:23:17 +03:00
|
|
|
import { transformers } from '../rechallenge/transformers';
|
2018-09-30 11:37:19 +01:00
|
|
|
import { cssToHtml, jsToHtml, concatHtml } from '../rechallenge/builders.js';
|
|
|
|
|
2018-12-29 11:34:03 +03:00
|
|
|
const frameRunner = [
|
|
|
|
{
|
|
|
|
src: '/js/frame-runner.js'
|
|
|
|
}
|
|
|
|
];
|
2018-09-30 11:37:19 +01:00
|
|
|
|
|
|
|
const globalRequires = [
|
|
|
|
{
|
|
|
|
link:
|
|
|
|
'https://cdnjs.cloudflare.com/' +
|
|
|
|
'ajax/libs/normalize/4.2.0/normalize.min.css'
|
|
|
|
}
|
|
|
|
];
|
|
|
|
|
2018-12-29 16:42:09 +03:00
|
|
|
const applyFunction = fn =>
|
|
|
|
async function(file) {
|
|
|
|
try {
|
|
|
|
if (file.error) {
|
|
|
|
return file;
|
|
|
|
}
|
|
|
|
const newFile = await fn.call(this, file);
|
|
|
|
if (typeof newFile !== 'undefined') {
|
|
|
|
return newFile;
|
2018-10-06 02:36:38 +03:00
|
|
|
}
|
2018-12-29 16:42:09 +03:00
|
|
|
return file;
|
2019-01-15 17:18:56 +03:00
|
|
|
} catch (error) {
|
|
|
|
return { ...file, error };
|
2018-10-06 02:36:38 +03:00
|
|
|
}
|
2019-01-09 03:23:17 +03:00
|
|
|
};
|
2018-10-06 02:36:38 +03:00
|
|
|
|
2018-12-29 16:42:09 +03:00
|
|
|
const composeFunctions = (...fns) =>
|
2019-01-09 03:23:17 +03:00
|
|
|
fns.map(applyFunction).reduce((f, g) => x => f(x).then(g));
|
2018-09-30 11:37:19 +01:00
|
|
|
|
2018-12-29 11:34:03 +03:00
|
|
|
function buildSourceMap(files) {
|
|
|
|
return files.reduce((sources, file) => {
|
|
|
|
sources[file.name] = file.source || file.contents;
|
|
|
|
return sources;
|
|
|
|
}, {});
|
|
|
|
}
|
|
|
|
|
2019-01-09 03:23:17 +03:00
|
|
|
function checkFilesErrors(files) {
|
|
|
|
const errors = files.filter(({ error }) => error).map(({ error }) => error);
|
|
|
|
if (errors.length) {
|
|
|
|
throw errors;
|
|
|
|
}
|
|
|
|
return files;
|
|
|
|
}
|
|
|
|
|
2019-01-12 03:37:00 +03:00
|
|
|
export function buildDOMChallenge(files, meta = {}) {
|
|
|
|
const { required = [], template = '' } = meta;
|
2018-12-29 11:34:03 +03:00
|
|
|
const finalRequires = [...globalRequires, ...required, ...frameRunner];
|
2018-12-29 16:42:09 +03:00
|
|
|
const toHtml = [jsToHtml, cssToHtml];
|
2019-01-15 17:18:56 +03:00
|
|
|
const pipeLine = composeFunctions(...transformers, ...toHtml);
|
2018-12-29 11:34:03 +03:00
|
|
|
const finalFiles = Object.keys(files)
|
2018-09-30 11:37:19 +01:00
|
|
|
.map(key => files[key])
|
2018-12-29 11:34:03 +03:00
|
|
|
.map(pipeLine);
|
2019-01-09 03:23:17 +03:00
|
|
|
return Promise.all(finalFiles)
|
|
|
|
.then(checkFilesErrors)
|
|
|
|
.then(files => ({
|
|
|
|
build: concatHtml({ required: finalRequires, template, files }),
|
|
|
|
sources: buildSourceMap(files)
|
|
|
|
}));
|
2018-09-30 11:37:19 +01:00
|
|
|
}
|
|
|
|
|
2019-01-12 03:37:00 +03:00
|
|
|
export function buildJSChallenge(files) {
|
2019-01-15 17:18:56 +03:00
|
|
|
const pipeLine = composeFunctions(...transformers);
|
2018-11-26 02:17:38 +03:00
|
|
|
const finalFiles = Object.keys(files)
|
|
|
|
.map(key => files[key])
|
|
|
|
.map(pipeLine);
|
2019-01-09 03:23:17 +03:00
|
|
|
return Promise.all(finalFiles)
|
|
|
|
.then(checkFilesErrors)
|
|
|
|
.then(files => ({
|
|
|
|
build: files
|
|
|
|
.reduce(
|
|
|
|
(body, file) => [...body, file.head, file.contents, file.tail],
|
|
|
|
[]
|
|
|
|
)
|
|
|
|
.join('\n'),
|
|
|
|
sources: buildSourceMap(files)
|
|
|
|
}));
|
2018-11-26 02:17:38 +03:00
|
|
|
}
|
|
|
|
|
2019-01-12 03:37:00 +03:00
|
|
|
export function buildBackendChallenge(formValues) {
|
2018-09-30 11:37:19 +01:00
|
|
|
const {
|
|
|
|
solution: { value: url }
|
2019-01-12 03:37:00 +03:00
|
|
|
} = formValues;
|
2018-12-10 10:00:26 +03:00
|
|
|
return {
|
2019-01-09 03:23:17 +03:00
|
|
|
build: concatHtml({ required: frameRunner }),
|
2018-12-10 10:00:26 +03:00
|
|
|
sources: { url }
|
|
|
|
};
|
2018-09-30 11:37:19 +01:00
|
|
|
}
|