From efc714f70211f8a4916d02f42dab28fd952c5769 Mon Sep 17 00:00:00 2001 From: Vitaly Puzrin Date: Tue, 28 Nov 2023 07:36:15 +0200 Subject: [PATCH] standard: more tweaks & simplify eslint config --- .eslintrc.yml | 152 ++---------------------- benchmark/benchmark.mjs | 16 +-- bin/markdown-it.mjs | 4 +- lib/common/utils.mjs | 7 +- lib/index.mjs | 2 +- lib/renderer.mjs | 9 +- lib/ruler.mjs | 6 +- lib/rules_block/list.mjs | 6 +- lib/rules_block/reference.mjs | 2 +- lib/rules_block/state_block.mjs | 6 +- lib/rules_inline/autolink.mjs | 5 +- lib/rules_inline/balance_pairs.mjs | 7 +- lib/rules_inline/emphasis.mjs | 2 +- lib/rules_inline/state_inline.mjs | 6 +- lib/rules_inline/strikethrough.mjs | 2 +- package.json | 1 + support/demo_template/index.mjs | 4 +- support/demo_template/rollup.config.mjs | 4 +- support/specsplit.mjs | 21 ++-- test/babelmark-responder.mjs | 2 +- test/pathological.mjs | 6 +- 21 files changed, 56 insertions(+), 214 deletions(-) diff --git a/.eslintrc.yml b/.eslintrc.yml index c832d21..32cb852 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -1,3 +1,5 @@ +extends: standard + env: es6: true node: true @@ -14,153 +16,13 @@ overrides: no-restricted-globals: [ 2, require, __dirname ] ignorePatterns: - - coverage/ - demo/ - dist/ - - node_modules - benchmark/extra/ rules: - no-var: 2 - prefer-const: 2 - no-const-assign: 2 - accessor-pairs: 2 - array-bracket-spacing: [ 2, never ] - block-scoped-var: 2 - block-spacing: 2 - brace-style: [ 2, '1tbs', { allowSingleLine: true } ] - # Postponed - #callback-return: 2 - comma-dangle: 2 - comma-spacing: 2 - comma-style: 2 - computed-property-spacing: [ 2, never ] - consistent-this: [ 2, self ] - consistent-return: 2 - # ? change to multi - curly: [ 2, 'multi-line' ] - dot-notation: 2 - eol-last: 2 - eqeqeq: 2 - func-style: [ 2, declaration ] - # Postponed - #global-require: 2 - guard-for-in: 2 - handle-callback-err: 2 - - indent: [ 2, 2, { VariableDeclarator: { var: 2, let: 2, const: 3 }, SwitchCase: 1, ignoreComments: true } ] - - # key-spacing: [ 2, { "align": "value" } ] - keyword-spacing: 2 - linebreak-style: 2 - max-depth: [ 1, 6 ] - max-nested-callbacks: [ 1, 4 ] - # string can exceed 80 chars, but should not overflow github website :) - max-len: [ 2, 120, 1000 ] - new-cap: 2 - new-parens: 2 - # Postponed - #newline-after-var: 2 - no-alert: 2 - no-array-constructor: 2 - no-bitwise: 2 - no-caller: 2 - #no-case-declarations: 2 - no-catch-shadow: 2 - no-cond-assign: 2 - no-console: 1 - no-constant-condition: 2 - #no-control-regex: 2 - no-debugger: 2 - no-delete-var: 2 - no-div-regex: 2 - no-dupe-args: 2 - no-dupe-keys: 2 - no-duplicate-case: 2 - no-else-return: 2 - # Tend to drop - # no-empty: 1 - no-empty-character-class: 2 - no-empty-pattern: 2 - no-eq-null: 2 - no-eval: 2 - no-ex-assign: 2 - no-extend-native: 2 - no-extra-bind: 2 - no-extra-boolean-cast: 2 - no-extra-semi: 2 - no-fallthrough: 2 - no-floating-decimal: 2 - no-func-assign: 2 - # Postponed - #no-implicit-coercion: [2, { "boolean": true, "number": true, "string": true } ] - no-implied-eval: 2 - no-inner-declarations: 2 - no-invalid-regexp: 2 - no-irregular-whitespace: 2 - no-iterator: 2 - no-label-var: 2 - no-labels: 2 - no-lone-blocks: 2 - no-lonely-if: 2 - no-loop-func: 2 - no-mixed-requires: 2 - no-mixed-spaces-and-tabs: 2 - # Postponed - #no-native-reassign: 2 - no-negated-in-lhs: 2 - # Postponed - #no-nested-ternary: 2 - no-new: 2 - no-new-func: 2 - no-new-object: 2 - no-new-require: 2 - no-new-wrappers: 2 - no-obj-calls: 2 - no-octal: 2 - no-octal-escape: 2 - no-path-concat: 2 - no-proto: 2 - no-redeclare: 2 - # Postponed - #no-regex-spaces: 2 - no-return-assign: 2 - no-self-compare: 2 - no-sequences: 2 - no-shadow: 2 - no-shadow-restricted-names: 2 - no-sparse-arrays: 2 - no-trailing-spaces: 2 - no-undef: 2 - no-undef-init: 2 - no-undefined: 2 - no-unexpected-multiline: 2 - no-unreachable: 2 - no-unused-expressions: 2 - no-unused-vars: 2 - no-use-before-define: 2 - no-void: 2 - no-with: 2 - object-curly-spacing: [ 2, always, { "objectsInObjects": true, "arraysInObjects": true } ] - one-var: [ 2, { initialized: 'never' } ] - operator-assignment: 1 - # Postponed - #operator-linebreak: [ 2, after ] - semi: [ 2, never ] - semi-spacing: 2 - space-before-function-paren: [2, always] - space-in-parens: [ 2, never ] - space-infix-ops: 2 - space-unary-ops: 2 - # Postponed - spaced-comment: [ 2, 'always', { - line: { markers: ['*package', '!', '/', ',', '='] }, - block: { balanced: true, markers: ['*package', '!', ',', ':', '::', 'flow-include'], exceptions: ['*'] } - }] - strict: [ 2, global ] - quotes: [ 2, single, avoid-escape ] - quote-props: [ 1, 'as-needed' ] - radix: 2 - use-isnan: 2 - valid-typeof: 2 - yoda: [ 2, never, { "exceptRange": true } ] + camelcase: 0 + key-spacing: 0 + no-multi-spaces: 0 + no-multiple-empty-lines: 0 + padded-blocks: 0 diff --git a/benchmark/benchmark.mjs b/benchmark/benchmark.mjs index 1345c24..1fc4a93 100755 --- a/benchmark/benchmark.mjs +++ b/benchmark/benchmark.mjs @@ -16,10 +16,7 @@ for (const name of fs.readdirSync(new URL('./implementations', import.meta.url)) const filepath = new URL(`./implementations/${name}/index.mjs`, import.meta.url) const code = (await import(filepath)) - IMPLS.push({ - name: name, - code: code - }) + IMPLS.push({ name, code }) } const SAMPLES = [] @@ -39,7 +36,7 @@ fs.readdirSync(new URL('./samples', import.meta.url)).sort().forEach(sample => { title, { onStart: () => { console.log('\nSample: %s %s', sample, title) }, - onComplete: onComplete + onComplete } ) @@ -52,18 +49,13 @@ fs.readdirSync(new URL('./samples', import.meta.url)).sort().forEach(sample => { cursor.eraseLine() cursor.write(' > ' + event.target) }, - onComplete: onComplete, + onComplete, fn: function () { impl.code.run(content.string) } } ) }) - SAMPLES.push({ - name: sample.split('.')[0], - title: title, - content: content, - suite: suite - }) + SAMPLES.push({ name: sample.split('.')[0], title, content, suite }) }) diff --git a/bin/markdown-it.mjs b/bin/markdown-it.mjs index a53fa30..c3c497e 100755 --- a/bin/markdown-it.mjs +++ b/bin/markdown-it.mjs @@ -76,7 +76,7 @@ readFile(options.file, 'utf8', function (err, input) { } console.error( - options.trace && err.stack || + (options.trace && err.stack) || err.message || String(err)) @@ -95,7 +95,7 @@ readFile(options.file, 'utf8', function (err, input) { } catch (e) { console.error( - options.trace && e.stack || + (options.trace && e.stack) || e.message || String(e)) diff --git a/lib/common/utils.mjs b/lib/common/utils.mjs index 5bae0fa..fb7881e 100644 --- a/lib/common/utils.mjs +++ b/lib/common/utils.mjs @@ -73,7 +73,7 @@ function fromCodePoint (c) { } -const UNESCAPE_MD_RE = /\\([!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~])/g +const UNESCAPE_MD_RE = /\\([!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~])/g const ENTITY_RE = /&([a-z#][a-z0-9]{1,31});/gi const UNESCAPE_ALL_RE = new RegExp(UNESCAPE_MD_RE.source + '|' + ENTITY_RE.source, 'gi') @@ -82,8 +82,9 @@ const DIGITAL_ENTITY_TEST_RE = /^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))$/i function replaceEntityPattern (match, name) { if (name.charCodeAt(0) === 0x23/* # */ && DIGITAL_ENTITY_TEST_RE.test(name)) { - const code = name[1].toLowerCase() === 'x' ? - parseInt(name.slice(2), 16) : parseInt(name.slice(1), 10) + const code = name[1].toLowerCase() === 'x' + ? parseInt(name.slice(2), 16) + : parseInt(name.slice(1), 10) if (isValidEntityCode(code)) { return fromCodePoint(code) diff --git a/lib/index.mjs b/lib/index.mjs index 13b50d2..343712d 100644 --- a/lib/index.mjs +++ b/lib/index.mjs @@ -36,7 +36,7 @@ function validateLink (url) { // url should be normalized at this point, and existing entities are decoded const str = url.trim().toLowerCase() - return BAD_PROTO_RE.test(str) ? (GOOD_DATA_RE.test(str) ? true : false) : true + return BAD_PROTO_RE.test(str) ? GOOD_DATA_RE.test(str) : true } diff --git a/lib/renderer.mjs b/lib/renderer.mjs index ff8c04b..bcd93ac 100644 --- a/lib/renderer.mjs +++ b/lib/renderer.mjs @@ -72,15 +72,10 @@ default_rules.fence = function (tokens, idx, options, env, slf) { attrs: tmpAttrs } - return '
'
-          + highlighted
-          + '
\n' + return `
${highlighted}
\n` } - - return '
'
-        + highlighted
-        + '
\n' + return `
${highlighted}
\n` } diff --git a/lib/ruler.mjs b/lib/ruler.mjs index cb30fdb..72f00a7 100644 --- a/lib/ruler.mjs +++ b/lib/ruler.mjs @@ -158,7 +158,7 @@ Ruler.prototype.before = function (beforeName, ruleName, fn, options) { this.__rules__.splice(index, 0, { name: ruleName, enabled: true, - fn: fn, + fn, alt: opt.alt || [] }) @@ -199,7 +199,7 @@ Ruler.prototype.after = function (afterName, ruleName, fn, options) { this.__rules__.splice(index + 1, 0, { name: ruleName, enabled: true, - fn: fn, + fn, alt: opt.alt || [] }) @@ -235,7 +235,7 @@ Ruler.prototype.push = function (ruleName, fn, options) { this.__rules__.push({ name: ruleName, enabled: true, - fn: fn, + fn, alt: opt.alt || [] }) diff --git a/lib/rules_block/list.mjs b/lib/rules_block/list.mjs index 5fe4ec6..4d96ab7 100644 --- a/lib/rules_block/list.mjs +++ b/lib/rules_block/list.mjs @@ -90,11 +90,7 @@ function markTightParagraphs (state, idx) { export default function list (state, startLine, endLine, silent) { - let max, - pos, - start, - token - + let max, pos, start, token let nextLine = startLine let tight = true diff --git a/lib/rules_block/reference.mjs b/lib/rules_block/reference.mjs index 4d699f4..dfb55a9 100644 --- a/lib/rules_block/reference.mjs +++ b/lib/rules_block/reference.mjs @@ -171,7 +171,7 @@ export default function reference (state, startLine, _endLine, silent) { state.env.references = {} } if (typeof state.env.references[label] === 'undefined') { - state.env.references[label] = { title: title, href: href } + state.env.references[label] = { title, href } } state.parentType = oldParentType diff --git a/lib/rules_block/state_block.mjs b/lib/rules_block/state_block.mjs index 7a07c7d..5d2ce9d 100644 --- a/lib/rules_block/state_block.mjs +++ b/lib/rules_block/state_block.mjs @@ -36,8 +36,10 @@ function StateBlock (src, md, env, tokens) { this.bsCount = [] // block parser variables - this.blkIndent = 0 // required block content indent (for example, if we are - // inside a list, it would be positioned after list marker) + + // required block content indent (for example, if we are + // inside a list, it would be positioned after list marker) + this.blkIndent = 0 this.line = 0 // line index in src this.lineMax = 0 // lines count this.tight = false // loose/tight mode for lists diff --git a/lib/rules_inline/autolink.mjs b/lib/rules_inline/autolink.mjs index b38c89d..f2894cd 100644 --- a/lib/rules_inline/autolink.mjs +++ b/lib/rules_inline/autolink.mjs @@ -1,8 +1,9 @@ // Process autolinks '' /* eslint max-len:0 */ -const EMAIL_RE = /^([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)$/ -const AUTOLINK_RE = /^([a-zA-Z][a-zA-Z0-9+.\-]{1,31}):([^<>\x00-\x20]*)$/ +const EMAIL_RE = /^([a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)$/ +/* eslint-disable-next-line no-control-regex */ +const AUTOLINK_RE = /^([a-zA-Z][a-zA-Z0-9+.-]{1,31}):([^<>\x00-\x20]*)$/ export default function autolink (state, silent) { diff --git a/lib/rules_inline/balance_pairs.mjs b/lib/rules_inline/balance_pairs.mjs index 261ec91..bc74606 100644 --- a/lib/rules_inline/balance_pairs.mjs +++ b/lib/rules_inline/balance_pairs.mjs @@ -39,6 +39,7 @@ function processDelimiters (delimiters) { // for each marker, each delimiter length modulo 3, // and for whether this closer can be an opener; // https://github.com/commonmark/cmark/commit/34250e12ccebdc6372b8b49c44fab57c72443460 + /* eslint-disable-next-line no-prototype-builtins */ if (!openersBottom.hasOwnProperty(closer.marker)) { openersBottom[closer.marker] = [-1, -1, -1, -1, -1, -1] } @@ -78,9 +79,9 @@ function processDelimiters (delimiters) { // the entire sequence in future checks. This is required to make // sure algorithm has linear complexity (see *_*_*_*_*_... case). // - const lastJump = openerIdx > 0 && !delimiters[openerIdx - 1].open ? - jumps[openerIdx - 1] + 1 : - 0 + const lastJump = openerIdx > 0 && !delimiters[openerIdx - 1].open + ? jumps[openerIdx - 1] + 1 + : 0 jumps[closerIdx] = closerIdx - openerIdx + lastJump jumps[openerIdx] = lastJump diff --git a/lib/rules_inline/emphasis.mjs b/lib/rules_inline/emphasis.mjs index 60d5f4f..16b1bb5 100644 --- a/lib/rules_inline/emphasis.mjs +++ b/lib/rules_inline/emphasis.mjs @@ -20,7 +20,7 @@ function emphasis_tokenize (state, silent) { state.delimiters.push({ // Char code of the starting marker (number). // - marker: marker, + marker, // Total length of these series of delimiters. // diff --git a/lib/rules_inline/state_inline.mjs b/lib/rules_inline/state_inline.mjs index c07eba0..4cb2554 100644 --- a/lib/rules_inline/state_inline.mjs +++ b/lib/rules_inline/state_inline.mjs @@ -136,11 +136,7 @@ StateInline.prototype.scanDelims = function (start, canSplitWord) { can_close = right_flanking } - return { - can_open: can_open, - can_close: can_close, - length: count - } + return { can_open, can_close, length: count } } diff --git a/lib/rules_inline/strikethrough.mjs b/lib/rules_inline/strikethrough.mjs index 3b639bb..fea8514 100644 --- a/lib/rules_inline/strikethrough.mjs +++ b/lib/rules_inline/strikethrough.mjs @@ -30,7 +30,7 @@ function strikethrough_tokenize (state, silent) { token.content = ch + ch state.delimiters.push({ - marker: marker, + marker, length: 0, // disable "rule of 3" length checks meant for emphasis token: state.tokens.length - 1, end: -1, diff --git a/package.json b/package.json index ae0a61e..0d0fd4d 100644 --- a/package.json +++ b/package.json @@ -65,6 +65,7 @@ "c8": "^8.0.1", "chai": "^4.2.0", "eslint": "^8.4.1", + "eslint-config-standard": "^17.1.0", "express": "^4.14.0", "gh-pages": "^6.1.0", "highlight.js": "^11.9.0", diff --git a/support/demo_template/index.mjs b/support/demo_template/index.mjs index b40704a..90645f4 100644 --- a/support/demo_template/index.mjs +++ b/support/demo_template/index.mjs @@ -37,7 +37,7 @@ defaults.highlight = function (str, lang) { try { if (!defaults._highlight) { - throw 'highlighting disabled' + throw new Error('highlighting disabled') } if (lang && lang !== 'auto' && hljs.getLanguage(lang)) { @@ -167,7 +167,7 @@ function updateResult () { if (source) { // serialize state - source and options permalink.href = '#md3=' + mdurl.encode(JSON.stringify({ - source: source, + source, defaults: _.omit(defaults, 'highlight') }), '-_.!~', false) } else { diff --git a/support/demo_template/rollup.config.mjs b/support/demo_template/rollup.config.mjs index 9536977..46be5fb 100644 --- a/support/demo_template/rollup.config.mjs +++ b/support/demo_template/rollup.config.mjs @@ -28,7 +28,7 @@ export default [ format: 'umd', name: 'markdownit' }, - plugins: plugins + plugins }, { input: 'support/demo_template/index.mjs', @@ -37,6 +37,6 @@ export default [ format: 'iife', name: 'demo' }, - plugins: plugins + plugins } ] diff --git a/support/specsplit.mjs b/support/specsplit.mjs index 2e386e2..a2e8a51 100755 --- a/support/specsplit.mjs +++ b/support/specsplit.mjs @@ -84,22 +84,17 @@ readFile(options.spec, 'utf8', function (error, input) { const html = arr[1].replace(/^\n/, '') const result = { - md: md, - html: html, + md, + html, line: token.map[0], - err: '' + err: '' } - try { - if (markdown.render(md) === normalize(html)) { - good.push(result) - } else { - result.err = markdown.render(md) - bad.push(result) - } - } catch (___) { - // bad.push(result); - throw ___ + if (markdown.render(md) === normalize(html)) { + good.push(result) + } else { + result.err = markdown.render(md) + bad.push(result) } }) diff --git a/test/babelmark-responder.mjs b/test/babelmark-responder.mjs index 1f08155..4677dd2 100644 --- a/test/babelmark-responder.mjs +++ b/test/babelmark-responder.mjs @@ -16,7 +16,7 @@ describe('babelmark responder app', function () { ['../support/babelmark-responder.mjs'], { cwd: new URL('.', import.meta.url), - env: Object.assign({}, process.env, { PORT: PORT }) + env: Object.assign({}, process.env, { PORT }) } ) diff --git a/test/pathological.mjs b/test/pathological.mjs index 666901c..8c1731c 100644 --- a/test/pathological.mjs +++ b/test/pathological.mjs @@ -20,10 +20,10 @@ async function test_pattern (str) { try { result = await Promise.race([ worker.render(str), - new Promise((_, reject) => setTimeout(() => reject(new Error('Terminated (timeout exceeded)')), 3000).unref()) + new Promise((resolve, reject) => { + setTimeout(() => reject(new Error('Terminated (timeout exceeded)')), 3000).unref() + }) ]) - } catch (e) { - throw e } finally { ac.abort() await worker.end()