1
0
mirror of https://github.com/chinchang/web-maker.git synced 2025-07-29 17:50:09 +02:00

port showErrors

This commit is contained in:
Kushagra Gour
2018-06-09 19:00:26 +05:30
parent ae675ef985
commit 212269e23d
5 changed files with 206 additions and 78 deletions

View File

@@ -134,6 +134,21 @@ export default class ContentWrap extends Component {
}); });
} }
} }
cleanupErrors(lang) {
this.cm[lang].clearGutter('error-gutter');
}
showErrors(lang, errors) {
var editor = this.cm[lang];
errors.forEach(function(e) {
editor.operation(function() {
var n = document.createElement('div');
n.setAttribute('data-title', e.message);
n.classList.add('gutter-error-marker');
editor.setGutterMarker(e.lineNumber, 'error-gutter', n);
});
});
}
/** /**
* Generates the preview from the current code. * Generates the preview from the current code.
@@ -148,6 +163,9 @@ export default class ContentWrap extends Component {
if (!this.props.prefs.preserveConsoleLogs) { if (!this.props.prefs.preserveConsoleLogs) {
this.clearConsole(); this.clearConsole();
} }
this.cleanupErrors('html');
this.cleanupErrors('css');
this.cleanupErrors('js');
var currentCode = { var currentCode = {
html: this.cmCodes.html, html: this.cmCodes.html,
@@ -171,12 +189,15 @@ export default class ContentWrap extends Component {
cssMode === CssModes.ACSS ? currentCode.html : currentCode.css, cssMode === CssModes.ACSS ? currentCode.html : currentCode.css,
cssMode, cssMode,
this.props.currentItem.cssSettings this.props.currentItem.cssSettings
).then(function(css) { ).then(result => {
this.cm.css.setValue(css); if (cssMode === CssModes.ACSS) {
this.cm.css.setValue(result.code || '');
}
if (targetFrame.contentDocument.querySelector('#webmakerstyle')) { if (targetFrame.contentDocument.querySelector('#webmakerstyle')) {
targetFrame.contentDocument.querySelector( targetFrame.contentDocument.querySelector(
'#webmakerstyle' '#webmakerstyle'
).textContent = css; ).textContent =
result.code || '';
} }
}); });
} else { } else {
@@ -189,12 +210,27 @@ export default class ContentWrap extends Component {
cssMode, cssMode,
this.props.currentItem.cssSettings this.props.currentItem.cssSettings
); );
var jsPromise = computeJs(currentCode.js, this.props.currentItem.jsMode); var jsPromise = computeJs(
currentCode.js,
this.props.currentItem.jsMode,
true,
this.props.prefs.infiniteLoopTimeout
);
Promise.all([htmlPromise, cssPromise, jsPromise]).then(result => { Promise.all([htmlPromise, cssPromise, jsPromise]).then(result => {
if (result[1]) { if (cssMode === CssModes.ACSS) {
this.cm.css.setValue(result[1]); this.cm.css.setValue(result[1].code || '');
} }
this.createPreviewFile(result[0], result[1], result[2]);
this.createPreviewFile(
result[0].code || '',
result[1].code || '',
result[2].code || ''
);
result.forEach(result => {
if (result.errors) {
this.showErrors(result.errors.lang, result.errors.data);
}
});
}); });
} }

View File

@@ -9,6 +9,18 @@ export default class Login extends Component {
trackEvent('ui', 'loginProviderClick', provider); trackEvent('ui', 'loginProviderClick', provider);
auth.login(provider); auth.login(provider);
} }
componentDidMount() {
window.db.local.get(
{
lastAuthProvider: ''
},
result => {
if (result.lastAuthProvider) {
document.body.classList.add(`last-login-${result.lastAuthProvider}`);
}
}
);
}
render() { render() {
return ( return (
<div> <div>

View File

@@ -202,7 +202,7 @@ export default class App extends Component {
semverCompare(lastSeenVersion, version) === -1 && semverCompare(lastSeenVersion, version) === -1 &&
!window.localStorage.pledgeModalSeen !window.localStorage.pledgeModalSeen
) { ) {
scope.openSupportDeveloperModal(); this.openSupportDeveloperModal();
window.localStorage.pledgeModalSeen = true; window.localStorage.pledgeModalSeen = true;
} }
@@ -846,6 +846,18 @@ export default class App extends Component {
}); });
e.preventDefault(); e.preventDefault();
} }
openSupportDeveloperModal(e) {
// this.closeAllModals();
this.setState({
isSupportDeveloperModalOpen: true
});
if (e) {
trackEvent('ui', e.target.dataset.eventAction);
}
}
supportDeveloperBtnClickHandler(e) {
this.openSupportDeveloperModal(e);
}
render() { render() {
return ( return (
@@ -886,11 +898,9 @@ export default class App extends Component {
notificationsBtnClickHandler={() => notificationsBtnClickHandler={() =>
this.setState({ notificationsBtnClickHandler: true }) this.setState({ notificationsBtnClickHandler: true })
} }
supportDeveloperBtnClickHandler={() => supportDeveloperBtnClickHandler={this.supportDeveloperBtnClickHandler.bind(
this.setState({ this
isSupportDeveloperModalOpen: true )}
})
}
detachedPreviewBtnHandler={this.detachedPreviewBtnHandler.bind( detachedPreviewBtnHandler={this.detachedPreviewBtnHandler.bind(
this this
)} )}

View File

@@ -1,32 +1,49 @@
import { import {
deferred deferred
} from './deferred'; } from './deferred';
import {
addInfiniteLoopProtection
} from './utils';
import { import {
HtmlModes, HtmlModes,
CssModes, CssModes,
JsModes JsModes
} from './codeModes'; } from './codeModes';
const esprima = require('esprima');
// computeHtml, computeCss & computeJs evaluate the final code according // computeHtml, computeCss & computeJs evaluate the final code according
// to whatever mode is selected and resolve the returned promise with the code. // to whatever mode is selected and resolve the returned promise with the code.
export function computeHtml(code, mode) { export function computeHtml(code, mode) {
var d = deferred(); var d = deferred();
if (mode === HtmlModes.HTML) { if (mode === HtmlModes.HTML) {
d.resolve(code); d.resolve({
code
});
} else if (mode === HtmlModes.MARKDOWN) { } else if (mode === HtmlModes.MARKDOWN) {
d.resolve(window.marked ? marked(code) : code); d.resolve(window.marked ? {
code: marked(code)
} : {
code
});
} else if (mode === HtmlModes.JADE) { } else if (mode === HtmlModes.JADE) {
d.resolve(window.jade ? jade.render(code) : code); d.resolve(window.jade ? {
code: jade.render(code)
} : {
code
});
} }
return d.promise; return d.promise;
} }
export function computeCss(code, mode, settings) { export function computeCss(code, mode, settings) {
var d = deferred(); var d = deferred();
// cleanupErrors('css'); var errors;
if (mode === CssModes.CSS) { if (mode === CssModes.CSS) {
d.resolve(code); d.resolve({
code
});
} else if (mode === CssModes.SCSS || mode === CssModes.SASS) { } else if (mode === CssModes.SCSS || mode === CssModes.SASS) {
if (window.sass && code) { if (window.sass && code) {
window.sass.compile( window.sass.compile(
@@ -36,27 +53,44 @@ export function computeCss(code, mode, settings) {
function (result) { function (result) {
// Something was wrong // Something was wrong
if (result.line && result.message) { if (result.line && result.message) {
showErrors('css', [{ errors = {
lang: 'css',
data: [{
lineNumber: result.line - 1, lineNumber: result.line - 1,
message: result.message message: result.message
}]); }]
};
} }
d.resolve(result.text); d.resolve({
code: result.text,
errors
});
} }
); );
} else { } else {
d.resolve(code); d.resolve({
code
});
} }
} else if (mode === CssModes.LESS) { } else if (mode === CssModes.LESS) {
less.render(code).then( less.render(code).then(
function (result) { function (result) {
d.resolve(result.css); d.resolve({
code: result.css
});
}, },
function (error) { function (error) {
showErrors('css', [{ errors = {
lang: 'css',
data: [{
lineNumber: error.line, lineNumber: error.line,
message: error.message message: error.message
}]); }]
};
d.resolve({
code: '',
errors
})
} }
); );
} else if (mode === CssModes.STYLUS) { } else if (mode === CssModes.STYLUS) {
@@ -66,16 +100,24 @@ export function computeCss(code, mode, settings) {
// Last line of message is the actual message // Last line of message is the actual message
var tempArr = error.message.split('\n'); var tempArr = error.message.split('\n');
tempArr.pop(); // This is empty string in the end tempArr.pop(); // This is empty string in the end
showErrors('css', [{ errors = {
lang: 'css',
data: [{
lineNumber: +error.message.match(/stylus:(\d+):/)[1] - 298, lineNumber: +error.message.match(/stylus:(\d+):/)[1] - 298,
message: tempArr.pop() message: tempArr.pop()
}]); }]
};
} }
d.resolve(result); d.resolve({
code: result,
errors
});
}); });
} else if (mode === CssModes.ACSS) { } else if (mode === CssModes.ACSS) {
if (!window.atomizer) { if (!window.atomizer) {
d.resolve(''); d.resolve({
code: ''
});
} else { } else {
const html = code; const html = code;
const foundClasses = atomizer.findClassNames(html); const foundClasses = atomizer.findClassNames(html);
@@ -89,41 +131,50 @@ export function computeCss(code, mode, settings) {
finalConfig = atomizer.getConfig(foundClasses, {}); finalConfig = atomizer.getConfig(foundClasses, {});
} }
const acss = atomizer.getCss(finalConfig); const acss = atomizer.getCss(finalConfig);
d.resolve(acss); d.resolve({
code: acss
});
} }
} }
return d.promise; return d.promise;
} }
export function computeJs(code, mode, shouldPreventInfiniteLoops) {
var d = deferred();
// cleanupErrors('js'); export function computeJs(code, mode, shouldPreventInfiniteLoops, infiniteLoopTimeout) {
var d = deferred();
var errors;
if (!code) { if (!code) {
d.resolve(''); d.resolve('');
return d.promise; return d.promise;
} }
if (mode === JsModes.JS) { if (mode === JsModes.JS) {
d.resolve(code);
return d.promise;
try { try {
esprima.parse(code, { esprima.parse(code, {
tolerant: true tolerant: true
}); });
} catch (e) { } catch (e) {
showErrors('js', [{ errors = {
lang: 'js',
data: [{
lineNumber: e.lineNumber - 1, lineNumber: e.lineNumber - 1,
message: e.description message: e.description
}]); }]
};
} finally { } finally {
if (shouldPreventInfiniteLoops !== false) { if (shouldPreventInfiniteLoops !== false) {
code = utils.addInfiniteLoopProtection(code, { // If errors are found in last parse, we don't run infinite loop
timeout: prefs.infiniteLoopTimeout // protection otherwise it will again throw error.
code = errors ? code : addInfiniteLoopProtection(code, {
timeout: infiniteLoopTimeout
}); });
} }
d.resolve(code);
d.resolve({
code,
errors
});
} }
} else if (mode === JsModes.COFFEESCRIPT) { } else if (mode === JsModes.COFFEESCRIPT) {
if (!window.CoffeeScript) { if (!window.CoffeeScript) {
@@ -135,17 +186,23 @@ export function computeJs(code, mode, shouldPreventInfiniteLoops) {
bare: true bare: true
}); });
} catch (e) { } catch (e) {
showErrors('js', [{ errors = {
lang: 'js',
data: [{
lineNumber: e.location.first_line, lineNumber: e.location.first_line,
message: e.message message: e.message
}]); }]
};
} finally { } finally {
if (shouldPreventInfiniteLoops !== false) { if (shouldPreventInfiniteLoops !== false) {
code = utils.addInfiniteLoopProtection(code, { code = errors ? code : addInfiniteLoopProtection(code, {
timeout: prefs.infiniteLoopTimeout timeout: infiniteLoopTimeout
}); });
} }
d.resolve(code); d.resolve({
code,
errors
});
} }
} else if (mode === JsModes.ES6) { } else if (mode === JsModes.ES6) {
if (!window.Babel) { if (!window.Babel) {
@@ -158,25 +215,33 @@ export function computeJs(code, mode, shouldPreventInfiniteLoops) {
jsx: true jsx: true
}); });
} catch (e) { } catch (e) {
showErrors('js', [{ errors = {
lang: 'js',
data: [{
lineNumber: e.lineNumber - 1, lineNumber: e.lineNumber - 1,
message: e.description message: e.description
}]); }]
};
} finally { } finally {
code = Babel.transform(code, { code = Babel.transform(code, {
presets: ['latest', 'stage-2', 'react'] presets: ['latest', 'stage-2', 'react']
}).code; }).code;
if (shouldPreventInfiniteLoops !== false) { if (shouldPreventInfiniteLoops !== false) {
code = utils.addInfiniteLoopProtection(code, { code = errors ? code : addInfiniteLoopProtection(code, {
timeout: prefs.infiniteLoopTimeout timeout: infiniteLoopTimeout
}); });
} }
d.resolve(code); d.resolve({
code,
errors
});
} }
} else if (mode === JsModes.TS) { } else if (mode === JsModes.TS) {
try { try {
if (!window.ts) { if (!window.ts) {
d.resolve(''); d.resolve({
code: ''
});
return d.promise; return d.promise;
} }
code = ts.transpileModule(code, { code = ts.transpileModule(code, {
@@ -189,25 +254,29 @@ export function computeJs(code, mode, shouldPreventInfiniteLoops) {
}); });
if (code.diagnostics.length) { if (code.diagnostics.length) {
/* eslint-disable no-throw-literal */ /* eslint-disable no-throw-literal */
throw { errors = {
description: code.diagnostics[0].messageText, lang: 'js',
data: [{
message: code.diagnostics[0].messageText,
lineNumber: ts.getLineOfLocalPosition( lineNumber: ts.getLineOfLocalPosition(
code.diagnostics[0].file, code.diagnostics[0].file,
code.diagnostics[0].start code.diagnostics[0].start
) ) - 1
}]
}; };
} }
if (shouldPreventInfiniteLoops !== false) { code = code.outputText;
code = utils.addInfiniteLoopProtection(code.outputText, { if (shouldPreventInfiniteLoops !== false && !errors) {
timeout: prefs.infiniteLoopTimeout code = addInfiniteLoopProtection(code, {
timeout: infiniteLoopTimeout
}); });
} }
d.resolve(code); d.resolve({
code,
errors
});
} catch (e) { } catch (e) {
showErrors('js', [{
lineNumber: e.lineNumber - 1,
message: e.description
}]);
} }
} }

View File

@@ -13,6 +13,7 @@ import {
import { import {
deferred deferred
} from './deferred'; } from './deferred';
const esprima = require('esprima');
window.DEBUG = document.cookie.indexOf('wmdebug') > -1; window.DEBUG = document.cookie.indexOf('wmdebug') > -1;
window.$ = document.querySelector.bind(document); window.$ = document.querySelector.bind(document);