Added reporting of console.log from editor. Refactored a little.

This commit is contained in:
Oliver Eyton-Williams
2018-07-10 14:59:31 +02:00
committed by Mrugesh Mohapatra
parent eda96e7cad
commit 2529e6533c
3 changed files with 49 additions and 14 deletions

View File

@ -25,6 +25,9 @@ import {
challengeTestsSelector, challengeTestsSelector,
initConsole, initConsole,
updateConsole, updateConsole,
initLogs,
updateLogs,
logsToConsole,
checkChallenge, checkChallenge,
updateTests, updateTests,
disableJSOnError, disableJSOnError,
@ -72,7 +75,13 @@ function executeChallengeEpic(action$, { getState }, { document }) {
filter(Boolean), filter(Boolean),
switchMap(() => { switchMap(() => {
const frameReady = new Subject(); const frameReady = new Subject();
const frameTests = createTestFramer(document, getState, frameReady); const proxyLogger = new Subject();
const frameTests = createTestFramer(
document,
getState,
frameReady,
proxyLogger
);
const challengeResults = frameReady.pipe( const challengeResults = frameReady.pipe(
pluck('checkChallengePayload'), pluck('checkChallengePayload'),
map(checkChallengePayload => ({ map(checkChallengePayload => ({
@ -82,6 +91,7 @@ function executeChallengeEpic(action$, { getState }, { document }) {
switchMap(({ checkChallengePayload, tests }) => { switchMap(({ checkChallengePayload, tests }) => {
const postTests = of( const postTests = of(
updateConsole('// tests completed'), updateConsole('// tests completed'),
logsToConsole('// console output'),
checkChallenge(checkChallengePayload) checkChallenge(checkChallengePayload)
).pipe(delay(250)); ).pipe(delay(250));
return runTestsInTestFrame(document, tests).pipe( return runTestsInTestFrame(document, tests).pipe(
@ -104,23 +114,24 @@ function executeChallengeEpic(action$, { getState }, { document }) {
switchMap(() => { switchMap(() => {
const state = getState(); const state = getState();
const { challengeType } = challengeMetaSelector(state); const { challengeType } = challengeMetaSelector(state);
if (challengeType === backend) { const build =
return buildBackendChallenge(state).pipe( challengeType === backend
tap(frameTests), ? buildBackendChallenge(state)
ignoreElements(), : buildFromFiles(state, true);
startWith(initConsole('// running test')), return build.pipe(
catchError(err => of(disableJSOnError(err)))
);
}
return buildFromFiles(state, false).pipe(
tap(frameTests), tap(frameTests),
ignoreElements(), ignoreElements(),
startWith(initConsole('// running test')), startWith(initLogs()),
startWith(initConsole('// running tests')),
catchError(err => of(disableJSOnError(err))) catchError(err => of(disableJSOnError(err)))
); );
}) })
); );
return merge(buildAndFrameChallenge, challengeResults); return merge(
buildAndFrameChallenge,
challengeResults,
proxyLogger.map(updateLogs)
);
}) })
); );
} }

View File

@ -48,6 +48,7 @@ export const types = createTypes(
'createQuestion', 'createQuestion',
'initTests', 'initTests',
'initConsole', 'initConsole',
'initLogs',
'updateConsole', 'updateConsole',
'updateChallengeMeta', 'updateChallengeMeta',
'updateFile', 'updateFile',
@ -55,6 +56,9 @@ export const types = createTypes(
'updateProjectFormValues', 'updateProjectFormValues',
'updateSuccessMessage', 'updateSuccessMessage',
'updateTests', 'updateTests',
'updateLogs',
'logsToConsole',
'lockCode', 'lockCode',
'unlockCode', 'unlockCode',
@ -95,15 +99,19 @@ export const initTests = createAction(types.initTests);
export const updateTests = createAction(types.updateTests); export const updateTests = createAction(types.updateTests);
export const initConsole = createAction(types.initConsole); export const initConsole = createAction(types.initConsole);
export const initLogs = createAction(types.initLogs);
export const updateChallengeMeta = createAction(types.updateChallengeMeta); export const updateChallengeMeta = createAction(types.updateChallengeMeta);
export const updateFile = createAction(types.updateFile); export const updateFile = createAction(types.updateFile);
export const updateConsole = createAction(types.updateConsole); export const updateConsole = createAction(types.updateConsole);
export const updateLogs = createAction(types.updateLogs);
export const updateJSEnabled = createAction(types.updateJSEnabled); export const updateJSEnabled = createAction(types.updateJSEnabled);
export const updateProjectFormValues = createAction( export const updateProjectFormValues = createAction(
types.updateProjectFormValues types.updateProjectFormValues
); );
export const updateSuccessMessage = createAction(types.updateSuccessMessage); export const updateSuccessMessage = createAction(types.updateSuccessMessage);
export const logsToConsole = createAction(types.logsToConsole);
export const lockCode = createAction(types.lockCode); export const lockCode = createAction(types.lockCode);
export const unlockCode = createAction(types.unlockCode); export const unlockCode = createAction(types.unlockCode);
export const disableJSOnError = createAction(types.disableJSOnError); export const disableJSOnError = createAction(types.disableJSOnError);
@ -174,7 +182,22 @@ export const reducer = handleActions(
...state, ...state,
consoleOut: state.consoleOut + '\n' + payload consoleOut: state.consoleOut + '\n' + payload
}), }),
[types.initLogs]: state => ({
...state,
logsOut: []
}),
[types.updateLogs]: (state, { payload }) => ({
...state,
logsOut: [...state.logsOut, payload]
}),
[types.logsToConsole]: (state, { payload }) => ({
...state,
consoleOut:
state.consoleOut +
(state.logsOut.length
? '\n' + payload + '\n' + state.logsOut.join('\n')
: '')
}),
[types.updateChallengeMeta]: (state, { payload }) => ({ [types.updateChallengeMeta]: (state, { payload }) => ({
...state, ...state,
challengeMeta: { ...payload } challengeMeta: { ...payload }

View File

@ -140,11 +140,12 @@ export const createMainFramer = (document, getState, proxyLogger) =>
writeContentToFrame writeContentToFrame
); );
export const createTestFramer = (document, getState, frameReady) => export const createTestFramer = (document, getState, frameReady, proxyLogger) =>
flow( flow(
createFrame(document, getState, testId), createFrame(document, getState, testId),
mountFrame(document), mountFrame(document),
addDepsToDocument, addDepsToDocument,
writeTestDepsToDocument(frameReady), writeTestDepsToDocument(frameReady),
buildProxyConsole(proxyLogger),
writeContentToFrame writeContentToFrame
); );