Files
freeCodeCamp/client/src/templates/Challenges/utils/build.js

95 lines
2.3 KiB
JavaScript
Raw Normal View History

2019-01-09 03:23:17 +03:00
import { transformers } from '../rechallenge/transformers';
import { cssToHtml, jsToHtml, concatHtml } from '../rechallenge/builders.js';
2018-12-29 11:34:03 +03:00
const frameRunner = [
{
src: '/js/frame-runner.js'
}
];
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;
} 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-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;
}
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];
const pipeLine = composeFunctions(...transformers, ...toHtml);
2018-12-29 11:34:03 +03:00
const finalFiles = Object.keys(files)
.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)
}));
}
export function buildJSChallenge(files) {
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
}
export function buildBackendChallenge(formValues) {
const {
solution: { value: url }
} = formValues;
return {
2019-01-09 03:23:17 +03:00
build: concatHtml({ required: frameRunner }),
sources: { url }
};
}