From be610ef06c017dc3ec71d2599868608550d1566e Mon Sep 17 00:00:00 2001 From: RunDevelopment Date: Thu, 11 Jul 2019 03:48:54 +0200 Subject: [PATCH 01/15] Added more plugin tests --- .../prism-copy-to-clipboard.js | 4 +- .../prism-copy-to-clipboard.min.js | 2 +- tests/helper/prism-dom-util.js | 36 ++++++ tests/helper/prism-loader.js | 122 +++++++++++++++--- .../copy-to-clipboard/basic-functionality.js | 99 ++++++++++++++ .../custom-class/basic-functionality.js | 69 ++++++++++ .../highlight-keywords/basic-functionality.js | 18 +++ tests/plugins/keep-markup/test.js | 46 +++---- .../show-invisibles/basic-functionality.js | 26 ++++ 9 files changed, 381 insertions(+), 41 deletions(-) create mode 100644 tests/helper/prism-dom-util.js create mode 100644 tests/plugins/copy-to-clipboard/basic-functionality.js create mode 100644 tests/plugins/custom-class/basic-functionality.js create mode 100644 tests/plugins/highlight-keywords/basic-functionality.js create mode 100644 tests/plugins/show-invisibles/basic-functionality.js diff --git a/plugins/copy-to-clipboard/prism-copy-to-clipboard.js b/plugins/copy-to-clipboard/prism-copy-to-clipboard.js index ac73efebca..ce52a79143 100644 --- a/plugins/copy-to-clipboard/prism-copy-to-clipboard.js +++ b/plugins/copy-to-clipboard/prism-copy-to-clipboard.js @@ -39,6 +39,8 @@ var linkCopy = document.createElement('button'); linkCopy.textContent = 'Copy'; + var element = env.element; + if (!ClipboardJS) { callbacks.push(registerClipboard); } else { @@ -50,7 +52,7 @@ function registerClipboard() { var clip = new ClipboardJS(linkCopy, { 'text': function () { - return env.code; + return element.textContent; } }); diff --git a/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js b/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js index 199b42549d..3c8b52560e 100644 --- a/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js +++ b/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js @@ -1 +1 @@ -!function(){if("undefined"!=typeof self&&self.Prism&&self.document)if(Prism.plugins.toolbar){var r=window.ClipboardJS||void 0;r||"function"!=typeof require||(r=require("clipboard"));var i=[];if(!r){var o=document.createElement("script"),e=document.querySelector("head");o.onload=function(){if(r=window.ClipboardJS)for(;i.length;)i.pop()()},o.src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js",e.appendChild(o)}Prism.plugins.toolbar.registerButton("copy-to-clipboard",function(e){var t=document.createElement("button");return t.textContent="Copy",r?o():i.push(o),t;function o(){var o=new r(t,{text:function(){return e.code}});o.on("success",function(){t.textContent="Copied!",n()}),o.on("error",function(){t.textContent="Press Ctrl+C to copy",n()})}function n(){setTimeout(function(){t.textContent="Copy"},5e3)}})}else console.warn("Copy to Clipboard plugin loaded before Toolbar plugin.")}(); \ No newline at end of file +!function(){if("undefined"!=typeof self&&self.Prism&&self.document)if(Prism.plugins.toolbar){var i=window.ClipboardJS||void 0;i||"function"!=typeof require||(i=require("clipboard"));var c=[];if(!i){var o=document.createElement("script"),t=document.querySelector("head");o.onload=function(){if(i=window.ClipboardJS)for(;c.length;)c.pop()()},o.src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js",t.appendChild(o)}Prism.plugins.toolbar.registerButton("copy-to-clipboard",function(o){var t=document.createElement("button");t.textContent="Copy";var e=o.element;return i?n():c.push(n),t;function n(){var o=new i(t,{text:function(){return e.textContent}});o.on("success",function(){t.textContent="Copied!",r()}),o.on("error",function(){t.textContent="Press Ctrl+C to copy",r()})}function r(){setTimeout(function(){t.textContent="Copy"},5e3)}})}else console.warn("Copy to Clipboard plugin loaded before Toolbar plugin.")}(); \ No newline at end of file diff --git a/tests/helper/prism-dom-util.js b/tests/helper/prism-dom-util.js new file mode 100644 index 0000000000..dbdaddbdbe --- /dev/null +++ b/tests/helper/prism-dom-util.js @@ -0,0 +1,36 @@ +const { assert } = require('chai'); + + +module.exports = { + /** + * + * @param {import("./prism-loader").PrismDOM} dom + */ + createUtil(dom) { + const { Prism, document } = dom.window; + + const util = { + + assert: { + + highlight({ language, code, expected }) { + assert.strictEqual(Prism.highlight(code, Prism.languages[language], language), expected); + }, + + highlightElement({ language = 'none', code, expected }) { + const element = document.createElement('CODE'); + element.classList.add('language-' + language); + element.textContent = code; + + Prism.highlightElement(element); + + assert.strictEqual(element.innerHTML, expected); + } + + }, + + }; + + return util; + } +} diff --git a/tests/helper/prism-loader.js b/tests/helper/prism-loader.js index 8ec06e3643..8f6b6e07c1 100644 --- a/tests/helper/prism-loader.js +++ b/tests/helper/prism-loader.js @@ -2,9 +2,35 @@ const fs = require("fs"); const vm = require("vm"); +const { JSDOM } = require('jsdom'); const { getAllFiles } = require("./test-discovery"); -const components = require("../../components"); -const languagesCatalog = components.languages; +const { languages: languagesCatalog, plugins: pluginsCatalog } = require("../../components"); + + +/** + * Wraps the given value in an array if it's not an array already. + * + * @param {T[] | T} value + * @returns {T[]} + * @template T + */ +function toArray(value) { + return Array.isArray(value) ? value : [value]; +} + + +/** + * @typedef PrismContext + * @property {string[]} loadedLanguages + * @property {Prism} Prism + * + * @typedef {import("jsdom").DOMWindow & { Prism: any }} PrismWindow + * + * @typedef PrismDOM + * @property {PrismWindow} window + * @property {(languages: string | string[]) => void} loadLanguages + * @property {(plugins: string | string[]) => void} loadPlugins + */ module.exports = { @@ -26,20 +52,73 @@ module.exports = { return context.Prism; }, + /** + * Creates a new JavaScript DOM instance with Prism being loaded. + * + * @returns {PrismDOM} + */ + createPrismDOM() { + const dom = new JSDOM(``, { + runScripts: 'outside-only' + }); + const window = dom.window; + + const loadLanguageSource = this.loadComponentSource.bind(this); + const loadPluginSource = this.loadPluginSource.bind(this); + + window.eval(`window.self = window;`); // set self for plugins + window.eval(loadLanguageSource('core')); + + const loadedLanguages = new Set(); + const loadedPlugins = new Set(); + + return { + window: /** @type {PrismWindow} */ (window), + + loadLanguages: function loadLanguages(languages) { + for (const language of toArray(languages)) { + if (loadedLanguages.has(language)) { + continue; + } + loadedLanguages.add(language); + + const require = languagesCatalog[language].require; + if (require) { + loadLanguages(require); + } + + window.eval(loadLanguageSource(language)); + } + }, + + loadPlugins: function loadPlugins(plugins) { + for (const plugin of toArray(plugins)) { + if (loadedPlugins.has(plugin)) { + continue; + } + loadedPlugins.add(plugin); + + const require = pluginsCatalog[plugin].require; + if (require) { + loadPlugins(require); + } + + window.eval(loadPluginSource(plugin)); + } + }, + }; + }, + /** * Loads the given languages and appends the config to the given Prism object * * @private * @param {string|string[]} languages - * @param {{loadedLanguages: string[], Prism: Prism}} context - * @returns {{loadedLanguages: string[], Prism: Prism}} + * @param {PrismContext} context + * @returns {PrismContext} */ loadLanguages(languages, context) { - if (typeof languages === 'string') { - languages = [languages]; - } - - for (const language of languages) { + for (const language of toArray(languages)) { context = this.loadLanguage(language, context); } @@ -52,12 +131,12 @@ module.exports = { * * @private * @param {string} language - * @param {{loadedLanguages: string[], Prism: Prism}} context - * @returns {{loadedLanguages: string[], Prism: Prism}} + * @param {PrismContext} context + * @returns {PrismContext} */ loadLanguage(language, context) { if (!languagesCatalog[language]) { - throw new Error("Language '" + language + "' not found."); + throw new Error(`Language '${language}' not found.`); } // the given language was already loaded @@ -86,7 +165,7 @@ module.exports = { * @returns {Prism} */ createEmptyPrism() { - const coreSource = this.loadComponentSource("core"); + const coreSource = this.loadComponentSource('core'); const context = this.runFileWithContext(coreSource); for (const testSource of this.getChecks().map(src => this.loadFileSource(src))) { @@ -133,7 +212,18 @@ module.exports = { * @returns {string} */ loadComponentSource(name) { - return this.loadFileSource(__dirname + "/../../components/prism-" + name + ".js"); + return this.loadFileSource(`${__dirname}/../../components/prism-${name}.js`); + }, + + /** + * Loads the given plugin's file source as string + * + * @private + * @param {string} name + * @returns {string} + */ + loadPluginSource(name) { + return this.loadFileSource(`${__dirname}/../../plugins/${name}/prism-${name}.js`); }, /** @@ -144,7 +234,7 @@ module.exports = { * @returns {string} */ loadFileSource(src) { - return this.fileSourceCache[src] = this.fileSourceCache[src] || fs.readFileSync(src, "utf8"); + return this.fileSourceCache[src] = this.fileSourceCache[src] || fs.readFileSync(src, 'utf8'); }, @@ -156,7 +246,7 @@ module.exports = { * @returns {ReadonlyArray} */ getChecks() { - return this.checkCache = this.checkCache || getAllFiles(__dirname + "/../checks"); + return this.checkCache = this.checkCache || getAllFiles(__dirname + '/../checks'); }, diff --git a/tests/plugins/copy-to-clipboard/basic-functionality.js b/tests/plugins/copy-to-clipboard/basic-functionality.js new file mode 100644 index 0000000000..964b5691f3 --- /dev/null +++ b/tests/plugins/copy-to-clipboard/basic-functionality.js @@ -0,0 +1,99 @@ +const { assert } = require('chai'); + +const dom = require('../../helper/prism-loader').createPrismDOM(); + +const { Prism, document } = dom.window; + +// A very simple class pretending to by ClipboardJS v2. +// This is our "virtual clipboard". +let ClipboardText = null; +let ClipboardCopyWillSucceed = true; +dom.window.ClipboardJS = class { + /** + * + * @param {Element} element + * @param {Object} options + * @param {() => string} options.text + */ + constructor(element, options) { + this.element = element; + this.options = options; + element.addEventListener('click', () => this.fire()); + this.onSuccess = []; + this.onError = []; + } + + on(event, callback) { + switch (event) { + case 'success': + this.onSuccess.push(callback); + break; + case 'error': + this.onError.push(callback); + break; + + default: + throw new Error(`Unknown event. Please fix this make-believe.`); + } + } + + fire() { + if (ClipboardCopyWillSucceed) { + ClipboardText = this.options.text(); + this.onSuccess.forEach(c => c()); + } else { + this.onError.forEach(c => c()); + } + } +}; + +dom.loadLanguages('javascript'); +dom.loadPlugins('copy-to-clipboard'); + + +describe('Copy to Clipboard', function () { + + it('should work', function () { + document.body.innerHTML = `
foo
`; + Prism.highlightAll(); + + const button = document.querySelector('button'); + assert.notStrictEqual(button, null); + + ClipboardText = null; + ClipboardCopyWillSucceed = true; + button.click(); + + assert.strictEqual(ClipboardText, 'foo'); + }); + + it('should copy the current text even after the code block changes its text', function () { + document.body.innerHTML = `
foo
`; + Prism.highlightAll(); + + const button = document.querySelector('button'); + assert.notStrictEqual(button, null); + + ClipboardText = null; + ClipboardCopyWillSucceed = true; + button.click(); + + assert.strictEqual(ClipboardText, 'foo'); + + // change text + document.querySelector('code').textContent = "bar"; + // and click + button.click(); + + assert.strictEqual(ClipboardText, 'bar'); + + // change text + document.querySelector('code').textContent = "baz"; + Prism.highlightAll(); + // and click + button.click(); + + assert.strictEqual(ClipboardText, 'baz'); + }); + +}); diff --git a/tests/plugins/custom-class/basic-functionality.js b/tests/plugins/custom-class/basic-functionality.js new file mode 100644 index 0000000000..8e4d4cabdb --- /dev/null +++ b/tests/plugins/custom-class/basic-functionality.js @@ -0,0 +1,69 @@ +const dom = require('../../helper/prism-loader').createPrismDOM(); +const util = require('../../helper/prism-dom-util').createUtil(dom); + +const { Prism } = dom.window; + +dom.loadLanguages('javascript'); +dom.loadPlugins('custom-class'); + + +describe('Custom class', function () { + + it('should set prefix', function () { + Prism.plugins.customClass.prefix('prism-'); + + util.assert.highlight({ + language: 'javascript', + code: `var a = true;`, + expected: `var a = true;` + }); + }); + + it('should reset prefix', function () { + Prism.plugins.customClass.prefix(''); + + util.assert.highlight({ + language: 'javascript', + code: `var a = true;`, + expected: `var a = true;` + }); + }); + + it('should map class names using a function', function () { + Prism.plugins.customClass.map(function (cls, language) { + return `${language}-${cls}`; + }); + + util.assert.highlight({ + language: 'javascript', + code: `var a = true;`, + expected: `var a = true;` + }); + }); + + it('should map class names using an object', function () { + Prism.plugins.customClass.map({ + boolean: 'b', + keyword: 'kw', + operator: 'op', + punctuation: 'p' + }); + + util.assert.highlight({ + language: 'javascript', + code: `var a = true;`, + expected: `var a = true;` + }); + }); + + it('should reset map', function () { + Prism.plugins.customClass.map({}); + + util.assert.highlight({ + language: 'javascript', + code: `var a = true;`, + expected: `var a = true;` + }); + }); + +}); diff --git a/tests/plugins/highlight-keywords/basic-functionality.js b/tests/plugins/highlight-keywords/basic-functionality.js new file mode 100644 index 0000000000..859a20592d --- /dev/null +++ b/tests/plugins/highlight-keywords/basic-functionality.js @@ -0,0 +1,18 @@ +const dom = require('../../helper/prism-loader').createPrismDOM(); +const util = require('../../helper/prism-dom-util').createUtil(dom); + +dom.loadLanguages('javascript'); +dom.loadPlugins('highlight-keywords'); + + +describe('Highlight Keywords', function () { + + it('should highlight keywords', function () { + util.assert.highlightElement({ + language: 'javascript', + code: `import * from ''; const foo;`, + expected: `import * from ''; const foo;` + }); + }); + +}); diff --git a/tests/plugins/keep-markup/test.js b/tests/plugins/keep-markup/test.js index bb0e78b34b..f4907701d4 100644 --- a/tests/plugins/keep-markup/test.js +++ b/tests/plugins/keep-markup/test.js @@ -1,21 +1,15 @@ -const expect = require('chai').expect; -const jsdom = require('jsdom') -const { JSDOM } = jsdom +const { expect } = require('chai'); +const dom = require('../../helper/prism-loader').createPrismDOM(); -require('../../../prism') -// fake DOM -global.self = {} -global.self.Prism = Prism -global.document = {} -document.createRange = function () { -} -global.self.document = document +const { Prism, document } = dom.window; -require('../../../plugins/keep-markup/prism-keep-markup') +document.createRange = function () { }; // fake createRange for Keep Markup +dom.loadPlugins('keep-markup'); -describe('Prism Keep Markup Plugin', function () { - function execute (code) { +describe('Keep Markup', function () { + + function execute(code) { const start = []; const end = []; const nodes = []; @@ -28,7 +22,7 @@ describe('Prism Keep Markup Plugin', function () { end.push({ node, offset }) }, extractContents: function () { - return new JSDOM('').window.document.createTextNode('') + return document.createTextNode('') }, insertNode: function (node) { nodes.push(node) @@ -36,11 +30,17 @@ describe('Prism Keep Markup Plugin', function () { detach: function () { } } - } - const beforeHighlight = Prism.hooks.all['before-highlight'][0] - const afterHighlight = Prism.hooks.all['after-highlight'][0] + }; + + document.body.innerHTML = code; + const element = document.body.firstElementChild; + + + const beforeHighlight = Prism.hooks.all['before-highlight'][0]; + const afterHighlight = Prism.hooks.all['after-highlight'][0]; + const env = { - element: new JSDOM(code).window.document.getElementsByTagName('code')[0], + element, language: "javascript" } beforeHighlight(env) @@ -49,14 +49,14 @@ describe('Prism Keep Markup Plugin', function () { } it('should keep markup', function () { - const result = execute(`xay`) + const result = execute(`xay`) expect(result.start.length).to.equal(1) expect(result.end.length).to.equal(1) expect(result.nodes.length).to.equal(1) expect(result.nodes[0].nodeName).to.equal('SPAN') }) it('should preserve markup order', function () { - const result = execute(`xy`) + const result = execute(`xy`) expect(result.start.length).to.equal(2) expect(result.start[0].offset).to.equal(0) expect(result.start[0].node.textContent).to.equal('y') @@ -72,7 +72,7 @@ describe('Prism Keep Markup Plugin', function () { expect(result.nodes[1].nodeName).to.equal('B') }) it('should keep last markup', function () { - const result = execute(`xya`) + const result = execute(`xya`) expect(result.start.length).to.equal(1) expect(result.end.length).to.equal(1) expect(result.nodes.length).to.equal(1) @@ -82,7 +82,7 @@ describe('Prism Keep Markup Plugin', function () { // https://github.com/PrismJS/prism/issues/1618 /* it('should keep last single letter empty markup', function () { - const result = execute(`xy`) + const result = execute(`xy`) expect(result.start.length).to.equal(1) expect(result.end.length).to.equal(1) expect(result.nodes.length).to.equal(1) diff --git a/tests/plugins/show-invisibles/basic-functionality.js b/tests/plugins/show-invisibles/basic-functionality.js new file mode 100644 index 0000000000..5237f8e1a9 --- /dev/null +++ b/tests/plugins/show-invisibles/basic-functionality.js @@ -0,0 +1,26 @@ +const dom = require('../../helper/prism-loader').createPrismDOM(); +const util = require('../../helper/prism-dom-util').createUtil(dom); + +dom.loadLanguages('javascript'); +dom.loadPlugins('show-invisibles'); + + +describe('Show Invisibles', function () { + + it('should show invisible characters', function () { + util.assert.highlightElement({ + language: 'javascript', + code: ` \n\r\n `, + expected: ` \t\n\n\t\t` + }); + }); + + it('should show invisible characters inside tokens', function () { + util.assert.highlightElement({ + language: 'javascript', + code: `/* \n */`, + expected: `/* \n */` + }); + }); + +}); From 8d58e430da625eb197c3045ad2ad5fbc2ecf95bf Mon Sep 17 00:00:00 2001 From: RunDevelopment Date: Thu, 11 Jul 2019 16:08:47 +0200 Subject: [PATCH 02/15] Minor improvements --- tests/helper/prism-loader.js | 2 +- tests/plugins/copy-to-clipboard/basic-functionality.js | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/tests/helper/prism-loader.js b/tests/helper/prism-loader.js index 8f6b6e07c1..57d45b8b00 100644 --- a/tests/helper/prism-loader.js +++ b/tests/helper/prism-loader.js @@ -66,7 +66,7 @@ module.exports = { const loadLanguageSource = this.loadComponentSource.bind(this); const loadPluginSource = this.loadPluginSource.bind(this); - window.eval(`window.self = window;`); // set self for plugins + window.self = window; // set self for plugins window.eval(loadLanguageSource('core')); const loadedLanguages = new Set(); diff --git a/tests/plugins/copy-to-clipboard/basic-functionality.js b/tests/plugins/copy-to-clipboard/basic-functionality.js index 964b5691f3..cbeff22d50 100644 --- a/tests/plugins/copy-to-clipboard/basic-functionality.js +++ b/tests/plugins/copy-to-clipboard/basic-functionality.js @@ -47,6 +47,12 @@ dom.window.ClipboardJS = class { } }; +// the timeout which resets the button's text takes forever, so we just do it immediately. +const oldSetTimeout = dom.window.setTimeout; +dom.window.setTimeout = function (handle, timeout, ...args) { + return oldSetTimeout(handle, 0, args); +}; + dom.loadLanguages('javascript'); dom.loadPlugins('copy-to-clipboard'); From 4fdec00f9283c32ce2c7d6298eb53781904d1549 Mon Sep 17 00:00:00 2001 From: RunDevelopment Date: Thu, 11 Jul 2019 16:32:40 +0200 Subject: [PATCH 03/15] Added Show language test --- .../show-language/basic-functionality.js | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 tests/plugins/show-language/basic-functionality.js diff --git a/tests/plugins/show-language/basic-functionality.js b/tests/plugins/show-language/basic-functionality.js new file mode 100644 index 0000000000..5c93e8ba0c --- /dev/null +++ b/tests/plugins/show-language/basic-functionality.js @@ -0,0 +1,37 @@ +const { assert } = require('chai'); + +const dom = require('../../helper/prism-loader').createPrismDOM(); + +const { Prism, document } = dom.window; + +dom.loadLanguages(['markup', 'javascript']); +dom.loadPlugins('show-language'); + + +describe('Show language', function () { + + function test(expectedLanguage, code) { + document.body.innerHTML = code; + Prism.highlightAll(); + + assert.strictEqual(document.querySelector('.toolbar-item > span').textContent, expectedLanguage); + } + + it('should work with component titles', function () { + // simple title + test('JavaScript', `
foo
`); + test('Markup', `
foo
`); + + // aliases with the same title + test('JavaScript', `
foo
`); + + // aliases with a different title + test('HTML', `
foo
`); + test('SVG', `
foo
`); + }); + + it('should work with custom titles', function () { + test('Foo', `
foo
`); + }); + +}); From ae16e58faef6c38ce971ded3c92007d7a3eaaeca Mon Sep 17 00:00:00 2001 From: RunDevelopment Date: Thu, 11 Jul 2019 16:33:01 +0200 Subject: [PATCH 04/15] Unescaped markup tests + refactoring --- .../prism-unescaped-markup.js | 41 ++++++++++--------- .../prism-unescaped-markup.min.js | 2 +- .../unescaped-markup/basic-functionality.js | 37 +++++++++++++++++ 3 files changed, 59 insertions(+), 21 deletions(-) create mode 100644 tests/plugins/unescaped-markup/basic-functionality.js diff --git a/plugins/unescaped-markup/prism-unescaped-markup.js b/plugins/unescaped-markup/prism-unescaped-markup.js index 8684ebacff..bcb5303a9c 100644 --- a/plugins/unescaped-markup/prism-unescaped-markup.js +++ b/plugins/unescaped-markup/prism-unescaped-markup.js @@ -1,44 +1,45 @@ (function () { - if (typeof self === 'undefined' || !self.Prism || !self.document || !Prism.languages.markup) { + if (typeof self === 'undefined' || !self.Prism || !self.document) { return; } Prism.plugins.UnescapedMarkup = true; Prism.hooks.add('before-highlightall', function (env) { - env.selector += ", [class*='lang-'] script[type='text/plain'], [class*='language-'] script[type='text/plain']" + - ", script[type='text/plain'][class*='lang-'], script[type='text/plain'][class*='language-']"; + env.selector += ', [class*="lang-"] script[type="text/plain"], [class*="language-"] script[type="text/plain"]' + + ', script[type="text/plain"][class*="lang-"], script[type="text/plain"][class*="language-"]'; }); Prism.hooks.add('before-sanity-check', function (env) { - if ((env.element.matches || env.element.msMatchesSelector).call(env.element, "script[type='text/plain']")) { - var code = document.createElement("code"); - var pre = document.createElement("pre"); + /** @type {HTMLElement} */ + var element = env.element; - pre.className = code.className = env.element.className; + if ((element.matches || element.msMatchesSelector).call(element, 'script[type="text/plain"]')) { + var code = document.createElement('code'); + var pre = document.createElement('pre'); - if (env.element.dataset) { - Object.keys(env.element.dataset).forEach(function (key) { - if (Object.prototype.hasOwnProperty.call(env.element.dataset, key)) { - pre.dataset[key] = env.element.dataset[key]; + pre.className = code.className = element.className; + + if (element.dataset) { + Object.keys(element.dataset).forEach(function (key) { + if (Object.prototype.hasOwnProperty.call(element.dataset, key)) { + pre.dataset[key] = element.dataset[key]; } }); } - env.code = env.code.replace(/<\/script(>|>)/gi, ""); - code.textContent = env.code; + code.textContent = env.code = env.code.replace(/<\/script(>|>)/gi, ''); pre.appendChild(code); - env.element.parentNode.replaceChild(pre, env.element); + element.parentNode.replaceChild(pre, element); env.element = code; - return; - } - var pre = env.element.parentNode; - if (!env.code && pre && pre.nodeName.toLowerCase() == 'pre' && - env.element.childNodes.length && env.element.childNodes[0].nodeName == "#comment") { - env.element.textContent = env.code = env.element.childNodes[0].textContent; + } else if (!env.code && (element.matches || element.msMatchesSelector).call(element, 'pre > code') && + element.firstChild && element.firstChild.nodeName == '#comment') { + //
+ element.textContent = env.code = element.firstChild.textContent; } + }); }()); diff --git a/plugins/unescaped-markup/prism-unescaped-markup.min.js b/plugins/unescaped-markup/prism-unescaped-markup.min.js index b68b3860a6..9e143e5228 100644 --- a/plugins/unescaped-markup/prism-unescaped-markup.min.js +++ b/plugins/unescaped-markup/prism-unescaped-markup.min.js @@ -1 +1 @@ -"undefined"!=typeof self&&self.Prism&&self.document&&Prism.languages.markup&&(Prism.plugins.UnescapedMarkup=!0,Prism.hooks.add("before-highlightall",function(e){e.selector+=", [class*='lang-'] script[type='text/plain'], [class*='language-'] script[type='text/plain'], script[type='text/plain'][class*='lang-'], script[type='text/plain'][class*='language-']"}),Prism.hooks.add("before-sanity-check",function(t){if((t.element.matches||t.element.msMatchesSelector).call(t.element,"script[type='text/plain']")){var e=document.createElement("code");return(a=document.createElement("pre")).className=e.className=t.element.className,t.element.dataset&&Object.keys(t.element.dataset).forEach(function(e){Object.prototype.hasOwnProperty.call(t.element.dataset,e)&&(a.dataset[e]=t.element.dataset[e])}),t.code=t.code.replace(/<\/script(>|>)/gi,"<\/script>"),e.textContent=t.code,a.appendChild(e),t.element.parentNode.replaceChild(a,t.element),void(t.element=e)}var a=t.element.parentNode;!t.code&&a&&"pre"==a.nodeName.toLowerCase()&&t.element.childNodes.length&&"#comment"==t.element.childNodes[0].nodeName&&(t.element.textContent=t.code=t.element.childNodes[0].textContent)})); \ No newline at end of file +"undefined"!=typeof self&&self.Prism&&self.document&&(Prism.plugins.UnescapedMarkup=!0,Prism.hooks.add("before-highlightall",function(e){e.selector+=', [class*="lang-"] script[type="text/plain"], [class*="language-"] script[type="text/plain"], script[type="text/plain"][class*="lang-"], script[type="text/plain"][class*="language-"]'}),Prism.hooks.add("before-sanity-check",function(e){var t=e.element;if((t.matches||t.msMatchesSelector).call(t,'script[type="text/plain"]')){var a=document.createElement("code"),s=document.createElement("pre");s.className=a.className=t.className,t.dataset&&Object.keys(t.dataset).forEach(function(e){Object.prototype.hasOwnProperty.call(t.dataset,e)&&(s.dataset[e]=t.dataset[e])}),a.textContent=e.code=e.code.replace(/<\/script(>|>)/gi,"<\/script>"),s.appendChild(a),t.parentNode.replaceChild(s,t),e.element=a}else!e.code&&(t.matches||t.msMatchesSelector).call(t,"pre > code")&&t.firstChild&&"#comment"==t.firstChild.nodeName&&(t.textContent=e.code=t.firstChild.textContent)})); \ No newline at end of file diff --git a/tests/plugins/unescaped-markup/basic-functionality.js b/tests/plugins/unescaped-markup/basic-functionality.js new file mode 100644 index 0000000000..1e248bd2ad --- /dev/null +++ b/tests/plugins/unescaped-markup/basic-functionality.js @@ -0,0 +1,37 @@ +const { assert } = require('chai'); + +const dom = require('../../helper/prism-loader').createPrismDOM(); + +const { Prism, document } = dom.window; + +dom.loadLanguages('markup'); +dom.loadPlugins('unescaped-markup'); + + +describe('Show language', function () { + + function test(expectedText, code) { + document.body.innerHTML = code; + Prism.highlightAll(); + + assert.strictEqual(document.querySelector('code').textContent, expectedText); + } + + it('should work with comments', function () { + test('\n

Example

\n', `
`); + + test('\n

Example 2

\n', `
`); + }); + + it('should work with script tags', function () { + test('

Example

', ``); + + // inherit language + test('

Example 2

', `
`); + }); + +}); From b4010600bf8982107411c3a7cd030815ead26311 Mon Sep 17 00:00:00 2001 From: RunDevelopment Date: Fri, 12 Jul 2019 16:30:30 +0200 Subject: [PATCH 05/15] Proper DOM closing --- tests/plugins/copy-to-clipboard/basic-functionality.js | 10 ++++------ tests/plugins/custom-class/basic-functionality.js | 4 ++++ .../plugins/highlight-keywords/basic-functionality.js | 4 ++++ tests/plugins/keep-markup/test.js | 4 ++++ tests/plugins/show-invisibles/basic-functionality.js | 4 ++++ tests/plugins/show-language/basic-functionality.js | 4 ++++ tests/plugins/unescaped-markup/basic-functionality.js | 4 ++++ 7 files changed, 28 insertions(+), 6 deletions(-) diff --git a/tests/plugins/copy-to-clipboard/basic-functionality.js b/tests/plugins/copy-to-clipboard/basic-functionality.js index cbeff22d50..c9c1012bc2 100644 --- a/tests/plugins/copy-to-clipboard/basic-functionality.js +++ b/tests/plugins/copy-to-clipboard/basic-functionality.js @@ -47,12 +47,6 @@ dom.window.ClipboardJS = class { } }; -// the timeout which resets the button's text takes forever, so we just do it immediately. -const oldSetTimeout = dom.window.setTimeout; -dom.window.setTimeout = function (handle, timeout, ...args) { - return oldSetTimeout(handle, 0, args); -}; - dom.loadLanguages('javascript'); dom.loadPlugins('copy-to-clipboard'); @@ -103,3 +97,7 @@ describe('Copy to Clipboard', function () { }); }); + +after(() => { + dom.window.close(); +}); diff --git a/tests/plugins/custom-class/basic-functionality.js b/tests/plugins/custom-class/basic-functionality.js index 8e4d4cabdb..aa124b2fda 100644 --- a/tests/plugins/custom-class/basic-functionality.js +++ b/tests/plugins/custom-class/basic-functionality.js @@ -67,3 +67,7 @@ describe('Custom class', function () { }); }); + +after(() => { + dom.window.close(); +}); diff --git a/tests/plugins/highlight-keywords/basic-functionality.js b/tests/plugins/highlight-keywords/basic-functionality.js index 859a20592d..f82b38f353 100644 --- a/tests/plugins/highlight-keywords/basic-functionality.js +++ b/tests/plugins/highlight-keywords/basic-functionality.js @@ -16,3 +16,7 @@ describe('Highlight Keywords', function () { }); }); + +after(() => { + dom.window.close(); +}); diff --git a/tests/plugins/keep-markup/test.js b/tests/plugins/keep-markup/test.js index f4907701d4..993d55d49c 100644 --- a/tests/plugins/keep-markup/test.js +++ b/tests/plugins/keep-markup/test.js @@ -90,3 +90,7 @@ describe('Keep Markup', function () { }) */ }) + +after(() => { + dom.window.close(); +}); diff --git a/tests/plugins/show-invisibles/basic-functionality.js b/tests/plugins/show-invisibles/basic-functionality.js index 5237f8e1a9..e0d3db89f1 100644 --- a/tests/plugins/show-invisibles/basic-functionality.js +++ b/tests/plugins/show-invisibles/basic-functionality.js @@ -24,3 +24,7 @@ describe('Show Invisibles', function () { }); }); + +after(() => { + dom.window.close(); +}); diff --git a/tests/plugins/show-language/basic-functionality.js b/tests/plugins/show-language/basic-functionality.js index 5c93e8ba0c..062442d541 100644 --- a/tests/plugins/show-language/basic-functionality.js +++ b/tests/plugins/show-language/basic-functionality.js @@ -35,3 +35,7 @@ describe('Show language', function () { }); }); + +after(() => { + dom.window.close(); +}); diff --git a/tests/plugins/unescaped-markup/basic-functionality.js b/tests/plugins/unescaped-markup/basic-functionality.js index 1e248bd2ad..caccae2d50 100644 --- a/tests/plugins/unescaped-markup/basic-functionality.js +++ b/tests/plugins/unescaped-markup/basic-functionality.js @@ -35,3 +35,7 @@ describe('Show language', function () { }); }); + +after(() => { + dom.window.close(); +}); From 0891516b423e07dd2e4bec2ae344085ec421f011 Mon Sep 17 00:00:00 2001 From: RunDevelopment Date: Fri, 12 Jul 2019 16:30:45 +0200 Subject: [PATCH 06/15] Better error messages --- tests/helper/prism-loader.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/helper/prism-loader.js b/tests/helper/prism-loader.js index 57d45b8b00..00f9407eda 100644 --- a/tests/helper/prism-loader.js +++ b/tests/helper/prism-loader.js @@ -77,6 +77,10 @@ module.exports = { loadLanguages: function loadLanguages(languages) { for (const language of toArray(languages)) { + if (!(language in languagesCatalog)) { + throw new Error(`Unknown language '${language}'`); + } + if (loadedLanguages.has(language)) { continue; } @@ -93,6 +97,10 @@ module.exports = { loadPlugins: function loadPlugins(plugins) { for (const plugin of toArray(plugins)) { + if (!(plugin in pluginsCatalog)) { + throw new Error(`Unknown plugin '${plugin}'`); + } + if (loadedPlugins.has(plugin)) { continue; } From 1fab13f7d6a0af23ebf1e88d484fb605926060e8 Mon Sep 17 00:00:00 2001 From: RunDevelopment Date: Fri, 1 Oct 2021 23:53:26 +0200 Subject: [PATCH 07/15] New `usePrismDom` util function --- tests/helper/prism-dom-util.js | 43 ++++++++++++++++++++++++++++++---- tests/helper/prism-loader.js | 5 +++- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/tests/helper/prism-dom-util.js b/tests/helper/prism-dom-util.js index dbdaddbdbe..b442c07a05 100644 --- a/tests/helper/prism-dom-util.js +++ b/tests/helper/prism-dom-util.js @@ -1,10 +1,13 @@ const { assert } = require('chai'); +const PrismLoader = require('./prism-loader'); +/** + * @typedef {import("./prism-loader").PrismDOM} PrismDOM + */ module.exports = { /** - * - * @param {import("./prism-loader").PrismDOM} dom + * @param {PrismDOM} dom */ createUtil(dom) { const { Prism, document } = dom.window; @@ -13,7 +16,7 @@ module.exports = { assert: { - highlight({ language, code, expected }) { + highlight({ language = 'none', code, expected }) { assert.strictEqual(Prism.highlight(code, Prism.languages[language], language), expected); }, @@ -32,5 +35,37 @@ module.exports = { }; return util; + }, + + /** + * Creates a new Prism DOM that is automatically cleaned up. + * + * @param {Options} param0 + * @returns {Promise} + * + * @typedef Options + * @property {string | string[]} [languages] + * @property {string | string[]} [plugins] + * @property {(dom: PrismDOM) => Promise} use + */ + async usePrismDom({ languages, plugins, use }) { + const dom = PrismLoader.createPrismDOM(); + + if (languages) { + dom.loadLanguages(languages); + } + if (plugins) { + dom.loadPlugins(plugins); + } + + try { + await use(dom); + + dom.window.close(); + } catch (e) { + dom.window.close(); + + throw e; + } } -} +}; diff --git a/tests/helper/prism-loader.js b/tests/helper/prism-loader.js index 91c69ba0a0..1a9ef4dd98 100644 --- a/tests/helper/prism-loader.js +++ b/tests/helper/prism-loader.js @@ -1,4 +1,3 @@ -// @ts-check 'use strict'; const fs = require('fs'); const { JSDOM } = require('jsdom'); @@ -24,6 +23,8 @@ const { languages: languagesCatalog, plugins: pluginsCatalog } = components; * @typedef PrismDOM * @property {JSDOM} dom * @property {PrismWindow} window + * @property {Document} document + * @property {Prism} Prism * @property {(languages: string | string[]) => void} loadLanguages * @property {(plugins: string | string[]) => void} loadPlugins */ @@ -95,6 +96,8 @@ module.exports = { return { dom, window: /** @type {PrismWindow} */ (window), + document: window.document, + Prism: window.Prism, loadLanguages: load, loadPlugins: load, }; From 20dd51abed0595f11975eef484a97ba96a31067d Mon Sep 17 00:00:00 2001 From: RunDevelopment Date: Fri, 1 Oct 2021 23:53:33 +0200 Subject: [PATCH 08/15] Fixed copy to clipboard test --- .../copy-to-clipboard/basic-functionality.js | 131 +++++++----------- 1 file changed, 52 insertions(+), 79 deletions(-) diff --git a/tests/plugins/copy-to-clipboard/basic-functionality.js b/tests/plugins/copy-to-clipboard/basic-functionality.js index c9c1012bc2..74d2386c8c 100644 --- a/tests/plugins/copy-to-clipboard/basic-functionality.js +++ b/tests/plugins/copy-to-clipboard/basic-functionality.js @@ -1,103 +1,76 @@ const { assert } = require('chai'); +const { usePrismDom } = require('../../helper/prism-dom-util'); -const dom = require('../../helper/prism-loader').createPrismDOM(); - -const { Prism, document } = dom.window; - -// A very simple class pretending to by ClipboardJS v2. -// This is our "virtual clipboard". -let ClipboardText = null; -let ClipboardCopyWillSucceed = true; -dom.window.ClipboardJS = class { - /** - * - * @param {Element} element - * @param {Object} options - * @param {() => string} options.text - */ - constructor(element, options) { - this.element = element; - this.options = options; - element.addEventListener('click', () => this.fire()); - this.onSuccess = []; - this.onError = []; +class DummyClipboard { + constructor() { + this.text = ''; } - - on(event, callback) { - switch (event) { - case 'success': - this.onSuccess.push(callback); - break; - case 'error': - this.onError.push(callback); - break; - - default: - throw new Error(`Unknown event. Please fix this make-believe.`); - } + async readText() { + return this.text; } - - fire() { - if (ClipboardCopyWillSucceed) { - ClipboardText = this.options.text(); - this.onSuccess.forEach(c => c()); - } else { - this.onError.forEach(c => c()); - } + /** @param {string} data */ + writeText(data) { + this.text = data; + return Promise.resolve(); } -}; - -dom.loadLanguages('javascript'); -dom.loadPlugins('copy-to-clipboard'); - +} describe('Copy to Clipboard', function () { it('should work', function () { - document.body.innerHTML = `
foo
`; - Prism.highlightAll(); + return usePrismDom({ + languages: 'javascript', + plugins: 'copy-to-clipboard', + async use({ Prism, document, window }) { + const clipboard = new DummyClipboard(); + window.navigator.clipboard = clipboard; + + document.body.innerHTML = `
foo
`; + Prism.highlightAll(); - const button = document.querySelector('button'); - assert.notStrictEqual(button, null); + const button = document.querySelector('button'); + assert.notStrictEqual(button, null); - ClipboardText = null; - ClipboardCopyWillSucceed = true; - button.click(); + button.click(); - assert.strictEqual(ClipboardText, 'foo'); + assert.strictEqual(clipboard.text, 'foo'); + } + }); }); it('should copy the current text even after the code block changes its text', function () { - document.body.innerHTML = `
foo
`; - Prism.highlightAll(); + return usePrismDom({ + languages: 'javascript', + plugins: 'copy-to-clipboard', + async use({ Prism, document, window }) { + const clipboard = new DummyClipboard(); + window.navigator.clipboard = clipboard; - const button = document.querySelector('button'); - assert.notStrictEqual(button, null); + document.body.innerHTML = `
foo
`; + Prism.highlightAll(); - ClipboardText = null; - ClipboardCopyWillSucceed = true; - button.click(); + const button = document.querySelector('button'); + assert.notStrictEqual(button, null); - assert.strictEqual(ClipboardText, 'foo'); + button.click(); - // change text - document.querySelector('code').textContent = "bar"; - // and click - button.click(); + assert.strictEqual(clipboard.text, 'foo'); - assert.strictEqual(ClipboardText, 'bar'); + // change text + document.querySelector('code').textContent = 'bar'; + // and click + button.click(); - // change text - document.querySelector('code').textContent = "baz"; - Prism.highlightAll(); - // and click - button.click(); + assert.strictEqual(clipboard.text, 'bar'); - assert.strictEqual(ClipboardText, 'baz'); - }); - -}); + // change text + document.querySelector('code').textContent = 'baz'; + Prism.highlightAll(); + // and click + button.click(); -after(() => { - dom.window.close(); + assert.strictEqual(clipboard.text, 'baz'); + } + }); + }); }); From e248e69577bbf2449128c8645f607595269d5dbf Mon Sep 17 00:00:00 2001 From: RunDevelopment Date: Fri, 1 Oct 2021 23:58:46 +0200 Subject: [PATCH 09/15] Make createUtil requrie less --- tests/helper/prism-dom-util.js | 12 ++++-------- tests/plugins/custom-class/basic-functionality.js | 2 +- .../highlight-keywords/basic-functionality.js | 2 +- tests/plugins/show-invisibles/basic-functionality.js | 2 +- 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/tests/helper/prism-dom-util.js b/tests/helper/prism-dom-util.js index b442c07a05..a58ebdfad9 100644 --- a/tests/helper/prism-dom-util.js +++ b/tests/helper/prism-dom-util.js @@ -3,23 +3,21 @@ const PrismLoader = require('./prism-loader'); /** * @typedef {import("./prism-loader").PrismDOM} PrismDOM + * @typedef {import("./prism-loader").PrismWindow} PrismWindow */ module.exports = { /** - * @param {PrismDOM} dom + * @param {PrismWindow} window */ - createUtil(dom) { - const { Prism, document } = dom.window; + createUtil(window) { + const { Prism, document } = window; const util = { - assert: { - highlight({ language = 'none', code, expected }) { assert.strictEqual(Prism.highlight(code, Prism.languages[language], language), expected); }, - highlightElement({ language = 'none', code, expected }) { const element = document.createElement('CODE'); element.classList.add('language-' + language); @@ -29,9 +27,7 @@ module.exports = { assert.strictEqual(element.innerHTML, expected); } - }, - }; return util; diff --git a/tests/plugins/custom-class/basic-functionality.js b/tests/plugins/custom-class/basic-functionality.js index aa124b2fda..3444b27ef1 100644 --- a/tests/plugins/custom-class/basic-functionality.js +++ b/tests/plugins/custom-class/basic-functionality.js @@ -1,5 +1,5 @@ const dom = require('../../helper/prism-loader').createPrismDOM(); -const util = require('../../helper/prism-dom-util').createUtil(dom); +const util = require('../../helper/prism-dom-util').createUtil(dom.window); const { Prism } = dom.window; diff --git a/tests/plugins/highlight-keywords/basic-functionality.js b/tests/plugins/highlight-keywords/basic-functionality.js index f82b38f353..d2a730fae5 100644 --- a/tests/plugins/highlight-keywords/basic-functionality.js +++ b/tests/plugins/highlight-keywords/basic-functionality.js @@ -1,5 +1,5 @@ const dom = require('../../helper/prism-loader').createPrismDOM(); -const util = require('../../helper/prism-dom-util').createUtil(dom); +const util = require('../../helper/prism-dom-util').createUtil(dom.window); dom.loadLanguages('javascript'); dom.loadPlugins('highlight-keywords'); diff --git a/tests/plugins/show-invisibles/basic-functionality.js b/tests/plugins/show-invisibles/basic-functionality.js index e0d3db89f1..82a7bbadd3 100644 --- a/tests/plugins/show-invisibles/basic-functionality.js +++ b/tests/plugins/show-invisibles/basic-functionality.js @@ -1,5 +1,5 @@ const dom = require('../../helper/prism-loader').createPrismDOM(); -const util = require('../../helper/prism-dom-util').createUtil(dom); +const util = require('../../helper/prism-dom-util').createUtil(dom.window); dom.loadLanguages('javascript'); dom.loadPlugins('show-invisibles'); From f5daca71aca97262ffda6bcee5500b85eb5f137e Mon Sep 17 00:00:00 2001 From: RunDevelopment Date: Sat, 2 Oct 2021 00:35:46 +0200 Subject: [PATCH 10/15] Consistently use new util function everywhere --- tests/helper/prism-dom-util.js | 35 +++------ .../copy-to-clipboard/basic-functionality.js | 75 +++++++++---------- .../custom-class/basic-functionality.js | 18 ++--- .../highlight-keywords/basic-functionality.js | 16 ++-- tests/plugins/keep-markup/test.js | 16 ++-- .../show-invisibles/basic-functionality.js | 16 ++-- .../show-language/basic-functionality.js | 17 ++--- .../unescaped-markup/basic-functionality.js | 17 ++--- 8 files changed, 86 insertions(+), 124 deletions(-) diff --git a/tests/helper/prism-dom-util.js b/tests/helper/prism-dom-util.js index a58ebdfad9..53aa4dbd31 100644 --- a/tests/helper/prism-dom-util.js +++ b/tests/helper/prism-dom-util.js @@ -34,34 +34,23 @@ module.exports = { }, /** - * Creates a new Prism DOM that is automatically cleaned up. - * - * @param {Options} param0 - * @returns {Promise} - * - * @typedef Options - * @property {string | string[]} [languages] - * @property {string | string[]} [plugins] - * @property {(dom: PrismDOM) => Promise} use + * @param {ReturnType} suite + * @param {Partial>} options */ - async usePrismDom({ languages, plugins, use }) { + reusablePrismDom(suite, options = {}) { const dom = PrismLoader.createPrismDOM(); - if (languages) { - dom.loadLanguages(languages); - } - if (plugins) { - dom.loadPlugins(plugins); - } - - try { - await use(dom); - - dom.window.close(); - } catch (e) { + suite.afterAll(function () { dom.window.close(); + }); - throw e; + if (options.languages) { + dom.loadLanguages(options.languages); + } + if (options.plugins) { + dom.loadPlugins(options.plugins); } + + return dom; } }; diff --git a/tests/plugins/copy-to-clipboard/basic-functionality.js b/tests/plugins/copy-to-clipboard/basic-functionality.js index 74d2386c8c..b43067f7bc 100644 --- a/tests/plugins/copy-to-clipboard/basic-functionality.js +++ b/tests/plugins/copy-to-clipboard/basic-functionality.js @@ -1,5 +1,6 @@ const { assert } = require('chai'); -const { usePrismDom } = require('../../helper/prism-dom-util'); +const { reusablePrismDom } = require('../../helper/prism-dom-util'); + class DummyClipboard { constructor() { @@ -16,61 +17,55 @@ class DummyClipboard { } describe('Copy to Clipboard', function () { + const { Prism, document, window } = reusablePrismDom(this, { + languages: 'javascript', + plugins: 'copy-to-clipboard', + }); + it('should work', function () { - return usePrismDom({ - languages: 'javascript', - plugins: 'copy-to-clipboard', - async use({ Prism, document, window }) { - const clipboard = new DummyClipboard(); - window.navigator.clipboard = clipboard; + const clipboard = new DummyClipboard(); + window.navigator.clipboard = clipboard; - document.body.innerHTML = `
foo
`; - Prism.highlightAll(); + document.body.innerHTML = `
foo
`; + Prism.highlightAll(); - const button = document.querySelector('button'); - assert.notStrictEqual(button, null); + const button = document.querySelector('button'); + assert.notStrictEqual(button, null); - button.click(); + button.click(); - assert.strictEqual(clipboard.text, 'foo'); - } - }); + assert.strictEqual(clipboard.text, 'foo'); }); it('should copy the current text even after the code block changes its text', function () { - return usePrismDom({ - languages: 'javascript', - plugins: 'copy-to-clipboard', - async use({ Prism, document, window }) { - const clipboard = new DummyClipboard(); - window.navigator.clipboard = clipboard; + const clipboard = new DummyClipboard(); + window.navigator.clipboard = clipboard; - document.body.innerHTML = `
foo
`; - Prism.highlightAll(); + document.body.innerHTML = `
foo
`; + Prism.highlightAll(); - const button = document.querySelector('button'); - assert.notStrictEqual(button, null); + const button = document.querySelector('button'); + assert.notStrictEqual(button, null); - button.click(); + button.click(); - assert.strictEqual(clipboard.text, 'foo'); + assert.strictEqual(clipboard.text, 'foo'); - // change text - document.querySelector('code').textContent = 'bar'; - // and click - button.click(); + // change text + document.querySelector('code').textContent = 'bar'; + // and click + button.click(); - assert.strictEqual(clipboard.text, 'bar'); + assert.strictEqual(clipboard.text, 'bar'); - // change text - document.querySelector('code').textContent = 'baz'; - Prism.highlightAll(); - // and click - button.click(); + // change text + document.querySelector('code').textContent = 'baz'; + Prism.highlightAll(); + // and click + button.click(); - assert.strictEqual(clipboard.text, 'baz'); - } - }); + assert.strictEqual(clipboard.text, 'baz'); }); + }); diff --git a/tests/plugins/custom-class/basic-functionality.js b/tests/plugins/custom-class/basic-functionality.js index 3444b27ef1..f60b85bc09 100644 --- a/tests/plugins/custom-class/basic-functionality.js +++ b/tests/plugins/custom-class/basic-functionality.js @@ -1,13 +1,13 @@ -const dom = require('../../helper/prism-loader').createPrismDOM(); -const util = require('../../helper/prism-dom-util').createUtil(dom.window); - -const { Prism } = dom.window; - -dom.loadLanguages('javascript'); -dom.loadPlugins('custom-class'); +const { createUtil, reusablePrismDom } = require('../../helper/prism-dom-util'); describe('Custom class', function () { + const { Prism, window } = reusablePrismDom(this, { + languages: 'javascript', + plugins: 'custom-class' + }); + const util = createUtil(window); + it('should set prefix', function () { Prism.plugins.customClass.prefix('prism-'); @@ -67,7 +67,3 @@ describe('Custom class', function () { }); }); - -after(() => { - dom.window.close(); -}); diff --git a/tests/plugins/highlight-keywords/basic-functionality.js b/tests/plugins/highlight-keywords/basic-functionality.js index d2a730fae5..4956965bef 100644 --- a/tests/plugins/highlight-keywords/basic-functionality.js +++ b/tests/plugins/highlight-keywords/basic-functionality.js @@ -1,11 +1,13 @@ -const dom = require('../../helper/prism-loader').createPrismDOM(); -const util = require('../../helper/prism-dom-util').createUtil(dom.window); - -dom.loadLanguages('javascript'); -dom.loadPlugins('highlight-keywords'); +const { createUtil, reusablePrismDom } = require('../../helper/prism-dom-util'); describe('Highlight Keywords', function () { + const { window } = reusablePrismDom(this, { + languages: 'javascript', + plugins: 'custom-class' + }); + const util = createUtil(window); + it('should highlight keywords', function () { util.assert.highlightElement({ @@ -16,7 +18,3 @@ describe('Highlight Keywords', function () { }); }); - -after(() => { - dom.window.close(); -}); diff --git a/tests/plugins/keep-markup/test.js b/tests/plugins/keep-markup/test.js index 488b345186..c99fa88bb0 100644 --- a/tests/plugins/keep-markup/test.js +++ b/tests/plugins/keep-markup/test.js @@ -1,13 +1,13 @@ const { expect } = require('chai'); -const dom = require('../../helper/prism-loader').createPrismDOM(); - -const { Prism, document } = dom.window; - -document.createRange = function () { }; // fake createRange for Keep Markup -dom.loadPlugins('keep-markup'); +const { reusablePrismDom } = require('../../helper/prism-dom-util'); describe('Keep Markup', function () { + const { Prism, document } = reusablePrismDom(this, { + plugins: 'keep-markup' + }); + document.createRange = function () { }; // fake createRange for Keep Markup + function execute(code) { const start = []; @@ -90,7 +90,3 @@ describe('Keep Markup', function () { }) */ }); - -after(() => { - dom.window.close(); -}); diff --git a/tests/plugins/show-invisibles/basic-functionality.js b/tests/plugins/show-invisibles/basic-functionality.js index 82a7bbadd3..753e36e491 100644 --- a/tests/plugins/show-invisibles/basic-functionality.js +++ b/tests/plugins/show-invisibles/basic-functionality.js @@ -1,11 +1,13 @@ -const dom = require('../../helper/prism-loader').createPrismDOM(); -const util = require('../../helper/prism-dom-util').createUtil(dom.window); - -dom.loadLanguages('javascript'); -dom.loadPlugins('show-invisibles'); +const { createUtil, reusablePrismDom } = require('../../helper/prism-dom-util'); describe('Show Invisibles', function () { + const { window } = reusablePrismDom(this, { + languages: 'javascript', + plugins: 'show-invisibles' + }); + const util = createUtil(window); + it('should show invisible characters', function () { util.assert.highlightElement({ @@ -24,7 +26,3 @@ describe('Show Invisibles', function () { }); }); - -after(() => { - dom.window.close(); -}); diff --git a/tests/plugins/show-language/basic-functionality.js b/tests/plugins/show-language/basic-functionality.js index 062442d541..711392f781 100644 --- a/tests/plugins/show-language/basic-functionality.js +++ b/tests/plugins/show-language/basic-functionality.js @@ -1,14 +1,13 @@ const { assert } = require('chai'); - -const dom = require('../../helper/prism-loader').createPrismDOM(); - -const { Prism, document } = dom.window; - -dom.loadLanguages(['markup', 'javascript']); -dom.loadPlugins('show-language'); +const { reusablePrismDom } = require('../../helper/prism-dom-util'); describe('Show language', function () { + const { Prism, document } = reusablePrismDom(this, { + languages: ['markup', 'javascript'], + plugins: 'show-language' + }); + function test(expectedLanguage, code) { document.body.innerHTML = code; @@ -35,7 +34,3 @@ describe('Show language', function () { }); }); - -after(() => { - dom.window.close(); -}); diff --git a/tests/plugins/unescaped-markup/basic-functionality.js b/tests/plugins/unescaped-markup/basic-functionality.js index caccae2d50..9f2a66baef 100644 --- a/tests/plugins/unescaped-markup/basic-functionality.js +++ b/tests/plugins/unescaped-markup/basic-functionality.js @@ -1,14 +1,13 @@ const { assert } = require('chai'); - -const dom = require('../../helper/prism-loader').createPrismDOM(); - -const { Prism, document } = dom.window; - -dom.loadLanguages('markup'); -dom.loadPlugins('unescaped-markup'); +const { reusablePrismDom } = require('../../helper/prism-dom-util'); describe('Show language', function () { + const { Prism, document } = reusablePrismDom(this, { + languages: 'markup', + plugins: 'unescaped-markup' + }); + function test(expectedText, code) { document.body.innerHTML = code; @@ -35,7 +34,3 @@ describe('Show language', function () { }); }); - -after(() => { - dom.window.close(); -}); From a87151ac3aac056a71eebf20290772b6ca880f61 Mon Sep 17 00:00:00 2001 From: RunDevelopment Date: Sat, 2 Oct 2021 00:42:47 +0200 Subject: [PATCH 11/15] Fixed failing tests --- tests/plugins/highlight-keywords/basic-functionality.js | 2 +- tests/plugins/keep-markup/test.js | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/plugins/highlight-keywords/basic-functionality.js b/tests/plugins/highlight-keywords/basic-functionality.js index 4956965bef..4d90c31de6 100644 --- a/tests/plugins/highlight-keywords/basic-functionality.js +++ b/tests/plugins/highlight-keywords/basic-functionality.js @@ -4,7 +4,7 @@ const { createUtil, reusablePrismDom } = require('../../helper/prism-dom-util'); describe('Highlight Keywords', function () { const { window } = reusablePrismDom(this, { languages: 'javascript', - plugins: 'custom-class' + plugins: 'highlight-keywords' }); const util = createUtil(window); diff --git a/tests/plugins/keep-markup/test.js b/tests/plugins/keep-markup/test.js index c99fa88bb0..32cf6900b0 100644 --- a/tests/plugins/keep-markup/test.js +++ b/tests/plugins/keep-markup/test.js @@ -3,10 +3,9 @@ const { reusablePrismDom } = require('../../helper/prism-dom-util'); describe('Keep Markup', function () { - const { Prism, document } = reusablePrismDom(this, { - plugins: 'keep-markup' - }); + const { Prism, document, loadPlugins } = reusablePrismDom(this); document.createRange = function () { }; // fake createRange for Keep Markup + loadPlugins('keep-markup'); function execute(code) { From 9f37f83a943bcaaac56be614353f42a0511dd4f2 Mon Sep 17 00:00:00 2001 From: RunDevelopment Date: Sat, 2 Oct 2021 00:46:33 +0200 Subject: [PATCH 12/15] Fixed linting error --- tests/plugins/show-invisibles/basic-functionality.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/plugins/show-invisibles/basic-functionality.js b/tests/plugins/show-invisibles/basic-functionality.js index 753e36e491..de9f50a2bf 100644 --- a/tests/plugins/show-invisibles/basic-functionality.js +++ b/tests/plugins/show-invisibles/basic-functionality.js @@ -12,7 +12,7 @@ describe('Show Invisibles', function () { it('should show invisible characters', function () { util.assert.highlightElement({ language: 'javascript', - code: ` \n\r\n `, + code: ` \t\n\r\n\t\t`, expected: ` \t\n\n\t\t` }); }); From f9d0c0624504dd46d8fd07b701a86e32f323fbc5 Mon Sep 17 00:00:00 2001 From: RunDevelopment Date: Sat, 2 Oct 2021 01:17:09 +0200 Subject: [PATCH 13/15] Updated JSDom --- package-lock.json | 711 ++++++++++++------------------ package.json | 2 +- tests/plugins/keep-markup/test.js | 91 ++-- 3 files changed, 309 insertions(+), 495 deletions(-) diff --git a/package-lock.json b/package-lock.json index f03cb71685..a1a72ec236 100644 --- a/package-lock.json +++ b/package-lock.json @@ -322,6 +322,12 @@ "@types/node": ">= 8" } }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, "@types/events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", @@ -390,9 +396,9 @@ "dev": true }, "abab": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", - "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", "dev": true }, "abort-controller": { @@ -405,19 +411,27 @@ } }, "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", "dev": true }, "acorn-globals": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.0.tgz", - "integrity": "sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", "dev": true, "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } } }, "acorn-jsx": { @@ -427,9 +441,9 @@ "dev": true }, "acorn-walk": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", - "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "dev": true }, "agent-base": { @@ -568,12 +582,6 @@ "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", "dev": true }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", - "dev": true - }, "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", @@ -673,21 +681,6 @@ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", "dev": true }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -733,12 +726,6 @@ "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, - "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", - "dev": true - }, "async-retry": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.2.3.tgz", @@ -775,18 +762,6 @@ "integrity": "sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY=", "dev": true }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true - }, "bach": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", @@ -871,15 +846,6 @@ "integrity": "sha1-RSIe5Cn37h5QNb4/UVM/HN/SmIQ=", "dev": true }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, "beeper": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/beeper/-/beeper-2.0.0.tgz", @@ -973,9 +939,9 @@ } }, "browser-process-hrtime": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", - "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", "dev": true }, "browser-stdout": { @@ -1090,12 +1056,6 @@ } } }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, "catharsis": { "version": "0.8.11", "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.11.tgz", @@ -1443,18 +1403,26 @@ } }, "cssom": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz", - "integrity": "sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A==", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", "dev": true }, "cssstyle": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.1.tgz", - "integrity": "sha512-7DYm8qe+gPx/h77QlCyFmX80+fGaE/6A/Ekl0zaszYOubvySO2saYFdQ78P29D0UsULxFKCetDGNaNRUdSF+2A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", "dev": true, "requires": { - "cssom": "0.3.x" + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } } }, "cubic2quad": { @@ -1543,24 +1511,43 @@ } } }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", "dev": true, "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "dependencies": { + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + } } }, "debug": { @@ -1596,6 +1583,12 @@ } } }, + "decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", + "dev": true + }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", @@ -1807,12 +1800,20 @@ "dev": true }, "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", "dev": true, "requires": { - "webidl-conversions": "^4.0.2" + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } } }, "domhandler": { @@ -1863,16 +1864,6 @@ "object.defaults": "^1.1.0" } }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -2046,18 +2037,24 @@ "dev": true }, "escodegen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", - "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", "dev": true, "requires": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", + "esprima": "^4.0.1", + "estraverse": "^5.2.0", "esutils": "^2.0.2", "optionator": "^0.8.1", "source-map": "~0.6.1" }, "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -2466,9 +2463,9 @@ } }, "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "esquery": { @@ -2697,12 +2694,6 @@ } } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, "fancy-log": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", @@ -2908,21 +2899,26 @@ "for-in": "^1.0.1" } }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dev": true, "requires": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", + "combined-stream": "^1.0.8", "mime-types": "^2.1.12" + }, + "dependencies": { + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + } } }, "fragment-cache": { @@ -3048,15 +3044,6 @@ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "git-config-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/git-config-path/-/git-config-path-1.0.1.tgz", @@ -3446,22 +3433,6 @@ } } }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -3558,12 +3529,12 @@ "dev": true }, "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", "dev": true, "requires": { - "whatwg-encoding": "^1.0.1" + "whatwg-encoding": "^1.0.5" } }, "htmlparser2": { @@ -3636,17 +3607,6 @@ } } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, "https-proxy-agent": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", @@ -4005,6 +3965,12 @@ "isobject": "^3.0.1" } }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, "is-regex": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", @@ -4044,12 +4010,6 @@ "has-symbols": "^1.0.0" } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, "is-unc-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", @@ -4095,12 +4055,6 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, "istextorbinary": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.2.1.tgz", @@ -4145,12 +4099,6 @@ "xmlcreate": "^2.0.3" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, "jsdoc": { "version": "3.6.4", "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.4.tgz", @@ -4200,37 +4148,111 @@ "dev": true }, "jsdom": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-13.2.0.tgz", - "integrity": "sha512-cG1NtMWO9hWpqRNRR3dSvEQa8bFI6iLlqU2x4kwX51FQjp0qus8T9aBaAO6iGp3DeBrhdwuKxckknohkmfvsFw==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "acorn": "^6.0.4", - "acorn-globals": "^4.3.0", - "array-equal": "^1.0.0", - "cssom": "^0.3.4", - "cssstyle": "^1.1.1", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.0", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.0.9", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.5", - "saxes": "^3.1.5", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.5.0", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.0.1", - "webidl-conversions": "^4.0.2", + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", "whatwg-encoding": "^1.0.5", "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^6.1.2", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + } } }, "json-parse-better-errors": { @@ -4239,12 +4261,6 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -4257,12 +4273,6 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, "json5": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", @@ -4321,18 +4331,6 @@ } } }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, "just-debounce": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", @@ -5510,15 +5508,9 @@ } }, "nwsapi": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.1.tgz", - "integrity": "sha512-T5GaA1J/d34AC8mkrFD2O0DR17kwJ702ZOtJOsS8RpbsQZVOC2/xYFb1i/cw+xdM54JIlMuojjDOYct8GIWtwg==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", "dev": true }, "object-assign": { @@ -5664,17 +5656,17 @@ "dev": true }, "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, "requires": { "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", + "fast-levenshtein": "~2.0.6", "levn": "~0.3.0", "prelude-ls": "~1.1.2", "type-check": "~0.3.2", - "wordwrap": "~1.0.0" + "word-wrap": "~1.2.3" } }, "ordered-read-streams": { @@ -5847,9 +5839,9 @@ "dev": true }, "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, "pascalcase": { @@ -5929,12 +5921,6 @@ "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", "dev": true }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, "picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", @@ -5981,12 +5967,6 @@ "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", "dev": true }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", - "dev": true - }, "portfinder": { "version": "1.0.28", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", @@ -6107,9 +6087,9 @@ "dev": true }, "psl": { - "version": "1.1.31", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", - "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, "pump": { @@ -6368,72 +6348,6 @@ "readable-stream": "^2.0.2" } }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } - } - } - }, - "request-promise-core": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", - "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", - "dev": true, - "requires": { - "lodash": "^4.17.11" - } - }, - "request-promise-native": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", - "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", - "dev": true, - "requires": { - "request-promise-core": "1.1.2", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -6584,12 +6498,12 @@ "dev": true }, "saxes": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.9.tgz", - "integrity": "sha512-FZeKhJglhJHk7eWG5YM0z46VHmI3KJpMBAQm3xa9meDvd+wevB5GuBB0wc0exPInZiBBHqi00DbS8AcvCGCFMw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", "dev": true, "requires": { - "xmlchars": "^1.3.1" + "xmlchars": "^2.2.0" } }, "scslre": { @@ -6952,23 +6866,6 @@ "integrity": "sha512-00kZI87TdRKwt+P8jj8UZxbfp7mK2ufxcIMWvhAOZNJTRROimpHeruWrGvCZneiuVDLqdyHefVp748ECTnyUBQ==", "dev": true }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, "stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", @@ -6996,12 +6893,6 @@ } } }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true - }, "stream-exhaust": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", @@ -7295,9 +7186,9 @@ "dev": true }, "symbol-tree": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", - "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, "table": { @@ -7491,13 +7382,14 @@ } }, "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", "dev": true, "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" } }, "tr46": { @@ -7542,21 +7434,6 @@ "pako": "^1.0.0" } }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, "type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", @@ -7804,12 +7681,6 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - }, "v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", @@ -7876,17 +7747,6 @@ } } }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "vinyl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", @@ -7951,22 +7811,20 @@ } }, "w3c-hr-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", - "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", "dev": true, "requires": { - "browser-process-hrtime": "^0.1.2" + "browser-process-hrtime": "^1.0.0" } }, "w3c-xmlserializer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.0.1.tgz", - "integrity": "sha512-XZGI1OH/OLQr/NaJhhPmzhngwcAnZDLytsvXnRmlYeRkmbb0I7sqFFA22erq4WQR0sUu17ZSQOAV9mFwCqKRNg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", "dev": true, "requires": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", "xml-name-validator": "^3.0.0" } }, @@ -8126,12 +7984,6 @@ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, "wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", @@ -8149,13 +8001,10 @@ "dev": true }, "ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", + "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==", + "dev": true }, "xml-name-validator": { "version": "3.0.0", @@ -8180,9 +8029,9 @@ "dev": true }, "xmlchars": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-1.3.1.tgz", - "integrity": "sha512-tGkGJkN8XqCod7OT+EvGYK5Z4SfDQGD30zAa58OcnAa0RRWgzUEK72tkXhsX1FZd+rgnhRxFtmO+ihkp8LHSkw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, "xmlcreate": { diff --git a/package.json b/package.json index a094e749b8..3cb4101f6e 100755 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "gzip-size": "^5.1.1", "htmlparser2": "^4.0.0", "http-server": "^0.12.3", - "jsdom": "^13.0.0", + "jsdom": "^16.7.0", "mocha": "^6.2.0", "node-fetch": "^2.6.0", "npm-run-all": "^4.1.5", diff --git a/tests/plugins/keep-markup/test.js b/tests/plugins/keep-markup/test.js index 32cf6900b0..35ddecace3 100644 --- a/tests/plugins/keep-markup/test.js +++ b/tests/plugins/keep-markup/test.js @@ -1,82 +1,47 @@ -const { expect } = require('chai'); +const { assert } = require('chai'); const { reusablePrismDom } = require('../../helper/prism-dom-util'); describe('Keep Markup', function () { - const { Prism, document, loadPlugins } = reusablePrismDom(this); - document.createRange = function () { }; // fake createRange for Keep Markup - loadPlugins('keep-markup'); - + const { Prism, document } = reusablePrismDom(this, { + plugins: 'keep-markup' + }); - function execute(code) { - const start = []; - const end = []; - const nodes = []; - document.createRange = function () { - return { - setStart: function (node, offset) { - start.push({ node, offset }); - }, - setEnd: function (node, offset) { - end.push({ node, offset }); - }, - extractContents: function () { - return document.createTextNode(''); - }, - insertNode: function (node) { - nodes.push(node); - }, - detach: function () { - } - }; - }; - document.body.innerHTML = code; - const element = document.body.firstElementChild; + /** + * @param {string} html + * @param {string} language + */ + function highlightInElement(html, language = 'none') { + const pre = document.createElement('pre'); + pre.className = `language-${language}`; + pre.innerHTML = `${html}`; + Prism.highlightElement(pre); - const beforeHighlight = Prism.hooks.all['before-highlight'][0]; - const afterHighlight = Prism.hooks.all['after-highlight'][0]; + return pre.querySelector('code').innerHTML; + } - const env = { - element, - language: 'javascript' - }; - beforeHighlight(env); - afterHighlight(env); - return { start, end, nodes }; + /** + * @param {string} html + * @param {string} language + */ + function keepMarkup(html, language = 'none') { + assert.equal(highlightInElement(html, language), html); } it('should keep markup', function () { - const result = execute(`xay`); - expect(result.start.length).to.equal(1); - expect(result.end.length).to.equal(1); - expect(result.nodes.length).to.equal(1); - expect(result.nodes[0].nodeName).to.equal('SPAN'); + keepMarkup(`xay`); }); it('should preserve markup order', function () { - const result = execute(`xy`); - expect(result.start.length).to.equal(2); - expect(result.start[0].offset).to.equal(0); - expect(result.start[0].node.textContent).to.equal('y'); - expect(result.start[1].offset).to.equal(0); - expect(result.start[1].node.textContent).to.equal('y'); - expect(result.end.length).to.equal(2); - expect(result.end[0].offset).to.equal(0); - expect(result.end[0].node.textContent).to.equal('y'); - expect(result.end[1].offset).to.equal(0); - expect(result.end[1].node.textContent).to.equal('y'); - expect(result.nodes.length).to.equal(2); - expect(result.nodes[0].nodeName).to.equal('A'); - expect(result.nodes[1].nodeName).to.equal('B'); + keepMarkup(`xy`); }); - it('should keep last markup', function () { - const result = execute(`xya`); - expect(result.start.length).to.equal(1); - expect(result.end.length).to.equal(1); - expect(result.nodes.length).to.equal(1); - expect(result.nodes[0].nodeName).to.equal('SPAN'); + + it('should keep last markup', function () { + keepMarkup(`xya`); + keepMarkup(`xya`); }); + // The markup is removed if it's the last element and the element's name is a single letter: a(nchor), b(old), i(talic)... // https://github.com/PrismJS/prism/issues/1618 /* From 4d1d70eee614e3baf191b9efced895d861de9577 Mon Sep 17 00:00:00 2001 From: RunDevelopment Date: Mon, 4 Oct 2021 17:26:10 +0200 Subject: [PATCH 14/15] Removed main function to `createScopedPrismDom` --- tests/helper/prism-dom-util.js | 4 +++- tests/plugins/copy-to-clipboard/basic-functionality.js | 4 ++-- tests/plugins/custom-class/basic-functionality.js | 4 ++-- tests/plugins/highlight-keywords/basic-functionality.js | 4 ++-- tests/plugins/keep-markup/test.js | 4 ++-- tests/plugins/show-invisibles/basic-functionality.js | 4 ++-- tests/plugins/show-language/basic-functionality.js | 4 ++-- tests/plugins/unescaped-markup/basic-functionality.js | 4 ++-- 8 files changed, 17 insertions(+), 15 deletions(-) diff --git a/tests/helper/prism-dom-util.js b/tests/helper/prism-dom-util.js index 53aa4dbd31..86de3645fe 100644 --- a/tests/helper/prism-dom-util.js +++ b/tests/helper/prism-dom-util.js @@ -34,10 +34,12 @@ module.exports = { }, /** + * Creates a Prism DOM instance that will be automatically cleaned up after the given test suite finished. + * * @param {ReturnType} suite * @param {Partial>} options */ - reusablePrismDom(suite, options = {}) { + createScopedPrismDom(suite, options = {}) { const dom = PrismLoader.createPrismDOM(); suite.afterAll(function () { diff --git a/tests/plugins/copy-to-clipboard/basic-functionality.js b/tests/plugins/copy-to-clipboard/basic-functionality.js index b43067f7bc..89502f4c8d 100644 --- a/tests/plugins/copy-to-clipboard/basic-functionality.js +++ b/tests/plugins/copy-to-clipboard/basic-functionality.js @@ -1,5 +1,5 @@ const { assert } = require('chai'); -const { reusablePrismDom } = require('../../helper/prism-dom-util'); +const { createScopedPrismDom } = require('../../helper/prism-dom-util'); class DummyClipboard { @@ -17,7 +17,7 @@ class DummyClipboard { } describe('Copy to Clipboard', function () { - const { Prism, document, window } = reusablePrismDom(this, { + const { Prism, document, window } = createScopedPrismDom(this, { languages: 'javascript', plugins: 'copy-to-clipboard', }); diff --git a/tests/plugins/custom-class/basic-functionality.js b/tests/plugins/custom-class/basic-functionality.js index f60b85bc09..54444d7886 100644 --- a/tests/plugins/custom-class/basic-functionality.js +++ b/tests/plugins/custom-class/basic-functionality.js @@ -1,8 +1,8 @@ -const { createUtil, reusablePrismDom } = require('../../helper/prism-dom-util'); +const { createUtil, createScopedPrismDom } = require('../../helper/prism-dom-util'); describe('Custom class', function () { - const { Prism, window } = reusablePrismDom(this, { + const { Prism, window } = createScopedPrismDom(this, { languages: 'javascript', plugins: 'custom-class' }); diff --git a/tests/plugins/highlight-keywords/basic-functionality.js b/tests/plugins/highlight-keywords/basic-functionality.js index 4d90c31de6..1d7fffa61e 100644 --- a/tests/plugins/highlight-keywords/basic-functionality.js +++ b/tests/plugins/highlight-keywords/basic-functionality.js @@ -1,8 +1,8 @@ -const { createUtil, reusablePrismDom } = require('../../helper/prism-dom-util'); +const { createUtil, createScopedPrismDom } = require('../../helper/prism-dom-util'); describe('Highlight Keywords', function () { - const { window } = reusablePrismDom(this, { + const { window } = createScopedPrismDom(this, { languages: 'javascript', plugins: 'highlight-keywords' }); diff --git a/tests/plugins/keep-markup/test.js b/tests/plugins/keep-markup/test.js index 35ddecace3..006ce3c11a 100644 --- a/tests/plugins/keep-markup/test.js +++ b/tests/plugins/keep-markup/test.js @@ -1,9 +1,9 @@ const { assert } = require('chai'); -const { reusablePrismDom } = require('../../helper/prism-dom-util'); +const { createScopedPrismDom } = require('../../helper/prism-dom-util'); describe('Keep Markup', function () { - const { Prism, document } = reusablePrismDom(this, { + const { Prism, document } = createScopedPrismDom(this, { plugins: 'keep-markup' }); diff --git a/tests/plugins/show-invisibles/basic-functionality.js b/tests/plugins/show-invisibles/basic-functionality.js index de9f50a2bf..2a3cbcebc9 100644 --- a/tests/plugins/show-invisibles/basic-functionality.js +++ b/tests/plugins/show-invisibles/basic-functionality.js @@ -1,8 +1,8 @@ -const { createUtil, reusablePrismDom } = require('../../helper/prism-dom-util'); +const { createUtil, createScopedPrismDom } = require('../../helper/prism-dom-util'); describe('Show Invisibles', function () { - const { window } = reusablePrismDom(this, { + const { window } = createScopedPrismDom(this, { languages: 'javascript', plugins: 'show-invisibles' }); diff --git a/tests/plugins/show-language/basic-functionality.js b/tests/plugins/show-language/basic-functionality.js index 711392f781..3f97d84f69 100644 --- a/tests/plugins/show-language/basic-functionality.js +++ b/tests/plugins/show-language/basic-functionality.js @@ -1,9 +1,9 @@ const { assert } = require('chai'); -const { reusablePrismDom } = require('../../helper/prism-dom-util'); +const { createScopedPrismDom } = require('../../helper/prism-dom-util'); describe('Show language', function () { - const { Prism, document } = reusablePrismDom(this, { + const { Prism, document } = createScopedPrismDom(this, { languages: ['markup', 'javascript'], plugins: 'show-language' }); diff --git a/tests/plugins/unescaped-markup/basic-functionality.js b/tests/plugins/unescaped-markup/basic-functionality.js index 9f2a66baef..eedfaedd73 100644 --- a/tests/plugins/unescaped-markup/basic-functionality.js +++ b/tests/plugins/unescaped-markup/basic-functionality.js @@ -1,9 +1,9 @@ const { assert } = require('chai'); -const { reusablePrismDom } = require('../../helper/prism-dom-util'); +const { createScopedPrismDom } = require('../../helper/prism-dom-util'); describe('Show language', function () { - const { Prism, document } = reusablePrismDom(this, { + const { Prism, document } = createScopedPrismDom(this, { languages: 'markup', plugins: 'unescaped-markup' }); From 1668ed7a2c7557c218326e0b87ec5b7f84a2eec1 Mon Sep 17 00:00:00 2001 From: RunDevelopment Date: Mon, 4 Oct 2021 17:27:38 +0200 Subject: [PATCH 15/15] Fixed package lock --- package-lock.json | 6 ------ 1 file changed, 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7b58bb47fb..6e085eef66 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6019,12 +6019,6 @@ "extend-shallow": "^3.0.2" } }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", - "dev": true - }, "portfinder": { "version": "1.0.28", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz",