stylus/edit/editor-worker-body.js
2018-08-31 20:00:21 +08:00

78 lines
1.7 KiB
JavaScript

/* global importScripts parseMozFormat parserlib CSSLint */
'use strict';
const loadScript = createLoadScript();
const loadParserLib = createLoadParserLib();
createAPI({
csslint: (code, config) => {
loadParserLib();
loadScript(['/vendor-overwrites/csslint/csslint.js']);
return CSSLint.verify(code, config).messages
.map(m => Object.assign(m, {rule: {id: m.rule.id}}));
},
stylelint: () => {
},
parseMozFormat: data => {
loadParserLib();
loadScript(['/js/moz-parser.js']);
return parseMozFormat(data);
}
});
function createLoadParserLib() {
let loaded = false;
return () => {
if (loaded) {
return;
}
importScripts('/vendor-overwrites/csslint/parserlib.js');
parserlib.css.Tokens[parserlib.css.Tokens.COMMENT].hide = false;
loaded = true;
};
}
function createLoadScript() {
const loaded = new Set();
return urls => {
urls = urls.filter(u => !loaded.has(u));
importScripts(...urls);
urls.forEach(u => loaded.add(u));
};
}
function createAPI(methods) {
self.onmessage = e => {
const message = e.data;
Promise.resolve()
.then(() => methods[message.action](...message.args))
.then(result =>
({
requestId: message.requestId,
error: false,
data: result
})
)
.catch(err =>
({
requestId: message.requestId,
error: true,
data: cloneError(err)
})
)
.then(data => self.postMessage(data));
};
}
function cloneError(err) {
return Object.assign({
name: err.name,
stack: err.stack,
message: err.message,
lineNumber: err.lineNumber,
columnNumber: err.columnNumber,
fileName: err.fileName
}, err);
}