diff --git a/CHANGELOG.md b/CHANGELOG.md index b77b5ef8..c6880154 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## Unreleased -... +* Make `katex` dependency optional by inlining copy of [markdown-it-texmath](https://github.com/goessner/markdown-it-texmath) (see [#15](https://github.com/nextjournal/markdown/issues/15)) ## 0.7.186 diff --git a/README.md b/README.md index c65be45e..7b5b5da5 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ A cross-platform clojure library for [Markdown](https://en.wikipedia.org/wiki/Ma ## Features * _Focus on data_: parsing yields an AST ([à la Pandoc](https://nextjournal.github.io/markdown/notebooks/pandoc)) of nested data representing a structured document. -* _Cross Platform_: using [commonmark-java](https://github.com/commonmark/commonmark-java) on the JVM and [markdown-it](https://github.com/markdown-it/markdown-it) for clojurescript +* _Cross Platform_: using [commonmark-java](https://github.com/commonmark/commonmark-java) on the JVM and [markdown-it](https://github.com/markdown-it/markdown-it) for ClojureScript. * _Configurable [Hiccup](https://github.com/weavejester/hiccup) conversion_. ## Try diff --git a/deps.edn b/deps.edn index 47f1d0a8..59327203 100644 --- a/deps.edn +++ b/deps.edn @@ -9,7 +9,8 @@ :aliases {:nextjournal/clerk {:extra-paths ["notebooks" "dev"] - :extra-deps {io.github.nextjournal/clerk {:mvn/version "0.17.1102" + :extra-deps {io.github.nextjournal/clerk {:git/sha "39b73a0acf0b29ff8fef70ff462f170c21026a3f" + ;; :mvn/version "0.17.1102" :exclusions [io.github.nextjournal/markdown]}} :jvm-opts ["-Dclojure.main.report=stderr" #_"-Dclerk.resource_manifest={\"/js/viewer.js\" \"js/viewer.js\"}"] ;; @@ -28,7 +29,7 @@ org.babashka/http-client {:mvn/version "0.3.11"} org.clojure/data.json {:mvn/version "2.4.0"} org.clojure/test.check {:mvn/version "1.1.1"} - io.github.nextjournal/clerk {:git/sha "f4c5488e36c8df11fe352889544e7deb9af73cb7" + io.github.nextjournal/clerk {:git/sha "39b73a0acf0b29ff8fef70ff462f170c21026a3f" :exclusions [io.github.nextjournal/markdown]} nubank/matcher-combinators {:mvn/version "3.8.3"} hiccup/hiccup {:mvn/version "2.0.0-RC5"}}} diff --git a/dev/nextjournal/markdown/render.cljs b/dev/nextjournal/markdown/render.cljs index 990d0e54..4f030429 100644 --- a/dev/nextjournal/markdown/render.cljs +++ b/dev/nextjournal/markdown/render.cljs @@ -5,7 +5,6 @@ syntaxHighlighting]] ["@codemirror/state" :refer [EditorState]] ["@codemirror/view" :refer [EditorView keymap]] - ["katex" :as katex] ["react" :as react] [clojure.string :as str] [nextjournal.clerk.render :as render] @@ -76,33 +75,41 @@ (react/isValidElement result) result :else [render/inspect result]))]])) -(def renderers +(defn renderers [katex] (assoc md.transform/default-hiccup-renderers :code (fn [_ctx node] [clojure-editor {:doc (md.transform/->text node)}]) :todo-item (fn [ctx {:as node :keys [attrs]}] (md.transform/into-markup [:li [:input {:type "checkbox" :default-checked (:checked attrs)}]] ctx node)) :formula (fn [_ctx node] - [:span {:dangerouslySetInnerHTML {:__html (.renderToString katex (md.transform/->text node))}}]) + [:span {:dangerouslySetInnerHTML (r/unsafe-html (.renderToString katex (md.transform/->text node)))}]) :block-formula (fn [_ctx node] - [:div {:dangerouslySetInnerHTML {:__html (.renderToString katex (md.transform/->text node) #js {:displayMode true})}}]))) + [:div {:dangerouslySetInnerHTML (r/unsafe-html (.renderToString katex (md.transform/->text node) #js {:displayMode true}))}]))) (defn inspect-expanded [x] (r/with-let [expanded-at (r/atom {:hover-path [] :prompt-multi-expand? false})] (render/inspect-presented {:!expanded-at expanded-at} (v/present x)))) -(defn try-markdown [init-text] - (let [text->state (fn [text] + + +(defn try-markdown* [{:keys [init-text katex]}] + (let [text->state (fn [katex text] (let [parsed (md/parse text)] {:parsed parsed - :hiccup (nextjournal.markdown.transform/->hiccup renderers parsed)})) - !state (hooks/use-state (text->state init-text))] + :hiccup (nextjournal.markdown.transform/->hiccup (renderers katex) parsed)})) + !state (hooks/use-state (text->state katex init-text))] [:div.grid.grid-cols-2.m-10 [:div.m-2.p-2.text-xl.border-2.overflow-y-scroll.bg-slate-100 {:style {:height "20rem"}} - [editor {:doc init-text :on-change #(reset! !state (text->state %)) :lang :markdown}]] + [editor {:doc init-text :on-change #(reset! !state (text->state katex %)) :lang :markdown}]] [:div.m-2.p-2.font-medium.overflow-y-scroll {:style {:height "20rem"}} [inspect-expanded (:parsed @!state)]] [:div.m-2.p-2.overflow-x-scroll [inspect-expanded (:hiccup @!state)]] [:div.m-2.p-2.bg-slate-50.viewer-markdown [v/html (:hiccup @!state)]]])) + +(defn try-markdown [init-text] + (let [katex (hooks/use-d3-require "katex@0.16.4")] + (when katex + [try-markdown* {:init-text init-text + :katex katex}]))) diff --git a/package.json b/package.json index de384b4d..2b91baf5 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,6 @@ "d3-require": "^1.2.4", "emoji-regex": "^10.0.0", "framer-motion": "^6.2.8", - "katex": "^0.12.0", "lezer-clojure": "1.0.0-rc.0", "markdown-it": "^14.1.0", "markdown-it-block-image": "^0.0.3", diff --git a/src/deps.cljs b/src/deps.cljs index ee6ca8e2..6d052ca4 100644 --- a/src/deps.cljs +++ b/src/deps.cljs @@ -1,6 +1,5 @@ {:npm-deps - {"katex" "^0.12.0" - "markdown-it" "^14.1.0" + {"markdown-it" "^14.1.0" "markdown-it-block-image" "^0.0.3" "markdown-it-footnote" "^3.0.3" "markdown-it-texmath" "^1.0.0" diff --git a/src/js/markdown-it-texmath.js b/src/js/markdown-it-texmath.js new file mode 100644 index 00000000..8c2a3362 --- /dev/null +++ b/src/js/markdown-it-texmath.js @@ -0,0 +1,369 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Stefan Goessner - 2017-22. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +function escapeHTML(text) { + return text + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'") + .replace(/\//g, "/"); +} + +function texmath(md, options) { + const delimiters = texmath.mergeDelimiters(options && options.delimiters); + const outerSpace = options && options.outerSpace || false; // inline rules, effectively `dollars` require surrounding spaces, i.e ` $\psi$ `, to be accepted as inline formulas. This is primarily a guard against misinterpreting single `$`'s in normal markdown text (relevant for inline math only. Default: `false`, for backwards compatibility). + const katexOptions = options && options.katexOptions || {}; + katexOptions.throwOnError = katexOptions.throwOnError || false; + katexOptions.macros = katexOptions.macros || options && options.macros; // ensure backwards compatibility + + if (!texmath.katex) { // else ... deprecated `use` method was used ... + if (options && typeof options.engine === 'object') { + texmath.katex = options.engine; + } + else if (typeof module === "object") + null; // DIFFERENCE: removed this: texmath.katex = require('katex'); + else // artifical error object. + texmath.katex = { renderToString() { return 'No math renderer found.' } }; + } + + // inject inline rules to markdown-it + for (const rule of delimiters.inline) { + if (!!outerSpace && 'outerSpace' in rule) rule.outerSpace = true; + md.inline.ruler.before('escape', rule.name, texmath.inline(rule)); // ! important + md.renderer.rules[rule.name] = (tokens, idx) => rule.tmpl.replace(/\$1/,texmath.render(tokens[idx].content,!!rule.displayMode,katexOptions)); + } + // inject block rules to markdown-it + for (const rule of delimiters.block) { + md.block.ruler.before('fence', rule.name, texmath.block(rule)); // ! important for ```math delimiters + md.renderer.rules[rule.name] = (tokens, idx) => rule.tmpl.replace(/\$2/,escapeHTML(tokens[idx].info)) // equation number .. ? + .replace(/\$1/,texmath.render(tokens[idx].content,true,katexOptions)); + } +} + +texmath.mergeDelimiters = function(delims) { + const delimsArr = Array.isArray(delims) ? delims + : typeof delims === "string" ? [delims] + : ['dollars']; + const delimiters = { inline:[], block:[]}; // target of merge process ... + + for (const delim of delimsArr) // merge them into delimiters ... + if (delim in texmath.rules) { + delimiters.inline.push(...texmath.rules[delim].inline); + delimiters.block.push(...texmath.rules[delim].block); + } + + return delimiters; +} + +// texmath.inline = (rule) => dollar; // just for debugging/testing .. + +texmath.inline = (rule) => + function(state, silent) { + const pos = state.pos; + const str = state.src; + const pre = str.startsWith(rule.tag, rule.rex.lastIndex = pos) && (!rule.pre || rule.pre(str, rule.outerSpace, pos)); // valid pre-condition ... + const match = pre && rule.rex.exec(str); + const res = !!match && pos < rule.rex.lastIndex && (!rule.post || rule.post(str, rule.outerSpace, rule.rex.lastIndex - 1)); + + if (res) { + if (!silent) { + const token = state.push(rule.name, 'math', 0); + token.content = match[1]; + token.markup = rule.tag; + } + state.pos = rule.rex.lastIndex; + } + return res; + } + +texmath.block = (rule) => + function block(state, begLine, endLine, silent) { + const pos = state.bMarks[begLine] + state.tShift[begLine]; + const str = state.src; + const pre = str.startsWith(rule.tag, rule.rex.lastIndex = pos) && (!rule.pre || rule.pre(str, false, pos)); // valid pre-condition .... + const match = pre && rule.rex.exec(str); + const res = !!match + && pos < rule.rex.lastIndex + && (!rule.post || rule.post(str, false, rule.rex.lastIndex - 1)); + + if (res && !silent) { // match and valid post-condition ... + const endpos = rule.rex.lastIndex - 1; + let curline; + + for (curline = begLine; curline < endLine; curline++) + if (endpos >= state.bMarks[curline] + state.tShift[curline] && endpos <= state.eMarks[curline]) // line for end of block math found ... + break; + + // "this will prevent lazy continuations from ever going past our end marker" + // s. https://github.com/markdown-it/markdown-it-container/blob/master/index.js + const lineMax = state.lineMax; + const parentType = state.parentType; + state.lineMax = curline; + state.parentType = 'math'; + + if (parentType === 'blockquote') // remove all leading '>' inside multiline formula + match[1] = match[1].replace(/(\n*?^(?:\s*>)+)/gm,''); + // begin token + let token = state.push(rule.name, 'math', 0); // 'math_block' + token.block = true; + token.tag = rule.tag; + token.markup = ''; + token.content = match[1]; + token.info = match[match.length-1]; // eq.no + token.map = [ begLine, curline+1 ]; +// token.hidden = true; + // end token ... superfluous ... + + state.parentType = parentType; + state.lineMax = lineMax; + state.line = curline+1; + } + return res; + } + +texmath.render = function(tex,displayMode,options) { + options.displayMode = displayMode; + let res; + try { + res = texmath.katex.renderToString(tex, options); + } + catch(err) { + res = escapeHTML(`${tex}:${err.message}`) + } + return res; +} + +// ! deprecated ... use options ! +texmath.use = function(katex) { // math renderer used ... + texmath.katex = katex; // ... katex solely at current ... + return texmath; +} + +/* +function dollar(state, silent) { + var start, max, marker, matchStart, matchEnd, token, + pos = state.pos, + ch = state.src.charCodeAt(pos); + + if (ch !== 0x24) { return false; } // $ + + start = pos; + pos++; + max = state.posMax; + + while (pos < max && state.src.charCodeAt(pos) === 0x24) { pos++; } + + marker = state.src.slice(start, pos); + + matchStart = matchEnd = pos; + + while ((matchStart = state.src.indexOf('$', matchEnd)) !== -1) { + matchEnd = matchStart + 1; + + while (matchEnd < max && state.src.charCodeAt(matchEnd) === 0x24) { matchEnd++; } + + if (matchEnd - matchStart === marker.length) { + if (!silent) { + token = state.push('math_inline', 'math', 0); + token.markup = marker; + token.content = state.src.slice(pos, matchStart) + .replace(/[ \n]+/g, ' ') + .trim(); + } + state.pos = matchEnd; + return true; + } + } + + if (!silent) { state.pending += marker; } + state.pos += marker.length; + return true; +}; +*/ + +// used for enable/disable math rendering by `markdown-it` +texmath.inlineRuleNames = ['math_inline','math_inline_double']; +texmath.blockRuleNames = ['math_block','math_block_eqno']; + +texmath.$_pre = (str,outerSpace,beg) => { + const prv = beg > 0 ? str[beg-1].charCodeAt(0) : false; + return outerSpace ? !prv || prv === 0x20 // space (avoiding regex's for performance reasons) + : !prv || prv !== 0x5c // no backslash, + && (prv < 0x30 || prv > 0x39); // no decimal digit .. before opening '$' +} +texmath.$_post = (str,outerSpace,end) => { + const nxt = str[end+1] && str[end+1].charCodeAt(0); + return outerSpace ? !nxt || nxt === 0x20 // space (avoiding regex's for performance reasons) + || nxt === 0x2e // '.' + || nxt === 0x2c // ',' + || nxt === 0x3b // ';' + : !nxt || nxt < 0x30 || nxt > 0x39; // no decimal digit .. after closing '$' +} + +texmath.rules = { + brackets: { + inline: [ + { name: 'math_inline', + rex: /\\\((.+?)\\\)/gy, + tmpl: '$1', + tag: '\\(' + } + ], + block: [ + { name: 'math_block_eqno', + rex: /\\\[(((?!\\\]|\\\[)[\s\S])+?)\\\]\s*?\(([^)$\r\n]+?)\)/gmy, + tmpl: '
$1($2)
', + tag: '\\[' + }, + { name: 'math_block', + rex: /\\\[([\s\S]+?)\\\]/gmy, + tmpl: '
$1
', + tag: '\\[' + } + ] + }, + doxygen: { + inline: [ + { name: 'math_inline', + rex: /\\f\$(.+?)\\f\$/gy, + tmpl: '$1', + tag: '\\f$' + } + ], + block: [ + { name: 'math_block_eqno', + rex: /\\f\[([^]+?)\\f\]\s*?\(([^)\s]+?)\)/gmy, + tmpl: '
$1($2)
', + tag: '\\f[' + }, + { name: 'math_block', + rex: /\\f\[([^]+?)\\f\]/gmy, + tmpl: '
$1
', + tag: '\\f[' + } + ] + }, + gitlab: { + inline: [ + { name: 'math_inline', + rex: /\$`(.+?)`\$/gy, + tmpl: '$1', + tag: '$`' + } + ], + block: [ + { name: 'math_block_eqno', + rex: /`{3}math\s*([^`]+?)\s*?`{3}\s*\(([^)\r\n]+?)\)/gm, + tmpl: '
$1($2)
', + tag: '```math' + }, + { name: 'math_block', + rex: /`{3}math\s*([^`]*?)\s*`{3}/gm, + tmpl: '
$1
', + tag: '```math' + } + ] + }, + julia: { + inline: [ + { name: 'math_inline', + rex: /`{2}([^`]+?)`{2}/gy, + tmpl: '$1', + tag: '``' + }, + { name: 'math_inline', + rex: /\$((?:\S?)|(?:\S.*?\S))\$/gy, + tmpl: '$1', + tag: '$', + spaceEnclosed: false, + pre: texmath.$_pre, + post: texmath.$_post, + + } + ], + block: [ + { name: 'math_block_eqno', + rex: /`{3}math\s+?([^`]+?)\s+?`{3}\s*?\(([^)$\r\n]+?)\)/gmy, + tmpl: '
$1($2)
', + tag: '```math' + }, + { name: 'math_block', + rex: /`{3}math\s+?([^`]+?)\s+?`{3}/gmy, + tmpl: '
$1
', + tag: '```math' + } + ] + }, + kramdown: { + inline: [ + { name: 'math_inline', + rex: /\${2}(.+?)\${2}/gy, + tmpl: '$1', + tag: '$$' + } + ], + block: [ + { name: 'math_block_eqno', + rex: /\${2}([^$]+?)\${2}\s*?\(([^)\s]+?)\)/gmy, + tmpl: '
$1($2)
', + tag: '$$' + }, + { name: 'math_block', + rex: /\${2}([^$]+?)\${2}/gmy, + tmpl: '
$1
', + tag: '$$' + } + ] + }, + beg_end: { + inline: [], + block: [ + { + name: "math_block", + rex: /(\\(?:begin)\{([a-z]+)\}[\s\S]+?\\(?:end)\{\2\})/gmy, // regexp to match \begin{...}...\end{...} environment. + tmpl: "
$1
", + tag: "\\" + } + ] + }, + dollars: { + inline: [ + { name: 'math_inline_double', + rex: /\${2}([^$]*?[^\\])\${2}/gy, + tmpl: '
$1
', + tag: '$$', + displayMode: true, + pre: texmath.$_pre, + post: texmath.$_post + }, + { name: 'math_inline', + rex: /\$((?:[^\s\\])|(?:\S.*?[^\s\\]))\$/gy, + tmpl: '$1', + tag: '$', + outerSpace: false, + pre: texmath.$_pre, + post: texmath.$_post + } + ], + block: [ + { name: 'math_block_eqno', + rex: /\${2}([^$]*?[^\\])\${2}\s*?\(([^)\s]+?)\)/gmy, + tmpl: '
$1($2)
', + tag: '$$' + }, + { name: 'math_block', + rex: /\${2}([^$]*?[^\\])\${2}/gmy, + tmpl: '
$1
', + tag: '$$' + } + ] + } +}; + +if (typeof module === "object" && module.exports) + module.exports = texmath; diff --git a/src/js/markdown.js b/src/js/markdown.js index 7bd755ea..4286d453 100644 --- a/src/js/markdown.js +++ b/src/js/markdown.js @@ -1,7 +1,7 @@ let MarkdownIt = require('markdown-it'), MD = new MarkdownIt({html: true, linkify: true, breaks: false}) -let texmath = require('markdown-it-texmath') +let texmath = require('./markdown-it-texmath.js') MD.use(texmath, {delimiters: "dollars"}) let blockImage = require("markdown-it-block-image") diff --git a/yarn.lock b/yarn.lock index 09dd9ca8..b9eede0c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -331,11 +331,6 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" -commander@^2.19.0: - version "2.20.3" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - console-browserify@^1.1.0: version "1.2.0" resolved "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz" @@ -451,7 +446,7 @@ emoji-regex@^10.0.0: entities@^4.4.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== esbuild@^0.12.28: @@ -563,13 +558,6 @@ isexe@^2.0.0: resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -katex@^0.12.0: - version "0.12.0" - resolved "https://registry.npmjs.org/katex/-/katex-0.12.0.tgz" - integrity sha512-y+8btoc/CK70XqcHqjxiGWBOeIL8upbS0peTPXTvgrh21n1RiWWcIpSWM+4uXq+IAgNh9YYQWdc7LVDPDAEEAg== - dependencies: - commander "^2.19.0" - lezer-clojure@1.0.0-rc.0: version "1.0.0-rc.0" resolved "https://registry.npmjs.org/lezer-clojure/-/lezer-clojure-1.0.0-rc.0.tgz" @@ -579,7 +567,7 @@ lezer-clojure@1.0.0-rc.0: linkify-it@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-5.0.0.tgz#9ef238bfa6dc70bd8e7f9572b52d369af569b421" + resolved "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz" integrity sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ== dependencies: uc.micro "^2.0.0" @@ -603,7 +591,7 @@ markdown-it-footnote@^3.0.3: markdown-it-texmath@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/markdown-it-texmath/-/markdown-it-texmath-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/markdown-it-texmath/-/markdown-it-texmath-1.0.0.tgz#65703b235d07a8f96bc58cbf9d478af57154e5f0" integrity sha512-4hhkiX8/gus+6e53PLCUmUrsa6ZWGgJW2XCW6O0ASvZUiezIK900ZicinTDtG3kAO2kon7oUA/ReWmpW2FByxg== markdown-it-toc-done-right@^4.2.0: @@ -611,10 +599,9 @@ markdown-it-toc-done-right@^4.2.0: resolved "https://registry.npmjs.org/markdown-it-toc-done-right/-/markdown-it-toc-done-right-4.2.0.tgz" integrity sha512-UB/IbzjWazwTlNAX0pvWNlJS8NKsOQ4syrXZQ/C72j+jirrsjVRT627lCaylrKJFBQWfRsPmIVQie8x38DEhAQ== - markdown-it@^14.1.0: version "14.1.0" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.1.0.tgz#3c3c5992883c633db4714ccb4d7b5935d98b7d45" + resolved "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz" integrity sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg== dependencies: argparse "^2.0.1" @@ -635,7 +622,7 @@ md5.js@^1.3.4: mdurl@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-2.0.0.tgz#80676ec0433025dd3e17ee983d0fe8de5a2237e0" + resolved "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz" integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w== miller-rabin@^4.0.0: @@ -761,7 +748,7 @@ public-encrypt@^4.0.0: punycode.js@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7" + resolved "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz" integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== punycode@1.3.2: @@ -988,7 +975,7 @@ tty-browserify@0.0.0: uc.micro@^2.0.0, uc.micro@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee" + resolved "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz" integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== url@^0.11.0: