Browse Source

standard: more tweaks & simplify eslint config

pull/979/head
Vitaly Puzrin 6 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: env:
es6: true es6: true
node: true node: true
@ -14,153 +16,13 @@ overrides:
no-restricted-globals: [ 2, require, __dirname ] no-restricted-globals: [ 2, require, __dirname ]
ignorePatterns: ignorePatterns:
- coverage/
- demo/ - demo/
- dist/ - dist/
- node_modules
- benchmark/extra/ - benchmark/extra/
rules: rules:
no-var: 2 camelcase: 0
prefer-const: 2 key-spacing: 0
no-const-assign: 2 no-multi-spaces: 0
accessor-pairs: 2 no-multiple-empty-lines: 0
array-bracket-spacing: [ 2, never ] padded-blocks: 0
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 } ]

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 filepath = new URL(`./implementations/${name}/index.mjs`, import.meta.url)
const code = (await import(filepath)) const code = (await import(filepath))
IMPLS.push({ IMPLS.push({ name, code })
name: name,
code: code
})
} }
const SAMPLES = [] const SAMPLES = []
@ -39,7 +36,7 @@ fs.readdirSync(new URL('./samples', import.meta.url)).sort().forEach(sample => {
title, title,
{ {
onStart: () => { console.log('\nSample: %s %s', 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.eraseLine()
cursor.write(' > ' + event.target) cursor.write(' > ' + event.target)
}, },
onComplete: onComplete, onComplete,
fn: function () { impl.code.run(content.string) } fn: function () { impl.code.run(content.string) }
} }
) )
}) })
SAMPLES.push({ SAMPLES.push({ name: sample.split('.')[0], title, content, suite })
name: sample.split('.')[0],
title: title,
content: content,
suite: suite
})
}) })

4
bin/markdown-it.mjs

