From c1f03595ec19dd015d8da2ace68a4b7b57f448b4 Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Mon, 4 Mar 2019 16:35:45 +0200 Subject: [PATCH 1/7] tests: no need to explicitely call the strict assert methods. Since we do `require('assert').strict`, this is implied. --- test/404_test.js | 2 +- test/data_test.js | 2 +- test/functional_test.js | 12 ++++++------ test/redirects_test.js | 4 ++-- test/robots_test.js | 2 +- test/test_helpers.js | 2 +- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/test/404_test.js b/test/404_test.js index 03926b38a..0d6b8dacd 100644 --- a/test/404_test.js +++ b/test/404_test.js @@ -16,7 +16,7 @@ describe('404', () => { }); it('works', (done) => { - assert.strictEqual(response.statusCode, 404); + assert.equal(response.statusCode, 404); done(); }); diff --git a/test/data_test.js b/test/data_test.js index 0a25ea9ed..541e22fc9 100644 --- a/test/data_test.js +++ b/test/data_test.js @@ -23,7 +23,7 @@ describe('data', () => { const expected = libHelpers.generateDataJson(); const actual = JSON.parse(response.body); - assert.deepStrictEqual(actual, expected); + assert.deepEqual(actual, expected); done(); }); }); diff --git a/test/functional_test.js b/test/functional_test.js index 34950132f..83ef6a2fb 100644 --- a/test/functional_test.js +++ b/test/functional_test.js @@ -100,7 +100,7 @@ function request(uri, cb) { function assertSRI(uri, actualSri, done) { const expectedSri = digest(responses[uri].body, true); - assert.strictEqual(actualSri, expectedSri); + assert.equal(actualSri, expectedSri); done(); } @@ -125,12 +125,12 @@ function assertHeaders(uri) { const actual = responses[uri].headers[header]; if (typeof expected === 'undefined') { - assert.strictEqual(actual, expected, `Expects ${header} to NOT be present in the response headers`); + assert.equal(actual, expected, `Expects ${header} to NOT be present in the response headers`); } else if (expected === '') { assert.ok(Object.prototype.hasOwnProperty.call(responses[uri].headers, header), `Expects "${header}" to be present in the response headers`); } else { - assert.strictEqual(actual, expected, `Expects ${header} to be present in the response headers`); + assert.equal(actual, expected, `Expects ${header} to be present in the response headers`); } done(); @@ -141,13 +141,13 @@ function assertHeaders(uri) { /* if (compressedExtensions.includes(ext)) { it('has content-encoding: gzip', (done) => { - assert.strictEqual(responses[uri].headers['content-encoding'], 'gzip'); + assert.equal(responses[uri].headers['content-encoding'], 'gzip'); done(); }); } else { it('does NOT have content-encoding set', (done) => { // eslint-disable-next-line no-undefined - assert.strictEqual(responses[uri].headers['content-encoding'], undefined); + assert.equal(responses[uri].headers['content-encoding'], undefined); done(); }); } @@ -158,7 +158,7 @@ function assertContentType(uri, currentType, cb) { const ext = helpers.getExtension(uri); const expectedType = CONTENT_TYPE_MAP[ext]; - assert.strictEqual(currentType, expectedType, + assert.equal(currentType, expectedType, `Invalid "content-type" for "${ext}", expects "${expectedType}" but got "${currentType}"`); cb(); } diff --git a/test/redirects_test.js b/test/redirects_test.js index 4546d0955..6e3629e2c 100644 --- a/test/redirects_test.js +++ b/test/redirects_test.js @@ -24,8 +24,8 @@ describe('redirects', () => { }); it(`"${redirectFrom}" redirects to "${redirectTo}"`, (done) => { - assert.strictEqual(response.statusCode, 301); - assert.strictEqual(response.headers.location, redirectTo); + assert.equal(response.statusCode, 301); + assert.equal(response.headers.location, redirectTo); done(); }); } diff --git a/test/robots_test.js b/test/robots_test.js index 0ae46a4f9..c673f2bd1 100644 --- a/test/robots_test.js +++ b/test/robots_test.js @@ -21,7 +21,7 @@ describe('robots.txt', () => { it('has content', (done) => { const expected = 'User-agent: *\nDisallow: \nSitemap: https://www.bootstrapcdn.com/sitemap.xml'; - assert.strictEqual(response.body, expected, 'Expects response to be valid robots.txt'); + assert.equal(response.body, expected, 'Expects response to be valid robots.txt'); done(); }); }); diff --git a/test/test_helpers.js b/test/test_helpers.js index f1cadb85e..876bba578 100644 --- a/test/test_helpers.js +++ b/test/test_helpers.js @@ -138,7 +138,7 @@ function assertValidHTML(res, cb) { function assertItWorks(statusCode, cb) { try { - assert.strictEqual(statusCode, 200); + assert.equal(statusCode, 200); return cb(); } catch (error) { return cb(error); From dd5a0be238b55638dca009759dd8123f4ca98374 Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Mon, 4 Mar 2019 16:50:19 +0200 Subject: [PATCH 2/7] appendLocals.js: Remove small function. --- routes/appendLocals.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/routes/appendLocals.js b/routes/appendLocals.js index 761762d3d..074031017 100644 --- a/routes/appendLocals.js +++ b/routes/appendLocals.js @@ -8,19 +8,13 @@ const { digest } = helpers.sri; const PUBLIC_DIR = path.join(__dirname, '../public/'); const SRI_CACHE = {}; -function getProto(req) { +function getCurrentSiteurl(req) { let proto = req.get('x-forwarded-proto'); if (typeof proto === 'undefined') { proto = req.protocol; } - return proto; -} - -function getCurrentSiteurl(req) { - const proto = getProto(req); - return `${proto}://${req.hostname}`; } From 22462271e22e2094d5abbb2f83e362f91c84def6 Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Wed, 6 Mar 2019 22:30:23 +0200 Subject: [PATCH 3/7] Update README.md instructions. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 25bf6331c..2e734ffe4 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ Our CSP config using Replace `package` by the package you want to update and `version` with its version in the following commands: ```shell -npm i package@version -D +npm i package@version -ED npm run package version ``` From cfda1684905dc0ada5344d669d6c99d7d8339197 Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Fri, 8 Mar 2019 15:21:02 +0200 Subject: [PATCH 4/7] Update dependencies. * mocha 6.x still doesn't work with our mocha.opts, so leave it to 5.x for the time being * html-validator 4.x switched to async/await so stay with the old version for now --- package-lock.json | 102 ++++++++++++++++++++++++++-------------------- package.json | 4 +- 2 files changed, 60 insertions(+), 46 deletions(-) diff --git a/package-lock.json b/package-lock.json index d7ab8ac12..0261ad165 100644 --- a/package-lock.json +++ b/package-lock.json @@ -199,9 +199,9 @@ "dev": true }, "ajv": { - "version": "6.9.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.2.tgz", - "integrity": "sha512-4UFy0/LgDo7Oa/+wOAlj44tp9K78u38E5/359eSrqEp1Z5PdVfimCcs7SluXMP755RUQu6d2b4AvF0R1C9RZjg==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", "dev": true, "requires": { "fast-deep-equal": "^2.0.1", @@ -1370,9 +1370,9 @@ "dev": true }, "eslint": { - "version": "5.14.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.14.1.tgz", - "integrity": "sha512-CyUMbmsjxedx8B0mr79mNOqetvkbij/zrXnFeK2zc3pGRn3/tibjiNAv/3UxFEyfMDjh+ZqTrJrEGBFiGfD5Og==", + "version": "5.15.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.15.1.tgz", + "integrity": "sha512-NTcm6vQ+PTgN3UBsALw5BMhgO6i5EpIjQF/Xb5tIh3sk9QhrFafujUOczGz4J24JBlzWclSB9Vmx8d+9Z6bFCg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -1381,7 +1381,7 @@ "cross-spawn": "^6.0.5", "debug": "^4.0.1", "doctrine": "^3.0.0", - "eslint-scope": "^4.0.0", + "eslint-scope": "^4.0.2", "eslint-utils": "^1.3.1", "eslint-visitor-keys": "^1.0.0", "espree": "^5.0.1", @@ -1431,9 +1431,9 @@ } }, "eslint-scope": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", - "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.2.tgz", + "integrity": "sha512-5q1+B/ogmHl8+paxtOKx38Z8LtWkVGuNt3+GQNErqwLl6ViNp/gdJGMCjZNxZ8j/VYjDNZ2Fo+eQc1TAVPIzbg==", "dev": true, "requires": { "esrecurse": "^4.1.0", @@ -1998,12 +1998,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2018,17 +2020,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -2145,7 +2150,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -2157,6 +2163,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -2171,6 +2178,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2178,12 +2186,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -2202,6 +2212,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -2282,7 +2293,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -2294,6 +2306,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -2415,6 +2428,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -2868,18 +2882,18 @@ }, "dependencies": { "ansi-regex": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", - "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "strip-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", - "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.1.0.tgz", + "integrity": "sha512-TjxrkPONqO2Z8QDCpeE2j6n0M6EwxzyDgzEeGp+FbdvaJAt//ClYi6W5my+3ROlC/hZX2KACUwDfK49Ka5eDvg==", "dev": true, "requires": { - "ansi-regex": "^4.0.0" + "ansi-regex": "^4.1.0" } } } @@ -5243,9 +5257,9 @@ } }, "readable-stream": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.1.tgz", - "integrity": "sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.2.0.tgz", + "integrity": "sha512-RV20kLjdmpZuTF1INEb9IA3L68Nmi+Ri7ppZqo78wj//Pn62fCoJyV9zalccNzDD/OuJpMG4f+pfMl8+L6QdGw==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -5442,9 +5456,9 @@ } }, "rollbar": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/rollbar/-/rollbar-2.5.2.tgz", - "integrity": "sha512-eZyZ6/vakNQm02NvdE10a1tB7EUNbN8Q4GSI5OOMzH3Tzw2okVXh2Lhhi0rvbB5mxA2Pa2Qp1xzqJHdmPL05gw==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/rollbar/-/rollbar-2.5.3.tgz", + "integrity": "sha512-42mhWYsT1s1Z97UYKkUoyJ5v/ErJOjgchwLYE1ATsHt1KXvpRHjNv1I1WcszkjA5pcAZt36ijS72t4ICQiGxuA==", "requires": { "async": "~1.2.1", "console-polyfill": "0.3.0", @@ -5911,29 +5925,29 @@ }, "dependencies": { "ansi-regex": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", - "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "string-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.0.0.tgz", - "integrity": "sha512-rr8CUxBbvOZDUvc5lNIJ+OC1nPVpz+Siw9VBtUjB9b6jZehZLFt0JMCZzShFHIsI8cbhm0EsNIfWJMFV3cu3Ew==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.0.0" + "strip-ansi": "^5.1.0" } }, "strip-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", - "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.1.0.tgz", + "integrity": "sha512-TjxrkPONqO2Z8QDCpeE2j6n0M6EwxzyDgzEeGp+FbdvaJAt//ClYi6W5my+3ROlC/hZX2KACUwDfK49Ka5eDvg==", "dev": true, "requires": { - "ansi-regex": "^4.0.0" + "ansi-regex": "^4.1.0" } } } @@ -6241,9 +6255,9 @@ "dev": true }, "upath": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", - "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.1.tgz", + "integrity": "sha512-D0yetkpIOKiZQquxjM2Syvy48Y1DbZ0SWxgsZiwd9GCWRpc75vN8ytzem14WDSg+oiX6+Qt31FpiS/ExODCrLg==", "dev": true }, "update-notifier": { diff --git a/package.json b/package.json index 4c812046c..117527c58 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "mime": "^2.4.0", "morgan": "^1.9.1", "pug": "^2.0.3", - "rollbar": "^2.5.2", + "rollbar": "^2.5.3", "semver": "^5.6.0", "serve-favicon": "^2.5.0", "sri-toolbox": "^0.2.0", @@ -59,7 +59,7 @@ "bootstrap": "4.3.1", "bootswatch": "4.3.1", "coveralls": "^3.0.3", - "eslint": "^5.14.1", + "eslint": "^5.15.1", "fs-extra": "^7.0.1", "fs-walk": "0.0.2", "html-validator": "^3.1.3", From ca501900f3c7cb3a66d7c8ca03fba8c61fb026dd Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Fri, 8 Mar 2019 01:06:39 +0200 Subject: [PATCH 5/7] Update stackpath-logo-reversed-screen.svg * lowercase hex values * make it bigger --- public/assets/img/stackpath-logo-reversed-screen.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/assets/img/stackpath-logo-reversed-screen.svg b/public/assets/img/stackpath-logo-reversed-screen.svg index 07698da0f..8b48dacdb 100644 --- a/public/assets/img/stackpath-logo-reversed-screen.svg +++ b/public/assets/img/stackpath-logo-reversed-screen.svg @@ -1 +1 @@ - \ No newline at end of file + From 9be9fcebf0ffbb1349e05bbf99d2b4f1ce88f0b0 Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Fri, 8 Mar 2019 01:24:14 +0200 Subject: [PATCH 6/7] Update load.min.js to v3.5.5. --- public/assets/js/vendor/loadjs.min.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/assets/js/vendor/loadjs.min.js b/public/assets/js/vendor/loadjs.min.js index 15ec7edda..5ee2c3441 100644 --- a/public/assets/js/vendor/loadjs.min.js +++ b/public/assets/js/vendor/loadjs.min.js @@ -1 +1 @@ -loadjs=function(){var l=function(){},c={},f={},u={};function s(e,n){if(e){var t=u[e];if(f[e]=n,t)for(;t.length;)t[0](e,n),t.splice(0,1)}}function o(e,n){e.call&&(e={success:e}),n.length?(e.error||l)(n):(e.success||l)(e)}function h(t,r,i,c){var s,o,e=document,n=i.async,f=(i.numRetries||0)+1,u=i.before||l,a=t.replace(/^(css|img)!/,"");c=c||0,/(^css!|\.css$)/.test(t)?(s=!0,(o=e.createElement("link")).rel="stylesheet",o.href=a):/(^img!|\.(png|gif|jpg|svg)$)/.test(t)?(o=e.createElement("img")).src=a:((o=e.createElement("script")).src=t,o.async=void 0===n||n),!(o.onload=o.onerror=o.onbeforeload=function(e){var n=e.type[0];if(s&&"hideFocus"in o)try{o.sheet.cssText.length||(n="e")}catch(e){n="e"}if("e"==n&&(c+=1) Date: Fri, 8 Mar 2019 01:24:54 +0200 Subject: [PATCH 7/7] Update clipboard.min.js to v2.0.4. --- public/assets/js/vendor/clipboard.min.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/assets/js/vendor/clipboard.min.js b/public/assets/js/vendor/clipboard.min.js index b00ee5153..2b5d7053c 100644 --- a/public/assets/js/vendor/clipboard.min.js +++ b/public/assets/js/vendor/clipboard.min.js @@ -1,7 +1,7 @@ /*! - * clipboard.js v2.0.0 + * clipboard.js v2.0.4 * https://zenorocha.github.io/clipboard.js * * Licensed MIT © Zeno Rocha */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return function(t){function e(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return t[o].call(r.exports,r,r.exports,e),r.l=!0,r.exports}var n={};return e.m=t,e.c=n,e.i=function(t){return t},e.d=function(t,n,o){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:o})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=3)}([function(t,e,n){var o,r,i;!function(a,c){r=[t,n(7)],o=c,void 0!==(i="function"==typeof o?o.apply(e,r):o)&&(t.exports=i)}(0,function(t,e){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var o=function(t){return t&&t.__esModule?t:{default:t}}(e),r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};this.action=t.action,this.container=t.container,this.emitter=t.emitter,this.target=t.target,this.text=t.text,this.trigger=t.trigger,this.selectedText=""}},{key:"initSelection",value:function(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function(){var t=this,e="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return t.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[e?"right":"left"]="-9999px";var n=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=n+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.container.appendChild(this.fakeElem),this.selectedText=(0,o.default)(this.fakeElem),this.copyText()}},{key:"removeFake",value:function(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function(){this.selectedText=(0,o.default)(this.target),this.copyText()}},{key:"copyText",value:function(){var t=void 0;try{t=document.execCommand(this.action)}catch(e){t=!1}this.handleResult(t)}},{key:"handleResult",value:function(t){this.emitter.emit(t?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function(){this.trigger&&this.trigger.focus(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function(){this.removeFake()}},{key:"action",set:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"copy";if(this._action=t,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function(){return this._action}},{key:"target",set:function(t){if(void 0!==t){if(!t||"object"!==(void 0===t?"undefined":r(t))||1!==t.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&t.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(t.hasAttribute("readonly")||t.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=t}},get:function(){return this._target}}]),t}();t.exports=a})},function(t,e,n){function o(t,e,n){if(!t&&!e&&!n)throw new Error("Missing required arguments");if(!c.string(e))throw new TypeError("Second argument must be a String");if(!c.fn(n))throw new TypeError("Third argument must be a Function");if(c.node(t))return r(t,e,n);if(c.nodeList(t))return i(t,e,n);if(c.string(t))return a(t,e,n);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function r(t,e,n){return t.addEventListener(e,n),{destroy:function(){t.removeEventListener(e,n)}}}function i(t,e,n){return Array.prototype.forEach.call(t,function(t){t.addEventListener(e,n)}),{destroy:function(){Array.prototype.forEach.call(t,function(t){t.removeEventListener(e,n)})}}}function a(t,e,n){return u(document.body,t,e,n)}var c=n(6),u=n(5);t.exports=o},function(t,e){function n(){}n.prototype={on:function(t,e,n){var o=this.e||(this.e={});return(o[t]||(o[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){function o(){r.off(t,o),e.apply(n,arguments)}var r=this;return o._=e,this.on(t,o,n)},emit:function(t){var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),o=0,r=n.length;for(o;o0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof t.action?t.action:this.defaultAction,this.target="function"==typeof t.target?t.target:this.defaultTarget,this.text="function"==typeof t.text?t.text:this.defaultText,this.container="object"===d(t.container)?t.container:document.body}},{key:"listenClick",value:function(t){var e=this;this.listener=(0,f.default)(t,"click",function(t){return e.onClick(t)})}},{key:"onClick",value:function(t){var e=t.delegateTarget||t.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new l.default({action:this.action(e),target:this.target(e),text:this.text(e),container:this.container,trigger:e,emitter:this})}},{key:"defaultAction",value:function(t){return u("action",t)}},{key:"defaultTarget",value:function(t){var e=u("target",t);if(e)return document.querySelector(e)}},{key:"defaultText",value:function(t){return u("text",t)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],e="string"==typeof t?[t]:t,n=!!document.queryCommandSupported;return e.forEach(function(t){n=n&&!!document.queryCommandSupported(t)}),n}}]),e}(s.default);t.exports=p})},function(t,e){function n(t,e){for(;t&&t.nodeType!==o;){if("function"==typeof t.matches&&t.matches(e))return t;t=t.parentNode}}var o=9;if("undefined"!=typeof Element&&!Element.prototype.matches){var r=Element.prototype;r.matches=r.matchesSelector||r.mozMatchesSelector||r.msMatchesSelector||r.oMatchesSelector||r.webkitMatchesSelector}t.exports=n},function(t,e,n){function o(t,e,n,o,r){var a=i.apply(this,arguments);return t.addEventListener(n,a,r),{destroy:function(){t.removeEventListener(n,a,r)}}}function r(t,e,n,r,i){return"function"==typeof t.addEventListener?o.apply(null,arguments):"function"==typeof n?o.bind(null,document).apply(null,arguments):("string"==typeof t&&(t=document.querySelectorAll(t)),Array.prototype.map.call(t,function(t){return o(t,e,n,r,i)}))}function i(t,e,n,o){return function(n){n.delegateTarget=a(n.target,e),n.delegateTarget&&o.call(t,n)}}var a=n(4);t.exports=r},function(t,e){e.node=function(t){return void 0!==t&&t instanceof HTMLElement&&1===t.nodeType},e.nodeList=function(t){var n=Object.prototype.toString.call(t);return void 0!==t&&("[object NodeList]"===n||"[object HTMLCollection]"===n)&&"length"in t&&(0===t.length||e.node(t[0]))},e.string=function(t){return"string"==typeof t||t instanceof String},e.fn=function(t){return"[object Function]"===Object.prototype.toString.call(t)}},function(t,e){function n(t){var e;if("SELECT"===t.nodeName)t.focus(),e=t.value;else if("INPUT"===t.nodeName||"TEXTAREA"===t.nodeName){var n=t.hasAttribute("readonly");n||t.setAttribute("readonly",""),t.select(),t.setSelectionRange(0,t.value.length),n||t.removeAttribute("readonly"),e=t.value}else{t.hasAttribute("contenteditable")&&t.focus();var o=window.getSelection(),r=document.createRange();r.selectNodeContents(t),o.removeAllRanges(),o.addRange(r),e=o.toString()}return e}t.exports=n}])}); \ No newline at end of file +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return function(n){var o={};function r(t){if(o[t])return o[t].exports;var e=o[t]={i:t,l:!1,exports:{}};return n[t].call(e.exports,e,e.exports,r),e.l=!0,e.exports}return r.m=n,r.c=o,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=0)}([function(t,e,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i=function(){function o(t,e){for(var n=0;n