From 26f673f30d145f2d5d14e308dc886772e83a8074 Mon Sep 17 00:00:00 2001 From: tophf Date: Tue, 10 Jul 2018 10:55:16 +0300 Subject: [PATCH] move linter worker loaders to edit/ --- .../csslint => edit}/csslint-loader.js | 8 ++- edit/lint.js | 4 +- edit/stylelint-loader.js | 58 +++++++++++++++++++ js/usercss.js | 2 +- 4 files changed, 66 insertions(+), 6 deletions(-) rename {vendor-overwrites/csslint => edit}/csslint-loader.js (81%) create mode 100644 edit/stylelint-loader.js diff --git a/vendor-overwrites/csslint/csslint-loader.js b/edit/csslint-loader.js similarity index 81% rename from vendor-overwrites/csslint/csslint-loader.js rename to edit/csslint-loader.js index 54776d57..dfe7811f 100644 --- a/vendor-overwrites/csslint/csslint-loader.js +++ b/edit/csslint-loader.js @@ -1,7 +1,9 @@ -/* global parserlib CSSLint parseMozFormat */ +/* global importScripts parserlib CSSLint parseMozFormat */ 'use strict'; -self.importScripts('./parserlib.js'); +const CSSLINT_PATH = '/vendor-overwrites/csslint/'; +importScripts(CSSLINT_PATH + 'parserlib.js'); + parserlib.css.Tokens[parserlib.css.Tokens.COMMENT].hide = false; self.onmessage = ({data}) => { @@ -14,7 +16,7 @@ self.onmessage = ({data}) => { return; } - if (!self.CSSLint) self.importScripts('./csslint.js'); + if (!self.CSSLint) self.importScripts(CSSLINT_PATH + 'csslint.js'); switch (action) { case 'getAllRuleIds': diff --git a/edit/lint.js b/edit/lint.js index 87d092e3..d6c64fc2 100644 --- a/edit/lint.js +++ b/edit/lint.js @@ -20,8 +20,8 @@ var linterConfig = { stylelint: 'editorStylelintConfig', }, worker: { - csslint: {path: '/vendor-overwrites/csslint/csslint-loader.js'}, - stylelint: {path: '/vendor-overwrites/stylelint/stylelint-bundle.min.js'}, + csslint: {path: '/edit/csslint-loader.js'}, + stylelint: {path: '/edit/stylelint-loader.js'}, }, allRuleIds: { csslint: null, diff --git a/edit/stylelint-loader.js b/edit/stylelint-loader.js new file mode 100644 index 00000000..d7ac7c9a --- /dev/null +++ b/edit/stylelint-loader.js @@ -0,0 +1,58 @@ +/* global require importScripts */ +'use strict'; + +importScripts('/vendor/stylelint-bundle/stylelint-bundle.min.js'); + +const stylelint = require('stylelint'); + +self.onmessage = ({data: {action = 'run', code, config}}) => { + switch (action) { + case 'getAllRuleIds': + // the functions are non-tranferable + self.postMessage(Object.keys(stylelint.rules)); + return; + case 'getAllRuleOptions': + self.postMessage(getAllRuleOptions()); + return; + case 'run': + stylelint.lint({code, config}).then(results => + self.postMessage(results)); + return; + } +}; + +function getAllRuleOptions() { + const options = {}; + const rxPossible = /\bpossible:("(?:[^"]*?)"|\[(?:[^\]]*?)\]|\{(?:[^}]*?)\})/g; + const rxString = /"([-\w\s]{3,}?)"/g; + for (const id of Object.keys(stylelint.rules)) { + const ruleCode = String(stylelint.rules[id]); + const sets = []; + let m, mStr; + while ((m = rxPossible.exec(ruleCode))) { + const possible = m[1]; + const set = []; + while ((mStr = rxString.exec(possible))) { + const s = mStr[1]; + if (s.includes(' ')) { + set.push(...s.split(/\s+/)); + } else { + set.push(s); + } + } + if (possible.includes('ignoreAtRules')) { + set.push('ignoreAtRules'); + } + if (possible.includes('ignoreShorthands')) { + set.push('ignoreShorthands'); + } + if (set.length) { + sets.push(set); + } + } + if (sets.length) { + options[id] = sets; + } + } + return options; +} diff --git a/js/usercss.js b/js/usercss.js index 6c676187..072bbe68 100644 --- a/js/usercss.js +++ b/js/usercss.js @@ -600,7 +600,7 @@ var usercss = (() => { function invokeWorker(message) { if (!worker.queue) { - worker.instance = new Worker('/vendor-overwrites/csslint/csslint-loader.js'); + worker.instance = new Worker('/edit/csslint-loader.js'); worker.queue = []; worker.instance.onmessage = ({data}) => { worker.queue.shift().resolve(data.__ERROR__ ? Promise.reject(data.__ERROR__) : data);