From 4db8a9ea9a3e7fc335319071b1b3ac26249ec66d Mon Sep 17 00:00:00 2001 From: eight Date: Wed, 7 Nov 2018 19:33:14 +0800 Subject: [PATCH 1/3] Fix: output codemirror themes to a separated file (#538) --- edit.html | 1 + edit/codemirror-themes.js | 61 +++++++++++++++++++++++++++++++ edit/edit.js | 60 +----------------------------- package.json | 3 +- tools/update-codemirror-themes.js | 23 +++++------- 5 files changed, 75 insertions(+), 73 deletions(-) create mode 100644 edit/codemirror-themes.js diff --git a/edit.html b/edit.html index 7b7a10dd..c064d89f 100644 --- a/edit.html +++ b/edit.html @@ -92,6 +92,7 @@ + diff --git a/edit/codemirror-themes.js b/edit/codemirror-themes.js new file mode 100644 index 00000000..f0501a4d --- /dev/null +++ b/edit/codemirror-themes.js @@ -0,0 +1,61 @@ +/* exported CODEMIRROR_THEMES */ +// this file is generated by update-codemirror-themes.js +'use strict'; + +const CODEMIRROR_THEMES = [ + '3024-day', + '3024-night', + 'abcdef', + 'ambiance', + 'ambiance-mobile', + 'base16-dark', + 'base16-light', + 'bespin', + 'blackboard', + 'cobalt', + 'colorforth', + 'darcula', + 'dracula', + 'duotone-dark', + 'duotone-light', + 'eclipse', + 'elegant', + 'erlang-dark', + 'gruvbox-dark', + 'hopscotch', + 'icecoder', + 'idea', + 'isotope', + 'lesser-dark', + 'liquibyte', + 'lucario', + 'material', + 'mbo', + 'mdn-like', + 'midnight', + 'monokai', + 'neat', + 'neo', + 'night', + 'oceanic-next', + 'panda-syntax', + 'paraiso-dark', + 'paraiso-light', + 'pastel-on-dark', + 'railscasts', + 'rubyblue', + 'seti', + 'shadowfox', + 'solarized', + 'ssms', + 'the-matrix', + 'tomorrow-night-bright', + 'tomorrow-night-eighties', + 'ttcn', + 'twilight', + 'vibrant-ink', + 'xq-dark', + 'xq-light', + 'yeti', + 'zenburn' +]; diff --git a/edit/edit.js b/edit/edit.js index f28ab59d..8551381a 100644 --- a/edit/edit.js +++ b/edit/edit.js @@ -2,7 +2,7 @@ createSourceEditor queryTabs sessionStorageHash getOwnTab FIREFOX API tryCatch closeCurrentTab messageBox debounce workerUtil beautify ignoreChromeError - moveFocus msg createSectionsEditor rerouteHotkeys */ + moveFocus msg createSectionsEditor rerouteHotkeys CODEMIRROR_THEMES */ /* exported showCodeMirrorPopup editorWorker toggleContextMenuDelete */ 'use strict'; @@ -46,63 +46,7 @@ preinit(); if (!chrome.runtime.getPackageDirectoryEntry) { const themes = [ chrome.i18n.getMessage('defaultTheme'), - /* populate-theme-start */ - '3024-day', - '3024-night', - 'abcdef', - 'ambiance', - 'ambiance-mobile', - 'base16-dark', - 'base16-light', - 'bespin', - 'blackboard', - 'cobalt', - 'colorforth', - 'darcula', - 'dracula', - 'duotone-dark', - 'duotone-light', - 'eclipse', - 'elegant', - 'erlang-dark', - 'gruvbox-dark', - 'hopscotch', - 'icecoder', - 'idea', - 'isotope', - 'lesser-dark', - 'liquibyte', - 'lucario', - 'material', - 'mbo', - 'mdn-like', - 'midnight', - 'monokai', - 'neat', - 'neo', - 'night', - 'oceanic-next', - 'panda-syntax', - 'paraiso-dark', - 'paraiso-light', - 'pastel-on-dark', - 'railscasts', - 'rubyblue', - 'seti', - 'shadowfox', - 'solarized', - 'ssms', - 'the-matrix', - 'tomorrow-night-bright', - 'tomorrow-night-eighties', - 'ttcn', - 'twilight', - 'vibrant-ink', - 'xq-dark', - 'xq-light', - 'yeti', - 'zenburn', - /* populate-theme-end */ + ...CODEMIRROR_THEMES ]; localStorage.codeMirrorThemes = themes.join(' '); return Promise.resolve(themes); diff --git a/package.json b/package.json index c1939f03..c1f6e2d7 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "devDependencies": { "archiver": "^3.0.0", "codemirror": "^5.41.0", + "endent": "^1.2.0", "eslint": "^5.8.0", "fs-extra": "^7.0.0", "jsonlint": "^1.6.3", @@ -18,8 +19,8 @@ "stylelint-bundle": "^8.0.0", "stylus-lang-bundle": "^0.54.5", "updates": "^5.1.2", - "web-ext": "^2.9.1", "usercss-meta": "^0.8.1", + "web-ext": "^2.9.1", "webext-tx-fix": "^0.3.1" }, "scripts": { diff --git a/tools/update-codemirror-themes.js b/tools/update-codemirror-themes.js index a9679153..94f1b4e4 100644 --- a/tools/update-codemirror-themes.js +++ b/tools/update-codemirror-themes.js @@ -3,6 +3,7 @@ const fs = require('fs-extra'); const path = require('path'); +const endent = require('endent'); // Update theme names list in codemirror-editing-hook.js async function getThemes() { @@ -14,21 +15,15 @@ async function getThemes() { .sort(); } -function replaceThemes(content, themes) { - const lineFeed = content.includes('\r\n') ? '\r\n' : '\n'; - return content.replace( - /(\x20+)(\/\*\s*populate-theme-start\s*\*\/)[\s\S]+?(\/\*\s*populate-theme-end\s*\*\/)/, - (_, indent, intro, outro) => - indent + intro + lineFeed + - themes.map(_ => `${indent}'${_}',`).join(lineFeed) + lineFeed + - indent + outro - ); -} - async function updateHook(themes) { - const fileName = path.join(__dirname, '..', 'edit/codemirror-editing-hooks.js'); - const content = await fs.readFile(fileName, 'utf-8'); - fs.writeFile(fileName, replaceThemes(content, themes)); + const fileName = path.join(__dirname, '..', 'edit/codemirror-themes.js'); + fs.writeFile(fileName, endent` + /* exported CODEMIRROR_THEMES */ + // this file is generated by update-codemirror-themes.js + 'use strict'; + + const CODEMIRROR_THEMES = ${JSON.stringify(themes, null, 2)}; + `.replace(/"/g, "'") + '\n'); } function exit(err) { From a1a85efc75a252859ab6069ee41d6e5b5b543f16 Mon Sep 17 00:00:00 2001 From: eight Date: Wed, 7 Nov 2018 23:33:56 +0800 Subject: [PATCH 2/3] Update usercss-meta (#540) * Update usercss-meta * Add: translation for new errors * Fix: define `anno.rule` in meta linter * Fix: typo * Fix: don't display rule id if undefined * fixup! Fix: don't display rule id if undefined --- _locales/en/messages.json | 28 +++++++++++++++++++++++++ edit/linter-meta.js | 3 ++- edit/linter-report.js | 3 ++- package.json | 2 +- vendor/usercss-meta/README.md | 4 ++-- vendor/usercss-meta/usercss-meta.min.js | 2 +- 6 files changed, 36 insertions(+), 6 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 48166e36..2b2c111d 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -774,14 +774,42 @@ } } }, + "meta_invalidRangeUnits": { + "message": "Invalid @var $type$: '$units$' is not a valid unit", + "description": "Error displayed when the value of @var range or @var number is invalid", + "placeholders": { + "type": { + "content": "$1" + }, + "units": { + "content": "$2" + } + } + }, + "meta_invalidSelect": { + "message": "Invalid @var select: the default value must be an array or an object", + "description": "Error displayed when the value of @var select is invalid" + }, + "meta_invalidSelectValue": { + "message": "Invalid @var select: values inside the array/object must be a string", + "description": "Error displayed when the value of @var select is invalid" + }, "meta_invalidSelectEmptyOptions": { "message": "Invalid @var select: options list is empty", "description": "Error displayed when the value of @var select is invalid" }, + "meta_invalidSelectLabel": { + "message": "Invalid @var select: option label is empty", + "description": "Error displayed when the value of @var select is invalid" + }, "meta_invalidSelectMultipleDefaults": { "message": "Invalid @var select: multiple default options are defined", "description": "Error displayed when the value of @var select is invalid" }, + "meta_invalidSelectNameDuplicated": { + "message": "Invalid @var select: option name is duplicated", + "description": "Error displayed when the value of @var select is invalid" + }, "meta_invalidSelectValueMismatch": { "message": "Invalid @var select: value doesn't exist in the option list", "description": "Error displayed when the value of @var select is invalid" diff --git a/edit/linter-meta.js b/edit/linter-meta.js index bd5b0399..d99282ee 100644 --- a/edit/linter-meta.js +++ b/edit/linter-meta.js @@ -31,7 +31,8 @@ function createMetaCompiler(cm) { from: cm.posFromIndex((err.index || 0) + match.index), to: cm.posFromIndex((err.index || 0) + match.index), message: err.code && chrome.i18n.getMessage(`meta_${err.code}`, err.args) || err.message, - severity: err.code === 'unknownMeta' ? 'warning' : 'error' + severity: err.code === 'unknownMeta' ? 'warning' : 'error', + rule: err.code }) ); meta = match[0]; diff --git a/edit/linter-report.js b/edit/linter-report.js index df7fda83..bc38db11 100644 --- a/edit/linter-report.js +++ b/edit/linter-report.js @@ -146,7 +146,8 @@ Object.assign(linter, (() => { severityIcon.textContent = anno.severity; line.textContent = anno.from.line + 1; col.textContent = anno.from.ch + 1; - message.title = clipString(anno.message, 1000) + `\n(${anno.rule})`; + message.title = clipString(anno.message, 1000) + + (anno.rule ? `\n(${anno.rule})` : ''); message.textContent = clipString(anno.message, 100); } } diff --git a/package.json b/package.json index c1f6e2d7..bfc9e77b 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "stylelint-bundle": "^8.0.0", "stylus-lang-bundle": "^0.54.5", "updates": "^5.1.2", - "usercss-meta": "^0.8.1", + "usercss-meta": "^0.8.3", "web-ext": "^2.9.1", "webext-tx-fix": "^0.3.1" }, diff --git a/vendor/usercss-meta/README.md b/vendor/usercss-meta/README.md index b1eb9236..ba6cc75e 100644 --- a/vendor/usercss-meta/README.md +++ b/vendor/usercss-meta/README.md @@ -1,5 +1,5 @@ -## usercss-meta v0.8.1 +## usercss-meta v0.8.3 usercss-meta installed via npm - source repo: -https://unpkg.com/usercss-meta@0.8.1/dist/usercss-meta.min.js +https://unpkg.com/usercss-meta@0.8.3/dist/usercss-meta.min.js diff --git a/vendor/usercss-meta/usercss-meta.min.js b/vendor/usercss-meta/usercss-meta.min.js index 68c1c8fe..16a90dfd 100644 --- a/vendor/usercss-meta/usercss-meta.min.js +++ b/vendor/usercss-meta/usercss-meta.min.js @@ -1,2 +1,2 @@ -var usercssMeta=function(e){"use strict";class n extends Error{constructor(e){super(e.message),delete e.message,this.name="ParseError",Object.assign(this,e)}}class t extends n{constructor(e,n){super({code:"missingChar",args:e,message:`Missing character: ${e.map(e=>`'${e}'`).join(", ")}`,index:n})}}class a extends n{constructor(e){super({code:"EOF",message:"Unexpected end of file",index:e})}}const s=/<<e[1]===n?n:JSON.parse(`"${e}"`))}function v(e){l.lastIndex=e.lastIndex,l.exec(e.text),e.lastIndex=l.lastIndex}function y(e){i.lastIndex=e.lastIndex,e.lastIndex+=i.exec(e.text)[0].length}function g(e){if(e.lastIndex>=e.text.length)throw new a(e.lastIndex);e.index=e.lastIndex,e.value=e.text[e.lastIndex],e.lastIndex++,y(e)}function m(e){const t=e.lastIndex;o.lastIndex=t;const a=o.exec(e.text);if(!a)throw new n({code:"invalidWord",message:"Invalid word",index:t});e.index=t,e.value=a[1],e.lastIndex+=a[0].length}function h(e){const a=e.lastIndex;try{!function e(a){const{text:s}=a;if("{"===s[a.lastIndex]){const n={};for(a.lastIndex++,y(a);"}"!==s[a.lastIndex];){b(a);const l=a.value;if(":"!==s[a.lastIndex])throw new t([":"],a.lastIndex);if(a.lastIndex++,y(a),e(a),n[l]=a.value,","===s[a.lastIndex])a.lastIndex++,y(a);else if("}"!==s[a.lastIndex])throw new t([",","}"],a.lastIndex)}a.lastIndex++,y(a),a.value=n}else if("["===s[a.lastIndex]){const n=[];for(a.lastIndex++,y(a);"]"!==s[a.lastIndex];)if(e(a),n.push(a.value),","===s[a.lastIndex])a.lastIndex++,y(a);else if("]"!==s[a.lastIndex])throw new t([",","]"],a.lastIndex);a.lastIndex++,y(a),a.value=n}else if('"'===s[a.lastIndex]||"'"===s[a.lastIndex]||"`"===s[a.lastIndex])b(a);else if(/[-\d.]/.test(s[a.lastIndex]))O(a);else{if(m(a),!(a.value in x))throw new n({code:"unknownJSONLiteral",args:[a.value],message:`Unknown literal '${a.value}'`,index:a.index});a.value=x[a.value]}}(e)}catch(e){throw e.message=`Invalid JSON: ${e.message}`,e}e.index=a}function I(e){const t=e.lastIndex;s.lastIndex=t;const a=e.text.match(s);if(!a)throw new n({code:"missingEOT",message:"Missing EOT",index:t});e.index=t,e.lastIndex+=a[0].length,e.value=p(a[1].trim()),y(e)}function w(e){c.lastIndex=e.lastIndex;const n=c.exec(e.text);e.index=e.lastIndex,e.lastIndex=c.lastIndex,e.value=n[0].trim().replace(/\s+/g,"-")}function b(e){const t=e.lastIndex,a="`"===e.text[t]?u:d;a.lastIndex=t;const s=a.exec(e.text);if(!s)throw new n({code:"invalidString",message:"Invalid string",index:t});e.index=t,e.lastIndex+=s[0].length,e.value=f(s[1])}function O(e){const t=e.lastIndex;r.lastIndex=t;const a=r.exec(e.text);if(!a)throw new n({code:"invalidNumber",message:"Invalid number",index:t});e.index=t,e.value=Number(a[0].trim()),e.lastIndex+=a[0].length}function $(e){l.lastIndex=e.lastIndex;const n=l.exec(e.text);e.index=e.lastIndex,e.value=f(n[0].trim()),e.lastIndex=l.lastIndex}var k={eatLine:v,eatWhitespace:y,parseChar:g,parseEOT:I,parseJSON:h,parseNumber:O,parseString:b,parseStringToEnd:$,parseStringUnquoted:w,parseWord:m,unquote:f};const S=self.URL,R={name:$,version:$,namespace:$,author:$,description:$,homepageURL:$,supportURL:$,updateURL:$,license:$,preprocessor:$},E={version:function(e){if(!/\bv?(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-[\da-z-]+(?:\.[\da-z-]+)*)?(?:\+[\da-z-]+(?:\.[\da-z-]+)*)?\b/gi.test(e.value))throw new n({code:"invalidVersion",args:[e.value],message:`Invalid version: ${e.value}`,index:e.valueIndex});var t;e.value="v"===(t=e.value)[0]||"="===t[0]?t.slice(1):t},homepageURL:V,supportURL:V,updateURL:V},j={text:$,color:$,checkbox:g,select:J,dropdown:{advanced:D},image:{var:J,advanced:D},number:M,range:M},U={checkbox:function(e){if("1"!==e.value&&"0"!==e.value)throw new n({code:"invalidCheckboxDefault",message:"value must be 0 or 1",index:e.valueIndex})},number:_,range:_},N=["name","namespace","version"],T=["default","min","max","step"];function M(e){h(e);const t={min:null,max:null,step:null,units:null};if("number"==typeof e.value)t.default=e.value;else{if(!Array.isArray(e.value))throw new n({code:"invalidRange",message:"the default value must be an array or a number",index:e.valueIndex,args:[e.type]});{let a=0;for(const s of e.value)if("string"==typeof s){if(null!=t.units)throw new n({code:"invalidRangeMultipleUnits",message:"units is alredy defined",args:[e.type],index:e.valueIndex});t.units=s}else{if("number"!=typeof s&&null!==s)throw new n({code:"invalidRangeValue",message:"value must be number, string, or null",args:[e.type],index:e.valueIndex});if(a>=T.length)throw new n({code:"invalidRangeTooManyValues",message:"the array contains too many values",args:[e.type],index:e.valueIndex});t[T[a++]]=s}}}e.value=t.default,Object.assign(e.varResult,t)}function J(e){h(e);const t=Array.isArray(e.value)?e.value.map(e=>L(e)):Object.entries(e.value).map(([e,n])=>L(e,n));if(0===t.length)throw new n({code:"invalidSelectEmptyOptions",message:"Option list is empty",index:e.valueIndex});const a=t.filter(e=>e.isDefault);if(a.length>1)throw new n({code:"invalidSelectMultipleDefaults",message:"multiple default values",index:e.valueIndex});t.forEach(e=>{delete e.isDefault}),e.varResult.options=t,e.value=(a.length>0?a[0]:t[0]).name}function D(e){const a=e.lastIndex;if("{"!==e.text[e.lastIndex])throw new t(["{"],a);const s=[];for(e.lastIndex++;"}"!==e.text[e.lastIndex];){const n={};w(e),n.name=e.value,b(e),n.label=e.value,"dropdown"===e.type?I(e):b(e),n.value=e.value,s.push(n)}if(e.lastIndex++,y(e),0===s.length)throw new n({code:"invalidSelectEmptyOptions",message:"Option list is empty",index:a});"dropdown"===e.type&&(e.varResult.type="select",e.type="select"),e.varResult.options=s,e.value=s[0].name}function L(e,n){let t,a=!1;e.endsWith("*")&&(a=!0,e=e.slice(0,-1));const s=e.match(/^(\w+):(.*)/);return s&&([,t,e]=s),t||(t=e),n||(n=t),{name:t,label:e,value:n,isDefault:a}}function A(e,n){if(n)try{e()}catch(e){n.push(e)}else e()}function V(e){let t;try{t=new S(e.value)}catch(n){throw n.args=[e.value],n.index=e.valueIndex,n}if(!/^https?:/.test(t.protocol))throw new n({code:"invalidURLProtocol",args:[t.protocol],message:`Invalid protocol: ${t.protocol}`,index:e.valueIndex})}function _(e){const t=e.value;if("number"!=typeof t)throw new n({code:"invalidRangeDefault",message:`the default value of @var ${e.type} must be a number`,index:e.valueIndex,args:[e.type]});const a=e.varResult;if(null!=a.min&&ta.max)throw new n({code:"invalidRangeMax",message:"the value is larger than the maximum",index:e.valueIndex,args:[e.type]});if(null!=a.step){const s=a.step.toString().split(".")[1],l=s?10**s.length:0;if(t*l%(a.step*l))throw new n({code:"invalidRangeStep",message:"the value is not a multiple of the step",index:e.valueIndex,args:[e.type]})}}function K({unknownKey:e="ignore",mandatoryKeys:t=N,parseKey:a,parseVar:s,validateKey:l,validateVar:r,allowErrors:i=!1}={}){if(!["ignore","assign","throw"].includes(e))throw new TypeError("unknownKey must be 'ignore', 'assign', or 'throw'");const o=Object.assign({__proto__:null},R,a),u=Object.assign({},j,s),d=Object.assign({},E,l),c=Object.assign({},U,r);return{parse:function(e){if(e.includes("\r"))throw new TypeError("metadata includes invalid character: '\\r'");const a={},s=[],l=/@(\w+)[^\S\r\n]*/gm,r={index:0,lastIndex:0,text:e,usercssData:a,warn:e=>s.push(e)};let o;for(;o=l.exec(e);)r.index=o.index,r.lastIndex=l.lastIndex,r.key=o[1],r.shouldIgnore=!1,A(()=>{try{"var"===r.key||"advanced"===r.key?p(r):f(r)}catch(e){throw void 0===e.index&&(e.index=r.index),e}"var"===r.key||"advanced"===r.key||r.shouldIgnore||(a[r.key]=r.value)},i&&s),l.lastIndex=r.lastIndex;return r.maybeUSO&&!a.preprocessor&&(a.preprocessor="uso"),A(()=>{const e=t.filter(e=>!Object.prototype.hasOwnProperty.call(a,e));if(e.length>0)throw new n({code:"missingMandatory",args:e,message:`Missing metadata: ${e.map(e=>`@${e}`).join(", ")}`})},i&&s),{metadata:a,errors:s}},validateVar:function(e){x({key:"var",type:e.type,value:e.value,varResult:e})}};function x(e){const n="object"==typeof c[e.type]?c[e.type][e.key]:c[e.type];n&&n(e)}function p(e){const t={type:null,label:null,name:null,value:null,default:null,options:null};e.varResult=t,m(e),e.type=e.value,t.type=e.type;const a="object"==typeof u[e.type]?u[e.type][e.key]:u[e.type];if(!a)throw new n({code:"unknownVarType",message:`Unknown @${e.key} type: ${e.type}`,args:[e.key,e.type],index:e.index});m(e),t.name=e.value,b(e),t.label=e.value,e.valueIndex=e.lastIndex,a(e),x(e),t.default=e.value,e.usercssData.vars||(e.usercssData.vars={}),e.usercssData.vars[t.name]=t,"advanced"===e.key&&(e.maybeUSO=!0)}function f(t){let a=o[t.key];if(!a){if("assign"!==e){if(v(t),"ignore"===e)return void(t.shouldIgnore=!0);throw new n({code:"unknownMeta",args:[t.key],message:`Unknown metadata: @${t.key}`,index:t.index})}a=$}t.valueIndex=t.lastIndex,a(t),d[t.key]&&d[t.key](t)}}function P({alignKeys:e=!1,space:n=2,format:t="stylus",stringifyKey:a={},stringifyVar:s={}}={}){return{stringify:function(l){let r;if("stylus"===t)r="var";else{if("xstyle"!==t)throw new TypeError("options.format must be 'stylus' or 'xstyle'");r="advanced"}const i=[];for(const[e,o]of Object.entries(l))if(Object.prototype.hasOwnProperty.call(a,e)){const n=a[e](o);Array.isArray(n)?i.push(...n.map(n=>[e,n])):i.push([e,n])}else if("vars"===e)for(const e of Object.values(o))i.push([r,z(e,t,s,n)]);else if(Array.isArray(o))for(const n of o)i.push([e,W(n)]);else i.push([e,W(o)]);const o=e?Math.max(...i.map(e=>e[0].length)):0;return`/* ==UserStyle==\n${u=i.map(([e,n])=>`@${e.padEnd(o)} ${n}`).join("\n"),u.replace(/\*\//g,"*\\/")}\n==/UserStyle== */`;var u}}}function z(e,n,t,a){return`${"xstyle"===n&&"select"===e.type?"dropdown":e.type} ${e.name} ${JSON.stringify(e.label)} ${function(){if(Object.prototype.hasOwnProperty.call(t,e.type))return t[e.type](e,n,a);if(e.options)return"stylus"===n?JSON.stringify(e.options.reduce((n,t)=>{const a=t.name===e.default?"*":"";return n[`${t.name}:${t.label}${a}`]=t.value,n},{}),null,a):function(e,n=!1,t=0){const a="string"==typeof t?t:" ".repeat(t);return`{\n${e.map(e=>`${a}${e.name} ${JSON.stringify(e.label)} ${function(e){return n?JSON.stringify(e):`<<`'${e}'`).join(", ")}`,index:n})}}class a extends n{constructor(e){super({code:"EOF",message:"Unexpected end of file",index:e})}}const s=/<<e[1]===n?n:JSON.parse(`"${e}"`))}function m(e){l.lastIndex=e.lastIndex,l.exec(e.text),e.lastIndex=l.lastIndex}function g(e){r.lastIndex=e.lastIndex,e.lastIndex+=r.exec(e.text)[0].length}function y(e){if(e.lastIndex>=e.text.length)throw new a(e.lastIndex);e.index=e.lastIndex,e.value=e.text[e.lastIndex],e.lastIndex++,g(e)}function h(e){const t=e.lastIndex;u.lastIndex=t;const a=u.exec(e.text);if(!a)throw new n({code:"invalidWord",message:"Invalid word",index:t});e.index=t,e.value=a[1],e.lastIndex+=a[0].length}function w(e){const a=e.lastIndex;try{!function e(a){const{text:s}=a;if("{"===s[a.lastIndex]){const n={};for(a.lastIndex++,g(a);"}"!==s[a.lastIndex];){O(a);const l=a.value;if(":"!==s[a.lastIndex])throw new t([":"],a.lastIndex);if(a.lastIndex++,g(a),e(a),n[l]=a.value,","===s[a.lastIndex])a.lastIndex++,g(a);else if("}"!==s[a.lastIndex])throw new t([",","}"],a.lastIndex)}a.lastIndex++,g(a),a.value=n}else if("["===s[a.lastIndex]){const n=[];for(a.lastIndex++,g(a);"]"!==s[a.lastIndex];)if(e(a),n.push(a.value),","===s[a.lastIndex])a.lastIndex++,g(a);else if("]"!==s[a.lastIndex])throw new t([",","]"],a.lastIndex);a.lastIndex++,g(a),a.value=n}else if('"'===s[a.lastIndex]||"'"===s[a.lastIndex]||"`"===s[a.lastIndex])O(a);else if(/[-\d.]/.test(s[a.lastIndex]))S(a);else{if(h(a),!(a.value in p))throw new n({code:"unknownJSONLiteral",args:[a.value],message:`Unknown literal '${a.value}'`,index:a.index});a.value=p[a.value]}}(e)}catch(e){throw e.message=`Invalid JSON: ${e.message}`,e}e.index=a}function I(e){const t=e.lastIndex;s.lastIndex=t;const a=e.text.match(s);if(!a)throw new n({code:"missingEOT",message:"Missing EOT",index:t});e.index=t,e.lastIndex+=a[0].length,e.value=f(a[1].trim()),g(e)}function b(e){x.lastIndex=e.lastIndex;const n=x.exec(e.text);e.index=e.lastIndex,e.lastIndex=x.lastIndex,e.value=n[0].trim().replace(/\s+/g,"-")}function O(e,t=!1){const a=e.lastIndex,s="`"===e.text[a]?d:c;s.lastIndex=a;const l=s.exec(e.text);if(!l)throw new n({code:"invalidString",message:"Invalid string",index:a});e.index=a,e.lastIndex+=l[0].length,e.value=v(l[1]),t?function(e){o.lastIndex=e.lastIndex,e.lastIndex+=o.exec(e.text)[0].length}(e):g(e)}function S(e){const t=e.lastIndex;i.lastIndex=t;const a=i.exec(e.text);if(!a)throw new n({code:"invalidNumber",message:"Invalid number",index:t});e.index=t,e.value=Number(a[0].trim()),e.lastIndex+=a[0].length}function $(e){l.lastIndex=e.lastIndex;const n=l.exec(e.text);e.index=e.lastIndex,e.value=v(n[0].trim()),e.lastIndex=l.lastIndex}var k={eatLine:m,eatWhitespace:g,parseChar:y,parseEOT:I,parseJSON:w,parseNumber:S,parseString:O,parseStringToEnd:$,parseStringUnquoted:b,parseWord:h,unquote:v};const R=self.URL,E=new Set(["em","ex","cap","ch","ic","rem","lh","rlh","vw","vh","vi","vb","vmin","vmax","cm","mm","Q","in","pt","pc","px","deg","grad","rad","turn","s","ms","Hz","kHz","dpi","dpcm","dppx","%"]),j={name:$,version:$,namespace:$,author:$,description:$,homepageURL:$,supportURL:$,updateURL:$,license:$,preprocessor:$},U={version:function(e){const t=e.value.match(/\bv?(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-[\da-z-]+(?:\.[\da-z-]+)*)?(?:\+[\da-z-]+(?:\.[\da-z-]+)*)?\b/gi);if(!t||t[0]!==e.value)throw new n({code:"invalidVersion",args:[e.value],message:`Invalid version: ${e.value}`,index:e.valueIndex});var a;e.value="v"===(a=e.value)[0]||"="===a[0]?a.slice(1):a},homepageURL:z,supportURL:z,updateURL:z},N={text:$,color:$,checkbox:y,select:L,dropdown:{advanced:V},image:{var:L,advanced:V},number:J,range:J},T={checkbox:function(e){if("1"!==e.value&&"0"!==e.value)throw new n({code:"invalidCheckboxDefault",message:"value must be 0 or 1",index:e.valueIndex})},number:K,range:K},M=["name","namespace","version"],D=["default","min","max","step"];function J(e){w(e);const t={min:null,max:null,step:null,units:null};if("number"==typeof e.value)t.default=e.value;else{if(!Array.isArray(e.value))throw new n({code:"invalidRange",message:"the default value must be an array or a number",index:e.valueIndex,args:[e.type]});{let a=0;for(const s of e.value)if("string"==typeof s){if(null!=t.units)throw new n({code:"invalidRangeMultipleUnits",message:"units is alredy defined",args:[e.type],index:e.valueIndex});t.units=s}else{if("number"!=typeof s&&null!==s)throw new n({code:"invalidRangeValue",message:"value must be number, string, or null",args:[e.type],index:e.valueIndex});if(a>=D.length)throw new n({code:"invalidRangeTooManyValues",message:"the array contains too many values",args:[e.type],index:e.valueIndex});t[D[a++]]=s}}}e.value=t.default,Object.assign(e.varResult,t)}function L(e){if(w(e),"object"!=typeof e.value||!e.value)throw new n({code:"invalidSelect",message:"The value must be an array or object"});const t=Array.isArray(e.value)?e.value.map(e=>A(e)):Object.entries(e.value).map(([e,n])=>A(e,n));if(new Set(t.map(e=>e.name)).sizee.isDefault);if(a.length>1)throw new n({code:"invalidSelectMultipleDefaults",message:"multiple default values"});t.forEach(e=>{delete e.isDefault}),e.varResult.options=t,e.value=(a.length>0?a[0]:t[0]).name}function V(e){const a=e.lastIndex;if("{"!==e.text[e.lastIndex])throw new t(["{"],a);const s=[];for(e.lastIndex++;"}"!==e.text[e.lastIndex];){const n={};b(e),n.name=e.value,O(e),n.label=e.value,"dropdown"===e.type?I(e):O(e),n.value=e.value,s.push(n)}if(e.lastIndex++,g(e),0===s.length)throw new n({code:"invalidSelectEmptyOptions",message:"Option list is empty",index:a});"dropdown"===e.type&&(e.varResult.type="select",e.type="select"),e.varResult.options=s,e.value=s[0].name}function A(e,t){if("string"!=typeof e||t&&"string"!=typeof t)throw new n({code:"invalidSelectValue",message:"Values in the object/array must be strings"});let a,s=!1;e.endsWith("*")&&(s=!0,e=e.slice(0,-1));const l=e.match(/^(\w+):(.*)/);if(l&&([,a,e]=l),a||(a=e),!e)throw new n({code:"invalidSelectLabel",message:"Option label is empty"});return null==t&&(t=a),{name:a,label:e,value:t,isDefault:s}}function _(e,n){if(n)try{e()}catch(e){n.push(e)}else e()}function z(e){let t;try{t=new R(e.value)}catch(n){throw n.args=[e.value],n.index=e.valueIndex,n}if(!/^https?:/.test(t.protocol))throw new n({code:"invalidURLProtocol",args:[t.protocol],message:`Invalid protocol: ${t.protocol}`,index:e.valueIndex})}function K(e){const t=e.value;if("number"!=typeof t)throw new n({code:"invalidRangeDefault",message:`the default value of @var ${e.type} must be a number`,index:e.valueIndex,args:[e.type]});const a=e.varResult;if(null!=a.min&&ta.max)throw new n({code:"invalidRangeMax",message:"the value is larger than the maximum",index:e.valueIndex,args:[e.type]});if(null!=a.step&&[t,a.min,a.max].some(e=>null!=e&&!function(e,n){const t=n.toString().split(".")[1],a=t?10**t.length:1;return e*a%(n*a)==0}(e,a.step)))throw new n({code:"invalidRangeStep",message:"the value is not a multiple of the step",index:e.valueIndex,args:[e.type]});if(a.units&&!E.has(a.units))throw new n({code:"invalidRangeUnits",message:`Invalid CSS unit: ${a.units}`,index:e.valueIndex,args:[e.type,a.units]})}function P({unknownKey:e="ignore",mandatoryKeys:t=M,parseKey:a,parseVar:s,validateKey:l,validateVar:i,allowErrors:r=!1}={}){if(!["ignore","assign","throw"].includes(e))throw new TypeError("unknownKey must be 'ignore', 'assign', or 'throw'");const o=Object.assign({__proto__:null},j,a),u=Object.assign({},N,s),d=Object.assign({},U,l),c=Object.assign({},T,i);return{parse:function(e){if(e.includes("\r"))throw new TypeError("metadata includes invalid character: '\\r'");const a={},s=[],l=/@(\w+)[^\S\r\n]*/gm,i={index:0,lastIndex:0,text:e,usercssData:a,warn:e=>s.push(e)};let o;for(;o=l.exec(e);)i.index=o.index,i.lastIndex=l.lastIndex,i.key=o[1],i.shouldIgnore=!1,_(()=>{try{"var"===i.key||"advanced"===i.key?p(i):f(i)}catch(e){throw void 0===e.index&&(e.index=i.index),e}"var"===i.key||"advanced"===i.key||i.shouldIgnore||(a[i.key]=i.value)},r&&s),l.lastIndex=i.lastIndex;return i.maybeUSO&&!a.preprocessor&&(a.preprocessor="uso"),_(()=>{const e=t.filter(e=>!Object.prototype.hasOwnProperty.call(a,e));if(e.length>0)throw new n({code:"missingMandatory",args:e,message:`Missing metadata: ${e.map(e=>`@${e}`).join(", ")}`})},r&&s),{metadata:a,errors:s}},validateVar:function(e){x({key:"var",type:e.type,value:e.value,varResult:e})}};function x(e){const n="object"==typeof c[e.type]?c[e.type][e.key]:c[e.type];n&&n(e)}function p(e){const t={type:null,label:null,name:null,value:null,default:null,options:null};e.varResult=t,h(e),e.type=e.value,t.type=e.type;const a="object"==typeof u[e.type]?u[e.type][e.key]:u[e.type];if(!a)throw new n({code:"unknownVarType",message:`Unknown @${e.key} type: ${e.type}`,args:[e.key,e.type],index:e.index});h(e),t.name=e.value,O(e,!0),t.label=e.value,e.valueIndex=e.lastIndex,a(e),x(e),t.default=e.value,e.usercssData.vars||(e.usercssData.vars={}),e.usercssData.vars[t.name]=t,"advanced"===e.key&&(e.maybeUSO=!0)}function f(t){let a=o[t.key];if(!a){if("assign"!==e){if(m(t),"ignore"===e)return void(t.shouldIgnore=!0);throw new n({code:"unknownMeta",args:[t.key],message:`Unknown metadata: @${t.key}`,index:t.index})}a=$}t.valueIndex=t.lastIndex,a(t),d[t.key]&&d[t.key](t)}}function C({alignKeys:e=!1,space:n=2,format:t="stylus",stringifyKey:a={},stringifyVar:s={}}={}){return{stringify:function(l){let i;if("stylus"===t)i="var";else{if("xstyle"!==t)throw new TypeError("options.format must be 'stylus' or 'xstyle'");i="advanced"}const r=[];for(const[e,o]of Object.entries(l))if(Object.prototype.hasOwnProperty.call(a,e)){const n=a[e](o);Array.isArray(n)?r.push(...n.map(n=>[e,n])):r.push([e,n])}else if("vars"===e)for(const e of Object.values(o))r.push([i,W(e,t,s,n)]);else if(Array.isArray(o))for(const n of o)r.push([e,q(n)]);else r.push([e,q(o)]);const o=e?Math.max(...r.map(e=>e[0].length)):0;return`/* ==UserStyle==\n${u=r.map(([e,n])=>`@${e.padEnd(o)} ${n}`).join("\n"),u.replace(/\*\//g,"*\\/")}\n==/UserStyle== */`;var u}}}function W(e,n,t,a){return`${"xstyle"===n&&"select"===e.type?"dropdown":e.type} ${e.name} ${JSON.stringify(e.label)} ${function(){if(Object.prototype.hasOwnProperty.call(t,e.type))return t[e.type](e,n,a);if(e.options)return"stylus"===n?JSON.stringify(e.options.reduce((n,t)=>{const a=t.name===e.default?"*":"";return n[`${t.name}:${t.label}${a}`]=t.value,n},{}),null,a):function(e,n=!1,t=0){const a="string"==typeof t?t:" ".repeat(t);return`{\n${e.map(e=>`${a}${e.name} ${JSON.stringify(e.label)} ${function(e){return n?JSON.stringify(e):`<< Date: Thu, 8 Nov 2018 21:35:40 +0800 Subject: [PATCH 3/3] Chore: include stylus version in the issue template (#549) --- .github/ISSUE_TEMPLATE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index c83a0ca1..462d3f18 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,5 +1,6 @@ * **Browser**: * **Operating System**: +* **Stylus Version**: * **Screenshot**: