Browse Source

standard: more tweaks & simplify eslint config

pull/979/head
Vitaly Puzrin 5 months ago
parent
commit
efc714f702
  1. 152
      .eslintrc.yml
  2. 16
      benchmark/benchmark.mjs
  3. 4
      bin/markdown-it.mjs
  4. 7
      lib/common/utils.mjs
  5. 2
      lib/index.mjs
  6. 9
      lib/renderer.mjs
  7. 6
      lib/ruler.mjs
  8. 6
      lib/rules_block/list.mjs
  9. 2
      lib/rules_block/reference.mjs
  10. 6
      lib/rules_block/state_block.mjs
  11. 5
      lib/rules_inline/autolink.mjs
  12. 7
      lib/rules_inline/balance_pairs.mjs
  13. 2
      lib/rules_inline/emphasis.mjs
  14. 6
      lib/rules_inline/state_inline.mjs
  15. 2
      lib/rules_inline/strikethrough.mjs
  16. 1
      package.json
  17. 4
      support/demo_template/index.mjs
  18. 4
      support/demo_template/rollup.config.mjs
  19. 21
      support/specsplit.mjs
  20. 2
      test/babelmark-responder.mjs
  21. 6
      test/pathological.mjs

152
.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

16
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 })
})

4
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))

7
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)

2
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
}

9
lib/renderer.mjs

@ -72,15 +72,10 @@ default_rules.fence = function (tokens, idx, options, env, slf) {
attrs: tmpAttrs
}
return '<pre><code' + slf.renderAttrs(tmpToken) + '>'
+ highlighted
+ '</code></pre>\n'
return `<pre><code${slf.renderAttrs(tmpToken)}>${highlighted}</code></pre>\n`
}
return '<pre><code' + slf.renderAttrs(token) + '>'
+ highlighted
+ '</code></pre>\n'
return `<pre><code${slf.renderAttrs(token)}>${highlighted}</code></pre>\n`
}

6
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 || []
})

6
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

2
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

6
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

5
lib/rules_inline/autolink.mjs

@ -1,8 +1,9 @@
// Process autolinks '<protocol:...>'
/* 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) {

7
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

2
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.
//

6
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 }
}

2
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,

1
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",

4
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 {

4
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
}
]

21
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)
}
})

2
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 })
}
)

6
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()

Loading…
Cancel
Save