@ -76,7 +76,7 @@ readFile(options.file, 'utf8', function (err, input) {
} }
console.error( console.error(
options.trace && err.stack || (options.trace && err.stack) ||
err.message || err.message ||
String(err)) String(err))
@ -95,7 +95,7 @@ readFile(options.file, 'utf8', function (err, input) {
} catch (e) { } catch (e) {
console.error( console.error(
options.trace && e.stack || (options.trace && e.stack) ||
e.message || e.message ||
String(e)) 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 ENTITY_RE = /&([a-z#][a-z0-9]{1,31});/gi
const UNESCAPE_ALL_RE = new RegExp(UNESCAPE_MD_RE.source + '|' + ENTITY_RE.source, '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) { function replaceEntityPattern (match, name) {
if (name.charCodeAt(0) === 0x23/* # */ && DIGITAL_ENTITY_TEST_RE.test(name)) { if (name.charCodeAt(0) === 0x23/* # */ && DIGITAL_ENTITY_TEST_RE.test(name)) {
const code = name[1].toLowerCase() === 'x' ? const code = name[1].toLowerCase() === 'x'
parseInt(name.slice(2), 16) : parseInt(name.slice(1), 10) ? parseInt(name.slice(2), 16)
: parseInt(name.slice(1), 10)
if (isValidEntityCode(code)) { if (isValidEntityCode(code)) {
return fromCodePoint(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 // url should be normalized at this point, and existing entities are decoded
const str = url.trim().toLowerCase() 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 attrs: tmpAttrs
} }
return '<pre><code' + slf.renderAttrs(tmpToken) + '>' return `<pre><code${slf.renderAttrs(tmpToken)}>${highlighted}</code></pre>\n`
+ 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, { this.__rules__.splice(index, 0, {
name: ruleName, name: ruleName,
enabled: true, enabled: true,
fn: fn, fn,
alt: opt.alt || [] alt: opt.alt || []
}) })
@ -199,7 +199,7 @@ Ruler.prototype.after = function (afterName, ruleName, fn, options) {
this.__rules__.splice(index + 1, 0, { this.__rules__.splice(index + 1, 0, {
name: ruleName, name: ruleName,
enabled: true, enabled: true,
fn: fn, fn,
alt: opt.alt || [] alt: opt.alt || []
}) })
@ -235,7 +235,7 @@ Ruler.prototype.push = function (ruleName, fn, options) {
this.__rules__.push({ this.__rules__.push({
name: ruleName, name: ruleName,
enabled: true, enabled: true,
fn: fn, fn,
alt: opt.alt || [] 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) { export default function list (state, startLine, endLine, silent) {
let max, let max, pos, start, token
pos,
start,
token
let nextLine = startLine let nextLine = startLine
let tight = true let tight = true

2
lib/rules_block/reference.mjs

@ -171,7 +171,7 @@ export default function reference (state, startLine, _endLine, silent) {
state.env.references = {} state.env.references = {}
} }
if (typeof state.env.references[label] === 'undefined') { if (typeof state.env.references[label] === 'undefined') {
state.env.references[label] = { title: title, href: href } state.env.references[label] = { title, href }
} }
state.parentType = oldParentType state.parentType = oldParentType

6
lib/rules_block/state_block.mjs

@ -36,8 +36,10 @@ function StateBlock (src, md, env, tokens) {
this.bsCount = [] this.bsCount = []
// block parser variables // 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.line = 0 // line index in src
this.lineMax = 0 // lines count this.lineMax = 0 // lines count
this.tight = false // loose/tight mode for lists this.tight = false // loose/tight mode for lists

5
lib/rules_inline/autolink.mjs

@ -1,8 +1,9 @@
// Process autolinks '<protocol:...>' // Process autolinks '<protocol:...>'
/* eslint max-len:0 */ /* 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 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]*)$/ /* 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) { 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, // for each marker, each delimiter length modulo 3,
// and for whether this closer can be an opener; // and for whether this closer can be an opener;
// https://github.com/commonmark/cmark/commit/34250e12ccebdc6372b8b49c44fab57c72443460 // https://github.com/commonmark/cmark/commit/34250e12ccebdc6372b8b49c44fab57c72443460
/* eslint-disable-next-line no-prototype-builtins */
if (!openersBottom.hasOwnProperty(closer.marker)) { if (!openersBottom.hasOwnProperty(closer.marker)) {
openersBottom[closer.marker] = [-1, -1, -1, -1, -1, -1] 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 // the entire sequence in future checks. This is required to make
// sure algorithm has linear complexity (see *_*_*_*_*_... case). // sure algorithm has linear complexity (see *_*_*_*_*_... case).
// //
const lastJump = openerIdx > 0 && !delimiters[openerIdx - 1].open ? const lastJump = openerIdx > 0 && !delimiters[openerIdx - 1].open
jumps[openerIdx - 1] + 1 : ? jumps[openerIdx - 1] + 1
0 : 0
jumps[closerIdx] = closerIdx - openerIdx + lastJump jumps[closerIdx] = closerIdx - openerIdx + lastJump
jumps[openerIdx] = lastJump jumps[openerIdx] = lastJump

2
lib/rules_inline/emphasis.mjs

@ -20,7 +20,7 @@ function emphasis_tokenize (state, silent) {
state.delimiters.push({ state.delimiters.push({
// Char code of the starting marker (number). // Char code of the starting marker (number).
// //
marker: marker, marker,
// Total length of these series of delimiters. // 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 can_close = right_flanking
} }
return { return { can_open, can_close, length: count }
can_open: can_open,
can_close: can_close,
length: count
}
} }

2
lib/rules_inline/strikethrough.mjs

@ -30,7 +30,7 @@ function strikethrough_tokenize (state, silent) {
token.content = ch + ch token.content = ch + ch
state.delimiters.push({ state.delimiters.push({
marker: marker, marker,
length: 0, // disable "rule of 3" length checks meant for emphasis length: 0, // disable "rule of 3" length checks meant for emphasis
token: state.tokens.length - 1, token: state.tokens.length - 1,
end: -1, end: -1,

1
package.json

@ -65,6 +65,7 @@
"c8": "^8.0.1", "c8": "^8.0.1",
"chai": "^4.2.0", "chai": "^4.2.0",
"eslint": "^8.4.1", "eslint": "^8.4.1",
"eslint-config-standard": "^17.1.0",
"express": "^4.14.0", "express": "^4.14.0",
"gh-pages": "^6.1.0", "gh-pages": "^6.1.0",
"highlight.js": "^11.9.0", "highlight.js": "^11.9.0",

4
support/demo_template/index.mjs

@ -37,7 +37,7 @@ defaults.highlight = function (str, lang) {
try { try {
if (!defaults._highlight) { if (!defaults._highlight) {
throw 'highlighting disabled' throw new Error('highlighting disabled')
} }
if (lang && lang !== 'auto' && hljs.getLanguage(lang)) { if (lang && lang !== 'auto' && hljs.getLanguage(lang)) {
@ -167,7 +167,7 @@ function updateResult () {
if (source) { if (source) {
// serialize state - source and options // serialize state - source and options
permalink.href = '#md3=' + mdurl.encode(JSON.stringify({ permalink.href = '#md3=' + mdurl.encode(JSON.stringify({
source: source, source,
defaults: _.omit(defaults, 'highlight') defaults: _.omit(defaults, 'highlight')
}), '-_.!~', false) }), '-_.!~', false)
} else { } else {

4
support/demo_template/rollup.config.mjs

@ -28,7 +28,7 @@ export default [
format: 'umd', format: 'umd',
name: 'markdownit' name: 'markdownit'
}, },
plugins: plugins plugins
}, },
{ {
input: 'support/demo_template/index.mjs', input: 'support/demo_template/index.mjs',
@ -37,6 +37,6 @@ export default [
format: 'iife', format: 'iife',
name: 'demo' 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 html = arr[1].replace(/^\n/, '')
const result = { const result = {
md: md, md,
html: html, html,
line: token.map[0], line: token.map[0],
err: '' err: ''
} }
try { if (markdown.render(md) === normalize(html)) {
if (markdown.render(md) === normalize(html)) { good.push(result)
good.push(result) } else {
} else { result.err = markdown.render(md)
result.err = markdown.render(md) bad.push(result)
bad.push(result)
}
} catch (___) {
// bad.push(result);
throw ___
} }
}) })

2
test/babelmark-responder.mjs

@ -16,7 +16,7 @@ describe('babelmark responder app', function () {
['../support/babelmark-responder.mjs'], ['../support/babelmark-responder.mjs'],
{ {
cwd: new URL('.', import.meta.url), 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 { try {
result = await Promise.race([ result = await Promise.race([
worker.render(str), 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 { } finally {
ac.abort() ac.abort()
await worker.end() await worker.end()

Loading…
Cancel
Save