From 4e61592a7cda44edd5d6fe4629796b3a056465bd Mon Sep 17 00:00:00 2001 From: Robert Prehn Date: Wed, 25 Aug 2021 23:04:51 +0000 Subject: [PATCH 1/8] chore(deps-dev): bump semantic-release from 17.4.4 to 17.4.7 Bumps [semantic-release](https://github.com/semantic-release/semantic-release) from 17.4.4 to 17.4.7. - [Release notes](https://github.com/semantic-release/semantic-release/releases) - [Commits](https://github.com/semantic-release/semantic-release/compare/v17.4.4...v17.4.7) --- package-lock.json | 20 ++++++++++---------- package.json | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index c89e3946..7327abb2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@mythic-insight/legendary", - "version": "3.1.2", + "version": "4.0.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@mythic-insight/legendary", - "version": "3.1.2", + "version": "4.0.2", "license": "MIT", "devDependencies": { "@google/semantic-release-replace-plugin": "^1.0.2", @@ -17,7 +17,7 @@ "cypress": "^8.2.0", "dot": "^1.1.3", "http-proxy": "^1.18.1", - "semantic-release": "^17.4.4", + "semantic-release": "^17.4.7", "start-server-and-test": "^1.13.1" } }, @@ -7606,9 +7606,9 @@ "dev": true }, "node_modules/semantic-release": { - "version": "17.4.4", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-17.4.4.tgz", - "integrity": "sha512-fQIA0lw2Sy/9+TcoM/BxyzKCSwdUd8EPRwGoOuBLgxKigPCY6kaKs8TOsgUVy6QrlTYwni2yzbMb5Q2107P9eA==", + "version": "17.4.7", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-17.4.7.tgz", + "integrity": "sha512-3Ghu8mKCJgCG3QzE5xphkYWM19lGE3XjFdOXQIKBM2PBpBvgFQ/lXv31oX0+fuN/UjNFO/dqhNs8ATLBhg6zBg==", "dev": true, "dependencies": { "@semantic-release/commit-analyzer": "^8.0.0", @@ -7644,7 +7644,7 @@ "semantic-release": "bin/semantic-release.js" }, "engines": { - "node": ">=10.18" + "node": ">=10.19" } }, "node_modules/semantic-release/node_modules/cliui": { @@ -14261,9 +14261,9 @@ "dev": true }, "semantic-release": { - "version": "17.4.4", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-17.4.4.tgz", - "integrity": "sha512-fQIA0lw2Sy/9+TcoM/BxyzKCSwdUd8EPRwGoOuBLgxKigPCY6kaKs8TOsgUVy6QrlTYwni2yzbMb5Q2107P9eA==", + "version": "17.4.7", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-17.4.7.tgz", + "integrity": "sha512-3Ghu8mKCJgCG3QzE5xphkYWM19lGE3XjFdOXQIKBM2PBpBvgFQ/lXv31oX0+fuN/UjNFO/dqhNs8ATLBhg6zBg==", "dev": true, "requires": { "@semantic-release/commit-analyzer": "^8.0.0", diff --git a/package.json b/package.json index e05782a0..a97605c7 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "cypress": "^8.2.0", "dot": "^1.1.3", "http-proxy": "^1.18.1", - "semantic-release": "^17.4.4", + "semantic-release": "^17.4.7", "start-server-and-test": "^1.13.1" }, "release": { From 33a86dc7c5cb1c54f89d84f5a200a879e9a89f7a Mon Sep 17 00:00:00 2001 From: Robert Prehn Date: Thu, 26 Aug 2021 23:04:28 +0000 Subject: [PATCH 2/8] chore(deps): bump node from 16.6.2 to 16.8.0 Bumps node from 16.6.2 to 16.8.0. --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index bff879f2..93887adc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -29,7 +29,7 @@ RUN mix deps.get # Leave off here so that we can built assets and compile the elixir app in parallel -FROM node:16.6.2 AS asset-builder +FROM node:16.8.0 AS asset-builder # Build assets in a node container ADD ./apps/app/assets/ /root/app/apps/app/assets/ From 9e1dcc5940be1beb249c211028b8fc5662cabb76 Mon Sep 17 00:00:00 2001 From: Robert Prehn Date: Fri, 27 Aug 2021 23:05:53 +0000 Subject: [PATCH 3/8] chore(deps-dev): bump cypress from 8.2.0 to 8.3.1 Bumps [cypress](https://github.com/cypress-io/cypress) from 8.2.0 to 8.3.1. - [Release notes](https://github.com/cypress-io/cypress/releases) - [Changelog](https://github.com/cypress-io/cypress/blob/develop/.releaserc.base.js) - [Commits](https://github.com/cypress-io/cypress/compare/v8.2.0...v8.3.1) --- package-lock.json | 70 ++++++++++++++++++----------------------------- package.json | 2 +- 2 files changed, 27 insertions(+), 45 deletions(-) diff --git a/package-lock.json b/package-lock.json index c89e3946..ab397f19 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@mythic-insight/legendary", - "version": "3.1.2", + "version": "4.0.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@mythic-insight/legendary", - "version": "3.1.2", + "version": "4.0.2", "license": "MIT", "devDependencies": { "@google/semantic-release-replace-plugin": "^1.0.2", @@ -14,7 +14,7 @@ "@semantic-release/exec": "^5.0.0", "@semantic-release/git": "^9.0.0", "@semantic-release/npm": "^7.1.3", - "cypress": "^8.2.0", + "cypress": "^8.3.1", "dot": "^1.1.3", "http-proxy": "^1.18.1", "semantic-release": "^17.4.4", @@ -116,9 +116,9 @@ } }, "node_modules/@cypress/request": { - "version": "2.88.5", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.5.tgz", - "integrity": "sha512-TzEC1XMi1hJkywWpRfD2clreTa/Z+lOrXDCxxBTBPEcY5azdPi56A6Xw+O4tWJnaJH3iIE7G5aDXZC6JgRZLcA==", + "version": "2.88.6", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.6.tgz", + "integrity": "sha512-z0UxBE/+qaESAHY9p9sM2h8Y4XqtsbDCt0/DPOrqA/RZgKi4PkxdpXyK4wCCnSk1xHqWHZZAE+gV6aDAR6+caQ==", "dev": true, "dependencies": { "aws-sign2": "~0.7.0", @@ -134,13 +134,12 @@ "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.5.0", "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "uuid": "^8.3.2" }, "engines": { "node": ">= 6" @@ -4773,13 +4772,13 @@ } }, "node_modules/cypress": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-8.2.0.tgz", - "integrity": "sha512-jg7S5VxxslwsgEyAkCE9ZCkFADxOUY1bSWScp1cWnga88K0TZgFQ0zdxyG9Mw/4spLGuvkriIZ62am+TR6C04w==", + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-8.3.1.tgz", + "integrity": "sha512-1v6pfx+/5cXhaT5T6QKOvnkawmEHWHLiVzm3MYMoQN1fkX2Ma1C32STd3jBStE9qT5qPSTILjGzypVRxCBi40g==", "dev": true, "hasInstallScript": true, "dependencies": { - "@cypress/request": "^2.88.5", + "@cypress/request": "^2.88.6", "@cypress/xvfb": "^1.2.4", "@types/node": "^14.14.31", "@types/sinonjs__fake-timers": "^6.0.2", @@ -6857,15 +6856,6 @@ "node": ">=8" } }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -8422,13 +8412,12 @@ "dev": true }, "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, "bin": { - "uuid": "bin/uuid" + "uuid": "dist/bin/uuid" } }, "node_modules/validate-npm-package-license": { @@ -8743,9 +8732,9 @@ } }, "@cypress/request": { - "version": "2.88.5", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.5.tgz", - "integrity": "sha512-TzEC1XMi1hJkywWpRfD2clreTa/Z+lOrXDCxxBTBPEcY5azdPi56A6Xw+O4tWJnaJH3iIE7G5aDXZC6JgRZLcA==", + "version": "2.88.6", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.6.tgz", + "integrity": "sha512-z0UxBE/+qaESAHY9p9sM2h8Y4XqtsbDCt0/DPOrqA/RZgKi4PkxdpXyK4wCCnSk1xHqWHZZAE+gV6aDAR6+caQ==", "dev": true, "requires": { "aws-sign2": "~0.7.0", @@ -8761,13 +8750,12 @@ "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.5.0", "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "uuid": "^8.3.2" } }, "@cypress/xvfb": { @@ -12102,12 +12090,12 @@ "dev": true }, "cypress": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-8.2.0.tgz", - "integrity": "sha512-jg7S5VxxslwsgEyAkCE9ZCkFADxOUY1bSWScp1cWnga88K0TZgFQ0zdxyG9Mw/4spLGuvkriIZ62am+TR6C04w==", + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-8.3.1.tgz", + "integrity": "sha512-1v6pfx+/5cXhaT5T6QKOvnkawmEHWHLiVzm3MYMoQN1fkX2Ma1C32STd3jBStE9qT5qPSTILjGzypVRxCBi40g==", "dev": true, "requires": { - "@cypress/request": "^2.88.5", + "@cypress/request": "^2.88.6", "@cypress/xvfb": "^1.2.4", "@types/node": "^14.14.31", "@types/sinonjs__fake-timers": "^6.0.2", @@ -13703,12 +13691,6 @@ "path-key": "^3.0.0" } }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -14911,9 +14893,9 @@ "dev": true }, "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true }, "validate-npm-package-license": { diff --git a/package.json b/package.json index e05782a0..df0a65a9 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "@semantic-release/exec": "^5.0.0", "@semantic-release/git": "^9.0.0", "@semantic-release/npm": "^7.1.3", - "cypress": "^8.2.0", + "cypress": "^8.3.1", "dot": "^1.1.3", "http-proxy": "^1.18.1", "semantic-release": "^17.4.4", From 9363096e434bd56e07127d7005a36f3194c7fda1 Mon Sep 17 00:00:00 2001 From: Robert Prehn Date: Mon, 30 Aug 2021 23:04:41 +0000 Subject: [PATCH 4/8] chore(deps-dev): bump @google/semantic-release-replace-plugin Bumps [@google/semantic-release-replace-plugin](https://github.com/google/semantic-release-replace-plugin) from 1.0.2 to 1.1.0. - [Release notes](https://github.com/google/semantic-release-replace-plugin/releases) - [Changelog](https://github.com/google/semantic-release-replace-plugin/blob/master/.releaserc) - [Commits](https://github.com/google/semantic-release-replace-plugin/compare/v1.0.2...v1.1.0) --- package-lock.json | 603 +++++++++++++--------------------------------- package.json | 2 +- 2 files changed, 167 insertions(+), 438 deletions(-) diff --git a/package-lock.json b/package-lock.json index c89e3946..21c73e58 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,15 @@ { "name": "@mythic-insight/legendary", - "version": "3.1.2", + "version": "4.0.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@mythic-insight/legendary", - "version": "3.1.2", + "version": "4.0.2", "license": "MIT", "devDependencies": { - "@google/semantic-release-replace-plugin": "^1.0.2", + "@google/semantic-release-replace-plugin": "^1.1.0", "@semantic-release/commit-analyzer": "^8.0.1", "@semantic-release/exec": "^5.0.0", "@semantic-release/git": "^9.0.0", @@ -166,14 +166,14 @@ } }, "node_modules/@google/semantic-release-replace-plugin": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@google/semantic-release-replace-plugin/-/semantic-release-replace-plugin-1.0.2.tgz", - "integrity": "sha512-8P7JhbLFG3so1P2WGpOUbE6EPzr4VOtF/ePmkvLmtABj1dL75qSlmCF013P9hh9zW0Wlmm28AecpVFxghEI2ZQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@google/semantic-release-replace-plugin/-/semantic-release-replace-plugin-1.1.0.tgz", + "integrity": "sha512-LaBZmayyxa9eSxJP0dH1FhF3Ye7aXmmkvIGPqR+kA1BxIpEfUqaKk+50puVJ2ERfEPitPmuG2A1utDqMgOgkeg==", "dev": true, "dependencies": { - "jest-diff": "^25.5.0", + "jest-diff": "^26.5.2", "lodash": "^4.17.20", - "replace-in-file": "^5.0.2" + "replace-in-file": "^6.1.0" } }, "node_modules/@hapi/hoek": { @@ -192,18 +192,19 @@ } }, "node_modules/@jest/types": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", - "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" + "chalk": "^4.0.0" }, "engines": { - "node": ">= 8.3" + "node": ">= 10.14.2" } }, "node_modules/@nodelib/fs.scandir": { @@ -3928,12 +3929,11 @@ } }, "node_modules/@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "*", "@types/istanbul-lib-report": "*" } }, @@ -3980,18 +3980,18 @@ "dev": true }, "node_modules/@types/yargs": { - "version": "15.0.13", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", - "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", + "version": "15.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", + "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", + "version": "20.2.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", + "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", "dev": true }, "node_modules/@types/yauzl": { @@ -4367,16 +4367,19 @@ "dev": true }, "node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/check-more-types": { @@ -4470,35 +4473,31 @@ } }, "node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "wrap-ansi": "^7.0.0" } }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "dependencies": { - "ansi-regex": "^5.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/color-convert": { @@ -4828,34 +4827,6 @@ "node": ">=12.0.0" } }, - "node_modules/cypress/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/cypress/node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/cypress/node_modules/execa": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", @@ -5066,12 +5037,12 @@ "dev": true }, "node_modules/diff-sequences": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", - "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", "dev": true, "engines": { - "node": ">= 8.3" + "node": ">= 10.14.2" } }, "node_modules/dir-glob": { @@ -6146,27 +6117,27 @@ } }, "node_modules/jest-diff": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", - "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", "dev": true, "dependencies": { - "chalk": "^3.0.0", - "diff-sequences": "^25.2.6", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.5.0" + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" }, "engines": { - "node": ">= 8.3" + "node": ">= 10.14.2" } }, "node_modules/jest-get-type": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", "dev": true, "engines": { - "node": ">= 8.3" + "node": ">= 10.14.2" } }, "node_modules/joi": { @@ -6457,22 +6428,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/log-update": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", @@ -6564,22 +6519,6 @@ "marked": "^1.0.0 || ^2.0.0" } }, - "node_modules/marked-terminal/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/meow": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-8.0.0.tgz", @@ -7212,18 +7151,18 @@ } }, "node_modules/pretty-format": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", - "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", "dev": true, "dependencies": { - "@jest/types": "^25.5.0", + "@jest/types": "^26.6.2", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" + "react-is": "^17.0.1" }, "engines": { - "node": ">= 8.3" + "node": ">= 10" } }, "node_modules/process-nextick-args": { @@ -7332,9 +7271,9 @@ } }, "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, "node_modules/read-pkg": { @@ -7449,17 +7388,20 @@ } }, "node_modules/replace-in-file": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-5.0.2.tgz", - "integrity": "sha512-1Vc7Sbr/rTuHgU1PZuBb7tGsFx3D4NKdhV4BpEF2MuN/6+SoXcFtx+dZ1Zz+5Dq4k5x9js87Y+gXQYPTQ9ppkA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-6.2.0.tgz", + "integrity": "sha512-Im2AF9G/qgkYneOc9QwWwUS/efyyonTUBvzXS2VXuxPawE5yQIjT/e6x4CTijO0Quq48lfAujuo+S89RR2TP2Q==", "dev": true, "dependencies": { - "chalk": "^3.0.0", + "chalk": "^4.1.0", "glob": "^7.1.6", - "yargs": "^15.0.2" + "yargs": "^16.2.0" }, "bin": { "replace-in-file": "bin/cli.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/request-progress": { @@ -7480,12 +7422,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -7647,17 +7583,6 @@ "node": ">=10.18" } }, - "node_modules/semantic-release/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "node_modules/semantic-release/node_modules/hosted-git-info": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", @@ -7685,50 +7610,6 @@ "node": ">=10" } }, - "node_modules/semantic-release/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/semantic-release/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/semantic-release/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -7771,12 +7652,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -8504,12 +8379,6 @@ "node": ">= 8" } }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -8582,10 +8451,13 @@ } }, "node_modules/y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", - "dev": true + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } }, "node_modules/yallist": { "version": "4.0.0", @@ -8603,25 +8475,21 @@ } }, "node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/yargs-parser": { @@ -8633,19 +8501,6 @@ "node": ">=10" } }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", @@ -8792,14 +8647,14 @@ } }, "@google/semantic-release-replace-plugin": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@google/semantic-release-replace-plugin/-/semantic-release-replace-plugin-1.0.2.tgz", - "integrity": "sha512-8P7JhbLFG3so1P2WGpOUbE6EPzr4VOtF/ePmkvLmtABj1dL75qSlmCF013P9hh9zW0Wlmm28AecpVFxghEI2ZQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@google/semantic-release-replace-plugin/-/semantic-release-replace-plugin-1.1.0.tgz", + "integrity": "sha512-LaBZmayyxa9eSxJP0dH1FhF3Ye7aXmmkvIGPqR+kA1BxIpEfUqaKk+50puVJ2ERfEPitPmuG2A1utDqMgOgkeg==", "dev": true, "requires": { - "jest-diff": "^25.5.0", + "jest-diff": "^26.5.2", "lodash": "^4.17.20", - "replace-in-file": "^5.0.2" + "replace-in-file": "^6.1.0" } }, "@hapi/hoek": { @@ -8818,15 +8673,16 @@ } }, "@jest/types": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", - "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" + "chalk": "^4.0.0" } }, "@nodelib/fs.scandir": { @@ -11427,12 +11283,11 @@ } }, "@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "*", "@types/istanbul-lib-report": "*" } }, @@ -11479,18 +11334,18 @@ "dev": true }, "@types/yargs": { - "version": "15.0.13", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", - "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", + "version": "15.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", + "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", "dev": true, "requires": { "@types/yargs-parser": "*" } }, "@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", + "version": "20.2.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", + "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", "dev": true }, "@types/yauzl": { @@ -11778,9 +11633,9 @@ "dev": true }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -11854,29 +11709,25 @@ } }, "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "wrap-ansi": "^7.0.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } } } @@ -12150,27 +12001,6 @@ "yauzl": "^2.10.0" }, "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, "execa": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", @@ -12322,9 +12152,9 @@ "dev": true }, "diff-sequences": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", - "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", "dev": true }, "dir-glob": { @@ -13148,21 +12978,21 @@ "dev": true }, "jest-diff": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", - "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", "dev": true, "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.2.6", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.5.0" + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" } }, "jest-get-type": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", "dev": true }, "joi": { @@ -13402,18 +13232,6 @@ "requires": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "log-update": { @@ -13480,18 +13298,6 @@ "cli-table": "^0.3.1", "node-emoji": "^1.10.0", "supports-hyperlinks": "^2.1.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "meow": { @@ -13958,15 +13764,15 @@ "dev": true }, "pretty-format": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", - "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", "dev": true, "requires": { - "@jest/types": "^25.5.0", + "@jest/types": "^26.6.2", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" + "react-is": "^17.0.1" } }, "process-nextick-args": { @@ -14049,9 +13855,9 @@ } }, "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, "read-pkg": { @@ -14149,14 +13955,14 @@ } }, "replace-in-file": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-5.0.2.tgz", - "integrity": "sha512-1Vc7Sbr/rTuHgU1PZuBb7tGsFx3D4NKdhV4BpEF2MuN/6+SoXcFtx+dZ1Zz+5Dq4k5x9js87Y+gXQYPTQ9ppkA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-6.2.0.tgz", + "integrity": "sha512-Im2AF9G/qgkYneOc9QwWwUS/efyyonTUBvzXS2VXuxPawE5yQIjT/e6x4CTijO0Quq48lfAujuo+S89RR2TP2Q==", "dev": true, "requires": { - "chalk": "^3.0.0", + "chalk": "^4.1.0", "glob": "^7.1.6", - "yargs": "^15.0.2" + "yargs": "^16.2.0" } }, "request-progress": { @@ -14174,12 +13980,6 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -14296,17 +14096,6 @@ "yargs": "^16.2.0" }, "dependencies": { - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "hosted-git-info": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", @@ -14324,38 +14113,6 @@ "requires": { "lru-cache": "^6.0.0" } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } } } }, @@ -14388,12 +14145,6 @@ "integrity": "sha512-bXWyL6EAKOJa81XG1OZ/Yyuq+oT0b2YLlxx7c+mrdYPaPbnj6WgVULXhinMIeZGufuUBu/eVRqXEhiv4imfwxA==", "dev": true }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -14976,12 +14727,6 @@ "isexe": "^2.0.0" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -15038,9 +14783,9 @@ "dev": true }, "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, "yallist": { @@ -15056,34 +14801,18 @@ "dev": true }, "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "dependencies": { - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } }, "yargs-parser": { diff --git a/package.json b/package.json index e05782a0..308e9016 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ }, "homepage": "https://gitlab.com/mythic-insight/legendary#readme", "devDependencies": { - "@google/semantic-release-replace-plugin": "^1.0.2", + "@google/semantic-release-replace-plugin": "^1.1.0", "@semantic-release/commit-analyzer": "^8.0.1", "@semantic-release/exec": "^5.0.0", "@semantic-release/git": "^9.0.0", From e57d28e7eb42a7ed5274be89ae73eb9f46d8bae0 Mon Sep 17 00:00:00 2001 From: Alexandru Scvortov Date: Wed, 1 Sep 2021 18:45:56 +0100 Subject: [PATCH 5/8] fix: delete duplicate env variables from kube.yaml --- infrastructure/kube.yaml | 15 --------------- infrastructure_templates/kube.yaml.dot | 15 --------------- 2 files changed, 30 deletions(-) diff --git a/infrastructure/kube.yaml b/infrastructure/kube.yaml index fa312e3f..bad371c2 100644 --- a/infrastructure/kube.yaml +++ b/infrastructure/kube.yaml @@ -78,21 +78,6 @@ spec: secretKeyRef: name: legendary key: smtp-password - - name: SMTP_HOST - valueFrom: - secretKeyRef: - name: legendary - key: smtp-host - - name: SMTP_USERNAME - valueFrom: - secretKeyRef: - name: legendary - key: smtp-username - - name: SMTP_PASSWORD - valueFrom: - secretKeyRef: - name: legendary - key: smtp-password --- apiVersion: v1 kind: Service diff --git a/infrastructure_templates/kube.yaml.dot b/infrastructure_templates/kube.yaml.dot index 83f0442f..98cb4e7a 100644 --- a/infrastructure_templates/kube.yaml.dot +++ b/infrastructure_templates/kube.yaml.dot @@ -78,21 +78,6 @@ spec: secretKeyRef: name: legendary key: smtp-password - - name: SMTP_HOST - valueFrom: - secretKeyRef: - name: legendary - key: smtp-host - - name: SMTP_USERNAME - valueFrom: - secretKeyRef: - name: legendary - key: smtp-username - - name: SMTP_PASSWORD - valueFrom: - secretKeyRef: - name: legendary - key: smtp-password --- apiVersion: v1 kind: Service From 94154325cce652a90b0822867f2febd8e9f79f24 Mon Sep 17 00:00:00 2001 From: Robert Prehn Date: Mon, 6 Sep 2021 19:43:16 +0000 Subject: [PATCH 6/8] chore: Increase test coverage throughout the framework --- apps/app/lib/app_web/live_helpers.ex | 9 +- apps/app/lib/app_web/router.ex | 2 +- apps/app/lib/app_web/views/error_helpers.ex | 6 +- apps/app/test/app_web/error_helpers_test.exs | 29 ++++++ apps/app/test/app_web/live_helpers_test.exs | 46 +++++++++ apps/content/lib/content/post.ex | 10 +- .../lib/content/{sitemap.ex => sitemaps.ex} | 1 + .../controllers/posts_controller.ex | 4 +- .../content_web/templates/feeds/index.rss.eex | 2 + .../lib/content_web/views/error_helpers.ex | 6 +- .../lib/content_web/views/feeds_view.ex | 63 +------------ apps/content/test/content/posts_test.exs | 28 +++++- .../test/content/sitemap_storage_test.exs | 38 ++++++++ apps/content/test/content/sitemaps_test.exs | 78 +++++++++++++++ .../controllers/posts_controller_test.exs | 17 +++- .../content_web/views/error_helpers_test.exs | 29 ++++++ .../content_web/views/feeds_view_test.exs | 17 ++++ .../content_web/views/posts_view_test.exs | 20 ++++ .../core/lib/auth_web/controller_callbacks.ex | 3 +- .../lib/core_web/plugs/test_end_to_end.ex | 19 +++- apps/core/lib/core_web/router.ex | 4 + apps/core/lib/core_web/views/helpers.ex | 2 +- apps/core/lib/mix/tasks/create_admin.ex | 10 +- .../auth_web/controller_callback_test.exs | 33 +++++++ apps/core/test/auth_web/helpers_test.exs | 9 +- .../auth_web/plugs/require_admin_test.exs | 2 +- .../core_web/plugs/test_end_to_end_test.exs | 38 ++++++++ .../core/test/core_web/views/helpers_test.exs | 94 ++++++++++++++++++- .../core/test/mix/tasks/create_admin_test.exs | 17 ++++ .../test/seed_sets/test_end_to_end_test.exs | 0 .../test/shared_db_connection_pool_test.exs | 14 +++ apps/core/test/support/conn_case.ex | 16 ++++ .../test/support/empty_cluster_strategy.ex | 24 ----- config/config.exs | 2 +- config/test.exs | 7 +- 35 files changed, 573 insertions(+), 126 deletions(-) create mode 100644 apps/app/test/app_web/error_helpers_test.exs create mode 100644 apps/app/test/app_web/live_helpers_test.exs rename apps/content/lib/content/{sitemap.ex => sitemaps.ex} (98%) create mode 100644 apps/content/test/content/sitemap_storage_test.exs create mode 100644 apps/content/test/content/sitemaps_test.exs create mode 100644 apps/content/test/content_web/views/error_helpers_test.exs create mode 100644 apps/content/test/content_web/views/feeds_view_test.exs create mode 100644 apps/core/test/auth_web/controller_callback_test.exs create mode 100644 apps/core/test/core_web/plugs/test_end_to_end_test.exs create mode 100644 apps/core/test/mix/tasks/create_admin_test.exs create mode 100644 apps/core/test/seed_sets/test_end_to_end_test.exs create mode 100644 apps/core/test/shared_db_connection_pool_test.exs delete mode 100644 apps/core/test/support/empty_cluster_strategy.ex diff --git a/apps/app/lib/app_web/live_helpers.ex b/apps/app/lib/app_web/live_helpers.ex index f225607d..1ea6b60c 100644 --- a/apps/app/lib/app_web/live_helpers.ex +++ b/apps/app/lib/app_web/live_helpers.ex @@ -9,10 +9,11 @@ defmodule AppWeb.LiveHelpers do end def require_auth(socket) do - if socket.assigns.current_user do - socket - else - redirect(socket, to: "/") + case socket.assigns do + %{current_user: user} when not is_nil(user) -> + socket + _ -> + redirect(socket, to: "/") end end diff --git a/apps/app/lib/app_web/router.ex b/apps/app/lib/app_web/router.ex index f00ab155..fbb3a9cf 100644 --- a/apps/app/lib/app_web/router.ex +++ b/apps/app/lib/app_web/router.ex @@ -51,7 +51,7 @@ defmodule AppWeb.Router do forward "/sent_emails", Bamboo.SentEmailViewerPlug end - if Mix.env() == :e2e do + if Mix.env() in [:e2e, :test] do forward("/end-to-end", Legendary.CoreWeb.Plug.TestEndToEnd, otp_app: :app) end diff --git a/apps/app/lib/app_web/views/error_helpers.ex b/apps/app/lib/app_web/views/error_helpers.ex index 2e891a28..e09b4a05 100644 --- a/apps/app/lib/app_web/views/error_helpers.ex +++ b/apps/app/lib/app_web/views/error_helpers.ex @@ -8,10 +8,12 @@ defmodule AppWeb.ErrorHelpers do @doc """ Generates tag for inlined form input errors. """ - def error_tag(form, field) do + def error_tag(form, field, opts \\ []) do + {extra_classes, _rest_opts} = Keyword.pop(opts, :class, "") + Enum.map(Keyword.get_values(form.errors, field), fn error -> content_tag(:span, translate_error(error), - class: "invalid-feedback", + class: "invalid-feedback #{extra_classes}", phx_feedback_for: input_id(form, field) ) end) diff --git a/apps/app/test/app_web/error_helpers_test.exs b/apps/app/test/app_web/error_helpers_test.exs new file mode 100644 index 00000000..5b98bdbf --- /dev/null +++ b/apps/app/test/app_web/error_helpers_test.exs @@ -0,0 +1,29 @@ +defmodule AppWeb.ErrorHelpersTest do + use AppWeb.ConnCase + + import Phoenix.HTML, only: [safe_to_string: 1] + import Phoenix.HTML.Form, only: [form_for: 3] + + import AppWeb.ErrorHelpers + + def form do + :example + |> form_for( + "/example", + as: :test_params, + errors: [error_field: {"is an error", []}] + ) + end + + describe "error_tag/2" do + test "generates a span with an invalid-feedback class" do + [safe] = error_tag(form(), :error_field) + assert safe_to_string(safe) =~ "invalid-feedback" + end + + test "error_tag/3" do + [safe] = error_tag(form(), :error_field, class: "test-class") + assert safe_to_string(safe) =~ "test-class" + end + end +end diff --git a/apps/app/test/app_web/live_helpers_test.exs b/apps/app/test/app_web/live_helpers_test.exs new file mode 100644 index 00000000..e4bdad6b --- /dev/null +++ b/apps/app/test/app_web/live_helpers_test.exs @@ -0,0 +1,46 @@ +defmodule AppWeb.LiveHelpersText do + use AppWeb.ConnCase + + import Mock + + import AppWeb.LiveHelpers + + describe "assign_defaults/2" do + test "sets current_user" do + {store, _store_config} = Pow.Plug.Base.store(Application.get_env(:core, :pow)) + socket = %Phoenix.LiveView.Socket{endpoint: AppWeb.Endpoint} + + with_mock Pow.Plug, [verify_token: fn (_, _, _, _) -> {:ok, "h3110"} end] do + with_mock store, [get: fn (_config, _token) -> {%{id: 1234}, nil} end] do + new_socket = assign_defaults(socket, %{"core_auth" => "h3ll0"}) + assert %{assigns: %{current_user: %{id: 1234}}} = new_socket + end + end + end + end + + describe "require_auth/1" do + test "with user" do + user = %{id: 4567} + socket = + %Phoenix.LiveView.Socket{assigns: %{current_user: user}} + |> require_auth() + + assert !socket.redirected + end + + test "without user" do + socket = %Phoenix.LiveView.Socket{} |> require_auth() + + assert socket.redirected + end + + test "without nil user" do + socket = + %Phoenix.LiveView.Socket{assigns: %{current_user: nil}} + |> require_auth() + + assert socket.redirected + end + end +end diff --git a/apps/content/lib/content/post.ex b/apps/content/lib/content/post.ex index 97901ee0..b06803dc 100644 --- a/apps/content/lib/content/post.ex +++ b/apps/content/lib/content/post.ex @@ -116,15 +116,17 @@ defmodule Legendary.Content.Post do def maybe_put_guid(changeset) do import Legendary.Content.Router.Helpers, only: [url: 1, posts_url: 3] - slug = changeset |> get_field(:name) + guid = changeset |> get_field(:guid) - case slug do - nil -> changeset - _ -> + case guid do + nil -> base = url(Legendary.CoreWeb.Endpoint) + slug = changeset |> get_field(:name) changeset |> put_default(:guid, posts_url(URI.merge(base, "/pages"), :show, slug)) + _ -> + changeset end end end diff --git a/apps/content/lib/content/sitemap.ex b/apps/content/lib/content/sitemaps.ex similarity index 98% rename from apps/content/lib/content/sitemap.ex rename to apps/content/lib/content/sitemaps.ex index e2eeda00..6ab6bb47 100644 --- a/apps/content/lib/content/sitemap.ex +++ b/apps/content/lib/content/sitemaps.ex @@ -21,6 +21,7 @@ defmodule Legendary.Content.Sitemaps do generate() end + @spec generate :: :ok def generate do create do add "", priority: 0.5, changefreq: "hourly", expires: nil diff --git a/apps/content/lib/content_web/controllers/posts_controller.ex b/apps/content/lib/content_web/controllers/posts_controller.ex index 65857566..8add7dfe 100644 --- a/apps/content/lib/content_web/controllers/posts_controller.ex +++ b/apps/content/lib/content_web/controllers/posts_controller.ex @@ -67,9 +67,7 @@ defmodule Legendary.Content.PostsController do conn |> show_one(post, page_string) end end - def show(conn, %{"id" => id, "page" => page_string}) when is_list(id) do - show(conn, %{"id" => Enum.join(id, "/"), "page" => page_string}) - end + def show(conn, %{"id" => id} = params) when is_list(id), do: show(conn, Map.merge(params, %{"id" => Enum.join(id, "/")})) def show(conn, %{"id" => id}), do: show(conn, %{"id" => id, "page" => "1"}) defp try_static_post(conn, id) do diff --git a/apps/content/lib/content_web/templates/feeds/index.rss.eex b/apps/content/lib/content_web/templates/feeds/index.rss.eex index d5cf78a6..89f9fac6 100644 --- a/apps/content/lib/content_web/templates/feeds/index.rss.eex +++ b/apps/content/lib/content_web/templates/feeds/index.rss.eex @@ -7,6 +7,7 @@ <%= for post <- @posts do %> + <%= if unauthenticated_post?(post) do %> <%= post.title |> HtmlSanitizeEx.strip_tags() %> @@ -19,6 +20,7 @@ %> <%= post.guid %> + <% end %> <% end %> diff --git a/apps/content/lib/content_web/views/error_helpers.ex b/apps/content/lib/content_web/views/error_helpers.ex index 85e5ed5a..5eeeef0e 100644 --- a/apps/content/lib/content_web/views/error_helpers.ex +++ b/apps/content/lib/content_web/views/error_helpers.ex @@ -8,10 +8,12 @@ defmodule Legendary.Content.ErrorHelpers do @doc """ Generates tag for inlined form input errors. """ - def error_tag(form, field) do + def error_tag(form, field, opts \\ []) do + {extra_classes, _rest_opts} = Keyword.pop(opts, :class, "") + Enum.map(Keyword.get_values(form.errors, field), fn error -> content_tag(:span, translate_error(error), - class: "invalid-feedback", + class: "invalid-feedback #{extra_classes}", phx_feedback_for: input_id(form, field) ) end) diff --git a/apps/content/lib/content_web/views/feeds_view.ex b/apps/content/lib/content_web/views/feeds_view.ex index b768b144..4ff3c23a 100644 --- a/apps/content/lib/content_web/views/feeds_view.ex +++ b/apps/content/lib/content_web/views/feeds_view.ex @@ -1,71 +1,10 @@ defmodule Legendary.Content.FeedsView do use Legendary.Content, :view use Phoenix.HTML - alias Phoenix.HTML - alias Phoenix.HTML.Tag import Legendary.Content.LayoutView, only: [title: 3, excerpt: 3] - def gravatar_url_for_email(email) do - email - |> Kernel.||("noreply@example.com") - |> String.trim() - |> String.downcase() - |> (&(:crypto.hash(:md5, &1))).() - |> Base.encode16() - |> String.downcase() - |> (&("https://www.gravatar.com/avatar/#{&1}")).() - end - - def auto_paragraph_tags(string) do - string - |> Kernel.||("") - |> String.split(["\n\n", "\r\n\r\n"], trim: true) - |> Enum.map(fn text -> - [Tag.content_tag(:p, text |> HTML.raw(), []), ?\n] - end) - |> HTML.html_escape() - end - - def post_class(post) do - sticky = - if post.sticky do - "sticky" - end - "post post-#{post.id} #{sticky}" - end - - def post_topmatter(conn, post) do - author = - post.author || - %Legendary.Auth.User{ - email: "example@example.org", - display_name: "Anonymous", - homepage_url: "#" - } - assigns = %{post: post, author: author, conn: conn} - ~E""" - <% _ = assigns # suppress unused assigns warning %> -
- -

- <%= link to: author.homepage_url || "#", rel: "author", class: "p-author h-card" do %> - <%= author.display_name %> - <%= img_tag gravatar_url_for_email(author.email), alt: "Photo of #{author.display_name}", class: "Gravatar u-photo" %> - <% end %> -

-
- <%= link to: Routes.posts_path(conn, :show, post) do %> - - <% end %> -
-
- """ - end - - def unauthenticated_post?(_conn, post) do + def unauthenticated_post?(post) do post.password == nil || String.length(post.password) == 0 end end diff --git a/apps/content/test/content/posts_test.exs b/apps/content/test/content/posts_test.exs index 971ee9cb..26ebbf2b 100644 --- a/apps/content/test/content/posts_test.exs +++ b/apps/content/test/content/posts_test.exs @@ -45,8 +45,32 @@ defmodule Legendary.Content.PostsTest do assert %Post{} = Posts.get_post_with_drafts!(Integer.to_string(id)) end - test "update_posts/2", %{public_post: post} do - assert {:ok, %Post{content: "boop"}} = Posts.update_posts(post, %{content: "boop"}) + describe "update_posts/2" do + setup do + post_with_guid = + %Post{ + title: "Post with guid", + name: "post-with-guid", + status: "publish", + type: "post", + guid: "/beep", + date: ~N[2020-01-01T00:00:00], + } + |> Repo.insert!() + + %{ + post_with_guid: post_with_guid + } + end + + test "with no guid", %{public_post: post} do + assert {:ok, %Post{content: "boop"}} = Posts.update_posts(post, %{content: "boop"}) + end + + test "with an existing guid", %{post_with_guid: post} do + revised_post = Posts.update_posts(post, %{content: "boop"}) + assert {:ok, %Post{content: "boop", guid: "/beep"}} = revised_post + end end test "delete_posts/1", %{public_post: post} do diff --git a/apps/content/test/content/sitemap_storage_test.exs b/apps/content/test/content/sitemap_storage_test.exs new file mode 100644 index 00000000..67c92a4d --- /dev/null +++ b/apps/content/test/content/sitemap_storage_test.exs @@ -0,0 +1,38 @@ +defmodule Legendary.Content.SitemapStorageTest do + use Legendary.Content.DataCase + + import Legendary.Content.SitemapStorage + alias Sitemap.Location + alias Legendary.Content.{Post, Repo} + + test "creates a post with the content" do + data = "" + content = data |> :zlib.gzip() |> Base.encode64 + write(:file, data) + path = Location.filename(:file) + + post = from(p in Post, where: p.name == ^path) |> Repo.one() + + assert post.content == content + end + + test "updates an existing sitemap" do + path = Location.filename(:file) + + %Post{ + content: "" |> :zlib.gzip() |> Base.encode64, + name: path + } + |> Repo.insert!() + + new_data = "" + new_content = new_data |> :zlib.gzip() |> Base.encode64 + + write(:file, new_data) + + + post = from(p in Post, where: p.name == ^path) |> Repo.one() + + assert post.content == new_content + end +end diff --git a/apps/content/test/content/sitemaps_test.exs b/apps/content/test/content/sitemaps_test.exs new file mode 100644 index 00000000..191c7446 --- /dev/null +++ b/apps/content/test/content/sitemaps_test.exs @@ -0,0 +1,78 @@ +defmodule Legendary.Content.SitemapsTest do + use Legendary.Content.DataCase + + alias Legendary.Content.{Post, Repo} + + import Mock + + import Legendary.Content.Sitemaps + + @xml ~s( + + + + https://localhost + 2021-08-19T21:44:37Z + hourly + 0.5 + + https://localhost/public-post + 2021-08-19T21:44:37Z + hourly + 0.5 + + https://localhost/public-post?page=2 + 2021-08-19T21:44:37Z + hourly + 0.5 + +) + + describe "generate/0" do + setup do + public_post = + %Post{ + title: "Public post", + name: "public-post", + status: "publish", + type: "post", + date: ~N[2020-01-01T00:00:00], + content: """ + Page 1 + + Page 2 + """ + } + |> Repo.insert!() + + %{ + public_post: public_post, + } + end + + test "generates results" do + with_mock Sitemap.Funcs, [ + iso8601: fn -> "2021-08-19T21:44:37Z" end, + iso8601: & &1, + eraser: fn (elm) -> passthrough([elm]) end + ] do + with_mock Legendary.Content.SitemapStorage, [write: fn (_name, _data) -> :ok end] do + assert :ok = perform(%{}) + assert_called Legendary.Content.SitemapStorage.write(:file, String.trim(@xml)) + end + end + end + end +end diff --git a/apps/content/test/content_web/controllers/posts_controller_test.exs b/apps/content/test/content_web/controllers/posts_controller_test.exs index 6a220703..64e0193c 100644 --- a/apps/content/test/content_web/controllers/posts_controller_test.exs +++ b/apps/content/test/content_web/controllers/posts_controller_test.exs @@ -1,7 +1,7 @@ defmodule Legendary.Content.PostsControllerTest do use Legendary.Content.ConnCase - alias Legendary.Content.{Comment, Options, Posts, Repo, Term, TermRelationship, TermTaxonomy} + alias Legendary.Content.{Comment, Options, Post, Posts, Repo, Term, TermRelationship, TermTaxonomy} @create_attrs %{ id: 123, @@ -165,6 +165,21 @@ defmodule Legendary.Content.PostsControllerTest do assert html_response(conn, 200) end + test "shows the post if the id has slashes", %{conn: conn} do + %Post{ + name: "a/b/c", + content: "slashed id", + status: "publish", + type: "post", + date: ~N[2020-01-01T00:00:00] + } + |> Repo.insert!() + + conn = get conn, Routes.nested_posts_path(conn, :show, ["a", "b", "c"]) + + assert html_response(conn, 200) + end + test "show a 404 if there's no match", %{conn: conn} do assert_raise Phoenix.Router.NoRouteError, fn -> get conn, Routes.posts_path(conn, :show, "blooper") diff --git a/apps/content/test/content_web/views/error_helpers_test.exs b/apps/content/test/content_web/views/error_helpers_test.exs new file mode 100644 index 00000000..39f08b0a --- /dev/null +++ b/apps/content/test/content_web/views/error_helpers_test.exs @@ -0,0 +1,29 @@ +defmodule Legendary.Content.ErrorHelpersTest do + use Legendary.Content.DataCase + + import Phoenix.HTML, only: [safe_to_string: 1] + import Phoenix.HTML.Form, only: [form_for: 3] + + import Legendary.Content.ErrorHelpers + + def form do + :example + |> form_for( + "/example", + as: :test_params, + errors: [error_field: {"is an error", []}] + ) + end + + describe "error_tag/2" do + test "generates a span with an invalid-feedback class" do + [safe] = error_tag(form(), :error_field) + assert safe_to_string(safe) =~ "invalid-feedback" + end + + test "error_tag/3" do + [safe] = error_tag(form(), :error_field, class: "test-class") + assert safe_to_string(safe) =~ "test-class" + end + end +end diff --git a/apps/content/test/content_web/views/feeds_view_test.exs b/apps/content/test/content_web/views/feeds_view_test.exs new file mode 100644 index 00000000..5e1440c4 --- /dev/null +++ b/apps/content/test/content_web/views/feeds_view_test.exs @@ -0,0 +1,17 @@ +defmodule Legendary.Content.FeedsViewTest do + use Legendary.Content.DataCase + + import Legendary.Content.FeedsView + + alias Legendary.Content.Post + + describe "unauthenticated_post?/1" do + test "with post password" do + refute unauthenticated_post?(%Post{password: "password"}) + end + + test "without post password" do + assert unauthenticated_post?(%Post{}) + end + end +end diff --git a/apps/content/test/content_web/views/posts_view_test.exs b/apps/content/test/content_web/views/posts_view_test.exs index a3ecc396..789900f8 100644 --- a/apps/content/test/content_web/views/posts_view_test.exs +++ b/apps/content/test/content_web/views/posts_view_test.exs @@ -4,6 +4,8 @@ defmodule Legendary.Content.PostsViewTest do import Legendary.Content.PostsView import Phoenix.HTML, only: [safe_to_string: 1] + alias Legendary.Content.Post + test "auto_paragraph_tags/1 with nil" do assert safe_to_string(auto_paragraph_tags(nil)) =~ "" end @@ -11,4 +13,22 @@ defmodule Legendary.Content.PostsViewTest do test "auto_paragraph_tags/1 with text" do assert safe_to_string(auto_paragraph_tags("Bloop\n\nBloop")) =~ "

Bloop

\n

Bloop

" end + + describe "authenticated_for_post?/2" do + test "without password" do + assert authenticated_for_post?(nil, %Post{}) + end + + test "with post password that matches", %{conn: conn} do + with_mock Plug.Conn, [get_session: fn (_conn, :post_password) -> "password" end] do + assert authenticated_for_post?(conn, %Post{password: "password"}) + end + end + + test "with post password that does not match", %{conn: conn} do + with_mock Plug.Conn, [get_session: fn (_conn, :post_password) -> "password" end] do + refute authenticated_for_post?(conn, %Post{password: "password2"}) + end + end + end end diff --git a/apps/core/lib/auth_web/controller_callbacks.ex b/apps/core/lib/auth_web/controller_callbacks.ex index 9b7e344a..a339b7aa 100644 --- a/apps/core/lib/auth_web/controller_callbacks.ex +++ b/apps/core/lib/auth_web/controller_callbacks.ex @@ -1,4 +1,4 @@ -defmodule AuthWeb.Pow.ControllerCallbacks do +defmodule Legendary.AuthWeb.Pow.ControllerCallbacks do @moduledoc """ Hook into Pow Controllers to provide additional framework feature. In particular, we disconnect any active live views when a user logs out. This will cause the @@ -36,6 +36,7 @@ defmodule AuthWeb.Pow.ControllerCallbacks do conn = conn |> Conn.delete_session(:live_socket_id) + |> Conn.delete_session(:current_user_id) ControllerCallbacks.before_respond( Pow.Phoenix.SessionController, diff --git a/apps/core/lib/core_web/plugs/test_end_to_end.ex b/apps/core/lib/core_web/plugs/test_end_to_end.ex index ef6137af..2170c8c4 100644 --- a/apps/core/lib/core_web/plugs/test_end_to_end.ex +++ b/apps/core/lib/core_web/plugs/test_end_to_end.ex @@ -16,8 +16,12 @@ defmodule Legendary.CoreWeb.Plug.TestEndToEnd do send_resp(conn, 200, "connection has already been checked out") else {:ok, _pid} = Agent.start_link(&checkout_shared_db_conn/0, name: :db_owner_agent) - {:ok, _} = load_test_seeds(conn) - send_resp(conn, 200, "connection checked out") + case load_test_seeds(conn) do + {:ok, _} -> + send_resp(conn, 200, "connection checked out") + {:error, msg} -> + send_resp(conn, 500, msg) + end end end @@ -40,7 +44,10 @@ defmodule Legendary.CoreWeb.Plug.TestEndToEnd do Ecto.Repo.all_running() |> Enum.map(fn repo -> :ok = Ecto.Adapters.SQL.Sandbox.checkout(repo, ownership_timeout: :infinity) - :ok = Ecto.Adapters.SQL.Sandbox.mode(repo, {:shared, self()}) + case Ecto.Adapters.SQL.Sandbox.mode(repo, {:shared, self()}) do + :ok -> :ok + :already_shared -> :ok + end end) end @@ -59,14 +66,16 @@ defmodule Legendary.CoreWeb.Plug.TestEndToEnd do {:app, {:ok, app}} <- {:app, Map.fetch(conn.body_params, "app")}, true <- String.match?(seed_set, @valid_seed_set_characters), true <- String.match?(app, @valid_app_characters) do - seed_path = "apps/#{app}/test/seed_sets/#{seed_set}.exs" + + project_base = Path.expand(Path.join(__DIR__, "../../../../..")) + seed_path = Path.join(project_base, "apps/#{app}/test/seed_sets/#{seed_set}.exs") try do {result, _} = Code.eval_file(seed_path) {:ok, result} rescue e in Code.LoadError -> - {:error, "could not load a seed set at #{seed_path}: #{e}"} + {:error, e.message} end else {:app, :error} -> {:error, "app parameter is required if seed set is set"} diff --git a/apps/core/lib/core_web/router.ex b/apps/core/lib/core_web/router.ex index 279e6d9c..5b6bb2c7 100644 --- a/apps/core/lib/core_web/router.ex +++ b/apps/core/lib/core_web/router.ex @@ -31,4 +31,8 @@ defmodule Legendary.CoreWeb.Router do live_dashboard "/dashboard", metrics: Legendary.CoreWeb.Telemetry end end + + if Mix.env() in [:e2e, :test] do + forward("/end-to-end", Legendary.CoreWeb.Plug.TestEndToEnd, otp_app: :app) + end end diff --git a/apps/core/lib/core_web/views/helpers.ex b/apps/core/lib/core_web/views/helpers.ex index f1d4fca0..cfed1753 100644 --- a/apps/core/lib/core_web/views/helpers.ex +++ b/apps/core/lib/core_web/views/helpers.ex @@ -48,7 +48,7 @@ defmodule Legendary.CoreWeb.Helpers do {type, rest_opts} = Keyword.pop(opts, :type, input_type(f, field)) {classes, rest_opts} = Keyword.pop(rest_opts, :class, default_classes_for_type(type)) {label_text, rest_opts} = Keyword.pop(rest_opts, :label) - {input_helper, _rest_opts} = Keyword.pop(rest_opts, :input_helper, input_type(f, field)) + {input_helper, _rest_opts} = Keyword.pop(rest_opts, :input_helper, type) error_classes = if Keyword.get_values(f.errors, field) |> Enum.any?() do diff --git a/apps/core/lib/mix/tasks/create_admin.ex b/apps/core/lib/mix/tasks/create_admin.ex index cd1dbe92..58703b7f 100644 --- a/apps/core/lib/mix/tasks/create_admin.ex +++ b/apps/core/lib/mix/tasks/create_admin.ex @@ -9,11 +9,13 @@ defmodule Mix.Tasks.Legendary.CreateAdmin do alias Ecto.Changeset @shortdoc "Create an admin user." - def run(_) do + def run(args) do Application.ensure_all_started(:core) - email = ExPrompt.string_required("Email: ") - password = ExPrompt.password("Password: ") + {switches, _, _} = OptionParser.parse(args, strict: [email: :string, password: :string]) + + email = Keyword.get_lazy(switches, :email, fn -> ExPrompt.string_required("Email: ") end) + password = Keyword.get_lazy(switches, :password, fn -> ExPrompt.password("Password: ") end) params = %{ email: email, @@ -27,7 +29,7 @@ defmodule Mix.Tasks.Legendary.CreateAdmin do |> Repo.insert!() end - def maybe_confirm_email(changeset) do + defp maybe_confirm_email(changeset) do field_list = User.__schema__(:fields) case Enum.any?(field_list, &(&1 == :email_confirmed_at)) do diff --git a/apps/core/test/auth_web/controller_callback_test.exs b/apps/core/test/auth_web/controller_callback_test.exs new file mode 100644 index 00000000..50d6357b --- /dev/null +++ b/apps/core/test/auth_web/controller_callback_test.exs @@ -0,0 +1,33 @@ +defmodule Legendary.AuthWeb.Pow.ControllerCallbacksTest do + use Legendary.CoreWeb.ConnCase, async: true + + import Legendary.AuthWeb.Pow.ControllerCallbacks + import Plug.Conn, only: [assign: 3, get_session: 2] + + alias Legendary.Auth.User + + describe "before_respond/4" do + setup %{conn: conn} do + conn = + conn + |> init_test_session([]) + |> assign(:current_user, %User{id: 123}) + + %{conn: conn} + end + + test "sets the live_socket_id in session upon sign in", %{conn: conn} do + {:ok, conn} = before_respond(Pow.Phoenix.SessionController, :create, {:ok, conn}, []) + + assert get_session(conn, "live_socket_id") == "users_sockets:123" + assert get_session(conn, "current_user_id") == 123 + end + + test "removes the live_socket_id and broadcasts a disconnect signal upon sign out", %{conn: conn, } do + {:ok, conn} = before_respond(Pow.Phoenix.SessionController, :delete, {:ok, conn}, []) + + assert get_session(conn, "live_socket_id") == nil + assert get_session(conn, "current_user_id") == nil + end + end +end diff --git a/apps/core/test/auth_web/helpers_test.exs b/apps/core/test/auth_web/helpers_test.exs index 20bc71b1..2329a19d 100644 --- a/apps/core/test/auth_web/helpers_test.exs +++ b/apps/core/test/auth_web/helpers_test.exs @@ -1,8 +1,15 @@ defmodule Legendary.AuthWeb.HelpersTest do - use Legendary.CoreWeb.ConnCase + use Legendary.CoreWeb.ConnCase, async: true import Legendary.AuthWeb.Helpers + alias Phoenix.LiveView.Socket + + describe "current_user/1" do + test "can get a user from the assigns in a socket", do: assert current_user(%Socket{assigns: %{current_user: %{id: 867}}}).id == 867 + test "can get a user from the __assigns__ in a socket", do: assert current_user(%Socket{assigns: %{__assigns__: %{current_user: %{id: 867}}}}).id == 867 + end + describe "has_role?/2" do test "with a user", %{conn: conn} do conn = diff --git a/apps/core/test/auth_web/plugs/require_admin_test.exs b/apps/core/test/auth_web/plugs/require_admin_test.exs index 35d2f09f..1f67651b 100644 --- a/apps/core/test/auth_web/plugs/require_admin_test.exs +++ b/apps/core/test/auth_web/plugs/require_admin_test.exs @@ -1,5 +1,5 @@ defmodule Legendary.AuthWeb.Plugs.RequireAdminTest do - use Legendary.CoreWeb.ConnCase + use Legendary.CoreWeb.ConnCase, async: true alias Legendary.AuthWeb.Plugs.RequireAdmin alias Legendary.Auth.User diff --git a/apps/core/test/core_web/plugs/test_end_to_end_test.exs b/apps/core/test/core_web/plugs/test_end_to_end_test.exs new file mode 100644 index 00000000..610c8405 --- /dev/null +++ b/apps/core/test/core_web/plugs/test_end_to_end_test.exs @@ -0,0 +1,38 @@ +defmodule Legendary.CoreWeb.Plug.TestEndToEndTest do + use Legendary.CoreWeb.ConnCase + + test "/db/setup can check out a connection", %{conn: conn} do + conn = post conn, "/end-to-end/db/setup", %{seed_set: "test_end_to_end_test", app: "core"} + + assert response(conn, 200) =~ "connection checked out" + end + + test "/db/setup twice is a no-op", %{conn: conn} do + conn = post conn, "/end-to-end/db/setup", %{seed_set: "test_end_to_end_test", app: "core"} + conn = post conn, "/end-to-end/db/setup", %{seed_set: "test_end_to_end_test", app: "core"} + + assert response(conn, 200) =~ "connection has already been checked out" + end + + test "/db/setup with no-existent seed set is an error", %{conn: conn} do + conn = post conn, "/end-to-end/db/setup", %{seed_set: "oops", app: "core"} + + assert response(conn, 500) =~ "could not load" + assert response(conn, 500) =~ "oops.exs" + end + + test "/db/teardown can check in a connection", %{conn: conn} do + conn = post conn, "/end-to-end/db/setup", %{seed_set: "test_end_to_end_test", app: "core"} + conn = post conn, "/end-to-end/db/teardown" + + assert response(conn, 200) =~ "checked in database connection" + end + + test "/db/teardown checking in twice is a no-op", %{conn: conn} do + conn = post conn, "/end-to-end/db/setup", %{seed_set: "test_end_to_end_test", app: "core"} + conn = post conn, "/end-to-end/db/teardown" + conn = post conn, "/end-to-end/db/teardown" + + assert response(conn, 200) =~ "connection has already been checked back in" + end +end diff --git a/apps/core/test/core_web/views/helpers_test.exs b/apps/core/test/core_web/views/helpers_test.exs index e0b8b6ba..a8d4b06b 100644 --- a/apps/core/test/core_web/views/helpers_test.exs +++ b/apps/core/test/core_web/views/helpers_test.exs @@ -1,5 +1,5 @@ defmodule Legendary.CoreWeb.HelpersTest do - use Legendary.CoreWeb.ConnCase + use Legendary.CoreWeb.ConnCase, async: true import Legendary.CoreWeb.Helpers import Ecto.Changeset, @@ -35,6 +35,17 @@ defmodule Legendary.CoreWeb.HelpersTest do changeset end + describe "current_user?/1" do + test "returns nil for a conn with no user", %{conn: conn}, do: refute conn |> setup_pow() |> current_user() + test "returns a user for a conn with a user", %{conn: conn} do + conn = + conn + |> setup_user(id: 456) + + assert current_user(conn).id == 456 + end + end + describe "has_role?/2" do test "with a user", %{conn: conn} do conn = @@ -105,6 +116,87 @@ defmodule Legendary.CoreWeb.HelpersTest do assert markup =~ " styled_input(:no_error_field, type: :date_select) + |> safe_to_string() + + assert markup =~ " safe_to_string() + + assert markup =~ ">Push Me" + assert markup =~ " safe_to_string() + + assert markup =~ ">Push Me" + assert markup =~ " safe_to_string() + + assert markup =~ "Test Title" + assert markup =~ "Test Content" + end + end + + describe "floating_page_wrapper/1" do + test "includes content" do + markup = + floating_page_wrapper(do: "Test Content") + |> safe_to_string() + + assert markup =~ "Test Content" + end + end + test "pow_extension_enabled?/1" do assert pow_extension_enabled?(PowEmailConfirmation) == true assert pow_extension_enabled?(:donkdonk) == false diff --git a/apps/core/test/mix/tasks/create_admin_test.exs b/apps/core/test/mix/tasks/create_admin_test.exs new file mode 100644 index 00000000..87471981 --- /dev/null +++ b/apps/core/test/mix/tasks/create_admin_test.exs @@ -0,0 +1,17 @@ +defmodule Mix.Tasks.Legendary.CreateAdminTest do + use Legendary.Core.DataCase + + import Mix.Tasks.Legendary.CreateAdmin + + alias Legendary.Auth.User + + describe "run/1" do + test "creates an admin user" do + run(["--email=test@example.com", "--password=openseasame"]) + + user = from(u in User, where: u.email == "test@example.com") |> Repo.one() + + assert %User{email: "test@example.com"} = user + end + end +end diff --git a/apps/core/test/seed_sets/test_end_to_end_test.exs b/apps/core/test/seed_sets/test_end_to_end_test.exs new file mode 100644 index 00000000..e69de29b diff --git a/apps/core/test/shared_db_connection_pool_test.exs b/apps/core/test/shared_db_connection_pool_test.exs new file mode 100644 index 00000000..ba23ba97 --- /dev/null +++ b/apps/core/test/shared_db_connection_pool_test.exs @@ -0,0 +1,14 @@ +defmodule Legendary.Core.SharedDBConnectionPoolTest do + use Legendary.Core.DataCase + + import Legendary.Core.SharedDBConnectionPool + + test "child_spec/2" do + spec = child_spec({Postgrex.Protocol, []}) + + assert %{id: Legendary.Core.SharedDBConnectionPool, start: start} = spec + assert {Legendary.Core.SharedDBConnectionPool, :start_link, [{Postgrex.Protocol, opts}]} = start + assert [{:name, hashed_name}] = opts + assert Atom.to_string(hashed_name) =~ "Legendary.Core.SharedDBConnectionPool." + end +end diff --git a/apps/core/test/support/conn_case.ex b/apps/core/test/support/conn_case.ex index 69f5c748..33eaf9f6 100644 --- a/apps/core/test/support/conn_case.ex +++ b/apps/core/test/support/conn_case.ex @@ -28,6 +28,22 @@ defmodule Legendary.CoreWeb.ConnCase do # The default endpoint for testing @endpoint Legendary.CoreWeb.Endpoint + + def setup_pow(conn) do + conn + |> Pow.Plug.put_config(current_user_assigns_key: :current_user) + end + + def setup_user(conn, attrs \\ []) do + user = + attrs + |> Enum.into(%{}) + |> (& struct(Legendary.Auth.User, &1)).() + + conn + |> setup_pow() + |> Pow.Plug.assign_current_user(user, []) + end end end diff --git a/apps/core/test/support/empty_cluster_strategy.ex b/apps/core/test/support/empty_cluster_strategy.ex deleted file mode 100644 index 7cc5c124..00000000 --- a/apps/core/test/support/empty_cluster_strategy.ex +++ /dev/null @@ -1,24 +0,0 @@ -defmodule Legendary.Core.Cluster.EmptyClusterStrategy do - @moduledoc """ - A libcluster nil strategy that always returns no nodes. - """ - use GenServer - use Cluster.Strategy - - alias Cluster.Strategy.State - - def start_link([%State{} = state]) do - new_state = %State{state | :meta => []} - GenServer.start_link(__MODULE__, [new_state]) - end - - @impl true - def init([state]) do - {:ok, state, :infinity} - end - - @impl true - def handle_info(_, state) do - {:noreply, state, :infinity} - end -end diff --git a/config/config.exs b/config/config.exs index 95e8450b..28c447d3 100644 --- a/config/config.exs +++ b/config/config.exs @@ -40,7 +40,7 @@ config :core, :pow, user: Legendary.Auth.User, repo: Legendary.Core.Repo, extensions: [PowEmailConfirmation, PowPersistentSession, PowResetPassword], - controller_callbacks: AuthWeb.Pow.ControllerCallbacks, + controller_callbacks: Legendary.AuthWeb.Pow.ControllerCallbacks, mailer_backend: Legendary.AuthWeb.Pow.Mailer, web_mailer_module: Legendary.AuthWeb, web_module: Legendary.AuthWeb, diff --git a/config/test.exs b/config/test.exs index 06528b16..a35a8174 100644 --- a/config/test.exs +++ b/config/test.exs @@ -42,9 +42,4 @@ config :content, Oban, crontab: false, queues: false, plugins: false config :logger, level: :warn -config :libcluster, - topologies: [ - # erlang_hosts: [ - # strategy: Legendary.Core.Cluster.EmptyClusterStrategy - # ] - ] +config :libcluster, topologies: [] From 1a5c8e8987fa1bbe33a93225671ee87125ed9802 Mon Sep 17 00:00:00 2001 From: Robert Prehn Date: Mon, 6 Sep 2021 19:52:38 +0000 Subject: [PATCH 7/8] chore(release): 4.0.3 [skip ci] --- apps/admin/mix.exs | 2 +- apps/content/mix.exs | 2 +- apps/core/mix.exs | 2 +- infrastructure/kube.yaml | 2 +- mix.exs | 2 +- package.json | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/admin/mix.exs b/apps/admin/mix.exs index 89c799f7..1a9bc6b9 100644 --- a/apps/admin/mix.exs +++ b/apps/admin/mix.exs @@ -1,7 +1,7 @@ defmodule Legendary.Admin.MixProject do use Mix.Project - @version "4.0.2" + @version "4.0.3" def project do [ diff --git a/apps/content/mix.exs b/apps/content/mix.exs index 19d47e71..d0a56206 100644 --- a/apps/content/mix.exs +++ b/apps/content/mix.exs @@ -1,7 +1,7 @@ defmodule Legendary.Content.MixProject do use Mix.Project - @version "4.0.2" + @version "4.0.3" def project do [ diff --git a/apps/core/mix.exs b/apps/core/mix.exs index c33f7177..7f89825c 100644 --- a/apps/core/mix.exs +++ b/apps/core/mix.exs @@ -1,7 +1,7 @@ defmodule Legendary.Core.MixProject do use Mix.Project - @version "4.0.2" + @version "4.0.3" def project do [ diff --git a/infrastructure/kube.yaml b/infrastructure/kube.yaml index bad371c2..97059b6a 100644 --- a/infrastructure/kube.yaml +++ b/infrastructure/kube.yaml @@ -20,7 +20,7 @@ spec: spec: containers: - name: app - image: registry.gitlab.com/mythic-insight/legendary:4.0.2 + image: registry.gitlab.com/mythic-insight/legendary:4.0.3 command: ["elixir"] args: - "--name" diff --git a/mix.exs b/mix.exs index 8addf0cc..3ba25ffe 100644 --- a/mix.exs +++ b/mix.exs @@ -1,7 +1,7 @@ defmodule Legendary.Mixfile do use Mix.Project - @version "4.0.2" + @version "4.0.3" def project do [ diff --git a/package.json b/package.json index e05782a0..8e757fad 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@mythic-insight/legendary", - "version": "4.0.2", + "version": "4.0.3", "private": true, "description": "The Legendary Phoenix Boilerplate.", "main": "index.js", From a6481c2536010368594e5ea7ba210cdfb439f873 Mon Sep 17 00:00:00 2001 From: Robert Prehn Date: Mon, 6 Sep 2021 23:04:44 +0000 Subject: [PATCH 8/8] chore(deps-dev): bump start-server-and-test from 1.13.1 to 1.14.0 --- package-lock.json | 18 +++++++++--------- package.json | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index a6a3bb6a..42c8cbb9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@mythic-insight/legendary", - "version": "4.0.2", + "version": "4.0.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@mythic-insight/legendary", - "version": "4.0.2", + "version": "4.0.3", "license": "MIT", "devDependencies": { "@google/semantic-release-replace-plugin": "^1.1.0", @@ -18,7 +18,7 @@ "dot": "^1.1.3", "http-proxy": "^1.18.1", "semantic-release": "^17.4.7", - "start-server-and-test": "^1.13.1" + "start-server-and-test": "^1.14.0" } }, "node_modules/@babel/code-frame": { @@ -7874,9 +7874,9 @@ } }, "node_modules/start-server-and-test": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-1.13.1.tgz", - "integrity": "sha512-wZjksmjG5scEHXmV/3HWzImxNzUgaNQ6W8kkqL2GbiOldM+nqiqh7niimlC9ZGNopTGj16kheWZnZtSWgdBZNQ==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-1.14.0.tgz", + "integrity": "sha512-on5ELuxO2K0t8EmNj9MtVlFqwBMxfWOhu4U7uZD1xccVpFlOQKR93CSe0u98iQzfNxRyaNTb/CdadbNllplTsw==", "dev": true, "dependencies": { "bluebird": "3.7.2", @@ -14317,9 +14317,9 @@ } }, "start-server-and-test": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-1.13.1.tgz", - "integrity": "sha512-wZjksmjG5scEHXmV/3HWzImxNzUgaNQ6W8kkqL2GbiOldM+nqiqh7niimlC9ZGNopTGj16kheWZnZtSWgdBZNQ==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-1.14.0.tgz", + "integrity": "sha512-on5ELuxO2K0t8EmNj9MtVlFqwBMxfWOhu4U7uZD1xccVpFlOQKR93CSe0u98iQzfNxRyaNTb/CdadbNllplTsw==", "dev": true, "requires": { "bluebird": "3.7.2", diff --git a/package.json b/package.json index 03f99028..f9f27c4e 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "dot": "^1.1.3", "http-proxy": "^1.18.1", "semantic-release": "^17.4.7", - "start-server-and-test": "^1.13.1" + "start-server-and-test": "^1.14.0" }, "release": { "branch": "master",