From b2ea4e0781e10b8a5b30f9f001ce3b6136cf472f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Sep 2020 22:37:34 +0000 Subject: [PATCH 01/18] build(deps): bump http-proxy from 1.17.0 to 1.18.1 Bumps [http-proxy](https://github.com/http-party/node-http-proxy) from 1.17.0 to 1.18.1. - [Release notes](https://github.com/http-party/node-http-proxy/releases) - [Changelog](https://github.com/http-party/node-http-proxy/blob/master/CHANGELOG.md) - [Commits](https://github.com/http-party/node-http-proxy/compare/1.17.0...1.18.1) Signed-off-by: dependabot[bot] --- yarn.lock | 30 +++++++----------------------- 1 file changed, 7 insertions(+), 23 deletions(-) diff --git a/yarn.lock b/yarn.lock index 514d50a543..357ecf708f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6049,15 +6049,10 @@ event-stream@3.3.4: stream-combiner "~0.0.4" through "~2.3.1" -eventemitter3@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" - integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== - eventemitter3@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" - integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== events@^3.0.0: version "3.0.0" @@ -6481,11 +6476,9 @@ flush-write-stream@^1.0.0: readable-stream "^2.3.6" follow-redirects@^1.0.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.7.0.tgz#489ebc198dc0e7f64167bd23b03c4c19b5784c76" - integrity sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ== - dependencies: - debug "^3.2.6" + version "1.13.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db" + integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA== font-awesome@^4.7.0: version "4.7.0" @@ -7330,16 +7323,7 @@ http-proxy-middleware@0.19.1: lodash "^4.17.11" micromatch "^3.1.10" -http-proxy@^1.17.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a" - integrity sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g== - dependencies: - eventemitter3 "^3.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" - -http-proxy@^1.18.1: +http-proxy@^1.17.0, http-proxy@^1.18.1: version "1.18.1" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== From 5c6c1269c7334cf9ae3d6652bb96e5cdc6fe22ec Mon Sep 17 00:00:00 2001 From: "Stefan@Lap" Date: Wed, 7 Oct 2020 20:53:54 +0200 Subject: [PATCH 02/18] build(deps): update dependencies --- package.json | 32 +- yarn.lock | 876 +++++++++++++++++++++++++-------------------------- 2 files changed, 450 insertions(+), 458 deletions(-) diff --git a/package.json b/package.json index 59e71f592a..10917b6027 100644 --- a/package.json +++ b/package.json @@ -92,22 +92,22 @@ "@angular/platform-browser-dynamic": "~10.0.4", "@angular/platform-server": "~10.0.4", "@angular/router": "~10.0.4", - "@ctrl/ngx-codemirror": "^4.0.0", + "@ctrl/ngx-codemirror": "^4.0.1", "@fortawesome/angular-fontawesome": "^0.7.0", - "@fortawesome/fontawesome-svg-core": "^1.2.30", - "@fortawesome/free-solid-svg-icons": "^5.14.0", + "@fortawesome/fontawesome-svg-core": "^1.2.32", + "@fortawesome/free-solid-svg-icons": "^5.15.1", "@kolkov/ngx-gallery": "^1.2.3", "@ng-bootstrap/ng-bootstrap": "^7.0.0", "bootstrap": "^4.5.2", - "codemirror": "^5.57.0", + "codemirror": "^5.58.1", "core-js": "^3.6.5", - "d3-drag": "^1.2.5", + "d3-drag": "^2.0.0", "d3-force": "^2.0.1", "d3-selection": "^1.4.2", - "d3-zoom": "^1.8.3", + "d3-zoom": "^2.0.0", "font-awesome": "^4.7.0", "json2typescript": "^1.4.1", - "n3": "^1.6.2", + "n3": "^1.6.3", "ngx-json-viewer": "^2.4.0", "rdfstore": "^0.9.17", "rxjs": "~6.5.5", @@ -119,19 +119,19 @@ "@angular-devkit/build-angular": "~0.1000.3", "@angular/cli": "~10.0.3", "@angular/compiler-cli": "~10.0.4", - "@commitlint/cli": "^9.1.2", - "@commitlint/config-angular": "^9.1.2", + "@commitlint/cli": "^11.0.0", + "@commitlint/config-angular": "^11.0.0", "@compodoc/compodoc": "^1.1.11", - "@types/d3": "^5.7.2", + "@types/d3": "^5.16.3", "@types/jasmine": "~3.5.0", "@types/jasminewd2": "~2.0.3", - "@types/node": "^14.6.1", + "@types/node": "^14.11.5", "angular-cli-ghpages": "^0.6.2", "codelyzer": "^6.0.0", "conventional-recommended-bump": "^6.0.10", "cross-var": "^1.1.0", - "gzipper": "^4.0.0", - "husky": "^4.2.5", + "gzipper": "^4.0.2", + "husky": "^4.3.0", "jasmine-core": "~3.5.0", "jasmine-spec-reporter": "~5.0.0", "karma": "~5.0.0", @@ -139,11 +139,11 @@ "karma-coverage-istanbul-reporter": "~3.0.2", "karma-jasmine": "~3.3.0", "karma-jasmine-html-reporter": "^1.5.0", - "lint-staged": "^10.2.13", + "lint-staged": "^10.4.0", "ng-lint-staged": "^0.1.6", "npm-run-all": "^4.1.5", - "prettier": "~2.1.1", - "pretty-quick": "^3.0.0", + "prettier": "~2.1.2", + "pretty-quick": "^3.0.2", "protractor": "~7.0.0", "source-map-explorer": "^2.5.0", "standard-version": "^9.0.0", diff --git a/yarn.lock b/yarn.lock index 357ecf708f..7edfc9e17c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1034,6 +1034,13 @@ dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.11.2": + version "7.11.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736" + integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/runtime@^7.3.1": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132" @@ -1041,14 +1048,7 @@ dependencies: regenerator-runtime "^0.13.2" -"@babel/runtime@^7.6.3": - version "7.7.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.7.7.tgz#194769ca8d6d7790ec23605af9ee3e42a0aa79cf" - integrity sha512-uCnC2JEVAu8AKB5do1WRIsvrdJ0flYx/A/9f/6chdacnEZ7LmavjdsDXr5ksYBegxtuTPR5Va9/+13QF/kFkCA== - dependencies: - regenerator-runtime "^0.13.2" - -"@babel/runtime@^7.8.4", "@babel/runtime@^7.9.6": +"@babel/runtime@^7.8.4": version "7.10.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.5.tgz#303d8bd440ecd5a491eae6117fd3367698674c5c" integrity sha512-otddXKhdNn7d0ptoFRHtMLa8LqDxLYwTjB4nYgM1yy5N6gU/MUf8zqyyLltCH3yAVitBzmwK4us+DD0l/MauAg== @@ -1106,146 +1106,146 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" -"@commitlint/cli@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-9.1.2.tgz#3773699ea2ee6192f8dc14dd09b479baaaa13cd3" - integrity sha512-ctRrrPqjZ8r4Vc4FXpPaScEpkPwfvB0Us3NK2SD2AnLwXGMxOLFTabDmNySU1Xc40ud2CmJsaV8lpavvzs8ZZA== +"@commitlint/cli@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-11.0.0.tgz#698199bc52afed50aa28169237758fa14a67b5d3" + integrity sha512-YWZWg1DuqqO5Zjh7vUOeSX76vm0FFyz4y0cpGMFhrhvUi5unc4IVfCXZ6337R9zxuBtmveiRuuhQqnRRer+13g== dependencies: - "@babel/runtime" "^7.9.6" - "@commitlint/format" "^9.1.2" - "@commitlint/lint" "^9.1.2" - "@commitlint/load" "^9.1.2" - "@commitlint/read" "^9.1.2" + "@babel/runtime" "^7.11.2" + "@commitlint/format" "^11.0.0" + "@commitlint/lint" "^11.0.0" + "@commitlint/load" "^11.0.0" + "@commitlint/read" "^11.0.0" chalk "4.1.0" core-js "^3.6.1" - get-stdin "7.0.0" + get-stdin "8.0.0" lodash "^4.17.19" resolve-from "5.0.0" resolve-global "1.0.0" yargs "^15.1.0" -"@commitlint/config-angular-type-enum@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/config-angular-type-enum/-/config-angular-type-enum-9.1.2.tgz#0459575b98443f7e6e8c4965d2a70b00cc001abd" - integrity sha512-vPdAnL1GbSKbbMhzAgCknQqCwafhjWI9GKnbNgY6MKcXJEvND/OyufUvxyyiews1blenGJupufZ8JrY5qbJwtQ== +"@commitlint/config-angular-type-enum@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/config-angular-type-enum/-/config-angular-type-enum-11.0.0.tgz#7a7f6982e45d3696d72eb343a5d1dc23b2f003e0" + integrity sha512-dSyxdkU36aEgDUWBSiM5lsZ/h2K7uCyKf+A5Sf3+Z5JhcLD9GzTo5W+c8KgwTBdL39dkL7sN+EVgsXNjW99pJg== -"@commitlint/config-angular@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/config-angular/-/config-angular-9.1.2.tgz#3bf6d4071b7bfc96ae92ba7c29ba942db76b5f94" - integrity sha512-zIO26glOlUjFnOiqxBl4fX1p6NYqWzx4OVf56LvrVP4vtrE5z0r/De93iqHLhmx9mBCh8HCUhGjYHR7SkqdepQ== +"@commitlint/config-angular@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/config-angular/-/config-angular-11.0.0.tgz#c1cc1dd902a4b9d2a5c072ff38e3ace9be7138e0" + integrity sha512-H8QSEOmfRsPW0Iehid5fY7NZ2HXmyKC6Q83MLFf9KRnmCcbgJtH+faECtqlvPntayO3CYbA4UenIerOaQ0vOAg== dependencies: - "@commitlint/config-angular-type-enum" "^9.1.2" + "@commitlint/config-angular-type-enum" "^11.0.0" -"@commitlint/ensure@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-9.1.2.tgz#0575cb42451f560cdca7f0b775ab57cdf651ec42" - integrity sha512-hwQICwpNSTsZgj/1/SdPvYAzhwjwgCJI4vLbT879+Jc+AJ6sj2bUDGw/F89vzgKz1VnaMm4D65bNhoWhG3pdhQ== +"@commitlint/ensure@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-11.0.0.tgz#3e796b968ab5b72bc6f8a6040076406306c987fb" + integrity sha512-/T4tjseSwlirKZdnx4AuICMNNlFvRyPQimbZIOYujp9DSO6XRtOy9NrmvWujwHsq9F5Wb80QWi4WMW6HMaENug== dependencies: - "@commitlint/types" "^9.1.2" + "@commitlint/types" "^11.0.0" lodash "^4.17.19" -"@commitlint/execute-rule@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-9.1.2.tgz#74a77eae50c8d2e5766822061ddf0df1b4f08027" - integrity sha512-NGbeo0KCVYo1yj9vVPFHv6RGFpIF6wcQxpFYUKGIzZVV9Vz1WyiKS689JXa99Dt1aN0cZlEJJLnTNDIgYls0Vg== +"@commitlint/execute-rule@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-11.0.0.tgz#3ed60ab7a33019e58d90e2d891b75d7df77b4b4d" + integrity sha512-g01p1g4BmYlZ2+tdotCavrMunnPFPhTzG1ZiLKTCYrooHRbmvqo42ZZn4QMStUEIcn+jfLb6BRZX3JzIwA1ezQ== -"@commitlint/format@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-9.1.2.tgz#14938bfed22132e00be92931bfcb96dae32dfd1c" - integrity sha512-+ZWTOSGEU6dbn3NRh1q7sY5K5QLiSs7E2uSzuYnWHXcQk8nlTvnE0ibwMCQxdKLaOTZiN57fHM/7M9Re2gsRuw== +"@commitlint/format@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-11.0.0.tgz#ac47b0b9ca46540c0082c721b290794e67bdc51b" + integrity sha512-bpBLWmG0wfZH/svzqD1hsGTpm79TKJWcf6EXZllh2J/LSSYKxGlv967lpw0hNojme0sZd4a/97R3qA2QHWWSLg== dependencies: - "@commitlint/types" "^9.1.2" + "@commitlint/types" "^11.0.0" chalk "^4.0.0" -"@commitlint/is-ignored@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-9.1.2.tgz#ac3cb01d0432d57db717da1e8bb370a283ef75bb" - integrity sha512-423W/+Ro+Cc8cg81+t9gds1EscMZNjnGT31nKDvxVxJxXiXQsYYoFEQbU+nfUrRGQsUikEgEJ3ppVGr1linvcQ== +"@commitlint/is-ignored@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-11.0.0.tgz#7b803eda56276dbe7fec51eb1510676198468f39" + integrity sha512-VLHOUBN+sOlkYC4tGuzE41yNPO2w09sQnOpfS+pSPnBFkNUUHawEuA44PLHtDvQgVuYrMAmSWFQpWabMoP5/Xg== dependencies: - "@commitlint/types" "^9.1.2" + "@commitlint/types" "^11.0.0" semver "7.3.2" -"@commitlint/lint@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-9.1.2.tgz#fbb110df8c52c1d6e5def07fb44a47066870c838" - integrity sha512-XvggqHZ4XSTKOgzJhCzz52cWRRO57QQnEviwGj0qnD4jdwC+8h2u9LNZwoa2tGAuaNM3nSm//wNK7FRZhgiiFA== +"@commitlint/lint@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-11.0.0.tgz#01e062cd1b0e7c3d756aa2c246462e0b6a3348a4" + integrity sha512-Q8IIqGIHfwKr8ecVZyYh6NtXFmKw4YSEWEr2GJTB/fTZXgaOGtGFZDWOesCZllQ63f1s/oWJYtVv5RAEuwN8BQ== dependencies: - "@commitlint/is-ignored" "^9.1.2" - "@commitlint/parse" "^9.1.2" - "@commitlint/rules" "^9.1.2" - "@commitlint/types" "^9.1.2" + "@commitlint/is-ignored" "^11.0.0" + "@commitlint/parse" "^11.0.0" + "@commitlint/rules" "^11.0.0" + "@commitlint/types" "^11.0.0" -"@commitlint/load@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-9.1.2.tgz#c79634e8805ab35f318c535fdbda748288bf5395" - integrity sha512-FPL82xBuF7J3EJ57kLVoligQP4BFRwrknooP+vNT787AXmQ/Fddc/iYYwHwy67pNkk5N++/51UyDl/CqiHb6nA== +"@commitlint/load@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-11.0.0.tgz#f736562f0ffa7e773f8808fea93319042ee18211" + integrity sha512-t5ZBrtgvgCwPfxmG811FCp39/o3SJ7L+SNsxFL92OR4WQxPcu6c8taD0CG2lzOHGuRyuMxZ7ps3EbngT2WpiCg== dependencies: - "@commitlint/execute-rule" "^9.1.2" - "@commitlint/resolve-extends" "^9.1.2" - "@commitlint/types" "^9.1.2" + "@commitlint/execute-rule" "^11.0.0" + "@commitlint/resolve-extends" "^11.0.0" + "@commitlint/types" "^11.0.0" chalk "4.1.0" - cosmiconfig "^6.0.0" + cosmiconfig "^7.0.0" lodash "^4.17.19" resolve-from "^5.0.0" -"@commitlint/message@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-9.1.2.tgz#7589f03fa5807ed51adde1851db86d84e8ff3efe" - integrity sha512-ndlx5z7bPVLG347oYJUHuQ41eTcsw+aUYT1ZwQyci0Duy2atpuoeeSw9SuM1PjufzRCpb6ExzFEgGzcCRKAJsg== +"@commitlint/message@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-11.0.0.tgz#83554c3cbbc884fd07b473593bc3e94bcaa3ee05" + integrity sha512-01ObK/18JL7PEIE3dBRtoMmU6S3ecPYDTQWWhcO+ErA3Ai0KDYqV5VWWEijdcVafNpdeUNrEMigRkxXHQLbyJA== -"@commitlint/parse@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-9.1.2.tgz#ce0f91df846f978bc369b50c23fe894536bde664" - integrity sha512-d+/VYbkotctW+lzDpus/R6xTerOqFQkW1myH+3PwnqYSE6JU/uHT4MlZNGJBv8pX9SPlR66t6X9puFobqtezEw== +"@commitlint/parse@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-11.0.0.tgz#d18b08cf67c35d02115207d7009306a2e8e7c901" + integrity sha512-DekKQAIYWAXIcyAZ6/PDBJylWJ1BROTfDIzr9PMVxZRxBPc1gW2TG8fLgjZfBP5mc0cuthPkVi91KQQKGri/7A== dependencies: conventional-changelog-angular "^5.0.0" conventional-commits-parser "^3.0.0" -"@commitlint/read@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-9.1.2.tgz#ad8f62c733f9438fd5b388c72f7122f9038edd14" - integrity sha512-C2sNBQOqeQXMxpWtRnXYKYB3D9yuybPtQNY/P67A6o8XH/UMHkFaUTyIx1KRgu0IG0yTTItRt46FGnsMWLotvA== +"@commitlint/read@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-11.0.0.tgz#f24240548c63587bba139fa5a364cab926077016" + integrity sha512-37V0V91GSv0aDzMzJioKpCoZw6l0shk7+tRG8RkW1GfZzUIytdg3XqJmM+IaIYpaop0m6BbZtfq+idzUwJnw7g== dependencies: - "@commitlint/top-level" "^9.1.2" - fs-extra "^8.1.0" + "@commitlint/top-level" "^11.0.0" + fs-extra "^9.0.0" git-raw-commits "^2.0.0" -"@commitlint/resolve-extends@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-9.1.2.tgz#222dcb73b139b6645cf3ce3bd55db429a98600b3" - integrity sha512-HcoL+qFGmWEu9VM4fY0HI+VzF4yHcg3x+9Hx6pYFZ+r2wLbnKs964y0v68oyMO/mS/46MVoLNXZGR8U3adpadg== +"@commitlint/resolve-extends@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-11.0.0.tgz#158ecbe27d4a2a51d426111a01478e216fbb1036" + integrity sha512-WinU6Uv6L7HDGLqn/To13KM1CWvZ09VHZqryqxXa1OY+EvJkfU734CwnOEeNlSCK7FVLrB4kmodLJtL1dkEpXw== dependencies: import-fresh "^3.0.0" lodash "^4.17.19" resolve-from "^5.0.0" resolve-global "^1.0.0" -"@commitlint/rules@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-9.1.2.tgz#8ac33264785000f3f1c1b4a61b2450b7802835f9" - integrity sha512-1vecFuzqVqjiT57ocXq1bL8V6GEF1NZs3BR0dQzObaqHftImIxBVII299gasckTkcuxNc8M+7XxZyKxUthukpQ== +"@commitlint/rules@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-11.0.0.tgz#bdb310cc6fc55c9f8d7d917a22b69055c535c375" + integrity sha512-2hD9y9Ep5ZfoNxDDPkQadd2jJeocrwC4vJ98I0g8pNYn/W8hS9+/FuNpolREHN8PhmexXbkjrwyQrWbuC0DVaA== dependencies: - "@commitlint/ensure" "^9.1.2" - "@commitlint/message" "^9.1.2" - "@commitlint/to-lines" "^9.1.2" - "@commitlint/types" "^9.1.2" + "@commitlint/ensure" "^11.0.0" + "@commitlint/message" "^11.0.0" + "@commitlint/to-lines" "^11.0.0" + "@commitlint/types" "^11.0.0" -"@commitlint/to-lines@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-9.1.2.tgz#dd8761d17f1f7b9a52e255af4bed5bf311bf773f" - integrity sha512-o4zWcMf9EnzA3MOqx01780SgrKq5hqDJmUBPk30g6an0XcDuDy3OSZHHTJFdzsg4V9FjC4OY44sFeK7GN7NaxQ== +"@commitlint/to-lines@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-11.0.0.tgz#86dea151c10eea41e39ea96fa4de07839258a7fe" + integrity sha512-TIDTB0Y23jlCNubDROUVokbJk6860idYB5cZkLWcRS9tlb6YSoeLn1NLafPlrhhkkkZzTYnlKYzCVrBNVes1iw== -"@commitlint/top-level@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-9.1.2.tgz#fba25e30e9a014fe0426cf45908509a271990ce1" - integrity sha512-KMPP5xVePcz3B1dKqcZdU4FZBVOkT+bG3ip4RQX2TeCJoomMkTjd0utALs7rpTGLID6BXbwwXepZCZJREjR/Bw== +"@commitlint/top-level@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-11.0.0.tgz#bb2d1b6e5ed3be56874633b59e1f7de118c32783" + integrity sha512-O0nFU8o+Ws+py5pfMQIuyxOtfR/kwtr5ybqTvR+C2lUPer2x6lnQU+OnfD7hPM+A+COIUZWx10mYQvkR3MmtAA== dependencies: - find-up "^4.0.0" + find-up "^5.0.0" -"@commitlint/types@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-9.1.2.tgz#d05f66db03e3a3638a654e8badf2deb489eb220d" - integrity sha512-r3fwVbVH+M8W0qYlBBZFsUwKe6NT5qvz+EmU7sr8VeN1cQ63z+3cfXyTo7WGGEMEgKiT0jboNAK3b1FZp8k9LQ== +"@commitlint/types@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-11.0.0.tgz#719cf05fcc1abb6533610a2e0f5dd1e61eac14fe" + integrity sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ== "@compodoc/compodoc@^1.1.11": version "1.1.11" @@ -1303,10 +1303,10 @@ fs-extra "^4.0.1" viz.js "^1.8.0" -"@ctrl/ngx-codemirror@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@ctrl/ngx-codemirror/-/ngx-codemirror-4.0.0.tgz#5283fb928097d05f3b593d6388607b0763f40cfe" - integrity sha512-1C2q4pkuDHbJsvf7PSYhfa56mWuzJK94EBmxOKM47/6z5j9nX5YwrmK7m/RKjKkNqJTF+FIsss3IOj8WKPSvWQ== +"@ctrl/ngx-codemirror@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@ctrl/ngx-codemirror/-/ngx-codemirror-4.0.1.tgz#60ec32b1e736df4e96d022582e90c811a4987de1" + integrity sha512-ynleh+KLsSQgxZ6F3W2FTxyVvwC5eWDKzaK7YZ/6lA2xvfUoylxAsZtDoTqa+9OhunWVx2heSgnBPslNwrGSsw== dependencies: "@types/codemirror" "^0.0.96" tslib "^2.0.0" @@ -1326,24 +1326,24 @@ dependencies: tslib "^2.0.0" -"@fortawesome/fontawesome-common-types@^0.2.30": - version "0.2.30" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.30.tgz#2f1cc5b46bd76723be41d0013a8450c9ba92b777" - integrity sha512-TsRwpTuKwFNiPhk1UfKgw7zNPeV5RhNp2Uw3pws+9gDAkPGKrtjR1y2lI3SYn7+YzyfuNknflpBA1LRKjt7hMg== +"@fortawesome/fontawesome-common-types@^0.2.32": + version "0.2.32" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.32.tgz#3436795d5684f22742989bfa08f46f50f516f259" + integrity sha512-ux2EDjKMpcdHBVLi/eWZynnPxs0BtFVXJkgHIxXRl+9ZFaHPvYamAfCzeeQFqHRjuJtX90wVnMRaMQAAlctz3w== -"@fortawesome/fontawesome-svg-core@^1.2.30": - version "1.2.30" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.30.tgz#f56dc6791861fe5d1af04fb8abddb94658c576db" - integrity sha512-E3sAXATKCSVnT17HYmZjjbcmwihrNOCkoU7dVMlasrcwiJAHxSKeZ+4WN5O+ElgO/FaYgJmASl8p9N7/B/RttA== +"@fortawesome/fontawesome-svg-core@^1.2.32": + version "1.2.32" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.32.tgz#da092bfc7266aa274be8604de610d7115f9ba6cf" + integrity sha512-XjqyeLCsR/c/usUpdWcOdVtWFVjPbDFBTQkn2fQRrWhhUoxriQohO2RWDxLyUM8XpD+Zzg5xwJ8gqTYGDLeGaQ== dependencies: - "@fortawesome/fontawesome-common-types" "^0.2.30" + "@fortawesome/fontawesome-common-types" "^0.2.32" -"@fortawesome/free-solid-svg-icons@^5.14.0": - version "5.14.0" - resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.14.0.tgz#970453f5e8c4915ad57856c3a0252ac63f6fec18" - integrity sha512-M933RDM8cecaKMWDSk3FRYdnzWGW7kBBlGNGfvqLVwcwhUPNj9gcw+xZMrqBdRqxnSXdl3zWzTCNNGEtFUq67Q== +"@fortawesome/free-solid-svg-icons@^5.15.1": + version "5.15.1" + resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.1.tgz#e1432676ddd43108b41197fee9f86d910ad458ef" + integrity sha512-EFMuKtzRMNbvjab/SvJBaOOpaqJfdSap/Nl6hst7CgrJxwfORR1drdTV6q1Ib/JVzq4xObdTDcT6sqTaXMqfdg== dependencies: - "@fortawesome/fontawesome-common-types" "^0.2.30" + "@fortawesome/fontawesome-common-types" "^0.2.32" "@istanbuljs/schema@^0.1.2": version "0.1.2" @@ -1459,226 +1459,221 @@ resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== -"@types/d3-array@*": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-2.0.0.tgz#a0d63a296a2d8435a9ec59393dcac746c6174a96" - integrity sha512-rGqfPVowNDTszSFvwoZIXvrPG7s/qKzm9piCRIH6xwTTRu7pPZ3ootULFnPkTt74B6i5lN0FpLQL24qGOw1uZA== - "@types/d3-array@^1": version "1.2.7" resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-1.2.7.tgz#34dc654d34fc058c41c31dbca1ed68071a8fcc17" integrity sha512-51vHWuUyDOi+8XuwPrTw3cFqyh2Slg9y8COYkRfjCPG9TfYqY0hoNPzv/8BrcAy0FeQBzqEo/D/8Nk2caOQJnA== -"@types/d3-axis@*": - version "1.0.12" - resolved "https://registry.yarnpkg.com/@types/d3-axis/-/d3-axis-1.0.12.tgz#8c124edfcc02f3b3a9cdaa2a28b8a20341401799" - integrity sha512-BZISgSD5M8TgURyNtcPAmUB9sk490CO1Thb6/gIn0WZTt3Y50IssX+2Z0vTccoqZksUDTep0b+o4ofXslvNbqg== +"@types/d3-axis@^1": + version "1.0.14" + resolved "https://registry.yarnpkg.com/@types/d3-axis/-/d3-axis-1.0.14.tgz#4ff27eb94fab10efbda6c972e1fbb26ea696655b" + integrity sha512-wZAKX/dtFT5t5iuCaiU0QL0BWB19TE6h7C7kgfBVyoka7zidQWvf8E9zQTJ5bNPBQxd0+JmplNqwy1M8O8FOjA== dependencies: - "@types/d3-selection" "*" + "@types/d3-selection" "^1" -"@types/d3-brush@*": - version "1.0.10" - resolved "https://registry.yarnpkg.com/@types/d3-brush/-/d3-brush-1.0.10.tgz#aa9b5545d816c29d19cff20118f236713af8e9fb" - integrity sha512-J8jREATIrfJaAfhJivqaEKPnJsRlwwrOPje+ABqZFgamADjll+q9zaDXnYyjiGPPsiJEU+Qq9jQi5rECxIOfhg== +"@types/d3-brush@^1": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@types/d3-brush/-/d3-brush-1.1.4.tgz#0b5cc9c57476d0144b991228b44664e08494b7f3" + integrity sha512-2t8CgWaha9PsPdSZJ9m6Jl4awqf3DGIXek2e7gfheyfP2R0a/18MX+wuLHx+LyI1Ad7lxDsPWcswKD0XhQEjmg== dependencies: - "@types/d3-selection" "*" + "@types/d3-selection" "^1" -"@types/d3-chord@*": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@types/d3-chord/-/d3-chord-1.0.9.tgz#ccc5de03ff079025491b7aa6b750670a140b45ae" - integrity sha512-UA6lI9CVW5cT5Ku/RV4hxoFn4mKySHm7HEgodtfRthAj1lt9rKZEPon58vyYfk+HIAm33DtJJgZwMXy2QgyPXw== +"@types/d3-chord@^1": + version "1.0.10" + resolved "https://registry.yarnpkg.com/@types/d3-chord/-/d3-chord-1.0.10.tgz#4c14ca40f61b89a3c615d63f5a34fcc81390805c" + integrity sha512-U6YojfET6ITL1/bUJo+/Lh3pMV9XPAfOWwbshl3y3RlgAX9VO/Bxa13IMAylZIDY4VsA3Gkh29kZP1AcAeyoYA== "@types/d3-collection@*": version "1.0.8" resolved "https://registry.yarnpkg.com/@types/d3-collection/-/d3-collection-1.0.8.tgz#aa9552c570a96e33c132e0fd20e331f64baa9dd5" integrity sha512-y5lGlazdc0HNO0F3UUX2DPE7OmYvd9Kcym4hXwrJcNUkDaypR5pX+apuMikl9LfTxKItJsY9KYvzBulpCKyvuQ== -"@types/d3-color@*": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-1.2.2.tgz#80cf7cfff7401587b8f89307ba36fe4a576bc7cf" - integrity sha512-6pBxzJ8ZP3dYEQ4YjQ+NVbQaOflfgXq/JbDiS99oLobM2o72uAST4q6yPxHv6FOTCRC/n35ktuo8pvw/S4M7sw== +"@types/d3-color@^1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-1.4.1.tgz#0d9746c84dfef28807b2989eed4f37b2575e1f33" + integrity sha512-xkPLi+gbgUU9ED6QX4g6jqYL2KCB0/3AlM+ncMGqn49OgH0gFMY/ITGqPF8HwEiLzJaC+2L0I+gNwBgABv1Pvg== -"@types/d3-contour@*": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@types/d3-contour/-/d3-contour-1.3.0.tgz#1a408b121fa5e341f715e3055303ef3079fc7eb0" - integrity sha512-AUCUIjEnC5lCGBM9hS+MryRaFLIrPls4Rbv6ktqbd+TK/RXZPwOy9rtBWmGpbeXcSOYCJTUDwNJuEnmYPJRxHQ== +"@types/d3-contour@^1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@types/d3-contour/-/d3-contour-1.3.1.tgz#589dc3eec14168eea7e31edd1e3bbe246cc9d626" + integrity sha512-wWwsM/3NfKTRBdH00cSf+XlsaHlNTkvH66PgDedobyvKQZ4sJrXXpr16LXvDnAal4B67v8JGrWDgyx6dqqKLuQ== dependencies: - "@types/d3-array" "*" + "@types/d3-array" "^1" "@types/geojson" "*" -"@types/d3-dispatch@*": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@types/d3-dispatch/-/d3-dispatch-1.0.7.tgz#6721aefbb9862ce78c20a87a1490c21f57c3ed7f" - integrity sha512-M+z84G7UKwK6hEPnGCSccOg8zJ3Nk2hgDQ9sCstHXgsFU0sMxlIZVKqKB5oxUDbALqQG6ucg0G9e8cmOSlishg== +"@types/d3-dispatch@^1": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@types/d3-dispatch/-/d3-dispatch-1.0.9.tgz#c5a180f1e251de853b399cfbfbb6dd7f8bf842ae" + integrity sha512-zJ44YgjqALmyps+II7b1mZLhrtfV/FOxw9owT87mrweGWcg+WK5oiJX2M3SYJ0XUAExBduarysfgbR11YxzojQ== -"@types/d3-drag@*": - version "1.2.3" - resolved "https://registry.yarnpkg.com/@types/d3-drag/-/d3-drag-1.2.3.tgz#d8ddccca28e939e9c689bea6f40a937e48c39051" - integrity sha512-rWB5SPvkYVxW3sqUxHOJUZwifD0KqvKwvt1bhNqcLpW6Azsd0BJgRNcyVW8GAferaAk5r8dzeZnf9zKlg9+xMQ== +"@types/d3-drag@^1": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/d3-drag/-/d3-drag-1.2.5.tgz#0b1b852cb41577075aa625ae6149379ea6c34dfd" + integrity sha512-7NeTnfolst1Js3Vs7myctBkmJWu6DMI3k597AaHUX98saHjHWJ6vouT83UrpE+xfbSceHV+8A0JgxuwgqgmqWw== dependencies: - "@types/d3-selection" "*" + "@types/d3-selection" "^1" -"@types/d3-dsv@*": - version "1.0.36" - resolved "https://registry.yarnpkg.com/@types/d3-dsv/-/d3-dsv-1.0.36.tgz#e91129d7c02b1b814838d001e921e8b9a67153d0" - integrity sha512-jbIWQ27QJcBNMZbQv0NSQMHnBDCmxghAxePxgyiPH1XPCRkOsTBei7jcdi3fDrUCGpCV3lKrSZFSlOkhUQVClA== +"@types/d3-dsv@^1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@types/d3-dsv/-/d3-dsv-1.2.1.tgz#1524fee9f19d689c2f76aa0e24e230762bf96994" + integrity sha512-LLmJmjiqp/fTNEdij5bIwUJ6P6TVNk5hKM9/uk5RPO2YNgEu9XvKO0dJ7Iqd3psEdmZN1m7gB1bOsjr4HmO2BA== -"@types/d3-ease@*": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-1.0.9.tgz#1dd849bd7edef6426e915e220ed9970db5ea4e04" - integrity sha512-U5ADevQ+W6fy32FVZZC9EXallcV/Mi12A5Tkd0My5MrC7T8soMQEhlDAg88XUWm0zoCQlB4XV0en/24LvuDB4Q== +"@types/d3-ease@^1": + version "1.0.10" + resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-1.0.10.tgz#09910e8558439b6038a7ed620650e510394ffa6d" + integrity sha512-fMFTCzd8DOwruE9zlu2O8ci5ct+U5jkGcDS+cH+HCidnJlDs0MZ+TuSVCFtEzh4E5MasItwy+HvgoFtxPHa5Cw== -"@types/d3-fetch@*": - version "1.1.5" - resolved "https://registry.yarnpkg.com/@types/d3-fetch/-/d3-fetch-1.1.5.tgz#51601f79dd4653b5d84e6a3176d78145e065db5e" - integrity sha512-o9c0ItT5/Gl3wbNuVpzRnYX1t3RghzeWAjHUVLuyZJudiTxC4f/fC0ZPFWLQ2lVY8pAMmxpV8TJ6ETYCgPeI3A== +"@types/d3-fetch@^1": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@types/d3-fetch/-/d3-fetch-1.2.2.tgz#b93bfe248b8b761af82f4dac57959c989f67da3e" + integrity sha512-rtFs92GugtV/NpiJQd0WsmGLcg52tIL0uF0bKbbJg231pR9JEb6HT4AUwrtuLq3lOeKdLBhsjV14qb0pMmd0Aw== dependencies: - "@types/d3-dsv" "*" + "@types/d3-dsv" "^1" -"@types/d3-force@*": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@types/d3-force/-/d3-force-1.2.1.tgz#c28803ea36fe29788db69efa0ad6c2dc09544e83" - integrity sha512-jqK+I36uz4kTBjyk39meed5y31Ab+tXYN/x1dn3nZEus9yOHCLc+VrcIYLc/aSQ0Y7tMPRlIhLetulME76EiiA== +"@types/d3-force@^1": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@types/d3-force/-/d3-force-1.2.2.tgz#6337a146dbdf2781f5dde5bb491a646fd03d7bc4" + integrity sha512-TN7KO7sk0tJauedIt0q20RQRFo4V3v97pJKO/TDK40X3LaPM1aXRM2+zFF+nRMtseEiszg4KffudhjR8a3+4cg== -"@types/d3-format@*": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@types/d3-format/-/d3-format-1.3.1.tgz#35bf88264bd6bcda39251165bb827f67879c4384" - integrity sha512-KAWvReOKMDreaAwOjdfQMm0HjcUMlQG47GwqdVKgmm20vTd2pucj0a70c3gUSHrnsmo6H2AMrkBsZU2UhJLq8A== +"@types/d3-format@^1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@types/d3-format/-/d3-format-1.4.1.tgz#1e657a219e4b1e3931508a610d570bdec8ecdd9d" + integrity sha512-ss9G2snEKmp2In5Z3T0Jpqv8QaDBc2xHltBw83KjnV5B5w+Iwphbvq5ph/Xnu4d03fmmsdt+o1aWch379rxIbA== -"@types/d3-geo@*": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@types/d3-geo/-/d3-geo-1.11.1.tgz#e96ec91f16221d87507fec66b2cc889f52d2493e" - integrity sha512-Ox8WWOG3igDRoep/dNsGbOiSJYdUG3ew/6z0ETvHyAtXZVBjOE0S96zSSmzgl0gqQ3RdZjn2eeJOj9oRcMZPkQ== +"@types/d3-geo@^1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@types/d3-geo/-/d3-geo-1.12.1.tgz#bec8692ffee9f60e18483af9008f92d4a8428118" + integrity sha512-8+gyGFyMCXIHtnMNKQDT++tZ4XYFXgiP5NK7mcv34aYXA16GQFiBBITjKzxghpO8QNVceOd9rUn1JY92WLNGQw== dependencies: "@types/geojson" "*" -"@types/d3-hierarchy@*": - version "1.1.6" - resolved "https://registry.yarnpkg.com/@types/d3-hierarchy/-/d3-hierarchy-1.1.6.tgz#4c017521900813ea524c9ecb8d7985ec26a9ad9a" - integrity sha512-vvSaIDf/Ov0o3KwMT+1M8+WbnnlRiGjlGD5uvk83a1mPCTd/E5x12bUJ/oP55+wUY/4Kb5kc67rVpVGJ2KUHxg== +"@types/d3-hierarchy@^1": + version "1.1.7" + resolved "https://registry.yarnpkg.com/@types/d3-hierarchy/-/d3-hierarchy-1.1.7.tgz#14a57b0539f8929015f8ad96490de50a16211040" + integrity sha512-fvht6DOYKzqmXjMb/+xfgkmrWM4SD7rMA/ZbM+gGwr9ZTuIDfky95J8CARtaJo/ExeWyS0xGVdL2gqno2zrQ0Q== -"@types/d3-interpolate@*": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-1.3.1.tgz#1c280511f622de9b0b47d463fa55f9a4fd6f5fc8" - integrity sha512-z8Zmi08XVwe8e62vP6wcA+CNuRhpuUU5XPEfqpG0hRypDE5BWNthQHB1UNWWDB7ojCbGaN4qBdsWp5kWxhT1IQ== +"@types/d3-interpolate@^1": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-1.4.2.tgz#88902a205f682773a517612299a44699285eed7b" + integrity sha512-ylycts6llFf8yAEs1tXzx2loxxzDZHseuhPokrqKprTQSTcD3JbJI1omZP1rphsELZO3Q+of3ff0ZS7+O6yVzg== dependencies: - "@types/d3-color" "*" + "@types/d3-color" "^1" -"@types/d3-path@*": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-1.0.8.tgz#48e6945a8ff43ee0a1ce85c8cfa2337de85c7c79" - integrity sha512-AZGHWslq/oApTAHu9+yH/Bnk63y9oFOMROtqPAtxl5uB6qm1x2lueWdVEjsjjV3Qc2+QfuzKIwIR5MvVBakfzA== +"@types/d3-path@^1": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-1.0.9.tgz#73526b150d14cd96e701597cbf346cfd1fd4a58c" + integrity sha512-NaIeSIBiFgSC6IGUBjZWcscUJEq7vpVu7KthHN8eieTV9d9MqkSOZLH4chq1PmcKy06PNe3axLeKmRIyxJ+PZQ== -"@types/d3-polygon@*": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@types/d3-polygon/-/d3-polygon-1.0.7.tgz#7b3947aa2d48287ff535230d3d396668ab17bfdf" - integrity sha512-Xuw0eSjQQKs8jTiNbntWH0S+Xp+JyhqxmQ0YAQ3rDu6c3kKMFfgsaGN7Jv5u3zG6yVX/AsLP/Xs/QRjmi9g43Q== +"@types/d3-polygon@^1": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/d3-polygon/-/d3-polygon-1.0.8.tgz#127ee83fccda5bf57384011da90f31367fea1530" + integrity sha512-1TOJPXCBJC9V3+K3tGbTqD/CsqLyv/YkTXAcwdsZzxqw5cvpdnCuDl42M4Dvi8XzMxZNCT9pL4ibrK2n4VmAcw== -"@types/d3-quadtree@*": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@types/d3-quadtree/-/d3-quadtree-1.0.7.tgz#8e29464ff5b326f6612c1428d9362b4b35de2b70" - integrity sha512-0ajFawWicfjsaCLh6NzxOyVDYhQAmMFbsiI3MPGLInorauHFEh9/Cl6UHNf+kt/J1jfoxKY/ZJaKAoDpbvde5Q== +"@types/d3-quadtree@^1": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/d3-quadtree/-/d3-quadtree-1.0.8.tgz#980998eb20d5e1c1494089ad9a8466a0e98825a7" + integrity sha512-FuqYiexeSQZlc+IcGAVK8jSJKDFKHcSf/jx8rqJUUVx6rzv7ecQiXKyatrLHHh3W4CAvgNeVI23JKgk4+x2wFg== -"@types/d3-random@*": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@types/d3-random/-/d3-random-1.1.2.tgz#6f77e8b7bb64ac393f92d33fe8f71038bc4f3cde" - integrity sha512-Jui+Zn28pQw/3EayPKaN4c/PqTvqNbIPjHkgIIFnxne1FdwNjfHtAIsZIBMKlquQNrrMjFzCrlF2gPs3xckqaA== +"@types/d3-random@^1": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@types/d3-random/-/d3-random-1.1.3.tgz#8f7fdc23f92d1561e0694eb49567e8ab50537a19" + integrity sha512-XXR+ZbFCoOd4peXSMYJzwk0/elP37WWAzS/DG+90eilzVbUSsgKhBcWqylGWe+lA2ubgr7afWAOBaBxRgMUrBQ== -"@types/d3-scale-chromatic@*": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-1.3.1.tgz#a294ae688634027870f0307bf8802f863aa2ddb3" - integrity sha512-Ny3rLbV5tnmqgW7w/poCcef4kXP8mHPo/p8EjTS5d9OUk8MlqAeRaM8eF7Vyv7QMLiIXNE94Pa1cMLSPkXQBoQ== +"@types/d3-scale-chromatic@^1": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-1.5.1.tgz#e2b7c3401e5c13809f831911eb820e444f4fc67a" + integrity sha512-7FtJYrmXTEWLykShjYhoGuDNR/Bda0+tstZMkFj4RRxUEryv16AGh3be21tqg84B6KfEwiZyEpBcTyPyU+GWjg== -"@types/d3-scale@*": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-2.1.1.tgz#405e58771ec6ae7b8f7b4178ee1887620759e8f7" - integrity sha512-kNTkbZQ+N/Ip8oX9PByXfDLoCSaZYm+VUOasbmsa6KD850/ziMdYepg/8kLg2plHzoLANdMqPoYQbvExevLUHg== +"@types/d3-scale@^2": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-2.2.4.tgz#ca0d4b84d2f88fe058480f81354d14041a667b96" + integrity sha512-wkQXT+IfgfAnKB5rtS1qMJg3FS32r1rVFHvqtiqk8pX8o5aQR3VwX1P7ErHjzNIicTlkWsaMiUTrYB+E75HFeA== dependencies: - "@types/d3-time" "*" + "@types/d3-time" "^1" -"@types/d3-selection@*": - version "1.4.1" - resolved "https://registry.yarnpkg.com/@types/d3-selection/-/d3-selection-1.4.1.tgz#fa1f8710a6b5d7cfe5c6caa61d161be7cae4a022" - integrity sha512-bv8IfFYo/xG6dxri9OwDnK3yCagYPeRIjTlrcdYJSx+FDWlCeBDepIHUpqROmhPtZ53jyna0aUajZRk0I3rXNA== +"@types/d3-selection@^1": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@types/d3-selection/-/d3-selection-1.4.3.tgz#36928bbe64eb8e0bbcbaa01fb05c21ff6c71fa93" + integrity sha512-GjKQWVZO6Sa96HiKO6R93VBE8DUW+DDkFpIMf9vpY5S78qZTlRRSNUsHr/afDpF7TvLDV7VxrUFOWW7vdIlYkA== -"@types/d3-shape@*": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-1.3.2.tgz#a41d9d6b10d02e221696b240caf0b5d0f5a588ec" - integrity sha512-LtD8EaNYCaBRzHzaAiIPrfcL3DdIysc81dkGlQvv7WQP3+YXV7b0JJTtR1U3bzeRieS603KF4wUo+ZkJVenh8w== +"@types/d3-shape@^1": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-1.3.4.tgz#5a6d8c3026ba8e8a1a985bda8da40acfc9b7b079" + integrity sha512-fxmOjs+UqNQGpztD5BOo+KriE0jLFrBP4Ct++0QExv/xfDOT1cpcMxgsZ+5qPmnR0t+GjbwAe1Um1PHpv3G4oA== dependencies: - "@types/d3-path" "*" + "@types/d3-path" "^1" -"@types/d3-time-format@*": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@types/d3-time-format/-/d3-time-format-2.1.1.tgz#dd2c79ec4575f1355484ab6b10407824668eba42" - integrity sha512-tJSyXta8ZyJ52wDDHA96JEsvkbL6jl7wowGmuf45+fAkj5Y+SQOnz0N7/H68OWmPshPsAaWMQh+GAws44IzH3g== +"@types/d3-time-format@^2": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@types/d3-time-format/-/d3-time-format-2.3.1.tgz#87a30e4513b9d1d53b920327a361f87255bf3372" + integrity sha512-fck0Z9RGfIQn3GJIEKVrp15h9m6Vlg0d5XXeiE/6+CQiBmMDZxfR21XtjEPuDeg7gC3bBM0SdieA5XF3GW1wKA== -"@types/d3-time@*": - version "1.0.10" - resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-1.0.10.tgz#d338c7feac93a98a32aac875d1100f92c7b61f4f" - integrity sha512-aKf62rRQafDQmSiv1NylKhIMmznsjRN+MnXRXTqHoqm0U/UZzVpdrtRnSIfdiLS616OuC1soYeX1dBg2n1u8Xw== +"@types/d3-time@^1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-1.1.1.tgz#6cf3a4242c3bbac00440dfb8ba7884f16bedfcbf" + integrity sha512-ULX7LoqXTCYtM+tLYOaeAJK7IwCT+4Gxlm2MaH0ErKLi07R5lh8NHCAyWcDkCCmx1AfRcBEV6H9QE9R25uP7jw== -"@types/d3-timer@*": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-1.0.9.tgz#aed1bde0cf18920d33f5d44839d73de393633fd3" - integrity sha512-WvfJ3LFxBbWjqRGz9n7GJt08RrTHPJDVsIwwoCMROlqF+iDacYiAFjf9oqnq0mXpb2juA2N/qjKP+MKdal3YNQ== +"@types/d3-timer@^1": + version "1.0.10" + resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-1.0.10.tgz#329c51c2c931f44ed0acff78b8c84571acf0ed21" + integrity sha512-ZnAbquVqy+4ZjdW0cY6URp+qF/AzTVNda2jYyOzpR2cPT35FTXl78s15Bomph9+ckOiI1TtkljnWkwbIGAb6rg== -"@types/d3-transition@*": - version "1.1.6" - resolved "https://registry.yarnpkg.com/@types/d3-transition/-/d3-transition-1.1.6.tgz#7e52da29749d874866cc803fad13925713a372da" - integrity sha512-/F+O2r4oz4G9ATIH3cuSCMGphAnl7VDx7SbENEK0NlI/FE8Jx2oiIrv0uTrpg7yF/AmuWbqp7AGdEHAPIh24Gg== +"@types/d3-transition@^1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@types/d3-transition/-/d3-transition-1.3.1.tgz#5d658eea2db17684daa04eda81d7db9824d3463f" + integrity sha512-U9CpMlTL/NlqdGXBlHYxTZwbmy/vN1cFv8TuAIFPX+xOW/1iChbeJBY2xmINhDQfkGJbgkH4IovafCwI1ZDrgg== dependencies: - "@types/d3-selection" "*" + "@types/d3-selection" "^1" "@types/d3-voronoi@*": version "1.1.9" resolved "https://registry.yarnpkg.com/@types/d3-voronoi/-/d3-voronoi-1.1.9.tgz#7bbc210818a3a5c5e0bafb051420df206617c9e5" integrity sha512-DExNQkaHd1F3dFPvGA/Aw2NGyjMln6E9QzsiqOcBgnE+VInYnFBHBBySbZQts6z6xD+5jTfKCP7M4OqMyVjdwQ== -"@types/d3-zoom@*": - version "1.7.4" - resolved "https://registry.yarnpkg.com/@types/d3-zoom/-/d3-zoom-1.7.4.tgz#9226ffd2bd3846ec0e4a4e2bff211612d3aafad5" - integrity sha512-5jnFo/itYhJeB2khO/lKe730kW/h2EbKMOvY0uNp3+7NdPm4w63DwPEMxifQZ7n902xGYK5DdU67FmToSoy4VA== +"@types/d3-zoom@^1": + version "1.8.2" + resolved "https://registry.yarnpkg.com/@types/d3-zoom/-/d3-zoom-1.8.2.tgz#187d33f9ffa59811ce93b2eacd32d92c1ef03f16" + integrity sha512-rU0LirorUxkLxEHSzkFs7pPC0KWsxRGc0sHrxEDR0/iQq+7/xpNkKuuOOwthlgvOtpOvtTLJ2JFOD6Kr0Si4Uw== dependencies: - "@types/d3-interpolate" "*" - "@types/d3-selection" "*" + "@types/d3-interpolate" "^1" + "@types/d3-selection" "^1" -"@types/d3@^5.7.2": - version "5.7.2" - resolved "https://registry.yarnpkg.com/@types/d3/-/d3-5.7.2.tgz#52235eb71a1d3ca171d6dca52a58f5ccbe0254cc" - integrity sha512-7/wClB8ycneWGy3jdvLfXKTd5SoTg9hji7IdJ0RuO9xTY54YpJ8zlcFADcXhY1J3kCBwxp+/1jeN6a5OMwgYOw== +"@types/d3@^5.16.3": + version "5.16.3" + resolved "https://registry.yarnpkg.com/@types/d3/-/d3-5.16.3.tgz#265d506a1b61f558084f2c660f8dd2c93a6d16c8" + integrity sha512-s3wrhYhu25XZQ5p1hI9gEMSX5bx7lg9hAmi0+i5r3v75Gz1zRTgB2Q0psx+SO+4K0AO/PPJ1pnHCz64pANN/4w== dependencies: "@types/d3-array" "^1" - "@types/d3-axis" "*" - "@types/d3-brush" "*" - "@types/d3-chord" "*" + "@types/d3-axis" "^1" + "@types/d3-brush" "^1" + "@types/d3-chord" "^1" "@types/d3-collection" "*" - "@types/d3-color" "*" - "@types/d3-contour" "*" - "@types/d3-dispatch" "*" - "@types/d3-drag" "*" - "@types/d3-dsv" "*" - "@types/d3-ease" "*" - "@types/d3-fetch" "*" - "@types/d3-force" "*" - "@types/d3-format" "*" - "@types/d3-geo" "*" - "@types/d3-hierarchy" "*" - "@types/d3-interpolate" "*" - "@types/d3-path" "*" - "@types/d3-polygon" "*" - "@types/d3-quadtree" "*" - "@types/d3-random" "*" - "@types/d3-scale" "*" - "@types/d3-scale-chromatic" "*" - "@types/d3-selection" "*" - "@types/d3-shape" "*" - "@types/d3-time" "*" - "@types/d3-time-format" "*" - "@types/d3-timer" "*" - "@types/d3-transition" "*" + "@types/d3-color" "^1" + "@types/d3-contour" "^1" + "@types/d3-dispatch" "^1" + "@types/d3-drag" "^1" + "@types/d3-dsv" "^1" + "@types/d3-ease" "^1" + "@types/d3-fetch" "^1" + "@types/d3-force" "^1" + "@types/d3-format" "^1" + "@types/d3-geo" "^1" + "@types/d3-hierarchy" "^1" + "@types/d3-interpolate" "^1" + "@types/d3-path" "^1" + "@types/d3-polygon" "^1" + "@types/d3-quadtree" "^1" + "@types/d3-random" "^1" + "@types/d3-scale" "^2" + "@types/d3-scale-chromatic" "^1" + "@types/d3-selection" "^1" + "@types/d3-shape" "^1" + "@types/d3-time" "^1" + "@types/d3-time-format" "^2" + "@types/d3-timer" "^1" + "@types/d3-transition" "^1" "@types/d3-voronoi" "*" - "@types/d3-zoom" "*" + "@types/d3-zoom" "^1" "@types/estree@*": version "0.0.42" @@ -1741,10 +1736,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.6.8.tgz#e469b4bf9d1c9832aee4907ba8a051494357c12c" integrity sha512-aX+gFgA5GHcDi89KG5keey2zf0WfZk/HAQotEamsK2kbey+8yGKcson0hbK8E+v0NArlCJQCqMP161YhV6ZXLg== -"@types/node@^14.6.1": - version "14.6.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.6.1.tgz#fdf6f6c6c73d3d8eee9c98a9a0485bc524b048d7" - integrity sha512-HnYlg/BRF8uC1FyKRFZwRaCPTPYKa+6I8QiUZFLredaGOou481cgFS4wKRFyKvQtX8xudqkSdBczJHIYSQYKrQ== +"@types/node@^14.11.5": + version "14.11.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.11.5.tgz#fecad41c041cae7f2404ad4b2d0742fdb628b305" + integrity sha512-jVFzDV6NTbrLMxm4xDSIW/gKnk8rQLF9wAzLWIOg+5nU6ACrIMndeBdXci0FGtqJbP9tQvm6V39eshc96TO2wQ== "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -2507,6 +2502,11 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + atob@^2.1.1, atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" @@ -4143,10 +4143,10 @@ codelyzer@^6.0.0: tslib "^1.10.0" zone.js "~0.10.3" -codemirror@^5.57.0: - version "5.57.0" - resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.57.0.tgz#d26365b72f909f5d2dbb6b1209349ca1daeb2d50" - integrity sha512-WGc6UL7Hqt+8a6ZAsj/f1ApQl3NPvHY/UQSzG6fB6l4BjExgVdhFaxd7mRTw1UCiYe/6q86zHP+kfvBQcZGvUg== +codemirror@^5.58.1: + version "5.58.1" + resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.58.1.tgz#ec6bf38ad2a17f74c61bd00cc6dc5a69bd167854" + integrity sha512-UGb/ueu20U4xqWk8hZB3xIfV2/SFqnSLYONiM3wTMDqko0bsYrsAkGGhqUzbRkYm89aBKPyHtuNEbVWF9FTFzw== collection-visit@^1.0.0: version "1.0.0" @@ -4532,20 +4532,7 @@ conventional-commits-filter@^2.0.6: lodash.ismatch "^4.4.0" modify-values "^1.0.0" -conventional-commits-parser@^3.0.0: - version "3.0.8" - resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.0.8.tgz#23310a9bda6c93c874224375e72b09fb275fe710" - integrity sha512-YcBSGkZbYp7d+Cr3NWUeXbPDFUN6g3SaSIzOybi8bjHL5IJ5225OSCxJJ4LgziyEJ7AaJtE9L2/EU6H7Nt/DDQ== - dependencies: - JSONStream "^1.0.4" - is-text-path "^1.0.1" - lodash "^4.17.15" - meow "^5.0.0" - split2 "^2.0.0" - through2 "^3.0.0" - trim-off-newlines "^1.0.0" - -conventional-commits-parser@^3.1.0: +conventional-commits-parser@^3.0.0, conventional-commits-parser@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.1.0.tgz#10140673d5e7ef5572633791456c5d03b69e8be4" integrity sha512-RSo5S0WIwXZiRxUGTPuYFbqvrR4vpJ1BDdTlthFgvHt5kEdnd1+pdvwWphWn57/oIl4V72NMmOocFqqJ8mFFhA== @@ -4686,17 +4673,6 @@ cosmiconfig@^5.0.0, cosmiconfig@^5.2.1: js-yaml "^3.13.1" parse-json "^4.0.0" -cosmiconfig@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" - integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.7.2" - cosmiconfig@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" @@ -5026,33 +5002,28 @@ cyclist@^1.0.1: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= -d3-color@1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.4.1.tgz#c52002bf8846ada4424d55d97982fef26eb3bc8a" - integrity sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q== - -d3-dispatch@1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.6.tgz#00d37bcee4dd8cd97729dd893a0ac29caaba5d58" - integrity sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA== +"d3-color@1 - 2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-2.0.0.tgz#8d625cab42ed9b8f601a1760a389f7ea9189d62e" + integrity sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ== "d3-dispatch@1 - 2": version "2.0.0" resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-2.0.0.tgz#8a18e16f76dd3fcaef42163c97b926aa9b55e7cf" integrity sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA== -d3-drag@1, d3-drag@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-1.2.5.tgz#2537f451acd39d31406677b7dc77c82f7d988f70" - integrity sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w== +d3-drag@2, d3-drag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-2.0.0.tgz#9eaf046ce9ed1c25c88661911c1d5a4d8eb7ea6d" + integrity sha512-g9y9WbMnF5uqB9qKqwIIa/921RYWzlUDv9Jl1/yONQwxbOfszAWTCm8u7HOTgJgRDXiRZN56cHT9pd24dmXs8w== dependencies: - d3-dispatch "1" - d3-selection "1" + d3-dispatch "1 - 2" + d3-selection "2" -d3-ease@1: - version "1.0.7" - resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.7.tgz#9a834890ef8b8ae8c558b2fe55bd57f5993b85e2" - integrity sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ== +"d3-ease@1 - 2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-2.0.0.tgz#fd1762bfca00dae4bacea504b1d628ff290ac563" + integrity sha512-68/n9JWarxXkOWMshcT5IcjbB+agblQUaIsbnXmrzejn2O82n3p2A9R2zEB9HIEFWKFwPAEDDN8gR0VdSAyyAQ== d3-force@^2.0.1: version "2.1.1" @@ -5063,55 +5034,54 @@ d3-force@^2.0.1: d3-quadtree "1 - 2" d3-timer "1 - 2" -d3-interpolate@1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz#526e79e2d80daa383f9e0c1c1c7dcc0f0583e987" - integrity sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA== +"d3-interpolate@1 - 2": + version "2.0.1" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-2.0.1.tgz#98be499cfb8a3b94d4ff616900501a64abc91163" + integrity sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ== dependencies: - d3-color "1" + d3-color "1 - 2" "d3-quadtree@1 - 2": version "2.0.0" resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-2.0.0.tgz#edbad045cef88701f6fee3aee8e93fb332d30f9d" integrity sha512-b0Ed2t1UUalJpc3qXzKi+cPGxeXRr4KU9YSlocN74aTzp6R/Ud43t79yLLqxHRWZfsvWXmbDWPpoENK1K539xw== -d3-selection@1, d3-selection@^1.1.0, d3-selection@^1.4.2: +d3-selection@2: + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-2.0.0.tgz#94a11638ea2141b7565f883780dabc7ef6a61066" + integrity sha512-XoGGqhLUN/W14NmaqcO/bb1nqjDAw5WtSYb2X8wiuQWvSZUsUVYsOSkOybUrNvcBjaywBdYPy03eXHMXjk9nZA== + +d3-selection@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.4.2.tgz#dcaa49522c0dbf32d6c1858afc26b6094555bc5c" integrity sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg== -d3-timer@1: - version "1.0.10" - resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5" - integrity sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw== - "d3-timer@1 - 2": version "2.0.0" resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-2.0.0.tgz#055edb1d170cfe31ab2da8968deee940b56623e6" integrity sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA== -d3-transition@1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-1.3.2.tgz#a98ef2151be8d8600543434c1ca80140ae23b398" - integrity sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA== - dependencies: - d3-color "1" - d3-dispatch "1" - d3-ease "1" - d3-interpolate "1" - d3-selection "^1.1.0" - d3-timer "1" - -d3-zoom@^1.8.3: - version "1.8.3" - resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-1.8.3.tgz#b6a3dbe738c7763121cd05b8a7795ffe17f4fc0a" - integrity sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ== - dependencies: - d3-dispatch "1" - d3-drag "1" - d3-interpolate "1" - d3-selection "1" - d3-transition "1" +d3-transition@2: + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-2.0.0.tgz#366ef70c22ef88d1e34105f507516991a291c94c" + integrity sha512-42ltAGgJesfQE3u9LuuBHNbGrI/AJjNL2OAUdclE70UE6Vy239GCBEYD38uBPoLeNsOhFStGpPI0BAOV+HMxog== + dependencies: + d3-color "1 - 2" + d3-dispatch "1 - 2" + d3-ease "1 - 2" + d3-interpolate "1 - 2" + d3-timer "1 - 2" + +d3-zoom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-2.0.0.tgz#f04d0afd05518becce879d04709c47ecd93fba54" + integrity sha512-fFg7aoaEm9/jf+qfstak0IYpnesZLiMX6GZvXtUSdv8RH2o4E2qeelgdU09eKS6wGuiGMfcnMI0nTIqWzRHGpw== + dependencies: + d3-dispatch "1 - 2" + d3-drag "2" + d3-interpolate "1 - 2" + d3-selection "2" + d3-transition "2" d@1, d@^1.0.1: version "1.0.1" @@ -5133,6 +5103,11 @@ dargs@^4.0.1: dependencies: number-is-nan "^1.0.0" +dargs@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" + integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -6450,6 +6425,14 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + find-versions@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-3.2.0.tgz#10297f98030a786829681690545ef659ed1d254e" @@ -6608,6 +6591,16 @@ fs-extra@^8.0.1, fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" + integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^1.0.0" + fs-minipass@^1.2.5: version "1.2.6" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.6.tgz#2c5cc30ded81282bfe8a0d7c7c1853ddeb102c07" @@ -6724,10 +6717,10 @@ get-pkg-repo@^1.0.0: parse-github-repo-url "^1.3.0" through2 "^2.0.0" -get-stdin@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-7.0.0.tgz#8d5de98f15171a125c5e516643c7a6d0ea8a96f6" - integrity sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ== +get-stdin@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" + integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== get-stdin@^4.0.1: version "4.0.1" @@ -6784,13 +6777,13 @@ git-raw-commits@2.0.0: through2 "^2.0.0" git-raw-commits@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.3.tgz#f040e67b8445962d4d168903a9e84c4240c17655" - integrity sha512-SoSsFL5lnixVzctGEi2uykjA7B5I0AhO9x6kdzvGRHbxsa6JSEgrgy1esRKsfOKE1cgyOJ/KDR2Trxu157sb8w== + version "2.0.7" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.7.tgz#02e9357727a9755efa8e14dd5e59b381c29068fb" + integrity sha512-SkwrTqrDxw8y0G1uGJ9Zw13F7qu3LF8V4BifyDeiJCxSnjRGZD9SaoMiMqUvvXMXh6S3sOQ1DsBN7L2fMUZW/g== dependencies: - dargs "^4.0.1" + dargs "^7.0.0" lodash.template "^4.0.2" - meow "^5.0.0" + meow "^7.0.0" split2 "^2.0.0" through2 "^3.0.0" @@ -6971,14 +6964,14 @@ gzip-size@^5.0.0, gzip-size@^5.1.1: duplexer "^0.1.1" pify "^4.0.1" -gzipper@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/gzipper/-/gzipper-4.0.0.tgz#9c9f2956a3f00f4848015b216423e7896b1bdc6f" - integrity sha512-iHekCgI6jT1MsQYhEUpwrOo5K/ioLeID4Kvt/hWG8sU+MSLfvDVym8H9I/L4oc+KZM3fI21GXKqvo/FGsAAisA== +gzipper@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/gzipper/-/gzipper-4.0.2.tgz#51034f6a7d3ee923727a32adba160561b3aaae72" + integrity sha512-I1RDIhOx5QpO7rxQrBv5BB+AxkGqZQV6qC23F9gz83vYhoCN7IcEmXsltdKhoye9jyS0UQjUjvWo0eLxtnqo+Q== dependencies: commander "^5.1.0" deep-equal "^2.0.3" - uuid "^8.1.0" + uuid "^8.3.0" handle-thing@^2.0.0: version "2.0.0" @@ -7391,15 +7384,15 @@ humanize-url@^1.0.0: normalize-url "^1.0.0" strip-url-auth "^1.0.0" -husky@^4.2.5: - version "4.2.5" - resolved "https://registry.yarnpkg.com/husky/-/husky-4.2.5.tgz#2b4f7622673a71579f901d9885ed448394b5fa36" - integrity sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ== +husky@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/husky/-/husky-4.3.0.tgz#0b2ec1d66424e9219d359e26a51c58ec5278f0de" + integrity sha512-tTMeLCLqSBqnflBZnlVDhpaIMucSGaYyX6855jM4AguGeWCeSzNdb1mfyWduTZ3pe3SJVvVWGL0jO1iKZVPfTA== dependencies: chalk "^4.0.0" ci-info "^2.0.0" compare-versions "^3.6.0" - cosmiconfig "^6.0.0" + cosmiconfig "^7.0.0" find-versions "^3.2.0" opencollective-postinstall "^2.0.2" pkg-dir "^4.2.0" @@ -7502,7 +7495,7 @@ import-fresh@^3.0.0: parent-module "^1.0.0" resolve-from "^4.0.0" -import-fresh@^3.1.0, import-fresh@^3.2.1: +import-fresh@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== @@ -8358,6 +8351,15 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +jsonfile@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179" + integrity sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg== + dependencies: + universalify "^1.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" @@ -8573,10 +8575,10 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= -lint-staged@^10.2.13: - version "10.2.13" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.2.13.tgz#b9c504683470edfc464b7d3fe3845a5a1efcd814" - integrity sha512-conwlukNV6aL9SiMWjFtDp5exeDnTMekdNPDZsKGnpfQuHcO0E3L3Bbf58lcR+M7vk6LpCilxDAVks/DDVBYlA== +lint-staged@^10.4.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.4.0.tgz#d18628f737328e0bbbf87d183f4020930e9a984e" + integrity sha512-uaiX4U5yERUSiIEQc329vhCTDDwUcSvKdRLsNomkYLRzijk3v8V9GWm2Nz0RMVB87VcuzLvtgy6OsjoH++QHIg== dependencies: chalk "^4.1.0" cli-truncate "^2.1.0" @@ -8703,6 +8705,13 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + lodash._reinterpolate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" @@ -9031,21 +9040,6 @@ meow@^4.0.0: redent "^2.0.0" trim-newlines "^2.0.0" -meow@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" - integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig== - dependencies: - camelcase-keys "^4.0.0" - decamelize-keys "^1.0.0" - loud-rejection "^1.0.0" - minimist-options "^3.0.1" - normalize-package-data "^2.3.4" - read-pkg-up "^3.0.0" - redent "^2.0.0" - trim-newlines "^2.0.0" - yargs-parser "^10.0.0" - meow@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/meow/-/meow-7.0.1.tgz#1ed4a0a50b3844b451369c48362eb0515f04c1dc" @@ -9453,10 +9447,10 @@ n3@^0.5.0: resolved "https://registry.yarnpkg.com/n3/-/n3-0.5.0.tgz#be06e81c63144bf71ffe40bcea835ee523b574f4" integrity sha1-vgboHGMUS/cf/kC86oNe5SO1dPQ= -n3@^1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/n3/-/n3-1.6.2.tgz#3b40b6f6eeba3a115642eb9237109fff743be631" - integrity sha512-9R45WRNxNPblKLbXGwR9IvtaVvdr80vRxME79fhWnqBzHb2GcP6lS77Mvf8Fx6Wpfn8PpBTdggceWsSMDGY/SA== +n3@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/n3/-/n3-1.6.3.tgz#373de2ebfbce5c51edbd05f8cd36e76482107207" + integrity sha512-dN+8pLw2h1H1WQTW9VR3T16tHPDYdQP+YKXzbcpBCMCb9ZkksUyoVRRdtFGl3vosdET+NIB5eiIgth+4Vit6Yw== dependencies: queue-microtask "^1.1.2" readable-stream "^3.6.0" @@ -9541,10 +9535,10 @@ node-fetch-npm@^2.0.2: json-parse-better-errors "^1.0.0" safe-buffer "^5.1.1" -node-forge@0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579" - integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ== +node-forge@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" + integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== node-libs-browser@^2.2.1: version "2.2.1" @@ -10083,7 +10077,7 @@ p-limit@^2.3.0: dependencies: p-try "^2.0.0" -p-limit@^3.0.1: +p-limit@^3.0.1, p-limit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.0.2.tgz#1664e010af3cadc681baafd3e2a437be7b0fb5fe" integrity sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg== @@ -10111,6 +10105,13 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + p-map@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" @@ -10897,15 +10898,15 @@ prepend-http@^1.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= -prettier@~2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.1.1.tgz#d9485dd5e499daa6cb547023b87a6cf51bee37d6" - integrity sha512-9bY+5ZWCfqj3ghYBLxApy2zf6m+NJo5GzmLTpr9FsApsfjriNnS2dahWReHMi7qNPhhHl9SYHJs2cHZLgexNIw== +prettier@~2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.1.2.tgz#3050700dae2e4c8b67c4c3f666cdb8af405e1ce5" + integrity sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg== -pretty-quick@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-3.0.0.tgz#cba8597eca7f3821232abe6a93302d362cc30d71" - integrity sha512-oIXlGQUcUxt3XpoNfQECEWvH1Q9PtKfelF2pdp6UvC1CSQ5QcB7gUYKu0kuJGlm3LMBZzJaO/vbRkxA61pWlcg== +pretty-quick@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-3.0.2.tgz#7ed460f7e43a647b1044ad8b7f41a0c8a7f1c51c" + integrity sha512-4rWOs/Ifdkg7G/YX7Xbco4jZkuXPx445KdhuMI6REnl3nXRDb9+zysb29c76R59jsJzcnkcpAaGi8D/RjAVfSQ== dependencies: chalk "^3.0.0" execa "^4.0.0" @@ -11893,11 +11894,11 @@ selenium-webdriver@3.6.0, selenium-webdriver@^3.0.1: xml2js "^0.4.17" selfsigned@^1.10.7: - version "1.10.7" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.7.tgz#da5819fd049d5574f28e88a9bcc6dbc6e6f3906b" - integrity sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA== + version "1.10.8" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.8.tgz#0d17208b7d12c33f8eac85c41835f27fc3d81a30" + integrity sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w== dependencies: - node-forge "0.9.0" + node-forge "^0.10.0" semver-compare@^1.0.0: version "1.0.0" @@ -13609,6 +13610,11 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" + integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== + unix-crypt-td-js@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unix-crypt-td-js/-/unix-crypt-td-js-1.0.0.tgz#1c0824150481bc7a01d49e98f1ec668d82412f3b" @@ -13731,10 +13737,10 @@ uuid@^3.4.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^8.1.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.2.0.tgz#cb10dd6b118e2dada7d0cd9730ba7417c93d920e" - integrity sha512-CYpGiFTUrmI6OBMkAdjSDM0k5h8SkkiTP4WAjQgDgNB1S3Ou9VBEvr6q0Kv2H1mMk7IWfxYGpMH5sd5AvcIV2Q== +uuid@^8.3.0: + version "8.3.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31" + integrity sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg== validate-npm-package-license@^3.0.1: version "3.0.4" @@ -14228,20 +14234,6 @@ yaml@^1.10.0: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== -yaml@^1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.7.2.tgz#f26aabf738590ab61efaca502358e48dc9f348b2" - integrity sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw== - dependencies: - "@babel/runtime" "^7.6.3" - -yargs-parser@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" - integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== - dependencies: - camelcase "^4.1.0" - yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" From 6a56a04538bb7a015406b08994b3ea5df9b79848 Mon Sep 17 00:00:00 2001 From: "Stefan@Lap" Date: Wed, 7 Oct 2020 21:22:14 +0200 Subject: [PATCH 03/18] feat(shared): add directive for external links --- .../external-link.directive.spec.ts | 8 +++++ .../external-link/external-link.directive.ts | 29 +++++++++++++++++++ src/app/shared/shared.module.ts | 6 ++++ 3 files changed, 43 insertions(+) create mode 100644 src/app/shared/external-link/external-link.directive.spec.ts create mode 100644 src/app/shared/external-link/external-link.directive.ts diff --git a/src/app/shared/external-link/external-link.directive.spec.ts b/src/app/shared/external-link/external-link.directive.spec.ts new file mode 100644 index 0000000000..9044ee6c4f --- /dev/null +++ b/src/app/shared/external-link/external-link.directive.spec.ts @@ -0,0 +1,8 @@ +import { ExternalLinkDirective } from './external-link.directive'; + +describe('ExternalLinkDirective', () => { + it('should create an instance', () => { + const directive = new ExternalLinkDirective(); + expect(directive).toBeTruthy(); + }); +}); diff --git a/src/app/shared/external-link/external-link.directive.ts b/src/app/shared/external-link/external-link.directive.ts new file mode 100644 index 0000000000..f42efa53f8 --- /dev/null +++ b/src/app/shared/external-link/external-link.directive.ts @@ -0,0 +1,29 @@ +import { Directive, HostBinding, Inject, Input, OnChanges, PLATFORM_ID } from '@angular/core'; +import { isPlatformBrowser } from '@angular/common'; + +@Directive({ + // tslint:disable-next-line:directive-selector + selector: 'a[href]' +}) +export class ExternalLinkDirective implements OnChanges { + @HostBinding('attr.href') hrefAttr = ''; + @HostBinding('attr.target') targetAttr = ''; + @HostBinding('attr.rel') relAttr = ''; + @Input() href: string; + + constructor(@Inject(PLATFORM_ID) private platformId: string) {} + + ngOnChanges() { + this.hrefAttr = this.href; + + if (this.isExternalLink()) { + this.targetAttr = '_blank'; + this.relAttr = 'noopener noreferrer'; + } + console.log(this.hrefAttr); + } + + private isExternalLink() { + return isPlatformBrowser(this.platformId) && !this.href.includes(location.hostname); + } +} diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index 6ad3a6c2e1..c2f8f570e0 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -31,6 +31,10 @@ import { OpenStreetMapComponent } from './open-street-map/open-street-map.compon import { RouterLinkButtonGroupComponent } from './router-link-button-group/router-link-button-group.component'; import { TwelveToneSpinnerComponent } from './twelve-tone-spinner/twelve-tone-spinner.component'; +// +// shared directives +import { ExternalLinkDirective } from './external-link/external-link.directive'; + // // shared pipes import { OrderByPipe } from './order-by/order-by.pipe'; @@ -68,6 +72,7 @@ import { OrderByPipe } from './order-by/order-by.pipe'; OpenStreetMapComponent, RouterLinkButtonGroupComponent, TwelveToneSpinnerComponent, + ExternalLinkDirective, OrderByPipe ], exports: [ @@ -96,6 +101,7 @@ import { OrderByPipe } from './order-by/order-by.pipe'; OpenStreetMapComponent, RouterLinkButtonGroupComponent, TwelveToneSpinnerComponent, + ExternalLinkDirective, OrderByPipe ] }) From af4223fba57ecdd08dbc8db34304896eef2533ab Mon Sep 17 00:00:00 2001 From: "Stefan@Lap" Date: Wed, 7 Oct 2020 21:35:03 +0200 Subject: [PATCH 04/18] fix(app): move target blank from links to directive --- src/app/core/core-models/geo-names.model.ts | 17 +----- .../footer-declaration.component.html | 18 ++----- .../footer-logo/footer-logo.component.html | 2 +- src/app/core/navbar/navbar.component.html | 4 -- .../conversion-service/conversion.service.ts | 4 +- src/app/shared/address/address.component.html | 4 +- src/app/shared/modal/modal.component.ts | 6 +-- .../open-street-map.component.html | 2 +- .../structure-info.component.html | 4 +- .../contact-view/contact-view.component.html | 52 ++++++------------- .../resource-detail-header.component.html | 4 +- .../edition-graph.component.html | 8 ++- .../force-graph-no-result.component.html | 4 +- .../edition-view/edition-view.component.html | 2 +- .../views/home-view/home-view.component.html | 35 ++++--------- .../page-not-found-view.component.html | 2 +- .../structure-view.component.html | 2 - 17 files changed, 49 insertions(+), 121 deletions(-) diff --git a/src/app/core/core-models/geo-names.model.ts b/src/app/core/core-models/geo-names.model.ts index 7e30ed91f4..5f0c67579c 100644 --- a/src/app/core/core-models/geo-names.model.ts +++ b/src/app/core/core-models/geo-names.model.ts @@ -73,24 +73,11 @@ export class GeoNames { const geoIcon = '' + this.shortLabel + ''; const geoLink = - '' + - geoIcon + - ''; + ''; - wikiLink = - '' + - wikiIcon + - ''; + wikiLink = ' - Prototyp AWG-Online-Edition -

+

Prototyp AWG-Online-Edition

- + Version {{ pageMetaData?.version }}{{ pageMetaData?.versionReleaseDate }}

diff --git a/src/app/core/footer/footer-logo/footer-logo.component.html b/src/app/core/footer/footer-logo/footer-logo.component.html index 6bf3d74f1c..c141147c4e 100644 --- a/src/app/core/footer/footer-logo/footer-logo.component.html +++ b/src/app/core/footer/footer-logo/footer-logo.component.html @@ -1,3 +1,3 @@ - + {{ logo.alt }} diff --git a/src/app/core/navbar/navbar.component.html b/src/app/core/navbar/navbar.component.html index d0f1e805e4..48121baaf7 100644 --- a/src/app/core/navbar/navbar.component.html +++ b/src/app/core/navbar/navbar.component.html @@ -4,8 +4,6 @@ tag linkRegArr = regExLink.exec(splitArr[1]); - outStr = '' + labelStr + ''; + outStr = '' + labelStr + ''; } else if (labelStr !== 'DOI') { // ... tag is missing, add it - outStr = '' + labelStr + ''; + outStr = '' + labelStr + ''; } else { // no links, pure string outStr = labelStr + ': ' + splitArr[1]; diff --git a/src/app/shared/address/address.component.html b/src/app/shared/address/address.component.html index 258bc4c86d..38d0c85e3d 100644 --- a/src/app/shared/address/address.component.html +++ b/src/app/shared/address/address.component.html @@ -1,9 +1,7 @@

- {{ - pageMetaData?.awgProjectName - }} + {{ pageMetaData?.awgProjectName }}

diff --git a/src/app/shared/modal/modal.component.ts b/src/app/shared/modal/modal.component.ts index fc50692d60..054fb35c8d 100644 --- a/src/app/shared/modal/modal.component.ts +++ b/src/app/shared/modal/modal.component.ts @@ -39,10 +39,10 @@ const MODALCONTENTSNIPPETS = { hintEditionGraph: '

\n' + ' Hinweise zur Nutzung:
\n' + - ' RDF Triples: Das Resource Description Framework (RDF) stellt grundlegende syntaktische und semantische Elemente zur Beschreibung digitaler Repräsentationen von Objekten (Ressourcen) zur Verfügung. Dabei folgt es einer dreigliedrigen Struktur der Form <SUBJEKT> <PRÄDIKAT> <OBJEKT>, die auch als Triple bezeichnet wird. Eine Menge solcher Triples kann als (gerichteter) Graph verstanden und visualisiert werden. Unter dem Punkt RDF Triples sind die für die vorliegende Graph-Visualisierung zugrundeliegenden RDF-Daten einsehbar und interaktiv lokal bearbeitbar. (Achtung: Änderungen werden von der AWG-APP nicht gespeichert und sollten bei Bedarf lokal gesichert werden.) Weiterführende Informationen zu RDF finden sich unter: https://www.w3.org/RDF/.

\n' + - ' SPARQL Abfrage: Die SPARQL Protocol And RDF Query Language (SPARQL) stellt u.a. eine Abfragesprache für graph-basierte Datensätze bereit. Sie ermöglicht komplexe Abfragen und Manipulationen von in RDF dargestellten und strukturierten Daten. Dabei wird nach dem Prinzip des graph pattern matching der RDF-Graph nach einer angefragten Triple-Folge durchsucht. Unter dem Punkt SPARQL Abfrage lassen sich die Suchanfragen interaktiv anpassen. Einige Beispielabfragen sind bereits in einem Auswahl-Dropdown-Menü vorformuliert. Weiterführende Informationen zu SPARQL finden sich unter: https://www.w3.org/TR/sparql11-query/.

\n' + + ' RDF Triples: Das Resource Description Framework (RDF) stellt grundlegende syntaktische und semantische Elemente zur Beschreibung digitaler Repräsentationen von Objekten (Ressourcen) zur Verfügung. Dabei folgt es einer dreigliedrigen Struktur der Form <SUBJEKT> <PRÄDIKAT> <OBJEKT>, die auch als Triple bezeichnet wird. Eine Menge solcher Triples kann als (gerichteter) Graph verstanden und visualisiert werden. Unter dem Punkt RDF Triples sind die für die vorliegende Graph-Visualisierung zugrundeliegenden RDF-Daten einsehbar und interaktiv lokal bearbeitbar. (Achtung: Änderungen werden von der AWG-APP nicht gespeichert und sollten bei Bedarf lokal gesichert werden.) Weiterführende Informationen zu RDF finden sich unter: https://www.w3.org/RDF/.

\n' + + ' SPARQL Abfrage: Die SPARQL Protocol And RDF Query Language (SPARQL) stellt u.a. eine Abfragesprache für graph-basierte Datensätze bereit. Sie ermöglicht komplexe Abfragen und Manipulationen von in RDF dargestellten und strukturierten Daten. Dabei wird nach dem Prinzip des graph pattern matching der RDF-Graph nach einer angefragten Triple-Folge durchsucht. Unter dem Punkt SPARQL Abfrage lassen sich die Suchanfragen interaktiv anpassen. Einige Beispielabfragen sind bereits in einem Auswahl-Dropdown-Menü vorformuliert. Weiterführende Informationen zu SPARQL finden sich unter: https://www.w3.org/TR/sparql11-query/.

\n' + '\n' + - ' Resultat: Der durch die SPARQL Abfrage über die RDF Triples zurückgelieferte Datensatz wird unter dem Punkt Resultat als dynamisches Graph-Netzwerk aus bezeichneten Knoten und Kanten mit Hilfe der JavaScript-Bibliothek d3.js visualisiert. Die Darstellung ist zoom- und verschiebbar, die Position einzelner Knoten lässt sich ebenfalls durch "Ziehen" mit der Maus verändern. Die Anzahl der angezeigten Triples lässt sich je nach Größe des Ergebnis-Datensatzes über ein Auswahl-Dropdown-Menü filtern; in der Voreinstellung findet eine Beschränkung auf 50 Triples statt.
\n' + + ' Resultat: Der durch die SPARQL Abfrage über die RDF Triples zurückgelieferte Datensatz wird unter dem Punkt Resultat als dynamisches Graph-Netzwerk aus bezeichneten Knoten und Kanten mit Hilfe der JavaScript-Bibliothek d3.js visualisiert. Die Darstellung ist zoom- und verschiebbar, die Position einzelner Knoten lässt sich ebenfalls durch "Ziehen" mit der Maus verändern. Die Anzahl der angezeigten Triples lässt sich je nach Größe des Ergebnis-Datensatzes über ein Auswahl-Dropdown-Menü filtern; in der Voreinstellung findet eine Beschränkung auf 50 Triples statt.
\n' + '

' }; diff --git a/src/app/shared/open-street-map/open-street-map.component.html b/src/app/shared/open-street-map/open-street-map.component.html index 5e53f7e327..60b49ebf85 100644 --- a/src/app/shared/open-street-map/open-street-map.component.html +++ b/src/app/shared/open-street-map/open-street-map.component.html @@ -9,6 +9,6 @@ diff --git a/src/app/side-info/structure-info/structure-info.component.html b/src/app/side-info/structure-info/structure-info.component.html index 4fb5a015a4..14b3008bac 100644 --- a/src/app/side-info/structure-info/structure-info.component.html +++ b/src/app/side-info/structure-info/structure-info.component.html @@ -6,9 +6,7 @@
{{ structureInfoHeader }}

Konzept/Grafik: - {{ - (structureMetaData?.authors)[0].name - }} + {{ (structureMetaData?.authors)[0].name }}

diff --git a/src/app/views/contact-view/contact-view.component.html b/src/app/views/contact-view/contact-view.component.html index d376ad0d09..d31b0f6d28 100644 --- a/src/app/views/contact-view/contact-view.component.html +++ b/src/app/views/contact-view/contact-view.component.html @@ -11,9 +11,8 @@

Website:

{{ pageMetaData.awgProjectName }}. Projekt-Website: - - {{ pageMetaData?.awgProjectUrl }} , abgerufen am {{ today | date: dateFormat }} {{ pageMetaData?.awgProjectUrl }} , abgerufen am + {{ today | date: dateFormat }}.

@@ -22,10 +21,8 @@ {{ pageMetaData.awgProjectName }}. Online-Edition (Version {{ pageMetaData?.version }} vom {{ pageMetaData?.versionReleaseDate }}): - - {{ pageMetaData?.awgAppUrl }} , abgerufen am {{ today | date: dateFormat }}): {{ pageMetaData?.awgAppUrl }} , abgerufen am + {{ today | date: dateFormat }}.

@@ -39,7 +36,7 @@

GitHub:
Repository unter: - + {{ pageMetaData?.githubUrl }}

@@ -47,9 +44,7 @@

Compodoc:
Dokumentation von Struktur und Funktionalitäten der Angular App: - - awg-app documentation - + awg-app documentation

@@ -102,11 +97,7 @@ Anton Webern Gesamtausgabe aus auf der wissenschaftlichen Plattform KNORA/SALSAH (Projektbereich der Anton Webern Gesamtausgabe) für den Nutzer zugänglich sind, sind urheberrechtlich geschützt und werden – sofern nicht anders deklariert – zu den Bedingungen der Creative Commons-Lizenz „Namensnennung – Weitergabe unter gleichen - Bedingungen 4.0 International" (CC BY-SA-4.0CC BY-SA-4.0) zur Verfügung gestellt. Jede davon abweichende Verwertung bedarf der vorherigen schriftlichen Zustimmung durch den jeweiligen Rechteinhaber. Allfällige Bewilligungsgesuche sind an die {{ pageMetaData.awgProjectName }} zu richten (Kontakt). Alle Rechte an zugänglich gemachten externen @@ -116,9 +107,8 @@

Der Software-Code dieses Prototyps wird auf - GitHub unter - einer MIT-Lizenz zur - Verfügung gestellt. + GitHub unter einer + MIT-Lizenz zur Verfügung gestellt.

Externe Links:

@@ -148,17 +138,15 @@

Die {{ pageMetaData.awgProjectName }} setzt auf Grundlage ihrer berechtigten Interessen (d.h. Interesse an der Analyse und Optimierung unseres Onlineangebotes im Sinne des Art. - 6 Abs. 1 lit. f. - DSGVO) Google Analytics, einen Webanalysedienst der Google LLC („Google“) ein. Google verwendet Cookies. Die - durch das Cookie erzeugten Informationen über Benutzung des Onlineangebotes durch die Nutzer werden in der Regel - an einen Server von Google in den USA übertragen und dort gespeichert. + 6 Abs. 1 lit. f. DSGVO) Google Analytics, einen + Webanalysedienst der Google LLC („Google“) ein. Google verwendet Cookies. Die durch das Cookie erzeugten + Informationen über Benutzung des Onlineangebotes durch die Nutzer werden in der Regel an einen Server von Google + in den USA übertragen und dort gespeichert.

