From 3bdc88cecb6ed117312e2860e3c84afc5b803d69 Mon Sep 17 00:00:00 2001
From: Baptiste Augrain
Date: Sat, 25 Aug 2018 23:14:05 +0200
Subject: [PATCH 1/4] fixing sanitization of inline html like () #1992
---
browser/lib/markdown-it-sanitize-html.js | 86 +++++++++++++++++++++++-
browser/lib/markdown.js | 6 +-
2 files changed, 90 insertions(+), 2 deletions(-)
diff --git a/browser/lib/markdown-it-sanitize-html.js b/browser/lib/markdown-it-sanitize-html.js
index 05e5e7be..ea27bfa0 100644
--- a/browser/lib/markdown-it-sanitize-html.js
+++ b/browser/lib/markdown-it-sanitize-html.js
@@ -2,6 +2,7 @@
import sanitizeHtml from 'sanitize-html'
import { escapeHtmlCharacters } from './utils'
+import url from 'url'
module.exports = function sanitizePlugin (md, options) {
options = options || {}
@@ -25,7 +26,7 @@ module.exports = function sanitizePlugin (md, options) {
const inlineTokens = state.tokens[tokenIdx].children
for (let childIdx = 0; childIdx < inlineTokens.length; childIdx++) {
if (inlineTokens[childIdx].type === 'html_inline') {
- inlineTokens[childIdx].content = sanitizeHtml(
+ inlineTokens[childIdx].content = sanitizeInline(
inlineTokens[childIdx].content,
options
)
@@ -35,3 +36,86 @@ module.exports = function sanitizePlugin (md, options) {
}
})
}
+
+const tag_regex = /<([A-Z][A-Z0-9]*)\s*((?:\s*[A-Z][A-Z0-9]*(?:="(?:[^\"]+)\")?)*)\s*>|<\/([A-Z][A-Z0-9]*)\s*>/i
+const attributes_regex = /([A-Z][A-Z0-9]*)(="[^\"]+\")?/ig
+
+function sanitizeInline(html, options) {
+ let match = tag_regex.exec(html)
+ if (!match) {
+ return ''
+ }
+
+ const { allowedTags, allowedAttributes, allowedIframeHostnames, selfClosing, allowedSchemesAppliedToAttributes } = options
+
+ if (match[1] !== null) {
+ // opening tag
+ const tag = match[1].toLowerCase()
+ if (allowedTags.indexOf(tag) === -1) {
+ return ''
+ }
+
+ const attributes = match[2]
+
+ let attrs = ''
+ let name
+ let value
+
+ while ((match = attributes_regex.exec(attributes))) {
+ name = match[1].toLowerCase()
+ value = match[2]
+
+ if (allowedAttributes['*'].indexOf(name) !== -1 || (allowedAttributes[tag] && allowedAttributes[tag].indexOf(name) !== -1)) {
+ if (allowedSchemesAppliedToAttributes.indexOf(name) !== -1) {
+ if (naughtyHRef(value) || (tag === 'iframe' && name === 'src' && naughtyIFrame(value))) {
+ continue
+ }
+ }
+
+ attrs += ` ${name}${value}`
+ }
+ }
+
+ if (selfClosing.indexOf(tag)) {
+ return '<' + tag + attrs + ' />'
+ } else {
+ return '<' + tag + attrs + '>'
+ }
+ } else {
+ // closing tag
+ if (allowedTags.indexOf(match[3].toLowerCase()) !== -1) {
+ return html
+ } else {
+ return ''
+ }
+ }
+}
+
+function naughtyHRef(name, href, options) {
+ href = href.replace(/[\x00-\x20]+/g, '')
+ href = href.replace(/<\!\-\-.*?\-\-\>/g, '')
+
+ const matches = href.match(/^([a-zA-Z]+)\:/)
+ if (!matches) {
+ if (href.match(/^[\/\\]{2}/)) {
+ return !options.allowProtocolRelative
+ }
+
+ // No scheme
+ return false
+ }
+
+ const scheme = matches[1].toLowerCase()
+
+ return options.allowedSchemes.indexOf(scheme) === -1
+}
+
+function naughtyIFrame(src) {
+ try {
+ const parsed = url.parse(src, false, true)
+
+ return allowedIframeHostnames.index(parsed.hostname) === -1
+ } catch (e) {
+ return true
+ }
+}
\ No newline at end of file
diff --git a/browser/lib/markdown.js b/browser/lib/markdown.js
index 49fd2f86..90b1ccea 100644
--- a/browser/lib/markdown.js
+++ b/browser/lib/markdown.js
@@ -105,7 +105,11 @@ class Markdown {
'iframe': ['src', 'width', 'height', 'frameborder', 'allowfullscreen'],
'input': ['type', 'id', 'checked']
},
- allowedIframeHostnames: ['www.youtube.com']
+ allowedIframeHostnames: ['www.youtube.com'],
+ selfClosing: [ 'img', 'br', 'hr', 'input' ],
+ allowedSchemes: [ 'http', 'https', 'ftp', 'mailto' ],
+ allowedSchemesAppliedToAttributes: [ 'href', 'src', 'cite' ],
+ allowProtocolRelative: true
})
}
From fabc975b2025c12402312862c26abfb12bcc00b4 Mon Sep 17 00:00:00 2001
From: Baptiste Augrain
Date: Sat, 25 Aug 2018 23:36:43 +0200
Subject: [PATCH 2/4] - fix lint errors - correctly parse self-closed tag - fix
naughty functions
---
browser/lib/markdown-it-sanitize-html.js | 46 ++++++++++++------------
1 file changed, 23 insertions(+), 23 deletions(-)
diff --git a/browser/lib/markdown-it-sanitize-html.js b/browser/lib/markdown-it-sanitize-html.js
index ea27bfa0..9bdd3034 100644
--- a/browser/lib/markdown-it-sanitize-html.js
+++ b/browser/lib/markdown-it-sanitize-html.js
@@ -37,45 +37,45 @@ module.exports = function sanitizePlugin (md, options) {
})
}
-const tag_regex = /<([A-Z][A-Z0-9]*)\s*((?:\s*[A-Z][A-Z0-9]*(?:="(?:[^\"]+)\")?)*)\s*>|<\/([A-Z][A-Z0-9]*)\s*>/i
-const attributes_regex = /([A-Z][A-Z0-9]*)(="[^\"]+\")?/ig
+const tagRegex = /<([A-Z][A-Z0-9]*)\s*((?:\s*[A-Z][A-Z0-9]*(?:="(?:[^\"]+)\")?)*)\s*\/?>|<\/([A-Z][A-Z0-9]*)\s*>/i
+const attributesRegex = /([A-Z][A-Z0-9]*)(="[^\"]+\")?/ig
-function sanitizeInline(html, options) {
- let match = tag_regex.exec(html)
+function sanitizeInline (html, options) {
+ let match = tagRegex.exec(html)
if (!match) {
return ''
}
-
- const { allowedTags, allowedAttributes, allowedIframeHostnames, selfClosing, allowedSchemesAppliedToAttributes } = options
-
- if (match[1] !== null) {
+
+ const { allowedTags, allowedAttributes, selfClosing, allowedSchemesAppliedToAttributes } = options
+
+ if (match[1] !== undefined) {
// opening tag
const tag = match[1].toLowerCase()
if (allowedTags.indexOf(tag) === -1) {
return ''
}
-
+
const attributes = match[2]
-
+
let attrs = ''
let name
let value
-
- while ((match = attributes_regex.exec(attributes))) {
+
+ while ((match = attributesRegex.exec(attributes))) {
name = match[1].toLowerCase()
value = match[2]
-
+
if (allowedAttributes['*'].indexOf(name) !== -1 || (allowedAttributes[tag] && allowedAttributes[tag].indexOf(name) !== -1)) {
if (allowedSchemesAppliedToAttributes.indexOf(name) !== -1) {
- if (naughtyHRef(value) || (tag === 'iframe' && name === 'src' && naughtyIFrame(value))) {
+ if (naughtyHRef(value, options) || (tag === 'iframe' && name === 'src' && naughtyIFrame(value, options))) {
continue
}
}
-
+
attrs += ` ${name}${value}`
}
}
-
+
if (selfClosing.indexOf(tag)) {
return '<' + tag + attrs + ' />'
} else {
@@ -91,10 +91,10 @@ function sanitizeInline(html, options) {
}
}
-function naughtyHRef(name, href, options) {
- href = href.replace(/[\x00-\x20]+/g, '')
+function naughtyHRef (href, options) {
+ // href = href.replace(/[\x00-\x20]+/g, '')
href = href.replace(/<\!\-\-.*?\-\-\>/g, '')
-
+
const matches = href.match(/^([a-zA-Z]+)\:/)
if (!matches) {
if (href.match(/^[\/\\]{2}/)) {
@@ -110,12 +110,12 @@ function naughtyHRef(name, href, options) {
return options.allowedSchemes.indexOf(scheme) === -1
}
-function naughtyIFrame(src) {
+function naughtyIFrame (src, options) {
try {
const parsed = url.parse(src, false, true)
-
- return allowedIframeHostnames.index(parsed.hostname) === -1
+
+ return options.allowedIframeHostnames.index(parsed.hostname) === -1
} catch (e) {
return true
}
-}
\ No newline at end of file
+}
From 2a838ebb0b46bad08f54f46256396fac1c52c02a Mon Sep 17 00:00:00 2001
From: Baptiste Augrain
Date: Sun, 26 Aug 2018 00:14:29 +0200
Subject: [PATCH 3/4] fixing single quoted attributes
---
browser/lib/markdown-it-sanitize-html.js | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/browser/lib/markdown-it-sanitize-html.js b/browser/lib/markdown-it-sanitize-html.js
index 9bdd3034..ce6c5e29 100644
--- a/browser/lib/markdown-it-sanitize-html.js
+++ b/browser/lib/markdown-it-sanitize-html.js
@@ -37,8 +37,8 @@ module.exports = function sanitizePlugin (md, options) {
})
}
-const tagRegex = /<([A-Z][A-Z0-9]*)\s*((?:\s*[A-Z][A-Z0-9]*(?:="(?:[^\"]+)\")?)*)\s*\/?>|<\/([A-Z][A-Z0-9]*)\s*>/i
-const attributesRegex = /([A-Z][A-Z0-9]*)(="[^\"]+\")?/ig
+const tagRegex = /<([A-Z][A-Z0-9]*)\s*((?:\s*[A-Z][A-Z0-9]*(?:=("|')(?:[^\3]+?)\3)?)*)\s*\/?>|<\/([A-Z][A-Z0-9]*)\s*>/i
+const attributesRegex = /([A-Z][A-Z0-9]*)(?:=("|')([^\2]+?)\2)?/ig
function sanitizeInline (html, options) {
let match = tagRegex.exec(html)
@@ -63,7 +63,7 @@ function sanitizeInline (html, options) {
while ((match = attributesRegex.exec(attributes))) {
name = match[1].toLowerCase()
- value = match[2]
+ value = match[3]
if (allowedAttributes['*'].indexOf(name) !== -1 || (allowedAttributes[tag] && allowedAttributes[tag].indexOf(name) !== -1)) {
if (allowedSchemesAppliedToAttributes.indexOf(name) !== -1) {
@@ -72,7 +72,10 @@ function sanitizeInline (html, options) {
}
}
- attrs += ` ${name}${value}`
+ attrs += ` ${name}`
+ if (match[2]) {
+ attrs += `="${value}"`
+ }
}
}
@@ -83,7 +86,7 @@ function sanitizeInline (html, options) {
}
} else {
// closing tag
- if (allowedTags.indexOf(match[3].toLowerCase()) !== -1) {
+ if (allowedTags.indexOf(match[4].toLowerCase()) !== -1) {
return html
} else {
return ''
From bacbfc8615dc27e76f0265e221c7c2ab154bdc5e Mon Sep 17 00:00:00 2001
From: Baptiste Augrain
Date: Sat, 15 Sep 2018 10:43:41 +0200
Subject: [PATCH 4/4] add test
---
browser/lib/markdown-it-sanitize-html.js | 6 +-
tests/fixtures/markdowns.js | 5 +-
tests/lib/markdown-test.js | 5 ++
tests/lib/snapshots/markdown-test.js.md | 8 ++
tests/lib/snapshots/markdown-test.js.snap | Bin 1724 -> 1781 bytes
yarn.lock | 100 +++++++++++++++++++++-
6 files changed, 116 insertions(+), 8 deletions(-)
diff --git a/browser/lib/markdown-it-sanitize-html.js b/browser/lib/markdown-it-sanitize-html.js
index ce6c5e29..bd3d452e 100644
--- a/browser/lib/markdown-it-sanitize-html.js
+++ b/browser/lib/markdown-it-sanitize-html.js
@@ -79,10 +79,10 @@ function sanitizeInline (html, options) {
}
}
- if (selfClosing.indexOf(tag)) {
- return '<' + tag + attrs + ' />'
- } else {
+ if (selfClosing.indexOf(tag) === -1) {
return '<' + tag + attrs + '>'
+ } else {
+ return '<' + tag + attrs + ' />'
}
} else {
// closing tag
diff --git a/tests/fixtures/markdowns.js b/tests/fixtures/markdowns.js
index 69e335e0..312e6c18 100644
--- a/tests/fixtures/markdowns.js
+++ b/tests/fixtures/markdowns.js
@@ -50,11 +50,14 @@ const smartQuotes = 'This is a "QUOTE".'
const breaks = 'This is the first line.\nThis is the second line.'
+const shortcuts = 'Ctrl\n\n[[Ctrl]]'
+
export default {
basic,
codeblock,
katex,
checkboxes,
smartQuotes,
- breaks
+ breaks,
+ shortcuts
}
diff --git a/tests/lib/markdown-test.js b/tests/lib/markdown-test.js
index 73b68799..0e330a65 100644
--- a/tests/lib/markdown-test.js
+++ b/tests/lib/markdown-test.js
@@ -43,3 +43,8 @@ test('Markdown.render() should render line breaks correctly', t => {
const renderedNonBreaks = newmd.render(markdownFixtures.breaks)
t.snapshot(renderedNonBreaks)
})
+
+test('Markdown.render() should render shortcuts correctly', t => {
+ const rendered = md.render(markdownFixtures.shortcuts)
+ t.snapshot(rendered)
+})
diff --git a/tests/lib/snapshots/markdown-test.js.md b/tests/lib/snapshots/markdown-test.js.md
index ffc3d699..0079ca07 100644
--- a/tests/lib/snapshots/markdown-test.js.md
+++ b/tests/lib/snapshots/markdown-test.js.md
@@ -18,6 +18,14 @@ Generated by [AVA](https://ava.li).
This is the second line.
␊
`
+## Markdown.render() should render shortcuts correctly
+
+> Snapshot 1
+
+ `Ctrl
␊
+ Ctrl
␊
+ `
+
## Markdown.render() should renders KaTeX correctly
> Snapshot 1
diff --git a/tests/lib/snapshots/markdown-test.js.snap b/tests/lib/snapshots/markdown-test.js.snap
index fc310cfd28f22b2e7d20fa14c94bd5f9b806b0fd..3bea19c97db969ec7db9323a534197aef7787d4f 100644
GIT binary patch
literal 1781
zcmVRzVR7R5g7j)UW=zVct#F&~Qv00000000y1
zS6zr4MIP^64-(?Roq9g_WZAL?OnQ1gcC)j|Omq8@HOXyEyci=VMyk7Ow`-@ntGB9p
zClfDR@QZ^x6M~>9ns9H2PeJiXJkAFZMC1fPL`2DxJ}EwUFDKr=s(X58W@kTg(R;FC
zdTRb3zyDX&zy9;SVHi7%f9<^e^$$OK{9@&`&+PR3<=>1L>bbnbFv5rbe*W&~N3TBd
z-Q_<$v+%1&M>O@XI}PKue>A^re)#;kcbs|8NTYvlD
zp?~iBYV;??d
z7xwHnZBctRWT|hR=)@k4m$aud5NMjH8UqLA9CQzkk^?B?i5s@6P^~#tpJ|UX$k!YZ
zEy)t?z)|MXkXVoaVLFFcTWv7`3Rz-QRT0)&DA&?S$+VEtx?%SYuBu9_Gc?O$Sj)`n
zB4-h52+3Kz
zNA|koUYX3!`!tu-gRL~py@0Ng-lIQlIyo2RT-60$+N=vefG(A#uwz%FV@Hmslcw`~
z;;Y_wFkT9&2)4+MYH(aD=nV0-9`YCwb^&%G!SM}&dGQ+9Y@nLRR(0D1Y&ls2JA%Qr
zezZ-BP@Twc6&6KltQudQ{`%b5jJiX*bV&TOZ*DX3)2B|IZ9&_%A_hQv1e98=)l8?_
z#m&F8XSvEUV60-U?wDobNz_EUi`wr#08uJo(1gGSqW$g8KHDuU$r;P1A_;M4z%R`k
zMuYJ}22ltswEzJU;TR6300L)icvHt~*zj&d%xS`kXx#M?h}s!s{)J;m9Nf(;MkI#RL3?YOa3#UGq^b59OQ*tv
zL?@A0;qq~Ox{CH7_jL6fY_39G6>BXSc9xzY+apV3AR&nebBe8i`aX%9rsOFZNIBe7
zsf3|Rc0xFw*&w#RT&nLIuaqaJiibo8%%QflK606qEE4x#69Nw{
z481(wZQVGKnlV@)7_G2~qr
zVy@heT+_(2eYooez>&R;q;~)=!^jy>_zNWvM%T{2{J_a$4<5XB{uTIdm<(uEH_^Oj
zC1vt}R?e0~^cObNmjOYGlnaRztJHAysNTyJ#AERPIb*Lwp5HF=bzmM@huLVkzB4O%
X*s#?~tMm(1hYS4|fppI->k|L~0KRkM
literal 1724
zcmV;t21EHlRzVSclB0P?_{E4
z@DT(bL4<(f18*Kff+tbDh~PmC2qGdvPI}T)Jc<5Q-P1cWnSE%YCkLjx=6`(utLm?R
zE*XY#tMSd|ZI`cn`^@>$r629&kHve24E1?`lVJoWK015fh2e`YTzmidb8~l`9MaU+
zHXFv>pVfb^U%Bwy7cafM{n{I|_YP_54|f{I;_sV(-6F4k`r+5dKHqZtFFS@b^@FX3
zaq5j@BKEdk{A&5n?`}Ky;)BDQ`hE7@ewSgqa_Hj8$_r1ueImGYYH8bLe^^sR_WcsR
z!^S4<-Ow$@UBl-$)%+4_V2Q1OMx<_*Ohg-X^Ee4S77|M`Yl<-;BPNOIWK<*>%BlC(
zY`^4esrlt@m~sj;9Z;`n`GjjE(xB1`F>f|lE3!sriz5@WBNL^O>XhkdNu(qdx{^d4
zN%Y$XZ@vmv%3y`ga|{l&XhZsSb8KhP1Rc8I%eq-9jhRSruWtHM#$uOkw_2@2nJy%?M?9iN84%-Jzq~Tn~8-&+Q0K-ARTJuQ|2#*sIIW;@AcwK-y(*S3f
zC-O)tBNH>Gqe$TLTkmBqCjmSH>eMjuIhkK^&&OVq@QATUd*^mCYUz~)o^#8`aSZl^
zuwu>{i6`kYm2C@04GSE^*-r?)SQ#brgt$c&EVg;uZ%H5)_J
z;O}6k7pU|TS39h+_Z_rzdv=R9sXZOAq+uOyM;?t9w5L-LXcDU$0|#XsbUzN`-6-XW
z8@8%Ytr=CHNslwg*9;L&$ztum0p`+xSdai=I(u15Z7~4~X<}4W5!PBL)6z*vwUE-f
zVfXedt4gagG|eJd%hc*TXCbNy$yv1EbYyCFM(8^4Ck*dzXM}CK|
z>>rM390M=ScJ6?!kE+j+ecf>{ji={*l1u8rR+{9VPnSve(VsM(jEgd^>H_bq)de6x
zm&!uWw#(tc{fClq(|Lk4RPWmpEd*5f>tshYIIb0RhWJVkd72122Rj_&=!U?&Xa#KA
zS50KSx~&1W7_Wfs$KYBo+8RYDk7c(C3&SK*jW0`ob!KEr-60)1B>weJHkkOy01x<=(_yBdji+Gu5f1`=2zOBP}W=;Tuz0^gLXZrZbB@xN%q$J;GTM_eb7yJO5~!01Ht!Jvc6C8XgBI=Zu?9O+fZK+(aUO|=1#}c>-c^86AOT*-LwtsVoAab#(7H2f-
zg!xM3tEGI!^Oek2DXK_fO~n~CQaK7$hB6j&9?Fb$MBP4&ZpEgV?TOp}KRlR2-kkKP2334z#89k;|lHVLwc%
zP#mj{jjq5{0Y=@N5O`o==;hHat5_&ajE;`3YQV*!-{%m9J*1+ia2CBmN?L*^0m)s0
zNpu0OGoHm)9`E^7S2Z7U0$Z{EFB|C&C|*}0TvuXX*XWj5#p7aSteU#H^iL7Wok01z
zUdq)Z2Go14Er18&z)2K|+o!h-SF*I^Kx%(G*3^w24Xv1o!t}YzsuW743h?^#Gu9=a
z8HxuU!g67J^;1XBsQH`2y(=yFL3Sebte{XT-GRxrs}N!
zs*!beko*4*`Y(3S`mf$`;$x#T`*j?VSTyG#srw`e!ABa!aQn!13_*K7@tQ6>oer3t
zUslfKyHJO=-tQ}%Vp
Svl~TT8}l!i*8=N#6951$K|E{#
diff --git a/yarn.lock b/yarn.lock
index 50374f74..1cc5fb08 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -188,6 +188,12 @@ ansi-escapes@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30"
+ansi-red@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c"
+ dependencies:
+ ansi-wrap "0.1.0"
+
ansi-regex@^0.2.0, ansi-regex@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9"
@@ -218,6 +224,10 @@ ansi-styles@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178"
+ansi-wrap@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf"
+
anymatch@^1.3.0:
version "1.3.2"
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a"
@@ -255,7 +265,7 @@ argparse@^1.0.7, argparse@~1.0.3:
dependencies:
sprintf-js "~1.0.2"
-"argparse@~ 0.1.11":
+"argparse@~ 0.1.11", argparse@~0.1.15:
version "0.1.16"
resolved "https://registry.yarnpkg.com/argparse/-/argparse-0.1.16.tgz#cfd01e0fbba3d6caed049fbd758d40f65196f57c"
dependencies:
@@ -459,6 +469,10 @@ auto-bind@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-1.2.0.tgz#8b7e318aad53d43ba8a8ecaf0066d85d5f798cd6"
+autolinker@~0.15.0:
+ version "0.15.3"
+ resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-0.15.3.tgz#342417d8f2f3461b14cf09088d5edf8791dc9832"
+
autoprefixer@^6.3.1:
version "6.7.7"
resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014"
@@ -1793,7 +1807,7 @@ codemirror@^5.39.0:
version "5.39.0"
resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.39.0.tgz#4654f7d2f7e525e04a62e72d9482348ccb37dce5"
-coffee-script@^1.10.0:
+coffee-script@^1.10.0, coffee-script@^1.12.4:
version "1.12.7"
resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.12.7.tgz#c05dae0cb79591d05b3070a8433a98c9a89ccc53"
@@ -2666,6 +2680,10 @@ devtron@^1.1.0:
highlight.js "^9.3.0"
humanize-plus "^1.8.1"
+diacritics-map@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/diacritics-map/-/diacritics-map-0.1.0.tgz#6dfc0ff9d01000a2edf2865371cac316e94977af"
+
diff@^3.2.0:
version "3.5.0"
resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
@@ -4030,6 +4048,16 @@ graphlibrary@^2.2.0:
dependencies:
lodash "^4.17.5"
+gray-matter@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-2.1.1.tgz#3042d9adec2a1ded6a7707a9ed2380f8a17a430e"
+ dependencies:
+ ansi-red "^0.1.1"
+ coffee-script "^1.12.4"
+ extend-shallow "^2.0.1"
+ js-yaml "^3.8.1"
+ toml "^2.3.2"
+
growly@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
@@ -5254,6 +5282,13 @@ js-yaml@^3.10.0, js-yaml@^3.5.1, js-yaml@^3.7.0:
argparse "^1.0.7"
esprima "^4.0.0"
+js-yaml@^3.8.1:
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1"
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
js-yaml@~2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-2.0.5.tgz#a25ae6509999e97df278c6719da11bd0687743a8"
@@ -5487,6 +5522,12 @@ lazy-cache@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
+lazy-cache@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264"
+ dependencies:
+ set-getter "^0.1.0"
+
lcid@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
@@ -5514,6 +5555,15 @@ linkify-it@~1.2.0, linkify-it@~1.2.2:
dependencies:
uc.micro "^1.0.1"
+list-item@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/list-item/-/list-item-1.1.1.tgz#0c65d00e287cb663ccb3cb3849a77e89ec268a56"
+ dependencies:
+ expand-range "^1.8.1"
+ extend-shallow "^2.0.1"
+ is-number "^2.1.0"
+ repeat-string "^1.5.2"
+
load-json-file@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
@@ -5783,6 +5833,27 @@ markdown-it@^6.0.1:
mdurl "~1.0.1"
uc.micro "^1.0.1"
+markdown-link@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/markdown-link/-/markdown-link-0.1.1.tgz#32c5c65199a6457316322d1e4229d13407c8c7cf"
+
+markdown-toc@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/markdown-toc/-/markdown-toc-1.2.0.tgz#44a15606844490314afc0444483f9e7b1122c339"
+ dependencies:
+ concat-stream "^1.5.2"
+ diacritics-map "^0.1.0"
+ gray-matter "^2.1.0"
+ lazy-cache "^2.0.2"
+ list-item "^1.1.1"
+ markdown-link "^0.1.1"
+ minimist "^1.2.0"
+ mixin-deep "^1.1.3"
+ object.pick "^1.2.0"
+ remarkable "^1.7.1"
+ repeat-string "^1.6.1"
+ strip-color "^0.1.0"
+
match-at@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/match-at/-/match-at-0.1.1.tgz#25d040d291777704d5e6556bbb79230ec2de0540"
@@ -6028,7 +6099,7 @@ minizlib@^1.1.0:
dependencies:
minipass "^2.2.1"
-mixin-deep@^1.2.0:
+mixin-deep@^1.1.3, mixin-deep@^1.2.0:
version "1.3.1"
resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
dependencies:
@@ -6400,7 +6471,7 @@ object.omit@^2.0.0:
for-own "^0.1.4"
is-extendable "^0.1.1"
-object.pick@^1.3.0:
+object.pick@^1.2.0, object.pick@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
dependencies:
@@ -7544,6 +7615,13 @@ release-zalgo@^1.0.0:
dependencies:
es6-error "^4.0.1"
+remarkable@^1.7.1:
+ version "1.7.1"
+ resolved "https://registry.yarnpkg.com/remarkable/-/remarkable-1.7.1.tgz#aaca4972100b66a642a63a1021ca4bac1be3bff6"
+ dependencies:
+ argparse "~0.1.15"
+ autolinker "~0.15.0"
+
remove-trailing-separator@^1.0.1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
@@ -7879,6 +7957,12 @@ set-blocking@^2.0.0, set-blocking@~2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+set-getter@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376"
+ dependencies:
+ to-object-path "^0.3.0"
+
set-immediate-shim@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
@@ -8325,6 +8409,10 @@ strip-bom@^2.0.0:
dependencies:
is-utf8 "^0.2.0"
+strip-color@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/strip-color/-/strip-color-0.1.0.tgz#106f65d3d3e6a2d9401cac0eb0ce8b8a702b4f7b"
+
strip-eof@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
@@ -8606,6 +8694,10 @@ toggle-selection@^1.0.3:
version "1.0.6"
resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32"
+toml@^2.3.2:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/toml/-/toml-2.3.3.tgz#8d683d729577cb286231dfc7a8affe58d31728fb"
+
touch@0.0.3:
version "0.0.3"
resolved "https://registry.yarnpkg.com/touch/-/touch-0.0.3.tgz#51aef3d449571d4f287a5d87c9c8b49181a0db1d"