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:
@@ -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);
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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>
|
||||||
|
@@ -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
|
||||||
)}
|
)}
|
||||||
|
@@ -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
|
|
||||||
}]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user