Google ist unter dem Privacy-Shield-Abkommen zertifiziert und bietet hierdurch eine Garantie, das europäische Datenschutzrecht einzuhalten (https://www.privacyshield.gov/participant?id=a2zt000000001L5AAI&status=Active). @@ -185,21 +173,14 @@ verhindern; die Nutzer können darüber hinaus die Erfassung der durch das Cookie erzeugten und auf ihre Nutzung des Onlineangebotes bezogenen Daten an Google sowie die Verarbeitung dieser Daten durch Google verhindern, indem sie das unter folgendem Link verfügbare Browser-Plugin herunterladen und installieren: - https://tools.google.com/dlpage/gaoptout?hl=de. + https://tools.google.com/dlpage/gaoptout?hl=de.

Weitere Informationen zur Datennutzung durch Google, Einstellungs- und Widerspruchsmöglichkeiten, erfahren Sie - in der Datenschutzerklärung von Google (https://policies.google.com/technologies/ads) sowie in den Einstellungen für die Darstellung von Werbeeinblendungen durch Google (https://adssettings.google.com/authenticated). @@ -208,8 +189,7 @@

Die personenbezogenen Daten der Nutzer werden nach 14 Monaten gelöscht.

- [Erstellt mit Datenschutz-Generator.de von RA Dr. Thomas SchwenkeErstellt mit Datenschutz-Generator.de von RA Dr. Thomas Schwenke; vom Websiteinhaber angepasst]

diff --git a/src/app/views/data-view/data-outlets/resource-detail/resource-detail-header/resource-detail-header.component.html b/src/app/views/data-view/data-outlets/resource-detail/resource-detail-header/resource-detail-header.component.html index 056066ddeb..d04f279035 100644 --- a/src/app/views/data-view/data-outlets/resource-detail/resource-detail-header/resource-detail-header.component.html +++ b/src/app/views/data-view/data-outlets/resource-detail/resource-detail-header/resource-detail-header.component.html @@ -13,7 +13,7 @@

@@ -29,7 +29,7 @@

Kategorie {{ header?.type }} icon + > icon diff --git a/src/app/views/edition-view/edition-outlets/edition-graph/edition-graph.component.html b/src/app/views/edition-view/edition-outlets/edition-graph/edition-graph.component.html index d9bd3c3430..c4e1b151af 100644 --- a/src/app/views/edition-view/edition-outlets/edition-graph/edition-graph.component.html +++ b/src/app/views/edition-view/edition-outlets/edition-graph/edition-graph.component.html @@ -40,13 +40,11 @@

Diese interaktive Visualisierung basiert auf Mads Holten's - SPARQL Visualizer. Sie modelliert den aktuellen Skizzenkomplex in Form eines - RDF-Graphen. Die + SPARQL Visualizer. Sie modelliert den + aktuellen Skizzenkomplex in Form eines RDF-Graphen. Die zugrundeliegenden RDF-Daten sind unter dem Punkt RDF Triples einsehbar und lokal editierbar. Eine Filterung und Eingrenzung dieser RDF-Daten kann mithilfe der Abfragesprache - SPARQL + SPARQL unter dem Punkt SPARQL Abfrage vorgenommen werden; in der Voreinstellung werden hierbei alle vorhandenen Triples abgefragt.

diff --git a/src/app/views/edition-view/edition-outlets/edition-graph/graph-visualizer/force-graph-no-result/force-graph-no-result.component.html b/src/app/views/edition-view/edition-outlets/edition-graph/graph-visualizer/force-graph-no-result/force-graph-no-result.component.html index 3e2a762e4a..f6dc556187 100644 --- a/src/app/views/edition-view/edition-outlets/edition-graph/graph-visualizer/force-graph-no-result/force-graph-no-result.component.html +++ b/src/app/views/edition-view/edition-outlets/edition-graph/graph-visualizer/force-graph-no-result/force-graph-no-result.component.html @@ -2,13 +2,13 @@

Entschuldigung, Ihre SPARQL-Anfrage führte leider zu keinem Ergebnis.

Möglicherweise können Sie Ihre Anfrage anpassen.

- + {{ logos.sparql.alt }}

Ausführliche Informationen zu SPARQL finden Sie unter: - {{ logos.sparql.href }}{{ logos.sparql.href }}.

diff --git a/src/app/views/edition-view/edition-view.component.html b/src/app/views/edition-view/edition-view.component.html index caed85d1db..db5f2383b1 100644 --- a/src/app/views/edition-view/edition-view.component.html +++ b/src/app/views/edition-view/edition-view.component.html @@ -15,7 +15,7 @@

Ediert von - {{ editor.name }}{{ editor.name }} & 
diff --git a/src/app/views/home-view/home-view.component.html b/src/app/views/home-view/home-view.component.html index 238a984ad3..27a6fd18d6 100644 --- a/src/app/views/home-view/home-view.component.html +++ b/src/app/views/home-view/home-view.component.html @@ -33,29 +33,19 @@

-

- Willkommen bei der AWG-APP, dem Prototyp einer Online-Edition der Anton Webern Gesamtausgabe, Basel (AWG). -

+

Willkommen bei der AWG-APP, dem Prototyp einer Online-Edition der Anton Webern Gesamtausgabe, Basel (AWG).

Die online zugänglichen Bestandteile und Datenbestände der AWG-Online-Edition werden als Open Data über diese Webapplikation präsentiert und über das Software-Framework - Knora/SALSAH + Knora/SALSAH des - Digital Humanities Lab + Digital Humanities Lab der Universität Basel aufbereitet. Zudem werden die Datenbestände durch das - Data and Service Center for Humanities (DaSCH) + Data and Service Center for Humanities (DaSCH) zugänglich gehalten und langfristig aufbewahrt. Das DaSCH garantiert eine Zugänglichkeit der Daten gemäss FAIR-Prinzipien, die Zuweisung von digitalen Identifikatoren, maschinenlesbaren Metadaten und den langfristigen Betrieb der technischen Infrastruktur (vgl. - https://dasch.swiss/mission/). + https://dasch.swiss/mission/).

Der Protoyp simuliert bereits in weiten Teilen eine Datenabfrage über die Programmierschnittstelle (API) von @@ -76,21 +66,14 @@

Bei diesem Prototyp handelt es sich um eine Weiterentwicklung einer - prospektiven Simulation [PDF] vom 31. März 2015 sowie vom 29. Januar 2016. Der Programmcode ist als Open Access-Projekt frei zugänglich auf - GitHub + GitHub abgelegt und vollumfänglich - dokumentiert + dokumentiert (vgl. Dokumentation).

-

- Der Prototyp und die Suche werden in ihrer Funktionalität sukzessiv erweitert. -

+

Der Prototyp und die Suche werden in ihrer Funktionalität sukzessiv erweitert.

diff --git a/src/app/views/page-not-found-view/page-not-found-view.component.html b/src/app/views/page-not-found-view/page-not-found-view.component.html index be7dd19831..c9954fa81e 100644 --- a/src/app/views/page-not-found-view/page-not-found-view.component.html +++ b/src/app/views/page-not-found-view/page-not-found-view.component.html @@ -10,7 +10,7 @@

{{ pageNotFoundSubTitle }}

Kontaktieren sie uns gerne unter: - anton-webern.ch + anton-webern.ch

diff --git a/src/app/views/structure-view/structure-view.component.html b/src/app/views/structure-view/structure-view.component.html index 6b8611c015..913f7083c6 100644 --- a/src/app/views/structure-view/structure-view.component.html +++ b/src/app/views/structure-view/structure-view.component.html @@ -12,8 +12,6 @@

Die erforderlichen Objektklassen und Eigenschaften werden von SALSAH intern als RDF (Resource Description Framework) Triple verwaltet. Sie sind in der Grafik als Ellipsen symbolisiert, deren Verknüpfungen und Verweise untereinander als Pfeile dargestellt. From 412351b8c2ca325fd829e5cf0c07d2120de77398 Mon Sep 17 00:00:00 2001 From: "Stefan@Lap" Date: Wed, 7 Oct 2020 21:36:05 +0200 Subject: [PATCH 05/18] style(app): run prettier on html files --- .../bibliography-search.component.html | 4 +--- .../search-result-list.component.html | 2 +- src/app/views/data-view/data-view.component.html | 4 +--- .../graph-visualizer.component.html | 16 ++++------------ .../edition-tka-table.component.html | 8 ++++---- 5 files changed, 11 insertions(+), 23 deletions(-) diff --git a/src/app/views/data-view/data-outlets/bibliography/bibliography-search/bibliography-search.component.html b/src/app/views/data-view/data-outlets/bibliography/bibliography-search/bibliography-search.component.html index 4213ed1a55..25949285d4 100644 --- a/src/app/views/data-view/data-outlets/bibliography/bibliography-search/bibliography-search.component.html +++ b/src/app/views/data-view/data-outlets/bibliography/bibliography-search/bibliography-search.component.html @@ -1,3 +1 @@ -

- bibliography-search works! -

+

bibliography-search works!

diff --git a/src/app/views/data-view/data-outlets/search-panel/search-result-list/search-result-list.component.html b/src/app/views/data-view/data-outlets/search-panel/search-result-list/search-result-list.component.html index b7331d3e4a..eeebc668f4 100644 --- a/src/app/views/data-view/data-outlets/search-panel/search-result-list/search-result-list.component.html +++ b/src/app/views/data-view/data-outlets/search-panel/search-result-list/search-result-list.component.html @@ -49,7 +49,7 @@ -
+
{{ searchResultText }}
diff --git a/src/app/views/data-view/data-view.component.html b/src/app/views/data-view/data-view.component.html index 14ab0a370a..3ea8599e6d 100644 --- a/src/app/views/data-view/data-view.component.html +++ b/src/app/views/data-view/data-view.component.html @@ -4,9 +4,7 @@ -
- BETA: Suche momentan noch mit eingeschränkter Funktionalität -
+
BETA: Suche momentan noch mit eingeschränkter Funktionalität
diff --git a/src/app/views/edition-view/edition-outlets/edition-graph/graph-visualizer/graph-visualizer.component.html b/src/app/views/edition-view/edition-outlets/edition-graph/graph-visualizer/graph-visualizer.component.html index 4eda7f8a19..465e889991 100644 --- a/src/app/views/edition-view/edition-outlets/edition-graph/graph-visualizer/graph-visualizer.component.html +++ b/src/app/views/edition-view/edition-outlets/edition-graph/graph-visualizer/graph-visualizer.component.html @@ -10,13 +10,9 @@
- + - +
@@ -67,13 +63,9 @@
- + - +
diff --git a/src/app/views/edition-view/edition-outlets/edition-tka-table/edition-tka-table.component.html b/src/app/views/edition-view/edition-outlets/edition-tka-table/edition-tka-table.component.html index 6ae99abb84..783fd5febc 100644 --- a/src/app/views/edition-view/edition-outlets/edition-tka-table/edition-tka-table.component.html +++ b/src/app/views/edition-view/edition-outlets/edition-tka-table/edition-tka-table.component.html @@ -2,10 +2,10 @@ - - - - + + + + From ad39d0a0a7f646f5ad2aacd7bc81eeab7b0f53ce Mon Sep 17 00:00:00 2001 From: "Stefan@Lap" Date: Thu, 8 Oct 2020 00:43:18 +0200 Subject: [PATCH 06/18] test(shared): add tests for ExternalLinkDirective --- .../external-link.directive.spec.ts | 160 +++++++++++++++++- .../external-link/external-link.directive.ts | 1 - 2 files changed, 157 insertions(+), 4 deletions(-) diff --git a/src/app/shared/external-link/external-link.directive.spec.ts b/src/app/shared/external-link/external-link.directive.spec.ts index 9044ee6c4f..b7f815cd6d 100644 --- a/src/app/shared/external-link/external-link.directive.spec.ts +++ b/src/app/shared/external-link/external-link.directive.spec.ts @@ -1,8 +1,162 @@ +import { Component, DebugElement } from '@angular/core'; +import { By } from '@angular/platform-browser'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; + import { ExternalLinkDirective } from './external-link.directive'; +@Component({ + template: `Link External + +

+ Link External Dynamic + +

+ Link Internal + +

+ Link Internal Dynamic + +

+ Link without href` +}) +class TestExernalLinkComponent { + hostname = location.hostname; + dynamicInternalLink = this.hostname + '#anchor'; + dynamicExternalLink = 'https://coryrylan.com/blog/managing-external-links-safely-in-angular'; + + doSomething() { + console.log('Clicked on link without href'); + } +} + describe('ExternalLinkDirective', () => { - it('should create an instance', () => { - const directive = new ExternalLinkDirective(); - expect(directive).toBeTruthy(); + let component: TestExernalLinkComponent; + let fixture: ComponentFixture; + + let aDes: DebugElement[]; + let bareADes: DebugElement[]; + + const expectedExternalLink = 'https://coryrylan.com/blog/managing-external-links-safely-in-angular'; + const expectedNewExternalLink = 'https://anton-webern.ch/'; + const expectedInternalLink = '#anchor'; + const expectedRelAttr = 'noopener noreferrer'; + const expectedTargetAttr = '_blank'; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [TestExernalLinkComponent, ExternalLinkDirective] + }); + + fixture = TestBed.createComponent(TestExernalLinkComponent); + component = fixture.componentInstance; + + fixture.detectChanges(); // initial binding + }); + + it('should have 4 anchor elements with href attributes', () => { + // all elements with an attached ExternalLinkDirective (a[href]) + aDes = fixture.debugElement.queryAll(By.directive(ExternalLinkDirective)); + + expect(aDes.length).toBe(4, 'should be 4'); + + console.log(aDes); + }); + + it('should have 1 anchor element without href attributes', () => { + bareADes = fixture.debugElement.queryAll(By.css('a:not([href])')); + + expect(bareADes.length).toBe(1, 'should be 1'); + }); + + it('should apply [href|target|rel] values to 1st anchor element (external)', () => { + aDes = fixture.debugElement.queryAll(By.directive(ExternalLinkDirective)); + const aEl = aDes[0].nativeElement; + + expect(aEl.href).toBeTruthy(); + expect(aEl.href).toBe(expectedExternalLink, `should be ${expectedExternalLink}`); + + expect(aEl.rel).toBeTruthy(); + expect(aEl.rel).toBe(expectedRelAttr, `should be ${expectedRelAttr}`); + + expect(aEl.target).toBeTruthy(); + expect(aEl.target).toBe(expectedTargetAttr, `should be ${expectedTargetAttr}`); + + expect(aEl.innerText).toBe('Link External', 'should be "Link External"'); + }); + + it('should apply [href|target|rel] values to 2nd anchor element (dynamic external)', () => { + aDes = fixture.debugElement.queryAll(By.directive(ExternalLinkDirective)); + const aEl = aDes[1].nativeElement; + + expect(aEl.href).toBeTruthy(); + expect(aEl.href).toBe(expectedExternalLink, `should be ${expectedExternalLink}`); + + expect(aEl.rel).toBeTruthy(); + expect(aEl.rel).toBe(expectedRelAttr, `should be ${expectedRelAttr}`); + + expect(aEl.target).toBeTruthy(); + expect(aEl.target).toBe(expectedTargetAttr, `should be ${expectedTargetAttr}`); + + expect(aEl.innerText).toBe('Link External Dynamic', 'should be "Link External Dynamic"'); + }); + + it('should not apply [target|rel] values to 3rd anchor element (internal)', () => { + aDes = fixture.debugElement.queryAll(By.directive(ExternalLinkDirective)); + const aEl = aDes[2].nativeElement; + + const expectedHref = aEl.baseURI + aEl.hostname + expectedInternalLink; + + expect(aEl.href).toBeTruthy(); + expect(aEl.href).toBe(expectedHref, `should be ${expectedHref}`); + + expect(aEl.rel).not.toBeTruthy('should be empty string'); + expect(aEl.target).not.toBeTruthy('should be empty string'); + + expect(aEl.innerText).toBe('Link Internal', 'should be "Link Internal"'); + }); + + it('should not apply [target|rel] values to 4th anchor element (dynamic internal)', () => { + aDes = fixture.debugElement.queryAll(By.directive(ExternalLinkDirective)); + const aEl = aDes[3].nativeElement; + + const expectedHref = aEl.baseURI + aEl.hostname + expectedInternalLink; + + expect(aEl.href).toBeTruthy(); + expect(aEl.href).toBe(expectedHref, `should be ${expectedHref}`); + + expect(aEl.rel).not.toBeTruthy('should be empty string'); + expect(aEl.target).not.toBeTruthy('should be empty string'); + + expect(aEl.innerText).toBe('Link Internal Dynamic', 'should be "Link Internal Dynamic"'); + }); + + it('should not apply [href|target|rel] values to bare anchor', () => { + bareADes = fixture.debugElement.queryAll(By.css('a:not([href])')); + + expect(bareADes[0].properties.href).not.toBeTruthy('should be empty string'); + expect(bareADes[0].properties.target).not.toBeTruthy('should be empty string'); + expect(bareADes[0].properties.rel).not.toBeTruthy('should be empty string'); + expect(bareADes[0].properties.innerText).toBe('Link without href', 'should be "Link without href"'); + }); + + it('should reflect input change for [href] values', () => { + component.dynamicExternalLink = expectedNewExternalLink; + + // apply changes + fixture.detectChanges(); + + aDes = fixture.debugElement.queryAll(By.directive(ExternalLinkDirective)); + const aEl = aDes[1].nativeElement; + + expect(aEl.href).toBeTruthy(); + expect(aEl.href).toBe(expectedNewExternalLink, `should be ${expectedNewExternalLink}`); + + expect(aEl.rel).toBeTruthy(); + expect(aEl.rel).toBe(expectedRelAttr, `should be ${expectedRelAttr}`); + + expect(aEl.target).toBeTruthy(); + expect(aEl.target).toBe(expectedTargetAttr, `should be ${expectedTargetAttr}`); + + expect(aEl.innerText).toBe('Link External Dynamic', 'should be "Link External Dynamic"'); }); }); diff --git a/src/app/shared/external-link/external-link.directive.ts b/src/app/shared/external-link/external-link.directive.ts index f42efa53f8..798dc44ab9 100644 --- a/src/app/shared/external-link/external-link.directive.ts +++ b/src/app/shared/external-link/external-link.directive.ts @@ -20,7 +20,6 @@ export class ExternalLinkDirective implements OnChanges { this.targetAttr = '_blank'; this.relAttr = 'noopener noreferrer'; } - console.log(this.hrefAttr); } private isExternalLink() { From 31aa5e38f020479f94f717f242ec0941a1553eb1 Mon Sep 17 00:00:00 2001 From: "Stefan@Lap" Date: Thu, 8 Oct 2020 07:43:42 +0200 Subject: [PATCH 07/18] refactor(shared): move bootstrap items into separate module --- src/app/shared/shared-ngbootstrap.module.ts | 35 +++++++++++++++++++++ src/app/shared/shared.module.ts | 31 +++--------------- 2 files changed, 39 insertions(+), 27 deletions(-) create mode 100644 src/app/shared/shared-ngbootstrap.module.ts diff --git a/src/app/shared/shared-ngbootstrap.module.ts b/src/app/shared/shared-ngbootstrap.module.ts new file mode 100644 index 0000000000..782d41052d --- /dev/null +++ b/src/app/shared/shared-ngbootstrap.module.ts @@ -0,0 +1,35 @@ +import { NgModule } from '@angular/core'; +import { + NgbAccordionModule, + NgbButtonsModule, + NgbCollapseModule, + NgbDropdownModule, + NgbModalModule, + NgbNavModule, + NgbPaginationModule, + NgbTooltipModule +} from '@ng-bootstrap/ng-bootstrap'; + +@NgModule({ + imports: [ + NgbAccordionModule, + NgbButtonsModule, + NgbCollapseModule, + NgbDropdownModule, + NgbModalModule, + NgbNavModule, + NgbPaginationModule, + NgbTooltipModule + ], + exports: [ + NgbAccordionModule, + NgbButtonsModule, + NgbCollapseModule, + NgbDropdownModule, + NgbModalModule, + NgbNavModule, + NgbPaginationModule, + NgbTooltipModule + ] +}) +export class SharedNgbootstrapModule {} diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index c2f8f570e0..fb628e0275 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -8,18 +8,9 @@ import { RouterModule } from '@angular/router'; import { CompileHtmlModule } from './compile-html'; import { CodemirrorModule } from '@ctrl/ngx-codemirror'; import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; -import { - NgbAccordionModule, - NgbButtonsModule, - NgbCollapseModule, - NgbDropdownModule, - NgbModalModule, - NgbNavModule, - NgbPaginationModule, - NgbTooltipModule -} from '@ng-bootstrap/ng-bootstrap'; import { NgxGalleryModule } from '@kolkov/ngx-gallery'; import { NgxJsonViewerModule } from 'ngx-json-viewer'; +import { SharedNgbootstrapModule } from '@awg-shared/shared-ngbootstrap.module'; // // shared components @@ -53,16 +44,9 @@ import { OrderByPipe } from './order-by/order-by.pipe'; CompileHtmlModule, CodemirrorModule, FontAwesomeModule, - NgbAccordionModule, - NgbButtonsModule, - NgbCollapseModule, - NgbDropdownModule, - NgbModalModule, - NgbNavModule, - NgbPaginationModule, - NgbTooltipModule, NgxGalleryModule, - NgxJsonViewerModule + NgxJsonViewerModule, + SharedNgbootstrapModule ], declarations: [ AddressComponent, @@ -83,16 +67,9 @@ import { OrderByPipe } from './order-by/order-by.pipe'; RouterModule, CompileHtmlModule, FontAwesomeModule, - NgbAccordionModule, - NgbButtonsModule, - NgbCollapseModule, - NgbDropdownModule, - NgbModalModule, - NgbNavModule, - NgbPaginationModule, - NgbTooltipModule, NgxGalleryModule, NgxJsonViewerModule, + SharedNgbootstrapModule, AddressComponent, HeadingComponent, From 6740feee4cfaed4228bbaa9da9385e4671ecd9d2 Mon Sep 17 00:00:00 2001 From: "Stefan@Lap" Date: Thu, 8 Oct 2020 10:19:42 +0200 Subject: [PATCH 08/18] style(app): include more file formats for prettier check --- package.json | 17 +++---- .../search-result-list.component.ts | 6 +-- .../force-graph/d3/d3.service.ts | 8 +--- .../models/d3-force-simulation.model.ts | 2 +- .../page-not-found-view.component.ts | 2 +- src/index.html | 10 ++-- src/index.style.css | 46 +++++++++++-------- src/plugins/dateConverter.js | 4 +- src/plugins/htmlConverter.js | 6 +-- 9 files changed, 50 insertions(+), 51 deletions(-) diff --git a/package.json b/package.json index 10917b6027..3587702c48 100644 --- a/package.json +++ b/package.json @@ -33,8 +33,9 @@ "lint": "ng lint awg-app", "lint-staged": "lint-staged", "tslint-check": "tslint-config-prettier-check ./tslint.json", - "format:check": "prettier --check \"src/**/*.ts\"", - "format:fix": "pretty-quick --staged", + "format:check": "prettier --check \"src/**/*.{ts,js,css,html}\"", + "format:write": "prettier --write \"src/**/*.{ts,js,css,html}\"", + "format:fix-staged": "pretty-quick --staged", "doc": "yarn compodoc --tsconfig tsconfig.base.json --theme Readthedocs --output dist/awg-app/compodoc --disableRoutesGraph", "serve:doc": "yarn doc --serve --watch", "build:doc": "yarn doc", @@ -66,20 +67,20 @@ }, "husky": { "hooks": { - "pre-commit": "run-s -l format:fix lint-staged", + "pre-commit": "run-s -l format:fix-staged lint-staged", "commit-msg": "commitlint -E HUSKY_GIT_PARAMS" } }, "prettier": { + "arrowParens": "avoid", + "bracketSpacing": true, + "jsxBracketSameLine": true, "printWidth": 120, - "tabWidth": 4, - "useTabs": false, "semi": true, "singleQuote": true, + "tabWidth": 4, "trailingComma": "none", - "bracketSpacing": true, - "jsxBracketSameLine": true, - "arrowParens": "avoid" + "useTabs": false }, "dependencies": { "@angular/animations": "~10.0.4", diff --git a/src/app/views/data-view/data-outlets/search-panel/search-result-list/search-result-list.component.ts b/src/app/views/data-view/data-outlets/search-panel/search-result-list/search-result-list.component.ts index 16add3a271..5490e75ad1 100644 --- a/src/app/views/data-view/data-outlets/search-panel/search-result-list/search-result-list.component.ts +++ b/src/app/views/data-view/data-outlets/search-panel/search-result-list/search-result-list.component.ts @@ -341,9 +341,9 @@ export class SearchResultListComponent implements OnInit, OnDestroy { */ getSearchResponseWithQueryData(): void { // cold request to streamer service - const searchResponseWithQuery$: Observable< - SearchResponseWithQuery - > = this.dataStreamerService.getSearchResponseWithQuery().pipe(takeUntil(this.destroy$)); + const searchResponseWithQuery$: Observable = this.dataStreamerService + .getSearchResponseWithQuery() + .pipe(takeUntil(this.destroy$)); // subscribe to response to handle changes searchResponseWithQuery$.subscribe( diff --git a/src/app/views/edition-view/edition-outlets/edition-graph/graph-visualizer/force-graph/d3/d3.service.ts b/src/app/views/edition-view/edition-outlets/edition-graph/graph-visualizer/force-graph/d3/d3.service.ts index 2f054e1a8a..1e40734cb4 100644 --- a/src/app/views/edition-view/edition-outlets/edition-graph/graph-visualizer/force-graph/d3/d3.service.ts +++ b/src/app/views/edition-view/edition-outlets/edition-graph/graph-visualizer/force-graph/d3/d3.service.ts @@ -69,13 +69,7 @@ export class D3Service { d.fy = null; }; - dragElement.call( - d3_drag - .drag() - .on('start', dragStart) - .on('drag', dragActions) - .on('end', dragEnd) - ); + dragElement.call(d3_drag.drag().on('start', dragStart).on('drag', dragActions).on('end', dragEnd)); } /** diff --git a/src/app/views/edition-view/edition-outlets/edition-graph/graph-visualizer/models/d3-force-simulation.model.ts b/src/app/views/edition-view/edition-outlets/edition-graph/graph-visualizer/models/d3-force-simulation.model.ts index fecb78c602..ccde44b7e1 100644 --- a/src/app/views/edition-view/edition-outlets/edition-graph/graph-visualizer/models/d3-force-simulation.model.ts +++ b/src/app/views/edition-view/edition-outlets/edition-graph/graph-visualizer/models/d3-force-simulation.model.ts @@ -205,7 +205,7 @@ export class D3ForceSimulation { this.forceSimulation.force('charge_force', this.chargeForce).force('collide_force', this.collideForce); // connect the d3 ticker to an angular event emitter - this.forceSimulation.on('tick', function() { + this.forceSimulation.on('tick', function () { ticker.emit(this); }); diff --git a/src/app/views/page-not-found-view/page-not-found-view.component.ts b/src/app/views/page-not-found-view/page-not-found-view.component.ts index 74972f319f..9357d8d90f 100644 --- a/src/app/views/page-not-found-view/page-not-found-view.component.ts +++ b/src/app/views/page-not-found-view/page-not-found-view.component.ts @@ -21,7 +21,7 @@ export class PageNotFoundViewComponent { * It keeps the title of * the page not found section. */ - pageNotFoundTitle = 'Entschuldigung, diese Seite gibt es hier nicht…'; + pageNotFoundTitle = 'Entschuldigung, diese Seite gibt es hier nicht… '; /** * Public variable: pageNotFoundSubTitle. diff --git a/src/index.html b/src/index.html index 126b9643bc..54b3f193ca 100644 --- a/src/index.html +++ b/src/index.html @@ -20,9 +20,7 @@
-

- AWG prototype is… -

+

AWG prototype is…

@@ -51,11 +49,11 @@ * TODO: https://jaxenter.de/google-analytics-angular-57919 */ if (document.location.hostname == 'edition.anton-webern.ch') { - (function(i, s, o, g, r, a, m) { + (function (i, s, o, g, r, a, m) { i['GoogleAnalyticsObject'] = r; (i[r] = i[r] || - function() { + function () { (i[r].q = i[r].q || []).push(arguments); }), (i[r].l = 1 * new Date()); @@ -68,7 +66,7 @@ // exclude non-production page calls // cf. https://stackoverflow.com/questions/1251922/is-there-a-way-to-stop-google-analytics-counting-development-work-as-hits#8178283 console.log('Running non-production google analytics replacement now'); - ga = function(arg) { + ga = function (arg) { // console.info('ga:', arguments); }; } diff --git a/src/index.style.css b/src/index.style.css index d8fb06a5a9..6ea0546d8e 100644 --- a/src/index.style.css +++ b/src/index.style.css @@ -1,14 +1,16 @@ -body, html { +body, +html { height: 100%; } .app-loading { text-align: center; } -.app-loading .twelveTone-preText, .app-loading .twelveTone-spinner { +.app-loading .twelveTone-preText, +.app-loading .twelveTone-spinner { height: 140px; width: 140px; position: absolute; - top: 0; /* -50% */ + top: 0; /* -50% */ bottom: 0; left: 0; right: 0; @@ -35,7 +37,7 @@ body, html { animation: twelveTone-circleBounceDelay 1.2s infinite ease-in-out both; } -.twelveTone-spinner .twelveTone-loadText>p { +.twelveTone-spinner .twelveTone-loadText > p { /* border: 1px solid blue; */ margin-top: 30%; margin-bottom: 30%; @@ -97,14 +99,13 @@ body, html { transform: rotate(330deg); } - .twelveTone-spinner .twelveTone-note2:before { -webkit-animation-delay: -1.1s; animation-delay: -1.1s; } .twelveTone-spinner .twelveTone-note3:before { /* UNICODE SHARP SIGN, see https://www.unicode.org/Public/UCD/latest/charts/CodeCharts.pdf, p. 280*/ - content: "\266F"; + content: '\266F'; -webkit-animation-delay: -1s; animation-delay: -1s; } @@ -118,7 +119,7 @@ body, html { } .twelveTone-spinner .twelveTone-note6:before { /* UNICODE FLAT SIGN, see https://www.unicode.org/Public/UCD/latest/charts/CodeCharts.pdf, p. 280*/ - content: "\266D"; + content: '\266D'; -webkit-animation-delay: -0.7s; animation-delay: -0.7s; } @@ -132,7 +133,7 @@ body, html { } .twelveTone-spinner .twelveTone-note9:before { /* UNICODE SHARP SIGN, see https://www.unicode.org/Public/UCD/latest/charts/CodeCharts.pdf, p. 280*/ - content: "\266F"; + content: '\266F'; -webkit-animation-delay: -0.4s; animation-delay: -0.4s; } @@ -146,27 +147,32 @@ body, html { } .twelveTone-spinner .twelveTone-note12:before { /* UNICODE FLAT SIGN, see https://www.unicode.org/Public/UCD/latest/charts/CodeCharts.pdf, p. 280*/ - content: "\266D"; + content: '\266D'; -webkit-animation-delay: -0.1s; animation-delay: -0.1s; } - @-webkit-keyframes twelveTone-circleBounceDelay { - 0%, 80%, 100% { + 0%, + 80%, + 100% { -webkit-transform: scale(0); transform: scale(0); - } 40% { - -webkit-transform: scale(1); - transform: scale(1); - } + } + 40% { + -webkit-transform: scale(1); + transform: scale(1); + } } @keyframes twelveTone-circleBounceDelay { - 0%, 80%, 100% { + 0%, + 80%, + 100% { -webkit-transform: scale(0); transform: scale(0); - } 40% { - -webkit-transform: scale(1); - transform: scale(1); - } + } + 40% { + -webkit-transform: scale(1); + transform: scale(1); + } } diff --git a/src/plugins/dateConverter.js b/src/plugins/dateConverter.js index 87de82efd8..a7c27d0fe1 100644 --- a/src/plugins/dateConverter.js +++ b/src/plugins/dateConverter.js @@ -1,4 +1,4 @@ -(function(angular) { +(function (angular) { /* JavaScript functions for the Fourmilab Calendar Converter @@ -241,7 +241,7 @@ * - name.calendar ("GREGORIAN", "JULIAN", "JEWISH", "FRENCH") */ - return (dateConverter = function(dateobj) { + return (dateConverter = function (dateobj) { var $that = this; var d1 = jdc_to_date(dateobj.dateval1, dateobj.calendar); var d2 = jdc_to_date(dateobj.dateval2, dateobj.calendar); diff --git a/src/plugins/htmlConverter.js b/src/plugins/htmlConverter.js index d9fb6b99af..b2d1716335 100644 --- a/src/plugins/htmlConverter.js +++ b/src/plugins/htmlConverter.js @@ -1,4 +1,4 @@ -(function(angular) { +(function (angular) { /* jQuery-plugin template for SALSAH converts the linear standoff @@ -16,7 +16,7 @@ * @param txt The text (sequence of characters) * @return {String} A string which can be converted to HTML */ - return (htmlConverter = function(assigned_props, txt) { + return (htmlConverter = function (assigned_props, txt) { var html = ''; var proparr; var stack; @@ -92,7 +92,7 @@ // var propnames = Object.keys(assigned_props); - propnames.sort(function(a, b) { + propnames.sort(function (a, b) { return tagPrecedence[matching_inv[a]] - tagPrecedence[matching_inv[b]]; }); From a6faaf3c61c6d8c1adcc9452b29d93c7113eb88d Mon Sep 17 00:00:00 2001 From: "Stefan@Lap" Date: Thu, 8 Oct 2020 13:10:17 +0200 Subject: [PATCH 09/18] fix(core): move analytics handling into service --- src/app/app.component.ts | 14 ++- .../analytics.service.spec.ts | 16 +++ .../analytics-sercvice/analytics.service.ts | 107 ++++++++++++++++++ .../core/services/analytics-sercvice/index.ts | 1 + src/app/core/services/index.ts | 2 + src/index.html | 29 +---- 6 files changed, 137 insertions(+), 32 deletions(-) create mode 100644 src/app/core/services/analytics-sercvice/analytics.service.spec.ts create mode 100644 src/app/core/services/analytics-sercvice/analytics.service.ts create mode 100644 src/app/core/services/analytics-sercvice/index.ts diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 81967fe553..17a0376723 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,7 +1,7 @@ import { Component } from '@angular/core'; import { NavigationEnd, Router } from '@angular/router'; -import { RouterEventsService } from '@awg-core/services'; +import { AnalyticsService, RouterEventsService } from '@awg-core/services'; /** * The main component of the AWG App. @@ -20,15 +20,17 @@ export class AppComponent { * It declares private instances of the Angular router and the RouterEventsService. * * @param {Router} router Instance of the Angular router. + * @param {AnalyticsService} analyticsService Instance of the AnalyticsService. * @param {RouterEventsService} routerEventsService Instance of the RouterEventsService. */ - constructor(private readonly router: Router, private routerEventsService: RouterEventsService) { + constructor( + private readonly router: Router, + private analyticsService: AnalyticsService, + private routerEventsService: RouterEventsService + ) { this.router.events.subscribe(event => { if (event instanceof NavigationEnd) { - // catch GoogleAnalytics pageview events, - // cf. https://codeburst.io/using-google-analytics-with-angular-25c93bffaa18 - (window as any).ga('set', 'page', event.urlAfterRedirects); - (window as any).ga('send', 'pageview'); + this.analyticsService.trackPageView(event.urlAfterRedirects); } }); } diff --git a/src/app/core/services/analytics-sercvice/analytics.service.spec.ts b/src/app/core/services/analytics-sercvice/analytics.service.spec.ts new file mode 100644 index 0000000000..cf75f3cfe2 --- /dev/null +++ b/src/app/core/services/analytics-sercvice/analytics.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { AnalyticsService } from './analytics.service'; + +describe('AnalyticsService', () => { + let service: AnalyticsService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(AnalyticsService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/core/services/analytics-sercvice/analytics.service.ts b/src/app/core/services/analytics-sercvice/analytics.service.ts new file mode 100644 index 0000000000..77866270ce --- /dev/null +++ b/src/app/core/services/analytics-sercvice/analytics.service.ts @@ -0,0 +1,107 @@ +import { Injectable } from '@angular/core'; + +/** + * The Analytics service. + * + * It handles the configuration for the GoogleAnalytics setup. + * Inspired by https://jaxenter.de/google-analytics-angular-57919 + * + * Provided in: `root`. + */ +@Injectable({ + providedIn: 'root' +}) +export class AnalyticsService { + /** + * Private variable: analytics. + * + * It stores the analytics object. + */ + private analytics: any; + + /** + * Private variable: isInitialized. + * + * It stores a boolean flag for successful initialization. + */ + private isInitialized = false; + + /** + * Constructor of the AnalyticsService. + * + * It calls the initialization method. + */ + constructor() { + this.initializeAnalytics(); + } + + /** + * Public method: trackPageView. + * + * It tracks a page view for Analytics + * if initialization was successful. + * + * @params {string} [page] The given page string. + * + * @returns {void} Sets and sends the page view to GA. + */ + trackPageView(page: string): void { + if (!this.isInitialized) { + console.log('Analytics not initialized'); + return; + } + (window as any).ga('set', 'page', page); + (window as any).ga('send', 'pageview'); + } + + /** + * Private method: initializeAnalytics. + * + * It initializes the Analytics setup by setting the analytics object + * and a boolean flag for successful initialization. + * + * @returns {void} Sets analytics object and init flag. + */ + private initializeAnalytics(): void { + if (!(window as any).analyticsConfig || !(window as any).analyticsConfig.trackingId) { + console.log('No analytics config found'); + return; + } + this.analytics = (window as any).analyticsConfig; + + if (document.location.hostname === 'edition.anton-webern.ch') { + ((i, s, o, g, r, a, m) => { + i['GoogleAnalyticsObject'] = r; + (i[r] = + i[r] || + (() => { + (i[r].q = i[r].q || []).push(arguments); + })), + (i[r].l = 1 * (new Date() as any)); + (a = s.createElement(o)), (m = s.getElementsByTagName(o)[0]); + a.async = 1; + a.src = g; + m.parentNode.insertBefore(a, m); + })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga'); + } else { + // exclude non-production page calls + // cf. https://stackoverflow.com/questions/1251922/is-there-a-way-to-stop-google-analytics-counting-development-work-as-hits#8178283 + console.log('Running non-production google analytics replacement now'); + (window as any).ga = arg => { + // console.info('ga:', arguments); + }; + } + + if (this.analytics.debug) { + window['ga_debug'] = { trace: true }; + } + if (this.analytics.cookieDomain) { + (window as any).ga('create', this.analytics.trackingId, { + cookieDomain: this.analytics.cookieDomain + }); + } else { + (window as any).ga('create', this.analytics.trackingId, 'auto'); + } + this.isInitialized = true; + } +} diff --git a/src/app/core/services/analytics-sercvice/index.ts b/src/app/core/services/analytics-sercvice/index.ts new file mode 100644 index 0000000000..fbfed7f79f --- /dev/null +++ b/src/app/core/services/analytics-sercvice/index.ts @@ -0,0 +1 @@ +export * from './analytics.service'; diff --git a/src/app/core/services/index.ts b/src/app/core/services/index.ts index 50067ab69f..9283e1dfbb 100644 --- a/src/app/core/services/index.ts +++ b/src/app/core/services/index.ts @@ -7,6 +7,7 @@ * */ +import { AnalyticsService } from './analytics-sercvice'; import { ApiService } from './api-service'; import { ConversionService } from './conversion-service'; import { CoreService } from './core-service'; @@ -18,6 +19,7 @@ import { SideInfoService } from './side-info-service'; import { StorageService } from './storage-service'; export { + AnalyticsService, ApiService, ConversionService, CoreService, diff --git a/src/index.html b/src/index.html index 54b3f193ca..5b1eeea978 100644 --- a/src/index.html +++ b/src/index.html @@ -43,34 +43,11 @@ From 401215d64d9dca999ed2b1722bc8856c8ee4e401 Mon Sep 17 00:00:00 2001 From: "Stefan@Lap" Date: Thu, 8 Oct 2020 23:51:16 +0200 Subject: [PATCH 10/18] docs(app): add documentation for ExternalLinkDirective --- .../external-link.directive.spec.ts | 6 +++ .../external-link/external-link.directive.ts | 51 ++++++++++++++++++- 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/src/app/shared/external-link/external-link.directive.spec.ts b/src/app/shared/external-link/external-link.directive.spec.ts index b7f815cd6d..87f142e932 100644 --- a/src/app/shared/external-link/external-link.directive.spec.ts +++ b/src/app/shared/external-link/external-link.directive.spec.ts @@ -2,6 +2,8 @@ import { Component, DebugElement } from '@angular/core'; import { By } from '@angular/platform-browser'; import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { cleanStylesFromDOM } from '@testing/clean-up-helper'; + import { ExternalLinkDirective } from './external-link.directive'; @Component({ @@ -53,6 +55,10 @@ describe('ExternalLinkDirective', () => { fixture.detectChanges(); // initial binding }); + afterAll(() => { + cleanStylesFromDOM(); + }); + it('should have 4 anchor elements with href attributes', () => { // all elements with an attached ExternalLinkDirective (a[href]) aDes = fixture.debugElement.queryAll(By.directive(ExternalLinkDirective)); diff --git a/src/app/shared/external-link/external-link.directive.ts b/src/app/shared/external-link/external-link.directive.ts index 798dc44ab9..af429f1c94 100644 --- a/src/app/shared/external-link/external-link.directive.ts +++ b/src/app/shared/external-link/external-link.directive.ts @@ -1,18 +1,59 @@ import { Directive, HostBinding, Inject, Input, OnChanges, PLATFORM_ID } from '@angular/core'; import { isPlatformBrowser } from '@angular/common'; +/** + * The external link directive. + * + * It catches links with href attributes and + * adds specific attributes if href has an external target. + */ @Directive({ // tslint:disable-next-line:directive-selector selector: 'a[href]' }) export class ExternalLinkDirective implements OnChanges { + /** + * HostBinding: hrefAttr. + * + * It binds to a link's href attribute. + */ @HostBinding('attr.href') hrefAttr = ''; + + /** + * HostBinding: targetAttr. + * + * It binds to a link's target attribute. + */ @HostBinding('attr.target') targetAttr = ''; + + /** + * HostBinding: relAttr. + * + * It binds to a link's rel attribute. + */ @HostBinding('attr.rel') relAttr = ''; + + /** + * Input variable: href. + * + * It keeps the href value of a link. + */ @Input() href: string; + /** + * Constructor of the ExternalLinkDirective. + * + * It declares and injects a private instance of the Angular PLATFORM_ID. + * + * @param {PLATFORM_ID} platformId Instance of the Angular PLATFORM_ID. + */ constructor(@Inject(PLATFORM_ID) private platformId: string) {} + /** + * Angular life cycle hook: ngOnChanges. + * + * It checks for changes of the given input. + */ ngOnChanges() { this.hrefAttr = this.href; @@ -22,7 +63,15 @@ export class ExternalLinkDirective implements OnChanges { } } - private isExternalLink() { + /** + * Private method: isExternalLink. + * + * It detects if the app is running in the browser + * and if value of href attribute is included in location.hostname. + * + * @returns {boolean} Sets the isExternalLink flag. + */ + private isExternalLink(): boolean { return isPlatformBrowser(this.platformId) && !this.href.includes(location.hostname); } } From 6599fba83af1af04cfac34796d70ecdf45b51ccd Mon Sep 17 00:00:00 2001 From: "Stefan@Lap" Date: Thu, 8 Oct 2020 23:53:10 +0200 Subject: [PATCH 11/18] fix(core): move analytics config also into service --- src/app/app.config.ts | 10 ++ .../analytics.service.spec.ts | 149 +++++++++++++++++- .../analytics-sercvice/analytics.service.ts | 138 +++++++++++----- src/index.html | 8 - 4 files changed, 255 insertions(+), 50 deletions(-) diff --git a/src/app/app.config.ts b/src/app/app.config.ts index 0a2dfa6e66..1d90216f23 100644 --- a/src/app/app.config.ts +++ b/src/app/app.config.ts @@ -16,6 +16,16 @@ export class AppConfig { return root + api; } + /** + * Getter for the URL of the Analytics endpoint + * ({@link https://www.google-analytics.com/}). + * + * @returns {string} + */ + public static get ANALYTICS_ENDPOINT(): string { + return 'https://www.google-analytics.com/'; + } + /** * Getter for the URL of the Inseri Test Instance * ({@link http://test-nieos.nie-ine.ch}). diff --git a/src/app/core/services/analytics-sercvice/analytics.service.spec.ts b/src/app/core/services/analytics-sercvice/analytics.service.spec.ts index cf75f3cfe2..8a75b36e7a 100644 --- a/src/app/core/services/analytics-sercvice/analytics.service.spec.ts +++ b/src/app/core/services/analytics-sercvice/analytics.service.spec.ts @@ -1,16 +1,153 @@ import { TestBed } from '@angular/core/testing'; -import { AnalyticsService } from './analytics.service'; +import Spy = jasmine.Spy; + +import { cleanStylesFromDOM } from '@testing/clean-up-helper'; +import { expectSpyCall } from '@testing/expect-helper'; + +import { AnalyticsConfig, AnalyticsService } from './analytics.service'; describe('AnalyticsService', () => { - let service: AnalyticsService; + let analyticsService: AnalyticsService; + + let gaSpy: Spy; + let initializeAnalyticsSpy: Spy; + + const expectedAnalyticsConfig = { trackingId: 'UA-XXXXX-Y' }; + + const expectedPage = '/test'; + const otherPage = '/test2'; beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(AnalyticsService); + TestBed.configureTestingModule({ + providers: [AnalyticsService] + }); + // inject service + analyticsService = TestBed.inject(AnalyticsService); + + // set analyticsConfig variable + (analyticsService as any).analyticsConfig = expectedAnalyticsConfig; + + // spy on global ga object + gaSpy = spyOn(window as any, 'ga').and.callThrough(); + }); + + afterAll(() => { + cleanStylesFromDOM(); + }); + + it('... should be created', () => { + expect(analyticsService).toBeTruthy(); }); + describe('#initializeAnalytics', () => { + beforeEach(() => { + // spy on private service methods + initializeAnalyticsSpy = spyOn(analyticsService, 'initializeAnalytics').and.callThrough(); + }); + + it(`... should not init the analytics tracker without config`, () => { + // no config provided + const config: AnalyticsConfig = null; + + (analyticsService as any).initializeAnalytics(config); + + expectSpyCall(initializeAnalyticsSpy, 1, config); + expect((analyticsService as any).isInitialized).toBeFalse(); + }); + + it(`... should not init the analytics tracker without config.trackingId`, () => { + // no tracking id provided + const config = { trackingId: null }; + + (analyticsService as any).initializeAnalytics(config); + + expectSpyCall(initializeAnalyticsSpy, 1, config); + expect((analyticsService as any).isInitialized).toBeFalse(); + }); + + it(`... should successfully init the analytics tracker with given config.trackingId`, () => { + const config: AnalyticsConfig = expectedAnalyticsConfig; + + (analyticsService as any).initializeAnalytics(expectedAnalyticsConfig); + + expectSpyCall(initializeAnalyticsSpy, 1, config); + expect(analyticsService['isInitialized']).toBeTruthy(); + }); + + it(`... should init the tracker in debug mode if config.debug = true`, () => { + const config: AnalyticsConfig = expectedAnalyticsConfig; + config.debug = true; + + (analyticsService as any).initializeAnalytics(config); + + expectSpyCall(initializeAnalyticsSpy, 1, config); + expectSpyCall(gaSpy, 2, ['set', 'sendHitTask', null]); + + expect(gaSpy.calls.any()).toBeTruthy(); + expect(gaSpy.calls.count()).toBe(2); + expect(gaSpy.calls.first().args).toEqual(['create', config.trackingId, 'auto']); + expect(gaSpy.calls.mostRecent().args).toEqual(['set', 'sendHitTask', null]); + + expect((analyticsService as any).isInitialized).toBeTruthy(); + }); + + it(`... should use a custom domain if config.cookieDomain is set`, () => { + const config: AnalyticsConfig = expectedAnalyticsConfig; + config.cookieDomain = 'none'; + + (analyticsService as any).initializeAnalytics(config); + + expectSpyCall(initializeAnalyticsSpy, 1, config); + expectSpyCall(gaSpy, 2, ['set', 'sendHitTask', null]); + + expect(gaSpy.calls.any()).toBeTruthy(); + expect(gaSpy.calls.count()).toBe(2); + expect(gaSpy.calls.first().args).toEqual([ + 'create', + config.trackingId, + { cookieDomain: config.cookieDomain } + ]); + expect(gaSpy.calls.mostRecent().args).toEqual(['set', 'sendHitTask', null]); + + expect((analyticsService as any).isInitialized).toBeTruthy(); + }); + }); + + describe('#trackPageView', () => { + it(`... should track the given page`, () => { + analyticsService.trackPageView(expectedPage); + + expectSpyCall(gaSpy, 2, ['send', 'pageview']); + + expect(gaSpy.calls.any()).toBeTruthy(); + expect(gaSpy.calls.count()).toBe(2); + expect(gaSpy.calls.first().args).toEqual(['set', 'page', expectedPage]); + expect(gaSpy.calls.mostRecent().args).toEqual(['send', 'pageview']); + }); + + it(`... should track page changes`, () => { + analyticsService.trackPageView(expectedPage); + analyticsService.trackPageView(otherPage); + + expectSpyCall(gaSpy, 4, ['send', 'pageview']); + + expect(gaSpy.calls.any()).toBeTruthy(); + expect(gaSpy.calls.count()).toBe(4); + expect(gaSpy.calls.first().args).toEqual(['set', 'page', expectedPage]); + expect(gaSpy.calls.allArgs()[0]).toEqual(['set', 'page', expectedPage]); + expect(gaSpy.calls.allArgs()[2]).toEqual(['set', 'page', otherPage]); + expect(gaSpy.calls.allArgs()[1]).toEqual(['send', 'pageview']); + expect(gaSpy.calls.allArgs()[3]).toEqual(['send', 'pageview']); + expect(gaSpy.calls.mostRecent().args).toEqual(['send', 'pageview']); + }); + + it(`... should do nothing if analytics tracker is not initialized successfully`, () => { + (analyticsService as any).isInitialized = false; + + analyticsService.trackPageView(expectedPage); - it('should be created', () => { - expect(service).toBeTruthy(); + expectSpyCall(gaSpy, 0, null); + expect(gaSpy.calls.any()).toBeFalse(); + }); }); }); diff --git a/src/app/core/services/analytics-sercvice/analytics.service.ts b/src/app/core/services/analytics-sercvice/analytics.service.ts index 77866270ce..acea51ee53 100644 --- a/src/app/core/services/analytics-sercvice/analytics.service.ts +++ b/src/app/core/services/analytics-sercvice/analytics.service.ts @@ -1,4 +1,28 @@ import { Injectable } from '@angular/core'; +import { AppConfig } from '@awg-app/app.config'; + +/** + * The AnalyticsConfig class. + * + * It is used to configure the Analytics setup. + * + */ +export class AnalyticsConfig { + /** + * The tracking id for Analytics. + */ + trackingId: string; + + /** + * The cookieDomain for Analytics. + */ + cookieDomain?: string; + + /** + * The debug flag for Analytics. + */ + debug?: boolean; +} /** * The Analytics service. @@ -13,11 +37,11 @@ import { Injectable } from '@angular/core'; }) export class AnalyticsService { /** - * Private variable: analytics. + * Private variable: analyticsConfig. * * It stores the analytics object. */ - private analytics: any; + private analyticsConfig: AnalyticsConfig = { trackingId: 'UA-64657372-2' }; /** * Private variable: isInitialized. @@ -32,7 +56,7 @@ export class AnalyticsService { * It calls the initialization method. */ constructor() { - this.initializeAnalytics(); + this.initializeAnalytics(this.analyticsConfig); } /** @@ -41,16 +65,21 @@ export class AnalyticsService { * It tracks a page view for Analytics * if initialization was successful. * - * @params {string} [page] The given page string. + * @params {string} page The given page string. * * @returns {void} Sets and sends the page view to GA. */ trackPageView(page: string): void { + // check if Analytics object was initialized if (!this.isInitialized) { console.log('Analytics not initialized'); return; } + + // set the page to be tracked (window as any).ga('set', 'page', page); + + // Send a pageview hit from that page (window as any).ga('send', 'pageview'); } @@ -60,48 +89,85 @@ export class AnalyticsService { * It initializes the Analytics setup by setting the analytics object * and a boolean flag for successful initialization. * + * @param {AnalyticsConfig} config The given config object. + * * @returns {void} Sets analytics object and init flag. */ - private initializeAnalytics(): void { - if (!(window as any).analyticsConfig || !(window as any).analyticsConfig.trackingId) { + private initializeAnalytics(config: AnalyticsConfig): void { + if (!config || !config.trackingId) { + this.isInitialized = false; console.log('No analytics config found'); return; } - this.analytics = (window as any).analyticsConfig; - - if (document.location.hostname === 'edition.anton-webern.ch') { - ((i, s, o, g, r, a, m) => { - i['GoogleAnalyticsObject'] = r; - (i[r] = - i[r] || - (() => { - (i[r].q = i[r].q || []).push(arguments); - })), - (i[r].l = 1 * (new Date() as any)); - (a = s.createElement(o)), (m = s.getElementsByTagName(o)[0]); - a.async = 1; - a.src = g; - m.parentNode.insertBefore(a, m); - })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga'); - } else { - // exclude non-production page calls - // cf. https://stackoverflow.com/questions/1251922/is-there-a-way-to-stop-google-analytics-counting-development-work-as-hits#8178283 - console.log('Running non-production google analytics replacement now'); - (window as any).ga = arg => { - // console.info('ga:', arguments); - }; - } - if (this.analytics.debug) { - window['ga_debug'] = { trace: true }; + // set debug or default version of analytics.js + const analyticsJS = config.debug ? 'analytics_debug.js' : 'analytics.js'; + const analyticsURL = AppConfig.ANALYTICS_ENDPOINT + analyticsJS; + + /** + * Creates a temporary global ga object and loads analytics.js. + * Parameters o, a, and m are all used internally. They could have been + * declared using 'var', instead they are declared as parameters to save + * 4 bytes ('var '). + * + * @param {Window} i The global context object. + * @param {HTMLDocument} s The DOM document object. + * @param {string} o Must be 'script'. + * @param {string} g Protocol relative URL of the analytics.js script. + * @param {string} r Global name of analytics object. Defaults to 'ga'. + * @param {HTMLElement} a Async script tag. + * @param {HTMLElement} m First script tag in document. + */ + /* istanbul ignore next */ + ((i, s, o, g, r, a, m) => { + // Acts as a pointer to support renaming. + i['GoogleAnalyticsObject'] = r; + + // Creates an initial ga() function. + // The queued commands will be executed once analytics.js loads. + (i[r] = + i[r] || + (() => { + (i[r].q = i[r].q || []).push(arguments); + })), + // Sets the time (as an integer) this tag was executed. + // Used for timing hits. + (i[r].l = 1 * (new Date() as any)); + + // Insert the script tag asynchronously. + // Inserts above current tag to prevent blocking in addition to using the + // async attribute. + (a = s.createElement(o)), (m = s.getElementsByTagName(o)[0]); + a.async = 1; + a.src = g; + m.parentNode.insertBefore(a, m); + })(window, document, 'script', analyticsURL, 'ga'); + + // enable debug mode if needed + if (config.debug) { + (window as any).ga_debug = { trace: true }; } - if (this.analytics.cookieDomain) { - (window as any).ga('create', this.analytics.trackingId, { - cookieDomain: this.analytics.cookieDomain + + // create tracker + if (config.cookieDomain) { + // create a tracker with custom cookie domain configuration + (window as any).ga('create', config.trackingId, { + cookieDomain: config.cookieDomain }); } else { - (window as any).ga('create', this.analytics.trackingId, 'auto'); + // create a default tracker with automatic cookie domain configuration + (window as any).ga('create', config.trackingId, 'auto'); } + + // ignore non-production page calls + // cf. https://developers.google.com/analytics/devguides/collection/analyticsjs/debugging#testing_your_implementation_without_sending_hits + /* istanbul ignore else */ + if (!(document.location.hostname === 'edition.anton-webern.ch')) { + console.log('Running non-production google analytics replacement now'); + (window as any).ga('set', 'sendHitTask', null); + } + + // flag for successful initialization this.isInitialized = true; } } diff --git a/src/index.html b/src/index.html index 5b1eeea978..41cc64bbbc 100644 --- a/src/index.html +++ b/src/index.html @@ -41,13 +41,5 @@
- From 769fc1a9d3140969ace45dd6a3461c7dc582639a Mon Sep 17 00:00:00 2001 From: "Stefan@Lap" Date: Fri, 9 Oct 2020 01:53:55 +0200 Subject: [PATCH 12/18] fix(shared): fix errors with osm and external link directive --- src/app/app.config.ts | 2 +- .../open-street-map.component.html | 2 +- .../open-street-map.component.spec.ts | 13 +++-- .../open-street-map.component.ts | 2 +- .../contact-info.component.spec.ts | 44 ++++++++++------- .../contact-info/contact-info.component.ts | 47 ++++--------------- .../contact-view/contact-view.component.html | 2 +- .../page-not-found-view.component.ts | 2 +- 8 files changed, 46 insertions(+), 68 deletions(-) diff --git a/src/app/app.config.ts b/src/app/app.config.ts index 1d90216f23..5642c36e0a 100644 --- a/src/app/app.config.ts +++ b/src/app/app.config.ts @@ -125,7 +125,7 @@ export class AppConfig { } /** - * Getter for the unsanitized OSM emebed link. + * Getter for the unsanitized OSM embed link. * * @returns {string} */ diff --git a/src/app/shared/open-street-map/open-street-map.component.html b/src/app/shared/open-street-map/open-street-map.component.html index 60b49ebf85..60e403587f 100644 --- a/src/app/shared/open-street-map/open-street-map.component.html +++ b/src/app/shared/open-street-map/open-street-map.component.html @@ -9,6 +9,6 @@ diff --git a/src/app/shared/open-street-map/open-street-map.component.spec.ts b/src/app/shared/open-street-map/open-street-map.component.spec.ts index 76682ac93d..453e2bfb20 100644 --- a/src/app/shared/open-street-map/open-street-map.component.spec.ts +++ b/src/app/shared/open-street-map/open-street-map.component.spec.ts @@ -6,6 +6,7 @@ import { cleanStylesFromDOM } from '@testing/clean-up-helper'; import { getAndExpectDebugElementByCss } from '@testing/expect-helper'; import { OpenStreetMapComponent } from './open-street-map.component'; +import { AppConfig } from '@awg-app/app.config'; describe('OpenStreetMapComponent (DONE)', () => { let component: OpenStreetMapComponent; @@ -18,7 +19,7 @@ describe('OpenStreetMapComponent (DONE)', () => { let expectedUnsafeOsmEmbedUrl: string; let expectedUnsafeOsmLinkUrl: string; let expectedOsmEmbedUrl: SafeResourceUrl; - let expectedOsmLinkUrl: SafeResourceUrl; + let expectedOsmLinkUrl: string; let expectedOsmLinkLabel: string; let expectedOsmIFrameSettings: { width; height; scrolling }; @@ -46,14 +47,12 @@ describe('OpenStreetMapComponent (DONE)', () => { }; // unsafe link values for open streets map - expectedUnsafeOsmEmbedUrl = - 'https://www.openstreetmap.org/export/embed.html?bbox=7.582175731658936%2C47.55789611508066%2C7.586840093135835%2C47.56003739001212&layer=mapnik&marker=47.55896585846639%2C7.584506571292877'; - expectedUnsafeOsmLinkUrl = - 'https://www.openstreetmap.org/?mlat=47.55897&mlon=7.58451#map=19/47.55897/7.58451'; + expectedUnsafeOsmEmbedUrl = AppConfig.UNSAFE_OSM_EMBED_URL; + expectedUnsafeOsmLinkUrl = AppConfig.UNSAFE_OSM_LINK_URL; // bypass the unsafe values expectedOsmEmbedUrl = domSanitizer.bypassSecurityTrustResourceUrl(expectedUnsafeOsmEmbedUrl); - expectedOsmLinkUrl = domSanitizer.bypassSecurityTrustResourceUrl(expectedUnsafeOsmLinkUrl); + expectedOsmLinkUrl = domSanitizer.sanitize(SecurityContext.URL, expectedUnsafeOsmLinkUrl); }); afterAll(() => { @@ -142,7 +141,7 @@ describe('OpenStreetMapComponent (DONE)', () => { const linkEl = linkDes[0].nativeElement; // sanitize the bypassed value - const sanitizedLinkUrl = domSanitizer.sanitize(SecurityContext.RESOURCE_URL, expectedOsmLinkUrl); + const sanitizedLinkUrl = expectedOsmLinkUrl; // check for the href attribute to contain the sanitized SafeResourceUrl expect(linkEl.href).toBeDefined(); expect(linkEl.href).toBe(sanitizedLinkUrl, `should be ${sanitizedLinkUrl}`); diff --git a/src/app/shared/open-street-map/open-street-map.component.ts b/src/app/shared/open-street-map/open-street-map.component.ts index 8272713210..f94ff2fecb 100644 --- a/src/app/shared/open-street-map/open-street-map.component.ts +++ b/src/app/shared/open-street-map/open-street-map.component.ts @@ -28,7 +28,7 @@ export class OpenStreetMapComponent { * It keeps the sanitized link to the OSM page. */ @Input() - osmLinkUrl: SafeResourceUrl; + osmLinkUrl: string; /** * Public variable: osmLinkLabel. diff --git a/src/app/side-info/contact-info/contact-info.component.spec.ts b/src/app/side-info/contact-info/contact-info.component.spec.ts index b563eacdfa..f74707f938 100644 --- a/src/app/side-info/contact-info/contact-info.component.spec.ts +++ b/src/app/side-info/contact-info/contact-info.component.spec.ts @@ -1,14 +1,21 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { Component, DebugElement, Input } from '@angular/core'; +import { Component, DebugElement, Input, SecurityContext } from '@angular/core'; import { BrowserModule, DomSanitizer, SafeResourceUrl } from '@angular/platform-browser'; -import { cleanStylesFromDOM } from '@testing/clean-up-helper'; -import { getAndExpectDebugElementByCss, getAndExpectDebugElementByDirective } from '@testing/expect-helper'; +import Spy = jasmine.Spy; -import { Meta, MetaContact, MetaPage, MetaSectionTypes, MetaStructure } from '@awg-core/core-models'; +import { cleanStylesFromDOM } from '@testing/clean-up-helper'; +import { + expectSpyCall, + getAndExpectDebugElementByCss, + getAndExpectDebugElementByDirective +} from '@testing/expect-helper'; + +import { AppConfig } from '@awg-app/app.config'; +import { MetaContact, MetaPage, MetaSectionTypes } from '@awg-core/core-models'; import { METADATA } from '@awg-core/mock-data'; -import { CoreService } from '@awg-core/services'; +import { CoreService } from '@awg-core/services'; import { ContactInfoComponent } from './contact-info.component'; // mock address component @@ -26,7 +33,7 @@ class OpenStreetMapStubComponent { @Input() osmEmbedUrl: SafeResourceUrl; @Input() - osmLinkUrl: SafeResourceUrl; + osmLinkUrl: string; } describe('ContactInfoComponent (DONE)', () => { @@ -35,6 +42,9 @@ describe('ContactInfoComponent (DONE)', () => { let compDe: DebugElement; let compEl; + let provideMetaDataSpy: Spy; + let sanitizeSpy: Spy; + let domSanitizer: DomSanitizer; let mockCoreService: Partial; @@ -45,7 +55,7 @@ describe('ContactInfoComponent (DONE)', () => { let expectedUnsafeOsmEmbedUrl: string; let expectedUnsafeOsmLinkUrl: string; let expectedOsmEmbedUrl: SafeResourceUrl; - let expectedOsmLinkUrl: SafeResourceUrl; + let expectedOsmLinkUrl: string; const expectedContactInfoHeader = 'Kontakt'; @@ -73,20 +83,18 @@ describe('ContactInfoComponent (DONE)', () => { expectedContactMetaData = METADATA[MetaSectionTypes.contact]; // unsafe link values for open streets map - expectedUnsafeOsmEmbedUrl = - 'https://www.openstreetmap.org/export/embed.html?bbox=7.582175731658936%2C47.55789611508066%2C7.586840093135835%2C47.56003739001212&layer=mapnik&marker=47.55896585846639%2C7.584506571292877'; - expectedUnsafeOsmLinkUrl = - 'https://www.openstreetmap.org/?mlat=47.55897&mlon=7.58451#map=19/47.55897/7.58451'; + expectedUnsafeOsmEmbedUrl = AppConfig.UNSAFE_OSM_EMBED_URL; + expectedUnsafeOsmLinkUrl = AppConfig.UNSAFE_OSM_LINK_URL; // bypass the unsafe values expectedOsmEmbedUrl = domSanitizer.bypassSecurityTrustResourceUrl(expectedUnsafeOsmEmbedUrl); - expectedOsmLinkUrl = domSanitizer.bypassSecurityTrustResourceUrl(expectedUnsafeOsmLinkUrl); + expectedOsmLinkUrl = domSanitizer.sanitize(SecurityContext.URL, expectedUnsafeOsmLinkUrl); // spies on component functions // `.and.callThrough` will track the spy down the nested describes, see // https://jasmine.github.io/2.0/introduction.html#section-Spies:_%3Ccode%3Eand.callThrough%3C/code%3E - spyOn(component, 'provideMetaData').and.callThrough(); - spyOn(component, 'sanitizeUrls').and.callThrough(); + provideMetaDataSpy = spyOn(component, 'provideMetaData').and.callThrough(); + sanitizeSpy = spyOn(component, 'sanitizeUrls').and.callThrough(); }); afterAll(() => { @@ -117,13 +125,13 @@ describe('ContactInfoComponent (DONE)', () => { describe('#provideMetaData', () => { it('... should not have been called', () => { - expect(component.provideMetaData).not.toHaveBeenCalled(); + expectSpyCall(provideMetaDataSpy, 0); }); }); describe('#sanitizeUrls', () => { it('... should not have been called', () => { - expect(component.sanitizeUrls).not.toHaveBeenCalled(); + expectSpyCall(sanitizeSpy, 0); }); }); @@ -188,7 +196,7 @@ describe('ContactInfoComponent (DONE)', () => { describe('#provideMetaData', () => { it('... should have been called', () => { - expect(component.provideMetaData).toHaveBeenCalled(); + expectSpyCall(provideMetaDataSpy, 1); }); it('... should return pageMetaData', () => { @@ -204,7 +212,7 @@ describe('ContactInfoComponent (DONE)', () => { describe('#sanitizeUrls', () => { it('... should have been called', () => { - expect(component.sanitizeUrls).toHaveBeenCalled(); + expectSpyCall(sanitizeSpy, 1); }); it('... should return osmEmbedUrl', () => { diff --git a/src/app/side-info/contact-info/contact-info.component.ts b/src/app/side-info/contact-info/contact-info.component.ts index 71d1b91bff..be33c69b86 100644 --- a/src/app/side-info/contact-info/contact-info.component.ts +++ b/src/app/side-info/contact-info/contact-info.component.ts @@ -1,4 +1,4 @@ -import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; +import { ChangeDetectionStrategy, Component, OnInit, SecurityContext } from '@angular/core'; import { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser'; import { AppConfig } from '@awg-app/app.config'; @@ -40,46 +40,18 @@ export class ContactInfoComponent implements OnInit { pageMetaData: MetaPage; /** - * Private variable: _osmEmbedUrl. + * Public variable: osmEmbedUrl. * * It keeps the sanitized link to embed the OSM map. */ - private _osmEmbedUrl: SafeResourceUrl; + osmEmbedUrl: SafeResourceUrl; /** - * Private variable: _osmLinkUrl. + * Public variable: osmLinkUrl. * * It keeps the sanitized link to the OSM page. */ - private _osmLinkUrl: SafeResourceUrl; - - /** - * Getter for the sanitized OSM embed link. - */ - get osmEmbedUrl() { - return this._osmEmbedUrl; - } - - /** - * Setter for the sanitized OSM embed link. - */ - set osmEmbedUrl(url: SafeResourceUrl) { - this._osmEmbedUrl = url; - } - - /** - * Getter for the sanitized OSM external link. - */ - get osmLinkUrl() { - return this._osmLinkUrl; - } - - /** - * Setter for the sanitized OSM external link. - */ - set osmLinkUrl(url: SafeResourceUrl) { - this._osmLinkUrl = url; - } + osmLinkUrl: string; /** * Constructor of the ContactInfoComponent. @@ -117,16 +89,15 @@ export class ContactInfoComponent implements OnInit { } /** - * Public method: sanitizeUrls. + * Private method: sanitizeUrls. * - * It sanitizes the URLs and links - * for the OpenStreetMap + * It sanitizes the URLs and links for the OpenStreetMap * using the Angular DomSanitizer. * * @returns {void} Sanitizes the URLs. */ - sanitizeUrls(): void { + private sanitizeUrls(): void { this.osmEmbedUrl = this.sanitizer.bypassSecurityTrustResourceUrl(AppConfig.UNSAFE_OSM_EMBED_URL); - this.osmLinkUrl = this.sanitizer.bypassSecurityTrustResourceUrl(AppConfig.UNSAFE_OSM_LINK_URL); + this.osmLinkUrl = this.sanitizer.sanitize(SecurityContext.URL, AppConfig.UNSAFE_OSM_LINK_URL); } } diff --git a/src/app/views/contact-view/contact-view.component.html b/src/app/views/contact-view/contact-view.component.html index d31b0f6d28..4abb0d0786 100644 --- a/src/app/views/contact-view/contact-view.component.html +++ b/src/app/views/contact-view/contact-view.component.html @@ -107,7 +107,7 @@

Der Software-Code dieses Prototyps wird auf - GitHub unter einer + GitHub unter einer MIT-Lizenz zur Verfügung gestellt.

diff --git a/src/app/views/page-not-found-view/page-not-found-view.component.ts b/src/app/views/page-not-found-view/page-not-found-view.component.ts index 9357d8d90f..74972f319f 100644 --- a/src/app/views/page-not-found-view/page-not-found-view.component.ts +++ b/src/app/views/page-not-found-view/page-not-found-view.component.ts @@ -21,7 +21,7 @@ export class PageNotFoundViewComponent { * It keeps the title of * the page not found section. */ - pageNotFoundTitle = 'Entschuldigung, diese Seite gibt es hier nicht… '; + pageNotFoundTitle = 'Entschuldigung, diese Seite gibt es hier nicht…'; /** * Public variable: pageNotFoundSubTitle. From 75e479e207eae55bf97b64faaaef7809a25dcc6b Mon Sep 17 00:00:00 2001 From: "Stefan@AWG" Date: Fri, 9 Oct 2020 10:01:24 +0200 Subject: [PATCH 13/18] ci(gh-actions): do not run tests on master again --- .github/workflows/ci_tests.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 0053584133..ebc50abcbd 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -4,10 +4,11 @@ on: push: branches: - '**' + - '!master' # do not run on master tags-ignore: - '*' paths-ignore: - - '**.md' + - '**.md' # ignore changes to markdown files jobs: test: From 59479a7e345babbdb0e545b5fc1e98ba1fd8e58a Mon Sep 17 00:00:00 2001 From: "Stefan@AWG" Date: Fri, 9 Oct 2020 10:10:15 +0200 Subject: [PATCH 14/18] test(shared): remove console output from test --- src/app/shared/external-link/external-link.directive.spec.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/app/shared/external-link/external-link.directive.spec.ts b/src/app/shared/external-link/external-link.directive.spec.ts index 87f142e932..316b524cc9 100644 --- a/src/app/shared/external-link/external-link.directive.spec.ts +++ b/src/app/shared/external-link/external-link.directive.spec.ts @@ -64,8 +64,6 @@ describe('ExternalLinkDirective', () => { aDes = fixture.debugElement.queryAll(By.directive(ExternalLinkDirective)); expect(aDes.length).toBe(4, 'should be 4'); - - console.log(aDes); }); it('should have 1 anchor element without href attributes', () => { From 57020b894fa9c17cf54c07e462548b01305af55b Mon Sep 17 00:00:00 2001 From: "Stefan@AWG" Date: Fri, 9 Oct 2020 10:10:57 +0200 Subject: [PATCH 15/18] fix(core): move analytics id to app config --- src/app/app.config.ts | 10 ++++++++++ .../services/analytics-sercvice/analytics.service.ts | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/app/app.config.ts b/src/app/app.config.ts index 5642c36e0a..92335b7b33 100644 --- a/src/app/app.config.ts +++ b/src/app/app.config.ts @@ -26,6 +26,16 @@ export class AppConfig { return 'https://www.google-analytics.com/'; } + /** + * Getter for the Analytics id + * ({@link 'UA-XXXXXXX-Y'}). + * + * @returns {string} + */ + public static get ANALYTICS_ID(): string { + return 'UA-64657372-2'; + } + /** * Getter for the URL of the Inseri Test Instance * ({@link http://test-nieos.nie-ine.ch}). diff --git a/src/app/core/services/analytics-sercvice/analytics.service.ts b/src/app/core/services/analytics-sercvice/analytics.service.ts index acea51ee53..8850487738 100644 --- a/src/app/core/services/analytics-sercvice/analytics.service.ts +++ b/src/app/core/services/analytics-sercvice/analytics.service.ts @@ -41,7 +41,7 @@ export class AnalyticsService { * * It stores the analytics object. */ - private analyticsConfig: AnalyticsConfig = { trackingId: 'UA-64657372-2' }; + private analyticsConfig: AnalyticsConfig = { trackingId: AppConfig.ANALYTICS_ID }; /** * Private variable: isInitialized. @@ -163,7 +163,7 @@ export class AnalyticsService { // cf. https://developers.google.com/analytics/devguides/collection/analyticsjs/debugging#testing_your_implementation_without_sending_hits /* istanbul ignore else */ if (!(document.location.hostname === 'edition.anton-webern.ch')) { - console.log('Running non-production google analytics replacement now'); + console.log('Running non-production analytics replacement now'); (window as any).ga('set', 'sendHitTask', null); } From ea35d99782f682aa08c07dc73e978bd8958dd0a9 Mon Sep 17 00:00:00 2001 From: "Stefan@AWG" Date: Fri, 9 Oct 2020 11:07:57 +0200 Subject: [PATCH 16/18] refactor(core): make code blocks more reusable in AnalyticsService --- .../analytics-sercvice/analytics.service.ts | 89 +++++++++++++------ 1 file changed, 61 insertions(+), 28 deletions(-) diff --git a/src/app/core/services/analytics-sercvice/analytics.service.ts b/src/app/core/services/analytics-sercvice/analytics.service.ts index 8850487738..6aa5bc3ebe 100644 --- a/src/app/core/services/analytics-sercvice/analytics.service.ts +++ b/src/app/core/services/analytics-sercvice/analytics.service.ts @@ -77,17 +77,18 @@ export class AnalyticsService { } // set the page to be tracked - (window as any).ga('set', 'page', page); + this.runAnalytics('set', 'page', page); // Send a pageview hit from that page - (window as any).ga('send', 'pageview'); + this.runAnalytics('send', 'pageview'); } /** * Private method: initializeAnalytics. * - * It initializes the Analytics setup by setting the analytics object - * and a boolean flag for successful initialization. + * It initializes the Analytics environment by setting + * the global analytics object and + * a boolean flag for successful initialization. * * @param {AnalyticsConfig} config The given config object. * @@ -100,6 +101,46 @@ export class AnalyticsService { return; } + this.createAnalytics(config); + + // enable debug mode if needed + if (config.debug) { + (window as any).ga_debug = { trace: true }; + } + + // create tracker + if (config.cookieDomain) { + // create a tracker with custom cookie domain configuration + this.runAnalytics('create', config.trackingId, { + cookieDomain: config.cookieDomain + }); + } else { + // create a default tracker with automatic cookie domain configuration + this.runAnalytics('create', config.trackingId, 'auto'); + } + + // ignore non-production page calls + // cf. https://developers.google.com/analytics/devguides/collection/analyticsjs/debugging#testing_your_implementation_without_sending_hits + /* istanbul ignore else */ + if (!(document.location.hostname === 'edition.anton-webern.ch')) { + console.log('Running non-production analytics replacement now'); + this.runAnalytics('set', 'sendHitTask', null); + } + + // flag for successful initialization + this.isInitialized = true; + } + + /** + * Private method: createAnalytics. + * + * It creates a global Analytics object and loads the necessary JS file. + * + * @param {AnalyticsConfig} config The given config object. + * + * @returns {void} Creates the global analytics object. + */ + private createAnalytics(config: AnalyticsConfig): void { // set debug or default version of analytics.js const analyticsJS = config.debug ? 'analytics_debug.js' : 'analytics.js'; const analyticsURL = AppConfig.ANALYTICS_ENDPOINT + analyticsJS; @@ -142,32 +183,24 @@ export class AnalyticsService { a.src = g; m.parentNode.insertBefore(a, m); })(window, document, 'script', analyticsURL, 'ga'); + } - // enable debug mode if needed - if (config.debug) { - (window as any).ga_debug = { trace: true }; - } - - // create tracker - if (config.cookieDomain) { - // create a tracker with custom cookie domain configuration - (window as any).ga('create', config.trackingId, { - cookieDomain: config.cookieDomain - }); + /** + * Private method: runAnalytics. + * + * It runs a given task on the global Analytics object. + * + * @param {string} task The given task method. + * @param {string} field The given field. + * @param {string} [option] The given option. + * + * @returns {void} Runs a task on the global analytics object. + */ + private runAnalytics(task: string, field: string, option?: any): void { + if (option || option === null) { + (window as any).ga(task, field, option); } else { - // create a default tracker with automatic cookie domain configuration - (window as any).ga('create', config.trackingId, 'auto'); - } - - // ignore non-production page calls - // cf. https://developers.google.com/analytics/devguides/collection/analyticsjs/debugging#testing_your_implementation_without_sending_hits - /* istanbul ignore else */ - if (!(document.location.hostname === 'edition.anton-webern.ch')) { - console.log('Running non-production analytics replacement now'); - (window as any).ga('set', 'sendHitTask', null); + (window as any).ga(task, field); } - - // flag for successful initialization - this.isInitialized = true; } } From 3378f8d26583c6873af5dc0b849cbfae6818aa39 Mon Sep 17 00:00:00 2001 From: "Stefan@AWG" Date: Fri, 9 Oct 2020 12:29:03 +0200 Subject: [PATCH 17/18] build(app): use separate tsconfig file for compodoc --- package.json | 2 +- tsconfig.doc.json | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 tsconfig.doc.json diff --git a/package.json b/package.json index 3587702c48..41c1cc9d3a 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "format:check": "prettier --check \"src/**/*.{ts,js,css,html}\"", "format:write": "prettier --write \"src/**/*.{ts,js,css,html}\"", "format:fix-staged": "pretty-quick --staged", - "doc": "yarn compodoc --tsconfig tsconfig.base.json --theme Readthedocs --output dist/awg-app/compodoc --disableRoutesGraph", + "doc": "yarn compodoc --tsconfig tsconfig.doc.json --theme Readthedocs --output dist/awg-app/compodoc --disableRoutesGraph", "serve:doc": "yarn doc --serve --watch", "build:doc": "yarn doc", "build": "ng build", diff --git a/tsconfig.doc.json b/tsconfig.doc.json new file mode 100644 index 0000000000..6eb7d2a1d4 --- /dev/null +++ b/tsconfig.doc.json @@ -0,0 +1,17 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "baseUrl": "./src/", + "outDir": "./out-tsc/app", + "types": ["node"], + "paths": { + "@awg-app/*": ["app/*"], + "@awg-core/*": ["app/core/*"], + "@awg-shared/*": ["app/shared/*"], + "@awg-side-info/*": ["app/side-info/*"], + "@awg-views/*": ["app/views/*"] + } + }, + "include": ["src/main.ts", "src/polyfills.ts", "src/**/*.d.ts", "src/**/*.ts"], + "exclude": ["src/test.ts", "src/**/*.spec.ts", "src/testing/", "e2e/**/*"] +} From 07cea232817e3130eb8dfdefb2faa4d03cb051ce Mon Sep 17 00:00:00 2001 From: "Stefan@AWG" Date: Fri, 9 Oct 2020 12:39:18 +0200 Subject: [PATCH 18/18] chore(release): 0.7.6 --- CHANGELOG.md | 14 ++++++++++++++ package.json | 2 +- src/app/app.globals.ts | 6 +++--- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ba32ff81bf..8d98e86957 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,20 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [0.7.6](https://github.com/webern-unibas-ch/awg-app/compare/v0.7.5...v0.7.6) (2020-10-09) + +### Features + +- **shared:** add directive for external links ([6a56a04](https://github.com/webern-unibas-ch/awg-app/commit/6a56a04538bb7a015406b08994b3ea5df9b79848)) + +### Bug Fixes + +- **app:** move target blank from links to directive ([af4223f](https://github.com/webern-unibas-ch/awg-app/commit/af4223fba57ecdd08dbc8db34304896eef2533ab)) +- **core:** move analytics config also into service ([6599fba](https://github.com/webern-unibas-ch/awg-app/commit/6599fba83af1af04cfac34796d70ecdf45b51ccd)) +- **core:** move analytics handling into service ([a6faaf3](https://github.com/webern-unibas-ch/awg-app/commit/a6faaf3c61c6d8c1adcc9452b29d93c7113eb88d)) +- **core:** move analytics id to app config ([57020b8](https://github.com/webern-unibas-ch/awg-app/commit/57020b894fa9c17cf54c07e462548b01305af55b)) +- **shared:** fix errors with osm and external link directive ([769fc1a](https://github.com/webern-unibas-ch/awg-app/commit/769fc1a9d3140969ace45dd6a3461c7dc582639a)) + ### [0.7.5](https://github.com/webern-unibas-ch/awg-app/compare/v0.7.4...v0.7.5) (2020-08-28) ### Features diff --git a/package.json b/package.json index 41c1cc9d3a..756e7a19e9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "awg-app", - "version": "0.7.5", + "version": "0.7.6", "license": "MIT", "author": { "name": "Stefan Münnich", diff --git a/src/app/app.globals.ts b/src/app/app.globals.ts index d88e720289..31d24e91c1 100644 --- a/src/app/app.globals.ts +++ b/src/app/app.globals.ts @@ -1,15 +1,15 @@ // THIS IS AN AUTO-GENERATED FILE. DO NOT CHANGE IT MANUALLY! -// Generated last time on Fri Aug 28 14:15:55 CEST 2020 +// Generated last time on Fri Oct 9 12:39:18 CEST 2020 /** * The latest version of the AWG App */ -export const appVersion = '0.7.5'; +export const appVersion = '0.7.6'; /** * The release date of the latest version of the AWG App */ -export const appVersionReleaseDate = '28. August 2020'; +export const appVersionReleaseDate = '09. Oktober 2020'; /** * The URL of the AWG App
TaktSystemOrt im TaktKommentarTaktSystemOrt im TaktKommentar