From 7d32851db470cac5e5b8bc56a304faba6afd2a0e Mon Sep 17 00:00:00 2001 From: Terje Karlsen Date: Fri, 6 Oct 2023 12:47:41 +0200 Subject: [PATCH 01/18] =?UTF-8?q?Legger=20til=20f=C3=B8rste=20Unleash=20Ne?= =?UTF-8?q?xt-intergrasjon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 4 +- .nais/config.yaml | 1 + .nais/unleash-apitoken.yaml | 17 + .nais/vars/dev-beta-navno.yaml | 2 + .nais/vars/dev-beta-tms.yaml | 2 + .nais/vars/dev-stable.yaml | 2 + .nais/vars/prod.yaml | 2 + .prettierignore | 1 + package-lock.json | 946 +++++++++++++++++++++++++--- package.json | 3 +- src/api/api.ts | 4 +- src/komponenter/header/Header.tsx | 4 +- src/server/api-handlers/features.ts | 33 + src/server/server.ts | 2 + 14 files changed, 944 insertions(+), 79 deletions(-) create mode 100644 .nais/unleash-apitoken.yaml create mode 100644 src/server/api-handlers/features.ts diff --git a/.env b/.env index 96d60ab50..4c1693313 100644 --- a/.env +++ b/.env @@ -13,4 +13,6 @@ CASETYPE_ID=66D660EF-6F14-44B4-8ADE-A70A127202D0 NAV_GROUP_ID=A034081B-6B73-46B7-BE27-23B8E9CE3079 OPPORTUNITY_ID=615FF5E7-37B7-4697-A35F-72598B0DC53B SOLUTION_ID=5EB316A1-11E2-460A-B4E3-F82DBD13E21D -VARSEL_API_URL=http://localhost:8095/tms-varsel-api \ No newline at end of file +VARSEL_API_URL=http://localhost:8095/tms-varsel-api +UNLEASH_SERVER_API_URL=http://localhost:8095/unleash +UNLEASH_SERVER_API_TOKEN=dummy_token \ No newline at end of file diff --git a/.nais/config.yaml b/.nais/config.yaml index af69e5a80..1a7034e79 100644 --- a/.nais/config.yaml +++ b/.nais/config.yaml @@ -44,6 +44,7 @@ spec: {{/each}} envFrom: - secret: nav-dekoratoren + - secret: {{appName}}-unleash-api-token filesFrom: - configmap: dekoratoren-config mountPath: /app/config diff --git a/.nais/unleash-apitoken.yaml b/.nais/unleash-apitoken.yaml new file mode 100644 index 000000000..23ce0b2ad --- /dev/null +++ b/.nais/unleash-apitoken.yaml @@ -0,0 +1,17 @@ +apiVersion: unleash.nais.io/v1 +kind: ApiToken +metadata: + name: {{appName}} + namespace: navno + labels: + team: navno +spec: + unleashInstance: + apiVersion: unleash.nais.io/v1 + kind: RemoteUnleash + name: navno + secretName: {{appName}}-unleash-api-token + + # Specify which environment the API token should be created for. + # Can be one of: development, or production. + environment: {{unleashEnvironment}} diff --git a/.nais/vars/dev-beta-navno.yaml b/.nais/vars/dev-beta-navno.yaml index 70ef13d7a..693c4a2d0 100644 --- a/.nais/vars/dev-beta-navno.yaml +++ b/.nais/vars/dev-beta-navno.yaml @@ -1,9 +1,11 @@ appName: nav-dekoratoren-beta appPath: '' +unleashEnvironment: development ingresses: - https://dekoratoren-beta.intern.dev.nav.no outboundHosts: - portal-admin-q6.oera.no + - navno-unleash-api.nav.cloud.nais.io env: - name: ENV value: dev diff --git a/.nais/vars/dev-beta-tms.yaml b/.nais/vars/dev-beta-tms.yaml index 2af2835d0..58760b8d4 100644 --- a/.nais/vars/dev-beta-tms.yaml +++ b/.nais/vars/dev-beta-tms.yaml @@ -1,9 +1,11 @@ appName: nav-dekoratoren-beta-tms appPath: '' +unleashEnvironment: development ingresses: - https://dekoratoren-beta-tms.intern.dev.nav.no outboundHosts: - portal-admin-dev.oera.no + - navno-unleash-api.nav.cloud.nais.io env: - name: ENV value: dev diff --git a/.nais/vars/dev-stable.yaml b/.nais/vars/dev-stable.yaml index f5b7cf8da..58d7ed47c 100644 --- a/.nais/vars/dev-stable.yaml +++ b/.nais/vars/dev-stable.yaml @@ -1,9 +1,11 @@ appName: nav-dekoratoren appPath: '' +unleashEnvironment: development ingresses: - https://dekoratoren.ekstern.dev.nav.no outboundHosts: - portal-admin-dev.oera.no + - navno-unleash-api.nav.cloud.nais.io env: - name: ENV value: dev diff --git a/.nais/vars/prod.yaml b/.nais/vars/prod.yaml index 756bcdea6..bbed70a96 100644 --- a/.nais/vars/prod.yaml +++ b/.nais/vars/prod.yaml @@ -1,10 +1,12 @@ appName: nav-dekoratoren appPath: /dekoratoren +unleashEnvironment: production ingresses: - https://appres.nav.no/common-html/v4/navno - https://www.nav.no/dekoratoren outboundHosts: - www.nav.no + - navno-unleash-api.nav.cloud.nais.io env: - name: ENV value: prod diff --git a/.prettierignore b/.prettierignore index 64247e1ad..7e6bb5be8 100644 --- a/.prettierignore +++ b/.prettierignore @@ -2,3 +2,4 @@ webpack.client.config.js webpack.server.config.js package.json *.yml +*.yaml diff --git a/package-lock.json b/package-lock.json index acf064fe9..bfdb700d3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,7 +33,8 @@ "react-dom": "18.2.0", "react-redux": "8.0.5", "redux": "4.2.1", - "universal-cookie-express": "4.0.3" + "universal-cookie-express": "4.0.3", + "unleash-client": "^4.1.1" }, "devDependencies": { "@babel/cli": "7.21.5", @@ -2343,6 +2344,11 @@ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.2.tgz", "integrity": "sha512-ou3elfqG/hZsbmF4bxeJhPHIf3G2pm0ujc39hYEZrfVqt7Vk/Zji6CXc3W0pmYM8BW1g40U+akTl9DKZhFhInQ==" }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==" + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", @@ -3017,6 +3023,31 @@ "node": ">= 8" } }, + "node_modules/@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/@polka/url": { "version": "1.0.0-next.21", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", @@ -4335,11 +4366,21 @@ "node": ">= 6.0.0" } }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -4986,8 +5027,7 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "devOptional": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/big.js": { "version": "5.2.2", @@ -5072,7 +5112,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "devOptional": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5141,6 +5180,90 @@ "node": ">= 0.8" } }, + "node_modules/cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -5282,7 +5405,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "optional": true, "engines": { "node": ">=10" } @@ -5326,7 +5448,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, "engines": { "node": ">=6" } @@ -5559,8 +5680,7 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "devOptional": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "node_modules/console-control-strings": { "version": "1.1.0", @@ -6375,6 +6495,27 @@ "node": ">= 0.8" } }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/enhanced-resolve": { "version": "5.13.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz", @@ -6411,6 +6552,11 @@ "node": ">=4" } }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" + }, "node_modules/errno": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", @@ -7486,7 +7632,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "optional": true, "dependencies": { "minipass": "^3.0.0" }, @@ -7498,7 +7643,6 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "optional": true, "dependencies": { "yallist": "^4.0.0" }, @@ -7515,8 +7659,7 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "devOptional": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "node_modules/fsevents": { "version": "2.3.2", @@ -7685,7 +7828,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "devOptional": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -7971,6 +8113,11 @@ "entities": "^4.4.0" } }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -8020,6 +8167,14 @@ "node": ">=10.17.0" } }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dependencies": { + "ms": "^2.0.0" + } + }, "node_modules/husky": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", @@ -8131,7 +8286,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, "engines": { "node": ">=0.8.19" } @@ -8140,16 +8294,19 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, "engines": { "node": ">=8" } }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "devOptional": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -8188,6 +8345,11 @@ "node": ">=10.13.0" } }, + "node_modules/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -8353,6 +8515,11 @@ "node": ">=0.10.0" } }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==" + }, "node_modules/is-map": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", @@ -10432,7 +10599,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "devOptional": true, "dependencies": { "yallist": "^4.0.0" }, @@ -10473,6 +10639,51 @@ "semver": "bin/semver.js" } }, + "node_modules/make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/make-fetch-happen/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -10675,7 +10886,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "devOptional": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -10693,7 +10903,121 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-fetch/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { "node": ">=8" } @@ -10702,7 +11026,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "optional": true, "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -10715,7 +11038,6 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "optional": true, "dependencies": { "yallist": "^4.0.0" }, @@ -10727,7 +11049,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "optional": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -10761,6 +11082,14 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/murmurhash3js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/murmurhash3js/-/murmurhash3js-3.0.1.tgz", + "integrity": "sha512-KL8QYUaxq7kUbcl0Yto51rMcYt7E/4N4BG3/c96Iqw1PQrTRspu8Cpx4TZ4Nunib1d4bEkIH3gjCYlP2RLBdow==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/nan": { "version": "2.17.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", @@ -11304,7 +11633,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "devOptional": true, "dependencies": { "wrappy": "1" } @@ -11388,7 +11716,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, "dependencies": { "aggregate-error": "^3.0.0" }, @@ -11479,7 +11806,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -12298,6 +12624,23 @@ "node": ">=10" } }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -12814,6 +13157,14 @@ "node": ">=8" } }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "engines": { + "node": ">= 4" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -12834,7 +13185,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "devOptional": true, "dependencies": { "glob": "^7.1.3" }, @@ -13017,7 +13367,6 @@ "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "devOptional": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -13239,6 +13588,46 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/socks/node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -13316,6 +13705,28 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "node_modules/ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ssri/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -13730,7 +14141,6 @@ "version": "6.1.14", "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.14.tgz", "integrity": "sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw==", - "optional": true, "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -14178,7 +14588,29 @@ "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true, "engines": { - "node": ">=4" + "node": ">=4" + } + }, + "node_modules/unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/universal-cookie": { @@ -14206,6 +14638,20 @@ "node": ">= 4.0.0" } }, + "node_modules/unleash-client": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unleash-client/-/unleash-client-4.1.1.tgz", + "integrity": "sha512-cliJJ82unQauip8/7TQhJbvuHMgBIrM167672uV5RmeD7buluAHm1x0BmYjqsXMpE3MX06m05EzpRz62H90puQ==", + "dependencies": { + "ip": "^1.1.8", + "make-fetch-happen": "^10.2.1", + "murmurhash3js": "^3.0.1", + "semver": "^7.5.3" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -14790,8 +15236,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "devOptional": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "node_modules/write-file-atomic": { "version": "4.0.2", @@ -14852,8 +15297,7 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yaml": { "version": "1.10.2", @@ -16514,6 +16958,11 @@ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.2.tgz", "integrity": "sha512-ou3elfqG/hZsbmF4bxeJhPHIf3G2pm0ujc39hYEZrfVqt7Vk/Zji6CXc3W0pmYM8BW1g40U+akTl9DKZhFhInQ==" }, + "@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==" + }, "@humanwhocodes/config-array": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", @@ -17040,6 +17489,24 @@ "fastq": "^1.6.0" } }, + "@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "requires": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + } + }, + "@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, "@polka/url": { "version": "1.0.0-next.21", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", @@ -18121,11 +18588,18 @@ "debug": "4" } }, + "agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "requires": { + "humanize-ms": "^1.2.1" + } + }, "aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, "requires": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -18610,8 +19084,7 @@ "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "devOptional": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "big.js": { "version": "5.2.2", @@ -18685,7 +19158,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "devOptional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -18732,6 +19204,74 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, + "cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "requires": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==" + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -18822,8 +19362,7 @@ "chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "optional": true + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" }, "chrome-trace-event": { "version": "1.0.3", @@ -18851,8 +19390,7 @@ "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" }, "cli-cursor": { "version": "3.1.0", @@ -19040,8 +19578,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "devOptional": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "console-control-strings": { "version": "1.1.0", @@ -19632,6 +20169,26 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "requires": { + "iconv-lite": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, "enhanced-resolve": { "version": "5.13.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz", @@ -19653,6 +20210,11 @@ "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", "dev": true }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" + }, "errno": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", @@ -20474,7 +21036,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "optional": true, "requires": { "minipass": "^3.0.0" }, @@ -20483,7 +21044,6 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "optional": true, "requires": { "yallist": "^4.0.0" } @@ -20499,8 +21059,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "devOptional": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "2.3.2", @@ -20622,7 +21181,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "devOptional": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -20825,6 +21383,11 @@ "entities": "^4.4.0" } }, + "http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, "http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -20862,6 +21425,14 @@ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "requires": { + "ms": "^2.0.0" + } + }, "husky": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", @@ -20931,20 +21502,22 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "devOptional": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -20977,6 +21550,11 @@ "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true }, + "ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" + }, "ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -21088,6 +21666,11 @@ "is-extglob": "^2.1.1" } }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==" + }, "is-map": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", @@ -22619,7 +23202,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "devOptional": true, "requires": { "yallist": "^4.0.0" } @@ -22647,6 +23229,44 @@ } } }, + "make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==" + }, + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, "makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -22791,7 +23411,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "devOptional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -22805,14 +23424,105 @@ "minipass": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "optional": true + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==" + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "requires": { + "encoding": "^0.1.13", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } + } }, "minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "optional": true, "requires": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -22822,7 +23532,6 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "optional": true, "requires": { "yallist": "^4.0.0" } @@ -22832,8 +23541,7 @@ "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "optional": true + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" }, "modify-selectors": { "version": "2.0.0", @@ -22853,6 +23561,11 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "murmurhash3js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/murmurhash3js/-/murmurhash3js-3.0.1.tgz", + "integrity": "sha512-KL8QYUaxq7kUbcl0Yto51rMcYt7E/4N4BG3/c96Iqw1PQrTRspu8Cpx4TZ4Nunib1d4bEkIH3gjCYlP2RLBdow==" + }, "nan": { "version": "2.17.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", @@ -23261,7 +23974,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "devOptional": true, "requires": { "wrappy": "1" } @@ -23321,7 +24033,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, "requires": { "aggregate-error": "^3.0.0" } @@ -23381,8 +24092,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "devOptional": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { "version": "2.0.1", @@ -23901,6 +24611,20 @@ "tdigest": "^0.1.1" } }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" + }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, "prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -24271,6 +24995,11 @@ "signal-exit": "^3.0.2" } }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==" + }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -24287,7 +25016,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "devOptional": true, "requires": { "glob": "^7.1.3" } @@ -24389,7 +25117,6 @@ "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "devOptional": true, "requires": { "lru-cache": "^6.0.0" } @@ -24571,6 +25298,37 @@ } } }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" + }, + "socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "requires": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "dependencies": { + "ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + } + } + }, + "socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -24636,6 +25394,24 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "requires": { + "minipass": "^3.1.1" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, "stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -24940,7 +25716,6 @@ "version": "6.1.14", "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.14.tgz", "integrity": "sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw==", - "optional": true, "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -25276,6 +26051,22 @@ "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true }, + "unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "requires": { + "unique-slug": "^3.0.0" + } + }, + "unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "requires": { + "imurmurhash": "^0.1.4" + } + }, "universal-cookie": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-4.0.4.tgz", @@ -25298,6 +26089,17 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==" }, + "unleash-client": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unleash-client/-/unleash-client-4.1.1.tgz", + "integrity": "sha512-cliJJ82unQauip8/7TQhJbvuHMgBIrM167672uV5RmeD7buluAHm1x0BmYjqsXMpE3MX06m05EzpRz62H90puQ==", + "requires": { + "ip": "^1.1.8", + "make-fetch-happen": "^10.2.1", + "murmurhash3js": "^3.0.1", + "semver": "^7.5.3" + } + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -25737,8 +26539,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "devOptional": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write-file-atomic": { "version": "4.0.2", @@ -25776,8 +26577,7 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yaml": { "version": "1.10.2", diff --git a/package.json b/package.json index 216223e1f..d5b8461ef 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,8 @@ "react-dom": "18.2.0", "react-redux": "8.0.5", "redux": "4.2.1", - "universal-cookie-express": "4.0.3" + "universal-cookie-express": "4.0.3", + "unleash-client": "^4.1.1" }, "devDependencies": { "@babel/cli": "7.21.5", diff --git a/src/api/api.ts b/src/api/api.ts index 6abf95343..30a4f4542 100644 --- a/src/api/api.ts +++ b/src/api/api.ts @@ -97,8 +97,8 @@ export const postInaktiver = (VARSEL_API_URL: string, eventId: DoneEvent) => keepalive: true, }).catch((e) => console.info(`Error posting done event for varsler [eventId: ${eventId?.eventId} - error: ${e}]`)); -export const fetchFeatureToggles = (API_DEKORATOREN_URL: string, featureToggles: FeatureToggles) => - fetchToJson(`${API_DEKORATOREN_URL}/feature-toggles${getFeatureToggleUrl(featureToggles)}`, { +export const fetchFeatureToggles = (APP_URL: string, featureToggles: FeatureToggles) => + fetchToJson(`${APP_URL}/api/features${getFeatureToggleUrl(featureToggles)}`, { credentials: 'include', }); diff --git a/src/komponenter/header/Header.tsx b/src/komponenter/header/Header.tsx index d40b8073e..131a84f21 100644 --- a/src/komponenter/header/Header.tsx +++ b/src/komponenter/header/Header.tsx @@ -98,7 +98,7 @@ export const Header = () => { }, [menypunkt]); useLoadIfActiveSession({ - userState: cookies['psCurrentState'] + userState: cookies['psCurrentState'], }); // Handle enforced login @@ -123,7 +123,7 @@ export const Header = () => { hentInnloggingsstatus(environment)(dispatch); fetchMenypunkter(APP_URL)(dispatch); if (Object.keys(currentFeatureToggles).length) { - fetchFeatureToggles(API_DEKORATOREN_URL, currentFeatureToggles) + fetchFeatureToggles(APP_URL, currentFeatureToggles) .then((updatedFeatureToggles) => { dispatch({ type: ActionType.SETT_FEATURE_TOGGLES, diff --git a/src/server/api-handlers/features.ts b/src/server/api-handlers/features.ts new file mode 100644 index 000000000..6d592ef7b --- /dev/null +++ b/src/server/api-handlers/features.ts @@ -0,0 +1,33 @@ +import { RequestHandler } from 'express'; +import { startUnleash } from 'unleash-client'; + +export const getFeaturesHandler: RequestHandler = async (req, res) => { + // Cant easily fetch feature toggles when running locally + // so just mock this. + const { UNLEASH_SERVER_API_TOKEN, UNLEASH_SERVER_API_URL } = process.env; + + if (process.env.NODE_ENV === 'development') { + const features = { + skjermdeling: true, + chatbotscript: true, + }; + res.json(features); + return; + } + + if (!UNLEASH_SERVER_API_TOKEN || !UNLEASH_SERVER_API_URL) { + res.status(500).send('Missing UNLEASH_SERVER_API_TOKEN or UNLEASH_SERVER_API_URL'); + return; + } + + const unleash = await startUnleash({ + url: UNLEASH_SERVER_API_URL, + appName: 'nav-dekoratoren', + customHeaders: { Authorization: UNLEASH_SERVER_API_TOKEN }, + }); + + return { + skjermdeling: unleash.isEnabled('dekoratoren.skjermdeling'), + chatbotscript: unleash.isEnabled('dekoratoren.chatbotscript'), + }; +}; diff --git a/src/server/server.ts b/src/server/server.ts index cffc63ffe..f582616e4 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -16,6 +16,7 @@ import { getCspHandler } from './api-handlers/csp'; import { getTaskAnalyticsConfigHandler } from './api-handlers/ta'; import { mockSessionHandler, refreshMockSessionHandler } from './mock/mockSession'; import { mockAuthHandler } from './mock/mockAuth'; +import { getFeaturesHandler } from './api-handlers/features'; require('console-stamp')(console, '[HH:MM:ss.l]'); @@ -121,6 +122,7 @@ app.get(createPaths('/env'), (req, res, next) => { // Api endpoints app.get(createPaths('/api/meny'), getMenuHandler); app.get(createPaths('/api/sok'), getSokHandler); +app.get(createPaths('/api/features'), getFeaturesHandler); app.get(createPaths('/api/driftsmeldinger'), getDriftsmeldingerHandler); app.get(createPaths('/api/auth'), mockAuthHandler); app.get(createPaths('/api/oauth2/session'), mockSessionHandler); From 9444afcdf27ade8182b203aa1fc9eb95a622ea95 Mon Sep 17 00:00:00 2001 From: Terje Karlsen Date: Fri, 6 Oct 2023 12:50:45 +0200 Subject: [PATCH 02/18] Wrap unleash-klient inn i try catch --- src/server/api-handlers/features.ts | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/server/api-handlers/features.ts b/src/server/api-handlers/features.ts index 6d592ef7b..e5c1f5c53 100644 --- a/src/server/api-handlers/features.ts +++ b/src/server/api-handlers/features.ts @@ -20,14 +20,19 @@ export const getFeaturesHandler: RequestHandler = async (req, res) => { return; } - const unleash = await startUnleash({ - url: UNLEASH_SERVER_API_URL, - appName: 'nav-dekoratoren', - customHeaders: { Authorization: UNLEASH_SERVER_API_TOKEN }, - }); + try { + const unleash = await startUnleash({ + url: UNLEASH_SERVER_API_URL, + appName: 'nav-dekoratoren', + customHeaders: { Authorization: UNLEASH_SERVER_API_TOKEN }, + }); - return { - skjermdeling: unleash.isEnabled('dekoratoren.skjermdeling'), - chatbotscript: unleash.isEnabled('dekoratoren.chatbotscript'), - }; + return { + skjermdeling: unleash.isEnabled('dekoratoren.skjermdeling'), + chatbotscript: unleash.isEnabled('dekoratoren.chatbotscript'), + }; + } catch (e) { + console.error(`Failed to fetch feature toggles from unleash - ${e}`); + res.status(500).send(`Failed to fetch feature toggles from unleash - ${e}`); + } }; From 3cbd3ab6d1d93abd42ef8497a35c23789a3bfab2 Mon Sep 17 00:00:00 2001 From: Terje Karlsen Date: Fri, 6 Oct 2023 13:06:05 +0200 Subject: [PATCH 03/18] Hardkoder secret navn for unleash --- .nais/config.yaml | 2 +- .nais/unleash-apitoken.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.nais/config.yaml b/.nais/config.yaml index 1a7034e79..6ba3398e5 100644 --- a/.nais/config.yaml +++ b/.nais/config.yaml @@ -44,7 +44,7 @@ spec: {{/each}} envFrom: - secret: nav-dekoratoren - - secret: {{appName}}-unleash-api-token + - secret: nav-dekoratoren-unleash-api-token filesFrom: - configmap: dekoratoren-config mountPath: /app/config diff --git a/.nais/unleash-apitoken.yaml b/.nais/unleash-apitoken.yaml index 23ce0b2ad..9b929a352 100644 --- a/.nais/unleash-apitoken.yaml +++ b/.nais/unleash-apitoken.yaml @@ -10,7 +10,7 @@ spec: apiVersion: unleash.nais.io/v1 kind: RemoteUnleash name: navno - secretName: {{appName}}-unleash-api-token + secretName: nav-dekoratoren-unleash-api-token # Specify which environment the API token should be created for. # Can be one of: development, or production. From 095b33070f9c6e8c1291dbcee7b4ef5025a950c9 Mon Sep 17 00:00:00 2001 From: Terje Karlsen Date: Fri, 6 Oct 2023 13:22:45 +0200 Subject: [PATCH 04/18] Korrigerer secret-navm --- .nais/unleash-apitoken.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.nais/unleash-apitoken.yaml b/.nais/unleash-apitoken.yaml index 9b929a352..05596b624 100644 --- a/.nais/unleash-apitoken.yaml +++ b/.nais/unleash-apitoken.yaml @@ -1,7 +1,7 @@ apiVersion: unleash.nais.io/v1 kind: ApiToken metadata: - name: {{appName}} + name: nav-decoratoren namespace: navno labels: team: navno From d5d3fbfa1b3e0b983feca142d03232db5c141beb Mon Sep 17 00:00:00 2001 From: Terje Karlsen Date: Fri, 6 Oct 2023 13:38:38 +0200 Subject: [PATCH 05/18] Disable feature-endepunkt --- src/server/server.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/server.ts b/src/server/server.ts index f582616e4..6430c0e0c 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -16,7 +16,7 @@ import { getCspHandler } from './api-handlers/csp'; import { getTaskAnalyticsConfigHandler } from './api-handlers/ta'; import { mockSessionHandler, refreshMockSessionHandler } from './mock/mockSession'; import { mockAuthHandler } from './mock/mockAuth'; -import { getFeaturesHandler } from './api-handlers/features'; +// import { getFeaturesHandler } from './api-handlers/features'; require('console-stamp')(console, '[HH:MM:ss.l]'); @@ -122,7 +122,7 @@ app.get(createPaths('/env'), (req, res, next) => { // Api endpoints app.get(createPaths('/api/meny'), getMenuHandler); app.get(createPaths('/api/sok'), getSokHandler); -app.get(createPaths('/api/features'), getFeaturesHandler); +// app.get(createPaths('/api/features'), getFeaturesHandler); app.get(createPaths('/api/driftsmeldinger'), getDriftsmeldingerHandler); app.get(createPaths('/api/auth'), mockAuthHandler); app.get(createPaths('/api/oauth2/session'), mockSessionHandler); From 38c7212752d1e5fa1b700b222751560319ae435c Mon Sep 17 00:00:00 2001 From: Terje Karlsen Date: Fri, 6 Oct 2023 14:06:19 +0200 Subject: [PATCH 06/18] Setter opp egen api-proxy-endepunkt for kall mot Unleash --- .nais/unleash-apitoken.yaml | 17 ------ ...ken.dev.yml => unleash-api-token.dev.yaml} | 7 +-- ...n.prod.yml => unleash-api-token.prod.yaml} | 4 +- src/server/api-handlers/features.ts | 60 ++++++++++++------- src/server/server.ts | 4 +- 5 files changed, 45 insertions(+), 47 deletions(-) delete mode 100644 .nais/unleash-apitoken.yaml rename .nais/unleash/{unleash-api-token.dev.yml => unleash-api-token.dev.yaml} (64%) rename .nais/unleash/{unleash-api-token.prod.yml => unleash-api-token.prod.yaml} (88%) diff --git a/.nais/unleash-apitoken.yaml b/.nais/unleash-apitoken.yaml deleted file mode 100644 index 05596b624..000000000 --- a/.nais/unleash-apitoken.yaml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: unleash.nais.io/v1 -kind: ApiToken -metadata: - name: nav-decoratoren - namespace: navno - labels: - team: navno -spec: - unleashInstance: - apiVersion: unleash.nais.io/v1 - kind: RemoteUnleash - name: navno - secretName: nav-dekoratoren-unleash-api-token - - # Specify which environment the API token should be created for. - # Can be one of: development, or production. - environment: {{unleashEnvironment}} diff --git a/.nais/unleash/unleash-api-token.dev.yml b/.nais/unleash/unleash-api-token.dev.yaml similarity index 64% rename from .nais/unleash/unleash-api-token.dev.yml rename to .nais/unleash/unleash-api-token.dev.yaml index 4163f2f8c..6eb232e23 100644 --- a/.nais/unleash/unleash-api-token.dev.yml +++ b/.nais/unleash/unleash-api-token.dev.yaml @@ -2,16 +2,13 @@ apiVersion: unleash.nais.io/v1 kind: ApiToken metadata: name: nav-dekoratoren - namespace: navno + namespace: personbruker labels: - team: navno + team: personbruker spec: unleashInstance: apiVersion: unleash.nais.io/v1 kind: RemoteUnleash name: navno secretName: nav-dekoratoren-unleash-api-token - - # Specify which environment the API token should be created for. - # Can be one of: development, or production. environment: development diff --git a/.nais/unleash/unleash-api-token.prod.yml b/.nais/unleash/unleash-api-token.prod.yaml similarity index 88% rename from .nais/unleash/unleash-api-token.prod.yml rename to .nais/unleash/unleash-api-token.prod.yaml index 7b51a3221..edb8115eb 100644 --- a/.nais/unleash/unleash-api-token.prod.yml +++ b/.nais/unleash/unleash-api-token.prod.yaml @@ -2,9 +2,9 @@ apiVersion: unleash.nais.io/v1 kind: ApiToken metadata: name: nav-dekoratoren - namespace: navno + namespace: personbruker labels: - team: navno + team: personbruker spec: unleashInstance: apiVersion: unleash.nais.io/v1 diff --git a/src/server/api-handlers/features.ts b/src/server/api-handlers/features.ts index e5c1f5c53..1c2708807 100644 --- a/src/server/api-handlers/features.ts +++ b/src/server/api-handlers/features.ts @@ -1,11 +1,41 @@ import { RequestHandler } from 'express'; -import { startUnleash } from 'unleash-client'; +import { initialize, Unleash } from 'unleash-client'; + +let unleashInstance: Unleash; +const featurePrefix = 'dekoratoren'; +const expectedFeatures = ['skjermdeling', 'chatbotscript']; + +type Features = { [key: string]: boolean }; + +const initializeUnleash = async () => { + const { UNLEASH_SERVER_API_TOKEN, UNLEASH_SERVER_API_URL } = process.env; + if (!UNLEASH_SERVER_API_TOKEN || !UNLEASH_SERVER_API_URL) { + console.error('Missing UNLEASH_SERVER_API_TOKEN or UNLEASH_SERVER_API_URL'); + return false; + } + + try { + unleashInstance = initialize({ + url: `${UNLEASH_SERVER_API_URL}/api/`, + appName: 'nav-dekoratoren', + customHeaders: { Authorization: UNLEASH_SERVER_API_TOKEN }, + }); + } catch (e) { + console.error('Error initializing unleash', e); + } + + return true; +}; + +initializeUnleash(); export const getFeaturesHandler: RequestHandler = async (req, res) => { + if (!unleashInstance) { + await initializeUnleash(); + } + // Cant easily fetch feature toggles when running locally // so just mock this. - const { UNLEASH_SERVER_API_TOKEN, UNLEASH_SERVER_API_URL } = process.env; - if (process.env.NODE_ENV === 'development') { const features = { skjermdeling: true, @@ -15,24 +45,12 @@ export const getFeaturesHandler: RequestHandler = async (req, res) => { return; } - if (!UNLEASH_SERVER_API_TOKEN || !UNLEASH_SERVER_API_URL) { - res.status(500).send('Missing UNLEASH_SERVER_API_TOKEN or UNLEASH_SERVER_API_URL'); - return; - } + console.log(unleashInstance.isEnabled('dekoratoren.skjermdeling')); - try { - const unleash = await startUnleash({ - url: UNLEASH_SERVER_API_URL, - appName: 'nav-dekoratoren', - customHeaders: { Authorization: UNLEASH_SERVER_API_TOKEN }, - }); + const features = expectedFeatures.reduce((acc: Features, feature: string) => { + acc[feature] = unleashInstance.isEnabled(`${featurePrefix}.${feature}`); + return acc; + }, {}); - return { - skjermdeling: unleash.isEnabled('dekoratoren.skjermdeling'), - chatbotscript: unleash.isEnabled('dekoratoren.chatbotscript'), - }; - } catch (e) { - console.error(`Failed to fetch feature toggles from unleash - ${e}`); - res.status(500).send(`Failed to fetch feature toggles from unleash - ${e}`); - } + res.json(features); }; diff --git a/src/server/server.ts b/src/server/server.ts index 6430c0e0c..f582616e4 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -16,7 +16,7 @@ import { getCspHandler } from './api-handlers/csp'; import { getTaskAnalyticsConfigHandler } from './api-handlers/ta'; import { mockSessionHandler, refreshMockSessionHandler } from './mock/mockSession'; import { mockAuthHandler } from './mock/mockAuth'; -// import { getFeaturesHandler } from './api-handlers/features'; +import { getFeaturesHandler } from './api-handlers/features'; require('console-stamp')(console, '[HH:MM:ss.l]'); @@ -122,7 +122,7 @@ app.get(createPaths('/env'), (req, res, next) => { // Api endpoints app.get(createPaths('/api/meny'), getMenuHandler); app.get(createPaths('/api/sok'), getSokHandler); -// app.get(createPaths('/api/features'), getFeaturesHandler); +app.get(createPaths('/api/features'), getFeaturesHandler); app.get(createPaths('/api/driftsmeldinger'), getDriftsmeldingerHandler); app.get(createPaths('/api/auth'), mockAuthHandler); app.get(createPaths('/api/oauth2/session'), mockSessionHandler); From 957a41b08f79b207bc4b265a3826c24ec11c15f4 Mon Sep 17 00:00:00 2001 From: Terje Karlsen Date: Sun, 8 Oct 2023 11:58:01 +0200 Subject: [PATCH 07/18] Navner om toggles til korrekt prefix --- src/komponenter/header/Header.tsx | 2 +- src/server/api-handlers/features.ts | 19 +++++++++++-------- src/server/utils.ts | 2 ++ 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/komponenter/header/Header.tsx b/src/komponenter/header/Header.tsx index 131a84f21..5e4b6dd02 100644 --- a/src/komponenter/header/Header.tsx +++ b/src/komponenter/header/Header.tsx @@ -59,7 +59,7 @@ export const Header = () => { const { language } = useSelector(stateSelector); const { innloggingsstatus, menypunkt } = useSelector(stateSelector); const { authenticated } = innloggingsstatus.data; - const { PARAMS, APP_URL, API_DEKORATOREN_URL, ENV, VARSEL_API_URL } = environment; + const { PARAMS, APP_URL, ENV, VARSEL_API_URL } = environment; const currentFeatureToggles = useSelector(stateSelector).featureToggles; const breadcrumbs = PARAMS.BREADCRUMBS || []; const availableLanguages = PARAMS.AVAILABLE_LANGUAGES || []; diff --git a/src/server/api-handlers/features.ts b/src/server/api-handlers/features.ts index 1c2708807..def38d7e0 100644 --- a/src/server/api-handlers/features.ts +++ b/src/server/api-handlers/features.ts @@ -1,9 +1,8 @@ import { RequestHandler } from 'express'; +import { forceArray } from '../utils'; import { initialize, Unleash } from 'unleash-client'; let unleashInstance: Unleash; -const featurePrefix = 'dekoratoren'; -const expectedFeatures = ['skjermdeling', 'chatbotscript']; type Features = { [key: string]: boolean }; @@ -34,21 +33,25 @@ export const getFeaturesHandler: RequestHandler = async (req, res) => { await initializeUnleash(); } + const { query } = req; + if (!query?.feature) { + return; + } + const requestedFeatures: string[] = forceArray(query.feature); + // Cant easily fetch feature toggles when running locally // so just mock this. if (process.env.NODE_ENV === 'development') { const features = { - skjermdeling: true, - chatbotscript: true, + 'dekoratoren.skjermdeling': true, + 'dekoratoren.chatbotscript': true, }; res.json(features); return; } - console.log(unleashInstance.isEnabled('dekoratoren.skjermdeling')); - - const features = expectedFeatures.reduce((acc: Features, feature: string) => { - acc[feature] = unleashInstance.isEnabled(`${featurePrefix}.${feature}`); + const features = requestedFeatures.reduce((acc: Features, feature: string) => { + acc[feature] = unleashInstance.isEnabled(feature); return acc; }, {}); diff --git a/src/server/utils.ts b/src/server/utils.ts index d14d84747..8666342fb 100644 --- a/src/server/utils.ts +++ b/src/server/utils.ts @@ -252,3 +252,5 @@ export const getSalesforceContainer = (_tagName: string, className: string) => { export const fiveMinutesInSeconds = 5 * 60; export const oneMinuteInSeconds = 60; export const tenSeconds = 10; + +export const forceArray = (value: any) => (Array.isArray(value) ? value : [value]); From 1be46b79b3cfabb7a2630790c894d8fbbe7d4de0 Mon Sep 17 00:00:00 2001 From: Terje Karlsen Date: Sun, 8 Oct 2023 12:08:42 +0200 Subject: [PATCH 08/18] =?UTF-8?q?Fjerner=20un=C3=B8dvendig=20unleashEnviro?= =?UTF-8?q?nment=20env?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .nais/vars/dev-beta-navno.yaml | 1 - .nais/vars/dev-beta-tms.yaml | 1 - .nais/vars/dev-stable.yaml | 1 - .nais/vars/prod.yaml | 1 - 4 files changed, 4 deletions(-) diff --git a/.nais/vars/dev-beta-navno.yaml b/.nais/vars/dev-beta-navno.yaml index 693c4a2d0..2ba2f509d 100644 --- a/.nais/vars/dev-beta-navno.yaml +++ b/.nais/vars/dev-beta-navno.yaml @@ -1,6 +1,5 @@ appName: nav-dekoratoren-beta appPath: '' -unleashEnvironment: development ingresses: - https://dekoratoren-beta.intern.dev.nav.no outboundHosts: diff --git a/.nais/vars/dev-beta-tms.yaml b/.nais/vars/dev-beta-tms.yaml index 58760b8d4..4438971a8 100644 --- a/.nais/vars/dev-beta-tms.yaml +++ b/.nais/vars/dev-beta-tms.yaml @@ -1,6 +1,5 @@ appName: nav-dekoratoren-beta-tms appPath: '' -unleashEnvironment: development ingresses: - https://dekoratoren-beta-tms.intern.dev.nav.no outboundHosts: diff --git a/.nais/vars/dev-stable.yaml b/.nais/vars/dev-stable.yaml index 58d7ed47c..d67cb9f1d 100644 --- a/.nais/vars/dev-stable.yaml +++ b/.nais/vars/dev-stable.yaml @@ -1,6 +1,5 @@ appName: nav-dekoratoren appPath: '' -unleashEnvironment: development ingresses: - https://dekoratoren.ekstern.dev.nav.no outboundHosts: diff --git a/.nais/vars/prod.yaml b/.nais/vars/prod.yaml index bbed70a96..bf69371e7 100644 --- a/.nais/vars/prod.yaml +++ b/.nais/vars/prod.yaml @@ -1,6 +1,5 @@ appName: nav-dekoratoren appPath: /dekoratoren -unleashEnvironment: production ingresses: - https://appres.nav.no/common-html/v4/navno - https://www.nav.no/dekoratoren From 16b71a4b7a531011c064cdcd55176f3720ad8f50 Mon Sep 17 00:00:00 2001 From: Terje Karlsen Date: Sun, 8 Oct 2023 12:10:21 +0200 Subject: [PATCH 09/18] Setter absolutt-versjonering for unleash-client --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index bfdb700d3..a0c9b7a23 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,7 +34,7 @@ "react-redux": "8.0.5", "redux": "4.2.1", "universal-cookie-express": "4.0.3", - "unleash-client": "^4.1.1" + "unleash-client": "4.1.1" }, "devDependencies": { "@babel/cli": "7.21.5", diff --git a/package.json b/package.json index d5b8461ef..8dfe3d802 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "react-redux": "8.0.5", "redux": "4.2.1", "universal-cookie-express": "4.0.3", - "unleash-client": "^4.1.1" + "unleash-client": "4.1.1" }, "devDependencies": { "@babel/cli": "7.21.5", From 3e363d251095cda7e5b7d88d4e1587c61196119f Mon Sep 17 00:00:00 2001 From: Terje Karlsen Date: Sun, 8 Oct 2023 12:21:21 +0200 Subject: [PATCH 10/18] Rydder i kode og bedre mocking av features --- src/server/api-handlers/features.ts | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/server/api-handlers/features.ts b/src/server/api-handlers/features.ts index def38d7e0..ea34d35dd 100644 --- a/src/server/api-handlers/features.ts +++ b/src/server/api-handlers/features.ts @@ -29,24 +29,27 @@ const initializeUnleash = async () => { initializeUnleash(); export const getFeaturesHandler: RequestHandler = async (req, res) => { + // If for some reason the unleash instance is not initialized, + // make a new attempt. if (!unleashInstance) { await initializeUnleash(); } const { query } = req; if (!query?.feature) { + res.status(400).json({ error: 'Missing feature query parameters' }); return; } - const requestedFeatures: string[] = forceArray(query.feature); + const requestedFeatures: string[] = forceArray(query.feature).filter((feature) => typeof feature === 'string'); // Cant easily fetch feature toggles when running locally // so just mock this. if (process.env.NODE_ENV === 'development') { - const features = { - 'dekoratoren.skjermdeling': true, - 'dekoratoren.chatbotscript': true, - }; - res.json(features); + const mockFeatures = requestedFeatures.reduce((acc: Features, feature: string) => { + acc[feature] = true; + return acc; + }, {}); + res.json(mockFeatures); return; } From 87400b4e12cba1ca50b0b004ddde1312c46a053a Mon Sep 17 00:00:00 2001 From: Terje Karlsen Date: Tue, 10 Oct 2023 09:23:10 +0200 Subject: [PATCH 11/18] Forbedrer default setting av feature toggle ved utilgjengelig Unleash --- src/server/api-handlers/features.ts | 37 ++++++++++++++--------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/src/server/api-handlers/features.ts b/src/server/api-handlers/features.ts index ea34d35dd..0c33804e9 100644 --- a/src/server/api-handlers/features.ts +++ b/src/server/api-handlers/features.ts @@ -6,6 +6,14 @@ let unleashInstance: Unleash; type Features = { [key: string]: boolean }; +// If Unleash instance goes down, we don't want screen sharing and chatbot to be +// feature disabled. So we default to true if the instance can not initialize. +// NOTE: Other filters may have other strategies, by setting to false. +const defaultToggles: Features = { + 'dekoratoren.screensharing': true, + 'dekoratoren.chatbot': true, +}; + const initializeUnleash = async () => { const { UNLEASH_SERVER_API_TOKEN, UNLEASH_SERVER_API_URL } = process.env; if (!UNLEASH_SERVER_API_TOKEN || !UNLEASH_SERVER_API_URL) { @@ -26,7 +34,12 @@ const initializeUnleash = async () => { return true; }; -initializeUnleash(); +const resolveRequestedFeatures = (requestedFeatures: string[]) => { + return requestedFeatures.reduce((acc: Features, feature: string) => { + acc[feature] = unleashInstance ? unleashInstance.isEnabled(feature) : defaultToggles[feature]; + return acc; + }, {}); +}; export const getFeaturesHandler: RequestHandler = async (req, res) => { // If for some reason the unleash instance is not initialized, @@ -40,23 +53,9 @@ export const getFeaturesHandler: RequestHandler = async (req, res) => { res.status(400).json({ error: 'Missing feature query parameters' }); return; } - const requestedFeatures: string[] = forceArray(query.feature).filter((feature) => typeof feature === 'string'); - - // Cant easily fetch feature toggles when running locally - // so just mock this. - if (process.env.NODE_ENV === 'development') { - const mockFeatures = requestedFeatures.reduce((acc: Features, feature: string) => { - acc[feature] = true; - return acc; - }, {}); - res.json(mockFeatures); - return; - } - - const features = requestedFeatures.reduce((acc: Features, feature: string) => { - acc[feature] = unleashInstance.isEnabled(feature); - return acc; - }, {}); - res.json(features); + const requestedFeatures: string[] = forceArray(query.feature).filter((feature) => typeof feature === 'string'); + res.json(resolveRequestedFeatures(requestedFeatures)); }; + +initializeUnleash(); From 1e6fa3d3e358caf38f62e0f2f78720cc13646965 Mon Sep 17 00:00:00 2001 From: Terje Karlsen Date: Tue, 10 Oct 2023 10:33:23 +0200 Subject: [PATCH 12/18] Simulerer midlertidig at Unleash er nede --- src/server/api-handlers/features.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/api-handlers/features.ts b/src/server/api-handlers/features.ts index 0c33804e9..5258c7ac8 100644 --- a/src/server/api-handlers/features.ts +++ b/src/server/api-handlers/features.ts @@ -23,7 +23,7 @@ const initializeUnleash = async () => { try { unleashInstance = initialize({ - url: `${UNLEASH_SERVER_API_URL}/api/`, + url: `${UNLEASH_SERVER_API_URL}/ap/`, appName: 'nav-dekoratoren', customHeaders: { Authorization: UNLEASH_SERVER_API_TOKEN }, }); From 90f55c80ddcb31b9a11413148b530f5581975a19 Mon Sep 17 00:00:00 2001 From: Terje Karlsen Date: Tue, 10 Oct 2023 10:40:19 +0200 Subject: [PATCH 13/18] =?UTF-8?q?Fikser=20feil=20navn=20p=C3=A5=20feature?= =?UTF-8?q?=20toggle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/api-handlers/features.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/api-handlers/features.ts b/src/server/api-handlers/features.ts index 5258c7ac8..7a432d2bb 100644 --- a/src/server/api-handlers/features.ts +++ b/src/server/api-handlers/features.ts @@ -10,8 +10,8 @@ type Features = { [key: string]: boolean }; // feature disabled. So we default to true if the instance can not initialize. // NOTE: Other filters may have other strategies, by setting to false. const defaultToggles: Features = { - 'dekoratoren.screensharing': true, - 'dekoratoren.chatbot': true, + 'dekoratoren.skjermdeling': true, + 'dekoratoren.chatbotscript': true, }; const initializeUnleash = async () => { From 145aa8d5c5f8e924c692adee02c178133c415a26 Mon Sep 17 00:00:00 2001 From: Terje Karlsen Date: Tue, 10 Oct 2023 10:51:03 +0200 Subject: [PATCH 14/18] Fikser feil i initiering av unleash-client --- src/server/api-handlers/features.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/server/api-handlers/features.ts b/src/server/api-handlers/features.ts index 7a432d2bb..a24ccdd85 100644 --- a/src/server/api-handlers/features.ts +++ b/src/server/api-handlers/features.ts @@ -36,7 +36,7 @@ const initializeUnleash = async () => { const resolveRequestedFeatures = (requestedFeatures: string[]) => { return requestedFeatures.reduce((acc: Features, feature: string) => { - acc[feature] = unleashInstance ? unleashInstance.isEnabled(feature) : defaultToggles[feature]; + acc[feature] = unleashInstance.isSynchronized() ? unleashInstance.isEnabled(feature) : defaultToggles[feature]; return acc; }, {}); }; @@ -55,6 +55,7 @@ export const getFeaturesHandler: RequestHandler = async (req, res) => { } const requestedFeatures: string[] = forceArray(query.feature).filter((feature) => typeof feature === 'string'); + console.log(resolveRequestedFeatures(requestedFeatures)); res.json(resolveRequestedFeatures(requestedFeatures)); }; From da4794ab3a12dc7034fb7ca6095ea93159a2a30f Mon Sep 17 00:00:00 2001 From: Terje Karlsen Date: Tue, 10 Oct 2023 10:57:26 +0200 Subject: [PATCH 15/18] Reverserer test av feilet Unleash-kall --- src/server/api-handlers/features.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/api-handlers/features.ts b/src/server/api-handlers/features.ts index a24ccdd85..418e05423 100644 --- a/src/server/api-handlers/features.ts +++ b/src/server/api-handlers/features.ts @@ -23,7 +23,7 @@ const initializeUnleash = async () => { try { unleashInstance = initialize({ - url: `${UNLEASH_SERVER_API_URL}/ap/`, + url: `${UNLEASH_SERVER_API_URL}/api/`, appName: 'nav-dekoratoren', customHeaders: { Authorization: UNLEASH_SERVER_API_TOKEN }, }); From cf936b6cf1968333504bbb28ec88a115cdfbe644 Mon Sep 17 00:00:00 2001 From: Terje Karlsen Date: Tue, 10 Oct 2023 13:53:53 +0200 Subject: [PATCH 16/18] Legger til optional chaining for sjekk mot feature --- src/server/api-handlers/features.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/api-handlers/features.ts b/src/server/api-handlers/features.ts index 418e05423..167dfbccb 100644 --- a/src/server/api-handlers/features.ts +++ b/src/server/api-handlers/features.ts @@ -36,7 +36,7 @@ const initializeUnleash = async () => { const resolveRequestedFeatures = (requestedFeatures: string[]) => { return requestedFeatures.reduce((acc: Features, feature: string) => { - acc[feature] = unleashInstance.isSynchronized() ? unleashInstance.isEnabled(feature) : defaultToggles[feature]; + acc[feature] = unleashInstance?.isSynchronized() ? unleashInstance.isEnabled(feature) : defaultToggles[feature]; return acc; }, {}); }; From 6fed8b2edd639400e173478a087b0dff03a84c5e Mon Sep 17 00:00:00 2001 From: Terje Karlsen Date: Tue, 10 Oct 2023 13:55:47 +0200 Subject: [PATCH 17/18] =?UTF-8?q?Fjerner=20glemt=20console.log=20og=20un?= =?UTF-8?q?=C3=B8dig=20initialize?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/api-handlers/features.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/server/api-handlers/features.ts b/src/server/api-handlers/features.ts index 167dfbccb..396fb4471 100644 --- a/src/server/api-handlers/features.ts +++ b/src/server/api-handlers/features.ts @@ -42,12 +42,6 @@ const resolveRequestedFeatures = (requestedFeatures: string[]) => { }; export const getFeaturesHandler: RequestHandler = async (req, res) => { - // If for some reason the unleash instance is not initialized, - // make a new attempt. - if (!unleashInstance) { - await initializeUnleash(); - } - const { query } = req; if (!query?.feature) { res.status(400).json({ error: 'Missing feature query parameters' }); @@ -55,7 +49,6 @@ export const getFeaturesHandler: RequestHandler = async (req, res) => { } const requestedFeatures: string[] = forceArray(query.feature).filter((feature) => typeof feature === 'string'); - console.log(resolveRequestedFeatures(requestedFeatures)); res.json(resolveRequestedFeatures(requestedFeatures)); }; From 32329fed5cbb631af978ffd2e3733152a5d74ad9 Mon Sep 17 00:00:00 2001 From: Terje Karlsen Date: Tue, 10 Oct 2023 13:59:19 +0200 Subject: [PATCH 18/18] Returnerer false dersom init feiler --- src/server/api-handlers/features.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/server/api-handlers/features.ts b/src/server/api-handlers/features.ts index 396fb4471..4a74b21e6 100644 --- a/src/server/api-handlers/features.ts +++ b/src/server/api-handlers/features.ts @@ -29,6 +29,7 @@ const initializeUnleash = async () => { }); } catch (e) { console.error('Error initializing unleash', e); + return false; } return true;